The simplest RTL expressions are those that represent constant values.
), which is equivalent to
Constants generated for modes with fewer bits than in
HOST_WIDE_INT must be sign extended to full width (e.g., with
gen_int_mode). For constants for modes with more bits than in
HOST_WIDE_INT the implied high order bits of that constant are
copies of the top bit. Note however that values are neither
inherently signed nor inherently unsigned; where necessary, signedness
is determined by the rtl operation instead.
There is only one expression object for the integer value zero; it is
the value of the variable
const0_rtx. Likewise, the only
expression for integer value one is found in
const1_rtx, the only
expression for integer value two is found in
const2_rtx, and the
only expression for integer value negative one is found in
constm1_rtx. Any attempt to create an expression of code
const_int and value zero, one, two or negative one will return
constm1_rtx as appropriate.
Similarly, there is only one object for the integer whose value is
STORE_FLAG_VALUE. It is found in
STORE_FLAG_VALUE is one,
const1_rtx will point to the same object. If
STORE_FLAG_VALUE is −1,
constm1_rtx will point to the same object.
(const_double:m i0 i1
TARGET_SUPPORTS_WIDE_INT) an integer constant too large to fit into
HOST_BITS_PER_WIDE_INTbits but small enough to fit within twice that number of bits. In the latter case, m will be
VOIDmode. For integral values constants for modes with more bits than twice the number in
HOST_WIDE_INTthe implied high order bits of that constant are copies of the top bit of
CONST_DOUBLE_HIGH. Note however that integral values are neither inherently signed nor inherently unsigned; where necessary, signedness is determined by the rtl operation instead.
On more modern ports,
CONST_DOUBLE only represents floating
point values. New ports define
make this designation.
If m is
VOIDmode, the bits of the value are stored in
i0 and i1. i0 is customarily accessed with the macro
CONST_DOUBLE_LOW and i1 with
If the constant is floating point (regardless of its precision), then
the number of integers used to store the value depends on the size of
REAL_VALUE_TYPE (see Floating Point). The integers
represent a floating point number, but not precisely in the target
machine's or host machine's floating point format. To convert them to
the precise bit pattern used by the target machine, use the macro
REAL_VALUE_TO_TARGET_DOUBLE and friends (see Data Output).
(const_wide_int:m nunits elt0
HOST_WIDE_INTs that is large enough to hold any constant that can be represented on the target. This form of rtl is only used on targets that define
TARGET_SUPPORTS_WIDE_INTto be nonzero and then
CONST_DOUBLEs are only used to hold floating-point values. If the target leaves
TARGET_SUPPORTS_WIDE_INTdefined as 0,
CONST_WIDE_INTs are not used and
CONST_DOUBLEs are as they were before.
The values are stored in a compressed format. The higher-order 0s or -1s are not represented if they are just the logical sign extension of the number that is represented.
HOST_WIDE_INTs that are used to store the value. This macro should be rarely used.
HOST_WIDE_INTs used to represent the number. Note that this generally is smaller than the number of
HOST_WIDE_INTs implied by the mode size.
ith element of the array. Element 0 is contains the low order bits of the constant.
struct fixed_valueand is accessed with the macro
CONST_FIXED_VALUE. The high part of data is accessed with
CONST_FIXED_VALUE_HIGH; the low part is accessed with
The number of units in a
const_vector is obtained with the macro
CONST_VECTOR_NUNITS as in
Individual elements in a vector constant are accessed with the macro
CONST_VECTOR_ELT as in
where v is the vector constant and n is the element
symbol_ref contains a mode, which is usually
Usually that is the only mode for which a symbol is directly valid.
NOTE_INSN_DELETED_LABELthat appears in the instruction sequence to identify the place where the label should go.
The reason for using a distinct expression type for code label references is so that jump optimization can distinguish them.
label_ref contains a mode, which is usually
Usually that is the only mode for which a label is directly valid.
label_refexpressions) combined with
minus. However, not all combinations are valid, since the assembler cannot do arbitrary arithmetic on relocatable symbols.
m should be
symbol_ref. The number of bits is machine-dependent and is normally the number of bits specified in an instruction that initializes the high order bits of a register. It is used with
lo_sumto represent the typical two-instruction sequence used in RISC machines to reference a global memory location.
m should be
) refers to an expression with
value 0 in mode mode. If mode mode is of mode class
MODE_INT, it returns
const0_rtx. If mode mode is of
MODE_FLOAT, it returns a
expression in mode mode. Otherwise, it returns a
CONST_VECTOR expression in mode mode. Similarly, the macro
) refers to an expression with value 1 in
mode mode and similarly for
CONST2_RTX macros are undefined
for vector modes.