| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
複数の RTL 式がある一個の機械命令で実行される演算を表す場合が良くある。 これは、論理命令、分岐命令、積和命令で良くあることである。 そういう場合、コンパイラは複数の RTL 式を一個の正規形に変換して、 必要とする insn パターンの数を減らそうとする。
代数的な単純化に加えて、以下の正規化が行なわれる。
以下の演算については、一方のオペランドだけが neg、not、
mult、plus、minus 式の場合、それは第一の
オペランドになる。
compare 演算子の場合、cc0 が使われる機種(see section ジャンプ命令のパターンを定義する)
では、定数は常に第二オペランドになる。それ以外の機種では、定数を
第一オペランドとする compare をコンパイラが作ろうとする
場合が希にある。だが、そういう場合は、実際にそういう機械命令が
ない限り、第一オペランドとして定数にマッチするパターンを用意する
価値があるほど多くはない。
neg、not、mult、plus、
minus のオペランドは、上と同じ条件下で第一オペランドになる。
(minus x (const_int n)) は
(plus x (const_int -n)) に変換される。
mem の中で)、左シフトは
適当な 2 の冪乗の乗算に変換される。
not 式になった場合、それが先頭のオペランドになる。
一つのオペランドと、もう一方のオペランドのビット毎の否定のビット毎の論理積を 実行する命令がある機種では、その命令用のパターンは以下のように指定すべき である。
(define_insn ""
[(set (match_operand:m 0 …)
(and:m (not:m (match_operand:m 1 …))
(match_operand:m 2 …)))]
"…"
"…")
|
同様に、“NAND” 命令用のパターンは以下のように書くべきである。
(define_insn ""
[(set (match_operand:m 0 …)
(ior:m (not:m (match_operand:m 1 …))
(not:m (match_operand:m 2 …))))]
"…"
"…")
|
どちらの場合にも、たくさんある論理的に等価な RTL 式に対するパターンを 含める必要はない。
(xor:m x y) と
(not:m (xor:m x y))
だけである。
(plus:m (plus:m x y) constant) |
cc0 を使わない機種では、(compare x (const_int 0)) は
x に変換される。
and や sign_extract 演算ではなくて、
zero_extract を使って書かれる。
This document was generated
using texi2html 1.78.