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