summary refs log tree commit diff
path: root/sysdeps/alpha
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2000-08-19 16:58:09 +0000
committerUlrich Drepper <drepper@redhat.com>2000-08-19 16:58:09 +0000
commit60f0e64b3c13cf717fd49d327dbbca88568ca647 (patch)
tree06093754479c7bbe18bed7bb50a905358290f42f /sysdeps/alpha
parent277723d891149ded87f4d7fbb080575c722bdf75 (diff)
downloadglibc-60f0e64b3c13cf717fd49d327dbbca88568ca647.tar.gz
glibc-60f0e64b3c13cf717fd49d327dbbca88568ca647.tar.xz
glibc-60f0e64b3c13cf717fd49d327dbbca88568ca647.zip
Update.
	* malloc/mtrace.pl (usage): Inform about --help.

2000-08-19  Wolfram Gloger  <wg@malloc.de>

	* malloc/malloc.c (new_heap): try harder to get an aligned chunk of
	size HEAP_MAX_SIZE.

2000-08-19  Andreas Jaeger  <aj@suse.de>

	* shlib-versions: Remove libnss_db, libdb and libdb1.

2000-08-19  Jakub Jelinek  <jakub@redhat.com>

	* sysdeps/unix/sysv/linux/alpha/readdir.c: Move...
	* sysdeps/unix/sysv/linux/ia64/readdir.c: ...here and
	* sysdeps/unix/sysv/linux/sparc/sparc64/readdir.c: ...here.
	* sysdeps/unix/sysv/linux/alpha/readdir_r.c: Move...
	* sysdeps/unix/sysv/linux/ia64/readdir_r.c: ...here and
	* sysdeps/unix/sysv/linux/sparc/sparc64/readdir_r.c: ...here.
	* sysdeps/unix/sysv/linux/alpha/readdir64.c: Remove.
	* sysdeps/unix/sysv/linux/alpha/readdir64_r.c: Remove.
	* sysdeps/unix/sysv/linux/alpha/getdents64.c: Remove.
	* sysdeps/unix/sysv/linux/alpha/getdents.c: Only use for non-LFS
	getdents.
	* sysdeps/unix/sysv/linux/readdir64.c: Remove versioning.
	* sysdeps/unix/sysv/linux/readdir64_r.c: Likewise.

2000-08-18  Jakub Jelinek  <jakub@redhat.com>

	* include/glob.h (__glob64): Add prototype.
	* sysdeps/generic/glob.c: If GLOB_ONLY_P is defined, only
	define glob and glob_in_dir.
	* sysdeps/unix/sysv/linux/i386/Versions: Add glob64@@GLIBC_2.2.
	* sysdeps/unix/sysv/linux/arm/Versions: Likewise.
	* sysdeps/unix/sysv/linux/powerpc/Versions: Likewise.
	* sysdeps/unix/sysv/linux/sparc/sparc32/Versions: Likewise.
	* sysdeps/unix/sysv/linux/i386/glob64.c: New file.
	* sysdeps/unix/sysv/linux/arm/glob64.c: New file.
	* sysdeps/unix/sysv/linux/powerpc/glob64.c: New file.
	* sysdeps/unix/sysv/linux/sparc/sparc32/glob64.c: New file.

2000-08-18  Jakub Jelinek  <jakub@redhat.com>

	* malloc/Makefile (memusage): libmemusage.so is installed in slibdir.

2000-08-17  Andreas Jaeger  <aj@suse.de>

	* math/test-fenv.c (fe_single_test): New function.
	(fe_env_tests): Use fe_single_test.
	(feenable_test): New tests for feenable/fedisable and
	fegetexcpetions.
	(feexcp_mask_test): New function.
	(feexcp_nomask_test): New function.

