diff mbox

[trunk] : Patch to move BITS_PER_UNIT to be available for genmodes.c

Message ID 52AB38B0.3010205@naturalbridge.com
State New
Headers show

Commit Message

Kenneth Zadeck Dec. 13, 2013, 4:41 p.m. UTC
committed as revision 205964 with updated comment.

kenny

2013-12-13  Kenneth Zadeck  <zadeck@naturalbridge.com>

     * config/arc/arc.h (BITS_PER_UNIT): Removed.
     * config/bfin/bfin.h (BITS_PER_UNIT): Removed.
     * config/lm32/lm32.h (BITS_PER_UNIT): Removed.
     * config/m32c/m32c.h (BITS_PER_UNIT): Removed.
     * config/microblaze/microblaze.h (BITS_PER_UNIT): Removed.
     * config/picochip/picochip.h (BITS_PER_UNIT): Removed.
     * config/spu/spu.h (BITS_PER_UNIT): Removed.
     * defaults.h (BITS_PER_UNIT): Removed.
     * config/i386/i386-modes.def (MAX_BITSIZE_MODE_ANY_INT): New.
     * doc/rtl (BITS_PER_UNIT): Moved from tm.texi.
     (MAX_BITSIZE_MODE_ANY_INT): Updated.
     * doc/tm.texi (BITS_PER_UNIT): Removed.
     * doc/tm.texi.in (BITS_PER_UNIT): Removed.
     * genmodes.c (bits_per_unit, max_bitsize_mode_any_int): New.
     (create_modes): Added code to set bits_per_unit and
     max_bitsize_mode_any_int.
     (emit_max_int): Changed code generation.
     * mkconfig.sh: Added insn-modes.h.


On 12/13/2013 06:11 AM, Richard Biener wrote:
> On Fri, 13 Dec 2013, Uros Bizjak wrote:
>
>> Hello!
>>
>>> In addition, this target also changes the way that MAX_BITSIZE_MODE_ANY_INT is calculated.
>>> The value is heavily used on the wide-int branch to allocate buffers that are used to hold large
>>> integer values. The change in the way it is computed was motivated by the i386 port, but there
>>> may be other ports that have the same problem. The i386 port defines two very large integer
>>> modes that are only used as containers for large vectors. They are never used for large integers.
>>> The new way of computing this allows a port to say (very early) that some of these integer modes
>>> are never used to hold numbers and so smaller buffers can be used for integer calculations. Other
>>> ports that play the same game should follow suit.
>> Index: gcc/config/i386/i386-modes.def
>> ===================================================================
>> --- gcc/config/i386/i386-modes.def (revision 205895)
>> +++ gcc/config/i386/i386-modes.def (working copy)
>> @@ -90,5 +90,10 @@ VECTOR_MODE (INT, QI, 2);     /*
>>   INT_MODE (OI, 32);
>>   INT_MODE (XI, 64);
>>
>> +/* Keep the OI and XI modes from confusing the compiler into thinking
>> +   that these modes could actually be used for computation.  They are
>> +   only holders for vectors during data movement.  */
>> +#define MAX_BITSIZE_MODE_ANY_INT (128)
>> +
>>   /* The symbol Pmode stands for one of the above machine modes (usually SImode).
>>      The tm.h file specifies which one.  It is not a distinct mode.  */
>>
>> __int128 is avaialble only for x86_64 - 64bit targets, so:
>>
>> #define MAX_BITSIZE_MODE_ANY_INT (TARGET_64BIT ? 128 : 64)
> It needs to be a compile-time constant.
>
> Richard.
diff mbox

Patch

