This patch changes the bit size and vector count arguments to the machmode.h functions from unsigned int to poly_uint64.
2017-10-23 Richard Sandiford <richard.sandif...@linaro.org> Alan Hayward <alan.hayw...@arm.com> David Sherwood <david.sherw...@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. Index: gcc/machmode.h =================================================================== --- gcc/machmode.h 2017-10-23 17:00:49.664349224 +0100 +++ gcc/machmode.h 2017-10-23 17:00:52.669615373 +0100 @@ -696,14 +696,14 @@ #define MACRO_MODE(MODE) (as_a <fixed_si #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, in 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 in (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 Index: gcc/stor-layout.c =================================================================== --- gcc/stor-layout.c 2017-10-23 16:52:20.627879504 +0100 +++ gcc/stor-layout.c 2017-10-23 17:00:52.669615373 +0100 @@ -297,22 +297,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 && may_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 (must_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 (must_eq (int_n_data[i].bitsize, size) && int_n_enabled_p[i]) return int_n_data[i].m; @@ -340,7 +340,7 @@ mode_for_size_tree (const_tree size, enu 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; @@ -348,19 +348,18 @@ smallest_mode_for_size (unsigned int siz /* 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 (must_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 (must_ge (int_n_data[i].bitsize, size) + && must_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; } @@ -475,7 +474,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; @@ -496,14 +495,14 @@ mode_for_vector (scalar_mode innermode, /* 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 (must_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; @@ -517,7 +516,7 @@ mode_for_vector (scalar_mode innermode, 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;