Re: [PATCH v4 05/16] MIPS: math-emu: .: Fix quiet NaN propagation

2017-08-07 Thread Ralf Baechle
On Thu, Jul 27, 2017 at 06:08:48PM +0200, Aleksandar Markovic wrote:

This is a mindbogglingly big series of FP fixes.  There's always a risk
associated with fixes so I'd prefer if they could wait for 4.14.  For now
I'm going to apply them to my 4.14 branch but let me know if you think they
are more urgent than that?

  Ralf


[PATCH v4 05/16] MIPS: math-emu: .: Fix quiet NaN propagation

2017-07-27 Thread Aleksandar Markovic
From: Aleksandar Markovic 

Fix the value returned by . fd,fs,ft, if both
inputs are quiet NaNs. The . specifications
state that the returned value in such cases should be the quiet NaN
contained in register fs.

A relevant example:

MAX.S fd,fs,ft:
  If fs contains qNaN1, and ft contains qNaN2, fd is going to contain
  qNaN1 (without this patch, it used to contain qNaN2).

Fixes: a79f5f9ba508 ("MIPS: math-emu: Add support for the MIPS R6 MAX{, A} FPU 
instruction")
Fixes: 4e9561b20e2f ("MIPS: math-emu: Add support for the MIPS R6 MIN{, A} FPU 
instruction")

Signed-off-by: Miodrag Dinic 
Signed-off-by: Goran Ferenc 
Signed-off-by: Aleksandar Markovic 
Cc:  # 4.3+
Reviewed-by: James Hogan 
---
 arch/mips/math-emu/dp_fmax.c | 32 
 arch/mips/math-emu/dp_fmin.c | 32 
 arch/mips/math-emu/sp_fmax.c | 32 
 arch/mips/math-emu/sp_fmin.c | 32 
 4 files changed, 112 insertions(+), 16 deletions(-)

diff --git a/arch/mips/math-emu/dp_fmax.c b/arch/mips/math-emu/dp_fmax.c
index fd71b8d..41bd6ed 100644
--- a/arch/mips/math-emu/dp_fmax.c
+++ b/arch/mips/math-emu/dp_fmax.c
@@ -47,14 +47,26 @@ union ieee754dp ieee754dp_fmax(union ieee754dp x, union 
ieee754dp y)
case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_INF):
return ieee754dp_nanxcpt(x);
 
-   /* numbers are preferred to NaNs */
+   /*
+* Quiet NaN handling
+*/
+
+   /*
+*The case of both inputs quiet NaNs
+*/
+   case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN):
+   return x;
+
+   /*
+*The cases of exactly one input quiet NaN (numbers
+*are here preferred as returned values to NaNs)
+*/
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_QNAN):
case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_QNAN):
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_QNAN):
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_QNAN):
return x;
 
-   case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN):
case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_ZERO):
case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_NORM):
case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_DNORM):
@@ -147,14 +159,26 @@ union ieee754dp ieee754dp_fmaxa(union ieee754dp x, union 
ieee754dp y)
case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_INF):
return ieee754dp_nanxcpt(x);
 
-   /* numbers are preferred to NaNs */
+   /*
+* Quiet NaN handling
+*/
+
+   /*
+*The case of both inputs quiet NaNs
+*/
+   case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN):
+   return x;
+
+   /*
+*The cases of exactly one input quiet NaN (numbers
+*are here preferred as returned values to NaNs)
+*/
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_QNAN):
case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_QNAN):
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_QNAN):
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_QNAN):
return x;
 
-   case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN):
case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_ZERO):
case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_NORM):
case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_DNORM):
diff --git a/arch/mips/math-emu/dp_fmin.c b/arch/mips/math-emu/dp_fmin.c
index c1072b0..53fb8c9 100644
--- a/arch/mips/math-emu/dp_fmin.c
+++ b/arch/mips/math-emu/dp_fmin.c
@@ -47,14 +47,26 @@ union ieee754dp ieee754dp_fmin(union ieee754dp x, union 
ieee754dp y)
case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_INF):
return ieee754dp_nanxcpt(x);
 
-   /* numbers are preferred to NaNs */
+   /*
+* Quiet NaN handling
+*/
+
+   /*
+*The case of both inputs quiet NaNs
+*/
+   case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN):
+   return x;
+
+   /*
+*The cases of exactly one input quiet NaN (numbers
+*are here preferred as returned values to NaNs)
+*/
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_QNAN):
case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_QNAN):
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_QNAN):
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_QNAN):
return x;
 
-   case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN):
case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_ZERO):
case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_NORM):
case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_DNORM):
@@ -147,14 +159,26 @@ union ieee754dp ieee754dp_fmina(union ieee754dp x, union 
ieee754dp y)
case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_INF):
return ieee754dp_nanxcpt(x);
 
-   /* numbers are preferred to NaNs */
+   /*