diff options
-rw-r--r-- | gcc/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/coretypes.h | 1 | ||||
-rw-r--r-- | gcc/emit-rtl.c | 5 | ||||
-rw-r--r-- | gcc/gdbhooks.py | 2 | ||||
-rw-r--r-- | gcc/machmode.h | 11 | ||||
-rw-r--r-- | gcc/stor-layout.c | 19 |
6 files changed, 37 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5241db9..8b74bc7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -2,6 +2,17 @@ Alan Hayward <alan.hayward@arm.com> David Sherwood <david.sherwood@arm.com> + * coretypes.h (opt_scalar_float_mode): New typedef. + * machmode.h (float_mode_for_size): New function. + * emit-rtl.c (double_mode): Delete. + (init_emit_once): Use float_mode_for_size. + * stor-layout.c (layout_type): Likewise. + * gdbhooks.py (build_pretty_printer): Handle opt_scalar_float_mode. + +2017-08-30 Richard Sandiford <richard.sandiford@linaro.org> + Alan Hayward <alan.hayward@arm.com> + David Sherwood <david.sherwood@arm.com> + * output.h (assemble_real): Take a scalar_float_mode. * config/arm/arm.c (arm_assemble_integer): Update accordingly. * config/arm/arm.md (consttable_4): Likewise. diff --git a/gcc/coretypes.h b/gcc/coretypes.h index 216c29f..6313467 100644 --- a/gcc/coretypes.h +++ b/gcc/coretypes.h @@ -57,6 +57,7 @@ typedef struct rtx_def *rtx; typedef const struct rtx_def *const_rtx; class scalar_float_mode; template<typename> class opt_mode; +typedef opt_mode<scalar_float_mode> opt_scalar_float_mode; /* Subclasses of rtx_def, using indentation to show the class hierarchy, along with the relevant invariant. diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c index 3856ac0..eaae009 100644 --- a/gcc/emit-rtl.c +++ b/gcc/emit-rtl.c @@ -72,7 +72,6 @@ struct target_rtl *this_target_rtl = &default_target_rtl; machine_mode byte_mode; /* Mode whose width is BITS_PER_UNIT. */ machine_mode word_mode; /* Mode whose width is BITS_PER_WORD. */ -machine_mode double_mode; /* Mode whose width is DOUBLE_TYPE_SIZE. */ machine_mode ptr_mode; /* Mode whose width is POINTER_SIZE. */ /* Datastructures maintained for currently processed function in RTL form. */ @@ -5889,7 +5888,7 @@ init_emit_once (void) { int i; machine_mode mode; - machine_mode double_mode; + scalar_float_mode double_mode; /* Initialize the CONST_INT, CONST_WIDE_INT, CONST_DOUBLE, CONST_FIXED, and memory attribute hash tables. */ @@ -5933,7 +5932,7 @@ init_emit_once (void) else const_true_rtx = gen_rtx_CONST_INT (VOIDmode, STORE_FLAG_VALUE); - double_mode = mode_for_size (DOUBLE_TYPE_SIZE, MODE_FLOAT, 0); + double_mode = float_mode_for_size (DOUBLE_TYPE_SIZE).require (); real_from_integer (&dconst0, double_mode, 0, SIGNED); real_from_integer (&dconst1, double_mode, 1, SIGNED); diff --git a/gcc/gdbhooks.py b/gcc/gdbhooks.py index 4cbcefc..8d0c065 100644 --- a/gcc/gdbhooks.py +++ b/gcc/gdbhooks.py @@ -542,6 +542,8 @@ def build_pretty_printer(): pp.add_printer_for_regex(r'opt_mode<(\S+)>', 'opt_mode', OptMachineModePrinter) + pp.add_printer_for_types(['opt_scalar_float_mode'], + 'opt_mode', OptMachineModePrinter) pp.add_printer_for_types(['scalar_float_mode'], 'scalar_float_mode', MachineModePrinter) diff --git a/gcc/machmode.h b/gcc/machmode.h index 3b71b9d..aa931f5 100644 --- a/gcc/machmode.h +++ b/gcc/machmode.h @@ -520,7 +520,16 @@ extern const unsigned char mode_complex[NUM_MACHINE_MODES]; extern machine_mode mode_for_size (unsigned int, enum mode_class, int); -/* Similar, but find the smallest mode for a given width. */ +/* Return the machine mode to use for a MODE_FLOAT of SIZE bits, if one + exists. */ + +inline opt_scalar_float_mode +float_mode_for_size (unsigned int size) +{ + return dyn_cast <scalar_float_mode> (mode_for_size (size, MODE_FLOAT, 0)); +} + +/* Similar to mode_for_size, but find the smallest mode for a given width. */ extern machine_mode smallest_mode_for_size (unsigned int, enum mode_class); diff --git a/gcc/stor-layout.c b/gcc/stor-layout.c index f69fad8..433fd99 100644 --- a/gcc/stor-layout.c +++ b/gcc/stor-layout.c @@ -2205,14 +2205,17 @@ layout_type (tree type) break; case REAL_TYPE: - /* Allow the caller to choose the type mode, which is how decimal - floats are distinguished from binary ones. */ - if (TYPE_MODE (type) == VOIDmode) - SET_TYPE_MODE (type, - mode_for_size (TYPE_PRECISION (type), MODE_FLOAT, 0)); - TYPE_SIZE (type) = bitsize_int (GET_MODE_BITSIZE (TYPE_MODE (type))); - TYPE_SIZE_UNIT (type) = size_int (GET_MODE_SIZE (TYPE_MODE (type))); - break; + { + /* Allow the caller to choose the type mode, which is how decimal + floats are distinguished from binary ones. */ + if (TYPE_MODE (type) == VOIDmode) + SET_TYPE_MODE + (type, float_mode_for_size (TYPE_PRECISION (type)).require ()); + scalar_float_mode mode = as_a <scalar_float_mode> (TYPE_MODE (type)); + TYPE_SIZE (type) = bitsize_int (GET_MODE_BITSIZE (mode)); + TYPE_SIZE_UNIT (type) = size_int (GET_MODE_SIZE (mode)); + break; + } case FIXED_POINT_TYPE: /* TYPE_MODE (type) has been set already. */ |