On AIX, when I force the inclusion of the fetestexcept() override, through
an added
  REPLACE_FETESTEXCEPT=1
in the *.m4 files, and use a gcc-compatible compiler, I see unit test failures:

  ../../gltests/test-fenv-except-state-3.c:56: assertion 'fetestexcept 
(FE_INVALID) == FE_INVALID' failed
  FAIL test-fenv-except-state-3 (exit status: 134)

  ../../gltests/test-fenv-except-state-1.c:47: assertion 'fetestexcept 
(FE_INVALID) == FE_INVALID' failed
  FAIL test-fenv-except-state-1 (exit status: 134)

  ../../gltests/test-fenv-except-tracking-1.c:41: assertion 'fetestexcept 
(FE_ALL_EXCEPT) == FE_ALL_EXCEPT || fetestexcept (FE_ALL_EXCEPT) == 
(FE_DIVBYZERO | FE_INEXACT | FE_INVALID | FE_OVERFLOW | FE_UNDERFLOW)' failed
  FAIL test-fenv-except-tracking-1 (exit status: 134)

This patch fixes it.  Although this code is not used by default, it's worth
having the correct code committed, rather than a buggy one.


2023-11-04  Bruno Haible  <br...@clisp.org>

        fenv-exceptions-tracking-c99: Fix fetestexcept() override for AIX.
        * lib/fenv-except-tracking-test.c (fetestexcept): On AIX, use
        fp_read_flag() rather than the fpscr register.

diff --git a/lib/fenv-except-tracking-test.c b/lib/fenv-except-tracking-test.c
index efb9baa9ae..5f6bd7d8b2 100644
--- a/lib/fenv-except-tracking-test.c
+++ b/lib/fenv-except-tracking-test.c
@@ -24,7 +24,26 @@
 
 #include "fenv-private.h"
 
-#if defined __GNUC__ || defined __clang__ || defined _MSC_VER
+#if defined _AIX && defined __powerpc__ /* AIX */
+
+/* On AIX, the register fpscr is augmented with a 32-bit word named fpscrx
+   in thread-local storage.  Instead of accessing fpscr, we must access the
+   combination.  The function fp_read_flag() does this.  */
+
+# include <float.h>
+# include <fpxcp.h>
+
+/* Documentation:
+   
<https://www.ibm.com/docs/en/aix/7.3?topic=f-fp-clr-flag-fp-set-flag-fp-read-flag-fp-swap-flag-subroutine>
  */
+
+int
+fetestexcept (int exceptions)
+{
+  fpflag_t flags = fp_read_flag ();
+  return fpflag_to_exceptions (flags) & FE_ALL_EXCEPT & exceptions;
+}
+
+#elif defined __GNUC__ || defined __clang__ || defined _MSC_VER
 
 # if (defined __x86_64__ || defined _M_X64) || (defined __i386 || defined 
_M_IX86)
 
@@ -230,21 +249,6 @@ fetestexcept (int exceptions)
   return flags & FE_ALL_EXCEPT & exceptions;
 }
 
-# elif defined _AIX && defined __powerpc__ /* AIX */
-
-#  include <float.h>
-#  include <fpxcp.h>
-
-/* Documentation:
-   
<https://www.ibm.com/docs/en/aix/7.3?topic=f-fp-clr-flag-fp-set-flag-fp-read-flag-fp-swap-flag-subroutine>
  */
-
-int
-fetestexcept (int exceptions)
-{
-  fpflag_t flags = fp_read_flag ();
-  return fpflag_to_exceptions (flags) & FE_ALL_EXCEPT & exceptions;
-}
-
 # else
 
 #  define NEED_FALLBACK 1




Reply via email to