From 857c7b46875bdcf9d889543baad54977034d57ef Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Wed, 30 Aug 2017 11:09:41 +0000 Subject: [PATCH] [11/77] Add a float_mode_for_size helper function This provides a type-safe way to ask for a float mode and get it as a scalar_float_mode. 2017-08-30 Richard Sandiford Alan Hayward David Sherwood gcc/ * 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. Co-Authored-By: Alan Hayward Co-Authored-By: David Sherwood From-SVN: r251463 --- gcc/ChangeLog | 11 +++++++++++ gcc/coretypes.h | 1 + gcc/emit-rtl.c | 5 ++--- gcc/gdbhooks.py | 2 ++ gcc/machmode.h | 11 ++++++++++- gcc/stor-layout.c | 19 +++++++++++-------- 6 files changed, 37 insertions(+), 12 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5241db9ffba..8b74bc783c9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2017-08-30 Richard Sandiford + Alan Hayward + David Sherwood + + * 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 Alan Hayward David Sherwood diff --git a/gcc/coretypes.h b/gcc/coretypes.h index 216c29f6f1e..6313467d567 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 class opt_mode; +typedef opt_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 3856ac02d4e..eaae009875d 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 4cbcefc4fc4..8d0c0656762 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 3b71b9da5cc..aa931f59c50 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 (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 f69fad8fd75..433fd9956e6 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 (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. */ -- 2.30.2