Next: Comparisons, Previous: Regs and Memory, Up: RTL
除非其它规定,所有算术表达式的操作数必须对模式m有效。一个操作数对模式m有效,是指当它具有模式m,或者如果它是一个const_int
或者const_double
,并且m是一个MODE_INT
类的模式。
(plus:
m x y)
(ss_plus:
m x y)
(us_plus:
m x y)
plus
以m的宽度求模进行环绕;ss_plus
饱和为m可表示的有符号最大值;us_plus
饱和为无符号最大值。
(lo_sum:
m x y)
high
(参见Constants)一起使用,来表示在RISC机器中通常使用的两个指令序列,来引用一个全局内存位置。
低位的位数是机器相关的,但通常为Pmode
中的位数减去high
所设置的位数。
m应该为Pmode
。
(minus:
m x y)
(ss_minus:
m x y)
(us_minus:
m x y)
plus
的三种版本相同(参见上面)。
(compare:
m x y)
当然,机器不会真的进行无限精度的减法。然而,它们可以假定这样做,当只使用结果的正负符号时,这样情况下,结果被存放在条件代码中。并且,这是这种表达式唯一可以被使用的方式:作为值存储在条件代码中,或者(cc0)
,或者一个寄存器。参见Comparisons.
机器模式m与x和y的机器模式没有关联,而是条件代码值的机器模式。如果使用(cc0)
,则为VOIDmode
,否则为类别MODE_CC
中的某个模式,通常为CCmode
。参见Condition Code. 如果m为VOIDmode
或者CCmode
,则运算会返回足够的信息,使得任何比较运算符可以被应用到COMPARE
运算的结果上。对于类别MODE_CC
中的其它机器模式,运算只返回信息的子集。
通常,x和y必须具有相同的机器模式。否则,compare
只有当x的机器模式在类别MODE_INT
中,并且y为一个机器模式为VOIDmode
的const_int
或者const_double
,这时才有效。x的机器模式决定了比较按照什么机器模式进行;因此其不能为VOIDmode
。
如果其中一个操作数为常量,则其应该被放在第二个操作数的位置,并且相应的调整比较代码。
指定两个VOIDmode
常量的compare
是无效的,因为无法知道比较要按照什么机器模式进行;比较必须或者在编译过程中被折叠,或者第一个操作数必须被加载到机器模式已知的寄存器中。
(neg:
m x)
(ss_neg:
m x)
(us_neg:
m x)
neg
,操作数的负数可以为无法用机器模式m表示的数,这种情况下,其被截取为m。ss_neg
和us_neg
确保超出边界的结果饱和为最大或者最小的有符号或者无符号值。
(mult:
m x y)
(ss_mult:
m x y)
(us_mult:
m x y)
ss_mult
和us_mult
确保超出边界的结果饱和为最大或者最小的有符号或者无符号值。
一些机器支持产生比操作数更宽的乘积。则指令模式可以写成
(mult:m (sign_extend:m x) (sign_extend:m y))
其中m比x和y的机器模式更宽。
对于无符号的加宽的乘法,使用相同的语句,只不过把sign_extend
替换成zero_extend
。
(div:
m x y)
(ss_div:
m x y)
ss_div
确保超出边界的结果饱和为最大或者最小的有符号值。
一些机器具有的除法指令,其操作数和商的宽度不全相同;你应该使用truncate
和sign_extend
来表示这样的指令,
(truncate:m1 (div:m2 x (sign_extend:m2 y)))
(udiv:
m x y)
(us_div:
m x y)
div
,不过表示无符号除法。us_div
确保超出边界的结果饱和为最大或者最小的无符号值。
(mod:
m x y)
(umod:
m x y)
div
和udiv
,不过表示余数。
(smin:
m x y)
(smax:
m x y)
smin
)或者较大值(smax
),按照机器模式为m的有符号值解析。当用于浮点,如果两个操作数都为零,或者其中一个为NaN
,则没有规定哪一个操作数被作为结果返回。
(umin:
m x y)
(umax:
m x y)
smin
和smax
,不过值被解析为无符号整数。
(not:
m x)
(and:
m x y)
(ior:
m x y)
(xor:
m x y)
(ashift:
m x c)
(ss_ashift:
m x c)
(us_ashift:
m x c)
ashift
运算是一个普通的移位,当符号位有改变时,其没有特殊的行为;ss_ashift
和us_ashift
,饱和为可表示的最小或者最大值,如果任何被移出的位与最终的符号位不同。
x具有机器模式m,一个定点机器模式。c为一个定点机器模式或者一个模式为VOIDmode
的常量。
(lshiftrt:
m x c)
(ashiftrt:
m x c)
ashift
,不过是向右移位。不像向左移位的情况,这两种运算是有区别的。
(rotate:
m x c)
(rotatert:
m x c)
rotate
。
(abs:
m x)
(sqrt:
m x)
(ffs:
m x)
(clz:
m x)
CLZ_DEFINED_VALUE_AT_ZERO
(参见Misc). Note that this is one of
表示x中,从最高有效位开始,起始处为0的位数,为一个模式m的整数。如果x为零,则值由CLZ_DEFINED_VALUE_AT_ZERO
(参见Misc)来确定。注意,。x的机器模式通常为一个整数模式。
(ctz:
m x)
CTZ_DEFINED_VALUE_AT_ZERO
(参见Misc)来确定。除此之外,ctz(x)
等价于ffs(
x) - 1
。x的机器模式通常为一个整数模式。
(popcount:
m x)
(parity:
m x)
(bswap:
m x)