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