2000-08-19  Richard Henderson  <rth@cygnus.com>

	* sysdeps/alpha/fpu/fenv_libc.h: New file.
	* sysdeps/alpha/fpu/fclrexcpt.c: Use it.
	* sysdeps/alpha/fpu/fegetenv.c: Likewise.
	* sysdeps/alpha/fpu/fesetround.c: Likewise.
	* sysdeps/alpha/fpu/fegetround.c: Likewise.
	* sysdeps/alpha/fpu/fgetexcptflg.c: Likewise.
	* sysdeps/alpha/fpu/fraiseexcpt.c: Likewise.
	* sysdeps/alpha/fpu/ftestexcept.c: Likewise.
	* sysdeps/alpha/fpu/fedisblxcpt.c: Likewise.  Use the smaller mask.
	* sysdeps/alpha/fpu/feenablxcpt.c: Likewise.
	* sysdeps/alpha/fpu/fegetexcept.c: Likewise.
	* sysdeps/alpha/fpu/feholdexcpt.c: Retain the SWCR_MAP bits.
	* sysdeps/alpha/fpu/fesetenv.c: Likewise.
	* sysdeps/alpha/fpu/feupdateenv.c: Likewise.
	* sysdeps/alpha/fpu/fsetexcptflg.c: Likewise.
	* sysdeps/alpha/fpu/bits/fenv.h (FE_DENORMAL): New.
	(FE_MAP_DMZ, FE_MAP_UMZ, FE_NONIEEE_ENV): New.

2000-08-19  Andreas Jaeger  <aj@suse.de>
Diffstat (limited to 'sysdeps/alpha')
-rw-r--r--sysdeps/alpha/fpu/bits/fenv.h26
-rw-r--r--sysdeps/alpha/fpu/fclrexcpt.c4
-rw-r--r--sysdeps/alpha/fpu/fedisblxcpt.c6
-rw-r--r--sysdeps/alpha/fpu/feenablxcpt.c6
-rw-r--r--sysdeps/alpha/fpu/fegetenv.c8
-rw-r--r--sysdeps/alpha/fpu/fegetexcept.c4
-rw-r--r--sysdeps/alpha/fpu/fegetround.c6
-rw-r--r--sysdeps/alpha/fpu/feholdexcpt.c6
-rw-r--r--sysdeps/alpha/fpu/fesetenv.c6
-rw-r--r--sysdeps/alpha/fpu/fesetround.c7
-rw-r--r--sysdeps/alpha/fpu/feupdateenv.c4
-rw-r--r--sysdeps/alpha/fpu/fgetexcptflg.c4
-rw-r--r--sysdeps/alpha/fpu/fraiseexcpt.c5
-rw-r--r--sysdeps/alpha/fpu/fsetexcptflg.c4
-rw-r--r--sysdeps/alpha/fpu/ftestexcept.c6
15 files changed, 60 insertions, 42 deletions
diff --git a/sysdeps/alpha/fpu/bits/fenv.h b/sysdeps/alpha/fpu/bits/fenv.h
index 82b85debcd..b6d9b98c86 100644
--- a/sysdeps/alpha/fpu/bits/fenv.h
+++ b/sysdeps/alpha/fpu/bits/fenv.h
@@ -36,6 +36,11 @@
 
 enum
   {
+#ifdef __USE_GNU
+    FE_DENORMAL =	1UL << 22,
+#define FE_DENORMAL	FE_DENORMAL
+#endif
+
     FE_INEXACT =	1UL << 21,
 #define FE_INEXACT	FE_INEXACT
 
@@ -51,12 +56,10 @@ enum
     FE_INVALID =	1UL << 17,
 #define FE_INVALID	FE_INVALID
 
-    FE_ALL_EXCEPT =
-	(FE_INEXACT | FE_DIVBYZERO | FE_UNDERFLOW | FE_OVERFLOW | FE_INVALID)
+    FE_ALL_EXCEPT =	0x3f << 17
 #define FE_ALL_EXCEPT	FE_ALL_EXCEPT
   };
 
