On Thu, Dec 03, 2020 at 11:06:12PM -0500, Michael Meissner wrote: > +proc check_effective_target_ppc_long_double_ibm { } { > + return [check_cached_effective_target ppc_long_double_ibm { > + int main() > + { > + #if !defined(_ARCH_PPC) || !defined(__LONG_DOUBLE_IBM128__) > + return 1; > + #else > + return 0; > + #endif > + } > + }] > +}
OK. > +proc check_effective_target_ppc_long_double_ieee { } { > + return [check_cached_effective_target ppc_long_double_ieee { > + int main() > + { > + #if !defined(_ARCH_PPC) || !defined(__LONG_DOUBLE_IEEE128__) > + return 1; > + #else > + return 0; > + #endif > + } > + }] > +} OK. These names could be without "_ppc", if the functions were defined more generically. It's not clear that will be useful right now though. > +# Like check_effective_target_ppc_long_double_ibm, but check if we can > +# explicitly override the long double format to use the IBM 128-bit extended > +# double format, and GLIBC supports doing this override by switching the > +# sprintf to handle long double. This comment needs work. > +proc check_effective_target_ppc_long_double_override_ibm { } { > + set options "-mlong-double-128 -mabi=ibmlongdouble -Wno-psabi" > + check_runtime_nocache ppc_long_double_ovveride_ibm { It is spelled "override". > + #include <string.h> > + #include <stdio.h> > + volatile __ibm128 a = (__ibm128) 3.0; > + volatile long double one = 1.0L; > + volatile long double two = 2.0L; > + volatile long double b; > + char buffer[20]; > + int main() > + { > + #if !defined(_ARCH_PPC) || !defined(__LONG_DOUBLE_IBM128__) > + return 1; > + #else > + b = one + two; > + if (memcmp ((void *)&a, (void *)&b, sizeof (long double)) != 0) The pointer casts are unnecessary, and can be harmful. You should use sizeof(b) , and check that sizeof(a) == sizeof(b) . > + return 1; > + sprintf (buffer, "%lg", b); > + return strcmp (buffer, "3") != 0; > + #endif > + } > + } $options > +} The name of this should say it is something to do with libc, or even glibc in fact ("lg" is not portable), and with text output. > +# Like check_effective_target_ppc_long_double_ieee, but check if we can > +# explicitly override the long double format to use the IEEE 128-bit format, > +# and GLIBC supports doing this override by switching the sprintf to handle > +# long double. > + > +proc check_effective_target_ppc_long_double_override_ieee { } { > + set options "-mlong-double-128 -mabi=ieeelongdouble -Wno-psabi" > + check_runtime_nocache ppc_long_double_ovveride_ieee { > + #include <string.h> > + #include <stdio.h> > + volatile _Float128 a = 3.0f128; > + volatile long double one = 1.0L; > + volatile long double two = 2.0L; > + volatile long double b; > + char buffer[20]; > + int main() > + { > + #if !defined(_ARCH_PPC) || !defined(__LONG_DOUBLE_IEEE128__) > + return 1; > + #else > + b = one + two; > + if (memcmp ((void *)&a, (void *)&b, sizeof (long double)) != 0) > + return 1; > + sprintf (buffer, "%lg", b); > + return strcmp (buffer, "3") != 0; > + #endif > + } > + } $options > +} Ditto. > +# See if the target is a powerpc with the long double format that is > 128-bits. > + > +proc check_effective_target_ppc_long_double_128bit { } { > + return [check_cached_effective_target ppc_long_double_128bit { > + int main() > + { > + #ifndef _ARCH_PPC > + return 1; > + #else > + return sizeof (long double) != 16; > + #endif > + } > + }] > +} In this case checking for PowerPC seems a really bad design: this is obviously exactly the same on any architecture. > +proc check_effective_target_ppc_long_double_64bit { } { > + return [check_cached_effective_target ppc_long_double_64bit { > + int main() > + { > + #ifndef _ARCH_PPC > + return 1; > + #else > + return sizeof (long double) != 8; > + #endif > + } > + }] > +} Ditto. Segher