在构建gcc交叉编译器时,我需要添加short
到int
的类型转换指令。
所以,我添加了一条指令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")]
)
在编译需要进行此类转换的代码(int
和short
变量的总和)时,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]
。