>       * 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


Reply via email to