> On 6 Feb 2018, at 17:03, Richard Sandiford <richard.sandif...@linaro.org> > wrote: > > 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? >
Tested by adding all 32 aarch64 vector regs as clobbers to the one of the patterns in arch64.md. Compiled and ran tests. Committed genextract.c as requested. Thanks, Alan.