Next: , Previous: Flags, Up: RTL


10.6 机器模式

机器模式描述数据对象的大小及其表示。在C 代码中,机器模式表示成枚举类型enum machine_mode。此类型定义在machmode.def中。每个RTL表达式都有机器模式域。一些树结构如变量定义、类型等也有机器模式域。

在调试信息及机器描述中,RTL表达式的机器模式紧跟在RTL 代码之后,其间用冒号隔开。每一种机器模式名未尾的字母省缺为‘mode’。例如:(reg:SI 38)是一个reg表达式,其机器模式为SImode。如果方式为VOIDmode,表达式中完全不出现此模式。

以下是一个机器模式表,这里的“字节”是指具有BITS_PER_UNIT个存储位的对象 (参见Storage Layout)。

BImode
“Bit”模式,表示一位,用于断言寄存器。


QImode
“Quarter-Integer”模式,表示一个一字节的整数。


HImode
“Half-Integer”模式,表示一个两字节的整数。


PSImode
“Partial Single Integer”模式,表示一个占有四个字节但并不真正使用全部四个字节的整数。


SImode
“Single Integer”模式,表示一个四字节的整数。


PDImode
“Partial Double Integer”模式,表示一个占有八个字节但并不真正使用全部八个字节的整数。


DImode
“Double Integer”模式,表示一个8 字节的整数。


TImode
“Tetra Integer”模式,表示一个16 字节的整数。


OImode
“Octa Integer” 模式,表示一个32 字节的整数。


QFmode
“Quarter-Floating” 模式,表示一个四分之一精度(单字节)浮点数。


HFmode
“Half-Floating” 模式,表示一个二分之一精度(双字节)浮点数。


TQFmode
“Three-Quarter-Floating” 模式,表示一个四分之三精度(单字节)浮点数。


SFmode
“Single Floating”模式,表示一个单精度(4 个字节)浮点数。


DFmode
“Double Floating”模式,表示一个双精度(8 字节)浮点数。


XFmode
“Extended Floating”模式,表示一个三精度(12 字节)浮点数。本方式用来表示 IEEE 扩展浮点类型。


SDmode
“Single Decimal Floating”模式,表示一个四字节十进制浮点数(区别于常规的二进制浮点)。


DDmode
“Double Decimal Floating”模式,表示一个八字节十进制浮点数。


TDmode
“Tetra Decimal Floating”模式,表示一个十六字节十进制浮点数,所有128位都有含义。


TFmode
“Tetra Floating”模式,表示一个四精度(16 字节)浮点数。


QQmode
“Quarter-Fractional”模式,表示一个单字节的有符号小数。缺省格式为“s.7”。


HQmode
“Half-Fractional”模式,表示一个双字节的有符号小数。缺省格式为“s.15”。


SQmode
“Single Fractional”模式,表示一个四字节的有符号小数。缺省格式为“s.31”。


DQmode
“Double Fractional”模式,表示一个八字节的有符号小数。缺省格式为“s.63”。


TQmode
“Tetra Fractional”模式,表示一个十六字节有符号小数。缺省格式为“s.127”。


UQQmode
“Unsigned Quarter-Fractional”模式,表示一个单字节的无符号小数。缺省格式为“.8”。


UHQmode
“Unsigned Half-Fractional”模式,表示一个双字节的无符号小数。缺省格式为“.16”。


USQmode
“Unsigned Single Fractional”模式,表示一个四字节的无符号小数。缺省格式为“.32”。


UDQmode
“Unsigned Double Fractional”模式,表示一个八字节的无符号小数。缺省格式为“.64”。


UTQmode
“Unsigned Tetra Fractional”模式,表示一个十六字节的无符号小数。缺省格式为“.128”。


HAmode
“Half-Accumulator”模式,表示一个双字节的有符号累加器。缺省格式为“s8.7”。


SAmode
“Single Accumulator”模式,表示一个四字节的有符号累加器。缺省格式为“s16.15”。


DAmode
“Double Accumulator”模式,表示一个八字节的有符号累加器。缺省格式为“s32.31”。


TAmode
“Tetra Accumulator”模式,表示一个十六字节的有符号累加器。缺省格式为“s64.63”。


UHAmode
“Unsigned Half-Accumulator”模式,表示一个双字节的无符号累加器。缺省格式为“8.8”。


