> * config/sparc/sparc.cc (sparc_c_mode_for_floating_type): New
> (TARGET_C_MODE_FOR_FLOATING_TYPE): New macro.
> (FLOAT_TYPE_SIZE): Remove.
> (DOUBLE_TYPE_SIZE): Likewise.
> (LONG_DOUBLE_TYPE_SIZE): Rename to ...
> (SPARC_LONG_DOUBLE_TYPE_SIZE): ... this.
> (sparc_type_code): Replace FLOAT_TYPE_SIZE with TYPE_PRECISION of
> float_type_node.
> * config/sparc/sparc.h (FLOAT_TYPE_SIZE): Remove.
> (DOUBLE_TYPE_SIZE): Remove.
> * config/sparc/freebsd.h (LONG_DOUBLE_TYPE_SIZE): Rename to ...
> (SPARC_LONG_DOUBLE_TYPE_SIZE): ... this.
> * config/sparc/linux.h (LONG_DOUBLE_TYPE_SIZE): Rename to ...
> (SPARC_LONG_DOUBLE_TYPE_SIZE): ... this.
> * config/sparc/linux64.h (LONG_DOUBLE_TYPE_SIZE): Rename to ...
> (SPARC_LONG_DOUBLE_TYPE_SIZE): ... this.
> * config/sparc/netbsd-elf.h (LONG_DOUBLE_TYPE_SIZE): Rename to ...
> (SPARC_LONG_DOUBLE_TYPE_SIZE): ... this.
> * config/sparc/openbsd64.h (LONG_DOUBLE_TYPE_SIZE): Rename to ...
> (SPARC_LONG_DOUBLE_TYPE_SIZE): ... this.
> * config/sparc/sol2.h (LONG_DOUBLE_TYPE_SIZE): Rename to ...
> (SPARC_LONG_DOUBLE_TYPE_SIZE): ... this.
> * config/sparc/sp-elf.h (LONG_DOUBLE_TYPE_SIZE): Rename to ...
> (SPARC_LONG_DOUBLE_TYPE_SIZE): ... this.
> * config/sparc/sp64-elf.h (LONG_DOUBLE_TYPE_SIZE): Rename to ...
> (SPARC_LONG_DOUBLE_TYPE_SIZE): ... this.
OK, modulo the following tweaks:
> --- a/gcc/config/sparc/sparc.cc
> +++ b/gcc/config/sparc/sparc.cc
> @@ -718,6 +718,7 @@ static bool sparc_vectorize_vec_perm_const
> (machine_mode, machine_mode, const vec_perm_indices &);
> static bool sparc_can_follow_jump (const rtx_insn *, const rtx_insn *);
> static HARD_REG_SET sparc_zero_call_used_regs (HARD_REG_SET);
> +static machine_mode sparc_c_mode_for_floating_type (enum tree_index);
>
> #ifdef SUBTARGET_ATTRIBUTE_TABLE
> /* Table of valid machine attributes. */
> @@ -971,6 +972,9 @@ char sparc_hard_reg_printed[8];
> #undef TARGET_ZERO_CALL_USED_REGS
> #define TARGET_ZERO_CALL_USED_REGS sparc_zero_call_used_regs
>
> +#undef TARGET_C_MODE_FOR_FLOATING_TYPE
> +#define TARGET_C_MODE_FOR_FLOATING_TYPE sparc_c_mode_for_floating_type
> +
> struct gcc_target targetm = TARGET_INITIALIZER;
>
> /* Return the memory reference contained in X if any, zero otherwise. */
> @@ -9824,16 +9828,9 @@ sparc_assemble_integer (rtx x, unsigned int size, int
> aligned_p) #define LONG_LONG_TYPE_SIZE (BITS_PER_WORD * 2)
> #endif
>
> -#ifndef FLOAT_TYPE_SIZE
> -#define FLOAT_TYPE_SIZE BITS_PER_WORD
> -#endif
> -
> -#ifndef DOUBLE_TYPE_SIZE
> -#define DOUBLE_TYPE_SIZE (BITS_PER_WORD * 2)
> -#endif
> -
> -#ifndef LONG_DOUBLE_TYPE_SIZE
> -#define LONG_DOUBLE_TYPE_SIZE (BITS_PER_WORD * 2)
> +/* LONG_DOUBLE_TYPE_SIZE get poisoned, so add SPARC_ prefix. */
> +#ifndef SPARC_LONG_LONG_TYPE_SIZE
> +#define SPARC_LONG_DOUBLE_TYPE_SIZE (BITS_PER_WORD * 2)
> #endif
>
> unsigned long
You can delete {SPARC_}LONG_DOUBLE_TYPE_SIZE too.
> @@ -9920,7 +9917,7 @@ sparc_type_code (tree type)
> /* Carefully distinguish all the standard types of C,
> without messing up if the language is not C. */
>
> - if (TYPE_PRECISION (type) == FLOAT_TYPE_SIZE)
> + if (TYPE_PRECISION (type) == TYPE_PRECISION (float_type_node))
> return (qualifiers | 6);
>
> else
> @@ -13984,4 +13981,16 @@ sparc_zero_call_used_regs (HARD_REG_SET
> need_zeroed_hardregs) return need_zeroed_hardregs;
> }
>
> +/* Implement TARGET_C_MODE_FOR_FLOATING_TYPE. Return TFmode or DFmode
> + for TI_LONG_DOUBLE_TYPE which is for long double type, go with the
> + default one for the others. */
> +
> +static machine_mode
> +sparc_c_mode_for_floating_type (enum tree_index ti)
> +{
> + if (ti == TI_LONG_DOUBLE_TYPE)
> + return SPARC_LONG_DOUBLE_TYPE_SIZE == 128 ? TFmode : DFmode;
> + return default_mode_for_floating_type (ti);
> +}
> +
> #include "gt-sparc.h"
I think that TI_LONG_DOUBLE_TYPE is self-explanatory so just:
/* Implement TARGET_C_MODE_FOR_FLOATING_TYPE. Return TFmode or DFmode
for TI_LONG_DOUBLE_TYPE and the default for others.
--
Eric Botcazou