Alan Hayward <alan.hayw...@arm.com> writes: > This patch adds support for CLOBBER_HIGH in the generation code. > > An aarch64 will require 31 clobber high expressions, plus two > clobbers. > > The exisiting gen code restricts to 26 vector operands by virtue > of using the operators [a-z]. This patch extends this to 52 by > supporting [a-zA-Z].
Although the main CLOBBER_HIGH patch will obviously need to wait until GCC 9 now, we can work around it for GCC 8 by making the tlsdesc pattern clobber all vector and predicate registers for SVE. We'll still need the support for more than 26 operands in order to do that though. > 2017-11-16 Alan Hayward <alan.hayw...@arm.com> > >[...] > * genextract.c (push_pathstr_operand): New function to > support [a-zA-Z]. > (walk_rtx): Call push_pathstr_operand. > (print_path): Support [a-zA-Z]. >[...] > diff --git a/gcc/genextract.c b/gcc/genextract.c > index > 258d234d2729bf16b152b90bb1833a37a6eb0bdc..e1fb716e459b9bd219e89cf36c30556d520305a2 > 100644 > --- a/gcc/genextract.c > +++ b/gcc/genextract.c > @@ -33,9 +33,10 @@ along with GCC; see the file COPYING3. If not see > > The string for each operand describes that path to the operand and > contains `0' through `9' when going into an expression and `a' through > - `z' when going into a vector. We assume here that only the first operand > - of an rtl expression is a vector. genrecog.c makes the same assumption > - (and uses the same representation) and it is currently true. */ > + `z' then 'A' through to 'Z' when going into a vector. We assume here that > + only the first operand of an rtl expression is a vector. genrecog.c makes > + the same assumption (and uses the same representation) and it is currently > + true. */ > > typedef char *locstr; > > @@ -80,6 +81,22 @@ struct accum_extract > /* Forward declarations. */ > static void walk_rtx (md_rtx_info *, rtx, struct accum_extract *); > > +#define UPPER_OFFSET ('A' - ('z' - 'a' + 1)) > + > +/* Convert OPERAND into a character - either into [a-zA-Z] for vector > operands > + or [0-9] for integer operands - and push onto the end of the path ACC. */ > +static void > +push_pathstr_operand (int operand, bool is_vector, > + struct accum_extract *acc) > +{ > + if (is_vector && 'a' + operand > 'z') > + acc->pathstr.safe_push (operand + UPPER_OFFSET); > + else if (is_vector) > + acc->pathstr.safe_push (operand + 'a'); > + else > + acc->pathstr.safe_push (operand + '0'); > +} > + > static void > gen_insn (md_rtx_info *info) > { > @@ -98,7 +115,7 @@ gen_insn (md_rtx_info *info) > else > for (i = XVECLEN (insn, 1) - 1; i >= 0; i--) > { > - acc.pathstr.safe_push ('a' + i); > + push_pathstr_operand (i, true, &acc); > walk_rtx (info, XVECEXP (insn, 1, i), &acc); > acc.pathstr.pop (); > } > @@ -208,7 +225,7 @@ static void > walk_rtx (md_rtx_info *info, rtx x, struct accum_extract *acc) > { > RTX_CODE code; > - int i, len, base; > + int i, len; > const char *fmt; > > if (x == 0) > @@ -234,10 +251,9 @@ walk_rtx (md_rtx_info *info, rtx x, struct accum_extract > *acc) > VEC_safe_set_locstr (info, &acc->oplocs, XINT (x, 0), > VEC_char_to_string (acc->pathstr)); > > - base = (code == MATCH_OPERATOR ? '0' : 'a'); > for (i = XVECLEN (x, 2) - 1; i >= 0; i--) > { > - acc->pathstr.safe_push (base + i); > + push_pathstr_operand (i, code != MATCH_OPERATOR, acc); > walk_rtx (info, XVECEXP (x, 2, i), acc); > acc->pathstr.pop (); > } > @@ -252,10 +268,9 @@ walk_rtx (md_rtx_info *info, rtx x, struct accum_extract > *acc) > if (code == MATCH_DUP) > break; > > - base = (code == MATCH_OP_DUP ? '0' : 'a'); > for (i = XVECLEN (x, 1) - 1; i >= 0; i--) > { > - acc->pathstr.safe_push (base + i); > + push_pathstr_operand (i, code != MATCH_OP_DUP, acc); > walk_rtx (info, XVECEXP (x, 1, i), acc); > acc->pathstr.pop (); > } > @@ -271,7 +286,7 @@ walk_rtx (md_rtx_info *info, rtx x, struct accum_extract > *acc) > { > if (fmt[i] == 'e' || fmt[i] == 'u') > { > - acc->pathstr.safe_push ('0' + i); > + push_pathstr_operand (i, false, acc); > walk_rtx (info, XEXP (x, i), acc); > acc->pathstr.pop (); > } > @@ -280,7 +295,7 @@ walk_rtx (md_rtx_info *info, rtx x, struct accum_extract > *acc) > int j; > for (j = XVECLEN (x, i) - 1; j >= 0; j--) > { > - acc->pathstr.safe_push ('a' + j); > + push_pathstr_operand (j, true, acc); > walk_rtx (info, XVECEXP (x, i, j), acc); > acc->pathstr.pop (); > } > @@ -311,7 +326,7 @@ print_path (const char *path) > > for (i = len - 1; i >= 0 ; i--) > { > - if (ISLOWER (path[i])) > + if (ISLOWER (path[i]) || ISUPPER (path[i])) > fputs ("XVECEXP (", stdout); > else if (ISDIGIT (path[i])) > fputs ("XEXP (", stdout); > @@ -323,7 +338,9 @@ print_path (const char *path) > > for (i = 0; i < len; i++) > { > - if (ISLOWER (path[i])) > + if (ISUPPER (path[i])) > + printf (", 0, %d)", path[i] - UPPER_OFFSET); > + else if (ISLOWER (path[i])) > printf (", 0, %d)", path[i] - 'a'); > else if (ISDIGIT (path[i])) > printf (", %d)", path[i] - '0'); This part is OK, thanks. Could you test it independently of the rest and commit? Richard