我现在正在修改gcc的md文件,用于mips(el)目标。 gcc src的版本是4.6.0。
我想修改sign-extend insn generation。
最初,mips使用“lb
”/“lh
”指令对一个字节/一半进行签名扩展。
但在我的目标CPU中,它没有“lb
”和“lh
”,它只支持“lbu
”和“lhu
”。所以我必须生成这样的指令来实现sign-ext。
e.g。
lb%0,%1
成为:
lbu%0,%1
srl%0,%0,24
sra%0,%0,24
类似地:
lh%0,%1
成为:
lhu%0,%1
srl%0,%0,16
sra%0,%0,16
但是,在原始的“md”文件中,其中两个是单个模式,它使用宏来生成lb / lh指令:
"l<SHORT:size>"
<SHORT:size> may be "b" or "h" --> "lb" or "lh"
但我希望从“b”获得“24”;得到“16”形式“h”。我怎样才能做到这一点?
答案 0 :(得分:1)
对于lb
案例,您希望分别使用define_insn
lbu
,srl
和sra
来定义三个规则。完成后,您可以使用define_expand
为lb定义扩展规则,扩展为lbu
,srl
和sra
。
在扩展时,GCC会将lb转换为lbu
,srl
和sra
,这意味着在RTL阶段你将不再拥有lb,只能让你的后端知道。
同样适用于lh
。
内部文档不是世界上最好的,除非您已经知道,但是在阅读其他人的后端时,它们对于查看特定细节非常有用。
在define_insn
上:http://gcc.gnu.org/onlinedocs/gccint/Patterns.html#index-define_005finsn-3192
在define_expand
:http://gcc.gnu.org/onlinedocs/gccint/Expander-Definitions.html#index-define_005fexpand-3613
享受。