diff options
author | Richard Sandiford <richard.sandiford@arm.com> | 2015-05-19 07:09:42 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2015-05-19 07:09:42 +0000 |
commit | 9fccb3359422e2c649e55e20713b9a8fa2c1d0be (patch) | |
tree | 96439177c2e9d6b824d800f99d19534a317db681 /gcc/genrecog.c | |
parent | e1a2b02198c93716fd4695d6ed61c20cfc933d1d (diff) | |
download | gcc-9fccb3359422e2c649e55e20713b9a8fa2c1d0be.zip gcc-9fccb3359422e2c649e55e20713b9a8fa2c1d0be.tar.gz gcc-9fccb3359422e2c649e55e20713b9a8fa2c1d0be.tar.bz2 |
rtl.def (REG): Change format to "r".
gcc/
* rtl.def (REG): Change format to "r".
* rtl.h (rtunion): Remove rt_reg.
(reg_info): New structure.
(rtx_def): Add reg field to main union.
(X0REGATTR): Delete.
(REG_CHECK): New macro.
(SET_REGNO_RAW, rhs_regno, REG_ATTRS): Use it.
* rtl.c (rtx_format): Document "r".
(rtx_code_size): Handle REG specially.
* gengenrtl.c (special_format): Return true for formats
that include 'r'.
* gengtype.c (adjust_field_rtx_def): Handle 'r' fields.
Deal with REG_ATTRS after the field loop.
* emit-rtl.c (gen_raw_REG): Call rtx_alloc_stat directly.
* expmed.c (init_expmed): Call gen_raw_REG instead of
gen_rtx_raw_REG.
* expr.c (init_expr_target): Likewise.
* regcprop.c (maybe_mode_change): Likewise.
* varasm.c (make_decl_rtl): Likewise.
* final.c (leaf_renumber_regs_insn): Return early after
handling REGs.
* genemit.c (gen_exp): Handle 'r' fields.
* genpeep.c (match_rtx): Likewise.
* gensupport.c (subst_pattern_match): Likewise.
(get_alternatives_number, collect_insn_data, alter_predicate_for_insn)
(alter_constraints, subst_dup): Likewise.
* read-rtl.c (read_rtx_code): Likewise.
* print-rtl.c (print_rtx): Likewise.
* genrecog.c (find_operand, find_matching_operand): Likewise.
(validate_pattern, match_pattern_2): Likewise.
(parameter::UINT, rtx_test::REGNO_FIELD): New enum values.
(rtx_test::regno_field): New function.
(operator ==, safe_to_hoist_p, transition_parameter_type)
(parameter_type_string, print_parameter_value)
(print_nonbool_test, print_test): Handle new enum values.
* cselib.c (rtx_equal_for_cselib_1): Handle REG specially.
* lra-constraints.c (operands_match_p): Likewise.
From-SVN: r223339
Diffstat (limited to 'gcc/genrecog.c')
-rw-r--r-- | gcc/genrecog.c | 46 |
1 files changed, 43 insertions, 3 deletions
diff --git a/gcc/genrecog.c b/gcc/genrecog.c index 31ad7c0..b832500 100644 --- a/gcc/genrecog.c +++ b/gcc/genrecog.c @@ -396,7 +396,7 @@ find_operand (rtx pattern, int n, rtx stop) return r; break; - case 'i': case 'w': case '0': case 's': + case 'i': case 'r': case 'w': case '0': case 's': break; default: @@ -447,7 +447,7 @@ find_matching_operand (rtx pattern, int n) return r; break; - case 'i': case 'w': case '0': case 's': + case 'i': case 'r': case 'w': case '0': case 's': break; default: @@ -747,7 +747,7 @@ validate_pattern (rtx pattern, rtx insn, rtx set, int set_code) validate_pattern (XVECEXP (pattern, i, j), insn, NULL_RTX, 0); break; - case 'i': case 'w': case '0': case 's': + case 'i': case 'r': case 'w': case '0': case 's': break; default: @@ -967,6 +967,9 @@ struct parameter /* An int parameter. */ INT, + /* An unsigned int parameter. */ + UINT, + /* A HOST_WIDE_INT parameter. */ WIDE_INT }; @@ -1063,6 +1066,9 @@ struct rtx_test /* Check GET_MODE (X) == LABEL. */ MODE, + /* Check REGNO (X) == LABEL. */ + REGNO_FIELD, + /* Check XINT (X, u.opno) == LABEL. */ INT_FIELD, @@ -1142,6 +1148,7 @@ struct rtx_test static rtx_test code (position *); static rtx_test mode (position *); + static rtx_test regno_field (position *); static rtx_test int_field (position *, int); static rtx_test wide_int_field (position *, int); static rtx_test veclen (position *); @@ -1180,6 +1187,13 @@ rtx_test::mode (position *pos) } rtx_test +rtx_test::regno_field (position *pos) +{ + rtx_test res (pos, rtx_test::REGNO_FIELD); + return res; +} + +rtx_test rtx_test::int_field (position *pos, int opno) { rtx_test res (pos, rtx_test::INT_FIELD); @@ -1299,6 +1313,7 @@ operator == (const rtx_test &a, const rtx_test &b) { case rtx_test::CODE: case rtx_test::MODE: + case rtx_test::REGNO_FIELD: case rtx_test::VECLEN: case rtx_test::HAVE_NUM_CLOBBERS: return true; @@ -1753,6 +1768,7 @@ safe_to_hoist_p (decision *d, const rtx_test &test, known_conditions *kc) } gcc_unreachable (); + case rtx_test::REGNO_FIELD: case rtx_test::INT_FIELD: case rtx_test::WIDE_INT_FIELD: case rtx_test::VECLEN: @@ -1959,6 +1975,9 @@ transition_parameter_type (rtx_test::kind_enum kind) case rtx_test::MODE: return parameter::MODE; + case rtx_test::REGNO_FIELD: + return parameter::UINT; + case rtx_test::INT_FIELD: case rtx_test::VECLEN: case rtx_test::PATTERN: @@ -3970,6 +3989,13 @@ match_pattern_2 (state *s, rtx top_pattern, position *pos, rtx pattern) XINT (pattern, i), false); break; + case 'r': + /* Make sure that REGNO (X) has the right value. */ + gcc_assert (i == 0); + s = add_decision (s, rtx_test::regno_field (pos), + REGNO (pattern), false); + break; + case 'w': /* Make sure that XWINT (X, I) has the right value. */ s = add_decision (s, rtx_test::wide_int_field (pos, i), @@ -4232,6 +4258,9 @@ parameter_type_string (parameter::type_enum type) case parameter::INT: return "int"; + case parameter::UINT: + return "unsigned int"; + case parameter::WIDE_INT: return "HOST_WIDE_INT"; } @@ -4451,6 +4480,10 @@ print_parameter_value (const parameter ¶m) printf ("%d", (int) param.value); break; + case parameter::UINT: + printf ("%u", (unsigned int) param.value); + break; + case parameter::WIDE_INT: print_host_wide_int (param.value); break; @@ -4499,6 +4532,12 @@ print_nonbool_test (output_state *os, const rtx_test &test) printf (", %d)", test.u.opno); break; + case rtx_test::REGNO_FIELD: + printf ("REGNO ("); + print_test_rtx (os, test); + printf (")"); + break; + case rtx_test::WIDE_INT_FIELD: printf ("XWINT ("); print_test_rtx (os, test); @@ -4572,6 +4611,7 @@ print_test (output_state *os, const rtx_test &test, bool is_param, case rtx_test::CODE: case rtx_test::MODE: case rtx_test::VECLEN: + case rtx_test::REGNO_FIELD: case rtx_test::INT_FIELD: case rtx_test::WIDE_INT_FIELD: case rtx_test::PATTERN: |