Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 3 Jun 2013 17:51:08 +0000 (UTC)
From:      Steve Kargl <kargl@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r251327 - in head/lib/msun: ld128 ld80
Message-ID:  <201306031751.r53Hp8Mm099653@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kargl
Date: Mon Jun  3 17:51:08 2013
New Revision: 251327
URL: http://svnweb.freebsd.org/changeset/base/251327

Log:
  Introduce the macro LOG2_INTERVAL, which is log2(number of intervals).
  Use the macroi as a micro-optimization to convert a subtraction and
  division to a shift.
  
  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 17:41:11 2013	(r251326)
+++ head/lib/msun/ld128/s_expl.c	Mon Jun  3 17:51:08 2013	(r251327)
@@ -38,6 +38,7 @@ __FBSDID("$FreeBSD$");
 #include "math_private.h"
 
 #define	INTERVALS	128
+#define	LOG2_INTERVALS	7
 #define	BIAS	(LDBL_MAX_EXP - 1)
 
 static volatile const long double tiny = 0x1p-10000L;
@@ -229,7 +230,7 @@ expl(long double x)
 	fn = x * INV_L + 0x1.8p112 - 0x1.8p112;
 	n = (int)fn;
 	n2 = (unsigned)n % INTERVALS;
-	k = (n - n2) / INTERVALS;
+	k = n >> LOG2_INTERVALS;
 	r1 = x - fn * L1;
 	r2 = -fn * L2;
 

Modified: head/lib/msun/ld80/s_expl.c
==============================================================================
--- head/lib/msun/ld80/s_expl.c	Mon Jun  3 17:41:11 2013	(r251326)
+++ head/lib/msun/ld80/s_expl.c	Mon Jun  3 17:51:08 2013	(r251327)
@@ -50,6 +50,7 @@ __FBSDID("$FreeBSD$");
 #include "math_private.h"
 
 #define	INTERVALS	128
+#define	LOG2_INTERVALS	7
 #define	BIAS	(LDBL_MAX_EXP - 1)
 
 static const long double
@@ -269,7 +270,8 @@ expl(long double x)
 	n = (int)fn;
 #endif
 	n2 = (unsigned)n % INTERVALS;
-	k = (n - n2) / INTERVALS;
+	/* Depend on the sign bit being propagated: */
+	k = n >> LOG2_INTERVALS;
 	r1 = x - fn * L1;
 	r2 = -fn * L2;
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201306031751.r53Hp8Mm099653>