-
 /* Alpha chips support all four defined rouding modes.
 
    Note that code must be compiled to use dynamic rounding (/d) instructions
@@ -81,6 +84,19 @@ enum
 #define FE_UPWARD	FE_UPWARD
   };
 
+#ifdef __USE_GNU
+/* On later hardware, and later kernels for earlier hardware, we can forcibly
+   underflow denormal inputs and outputs.  This can speed up certain programs
+   significantly, usually without affecting accuracy.  */
+enum
+  {
+    FE_MAP_DMZ =	1UL << 12,	/* Map denorm inputs to zero */
+#define FE_MAP_DMZ	FE_MAP_DMZ
+
+    FE_MAP_UMZ =	1UL << 13,	/* Map underflowed outputs to zero */
+#define FE_MAP_UMZ	FE_MAP_UMZ
+  };
+#endif
 
 /* Type representing exception flags.  */
 typedef unsigned long int fexcept_t;
@@ -96,6 +112,10 @@ typedef unsigned long int fenv_t;
 #ifdef __USE_GNU
 /* Floating-point environment where none of the exceptions are masked.  */
 # define FE_NOMASK_ENV	((fenv_t *) 0x880000000000003eUL)
+
+/* Floating-point environment with (processor-dependent) non-IEEE floating
+   point.  In this case, mapping denormals to zero.  */
+# define FE_NONIEEE_ENV ((fenv_t *) 0x8800000000003000UL)
 #endif
 
 /* The system calls to talk to the kernel's FP code.  */
diff --git a/sysdeps/alpha/fpu/fclrexcpt.c b/sysdeps/alpha/fpu/fclrexcpt.c
index 006f50613d..71ff748f73 100644
--- a/sysdeps/alpha/fpu/fclrexcpt.c
+++ b/sysdeps/alpha/fpu/fclrexcpt.c
@@ -18,7 +18,7 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-#include <fenv.h>
+#include <fenv_libc.h>
 
 int
 __feclearexcept (int excepts)
@@ -29,7 +29,7 @@ __feclearexcept (int excepts)
   swcr = __ieee_get_fp_control ();
 
   /* Clear the relevant bits.  */
-  swcr &= ~((unsigned long int) excepts & FE_ALL_EXCEPT);
+  swcr &= ~((unsigned long int) excepts & SWCR_STATUS_MASK);
 
   /* Put the new state in effect.  */
   __ieee_set_fp_control (swcr);
diff --git a/sysdeps/alpha/fpu/fedisblxcpt.c b/sysdeps/alpha/fpu/fedisblxcpt.c
index ab0630c084..7359e144b7 100644
--- a/sysdeps/alpha/fpu/fedisblxcpt.c
+++ b/sysdeps/alpha/fpu/fedisblxcpt.c
@@ -18,7 +18,7 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-#include <fenv.h>
+#include <fenv_libc.h>
 
 int
 fedisableexcept (int excepts)
@@ -27,8 +27,8 @@ fedisableexcept (int excepts)
 
   new_exc = __ieee_get_fp_control ();
 
-  old_exc = (new_exc << 16) & FE_ALL_EXCEPT;
-  new_exc &= ~((excepts & FE_ALL_EXCEPT) >> 16);
+  old_exc = (new_exc & SWCR_ENABLE_MASK) << SWCR_ENABLE_SHIFT;
+  new_exc &= ~((excepts >> SWCR_ENABLE_SHIFT) & SWCR_ENABLE_MASK);
 
   __ieee_set_fp_control (new_exc);
 
diff --git a/sysdeps/alpha/fpu/feenablxcpt.c b/sysdeps/alpha/fpu/feenablxcpt.c
index d2b0f2e5e5..b36e84680c 100644
--- a/sysdeps/alpha/fpu/feenablxcpt.c
+++ b/sysdeps/alpha/fpu/feenablxcpt.c
@@ -18,7 +18,7 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-#include <fenv.h>
+#include <fenv_libc.h>
 
 int
 feenableexcept (int excepts)
@@ -27,8 +27,8 @@ feenableexcept (int excepts)
 
   new_exc = __ieee_get_fp_control ();
 
