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

15.8 算術演算用 RTL 式

指定されない限り、代数演算式の全てのオペランドはモード m に対して 有効でなければならない。あるオペランドがモード m に対して有効なのは、 オペランド自身のモードが m の場合か、オペランドが const_int または const_doublemMODE_INT クラスのモード の時である。

交換可能な二項演算の場合には、定数は二番目のオペランドに置くべきである。

(plus:m x y)

マシンモード m で実行される、xy で表される値の 加算を表す。

(lo_sum:m x y)

plus にほぼ同じだが、x と、y の下位ビットの和を 表す点が異なる。下位ビット数は機種により異なるが、一般には、 Pmode のビット数から、コード high によってセットされる ビット数を引いたものになる(see section 定数式型)。

m は、Pmode でなければならない。

(minus:m x y)

減算を表す以外は plus と同じである。

(compare:m x y)

比較目的の y から x を引く減算の結果を表す。 無限の精度があるかのように、計算は桁溢れなしで行われる。

当然のことだが、実際に無限の精度で引き算を行える機械は存在しない。 だが、引き算の結果の符号だけが使われる場合は、無限の精度で引き算が できるような振りをすることができる。その場合、引き算の結果は条件コードに 格納される。そして、この種類の式が正しく使えるのはこういう場合、 すなわち、条件コードに格納される値としてだけである。

モード m は、xy のモードには関係なく、 条件コードの値のモードになる。(cc0) が使われるのなら、 VOIDmode になる。それ以外の場合は、MODE_CC クラスの 中のあるモードになる。良く使われるのは CCmode である。 See section 条件コードステータス.

普通は、xy は同じモードでなければならない。 それ以外で compare が有効なのは、x のモードが、 MODE_INT のクラスに属し、かつ、yVOIDmode モード の const_intconst_double の場合のみである。 x のモードによって、比較が行われるモードが決まるので、 x のモードは VOIDmode であってはならない。

オペランドの一方が定数であるなら、それは第二オペランドに 置くべきであり、そうすることによって比較のためのコードが 適切に調整される。

compare で、VOIDmode の定数を二つ指定するのは 無効である。というのは、どのモードで比較を実行すべきか知りようがないから である。比較は、コンパイル中に畳み込まれるか、先頭のオペランドが そのモードがわかっているレジスタにロードされるかしなければならない。

(neg:m x)

x で表現される値の符号を反転した(0 から引いた)値を表現する。 m のモードで演算が行われる。

(mult:m x y)

xy で表される値の符号付きの積を表現する。 積は、モード m で行われる。

機種によっては、オペランドよりも大きな積を生成する乗算をサポート している。その場合には、次のようにパターンを書くこと。

 
(mult:m (sign_extend:m x) (sign_extend:m y))

ここで、m は、xy のモードよりも大きいモードである。 xy のモードは同じでなくても良い。

符号無しの、大きな積を生じる乗算の場合には、 zero_extend を使って同じように書けば良い。

(div:m x y)

マシンモード mxy で割った、符号付きの商を表す。 m が浮動小数点モードなら、厳密な商を表す。そうでなければ、 整数化した商を表す。

マシンによっては、オペランドと商の幅が全部同じではない場合の除算命令を 持っていることがある。そういう命令を表現するには、以下のように、 truncatesign_extend を使う。

 
(truncate:m1 (div:m2 x (sign_extend:m2 y)))
(udiv:m x y)

div とほぼ同じだが、符号無しの除算を表す。

(mod:m x y)
(umod:m x y)

divudiv と似ているが、商の代わりに剰余を表す。

(smin:m x y)
(smax:m x y)

xy の小さいほう(sminの場合)または大きいほう (smax の場合)を表す。この場合、 モード m の符号付き整数として解釈が行なわれる。

(umin:m x y)
(umax:m x y)

sminsmax とほぼ同じだが、符号無しの整数として解釈が 行なわれる。

(not:m x)

x で表される値のビット毎の補数を表現する。 この演算はモード m で行なわれる。 m は、固定小数点モードでなければならない。

(and:m x y)

xy で表される値のビット毎の論理積を表現する。 ビット毎の論理積はモード m で実行される。 このモードは、固定少数点数のモードでなければならない。

(ior:m x y)

xy で表される値のビット毎の論理和を表現する。 ビット毎の論理和はモード m で実行される。 このモードは、固定少数点数のモードでなければならない。

(xor:m x y)

xy で表される値のビット毎の排他的論理和を表現する。 ビット毎の排他的論理和はモード m で実行される。 このモードは、固定少数点数のモードでなければならない。

(ashift:m x c)

x を左に c 回算術シフトした結果を表現する。 x のモードは m であり、固定少数点数のモードである。 c は、固定小数点数モードか、モードが VOIDmode の定数である。 c のモードがどちらになるかは、 マシン記述中の左シフト命令のエントリに対して 呼び出されるモードにより決定される。 例えば、Vax では、c のモードは、m に関わらず、 QImode である。

(lshiftrt:m x c)
(ashiftrt:m x c)

右シフトである点を除いて、ashift と同じである。 左シフトの場合と違って、この二つの演算は異なる物である。

(rotate:m x c)
(rotatert:m x c)

同様に、左右のローテーションを表す。c が定数なら、 rotate の方を使うこと。

(abs:m x)

モード m で計算した、xの絶対値を表現する。

(sqrt:m x)

モード m で計算した、x の平方根を表現する。 ほとんどの場合、m は浮動小数点モードになる。

(ffs:m x)

x の、 1 であるビットのうちの最下位のビットの位置に 1 を足したものを、 モード m の整数として表現する。(x がゼロであれば、この値は 0 になる。) x のモードは m でなくても良い。 ターゲットの機種により、色々なモードの組合せが有効である。


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

This document was generated using texi2html 1.78.