Mercurial > hg > CbC > CbC_gcc
diff gcc/genextract.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/genextract.c Fri Oct 27 22:46:09 2017 +0900 +++ b/gcc/genextract.c Thu Oct 25 07:37:49 2018 +0900 @@ -1,5 +1,5 @@ /* Generate code from machine description to extract operands from insn as rtl. - Copyright (C) 1987-2017 Free Software Foundation, Inc. + Copyright (C) 1987-2018 Free Software Foundation, Inc. This file is part of GCC. @@ -33,9 +33,10 @@ 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 @@ /* 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ { 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 @@ 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 @@ 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 @@ 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'); @@ -343,6 +361,7 @@ /* Generated automatically by the program `genextract'\n\ from the machine description file `md'. */\n\ \n\ +#define IN_TARGET_CODE 1\n\ #include \"config.h\"\n\ #include \"system.h\"\n\ #include \"coretypes.h\"\n\