Skip to content
Snippets Groups Projects
Commit 9e8bad1f authored by Ralf Baechle's avatar Ralf Baechle
Browse files

MIPS: math-emu: Turn macros into functions where possible.

parent bee16535
No related branches found
No related tags found
No related merge requests found
Showing
with 65 additions and 63 deletions
...@@ -35,7 +35,7 @@ union ieee754dp ieee754dp_add(union ieee754dp x, union ieee754dp y) ...@@ -35,7 +35,7 @@ union ieee754dp ieee754dp_add(union ieee754dp x, union ieee754dp y)
EXPLODEXDP; EXPLODEXDP;
EXPLODEYDP; EXPLODEYDP;
CLEARCX; ieee754_clearcx();
FLUSHXDP; FLUSHXDP;
FLUSHYDP; FLUSHYDP;
...@@ -52,7 +52,7 @@ union ieee754dp ieee754dp_add(union ieee754dp x, union ieee754dp y) ...@@ -52,7 +52,7 @@ union ieee754dp ieee754dp_add(union ieee754dp x, union ieee754dp y)
case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_NORM): case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_NORM):
case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_DNORM): case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_DNORM):
case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_INF): case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_INF):
SETCX(IEEE754_INVALID_OPERATION); ieee754_setcx(IEEE754_INVALID_OPERATION);
return ieee754dp_nanxcpt(ieee754dp_indef(), "add", x, y); return ieee754dp_nanxcpt(ieee754dp_indef(), "add", x, y);
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_QNAN): case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_QNAN):
...@@ -75,7 +75,7 @@ union ieee754dp ieee754dp_add(union ieee754dp x, union ieee754dp y) ...@@ -75,7 +75,7 @@ union ieee754dp ieee754dp_add(union ieee754dp x, union ieee754dp y)
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_INF): case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_INF):
if (xs == ys) if (xs == ys)
return x; return x;
SETCX(IEEE754_INVALID_OPERATION); ieee754_setcx(IEEE754_INVALID_OPERATION);
return ieee754dp_xcpt(ieee754dp_indef(), "add", x, y); return ieee754dp_xcpt(ieee754dp_indef(), "add", x, y);
case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_INF): case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_INF):
......
...@@ -35,15 +35,15 @@ int ieee754dp_cmp(union ieee754dp x, union ieee754dp y, int cmp, int sig) ...@@ -35,15 +35,15 @@ int ieee754dp_cmp(union ieee754dp x, union ieee754dp y, int cmp, int sig)
EXPLODEYDP; EXPLODEYDP;
FLUSHXDP; FLUSHXDP;
FLUSHYDP; FLUSHYDP;
CLEARCX; /* Even clear inexact flag here */ ieee754_clearcx(); /* Even clear inexact flag here */
if (ieee754dp_isnan(x) || ieee754dp_isnan(y)) { if (ieee754dp_isnan(x) || ieee754dp_isnan(y)) {
if (sig || xc == IEEE754_CLASS_SNAN || yc == IEEE754_CLASS_SNAN) if (sig || xc == IEEE754_CLASS_SNAN || yc == IEEE754_CLASS_SNAN)
SETCX(IEEE754_INVALID_OPERATION); ieee754_setcx(IEEE754_INVALID_OPERATION);
if (cmp & IEEE754_CUN) if (cmp & IEEE754_CUN)
return 1; return 1;
if (cmp & (IEEE754_CLT | IEEE754_CGT)) { if (cmp & (IEEE754_CLT | IEEE754_CGT)) {
if (sig && SETANDTESTCX(IEEE754_INVALID_OPERATION)) if (sig && ieee754_setandtestcx(IEEE754_INVALID_OPERATION))
return ieee754si_xcpt(0, "fcmpf", x); return ieee754si_xcpt(0, "fcmpf", x);
} }
return 0; return 0;
......
...@@ -34,7 +34,7 @@ union ieee754dp ieee754dp_div(union ieee754dp x, union ieee754dp y) ...@@ -34,7 +34,7 @@ union ieee754dp ieee754dp_div(union ieee754dp x, union ieee754dp y)
EXPLODEXDP; EXPLODEXDP;
EXPLODEYDP; EXPLODEYDP;
CLEARCX; ieee754_clearcx();
FLUSHXDP; FLUSHXDP;
FLUSHYDP; FLUSHYDP;
...@@ -51,7 +51,7 @@ union ieee754dp ieee754dp_div(union ieee754dp x, union ieee754dp y) ...@@ -51,7 +51,7 @@ union ieee754dp ieee754dp_div(union ieee754dp x, union ieee754dp y)
case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_NORM): case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_NORM):
case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_DNORM): case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_DNORM):
case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_INF): case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_INF):
SETCX(IEEE754_INVALID_OPERATION); ieee754_setcx(IEEE754_INVALID_OPERATION);
return ieee754dp_nanxcpt(ieee754dp_indef(), "div", x, y); return ieee754dp_nanxcpt(ieee754dp_indef(), "div", x, y);
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_QNAN): case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_QNAN):
...@@ -72,7 +72,7 @@ union ieee754dp ieee754dp_div(union ieee754dp x, union ieee754dp y) ...@@ -72,7 +72,7 @@ union ieee754dp ieee754dp_div(union ieee754dp x, union ieee754dp y)
*/ */
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_INF): case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_INF):
SETCX(IEEE754_INVALID_OPERATION); ieee754_setcx(IEEE754_INVALID_OPERATION);
return ieee754dp_xcpt(ieee754dp_indef(), "div", x, y); return ieee754dp_xcpt(ieee754dp_indef(), "div", x, y);
case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_INF): case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_INF):
...@@ -89,12 +89,12 @@ union ieee754dp ieee754dp_div(union ieee754dp x, union ieee754dp y) ...@@ -89,12 +89,12 @@ union ieee754dp ieee754dp_div(union ieee754dp x, union ieee754dp y)
*/ */
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_ZERO): case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_ZERO):
SETCX(IEEE754_INVALID_OPERATION); ieee754_setcx(IEEE754_INVALID_OPERATION);
return ieee754dp_xcpt(ieee754dp_indef(), "div", x, y); return ieee754dp_xcpt(ieee754dp_indef(), "div", x, y);
case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_ZERO): case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_ZERO):
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_ZERO): case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_ZERO):
SETCX(IEEE754_ZERO_DIVIDE); ieee754_setcx(IEEE754_ZERO_DIVIDE);
return ieee754dp_xcpt(ieee754dp_inf(xs ^ ys), "div", x, y); return ieee754dp_xcpt(ieee754dp_inf(xs ^ ys), "div", x, y);
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_NORM): case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_NORM):
......
...@@ -32,7 +32,7 @@ union ieee754dp ieee754dp_fint(int x) ...@@ -32,7 +32,7 @@ union ieee754dp ieee754dp_fint(int x)
int xe; int xe;
int xs; int xs;
CLEARCX; ieee754_clearcx();
if (x == 0) if (x == 0)
return ieee754dp_zero(0); return ieee754dp_zero(0);
......
...@@ -32,7 +32,7 @@ union ieee754dp ieee754dp_flong(s64 x) ...@@ -32,7 +32,7 @@ union ieee754dp ieee754dp_flong(s64 x)
int xe; int xe;
int xs; int xs;
CLEARCX; ieee754_clearcx();
if (x == 0) if (x == 0)
return ieee754dp_zero(0); return ieee754dp_zero(0);
......
...@@ -31,7 +31,7 @@ ...@@ -31,7 +31,7 @@
union ieee754dp ieee754dp_frexp(union ieee754dp x, int *eptr) union ieee754dp ieee754dp_frexp(union ieee754dp x, int *eptr)
{ {
COMPXDP; COMPXDP;
CLEARCX; ieee754_clearcx();
EXPLODEXDP; EXPLODEXDP;
switch (xc) { switch (xc) {
......
...@@ -32,13 +32,13 @@ union ieee754dp ieee754dp_fsp(union ieee754sp x) ...@@ -32,13 +32,13 @@ union ieee754dp ieee754dp_fsp(union ieee754sp x)
EXPLODEXSP; EXPLODEXSP;
CLEARCX; ieee754_clearcx();
FLUSHXSP; FLUSHXSP;
switch (xc) { switch (xc) {
case IEEE754_CLASS_SNAN: case IEEE754_CLASS_SNAN:
SETCX(IEEE754_INVALID_OPERATION); ieee754_setcx(IEEE754_INVALID_OPERATION);
return ieee754dp_nanxcpt(ieee754dp_indef(), "fsp"); return ieee754dp_nanxcpt(ieee754dp_indef(), "fsp");
case IEEE754_CLASS_QNAN: case IEEE754_CLASS_QNAN:
return ieee754dp_nanxcpt(builddp(xs, return ieee754dp_nanxcpt(builddp(xs,
......
...@@ -30,7 +30,7 @@ union ieee754dp ieee754dp_logb(union ieee754dp x) ...@@ -30,7 +30,7 @@ union ieee754dp ieee754dp_logb(union ieee754dp x)
{ {
COMPXDP; COMPXDP;
CLEARCX; ieee754_clearcx();
EXPLODEXDP; EXPLODEXDP;
......
...@@ -32,7 +32,7 @@ union ieee754dp ieee754dp_modf(union ieee754dp x, union ieee754dp *ip) ...@@ -32,7 +32,7 @@ union ieee754dp ieee754dp_modf(union ieee754dp x, union ieee754dp *ip)
{ {
COMPXDP; COMPXDP;
CLEARCX; ieee754_clearcx();
EXPLODEXDP; EXPLODEXDP;
......
...@@ -34,7 +34,7 @@ union ieee754dp ieee754dp_mul(union ieee754dp x, union ieee754dp y) ...@@ -34,7 +34,7 @@ union ieee754dp ieee754dp_mul(union ieee754dp x, union ieee754dp y)
EXPLODEXDP; EXPLODEXDP;
EXPLODEYDP; EXPLODEYDP;
CLEARCX; ieee754_clearcx();
FLUSHXDP; FLUSHXDP;
FLUSHYDP; FLUSHYDP;
...@@ -51,7 +51,7 @@ union ieee754dp ieee754dp_mul(union ieee754dp x, union ieee754dp y) ...@@ -51,7 +51,7 @@ union ieee754dp ieee754dp_mul(union ieee754dp x, union ieee754dp y)
case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_NORM): case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_NORM):
case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_DNORM): case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_DNORM):
case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_INF): case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_INF):
SETCX(IEEE754_INVALID_OPERATION); ieee754_setcx(IEEE754_INVALID_OPERATION);
return ieee754dp_nanxcpt(ieee754dp_indef(), "mul", x, y); return ieee754dp_nanxcpt(ieee754dp_indef(), "mul", x, y);
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_QNAN): case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_QNAN):
...@@ -72,7 +72,7 @@ union ieee754dp ieee754dp_mul(union ieee754dp x, union ieee754dp y) ...@@ -72,7 +72,7 @@ union ieee754dp ieee754dp_mul(union ieee754dp x, union ieee754dp y)
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_ZERO): case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_ZERO):
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_INF): case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_INF):
SETCX(IEEE754_INVALID_OPERATION); ieee754_setcx(IEEE754_INVALID_OPERATION);
return ieee754dp_xcpt(ieee754dp_indef(), "mul", x, y); return ieee754dp_xcpt(ieee754dp_indef(), "mul", x, y);
case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_INF): case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_INF):
......
...@@ -30,7 +30,7 @@ union ieee754dp ieee754dp_scalb(union ieee754dp x, int n) ...@@ -30,7 +30,7 @@ union ieee754dp ieee754dp_scalb(union ieee754dp x, int n)
{ {
COMPXDP; COMPXDP;
CLEARCX; ieee754_clearcx();
EXPLODEXDP; EXPLODEXDP;
......
...@@ -33,7 +33,7 @@ int ieee754dp_finite(union ieee754dp x) ...@@ -33,7 +33,7 @@ int ieee754dp_finite(union ieee754dp x)
union ieee754dp ieee754dp_copysign(union ieee754dp x, union ieee754dp y) union ieee754dp ieee754dp_copysign(union ieee754dp x, union ieee754dp y)
{ {
CLEARCX; ieee754_clearcx();
DPSIGN(x) = DPSIGN(y); DPSIGN(x) = DPSIGN(y);
return x; return x;
} }
...@@ -44,7 +44,7 @@ union ieee754dp ieee754dp_neg(union ieee754dp x) ...@@ -44,7 +44,7 @@ union ieee754dp ieee754dp_neg(union ieee754dp x)
COMPXDP; COMPXDP;
EXPLODEXDP; EXPLODEXDP;
CLEARCX; ieee754_clearcx();
FLUSHXDP; FLUSHXDP;
/* /*
...@@ -56,7 +56,7 @@ union ieee754dp ieee754dp_neg(union ieee754dp x) ...@@ -56,7 +56,7 @@ union ieee754dp ieee754dp_neg(union ieee754dp x)
if (xc == IEEE754_CLASS_SNAN) { if (xc == IEEE754_CLASS_SNAN) {
union ieee754dp y = ieee754dp_indef(); union ieee754dp y = ieee754dp_indef();
SETCX(IEEE754_INVALID_OPERATION); ieee754_setcx(IEEE754_INVALID_OPERATION);
DPSIGN(y) = DPSIGN(x); DPSIGN(y) = DPSIGN(x);
return ieee754dp_nanxcpt(y, "neg"); return ieee754dp_nanxcpt(y, "neg");
} }
...@@ -70,14 +70,14 @@ union ieee754dp ieee754dp_abs(union ieee754dp x) ...@@ -70,14 +70,14 @@ union ieee754dp ieee754dp_abs(union ieee754dp x)
COMPXDP; COMPXDP;
EXPLODEXDP; EXPLODEXDP;
CLEARCX; ieee754_clearcx();
FLUSHXDP; FLUSHXDP;
/* Clear sign ALWAYS, irrespective of NaN */ /* Clear sign ALWAYS, irrespective of NaN */
DPSIGN(x) = 0; DPSIGN(x) = 0;
if (xc == IEEE754_CLASS_SNAN) { if (xc == IEEE754_CLASS_SNAN) {
SETCX(IEEE754_INVALID_OPERATION); ieee754_setcx(IEEE754_INVALID_OPERATION);
return ieee754dp_nanxcpt(ieee754dp_indef(), "abs"); return ieee754dp_nanxcpt(ieee754dp_indef(), "abs");
} }
......
...@@ -42,7 +42,7 @@ union ieee754dp ieee754dp_sqrt(union ieee754dp x) ...@@ -42,7 +42,7 @@ union ieee754dp ieee754dp_sqrt(union ieee754dp x)
COMPXDP; COMPXDP;
EXPLODEXDP; EXPLODEXDP;
CLEARCX; ieee754_clearcx();
FLUSHXDP; FLUSHXDP;
/* x == INF or NAN? */ /* x == INF or NAN? */
...@@ -51,7 +51,7 @@ union ieee754dp ieee754dp_sqrt(union ieee754dp x) ...@@ -51,7 +51,7 @@ union ieee754dp ieee754dp_sqrt(union ieee754dp x)
/* sqrt(Nan) = Nan */ /* sqrt(Nan) = Nan */
return ieee754dp_nanxcpt(x, "sqrt"); return ieee754dp_nanxcpt(x, "sqrt");
case IEEE754_CLASS_SNAN: case IEEE754_CLASS_SNAN:
SETCX(IEEE754_INVALID_OPERATION); ieee754_setcx(IEEE754_INVALID_OPERATION);
return ieee754dp_nanxcpt(ieee754dp_indef(), "sqrt"); return ieee754dp_nanxcpt(ieee754dp_indef(), "sqrt");
case IEEE754_CLASS_ZERO: case IEEE754_CLASS_ZERO:
/* sqrt(0) = 0 */ /* sqrt(0) = 0 */
...@@ -59,7 +59,7 @@ union ieee754dp ieee754dp_sqrt(union ieee754dp x) ...@@ -59,7 +59,7 @@ union ieee754dp ieee754dp_sqrt(union ieee754dp x)
case IEEE754_CLASS_INF: case IEEE754_CLASS_INF:
if (xs) { if (xs) {
/* sqrt(-Inf) = Nan */ /* sqrt(-Inf) = Nan */
SETCX(IEEE754_INVALID_OPERATION); ieee754_setcx(IEEE754_INVALID_OPERATION);
return ieee754dp_nanxcpt(ieee754dp_indef(), "sqrt"); return ieee754dp_nanxcpt(ieee754dp_indef(), "sqrt");
} }
/* sqrt(+Inf) = Inf */ /* sqrt(+Inf) = Inf */
...@@ -70,7 +70,7 @@ union ieee754dp ieee754dp_sqrt(union ieee754dp x) ...@@ -70,7 +70,7 @@ union ieee754dp ieee754dp_sqrt(union ieee754dp x)
case IEEE754_CLASS_NORM: case IEEE754_CLASS_NORM:
if (xs) { if (xs) {
/* sqrt(-x) = Nan */ /* sqrt(-x) = Nan */
SETCX(IEEE754_INVALID_OPERATION); ieee754_setcx(IEEE754_INVALID_OPERATION);
return ieee754dp_nanxcpt(ieee754dp_indef(), "sqrt"); return ieee754dp_nanxcpt(ieee754dp_indef(), "sqrt");
} }
break; break;
......
...@@ -34,7 +34,7 @@ union ieee754dp ieee754dp_sub(union ieee754dp x, union ieee754dp y) ...@@ -34,7 +34,7 @@ union ieee754dp ieee754dp_sub(union ieee754dp x, union ieee754dp y)
EXPLODEXDP; EXPLODEXDP;
EXPLODEYDP; EXPLODEYDP;
CLEARCX; ieee754_clearcx();
FLUSHXDP; FLUSHXDP;
FLUSHYDP; FLUSHYDP;
...@@ -51,7 +51,7 @@ union ieee754dp ieee754dp_sub(union ieee754dp x, union ieee754dp y) ...@@ -51,7 +51,7 @@ union ieee754dp ieee754dp_sub(union ieee754dp x, union ieee754dp y)
case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_NORM): case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_NORM):
case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_DNORM): case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_DNORM):
case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_INF): case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_INF):
SETCX(IEEE754_INVALID_OPERATION); ieee754_setcx(IEEE754_INVALID_OPERATION);
return ieee754dp_nanxcpt(ieee754dp_indef(), "sub", x, y); return ieee754dp_nanxcpt(ieee754dp_indef(), "sub", x, y);
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_QNAN): case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_QNAN):
...@@ -74,7 +74,7 @@ union ieee754dp ieee754dp_sub(union ieee754dp x, union ieee754dp y) ...@@ -74,7 +74,7 @@ union ieee754dp ieee754dp_sub(union ieee754dp x, union ieee754dp y)
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_INF): case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_INF):
if (xs != ys) if (xs != ys)
return x; return x;
SETCX(IEEE754_INVALID_OPERATION); ieee754_setcx(IEEE754_INVALID_OPERATION);
return ieee754dp_xcpt(ieee754dp_indef(), "sub", x, y); return ieee754dp_xcpt(ieee754dp_indef(), "sub", x, y);
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_INF): case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_INF):
......
...@@ -30,7 +30,7 @@ int ieee754dp_tint(union ieee754dp x) ...@@ -30,7 +30,7 @@ int ieee754dp_tint(union ieee754dp x)
{ {
COMPXDP; COMPXDP;
CLEARCX; ieee754_clearcx();
EXPLODEXDP; EXPLODEXDP;
FLUSHXDP; FLUSHXDP;
...@@ -39,7 +39,7 @@ int ieee754dp_tint(union ieee754dp x) ...@@ -39,7 +39,7 @@ int ieee754dp_tint(union ieee754dp x)
case IEEE754_CLASS_SNAN: case IEEE754_CLASS_SNAN:
case IEEE754_CLASS_QNAN: case IEEE754_CLASS_QNAN:
case IEEE754_CLASS_INF: case IEEE754_CLASS_INF:
SETCX(IEEE754_INVALID_OPERATION); ieee754_setcx(IEEE754_INVALID_OPERATION);
return ieee754si_xcpt(ieee754si_indef(), "dp_tint", x); return ieee754si_xcpt(ieee754si_indef(), "dp_tint", x);
case IEEE754_CLASS_ZERO: case IEEE754_CLASS_ZERO:
return 0; return 0;
...@@ -50,7 +50,7 @@ int ieee754dp_tint(union ieee754dp x) ...@@ -50,7 +50,7 @@ int ieee754dp_tint(union ieee754dp x)
if (xe > 31) { if (xe > 31) {
/* Set invalid. We will only use overflow for floating /* Set invalid. We will only use overflow for floating
point overflow */ point overflow */
SETCX(IEEE754_INVALID_OPERATION); ieee754_setcx(IEEE754_INVALID_OPERATION);
return ieee754si_xcpt(ieee754si_indef(), "dp_tint", x); return ieee754si_xcpt(ieee754si_indef(), "dp_tint", x);
} }
/* oh gawd */ /* oh gawd */
...@@ -95,11 +95,11 @@ int ieee754dp_tint(union ieee754dp x) ...@@ -95,11 +95,11 @@ int ieee754dp_tint(union ieee754dp x)
/* look for valid corner case 0x80000000 */ /* look for valid corner case 0x80000000 */
if ((xm >> 31) != 0 && (xs == 0 || xm != 0x80000000)) { if ((xm >> 31) != 0 && (xs == 0 || xm != 0x80000000)) {
/* This can happen after rounding */ /* This can happen after rounding */
SETCX(IEEE754_INVALID_OPERATION); ieee754_setcx(IEEE754_INVALID_OPERATION);
return ieee754si_xcpt(ieee754si_indef(), "dp_tint", x); return ieee754si_xcpt(ieee754si_indef(), "dp_tint", x);
} }
if (round || sticky) if (round || sticky)
SETCX(IEEE754_INEXACT); ieee754_setcx(IEEE754_INEXACT);
} }
if (xs) if (xs)
return -xm; return -xm;
......
...@@ -30,7 +30,7 @@ s64 ieee754dp_tlong(union ieee754dp x) ...@@ -30,7 +30,7 @@ s64 ieee754dp_tlong(union ieee754dp x)
{ {
COMPXDP; COMPXDP;
CLEARCX; ieee754_clearcx();
EXPLODEXDP; EXPLODEXDP;
FLUSHXDP; FLUSHXDP;
...@@ -39,7 +39,7 @@ s64 ieee754dp_tlong(union ieee754dp x) ...@@ -39,7 +39,7 @@ s64 ieee754dp_tlong(union ieee754dp x)
case IEEE754_CLASS_SNAN: case IEEE754_CLASS_SNAN:
case IEEE754_CLASS_QNAN: case IEEE754_CLASS_QNAN:
case IEEE754_CLASS_INF: case IEEE754_CLASS_INF:
SETCX(IEEE754_INVALID_OPERATION); ieee754_setcx(IEEE754_INVALID_OPERATION);
return ieee754di_xcpt(ieee754di_indef(), "dp_tlong", x); return ieee754di_xcpt(ieee754di_indef(), "dp_tlong", x);
case IEEE754_CLASS_ZERO: case IEEE754_CLASS_ZERO:
return 0; return 0;
...@@ -53,7 +53,7 @@ s64 ieee754dp_tlong(union ieee754dp x) ...@@ -53,7 +53,7 @@ s64 ieee754dp_tlong(union ieee754dp x)
return -0x8000000000000000LL; return -0x8000000000000000LL;
/* Set invalid. We will only use overflow for floating /* Set invalid. We will only use overflow for floating
point overflow */ point overflow */
SETCX(IEEE754_INVALID_OPERATION); ieee754_setcx(IEEE754_INVALID_OPERATION);
return ieee754di_xcpt(ieee754di_indef(), "dp_tlong", x); return ieee754di_xcpt(ieee754di_indef(), "dp_tlong", x);
} }
/* oh gawd */ /* oh gawd */
...@@ -99,11 +99,11 @@ s64 ieee754dp_tlong(union ieee754dp x) ...@@ -99,11 +99,11 @@ s64 ieee754dp_tlong(union ieee754dp x)
} }
if ((xm >> 63) != 0) { if ((xm >> 63) != 0) {
/* This can happen after rounding */ /* This can happen after rounding */
SETCX(IEEE754_INVALID_OPERATION); ieee754_setcx(IEEE754_INVALID_OPERATION);
return ieee754di_xcpt(ieee754di_indef(), "dp_tlong", x); return ieee754di_xcpt(ieee754di_indef(), "dp_tlong", x);
} }
if (round || sticky) if (round || sticky)
SETCX(IEEE754_INEXACT); ieee754_setcx(IEEE754_INEXACT);
} }
if (xs) if (xs)
return -xm; return -xm;
......
...@@ -101,7 +101,7 @@ int __cold ieee754si_xcpt(int r, const char *op, ...) ...@@ -101,7 +101,7 @@ int __cold ieee754si_xcpt(int r, const char *op, ...)
{ {
struct ieee754xctx ax; struct ieee754xctx ax;
if (!TSTX()) if (!ieee754_tstx())
return r; return r;
ax.op = op; ax.op = op;
ax.rt = IEEE754_RT_SI; ax.rt = IEEE754_RT_SI;
...@@ -116,7 +116,7 @@ s64 __cold ieee754di_xcpt(s64 r, const char *op, ...) ...@@ -116,7 +116,7 @@ s64 __cold ieee754di_xcpt(s64 r, const char *op, ...)
{ {
struct ieee754xctx ax; struct ieee754xctx ax;
if (!TSTX()) if (!ieee754_tstx())
return r; return r;
ax.op = op; ax.op = op;
ax.rt = IEEE754_RT_DI; ax.rt = IEEE754_RT_DI;
......
...@@ -170,12 +170,14 @@ union ieee754dp ieee754dp_sqrt(union ieee754dp x); ...@@ -170,12 +170,14 @@ union ieee754dp ieee754dp_sqrt(union ieee754dp x);
/* 5 types of floating point number /* 5 types of floating point number
*/ */
#define IEEE754_CLASS_NORM 0x00 enum {
#define IEEE754_CLASS_ZERO 0x01 IEEE754_CLASS_NORM = 0x00,
#define IEEE754_CLASS_DNORM 0x02 IEEE754_CLASS_ZERO = 0x01,
#define IEEE754_CLASS_INF 0x03 IEEE754_CLASS_DNORM = 0x02,
#define IEEE754_CLASS_SNAN 0x04 IEEE754_CLASS_INF = 0x03,
#define IEEE754_CLASS_QNAN 0x05 IEEE754_CLASS_SNAN = 0x04,
IEEE754_CLASS_QNAN = 0x05,
};
/* exception numbers */ /* exception numbers */
#define IEEE754_INEXACT 0x01 #define IEEE754_INEXACT 0x01
......
...@@ -49,7 +49,7 @@ int ieee754dp_issnan(union ieee754dp x) ...@@ -49,7 +49,7 @@ int ieee754dp_issnan(union ieee754dp x)
union ieee754dp __cold ieee754dp_xcpt(union ieee754dp r, const char *op, ...) union ieee754dp __cold ieee754dp_xcpt(union ieee754dp r, const char *op, ...)
{ {
struct ieee754xctx ax; struct ieee754xctx ax;
if (!TSTX()) if (!ieee754_tstx())
return r; return r;
ax.op = op; ax.op = op;
...@@ -70,7 +70,7 @@ union ieee754dp __cold ieee754dp_nanxcpt(union ieee754dp r, const char *op, ...) ...@@ -70,7 +70,7 @@ union ieee754dp __cold ieee754dp_nanxcpt(union ieee754dp r, const char *op, ...)
if (!ieee754dp_issnan(r)) /* QNAN does not cause invalid op !! */ if (!ieee754dp_issnan(r)) /* QNAN does not cause invalid op !! */
return r; return r;
if (!SETANDTESTCX(IEEE754_INVALID_OPERATION)) { if (!ieee754_setandtestcx(IEEE754_INVALID_OPERATION)) {
/* not enabled convert to a quiet NaN */ /* not enabled convert to a quiet NaN */
DPMANT(r) &= (~DP_MBIT(DP_MBITS-1)); DPMANT(r) &= (~DP_MBIT(DP_MBITS-1));
if (ieee754dp_isnan(r)) if (ieee754dp_isnan(r))
...@@ -143,8 +143,8 @@ union ieee754dp ieee754dp_format(int sn, int xe, u64 xm) ...@@ -143,8 +143,8 @@ union ieee754dp ieee754dp_format(int sn, int xe, u64 xm)
int es = DP_EMIN - xe; int es = DP_EMIN - xe;
if (ieee754_csr.nod) { if (ieee754_csr.nod) {
SETCX(IEEE754_UNDERFLOW); ieee754_setcx(IEEE754_UNDERFLOW);
SETCX(IEEE754_INEXACT); ieee754_setcx(IEEE754_INEXACT);
switch(ieee754_csr.rm) { switch(ieee754_csr.rm) {
case IEEE754_RN: case IEEE754_RN:
...@@ -167,7 +167,7 @@ union ieee754dp ieee754dp_format(int sn, int xe, u64 xm) ...@@ -167,7 +167,7 @@ union ieee754dp ieee754dp_format(int sn, int xe, u64 xm)
&& get_rounding(sn, xm) >> (DP_MBITS + 1 + 3)) && get_rounding(sn, xm) >> (DP_MBITS + 1 + 3))
{ {
/* Not tiny after rounding */ /* Not tiny after rounding */
SETCX(IEEE754_INEXACT); ieee754_setcx(IEEE754_INEXACT);
xm = get_rounding(sn, xm); xm = get_rounding(sn, xm);
xm >>= 1; xm >>= 1;
/* Clear grs bits */ /* Clear grs bits */
...@@ -184,9 +184,9 @@ union ieee754dp ieee754dp_format(int sn, int xe, u64 xm) ...@@ -184,9 +184,9 @@ union ieee754dp ieee754dp_format(int sn, int xe, u64 xm)
} }
} }
if (xm & (DP_MBIT(3) - 1)) { if (xm & (DP_MBIT(3) - 1)) {
SETCX(IEEE754_INEXACT); ieee754_setcx(IEEE754_INEXACT);
if ((xm & (DP_HIDDEN_BIT << 3)) == 0) { if ((xm & (DP_HIDDEN_BIT << 3)) == 0) {
SETCX(IEEE754_UNDERFLOW); ieee754_setcx(IEEE754_UNDERFLOW);
} }
/* inexact must round of 3 bits /* inexact must round of 3 bits
...@@ -207,8 +207,8 @@ union ieee754dp ieee754dp_format(int sn, int xe, u64 xm) ...@@ -207,8 +207,8 @@ union ieee754dp ieee754dp_format(int sn, int xe, u64 xm)
assert(xe >= DP_EMIN); assert(xe >= DP_EMIN);
if (xe > DP_EMAX) { if (xe > DP_EMAX) {
SETCX(IEEE754_OVERFLOW); ieee754_setcx(IEEE754_OVERFLOW);
SETCX(IEEE754_INEXACT); ieee754_setcx(IEEE754_INEXACT);
/* -O can be table indexed by (rm,sn) */ /* -O can be table indexed by (rm,sn) */
switch (ieee754_csr.rm) { switch (ieee754_csr.rm) {
case IEEE754_RN: case IEEE754_RN:
...@@ -233,7 +233,7 @@ union ieee754dp ieee754dp_format(int sn, int xe, u64 xm) ...@@ -233,7 +233,7 @@ union ieee754dp ieee754dp_format(int sn, int xe, u64 xm)
/* we underflow (tiny/zero) */ /* we underflow (tiny/zero) */
assert(xe == DP_EMIN); assert(xe == DP_EMIN);
if (ieee754_csr.mx & IEEE754_UNDERFLOW) if (ieee754_csr.mx & IEEE754_UNDERFLOW)
SETCX(IEEE754_UNDERFLOW); ieee754_setcx(IEEE754_UNDERFLOW);
return builddp(sn, DP_EMIN - 1 + DP_EBIAS, xm); return builddp(sn, DP_EMIN - 1 + DP_EBIAS, xm);
} else { } else {
assert((xm >> (DP_MBITS + 1)) == 0); /* no execess */ assert((xm >> (DP_MBITS + 1)) == 0); /* no execess */
......
...@@ -74,7 +74,7 @@ extern union ieee754dp ieee754dp_format(int, int, u64); ...@@ -74,7 +74,7 @@ extern union ieee754dp ieee754dp_format(int, int, u64);
#define DPNORMRET2(s, e, m, name, a0, a1) \ #define DPNORMRET2(s, e, m, name, a0, a1) \
{ \ { \
union ieee754dp V = ieee754dp_format(s, e, m); \ union ieee754dp V = ieee754dp_format(s, e, m); \
if (TSTX()) \ if (ieee754_tstx()) \
return ieee754dp_xcpt(V, name, a0, a1); \ return ieee754dp_xcpt(V, name, a0, a1); \
else \ else \
return V; \ return V; \
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment