Assembly 如何将llvm tablegen中自己的寄存器操作数映射到指令';什么是操作码?

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

我正在尝试实现“带偏移量的地址寄存器”类型的操作数。它们由基址寄存器和偏移寄存器[K1+K3]组成。然而,在指令的操作码中,我需要分别保存这些寄存器的代码。我找不到出路 1) 获取操作数的代码(这是一件事吗?) 2) 直接将操作数的Reg:$Rm、Reg:$Rn映射到指令的Rm和Rn字段。我将Rm放置在Rn的插槽中,Rn只是被忽略了

那么如何完成这件事呢

当我试图通过BuildMI和打印代码添加它们时,它们似乎写得正确,所以我猜这些操作数的解析是正确的

操作数描述

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))]>; <--- --- ---
      }
    }
  }
}