On Thu, 2020-10-22 at 18:08 -0400, Michael Meissner via Gcc-patches wrote:
> PowerPC: Map q built-ins to *l instead of *f128 if IEEE 128-bit long double.
> 
> I have split all of these patches into separate patches to hopefully get them
> into the tree.
> 
> If we map nanq to nanf128 when long double is IEEE, it seems to lose the
> special signaling vs. non-signaling NAN support.  This patch maps the 
> functions
> to the long double version if long double is IEEE 128-bit.  If this patch
> is not applied, a few tests in the testsuite will start failing.
> 
> I have tested this patch with bootstrap builds on a little endian power9 
> system
> running Linux.  With the other patches, I have built two full bootstrap builds
> using this patch and the patches after this patch.  One build used the current
> default for long double (IBM extended double) and the other build switched the
> default to IEEE 128-bit.  I used the Advance Toolchain AT 14.0 compiler as the
> library used by this compiler.  There are no regressions between the tests.
> There are 3 fortran benchmarks (ieee/large_2.f90, default_format_2.f90, and
> default_format_denormal_2.f90) that now pass.
> 
> Can I install this into the trunk?
> 
> We have gotten some requests to back port these changes to GCC 10.x.  At the
> moment, I am not planning to do the back port, but I may need to in the 
> future.
> 
> gcc/
> 2020-10-22  Michael Meissner  <meiss...@linux.ibm.com>
> 
>       * config/rs6000/rs6000-c.c (rs6000_cpu_cpp_builtins): If long
>       double is IEEE-128 map the nanq built-in functions to the long
>       double function, not the f128 function.

A bit long, but I think its OK.

> ---
>  gcc/config/rs6000/rs6000-c.c | 31 ++++++++++++++++++++++++-------
>  1 file changed, 24 insertions(+), 7 deletions(-)
> 
> diff --git a/gcc/config/rs6000/rs6000-c.c b/gcc/config/rs6000/rs6000-c.c
> index cc1e997524e..bee78fcbac4 100644
> --- a/gcc/config/rs6000/rs6000-c.c
> +++ b/gcc/config/rs6000/rs6000-c.c
> @@ -684,15 +684,32 @@ rs6000_cpu_cpp_builtins (cpp_reader *pfile)
>        builtin_define ("__builtin_vsx_xvnmsubmsp=__builtin_vsx_xvnmsubsp");
>      }
> 
> -  /* Map the old _Float128 'q' builtins into the new 'f128' builtins.  */
> +  /* Map the old _Float128 'q' builtins into the new 'f128' builtins if long
> +     double is IBM or 64-bit.
> +
> +     However, if long double is IEEE 128-bit, map both sets of built-in
> +     functions to the normal long double version.  This shows up in nansf128
> +     vs. nanf128.  */
>    if (TARGET_FLOAT128_TYPE)
>      {
> -      builtin_define ("__builtin_fabsq=__builtin_fabsf128");
> -      builtin_define ("__builtin_copysignq=__builtin_copysignf128");
> -      builtin_define ("__builtin_nanq=__builtin_nanf128");
> -      builtin_define ("__builtin_nansq=__builtin_nansf128");
> -      builtin_define ("__builtin_infq=__builtin_inff128");
> -      builtin_define ("__builtin_huge_valq=__builtin_huge_valf128");
> +      if (FLOAT128_IEEE_P (TFmode))
> +     {
> +       builtin_define ("__builtin_fabsq=__builtin_fabsl");
> +       builtin_define ("__builtin_copysignq=__builtin_copysignl");
> +       builtin_define ("__builtin_nanq=__builtin_nanl");
> +       builtin_define ("__builtin_nansq=__builtin_nansl");
> +       builtin_define ("__builtin_infq=__builtin_infl");
> +       builtin_define ("__builtin_huge_valq=__builtin_huge_vall");
> +     }
> +      else
> +     {
> +       builtin_define ("__builtin_fabsq=__builtin_fabsf128");
> +       builtin_define ("__builtin_copysignq=__builtin_copysignf128");
> +       builtin_define ("__builtin_nanq=__builtin_nanf128");
> +       builtin_define ("__builtin_nansq=__builtin_nansf128");
> +       builtin_define ("__builtin_infq=__builtin_inff128");
> +       builtin_define ("__builtin_huge_valq=__builtin_huge_valf128");
> +     }
>      }

ok
lgtm, 
thanks
-Will

> 
>    /* Tell users they can use __builtin_bswap{16,64}.  */
> -- 
> 2.22.0
> 
> 

Reply via email to