[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
マシンモードは、データオブジェクトの大きさ、その表現方法を記述する。
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_WORD
、FLOAT_TYPE_SIZE
、DOUBLE_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
「部分整数モード」を表す。PSImode
と PDImode
が
該当する。
MODE_FLOAT
浮動小数点モード。デフォルトでは、SFmode
, DFmode
, XFmode
,
TFmode
である。
MODE_COMPLEX_INT
整数複素数モード。(現時点では実装されていない。)
MODE_COMPLEX_FLOAT
浮動小数点複素数モード。デフォルトでは、SCmode
、
DCmode
, XCmode
, and TCmode
である。
MODE_FUNCTION
静的チェーンを含む、Algol や Pascal の関数変数である。 (現時点では実装されていない。)
MODE_CC
条件コード値を表すモード。これには、CCmode
と、
EXTRA_CC_MODES
マクロに示された全てのモードが含まれる。
See section ジャンプ命令のパターンを定義する、条件コードステータス を参照のこと。
MODE_RANDOM
これは、上記のどのクラスにも当てはまらないモードのための受皿モードである。
現時点では、VOIDmode
と BLKmode
が MODE_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_SIZE
を GET_MODE_UNIT_SIZE
で
割ったものを返す。
GET_CLASS_NARROWEST_MODE (c)
モードクラス c の中で最も幅の狭いモードを返す。
グローバル変数 byte_mode
と word_mode
は、
モードクラスが MODE_INT
であり、ビット数が
それぞれ BITS_PER_UNIT
と BITS_PER_WORD
のモードを保持している。
32ビットマシンでは、それぞれ QImode
と SImode
になる。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This document was generated
using texi2html 1.78.