This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[PATCH v2] Don't spin around multiplying zeroes in __mul
- From: Siddhesh Poyarekar <siddhesh at redhat dot com>
- To: libc-alpha at sourceware dot org
- Date: Tue, 15 Jan 2013 18:49:38 +0530
- Subject: [PATCH v2] Don't spin around multiplying zeroes in __mul
- References: <20130111141941.GF16859@spoyarek.pnq.redhat.com>
Hi,
Updated patch slightly to fix some correctness issues. The benchmark
numbers are pretty much the same.
Siddhesh
* sysdeps/ieee754/dbl-64/mpa.c (__mul): Don't bother with zero
values in the mantissa.
diff --git a/sysdeps/ieee754/dbl-64/mpa.c b/sysdeps/ieee754/dbl-64/mpa.c
index c882c8b..3471f6a 100644
--- a/sysdeps/ieee754/dbl-64/mpa.c
+++ b/sysdeps/ieee754/dbl-64/mpa.c
@@ -605,7 +605,7 @@ void
SECTION
__mul (const mp_no *x, const mp_no *y, mp_no *z, int p)
{
- int i, j, k, k2;
+ int i, j, k, ip = p;
double u, zk;
/* Is z=0? */
@@ -615,19 +615,31 @@ __mul (const mp_no *x, const mp_no *y, mp_no *z, int p)
return;
}
+ /* We need not iterate through all X's and Y's since it's pointless to
+ multiply zeroes. */
+ for (i = p; i > 0; i--)
+ if (X[i] == ZERO && Y[i] == ZERO)
+ ip--;
+ else
+ break;
+
/* Multiply, add and carry. */
- k2 = (__glibc_unlikely (p < 3)) ? p + p : p + 3;
- zk = Z[k2] = ZERO;
+ k = (__glibc_unlikely (p < 3)) ? p + p : p + 3;
+
+ while (k > 2 * ip)
+ Z[k--] = ZERO;
+
+ zk = Z[k] = ZERO;
- for (k = k2; k > p; k--)
+ while (k > p)
{
- for (i = k - p, j = p; i < p + 1; i++, j--)
+ for (i = k - ip, j = ip; i < ip + 1; i++, j--)
zk += X[i] * Y[j];
u = (zk + CUTTER) - CUTTER;
if (u > zk)
u -= RADIX;
- Z[k] = zk - u;
+ Z[k--] = zk - u;
zk = u * RADIXI;
}
@@ -639,9 +651,8 @@ __mul (const mp_no *x, const mp_no *y, mp_no *z, int p)
u = (zk + CUTTER) - CUTTER;
if (u > zk)
u -= RADIX;
- Z[k] = zk - u;
+ Z[k--] = zk - u;
zk = u * RADIXI;
- k--;
}
Z[k] = zk;