MIPS: math-emu: Don't pass qNaNs through quieting handlers
authorMaciej W. Rozycki <macro@linux-mips.org>
Fri, 3 Apr 2015 22:25:30 +0000 (23:25 +0100)
committerRalf Baechle <ralf@linux-mips.org>
Tue, 7 Apr 2015 23:09:29 +0000 (01:09 +0200)
Don't call the `ieee754sp_nanxcpt' and `ieee754dp_nanxcpt' sNaN quieting
handlers for a qNaN supplied to floating-point format conversions or
SQRT.S/SQRT.D instructions, or for a qNaN produced out of a negative
operand supplied to SQRT.S/SQRT.D instructions.  Return the qNaN right
away in these cases.

Signed-off-by: Maciej W. Rozycki <macro@linux-mips.org>
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/9687/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
arch/mips/math-emu/dp_fsp.c
arch/mips/math-emu/dp_sqrt.c
arch/mips/math-emu/sp_fdp.c
arch/mips/math-emu/sp_sqrt.c

index 88581f7e28ddcd1762c984a3ffdf29885666524d..af48d2a277a4d402e55cfab3011c1a8466d11678 100644 (file)
@@ -44,7 +44,7 @@ union ieee754dp ieee754dp_fsp(union ieee754sp x)
                return ieee754dp_nanxcpt(ieee754dp_indef());
 
        case IEEE754_CLASS_QNAN:
-               return ieee754dp_nanxcpt(ieee754dp_nan_fsp(xs, xm));
+               return ieee754dp_nan_fsp(xs, xm);
 
        case IEEE754_CLASS_INF:
                return ieee754dp_inf(xs);
index 041bbb6124bbde5ec679e7a855f147bf02c24b23..0d8e7ffdba5ee6762ec7948c1b0671c730c63a0c 100644 (file)
@@ -44,7 +44,7 @@ union ieee754dp ieee754dp_sqrt(union ieee754dp x)
        switch (xc) {
        case IEEE754_CLASS_QNAN:
                /* sqrt(Nan) = Nan */
-               return ieee754dp_nanxcpt(x);
+               return x;
 
        case IEEE754_CLASS_SNAN:
                ieee754_setcx(IEEE754_INVALID_OPERATION);
@@ -58,7 +58,7 @@ union ieee754dp ieee754dp_sqrt(union ieee754dp x)
                if (xs) {
                        /* sqrt(-Inf) = Nan */
                        ieee754_setcx(IEEE754_INVALID_OPERATION);
-                       return ieee754dp_nanxcpt(ieee754dp_indef());
+                       return ieee754dp_indef();
                }
                /* sqrt(+Inf) = Inf */
                return x;
@@ -71,7 +71,7 @@ union ieee754dp ieee754dp_sqrt(union ieee754dp x)
                if (xs) {
                        /* sqrt(-x) = Nan */
                        ieee754_setcx(IEEE754_INVALID_OPERATION);
-                       return ieee754dp_nanxcpt(ieee754dp_indef());
+                       return ieee754dp_indef();
                }
                break;
        }
index 4c0d0b4c4876eae26bf9a24a81efb8c1d803416f..18a3f8c37136947d4a1ec39b1607f1c57e00e9b3 100644 (file)
@@ -50,7 +50,7 @@ union ieee754sp ieee754sp_fdp(union ieee754dp x)
                nan = ieee754sp_nan_fdp(xs, xm);
                if (!ieee754sp_isnan(nan))
                        nan = ieee754sp_indef();
-               return ieee754sp_nanxcpt(nan);
+               return nan;
 
        case IEEE754_CLASS_INF:
                return ieee754sp_inf(xs);
index b7c098a86f951013f74d5d3838fef5ae014cbd9b..9cc53effee62c7ca702d97bae3943c0a9a30bcf0 100644 (file)
@@ -37,7 +37,7 @@ union ieee754sp ieee754sp_sqrt(union ieee754sp x)
        switch (xc) {
        case IEEE754_CLASS_QNAN:
                /* sqrt(Nan) = Nan */
-               return ieee754sp_nanxcpt(x);
+               return x;
 
        case IEEE754_CLASS_SNAN:
                ieee754_setcx(IEEE754_INVALID_OPERATION);
@@ -51,7 +51,7 @@ union ieee754sp ieee754sp_sqrt(union ieee754sp x)
                if (xs) {
                        /* sqrt(-Inf) = Nan */
                        ieee754_setcx(IEEE754_INVALID_OPERATION);
-                       return ieee754sp_nanxcpt(ieee754sp_indef());
+                       return ieee754sp_indef();
                }
                /* sqrt(+Inf) = Inf */
                return x;
@@ -61,7 +61,7 @@ union ieee754sp ieee754sp_sqrt(union ieee754sp x)
                if (xs) {
                        /* sqrt(-x) = Nan */
                        ieee754_setcx(IEEE754_INVALID_OPERATION);
-                       return ieee754sp_nanxcpt(ieee754sp_indef());
+                       return ieee754sp_indef();
                }
                break;
        }