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

Reply via email to