2011-06-13 91 views
2

我正在修改gcc的md文件,用於mips(el)目標。 gcc src的版本是4.6.0。修改GCC「.md」機器定義模板

我想修改符號擴展insn代。

最初,mips使用「lb」/「lh」指令來擴展一個字節/一半。

但在我的目標CPU中沒有「lb」和「lh」,它只支持「lbu」和「lhu」。所以我必須生成這樣的指令來實現簽名分機。

例如

磅%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」的文件,其中的兩個是單個圖案,它使用的宏,以生成磅/ LH指令:

"l<SHORT:size>" 

<SHORT:size> may be "b" or "h" --> "lb" or "lh" 

但我想從「b」獲得「24」;獲得「16」形式的「h」。我怎樣才能做到這一點?

+2

我擔心很少有人真正瞭解該格式的細節,但他們很可能在閱讀[email protected]郵件列表(或者[也可以在[gcc.gnu.org上的其他人])(http ://gcc.gnu.org/lists.html)),所以我建議你嘗試在那裏問。看來你應該可以在不訂閱的情況下發布。 – 2011-06-14 05:48:05

回答

1

對於lb情況下,你想要的是使用define_insnlbu,分別srlsra定義三個規則。一旦完成,您可以使用define_expand爲磅定義擴展規則,該規則將擴展爲lbu,srlsra

在擴展時GCC會將lb轉換爲lbu,srlsra,這意味着在RTL階段,您將不再擁有lb,而只是您的後端會理解的東西。

類似地爲lh。 除非您已經知道內部文件,否則內部文件並非世界上最好的文件,但在閱讀其他人的後端時,您可以查看特定細節。

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

享受。

+0

我發表這個問題已經很長時間了。我現在不是在玩gcc,但是我喜歡你的答案。我只是很難修改類似Lisp的文本。謝謝! – Nybble 2012-03-31 07:44:45