aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSiddhesh Poyarekar <siddhesh@redhat.com>2013-02-16 00:09:29 +0530
committerSiddhesh Poyarekar <siddhesh@redhat.com>2013-02-16 00:09:29 +0530
commit4709fe7602b56e9f6ee1ab6afb4067409a784f29 (patch)
treece320f90a81d0a5526ccefcd85fde460fd046c81
parent2d0e0f29f85036d1189231cb7c1f19f27ba14a89 (diff)
downloadglibc-4709fe7602b56e9f6ee1ab6afb4067409a784f29.tar
glibc-4709fe7602b56e9f6ee1ab6afb4067409a784f29.tar.gz
glibc-4709fe7602b56e9f6ee1ab6afb4067409a784f29.tar.bz2
glibc-4709fe7602b56e9f6ee1ab6afb4067409a784f29.zip
Use intermediate variable to compute exponent in __mul
-rw-r--r--ChangeLog6
-rw-r--r--sysdeps/ieee754/dbl-64/mpa.c19
2 files changed, 20 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 012fce4f69..607433b82f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,8 @@
-2013-02-15 Siddhesh Poyarekar <siddhesh@redhat.com>
+2013-02-16 Siddhesh Poyarekar <siddhesh@redhat.com>
+
+ * sysdeps/ieee754/dbl-64/mpa.c (__mul): Use intermediate
+ variable to calculate EZ.
+ (__sqr): Likewise.
* sysdeps/ieee754/dbl-64/mpa.c (__mul): Fix determination of
the lower precision input.
diff --git a/sysdeps/ieee754/dbl-64/mpa.c b/sysdeps/ieee754/dbl-64/mpa.c
index 25f52f65c6..9da4257263 100644
--- a/sysdeps/ieee754/dbl-64/mpa.c
+++ b/sysdeps/ieee754/dbl-64/mpa.c
@@ -693,15 +693,20 @@ __mul (const mp_no *x, const mp_no *y, mp_no *z, int p)
}
Z[k] = zk;
- EZ = EX + EY;
+ /* Get the exponent sum into an intermediate variable. This is a subtle
+ optimization, where given enough registers, all operations on the exponent
+ happen in registers and the result is written out only once into EZ. */
+ int e = EX + EY;
+
/* Is there a carry beyond the most significant digit? */
if (__glibc_unlikely (Z[1] == ZERO))
{
for (i = 1; i <= p; i++)
Z[i] = Z[i + 1];
- EZ--;
+ e--;
}
+ EZ = e;
Z[0] = X[0] * Y[0];
}
@@ -786,14 +791,20 @@ __sqr (const mp_no *x, mp_no *y, int p)
/* Squares are always positive. */
Y[0] = 1.0;
- EY = 2 * EX;
+ /* Get the exponent sum into an intermediate variable. This is a subtle
+ optimization, where given enough registers, all operations on the exponent
+ happen in registers and the result is written out only once into EZ. */
+ int e = EX * 2;
+
/* Is there a carry beyond the most significant digit? */
if (__glibc_unlikely (Y[1] == ZERO))
{
for (i = 1; i <= p; i++)
Y[i] = Y[i + 1];
- EY--;
+ e--;
}
+
+ EY = e;
}
/* Invert *X and store in *Y. Relative error bound: