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:
Joseph Myers 2017-08-31 16:39:25 +00:00
parent 5ef1b2138d
commit c0c49d60cf
6 changed files with 16 additions and 127 deletions

View File

@ -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.

View File

@ -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. */

View File

@ -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 \

View File

@ -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)

View File

@ -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. */

View File

@ -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. */