Sync up ppc add_magnitudes and sub_magnitudes with default code

This commit is contained in:
Siddhesh Poyarekar 2013-02-28 11:13:05 +05:30
parent f4564ff0b6
commit 8d19fe64ee
3 changed files with 131 additions and 106 deletions

View File

@ -1,3 +1,12 @@
2013-02-28 Siddhesh Poyarekar <siddhesh@redhat.com>
* sysdeps/powerpc/powerpc32/power4/fpu/mpa.c (add_magnitudes):
Use ZK to minimize writes to Z.
(sub_magnitudes): Simplify code a bit.
* sysdeps/powerpc/powerpc64/power4/fpu/mpa.c (add_magnitudes):
Use ZK to minimize writes to Z.
(sub_magnitudes): Simplify code a bit.
2013-02-27 Roland McGrath <roland@hack.frob.com> 2013-02-27 Roland McGrath <roland@hack.frob.com>
* csu/gmon-start.c: Add special exception to license text. * csu/gmon-start.c: Add special exception to license text.

View File

@ -363,6 +363,7 @@ add_magnitudes (const mp_no *x, const mp_no *y, mp_no *z, int p)
{ {
long i, j, k; long i, j, k;
long p2 = p; long p2 = p;
double zk;
EZ = EX; EZ = EX;
@ -370,45 +371,54 @@ add_magnitudes (const mp_no *x, const mp_no *y, mp_no *z, int p)
j = p2 + EY - EX; j = p2 + EY - EX;
k = p2 + 1; k = p2 + 1;
if (j < 1) if (__glibc_unlikely (j < 1))
{ {
__cpy (x, z, p); __cpy (x, z, p);
return; return;
} }
else
Z[k] = ZERO; zk = ZERO;
for (; j > 0; i--, j--) for (; j > 0; i--, j--)
{ {
Z[k] += X[i] + Y[j]; zk += X[i] + Y[j];
if (Z[k] >= RADIX) if (zk >= RADIX)
{ {
Z[k] -= RADIX; Z[k--] = zk - RADIX;
Z[--k] = ONE; zk = ONE;
} }
else else
Z[--k] = ZERO; {
Z[k--] = zk;
zk = ZERO;
}
} }
for (; i > 0; i--) for (; i > 0; i--)
{ {
Z[k] += X[i]; zk += X[i];
if (Z[k] >= RADIX) if (zk >= RADIX)
{ {
Z[k] -= RADIX; Z[k--] = zk - RADIX;
Z[--k] = ONE; zk = ONE;
} }
else else
Z[--k] = ZERO; {
Z[k--] = zk;
zk = ZERO;
}
} }
if (Z[1] == ZERO) if (zk == ZERO)
{ {
for (i = 1; i <= p2; i++) for (i = 1; i <= p2; i++)
Z[i] = Z[i + 1]; Z[i] = Z[i + 1];
} }
else else
{
Z[1] = zk;
EZ += ONE; EZ += ONE;
}
} }
/* Subtract the magnitudes of *X and *Y assuming that abs (*x) > abs (*y) > 0. /* Subtract the magnitudes of *X and *Y assuming that abs (*x) > abs (*y) > 0.
@ -420,65 +430,63 @@ sub_magnitudes (const mp_no *x, const mp_no *y, mp_no *z, int p)
{ {
long i, j, k; long i, j, k;
long p2 = p; long p2 = p;
double zk;
EZ = EX; EZ = EX;
i = p2;
j = p2 + EY - EX;
k = p2;
if (EX == EY) /* Y is too small compared to X, copy X over to the result. */
{ if (__glibc_unlikely (j < 1))
i = j = k = p2;
Z[k] = Z[k + 1] = ZERO;
}
else
{
j = EX - EY;
if (j > p2)
{ {
__cpy (x, z, p); __cpy (x, z, p);
return; return;
} }
else
{
i = p2;
j = p2 + 1 - j;
k = p2;
if (Y[j] > ZERO)
{
Z[k + 1] = RADIX - Y[j--];
Z[k] = MONE;
}
else
{
Z[k + 1] = ZERO;
Z[k] = ZERO;
j--;
}
}
}
/* The relevant least significant digit in Y is non-zero, so we factor it in
to enhance accuracy. */
if (j < p2 && Y[j + 1] > ZERO)
{
Z[k + 1] = RADIX - Y[j + 1];
zk = MONE;
}
else
zk = Z[k + 1] = ZERO;
/* Subtract and borrow. */
for (; j > 0; i--, j--) for (; j > 0; i--, j--)
{ {
Z[k] += (X[i] - Y[j]); zk += (X[i] - Y[j]);
if (Z[k] < ZERO) if (zk < ZERO)
{ {
Z[k] += RADIX; Z[k--] = zk + RADIX;
Z[--k] = MONE; zk = MONE;
} }
else else
Z[--k] = ZERO; {
Z[k--] = zk;
zk = ZERO;
}
} }
/* We're done with digits from Y, so it's just digits in X. */
for (; i > 0; i--) for (; i > 0; i--)
{ {
Z[k] += X[i]; zk += X[i];
if (Z[k] < ZERO) if (zk < ZERO)
{ {
Z[k] += RADIX; Z[k--] = zk + RADIX;
Z[--k] = MONE; zk = MONE;
} }
else else
Z[--k] = ZERO; {
Z[k--] = zk;
zk = ZERO;
}
} }
/* 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 <= p2 + 1;) for (k = 1; i <= p2 + 1;)

View File

@ -363,6 +363,7 @@ add_magnitudes (const mp_no *x, const mp_no *y, mp_no *z, int p)
{ {
long i, j, k; long i, j, k;
long p2 = p; long p2 = p;
double zk;
EZ = EX; EZ = EX;
@ -370,45 +371,54 @@ add_magnitudes (const mp_no *x, const mp_no *y, mp_no *z, int p)
j = p2 + EY - EX; j = p2 + EY - EX;
k = p2 + 1; k = p2 + 1;
if (j < 1) if (__glibc_unlikely (j < 1))
{ {
__cpy (x, z, p); __cpy (x, z, p);
return; return;
} }
else
Z[k] = ZERO; zk = ZERO;
for (; j > 0; i--, j--) for (; j > 0; i--, j--)
{ {
Z[k] += X[i] + Y[j]; zk += X[i] + Y[j];
if (Z[k] >= RADIX) if (zk >= RADIX)
{ {
Z[k] -= RADIX; Z[k--] = zk - RADIX;
Z[--k] = ONE; zk = ONE;
} }
else else
Z[--k] = ZERO; {
Z[k--] = zk;
zk = ZERO;
}
} }
for (; i > 0; i--) for (; i > 0; i--)
{ {
Z[k] += X[i]; zk += X[i];
if (Z[k] >= RADIX) if (zk >= RADIX)
{ {
Z[k] -= RADIX; Z[k--] = zk - RADIX;
Z[--k] = ONE; zk = ONE;
} }
else else
Z[--k] = ZERO; {
Z[k--] = zk;
zk = ZERO;
}
} }
if (Z[1] == ZERO) if (zk == ZERO)
{ {
for (i = 1; i <= p2; i++) for (i = 1; i <= p2; i++)
Z[i] = Z[i + 1]; Z[i] = Z[i + 1];
} }
else else
{
Z[1] = zk;
EZ += ONE; EZ += ONE;
}
} }
/* Subtract the magnitudes of *X and *Y assuming that abs (*x) > abs (*y) > 0. /* Subtract the magnitudes of *X and *Y assuming that abs (*x) > abs (*y) > 0.
@ -420,65 +430,63 @@ sub_magnitudes (const mp_no *x, const mp_no *y, mp_no *z, int p)
{ {
long i, j, k; long i, j, k;
long p2 = p; long p2 = p;
double zk;
EZ = EX; EZ = EX;
i = p2;
j = p2 + EY - EX;
k = p2;
if (EX == EY) /* Y is too small compared to X, copy X over to the result. */
{ if (__glibc_unlikely (j < 1))
i = j = k = p2;
Z[k] = Z[k + 1] = ZERO;
}
else
{
j = EX - EY;
if (j > p2)
{ {
__cpy (x, z, p); __cpy (x, z, p);
return; return;
} }
else
{
i = p2;
j = p2 + 1 - j;
k = p2;
if (Y[j] > ZERO)
{
Z[k + 1] = RADIX - Y[j--];
Z[k] = MONE;
}
else
{
Z[k + 1] = ZERO;
Z[k] = ZERO;
j--;
}
}
}
/* The relevant least significant digit in Y is non-zero, so we factor it in
to enhance accuracy. */
if (j < p2 && Y[j + 1] > ZERO)
{
Z[k + 1] = RADIX - Y[j + 1];
zk = MONE;
}
else
zk = Z[k + 1] = ZERO;
/* Subtract and borrow. */
for (; j > 0; i--, j--) for (; j > 0; i--, j--)
{ {
Z[k] += (X[i] - Y[j]); zk += (X[i] - Y[j]);
if (Z[k] < ZERO) if (zk < ZERO)
{ {
Z[k] += RADIX; Z[k--] = zk + RADIX;
Z[--k] = MONE; zk = MONE;
} }
else else
Z[--k] = ZERO; {
Z[k--] = zk;
zk = ZERO;
}
} }
/* We're done with digits from Y, so it's just digits in X. */
for (; i > 0; i--) for (; i > 0; i--)
{ {
Z[k] += X[i]; zk += X[i];
if (Z[k] < ZERO) if (zk < ZERO)
{ {
Z[k] += RADIX; Z[k--] = zk + RADIX;
Z[--k] = MONE; zk = MONE;
} }
else else
Z[--k] = ZERO; {
Z[k--] = zk;
zk = ZERO;
}
} }
/* 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 <= p2 + 1;) for (k = 1; i <= p2 + 1;)