科普LLVM中MSP430如何lower移位指令

问题背景

最近在做LLVM项目的时候,碰到了一个看起来不是问题的问题,就是如何对移位指令进行lower,在LLVMIR中,移位指令使用一个节点进行表示的,表示如下

(shl a, b)

其中,假设a就是源操作数,b是移位次数,shl为逻辑左移,可是MSP430芯片里面只有一次移动一位的移位指令,如下

(MSP430shl a)

表示将源操作数a向左移动一位,那么下一步,顺理成章地就会想到,如果每次只移动一位,那么肯定要使用循环进行实现啊,没错,可是问题就在这里,如何用循环实现。

编译器背景知识

基本块

所谓的基本块,比如在C语言中一段代码要么全部执行,要么全部不执行,比如如下代码

if(a == 1) {
    b = b + 1;
    for(int c = 0; c < 1; c ++) {
        b = b + c;
    }
    a = b;
}

这是我随便写的一段代码,里面就包含三个基本块,分别是

b = b + 1
for(int c = 0; c < 1; c ++) {
    b = b + c;
}
a = b;

DAG

DAG就是有向无环图,每个基本块在进行分析的时候都是变成一个有向无环图进行处理的,是一一对应关系,简单的例子就是数据结构里面的有向无环图的举例,那就是一个简单的语法树。

解决问题

在上一个章节说过,一个基本块是对应一个DAG的,然而如果你要处理第一个部分所说的移位指令,那么你就要生成一个循环,一个循环。。一个循环。。。。
问题来了,循环内部是一个基本块,也就是说,循环的出现使得整个基本块变成了三个,从而基本块和DAG的关系不满足一对一,而是三对一了,这显然是不能够处理的,但是,办法总是有的,办法就是使用伪指令匹配

  • 如果碰到了移位指令,比如上面的逻辑左移,那么就只是简单的替换一下名称,源码的出现位置如下:
SDValue MSP430TargetLowering::LowerShifts(SDValue Op,
                                          SelectionDAG &DAG) const {
  unsigned Opc = Op.getOpcode();
  SDNode* N = Op.getNode();
  EVT VT = Op.getValueType();
  SDLoc dl(N);

  // Expand non-constant shifts to loops:
  if (!isa
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值