Originally the SVE port used the names for 256-bit vectors, as the
next available increment after Advanced SIMD.  However, that was
always a bit of a hack and is bound to confuse people new to the code.

Nothing actually requires vector modes to have names of the form
V<nunits><mode>, and after talking it over with the AArch64 maintainers,
we agreed to switch to things like:

    VNx16QI

instead.  This patch lets targets pick this kind of prefix.

Tested on aarch64-linux-gnu (with and without SVE), x86_64-linux-gnu an
powerpc64le-linux-gnu.  I'll apply this under the gen* maintainership
when the SVE port itself has been approved.

Thanks,
Richard


2017-11-17  Richard Sandiford  <richard.sandif...@linaro.org>

gcc/
        * machmode.def (VECTOR_MODES_WITH_PREFIX): Document.
        * genmodes.c (VECTOR_MODES_WITH_PREFIX): New macro.
        (VECTOR_MODES): Use it.
        (make_vector_modes): Take the prefix as an argument.

Index: gcc/machmode.def
===================================================================
--- gcc/machmode.def    2017-11-17 21:46:15.177979825 +0000
+++ gcc/machmode.def    2017-11-17 21:46:25.555622937 +0000
@@ -142,6 +142,10 @@ along with GCC; see the file COPYING3.
        than two bytes (if CLASS is FLOAT).  CLASS must be INT or
        FLOAT.  The names follow the same rule as VECTOR_MODE uses.
 
+     VECTOR_MODES_WITH_PREFIX (PREFIX, CLASS, WIDTH);
+       Like VECTOR_MODES, but start the mode names with PREFIX instead
+       of the usual "V".
+
      VECTOR_BOOL_MODE (NAME, COUNT, BYTESIZE)
         Create a vector mode called NAME that contains COUNT boolean
         elements and occupies BYTESIZE bytes in total.  Each boolean
Index: gcc/genmodes.c
===================================================================
--- gcc/genmodes.c      2017-11-17 21:46:15.177050178 +0000
+++ gcc/genmodes.c      2017-11-17 21:46:25.554693290 +0000
@@ -483,9 +483,11 @@ make_complex_modes (enum mode_class cl,
 
 /* For all modes in class CL, construct vector modes of width
    WIDTH, having as many components as necessary.  */
-#define VECTOR_MODES(C, W) make_vector_modes (MODE_##C, W, __FILE__, __LINE__)
+#define VECTOR_MODES_WITH_PREFIX(PREFIX, C, W) \
+  make_vector_modes (MODE_##C, #PREFIX, W, __FILE__, __LINE__)
+#define VECTOR_MODES(C, W) VECTOR_MODES_WITH_PREFIX (V, C, W)
 static void ATTRIBUTE_UNUSED
-make_vector_modes (enum mode_class cl, unsigned int width,
+make_vector_modes (enum mode_class cl, const char *prefix, unsigned int width,
                   const char *file, unsigned int line)
 {
   struct mode_data *m;
@@ -516,8 +518,8 @@ make_vector_modes (enum mode_class cl, u
       if (cl == MODE_INT && m->precision == 1)
        continue;
 
-      if ((size_t)snprintf (buf, sizeof buf, "V%u%s", ncomponents, m->name)
-         >= sizeof buf)
+      if ((size_t) snprintf (buf, sizeof buf, "%s%u%s", prefix,
+                            ncomponents, m->name) >= sizeof buf)
        {
          error ("%s:%d: mode name \"%s\" is too long",
                 m->file, m->line, m->name);

Reply via email to