我阅读了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)]>;
答案 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");
}