+2011-08-31 Richard Sandiford <rdsandiford@googlemail.com>
+
+ * doc/md.texi: Describe the use of match_tests in attribute tests.
+ * rtl.def (MATCH_TEST): Update commentary.
+ * genattrtab.c (attr_copy_rtx, check_attr_test, clear_struct_flag)
+ (write_test_expr, walk_attr_value): Handle MATCH_TEST.
+
2011-08-31 Richard Sandiford <rdsandiford@googlemail.com>
* genattrtab.c (attr_rtx_1): Hash SYMBOL_REFs.
The @var{constraints} operand is ignored and should be the null string.
+@cindex @code{match_test} and attributes
+@item (match_test @var{c-expr})
+The test is true if C expression @var{c-expr} is true. In non-constant
+attributes, @var{c-expr} has access to the following variables:
+
+@table @var
+@item insn
+The rtl instruction under test.
+@item which_alternative
+The @code{define_insn} alternative that @var{insn} matches.
+@xref{Output Statement}.
+@item operands
+An array of @var{insn}'s rtl operands.
+@end table
+
+@var{c-expr} behaves like the condition in a C @code{if} statement,
+so there is no need to explicitly convert the expression into a boolean
+0 or 1 value. For example, the following two tests are equivalent:
+
+@smallexample
+(match_test "x & 2")
+(match_test "(x & 2) != 0")
+@end smallexample
+
@cindex @code{le} and attributes
@cindex @code{leu} and attributes
@cindex @code{lt} and attributes
case CONST_DOUBLE:
case CONST_VECTOR:
case SYMBOL_REF:
+ case MATCH_TEST:
case CODE_LABEL:
case PC:
case CC0:
XEXP (exp, 0) = check_attr_test (XEXP (exp, 0), is_const, lineno);
break;
+ case MATCH_TEST:
+ exp = attr_rtx (MATCH_TEST, XSTR (exp, 0));
+ ATTR_IND_SIMPLIFIED_P (exp) = 1;
+ break;
+
case MATCH_OPERAND:
if (is_const)
fatal ("RTL operator \"%s\" not valid in constant attribute test",
case CONST_INT:
case CONST_DOUBLE:
case CONST_VECTOR:
+ case MATCH_TEST:
case SYMBOL_REF:
case CODE_LABEL:
case PC:
printf (HOST_WIDE_INT_PRINT_DEC, XWINT (exp, 0));
break;
+ case MATCH_TEST:
+ print_c_condition (XSTR (exp, 0));
+ if (flags & FLG_BITWISE)
+ printf (" != 0");
+ break;
+
/* A random C expression. */
case SYMBOL_REF:
print_c_condition (XSTR (exp, 0));
must_extract = 1;
return;
+ case MATCH_TEST:
case EQ_ATTR_ALT:
must_extract = must_constrain = 1;
break;
the result of the one before it. */
DEF_RTL_EXPR(MATCH_CODE, "match_code", "ss", RTX_MATCH)
-/* Appears only in define_predicate/define_special_predicate
- expressions. The argument is a C expression to be injected at this
- point in the predicate formula. */
+/* Used to inject a C conditional expression into an .md file. It can
+ appear in a predicate definition or an attribute expression. */
DEF_RTL_EXPR(MATCH_TEST, "match_test", "s", RTX_MATCH)
/* Insn (and related) definitions. */