diff options
author | Joseph Myers <joseph@codesourcery.com> | 2016-10-17 22:48:51 +0000 |
---|---|---|
committer | Joseph Myers <joseph@codesourcery.com> | 2016-10-17 22:48:51 +0000 |
commit | 6f322a894704e7959b9cee7c2cc7ec1963a26e73 (patch) | |
tree | 817009ca0ac99f5c874ae233f8c603d0b646e849 | |
parent | 8e36adc08eebb526d180b8477f1840c5bd549d83 (diff) | |
download | glibc-6f322a894704e7959b9cee7c2cc7ec1963a26e73.zip glibc-6f322a894704e7959b9cee7c2cc7ec1963a26e73.tar.gz glibc-6f322a894704e7959b9cee7c2cc7ec1963a26e73.tar.bz2 |
Define HIGH_ORDER_BIT_IS_SET_FOR_SNAN to 0 or 1.
This patch moves the HIGH_ORDER_BIT_IS_SET_FOR_SNAN macro from being
defined or undefined to the preferred convention of always being
defined, to either 0 or 1, so allowing typo-proof tests with #if.
The macro is moved from math_private.h to a new header
nan-high-order-bit.h to make it easy for all architectures to define,
either through the sysdeps/generic version of the header or through
providing their own version of the header, without needing #ifndef in
the generic math_private.h to give a default definition. The move
also allows the macro to be used without needing math_private.h to be
included; the immediate motivation of this patch is to allow tests to
access this information (to know what kinds of NaNs 0 is a valid
payload for) without needing to include math_private.h. Existing
C level rather than preprocessor conditionals at all, but this patch
does not make such a change).
Tested for x86_64 and x86 (testsuite); also verified for x86_64, x86,
mips64 and powerpc that installed stripped shared libraries are
unchanged by the patch.
* sysdeps/generic/nan-high-order-bit.h: New file.
* sysdeps/hppa/nan-high-order-bit.h: Likewise.
* sysdeps/mips/nan-high-order-bit.h: Likewise.
* sysdeps/hppa/math_private.h: Remove file.
* sysdeps/mips/math_private.h (HIGH_ORDER_BIT_IS_SET_FOR_SNAN): Do
not define here.
* sysdeps/ieee754/dbl-64/s_issignaling.c: Include
<nan-high-order-bit.h>.
[HIGH_ORDER_BIT_IS_SET_FOR_SNAN]: Test with #if not #ifdef.
* sysdeps/ieee754/dbl-64/s_totalorder.c: Include
<nan-high-order-bit.h>.
[HIGH_ORDER_BIT_IS_SET_FOR_SNAN]: Test with #if not #ifdef.
* sysdeps/ieee754/dbl-64/s_totalordermag.c: Include
<nan-high-order-bit.h>.
[HIGH_ORDER_BIT_IS_SET_FOR_SNAN]: Test with #if not #ifdef.
* sysdeps/ieee754/dbl-64/wordsize-64/s_issignaling.c: Include
<nan-high-order-bit.h>.
[HIGH_ORDER_BIT_IS_SET_FOR_SNAN]: Test with #if not #ifdef.
* sysdeps/ieee754/dbl-64/wordsize-64/s_totalorder.c: Include
<nan-high-order-bit.h>.
[HIGH_ORDER_BIT_IS_SET_FOR_SNAN]: Test with #if not #ifdef.
* sysdeps/ieee754/dbl-64/wordsize-64/s_totalordermag.c: Include
<nan-high-order-bit.h>.
[HIGH_ORDER_BIT_IS_SET_FOR_SNAN]: Test with #if not #ifdef.
* sysdeps/ieee754/flt-32/s_issignalingf.c: Include
<nan-high-order-bit.h>.
[HIGH_ORDER_BIT_IS_SET_FOR_SNAN]: Test with #if not #ifdef.
* sysdeps/ieee754/flt-32/s_totalorderf.c: Include
<nan-high-order-bit.h>.
[HIGH_ORDER_BIT_IS_SET_FOR_SNAN]: Test with #if not #ifdef.
* sysdeps/ieee754/flt-32/s_totalordermagf.c: Include
<nan-high-order-bit.h>.
[HIGH_ORDER_BIT_IS_SET_FOR_SNAN]: Test with #if not #ifdef.
* sysdeps/ieee754/ldbl-128/s_issignalingl.c: Include
<nan-high-order-bit.h>.
[HIGH_ORDER_BIT_IS_SET_FOR_SNAN]: Test with #if not #ifdef.
* sysdeps/ieee754/ldbl-128/s_totalorderl.c: Include
<nan-high-order-bit.h>.
[HIGH_ORDER_BIT_IS_SET_FOR_SNAN]: Test with #if not #ifdef.
* sysdeps/ieee754/ldbl-128/s_totalordermagl.c: Include
<nan-high-order-bit.h>.
[HIGH_ORDER_BIT_IS_SET_FOR_SNAN]: Test with #if not #ifdef.
* sysdeps/ieee754/ldbl-128ibm/s_issignalingl.c: Include
<nan-high-order-bit.h>.
[HIGH_ORDER_BIT_IS_SET_FOR_SNAN]: Test with #if not #ifdef.
* sysdeps/ieee754/ldbl-128ibm/s_totalorderl.c: Include
<nan-high-order-bit.h>.
[HIGH_ORDER_BIT_IS_SET_FOR_SNAN]: Test with #if not #ifdef.
* sysdeps/ieee754/ldbl-128ibm/s_totalordermagl.c: Include
<nan-high-order-bit.h>.
[HIGH_ORDER_BIT_IS_SET_FOR_SNAN]: Test with #if not #ifdef.
* sysdeps/ieee754/ldbl-96/s_issignalingl.c: Include
<nan-high-order-bit.h>.
[HIGH_ORDER_BIT_IS_SET_FOR_SNAN]: Test with #if not #ifdef.
* sysdeps/ieee754/ldbl-96/s_totalorderl.c: Include
<nan-high-order-bit.h>.
[HIGH_ORDER_BIT_IS_SET_FOR_SNAN]: Test with #if not #ifdef.
* sysdeps/ieee754/ldbl-96/s_totalordermagl.c: Include
<nan-high-order-bit.h>.
[HIGH_ORDER_BIT_IS_SET_FOR_SNAN]: Test with #if not #ifdef.
23 files changed, 167 insertions, 36 deletions
@@ -1,3 +1,66 @@ +2016-10-17 Joseph Myers <joseph@codesourcery.com> + + * sysdeps/generic/nan-high-order-bit.h: New file. + * sysdeps/hppa/nan-high-order-bit.h: Likewise. + * sysdeps/mips/nan-high-order-bit.h: Likewise. + * sysdeps/hppa/math_private.h: Remove file. + * sysdeps/mips/math_private.h (HIGH_ORDER_BIT_IS_SET_FOR_SNAN): Do + not define here. + * sysdeps/ieee754/dbl-64/s_issignaling.c: Include + <nan-high-order-bit.h>. + [HIGH_ORDER_BIT_IS_SET_FOR_SNAN]: Test with #if not #ifdef. + * sysdeps/ieee754/dbl-64/s_totalorder.c: Include + <nan-high-order-bit.h>. + [HIGH_ORDER_BIT_IS_SET_FOR_SNAN]: Test with #if not #ifdef. + * sysdeps/ieee754/dbl-64/s_totalordermag.c: Include + <nan-high-order-bit.h>. + [HIGH_ORDER_BIT_IS_SET_FOR_SNAN]: Test with #if not #ifdef. + * sysdeps/ieee754/dbl-64/wordsize-64/s_issignaling.c: Include + <nan-high-order-bit.h>. + [HIGH_ORDER_BIT_IS_SET_FOR_SNAN]: Test with #if not #ifdef. + * sysdeps/ieee754/dbl-64/wordsize-64/s_totalorder.c: Include + <nan-high-order-bit.h>. + [HIGH_ORDER_BIT_IS_SET_FOR_SNAN]: Test with #if not #ifdef. + * sysdeps/ieee754/dbl-64/wordsize-64/s_totalordermag.c: Include + <nan-high-order-bit.h>. + [HIGH_ORDER_BIT_IS_SET_FOR_SNAN]: Test with #if not #ifdef. + * sysdeps/ieee754/flt-32/s_issignalingf.c: Include + <nan-high-order-bit.h>. + [HIGH_ORDER_BIT_IS_SET_FOR_SNAN]: Test with #if not #ifdef. + * sysdeps/ieee754/flt-32/s_totalorderf.c: Include + <nan-high-order-bit.h>. + [HIGH_ORDER_BIT_IS_SET_FOR_SNAN]: Test with #if not #ifdef. + * sysdeps/ieee754/flt-32/s_totalordermagf.c: Include + <nan-high-order-bit.h>. + [HIGH_ORDER_BIT_IS_SET_FOR_SNAN]: Test with #if not #ifdef. + * sysdeps/ieee754/ldbl-128/s_issignalingl.c: Include + <nan-high-order-bit.h>. + [HIGH_ORDER_BIT_IS_SET_FOR_SNAN]: Test with #if not #ifdef. + * sysdeps/ieee754/ldbl-128/s_totalorderl.c: Include + <nan-high-order-bit.h>. + [HIGH_ORDER_BIT_IS_SET_FOR_SNAN]: Test with #if not #ifdef. + * sysdeps/ieee754/ldbl-128/s_totalordermagl.c: Include + <nan-high-order-bit.h>. + [HIGH_ORDER_BIT_IS_SET_FOR_SNAN]: Test with #if not #ifdef. + * sysdeps/ieee754/ldbl-128ibm/s_issignalingl.c: Include + <nan-high-order-bit.h>. + [HIGH_ORDER_BIT_IS_SET_FOR_SNAN]: Test with #if not #ifdef. + * sysdeps/ieee754/ldbl-128ibm/s_totalorderl.c: Include + <nan-high-order-bit.h>. + [HIGH_ORDER_BIT_IS_SET_FOR_SNAN]: Test with #if not #ifdef. + * sysdeps/ieee754/ldbl-128ibm/s_totalordermagl.c: Include + <nan-high-order-bit.h>. + [HIGH_ORDER_BIT_IS_SET_FOR_SNAN]: Test with #if not #ifdef. + * sysdeps/ieee754/ldbl-96/s_issignalingl.c: Include + <nan-high-order-bit.h>. + [HIGH_ORDER_BIT_IS_SET_FOR_SNAN]: Test with #if not #ifdef. + * sysdeps/ieee754/ldbl-96/s_totalorderl.c: Include + <nan-high-order-bit.h>. + [HIGH_ORDER_BIT_IS_SET_FOR_SNAN]: Test with #if not #ifdef. + * sysdeps/ieee754/ldbl-96/s_totalordermagl.c: Include + <nan-high-order-bit.h>. + [HIGH_ORDER_BIT_IS_SET_FOR_SNAN]: Test with #if not #ifdef. + 2016-10-17 Stefan Liebler <stli@linux.vnet.ibm.com> * sysdeps/s390/fpu/fix-fp-int-compare-invalid.h: New file. diff --git a/sysdeps/generic/nan-high-order-bit.h b/sysdeps/generic/nan-high-order-bit.h new file mode 100644 index 0000000..1561915 --- /dev/null +++ b/sysdeps/generic/nan-high-order-bit.h @@ -0,0 +1,27 @@ +/* Specify NaN high-order bit conventions. Generic version. + Copyright (C) 2016 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 NAN_HIGH_ORDER_BIT_H +#define NAN_HIGH_ORDER_BIT_H 1 + +/* Define this macro to 1 if the high-order bit of a NaN's mantissa is + set for signaling NaNs and clear for quiet NaNs, 0 otherwise (the + preferred IEEE convention). */ +#define HIGH_ORDER_BIT_IS_SET_FOR_SNAN 0 + +#endif /* nan-high-order-bit.h */ diff --git a/sysdeps/hppa/math_private.h b/sysdeps/hppa/nan-high-order-bit.h index 1acfb9a..a63d6a7 100644 --- a/sysdeps/hppa/math_private.h +++ b/sysdeps/hppa/nan-high-order-bit.h @@ -1,5 +1,5 @@ -/* Internal math stuff. HPPA version. - Copyright (C) 2013-2016 Free Software Foundation, Inc. +/* Specify NaN high-order bit conventions. HPPA version. + Copyright (C) 2016 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 @@ -16,13 +16,12 @@ License along with the GNU C Library; if not, see <http://www.gnu.org/licenses/>. */ -#ifndef HPPA_MATH_PRIVATE_H -#define HPPA_MATH_PRIVATE_H 1 +#ifndef NAN_HIGH_ORDER_BIT_H +#define NAN_HIGH_ORDER_BIT_H 1 -/* One of the few architectures where the meaning of the quiet/signaling bit is - inverse to IEEE 754-2008 (as well as common practice for IEEE 754-1985). */ -#define HIGH_ORDER_BIT_IS_SET_FOR_SNAN +/* One of the few architectures where the meaning of the + quiet/signaling bit is inverse to IEEE 754-2008 (as well as common + practice for IEEE 754-1985). */ +#define HIGH_ORDER_BIT_IS_SET_FOR_SNAN 1 -#include_next <math_private.h> - -#endif +#endif /* nan-high-order-bit.h */ diff --git a/sysdeps/ieee754/dbl-64/s_issignaling.c b/sysdeps/ieee754/dbl-64/s_issignaling.c index 4b93d6a..0b845e2 100644 --- a/sysdeps/ieee754/dbl-64/s_issignaling.c +++ b/sysdeps/ieee754/dbl-64/s_issignaling.c @@ -18,11 +18,12 @@ #include <math.h> #include <math_private.h> +#include <nan-high-order-bit.h> int __issignaling (double x) { -#ifdef HIGH_ORDER_BIT_IS_SET_FOR_SNAN +#if HIGH_ORDER_BIT_IS_SET_FOR_SNAN u_int32_t hxi; GET_HIGH_WORD (hxi, x); /* We only have to care about the high-order bit of x's significand, because diff --git a/sysdeps/ieee754/dbl-64/s_totalorder.c b/sysdeps/ieee754/dbl-64/s_totalorder.c index 73ac32f..c4ec917 100644 --- a/sysdeps/ieee754/dbl-64/s_totalorder.c +++ b/sysdeps/ieee754/dbl-64/s_totalorder.c @@ -18,6 +18,7 @@ #include <math.h> #include <math_private.h> +#include <nan-high-order-bit.h> #include <stdint.h> int @@ -27,7 +28,7 @@ totalorder (double x, double y) uint32_t lx, ly; EXTRACT_WORDS (hx, lx, x); EXTRACT_WORDS (hy, ly, y); -#ifdef HIGH_ORDER_BIT_IS_SET_FOR_SNAN +#if HIGH_ORDER_BIT_IS_SET_FOR_SNAN uint32_t uhx = hx & 0x7fffffff, uhy = hy & 0x7fffffff; /* For the preferred quiet NaN convention, this operation is a comparison of the representations of the arguments interpreted as diff --git a/sysdeps/ieee754/dbl-64/s_totalordermag.c b/sysdeps/ieee754/dbl-64/s_totalordermag.c index e41dade..3850c33 100644 --- a/sysdeps/ieee754/dbl-64/s_totalordermag.c +++ b/sysdeps/ieee754/dbl-64/s_totalordermag.c @@ -18,6 +18,7 @@ #include <math.h> #include <math_private.h> +#include <nan-high-order-bit.h> #include <stdint.h> int @@ -29,7 +30,7 @@ totalordermag (double x, double y) EXTRACT_WORDS (hy, ly, y); hx &= 0x7fffffff; hy &= 0x7fffffff; -#ifdef HIGH_ORDER_BIT_IS_SET_FOR_SNAN +#if HIGH_ORDER_BIT_IS_SET_FOR_SNAN /* For the preferred quiet NaN convention, this operation is a comparison of the representations of the absolute values of the arguments. If both arguments are NaNs, invert the diff --git a/sysdeps/ieee754/dbl-64/wordsize-64/s_issignaling.c b/sysdeps/ieee754/dbl-64/wordsize-64/s_issignaling.c index c22e608..18d1acd 100644 --- a/sysdeps/ieee754/dbl-64/wordsize-64/s_issignaling.c +++ b/sysdeps/ieee754/dbl-64/wordsize-64/s_issignaling.c @@ -18,13 +18,14 @@ #include <math.h> #include <math_private.h> +#include <nan-high-order-bit.h> int __issignaling (double x) { u_int64_t xi; EXTRACT_WORDS64 (xi, x); -#ifdef HIGH_ORDER_BIT_IS_SET_FOR_SNAN +#if HIGH_ORDER_BIT_IS_SET_FOR_SNAN /* We only have to care about the high-order bit of x's significand, because having it set (sNaN) already makes the significand different from that used to designate infinity. */ diff --git a/sysdeps/ieee754/dbl-64/wordsize-64/s_totalorder.c b/sysdeps/ieee754/dbl-64/wordsize-64/s_totalorder.c index 02cd799..dd5587b 100644 --- a/sysdeps/ieee754/dbl-64/wordsize-64/s_totalorder.c +++ b/sysdeps/ieee754/dbl-64/wordsize-64/s_totalorder.c @@ -18,6 +18,7 @@ #include <math.h> #include <math_private.h> +#include <nan-high-order-bit.h> #include <stdint.h> int @@ -26,7 +27,7 @@ totalorder (double x, double y) int64_t ix, iy; EXTRACT_WORDS64 (ix, x); EXTRACT_WORDS64 (iy, y); -#ifdef HIGH_ORDER_BIT_IS_SET_FOR_SNAN +#if HIGH_ORDER_BIT_IS_SET_FOR_SNAN /* For the preferred quiet NaN convention, this operation is a comparison of the representations of the arguments interpreted as sign-magnitude integers. If both arguments are NaNs, invert the diff --git a/sysdeps/ieee754/dbl-64/wordsize-64/s_totalordermag.c b/sysdeps/ieee754/dbl-64/wordsize-64/s_totalordermag.c index 38f2e1b..999a919 100644 --- a/sysdeps/ieee754/dbl-64/wordsize-64/s_totalordermag.c +++ b/sysdeps/ieee754/dbl-64/wordsize-64/s_totalordermag.c @@ -18,6 +18,7 @@ #include <math.h> #include <math_private.h> +#include <nan-high-order-bit.h> #include <stdint.h> int @@ -28,7 +29,7 @@ totalordermag (double x, double y) EXTRACT_WORDS64 (iy, y); ix &= 0x7fffffffffffffffULL; iy &= 0x7fffffffffffffffULL; -#ifdef HIGH_ORDER_BIT_IS_SET_FOR_SNAN +#if HIGH_ORDER_BIT_IS_SET_FOR_SNAN /* For the preferred quiet NaN convention, this operation is a comparison of the representations of the absolute values of the arguments. If both arguments are NaNs, invert the diff --git a/sysdeps/ieee754/flt-32/s_issignalingf.c b/sysdeps/ieee754/flt-32/s_issignalingf.c index 2409ff4..965ba92 100644 --- a/sysdeps/ieee754/flt-32/s_issignalingf.c +++ b/sysdeps/ieee754/flt-32/s_issignalingf.c @@ -18,13 +18,14 @@ #include <math.h> #include <math_private.h> +#include <nan-high-order-bit.h> int __issignalingf (float x) { u_int32_t xi; GET_FLOAT_WORD (xi, x); -#ifdef HIGH_ORDER_BIT_IS_SET_FOR_SNAN +#if HIGH_ORDER_BIT_IS_SET_FOR_SNAN /* We only have to care about the high-order bit of x's significand, because having it set (sNaN) already makes the significand different from that used to designate infinity. */ diff --git a/sysdeps/ieee754/flt-32/s_totalorderf.c b/sysdeps/ieee754/flt-32/s_totalorderf.c index 1ed30d8..243387b 100644 --- a/sysdeps/ieee754/flt-32/s_totalorderf.c +++ b/sysdeps/ieee754/flt-32/s_totalorderf.c @@ -18,6 +18,7 @@ #include <math.h> #include <math_private.h> +#include <nan-high-order-bit.h> #include <stdint.h> int @@ -26,7 +27,7 @@ totalorderf (float x, float y) int32_t ix, iy; GET_FLOAT_WORD (ix, x); GET_FLOAT_WORD (iy, y); -#ifdef HIGH_ORDER_BIT_IS_SET_FOR_SNAN +#if HIGH_ORDER_BIT_IS_SET_FOR_SNAN /* For the preferred quiet NaN convention, this operation is a comparison of the representations of the arguments interpreted as sign-magnitude integers. If both arguments are NaNs, invert the diff --git a/sysdeps/ieee754/flt-32/s_totalordermagf.c b/sysdeps/ieee754/flt-32/s_totalordermagf.c index 7c01edc..be78eae 100644 --- a/sysdeps/ieee754/flt-32/s_totalordermagf.c +++ b/sysdeps/ieee754/flt-32/s_totalordermagf.c @@ -18,6 +18,7 @@ #include <math.h> #include <math_private.h> +#include <nan-high-order-bit.h> #include <stdint.h> int @@ -28,7 +29,7 @@ totalordermagf (float x, float y) GET_FLOAT_WORD (iy, y); ix &= 0x7fffffff; iy &= 0x7fffffff; -#ifdef HIGH_ORDER_BIT_IS_SET_FOR_SNAN +#if HIGH_ORDER_BIT_IS_SET_FOR_SNAN /* For the preferred quiet NaN convention, this operation is a comparison of the representations of the absolute values of the arguments. If both arguments are NaNs, invert the diff --git a/sysdeps/ieee754/ldbl-128/s_issignalingl.c b/sysdeps/ieee754/ldbl-128/s_issignalingl.c index 6af1db4..cb0f2a5 100644 --- a/sysdeps/ieee754/ldbl-128/s_issignalingl.c +++ b/sysdeps/ieee754/ldbl-128/s_issignalingl.c @@ -18,13 +18,14 @@ #include <math.h> #include <math_private.h> +#include <nan-high-order-bit.h> int __issignalingl (_Float128 x) { u_int64_t hxi, lxi __attribute__ ((unused)); GET_LDOUBLE_WORDS64 (hxi, lxi, x); -#ifdef HIGH_ORDER_BIT_IS_SET_FOR_SNAN +#if HIGH_ORDER_BIT_IS_SET_FOR_SNAN /* We only have to care about the high-order bit of x's significand, because having it set (sNaN) already makes the significand different from that used to designate infinity. */ diff --git a/sysdeps/ieee754/ldbl-128/s_totalorderl.c b/sysdeps/ieee754/ldbl-128/s_totalorderl.c index dc76ccf..32ede1f 100644 --- a/sysdeps/ieee754/ldbl-128/s_totalorderl.c +++ b/sysdeps/ieee754/ldbl-128/s_totalorderl.c @@ -18,6 +18,7 @@ #include <math.h> #include <math_private.h> +#include <nan-high-order-bit.h> #include <stdint.h> int @@ -27,7 +28,7 @@ totalorderl (_Float128 x, _Float128 y) uint64_t lx, ly; GET_LDOUBLE_WORDS64 (hx, lx, x); GET_LDOUBLE_WORDS64 (hy, ly, y); -#ifdef HIGH_ORDER_BIT_IS_SET_FOR_SNAN +#if HIGH_ORDER_BIT_IS_SET_FOR_SNAN uint64_t uhx = hx & 0x7fffffffffffffffULL; uint64_t uhy = hy & 0x7fffffffffffffffULL; /* For the preferred quiet NaN convention, this operation is a diff --git a/sysdeps/ieee754/ldbl-128/s_totalordermagl.c b/sysdeps/ieee754/ldbl-128/s_totalordermagl.c index bcfeecd..5446809 100644 --- a/sysdeps/ieee754/ldbl-128/s_totalordermagl.c +++ b/sysdeps/ieee754/ldbl-128/s_totalordermagl.c @@ -18,6 +18,7 @@ #include <math.h> #include <math_private.h> +#include <nan-high-order-bit.h> #include <stdint.h> int @@ -29,7 +30,7 @@ totalordermagl (_Float128 x, _Float128 y) GET_LDOUBLE_WORDS64 (hy, ly, y); hx &= 0x7fffffffffffffffULL; hy &= 0x7fffffffffffffffULL; -#ifdef HIGH_ORDER_BIT_IS_SET_FOR_SNAN +#if HIGH_ORDER_BIT_IS_SET_FOR_SNAN /* For the preferred quiet NaN convention, this operation is a comparison of the representations of the absolute values of the arguments. If both arguments are NaNs, invert the diff --git a/sysdeps/ieee754/ldbl-128ibm/s_issignalingl.c b/sysdeps/ieee754/ldbl-128ibm/s_issignalingl.c index 0915139..94cfffcd 100644 --- a/sysdeps/ieee754/ldbl-128ibm/s_issignalingl.c +++ b/sysdeps/ieee754/ldbl-128ibm/s_issignalingl.c @@ -18,6 +18,7 @@ #include <math.h> #include <math_private.h> +#include <nan-high-order-bit.h> int __issignalingl (long double x) @@ -29,7 +30,7 @@ __issignalingl (long double x) xhi = ldbl_high (x); EXTRACT_WORDS64 (xi, xhi); -#ifdef HIGH_ORDER_BIT_IS_SET_FOR_SNAN +#if HIGH_ORDER_BIT_IS_SET_FOR_SNAN # error untested /* We only have to care about the high-order bit of x's significand, because having it set (sNaN) already makes the significand different from that diff --git a/sysdeps/ieee754/ldbl-128ibm/s_totalorderl.c b/sysdeps/ieee754/ldbl-128ibm/s_totalorderl.c index 1535b2f..ff55779 100644 --- a/sysdeps/ieee754/ldbl-128ibm/s_totalorderl.c +++ b/sysdeps/ieee754/ldbl-128ibm/s_totalorderl.c @@ -18,6 +18,7 @@ #include <math.h> #include <math_private.h> +#include <nan-high-order-bit.h> #include <stdint.h> int @@ -30,7 +31,7 @@ totalorderl (long double x, long double y) EXTRACT_WORDS64 (hx, xhi); ldbl_unpack (y, &yhi, &ylo); EXTRACT_WORDS64 (hy, yhi); -#ifdef HIGH_ORDER_BIT_IS_SET_FOR_SNAN +#if HIGH_ORDER_BIT_IS_SET_FOR_SNAN # error not implemented #endif uint64_t hx_sign = hx >> 63; diff --git a/sysdeps/ieee754/ldbl-128ibm/s_totalordermagl.c b/sysdeps/ieee754/ldbl-128ibm/s_totalordermagl.c index 509a23a..739e231 100644 --- a/sysdeps/ieee754/ldbl-128ibm/s_totalordermagl.c +++ b/sysdeps/ieee754/ldbl-128ibm/s_totalordermagl.c @@ -18,6 +18,7 @@ #include <math.h> #include <math_private.h> +#include <nan-high-order-bit.h> #include <stdint.h> int @@ -30,7 +31,7 @@ totalordermagl (long double x, long double y) EXTRACT_WORDS64 (hx, xhi); ldbl_unpack (y, &yhi, &ylo); EXTRACT_WORDS64 (hy, yhi); -#ifdef HIGH_ORDER_BIT_IS_SET_FOR_SNAN +#if HIGH_ORDER_BIT_IS_SET_FOR_SNAN # error not implemented #endif uint64_t x_sign = hx & 0x8000000000000000ULL; diff --git a/sysdeps/ieee754/ldbl-96/s_issignalingl.c b/sysdeps/ieee754/ldbl-96/s_issignalingl.c index 73646ca..364e5db 100644 --- a/sysdeps/ieee754/ldbl-96/s_issignalingl.c +++ b/sysdeps/ieee754/ldbl-96/s_issignalingl.c @@ -18,13 +18,14 @@ #include <math.h> #include <math_private.h> +#include <nan-high-order-bit.h> int __issignalingl (long double x) { u_int32_t exi, hxi, lxi; GET_LDOUBLE_WORDS (exi, hxi, lxi, x); -#ifdef HIGH_ORDER_BIT_IS_SET_FOR_SNAN +#if HIGH_ORDER_BIT_IS_SET_FOR_SNAN # error not implemented #else /* To keep the following comparison simple, toggle the quiet/signaling bit, diff --git a/sysdeps/ieee754/ldbl-96/s_totalorderl.c b/sysdeps/ieee754/ldbl-96/s_totalorderl.c index 4f14baf..ddc28b8 100644 --- a/sysdeps/ieee754/ldbl-96/s_totalorderl.c +++ b/sysdeps/ieee754/ldbl-96/s_totalorderl.c @@ -19,6 +19,7 @@ #include <float.h> #include <math.h> #include <math_private.h> +#include <nan-high-order-bit.h> #include <stdint.h> int @@ -41,7 +42,7 @@ totalorderl (long double x, long double y) if ((expy & 0x7fff) == 0x7fff) hy |= 0x80000000; } -#ifdef HIGH_ORDER_BIT_IS_SET_FOR_SNAN +#if HIGH_ORDER_BIT_IS_SET_FOR_SNAN # error not implemented #endif uint32_t x_sign = expx >> 15; diff --git a/sysdeps/ieee754/ldbl-96/s_totalordermagl.c b/sysdeps/ieee754/ldbl-96/s_totalordermagl.c index 0167f0f..4ca28e7 100644 --- a/sysdeps/ieee754/ldbl-96/s_totalordermagl.c +++ b/sysdeps/ieee754/ldbl-96/s_totalordermagl.c @@ -19,6 +19,7 @@ #include <float.h> #include <math.h> #include <math_private.h> +#include <nan-high-order-bit.h> #include <stdint.h> int @@ -43,7 +44,7 @@ totalordermagl (long double x, long double y) if (expy == 0x7fff) hy |= 0x80000000; } -#ifdef HIGH_ORDER_BIT_IS_SET_FOR_SNAN +#if HIGH_ORDER_BIT_IS_SET_FOR_SNAN # error not implemented #endif return expx < expy || (expx == expy && (hx < hy || (hx == hy && lx <= ly))); diff --git a/sysdeps/mips/math_private.h b/sysdeps/mips/math_private.h index 2ea3c57..4587d01 100644 --- a/sysdeps/mips/math_private.h +++ b/sysdeps/mips/math_private.h @@ -19,14 +19,6 @@ #ifndef MIPS_MATH_PRIVATE_H #define MIPS_MATH_PRIVATE_H 1 -#ifdef __mips_nan2008 -/* MIPS aligned to IEEE 754-2008. */ -#else -/* One of the few architectures where the meaning of the quiet/signaling bit is - inverse to IEEE 754-2008 (as well as common practice for IEEE 754-1985). */ -# define HIGH_ORDER_BIT_IS_SET_FOR_SNAN -#endif - /* Inline functions to speed up the math library implementation. The default versions of these routines are in generic/math_private.h and call fesetround, feholdexcept, etc. These routines use inlined diff --git a/sysdeps/mips/nan-high-order-bit.h b/sysdeps/mips/nan-high-order-bit.h new file mode 100644 index 0000000..0aaef0f --- /dev/null +++ b/sysdeps/mips/nan-high-order-bit.h @@ -0,0 +1,32 @@ +/* Specify NaN high-order bit conventions. MIPS version. + Copyright (C) 2016 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 NAN_HIGH_ORDER_BIT_H +#define NAN_HIGH_ORDER_BIT_H 1 + +#ifdef __mips_nan2008 +/* MIPS aligned to IEEE 754-2008. */ +# define HIGH_ORDER_BIT_IS_SET_FOR_SNAN 0 +#else +/* One of the few architectures where the meaning of the + quiet/signaling bit is inverse to IEEE 754-2008 (as well as common + practice for IEEE 754-1985). */ +# define HIGH_ORDER_BIT_IS_SET_FOR_SNAN 1 +#endif + +#endif /* nan-high-order-bit.h */ |