-  old_exc = (new_exc << 16) & FE_ALL_EXCEPT;
-  new_exc |= (excepts & FE_ALL_EXCEPT) >> 16;
+  old_exc = (new_exc & SWCR_ENABLE_MASK) << SWCR_ENABLE_SHIFT;
+  new_exc |= (excepts >> SWCR_ENABLE_SHIFT) & SWCR_ENABLE_MASK;
 
   __ieee_set_fp_control (new_exc);
 
diff --git a/sysdeps/alpha/fpu/fegetenv.c b/sysdeps/alpha/fpu/fegetenv.c
index 51ce1c21ab..d6b3f70897 100644
--- a/sysdeps/alpha/fpu/fegetenv.c
+++ b/sysdeps/alpha/fpu/fegetenv.c
@@ -18,7 +18,7 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-#include <fenv.h>
+#include <fenv_libc.h>
 
 int
 __fegetenv (fenv_t *envp)
@@ -31,10 +31,8 @@ __fegetenv (fenv_t *envp)
   swcr = __ieee_get_fp_control ();
   __asm__ __volatile__ ("mf_fpcr %0" : "=f" (fpcr));
 
-  /* Merge the two bits of information.  The magic number at the end is
-     the exception enable mask.  */
-
-  *envp = (fpcr & (3UL << 58)) | (swcr & (FE_ALL_EXCEPT | 0x3e));
+  /* Merge the two bits of information.  */
+  *envp = ((fpcr & FPCR_ROUND_MASK) | (swcr & SWCR_ALL_MASK));
 
   /* Success.  */
   return 0;
diff --git a/sysdeps/alpha/fpu/fegetexcept.c b/sysdeps/alpha/fpu/fegetexcept.c
index e4d5e784ea..c0de38f8aa 100644
--- a/sysdeps/alpha/fpu/fegetexcept.c
+++ b/sysdeps/alpha/fpu/fegetexcept.c
@@ -18,7 +18,7 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-#include <fenv.h>
+#include <fenv_libc.h>
 
 int
 fegetexcept (void)
@@ -27,5 +27,5 @@ fegetexcept (void)
 
   exc = __ieee_get_fp_control ();
 
-  return (exc << 16) & FE_ALL_EXCEPT;
+  return (exc & SWCR_ENABLE_MASK) << SWCR_ENABLE_SHIFT;
 }
diff --git a/sysdeps/alpha/fpu/fegetround.c b/sysdeps/alpha/fpu/fegetround.c
index 623e2ce358..f64fee7def 100644
--- a/sysdeps/alpha/fpu/fegetround.c
+++ b/sysdeps/alpha/fpu/fegetround.c
@@ -1,5 +1,5 @@
 /* Return current rounding direction.
-   Copyright (C) 1997 Free Software Foundation, Inc.
+   Copyright (C) 1997, 2000 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson <rth@tamu.edu>, 1997
 
@@ -18,7 +18,7 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-#include <fenv.h>
+#include <fenv_libc.h>
 
 int
 fegetround (void)
@@ -27,5 +27,5 @@ fegetround (void)
 
   __asm__ __volatile__("excb; mf_fpcr %0" : "=f"(fpcr));
 
-  return (fpcr >> 58) & 3;
+  return (fpcr >> FPCR_ROUND_SHIFT) & 3;
 }
diff --git a/sysdeps/alpha/fpu/feholdexcpt.c b/sysdeps/alpha/fpu/feholdexcpt.c
index a179366cbf..d683a37bdc 100644
--- a/sysdeps/alpha/fpu/feholdexcpt.c
+++ b/sysdeps/alpha/fpu/feholdexcpt.c
@@ -1,5 +1,5 @@
 /* Store current floating-point environment and clear exceptions.
-   Copyright (C) 1997 Free Software Foundation, Inc.
+   Copyright (C) 1997, 2000 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson <rth@tamu.edu>, 1997
 
@@ -18,7 +18,7 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-#include <fenv.h>
+#include <fenv_libc.h>
 
 int
 feholdexcept (fenv_t *envp)
@@ -27,7 +27,7 @@ feholdexcept (fenv_t *envp)
   fegetenv(envp);
 
   /* Clear all exception status bits and exception enable bits.  */
