Skip to content

Commit f4d77fc

Browse files
aleksandar-markovicgregkh
authored andcommitted
MIPS: math-emu: <MAXA|MINA>.<D|S>: Fix cases of both infinite inputs
commit 3444c4eb534c20e44f0d6670b34263efaf8b531f upstream. 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: a79f5f9 ("MIPS: math-emu: Add support for the MIPS R6 MAX{, A} FPU instruction") Fixes: 4e9561b ("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: 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> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 322bf69 commit f4d77fc

4 files changed

Lines changed: 12 additions & 4 deletions

File tree

arch/mips/math-emu/dp_fmax.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,14 +202,16 @@ union ieee754dp ieee754dp_fmaxa(union ieee754dp x, union ieee754dp y)
202202
/*
203203
* Infinity and zero handling
204204
*/
205+
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_INF):
206+
return ieee754dp_inf(xs & ys);
207+
205208
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_ZERO):
206209
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_NORM):
207210
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_DNORM):
208211
case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_ZERO):
209212
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_ZERO):
210213
return x;
211214

212-
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_INF):
213215
case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_INF):
214216
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_INF):
215217
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_INF):

arch/mips/math-emu/dp_fmin.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,14 +202,16 @@ union ieee754dp ieee754dp_fmina(union ieee754dp x, union ieee754dp y)
202202
/*
203203
* Infinity and zero handling
204204
*/
205+
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_INF):
206+
return ieee754dp_inf(xs | ys);
207+
205208
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_ZERO):
206209
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_NORM):
207210
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_DNORM):
208211
case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_ZERO):
209212
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_ZERO):
210213
return x;
211214

212-
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_INF):
213215
case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_INF):
214216
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_INF):
215217
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_INF):

arch/mips/math-emu/sp_fmax.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,14 +202,16 @@ union ieee754sp ieee754sp_fmaxa(union ieee754sp x, union ieee754sp y)
202202
/*
203203
* Infinity and zero handling
204204
*/
205+
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_INF):
206+
return ieee754sp_inf(xs & ys);
207+
205208
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_ZERO):
206209
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_NORM):
207210
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_DNORM):
208211
case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_ZERO):
209212
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_ZERO):
210213
return x;
211214

212-
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_INF):
213215
case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_INF):
214216
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_INF):
215217
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_INF):

arch/mips/math-emu/sp_fmin.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,14 +202,16 @@ union ieee754sp ieee754sp_fmina(union ieee754sp x, union ieee754sp y)
202202
/*
203203
* Infinity and zero handling
204204
*/
205+
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_INF):
206+
return ieee754sp_inf(xs | ys);
207+
205208
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_ZERO):
206209
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_NORM):
207210
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_DNORM):
208211
case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_ZERO):
209212
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_ZERO):
210213
return x;
211214

212-
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_INF):
213215
case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_INF):
214216
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_INF):
215217
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_INF):

0 commit comments

Comments
 (0)