Message ID | f951ed80ce1c0bbb38c195c704215d642a44335a.1717134752.git.linkw@linux.ibm.com |
---|---|
State | New |
Headers | show |
Series | Replace {FLOAT,{,LONG_}DOUBLE}_TYPE_SIZE with new hook | expand |
Hi! On Sun, 2024-06-02 at 22:01 -0500, Kewen Lin wrote: > This is to remove macro LONG_DOUBLE_TYPE_SIZE define in > sh port, and add new port specific hook implementation > sh_c_mode_for_floating_type. > The SH parts look OK to me. Best regards, Oleg Endo > gcc/ChangeLog: > > * config/sh/sh.cc (sh_c_mode_for_floating_type): New function. > (TARGET_C_MODE_FOR_FLOATING_TYPE): New macro. > * config/sh/sh.h (LONG_DOUBLE_TYPE_SIZE): Remove. > --- > gcc/config/sh/sh.cc | 18 ++++++++++++++++++ > gcc/config/sh/sh.h | 10 ---------- > 2 files changed, 18 insertions(+), 10 deletions(-) > > diff --git a/gcc/config/sh/sh.cc b/gcc/config/sh/sh.cc > index ef3c2e6791d..bc017420381 100644 > --- a/gcc/config/sh/sh.cc > +++ b/gcc/config/sh/sh.cc > @@ -328,6 +328,7 @@ static unsigned int sh_hard_regno_nregs (unsigned int, machine_mode); > static bool sh_hard_regno_mode_ok (unsigned int, machine_mode); > static bool sh_modes_tieable_p (machine_mode, machine_mode); > static bool sh_can_change_mode_class (machine_mode, machine_mode, reg_class_t); > +static machine_mode sh_c_mode_for_floating_type (enum tree_index); > > TARGET_GNU_ATTRIBUTES (sh_attribute_table, > { > @@ -664,6 +665,9 @@ TARGET_GNU_ATTRIBUTES (sh_attribute_table, > #undef TARGET_HAVE_SPECULATION_SAFE_VALUE > #define TARGET_HAVE_SPECULATION_SAFE_VALUE speculation_safe_value_not_needed > > +#undef TARGET_C_MODE_FOR_FLOATING_TYPE > +#define TARGET_C_MODE_FOR_FLOATING_TYPE sh_c_mode_for_floating_type > + > struct gcc_target targetm = TARGET_INITIALIZER; > > > @@ -10674,6 +10678,20 @@ sh_can_change_mode_class (machine_mode from, machine_mode to, > return true; > } > > +/* Implement TARGET_C_MODE_FOR_FLOATING_TYPE. Return SFmode or DFmode > + for TI_DOUBLE_TYPE which is for double type, go with the default one > + for the others. */ > + > +static machine_mode > +sh_c_mode_for_floating_type (enum tree_index ti) > +{ > + /* Since the SH2e has only `float' support, it is desirable to make all > + floating point types equivalent to `float'. */ > + if (ti == TI_DOUBLE_TYPE) > + return TARGET_FPU_SINGLE_ONLY ? SFmode : DFmode; > + return default_mode_for_floating_type (ti); > +} > + > /* Return true if registers in machine mode MODE will likely be > allocated to registers in small register classes. */ > bool > diff --git a/gcc/config/sh/sh.h b/gcc/config/sh/sh.h > index 7d3a3f08338..53cad85d122 100644 > --- a/gcc/config/sh/sh.h > +++ b/gcc/config/sh/sh.h > @@ -425,9 +425,6 @@ extern const sh_atomic_model& selected_atomic_model (void); > /* Width in bits of a `long long'. */ > #define LONG_LONG_TYPE_SIZE 64 > > -/* Width in bits of a `long double'. */ > -#define LONG_DOUBLE_TYPE_SIZE 64 > - > /* Width of a word, in units (bytes). */ > #define UNITS_PER_WORD (4) > #define MIN_UNITS_PER_WORD 4 > @@ -1433,13 +1430,6 @@ extern bool current_function_interrupt; > Do not define this if the table should contain absolute addresses. */ > #define CASE_VECTOR_PC_RELATIVE 1 > > -/* Define it here, so that it doesn't get bumped to 64-bits on SHmedia. */ > -#define FLOAT_TYPE_SIZE 32 > - > -/* Since the SH2e has only `float' support, it is desirable to make all > - floating point types equivalent to `float'. */ > -#define DOUBLE_TYPE_SIZE (TARGET_FPU_SINGLE_ONLY ? 32 : 64) > - > /* 'char' is signed by default. */ > #define DEFAULT_SIGNED_CHAR 1 > > -- > 2.43.0 >
diff --git a/gcc/config/sh/sh.cc b/gcc/config/sh/sh.cc index ef3c2e6791d..bc017420381 100644 --- a/gcc/config/sh/sh.cc +++ b/gcc/config/sh/sh.cc @@ -328,6 +328,7 @@ static unsigned int sh_hard_regno_nregs (unsigned int, machine_mode); static bool sh_hard_regno_mode_ok (unsigned int, machine_mode); static bool sh_modes_tieable_p (machine_mode, machine_mode); static bool sh_can_change_mode_class (machine_mode, machine_mode, reg_class_t); +static machine_mode sh_c_mode_for_floating_type (enum tree_index); TARGET_GNU_ATTRIBUTES (sh_attribute_table, { @@ -664,6 +665,9 @@ TARGET_GNU_ATTRIBUTES (sh_attribute_table, #undef TARGET_HAVE_SPECULATION_SAFE_VALUE #define TARGET_HAVE_SPECULATION_SAFE_VALUE speculation_safe_value_not_needed +#undef TARGET_C_MODE_FOR_FLOATING_TYPE +#define TARGET_C_MODE_FOR_FLOATING_TYPE sh_c_mode_for_floating_type + struct gcc_target targetm = TARGET_INITIALIZER; @@ -10674,6 +10678,20 @@ sh_can_change_mode_class (machine_mode from, machine_mode to, return true; } +/* Implement TARGET_C_MODE_FOR_FLOATING_TYPE. Return SFmode or DFmode + for TI_DOUBLE_TYPE which is for double type, go with the default one + for the others. */ + +static machine_mode +sh_c_mode_for_floating_type (enum tree_index ti) +{ + /* Since the SH2e has only `float' support, it is desirable to make all + floating point types equivalent to `float'. */ + if (ti == TI_DOUBLE_TYPE) + return TARGET_FPU_SINGLE_ONLY ? SFmode : DFmode; + return default_mode_for_floating_type (ti); +} + /* Return true if registers in machine mode MODE will likely be allocated to registers in small register classes. */ bool diff --git a/gcc/config/sh/sh.h b/gcc/config/sh/sh.h index 7d3a3f08338..53cad85d122 100644 --- a/gcc/config/sh/sh.h +++ b/gcc/config/sh/sh.h @@ -425,9 +425,6 @@ extern const sh_atomic_model& selected_atomic_model (void); /* Width in bits of a `long long'. */ #define LONG_LONG_TYPE_SIZE 64 -/* Width in bits of a `long double'. */ -#define LONG_DOUBLE_TYPE_SIZE 64 - /* Width of a word, in units (bytes). */ #define UNITS_PER_WORD (4) #define MIN_UNITS_PER_WORD 4 @@ -1433,13 +1430,6 @@ extern bool current_function_interrupt; Do not define this if the table should contain absolute addresses. */ #define CASE_VECTOR_PC_RELATIVE 1 -/* Define it here, so that it doesn't get bumped to 64-bits on SHmedia. */ -#define FLOAT_TYPE_SIZE 32 - -/* Since the SH2e has only `float' support, it is desirable to make all - floating point types equivalent to `float'. */ -#define DOUBLE_TYPE_SIZE (TARGET_FPU_SINGLE_ONLY ? 32 : 64) - /* 'char' is signed by default. */ #define DEFAULT_SIGNED_CHAR 1