LLVM指令的选择

    对指令选择过程中一些代码的解释:

    1、这里的指令选择发生在SelectionDAG阶段的后段,即DAG图已经转成了目标机器的DAG并完成了Schedule(指令调度);但在寄存分配之前。此阶段其实就是发射机器指令了。

          这个阶段中是采用BuildMI方法(定义在: llvm\include\llvm\Codgen\MachineBuilder.h)进行由前者到后者的转换的。

    2、def : Pat<(i32 immSExt8:$in), (ADDiu R4, imm:$in)>;

           这条指令的意思是进行一种匹配。至于用处可以看该文档,现在只用个例子进行解释。大意就是在selectDAG中会匹配到类似第一个参数的指令,匹配到后便会利用后一个参数的指令进行替换。而这句代码中的 i32 immSEx8:$in 代指的就是一个32位的立即数。immSExt8之前定义为:

            def immSExt8 : PatLeaf<(imm), [{return isInt<8>(N->getSExtValue()); }]>;       这条指令是判定一个立即数是否是8位的,是的话才能匹配成功。第一个参数imm代表的就是立即数;第二个参数则是判定语句。具体的信息还得再领悟。。。  

            ADDiu R4, imm:$in 则是用来替代前一参数所代表的指令。

            整条指令是由LLVM IR转成机器指令,发生在selectDAG阶段。而且可以看到这条指令并没有定义一个具体的名字,说明它是可以匹配任何的指令,只要匹配成功就会执行。

            该阶段中当完成了合法化之后便开始把SelectionDAG图中原本与目标机指令无关的指令转化成与目标机指令相关的。但据我观测这里的转化并不是说由一条完全不相关的指令一下转成了目标机中指令集中的某条指令,而是在SelectionDAG图或者说是形式下进行的一些小替换。如:t7: ch = Cpu0ISD::Ret t6, Register:i32 %V0, t6:1 这条语句来自于CPU0代码的输出信息。在指令选择后为:t7: ch = RetLR Register:i32 %V0, t6, t6:1。主要关注RetLR,这个信息是定义在CPU0InstrInfo.td文件中的,这是CPU0目标机所支持的指令。其实这里还有个问题是,在转换之前的Cpu0ISD::Ret这个信息是怎样产生或者说是在哪里被定义的。同时可以看到虽然还未到寄存器的分配阶段,但是这里已经产生了一些与目标机有关的寄存器V0。(不过在最后的汇编码生成中该寄存器其实被替代了)。

           


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值