GCC-3.4.6源代码学习笔记(4)

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位字节的处理器上),及VAXIBM使用的单精度类型。

DFmode

双浮点(Double Floating)模式表示八字节的浮点数。在通常情况下,对于支持8比特字节和IEEE算术运算的处理器,这是双精度IEEE浮点数。

XFmode

扩展浮点(Extended Floating)模式表示十二字节的浮点数。它用于IEEE的扩展浮点数。在一些系统中,这些位不是所有都被用到。

TFmode

四浮点(Tetra Floating)模式表示十六字节的浮点数。它用于IEEE96位但填充至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_intRTL表达式有模式VOIDmode,因为它们可以根据上下文环境要求取任何模式。而在RTL的调试转储里, VOIDmode表示模式没有出现(the absence of any mode)。

QCmode, HCmode, SCmode, DCmode, XCmode, TCmode

这些模式代表由一对浮点数组成的复数。这些浮点数的模式分别是:QFmodeHFmodeSFmodeDFmodeXFmode,和TFmode

CQImode, CHImode, CSImode, CDImode, CTImode, COImode

这些模式代表由一对整数组成的复数。这些整数的模式分别是:QImodeHImodeSImodeDImodeTImode,和OImode

4 机器模式

在机器描述中,Pmode被定义成宏。它会被展开成用于地址的机器模式。通常这是大小为BITS_PER_WORD 的模式,在32位机器上为SImode

在机器描述中必须要支持的模式是QImode,及对应于BITS_PER_WORDFLOAT_TYPE_SIZEDOUBLE_TYPE_SIZE的模式。编译器会尝试将DImode用于8字节大小的结构体和联合(structures and unions),不过可以改写MAX_FIXED_MODE_SIZE的定义来阻止编译器这样做。相反,也可以使编译器将TImode用于16字节大小的结构体和联合。类似的,通过安排Cshort int可以避免使用HImode

在编译器中只有极少的显式的机器模式的引用(Very few explicit references to machine modes),这些模式很快会被移除。相反,机器模式被分为模式类别(mode class)。它们通过在machmode.h中定义的枚举类型enum mode_class来表示。可行的模式类别有:

模式类别

描述

MODE_INT

整型模式。默认的模式是BImodeQImodeHImodeSImodeDImodeTImodeOimode

MODE_PARTIAL_INT

部分整型(partial integer)模式,包含PQImodePHImodePSImodePDImode

MODE_FLOAT

浮点模式。默认的模式是QFmodeHFmodeTQFmodeSFmodeDFmodeXFmodeTFmode

MODE_COMPLEX_INT

整型复数模式(在该版本GCC中未实现)。

MODE_COMPLEX_FLOAT

浮点复数模式。默认的模式是QCmodeHCmodeSCmodeDCmodeXCmodeTCmode

MODE_FUNCTION

包含静态链(static chain)的AlgolPascal的函数变量(function variable),(在该版本GCC中未实现)。

MODE_CC

表示条件代码值的模式。它们是CCmode加上宏EXTRA_CC_MODES 列出的模式。

MODE_RANDOM

所有不归入上述类别的模式。目前包含VOIDmodeBLKmode

5 模式类别

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值