diff options
author | Richard Sandiford <richard.sandiford@linaro.org> | 2017-12-16 14:26:43 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2017-12-16 14:26:43 +0000 |
commit | b4d43553e9353de4fefb3a1fde1277eeb1bad7be (patch) | |
tree | 9ffc3f135f0fea7660029282f6928e0c8b706973 /gcc | |
parent | b4ddce3663ce151423f81c9e2a206df3081d1071 (diff) | |
download | gcc-b4d43553e9353de4fefb3a1fde1277eeb1bad7be.zip gcc-b4d43553e9353de4fefb3a1fde1277eeb1bad7be.tar.gz gcc-b4d43553e9353de4fefb3a1fde1277eeb1bad7be.tar.bz2 |
poly_int: mode query functions
This patch changes the bit size and vector count arguments to the
machmode.h functions from unsigned int to poly_uint64.
2017-12-16 Richard Sandiford <richard.sandiford@linaro.org>
Alan Hayward <alan.hayward@arm.com>
David Sherwood <david.sherwood@arm.com>
gcc/
* machmode.h (mode_for_size, int_mode_for_size, float_mode_for_size)
(smallest_mode_for_size, smallest_int_mode_for_size): Take the mode
size as a poly_uint64.
(mode_for_vector, mode_for_int_vector): Take the number of vector
elements as a poly_uint64.
* stor-layout.c (mode_for_size, smallest_mode_for_size): Take the mode
size as a poly_uint64.
(mode_for_vector, mode_for_int_vector): Take the number of vector
elements as a poly_uint64.
Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
Co-Authored-By: David Sherwood <david.sherwood@arm.com>
From-SVN: r255747
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 14 | ||||
-rw-r--r-- | gcc/machmode.h | 14 | ||||
-rw-r--r-- | gcc/stor-layout.c | 29 |
3 files changed, 35 insertions, 22 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 98f02e8..8124e61 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -2,6 +2,20 @@ Alan Hayward <alan.hayward@arm.com> David Sherwood <david.sherwood@arm.com> + * machmode.h (mode_for_size, int_mode_for_size, float_mode_for_size) + (smallest_mode_for_size, smallest_int_mode_for_size): Take the mode + size as a poly_uint64. + (mode_for_vector, mode_for_int_vector): Take the number of vector + elements as a poly_uint64. + * stor-layout.c (mode_for_size, smallest_mode_for_size): Take the mode + size as a poly_uint64. + (mode_for_vector, mode_for_int_vector): Take the number of vector + elements as a poly_uint64. + +2017-12-16 Richard Sandiford <richard.sandiford@linaro.org> + Alan Hayward <alan.hayward@arm.com> + David Sherwood <david.sherwood@arm.com> + * machmode.h (MACRO_MODE): New macro. * addresses.h (base_reg_class, ok_for_base_p_1): Use it. * targhooks.c (default_libcall_value, default_secondary_reload) diff --git a/gcc/machmode.h b/gcc/machmode.h index 0c5c01c..02a41b2 100644 --- a/gcc/machmode.h +++ b/gcc/machmode.h @@ -696,14 +696,14 @@ fixed_size_mode::includes_p (machine_mode) #define MACRO_MODE(MODE) (MODE) #endif -extern opt_machine_mode mode_for_size (unsigned int, enum mode_class, int); +extern opt_machine_mode mode_for_size (poly_uint64, enum mode_class, int); /* Return the machine mode to use for a MODE_INT of SIZE bits, if one exists. If LIMIT is nonzero, modes wider than MAX_FIXED_MODE_SIZE will not be used. */ inline opt_scalar_int_mode -int_mode_for_size (unsigned int size, int limit) +int_mode_for_size (poly_uint64 size, int limit) { return dyn_cast <scalar_int_mode> (mode_for_size (size, MODE_INT, limit)); } @@ -712,7 +712,7 @@ int_mode_for_size (unsigned int size, int limit) exists. */ inline opt_scalar_float_mode -float_mode_for_size (unsigned int size) +float_mode_for_size (poly_uint64 size) { return dyn_cast <scalar_float_mode> (mode_for_size (size, MODE_FLOAT, 0)); } @@ -726,21 +726,21 @@ decimal_float_mode_for_size (unsigned int size) (mode_for_size (size, MODE_DECIMAL_FLOAT, 0)); } -extern machine_mode smallest_mode_for_size (unsigned int, enum mode_class); +extern machine_mode smallest_mode_for_size (poly_uint64, enum mode_class); /* Find the narrowest integer mode that contains at least SIZE bits. Such a mode must exist. */ inline scalar_int_mode -smallest_int_mode_for_size (unsigned int size) +smallest_int_mode_for_size (poly_uint64 size) { return as_a <scalar_int_mode> (smallest_mode_for_size (size, MODE_INT)); } extern opt_scalar_int_mode int_mode_for_mode (machine_mode); extern opt_machine_mode bitwise_mode_for_mode (machine_mode); -extern opt_machine_mode mode_for_vector (scalar_mode, unsigned); -extern opt_machine_mode mode_for_int_vector (unsigned int, unsigned int); +extern opt_machine_mode mode_for_vector (scalar_mode, poly_uint64); +extern opt_machine_mode mode_for_int_vector (unsigned int, poly_uint64); /* Return the integer vector equivalent of MODE, if one exists. In other words, return the mode for an integer vector that has the same number diff --git a/gcc/stor-layout.c b/gcc/stor-layout.c index 1eef578..6706219 100644 --- a/gcc/stor-layout.c +++ b/gcc/stor-layout.c @@ -298,22 +298,22 @@ finalize_size_functions (void) MAX_FIXED_MODE_SIZE. */ opt_machine_mode -mode_for_size (unsigned int size, enum mode_class mclass, int limit) +mode_for_size (poly_uint64 size, enum mode_class mclass, int limit) { machine_mode mode; int i; - if (limit && size > MAX_FIXED_MODE_SIZE) + if (limit && maybe_gt (size, (unsigned int) MAX_FIXED_MODE_SIZE)) return opt_machine_mode (); /* Get the first mode which has this size, in the specified class. */ FOR_EACH_MODE_IN_CLASS (mode, mclass) - if (GET_MODE_PRECISION (mode) == size) + if (known_eq (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 + if (known_eq (int_n_data[i].bitsize, size) && int_n_enabled_p[i]) return int_n_data[i].m; @@ -341,7 +341,7 @@ mode_for_size_tree (const_tree size, enum mode_class mclass, int limit) SIZE bits. Abort if no such mode exists. */ machine_mode -smallest_mode_for_size (unsigned int size, enum mode_class mclass) +smallest_mode_for_size (poly_uint64 size, enum mode_class mclass) { machine_mode mode = VOIDmode; int i; @@ -349,19 +349,18 @@ smallest_mode_for_size (unsigned int size, enum mode_class mclass) /* Get the first mode which has at least this size, in the specified class. */ FOR_EACH_MODE_IN_CLASS (mode, mclass) - if (GET_MODE_PRECISION (mode) >= size) + if (known_ge (GET_MODE_PRECISION (mode), size)) break; + gcc_assert (mode != VOIDmode); + 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) + if (known_ge (int_n_data[i].bitsize, size) + && known_lt (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; } @@ -476,7 +475,7 @@ bitwise_type_for_mode (machine_mode mode) either an integer mode or a vector mode. */ opt_machine_mode -mode_for_vector (scalar_mode innermode, unsigned nunits) +mode_for_vector (scalar_mode innermode, poly_uint64 nunits) { machine_mode mode; @@ -497,14 +496,14 @@ mode_for_vector (scalar_mode innermode, unsigned nunits) /* Do not check vector_mode_supported_p here. We'll do that later in vector_type_mode. */ FOR_EACH_MODE_FROM (mode, mode) - if (GET_MODE_NUNITS (mode) == nunits + if (known_eq (GET_MODE_NUNITS (mode), nunits) && GET_MODE_INNER (mode) == innermode) return mode; /* For integers, try mapping it to a same-sized scalar mode. */ if (GET_MODE_CLASS (innermode) == MODE_INT) { - unsigned int nbits = nunits * GET_MODE_BITSIZE (innermode); + poly_uint64 nbits = nunits * GET_MODE_BITSIZE (innermode); if (int_mode_for_size (nbits, 0).exists (&mode) && have_regs_of_mode[mode]) return mode; @@ -518,7 +517,7 @@ mode_for_vector (scalar_mode innermode, unsigned nunits) an integer mode or a vector mode. */ opt_machine_mode -mode_for_int_vector (unsigned int int_bits, unsigned int nunits) +mode_for_int_vector (unsigned int int_bits, poly_uint64 nunits) { scalar_int_mode int_mode; machine_mode vec_mode; |