您的位置:首页 > 其它

Studying note of GCC-3.4.6 source (4)

2010-02-23 11:44 344 查看

1.2. Building tree nodes

Above make_node gives the tool to create nodes for certain tree code. However, this facility is quite primitive. GCC also defines a series functions to create nodes group for statement, expression, etc. We just see a few of them here first.

1.2.3. Concept of machine mode[2]

A machine mode describes a size of data object and the representation used for it. In the C code, machine modes are represented by an enumeration type, `enum machine_mode', defined in `machmode.def' (more precise, ‘machine_mode’ is generated by back-end tool genmodes from ‘machmode.def’ into file ‘insn-modes.h’. Further for different target machine, dues to its characteristics, there is always an extra definition file for it. For example, for x86 machine, in directory “YOUR-GCC-SOURCE-DIR/gcc/config/i386”, there is file of i386-modes.def. In fact, this file pluses machmode.def processed by genmodes could generate the intact modes data. Please refer to the detail in related chapter of back-end). Each RTL expression has room for a machine mode and so do certain kinds of tree expressions (declarations and types, to be precise).
In debugging dumps and machine descriptions, the machine mode of an RTL expression is written after the expression code with a colon to separate them. The letters `mode' which appear at the end of each machine mode name are omitted. For example, `(reg:SI 38)' is a `reg' expression with machine mode `SImode'. If the mode is `VOIDmode', it is not written at all.
Here is a table of machine modes. The term "byte" below refers to an object of `BITS_PER_UNIT' bits.
Mode
description
BImode
"Bit" mode represents a single bit, for predicate registers.
QImode
"Quarter-Integer" mode represents a single byte treated as an integer.
HImode
"Half-Integer" mode represents a two-byte integer.
PSImode
"Partial Single Integer" mode represents an integer which occupies four bytes but which doesn't really use all four. On some machines, this is the right mode to use for pointers.
SImode
"Single Integer" mode represents a four-byte integer.
PDImode
"Partial Double Integer" mode represents an integer which occupies eight bytes but which doesn't really use all eight. On some machines, this is the right mode to use for certain pointers.
DImode
"Double Integer" mode represents an eight-byte integer.
TImode
"Tetra Integer" (?) mode represents a sixteen-byte integer.
OImode
"Octa Integer" (?) mode represents a thirty-two-byte integer.
QFmode
"Quarter-Floating" mode represents a quarter-precision (single byte) floating point number.
HFmode
"Half-Floating" mode represents a half-precision (two byte) floating point number.
TQFmode
"Three-Quarter-Floating" (?) mode represents a three-quarter-precision (three byte) floating point number.
SFmode
"Single Floating" mode represents a four byte floating point number. In the common case, of a processor with IEEE arithmetic and 8-bit bytes, this is a single-precision IEEE floating point number; it can also be used for double-precision (on processors with 16-bit bytes) and single-precision VAX and IBM types.
DFmode
"Double Floating" mode represents an eight byte floating point number. In the common case, of a processor with IEEE arithmetic and 8-bit bytes, this is a double-precision IEEE floating point number.
XFmode
"Extended Floating" mode represents a twelve byte floating point number. This mode is used for IEEE extended floating point. On some systems not all bits within these bytes will actually be used.
TFmode
"Tetra Floating" mode represents a sixteen byte floating point number. This gets used for both the 96-bit extended IEEE floating-point types padded to 128 bits, and true 128-bit extended IEEE floating-point types.
CCmode
"Condition Code" mode represents the value of a condition code, which is a machine-specific set of bits used to represent the result of a comparison operation. Other machine-specific modes may also be used for the condition code. These modes are not used on machines that use `cc0' (see *note Condition Code::).
BLKmode
"Block" mode represents values that are aggregates to which none of the other modes apply. In RTL, only memory references can have this mode, and only if they appear in string-move or vector instructions. On machines which have no such instructions, `BLKmode' will not appear in RTL.
VOIDmode
Void mode means the absence of a mode or an unspecified mode. For example, RTL expressions of code `const_int' have mode `VOIDmode' because they can be taken to have whatever mode the context requires. In debugging dumps of RTL, `VOIDmode' is expressed by the absence of any mode.
QCmode, HCmode, SCmode, DCmode, XCmode, TCmode
These modes stand for a complex number represented as a pair of floating point values. The floating point values are in `QFmode', `HFmode', `SFmode', `DFmode', `XFmode', and `TFmode', respectively.
CQImode, CHImode, CSImode, CDImode, CTImode, COImode
These modes stand for a complex number represented as a pair of integer values. The integer values are in `QImode', `HImode', `SImode', `DImode', `TImode', and `OImode', respectively
Table 4 machine modes
The machine description defines `Pmode' as a C macro which expands into the machine mode used for addresses. Normally this is the mode whose size is `BITS_PER_WORD', `SImode' on 32-bit machines.
The only modes which a machine description must support are `QImode', and the modes corresponding to `BITS_PER_WORD', `FLOAT_TYPE_SIZE' and `DOUBLE_TYPE_SIZE'. The compiler will attempt to use `DImode' for 8-byte structures and unions, but this can be prevented by overriding the definition of `MAX_FIXED_MODE_SIZE'. Alternatively, you can have the compiler use `TImode' for 16-byte structures and unions. Likewise, you can arrange for the C type `short int' to avoid using `HImode'.
Very few explicit references to machine modes remain in the compiler and these few references will soon be removed. Instead, the machine modes are divided into mode classes. These are represented by the enumeration type `enum mode_class' defined in `machmode.h'. The possible mode classes are:
Mode class
Description
MODE_INT
Integer modes. By default these are `BImode', `QImode', `HImode', `SImode', `DImode', `TImode', and `OImode'.
MODE_PARTIAL_INT
The "partial integer" modes, `PQImode', `PHImode', `PSImode' and `PDImode'.
MODE_FLOAT
Floating point modes. By default these are `QFmode', `HFmode', `TQFmode', `SFmode', `DFmode', `XFmode' and `TFmode'.
MODE_COMPLEX_INT
Complex integer modes. (These are not currently implemented).
MODE_COMPLEX_FLOAT
Complex floating point modes. By default these are `QCmode', `HCmode', `SCmode', `DCmode', `XCmode', and `TCmode'.
MODE_FUNCTION
Algol or Pascal function variables including a static chain. (These are not currently implemented).
MODE_CC
Modes representing condition code values. These are `CCmode' plus any modes listed in the `EXTRA_CC_MODES' macro.
MODE_RANDOM
This is a catchall mode class for modes which don't fit into the above classes. Currently `VOIDmode' and `BLKmode' are in `MODE_RANDOM'.
Table 5 mode classes
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: