On NetBSD/x86_64, I see test failures in soon-to-be-added unit tests. The cause is that fetestexcept(), which of course is meant to be side-effect-free, clears the exception trap bits.
The bug is evident from looking at the definition of fetestexcept() http://cvsweb.netbsd.org/bsdweb.cgi/src/lib/libm/arch/x86_64/fenv.c?rev=1.10&content-type=text/x-cvsweb-markup&only_with_tag=MAIN It uses an 'fnstenv' instruction without subsequent 'fldenv' or 'fldcw'. 2023-11-04 Bruno Haible <br...@clisp.org> fenv-exceptions-tracking-c99: Work around a NetBSD/x86_64 bug. * m4/fenv-exceptions-tracking.m4 (gl_FENV_EXCEPTIONS_TRACKING): On NetBSD/x86_64, set REPLACE_FETESTEXCEPT to 1. * doc/posix-functions/fetestexcept.texi: Document the NetBSD bug. diff --git a/doc/posix-functions/fetestexcept.texi b/doc/posix-functions/fetestexcept.texi index b8eba903be..7e9b8e3327 100644 --- a/doc/posix-functions/fetestexcept.texi +++ b/doc/posix-functions/fetestexcept.texi @@ -11,6 +11,10 @@ @item This function is missing on some platforms: FreeBSD 6.0, NetBSD 5.0, OpenBSD 3.8, Minix 3.1.8, AIX 5.1, IRIX 6.5, Solaris 9, Cygwin 1.7.7, MSVC 9, Android 4.4. +@item +This function clears the floating-point exception trap bits on some platforms: +@c It uses an 'fnstenv' instruction without subsequent 'fldenv' or 'fldcw'. +NetBSD 9.3/x86_64. @end itemize Portability problems not fixed by Gnulib: diff --git a/m4/fenv-exceptions-tracking.m4 b/m4/fenv-exceptions-tracking.m4 index a7ffa80784..1aa378f971 100644 --- a/m4/fenv-exceptions-tracking.m4 +++ b/m4/fenv-exceptions-tracking.m4 @@ -1,4 +1,4 @@ -# fenv-exceptions-tracking.m4 serial 1 +# fenv-exceptions-tracking.m4 serial 2 dnl Copyright (C) 2023 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,6 +20,8 @@ AC_DEFUN_ONCE([gl_FENV_EXCEPTIONS_TRACKING] dnl On musl libc, on those CPUs where fenv-except-tracking-raise.c dnl uses the "generic" approach, feraiseexcept does not trigger traps dnl because it merely manipulates flags in the control register. + dnl On NetBSD 9.3/x86_64, fetestexcept clears the exception trap bits, + dnl causing the fenv-environment tests to fail. case "$host" in arm*-*-linux*) AC_CACHE_CHECK([whether feraiseexcept works], @@ -110,6 +112,12 @@ AC_DEFUN_ONCE([gl_FENV_EXCEPTIONS_TRACKING] *) REPLACE_FERAISEEXCEPT=1 ;; esac ;; + x86_64-*-netbsd*) + dnl On NetBSD 9.3/x86_64, fetestexcept is broken: it clears the + dnl floating-point exception trap bits (because it uses an + dnl 'fnstenv' instruction without subsequent 'fldenv' or 'fldcw'). + REPLACE_FETESTEXCEPT=1 + ;; esac if test $REPLACE_FECLEAREXCEPT = 1 \ && test $REPLACE_FETESTEXCEPT = 1 \