在对sign_extend操作数进行macthing时,指令的输出模板错误

时间:2017-08-16 11:39:15

标签: gcc cross-compiling

在构建gcc交叉编译器时,我需要添加shortint的类型转换指令。

所以,我添加了一条指令sign_extend short操作数int

我正在使用aarch64的.md文件。 aarch64的模板是:

(define_insn "*extend<SHORT:mode><GPI:mode>2_aarch64"
  [(set (match_operand:GPI 0 "register_operand" "=r,r")
    (sign_extend:GPI (match_operand:SHORT 1 "nonimmediate_operand" "r,m")))]
  ""
  "@
  sxt<SHORT:size>\t%<GPI:w>0, %w1
  ldrs<SHORT:size>\t%<GPI:w>0, %1"
  [(set_attr "type" "extend,load1")]
)

在编译需要进行此类转换的代码(intshort变量的总和)时,aarch64的最终转储insn为:

(insn 9 8 10 (set (reg:SI 1 x1 [orig:73 D.2676 ] [73])
    (sign_extend:SI (mem/c:HI (plus:DI (reg/f:DI 31 sp)
                (const_int 10 [0xa])) [0 j+0 S2 A16]))) int+short.c:6 77 {*extendhisi2_aarch64}
  (nil))

汇编程序指令是:ldrsh w1, [sp, 10]

在我的.md文件中,我添加了:

(define_insn "extendhisi2"  
   [(set (match_operand:SI 0 "register_operand" "=r,r")
      (sign_extend:SI (match_operand:HI 1 "nonimmediate_operand" "r,m")))]
   ""
   "@
   sxth\t%0, %1
   ldrsh\t%0, %1"
)

唯一的区别是我的架构是32位,所以我调整了操作数的mode

编译相同的代码时,我收到编译错误:

int+short.c: In function ‘main’:
int+short.c:9:1: internal compiler error: output_operand: invalid expression as operand

当我更改 输出模板 时不输出第二个操作数(来自

"@
sxth\t%0, %1
ldrsh\t%0, %1"

"@
sxth\t%0
ldrsh\t%0" 

),正确生成指令(编译无错误):ldrsh r1

最终转储中的insn就足够了:

(insn 9 8 10 (set (reg:SI 1 r1 [orig:39 D.1457 ] [39])
    (sign_extend:SI (mem/c:HI (plus:SI (reg/f:SI 30 FP)
                (const_int -6 [0xfffffffffffffffa])) [0 j+0 S2 A16]))) int+short.c:6 13 {extendhisi2}
 (nil))

所以,我的问题是:在尝试输出第二个操作数时是什么导致了这样的错误? 正确的说明应该是ldrsh r1, FP[-6]

0 个答案:

没有答案