aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/ieee754/k_standard.c
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2014-12-22 18:45:50 +0000
committerJoseph Myers <joseph@codesourcery.com>2014-12-22 18:45:50 +0000
commitf56f91245a0a5aa0facaa14b5608cfb761df7c38 (patch)
tree22f4e47bc078aa8e74c5943bcb75422fed2518a4 /sysdeps/ieee754/k_standard.c
parent9d1fc928a4c3ab15b46945b0abdf7054a75cc010 (diff)
downloadglibc-f56f91245a0a5aa0facaa14b5608cfb761df7c38.tar
glibc-f56f91245a0a5aa0facaa14b5608cfb761df7c38.tar.gz
glibc-f56f91245a0a5aa0facaa14b5608cfb761df7c38.tar.bz2
glibc-f56f91245a0a5aa0facaa14b5608cfb761df7c38.zip
Split __kernel_standard* functions (fixes bug 17724).
Bug 17724 reports references to fesetround being brought in by ldbl-128ibm rintl via references to __rintl from __kernel_standard_l. Because all three __kernel_standard* functions are in the same file, this gets brought in even though only the long double version __kernel_standard_l needs __rintl, and the C90 functions use only __kernel_standard. This patch fixes this by splitting the three versions into separate files; it's fine for long double functions to refer to fe* functions directly, unless they get called by C90 double functions. Tested for x86_64 (testsuite; the reordering of code means disassembly of shared libraries can't usefully be compared). Tested for powerpc that the relevant issue disappears from the linknamespace test output. [BZ #17724] * sysdeps/ieee754/k_standard.c: Don't include <float.h>. (__kernel_standard_f): Remove. Moved to k_standardf.c. (__kernel_standard_l): Remove. Moved to k_standardl.c with (char *) casts added. * sysdeps/ieee754/k_standardf.c: New file. * sysdeps/ieee754/k_standardl.c: Likewise. * math/Makefile (libm-support): Remove k_standard. (libm-calls): Add k_standard.
Diffstat (limited to 'sysdeps/ieee754/k_standard.c')
-rw-r--r--sysdeps/ieee754/k_standard.c90
1 files changed, 0 insertions, 90 deletions
diff --git a/sysdeps/ieee754/k_standard.c b/sysdeps/ieee754/k_standard.c
index 5399c6682d..7b82cd1130 100644
--- a/sysdeps/ieee754/k_standard.c
+++ b/sysdeps/ieee754/k_standard.c
@@ -16,7 +16,6 @@ static char rcsid[] = "$NetBSD: k_standard.c,v 1.6 1995/05/10 20:46:35 jtc Exp $
#include <math.h>
#include <math_private.h>
-#include <float.h>
#include <errno.h>
#include <assert.h>
@@ -997,92 +996,3 @@ __kernel_standard(double x, double y, int type)
}
return exc.retval;
}
-
-
-float
-__kernel_standard_f(float x, float y, int type)
-{
- return __kernel_standard(x, y, type);
-}
-
-#ifndef __NO_LONG_DOUBLE_MATH
-long double
-__kernel_standard_l (long double x, long double y, int type)
-{
- double dx, dy;
- struct exception exc;
-
- if (isfinite (x))
- {
- long double ax = fabsl (x);
- if (ax > DBL_MAX)
- dx = __copysignl (DBL_MAX, x);
- else if (ax > 0 && ax < DBL_MIN)
- dx = __copysignl (DBL_MIN, x);
- else
- dx = x;
- }
- else
- dx = x;
- if (isfinite (y))
- {
- long double ay = fabsl (y);
- if (ay > DBL_MAX)
- dy = __copysignl (DBL_MAX, y);
- else if (ay > 0 && ay < DBL_MIN)
- dy = __copysignl (DBL_MIN, y);
- else
- dy = y;
- }
- else
- dy = y;
-
- switch (type)
- {
- case 221:
- /* powl (x, y) overflow. */
- exc.arg1 = dx;
- exc.arg2 = dy;
- exc.type = OVERFLOW;
- exc.name = "powl";
- if (_LIB_VERSION == _SVID_)
- {
- exc.retval = HUGE;
- y *= 0.5;
- if (x < zero && __rintl (y) != y)
- exc.retval = -HUGE;
- }
- else
- {
- exc.retval = HUGE_VAL;
- y *= 0.5;
- if (x < zero && __rintl (y) != y)
- exc.retval = -HUGE_VAL;
- }
- if (_LIB_VERSION == _POSIX_)
- __set_errno (ERANGE);
- else if (!matherr (&exc))
- __set_errno (ERANGE);
- return exc.retval;
-
- case 222:
- /* powl (x, y) underflow. */
- exc.arg1 = dx;
- exc.arg2 = dy;
- exc.type = UNDERFLOW;
- exc.name = "powl";
- exc.retval = zero;
- y *= 0.5;
- if (x < zero && __rintl (y) != y)
- exc.retval = -zero;
- if (_LIB_VERSION == _POSIX_)
- __set_errno (ERANGE);
- else if (!matherr (&exc))
- __set_errno (ERANGE);
- return exc.retval;
-
- default:
- return __kernel_standard (dx, dy, type);
- }
-}
-#endif