Next: , Previous: Output Statement, Up: Machine Desc


16.7 断言

断言用于确定一个match_operand或者 match_operator表达式是否匹配, 以及周围的指令模式是否会被用于那些操作数的组合。 GCC有许多机器无关的predicate,并且你可以根据需要来定义机器特定的断言。 按照惯例,与match_operand一起使用的predicate的名字以‘_operand’结尾, 与match_operator一起使用的predicate的名字以‘_operator’结尾。

所有断言(从数学意义上)都是具有两个参数的布尔函数: 指令模式中在那个位置上被考虑的RTL表达式, 以及match_operandmatch_operator所指定的机器模式。 在这一节里,第一个参数被称为op,第二个参数被称为mode。 predicate可以作为普通的具有两个参数的函数,从C中调用; 这在输出模板或者其它机器特定的代码中,很有用处。

操作数断言可以允许硬件实际上无法接受的操作数, 只要约束能够为reload提供能力,来修复它们(参见Constraints)。 然而,只要断言指定的机器指令需求尽可能的严密, GCC通常便会生成更好的代码。reload不能修复必须为常量的操作数(立即数); 你必须使用只允许常量的断言,或者使用额外的条件来加强必要条件。

大多数predicate使用统一的方式来处理它们的mode参数。 如果modeVOIDmode(未加指明的),则op可以具有任意的模式。 如果mode为其它情况,则op必须具有相同的机器模式, 除非op是一个CONST_INT或整数CONST_DOUBLE。 这些RTL表达式总是具有VOIDmode,所以检测它们的模式匹配反而会适得其反。 替代的,接受CONST_INT和/或整数CONST_DOUBLE的predicate, 可以检测存储在常量中的值是否适合所要求的机器模式。

具有这种行为的predicate被称为常规的。 genrecog能够根据常规predicate如何处理机器模式的知识来优化指令识别器。 它还能够诊断使用常规predicate所出现的一些常见错误。例如, 使用常规predicate而没有指定机器模式几乎总是错误的。

mode参数进行不同方式处理的predicate被称为特殊的。 通用predicate address_operandpmode_register_operand 是特殊predicate。当使用特殊predicate的时候, genrecog不做任何的优化或诊断。