mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-24 14:00:30 +00: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:
parent
5ef1b2138d
commit
c0c49d60cf
@ -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.
|
||||
|
@ -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.
|
||||
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 \
|
||||
|
11
math/math.h
11
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)
|
||||
|
@ -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. */
|
Loading…
Reference in New Issue
Block a user