<div dir="ltr"><div class="gmail_default" style="font-size:small"><div class="gmail_default">In BPF, an ADD instruction is defined as a 2 register instruction:</div><div class="gmail_default"><br></div><div class="gmail_default">        0x0f.  add dst, src.  dst += src</div><div class="gmail_default"><br></div><div class="gmail_default">In BPFInstrInfo.td this kind of ALU instruction is defined with:</div><div class="gmail_default"><br></div><div class="gmail_default">        def _rr : ALU_RR<BPF_ALU64, Opc,<br>                   (outs GPR:$dst),<br>                   (ins GPR:$src2, GPR:$src),<br>                   "$dst "#OpcodeStr#" $src",<br>                   [(set GPR:$dst, (OpNode i64:$src2, i64:$src))]>;<br></div><div class="gmail_default"><br></div><div class="gmail_default">How does tablegen+codegen ensure that dst and src2 are the same register? I see that the assembly/disassembly string assumes this is the case.</div><div class="gmail_default"><br></div><div class="gmail_default">Also, it uses i64:$src which is an i64 and not a GPR. What is the distinction there? X86 does this differently. src1 and src2 are GR64 registers.</div><div class="gmail_default"><br></div><div class="gmail_default">        def IMUL64rr : RI<0xAF, MRMSrcReg, (outs GR64:$dst),<br>                                   (ins GR64:$src1, GR64:$src2),<br>                  "imul{q}\t{$src2, $dst|$dst, $src2}",<br>                  [(set GR64:$dst, EFLAGS,<br>                        (X86smul_flag GR64:$src1, GR64:$src2))]>,<br>                  Sched<[WriteIMul64Reg]>, TB;<br></div><div class="gmail_default"><br></div><font color="#888888"><div class="gmail_default">Chris</div></font></div></div>