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