llvm TableGen文件中的“设置”是什么意思?

时间:2019-08-09 02:30:24

标签: llvm

我阅读了AVR的llvm后端。在llvm TableGen中“设置”是什么意思?如何编写指令“ mov”的模式?如下所示?

(set ACC:$rd,(mov GPR8:$src));

AVR后端的另一个代码如下:

def ADDRdRr : FRdRr<0b0000,
                      0b11,
                      (outs GPR8:$rd),
                      (ins GPR8:$src, GPR8:$rr),
                      "add\t$rd, $rr",
                      [(set i8:$rd, (add i8:$src, i8:$rr)),
                       (implicit SREG)]>;

1 个答案:

答案 0 :(得分:1)

此模式与加法运算匹配,并且set意味着应将加法结果放入$rd操作数中。如您所见,这正是标记为“输出”的操作数-(outs GPR8:$rd)

关于mov指令,在我的玩具后端中,我甚至不需要为其指定模式。我的mov定义看起来像

def MovRR : InstRR<7, (outs IntRegs:$reg2), (ins IntRegs:$reg1),
                "mov $reg1, $reg2", []>;

我没有实施匹配,而是实施了MyBackendInstrInfo::copyPhysReg()

void MyBackendInstrInfo::copyPhysReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI,
                                    const DebugLoc &DL, unsigned DestReg, unsigned SrcReg,
                                    bool KillSrc) const
{
    if (MB::IntRegsRegClass.contains(DestReg, SrcReg))
        BuildMI(MBB, MI, DL, get(MB::MovRR), DestReg)
            .addReg(SrcReg, getKillRegState(KillSrc));
    else
        llvm_unreachable("Impossible reg-to-reg copy");
}