Index: gcc/ChangeLog
===================================================================
--- gcc/ChangeLog	(revision 205962)
+++ gcc/ChangeLog	(working copy)
@@ -1,3 +1,24 @@ 
+2013-12-13  Kenneth Zadeck  <zadeck@naturalbridge.com>
+
+	* config/arc/arc.h (BITS_PER_UNIT): Removed.
+	* config/bfin/bfin.h (BITS_PER_UNIT): Removed.
+	* config/lm32/lm32.h (BITS_PER_UNIT): Removed.
+	* config/m32c/m32c.h (BITS_PER_UNIT): Removed.
+	* config/microblaze/microblaze.h (BITS_PER_UNIT): Removed.
+	* config/picochip/picochip.h (BITS_PER_UNIT): Removed.
+	* config/spu/spu.h (BITS_PER_UNIT): Removed.
+	* defaults.h (BITS_PER_UNIT): Removed.
+	* config/i386/i386-modes.def (MAX_BITSIZE_MODE_ANY_INT): New.
+	* doc/rtl (BITS_PER_UNIT): Moved from tm.texi.
+	(MAX_BITSIZE_MODE_ANY_INT): Updated.
+	* doc/tm.texi (BITS_PER_UNIT): Removed.
+	* doc/tm.texi.in (BITS_PER_UNIT): Removed.
+	* genmodes.c (bits_per_unit, max_bitsize_mode_any_int): New.
+	(create_modes): Added code to set bits_per_unit and
+	max_bitsize_mode_any_int.
+	(emit_max_int): Changed code generation.
+	* mkconfig.sh: Added insn-modes.h.
+
 2013-12-13  Yuri Rumyantsev  <ysrumyan@gmail.com>
 
 	* config/i386/i386.c (slm_cost): Fix imul cost for HI.
Index: gcc/config/arc/arc.h
===================================================================
--- gcc/config/arc/arc.h	(revision 205962)
+++ gcc/config/arc/arc.h	(working copy)
@@ -303,9 +303,6 @@  along with GCC; see the file COPYING3.
    numbered.  */
 #define WORDS_BIG_ENDIAN (TARGET_BIG_ENDIAN)
 
-/* Number of bits in an addressable storage unit.  */
-#define BITS_PER_UNIT 8
-
 /* Width in bits of a "word", which is the contents of a machine register.
    Note that this is not necessarily the width of data type `int';
    if using 16-bit ints on a 68000, this would still be 32.
Index: gcc/config/bfin/bfin.h
===================================================================
--- gcc/config/bfin/bfin.h	(revision 205962)
+++ gcc/config/bfin/bfin.h	(working copy)
@@ -859,9 +859,6 @@  typedef struct {
 /* Define this if most significant word of a multiword number is numbered. */
 #define WORDS_BIG_ENDIAN 0
 
-/* number of bits in an addressable storage unit */
-#define BITS_PER_UNIT 8
-
 /* Width in bits of a "word", which is the contents of a machine register.
    Note that this is not necessarily the width of data type `int';
    if using 16-bit ints on a 68000, this would still be 32.
Index: gcc/config/i386/i386-modes.def
===================================================================
--- gcc/config/i386/i386-modes.def	(revision 205962)
+++ gcc/config/i386/i386-modes.def	(working copy)
@@ -90,5 +90,10 @@  VECTOR_MODE (INT, QI, 2);     /*
 INT_MODE (OI, 32);
 INT_MODE (XI, 64);
 
+/* Keep the OI and XI modes from confusing the compiler into thinking
+   that these modes could actually be used for computation.  They are
+   only holders for vectors during data movement.  */
+#define MAX_BITSIZE_MODE_ANY_INT (128)
+
 /* The symbol Pmode stands for one of the above machine modes (usually SImode).
    The tm.h file specifies which one.  It is not a distinct mode.  */
Index: gcc/config/lm32/lm32.h
===================================================================
--- gcc/config/lm32/lm32.h	(revision 205962)
+++ gcc/config/lm32/lm32.h	(working copy)
@@ -73,7 +73,6 @@ 
 #define BYTES_BIG_ENDIAN 1
 #define WORDS_BIG_ENDIAN 1
 
-#define BITS_PER_UNIT 8
 #define BITS_PER_WORD 32
 #define UNITS_PER_WORD 4
 
Index: gcc/config/m32c/m32c.h
===================================================================
--- gcc/config/m32c/m32c.h	(revision 205962)
+++ gcc/config/m32c/m32c.h	(working copy)
@@ -140,7 +140,6 @@  machine_function;
    matches "int".  Pointers are 16 bits for R8C/M16C (when TARGET_A16
    is true) and 24 bits for M32CM/M32C (when TARGET_A24 is true), but
    24-bit pointers are stored in 32-bit words.  */
