From c6caa3218d514afd944c63b0cc69e6d51801e46b Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Sat, 4 Nov 2023 15:29:46 +0100 Subject: [PATCH] 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. --- ChangeLog | 6 ++++++ lib/fenv-except-tracking-test.c | 36 ++++++++++++++++++--------------- 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/ChangeLog b/ChangeLog index b63bf1abc3..b6f7d339d1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2023-11-04 Bruno Haible + + 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 fenv-exceptions-tracking-c99: Work around a NetBSD/x86_64 bug. 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 +# include + +/* Documentation: + */ + +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 -# include - -/* Documentation: - */ - -int -fetestexcept (int exceptions) -{ - fpflag_t flags = fp_read_flag (); - return fpflag_to_exceptions (flags) & FE_ALL_EXCEPT & exceptions; -} - # else # define NEED_FALLBACK 1 -- 2.39.5