summaryrefslogtreecommitdiffstats
path: root/lib/msun
diff options
context:
space:
mode:
authorkargl <kargl@FreeBSD.org>2013-06-03 19:13:44 +0000
committerkargl <kargl@FreeBSD.org>2013-06-03 19:13:44 +0000
commit812c0e439302690bddbfa8b33d733285a3b24fe9 (patch)
treefb306508993bc0afee36e06852dc656db25fe49f /lib/msun
parent1f81e8e0a39d8b471b432e644a47a090d7505e25 (diff)
downloadFreeBSD-src-812c0e439302690bddbfa8b33d733285a3b24fe9.zip
FreeBSD-src-812c0e439302690bddbfa8b33d733285a3b24fe9.tar.gz
ld80/s_expl.c:
* Use integral numerical constants, and let the compiler do the conversion to long double. ld128/s_expl.c: * Use integral numerical constants, and let the compiler do the conversion to long double. * Use the ENTERI/RETURNI macros, which are no-ops on ld128. This however makes the ld80 and ld128 identical. Reviewed by: bde (as part of larger diff)
Diffstat (limited to 'lib/msun')
-rw-r--r--lib/msun/ld128/s_expl.c15
-rw-r--r--lib/msun/ld80/s_expl.c4
2 files changed, 11 insertions, 8 deletions
diff --git a/lib/msun/ld128/s_expl.c b/lib/msun/ld128/s_expl.c
index a379ff0..5637cbe 100644
--- a/lib/msun/ld128/s_expl.c
+++ b/lib/msun/ld128/s_expl.c
@@ -228,7 +228,7 @@ expl(long double x)
double dr, fn, r2;
int k, n, n2;
- uint32_t hx, ix;
+ uint16_t hx, ix;
/* Filter out exceptional cases. */
u.e = x;
@@ -248,6 +248,8 @@ expl(long double x)
return (1 + x); /* 1 with inexact iff x != 0 */
}
+ ENTERI();
+
/* Reduce x to (k*ln2 + endpoint[n2] + r1 + r2). */
/* Use a specialized rint() to get fn. Assume round-to-nearest. */
/* XXX assume no extra precision for the additions, as for trig fns. */
@@ -262,10 +264,11 @@ expl(long double x)
k = n >> LOG2_INTERVALS;
r1 = x - fn * L1;
r2 = fn * -L2;
+ r = r1 + r2;
/* Prepare scale factors. */
- v.xbits.manh = 0;
- v.xbits.manl = 0;
+ /* XXX sparc64 multiplication is so slow that scalbnl() is faster. */
+ v.e = 1;
if (k >= LDBL_MIN_EXP) {
v.xbits.expsign = BIAS + k;
twopk = v.e;
@@ -284,9 +287,9 @@ expl(long double x)
/* Scale by 2**k. */
if (k >= LDBL_MIN_EXP) {
if (k == LDBL_MAX_EXP)
- return (t * 2.0L * 0x1p16383L);
- return (t * twopk);
+ RETURNI(t * 2 * 0x1p16383L);
+ RETURNI(t * twopk);
} else {
- return (t * twopkp10000 * twom10000);
+ RETURNI(t * twopkp10000 * twom10000);
}
}
diff --git a/lib/msun/ld80/s_expl.c b/lib/msun/ld80/s_expl.c
index 79c5110..5bec63b 100644
--- a/lib/msun/ld80/s_expl.c
+++ b/lib/msun/ld80/s_expl.c
@@ -278,7 +278,7 @@ expl(long double x)
r2 = fn * -L2;
/* Prepare scale factors. */
- v.e = 1ULL << 63;
+ v.e = 1;
if (k >= LDBL_MIN_EXP) {
v.xbits.expsign = BIAS + k;
twopk = v.e;
@@ -296,7 +296,7 @@ expl(long double x)
/* Scale by 2**k. */
if (k >= LDBL_MIN_EXP) {
if (k == LDBL_MAX_EXP)
- RETURNI(t * 2.0L * 0x1p16383L);
+ RETURNI(t * 2 * 0x1p16383L);
RETURNI(t * twopk);
} else {
RETURNI(t * twopkp10000 * twom10000);
OpenPOWER on IntegriCloud