summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2017-08-31 16:39:25 +0000
committerJoseph Myers <joseph@codesourcery.com>2017-08-31 16:39:25 +0000
commitc0c49d60cfeff3b2aa801d6598143a073989654a (patch)
tree248bd1a808a8f2e27396ddfd1c04e5362d7e5da2
parent5ef1b2138d4236bb3616e612c5bc4dc328a9ffb2 (diff)
Simplify NAN definitions.
Similar to my patches for HUGE_VAL and INFINITY. this patch eliminates the bits/nan.h headers. __builtin_nanf ("") is used to define NAN for GCC 3.3 and later; the fallback is (0.0f / 0.0f), which is a constant expression for a quiet NaN of type float, but raises a spurious "invalid" exception outside static initializers, which seems the best that can be done purely in standard C. Again, if anyone actually uses a compiler with its own incompatible extension for producing a constant quiet NaN, we can add compiler conditionals. Tested for x86_64. * math/math.h [__USE_ISOC99] (NAN): Define directly here. Do not include <bits/nan.h>. * math/Makefile (headers): Remove bits/nan.h. * bits/nan.h: Remove. * sysdeps/ieee754/bits/nan.h: Likewise. * sysdeps/mips/bits/nan.h: Likewise.
-rw-r--r--ChangeLog7
-rw-r--r--bits/nan.h5
-rw-r--r--math/Makefile1
-rw-r--r--math/math.h11
-rw-r--r--sysdeps/ieee754/bits/nan.h52
-rw-r--r--sysdeps/mips/bits/nan.h67
6 files changed, 16 insertions, 127 deletions
diff --git a/ChangeLog b/ChangeLog
index 904d375f1c..a87a9c4852 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,12 @@
2017-08-31 Joseph Myers <joseph@codesourcery.com>
+ * math/math.h [__USE_ISOC99] (NAN): Define directly here. Do not
+ include <bits/nan.h>.
+ * math/Makefile (headers): Remove bits/nan.h.
+ * bits/nan.h: Remove.
+ * sysdeps/ieee754/bits/nan.h: Likewise.
+ * sysdeps/mips/bits/nan.h: Likewise.
+
* math/math.h [__USE_ISOC99] (INFINITY): Define directly here. Do
not include <bits/inf.h>.
* math/Makefile (headers): Remove bits/inf.h.
diff --git a/bits/nan.h b/bits/nan.h
deleted file mode 100644
index ab38168ea4..0000000000
--- a/bits/nan.h
+++ /dev/null
@@ -1,5 +0,0 @@
-#ifndef _MATH_H
-#error "Never use <bits/nan.h> directly; include <math.h> instead."
-#endif
-
-/* This file should define `NAN' on machines that have such things. */
diff --git a/math/Makefile b/math/Makefile
index b9a06f0ca0..0601f3ac43 100644
--- a/math/Makefile
+++ b/math/Makefile
@@ -23,7 +23,6 @@ include ../Makeconfig
# Installed header files.
headers := math.h bits/mathcalls.h bits/mathinline.h \
- bits/nan.h \
fpu_control.h complex.h bits/cmathcalls.h fenv.h \
bits/fenv.h bits/fenvinline.h bits/mathdef.h tgmath.h \
bits/math-finite.h bits/math-vector.h \
diff --git a/math/math.h b/math/math.h
index 5f5a498b11..bbc1ab9bfa 100644
--- a/math/math.h
+++ b/math/math.h
@@ -65,8 +65,15 @@ __BEGIN_DECLS
# define INFINITY HUGE_VALF
# endif
-/* Get machine-dependent NAN value (returned for some domain errors). */
-# include <bits/nan.h>
+/* IEEE Not A Number. */
+# if __GNUC_PREREQ (3, 3)
+# define NAN (__builtin_nanf (""))
+# else
+/* This will raise an "invalid" exception outside static initializers,
+ but is the best that can be done in ISO C while remaining a
+ constant expression. */
+# define NAN (0.0f / 0.0f)
+# endif
#endif /* __USE_ISOC99 */
#if __GLIBC_USE (IEC_60559_BFP_EXT)
diff --git a/sysdeps/ieee754/bits/nan.h b/sysdeps/ieee754/bits/nan.h
deleted file mode 100644
index b6e14f5873..0000000000
--- a/sysdeps/ieee754/bits/nan.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/* `NAN' constant for IEEE 754 machines.
- Copyright (C) 1992-2017 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 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#ifndef _MATH_H
-# error "Never use <bits/nan.h> directly; include <math.h> instead."
-#endif
-
-
-/* IEEE Not A Number. */
-
-#if __GNUC_PREREQ(3,3)
-
-# define NAN (__builtin_nanf (""))
-
-#elif defined __GNUC__
-
-# define NAN \
- (__extension__ \
- ((union { unsigned __l __attribute__ ((__mode__ (__SI__))); float __d; }) \
- { __l: 0x7fc00000UL }).__d)
-
-#else
-
-# include <endian.h>
-
-# if __BYTE_ORDER == __BIG_ENDIAN
-# define __qnan_bytes { 0x7f, 0xc0, 0, 0 }
-# endif
-# if __BYTE_ORDER == __LITTLE_ENDIAN
-# define __qnan_bytes { 0, 0, 0xc0, 0x7f }
-# endif
-
-static union { unsigned char __c[4]; float __d; } __qnan_union
- __attribute__ ((__unused__)) = { __qnan_bytes };
-# define NAN (__qnan_union.__d)
-
-#endif /* GCC. */
diff --git a/sysdeps/mips/bits/nan.h b/sysdeps/mips/bits/nan.h
deleted file mode 100644
index a4a1ef9f06..0000000000
--- a/sysdeps/mips/bits/nan.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/* `NAN' constant for IEEE 754 machines. MIPS version.
- Copyright (C) 1992-2017 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 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#ifndef _MATH_H
-# error "Never use <bits/nan.h> directly; include <math.h> instead."
-#endif
-
-
-/* IEEE Not A Number. */
-/* In legacy-NaN mode MIPS has the qNaN and sNaN patterns reversed
- compared to most other architectures. IEEE 754-1985 left the
- definition of this open to implementations, and for MIPS the top bit
- of the mantissa must be SET to indicate a sNaN. In 2008-NaN mode
- MIPS aligned to IEEE 754-2008. */
-
-#if __GNUC_PREREQ(3,3)
-
-# define NAN (__builtin_nanf (""))
-
-#elif defined __GNUC__
-
-/* No 2008-NaN mode support in any GCC version before 4.9. */
-
-# define NAN \
- (__extension__ \
- ((union { unsigned __l __attribute__ ((__mode__ (__SI__))); float __d; }) \
- { __l: 0x7fbfffffUL }).__d)
-
-#else
-
-# include <endian.h>
-
-# if __BYTE_ORDER == __BIG_ENDIAN
-# ifdef __mips_nan2008
-# define __qnan_bytes { 0x7f, 0xc0, 0, 0 }
-# else
-# define __qnan_bytes { 0x7f, 0xbf, 0xff, 0xff }
-# endif
-# endif
-# if __BYTE_ORDER == __LITTLE_ENDIAN
-# ifdef __mips_nan2008
-# define __qnan_bytes { 0, 0, 0xc0, 0x7f }
-# else
-# define __qnan_bytes { 0xff, 0xff, 0xbf, 0x7f }
-# endif
-# endif
-
-static union { unsigned char __c[4]; float __d; } __qnan_union
- __attribute__ ((__unused__)) = { __qnan_bytes };
-# define NAN (__qnan_union.__d)
-
-#endif /* GCC. */