修改GCC“.md”机器定义模板

时间:2011-06-13 11:23:23

标签: gcc compiler-construction

我现在正在修改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”。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:1)

对于lb案例,您希望分别使用define_insn lbusrlsra来定义三个规则。完成后,您可以使用define_expand为lb定义扩展规则,扩展为lbusrlsra

在扩展时,GCC会将lb转换为lbusrlsra,这意味着在RTL阶段你将不再拥有lb,只能让你的后端知道。

同样适用于lh。 内部文档不是世界上最好的,除非您已经知道,但是在阅读其他人的后端时,它们对于查看特定细节非常有用。

define_insn上:http://gcc.gnu.org/onlinedocs/gccint/Patterns.html#index-define_005finsn-3192define_expandhttp://gcc.gnu.org/onlinedocs/gccint/Expander-Definitions.html#index-define_005fexpand-3613

享受。