rs6000: Parsing built-in input file, part 3 of 3
authorBill Schmidt <wschmidt@linux.ibm.com>
Wed, 21 Jul 2021 12:36:25 +0000 (08:36 -0400)
committerBill Schmidt <wschmidt@linux.ibm.com>
Wed, 21 Jul 2021 17:49:12 +0000 (13:49 -0400)
2021-07-21  Bill Schmidt  <wschmidt@linux.ibm.com>

gcc/
* config/rs6000/rs6000-gen-builtins.c (parse_bif_attrs):
Implement.

gcc/config/rs6000/rs6000-gen-builtins.c

index ee32a0d..6030e13 100644 (file)
@@ -1163,6 +1163,108 @@ parse_args (prototype *protoptr)
 static parse_codes
 parse_bif_attrs (attrinfo *attrptr)
 {
+  consume_whitespace ();
+  if (linebuf[pos] != '{')
+    {
+      (*diag) ("missing attribute set at column %d.\n", pos + 1);
+      return PC_PARSEFAIL;
+    }
+  safe_inc_pos ();
+
+  memset (attrptr, 0, sizeof *attrptr);
+  char *attrname = NULL;
+
+  do {
+    consume_whitespace ();
+    int oldpos = pos;
+    attrname = match_identifier ();
+    if (attrname)
+      {
+       if (!strcmp (attrname, "init"))
+         attrptr->isinit = 1;
+       else if (!strcmp (attrname, "set"))
+         attrptr->isset = 1;
+       else if (!strcmp (attrname, "extract"))
+         attrptr->isextract = 1;
+       else if (!strcmp (attrname, "nosoft"))
+         attrptr->isnosoft = 1;
+       else if (!strcmp (attrname, "ldvec"))
+         attrptr->isldvec = 1;
+       else if (!strcmp (attrname, "stvec"))
+         attrptr->isstvec = 1;
+       else if (!strcmp (attrname, "reve"))
+         attrptr->isreve = 1;
+       else if (!strcmp (attrname, "pred"))
+         attrptr->ispred = 1;
+       else if (!strcmp (attrname, "htm"))
+         attrptr->ishtm = 1;
+       else if (!strcmp (attrname, "htmspr"))
+         attrptr->ishtmspr = 1;
+       else if (!strcmp (attrname, "htmcr"))
+         attrptr->ishtmcr = 1;
+       else if (!strcmp (attrname, "mma"))
+         attrptr->ismma = 1;
+       else if (!strcmp (attrname, "quad"))
+         attrptr->isquad = 1;
+       else if (!strcmp (attrname, "pair"))
+         attrptr->ispair = 1;
+       else if (!strcmp (attrname, "no32bit"))
+         attrptr->isno32bit = 1;
+       else if (!strcmp (attrname, "32bit"))
+         attrptr->is32bit = 1;
+       else if (!strcmp (attrname, "cpu"))
+         attrptr->iscpu = 1;
+       else if (!strcmp (attrname, "ldstmask"))
+         attrptr->isldstmask = 1;
+       else if (!strcmp (attrname, "lxvrse"))
+         attrptr->islxvrse = 1;
+       else if (!strcmp (attrname, "lxvrze"))
+         attrptr->islxvrze = 1;
+       else if (!strcmp (attrname, "endian"))
+         attrptr->isendian = 1;
+       else
+         {
+           (*diag) ("unknown attribute at column %d.\n", oldpos + 1);
+           return PC_PARSEFAIL;
+         }
+
+       consume_whitespace ();
+       if (linebuf[pos] == ',')
+         safe_inc_pos ();
+       else if (linebuf[pos] != '}')
+         {
+           (*diag) ("arg not followed by ',' or '}' at column %d.\n",
+                    pos + 1);
+           return PC_PARSEFAIL;
+         }
+      }
+    else
+      {
+       pos = oldpos;
+       if (linebuf[pos] != '}')
+         {
+           (*diag) ("badly terminated attr set at column %d.\n", pos + 1);
+           return PC_PARSEFAIL;
+         }
+       safe_inc_pos ();
+      }
+  } while (attrname);
+
+#ifdef DEBUG
+  (*diag) ("attribute set: init = %d, set = %d, extract = %d, nosoft = %d, "
+          "ldvec = %d, stvec = %d, reve = %d, pred = %d, htm = %d, "
+          "htmspr = %d, htmcr = %d, mma = %d, quad = %d, pair = %d, "
+          "no32bit = %d, 32bit = %d, cpu = %d, ldstmask = %d, lxvrse = %d, "
+          "lxvrze = %d, endian = %d.\n",
+          attrptr->isinit, attrptr->isset, attrptr->isextract,
+          attrptr->isnosoft, attrptr->isldvec, attrptr->isstvec,
+          attrptr->isreve, attrptr->ispred, attrptr->ishtm, attrptr->ishtmspr,
+          attrptr->ishtmcr, attrptr->ismma, attrptr->isquad, attrptr->ispair,
+          attrptr->isno32bit, attrptr->is32bit, attrptr->iscpu,
+          attrptr->isldstmask, attrptr->islxvrse, attrptr->islxvrze,
+          attrptr->isendian);
+#endif
+
   return PC_OK;
 }