USAmode
“Unsigned Single Accumulator”模式,表示一个四字节的无符号累加器。缺省格式为“16.16”。


UDAmode
“Unsigned Double Accumulator”模式,表示一个八字节的无符号累加器。缺省格式为“32.32”。


UTAmode
“Unsigned Tetra Accumulator”模式,表示一个十六字节的无符号累加器。缺省格式为“64.64”。


CCmode
“condition code”模式,表示条件代码的值。其中条件代码是一组与机器相关的位集合,用来表示比较的结果。在使用了 cc0 的机器上,不用CCmode。


BLKmode
“Block”模式,表示其它模式都不适用的聚合值。在 RTL 中,只有内存引用才能有此方式,并且仅当出现在字符串移动指令或向量指令中时,才能有此方式。若机器没有上述指令,则BLKmode将不出现在 RTL中。


VOIDmode
意味着模式不出现或一个不确定的模式。例 如:const_int表达式的模式就是VOIDmode, 因为此类表达式可认为具有其上下文所要求的任何模式。在RTL的调试输出中,VOIDmode表示成没有任何模式出现。


QCmode, HCmode, SCmode, DCmode, XCmode, TCmode
这些方式模式由一对浮点数组成的复数。其中, 浮点数分别具有QFmodeHFmode, SFmode, DFmode, XFmodeTFmode


CQImode, CHImode, CSImode, CDImode, CTImode, COImode
这些模式代表由一对整数组成的复数。整数值分别具有方式QImode, HImode,SImode, DImode, TImodeOImode

机器描述定义Pmode为一个C宏,其扩展为用于寻址的机器模式。通常这是一个在32位机器上,大小为BITS_PER_WORD, SImode模式。

机器描述唯一必须要支持的机器模式为QImode,以及对应于BITS_PER_WORDFLOAT_TYPE_SIZEDOUBLE_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, TImodeOImode


MODE_PARTIAL_INT
部分整数模式,PQImode, PHImode, PSImodePDImode


MODE_FLOAT
浮点模式。缺省情况下,这些是QFmode, HFmode, TQFmode, SFmode, DFmode, XFmodeTFmode


MODE_DECIMAL_FLOAT
十进制浮点模式。缺省的,这些是SDmode, DDmodeTDmode


MODE_FRACT
有符号小数模式。缺省的,这些是QQmode, HQmode, SQmode, DQmodeTQmode


MODE_UFRACT
无符号小数模式。缺省的,这些是UQQmode, UHQmode, USQmode, UDQmodeUTQmode


MODE_ACCUM
有符号累加器模式。缺省的,这些HAmode, SAmode, DAmodeTAmode


MODE_UACCUM
无符号累加器模式。缺省的,这些是UHAmode, USAmode, UDAmodeUTAmode


MODE_COMPLEX_INT
复数整数模式。(当前还没有被实现。)


MODE_COMPLEX_FLOAT
复数浮点模式。缺省情况下,为QCmode, HCmode, SCmode, DCmode, XCmodeTCmode


MODE_FUNCTION
Algol或者Pascal函数变量,包括一个静态链。(这些目前还没有被实现。)


MODE_CC
表示条件码的值的模式。为CCmode加上在machine-modes.def中列出的任何CC_MODE模式。参见Jump Patterns, 同时参见Condition Code


MODE_RANDOM
这是所有不适合上面的类别的模式。目前VOIDmodeBLKmode包括在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) returns HImode. 返回下一个宽的自然的机器模式。例如,表达式GET_MODE_WIDER_MODE (QImode)返回HImode


GET_MODE_SIZE (m)
返回机器模式m的字节数。


GET_MODE_BITSIZE (m)
返回机器模式m位数。


GET_MODE_IBIT (m)
返回定点机器模式m的整数位数。


GET_MODE_FBIT (m)
返回定点机器模式m的小数位数。


GET_MODE_MASK (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_UNIT_SIZE除以GET_MODE_SIZE


GET_CLASS_NARROWEST_MODE (c)
返回机器模式类别c中的最窄的模式。

全局变量byte_modeword_mode包含了类别为MODE_INT,并且位大小分别是BITS_PER_UNITBITS_PER_WORD的机器模式。在32位机器上,这些分别是QImodeSImode