llvm中的XXXInstrInfo.td

    全文基于作者主观理解,仅供参考:  

    XXXInstrInfo.td文件中定义的是目标机的指令格式。这种td文件会被TableGen自动生成c++类型文件。下面主要是要讨论该文件中的代码含义。

    1、def CPU0Ret               :    SDNode<"CPU0ISD::Ret", SDTNone, [SDNPHasChain,SDNoptInGlue,SDNPVariadic]>;

  参考了这篇文档。每个SelectionDAG节点类型都有一个对应的SDNode定义。该函数的原型在llvm/include/llvm/Target/TargetSelectionDAG.td中。第一个参数"CPU0ISD::Ret"指的是这个Node结点的名称。第二个参数是SDTypeProfile类型,它描述了该结点的一些类型要求,详细介绍见下一小节。上面的SDTNone指没有什么要求。第三个参数指的是该结点所应该具有的属性。上面代码中SDNPHasChai的意思是R/W chain operand and result(具体含义自行理解); SDNPVariadic的含义则是说该结点有可变参数。其余的属性都可以在TargetSelectioDAG.td中找到。上面这段代码应该是定义了一个返回类型的SDNode结点。

    2、def  SDT_Cp0Ret        :    SDTypeProfile<0, 1, [SDTCisInt<0>]>;

    SDTypeProfile的原型也在TargetSelectionDAG.td中。前两个参数是指有几个结果和几个操作数,因为一个SDNode结点里包括有这些内容。如果第二个参数为-1则说明该操作数个数不定。第三个参数是对操作数类型的约束。如这里的SDTCisInt就说明操作数应该是整型的,0则是代表约束的是第一个操作数。

    3、def simm8    :    Operand<i32>{ let DecoderMethod = "DecodeSimm8"; }

    Operand的原型在llvm/include/llvm/Target/Target.td中。个人理解是把simm8这个标识当作一个32位的操作数。例如有个8位的数,但是该系统只支持32位的,所以就要进行扩展,这在LLVM中就是SelectionDAG的legalize。

     4、def men    :    Operand<iPTR>{   

                            let PrintMethod = "printMemOperand";

                            let MIOperandInfo = (ops Cpu0Regs, simm8);

                            let EncoderMethod = "getMemEncoding"; }

     这是定义了对内存的操作。(???)我推测MIOperandInfo定义的是一种寻址方式,如这里就是一个寄存器(CPURegs)加一个立即数(simm8)的方式。

    5、def immSExt8    :    PatLeaf<(imm),[ return isInt<8>(N->getSExtValue()); }]>

    原型在TargetSelectionDAG.td。(imm)是dag类型;N是一个操作数结点,后面就判断该N结点是否为8位的整型,是的话才返回。(但这个的含义也不懂)。给一个8位的立即操作数,之后返回一个常量结点。这样这个常量结点便可以代表这个8位立即数了。至于它是不是8位的立即数就得进行一下判断了。

    6、def addr    :    ComplexPattern<iPTR, 2, "SelectAddr", [frameindex],[SDNPWantParent]>

    原型在TargetSelectionDAG.td。这应该是为了处理地址模式比较复杂的情况。2是指SelectAddr方法所返回的操作数个数。SelectAddr似乎定义在了XXXDAGToDAGISel。

   

    7、class ArithLogicI<bits<8> op, string instr_asm, SDNode OpNode,   

                        FL<op, (outs GPROut:$ra), (ins RC:$rb, Od:$imm16), !strconcat(instr_asm, "\t$ra, $rb, $imm16"),

                             [(set GPROut:$ra, (OpNode RC:$rb, imm_type: $imm16))], IIAlu> {

                                    let isReMaterializable = 1; }

    


    

    

    

                    

            

        



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值