From 48a7fb40d822bb96d89bf2a1be61b3497b89a267 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Fri, 19 Jan 2024 22:04:33 +0100 Subject: [PATCH] fenv-*: Avoid test failures on FreeBSD/powerpc64 and NetBSD/powerpc. On these platforms, FE_ALL_EXCEPT contains additional bits. * tests/test-fenv-except-tracking-1.c (FE_VXSOFT, FE_VXZDZ): Define fallbacks. (main): Allow fetestexcept(FE_ALL_EXCEPT) to contain FE_VXSOFT or FE_VXZDZ in addition to FE_INVALID. * tests/test-fenv-except-tracking-4.c (FE_VXSOFT): Define fallback. (main): Allow fetestexcept(FE_ALL_EXCEPT) to contain FE_VXSOFT in addition to FE_INVALID. * tests/test-fenv-env-2.c: Likewise. * tests/test-fenv-env-3.c: Likewise. * tests/test-fenv-env-4.c: Likewise. * tests/test-fenv-env-5.c: Likewise. --- ChangeLog | 16 ++++++++++++++++ tests/test-fenv-env-2.c | 15 +++++++++++++-- tests/test-fenv-env-3.c | 25 +++++++++++++++++++++---- tests/test-fenv-env-4.c | 10 +++++++++- tests/test-fenv-env-5.c | 15 +++++++++++++-- tests/test-fenv-except-tracking-1.c | 22 +++++++++++++++------- tests/test-fenv-except-tracking-4.c | 7 ++++++- 7 files changed, 93 insertions(+), 17 deletions(-) diff --git a/ChangeLog b/ChangeLog index 71516a86b8..6901b278f1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,19 @@ +2024-01-19 Bruno Haible + + fenv-*: Avoid test failures on FreeBSD/powerpc64 and NetBSD/powerpc. + On these platforms, FE_ALL_EXCEPT contains additional bits. + * tests/test-fenv-except-tracking-1.c (FE_VXSOFT, FE_VXZDZ): Define + fallbacks. + (main): Allow fetestexcept(FE_ALL_EXCEPT) to contain FE_VXSOFT or + FE_VXZDZ in addition to FE_INVALID. + * tests/test-fenv-except-tracking-4.c (FE_VXSOFT): Define fallback. + (main): Allow fetestexcept(FE_ALL_EXCEPT) to contain FE_VXSOFT in + addition to FE_INVALID. + * tests/test-fenv-env-2.c: Likewise. + * tests/test-fenv-env-3.c: Likewise. + * tests/test-fenv-env-4.c: Likewise. + * tests/test-fenv-env-5.c: Likewise. + 2024-01-19 Bruno Haible fenv-*: Fix test failures on NetBSD 9.3/arm64. diff --git a/tests/test-fenv-env-2.c b/tests/test-fenv-env-2.c index 9ea5b096bb..f1cc482608 100644 --- a/tests/test-fenv-env-2.c +++ b/tests/test-fenv-env-2.c @@ -25,6 +25,11 @@ /* Test the combination of fegetenv() with fesetenv(). */ +/* On *BSD/powerpc systems, raising FE_INVALID also sets FE_VXSOFT. */ +#ifndef FE_VXSOFT +# define FE_VXSOFT 0 +#endif + int main () { @@ -49,7 +54,10 @@ main () ASSERT (fegetenv (&env2) == 0); /* Check that the exception flags are unmodified. */ - ASSERT (fetestexcept (FE_ALL_EXCEPT) == (supports_tracking ? FE_INVALID | FE_OVERFLOW | FE_INEXACT : 0)); + if (supports_tracking) + ASSERT ((fetestexcept (FE_ALL_EXCEPT) & ~FE_VXSOFT) == (FE_INVALID | FE_OVERFLOW | FE_INEXACT)); + else + ASSERT (fetestexcept (FE_ALL_EXCEPT) == 0); /* Check that the exception trap bits are unmodified. */ ASSERT (fegetexcept () == (supports_trapping ? FE_DIVBYZERO : 0)); @@ -79,7 +87,10 @@ main () /* Check that the rounding direction has been restored. */ ASSERT (fegetround () == FE_UPWARD); /* Check that the exception flags have been restored. */ - ASSERT (fetestexcept (FE_ALL_EXCEPT) == (supports_tracking ? FE_INVALID | FE_OVERFLOW | FE_INEXACT : 0)); + if (supports_tracking) + ASSERT ((fetestexcept (FE_ALL_EXCEPT) & ~FE_VXSOFT) == (FE_INVALID | FE_OVERFLOW | FE_INEXACT)); + else + ASSERT (fetestexcept (FE_ALL_EXCEPT) == 0); /* Check that the exception trap bits have been restored. */ ASSERT (fegetexcept () == (supports_trapping ? FE_DIVBYZERO : 0)); diff --git a/tests/test-fenv-env-3.c b/tests/test-fenv-env-3.c index 61e7b4a03e..7dbe93b465 100644 --- a/tests/test-fenv-env-3.c +++ b/tests/test-fenv-env-3.c @@ -25,6 +25,11 @@ /* Test the combination of fegetenv() with feupdateenv(). */ +/* On *BSD/powerpc systems, raising FE_INVALID also sets FE_VXSOFT. */ +#ifndef FE_VXSOFT +# define FE_VXSOFT 0 +#endif + int main () { @@ -49,7 +54,10 @@ main () ASSERT (fegetenv (&env2) == 0); /* Check that the exception flags are unmodified. */ - ASSERT (fetestexcept (FE_ALL_EXCEPT) == (supports_tracking ? FE_INVALID | FE_OVERFLOW | FE_INEXACT : 0)); + if (supports_tracking) + ASSERT ((fetestexcept (FE_ALL_EXCEPT) & ~FE_VXSOFT) == (FE_INVALID | FE_OVERFLOW | FE_INEXACT)); + else + ASSERT (fetestexcept (FE_ALL_EXCEPT) == 0); /* Check that the exception trap bits are unmodified. */ ASSERT (fegetexcept () == (supports_trapping ? FE_DIVBYZERO : 0)); @@ -61,7 +69,10 @@ main () /* Check that the exception flags are the union of the saved and of the current exception flags. (The saved exception flags happen to be none in this case.) */ - ASSERT (fetestexcept (FE_ALL_EXCEPT) == (supports_tracking ? FE_INVALID | FE_OVERFLOW | FE_INEXACT : 0)); + if (supports_tracking) + ASSERT ((fetestexcept (FE_ALL_EXCEPT) & ~FE_VXSOFT) == (FE_INVALID | FE_OVERFLOW | FE_INEXACT)); + else + ASSERT (fetestexcept (FE_ALL_EXCEPT) == 0); /* Check that the exception trap bits have been restored. */ ASSERT (fegetexcept () == 0); @@ -82,7 +93,10 @@ main () ASSERT (fegetround () == FE_UPWARD); /* Check that the exception flags are the union of the saved and of the current exception flags. */ - ASSERT (fetestexcept (FE_ALL_EXCEPT) == (supports_tracking ? FE_INVALID | FE_OVERFLOW | FE_UNDERFLOW | FE_INEXACT : 0)); + if (supports_tracking) + ASSERT ((fetestexcept (FE_ALL_EXCEPT) & ~FE_VXSOFT) == (FE_INVALID | FE_OVERFLOW | FE_UNDERFLOW | FE_INEXACT)); + else + ASSERT (fetestexcept (FE_ALL_EXCEPT) == 0); /* Check that the exception trap bits have been restored. */ ASSERT (fegetexcept () == (supports_trapping ? FE_DIVBYZERO : 0)); @@ -95,7 +109,10 @@ main () /* Check that the rounding direction has been restored, whereas the exception flags are unmodified. */ ASSERT (fegetround () == FE_TONEAREST); - ASSERT (fetestexcept (FE_ALL_EXCEPT) == (supports_tracking ? FE_INVALID | FE_OVERFLOW | FE_UNDERFLOW | FE_INEXACT : 0)); + if (supports_tracking) + ASSERT ((fetestexcept (FE_ALL_EXCEPT) & ~FE_VXSOFT) == (FE_INVALID | FE_OVERFLOW | FE_UNDERFLOW | FE_INEXACT)); + else + ASSERT (fetestexcept (FE_ALL_EXCEPT) == 0); /* Enable trapping on FE_INVALID. */ feclearexcept (FE_INVALID); diff --git a/tests/test-fenv-env-4.c b/tests/test-fenv-env-4.c index 13bd5adb95..af75fc0215 100644 --- a/tests/test-fenv-env-4.c +++ b/tests/test-fenv-env-4.c @@ -25,6 +25,11 @@ /* Test the combination of feholdexcept() with fesetenv(). */ +/* On *BSD/powerpc systems, raising FE_INVALID also sets FE_VXSOFT. */ +#ifndef FE_VXSOFT +# define FE_VXSOFT 0 +#endif + int main () { @@ -79,7 +84,10 @@ main () /* Check that the rounding direction has been restored. */ ASSERT (fegetround () == FE_UPWARD); /* Check that the exception flags have been restored. */ - ASSERT (fetestexcept (FE_ALL_EXCEPT) == (supports_tracking ? FE_INVALID | FE_OVERFLOW | FE_INEXACT : 0)); + if (supports_tracking) + ASSERT ((fetestexcept (FE_ALL_EXCEPT) & ~FE_VXSOFT) == (FE_INVALID | FE_OVERFLOW | FE_INEXACT)); + else + ASSERT (fetestexcept (FE_ALL_EXCEPT) == 0); /* Check that the exception trap bits have been restored. */ ASSERT (fegetexcept () == (supports_trapping ? FE_DIVBYZERO : 0)); diff --git a/tests/test-fenv-env-5.c b/tests/test-fenv-env-5.c index 82f7c0e1f9..4c6980e254 100644 --- a/tests/test-fenv-env-5.c +++ b/tests/test-fenv-env-5.c @@ -25,6 +25,11 @@ /* Test the combination of feholdexcept() with feupdateenv(). */ +/* On *BSD/powerpc systems, raising FE_INVALID also sets FE_VXSOFT. */ +#ifndef FE_VXSOFT +# define FE_VXSOFT 0 +#endif + int main () { @@ -82,7 +87,10 @@ main () ASSERT (fegetround () == FE_UPWARD); /* Check that the exception flags are the union of the saved and of the current exception flags. */ - ASSERT (fetestexcept (FE_ALL_EXCEPT) == (supports_tracking ? FE_INVALID | FE_OVERFLOW | FE_UNDERFLOW | FE_INEXACT : 0)); + if (supports_tracking) + ASSERT ((fetestexcept (FE_ALL_EXCEPT) & ~FE_VXSOFT) == (FE_INVALID | FE_OVERFLOW | FE_UNDERFLOW | FE_INEXACT)); + else + ASSERT (fetestexcept (FE_ALL_EXCEPT) == 0); /* Check that the exception trap bits have been restored. */ ASSERT (fegetexcept () == (supports_trapping ? FE_DIVBYZERO : 0)); @@ -95,7 +103,10 @@ main () /* Check that the rounding direction has been restored, whereas the exception flags are unmodified. */ ASSERT (fegetround () == FE_TONEAREST); - ASSERT (fetestexcept (FE_ALL_EXCEPT) == (supports_tracking ? FE_INVALID | FE_OVERFLOW | FE_UNDERFLOW | FE_INEXACT : 0)); + if (supports_tracking) + ASSERT ((fetestexcept (FE_ALL_EXCEPT) & ~FE_VXSOFT) == (FE_INVALID | FE_OVERFLOW | FE_UNDERFLOW | FE_INEXACT)); + else + ASSERT (fetestexcept (FE_ALL_EXCEPT) == 0); /* Enable trapping on FE_INVALID. */ feclearexcept (FE_INVALID); diff --git a/tests/test-fenv-except-tracking-1.c b/tests/test-fenv-except-tracking-1.c index f795e2b278..70bdda563a 100644 --- a/tests/test-fenv-except-tracking-1.c +++ b/tests/test-fenv-except-tracking-1.c @@ -23,6 +23,14 @@ #include "macros.h" +/* On *BSD/powerpc systems, raising FE_INVALID also sets FE_VXSOFT. */ +#ifndef FE_VXSOFT +# define FE_VXSOFT 0 +#endif +#ifndef FE_VXZDZ +# define FE_VXZDZ 0 +#endif + static volatile double a, b, c; int @@ -37,7 +45,7 @@ main () ASSERT (/* with the libc's feraiseexcept(): */ fetestexcept (FE_ALL_EXCEPT) == FE_ALL_EXCEPT || /* with gnulib's feraiseexcept(): */ - fetestexcept (FE_ALL_EXCEPT) + (fetestexcept (FE_ALL_EXCEPT) & ~FE_VXSOFT) == (FE_DIVBYZERO | FE_INEXACT | FE_INVALID | FE_OVERFLOW | FE_UNDERFLOW)); ASSERT (fetestexcept (FE_INVALID) == FE_INVALID); ASSERT (fetestexcept (FE_DIVBYZERO) == FE_DIVBYZERO); @@ -58,7 +66,7 @@ main () /* Test setting just one exception flag: FE_INVALID. */ ASSERT (feclearexcept (FE_ALL_EXCEPT) == 0); ASSERT (feraiseexcept (FE_INVALID) == 0); - ASSERT (fetestexcept (FE_ALL_EXCEPT) == FE_INVALID); + ASSERT ((fetestexcept (FE_ALL_EXCEPT) & ~FE_VXSOFT) == FE_INVALID); ASSERT (fetestexcept (FE_INVALID) == FE_INVALID); ASSERT (fetestexcept (FE_DIVBYZERO) == 0); ASSERT (fetestexcept (FE_OVERFLOW) == 0); @@ -128,7 +136,7 @@ main () ASSERT (/* with the libc's feraiseexcept(): */ fetestexcept (FE_ALL_EXCEPT) == (FE_ALL_EXCEPT & ~FE_DIVBYZERO) || /* with gnulib's feraiseexcept(): */ - fetestexcept (FE_ALL_EXCEPT) + (fetestexcept (FE_ALL_EXCEPT) & ~FE_VXSOFT) == (FE_INEXACT | FE_INVALID | FE_OVERFLOW | FE_UNDERFLOW)); ASSERT (fetestexcept (FE_INVALID) == FE_INVALID); ASSERT (fetestexcept (FE_DIVBYZERO) == 0); @@ -142,7 +150,7 @@ main () ASSERT (/* with the libc's feraiseexcept(): */ fetestexcept (FE_ALL_EXCEPT) == (FE_ALL_EXCEPT & ~FE_OVERFLOW) || /* with gnulib's feraiseexcept(): */ - fetestexcept (FE_ALL_EXCEPT) + (fetestexcept (FE_ALL_EXCEPT) & ~FE_VXSOFT) == (FE_DIVBYZERO | FE_INEXACT | FE_INVALID | FE_UNDERFLOW)); ASSERT (fetestexcept (FE_INVALID) == FE_INVALID); ASSERT (fetestexcept (FE_DIVBYZERO) == FE_DIVBYZERO); @@ -156,7 +164,7 @@ main () ASSERT (/* with the libc's feraiseexcept(): */ fetestexcept (FE_ALL_EXCEPT) == (FE_ALL_EXCEPT & ~FE_UNDERFLOW) || /* with gnulib's feraiseexcept(): */ - fetestexcept (FE_ALL_EXCEPT) + (fetestexcept (FE_ALL_EXCEPT) & ~FE_VXSOFT) == (FE_DIVBYZERO | FE_INEXACT | FE_INVALID | FE_OVERFLOW)); ASSERT (fetestexcept (FE_INVALID) == FE_INVALID); ASSERT (fetestexcept (FE_DIVBYZERO) == FE_DIVBYZERO); @@ -170,7 +178,7 @@ main () ASSERT (/* with the libc's feraiseexcept(): */ fetestexcept (FE_ALL_EXCEPT) == (FE_ALL_EXCEPT & ~FE_INEXACT) || /* with gnulib's feraiseexcept(): */ - fetestexcept (FE_ALL_EXCEPT) + (fetestexcept (FE_ALL_EXCEPT) & ~FE_VXSOFT) == (FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW | FE_UNDERFLOW)); ASSERT (fetestexcept (FE_INVALID) == FE_INVALID); ASSERT (fetestexcept (FE_DIVBYZERO) == FE_DIVBYZERO); @@ -183,7 +191,7 @@ main () /* Test the effects of an operation that produces FE_INVALID. */ ASSERT (feclearexcept (FE_ALL_EXCEPT) == 0); a = 0; b = 0; c = a / b; - ASSERT (fetestexcept (FE_ALL_EXCEPT) == FE_INVALID); + ASSERT ((fetestexcept (FE_ALL_EXCEPT) & ~FE_VXZDZ) == FE_INVALID); ASSERT (fetestexcept (FE_INVALID) == FE_INVALID); ASSERT (fetestexcept (FE_DIVBYZERO) == 0); ASSERT (fetestexcept (FE_OVERFLOW) == 0); diff --git a/tests/test-fenv-except-tracking-4.c b/tests/test-fenv-except-tracking-4.c index 9f8859dac9..060d036b07 100644 --- a/tests/test-fenv-except-tracking-4.c +++ b/tests/test-fenv-except-tracking-4.c @@ -25,6 +25,11 @@ /* Check that fesetexcept() works. */ +/* On *BSD/powerpc systems, raising FE_INVALID also sets FE_VXSOFT. */ +#ifndef FE_VXSOFT +# define FE_VXSOFT 0 +#endif + int main () { @@ -42,7 +47,7 @@ main () /* Test setting just one exception flag: FE_INVALID. */ ASSERT (feclearexcept (FE_ALL_EXCEPT) == 0); ASSERT (fesetexcept (FE_INVALID) == 0); - ASSERT (fetestexcept (FE_ALL_EXCEPT) == FE_INVALID); + ASSERT ((fetestexcept (FE_ALL_EXCEPT) & ~FE_VXSOFT) == FE_INVALID); ASSERT (fetestexcept (FE_INVALID) == FE_INVALID); ASSERT (fetestexcept (FE_DIVBYZERO) == 0); ASSERT (fetestexcept (FE_OVERFLOW) == 0); -- 2.39.5