[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
指定されない限り、代数演算式の全てのオペランドはモード m に対して
有効でなければならない。あるオペランドがモード m に対して有効なのは、
オペランド自身のモードが m の場合か、オペランドが const_int
または const_double
で m が MODE_INT
クラスのモード
の時である。
交換可能な二項演算の場合には、定数は二番目のオペランドに置くべきである。
(plus:m x y)
マシンモード m で実行される、x と y で表される値の 加算を表す。
(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 は、x や y のモードには関係なく、
条件コードの値のモードになる。(cc0)
が使われるのなら、
VOIDmode
になる。それ以外の場合は、MODE_CC
クラスの
中のあるモードになる。良く使われるのは CCmode
である。
See section 条件コードステータス.
普通は、x と y は同じモードでなければならない。
それ以外で compare
が有効なのは、x のモードが、
MODE_INT
のクラスに属し、かつ、y が VOIDmode
モード
の const_int
か const_double
の場合のみである。
x のモードによって、比較が行われるモードが決まるので、
x のモードは VOIDmode
であってはならない。
オペランドの一方が定数であるなら、それは第二オペランドに 置くべきであり、そうすることによって比較のためのコードが 適切に調整される。
compare
で、VOIDmode
の定数を二つ指定するのは
無効である。というのは、どのモードで比較を実行すべきか知りようがないから
である。比較は、コンパイル中に畳み込まれるか、先頭のオペランドが
そのモードがわかっているレジスタにロードされるかしなければならない。
(neg:m x)
x で表現される値の符号を反転した(0 から引いた)値を表現する。 m のモードで演算が行われる。
(mult:m x y)
x と y で表される値の符号付きの積を表現する。 積は、モード m で行われる。
機種によっては、オペランドよりも大きな積を生成する乗算をサポート している。その場合には、次のようにパターンを書くこと。
(mult:m (sign_extend:m x) (sign_extend:m y)) |
ここで、m は、x と y のモードよりも大きいモードである。 x と y のモードは同じでなくても良い。
符号無しの、大きな積を生じる乗算の場合には、
zero_extend
を使って同じように書けば良い。
(div:m x y)
マシンモード m で x を y で割った、符号付きの商を表す。 m が浮動小数点モードなら、厳密な商を表す。そうでなければ、 整数化した商を表す。
マシンによっては、オペランドと商の幅が全部同じではない場合の除算命令を
持っていることがある。そういう命令を表現するには、以下のように、
truncate
と sign_extend
を使う。
(truncate:m1 (div:m2 x (sign_extend:m2 y))) |
(udiv:m x y)
div
とほぼ同じだが、符号無しの除算を表す。
(mod:m x y)
(umod:m x y)
div
や udiv
と似ているが、商の代わりに剰余を表す。
(smin:m x y)
(smax:m x y)
x と y の小さいほう(smin
の場合)または大きいほう
(smax
の場合)を表す。この場合、
モード m の符号付き整数として解釈が行なわれる。
(umin:m x y)
(umax:m x y)
smin
や smax
とほぼ同じだが、符号無しの整数として解釈が
行なわれる。
(not:m x)
x で表される値のビット毎の補数を表現する。 この演算はモード m で行なわれる。 m は、固定小数点モードでなければならない。
(and:m x y)
x と y で表される値のビット毎の論理積を表現する。 ビット毎の論理積はモード m で実行される。 このモードは、固定少数点数のモードでなければならない。
(ior:m x y)
x と y で表される値のビット毎の論理和を表現する。 ビット毎の論理和はモード m で実行される。 このモードは、固定少数点数のモードでなければならない。
(xor:m x y)
x と y で表される値のビット毎の排他的論理和を表現する。 ビット毎の排他的論理和はモード 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.