]>
Commit | Line | Data |
---|---|---|
dbfa5f4f GKH |
1 | From 3444c4eb534c20e44f0d6670b34263efaf8b531f Mon Sep 17 00:00:00 2001 |
2 | From: Aleksandar Markovic <aleksandar.markovic@imgtec.com> | |
3 | Date: Thu, 27 Jul 2017 18:08:52 +0200 | |
4 | Subject: MIPS: math-emu: <MAXA|MINA>.<D|S>: Fix cases of both infinite inputs | |
5 | ||
6 | From: Aleksandar Markovic <aleksandar.markovic@imgtec.com> | |
7 | ||
8 | commit 3444c4eb534c20e44f0d6670b34263efaf8b531f upstream. | |
9 | ||
10 | Fix the value returned by <MAXA|MINA>.<D|S> fd,fs,ft, if both inputs | |
11 | are infinite. The previous implementation returned always the value | |
12 | contained in ft in such cases. The correct behavior is specified | |
13 | in Mips instruction set manual and is as follows: | |
14 | ||
15 | fs ft MAXA MINA | |
16 | --------------------------------- | |
17 | inf inf inf inf | |
18 | inf -inf inf -inf | |
19 | -inf inf inf -inf | |
20 | -inf -inf -inf -inf | |
21 | ||
22 | A relevant example: | |
23 | ||
24 | MAXA.S fd,fs,ft: | |
25 | If fs contains +inf, and ft contains -inf, fd is going to contain | |
26 | +inf (without this patch, it used to contain -inf). | |
27 | ||
28 | Fixes: a79f5f9ba508 ("MIPS: math-emu: Add support for the MIPS R6 MAX{, A} FPU instruction") | |
29 | Fixes: 4e9561b20e2f ("MIPS: math-emu: Add support for the MIPS R6 MIN{, A} FPU instruction") | |
30 | ||
31 | Signed-off-by: Miodrag Dinic <miodrag.dinic@imgtec.com> | |
32 | Signed-off-by: Goran Ferenc <goran.ferenc@imgtec.com> | |
33 | Signed-off-by: Aleksandar Markovic <aleksandar.markovic@imgtec.com> | |
34 | Reviewed-by: James Hogan <james.hogan@imgtec.com> | |
35 | Cc: Bo Hu <bohu@google.com> | |
36 | Cc: Douglas Leung <douglas.leung@imgtec.com> | |
37 | Cc: Jin Qian <jinqian@google.com> | |
38 | Cc: Paul Burton <paul.burton@imgtec.com> | |
39 | Cc: Petar Jovanovic <petar.jovanovic@imgtec.com> | |
40 | Cc: Raghu Gandham <raghu.gandham@imgtec.com> | |
41 | Cc: linux-mips@linux-mips.org | |
42 | Cc: linux-kernel@vger.kernel.org | |
43 | Patchwork: https://patchwork.linux-mips.org/patch/16884/ | |
44 | Signed-off-by: Ralf Baechle <ralf@linux-mips.org> | |
45 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | |
46 | ||
47 | --- | |
48 | arch/mips/math-emu/dp_fmax.c | 4 +++- | |
49 | arch/mips/math-emu/dp_fmin.c | 4 +++- | |
50 | arch/mips/math-emu/sp_fmax.c | 4 +++- | |
51 | arch/mips/math-emu/sp_fmin.c | 4 +++- | |
52 | 4 files changed, 12 insertions(+), 4 deletions(-) | |
53 | ||
54 | --- a/arch/mips/math-emu/dp_fmax.c | |
55 | +++ b/arch/mips/math-emu/dp_fmax.c | |
56 | @@ -202,6 +202,9 @@ union ieee754dp ieee754dp_fmaxa(union ie | |
57 | /* | |
58 | * Infinity and zero handling | |
59 | */ | |
60 | + case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_INF): | |
61 | + return ieee754dp_inf(xs & ys); | |
62 | + | |
63 | case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_ZERO): | |
64 | case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_NORM): | |
65 | case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_DNORM): | |
66 | @@ -209,7 +212,6 @@ union ieee754dp ieee754dp_fmaxa(union ie | |
67 | case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_ZERO): | |
68 | return x; | |
69 | ||
70 | - case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_INF): | |
71 | case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_INF): | |
72 | case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_INF): | |
73 | case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_INF): | |
74 | --- a/arch/mips/math-emu/dp_fmin.c | |
75 | +++ b/arch/mips/math-emu/dp_fmin.c | |
76 | @@ -202,6 +202,9 @@ union ieee754dp ieee754dp_fmina(union ie | |
77 | /* | |
78 | * Infinity and zero handling | |
79 | */ | |
80 | + case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_INF): | |
81 | + return ieee754dp_inf(xs | ys); | |
82 | + | |
83 | case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_ZERO): | |
84 | case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_NORM): | |
85 | case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_DNORM): | |
86 | @@ -209,7 +212,6 @@ union ieee754dp ieee754dp_fmina(union ie | |
87 | case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_ZERO): | |
88 | return x; | |
89 | ||
90 | - case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_INF): | |
91 | case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_INF): | |
92 | case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_INF): | |
93 | case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_INF): | |
94 | --- a/arch/mips/math-emu/sp_fmax.c | |
95 | +++ b/arch/mips/math-emu/sp_fmax.c | |
96 | @@ -202,6 +202,9 @@ union ieee754sp ieee754sp_fmaxa(union ie | |
97 | /* | |
98 | * Infinity and zero handling | |
99 | */ | |
100 | + case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_INF): | |
101 | + return ieee754sp_inf(xs & ys); | |
102 | + | |
103 | case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_ZERO): | |
104 | case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_NORM): | |
105 | case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_DNORM): | |
106 | @@ -209,7 +212,6 @@ union ieee754sp ieee754sp_fmaxa(union ie | |
107 | case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_ZERO): | |
108 | return x; | |
109 | ||
110 | - case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_INF): | |
111 | case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_INF): | |
112 | case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_INF): | |
113 | case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_INF): | |
114 | --- a/arch/mips/math-emu/sp_fmin.c | |
115 | +++ b/arch/mips/math-emu/sp_fmin.c | |
116 | @@ -202,6 +202,9 @@ union ieee754sp ieee754sp_fmina(union ie | |
117 | /* | |
118 | * Infinity and zero handling | |
119 | */ | |
120 | + case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_INF): | |
121 | + return ieee754sp_inf(xs | ys); | |
122 | + | |
123 | case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_ZERO): | |
124 | case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_NORM): | |
125 | case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_DNORM): | |
126 | @@ -209,7 +212,6 @@ union ieee754sp ieee754sp_fmina(union ie | |
127 | case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_ZERO): | |
128 | return x; | |
129 | ||
130 | - case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_INF): | |
131 | case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_INF): | |
132 | case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_INF): | |
133 | case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_INF): |