[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
どのマシン記述でも、条件分岐名 ‘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.