]>
Commit | Line | Data |
---|---|---|
dbfa5f4f GKH |
1 | From e78bf0dc4789bdea1453595ae89e8db65918e22e Mon Sep 17 00:00:00 2001 |
2 | From: Aleksandar Markovic <aleksandar.markovic@imgtec.com> | |
3 | Date: Thu, 27 Jul 2017 18:08:48 +0200 | |
4 | Subject: MIPS: math-emu: <MAX|MAXA|MIN|MINA>.<D|S>: Fix quiet NaN propagation | |
5 | ||
6 | From: Aleksandar Markovic <aleksandar.markovic@imgtec.com> | |
7 | ||
8 | commit e78bf0dc4789bdea1453595ae89e8db65918e22e upstream. | |
9 | ||
10 | Fix the value returned by <MAX|MAXA|MIN|MINA>.<D|S> fd,fs,ft, if both | |
11 | inputs are quiet NaNs. The <MAX|MAXA|MIN|MINA>.<D|S> specifications | |
12 | state that the returned value in such cases should be the quiet NaN | |
13 | contained in register fs. | |
14 | ||
15 | A relevant example: | |
16 | ||
17 | MAX.S fd,fs,ft: | |
18 | If fs contains qNaN1, and ft contains qNaN2, fd is going to contain | |
19 | qNaN1 (without this patch, it used to contain qNaN2). | |
20 | ||
21 | Fixes: a79f5f9ba508 ("MIPS: math-emu: Add support for the MIPS R6 MAX{, A} FPU instruction") | |
22 | Fixes: 4e9561b20e2f ("MIPS: math-emu: Add support for the MIPS R6 MIN{, A} FPU instruction") | |
23 | ||
24 | Signed-off-by: Miodrag Dinic <miodrag.dinic@imgtec.com> | |
25 | Signed-off-by: Goran Ferenc <goran.ferenc@imgtec.com> | |
26 | Signed-off-by: Aleksandar Markovic <aleksandar.markovic@imgtec.com> | |
27 | Reviewed-by: James Hogan <james.hogan@imgtec.com> | |
28 | Cc: Bo Hu <bohu@google.com> | |
29 | Cc: Douglas Leung <douglas.leung@imgtec.com> | |
30 | Cc: Jin Qian <jinqian@google.com> | |
31 | Cc: Paul Burton <paul.burton@imgtec.com> | |
32 | Cc: Petar Jovanovic <petar.jovanovic@imgtec.com> | |
33 | Cc: Raghu Gandham <raghu.gandham@imgtec.com> | |
34 | Cc: linux-mips@linux-mips.org | |
35 | Cc: linux-kernel@vger.kernel.org | |
36 | Patchwork: https://patchwork.linux-mips.org/patch/16880/ | |
37 | Signed-off-by: Ralf Baechle <ralf@linux-mips.org> | |
38 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | |
39 | ||
40 | --- | |
41 | arch/mips/math-emu/dp_fmax.c | 32 ++++++++++++++++++++++++++++---- | |
42 | arch/mips/math-emu/dp_fmin.c | 32 ++++++++++++++++++++++++++++---- | |
43 | arch/mips/math-emu/sp_fmax.c | 32 ++++++++++++++++++++++++++++---- | |
44 | arch/mips/math-emu/sp_fmin.c | 32 ++++++++++++++++++++++++++++---- | |
45 | 4 files changed, 112 insertions(+), 16 deletions(-) | |
46 | ||
47 | --- a/arch/mips/math-emu/dp_fmax.c | |
48 | +++ b/arch/mips/math-emu/dp_fmax.c | |
49 | @@ -47,14 +47,26 @@ union ieee754dp ieee754dp_fmax(union iee | |
50 | case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_INF): | |
51 | return ieee754dp_nanxcpt(x); | |
52 | ||
53 | - /* numbers are preferred to NaNs */ | |
54 | + /* | |
55 | + * Quiet NaN handling | |
56 | + */ | |
57 | + | |
58 | + /* | |
59 | + * The case of both inputs quiet NaNs | |
60 | + */ | |
61 | + case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN): | |
62 | + return x; | |
63 | + | |
64 | + /* | |
65 | + * The cases of exactly one input quiet NaN (numbers | |
66 | + * are here preferred as returned values to NaNs) | |
67 | + */ | |
68 | case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_QNAN): | |
69 | case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_QNAN): | |
70 | case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_QNAN): | |
71 | case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_QNAN): | |
72 | return x; | |
73 | ||
74 | - case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN): | |
75 | case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_ZERO): | |
76 | case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_NORM): | |
77 | case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_DNORM): | |
78 | @@ -147,14 +159,26 @@ union ieee754dp ieee754dp_fmaxa(union ie | |
79 | case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_INF): | |
80 | return ieee754dp_nanxcpt(x); | |
81 | ||
82 | - /* numbers are preferred to NaNs */ | |
83 | + /* | |
84 | + * Quiet NaN handling | |
85 | + */ | |
86 | + | |
87 | + /* | |
88 | + * The case of both inputs quiet NaNs | |
89 | + */ | |
90 | + case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN): | |
91 | + return x; | |
92 | + | |
93 | + /* | |
94 | + * The cases of exactly one input quiet NaN (numbers | |
95 | + * are here preferred as returned values to NaNs) | |
96 | + */ | |
97 | case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_QNAN): | |
98 | case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_QNAN): | |
99 | case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_QNAN): | |
100 | case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_QNAN): | |
101 | return x; | |
102 | ||
103 | - case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN): | |
104 | case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_ZERO): | |
105 | case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_NORM): | |
106 | case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_DNORM): | |
107 | --- a/arch/mips/math-emu/dp_fmin.c | |
108 | +++ b/arch/mips/math-emu/dp_fmin.c | |
109 | @@ -47,14 +47,26 @@ union ieee754dp ieee754dp_fmin(union iee | |
110 | case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_INF): | |
111 | return ieee754dp_nanxcpt(x); | |
112 | ||
113 | - /* numbers are preferred to NaNs */ | |
114 | + /* | |
115 | + * Quiet NaN handling | |
116 | + */ | |
117 | + | |
118 | + /* | |
119 | + * The case of both inputs quiet NaNs | |
120 | + */ | |
121 | + case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN): | |
122 | + return x; | |
123 | + | |
124 | + /* | |
125 | + * The cases of exactly one input quiet NaN (numbers | |
126 | + * are here preferred as returned values to NaNs) | |
127 | + */ | |
128 | case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_QNAN): | |
129 | case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_QNAN): | |
130 | case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_QNAN): | |
131 | case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_QNAN): | |
132 | return x; | |
133 | ||
134 | - case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN): | |
135 | case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_ZERO): | |
136 | case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_NORM): | |
137 | case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_DNORM): | |
138 | @@ -147,14 +159,26 @@ union ieee754dp ieee754dp_fmina(union ie | |
139 | case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_INF): | |
140 | return ieee754dp_nanxcpt(x); | |
141 | ||
142 | - /* numbers are preferred to NaNs */ | |
143 | + /* | |
144 | + * Quiet NaN handling | |
145 | + */ | |
146 | + | |
147 | + /* | |
148 | + * The case of both inputs quiet NaNs | |
149 | + */ | |
150 | + case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN): | |
151 | + return x; | |
152 | + | |
153 | + /* | |
154 | + * The cases of exactly one input quiet NaN (numbers | |
155 | + * are here preferred as returned values to NaNs) | |
156 | + */ | |
157 | case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_QNAN): | |
158 | case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_QNAN): | |
159 | case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_QNAN): | |
160 | case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_QNAN): | |
161 | return x; | |
162 | ||
163 | - case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN): | |
164 | case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_ZERO): | |
165 | case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_NORM): | |
166 | case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_DNORM): | |
167 | --- a/arch/mips/math-emu/sp_fmax.c | |
168 | +++ b/arch/mips/math-emu/sp_fmax.c | |
169 | @@ -47,14 +47,26 @@ union ieee754sp ieee754sp_fmax(union iee | |
170 | case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_INF): | |
171 | return ieee754sp_nanxcpt(x); | |
172 | ||
173 | - /* numbers are preferred to NaNs */ | |
174 | + /* | |
175 | + * Quiet NaN handling | |
176 | + */ | |
177 | + | |
178 | + /* | |
179 | + * The case of both inputs quiet NaNs | |
180 | + */ | |
181 | + case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN): | |
182 | + return x; | |
183 | + | |
184 | + /* | |
185 | + * The cases of exactly one input quiet NaN (numbers | |
186 | + * are here preferred as returned values to NaNs) | |
187 | + */ | |
188 | case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_QNAN): | |
189 | case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_QNAN): | |
190 | case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_QNAN): | |
191 | case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_QNAN): | |
192 | return x; | |
193 | ||
194 | - case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN): | |
195 | case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_ZERO): | |
196 | case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_NORM): | |
197 | case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_DNORM): | |
198 | @@ -147,14 +159,26 @@ union ieee754sp ieee754sp_fmaxa(union ie | |
199 | case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_INF): | |
200 | return ieee754sp_nanxcpt(x); | |
201 | ||
202 | - /* numbers are preferred to NaNs */ | |
203 | + /* | |
204 | + * Quiet NaN handling | |
205 | + */ | |
206 | + | |
207 | + /* | |
208 | + * The case of both inputs quiet NaNs | |
209 | + */ | |
210 | + case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN): | |
211 | + return x; | |
212 | + | |
213 | + /* | |
214 | + * The cases of exactly one input quiet NaN (numbers | |
215 | + * are here preferred as returned values to NaNs) | |
216 | + */ | |
217 | case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_QNAN): | |
218 | case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_QNAN): | |
219 | case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_QNAN): | |
220 | case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_QNAN): | |
221 | return x; | |
222 | ||
223 | - case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN): | |
224 | case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_ZERO): | |
225 | case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_NORM): | |
226 | case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_DNORM): | |
227 | --- a/arch/mips/math-emu/sp_fmin.c | |
228 | +++ b/arch/mips/math-emu/sp_fmin.c | |
229 | @@ -47,14 +47,26 @@ union ieee754sp ieee754sp_fmin(union iee | |
230 | case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_INF): | |
231 | return ieee754sp_nanxcpt(x); | |
232 | ||
233 | - /* numbers are preferred to NaNs */ | |
234 | + /* | |
235 | + * Quiet NaN handling | |
236 | + */ | |
237 | + | |
238 | + /* | |
239 | + * The case of both inputs quiet NaNs | |
240 | + */ | |
241 | + case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN): | |
242 | + return x; | |
243 | + | |
244 | + /* | |
245 | + * The cases of exactly one input quiet NaN (numbers | |
246 | + * are here preferred as returned values to NaNs) | |
247 | + */ | |
248 | case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_QNAN): | |
249 | case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_QNAN): | |
250 | case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_QNAN): | |
251 | case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_QNAN): | |
252 | return x; | |
253 | ||
254 | - case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN): | |
255 | case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_ZERO): | |
256 | case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_NORM): | |
257 | case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_DNORM): | |
258 | @@ -147,14 +159,26 @@ union ieee754sp ieee754sp_fmina(union ie | |
259 | case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_INF): | |
260 | return ieee754sp_nanxcpt(x); | |
261 | ||
262 | - /* numbers are preferred to NaNs */ | |
263 | + /* | |
264 | + * Quiet NaN handling | |
265 | + */ | |
266 | + | |
267 | + /* | |
268 | + * The case of both inputs quiet NaNs | |
269 | + */ | |
270 | + case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN): | |
271 | + return x; | |
272 | + | |
273 | + /* | |
274 | + * The cases of exactly one input quiet NaN (numbers | |
275 | + * are here preferred as returned values to NaNs) | |
276 | + */ | |
277 | case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_QNAN): | |
278 | case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_QNAN): | |
279 | case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_QNAN): | |
280 | case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_QNAN): | |
281 | return x; | |
282 | ||
283 | - case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN): | |
284 | case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_ZERO): | |
285 | case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_NORM): | |
286 | case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_DNORM): |