MIPS: math-emu: <MAXA|MINA>.<D|S>: Fix cases of both infinite inputs
Fix the value returned by <MAXA|MINA>.<D|S> fd,fs,ft, if both inputs are infinite. The previous implementation returned always the value contained in ft in such cases. The correct behavior is specified in Mips instruction set manual and is as follows: fs ft MAXA MINA --------------------------------- inf inf inf inf inf -inf inf -inf -inf inf inf -inf -inf -inf -inf -inf A relevant example: MAXA.S fd,fs,ft: If fs contains +inf, and ft contains -inf, fd is going to contain +inf (without this patch, it used to contain -inf). Fixes:a79f5f9ba5
("MIPS: math-emu: Add support for the MIPS R6 MAX{, A} FPU instruction") Fixes:4e9561b20e
("MIPS: math-emu: Add support for the MIPS R6 MIN{, A} FPU instruction") Signed-off-by: Miodrag Dinic <miodrag.dinic@imgtec.com> Signed-off-by: Goran Ferenc <goran.ferenc@imgtec.com> Signed-off-by: Aleksandar Markovic <aleksandar.markovic@imgtec.com> Reviewed-by: James Hogan <james.hogan@imgtec.com> Cc: Bo Hu <bohu@google.com> Cc: Douglas Leung <douglas.leung@imgtec.com> Cc: Jin Qian <jinqian@google.com> Cc: Paul Burton <paul.burton@imgtec.com> Cc: Petar Jovanovic <petar.jovanovic@imgtec.com> Cc: Raghu Gandham <raghu.gandham@imgtec.com> Cc: <stable@vger.kernel.org> # 4.3+ Cc: linux-mips@linux-mips.org Cc: linux-kernel@vger.kernel.org Patchwork: https://patchwork.linux-mips.org/patch/16884/ Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
This commit is contained in:
parent
1a41b3b441
commit
3444c4eb53
|
@ -202,6 +202,9 @@ union ieee754dp ieee754dp_fmaxa(union ieee754dp x, union ieee754dp y)
|
||||||
/*
|
/*
|
||||||
* Infinity and zero handling
|
* Infinity and zero handling
|
||||||
*/
|
*/
|
||||||
|
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_INF):
|
||||||
|
return ieee754dp_inf(xs & ys);
|
||||||
|
|
||||||
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_ZERO):
|
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_ZERO):
|
||||||
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_NORM):
|
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_NORM):
|
||||||
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_DNORM):
|
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_DNORM):
|
||||||
|
@ -209,7 +212,6 @@ union ieee754dp ieee754dp_fmaxa(union ieee754dp x, union ieee754dp y)
|
||||||
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_ZERO):
|
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_ZERO):
|
||||||
return x;
|
return x;
|
||||||
|
|
||||||
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_INF):
|
|
||||||
case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_INF):
|
case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_INF):
|
||||||
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_INF):
|
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_INF):
|
||||||
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_INF):
|
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_INF):
|
||||||
|
|
|
@ -202,6 +202,9 @@ union ieee754dp ieee754dp_fmina(union ieee754dp x, union ieee754dp y)
|
||||||
/*
|
/*
|
||||||
* Infinity and zero handling
|
* Infinity and zero handling
|
||||||
*/
|
*/
|
||||||
|
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_INF):
|
||||||
|
return ieee754dp_inf(xs | ys);
|
||||||
|
|
||||||
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_ZERO):
|
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_ZERO):
|
||||||
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_NORM):
|
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_NORM):
|
||||||
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_DNORM):
|
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_DNORM):
|
||||||
|
@ -209,7 +212,6 @@ union ieee754dp ieee754dp_fmina(union ieee754dp x, union ieee754dp y)
|
||||||
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_ZERO):
|
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_ZERO):
|
||||||
return x;
|
return x;
|
||||||
|
|
||||||
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_INF):
|
|
||||||
case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_INF):
|
case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_INF):
|
||||||
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_INF):
|
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_INF):
|
||||||
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_INF):
|
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_INF):
|
||||||
|
|
|
@ -202,6 +202,9 @@ union ieee754sp ieee754sp_fmaxa(union ieee754sp x, union ieee754sp y)
|
||||||
/*
|
/*
|
||||||
* Infinity and zero handling
|
* Infinity and zero handling
|
||||||
*/
|
*/
|
||||||
|
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_INF):
|
||||||
|
return ieee754sp_inf(xs & ys);
|
||||||
|
|
||||||
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_ZERO):
|
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_ZERO):
|
||||||
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_NORM):
|
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_NORM):
|
||||||
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_DNORM):
|
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_DNORM):
|
||||||
|
@ -209,7 +212,6 @@ union ieee754sp ieee754sp_fmaxa(union ieee754sp x, union ieee754sp y)
|
||||||
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_ZERO):
|
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_ZERO):
|
||||||
return x;
|
return x;
|
||||||
|
|
||||||
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_INF):
|
|
||||||
case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_INF):
|
case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_INF):
|
||||||
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_INF):
|
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_INF):
|
||||||
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_INF):
|
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_INF):
|
||||||
|
|
|
@ -202,6 +202,9 @@ union ieee754sp ieee754sp_fmina(union ieee754sp x, union ieee754sp y)
|
||||||
/*
|
/*
|
||||||
* Infinity and zero handling
|
* Infinity and zero handling
|
||||||
*/
|
*/
|
||||||
|
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_INF):
|
||||||
|
return ieee754sp_inf(xs | ys);
|
||||||
|
|
||||||
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_ZERO):
|
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_ZERO):
|
||||||
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_NORM):
|
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_NORM):
|
||||||
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_DNORM):
|
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_DNORM):
|
||||||
|
@ -209,7 +212,6 @@ union ieee754sp ieee754sp_fmina(union ieee754sp x, union ieee754sp y)
|
||||||
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_ZERO):
|
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_ZERO):
|
||||||
return x;
|
return x;
|
||||||
|
|
||||||
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_INF):
|
|
||||||
case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_INF):
|
case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_INF):
|
||||||
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_INF):
|
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_INF):
|
||||||
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_INF):
|
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_INF):
|
||||||
|
|
Loading…
Reference in New Issue