[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
fenv-exceptions-tracking-c99: Work around a NetBSD/x86_64 bug
|
From: |
Bruno Haible |
|
Subject: |
fenv-exceptions-tracking-c99: Work around a NetBSD/x86_64 bug |
|
Date: |
Sat, 04 Nov 2023 14:40:54 +0100 |
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 <bruno@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 \
| [Prev in Thread] |
Current Thread |
[Next in Thread] |
- fenv-exceptions-tracking-c99: Work around a NetBSD/x86_64 bug,
Bruno Haible <=