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.