-  __ieee_set_fp_control(0);
+  __ieee_set_fp_control(*envp & SWCR_MAP_MASK);
 
   return 0;
 }
diff --git a/sysdeps/alpha/fpu/fesetenv.c b/sysdeps/alpha/fpu/fesetenv.c
index 58bc13aaf2..5bf3b5e59a 100644
--- a/sysdeps/alpha/fpu/fesetenv.c
+++ b/sysdeps/alpha/fpu/fesetenv.c
@@ -18,7 +18,7 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-#include <fenv.h>
+#include <fenv_libc.h>
 
 int
 __fesetenv (const fenv_t *envp)
@@ -37,11 +37,11 @@ __fesetenv (const fenv_t *envp)
   /* Reset the rounding mode with the hardware fpcr.  Note that the following
      system call is an implied trap barrier for our modification.  */
   __asm__ __volatile__ ("excb; mf_fpcr %0" : "=f" (fpcr));
-  fpcr = (fpcr & ~(3UL << 58)) | (env & (3UL << 58));
+  fpcr = (fpcr & ~FPCR_ROUND_MASK) | (env & FPCR_ROUND_MASK);
   __asm__ __volatile__ ("mt_fpcr %0" : : "f" (fpcr));
 
   /* Reset the exception status and mask with the kernel's FP code.  */
-  __ieee_set_fp_control (env & (FE_ALL_EXCEPT | 0x3e));
+  __ieee_set_fp_control (env & SWCR_ALL_MASK);
 
   /* Success.  */
   return 0;
diff --git a/sysdeps/alpha/fpu/fesetround.c b/sysdeps/alpha/fpu/fesetround.c
index f0aaaa2c88..42a8b62f49 100644
--- a/sysdeps/alpha/fpu/fesetround.c
+++ b/sysdeps/alpha/fpu/fesetround.c
@@ -1,5 +1,5 @@
 /* Set current rounding direction.
-   Copyright (C) 1997 Free Software Foundation, Inc.
+   Copyright (C) 1997, 2000 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson <rth@tamu.edu>, 1997
 
@@ -18,7 +18,7 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-#include <fenv.h>
+#include <fenv_libc.h>
 
 int
 fesetround (int round)
@@ -32,7 +32,8 @@ fesetround (int round)
   __asm__ __volatile__("excb; mf_fpcr %0" : "=f"(fpcr));
 
   /* Set the relevant bits.  */
-  fpcr = (fpcr & ~(3UL << 58)) | ((unsigned long)round << 58);
+  fpcr = ((fpcr & ~FPCR_ROUND_MASK)
+	  | ((unsigned long)round << FPCR_ROUND_SHIFT));
 
   /* Put the new state in effect.  */
   __asm__ __volatile__("mt_fpcr %0; excb" : : "f"(fpcr));
diff --git a/sysdeps/alpha/fpu/feupdateenv.c b/sysdeps/alpha/fpu/feupdateenv.c
index 61226c6b44..b9f1c5b69e 100644
--- a/sysdeps/alpha/fpu/feupdateenv.c
+++ b/sysdeps/alpha/fpu/feupdateenv.c
@@ -18,7 +18,7 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-#include <fenv.h>
+#include <fenv_libc.h>
 
 int
 __feupdateenv (const fenv_t *envp)
@@ -34,7 +34,7 @@ __feupdateenv (const fenv_t *envp)
   /* Raise the saved exception.  Incidently for us the implementation
      defined format of the values in objects of type fexcept_t is the
      same as the ones specified using the FE_* constants.  */
-  feraiseexcept ((int) tmp & FE_ALL_EXCEPT);
+  feraiseexcept (tmp & SWCR_STATUS_MASK);
 
   /* Success.  */
   return 0;
