Support >26 operands in generation code.
authorAlan Hayward <alan.hayward@arm.com>
Wed, 7 Feb 2018 16:25:28 +0000 (16:25 +0000)
committerAlan Hayward <alahay01@gcc.gnu.org>
Wed, 7 Feb 2018 16:25:28 +0000 (16:25 +0000)
2018-02-07  Alan Hayward  <alan.hayward@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].

From-SVN: r257455

gcc/ChangeLog
gcc/genextract.c

index 9c4d0e87b87388ce78369e978b0d8ff6e3ef92c6..bcd892c8b3c4792ea4031bffdc68a3e07000f3b2 100644 (file)
@@ -1,3 +1,10 @@
+2018-02-07  Alan Hayward  <alan.hayward@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].
+
 2018-02-07  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/84037
index f86efb37a68c98e4411f3932c3e02fbcd24915ed..387184b4ae1681851cb62cc25f5caa1b69cbbde9 100644 (file)
@@ -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');