On FreeBSD 14.0/powerpc64 and NetBSD 9.3/powerpc I'm seeing many test failures
of the fenv-* modules:

* FreeBSD 14.0/powerpc64 and FreeBSD 14.0/powerpc64le:

FAIL: test-fenv-env-2
FAIL: test-fenv-env-3
FAIL: test-fenv-env-4
FAIL: test-fenv-env-5
FAIL: test-fenv-except-state-2
FAIL: test-fenv-except-tracking-4
FAIL: test-fenv-except-tracking-1
FAIL: test-fenv-except-trapping-2.sh

* NetBSD 9.3/powerpc:

FAIL: test-fenv-env-2
FAIL: test-fenv-env-3
FAIL: test-fenv-env-4
FAIL: test-fenv-env-5
FAIL: test-fenv-env-6.sh
FAIL: test-fenv-except-state-2
FAIL: test-fenv-except-tracking-4
FAIL: test-fenv-except-tracking-1
FAIL: test-fenv-except-trapping-2.sh

This series of patches fixes them.


2024-01-19  Bruno Haible  <br...@clisp.org>

        fenv-environment: Fix for NetBSD/powerpc.
        * m4/fenv-environment.m4 (gl_FENV_ENVIRONMENT): For feupdateenv, use
        the same configure test on NetBSD/powerpc as on glibc/hppa.
        * doc/posix-functions/feupdateenv.texi: Mention the NetBSD/powerpc bug.

        fenv-exceptions-trapping: Avoid a test failure on *BSD/powerpc*.
        * tests/test-fenv-except-trapping-2.c (main): Skip the '4' tests also on
        FreeBSD/powerpc* and NetBSD/powerpc*.

        fenv-exceptions-state-c99: Fix for FreeBSD/powerpc64 and NetBSD/powerpc.
        * m4/fenv-exceptions-state.m4 (gl_FENV_EXCEPTIONS_STATE): On
        FreeBSD/powerpc64 and NetBSD/powerpc, set REPLACE_FESETEXCEPTFLAG.
        * doc/posix-functions/fesetexceptflag.texi: Mention the FreeBSD and
        NetBSD bug.

        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.

>From 48a7fb40d822bb96d89bf2a1be61b3497b89a267 Mon Sep 17 00:00:00 2001
From: Bruno Haible <br...@clisp.org>
Date: Fri, 19 Jan 2024 22:04:33 +0100
Subject: [PATCH 1/4] 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  <br...@clisp.org>
+
+	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  <br...@clisp.org>
 
 	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.34.1

>From da981cbdda0f58197788f2a1f8a9f2a428e55940 Mon Sep 17 00:00:00 2001
From: Bruno Haible <br...@clisp.org>
Date: Fri, 19 Jan 2024 22:34:27 +0100
Subject: [PATCH 2/4] fenv-exceptions-state-c99: Fix for FreeBSD/powerpc64 and
 NetBSD/powerpc.

* m4/fenv-exceptions-state.m4 (gl_FENV_EXCEPTIONS_STATE): On
FreeBSD/powerpc64 and NetBSD/powerpc, set REPLACE_FESETEXCEPTFLAG.
* doc/posix-functions/fesetexceptflag.texi: Mention the FreeBSD and
NetBSD bug.
---
 ChangeLog                                |  6 ++++++
 doc/posix-functions/fesetexceptflag.texi |  3 +++
 m4/fenv-exceptions-state.m4              | 15 +++++++++++++--
 3 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 6901b278f1..04ecfec904 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 2024-01-19  Bruno Haible  <br...@clisp.org>
 
+	fenv-exceptions-state-c99: Fix for FreeBSD/powerpc64 and NetBSD/powerpc.
+	* m4/fenv-exceptions-state.m4 (gl_FENV_EXCEPTIONS_STATE): On
+	FreeBSD/powerpc64 and NetBSD/powerpc, set REPLACE_FESETEXCEPTFLAG.
+	* doc/posix-functions/fesetexceptflag.texi: Mention the FreeBSD and
+	NetBSD bug.
+
 	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
diff --git a/doc/posix-functions/fesetexceptflag.texi b/doc/posix-functions/fesetexceptflag.texi
index 7a3971a3a5..065877e9ce 100644
--- a/doc/posix-functions/fesetexceptflag.texi
+++ b/doc/posix-functions/fesetexceptflag.texi
@@ -23,6 +23,9 @@
 @c https://sourceware.org/bugzilla/show_bug.cgi?id=30998
 glibc 2.37/alpha.
 @item
+This function loses the @code{FE_INVALID} flag on
+FreeBSD 14.0/powerpc64, NetBSD 9.3/powerpc.
+@item
 This function is also buggy on
 @c Without the override, the unit test test-fenv-except-state-1 fails.
 AIX 7.3.1.
