[ < ] | [ > ] | [ << ] | [ 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.