diff --git a/sysdeps/alpha/fpu/fgetexcptflg.c b/sysdeps/alpha/fpu/fgetexcptflg.c
index bd47535be8..bae1556f5d 100644
--- a/sysdeps/alpha/fpu/fgetexcptflg.c
+++ b/sysdeps/alpha/fpu/fgetexcptflg.c
@@ -18,7 +18,7 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-#include <fenv.h>
+#include <fenv_libc.h>
 
 int
 __fegetexceptflag (fexcept_t *flagp, int excepts)
@@ -29,7 +29,7 @@ __fegetexceptflag (fexcept_t *flagp, int excepts)
   tmp = __ieee_get_fp_control();
 
   /* Return that portion that corresponds to the requested exceptions. */
-  *flagp = tmp & excepts & FE_ALL_EXCEPT;
+  *flagp = tmp & excepts & SWCR_STATUS_MASK;
 
   /* Success.  */
   return 0;
diff --git a/sysdeps/alpha/fpu/fraiseexcpt.c b/sysdeps/alpha/fpu/fraiseexcpt.c
index b0eab000cb..1f72ebaf6a 100644
--- a/sysdeps/alpha/fpu/fraiseexcpt.c
+++ b/sysdeps/alpha/fpu/fraiseexcpt.c
@@ -18,8 +18,7 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-#include <fenv.h>
-#include <math.h>
+#include <fenv_libc.h>
 
 int
 __feraiseexcept (int excepts)
@@ -30,7 +29,7 @@ __feraiseexcept (int excepts)
   tmp = __ieee_get_fp_control ();
 
   /* Set all the bits that were called for.  */
-  tmp |= (excepts & FE_ALL_EXCEPT);
+  tmp |= (excepts & SWCR_STATUS_MASK);
 
   /* And store it back.  */
   __ieee_set_fp_control (tmp);
diff --git a/sysdeps/alpha/fpu/fsetexcptflg.c b/sysdeps/alpha/fpu/fsetexcptflg.c
index eb74defb5a..57531a4aa0 100644
--- a/sysdeps/alpha/fpu/fsetexcptflg.c
+++ b/sysdeps/alpha/fpu/fsetexcptflg.c
@@ -18,7 +18,7 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-#include <fenv.h>
+#include <fenv_libc.h>
 
 int
 __fesetexceptflag (const fexcept_t *flagp, int excepts)
@@ -29,7 +29,7 @@ __fesetexceptflag (const fexcept_t *flagp, int excepts)
   tmp = __ieee_get_fp_control ();
 
   /* Set all the bits that were called for.  */
-  tmp = (tmp & ~FE_ALL_EXCEPT) | (*flagp & excepts & FE_ALL_EXCEPT);
+  tmp = (tmp & ~SWCR_STATUS_MASK) | (*flagp & excepts & SWCR_STATUS_MASK);
 
   /* And store it back.  */
   __ieee_set_fp_control (tmp);
diff --git a/sysdeps/alpha/fpu/ftestexcept.c b/sysdeps/alpha/fpu/ftestexcept.c
index 9ee9dc9c55..9c006de79e 100644
--- a/sysdeps/alpha/fpu/ftestexcept.c
+++ b/sysdeps/alpha/fpu/ftestexcept.c
@@ -1,5 +1,5 @@
 /* Test exception in current environment.
-   Copyright (C) 1997 Free Software Foundation, Inc.
+   Copyright (C) 1997, 2000 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson <rth@tamu.edu>, 1997.
 
@@ -18,7 +18,7 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-#include <fenv.h>
+#include <fenv_libc.h>
 
 int
 fetestexcept (int excepts)
@@ -28,5 +28,5 @@ fetestexcept (int excepts)
   /* Get current exceptions.  */
   tmp = __ieee_get_fp_control();
 
-  return tmp & excepts & FE_ALL_EXCEPT;
+  return tmp & excepts & SWCR_STATUS_MASK;
 }