It is occasionally useful to test a constraint from C code rather than
implicitly via the constraint string in a match_operand
. The
generated file tm_p.h declares a few interfaces for working
with machinespecific constraints. None of these interfaces work with
the generic constraints described in Simple Constraints. This
may change in the future.
Warning: tm_p.h may declare other functions that operate on constraints, besides the ones documented here. Do not use those functions from machinedependent code. They exist to implement the old constraint interface that machineindependent components of the compiler still expect. They will change or disappear in the future.
Some valid constraint names are not valid C identifiers, so there is a mangling scheme for referring to them from C. Constraint names that do not contain angle brackets or underscores are left unchanged. Underscores are doubled, each ‘<’ is replaced with ‘_l’, and each ‘>’ with ‘_g’. Here are some examples:
Original  Mangled 
x  x 
P42x  P42x 
P4_x  P4__x 
P4>x  P4_gx 
P4>>  P4_g_g 
P4_g>  P4__g_g

Throughout this section, the variable c is either a constraint
in the abstract sense, or a constant from enum constraint_num
;
the variable m is a mangled constraint name (usually as part of
a larger identifier).
For each machinespecific constraint, there is a corresponding enumeration constant: ‘CONSTRAINT_’ plus the mangled name of the constraint. Functions that take an
enum constraint_num
as an argument expect one of these constants.Machineindependent constraints do not have associated constants. This may change in the future.
For each machinespecific, nonregister constraint m, there is one of these functions; it returns
true
if exp satisfies the constraint. These functions are only visible if rtl.h was included before tm_p.h.
Like the
satisfies_constraint_
m functions, but the constraint to test is given as an argument, c. If c specifies a register constraint, this function will always returnfalse
.
Returns the register class associated with c. If c is not a register constraint, or those registers are not available for the currently selected subtarget, returns
NO_REGS
.
Here is an example use of satisfies_constraint_
m. In
peephole optimizations (see Peephole Definitions), operand
constraint strings are ignored, so if there are relevant constraints,
they must be tested in the C condition. In the example, the
optimization is applied if operand 2 does not satisfy the
‘K’ constraint. (This is a simplified version of a peephole
definition from the i386 machine description.)
(define_peephole2 [(match_scratch:SI 3 "r") (set (match_operand:SI 0 "register_operand" "") (mult:SI (match_operand:SI 1 "memory_operand" "") (match_operand:SI 2 "immediate_operand" "")))] "!satisfies_constraint_K (operands[2])" [(set (match_dup 3) (match_dup 1)) (set (match_dup 0) (mult:SI (match_dup 3) (match_dup 2)))] "")