【问题标题】:LLVM Backend: Patterns for register + offset addressingLLVM 后端:寄存器 + 偏移寻址模式
【发布时间】:2017-04-25 06:34:37
【问题描述】:

我的 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 更新到最新版本?

【问题讨论】:

    标签: llvm llvm-ir


    【解决方案1】:

    已解决:简单的复制和粘贴错误 - GPR:$Wd 需要从“输入”移动到“输出”。

    现在“寄存器 + 偏移”寻址适用于读取和写入,无需任何 C++ 代码。酷!

    【讨论】:

      猜你喜欢
      • 2012-05-11
      • 1970-01-01
      • 2011-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多