Gcc macthing符号扩展操作数时指令的输出模板错误

Gcc macthing符号扩展操作数时指令的输出模板错误,gcc,cross-compiling,Gcc,Cross Compiling,在构建gcc交叉编译器时,我需要添加一条指令,用于将short类型转换为int 因此,我添加了一条指令,它将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 (m

在构建gcc交叉编译器时,我需要添加一条指令,用于将
short
类型转换为
int

因此,我添加了一条指令,它将
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")]
)
(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))
汇编指令是:
ldrshw1[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位的,所以我调整了操作数的
模式

编译相同代码时,我遇到编译器错误:

int+short.c: In function ‘main’:
int+short.c:9:1: internal compiler error: output_operand: invalid expression as operand
当我将输出模板更改为不输出第二个操作数时(从

),正确生成指令(编译时无错误):
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]

"@
sxth\t%0
ldrsh\t%0" 
(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))