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

15.5 マシンモード

マシンモードは、データオブジェクトの大きさ、その表現方法を記述する。 C のコード中では、マシンモードは列挙型 enum machine_mode で 表現される。この列挙型は、‘machmode.def’ で定義されている。 各 RTL 式にはマシンモードを格納する場所があり、そのため、ある種のツリー式 (正確には、宣言と型である)を格納する場所も持っている。

デバッグダンプとマシン記述のなかでは、RTL 式のマシンモードは、式コードの 後ろにコロンで区切って書く。各マシンモード名に付く‘mode’は、 省略される。例えば、(reg:SI 38) は、reg 式で、マシンモードは SImode である。モードが VOIDmode の場合は、モードとしては 何も出力されない。

以下にマシンモードの表を示す。以下では、「バイト」とは、BITS_PER_UNIT ビットのオブジェクトを指す(see section 記憶領域のレイアウト)。

QImode

「1/4 精度整数」(Quarter-Integer)モードは、整数として扱われる1バイトを 表現する。

HImode

「1/2 精度整数」(Half-Integer)モードは、2バイト整数を表す。

PSImode

「部分単精度整数」(Partial Single Integer)モードは、4バイトを占有するが、 実際に4バイト全てを使うことはないような整数を表す。 マシンによっては、これがポインタ用の正しいモードになる。

SImode

「単精度整数」(Single Integer)モードは、四バイト整数を表す。

PDImode

「部分倍精度整数」(Partial Double Integer)モードは、8バイトを占有するが、 実際に8バイト全てを使うことはないような整数を表す。 マシンによっては、これがある種のポインタ用の正しいモードになる。

DImode

「倍精度整数」モードは八バイト整数を表す。

TImode

「4倍精度整数」(Tetra Integer)モードは、16バイト整数を表す。

SFmode

「単精度浮動小数点数」(Single Floating)モードは、単精度(四バイト)浮動小数点数 を表す。

DFmode

「倍精度浮動小数点数」(Double Floating)モードは、倍精度(八バイト)浮動小数点数 を表す。

XFmode

「拡張精度浮動小数点数」(Extended Floating)モードは、3倍精度(12バイト) 浮動小数点数を表す。このモードは、IEEE 拡張浮動小数点数に使う。 システムによっては、12バイトの中には実際に使われないビットがある。

TFmode

「4倍精度浮動小数点数」(Tetra Floating)モードは、4倍精度(16バイト) 浮動小数点数を表す。

CCmode

「条件コード」(Condition Code)モードは、条件コードの値を表す。 条件コードは、機種に固有のビットの一群で、比較演算の結果を表す。 これ以外の機種固有のモードが条件コードに対して使われることもある。 これらのモードは、cc0 を使う機種では使われない。 (see section 条件コードステータス。)

BLKmode

「ブロック」(Block)モードは、他のどのモードも適用できないような集合体の 値を表す。RTL では、メモリへの参照のみがこのモードを取りうる。 しかも、それが文字列移動またはベクトル命令中に現れたときだけに限られる。 このような命令を持たない機種では、BLKmode が RTL に現れることは ない。

VOIDmode

「ボイド」(Void)モードは、モードがないこと、あるいはモードを指定しないこと を意味する。例えば、コードが const_int である RTL 式は VOIDmode になる。何故なら、文脈が要求するどんなモードとしても 取ることが出来るからである。RTL のデバッグダンプ中では、VOIDmode は、 モードが一切無いことにより表現される。

SCmode, DCmode, XCmode, TCmode

これらのモードは、浮動小数点数値の対として表現された複素数を表す。 浮動小数点数値は、それぞれ、SFmode, DFmode, XFmode, TFmode になる。

CQImode, CHImode, CSImode, CDImode, CTImode, COImode

これらのモードは、整数値の対として表現された複素数を表す。 整数値は、それぞれ、QImode, HImode, SImode, DImode, TImode, OImode である。

マシン記述では、Pmode を C のマクロとして定義し、このマクロは アドレス向けのマシンモードに展開される。普通は、これは BITS_PER_WORD の大きさのモードであり、32ビットのマシンでは SImode になる。

