Next: , Up: Predicates


16.7.1 机器无关的断言

这些是通用predicate,适用于所有后端。它们定义在recog.c中。 第一类predicate只允许常量或立即数。

— Function: immediate_operand

该predicate允许适合相应mode的任何类别的常量。 适合用于操作数必须为常量的指令。

— Function: const_int_operand

该predicate允许适合相应mode的任何CONST_INT表达式。 适合用于不是符号(symbol)或标号(label)的立即数。

— Function: const_double_operand

该predicate接受任何确实为modeCONST_DOUBLE表达式。 如果modeVOIDmode,则其还接受CONST_INT。 它是用于浮点立即数的。

第二类predicate只允许某种类别的机器寄存器。

— Function: register_operand

该predicate允许适合相应mode的任何REGSUBREG表达式。 通常适合于RISC机器上的算术指令操作数。

— Function: pmode_register_operand

这与register_operand略为不同,其对机器描述的读入器有些限制。

当机器描述读入器接受‘:P’机器模式后缀时,

          (match_operand n "pmode_register_operand" constraint)

          (match_operand:P n "register_operand" constraint)

将具有完全相同的含义。不幸的是,这样不行,应为Pmode是其它机器模式的别名, 并且可能随着机器特定选项的不同而改变。参见Misc

— Function: scratch_operand

该predicate允许硬件寄存器和SCRATCH表达式,但不允许伪寄存器。 其由match_scratch在内部使用;而不应该被直接使用。

第三类predicate只允许某种内存引用。

— Function: memory_operand

该predicate允许任何对内存中机器模式mode的一定数量的有效引用, 并通过GO_IF_LEGITIMATE_ADDRESS的弱形式来确定(参见Addressing Modes)。

— Function: address_operand

该predicate有些不常用; 其允许任何为机器模式mode的一定数量的地址有效表达式操作数, 同样通过GO_IF_LEGITIMATE_ADDRESS的弱形式来确定。 首先,如果‘(mem:mode (exp))’被memory_operand接受, 则expaddress_operand接受。 注意exp不必具有机器模式mode

— Function: indirect_operand

这是一个memory_operand的更严格形式, 其只允许将general_operand作为地址表达式的内存引用。 不鼓励对该predicate的新的使用,因为general_operand的条件非常宽, 所以很难说清对于indirect_operand什么是被允许的,什么是不被允许的。 如果目标机对不同指令的内存操作数具有不同的要求, 则最好定义目标机特定的predicate,以显式的加强硬件的要求。

— Function: push_operand

该predicate允许适合将值压入栈中的内存引用。这将为一个MEM, 其引用stack_pointer_rtx,且在其地址表达式中具有一个副作用 (参见Incdec);其由宏STACK_PUSH_CODE来确定(参见Frame Layout

— Function: pop_operand

该predicate允许适合将值弹出栈中的内存引用。同样,这将为一个MEM , 其引用stack_pointer_rtx,且在其地址表达式中具有一个副作用; 不过,这次是STACK_POP_CODE

第四类predicate允许上面的操作数的某种组合。

— Function: nonmemory_operand

该predicate允许任何对于mode有效的立即数,或寄存器操作数。

— Function: nonimmediate_operand

该predicate允许任何对于mode有效的寄存器,或内存操作数。

— Function: general_operand

该predicate允许任何对于mode有效的立即数,寄存器,或内存操作数。

最后,有两个通用操作符断言。

— Function: comparison_operator

该predicate匹配任何执行一个基于mode的算术比较表达式; 即,COMPARISON_P对于表达式代码为真。

— Function: ordered_comparison_operator

This predicate matches any expression which performs an arithmetic comparison in mode and whose expression code is valid for integer modes; that is, the expression code will be one of eq, ne, lt, ltu, le, leu, gt, gtu, ge, geu.