我需要将多个指令合并为一个指令。
...
r1 =(r1)op1(const)
...
...
r1 =(r1)op2(r2)
...
...
r3 = op3(r1)
...
我在我的GCC后端.md文件中定义了一个peephole2模式。如果这些 三条指令是连续的,然后我的测试“testnew” 指令。如果这些说明相距甚远,我就不会。
(define_peephole2
[(set (match_operand:DI 0 "register_operand" "")
(op1:DI (match_dup 0) (match_operand:SI 1 "immediate_operand" "") ))
(set (match_dup 0)
(op2:DI (match_operand:DI 2 "register_operand" "") (match_dup 0)))
(set (match_dup 0)
(sign_extend:DI (op3:SI (match_dup 0))))]
"TARGET_MYCORE"
[(set (match_dup 0) (sign_extend:DI (op3:SI (op2:SI (op1:SI
(match_dup 0) (match_dup 1)) (match_dup 0)))))]
"")
(define_insn "*testnew"
[(set (match_operand:DI 0 "register_operand" "=d")
(sign_extend:DI (op3:SI (op2:SI (op1:SI (match_dup 0)
(match_operand:SI 1 "immediate_operand" "I")) (match_dup 0)))))]
"TARGET_MYCORE"
"testnew 36"
[(set_attr "mode" "DI")])
如何将多个相距很远的指令融合为一个新指令 MYCORE有单一的操作码?
答案 0 :(得分:1)
我在gcc-help邮件列表上发布了这个,并得到了非常令人满意的答案来解锁我自己。总结这里为后代。
在坚持不懈的情况下,海湾合作委员会的联合会将照顾这些"融合"只要你教它所需的模式。当insn之间没有明显的数据流时,使用define_peephole。
要了解您需要定义的模式:
尝试Num1,Num2 - > Num3:
无法匹配此指令:......
并在后端的机器描述文件中嵌入了define_insn模式。
我找到了一个define_insn模式,对于尝试类似任务的人gcc internals: calculating instruction costs
非常有用