Building a testdir of gnulib on mingw/arm64, I see two test failures:
FAIL: test-fenv-except-tracking-4 ================================= ../../gltests/test-fenv-except-tracking-4.c:50: assertion '(fetestexcept (FE_ALL_EXCEPT) & ~FE_VXSOFT) == FE_INVALID' failed FAIL test-fenv-except-tracking-4.exe (exit status: 139) FAIL: test-fenv-except-state-2 ============================== ../../gltests/test-fenv-except-state-2.c:64: assertion 'fetestexcept (FE_INEXACT) == 0' failed FAIL test-fenv-except-state-2.exe (exit status: 139) This series of patches fixes it. 2026-09-09 Bruno Haible <[email protected]> fenv-*: Comments on Windows/arm64. * m4/fenv-exceptions-trapping.m4 (gl_FENV_EXCEPTIONS_TRAPPING): Update comment. 2026-09-09 Bruno Haible <[email protected]> fenv-*: Add support for Windows/arm64. * lib/fenv-private.h (exceptions_to_hardware, hardware_to_exceptions): Define also for arm64. * lib/fenv-except-tracking-clear.c (feclearexcept): Use them also for arm64. * lib/fenv-except-tracking-set.c (fesetexcept): Likewise. * lib/fenv-except-tracking-test.c (fetestexcept): Likewise. * lib/fenv-except-state-get.c (fegetexceptflag): Likewise. * lib/fenv-except-state-set.c (fesetexceptflag): Likewise. * lib/fenv-except-trapping.c (feenableexcept, fedisableexcept, fegetexcept): Likewise. * lib/fenv-env.c (fegetenv, fesetenv): Likewise. * lib/fenv.in.h: Update comments. 2026-09-09 Bruno Haible <[email protected]> fenv-*: Refactor. * lib/fenv-private.h (exceptions_to_hardware): Renamed from exceptions_to_x86hardware. (hardware_to_exceptions): Renamed from x86hardware_to_exceptions. * lib/fenv-except-tracking-clear.c (feclearexcept): Update. * lib/fenv-except-tracking-set.c (fesetexcept): Update. * lib/fenv-except-tracking-test.c (fetestexcept): Update. * lib/fenv-except-state-get.c (fegetexceptflag): Update. * lib/fenv-except-state-set.c (fesetexceptflag): Update. * lib/fenv-except-trapping.c (feenableexcept, fedisableexcept, fegetexcept): Update. * lib/fenv-env.c (fegetenv, fesetenv): Update. 2026-09-09 Bruno Haible <[email protected]> fenv-exceptions-state-c99: Fix configure test (regression 2026-01-16). * m4/fenv-exceptions-state.m4 (gl_FENV_EXCEPTIONS_STATE): Fix syntax error in test program.
>From e9329a0b5ea436d99a203b5249d1d02e3eab8bcc Mon Sep 17 00:00:00 2001 From: Bruno Haible <[email protected]> Date: Wed, 9 Sep 2026 02:58:36 +0200 Subject: [PATCH 1/4] fenv-exceptions-state-c99: Fix configure test (regression 2026-01-16). * m4/fenv-exceptions-state.m4 (gl_FENV_EXCEPTIONS_STATE): Fix syntax error in test program. --- ChangeLog | 6 ++++++ m4/fenv-exceptions-state.m4 | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index d3be2ce65b..372ac0c9ff 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2026-09-09 Bruno Haible <[email protected]> + + fenv-exceptions-state-c99: Fix configure test (regression 2026-01-16). + * m4/fenv-exceptions-state.m4 (gl_FENV_EXCEPTIONS_STATE): Fix syntax + error in test program. + 2026-09-07 Ineiev <[email protected]> Update copyright notice, per [email protected]. diff --git a/m4/fenv-exceptions-state.m4 b/m4/fenv-exceptions-state.m4 index 2b70e7702c..344f9a691e 100644 --- a/m4/fenv-exceptions-state.m4 +++ b/m4/fenv-exceptions-state.m4 @@ -1,5 +1,5 @@ # fenv-exceptions-state.m4 -# serial 6 +# serial 7 dnl Copyright (C) 2023-2026 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -74,7 +74,7 @@ AC_DEFUN([gl_FENV_EXCEPTIONS_STATE] AC_RUN_IFELSE( [AC_LANG_PROGRAM([[ #include <fenv.h> - #if !(defined _WIN32 && !defined __CYGWIN__ + #if !(defined _WIN32 && !defined __CYGWIN__) /* Avoid a crash on POSIX systems. */ #include <signal.h> #include <unistd.h> -- 2.53.0
From 3f994eb3783c1753456da797d5984181a844ed4f Mon Sep 17 00:00:00 2001 From: Bruno Haible <[email protected]> Date: Wed, 9 Sep 2026 12:29:46 +0200 Subject: [PATCH 2/4] fenv-*: Refactor. * lib/fenv-private.h (exceptions_to_hardware): Renamed from exceptions_to_x86hardware. (hardware_to_exceptions): Renamed from x86hardware_to_exceptions. * lib/fenv-except-tracking-clear.c (feclearexcept): Update. * lib/fenv-except-tracking-set.c (fesetexcept): Update. * lib/fenv-except-tracking-test.c (fetestexcept): Update. * lib/fenv-except-state-get.c (fegetexceptflag): Update. * lib/fenv-except-state-set.c (fesetexceptflag): Update. * lib/fenv-except-trapping.c (feenableexcept, fedisableexcept, fegetexcept): Update. * lib/fenv-env.c (fegetenv, fesetenv): Update. --- ChangeLog | 15 +++++++++++++++ lib/fenv-env.c | 16 ++++++++-------- lib/fenv-except-state-get.c | 4 ++-- lib/fenv-except-state-set.c | 4 ++-- lib/fenv-except-tracking-clear.c | 2 +- lib/fenv-except-tracking-set.c | 2 +- lib/fenv-except-tracking-test.c | 4 ++-- lib/fenv-except-trapping.c | 10 +++++----- lib/fenv-private.h | 10 +++++----- 9 files changed, 41 insertions(+), 26 deletions(-) diff --git a/ChangeLog b/ChangeLog index 372ac0c9ff..dfb0157320 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,18 @@ +2026-09-09 Bruno Haible <[email protected]> + + fenv-*: Refactor. + * lib/fenv-private.h (exceptions_to_hardware): Renamed from + exceptions_to_x86hardware. + (hardware_to_exceptions): Renamed from x86hardware_to_exceptions. + * lib/fenv-except-tracking-clear.c (feclearexcept): Update. + * lib/fenv-except-tracking-set.c (fesetexcept): Update. + * lib/fenv-except-tracking-test.c (fetestexcept): Update. + * lib/fenv-except-state-get.c (fegetexceptflag): Update. + * lib/fenv-except-state-set.c (fesetexceptflag): Update. + * lib/fenv-except-trapping.c (feenableexcept, fedisableexcept, + fegetexcept): Update. + * lib/fenv-env.c (fegetenv, fesetenv): Update. + 2026-09-09 Bruno Haible <[email protected]> fenv-exceptions-state-c99: Fix configure test (regression 2026-01-16). diff --git a/lib/fenv-env.c b/lib/fenv-env.c index be9c9090fc..06e9c8c1ca 100644 --- a/lib/fenv-env.c +++ b/lib/fenv-env.c @@ -177,9 +177,9 @@ fegetenv (fenv_t *envp) /* rounding direction */ unsigned int round_387 = (env387.__control_word & 0x0C00) >> 2; /* exception trap bits (inverted) */ - unsigned int trapbits_387 = x86hardware_to_exceptions (env387.__control_word); + unsigned int trapbits_387 = hardware_to_exceptions (env387.__control_word); /* exception flags */ - unsigned int excflags_387 = x86hardware_to_exceptions (env387.__status_word); + unsigned int excflags_387 = hardware_to_exceptions (env387.__status_word); unsigned int mxcsr; _FPU_GETSSECW (mxcsr); @@ -187,9 +187,9 @@ fegetenv (fenv_t *envp) /* rounding direction */ unsigned int round_sse = (mxcsr & 0x6000) >> 5; /* exception trap bits (inverted) */ - unsigned int trapbits_sse = x86hardware_to_exceptions (mxcsr >> 7); + unsigned int trapbits_sse = hardware_to_exceptions (mxcsr >> 7); /* exception flags */ - unsigned int excflags_sse = x86hardware_to_exceptions (mxcsr); + unsigned int excflags_sse = hardware_to_exceptions (mxcsr); envp->_Fe_ctl = (round_sse << 22) | (round_387 << 14) | round_sse | round_387 @@ -304,11 +304,11 @@ fesetenv (fenv_t const *envp) unsigned int excflags_387 = (envp->_Fe_stat >> 16) & 0x1F; unsigned int excflags_sse = (envp->_Fe_stat >> 24) & 0x1F; - env_fctrl = (round_387 << 2) | exceptions_to_x86hardware (trapbits_387); - env_fstat = exceptions_to_x86hardware (excflags_387); + env_fctrl = (round_387 << 2) | exceptions_to_hardware (trapbits_387); + env_fstat = exceptions_to_hardware (excflags_387); env_mxcsr = (round_sse << 5) - | (exceptions_to_x86hardware (trapbits_sse) << 7) - | exceptions_to_x86hardware (excflags_sse); + | (exceptions_to_hardware (trapbits_sse) << 7) + | exceptions_to_hardware (excflags_sse); } /* In the SSE unit. */ diff --git a/lib/fenv-except-state-get.c b/lib/fenv-except-state-get.c index fecaba9aab..adab922aad 100644 --- a/lib/fenv-except-state-get.c +++ b/lib/fenv-except-state-get.c @@ -41,7 +41,7 @@ fegetexceptflag (fexcept_t *saved_flags, int exceptions) unsigned int mxcsr; _FPU_GETSSECW (mxcsr); - *saved_flags = x86hardware_to_exceptions (mxcsr) & FE_ALL_EXCEPT & exceptions; + *saved_flags = hardware_to_exceptions (mxcsr) & FE_ALL_EXCEPT & exceptions; # else @@ -55,7 +55,7 @@ fegetexceptflag (fexcept_t *saved_flags, int exceptions) _FPU_GETSSECW (mxcsr); } - *saved_flags = x86hardware_to_exceptions (fstat | mxcsr) + *saved_flags = hardware_to_exceptions (fstat | mxcsr) & FE_ALL_EXCEPT & exceptions; # endif diff --git a/lib/fenv-except-state-set.c b/lib/fenv-except-state-set.c index ed718199da..6f5a2ac46a 100644 --- a/lib/fenv-except-state-set.c +++ b/lib/fenv-except-state-set.c @@ -40,8 +40,8 @@ fesetexceptflag (fexcept_t const *saved_flags, int exceptions) unsigned int desired_flags = (unsigned int) *saved_flags; - exceptions = exceptions_to_x86hardware (exceptions); - desired_flags = exceptions_to_x86hardware (desired_flags); + exceptions = exceptions_to_hardware (exceptions); + desired_flags = exceptions_to_hardware (desired_flags); # if defined _MSC_VER diff --git a/lib/fenv-except-tracking-clear.c b/lib/fenv-except-tracking-clear.c index 61bc1efaf8..111b2104c8 100644 --- a/lib/fenv-except-tracking-clear.c +++ b/lib/fenv-except-tracking-clear.c @@ -33,7 +33,7 @@ feclearexcept (int exceptions) { exceptions &= FE_ALL_EXCEPT; - exceptions = exceptions_to_x86hardware (exceptions); + exceptions = exceptions_to_hardware (exceptions); # if defined _MSC_VER diff --git a/lib/fenv-except-tracking-set.c b/lib/fenv-except-tracking-set.c index e9c4f183ba..bc73ae2d11 100644 --- a/lib/fenv-except-tracking-set.c +++ b/lib/fenv-except-tracking-set.c @@ -33,7 +33,7 @@ fesetexcept (int exceptions) { exceptions &= FE_ALL_EXCEPT; - exceptions = exceptions_to_x86hardware (exceptions); + exceptions = exceptions_to_hardware (exceptions); # if defined _MSC_VER diff --git a/lib/fenv-except-tracking-test.c b/lib/fenv-except-tracking-test.c index bae330cd20..ee92ec3498 100644 --- a/lib/fenv-except-tracking-test.c +++ b/lib/fenv-except-tracking-test.c @@ -55,7 +55,7 @@ fetestexcept (int exceptions) /* Look at the flags in the SSE unit. */ unsigned int mxcsr; _FPU_GETSSECW (mxcsr); - return x86hardware_to_exceptions (mxcsr) & FE_ALL_EXCEPT & exceptions; + return hardware_to_exceptions (mxcsr) & FE_ALL_EXCEPT & exceptions; # else @@ -69,7 +69,7 @@ fetestexcept (int exceptions) _FPU_GETSSECW (mxcsr); } - return x86hardware_to_exceptions (fstat | mxcsr) & FE_ALL_EXCEPT & exceptions; + return hardware_to_exceptions (fstat | mxcsr) & FE_ALL_EXCEPT & exceptions; # endif } diff --git a/lib/fenv-except-trapping.c b/lib/fenv-except-trapping.c index d7f4cf6bd4..9aa9a9196e 100644 --- a/lib/fenv-except-trapping.c +++ b/lib/fenv-except-trapping.c @@ -33,7 +33,7 @@ feenableexcept (int exceptions) { exceptions &= FE_ALL_EXCEPT; - exceptions = exceptions_to_x86hardware (exceptions); + exceptions = exceptions_to_hardware (exceptions); # if defined _MSC_VER @@ -69,7 +69,7 @@ feenableexcept (int exceptions) # endif - return x86hardware_to_exceptions (trapbits); + return hardware_to_exceptions (trapbits); } int @@ -77,7 +77,7 @@ fedisableexcept (int exceptions) { exceptions &= FE_ALL_EXCEPT; - exceptions = exceptions_to_x86hardware (exceptions); + exceptions = exceptions_to_hardware (exceptions); # if defined _MSC_VER @@ -113,7 +113,7 @@ fedisableexcept (int exceptions) # endif - return x86hardware_to_exceptions (trapbits); + return hardware_to_exceptions (trapbits); } int @@ -131,7 +131,7 @@ fegetexcept (void) unsigned int trapbits = 0x3f & ~fctrl; # endif - return x86hardware_to_exceptions (trapbits); + return hardware_to_exceptions (trapbits); } # elif defined __aarch64__ /* arm64 */ diff --git a/lib/fenv-private.h b/lib/fenv-private.h index 54e232fffe..ddfe46109d 100644 --- a/lib/fenv-private.h +++ b/lib/fenv-private.h @@ -99,21 +99,21 @@ x86_387_fenv_t; /* The MSVC and mingw ≥ 13 header files have different values for the floating-point exceptions than all the other platforms. Define some handy macros for conversion. */ -# define exceptions_to_x86hardware(exceptions) \ +# define exceptions_to_hardware(exceptions) \ ( ((exceptions) & FE_INVALID ? 0x01 : 0) \ | ((exceptions) & FE_DIVBYZERO ? 0x04 : 0) \ | ((exceptions) & FE_OVERFLOW ? 0x08 : 0) \ | ((exceptions) & FE_UNDERFLOW ? 0x10 : 0) \ | ((exceptions) & FE_INEXACT ? 0x20 : 0)) -# define x86hardware_to_exceptions(fstat) \ +# define hardware_to_exceptions(fstat) \ ( ((fstat) & 0x01 ? FE_INVALID : 0) \ | ((fstat) & 0x04 ? FE_DIVBYZERO : 0) \ | ((fstat) & 0x08 ? FE_OVERFLOW : 0) \ | ((fstat) & 0x10 ? FE_UNDERFLOW : 0) \ | ((fstat) & 0x20 ? FE_INEXACT : 0)) # else -# define exceptions_to_x86hardware(exceptions) (exceptions) -# define x86hardware_to_exceptions(fstat) (fstat) +# define exceptions_to_hardware(exceptions) (exceptions) +# define hardware_to_exceptions(fstat) (fstat) # endif /* When _MSC_VER is defined, the 387 compatible floating-point unit is *not* @@ -124,7 +124,7 @@ x86_387_fenv_t; - After fegetenv (&env), the value of env._Fe_stat is *not* the fstat register of the 387 unit. Rather, it is a artificial value. In particular, (env._Fe_stat & 0x3f) is - == x86hardware_to_exceptions (_FPU_GETSSECW () & 0x3f). */ + == hardware_to_exceptions (_FPU_GETSSECW () & 0x3f). */ #elif defined __aarch64__ /* arm64 */ -- 2.53.0
From fa9c0e7990ff83601275c0c06874dd2a7fd83ce1 Mon Sep 17 00:00:00 2001 From: Bruno Haible <[email protected]> Date: Wed, 9 Sep 2026 12:35:23 +0200 Subject: [PATCH 3/4] fenv-*: Add support for Windows/arm64. * lib/fenv-private.h (exceptions_to_hardware, hardware_to_exceptions): Define also for arm64. * lib/fenv-except-tracking-clear.c (feclearexcept): Use them also for arm64. * lib/fenv-except-tracking-set.c (fesetexcept): Likewise. * lib/fenv-except-tracking-test.c (fetestexcept): Likewise. * lib/fenv-except-state-get.c (fegetexceptflag): Likewise. * lib/fenv-except-state-set.c (fesetexceptflag): Likewise. * lib/fenv-except-trapping.c (feenableexcept, fedisableexcept, fegetexcept): Likewise. * lib/fenv-env.c (fegetenv, fesetenv): Likewise. * lib/fenv.in.h: Update comments. --- ChangeLog | 16 ++++++++++++++++ lib/fenv-except-state-get.c | 2 +- lib/fenv-except-state-set.c | 8 +++++++- lib/fenv-except-tracking-clear.c | 2 ++ lib/fenv-except-tracking-set.c | 2 ++ lib/fenv-except-tracking-test.c | 2 +- lib/fenv-except-trapping.c | 13 ++++++++++--- lib/fenv-private.h | 21 +++++++++++++++++++++ lib/fenv.in.h | 3 ++- 9 files changed, 62 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index dfb0157320..56363c187a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,19 @@ +2026-09-09 Bruno Haible <[email protected]> + + fenv-*: Add support for Windows/arm64. + * lib/fenv-private.h (exceptions_to_hardware, hardware_to_exceptions): + Define also for arm64. + * lib/fenv-except-tracking-clear.c (feclearexcept): Use them also for + arm64. + * lib/fenv-except-tracking-set.c (fesetexcept): Likewise. + * lib/fenv-except-tracking-test.c (fetestexcept): Likewise. + * lib/fenv-except-state-get.c (fegetexceptflag): Likewise. + * lib/fenv-except-state-set.c (fesetexceptflag): Likewise. + * lib/fenv-except-trapping.c (feenableexcept, fedisableexcept, + fegetexcept): Likewise. + * lib/fenv-env.c (fegetenv, fesetenv): Likewise. + * lib/fenv.in.h: Update comments. + 2026-09-09 Bruno Haible <[email protected]> fenv-*: Refactor. diff --git a/lib/fenv-except-state-get.c b/lib/fenv-except-state-get.c index adab922aad..fe9a71acd6 100644 --- a/lib/fenv-except-state-get.c +++ b/lib/fenv-except-state-get.c @@ -76,7 +76,7 @@ fegetexceptflag (fexcept_t *saved_flags, int exceptions) /* Just like fetestexcept. */ unsigned long fpsr; _FPU_GETFPSR (fpsr); - *saved_flags = fpsr & FE_ALL_EXCEPT & exceptions; + *saved_flags = hardware_to_exceptions (fpsr) & FE_ALL_EXCEPT & exceptions; return 0; } diff --git a/lib/fenv-except-state-set.c b/lib/fenv-except-state-set.c index 6f5a2ac46a..d334e39493 100644 --- a/lib/fenv-except-state-set.c +++ b/lib/fenv-except-state-set.c @@ -114,10 +114,16 @@ fesetexceptflag (fexcept_t const *saved_flags, int exceptions) int fesetexceptflag (fexcept_t const *saved_flags, int exceptions) { + exceptions &= FE_ALL_EXCEPT; + unsigned long desired_flags = (unsigned long) *saved_flags; + + exceptions = exceptions_to_hardware (exceptions); + desired_flags = exceptions_to_hardware (desired_flags); + unsigned long fpsr, orig_fpsr; _FPU_GETFPSR (orig_fpsr); - fpsr = orig_fpsr ^ ((orig_fpsr ^ desired_flags) & FE_ALL_EXCEPT & exceptions); + fpsr = orig_fpsr ^ ((orig_fpsr ^ desired_flags) & exceptions); if (fpsr != orig_fpsr) _FPU_SETFPSR (fpsr); /* Possibly some new exception flags have been set. But just storing them diff --git a/lib/fenv-except-tracking-clear.c b/lib/fenv-except-tracking-clear.c index 111b2104c8..e6661de5a7 100644 --- a/lib/fenv-except-tracking-clear.c +++ b/lib/fenv-except-tracking-clear.c @@ -76,6 +76,8 @@ feclearexcept (int exceptions) { exceptions &= FE_ALL_EXCEPT; + exceptions = exceptions_to_hardware (exceptions); + unsigned long fpsr, orig_fpsr; _FPU_GETFPSR (orig_fpsr); fpsr = orig_fpsr & ~exceptions; diff --git a/lib/fenv-except-tracking-set.c b/lib/fenv-except-tracking-set.c index bc73ae2d11..6ea5b924ca 100644 --- a/lib/fenv-except-tracking-set.c +++ b/lib/fenv-except-tracking-set.c @@ -97,6 +97,8 @@ fesetexcept (int exceptions) { exceptions &= FE_ALL_EXCEPT; + exceptions = exceptions_to_hardware (exceptions); + unsigned long fpsr, orig_fpsr; _FPU_GETFPSR (orig_fpsr); fpsr = orig_fpsr | exceptions; diff --git a/lib/fenv-except-tracking-test.c b/lib/fenv-except-tracking-test.c index ee92ec3498..6bd7bb57c1 100644 --- a/lib/fenv-except-tracking-test.c +++ b/lib/fenv-except-tracking-test.c @@ -81,7 +81,7 @@ fetestexcept (int exceptions) { unsigned long fpsr; _FPU_GETFPSR (fpsr); - return fpsr & FE_ALL_EXCEPT & exceptions; + return hardware_to_exceptions (fpsr) & FE_ALL_EXCEPT & exceptions; } # elif defined __arm__ diff --git a/lib/fenv-except-trapping.c b/lib/fenv-except-trapping.c index 9aa9a9196e..30a66b5ec0 100644 --- a/lib/fenv-except-trapping.c +++ b/lib/fenv-except-trapping.c @@ -141,6 +141,8 @@ feenableexcept (int exceptions) { exceptions &= FE_ALL_EXCEPT; + exceptions = exceptions_to_hardware (exceptions); + unsigned long fpcr, orig_fpcr; _FPU_GETCW (orig_fpcr); fpcr = orig_fpcr | (exceptions << 8); @@ -154,7 +156,8 @@ feenableexcept (int exceptions) return -1; } - return FE_ALL_EXCEPT & (orig_fpcr >> 8); + unsigned int trapbits = orig_fpcr >> 8; + return FE_ALL_EXCEPT & hardware_to_exceptions (trapbits); } int @@ -162,6 +165,8 @@ fedisableexcept (int exceptions) { exceptions &= FE_ALL_EXCEPT; + exceptions = exceptions_to_hardware (exceptions); + unsigned long fpcr, orig_fpcr; _FPU_GETCW (orig_fpcr); fpcr = orig_fpcr & ~(exceptions << 8); @@ -172,7 +177,8 @@ fedisableexcept (int exceptions) here, since we only cleared some bits. */ } - return FE_ALL_EXCEPT & (orig_fpcr >> 8); + unsigned int trapbits = orig_fpcr >> 8; + return FE_ALL_EXCEPT & hardware_to_exceptions (trapbits); } int @@ -180,7 +186,8 @@ fegetexcept (void) { unsigned long fpcr; _FPU_GETCW (fpcr); - return FE_ALL_EXCEPT & (fpcr >> 8); + unsigned int trapbits = fpcr >> 8; + return FE_ALL_EXCEPT & hardware_to_exceptions (trapbits); } # elif defined __arm__ diff --git a/lib/fenv-private.h b/lib/fenv-private.h index ddfe46109d..3d4ab7cc30 100644 --- a/lib/fenv-private.h +++ b/lib/fenv-private.h @@ -160,6 +160,27 @@ x86_387_fenv_t; __asm__ __volatile__ ("msr fpsr, %0" : : "r" (fpsr)) # endif +# if defined _MSC_VER || (defined __MINGW32__ && FE_INVALID != 0x01) +/* The MSVC and mingw ≥ 13 header files have different values for the + floating-point exceptions than all the other platforms. Define some + handy macros for conversion. */ +# define exceptions_to_hardware(exceptions) \ + ( ((exceptions) & FE_INVALID ? 0x01 : 0) \ + | ((exceptions) & FE_DIVBYZERO ? 0x02 : 0) \ + | ((exceptions) & FE_OVERFLOW ? 0x04 : 0) \ + | ((exceptions) & FE_UNDERFLOW ? 0x08 : 0) \ + | ((exceptions) & FE_INEXACT ? 0x10 : 0)) +# define hardware_to_exceptions(fpsr) \ + ( ((fpsr) & 0x01 ? FE_INVALID : 0) \ + | ((fpsr) & 0x02 ? FE_DIVBYZERO : 0) \ + | ((fpsr) & 0x04 ? FE_OVERFLOW : 0) \ + | ((fpsr) & 0x08 ? FE_UNDERFLOW : 0) \ + | ((fpsr) & 0x10 ? FE_INEXACT : 0)) +# else +# define exceptions_to_hardware(exceptions) (exceptions) +# define hardware_to_exceptions(fpsr) (fpsr) +# endif + #elif defined __arm__ /* fpscr bits 23..22 indicate the rounding direction. */ diff --git a/lib/fenv.in.h b/lib/fenv.in.h index e75bc80aa4..cfb0d75a61 100644 --- a/lib/fenv.in.h +++ b/lib/fenv.in.h @@ -424,7 +424,7 @@ _GL_CXXALIASWARN (fesetround); # if (defined __x86_64__ || defined _M_X64) || (defined __i386 || defined _M_IX86) -/* Attention: MSVC has different values for these macros! */ +/* Attention: MSVC and mingw >= 13 have different values for these macros! */ # define FE_INVALID (1 << 0) # if 0 /* non-standard */ # define FE_DENORMAL (1 << 1) @@ -436,6 +436,7 @@ _GL_CXXALIASWARN (fesetround); # elif defined __aarch64__ /* arm64 */ || defined __arm__ +/* Attention: MSVC and mingw >= 13 have different values for these macros! */ # define FE_INVALID (1U << 0) # define FE_DIVBYZERO (1U << 1) # define FE_OVERFLOW (1U << 2) -- 2.53.0
>From 889865548f7788057d8ebb1a1a62cf69d78c00b1 Mon Sep 17 00:00:00 2001 From: Bruno Haible <[email protected]> Date: Wed, 9 Sep 2026 12:58:23 +0200 Subject: [PATCH 4/4] fenv-*: Comments on Windows/arm64. * m4/fenv-exceptions-trapping.m4 (gl_FENV_EXCEPTIONS_TRAPPING): Update comment. --- ChangeLog | 6 ++++++ m4/fenv-exceptions-trapping.m4 | 5 +++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 56363c187a..e1295084b6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2026-09-09 Bruno Haible <[email protected]> + + fenv-*: Comments on Windows/arm64. + * m4/fenv-exceptions-trapping.m4 (gl_FENV_EXCEPTIONS_TRAPPING): Update + comment. + 2026-09-09 Bruno Haible <[email protected]> fenv-*: Add support for Windows/arm64. diff --git a/m4/fenv-exceptions-trapping.m4 b/m4/fenv-exceptions-trapping.m4 index 3679734775..599cc17af3 100644 --- a/m4/fenv-exceptions-trapping.m4 +++ b/m4/fenv-exceptions-trapping.m4 @@ -1,5 +1,5 @@ # fenv-exceptions-trapping.m4 -# serial 4 +# serial 5 dnl Copyright (C) 2023-2026 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -20,7 +20,8 @@ AC_DEFUN_ONCE([gl_FENV_EXCEPTIONS_TRAPPING] dnl Fixed through dnl <https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=302949e2940a9da3f6364a1574619e621b7e1e71>. dnl Similarly on FreeBSD 12.2/arm, FreeBSD 12.2/arm64, NetBSD 10.0/arm64. - dnl On mingw 14.0.0, feenableexcept and fedisableexcept are broken as well. + dnl On mingw 14.0.0 (both x86_64 and arm64), feenableexcept and + dnl fedisableexcept are broken as well. case "$host" in aarch64*-*-linux*) AC_CACHE_CHECK([whether feenableexcept works], -- 2.53.0
