A predicate determines whether a
match_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 the
match_operator specifies. In this
section, the first argument is called op and the second argument
mode. Predicates can be called from C as ordinary two-argument
functions; this can be useful in output templates or other
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 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 integer
CONST_DOUBLE. These RTL expressions always have
VOIDmode, so it would be counterproductive to check that their
mode matches. Instead, predicates that accept
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 predicates
pmode_register_operand are special
predicates. genrecog does not do any optimizations or
diagnosis when special predicates are used.