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

16.9 パターン間の依存関係

どのマシン記述でも、条件分岐名 ‘bcond’ のそれぞれに ついて名前付きパターンがなければならない。 この場合、許されるテンプレートは常に以下の形でなければならない。

 
(set (pc)
     (if_then_else (cond (cc0) (const_int 0))
                   (label_ref (match_operand 0 "" ""))
                   (pc)))

さらに、どのマシン記述でも、条件を逆にした分岐毎に名無しのパターンが なければならない。 テンプレートは以下の形となる。

 
(set (pc)
     (if_then_else (cond (cc0) (const_int 0))
                   (pc)
                   (label_ref (match_operand 0 "" ""))))

これらが必要なのは、ジャンプ最適化で順条件分岐が逆条件分岐に 変換されることがあるためである。

match_operator を使って、分岐に対し指定しなければならない パターンの数を押さえるということを良く行なう。 例えば、以下のようにする。

 
(define_insn ""
  [(set (pc)
        (if_then_else (match_operator 0 "comparison_operator"
                                      [(cc0) (const_int 0)])
                      (pc)
                      (label_ref (match_operand 1 "" ""))))]
  "condition"
  "…")

場合によっては、一個以上のオペランドのマシンモードを除けば同じになる命令を サポートしている機種がある。例えば、 “sign-extend halfword” と “sign-extend byte” という命令があり、 そのパターンは以下のようになる。

 
(set (match_operand:SI 0 …)
     (extend:SI (match_operand:HI 1 …)))

(set (match_operand:SI 0 …)
     (extend:SI (match_operand:QI 1 …)))

整数定数はマシンモードを指定しないので、定数値を拡張する命令は どちらのパターンにもマッチし得る。 実際にマッチするパターンは、ファイルで先に現れたものになる。 正しい結果を得るためには、先に置くのは最も幅の広いモード(ここでは HImode) のものでなければならない。 パターンが QImode の命令にマッチした場合、 定数値がこのモードに実際に収まらない場合は正しくない結果になる。

定数を拡張するような命令は最適化の際になくなるので、滅多に生成される ことはないが、最適化をしないコンパイルでは時々出てくる。

あるパターンのある制約が定数を許すなら、再ロードパスが、いくつかのケースの 制約で許されているなら、レジスタを定数で置き換える可能性がある。 メモリ参照についても同様である。 この置き換えがあるので、インクリメントとデクリメント命令に別々の パターンを与えるべきではない。 代わりに、同一のパターンから生成されるようにする必要がある。 このパターンは、オペランドを調べて適切な機械命令を生成するような レジスタ同士の加算 insn をサポートする必要がある。


This document was generated using texi2html 1.78.