Use long wherever possible in mpa.c

Using long throughout like powerpc does is beneficial since it reduces
the need to switch to 32-bit instructions.  It gives a very minor
performance improvement.
This commit is contained in:
Siddhesh Poyarekar 2013-02-25 16:43:02 +05:30
parent 2f22a1e8dd
commit e69804d14e
2 changed files with 50 additions and 31 deletions

View File

@ -1,5 +1,16 @@
2013-02-25 Siddhesh Poyarekar <siddhesh@redhat.com> 2013-02-25 Siddhesh Poyarekar <siddhesh@redhat.com>
* sysdeps/ieee754/dbl-64/mpa.c (mcr): Use long instead of int.
(__acr): Likewise.
(__cpy): Likewise.
(norm): Likewise.
(denorm): Likewise.
(__dbl_mp): Likewise.
(add_magnitudes): Likewise.
(sub_magnitudes): Likewise.
(__mul): Likewise.
(__inv): Likewise.
* sysdeps/ieee754/dbl-64/slowexp.c: Reformat in GNU coding * sysdeps/ieee754/dbl-64/slowexp.c: Reformat in GNU coding
style. style.

View File

@ -59,8 +59,9 @@ const mp_no mptwo = {1, {1.0, 2.0}};
static int static int
mcr (const mp_no *x, const mp_no *y, int p) mcr (const mp_no *x, const mp_no *y, int p)
{ {
int i; long i;
for (i = 1; i <= p; i++) long p2 = p;
for (i = 1; i <= p2; i++)
{ {
if (X[i] == Y[i]) if (X[i] == Y[i])
continue; continue;
@ -76,7 +77,7 @@ mcr (const mp_no *x, const mp_no *y, int p)
int int
__acr (const mp_no *x, const mp_no *y, int p) __acr (const mp_no *x, const mp_no *y, int p)
{ {
int i; long i;
if (X[0] == ZERO) if (X[0] == ZERO)
{ {
@ -107,8 +108,10 @@ __acr (const mp_no *x, const mp_no *y, int p)
void void
__cpy (const mp_no *x, mp_no *y, int p) __cpy (const mp_no *x, mp_no *y, int p)
{ {
long i;
EY = EX; EY = EX;
for (int i = 0; i <= p; i++) for (i = 0; i <= p; i++)
Y[i] = X[i]; Y[i] = X[i];
} }
#endif #endif
@ -120,7 +123,7 @@ static void
norm (const mp_no *x, double *y, int p) norm (const mp_no *x, double *y, int p)
{ {
#define R RADIXI #define R RADIXI
int i; long i;
double a, c, u, v, z[5]; double a, c, u, v, z[5];
if (p < 5) if (p < 5)
{ {
@ -194,7 +197,8 @@ norm (const mp_no *x, double *y, int p)
static void static void
denorm (const mp_no *x, double *y, int p) denorm (const mp_no *x, double *y, int p)
{ {
int i, k; long i, k;
long p2 = p;
double c, u, z[5]; double c, u, z[5];
#define R RADIXI #define R RADIXI
@ -204,7 +208,7 @@ denorm (const mp_no *x, double *y, int p)
return; return;
} }
if (p == 1) if (p2 == 1)
{ {
if (EX == -42) if (EX == -42)
{ {
@ -228,7 +232,7 @@ denorm (const mp_no *x, double *y, int p)
k = 1; k = 1;
} }
} }
else if (p == 2) else if (p2 == 2)
{ {
if (EX == -42) if (EX == -42)
{ {
@ -281,7 +285,7 @@ denorm (const mp_no *x, double *y, int p)
if (u == z[3]) if (u == z[3])
{ {
for (i = k + 1; i <= p; i++) for (i = k + 1; i <= p2; i++)
{ {
if (X[i] == ZERO) if (X[i] == ZERO)
continue; continue;
@ -323,7 +327,8 @@ void
SECTION SECTION
__dbl_mp (double x, mp_no *y, int p) __dbl_mp (double x, mp_no *y, int p)
{ {
int i, n; long i, n;
long p2 = p;
double u; double u;
/* Sign. */ /* Sign. */
@ -347,7 +352,7 @@ __dbl_mp (double x, mp_no *y, int p)
x *= RADIX; x *= RADIX;
/* Digits. */ /* Digits. */
n = MIN (p, 4); n = MIN (p2, 4);
for (i = 1; i <= n; i++) for (i = 1; i <= n; i++)
{ {
u = (x + TWO52) - TWO52; u = (x + TWO52) - TWO52;
@ -357,7 +362,7 @@ __dbl_mp (double x, mp_no *y, int p)
x -= u; x -= u;
x *= RADIX; x *= RADIX;
} }
for (; i <= p; i++) for (; i <= p2; i++)
Y[i] = ZERO; Y[i] = ZERO;
} }
@ -369,14 +374,15 @@ static void
SECTION SECTION
add_magnitudes (const mp_no *x, const mp_no *y, mp_no *z, int p) add_magnitudes (const mp_no *x, const mp_no *y, mp_no *z, int p)
{ {
int i, j, k; long i, j, k;
long p2 = p;
double zk; double zk;
EZ = EX; EZ = EX;
i = p; i = p2;
j = p + EY - EX; j = p2 + EY - EX;
k = p + 1; k = p2 + 1;
if (__glibc_unlikely (j < 1)) if (__glibc_unlikely (j < 1))
{ {
@ -418,7 +424,7 @@ add_magnitudes (const mp_no *x, const mp_no *y, mp_no *z, int p)
if (zk == ZERO) if (zk == ZERO)
{ {
for (i = 1; i <= p; i++) for (i = 1; i <= p2; i++)
Z[i] = Z[i + 1]; Z[i] = Z[i + 1];
} }
else else
@ -436,13 +442,14 @@ static void
SECTION SECTION
sub_magnitudes (const mp_no *x, const mp_no *y, mp_no *z, int p) sub_magnitudes (const mp_no *x, const mp_no *y, mp_no *z, int p)
{ {
int i, j, k; long i, j, k;
long p2 = p;
double zk; double zk;
EZ = EX; EZ = EX;
i = p; i = p2;
j = p + EY - EX; j = p2 + EY - EX;
k = p; k = p2;
/* Y is too small compared to X, copy X over to the result. */ /* Y is too small compared to X, copy X over to the result. */
if (__glibc_unlikely (j < 1)) if (__glibc_unlikely (j < 1))
@ -453,7 +460,7 @@ sub_magnitudes (const mp_no *x, const mp_no *y, mp_no *z, int p)
/* The relevant least significant digit in Y is non-zero, so we factor it in /* The relevant least significant digit in Y is non-zero, so we factor it in
to enhance accuracy. */ to enhance accuracy. */
if (j < p && Y[j + 1] > ZERO) if (j < p2 && Y[j + 1] > ZERO)
{ {
Z[k + 1] = RADIX - Y[j + 1]; Z[k + 1] = RADIX - Y[j + 1];
zk = MONE; zk = MONE;
@ -496,9 +503,9 @@ sub_magnitudes (const mp_no *x, const mp_no *y, mp_no *z, int p)
/* Normalize. */ /* Normalize. */
for (i = 1; Z[i] == ZERO; i++); for (i = 1; Z[i] == ZERO; i++);
EZ = EZ - i + 1; EZ = EZ - i + 1;
for (k = 1; i <= p + 1;) for (k = 1; i <= p2 + 1;)
Z[k++] = Z[i++]; Z[k++] = Z[i++];
for (; k <= p;) for (; k <= p2;)
Z[k++] = ZERO; Z[k++] = ZERO;
} }
@ -610,7 +617,8 @@ void
SECTION SECTION
__mul (const mp_no *x, const mp_no *y, mp_no *z, int p) __mul (const mp_no *x, const mp_no *y, mp_no *z, int p)
{ {
int i, j, k, ip, ip2; long i, j, k, ip, ip2;
long p2 = p;
double u, zk; double u, zk;
const mp_no *a; const mp_no *a;
@ -623,7 +631,7 @@ __mul (const mp_no *x, const mp_no *y, mp_no *z, int p)
/* We need not iterate through all X's and Y's since it's pointless to /* We need not iterate through all X's and Y's since it's pointless to
multiply zeroes. Here, both are zero... */ multiply zeroes. Here, both are zero... */
for (ip2 = p; ip2 > 0; ip2--) for (ip2 = p2; ip2 > 0; ip2--)
if (X[ip2] != ZERO || Y[ip2] != ZERO) if (X[ip2] != ZERO || Y[ip2] != ZERO)
break; break;
@ -660,16 +668,16 @@ __mul (const mp_no *x, const mp_no *y, mp_no *z, int p)
'internal precision' of the input numbers, i.e. digits after ip and ip2 'internal precision' of the input numbers, i.e. digits after ip and ip2
are all ZERO. */ are all ZERO. */
k = (__glibc_unlikely (p < 3)) ? p + p : p + 3; k = (__glibc_unlikely (p2 < 3)) ? p2 + p2 : p2 + 3;
while (k > ip + ip2 + 1) while (k > ip + ip2 + 1)
Z[k--] = ZERO; Z[k--] = ZERO;
zk = Z[k] = ZERO; zk = Z[k] = ZERO;
while (k > p) while (k > p2)
{ {
for (i = k - p, j = p; i < p + 1; i++, j--) for (i = k - p2, j = p2; i < p2 + 1; i++, j--)
zk += X[i] * Y[j]; zk += X[i] * Y[j];
u = (zk + CUTTER) - CUTTER; u = (zk + CUTTER) - CUTTER;
@ -701,7 +709,7 @@ __mul (const mp_no *x, const mp_no *y, mp_no *z, int p)
/* Is there a carry beyond the most significant digit? */ /* Is there a carry beyond the most significant digit? */
if (__glibc_unlikely (Z[1] == ZERO)) if (__glibc_unlikely (Z[1] == ZERO))
{ {
for (i = 1; i <= p; i++) for (i = 1; i <= p2; i++)
Z[i] = Z[i + 1]; Z[i] = Z[i + 1];
e--; e--;
} }
@ -821,7 +829,7 @@ static void
SECTION SECTION
__inv (const mp_no *x, mp_no *y, int p) __inv (const mp_no *x, mp_no *y, int p)
{ {
int i; long i;
double t; double t;
mp_no z, w; mp_no z, w;
static const int np1[] = static const int np1[] =