[PATCH v2] Don't spin around multiplying zeroes in __mul
Siddhesh Poyarekar
siddhesh@redhat.com
Tue Jan 15 13:19:00 GMT 2013
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;
More information about the Libc-alpha
mailing list