1.2. 树节点的构造
上面make_node提供了构造树节点的方法,但它比较初级,节点由0填充。为了更好地为表达式,语句等语法成分构造树节点,GCC定义了一系列函数。我们先看一部分。
1.2.2. 机器模式的概念[2]
机器模式描述了一个数据对象的大小和它的表示方式。在GCC中,机器模式由定义在machmode.def文件中的枚举类型enum machine_mode来表示(准确地说,machine_mode由后端工具genmodes根据machmode.def导出至insn-modes.h中。而且不同的目标机器,由于其特殊性,往往还需要额外的,仅用于自身的定义文件。例如,对于x86机器,在目录“YOUR-GCC-SOURCE-DIR/gcc/config/i386”下,有i386-modes.def文件。实际上这个文件和machmode.def,一起由genmodes处理,才产生完整的模式数据。参见后端的有关章节)。每个RTL表达式都包含一个机器模式,同样对某些中间树形式的表达式也一样(准确说,是声明和类型)。
在调试的转储(debugging dumps)和机器描述(在机器描述文件中)里,RTL表达式中的机器模式跟在表达式码后(expression code),通过冒号分隔。在每个机器模式名结尾的 `mode'被省略。例如,`(reg:SI 38)'是一个机器模式为Simode的`reg'表达式。而如果模式为VOIDmode,它将被省略不写出来。
以下是机器模式的表格。其中术语"byte"指大小为`BITS_PER_UNIT'的一个对象。
模式 | 描述 |
BImode | 比特(bit)模式表示对应预测寄存器(predicate register)的单个比特。 |
QImode | 四分之一整型Quarter-Integer)模式表示一个字节的整型数。 |
HImode | 半整型(Half-Integer)模式表示两个字节的整型。 |
PSImode | 部分单整型(Partial Single Integer)模式表示一个四字节整型数,但只有部分字节被使用。在某些机器上,这是指针使用的模式。 |
SImode | 单整型(Single Integer)模式表示四字节的整型。 |
PDImode | 部分双倍整型(Partial Double Integer)模式表示一个八字节的整型数,但只有部分字节被使用。在某些机器上,这是特定指针使用的模式。 |
DImode | 双倍整型(Double Integer)模式表示八字节的整型数。 |
TImode | 四倍整型(Tetra Integer)模式表示十六字节的整型数。 |
OImode | 八倍整型(Octa Integer)模式表示三十二字节的整型数。 |
QFmode | 四分之一浮点(Quarter-Floating)模式表示四分之一精度(单字节)的浮点数。 |
HFmode | 半浮点(Half-Floating)模式表示半精度(双字节)的浮点数。 |
TQFmode | 四分之三浮点(Three-Quarter-Floating)模式表示四分之三精度(三字节)的浮点数。 |
SFmode | 单浮点(Single Floating)模式表示四字节的浮点数。在通常情况下,对于支持8比特字节和IEEE算术运算的处理器,这是单精度IEEE浮点数。它也用作双精度类型(在16位字节的处理器上),及VAX和IBM使用的单精度类型。 |
DFmode | 双浮点(Double Floating)模式表示八字节的浮点数。在通常情况下,对于支持8比特字节和IEEE算术运算的处理器,这是双精度IEEE浮点数。 |
XFmode | 扩展浮点(Extended Floating)模式表示十二字节的浮点数。它用于IEEE的扩展浮点数。在一些系统中,这些位不是所有都被用到。 |
TFmode | 四浮点(Tetra Floating)模式表示十六字节的浮点数。它用于IEEE的96位但填充至128位的扩展浮点数,及IEEE的真128位扩展浮点数。 |
CCmode | 条件代码(Condition Code)模式表示条件代码的值,它是一组特定于机器的,用于表示比较操作结果的比特位。其他特定于机器(machine-specific)的模式也可能用于条件代码。但这些模式在使用cc0的机器上不作为这个用途。 |
BLKmode | 块(Block)模式表示一组不能被其他模式表示的值的合集。在RTL中,只有内存引用(memory reference)会使用这个模式,或者在字符串移动(string-move)或vector指令中。在那些没有这样指令的机器中,BLKmode不会出现在RTL。 |
VOIDmode | Void模式表示模式没有出现(the absence of a mode)或者未指定模式(an unspecified mode)。例如,包含码const_int的RTL表达式有模式VOIDmode,因为它们可以根据上下文环境要求取任何模式。而在RTL的调试转储里, VOIDmode表示模式没有出现(the absence of any mode)。 |
QCmode, HCmode, SCmode, DCmode, XCmode, TCmode | 这些模式代表由一对浮点数组成的复数。这些浮点数的模式分别是:QFmode,HFmode,SFmode,DFmode,XFmode,和TFmode。 |
CQImode, CHImode, CSImode, CDImode, CTImode, COImode | 这些模式代表由一对整数组成的复数。这些整数的模式分别是:QImode,HImode,SImode,DImode,TImode,和OImode。 |
表 4 机器模式
在机器描述中,Pmode被定义成宏。它会被展开成用于地址的机器模式。通常这是大小为BITS_PER_WORD 的模式,在32位机器上为SImode。
在机器描述中必须要支持的模式是QImode,及对应于BITS_PER_WORD,FLOAT_TYPE_SIZE和DOUBLE_TYPE_SIZE的模式。编译器会尝试将DImode用于8字节大小的结构体和联合(structures and unions),不过可以改写MAX_FIXED_MODE_SIZE的定义来阻止编译器这样做。相反,也可以使编译器将TImode用于16字节大小的结构体和联合。类似的,通过安排C的short int可以避免使用HImode。
在编译器中只有极少的显式的机器模式的引用(Very few explicit references to machine modes),这些模式很快会被移除。相反,机器模式被分为模式类别(mode class)。它们通过在machmode.h中定义的枚举类型enum mode_class来表示。可行的模式类别有:
模式类别 | 描述 |
MODE_INT | 整型模式。默认的模式是BImode,QImode,HImode,SImode,DImode,TImode和Oimode。 |
MODE_PARTIAL_INT | 部分整型(partial integer)模式,包含PQImode,PHImode,PSImode和PDImode。 |
MODE_FLOAT | 浮点模式。默认的模式是QFmode,HFmode,TQFmode,SFmode,DFmode,XFmode和TFmode。 |
MODE_COMPLEX_INT | 整型复数模式(在该版本GCC中未实现)。 |
MODE_COMPLEX_FLOAT | 浮点复数模式。默认的模式是QCmode,HCmode,SCmode,DCmode,XCmode和TCmode。 |
MODE_FUNCTION | 包含静态链(static chain)的Algol或Pascal的函数变量(function variable),(在该版本GCC中未实现)。 |
MODE_CC | 表示条件代码值的模式。它们是CCmode加上宏EXTRA_CC_MODES 列出的模式。 |
MODE_RANDOM | 所有不归入上述类别的模式。目前包含VOIDmode和BLKmode。 |
表 5 模式类别