マシン記述に必ず記述が必要なのは、QImode と、それぞれ BITS_PER_WORDFLOAT_TYPE_SIZEDOUBLE_TYPE_SIZE に対応するモードである。 GCC は、8バイトの構造体と共用体に対して DImode を使うことを 試みるが、MAX_FIXED_MODE_SIZE の定義を書き換えることにより、 抑止することができる。 また、16バイトの構造体と共用体向けに TImode を使わせることも 可能である。同様に、C の short int 型に、HImode を 使うのを避けるように設定することも可能である。

現在では、GCC の中でマシンモードを明示的に参照しているコードはほとんどなく、 あっても早々に削除してしまう予定である。その代わり、マシンモードを モードのクラスに分割している。マシンモードのクラスは、列挙型 enum mode_class で表される。この列挙型は ‘machmode.h’ で 定義されている。取りうるモードクラスは以下の通りである。

MODE_INT

整数モード。デフォルトでは、QImode, HImode, SImode, DImode, TImode が該当する。

MODE_PARTIAL_INT

「部分整数モード」を表す。PSImodePDImode が 該当する。

MODE_FLOAT

浮動小数点モード。デフォルトでは、SFmode, DFmode, XFmode, TFmode である。

MODE_COMPLEX_INT

整数複素数モード。(現時点では実装されていない。)

MODE_COMPLEX_FLOAT

浮動小数点複素数モード。デフォルトでは、SCmodeDCmode, XCmode, and TCmode である。

MODE_FUNCTION

静的チェーンを含む、Algol や Pascal の関数変数である。 (現時点では実装されていない。)

MODE_CC

条件コード値を表すモード。これには、CCmode と、 EXTRA_CC_MODES マクロに示された全てのモードが含まれる。 See section ジャンプ命令のパターンを定義する条件コードステータス を参照のこと。

MODE_RANDOM

これは、上記のどのクラスにも当てはまらないモードのための受皿モードである。 現時点では、VOIDmodeBLKmodeMODE_RANDOM に 該当する。

以下にマシンモード関連の C マクロを示す。

GET_MODE (x)

RTX x のマシンモードを返す。

PUT_MODE (x, newmode)

RTX x のマシンモードを newmode にする。

NUM_MACHINE_MODES

ターゲット機種で利用可能なマシンモードの数を表す。 これは、マシンモード値のうち最大のものに 1 を足したものになる。

GET_MODE_NAME (m)

モード m の名前を文字列で返す。

GET_MODE_CLASS (m)

モード m のモードクラスを返す。

GET_MODE_WIDER_MODE (m)

指定したモードの次に広い自然なモードを返す。 例えば、GET_MODE_WIDER_MODE (QImode) という式は、 HImode を返す。

GET_MODE_SIZE (m)

モード m のデータの大きさをバイト数で返す。

GET_MODE_BITSIZE (m)

モード m のデータの大きさをビット数で返す。

GET_MODE_MASK (m)

一語中のビットのうち、モード m の範囲内に収まる全てのビットを 表すビットマスクを返す。 このマクロは、ビット数が HOST_BITS_PER_INT 以下であるモードに 対してのみ使うことができる。

GET_MODE_ALIGNMENT (m)

モード m のオブジェクトに必要なアラインメントをビット数で 返す。

GET_MODE_UNIT_SIZE (m)

モード m のデータの部分単位の大きさをバイト数で返す。 これは、複素数のモードの場合以外は、GET_MODE_SIZE と同じである。 複素数のモードの場合は、部分単位の大きさは、実数部また虚数部の大きさである。

GET_MODE_NUNITS (m)

あるモードに含まれる単位の数を返す。 すなわち、GET_MODE_SIZEGET_MODE_UNIT_SIZE で 割ったものを返す。

GET_CLASS_NARROWEST_MODE (c)

モードクラス c の中で最も幅の狭いモードを返す。

グローバル変数 byte_modeword_mode は、 モードクラスが MODE_INT であり、ビット数が それぞれ BITS_PER_UNITBITS_PER_WORD のモードを保持している。 32ビットマシンでは、それぞれ QImodeSImode になる。


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

This document was generated using texi2html 1.78.