PowerPC: If long double is IEEE 128-bit, map q built-ins to *l instead of *f128.
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. gcc/ 2020-09-23 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. --- 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 f5982907e90..8f7a8eec740 100644 --- a/gcc/config/rs6000/rs6000-c.c +++ b/gcc/config/rs6000/rs6000-c.c @@ -681,15 +681,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"); + } } /* Tell users they can use __builtin_bswap{16,64}. */ -- 2.22.0 -- Michael Meissner, IBM IBM, M/S 2506R, 550 King Street, Littleton, MA 01460-6245, USA email: meiss...@linux.ibm.com, phone: +1 (978) 899-4797