机器模式描述数据对象的大小及其表示。在C 代码中,机器模式表示成枚举类型enum machine_mode。此类型定义在machmode.def中。每个RTL表达式都有机器模式域。一些树结构如变量定义、类型等也有机器模式域。
在调试信息及机器描述中,RTL表达式的机器模式紧跟在RTL 代码之后,其间用冒号隔开。每一种机器模式名未尾的字母省缺为‘mode’。例如:(reg:SI 38)是一个reg表达式,其机器模式为SImode。如果方式为VOIDmode,表达式中完全不出现此模式。
以下是一个机器模式表,这里的“字节”是指具有BITS_PER_UNIT个存储位的对象
(参见Storage Layout)。
BImodeQImodeHImodePSImodeSImodePDImodeDImodeTImodeOImodeQFmodeHFmodeTQFmodeSFmodeDFmodeXFmodeSDmodeDDmodeTDmodeTFmodeQQmodeHQmodeSQmodeDQmodeTQmodeUQQmodeUHQmodeUSQmodeUDQmodeUTQmodeHAmodeSAmodeDAmodeTAmodeUHAmodeUSAmodeUDAmodeUTAmodeCCmodeBLKmodeBLKmode将不出现在 RTL中。
VOIDmodeconst_int表达式的模式就是VOIDmode, 因为此类表达式可认为具有其上下文所要求的任何模式。在RTL的调试输出中,VOIDmode表示成没有任何模式出现。
QCmode, HCmode, SCmode, DCmode, XCmode, TCmodeQFmode、HFmode, SFmode, DFmode, XFmode和TFmode。
CQImode, CHImode, CSImode, CDImode, CTImode, COImodeQImode, 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_INTBImode, QImode, HImode, SImode, DImode, TImode和OImode。
MODE_PARTIAL_INTPQImode, PHImode, PSImode和PDImode。
MODE_FLOATQFmode, HFmode, TQFmode, SFmode, DFmode, XFmode和TFmode。
MODE_DECIMAL_FLOATSDmode, DDmode和TDmode。
MODE_FRACTQQmode, HQmode, SQmode, DQmode和TQmode。
MODE_UFRACTUQQmode, UHQmode, USQmode, UDQmode和UTQmode。
MODE_ACCUMHAmode, SAmode, DAmode和TAmode。
MODE_UACCUMUHAmode, USAmode, UDAmode和UTAmode。
MODE_COMPLEX_INTMODE_COMPLEX_FLOATQCmode, HCmode, SCmode, DCmode, XCmode和TCmode。
MODE_FUNCTIONMODE_CCCCmode加上在machine-modes.def中列出的任何CC_MODE模式。参见Jump Patterns, 同时参见Condition Code。
MODE_RANDOMVOIDmode和BLKmode包括在MODE_RANDOM中。
GET_MODE (x)PUT_MODE (x, newmode)NUM_MACHINE_MODESGET_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。