public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: will schmidt <will_schmidt@vnet.ibm.com>
To: Michael Meissner <meissner@linux.ibm.com>,
	gcc-patches@gcc.gnu.org,
	Segher Boessenkool <segher@kernel.crashing.org>,
	David Edelsohn <dje.gcc@gmail.com>,
	Bill Schmidt <wschmidt@linux.ibm.com>,
	Peter Bergner <bergner@linux.ibm.com>
Subject: Re: [PATCH] Fix long double tests when default long double is not IBM.
Date: Thu, 20 May 2021 14:28:10 -0500	[thread overview]
Message-ID: <57b1f29b24c84486465930c16b94da2f62edcb96.camel@vnet.ibm.com> (raw)
In-Reply-To: <20210518203233.GA15055@ibm-toto.the-meissners.org>

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  <meissner@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
> 


  reply	other threads:[~2021-05-20 19:28 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-05-18 20:32 Michael Meissner
2021-05-20 19:28 ` will schmidt [this message]
2021-05-24 15:51 ` Ping " Michael Meissner
2021-06-01 23:41 ` Ping #2: " Michael Meissner

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=57b1f29b24c84486465930c16b94da2f62edcb96.camel@vnet.ibm.com \
    --to=will_schmidt@vnet.ibm.com \
    --cc=bergner@linux.ibm.com \
    --cc=dje.gcc@gmail.com \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=meissner@linux.ibm.com \
    --cc=segher@kernel.crashing.org \
    --cc=wschmidt@linux.ibm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).