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

17.12 条件コードステータス

条件コードステータスについて説明する。

ファイル ‘conditions.h’ で、変数 cc_status を 定義している。これは、条件コードがどのように計算されるかを記述している (条件コードを設定した命令によって条件コードの解釈が異なる場合)。 この変数は、条件コードが現在元にしている RTL 式と、色々な標準の フラグを含んでいる。

場合によっては、機種固有のフラグをマシン記述ヘッダファイルで 追加で定義しなければならないこともある。 また、機種固有の情報を CC_STATUS_MDEP を定義することで追加することが できる。

CC_STATUS_MDEP

cc_statusmdep 成分を宣言するのに使われる データ型についての C のコード。 デフォルトは int になる。

このマクロは、cc0 を使用しない機種では使われない。

CC_STATUS_MDEP_INIT

mdep フィールドを「空」に初期化する C の式。 デフォルトの定義は何もしない。何故なら、ほとんどの機種では このフィールドは使わないからである。 このフィールドを使う場合には、恐らくこのマクロを定義して初期化を すべきであろう。

このマクロは、cc0 を使用しない機種では使われない。

NOTICE_UPDATE_CC (exp, insn)

本体が exp である insn insn に対して cc_status の成分を適切に設定する、C の複文。 このマクロは、条件コードを設定する insn を認識する責任を負う。 これには、明示的に (cc0) を設定するものだけでなく、 他の処理の副産物として条件コードを設定するものも含まれる。

このマクロは、cc0 を使用しない機種では使われない。

条件コードは設定しないが他のマシンレジスタをいじる命令があるなら、 このマクロで、条件コードがそれを反映するように記録されている式を それらの命令が無効にするかどうかを検査しなければならない。 例えば、68000 では、アドレスレジスタにストアする命令は 条件コードを設定しない。これは普通 NOTICE_UPDATE_CC が そういう命令に対して cc_status を変えないままにしておくことが 可能であるということを意味する。だが、直前の命令が ‘a4@(102)’ という 位置に基づいて条件コードを設定し、現在の命令が新しい値を ‘a4’ に ストアするとしよう。条件コードはこれにより変更されないものの、 それが ‘a4@(102)’ の内容を反映しているというのはもはや真ではない。 このため、NOTICE_UPDATE_CC は、この場合 cc_status を 変更することにより、条件コード値については何もわからないということを 言わなければならない。

NOTICE_UPDATE_CC は、覗き穴最適化の結果を扱う準備を するように定義しなければならない。 覗き穴最適化の結果とは、そのパターンが様々な、regmem、 あるいは単なるオペランドである定数を含む parallel RTX である ような insn 群である。 これらの insn の RTL 構造は、その insn が実際に何をするのかを表すのには 充分ではない。NOTICE_UPDATE_CC が、こういう insn に対して なすべきことは、単に CC_STATUS_INIT を実行することである。

NOTICE_UPDATE_CC の可能な定義の一つは、例えば ‘cc’ という 名前の属性(see section 命令の属性)を見る関数を呼び出すことである。 これにより、パターンについての詳細な情報を二箇所、すなわち ‘md’ ファイルと NOTICE_UPDATE_CC に置くのを避けることができる。

EXTRA_CC_MODES

レジスタにある条件コード値の追加のモードに使われる名前のリストである。 このリストの名前は、enum machine_mode に追加され、その全てが クラス MODE_CC を持つ。規約により、これらの名前は ‘CC’ で 始まり、‘mode’ で終わるようにする。

このマクロを定義するのは、cc0 を使わない機種で、しかも追加のモードが 必要な場合に限ること。

EXTRA_CC_NAMES

EXTRA_CC_MODES に列挙したモードの名前を与える C の文字列の リスト。例えば、SPARC では、このマクロと EXTRA_CC_MODES を 以下のように定義している。

 
#define EXTRA_CC_MODES CC_NOOVmode, CCFPmode, CCFPEmode
#define EXTRA_CC_NAMES "CC_NOOV", "CCFP", "CCFPE"

このマクロは、EXTRA_CC_MODES が定義されていなければ必要と されない。

SELECT_CC_MODE (op, x, y)

クラス MODE_CC のあるモードで、比較演算コード op を RTX xy に適用したときに使われるものを返す。 例えば、SPARC では、SELECT_CC_MODE は、以下のように 定義されている(see section ジャンプ命令のパターンを定義する でこの定義の理由を説明している)。

 
#define SELECT_CC_MODE(OP,X,Y) \
  (GET_MODE_CLASS (GET_MODE (X)) == MODE_FLOAT          \
   ? ((OP == EQ || OP == NE) ? CCFPmode : CCFPEmode)    \
   : ((GET_CODE (X) == PLUS || GET_CODE (X) == MINUS    \
       || GET_CODE (X) == NEG) \
      ? CC_NOOVmode : CCmode))

このマクロは、EXTRA_CC_MODES が定義されていなければ、 定義する必要はない。

CANONICALIZE_COMPARISON (code, op0, op1)

機種によっては、可能な比較が全ては定義されていないものがあるが、 無効な比較を有効なものに変換することができる。 例えば、Alpha には GT の比較がないが、 代わりに LT の比較を使って、オペランドの順番を入れ替えることができる。

そういう機種では、このマクロを一個の C の文として定義し、 必要な変換を行なうようにする。 code は、最初の比較コードであり、op0op1 は それぞれ比較の左オペランドと右オペランドである。 必要に応じて、codeop0op1 を更新すべきである。

GNU CC は、このマクロから生じる比較が有効であるとは仮定しないが、 結果の insn が ‘md’ ファイルにあるパターンにマッチするかどうかは 分かる。

比較のコードやオペランドを変更することが全くないのなら、このマクロを 定義する必要はない。

REVERSIBLE_CC_MODE (mode)

モードが mode の比較を反転することが常に安全に行なえるのなら、 値が 1 となる C の式である。 SELECT_CC_MODE が浮動小数点の不等性の比較に対して、 常に mode を返すことができるなら、 REVERSIBLE_CC_MODE (mode) はゼロでなければならない。

このマクロが常にゼロを返すか浮動小数点形式が IEEE_FLOAT_FORMAT 以外なら、このマクロを定義する必要はない。 例えば、以下に Sparc で使われている定義を示す。 浮動小数点数の不等性の比較は常に CCFPEmode で与えられる。

 
#define REVERSIBLE_CC_MODE(MODE)  ((MODE) != CCFPEmode)

This document was generated using texi2html 1.78.