svn commit: r251335 - in head/lib/msun: ld128 ld80
Steve Kargl
kargl at FreeBSD.org
Mon Jun 3 18:51:35 UTC 2013
Author: kargl
Date: Mon Jun 3 18:51:34 2013
New Revision: 251335
URL: http://svnweb.freebsd.org/changeset/base/251335
Log:
ld80/s_expl.c:
* In the special case x = -Inf or -NaN, use a micro-optimization
to eliminate the need to access u.xbits.man.
* Fix an off-by-one for small arguments |x| < 0x1p-65.
ld128/s_expl.c:
* In the special case x = -Inf or -NaN, use a micro-optimization
to eliminate the need to access u.xbits.manh and u.xbits.manl.
* Fix an off-by-one for small arguments |x| < 0x1p-114.
Obtained from: bde
Modified:
head/lib/msun/ld128/s_expl.c
head/lib/msun/ld80/s_expl.c
Modified: head/lib/msun/ld128/s_expl.c
==============================================================================
--- head/lib/msun/ld128/s_expl.c Mon Jun 3 18:40:00 2013 (r251334)
+++ head/lib/msun/ld128/s_expl.c Mon Jun 3 18:51:34 2013 (r251335)
@@ -234,18 +234,16 @@ expl(long double x)
ix = hx & 0x7fff;
if (ix >= BIAS + 13) { /* |x| >= 8192 or x is NaN */
if (ix == BIAS + LDBL_MAX_EXP) {
- if (hx & 0x8000 && u.xbits.manh == 0 &&
- u.xbits.manl == 0)
- return (0.0L); /* x is -Inf */
+ if (hx & 0x8000) /* x is -Inf or -NaN */
+ return (-1 / x);
return (x + x); /* x is +Inf or NaN */
}
if (x > o_threshold)
return (huge * huge);
if (x < u_threshold)
return (tiny * tiny);
- } else if (ix < BIAS - 115) { /* |x| < 0x1p-115 */
- if (huge + x > 1.0L) /* trigger inexact iff x != 0 */
- return (1.0L + x);
+ } else if (ix < BIAS - 114) { /* |x| < 0x1p-114 */
+ return (1 + x); /* 1 with inexact iff x != 0 */
}
/* Reduce x to (k*ln2 + endpoint[n2] + r1 + r2). */
Modified: head/lib/msun/ld80/s_expl.c
==============================================================================
--- head/lib/msun/ld80/s_expl.c Mon Jun 3 18:40:00 2013 (r251334)
+++ head/lib/msun/ld80/s_expl.c Mon Jun 3 18:51:34 2013 (r251335)
@@ -246,18 +246,16 @@ expl(long double x)
ix = hx & 0x7fff;
if (ix >= BIAS + 13) { /* |x| >= 8192 or x is NaN */
if (ix == BIAS + LDBL_MAX_EXP) {
- if (hx & 0x8000 && u.xbits.man == 1ULL << 63)
- return (0.0L); /* x is -Inf */
- return (x + x); /* x is +Inf, NaN or unsupported */
+ if (hx & 0x8000) /* x is -Inf, -NaN or unsupported */
+ return (-1 / x);
+ return (x + x); /* x is +Inf, +NaN or unsupported */
}
if (x > o_threshold)
return (huge * huge);
if (x < u_threshold)
return (tiny * tiny);
- } else if (ix < BIAS - 66) { /* |x| < 0x1p-66 */
- /* includes pseudo-denormals */
- if (huge + x > 1.0L) /* trigger inexact iff x != 0 */
- return (1.0L + x);
+ } else if (ix < BIAS - 65) { /* |x| < 0x1p-65 (includes pseudos) */
+ return (1 + x); /* 1 with inexact iff x != 0 */
}
ENTERI();
More information about the svn-src-head
mailing list