From b4d43553e9353de4fefb3a1fde1277eeb1bad7be Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Sat, 16 Dec 2017 14:26:43 +0000 Subject: [PATCH] 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 Alan Hayward David Sherwood 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 Co-Authored-By: David Sherwood From-SVN: r255747 --- gcc/ChangeLog | 14 ++++++++++++++ gcc/machmode.h | 14 +++++++------- gcc/stor-layout.c | 29 ++++++++++++++--------------- 3 files changed, 35 insertions(+), 22 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 98f02e8bf08..8124e615496 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,17 @@ +2017-12-16 Richard Sandiford + Alan Hayward + David Sherwood + + * 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 Alan Hayward David Sherwood diff --git a/gcc/machmode.h b/gcc/machmode.h index 0c5c01c0a6e..02a41b25c4c 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 (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 (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 (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 1eef5781aa5..67062194d2c 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; -- 2.30.2