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

15.9 比較演算

比較演算子は、二つのオペランドについてある関係が成り立つかどうかを調べ、 その関係が成り立つなら 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 式を生成することを試みる。

不等比較は、符号付きと符号なしの二種類がある。 このため、符号付きと符号なしの「大なり」に対応して、 gtgtu の異なる式コードがある。 これらは、同じ整数値の組合せに対して異なる結果を生じることもある。 例えば、1 は符号付きでは -1 より「大なり」であるが、 符号なしでは「大なり」ではない。-1 は符号なしとして扱われると、 実際には 0xffffffff となり、 1 より大きいからである。

符号付き比較はまた浮動小数点値にも使われる。 浮動小数点比較は、オペランドのマシンモードにより区別される。

(eq:m x y)

xy で表現される値が等しければ 1 で、 等しくなければ 0 である。

(ne:m x y)

xy で表現される値が等しくなければ 1 で、 等しければ 0 である。

(gt:m x y)

xy より大きければ 1 である。 両者とも固定小数点であれば、符号付きで比較が行なわれる。

(gtu:m x y)

符号無しで比較が行なわれ、そのため固定小数点数についてのみ使われるという 点を除いて、gt と同じである。

(lt:m x y)
(ltu:m x y)

gtgtu と同様だが、「より小さい」かどうかを判定する。

(ge:m x y)
(geu:m x y)

gtgtu と同様だが、「以上」かどうかを判定する。

(le:m x y)
(leu:m x y)

gtgtu と同様だが、「以下」かどうかを判定する。

(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 と同様だが、もっと一般的である。 test1test2、… がそれぞれ順番に実行される。 cond 式の結果は、最初に非 0 となったテストに対応する value と なる。あるいは、非 0 となったテストがなければ、default になる。

この式は、現時点では命令パターンに対しては使用できない。 insn の属性にたいしてのみ使用できる。See section 命令の属性.


This document was generated using texi2html 1.78.