From 86e3b476d5defaa79c94d40b76cbeec21cd02e5f Mon Sep 17 00:00:00 2001 From: Francois-Xavier Coudert Date: Mon, 17 Jan 2022 00:00:18 +0100 Subject: Fortran: xfail signaling NaN testcases on x87 The ABI for x87 and x86-32 is not suitable for passing around signaling NaNs in the way IEEE expects. See for example discussion in https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57484 gcc/testsuite/ChangeLog: * gfortran.dg/ieee/signaling_1.f90: xfail on x87. * gfortran.dg/ieee/signaling_2.f90: xfail on x87. --- gcc/testsuite/gfortran.dg/ieee/signaling_1.f90 | 6 ++-- gcc/testsuite/gfortran.dg/ieee/signaling_2.f90 | 6 ++-- gcc/testsuite/gfortran.dg/ieee/signaling_3.f90 | 42 ++++++++++++++++++++++++++ 3 files changed, 50 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/ieee/signaling_3.f90 (limited to 'gcc') diff --git a/gcc/testsuite/gfortran.dg/ieee/signaling_1.f90 b/gcc/testsuite/gfortran.dg/ieee/signaling_1.f90 index 93c8e18..94ece3a 100644 --- a/gcc/testsuite/gfortran.dg/ieee/signaling_1.f90 +++ b/gcc/testsuite/gfortran.dg/ieee/signaling_1.f90 @@ -1,8 +1,10 @@ -! { dg-do run } +! { dg-do run { xfail { { i?86-*-* x86_64-*-* } && ilp32 } } } +! x87 / x86-32 ABI is unsuitable for signaling NaNs +! ! { dg-require-effective-target issignaling } */ ! { dg-additional-sources signaling_1_c.c } ! { dg-additional-options "-w" } -! the -w option is needed to make cc1 not report a warning for +! The -w option is needed to make cc1 not report a warning for ! the -fintrinsic-modules-path option passed by ieee.exp ! program test diff --git a/gcc/testsuite/gfortran.dg/ieee/signaling_2.f90 b/gcc/testsuite/gfortran.dg/ieee/signaling_2.f90 index e7e7a4a..ff37ab6 100644 --- a/gcc/testsuite/gfortran.dg/ieee/signaling_2.f90 +++ b/gcc/testsuite/gfortran.dg/ieee/signaling_2.f90 @@ -1,8 +1,10 @@ -! { dg-do run } +! { dg-do run { xfail { { i?86-*-* x86_64-*-* } && ilp32 } } } +! x87 / x86-32 ABI is unsuitable for signaling NaNs +! ! { dg-require-effective-target issignaling } */ ! { dg-additional-sources signaling_2_c.c } ! { dg-additional-options "-w" } -! the -w option is needed to make cc1 not report a warning for +! The -w option is needed to make cc1 not report a warning for ! the -fintrinsic-modules-path option passed by ieee.exp ! program test diff --git a/gcc/testsuite/gfortran.dg/ieee/signaling_3.f90 b/gcc/testsuite/gfortran.dg/ieee/signaling_3.f90 new file mode 100644 index 0000000..45bd9c35 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/ieee/signaling_3.f90 @@ -0,0 +1,42 @@ +! { dg-do run } +! +program test + use, intrinsic :: iso_c_binding + use, intrinsic :: ieee_arithmetic + implicit none + + real(kind=c_float) :: x + real(kind=c_double) :: y + real(kind=c_long_double) :: z + + if (ieee_support_nan(x)) then + x = ieee_value(x, ieee_signaling_nan) + if (ieee_class(x) /= ieee_signaling_nan) stop 100 + if (.not. ieee_is_nan(x)) stop 101 + + x = ieee_value(x, ieee_quiet_nan) + if (ieee_class(x) /= ieee_quiet_nan) stop 103 + if (.not. ieee_is_nan(x)) stop 104 + end if + + if (ieee_support_nan(y)) then + y = ieee_value(y, ieee_signaling_nan) + if (ieee_class(y) /= ieee_signaling_nan) stop 100 + if (.not. ieee_is_nan(y)) stop 101 + + y = ieee_value(y, ieee_quiet_nan) + if (ieee_class(y) /= ieee_quiet_nan) stop 103 + if (.not. ieee_is_nan(y)) stop 104 + end if + + if (ieee_support_nan(z)) then + z = ieee_value(z, ieee_signaling_nan) + if (ieee_class(z) /= ieee_signaling_nan) stop 100 + if (.not. ieee_is_nan(z)) stop 101 + + z = ieee_value(z, ieee_quiet_nan) + if (ieee_class(z) /= ieee_quiet_nan) stop 103 + if (.not. ieee_is_nan(z)) stop 104 + end if + +end program test -- cgit v1.1