我正在研究一个架构的gcc后端。该体系结构具有索引数组访问的指令;因此,ld r0, (r1, r2)
相当于r0 = r1[r2]
,其中r1
是int32_t*
。
我在.md
文件中使用以下模式表示:
(define_insn "*si_load_indexed"
[
(set
(match_operand:SI 0 "register_operand" "=r")
(mem:SI
(plus:SI
(mult:SI
(match_operand:SI 1 "register_operand" "%r")
(const_int 4))
(match_operand:SI 2 "register_operand" "r"))))
]
""
"ld %0, (%2, %1)"
[(set_attr "length" "4")]
)
但是,指令实际上从未被发出。查看指令组合阶段的调试输出,我看到了:
Trying 8, 9 -> 10:
Successfully matched this instruction:
(set (reg:SI 47 [ *_5 ])
(mem:SI (plus:SI (mult:SI (reg/v:SI 43 [ b ])
(const_int 4 [0x4]))
(reg:SI 0 r0 [ a ])) [2 *_5+0 S4 A32]))
rejecting combination of insns 8, 9 and 10
original costs 8 + 4 + 4 = 16
replacement cost 32
如果我已正确读取,则表示指令模式已匹配,但由于比原始指令更昂贵,指令已被拒绝。
那么,如何计算我的教学费用呢?它从哪里得到32(看起来非常高)?我如何说服gcc实际使用这条指令?
答案 0 :(得分:1)
问这样的问题的适当地方是gcc@gcc.gnu.org。如果你提出聪明的问题,他们会非常有帮助。 :)
当然,您应首先阅读内部手册。相关部分位于:http://gcc.gnu.org/onlinedocs/gccint/Costs.html#Costs
我相信你需要看TARGET_RTX_COSTS
,但我可能错了。我认为,默认行为是通过逐步遍历RTL并累加操作来估算成本,但是自从我查看它之后它已经复杂了一段时间(请查看rtx_costs
)。
其他端口添加指令属性以帮助他们判断成本。