diff options
Diffstat (limited to 'sysdeps')
22 files changed, 104 insertions, 36 deletions
diff --git a/sysdeps/generic/nan-high-order-bit.h b/sysdeps/generic/nan-high-order-bit.h new file mode 100644 index 0000000000..15619153cf --- /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 1acfb9ae4a..a63d6a789a 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 4b93d6ae60..0b845e244e 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 73ac32f78b..c4ec917207 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 e41dade54a..3850c33235 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 c22e608c6e..18d1acd0c9 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 02cd799cf6..dd5587ba21 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 38f2e1ba8f..999a9196f3 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 2409ff408c..965ba92536 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 1ed30d8116..243387b11e 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 7c01edc29a..be78eae780 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 6af1db4e37..cb0f2a5383 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 dc76ccf204..32ede1f4be 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 bcfeecd4c4..5446809a42 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 091513908b..94cfffcd4b 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 1535b2fb1e..ff55779433 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 509a23a669..739e23194e 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 73646cac0c..364e5db222 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 4f14bafb44..ddc28b84b0 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 0167f0fb81..4ca28e7527 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 2ea3c5708a..4587d0163a 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 0000000000..0aaef0fec6 --- /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 */ |