Allow the target to set MAX_BITSIZE_MODE_ANY_MODE
authorRichard Sandiford <richard.sandiford@linaro.org>
Wed, 3 Jan 2018 21:44:14 +0000 (21:44 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Wed, 3 Jan 2018 21:44:14 +0000 (21:44 +0000)
The default value of MAX_BITSIZE_MODE_ANY_MODE is calculated
from the initial mode sizes specified in the modes.def file.
The target needs to be able to override it if ADJUST_BYTESIZE
& co. can choose a bigger size.

2018-01-03  Richard Sandiford  <richard.sandiford@linaro.org>

gcc/
* doc/rtl.texi (MAX_BITSIZE_MODE_ANY_MODE): Describe how the default
is calculated and how it can be overridden.
* genmodes.c (max_bitsize_mode_any_mode): New variable.
(create_modes): Initialize it from MAX_BITSIZE_MODE_ANY_MODE,
if defined.
(emit_max_int): Use it to set the output MAX_BITSIZE_MODE_ANY_MODE,
if nonzero.

From-SVN: r256206

gcc/ChangeLog
gcc/doc/rtl.texi
gcc/genmodes.c

index 9437ae9fd6c35b1088eaf736a8c2e3c399d37f62..afc18a8d2ce3c25b456ab6bca8b574517fa843cd 100644 (file)
@@ -1,3 +1,13 @@
+2018-01-03  Richard Sandiford  <richard.sandiford@linaro.org>
+
+       * doc/rtl.texi (MAX_BITSIZE_MODE_ANY_MODE): Describe how the default
+       is calculated and how it can be overridden.
+       * genmodes.c (max_bitsize_mode_any_mode): New variable.
+       (create_modes): Initialize it from MAX_BITSIZE_MODE_ANY_MODE,
+       if defined.
+       (emit_max_int): Use it to set the output MAX_BITSIZE_MODE_ANY_MODE,
+       if nonzero.
+
 2018-01-03  Richard Sandiford  <richard.sandiford@linaro.org>
            Alan Hayward  <alan.hayward@arm.com>
            David Sherwood  <david.sherwood@arm.com>
index 92ea39365f95befc274aa41abcecce159b119ce5..7b2d0bf21606fc7a88c1750eba67c0b2bb203885 100644 (file)
@@ -1509,7 +1509,12 @@ compute integer values.
 
 @findex MAX_BITSIZE_MODE_ANY_MODE
 @item MAX_BITSIZE_MODE_ANY_MODE
-The bitsize of the largest mode on the target.   
+The bitsize of the largest mode on the target.  The default value is
+the largest mode size given in the mode definition file, which is
+always correct for targets whose modes have a fixed size.  Targets
+that might increase the size of a mode beyond this default should define
+@code{MAX_BITSIZE_MODE_ANY_MODE} to the actual upper limit in
+@file{@var{machine}-modes.def}.
 @end table
 
 @findex byte_mode
index c0964345a939823bfe15cb32bd85191685bc2a8b..a70f0967859b13a349c83086cde4527d2a3648e9 100644 (file)
@@ -792,6 +792,7 @@ make_vector_mode (enum mode_class bclass,
 
 static int bits_per_unit;
 static int max_bitsize_mode_any_int;
+static int max_bitsize_mode_any_mode;
 
 static void
 create_modes (void)
@@ -811,6 +812,12 @@ create_modes (void)
 #else
   max_bitsize_mode_any_int = 0;
 #endif
+
+#ifdef MAX_BITSIZE_MODE_ANY_MODE
+  max_bitsize_mode_any_mode = MAX_BITSIZE_MODE_ANY_MODE;
+#else
+  max_bitsize_mode_any_mode = 0;
+#endif
 }
 
 #ifndef NUM_POLY_INT_COEFFS
@@ -989,12 +996,18 @@ emit_max_int (void)
   else
     printf ("#define MAX_BITSIZE_MODE_ANY_INT %d\n", max_bitsize_mode_any_int);
 
-  mmax = 0;
-  for (j = 0; j < MAX_MODE_CLASS; j++)
-    for (i = modes[j]; i; i = i->next)
-      if (mmax < i->bytesize)
-       mmax = i->bytesize;
-  printf ("#define MAX_BITSIZE_MODE_ANY_MODE (%d*BITS_PER_UNIT)\n", mmax);
+  if (max_bitsize_mode_any_mode == 0)
+    {
+      mmax = 0;
+      for (j = 0; j < MAX_MODE_CLASS; j++)
+       for (i = modes[j]; i; i = i->next)
+         if (mmax < i->bytesize)
+           mmax = i->bytesize;
+      printf ("#define MAX_BITSIZE_MODE_ANY_MODE (%d*BITS_PER_UNIT)\n", mmax);
+    }
+  else
+    printf ("#define MAX_BITSIZE_MODE_ANY_MODE %d\n",
+           max_bitsize_mode_any_mode);
 }
 
 /* Emit mode_size_inline routine into insn-modes.h header.  */