From 44e0d4c20ce5bf3825897e5d4b7caae94016214d Mon Sep 17 00:00:00 2001 From: Siddhesh Poyarekar Date: Wed, 2 Jan 2013 11:44:13 +0530 Subject: [PATCH] Split mantissa calculation loop and add branch prediction --- ChangeLog | 3 ++ sysdeps/ieee754/dbl-64/mpa.c | 63 +++++++++++++++++++++++------------- 2 files changed, 44 insertions(+), 22 deletions(-) diff --git a/ChangeLog b/ChangeLog index d0c10b5ff2..78acd020f2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,8 @@ 2013-01-02 Siddhesh Poyarekar + * sysdeps/ieee754/dbl-64/mpa.c (__mul): Split mantissa + calculation loop and add branch prediction. + * sysdeps/ieee754/dbl-64/mpexp.c (__mpexp): Add assert to check access beyond bounds of m1np. diff --git a/sysdeps/ieee754/dbl-64/mpa.c b/sysdeps/ieee754/dbl-64/mpa.c index 499dbd309d..266c971c18 100644 --- a/sysdeps/ieee754/dbl-64/mpa.c +++ b/sysdeps/ieee754/dbl-64/mpa.c @@ -447,33 +447,52 @@ void SECTION __mul(const mp_no *x, const mp_no *y, mp_no *z, int p) { - int i, i1, i2, j, k, k2; + int i, j, k, k2; double u; - /* Is z=0? */ - if (X[0]*Y[0]==ZERO) - { Z[0]=ZERO; return; } + /* Is z=0? */ + if (__glibc_unlikely (X[0] * Y[0] == ZERO)) + { + Z[0]=ZERO; + return; + } - /* Multiply, add and carry */ - k2 = (p<3) ? p+p : p+3; - Z[k2]=ZERO; - for (k=k2; k>1; ) { - if (k > p) {i1=k-p; i2=p+1; } - else {i1=1; i2=k; } - for (i=i1,j=i2-1; i Z[k]) u -= RADIX; - Z[k] -= u; - Z[--k] = u*RADIXI; - } + for (k = k2; k > p; ) + { + for (i = k - p, j = p; i < p + 1; i++, j--) + Z[k] += X[i] * Y[j]; - /* Is there a carry beyond the most significant digit? */ - if (Z[1] == ZERO) { - for (i=1; i<=p; i++) Z[i]=Z[i+1]; - EZ = EX + EY - 1; } - else - EZ = EX + EY; + u = (Z[k] + CUTTER) - CUTTER; + if (u > Z[k]) + u -= RADIX; + Z[k] -= u; + Z[--k] = u * RADIXI; + } + + while (k > 1) + { + for (i = 1,j = k - 1; i < k; i++, j--) + Z[k] += X[i] * Y[j]; + + u = (Z[k] + CUTTER) - CUTTER; + if (u > Z[k]) + u -= RADIX; + Z[k] -= u; + Z[--k] = u * RADIXI; + } + + EZ = 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--; + } Z[0] = X[0] * Y[0]; }