This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH v2] Don't spin around multiplying zeroes in __mul


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;
 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]