On Wed, Mar 30, 2011 at 8:09 PM, H.J. Lu <hongjiu...@intel.com> wrote: > On Wed, Mar 30, 2011 at 08:02:38AM -0700, H.J. Lu wrote: >> Hi, >> >> Currently, we limit XVECEXP to 26 elements in machine description >> since we use letters 'a' to 'z' to encode them. I don't see any >> reason why we can't go beyond 'z'. This patch removes this restriction. >> Any comments? >> > > That was wrong. The problem is in vector elements. This patch passes > bootstrap. Any comments?
Do you really need it? Richard. > Thanks. > > > H.J. > --- > 2011-03-30 H.J. Lu <hongjiu...@intel.com> > > * genrecog.c (VECTOR_ELEMENT_BASE): New. > (add_to_sequence): Add assert. Use VECTOR_ELEMENT_BASE to > encode vector elements. > (change_state): Check and support VECTOR_ELEMENT_BASE. > (make_insn_sequence): Add assert. > > diff --git a/gcc/genrecog.c b/gcc/genrecog.c > index 74dd0a7..40e9c4d 100644 > --- a/gcc/genrecog.c > +++ b/gcc/genrecog.c > @@ -465,6 +465,9 @@ extern void debug_decision > (struct decision *); > extern void debug_decision_list > (struct decision *); > + > +/* The base of vector element. */ > +#define VECTOR_ELEMENT_BASE 0x80 > > /* Create a new node in sequence after LAST. */ > > @@ -912,6 +915,7 @@ add_to_sequence (rtx pattern, struct decision_head *last, > const char *position, > /* Which insn we're looking at is represented by A-Z. We don't > ever use 'A', however; it is always implied. */ > > + gcc_assert (i < 26); > subpos[depth] = (i > 0 ? 'A' + i : 0); > sub = add_to_sequence (XVECEXP (pattern, 0, i), > last, subpos, insn_type, 0); > @@ -1002,6 +1006,9 @@ add_to_sequence (rtx pattern, struct decision_head > *last, const char *position, > char base = (was_code == MATCH_OPERATOR ? '0' : 'a'); > for (i = 0; i < (size_t) XVECLEN (pattern, 2); i++) > { > + gcc_assert (was_code == MATCH_OPERATOR > + ? ISDIGIT (i + base) > + : ISLOWER (i + base)); > subpos[depth] = i + base; > sub = add_to_sequence (XVECEXP (pattern, 2, i), > &sub->success, subpos, insn_type, 0); > @@ -1102,7 +1109,9 @@ add_to_sequence (rtx pattern, struct decision_head > *last, const char *position, > int j; > for (j = 0; j < XVECLEN (pattern, i); j++) > { > - subpos[depth] = 'a' + j; > + int val = j + VECTOR_ELEMENT_BASE; > + gcc_assert (val <= UCHAR_MAX); > + subpos[depth] = val; > sub = add_to_sequence (XVECEXP (pattern, i, j), > &sub->success, subpos, insn_type, 0); > } > @@ -1779,6 +1788,10 @@ change_state (const char *oldpos, const char *newpos, > const char *indent) > else if (ISLOWER (newpos[depth])) > printf ("%sx%d = XVECEXP (x%d, 0, %d);\n", > indent, depth + 1, depth, newpos[depth] - 'a'); > + else if (((unsigned char) newpos[depth]) >= VECTOR_ELEMENT_BASE) > + printf ("%sx%d = XVECEXP (x%d, 0, %d);\n", > + indent, depth + 1, depth, > + ((unsigned char) newpos[depth]) - VECTOR_ELEMENT_BASE); > else > printf ("%sx%d = XEXP (x%d, %c);\n", > indent, depth + 1, depth, newpos[depth]); > @@ -2528,6 +2541,7 @@ make_insn_sequence (rtx insn, enum routine_type type) > } > XVECLEN (x, 0) = j; > > + gcc_assert ((j - 1) < 26); > c_test_pos[0] = 'A' + j - 1; > c_test_pos[1] = '\0'; > } >