From 4aa8c9453f4f0a2fe94bdf68aebfeb13f01198a5 Mon Sep 17 00:00:00 2001 From: Steve Kargl Date: Mon, 3 Jun 2013 17:51:08 +0000 Subject: [PATCH] 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 --- lib/msun/ld128/s_expl.c | 3 ++- lib/msun/ld80/s_expl.c | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/msun/ld128/s_expl.c b/lib/msun/ld128/s_expl.c index 96145307e556..60e6425d9f09 100644 --- a/lib/msun/ld128/s_expl.c +++ b/lib/msun/ld128/s_expl.c @@ -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; diff --git a/lib/msun/ld80/s_expl.c b/lib/msun/ld80/s_expl.c index 38568f23bf97..c7d923d2e61b 100644 --- a/lib/msun/ld80/s_expl.c +++ b/lib/msun/ld80/s_expl.c @@ -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;