2012年6月3日 星期日
GCC : Predicates vs Constraints
順手先把一些東西紀錄一下
在 GCC 的 md 中, 寫那堆 define_insn, define_expand, ...等的 pattern 中
很重要的一環是要寫好 match_operand 中的 Predicates 跟 Constraints
例如以下拿 arm 的 movsi 的 pattern 來說
(define_insn "*arm_movsi_insn"
[(set (match_operand:SI 0 "nonimmediate_operand" "=rk,r,r,r,rk,m")
(match_operand:SI 1 "general_operand" "rk, I,K,j,mi,rk"))]
"TARGET_ARM && ! TARGET_IWMMXT
&& !(TARGET_HARD_FLOAT && TARGET_VFP)
&& ( register_operand (operands[0], SImode)
|| register_operand (operands[1], SImode))"
"@
mov%?\\t%0, %1
mov%?\\t%0, %1
mvn%?\\t%0, #%B1
movw%?\\t%0, %1
ldr%?\\t%0, %1"
[(set_attr "type" "*,*,*,*,load1")
(set_attr "insn" "mov,mov,mvn,mov,*")
(set_attr "predicable" "yes")
(set_attr "pool_range" "*,*,*,*,4096")
(set_attr "neg_pool_range" "*,*,*,*,4084")]
)
其中 nonimmediate_operand 及 general_operand 是 Predicates 的部份
Constraints 則是後面那串 "=rk,r,r,r,rk,m" 及 "rk, I,K,j,mi,rk"
而這兩者之間的差別在於一個指定大類別, 一個小類別
可以想像成 Predicates 是大篩子, Constraints 是小篩子
因此在 Insn Pattern Match 時, GCC 會先透過大篩子
來分類每個 RTL Insn 會適用於哪個 Insn Pattern
然後再想辦法透過任何可能的方法讓他符合任何一個 Constraints
(其中方法包含 split, expand 或著是神奇的 reload
所以若要將 mov pattern 拆解成 mov, store, load 三個 pattern 的話
就必須將 Predicates 的部份作適度的調整,
則可避免 Insn Pattern Match 時統統掉入 mov pattern
值得注意的是, GCC 內部是會由上到下掃描各式 pattern,
所以若大篩子不夠嚴謹造成某個 RTL Insn 可 match 多個 pattern 時,
則會採用第一個 match 到的 pattern,
相對於 md 來說就是比較前面定義的 pattern 會先被 match 到
而以上部份就是大致 gcc 在 md 中的 Predicates 與 Constraints 的大略運作方式.
訂閱:
張貼留言 (Atom)
RaceTech Titanium (3D printing) - iTanium-arts
回覆刪除For your protection, the titanium alloy is apple watch series 6 titanium also titanium septum ring very durable, measuring just 3 inches long by infiniti pro rainbow titanium flat iron 0.10 cm. It is made of zinc. chi titanium flat iron It also has a titanium mens rings