mirror of
https://sourceware.org/git/glibc.git
synced 2025-08-10 05:03:06 +03:00
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.
This commit is contained in:
@@ -1,5 +1,12 @@
|
|||||||
2017-08-31 Joseph Myers <joseph@codesourcery.com>
|
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
|
* math/math.h [__USE_ISOC99] (INFINITY): Define directly here. Do
|
||||||
not include <bits/inf.h>.
|
not include <bits/inf.h>.
|
||||||
* math/Makefile (headers): Remove bits/inf.h.
|
* math/Makefile (headers): Remove bits/inf.h.
|
||||||
|
@@ -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. */
|
|
@@ -23,7 +23,6 @@ include ../Makeconfig
|
|||||||
|
|
||||||
# Installed header files.
|
# Installed header files.
|
||||||
headers := math.h bits/mathcalls.h bits/mathinline.h \
|
headers := math.h bits/mathcalls.h bits/mathinline.h \
|
||||||
bits/nan.h \
|
|
||||||
fpu_control.h complex.h bits/cmathcalls.h fenv.h \
|
fpu_control.h complex.h bits/cmathcalls.h fenv.h \
|
||||||
bits/fenv.h bits/fenvinline.h bits/mathdef.h tgmath.h \
|
bits/fenv.h bits/fenvinline.h bits/mathdef.h tgmath.h \
|
||||||
bits/math-finite.h bits/math-vector.h \
|
bits/math-finite.h bits/math-vector.h \
|
||||||
|
11
math/math.h
11
math/math.h
@@ -65,8 +65,15 @@ __BEGIN_DECLS
|
|||||||
# define INFINITY HUGE_VALF
|
# define INFINITY HUGE_VALF
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
/* Get machine-dependent NAN value (returned for some domain errors). */
|
/* IEEE Not A Number. */
|
||||||
# include <bits/nan.h>
|
# 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 */
|
#endif /* __USE_ISOC99 */
|
||||||
|
|
||||||
#if __GLIBC_USE (IEC_60559_BFP_EXT)
|
#if __GLIBC_USE (IEC_60559_BFP_EXT)
|
||||||
|
@@ -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. */
|
|
@@ -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. */
|
|
Reference in New Issue
Block a user