RTL Classes and Formats#
The various expression codes are divided into several classes,
which are represented by single characters. You can determine the class
of an RTX code with the macro GET_RTX_CLASS (code).
Currently, rtl.def defines these classes:
- RTX_OBJ#
An RTX code that represents an actual object, such as a register (
REG) or a memory location (MEM,SYMBOL_REF).LO_SUMis also included; instead,SUBREGandSTRICT_LOW_PARTare not in this class, but in classRTX_EXTRA.
- RTX_CONST_OBJ#
An RTX code that represents a constant object.
HIGHis also included in this class.
- RTX_COMPARE#
An RTX code for a non-symmetric comparison, such as
GEUorLT.
- RTX_COMM_COMPARE#
An RTX code for a symmetric (commutative) comparison, such as
EQorORDERED.
- RTX_UNARY#
An RTX code for a unary arithmetic operation, such as
NEG,NOT, orABS. This category also includes value extension (sign or zero) and conversions between integer and floating point.
- RTX_COMM_ARITH#
An RTX code for a commutative binary operation, such as
PLUSorAND.NEandEQare comparisons, so they have classRTX_COMM_COMPARE.
- RTX_BIN_ARITH#
An RTX code for a non-commutative binary operation, such as
MINUS,DIV, orASHIFTRT.
- RTX_BITFIELD_OPS#
An RTX code for a bit-field operation. Currently only
ZERO_EXTRACTandSIGN_EXTRACT. These have three inputs and are lvalues (so they can be used for insertion as well). See Bit-Fields.
- RTX_TERNARY#
An RTX code for other three input operations. Currently only
IF_THEN_ELSE,VEC_MERGE,SIGN_EXTRACT,ZERO_EXTRACT, andFMA.
- RTX_MATCH#
An RTX code for something that matches in insns, such as
MATCH_DUP. These only occur in machine descriptions.
- RTX_AUTOINC#
An RTX code for an auto-increment addressing mode, such as
POST_INC.XEXP (x, 0)gives the auto-modified register.
- RTX_EXTRA#
All other RTX codes. This category includes the remaining codes used only in machine descriptions (
DEFINE_*, etc.). It also includes all the codes describing side effects (SET,USE,CLOBBER, etc.) and the non-insns that may appear on an insn chain, such asNOTE,BARRIER, andCODE_LABEL.SUBREGis also part of this class.
For each expression code, rtl.def specifies the number of
contained objects and their kinds using a sequence of characters
called the format of the expression code. For example,
the format of subreg is ep.
These are the most commonly used format characters:
eAn expression (actually a pointer to an expression).
iAn integer.
wA wide integer.
sA string.
EA vector of expressions.
A few other format characters are used occasionally:
uuis equivalent toeexcept that it is printed differently in debugging dumps. It is used for pointers to insns.nnis equivalent toiexcept that it is printed differently in debugging dumps. It is used for the line number or code number of anoteinsn.SSindicates a string which is optional. In the RTL objects in core,Sis equivalent tos, but when the object is read, from anmdfile, the string value of this operand may be omitted. An omitted string is taken to be the null string.VVindicates a vector which is optional. In the RTL objects in core,Vis equivalent toE, but when the object is read from anmdfile, the vector value of this operand may be omitted. An omitted vector is effectively the same as a vector of no elements.BBindicates a pointer to basic block structure.pA polynomial integer. At present this is used only for
SUBREG_BYTE.00means a slot whose contents do not fit any normal category.0slots are not printed at all in dumps, and are often used in special ways by small parts of the compiler.
There are macros to get the number of operands and the format of an expression code:
GET_RTX_LENGTH (code)Number of operands of an RTX of code
code.GET_RTX_FORMAT (code)The format of an RTX of code
code, as a C string.
Some classes of RTX codes always have the same format. For example, it
is safe to assume that all comparison operations have format ee.
- RTX_UNARY#
All codes of this class have format
e.
- RTX_BIN_ARITH#
All codes of these classes have format
ee.
- RTX_BITFIELD_OPS#
All codes of these classes have format
eee.
- RTX_INSN#
All codes of this class have formats that begin with
iuueiee. See Insns. Note that not all RTL objects linked onto an insn chain are of classRTX_INSN.
- RTX_CONST_OBJ#
You can make no assumptions about the format of these codes.