]> Savannah Git Hosting - gnulib.git/commitdiff
fenv-exceptions-tracking-c99: Fix fetestexcept() override for AIX.
authorBruno Haible <bruno@clisp.org>
Sat, 4 Nov 2023 14:29:46 +0000 (15:29 +0100)
committerBruno Haible <bruno@clisp.org>
Sat, 4 Nov 2023 14:34:08 +0000 (15:34 +0100)
* lib/fenv-except-tracking-test.c (fetestexcept): On AIX, use
fp_read_flag() rather than the fpscr register.

ChangeLog
lib/fenv-except-tracking-test.c

index b63bf1abc3d8ad4126c8e20153c0630925b8a3ab..b6f7d339d1efe313c10e444010aaf32d4dfe3ea8 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2023-11-04  Bruno Haible  <bruno@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.
+
 2023-11-04  Bruno Haible  <bruno@clisp.org>
 
        fenv-exceptions-tracking-c99: Work around a NetBSD/x86_64 bug.
index efb9baa9ae08613bef7461a68009aefa73460636..5f6bd7d8b2c91ee273560113122a5d83448766f1 100644 (file)
 
 #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