]> git.ipfire.org Git - thirdparty/glibc.git/blobdiff - sysdeps/alpha/fpu/bits/fenv.h
Prefer https to http for gnu.org and fsf.org URLs
[thirdparty/glibc.git] / sysdeps / alpha / fpu / bits / fenv.h
index 4482f0a2dd9702620f0c3dfb542550076811e2f5..7214280cea6433a414d3bfce0d0f162488582d0a 100644 (file)
@@ -1,20 +1,19 @@
-/* Copyright (C) 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1997-2019 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Library General Public License as
-   published by the Free Software Foundation; either version 2 of the
-   License, or (at your option) any later version.
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
 
    The GNU C Library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Library General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU Library General Public
-   License along with the GNU C Library; see the file COPYING.LIB.  If not,
-   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
 
 #ifndef _FENV_H
 # error "Never use <bits/fenv.h> directly; include <fenv.h> instead."
 
 enum
   {
-    FE_INEXACT =       1UL << 21,
-#define FE_INEXACT     FE_INEXACT
+#ifdef __USE_GNU
+    FE_DENORMAL =
+#define FE_DENORMAL    (1 << 22)
+      FE_DENORMAL,
+#endif
 
-    FE_UNDERFLOW =     1UL << 20,
-#define FE_UNDERFLOW   FE_UNDERFLOW
+    FE_INEXACT =
+#define FE_INEXACT     (1 << 21)
+      FE_INEXACT,
 
-    FE_OVERFLOW =      1UL << 19,
-#define FE_OVERFLOW    FE_OVERFLOW
+    FE_UNDERFLOW =
+#define FE_UNDERFLOW   (1 << 20)
+      FE_UNDERFLOW,
 
-    FE_DIVBYZERO =     1UL << 18,
-#define FE_DIVBYZERO   FE_DIVBYZERO
+    FE_OVERFLOW =
+#define FE_OVERFLOW    (1 << 19)
+      FE_OVERFLOW,
 
-    FE_INVALID =       1UL << 17,
-#define FE_INVALID     FE_INVALID
+    FE_DIVBYZERO =
+#define FE_DIVBYZERO   (1 << 18)
+      FE_DIVBYZERO,
+
+    FE_INVALID =
+#define FE_INVALID     (1 << 17)
+      FE_INVALID,
 
     FE_ALL_EXCEPT =
-       (FE_INEXACT | FE_DIVBYZERO | FE_UNDERFLOW | FE_OVERFLOW | FE_INVALID)
-#define FE_ALL_EXCEPT  FE_ALL_EXCEPT
+#define FE_ALL_EXCEPT  (0x3f << 17)
+      FE_ALL_EXCEPT
   };
 
-
 /* Alpha chips support all four defined rouding modes.
 
    Note that code must be compiled to use dynamic rounding (/d) instructions
@@ -68,36 +77,65 @@ enum
 
 enum
   {
-    FE_TOWARDSZERO =   0,
-#define FE_TOWARDSZERO FE_TOWARDSZERO
+    FE_TOWARDZERO =
+#define FE_TOWARDZERO  0
+      FE_TOWARDZERO,
 
-    FE_DOWNWARD =      1,
-#define FE_DOWNWARD    FE_DOWNWARD
+    FE_DOWNWARD =
+#define FE_DOWNWARD    1
+      FE_DOWNWARD,
 
-    FE_TONEAREST =     2,
-#define FE_TONEAREST   FE_TONEAREST
+    FE_TONEAREST =
+#define FE_TONEAREST   2
+      FE_TONEAREST,
 
-    FE_UPWARD =                3,
-#define FE_UPWARD      FE_UPWARD
+    FE_UPWARD =
+#define FE_UPWARD      3
+      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 fexcept_t;
+typedef unsigned long int fexcept_t;
 
 /* Type representing floating-point environment.  */
-typedef unsigned long fenv_t;
+typedef unsigned long int fenv_t;
 
 /* If the default argument is used we use this value.  Note that due to
    architecture-specified page mappings, no user-space pointer will ever
    have its two high bits set.  Co-opt one.  */
-#define FE_DFL_ENV     ((fenv_t *) 0x8800000000000000UL)
+#define FE_DFL_ENV     ((const fenv_t *) 0x8800000000000000UL)
 
 #ifdef __USE_GNU
 /* Floating-point environment where none of the exceptions are masked.  */
-# define FE_NOMASK_ENV ((fenv_t *) 0x880000000000003eUL)
+# define FE_NOMASK_ENV ((const fenv_t *) 0x880000000000003eUL)
+
+/* Floating-point environment with (processor-dependent) non-IEEE floating
+   point.  In this case, mapping denormals to zero.  */
+# define FE_NONIEEE_ENV ((const fenv_t *) 0x8800000000003000UL)
 #endif
 
 /* The system calls to talk to the kernel's FP code.  */
-extern unsigned long int __ieee_get_fp_control __P ((void));
-extern void __ieee_set_fp_control __P ((unsigned long int __value));
+extern unsigned long int __ieee_get_fp_control (void) __THROW;
+extern void __ieee_set_fp_control (unsigned long int __value) __THROW;
+
+#if __GLIBC_USE (IEC_60559_BFP_EXT_C2X)
+/* Type representing floating-point control modes.  */
+typedef unsigned long int femode_t;
+
+/* Default floating-point control modes.  */
+# define FE_DFL_MODE   ((const femode_t *) 0x8800000000000000UL)
+#endif