]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blame - releases/4.9.52/mips-math-emu-max-maxa-min-mina-.-d-s-fix-quiet-nan-propagation.patch
4.9-stable patches
[thirdparty/kernel/stable-queue.git] / releases / 4.9.52 / mips-math-emu-max-maxa-min-mina-.-d-s-fix-quiet-nan-propagation.patch
CommitLineData
dbfa5f4f
GKH
1From e78bf0dc4789bdea1453595ae89e8db65918e22e Mon Sep 17 00:00:00 2001
2From: Aleksandar Markovic <aleksandar.markovic@imgtec.com>
3Date: Thu, 27 Jul 2017 18:08:48 +0200
4Subject: MIPS: math-emu: <MAX|MAXA|MIN|MINA>.<D|S>: Fix quiet NaN propagation
5
6From: Aleksandar Markovic <aleksandar.markovic@imgtec.com>
7
8commit e78bf0dc4789bdea1453595ae89e8db65918e22e upstream.
9
10Fix the value returned by <MAX|MAXA|MIN|MINA>.<D|S> fd,fs,ft, if both
11inputs are quiet NaNs. The <MAX|MAXA|MIN|MINA>.<D|S> specifications
12state that the returned value in such cases should be the quiet NaN
13contained in register fs.
14
15A relevant example:
16
17MAX.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
21Fixes: a79f5f9ba508 ("MIPS: math-emu: Add support for the MIPS R6 MAX{, A} FPU instruction")
22Fixes: 4e9561b20e2f ("MIPS: math-emu: Add support for the MIPS R6 MIN{, A} FPU instruction")
23
24Signed-off-by: Miodrag Dinic <miodrag.dinic@imgtec.com>
25Signed-off-by: Goran Ferenc <goran.ferenc@imgtec.com>
26Signed-off-by: Aleksandar Markovic <aleksandar.markovic@imgtec.com>
27Reviewed-by: James Hogan <james.hogan@imgtec.com>
28Cc: Bo Hu <bohu@google.com>
29Cc: Douglas Leung <douglas.leung@imgtec.com>
30Cc: Jin Qian <jinqian@google.com>
31Cc: Paul Burton <paul.burton@imgtec.com>
32Cc: Petar Jovanovic <petar.jovanovic@imgtec.com>
33Cc: Raghu Gandham <raghu.gandham@imgtec.com>
34Cc: linux-mips@linux-mips.org
35Cc: linux-kernel@vger.kernel.org
36Patchwork: https://patchwork.linux-mips.org/patch/16880/
37Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
38Signed-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):