diff options
Diffstat (limited to 'gcc/stor-layout.c')
-rw-r--r-- | gcc/stor-layout.c | 43 |
1 files changed, 39 insertions, 4 deletions
diff --git a/gcc/stor-layout.c b/gcc/stor-layout.c index eefc52a..c7b524c 100644 --- a/gcc/stor-layout.c +++ b/gcc/stor-layout.c @@ -313,6 +313,7 @@ enum machine_mode mode_for_size (unsigned int size, enum mode_class mclass, int limit) { enum machine_mode mode; + int i; if (limit && size > MAX_FIXED_MODE_SIZE) return BLKmode; @@ -323,6 +324,12 @@ mode_for_size (unsigned int size, enum mode_class mclass, int limit) if (GET_MODE_PRECISION (mode) == size) return mode; + if (mclass == MODE_INT || mclass == MODE_PARTIAL_INT) + for (i = 0; i < NUM_INT_N_ENTS; i ++) + if (int_n_data[i].bitsize == size + && int_n_enabled_p[i]) + return int_n_data[i].m; + return BLKmode; } @@ -349,16 +356,27 @@ mode_for_size_tree (const_tree size, enum mode_class mclass, int limit) enum machine_mode smallest_mode_for_size (unsigned int size, enum mode_class mclass) { - enum machine_mode mode; + enum machine_mode mode = VOIDmode; + int i; /* Get the first mode which has at least this size, in the specified class. */ for (mode = GET_CLASS_NARROWEST_MODE (mclass); mode != VOIDmode; mode = GET_MODE_WIDER_MODE (mode)) if (GET_MODE_PRECISION (mode) >= size) - return mode; + break; - gcc_unreachable (); + if (mclass == MODE_INT || mclass == MODE_PARTIAL_INT) + for (i = 0; i < NUM_INT_N_ENTS; i ++) + if (int_n_data[i].bitsize >= size + && int_n_data[i].bitsize < GET_MODE_PRECISION (mode) + && int_n_enabled_p[i]) + mode = int_n_data[i].m; + + if (mode == VOIDmode) + gcc_unreachable (); + + return mode; } /* Find an integer mode of the exact same size, or BLKmode on failure. */ @@ -2550,7 +2568,24 @@ initialize_sizetypes (void) else if (strcmp (SIZETYPE, "short unsigned int") == 0) precision = SHORT_TYPE_SIZE; else - gcc_unreachable (); + { + int i; + + precision = -1; + for (i = 0; i < NUM_INT_N_ENTS; i++) + if (int_n_enabled_p[i]) + { + char name[50]; + sprintf (name, "__int%d unsigned", int_n_data[i].bitsize); + + if (strcmp (name, SIZETYPE) == 0) + { + precision = int_n_data[i].bitsize; + } + } + if (precision == -1) + gcc_unreachable (); + } bprecision = MIN (precision + BITS_PER_UNIT_LOG + 1, MAX_FIXED_MODE_SIZE); |