LLVM后端:寄存器+偏移量寻址的模式

时间:2017-04-25 06:34:37

标签: llvm llvm-ir

我的PIC24处理器提供寄存器+偏移量寻址。要存储我添加的值

def MOV_reg2offset : InstReg2Offset<0b10011, (outs), (ins GPR:$Wd, GPR:$Ws, Slit10W:$Offset),
                     "mov\t$Ws, [$Wd + $Offset]",
                     [(store GPR:$Ws, (add GPR:$Wd, Slit10W:$Offset) )]>;

其中GPR是16位寄存器类,Slit10W是偶数,有符号10位字面值。效果很好!

现在我尝试了相同的加载指令:

def MOV_offset2reg : InstReg2Offset<0b10010, (outs), (ins GPR:$Wd, GPR:$Ws, Slit10W:$Offset),
                     "mov\t[$Ws + $Offset], $Wd",
                     [(set GPR:$Wd, (load (add GPR:$Ws, Slit10W:$Offset) ))]>;

但是tablegen因断言违规而崩溃。

问题:

  • 语法或语义有问题吗?
  • 或者我是否超过了可以匹配的理论限制?也许模式中的三个级别太多了?
  • 或者它看起来不错,我应该尝试将tablegen更新到最新版本?

1 个答案:

答案 0 :(得分:0)

解决:简单的复制和粘贴错误 - GPR:$ Wd需要从'ins'移动到'outs'。

现在'register + offset'寻址适用于读写,无需任何C ++代码。酷!