Next: , Previous: Machine Modes, Up: RTL


10.7 常量表达式类型

最简单的RTL表达式是那些对常数值的表示。

(const_int i)
这类表达式表示整数值ii通常通过宏INTVAL来访问,INTVAL (exp)相当于XWINT (exp, 0)

为模式所生成的常量如果位数小于HOST_WIDE_INT,则必须符号扩展为全部宽度(例如,gen_int_mode)。

只有一个表达式对象表示整数值0;是变量const0_rtx的值。同样的,整数值1的唯一表达式为const1_rtx,整数值2的唯一表达式为const2_rtx,负1的唯一表达式为constm1_rtx。任何试图去创建值为0,1,2或者-1的const_int都会返回相应的const0_rtx, const1_rtx, const2_rtx或者constm1_rtx

类似的,只有一个对象表示值为STORE_FLAG_VALUE的整数,其为const_true_rtx。如果STORE_FLAG_VALUE为1,则const_true_rtxconst1_rtx将会指向同一对象。如果STORE_FLAG_VALUE为-1,const_true_rtxconstm1_rtx将会指向同一对象。


(const_double:m i0 i1 ...)
表示或者为一个模式为m的浮点常量,或者为一个超过HOST_BITS_PER_WIDE_INT位的,但是小于其两倍的位数的整数常量(GCC并没有提供表示更大的常量的机制)。对于后者,m将为VOIDmode

如果mVOIDmode,则值的位数存储在i0i1中。i0使用宏CONST_DOUBLE_LOW来访问,i1使用CONST_DOUBLE_HIGH

如果常量为浮点(不管是什么精度),则用于存储值得整数数目取决于REAL_VALUE_TYPE的大小(参见Floating Point)。整数表示一个浮点数,但是不如target机器的或者host机器的浮点格式那么精确。要将它们转换为target机器使用的精确的位模式,使用宏REAL_VALUE_TO_TARGET_DOUBLE等(参见Data Output)。


(const_fixed:m ...)
表示一个机器模式为m定点常量。操作数是一个类型为struct fixed_value数据结构,并使用宏CONST_FIXED_VALUE来访问。数据的高部分使用CONST_FIXED_VALUE_HIGH来访问;低部分使用CONST_FIXED_VALUE_LOW来访问。


(const_vector:m [x0 x1 ...])
表示一个向量常量。方括号代表向量包含的常量元素。x0x1等等为const_intconst_double或者const_fixed元素。

const_vector中的单元数可以通过宏CONST_VECTOR_NUNITS来获得,形如CONST_VECTOR_NUNITS (v)

在向量常量中的单个元素使用宏CONST_VECTOR_ELT来访问,形如CONST_VECTOR_ELT (v, n),其中v为向量常量,n为要访问的元素编号。


(const_string str)
表示一个具有值str的常量字符串。目前这只用于insn属性(参见Insn Attributes),因为C中的常量字符串存放在内存中。


(symbol_ref:mode symbol)
表示引用数据的汇编标号的值。symbol为一个字符串,描述了汇编标号的名字。如果其起始于‘*’,则标号为symbol不包含‘*’的其余部分。否则,标号为symbol,通常具有前缀‘_’。

symbol_ref包含一个机器模式,其通常为Pmode。通常这是唯一的使得符号有效的机器模式。


(label_ref:mode label)
表示引用代码的汇编标号的值。其包含一个操作数,一个表达式,其必须为一个code_label或者一个NOTE_INSN_DELETED_LABEL类型的note,其出现在指令序列中,来标识标号应该处于的位置。

对于代码标号引用,使用一个不同的表达式类型的原因是跳转优化可以区分它们。

label_ref包含了一个机器模式,其通常为Pmode。通常这是唯一的使得标号有效的机器模式。


(const:m exp)
表示一个常量,其为汇编时算术计算的结果。操作数exp,为一个表达式,只包含了plusminus组合的常量(const_int, symbol_reflabel_ref表达式)。然而,并不是所有的组合都是有效的,因为汇编器不能对重定位符号做任意的算术运算。

m should be Pmode. m应该为Pmode


(high:m exp)
表示exp的高位,通常为一个symbol_ref。位数是机器相关的并且通常为初始化一个寄存器的高位的指令所指定的位数。其和lo_sum一起使用来表示典型的用于RISC机器的双指令序列来引用一个全局内存位置。

m应该为Pmode

CONST0_RTX (mode)指定一个具有值0,机器模式为mode的表达式。如果modeMODE_INT类别,则返回const0_rtx。如果modeMODE_FLOAT类别,则返回模式为mode的表达式CONST_DOUBLE。否则,其返回一个模式为mode的表达式CONST_VECTOR。类似的,宏CONST1_RTX (mode)指定一个具有值1,机器模式为mode的表达式,类似的对于CONST2_RTX。宏CONST1_RTXCONST2_RTX对于向量模式没有定义。