Next: Defining Predicates, Up: Predicates
这些是通用predicate,适用于所有后端。它们定义在recog.c中。 第一类predicate只允许常量或立即数。
该predicate接受任何确实为mode的
CONST_DOUBLE
表达式。 如果mode为VOIDmode
,则其还接受CONST_INT
。 它是用于浮点立即数的。
第二类predicate只允许某种类别的机器寄存器。
这与
register_operand
略为不同,其对机器描述的读入器有些限制。当机器描述读入器接受‘:P’机器模式后缀时,
(match_operand n "pmode_register_operand" constraint)与
(match_operand:P n "register_operand" constraint)将具有完全相同的含义。不幸的是,这样不行,应为Pmode是其它机器模式的别名, 并且可能随着机器特定选项的不同而改变。参见Misc。
第三类predicate只允许某种内存引用。
该predicate允许任何对内存中机器模式mode的一定数量的有效引用, 并通过
GO_IF_LEGITIMATE_ADDRESS
的弱形式来确定(参见Addressing Modes)。
该predicate有些不常用; 其允许任何为机器模式mode的一定数量的地址有效表达式操作数, 同样通过
GO_IF_LEGITIMATE_ADDRESS
的弱形式来确定。 首先,如果‘(mem:mode (exp))’被memory_operand
接受, 则exp被address_operand
接受。 注意exp不必具有机器模式mode。
这是一个
memory_operand
的更严格形式, 其只允许将general_operand
作为地址表达式的内存引用。 不鼓励对该predicate的新的使用,因为general_operand
的条件非常宽, 所以很难说清对于indirect_operand
什么是被允许的,什么是不被允许的。 如果目标机对不同指令的内存操作数具有不同的要求, 则最好定义目标机特定的predicate,以显式的加强硬件的要求。
该predicate允许适合将值压入栈中的内存引用。这将为一个
MEM
, 其引用stack_pointer_rtx
,且在其地址表达式中具有一个副作用 (参见Incdec);其由宏STACK_PUSH_CODE
来确定(参见Frame Layout。
该predicate允许适合将值弹出栈中的内存引用。同样,这将为一个
MEM
, 其引用stack_pointer_rtx
,且在其地址表达式中具有一个副作用; 不过,这次是STACK_POP_CODE
。
第四类predicate允许上面的操作数的某种组合。
最后,有两个通用操作符断言。