A machine mode describes a size of data object and the representation used for it. In the C code, machine modes are represented by an enumeration type, enum machine_mode
, defined in `machmode.def'. Each RTL expression has room for a machine mode and so do certain kinds of tree expressions (declarations and types, to be precise).
In debugging dumps and machine descriptions, the machine mode of an RTL expression is written after the expression code with a colon to separate them. The letters `mode' which appear at the end of each machine mode name are omitted. For example, (reg:SI 38)
is a reg
expression with machine mode SImode
. If the mode is VOIDmode
, it is not written at all.
Here is a table of machine modes. The term ``byte'' below refers to an object of BITS_PER_UNIT
bits (see Storage Layout).
QImode
HImode
PSImode
SImode
PDImode
DImode
TImode
SFmode
DFmode
XFmode
TFmode
CCmode
cc0
(see see Condition Code).
BLKmode
BLKmode
will not appear in RTL.
VOIDmode
const_int
have mode VOIDmode
because they can be taken to have whatever mode the context requires. In debugging dumps of RTL, VOIDmode
is expressed by the absence of any mode.
SCmode, DCmode, XCmode, TCmode
SFmode
, DFmode
, XFmode
, and TFmode
, respectively.
CQImode, CHImode, CSImode, CDImode, CTImode, COImode
QImode
, HImode
, SImode
, DImode
, TImode
, and OImode
, respectively.
The machine description defines Pmode
as a C macro which expands into the machine mode used for addresses. Normally this is the mode whose size is BITS_PER_WORD
, SImode
on 32-bit machines.
The only modes which a machine description must support are QImode
, and the modes corresponding to BITS_PER_WORD
, FLOAT_TYPE_SIZE
and DOUBLE_TYPE_SIZE
. The compiler will attempt to use DImode
for 8-byte structures and unions, but this can be prevented by overriding the definition of MAX_FIXED_MODE_SIZE
. Alternatively, you can have the compiler use TImode
for 16-byte structures and unions. Likewise, you can arrange for the C type short int
to avoid using HImode
.
Very few explicit references to machine modes remain in the compiler and these few references will soon be removed. Instead, the machine modes are divided into mode classes. These are represented by the enumeration type enum mode_class
defined in `machmode.h'. The possible mode classes are:
MODE_INT
QImode
, HImode
, SImode
, DImode
, and TImode
.
MODE_PARTIAL_INT
PSImode
and PDImode
.
MODE_FLOAT
SFmode
, DFmode
, XFmode
and TFmode
.
MODE_COMPLEX_INT
MODE_COMPLEX_FLOAT
SCmode
, DCmode
, XCmode
, and TCmode
.
MODE_FUNCTION
MODE_CC
CCmode
plus any modes listed in the EXTRA_CC_MODES
macro. See Jump Patterns, also see Condition Code.
MODE_RANDOM
VOIDmode
and BLKmode
are in MODE_RANDOM
. Here are some C macros that relate to machine modes:
GET_MODE (x)
PUT_MODE (x, newmode)
NUM_MACHINE_MODES
GET_MODE_NAME (m)
GET_MODE_CLASS (m)
GET_MODE_WIDER_MODE (m)
GET_MODE_WIDER_MODE (QImode)
returns HImode
.
GET_MODE_SIZE (m)
GET_MODE_BITSIZE (m)
GET_MODE_MASK (m)
HOST_BITS_PER_INT
.
GET_MODE_ALIGNMENT (m))
GET_MODE_UNIT_SIZE (m)
GET_MODE_SIZE
except in the case of complex modes. For them, the unit size is the size of the real or imaginary part.
GET_MODE_NUNITS (m)
GET_MODE_SIZE
divided by GET_MODE_UNIT_SIZE
.
GET_CLASS_NARROWEST_MODE (c)
The global variables byte_mode
and word_mode
contain modes whose classes are MODE_INT
and whose bitsizes are either BITS_PER_UNIT
or BITS_PER_WORD
, respectively. On 32-bit machines, these are QImode
and SImode
, respectively.