[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

16.15.2 属性値として使用可能な式

属性を定義するのに使われる RTL 式は、前出のコードに加えて、 以下で議論する、属性定義に固有のコードを幾つか使っている。 属性値式は、以下の形のどれか一つでなければならない。

(const_int i)

整数 i が、数値属性の値を指定する。 i は非負でなければならない。

数値属性の値は、const_int か、const_string で文字列で 表現した整数、eq_attr(以下参照)、attrsymbol_ref、単純算術式のどれかで指定することができ、 set_attr は特定の命令を上書きする(see section 属性値の insn への割り当て)。

(const_string value)

文字列 value は、定数属性値を指定する。 value が ‘"*"’ として指定されると、 その属性のデフォルト値が、この式を含む insn に対して使われることを意味する。 ‘"*"’ は、明らかに、define_attrdefault 式で使うことは できない。

値が指定されている属性が数値的なら、value は非負の整数 (この場合、普通 const_int)を含む文字列でなければならない。 数値的でなければ、その属性に対して有効な値の一つを含んでいなければならない。

(if_then_else test true-value false-value)

test は属性テストを指定する。その形式は以下で定義される。 この式の値は、test が真であれば true-value であり、 真でなければ false-value となる。

(cond [test1 value1 …] default)

この式の第一オペランドはあるベクトルであり、偶数個の式をもち、 test 式と value 式の対からなる。cond 式の値は 最初の真である test 式に対応する値のものである。真となる test 式がない場合は、cond 式の値は default 式の値である。

test 式は、以下の形のうちの一つを取る。

(const_int i)

このテストは、i がゼロでなければ真になり、さもなければ 偽になる。

(not test)
(ior test1 test2)
(and test1 test2)

これらのテストは、指定された論理関数が真になれば、真である。

(match_operand:m n pred constraints)

このテストは、属性値が決定されようとしている insn のオペランド n のモードが m であり(テストのこの部分は、mVOIDmode なら無視される)、かつ文字列 pred で指定される 関数が、オペランド n とモード m を渡したときに ゼロでない値を返したときに、真になる(テストのこの部分は、 pred がヌル文字列なら無視される)。

オペランド constraints は無視されるので、ヌル文字列とすべきである。

(le arith1 arith2)
(leu arith1 arith2)
(lt arith1 arith2)
(ltu arith1 arith2)
(gt arith1 arith2)
(gtu arith1 arith2)
(ge arith1 arith2)
(geu arith1 arith2)
(ne arith1 arith2)
(eq arith1 arith2)

これらのテストは、二つの算術式について指定された比較の結果が真になれば、 真となる。算術式は、 plusminusmultdivmodabsnegandiorxornotashiftlshiftrtashiftrt といった式から 構成される。

const_intsymbol_ref は常に有効な項である (追加の形式については see section insn の長さの計算)。 symbol_ref は一個の文字列であり、一個の C の式を示す。 この式は、‘get_attr_…’ ルーチン で評価されたときに int を生じる。普通はグローバル変数に ならないといけない。

(eq_attr name value)

name は、属性名を指定する文字列である。

value は文字列であり、属性 name の有効な値であるか、 幾つかの値をカンマで区切ったリストか、あるいは ‘!’ の後に 一個の値か値のリストを続けたものである。 value が ‘!’ で始まっていなければ、このテストは、現在の insn の 属性 name の値が value で指定されたリストの中に 入っていれば、真となる。value が ‘!’ で始まっていると、 このテストは属性値が指定されたリストに入っていない時に真となる。

例えば

 
(eq_attr "type" "load,store")

は、次の式に等価である。

 
(ior (eq_attr "type" "load") (eq_attr "type" "store"))

name が ‘alternative’ の属性を指定するものなら、それは GNU CC の変数 which_alternative の値を参照し (see section アセンブラ出力用の C 言語の文)、その値は小さな整数でなくてはならない。 例えば、

 
(eq_attr "alternative" "2,3")

は、次の式に等価である。

 
(ior (eq (symbol_ref "which_alternative") (const_int 2))
     (eq (symbol_ref "which_alternative") (const_int 3)))

ほとんどの属性に対して、テスト eq_attr は、 テストされる属性の値が、ある特定のパターンにマッチする全ての insn に 対して知られているなら、簡略化される。これは非常に良くあるケースである。

(attr_flag name)

attr_flag 式の値は、name で指定されたフラグが 現在スケジューリング中の insn に対して真になるなら、真となる。

name はある文字列であり、テストすべきフラグの固定したセットを 一つ指定する。フラグ forwardbackward を テストして、条件分岐の方向を決定する。フラグ very_likerylikelyvery_unlikelyunlikely をテストして、 条件分岐が成立すると予想されるかどうかを決定する。

フラグ very_likely が真なら、フラグ likely もまた 真になる。very_unlikelyunlikely についても同様である。

この例では、条件分岐の遅延スロットを記述している。 このスロットは、分岐が成立する前方への分岐(真の無効化)か 分岐が成立しない場合の後方への分岐(偽の無効化)が無効化される。

 
(define_delay (eq_attr "type" "cbranch")
  [(eq_attr "in_branch_delay" "true")
   (and (eq_attr "in_branch_delay" "true")
        (attr_flag "forward"))
   (and (eq_attr "in_branch_delay" "true")
        (attr_flag "backward"))])

フラグ forwardbackward は、現在スケジュールされつつある insn が条件分岐でなければ、偽になる。

フラグ very_likelylikely は、スケジュールされつつある insn が条件分岐でなければ、真になる。 フラグ very_unlikelyunlikely は、スケジュールされつつある insn が条件分岐でなければ、偽になる。

attr_flag は、遅延スロットスケジューリングの間でだけ使われ、 他のパスには何の意味も持たない。

(attr name)

別の属性の値を返す。数値属性に対して最も役に立つが、 同様に、非数値属性にたいしても eq_attrattr_flag が より効率の良いコードを生成する助けとなる。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

This document was generated using texi2html 1.78.