RTL expressions used to define attributes use the codes described above plus a few specific to attribute definitions, to be discussed below. Attribute value expressions must have one of the following forms:
(const_int i)
const_int
or as an integer represented as a string in
const_string
, eq_attr
(see below), and set_attr
(see section Assigning Attribute Values to Insns) expressions.
(const_string value)
define_attr
.
If the attribute whose value is being specified is numeric, value
must be a string containing a non-negative integer (normally
const_int
would be used in this case). Otherwise, it must
contain one of the valid values for the attribute.
(if_then_else test true-value false-value)
(cond [test1 value1 ...] default)
cond
expression is that of the
value corresponding to the first true test expression. If
none of the test expressions are true, the value of the cond
expression is that of the default expression.
test expressions can have one of the following forms:
(const_int i)
(not test)
(ior test1 test2)
(and test1 test2)
(match_operand:m n pred constraints)
VOIDmode
) and the function specified by the string
pred returns a non-zero value when passed operand n and mode
m (this part of the test is ignored if pred is the null
string).
The constraints operand is ignored and should be the null string.
(le arith1 arith2)
(leu arith1 arith2)
(lt arith1 arith2)
(ltu arith1 arith2)
(gt arith1 arith2)
(gtu arith1 arith2)
(ge arith1 arith2)
(geu arith1 arith2)
(ne arith1 arith2)
(eq arith1 arith2)
plus
, minus
, mult
, div
, mod
,
abs
, neg
, and
, ior
, xor
, not
,
ashift
, lshiftrt
, and ashiftrt
expressions.
const_int
and symbol_ref
are always valid terms (see section Computing the Length of an Insn,for additional forms). symbol_ref
is a string
denoting a C expression that yields an int
when evaluated by the
`get_attr_...' routine. It should normally be a global
variable.
(eq_attr name value)
(eq_attr "type" "load,store")is equivalent to
(ior (eq_attr "type" "load") (eq_attr "type" "store"))If name specifies an attribute of `alternative', it refers to the value of the compiler variable
which_alternative
(see section C Statements for Assembler Output) and the values must be small integers. For
example,
(eq_attr "alternative" "2,3")is equivalent to
(ior (eq (symbol_ref "which_alternative") (const_int 2)) (eq (symbol_ref "which_alternative") (const_int 3)))Note that, for most attributes, an
eq_attr
test is simplified in cases
where the value of the attribute being tested is known for all insns matching
a particular pattern. This is by far the most common case.
(attr_flag name)
attr_flag
expression is true if the flag
specified by name is true for the insn
currently being
scheduled.
name is a string specifying one of a fixed set of flags to test.
Test the flags forward
and backward
to determine the
direction of a conditional branch. Test the flags very_likely
,
likely
, very_unlikely
, and unlikely
to determine
if a conditional branch is expected to be taken.
If the very_likely
flag is true, then the likely
flag is also
true. Likewise for the very_unlikely
and unlikely
flags.
This example describes a conditional branch delay slot which
can be nullified for forward branches that are taken (annul-true) or
for backward branches which are not taken (annul-false).
(define_delay (eq_attr "type" "cbranch") [(eq_attr "in_branch_delay" "true") (and (eq_attr "in_branch_delay" "true") (attr_flag "forward")) (and (eq_attr "in_branch_delay" "true") (attr_flag "backward"))])The
forward
and backward
flags are false if the current
insn
being scheduled is not a conditional branch.
The very_likely
and likely
flags are true if the
insn
being scheduled is not a conditional branch.
The very_unlikely
and unlikely
flags are false if the
insn
being scheduled is not a conditional branch.
attr_flag
is only used during delay slot scheduling and has no
meaning to other passes of the compiler.
Go to the first, previous, next, last section, table of contents.