"set" 在 llvm TableGen 文件中意味着什么?

What does "set" mean in llvm TableGen files?

我阅读了 AVR 的 llvm 后端。 “set”在 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)]>;

这个模式匹配一​​个加法运算,set意味着加法的结果应该放在$rd操作数中。如您所见,这正是标记为 "output" - (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");
}