Gcc macthing符号扩展操作数时指令的输出模板错误
在构建gcc交叉编译器时,我需要添加一条指令,用于将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
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))