Mercurial > hg > CbC > CbC_gcc
diff gcc/genrecog.c @ 131:84e7813d76e9
gcc-8.2
author | mir3636 |
---|---|
date | Thu, 25 Oct 2018 07:37:49 +0900 |
parents | 04ced10e8804 |
children | 1830386684a0 |
line wrap: on
line diff
--- a/gcc/genrecog.c Fri Oct 27 22:46:09 2017 +0900 +++ b/gcc/genrecog.c Thu Oct 25 07:37:49 2018 +0900 @@ -1,5 +1,5 @@ /* Generate code from machine description to recognize rtl as insns. - Copyright (C) 1987-2017 Free Software Foundation, Inc. + Copyright (C) 1987-2018 Free Software Foundation, Inc. This file is part of GCC. @@ -388,7 +388,7 @@ return r; break; - case 'i': case 'r': case 'w': case '0': case 's': + case 'r': case 'p': case 'i': case 'w': case '0': case 's': break; default: @@ -439,7 +439,7 @@ return r; break; - case 'i': case 'r': case 'w': case '0': case 's': + case 'r': case 'p': case 'i': case 'w': case '0': case 's': break; default: @@ -718,6 +718,7 @@ } case CLOBBER: + case CLOBBER_HIGH: validate_pattern (SET_DEST (pattern), info, pattern, '='); return; @@ -746,14 +747,20 @@ = VECTOR_MODE_P (mode) ? GET_MODE_INNER (mode) : mode; if (GET_CODE (XEXP (pattern, 1)) == PARALLEL) { - int expected = VECTOR_MODE_P (mode) ? GET_MODE_NUNITS (mode) : 1; - if (XVECLEN (XEXP (pattern, 1), 0) != expected) + int expected = 1; + unsigned int nelems; + if (VECTOR_MODE_P (mode) + && !GET_MODE_NUNITS (mode).is_constant (&expected)) + error_at (info->loc, + "vec_select with variable-sized mode %s", + GET_MODE_NAME (mode)); + else if (XVECLEN (XEXP (pattern, 1), 0) != expected) error_at (info->loc, "vec_select parallel with %d elements, expected %d", XVECLEN (XEXP (pattern, 1), 0), expected); - else if (VECTOR_MODE_P (imode)) + else if (VECTOR_MODE_P (imode) + && GET_MODE_NUNITS (imode).is_constant (&nelems)) { - unsigned int nelems = GET_MODE_NUNITS (imode); int i; for (i = 0; i < expected; ++i) if (CONST_INT_P (XVECEXP (XEXP (pattern, 1), 0, i)) @@ -797,7 +804,7 @@ validate_pattern (XVECEXP (pattern, i, j), info, NULL_RTX, 0); break; - case 'i': case 'r': case 'w': case '0': case 's': + case 'r': case 'p': case 'i': case 'w': case '0': case 's': break; default: @@ -1119,6 +1126,9 @@ /* Check REGNO (X) == LABEL. */ REGNO_FIELD, + /* Check known_eq (SUBREG_BYTE (X), LABEL). */ + SUBREG_FIELD, + /* Check XINT (X, u.opno) == LABEL. */ INT_FIELD, @@ -1199,6 +1209,7 @@ static rtx_test code (position *); static rtx_test mode (position *); static rtx_test regno_field (position *); + static rtx_test subreg_field (position *); static rtx_test int_field (position *, int); static rtx_test wide_int_field (position *, int); static rtx_test veclen (position *); @@ -1244,6 +1255,13 @@ } rtx_test +rtx_test::subreg_field (position *pos) +{ + rtx_test res (pos, rtx_test::SUBREG_FIELD); + return res; +} + +rtx_test rtx_test::int_field (position *pos, int opno) { rtx_test res (pos, rtx_test::INT_FIELD); @@ -1364,6 +1382,7 @@ case rtx_test::CODE: case rtx_test::MODE: case rtx_test::REGNO_FIELD: + case rtx_test::SUBREG_FIELD: case rtx_test::VECLEN: case rtx_test::HAVE_NUM_CLOBBERS: return true; @@ -1821,6 +1840,7 @@ gcc_unreachable (); case rtx_test::REGNO_FIELD: + case rtx_test::SUBREG_FIELD: case rtx_test::INT_FIELD: case rtx_test::WIDE_INT_FIELD: case rtx_test::VECLEN: @@ -2028,6 +2048,7 @@ return parameter::MODE; case rtx_test::REGNO_FIELD: + case rtx_test::SUBREG_FIELD: return parameter::UINT; case rtx_test::INT_FIELD: @@ -4039,6 +4060,14 @@ XWINT (pattern, 0), false); break; + case 'p': + /* We don't have a way of parsing polynomial offsets yet, + and hopefully never will. */ + s = add_decision (s, rtx_test::subreg_field (pos), + SUBREG_BYTE (pattern).to_constant (), + false); + break; + case '0': break; @@ -4218,6 +4247,8 @@ /* Generated automatically by the program `genrecog' from the target\n\ machine description file. */\n\ \n\ +#define IN_TARGET_CODE 1\n\ +\n\ #include \"config.h\"\n\ #include \"system.h\"\n\ #include \"coretypes.h\"\n\ @@ -4569,6 +4600,12 @@ printf (")"); break; + case rtx_test::SUBREG_FIELD: + printf ("SUBREG_BYTE ("); + print_test_rtx (os, test); + printf (")"); + break; + case rtx_test::WIDE_INT_FIELD: printf ("XWINT ("); print_test_rtx (os, test); @@ -4651,6 +4688,14 @@ print_label_value (test, is_param, value); break; + case rtx_test::SUBREG_FIELD: + printf ("%s (", invert_p ? "maybe_ne" : "known_eq"); + print_nonbool_test (os, test); + printf (", "); + print_label_value (test, is_param, value); + printf (")"); + break; + case rtx_test::SAVED_CONST_INT: gcc_assert (!is_param && value == 1); print_test_rtx (os, test); @@ -5250,7 +5295,7 @@ for (i = XVECLEN (pattern, 0); i > 0; i--) { rtx x = XVECEXP (pattern, 0, i - 1); - if (GET_CODE (x) != CLOBBER + if ((GET_CODE (x) != CLOBBER && GET_CODE (x) != CLOBBER_HIGH) || (!REG_P (XEXP (x, 0)) && GET_CODE (XEXP (x, 0)) != MATCH_SCRATCH)) break;