This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


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.

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

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]