Use an intermediate variable to sum exponents in powerpc __mul and __sqr

This commit is contained in:
Siddhesh Poyarekar 2013-03-07 13:18:56 +05:30
parent 82a9811d29
commit e6ebd4a7d5
3 changed files with 19 additions and 10 deletions

View File

@ -1,5 +1,12 @@
2013-03-07 Siddhesh Poyarekar <siddhesh@redhat.com> 2013-03-07 Siddhesh Poyarekar <siddhesh@redhat.com>
* sysdeps/powerpc/powerpc32/power4/fpu/mpa.c (__mul): Use
intermediate variable to calculate exponent.
(__sqr): Likewise.
* sysdeps/powerpc/powerpc64/power4/fpu/mpa.c (__mul):
Likewise.
(__sqr): Likewise.
* sysdeps/ieee754/dbl-64/mpa.c [!NO__MUL]: Define __mul. * sysdeps/ieee754/dbl-64/mpa.c [!NO__MUL]: Define __mul.
[!NO__SQR]: Define __sqr. [!NO__SQR]: Define __sqr.
* sysdeps/powerpc/powerpc32/power4/fpu/mpa.c: define NO__MUL * sysdeps/powerpc/powerpc32/power4/fpu/mpa.c: define NO__MUL

View File

@ -99,16 +99,16 @@ __mul (const mp_no *x, const mp_no *y, mp_no *z, int p)
} }
Z[k] = zk; Z[k] = zk;
int e = EX + EY;
/* Is there a carry beyond the most significant digit? */ /* Is there a carry beyond the most significant digit? */
if (Z[1] == ZERO) if (Z[1] == ZERO)
{ {
for (i = 1; i <= p2; i++) for (i = 1; i <= p2; i++)
Z[i] = Z[i + 1]; Z[i] = Z[i + 1];
EZ = EX + EY - 1; e--;
} }
else
EZ = EX + EY;
EZ = e;
Z[0] = X[0] * Y[0]; Z[0] = X[0] * Y[0];
} }
@ -202,12 +202,13 @@ __sqr (const mp_no *x, mp_no *y, int p)
/* Squares are always positive. */ /* Squares are always positive. */
Y[0] = 1.0; Y[0] = 1.0;
EY = 2 * EX; int e = EX * 2;
/* Is there a carry beyond the most significant digit? */ /* Is there a carry beyond the most significant digit? */
if (__glibc_unlikely (Y[1] == ZERO)) if (__glibc_unlikely (Y[1] == ZERO))
{ {
for (i = 1; i <= p; i++) for (i = 1; i <= p; i++)
Y[i] = Y[i + 1]; Y[i] = Y[i + 1];
EY--; e--;
} }
EY = e;
} }

View File

@ -99,16 +99,16 @@ __mul (const mp_no *x, const mp_no *y, mp_no *z, int p)
} }
Z[k] = zk; Z[k] = zk;
int e = EX + EY;
/* Is there a carry beyond the most significant digit? */ /* Is there a carry beyond the most significant digit? */
if (Z[1] == ZERO) if (Z[1] == ZERO)
{ {
for (i = 1; i <= p2; i++) for (i = 1; i <= p2; i++)
Z[i] = Z[i + 1]; Z[i] = Z[i + 1];
EZ = EX + EY - 1; e--;
} }
else
EZ = EX + EY;
EZ = e;
Z[0] = X[0] * Y[0]; Z[0] = X[0] * Y[0];
} }
@ -202,12 +202,13 @@ __sqr (const mp_no *x, mp_no *y, int p)
/* Squares are always positive. */ /* Squares are always positive. */
Y[0] = 1.0; Y[0] = 1.0;
EY = 2 * EX; int e = EX * 2;
/* Is there a carry beyond the most significant digit? */ /* Is there a carry beyond the most significant digit? */
if (__glibc_unlikely (Y[1] == ZERO)) if (__glibc_unlikely (Y[1] == ZERO))
{ {
for (i = 1; i <= p; i++) for (i = 1; i <= p; i++)
Y[i] = Y[i + 1]; Y[i] = Y[i + 1];
EY--; e--;
} }
EY = e;
} }