Next: , Previous: Arithmetic, Up: RTL


10.10 比较运算

比较运算符测试两个操作数的关系,对于结果具有`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

不等式比较有两种,有符号和无符号。因此,对于有符号和无符号的大于,有两个不同的表达式代码gtgtu。对于相同的整数值,这些可以产生不同的结果:例如,1有符号大于−1,但是并不无符号大于,因为−1被作为无符号时,实际为0xffffffff,其大于1。

有符号比较也用于浮点值。浮点比较通过操作数的机器模式来区分。

(eq:m x y)
如果xy所表示的值相等,则为STORE_FLAG_VALUE,否则为0。


(ne:m x y)
如果xy所表示的值不相等,则为STORE_FLAG_VALUE,否则为0。


(gt:m x y)
如果xy大,则为STORE_FLAG_VALUE。如果它们为定点,则按照有符号比较。


(gtu:m x y)
类似于gt,不过进行无符号比较,只用于定点数。


(lt:m x y)
(ltu:m x y)
类似于gtgtu,不过测试“小于”。


(ge:m x y)
(geu:m x y)
类似于gtgtu,不过测试“大于或等于”。


(le:m x y)
(leu:m x y)
类似于gtgtu,不过测试“小于或等于”。


(if_then_else cond then else)
这不是比较运算,但是被列在这里,因为其总是与比较运算结合使用。确切的说,cond为一个比较表达式。该表达式表示一个根据cond,在then所表示的值和else所表示的值之间的选择,

在大多数机器上,if_then_else表达式只用于表示条件跳转。


(cond [test1 value1 test2 value2 ...] default)
类似于if_then_else,不过更普通。每个test1test2...被依次执行。表达式的结果为对应于第一个非零测试的value,或者如果测试都为零,则为default

这目前在指令模式中不可用,只在insn属性中被支持。参见Insn Attributes.