-#define BITS_PER_UNIT 8
 #define UNITS_PER_WORD 2
 #define POINTER_SIZE (TARGET_A16 ? 16 : 32)
 #define POINTERS_EXTEND_UNSIGNED 1
Index: gcc/config/microblaze/microblaze.h
===================================================================
--- gcc/config/microblaze/microblaze.h	(revision 205962)
+++ gcc/config/microblaze/microblaze.h	(working copy)
@@ -193,7 +193,6 @@  extern enum pipeline_type microblaze_pip
 #define BITS_BIG_ENDIAN 0
 #define BYTES_BIG_ENDIAN (TARGET_LITTLE_ENDIAN == 0)
 #define WORDS_BIG_ENDIAN (BYTES_BIG_ENDIAN)
-#define BITS_PER_UNIT           8
 #define BITS_PER_WORD           32
 #define UNITS_PER_WORD          4
 #define MIN_UNITS_PER_WORD      4
Index: gcc/config/picochip/picochip.h
===================================================================
--- gcc/config/picochip/picochip.h	(revision 205962)
+++ gcc/config/picochip/picochip.h	(working copy)
@@ -92,8 +92,6 @@  extern enum picochip_dfa_type picochip_s
 #define BYTES_BIG_ENDIAN 0
 #define WORDS_BIG_ENDIAN 0
 
-#define BITS_PER_UNIT 8
-
 #define BITS_PER_WORD 16
 #define UNITS_PER_WORD (BITS_PER_WORD / BITS_PER_UNIT)
 
Index: gcc/config/spu/spu.h
===================================================================
--- gcc/config/spu/spu.h	(revision 205962)
+++ gcc/config/spu/spu.h	(working copy)
@@ -54,8 +54,6 @@  extern GTY(()) int spu_tune;
 
 #define WORDS_BIG_ENDIAN 1
 
-#define BITS_PER_UNIT 8
-
 /* GCC uses word_mode in many places, assuming that it is the fastest
    integer mode.  That is not the case for SPU though.  We can't use
    32 here because (of some reason I can't remember.) */
Index: gcc/defaults.h
===================================================================
--- gcc/defaults.h	(revision 205962)
+++ gcc/defaults.h	(working copy)
@@ -471,10 +471,6 @@  see the files COPYING3 and COPYING.RUNTI
    your target, you should override these values by defining the
    appropriate symbols in your tm.h file.  */
 
-#ifndef BITS_PER_UNIT
-#define BITS_PER_UNIT 8
-#endif
-
 #ifndef BITS_PER_WORD
 #define BITS_PER_WORD (BITS_PER_UNIT * UNITS_PER_WORD)
 #endif
Index: gcc/doc/rtl.texi
===================================================================
--- gcc/doc/rtl.texi	(revision 205962)
+++ gcc/doc/rtl.texi	(working copy)
@@ -1462,14 +1462,25 @@  Returns the number of units contained in
 Returns the narrowest mode in mode class @var{c}.
 @end table
 
-The following 4 variables are defined on every target.   They can be
+The following 3 variables are defined on every target.   They can be
 used to allocate buffers that are guaranteed to be large enough to
-hold any value that can be represented on the target.   
+hold any value that can be represented on the target.   The first two
+can be overridden by defining them in the target's mode.def file,
+however, the value must be a constant that can determined very early
+in the compilation process.   The third symbol cannot be overridden.
 
 @table @code
+@findex BITS_PER_UNIT
+@item BITS_PER_UNIT
+The number of bits in an addressable storage unit (byte).  If you do
+not define this, the default is 8.
+
 @findex MAX_BITSIZE_MODE_ANY_INT
 @item MAX_BITSIZE_MODE_ANY_INT
-The maximum of MAX_BITSIZE_MODE_INT and MAX_BITSIZE_MODE_PARTIAL_INT.
+The maximum bitsize of any mode that is used in integer math.  This
+should be overridden by the target if it uses large integers as
+containers for larger vectors but otherwise never uses the contents to
+compute integer values.
 
 @findex MAX_BITSIZE_MODE_ANY_MODE
 @item MAX_BITSIZE_MODE_ANY_MODE
