Assembly 如何将llvm tablegen中自己的寄存器操作数映射到指令';什么是操作码?
我正在尝试实现“带偏移量的地址寄存器”类型的操作数。它们由基址寄存器和偏移寄存器[K1+K3]组成。然而,在指令的操作码中,我需要分别保存这些寄存器的代码。我找不到出路 1) 获取操作数的代码(这是一件事吗?) 2) 直接将操作数的Reg:$Rm、Reg:$Rn映射到指令的Rm和Rn字段。我将Rm放置在Rn的插槽中,Rn只是被忽略了 那么如何完成这件事呢 当我试图通过BuildMI和打印代码添加它们时,它们似乎写得正确,所以我猜这些操作数的解析是正确的 操作数描述Assembly 如何将llvm tablegen中自己的寄存器操作数映射到指令';什么是操作码?,assembly,llvm,opcode,Assembly,Llvm,Opcode,我正在尝试实现“带偏移量的地址寄存器”类型的操作数。它们由基址寄存器和偏移寄存器[K1+K3]组成。然而,在指令的操作码中,我需要分别保存这些寄存器的代码。我找不到出路 1) 获取操作数的代码(这是一件事吗?) 2) 直接将操作数的Reg:$Rm、Reg:$Rn映射到指令的Rm和Rn字段。我将Rm放置在Rn的插槽中,Rn只是被忽略了 那么如何完成这件事呢 当我试图通过BuildMI和打印代码添加它们时,它们似乎写得正确,所以我猜这些操作数的解析是正确的 操作数描述 def MemRRAsmOpe
def MemRRAsmOperand : AsmOperandClass {
let Name = "MemRR";
let ParserMethod = "parseMEMOperand";
}
class MemRR<RegisterOperand Reg> : Operand<i32>
{
let MIOperandInfo = (ops Reg:$Rm, Reg:$Rn); <--- --- ---
let ParserMatchClass = MemRRAsmOperand;
}
let PrintMethod = "printMemOperand" in
{
def memJJ : MemRR<RegisterOperand<JSS>>;
def memKK : MemRR<RegisterOperand<KSS>>;
}
class IALULoadStoreInstBase<dag outs, dag ins, string mnemonic, string operands, list<dag> pattern> :
MyInst<outs, ins, mnemonic, operands, pattern>
{
...
bits<5> Ureg;
bits<5> Rn;
bits<5> Rm;
...
//IType is opcode
let IType{25-21} = Group;
let IType{20-16} = Ureg;
let IType{15} = MOD;
let IType{14} = LQ;
let IType{13} = ImmFlag;
let IType{12-8} = Rm; <--- --- ---
let IType{7-6} = 0b00;
let IType{5-1} = Rn; <--- --- ---
let IType{0} = Q;
...
}
def MemRRAsmOperand:asmoperclass{
让Name=“MemRR”;
让ParserMethod=“parsememomeperand”;
}
类MemRR:操作数
{
让MIOperandInfo=(ops Reg:$Rm,Reg:$Rn);您需要为此类操作数编写自己的选择代码。此类模式称为“复杂模式”,您需要为它们编写自定义指令选择代码。请参见例如X86DAGToDAGISel::SelectAddr()或systemzdagtodagagesel::selectBDAddr()等
multiclass IALULoadInstDst<RegisterOperand Dst, string mnemonic, string prefix, ValueType Type>
{
let WR = 0 in
{
let JK = 0 in
{
let MOD = 0 in
{
defm fromJrr : IALULoadStoreRRInstEx<(outs Dst:$Ureg), (ins memJJ:$src), <--- --- ---
!strconcat(mnemonic, "fromjrr"), !strconcat("$Ureg, ", prefix, "[$src]"), <--- --- ---
[(set Type:$Ureg, (load addr:$src))]>; <--- --- ---
}
}
let JK = 1 in
{
let MOD = 0 in
{
defm fromKrr : IALULoadStoreRRInstEx<(outs Dst:$Ureg), (ins memKK:$src), <--- --- ---
!strconcat(mnemonic, "fromkrr"), !strconcat("$Ureg, ", prefix, "[$src]"), <--- --- ---
[(set Type:$Ureg, (load addr:$src))]>; <--- --- ---
}
}
}
}