]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
*** empty log message ***
authorRichard Kenner <kenner@gcc.gnu.org>
Sat, 4 Jan 1992 22:39:21 +0000 (17:39 -0500)
committerRichard Kenner <kenner@gcc.gnu.org>
Sat, 4 Jan 1992 22:39:21 +0000 (17:39 -0500)
From-SVN: r163

gcc/machmode.h
gcc/rtl.c

index c61a23fc2cec3fae647a98a4d77d100cdb46a50c..4f88de0f8597e3011710090a1ecdbfddabf58d96 100644 (file)
@@ -59,7 +59,7 @@ extern char *mode_name[];
 #define GET_MODE_NAME(MODE)            (mode_name[(int)(MODE)])
 
 enum mode_class { MODE_RANDOM, MODE_INT, MODE_FLOAT, MODE_PARTIAL_INT, MODE_CC,
-                 MODE_COMPLEX_INT, MODE_COMPLEX_FLOAT };
+                 MODE_COMPLEX_INT, MODE_COMPLEX_FLOAT, MAX_MODE_CLASS};
 
 /* Get the general kind of object that mode MODE represents
    (integer, floating, complex, etc.)  */
@@ -108,4 +108,15 @@ extern enum machine_mode get_best_mode ();
   MIN (BIGGEST_ALIGNMENT,         \
        MAX (1, (GET_MODE_UNIT_SIZE (MODE) * BITS_PER_UNIT)))
 
+/* For each class, get the narrowest mode in that class.  */
+
+extern enum machine_mode class_narrowest_mode[];
+#define GET_CLASS_NARROWEST_MODE(CLASS) class_narrowest_mode[(int)(CLASS)]
+
+/* Define the integer modes whose sizes are BITS_PER_UNIT
+   and BITS_PER_WORD.  */
+
+extern enum machine_mode byte_mode;
+extern enum machine_mode word_mode;
+
 #endif /* not HAVE_MACHINE_MODES */
index 71961d0d1f7d87fc507068e7433c4f1911a835cf..8b8a1372994965044d7418af4af72065a8457f74 100644 (file)
--- a/gcc/rtl.c
+++ b/gcc/rtl.c
@@ -117,6 +117,15 @@ enum machine_mode mode_wider_mode[(int) MAX_MACHINE_MODE] = {
 
 #undef DEF_MACHMODE
 
+/* Indexed by mode class, gives the narrowest mode for each class.  */
+
+enum machine_mode class_narrowest_mode[(int) MAX_MODE_CLASS];
+
+/* Commonly used modes.  */
+
+enum machine_mode byte_mode;   /* Mode whose width is BITS_PER_UNIT */
+enum machine_mode word_mode;   /* Mode whose width is BITS_PER_WORD */
+
 /* Indexed by rtx code, gives a sequence of operand-types for
    rtx's of that code.  The sequence is a C string in which
    each charcter describes one operand.  */
@@ -774,11 +783,14 @@ read_rtx (infile)
 }
 \f
 /* This is called once per compilation, before any rtx's are constructed.
-   It initializes the vector `rtx_length' and the extra CC modes, if any.  */
+   It initializes the vector `rtx_length', the extra CC modes, if any,
+   and computes certain commonly-used modes.  */
 
 void
 init_rtl ()
 {
+  int min_class_size[(int) MAX_MODE_CLASS];
+  enum machine_mode mode;
   int i;
 
   for (i = 0; i < NUM_RTX_CODE; i++)
@@ -816,4 +828,27 @@ init_rtl ()
       mode_wider_mode[i] = VOIDmode;
     }
 #endif
+
+  /* Find the narrowest mode for each class and compute the word and byte
+     modes.  */
+
+  for (i = 0; i < (int) MAX_MODE_CLASS; i++)
+    min_class_size[i] = 1000;
+
+  for (mode = VOIDmode; (int) mode < (int) MAX_MACHINE_MODE;
+       mode = (enum machine_mode) ((int) mode + 1))
+    {
+      if (GET_MODE_SIZE (mode) < min_class_size[(int) GET_MODE_CLASS (mode)])
+       {
+         class_narrowest_mode[(int) GET_MODE_CLASS (mode)] = mode;
+         min_class_size[(int) GET_MODE_CLASS (mode)] = GET_MODE_SIZE (mode);
+       }
+      if (GET_MODE_CLASS (mode) == MODE_INT
+         && GET_MODE_BITSIZE (mode) == BITS_PER_UNIT)
+       byte_mode = mode;
+
+      if (GET_MODE_CLASS (mode) == MODE_INT
+         && GET_MODE_BITSIZE (mode) == BITS_PER_WORD)
+       word_mode = mode;
+    }
 }