From: rsandifo Date: Wed, 31 Aug 2011 21:06:59 +0000 (+0000) Subject: gcc/ X-Git-Tag: upstream/4.9.2~18030 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=26173369bef1fde8e17f4e0f69567d8cae2f76f6;p=platform%2Fupstream%2Flinaro-gcc.git gcc/ * 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@178388 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8f40314..1b414b1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,12 @@ 2011-08-31 Richard Sandiford + * 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 + * genattrtab.c (attr_rtx_1): Hash SYMBOL_REFs. (attr_string): Use copy_md_ptr_loc. diff --git a/gcc/doc/md.texi b/gcc/doc/md.texi index 24f591c..7fc1a5e 100644 --- a/gcc/doc/md.texi +++ b/gcc/doc/md.texi @@ -7045,6 +7045,30 @@ string). 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 diff --git a/gcc/genattrtab.c b/gcc/genattrtab.c index 69e0850..4a4c2a2 100644 --- a/gcc/genattrtab.c +++ b/gcc/genattrtab.c @@ -658,6 +658,7 @@ attr_copy_rtx (rtx orig) case CONST_DOUBLE: case CONST_VECTOR: case SYMBOL_REF: + case MATCH_TEST: case CODE_LABEL: case PC: case CC0: @@ -841,6 +842,11 @@ check_attr_test (rtx exp, int is_const, int lineno) 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", @@ -2907,6 +2913,7 @@ clear_struct_flag (rtx x) case CONST_INT: case CONST_DOUBLE: case CONST_VECTOR: + case MATCH_TEST: case SYMBOL_REF: case CODE_LABEL: case PC: @@ -3571,6 +3578,12 @@ write_test_expr (rtx exp, unsigned int attrs_cached, int flags) 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)); @@ -3765,6 +3778,7 @@ walk_attr_value (rtx exp) must_extract = 1; return; + case MATCH_TEST: case EQ_ATTR_ALT: must_extract = must_constrain = 1; break; diff --git a/gcc/rtl.def b/gcc/rtl.def index b098123..dbf320e 100644 --- a/gcc/rtl.def +++ b/gcc/rtl.def @@ -819,9 +819,8 @@ DEF_RTL_EXPR(MATCH_PAR_DUP, "match_par_dup", "iE", RTX_MATCH) 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. */