On Tue, 2021-05-18 at 16:32 -0400, Michael Meissner wrote: > [PATCH] Fix long double tests when default long double is not IBM. >
Hi, > This patch adds 3 more selections to target-supports.exp to see if we can > force > the compiler to use a particular long double format (IEEE 128-bit, IBM > extended > double, 64-bit), and the library support will track the changes for the long > double. This is needed because two of the tests in the test suite use long > double, and they are actually testing IBM extended double. > > This patch also forces the two tests that explicitly require long double > to use the IBM double-double encoding to explicitly run the test. This > requires GLIBC 2.32 or greater in order to do the switch. > > I have run tests on a little endian power9 system with 3 compilers. There > were > no regressions with these patches, and the two tests in the following patches > now work if the default long double is not IBM 128-bit: > > * One compiler used the default IBM 128-bit format; > * One compiler used the IEEE 128-bit format; (and) > * One compiler used 64-bit long doubles. > > I have also tested compilers on a big endian power8 system with a compiler > defaulting to power8 code generation and another with the default cpu > set. There were no regressions. > > Can I check this patch into the master branch? > > I have done bootstrap builds with this patch on the following 4 systems: > 1) power9 running LE Linux using --with-cpu=power9 with long > double == IBM > 2) power9 running LE Linux using --with-cpu=power9 with long > double == IEEE > 3) power8 running BE Linux using --with-cpu=power8, testing both > 32/64-bit. > 4) power10 prototype running LE Linux using --with-cpu=power10. > > There were no regressions to the tests, and the two test cases that previously > failed with I ran the compiler defaulting to long double using IEEE 128-bit > now > passed. Can I check these patches into trunk branch for GCC 12? > > I would like to check these patches into GCC 11 after a cooling off period, > but > I can also not do the backport if desired. > > gcc/testsuite/ > 2021-05-18 Michael Meissner <meiss...@linux.ibm.com> > > PR target/70117 > * gcc.target/powerpc/pr70117.c: Force the long double type to use > the IBM 128-bit format. > * c-c++-common/dfp/convert-bfp-11.c: Force using IBM 128-bit long > double. Remove check for 64-bit long double. > * lib/target-supports.exp > (add_options_for_ppc_long_double_override_ibm128): New function. > (check_effective_target_ppc_long_double_override_ibm128): New > function. > (add_options_for_ppc_long_double_override_ieee128): New function. > (check_effective_target_ppc_long_double_override_ieee128): New > function. > (add_options_for_ppc_long_double_override_64bit): New function. > (check_effective_target_ppc_long_double_override_64bit): New > function. ok. > --- > .../c-c++-common/dfp/convert-bfp-11.c | 18 +-- > gcc/testsuite/gcc.target/powerpc/pr70117.c | 6 +- > gcc/testsuite/lib/target-supports.exp | 107 ++++++++++++++++++ > 3 files changed, 121 insertions(+), 10 deletions(-) > > diff --git a/gcc/testsuite/c-c++-common/dfp/convert-bfp-11.c > b/gcc/testsuite/c-c++-common/dfp/convert-bfp-11.c > index 95c433d2c24..35da07d1fa4 100644 > --- a/gcc/testsuite/c-c++-common/dfp/convert-bfp-11.c > +++ b/gcc/testsuite/c-c++-common/dfp/convert-bfp-11.c > @@ -1,9 +1,14 @@ > -/* { dg-skip-if "" { ! "powerpc*-*-linux*" } } */ > +/* { dg-require-effective-target dfp } */ > +/* { dg-require-effective-target ppc_long_double_override_ibm128 } */ > +/* { dg-add-options ppc_long_double_override_ibm128 } */ > > -/* Test decimal float conversions to and from IBM 128-bit long double. > - Checks are skipped at runtime if long double is not 128 bits. > - Don't force 128-bit long doubles because runtime support depends > - on glibc. */ > +/* We force the long double type to be IBM 128-bit because the > CONVERT_TO_PINF > + tests will fail if we use IEEE 128-bit floating point. This is due to > IEEE > + 128-bit having a larger exponent range than IBM 128-bit extended double. > So > + tests that would generate an infinity with IBM 128-bit will generate a > + normal number with IEEE 128-bit. */ ok > + > +/* Test decimal float conversions to and from IBM 128-bit long double. */ > > #include "convert.h" > > @@ -36,9 +41,6 @@ CONVERT_TO_PINF (312, tf, sd, 1.6e+308L, d32) > int > main () > { > - if (sizeof (long double) != 16) > - return 0; > - > convert_101 (); > convert_102 (); > > diff --git a/gcc/testsuite/gcc.target/powerpc/pr70117.c > b/gcc/testsuite/gcc.target/powerpc/pr70117.c > index 3bbd2c595e0..8a5fad1dee0 100644 > --- a/gcc/testsuite/gcc.target/powerpc/pr70117.c > +++ b/gcc/testsuite/gcc.target/powerpc/pr70117.c > @@ -1,5 +1,7 @@ > -/* { dg-do run { target { powerpc*-*-linux* powerpc*-*-darwin* > powerpc*-*-aix* rs6000-*-* } } } */ > -/* { dg-options "-std=c99 -mlong-double-128 -O2" } */ > +/* { dg-do run } */ > +/* { dg-require-effective-target ppc_long_double_override_ibm128 } */ > +/* { dg-options "-std=c99 -O2" } */ > +/* { dg-add-options ppc_long_double_override_ibm128 } */ > > #include <float.h> ok > > diff --git a/gcc/testsuite/lib/target-supports.exp > b/gcc/testsuite/lib/target-supports.exp > index 8192da5ec9f..c1f2c4ff96a 100644 > --- a/gcc/testsuite/lib/target-supports.exp > +++ b/gcc/testsuite/lib/target-supports.exp > @@ -2360,6 +2360,113 @@ proc check_effective_target_ppc_ieee128_ok { } { > }] > } > > +# 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 IBM 128-bit long double. > + > +proc add_options_for_ppc_long_double_override_ibm128 { flags } { > + if { [istarget powerpc*-*-*] } { > + return "$flags -mlong-double-128 -Wno-psabi -mabi=ibmlongdouble" > + } > + return "$flags" > +} ok > + > +proc check_effective_target_ppc_long_double_override_ibm128 { } { > + return [check_runtime_nocache ppc_long_double_override_ibm128 { > + #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) > + return 1; > + sprintf (buffer, "%lg", b); > + return strcmp (buffer, "3") != 0; > + #endif > + } > + } [add_options_for_ppc_long_double_override_ibm128 ""]] > +} ok > + > +# 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 IEEE 128-bit long double. > + > +proc add_options_for_ppc_long_double_override_ieee128 { flags } { > + if { [istarget powerpc*-*-*] } { > + return "$flags -mlong-double-128 -Wno-psabi -mabi=ieeelongdouble" > + } > + return "$flags" > +} > + > +proc check_effective_target_ppc_long_double_override_ieee128 { } { > + return [check_runtime_nocache ppc_long_double_override_ieee128 { > + #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 > + } > + } [add_options_for_ppc_long_double_override_ieee128 ""]] > +} > + > +# Check if we can explicitly override the long double format to use 64-bit > +# floating point, and GLIBC supports doing this override by switching the > +# sprintf to handle 64-bit long double. > + > +proc add_options_for_ppc_long_double_override_64bit { flags } { > + if { [istarget powerpc*-*-*] } { > + return "$flags -mlong-double-64" > + } > + return "$flags" > +} ok > + > +proc check_effective_target_ppc_long_double_override_64bit { } { > + return [check_runtime_nocache ppc_long_double_override_64bit { > + #include <string.h> > + #include <stdio.h> > + volatile double a = 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_128__) > + return 1; > + #else > + if (sizeof (long double) != sizeof (double)) > + return 1; > + 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 > + } > + } [add_options_for_ppc_long_double_override_64bit ""]] > +} > + > # Return 1 if the target supports executing VSX instructions, 0 > # otherwise. Cache the result. ok Thanks -Will > > -- > 2.31.1 >