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).
BImode
QImode
HImode
PSImode
SImode
PDImode
DImode
TImode
OImode
QFmode
HFmode
TQFmode
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.
QCmode, HCmode, SCmode, DCmode, XCmode, TCmode
QFmode
,
HFmode
, 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
BImode
, QImode
,
HImode
, SImode
, DImode
, TImode
, and
OImode
.
MODE_PARTIAL_INT
PQImode
, PHImode
,
PSImode
and PDImode
.
MODE_FLOAT
QFmode
,
HFmode
, TQFmode
, SFmode
, DFmode
,
XFmode
and TFmode
.
MODE_COMPLEX_INT
MODE_COMPLEX_FLOAT
QCmode
,
HCmode
, 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.