Index: gcc/doc/tm.texi
===================================================================
--- gcc/doc/tm.texi	(revision 205962)
+++ gcc/doc/tm.texi	(working copy)
@@ -879,11 +879,6 @@  You need not define this macro if the or
 multi-word integers.
 @end defmac
 
-@defmac BITS_PER_UNIT
-Define this macro to be the number of bits in an addressable storage
-unit (byte).  If you do not define this macro the default is 8.
-@end defmac
-
 @defmac BITS_PER_WORD
 Number of bits in a word.  If you do not define this macro, the default
 is @code{BITS_PER_UNIT * UNITS_PER_WORD}.
Index: gcc/doc/tm.texi.in
===================================================================
--- gcc/doc/tm.texi.in	(revision 205962)
+++ gcc/doc/tm.texi.in	(working copy)
@@ -853,11 +853,6 @@  You need not define this macro if the or
 multi-word integers.
 @end defmac
 
-@defmac BITS_PER_UNIT
-Define this macro to be the number of bits in an addressable storage
-unit (byte).  If you do not define this macro the default is 8.
-@end defmac
-
 @defmac BITS_PER_WORD
 Number of bits in a word.  If you do not define this macro, the default
 is @code{BITS_PER_UNIT * UNITS_PER_WORD}.
Index: gcc/genmodes.c
===================================================================
--- gcc/genmodes.c	(revision 205962)
+++ gcc/genmodes.c	(working copy)
@@ -711,10 +711,27 @@  make_vector_mode (enum mode_class bclass
 #define ADJUST_IBIT(M, X)  _ADD_ADJUST (ibit, M, X, ACCUM, UACCUM)
 #define ADJUST_FBIT(M, X)  _ADD_ADJUST (fbit, M, X, FRACT, UACCUM)
 
+static int bits_per_unit;
+static int max_bitsize_mode_any_int;
+
 static void
 create_modes (void)
 {
 #include "machmode.def"
+
+  /* So put the default value unless the target needs a non standard
+     value. */
+#ifdef BITS_PER_UNIT
+  bits_per_unit = BITS_PER_UNIT;
+#else
+  bits_per_unit = 8;
+#endif
+
+#ifdef MAX_BITSIZE_MODE_ANY_INT
+  max_bitsize_mode_any_int = MAX_BITSIZE_MODE_ANY_INT;
+#else
+  max_bitsize_mode_any_int = 0;
+#endif
 }
 
 /* Processing.  */
@@ -860,16 +877,24 @@  emit_max_int (void)
   int j;
 
   puts ("");
-  for (max = 1, i = modes[MODE_INT]; i; i = i->next)
-    if (max < i->bytesize)
-	max = i->bytesize;
-  mmax = max;
-  for (max = 1, i = modes[MODE_PARTIAL_INT]; i; i = i->next)
-    if (max < i->bytesize)
-	max = i->bytesize;
-  if (max > mmax)
-    mmax = max;
-  printf ("#define MAX_BITSIZE_MODE_ANY_INT %d*BITS_PER_UNIT\n", mmax);
+
+  printf ("#define BITS_PER_UNIT (%d)\n", bits_per_unit); 
+ 
+  if (max_bitsize_mode_any_int == 0)
+    {
+      for (max = 1, i = modes[MODE_INT]; i; i = i->next)
+	if (max < i->bytesize)
+	  max = i->bytesize;
+      mmax = max;
+      for (max = 1, i = modes[MODE_PARTIAL_INT]; i; i = i->next)
+	if (max < i->bytesize)
+	  max = i->bytesize;
+      if (max > mmax)
+	mmax = max;
+      printf ("#define MAX_BITSIZE_MODE_ANY_INT %d*BITS_PER_UNIT\n", mmax);
+    }
+  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++)
Index: gcc/mkconfig.sh
===================================================================
--- gcc/mkconfig.sh	(revision 205962)
+++ gcc/mkconfig.sh	(working copy)
@@ -97,6 +97,9 @@  case $output in
 #if defined IN_GCC && !defined GENERATOR_FILE && !defined USED_FOR_TARGET
 # include "insn-flags.h"
 #endif
+#if defined IN_GCC && !defined GENERATOR_FILE
+# include "insn-modes.h"
+#endif
 EOF
     ;;
 esac