机器模式描述数据对象的大小及其表示。在C 代码中,机器模式表示成枚举类型enum machine_mode
。此类型定义在machmode.def中。每个RTL表达式都有机器模式域。一些树结构如变量定义、类型等也有机器模式域。
在调试信息及机器描述中,RTL表达式的机器模式紧跟在RTL 代码之后,其间用冒号隔开。每一种机器模式名未尾的字母省缺为‘mode’。例如:(reg:SI 38)
是一个reg
表达式,其机器模式为SImode
。如果方式为VOIDmode
,表达式中完全不出现此模式。
以下是一个机器模式表,这里的“字节”是指具有BITS_PER_UNIT
个存储位的对象
(参见Storage Layout)。
BImode
QImode
HImode
PSImode
SImode
PDImode
DImode
TImode
OImode
QFmode
HFmode
TQFmode
SFmode
DFmode
XFmode
SDmode
DDmode
TDmode
TFmode
QQmode
HQmode
SQmode
DQmode
TQmode
UQQmode
UHQmode
USQmode
UDQmode
UTQmode
HAmode
SAmode
DAmode
TAmode
UHAmode
USAmode
UDAmode
UTAmode
CCmode
BLKmode
BLKmode
将不出现在 RTL中。
VOIDmode
const_int
表达式的模式就是VOIDmode
, 因为此类表达式可认为具有其上下文所要求的任何模式。在RTL的调试输出中,VOIDmode
表示成没有任何模式出现。
QCmode, HCmode, SCmode, DCmode, XCmode, TCmode
QFmode
、HFmode
, SFmode
, DFmode
, XFmode
和TFmode
。
CQImode, CHImode, CSImode, CDImode, CTImode, COImode
QImode
, HImode
,SImode
, DImode
, TImode
和OImode
。
机器描述定义Pmode
为一个C宏,其扩展为用于寻址的机器模式。通常这是一个在32位机器上,大小为BITS_PER_WORD
, SImode
模式。
机器描述唯一必须要支持的机器模式为QImode
,以及对应于BITS_PER_WORD
,FLOAT_TYPE_SIZE
和DOUBLE_TYPE_SIZE
的机器模式。编译器将尝试使用DImode
,表示8字节的结构体和联合体,不过这可以通过重写MAX_FIXED_MODE_SIZE
的定义来阻止。替换的,你可以让编译器使用TImode
表示16字节的结构体和联合体。同样,你可以使得C类型short int
避免使用HImode
。
编译器中,有很少的对机器模式显式的引用,并且这些引用将不久被移除掉。替代的,机器模式被分成机器模式类别。这些由定义在machmode.h中的枚举类型enum mode_class
来表示。可能的机器类别有:
MODE_INT
BImode
, QImode
, HImode
, SImode
, DImode
, TImode
和OImode
。
MODE_PARTIAL_INT
PQImode
, PHImode
, PSImode
和PDImode
。
MODE_FLOAT
QFmode
, HFmode
, TQFmode
, SFmode
, DFmode
, XFmode
和TFmode
。
MODE_DECIMAL_FLOAT
SDmode
, DDmode
和TDmode
。
MODE_FRACT
QQmode
, HQmode
, SQmode
, DQmode
和TQmode
。
MODE_UFRACT
UQQmode
, UHQmode
, USQmode
, UDQmode
和UTQmode
。
MODE_ACCUM
HAmode
, SAmode
, DAmode
和TAmode
。
MODE_UACCUM
UHAmode
, USAmode
, UDAmode
和UTAmode
。
MODE_COMPLEX_INT
MODE_COMPLEX_FLOAT
QCmode
, HCmode
, SCmode
, DCmode
, XCmode
和TCmode
。
MODE_FUNCTION
MODE_CC
CCmode
加上在machine-modes.def中列出的任何CC_MODE
模式。参见Jump Patterns, 同时参见Condition Code。
MODE_RANDOM
VOIDmode
和BLKmode
包括在MODE_RANDOM
中。
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_WIDER_MODE (QImode)
返回HImode
。
GET_MODE_SIZE (
m)
GET_MODE_BITSIZE (
m)
GET_MODE_IBIT (
m)
GET_MODE_FBIT (
m)
GET_MODE_MASK (
m)
HOST_BITS_PER_INT
的机器模式。
GET_MODE_ALIGNMENT (
m)
GET_MODE_UNIT_SIZE (
m)
GET_MODE_SIZE
相同,除了复数模式。对于它们,单元大小为实部或者虚部的大小。
GET_MODE_NUNITS (
m)
GET_MODE_UNIT_SIZE
除以GET_MODE_SIZE
。
GET_CLASS_NARROWEST_MODE (
c)
全局变量byte_mode
和word_mode
包含了类别为MODE_INT
,并且位大小分别是BITS_PER_UNIT
或BITS_PER_WORD
的机器模式。在32位机器上,这些分别是QImode
和SImode
。