Next: Constraints, Previous: Output Statement, Up: Machine Desc
断言用于确定一个match_operand
或者 match_operator
表达式是否匹配, 以及周围的指令模式是否会被用于那些操作数的组合。 GCC有许多机器无关的predicate,并且你可以根据需要来定义机器特定的断言。 按照惯例,与match_operand
一起使用的predicate的名字以‘_operand’结尾, 与match_operator
一起使用的predicate的名字以‘_operator’结尾。
所有断言(从数学意义上)都是具有两个参数的布尔函数: 指令模式中在那个位置上被考虑的RTL表达式, 以及match_operand
或match_operator
所指定的机器模式。 在这一节里,第一个参数被称为op,第二个参数被称为mode。 predicate可以作为普通的具有两个参数的函数,从C中调用; 这在输出模板或者其它机器特定的代码中,很有用处。
操作数断言可以允许硬件实际上无法接受的操作数, 只要约束能够为reload提供能力,来修复它们(参见Constraints)。 然而,只要断言指定的机器指令需求尽可能的严密, GCC通常便会生成更好的代码。reload不能修复必须为常量的操作数(立即数); 你必须使用只允许常量的断言,或者使用额外的条件来加强必要条件。
大多数predicate使用统一的方式来处理它们的mode参数。
如果mode为VOIDmode
(未加指明的),则op可以具有任意的模式。
如果mode为其它情况,则op必须具有相同的机器模式,
除非op是一个CONST_INT
或整数CONST_DOUBLE
。
这些RTL表达式总是具有VOIDmode
,所以检测它们的模式匹配反而会适得其反。
替代的,接受CONST_INT
和/或整数CONST_DOUBLE
的predicate,
可以检测存储在常量中的值是否适合所要求的机器模式。
具有这种行为的predicate被称为常规的。 genrecog能够根据常规predicate如何处理机器模式的知识来优化指令识别器。 它还能够诊断使用常规predicate所出现的一些常见错误。例如, 使用常规predicate而没有指定机器模式几乎总是错误的。
对mode参数进行不同方式处理的predicate被称为特殊的。
通用predicate address_operand
和pmode_register_operand
是特殊predicate。当使用特殊predicate的时候,
genrecog不做任何的优化或诊断。