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 的大略運作方式.

1 則留言:

  1. 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

    回覆刪除