diff options
-rw-r--r-- | gcc/machmode.h | 13 | ||||
-rw-r--r-- | gcc/rtl.c | 37 |
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 */ @@ -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; + } } |