将多个insn融合成一个新的insn

时间:2014-08-02 01:09:39

标签: gcc compiler-construction

我需要将多个指令合并为一个指令。

...

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有单一的操作码?

1 个答案:

答案 0 :(得分:1)

我在gcc-help邮件列表上发布了这个,并得到了非常令人满意的答案来解锁我自己。总结这里为后代。

在坚持不懈的情况下,海湾合作委员会的联合会将照顾这些"融合"只要你教它所需的模式。当insn之间没有明显的数据流时,使用define_peephole。

要了解您需要定义的模式:

  • 查看.combine rtl转储(由-O -da生成)
  • 您将看到一些针对它试图融合的insn格式的调试转储:
  

尝试Num1,Num2 - > Num3:
  无法匹配此指令:......

  • 定义与上述
  • 匹配的define_insn模式
  • 您可能还需要更新一些rtx_costs并使新指令比被替换的指令集便宜 (target_rtx_costs hook)。只有这样GCC才会赞成你的新指令 在融合的原始指令集上。

并在后端的机器描述文件中嵌入了define_insn模式。

我找到了一个define_insn模式,对于尝试类似任务的人gcc internals: calculating instruction costs

非常有用