Next: Bit-Fields, Previous: Arithmetic, Up: RTL
比较运算符测试两个操作数的关系,对于结果具有`MODE_INT'机器模式的比较运算,如果关系成立,则表示成机器相关的非零值,其由STORE_FLAG_VALUE
(参见Misc)描述,但是不需要相等,如果不成立,则为零。对于结果为浮点值的比较运算,如果关系成立,则为FLOAT_STORE_FLAG_VALUE
(参见Misc),否则为零。对于返回向量结果的比较运算,如果关系成立,则为VECTOR_STORE_FLAG_VALUE
(参见Misc),否则为零向量。比较运算的机器模式独立于被比较的数据的机器模式。如果正在测试比较运算(例如,if_then_else
的第一个操作数),则机器模式必须为VOIDmode
。
有两种方式可以被比较运算使用。比较运算符可以用于将条件代码(cc0)
与零进行比较,型如(eq (cc0) (const_int 0))
。这种结构实际上是用到了先前指令的结果,条件代码在那里被设置。设置条件代码的指令必须邻接于使用条件代码的指令;只有note
insn可以分开它们。
替换的,比较运算可以直接比较两个数据对象。比较运算的机器模式由操作数来决定;它们必须对一个共同的机器模式有效。对两个操作数都为常量的比较,将是无效的,因为不能从中推导出机器模式,不过这样的比较不会出现在RTL中,因为常数折叠。
在上面的例子中,如果(cc0)
最后被设置为(compare
x y)
,则比较运算等价于(eq
x y)
。通常,在一个特定的机器上,只支持一种风格的比较。但是,合并过程将尝试合并运算,从而产生eq
。
不等式比较有两种,有符号和无符号。因此,对于有符号和无符号的大于,有两个不同的表达式代码gt
和gtu
。对于相同的整数值,这些可以产生不同的结果:例如,1有符号大于−1,但是并不无符号大于,因为−1被作为无符号时,实际为0xffffffff
,其大于1。
有符号比较也用于浮点值。浮点比较通过操作数的机器模式来区分。
(eq:
m x y)
STORE_FLAG_VALUE
,否则为0。
(ne:
m x y)
STORE_FLAG_VALUE
,否则为0。
(gt:
m x y)
STORE_FLAG_VALUE
。如果它们为定点,则按照有符号比较。
(gtu:
m x y)
gt
,不过进行无符号比较,只用于定点数。
(lt:
m x y)
(ltu:
m x y)
gt
和gtu
,不过测试“小于”。
(ge:
m x y)
(geu:
m x y)
gt
和gtu
,不过测试“大于或等于”。
(le:
m x y)
(leu:
m x y)
gt
和gtu
,不过测试“小于或等于”。
(if_then_else
cond then else)
在大多数机器上,if_then_else
表达式只用于表示条件跳转。
(cond [
test1 value1 test2 value2 ...]
default)
if_then_else
,不过更普通。每个test1,test2,...被依次执行。表达式的结果为对应于第一个非零测试的value,或者如果测试都为零,则为default。
这目前在指令模式中不可用,只在insn属性中被支持。参见Insn Attributes.