mirror of git://sourceware.org/git/glibc.git
Sync up ppc add_magnitudes and sub_magnitudes with default code
This commit is contained in:
parent
f4564ff0b6
commit
8d19fe64ee
|
@ -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.
|
||||||
|
|
|
@ -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,46 +371,55 @@ 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.
|
||||||
The sign of the difference *Z is not changed. X and Y may overlap but not X
|
The sign of the difference *Z is not changed. X and Y may overlap but not X
|
||||||
|
@ -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;)
|
||||||
|
|
|
@ -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,46 +371,55 @@ 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.
|
||||||
The sign of the difference *Z is not changed. X and Y may overlap but not X
|
The sign of the difference *Z is not changed. X and Y may overlap but not X
|
||||||
|
@ -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;)
|
||||||
|
|
Loading…
Reference in New Issue