diff --git a/m4/fenv-exceptions-state.m4 b/m4/fenv-exceptions-state.m4
index 0254518496..7333daf53c 100644
--- a/m4/fenv-exceptions-state.m4
+++ b/m4/fenv-exceptions-state.m4
@@ -1,4 +1,4 @@
-# fenv-exceptions-state.m4 serial 3
+# fenv-exceptions-state.m4 serial 4
 dnl Copyright (C) 2023-2024 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -195,10 +195,21 @@ AC_DEFUN([gl_FENV_EXCEPTIONS_STATE]
         *yes) ;;
         *) REPLACE_FESETEXCEPTFLAG=1 ;;
       esac
+      dnl Additionally, on FreeBSD/powerpc64 and NetBSD/powerpc, the unit test
+      dnl test-fenv-except-state-2 fails if we don't override fesetexceptflag.
+      dnl The function fesetexceptflag apparently fails to restore the
+      dnl FE_INVALID flag.
+      case "$host" in
+        powerpc*-*-freebsd* | powerpc*-*-netbsd*)
+          REPLACE_FESETEXCEPTFLAG=1
+          ;;
+      esac
       dnl Additionally, on AIX, the unit test test-fenv-except-state-1 fails
       dnl if we don't override fesetexceptflag.
       case "$host" in
-        powerpc*-*-aix*) REPLACE_FESETEXCEPTFLAG=1 ;;
+        powerpc*-*-aix*)
+          REPLACE_FESETEXCEPTFLAG=1
+          ;;
       esac
       dnl Additionally, on MSVC, we want the bits in the saved state to be
       dnl identified by the FE_* macros, so that the fetestexceptflag function
-- 
2.34.1

>From fe1ea460dd7a2683aa60cf7109f92d1960850f92 Mon Sep 17 00:00:00 2001
From: Bruno Haible <br...@clisp.org>
Date: Fri, 19 Jan 2024 22:43:55 +0100
Subject: [PATCH 3/4] fenv-exceptions-trapping: Avoid a test failure on
 *BSD/powerpc*.

* tests/test-fenv-except-trapping-2.c (main): Skip the '4' tests also on
FreeBSD/powerpc* and NetBSD/powerpc*.
---
 ChangeLog                           | 4 ++++
 tests/test-fenv-except-trapping-2.c | 5 +++--
 2 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 04ecfec904..7cef961362 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 2024-01-19  Bruno Haible  <br...@clisp.org>
 
+	fenv-exceptions-trapping: Avoid a test failure on *BSD/powerpc*.
+	* tests/test-fenv-except-trapping-2.c (main): Skip the '4' tests also on
+	FreeBSD/powerpc* and NetBSD/powerpc*.
+
 	fenv-exceptions-state-c99: Fix for FreeBSD/powerpc64 and NetBSD/powerpc.
 	* m4/fenv-exceptions-state.m4 (gl_FENV_EXCEPTIONS_STATE): On
 	FreeBSD/powerpc64 and NetBSD/powerpc, set REPLACE_FESETEXCEPTFLAG.
diff --git a/tests/test-fenv-except-trapping-2.c b/tests/test-fenv-except-trapping-2.c
index 57b9341f46..257107d2ee 100644
--- a/tests/test-fenv-except-trapping-2.c
+++ b/tests/test-fenv-except-trapping-2.c
@@ -433,8 +433,8 @@ main (int argc, char *argv[])
            GNU/kFreeBSD/i386, GNU/kFreeBSD/x86_64,
            musl libc/i386, musl libc/powerpc64le,
            macOS/i386, macOS/x86_64, macOS/arm64,
-           FreeBSD/i386, FreeBSD/x86_64,
-           NetBSD/i386, NetBSD/x86_64,
+           FreeBSD/i386, FreeBSD/x86_64, FreeBSD/powerpc64,
+           NetBSD/i386, NetBSD/x86_64, NetBSD/powerpc,
            OpenBSD/i386, OpenBSD/x86_64, OpenBSD/mips64,
            Minix/i386,
            AIX/powerpc,
@@ -460,6 +460,7 @@ main (int argc, char *argv[])
           || (defined MUSL_LIBC && ((defined __i386 || defined _M_IX86) || defined __powerpc__)) \
           || ((defined __APPLE__ && defined __MACH__) && ((defined __x86_64__ || defined _M_X64) || (defined __i386 || defined _M_IX86) || defined __aarch64__)) \
           || ((defined __FreeBSD__ || defined __NetBSD__ || defined __OpenBSD__) && ((defined __x86_64__ || defined _M_X64) || (defined __i386 || defined _M_IX86))) \
