From 085e82463714a665bc0236fb753dd5a216a0507e Mon Sep 17 00:00:00 2001 From: Alan Hayward Date: Wed, 7 Feb 2018 16:25:28 +0000 Subject: [PATCH] Support >26 operands in generation code. 2018-02-07 Alan Hayward * genextract.c (push_pathstr_operand): New function to support [a-zA-Z]. (walk_rtx): Call push_pathstr_operand. (print_path): Support [a-zA-Z]. From-SVN: r257455 --- gcc/ChangeLog | 7 +++++++ gcc/genextract.c | 44 +++++++++++++++++++++++++++++++------------- 2 files changed, 38 insertions(+), 13 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9c4d0e87b87..bcd892c8b3c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2018-02-07 Alan Hayward + + * genextract.c (push_pathstr_operand): New function to support + [a-zA-Z]. + (walk_rtx): Call push_pathstr_operand. + (print_path): Support [a-zA-Z]. + 2018-02-07 Richard Biener PR tree-optimization/84037 diff --git a/gcc/genextract.c b/gcc/genextract.c index f86efb37a68..387184b4ae1 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,23 @@ struct accum_extract /* Forward declarations. */ static void walk_rtx (md_rtx_info *, rtx, struct accum_extract *); +#define UPPER_OFFSET ('A' - ('z' - 'a' + 1)) + +/* Convert integer 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 + in 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 +116,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 +226,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 +252,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 +269,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 +287,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 +296,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 +327,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 +339,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'); -- 2.30.2