Predicates (GNU Compiler Collection (GCC) Internals) (original) (raw)
16.8 Predicates ¶
A predicate determines whether a match_operand
ormatch_operator
expression matches, and therefore whether the surrounding instruction pattern will be used for that combination of operands. GCC has a number of machine-independent predicates, and you can define machine-specific predicates as needed. By convention, predicates used with match_operand
have names that end in ‘_operand’, and those used with match_operator
have names that end in ‘_operator’.
All predicates are boolean functions (in the mathematical sense) of two arguments: the RTL expression that is being considered at that position in the instruction pattern, and the machine mode that thematch_operand
or match_operator
specifies. In this section, the first argument is called op and the second argumentmode. Predicates can be called from C as ordinary two-argument functions; this can be useful in output templates or other machine-specific code.
Operand predicates can allow operands that are not actually acceptable to the hardware, as long as the constraints give reload the ability to fix them up (see Operand Constraints). However, GCC will usually generate better code if the predicates specify the requirements of the machine instructions as closely as possible. Reload cannot fix up operands that must be constants (“immediate operands”); you must use a predicate that allows only constants, or else enforce the requirement in the extra condition.
Most predicates handle their mode argument in a uniform manner. If mode is VOIDmode
(unspecified), then op can have any mode. If mode is anything else, then op must have the same mode, unless op is a CONST_INT
or integerCONST_DOUBLE
. These RTL expressions always haveVOIDmode
, so it would be counterproductive to check that their mode matches. Instead, predicates that accept CONST_INT
and/or integer CONST_DOUBLE
check that the value stored in the constant will fit in the requested mode.
Predicates with this behavior are called normal.genrecog
can optimize the instruction recognizer based on knowledge of how normal predicates treat modes. It can also diagnose certain kinds of common errors in the use of normal predicates; for instance, it is almost always an error to use a normal predicate without specifying a mode.
Predicates that do something different with their mode argument are called special. The generic predicatesaddress_operand
and pmode_register_operand
are special predicates. genrecog
does not do any optimizations or diagnosis when special predicates are used.