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-all mailing list