aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/machmode.h13
-rw-r--r--gcc/rtl.c37
2 files changed, 48 insertions, 2 deletions
diff --git a/gcc/machmode.h b/gcc/machmode.h
index c61a23f..4f88de0 100644
--- a/gcc/machmode.h
+++ b/gcc/machmode.h
@@ -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 */
diff --git a/gcc/rtl.c b/gcc/rtl.c
index 71961d0..8b8a137 100644
--- 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)
}
/* 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;
+ }
}