[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
比較演算子は、二つのオペランドについてある関係が成り立つかどうかを調べ、
その関係が成り立つなら 0 でない値、成り立たないなら 0 を表す。
0 でない値の方は、機種依存であり、 STORE_FLAG_VALUE
(see section 種々雑多なパラメータ)で記述されるが、この値に等しくなる必要はない。
比較演算のモードは、比較対象のデータのモードには関係ない。
比較演算が、条件判定に使われる(例えば、if_then_else
の
第一オペランドとして使われる)場合は、モードは VOIDmode
で
なければならない。あるいは、比較演算の結果、変数に格納すべきなんらかのデータを
生じるなら、モードは MODE_INT
のクラスに入っていなければならない。
データを生成する全ての比較演算は同じモードを使わなければならない。
どのモードになるかは機種依存である。
比較演算の使われ方には二通りある。
比較演算子を使って、条件コード (cc0)
をゼロと比較することが
できる。例えば、(eq (cc0) (const_int 0))
のようにである。
こういう構文では、条件コードを設定する先行命令の結果を
実際に参照している。
条件コードを設定する命令は、条件コードを使用する命令の直前に
なければならない。これらの命令の間に置いて良いのは、
note
insn だけである。
あるいは、比較演算は二つのデータオブジェクトを直接比較しても良い。 比較のモードはオペランドにより決定される。どちらのオペランドも ある共通のマシンモードに対して有効でなければならない。 両方のオペランドが定数である比較は、モードを決めることができないので 無効である。しかし、そのような比較は、定数畳み込みにより、RTL 中には 決して存在しないはずである。
上の例だと、(cc0)
が直前で (compare x y)
に
設定されているなら、比較演算は (eq x y)
に
等価である。普通は、ある特定のマシンでは、どちらか一方の形式のだけの
比較がサポートされている。しかし、組合せパスは演算をマージして、
特定の insn が含まれている文脈に存在するなら、
このような eq
式を生成することを試みる。
不等比較は、符号付きと符号なしの二種類がある。
このため、符号付きと符号なしの「大なり」に対応して、
gt
と gtu
の異なる式コードがある。
これらは、同じ整数値の組合せに対して異なる結果を生じることもある。
例えば、1 は符号付きでは -1 より「大なり」であるが、
符号なしでは「大なり」ではない。-1 は符号なしとして扱われると、
実際には 0xffffffff
となり、 1 より大きいからである。
符号付き比較はまた浮動小数点値にも使われる。 浮動小数点比較は、オペランドのマシンモードにより区別される。
(eq:m x y)
x と y で表現される値が等しければ 1 で、 等しくなければ 0 である。
(ne:m x y)
x と y で表現される値が等しくなければ 1 で、 等しければ 0 である。
(gt:m x y)
x が y より大きければ 1 である。 両者とも固定小数点であれば、符号付きで比較が行なわれる。
(gtu:m x y)
符号無しで比較が行なわれ、そのため固定小数点数についてのみ使われるという
点を除いて、gt
と同じである。
(lt:m x y)
(ltu:m x y)
gt
や gtu
と同様だが、「より小さい」かどうかを判定する。
(ge:m x y)
(geu:m x y)
gt
や gtu
と同様だが、「以上」かどうかを判定する。
(le:m x y)
(leu:m x y)
gt
や gtu
と同様だが、「以下」かどうかを判定する。
(if_then_else cond then else)
これは、比較演算ではないが、ここで挙げておく。というのは、
必ず比較演算と関連して使われるからである。
正確に言うと、cond は比較式である。
if_then_else
式は、cond により、then で表される値と
else で表される値のどちらかの選択肢を表す。
ほとんどの機種では、if_then_else
式は条件ジャンプを表す場合にのみ
有効である。
(cond [test1 value1 test2 value2 …] default)
if_then_else
と同様だが、もっと一般的である。
test1、test2、… がそれぞれ順番に実行される。
cond
式の結果は、最初に非 0 となったテストに対応する value と
なる。あるいは、非 0 となったテストがなければ、default になる。
この式は、現時点では命令パターンに対しては使用できない。 insn の属性にたいしてのみ使用できる。See section 命令の属性.
This document was generated
using texi2html 1.78.