+          || ((defined __FreeBSD__ || defined __NetBSD__) && defined __powerpc__) \
           || (defined __OpenBSD__ && defined __mips64) \
           || (defined __minix && (defined __i386 || defined _M_IX86)) \
           || (defined _AIX && defined __powerpc__) \
-- 
2.34.1

>From 16276ab5c6b6b4154ba1c4577d53e7fe0fecc989 Mon Sep 17 00:00:00 2001
From: Bruno Haible <br...@clisp.org>
Date: Fri, 19 Jan 2024 22:58:43 +0100
Subject: [PATCH 4/4] fenv-environment: Fix for NetBSD/powerpc.

* m4/fenv-environment.m4 (gl_FENV_ENVIRONMENT): For feupdateenv, use
the same configure test on NetBSD/powerpc as on glibc/hppa.
* doc/posix-functions/feupdateenv.texi: Mention the NetBSD/powerpc bug.
---
 ChangeLog                            |  5 +++++
 doc/posix-functions/feupdateenv.texi |  3 ++-
 m4/fenv-environment.m4               | 13 +++++++------
 3 files changed, 14 insertions(+), 7 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 7cef961362..d8d2a13d9e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
 2024-01-19  Bruno Haible  <br...@clisp.org>
 
+	fenv-environment: Fix for NetBSD/powerpc.
+	* m4/fenv-environment.m4 (gl_FENV_ENVIRONMENT): For feupdateenv, use
+	the same configure test on NetBSD/powerpc as on glibc/hppa.
+	* doc/posix-functions/feupdateenv.texi: Mention the NetBSD/powerpc bug.
+
 	fenv-exceptions-trapping: Avoid a test failure on *BSD/powerpc*.
 	* tests/test-fenv-except-trapping-2.c (main): Skip the '4' tests also on
 	FreeBSD/powerpc* and NetBSD/powerpc*.
diff --git a/doc/posix-functions/feupdateenv.texi b/doc/posix-functions/feupdateenv.texi
index bb844ec2f1..4fd76416a1 100644
--- a/doc/posix-functions/feupdateenv.texi
+++ b/doc/posix-functions/feupdateenv.texi
@@ -34,7 +34,8 @@
 This function does not trigger traps on
 @c https://sourceware.org/bugzilla/show_bug.cgi?id=31023
 glibc 2.37/hppa,
-musl libc/s390x.
+musl libc/s390x,
+NetBSD 9.3/powerpc.
 @item
 This function may fail on some platforms:
 MSVC 14.
diff --git a/m4/fenv-environment.m4 b/m4/fenv-environment.m4
index 8d3911e6e4..bf4788dc9b 100644
--- a/m4/fenv-environment.m4
+++ b/m4/fenv-environment.m4
@@ -1,4 +1,4 @@
-# fenv-environment.m4 serial 2
+# fenv-environment.m4 serial 3
 dnl Copyright (C) 2023-2024 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -304,9 +304,10 @@ AC_DEFUN([gl_FENV_ENVIRONMENT]
     dnl <https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=a8c79c4088e8c04e4297936efa0dee6c8e6e974d>)
     dnl and on Mac OS X 10.5/{i386,x86_64} (where it forgets about the currently
     dnl set floating-point exception flags)
-    dnl and on musl libc/s390x (where it does not trigger traps)
-    dnl on musl libc/{i386,x86_64} and AIX and Solaris and mingw 10 (where it
-    dnl fails to restore the exception trap bits),
+    dnl and on musl libc/s390x and NetBSD 9.3/powerpc (where it does not trigger
+    dnl traps)
+    dnl and on musl libc/{i386,x86_64} and AIX and Solaris and mingw 10 (where
+    dnl it fails to restore the exception trap bits),
     dnl and on FreeBSD 12.2/arm64 (see
     dnl <https://cgit.freebsd.org/src/commit/?id=34cc08e336987a8ebc316595e3f552a4c09f1fd4>).
     dnl On MSVC 14 it may even fail.
@@ -329,8 +330,8 @@ AC_DEFUN([gl_FENV_ENVIRONMENT]
              [gl_cv_func_feupdateenv_works="guessing no"])
            LIBS="$saved_LIBS"
            ;;
-         # Guess no on glibc/hppa.
-         hppa*-*-*-gnu*)
+         # Guess no on glibc/hppa and NetBSD/powerpc64.
+         hppa*-*-*-gnu* | powerpc*-*-netbsd*)
            saved_LIBS="$LIBS"
            LIBS="$LIBS $FENV_ENVIRONMENT_LIBM"
            AC_RUN_IFELSE(
-- 
2.34.1

Reply via email to