Add explicit -mtriple=arm-unknown to llvm/test/CodeGen/ARM/disable-tail-calls.ll...
[oota-llvm.git] / test / CodeGen / ARM / vminmaxnm.ll
1 ; RUN: llc < %s -mtriple armv8 -mattr=+neon,+fp-armv8 | FileCheck %s
2 ; RUN: llc < %s -mtriple armv8 -mattr=+neon,+fp-armv8 \
3 ; RUN:          -enable-no-nans-fp-math -enable-unsafe-fp-math | FileCheck %s --check-prefix=CHECK-FAST
4
5 ; vectors
6
7 define <4 x float> @vmaxnmq(<4 x float>* %A, <4 x float>* %B) nounwind {
8 ; CHECK-LABEL: vmaxnmq:
9 ; CHECK: vmaxnm.f32 q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
10   %tmp1 = load <4 x float>, <4 x float>* %A
11   %tmp2 = load <4 x float>, <4 x float>* %B
12   %tmp3 = call <4 x float> @llvm.arm.neon.vmaxnm.v4f32(<4 x float> %tmp1, <4 x float> %tmp2)
13   ret <4 x float> %tmp3
14 }
15
16 define <2 x float> @vmaxnmd(<2 x float>* %A, <2 x float>* %B) nounwind {
17 ; CHECK-LABEL: vmaxnmd:
18 ; CHECK: vmaxnm.f32 d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}
19   %tmp1 = load <2 x float>, <2 x float>* %A
20   %tmp2 = load <2 x float>, <2 x float>* %B
21   %tmp3 = call <2 x float> @llvm.arm.neon.vmaxnm.v2f32(<2 x float> %tmp1, <2 x float> %tmp2)
22   ret <2 x float> %tmp3
23 }
24
25 define <4 x float> @vminnmq(<4 x float>* %A, <4 x float>* %B) nounwind {
26 ; CHECK-LABEL: vminnmq:
27 ; CHECK: vminnm.f32 q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
28   %tmp1 = load <4 x float>, <4 x float>* %A
29   %tmp2 = load <4 x float>, <4 x float>* %B
30   %tmp3 = call <4 x float> @llvm.arm.neon.vminnm.v4f32(<4 x float> %tmp1, <4 x float> %tmp2)
31   ret <4 x float> %tmp3
32 }
33
34 define <2 x float> @vminnmd(<2 x float>* %A, <2 x float>* %B) nounwind {
35 ; CHECK-LABEL: vminnmd:
36 ; CHECK: vminnm.f32 d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}
37   %tmp1 = load <2 x float>, <2 x float>* %A
38   %tmp2 = load <2 x float>, <2 x float>* %B
39   %tmp3 = call <2 x float> @llvm.arm.neon.vminnm.v2f32(<2 x float> %tmp1, <2 x float> %tmp2)
40   ret <2 x float> %tmp3
41 }
42
43 ; scalars
44
45 define float @fp-armv8_vminnm_o(float %a, float %b) {
46 ; CHECK-FAST-LABEL: "fp-armv8_vminnm_o":
47 ; CHECK-FAST-NOT: vcmp
48 ; CHECK-FAST: vminnm.f32
49 ; CHECK-LABEL: "fp-armv8_vminnm_o":
50 ; CHECK-NOT: vminnm.f32
51   %cmp = fcmp olt float %a, %b
52   %cond = select i1 %cmp, float %a, float %b
53   ret float %cond
54 }
55
56 define double @fp-armv8_vminnm_ole(double %a, double %b) {
57 ; CHECK-FAST-LABEL: "fp-armv8_vminnm_ole":
58 ; CHECK-FAST-NOT: vcmp
59 ; CHECK-FAST: vminnm.f64
60 ; CHECK-LABEL: "fp-armv8_vminnm_ole":
61 ; CHECK-NOT: vminnm.f64
62   %cmp = fcmp ole double %a, %b
63   %cond = select i1 %cmp, double %a, double %b
64   ret double %cond
65 }
66
67 define float @fp-armv8_vminnm_o_rev(float %a, float %b) {
68 ; CHECK-FAST-LABEL: "fp-armv8_vminnm_o_rev":
69 ; CHECK-FAST-NOT: vcmp
70 ; CHECK-FAST: vminnm.f32
71 ; CHECK-LABEL: "fp-armv8_vminnm_o_rev":
72 ; CHECK-NOT: vminnm.f32
73   %cmp = fcmp ogt float %a, %b
74   %cond = select i1 %cmp, float %b, float %a
75   ret float %cond
76 }
77
78 define double @fp-armv8_vminnm_oge_rev(double %a, double %b) {
79 ; CHECK-FAST-LABEL: "fp-armv8_vminnm_oge_rev":
80 ; CHECK-FAST-NOT: vcmp
81 ; CHECK-FAST: vminnm.f64
82 ; CHECK-LABEL: "fp-armv8_vminnm_oge_rev":
83 ; CHECK-NOT: vminnm.f64
84   %cmp = fcmp oge double %a, %b
85   %cond = select i1 %cmp, double %b, double %a
86   ret double %cond
87 }
88
89 define float @fp-armv8_vminnm_u(float %a, float %b) {
90 ; CHECK-FAST-LABEL: "fp-armv8_vminnm_u":
91 ; CHECK-FAST-NOT: vcmp
92 ; CHECK-FAST: vminnm.f32
93 ; CHECK-LABEL: "fp-armv8_vminnm_u":
94 ; CHECK-NOT: vminnm.f32
95   %cmp = fcmp ult float %a, %b
96   %cond = select i1 %cmp, float %a, float %b
97   ret float %cond
98 }
99
100 define float @fp-armv8_vminnm_ule(float %a, float %b) {
101 ; CHECK-FAST-LABEL: "fp-armv8_vminnm_ule":
102 ; CHECK-FAST-NOT: vcmp
103 ; CHECK-FAST: vminnm.f32
104 ; CHECK-LABEL: "fp-armv8_vminnm_ule":
105 ; CHECK-NOT: vminnm.f32
106   %cmp = fcmp ule float %a, %b
107   %cond = select i1 %cmp, float %a, float %b
108   ret float %cond
109 }
110
111 define float @fp-armv8_vminnm_u_rev(float %a, float %b) {
112 ; CHECK-FAST-LABEL: "fp-armv8_vminnm_u_rev":
113 ; CHECK-FAST-NOT: vcmp
114 ; CHECK-FAST: vminnm.f32
115 ; CHECK-LABEL: "fp-armv8_vminnm_u_rev":
116 ; CHECK-NOT: vminnm.f32
117   %cmp = fcmp ugt float %a, %b
118   %cond = select i1 %cmp, float %b, float %a
119   ret float %cond
120 }
121
122 define double @fp-armv8_vminnm_uge_rev(double %a, double %b) {
123 ; CHECK-FAST-LABEL: "fp-armv8_vminnm_uge_rev":
124 ; CHECK-FAST-NOT: vcmp
125 ; CHECK-FAST: vminnm.f64
126 ; CHECK-LABEL: "fp-armv8_vminnm_uge_rev":
127 ; CHECK-NOT: vminnm.f64
128   %cmp = fcmp uge double %a, %b
129   %cond = select i1 %cmp, double %b, double %a
130   ret double %cond
131 }
132
133 define float @fp-armv8_vmaxnm_o(float %a, float %b) {
134 ; CHECK-FAST-LABEL: "fp-armv8_vmaxnm_o":
135 ; CHECK-FAST-NOT: vcmp
136 ; CHECK-FAST: vmaxnm.f32
137 ; CHECK-LABEL: "fp-armv8_vmaxnm_o":
138 ; CHECK-NOT: vmaxnm.f32
139   %cmp = fcmp ogt float %a, %b
140   %cond = select i1 %cmp, float %a, float %b
141   ret float %cond
142 }
143
144 define float @fp-armv8_vmaxnm_oge(float %a, float %b) {
145 ; CHECK-FAST-LABEL: "fp-armv8_vmaxnm_oge":
146 ; CHECK-FAST-NOT: vcmp
147 ; CHECK-FAST: vmaxnm.f32
148 ; CHECK-LABEL: "fp-armv8_vmaxnm_oge":
149 ; CHECK-NOT: vmaxnm.f32
150   %cmp = fcmp oge float %a, %b
151   %cond = select i1 %cmp, float %a, float %b
152   ret float %cond
153 }
154
155 define float @fp-armv8_vmaxnm_o_rev(float %a, float %b) {
156 ; CHECK-FAST-LABEL: "fp-armv8_vmaxnm_o_rev":
157 ; CHECK-FAST-NOT: vcmp
158 ; CHECK-FAST: vmaxnm.f32
159 ; CHECK-LABEL: "fp-armv8_vmaxnm_o_rev":
160 ; CHECK-NOT: vmaxnm.f32
161   %cmp = fcmp olt float %a, %b
162   %cond = select i1 %cmp, float %b, float %a
163   ret float %cond
164 }
165
166 define float @fp-armv8_vmaxnm_ole_rev(float %a, float %b) {
167 ; CHECK-FAST-LABEL: "fp-armv8_vmaxnm_ole_rev":
168 ; CHECK-FAST-NOT: vcmp
169 ; CHECK-FAST: vmaxnm.f32
170 ; CHECK-LABEL: "fp-armv8_vmaxnm_ole_rev":
171 ; CHECK-NOT: vmaxnm.f32
172   %cmp = fcmp ole float %a, %b
173   %cond = select i1 %cmp, float %b, float %a
174   ret float %cond
175 }
176
177 define float @fp-armv8_vmaxnm_u(float %a, float %b) {
178 ; CHECK-FAST-LABEL: "fp-armv8_vmaxnm_u":
179 ; CHECK-FAST-NOT: vcmp
180 ; CHECK-FAST: vmaxnm.f32
181 ; CHECK-LABEL: "fp-armv8_vmaxnm_u":
182 ; CHECK-NOT: vmaxnm.f32
183   %cmp = fcmp ugt float %a, %b
184   %cond = select i1 %cmp, float %a, float %b
185   ret float %cond
186 }
187
188 define float @fp-armv8_vmaxnm_uge(float %a, float %b) {
189 ; CHECK-FAST-LABEL: "fp-armv8_vmaxnm_uge":
190 ; CHECK-FAST-NOT: vcmp
191 ; CHECK-FAST: vmaxnm.f32
192 ; CHECK-LABEL: "fp-armv8_vmaxnm_uge":
193 ; CHECK-NOT: vmaxnm.f32
194   %cmp = fcmp uge float %a, %b
195   %cond = select i1 %cmp, float %a, float %b
196   ret float %cond
197 }
198
199 define float @fp-armv8_vmaxnm_u_rev(float %a, float %b) {
200 ; CHECK-FAST-LABEL: "fp-armv8_vmaxnm_u_rev":
201 ; CHECK-FAST-NOT: vcmp
202 ; CHECK-FAST: vmaxnm.f32
203 ; CHECK-LABEL: "fp-armv8_vmaxnm_u_rev":
204 ; CHECK-NOT: vmaxnm.f32
205   %cmp = fcmp ult float %a, %b
206   %cond = select i1 %cmp, float %b, float %a
207   ret float %cond
208 }
209
210 define double @fp-armv8_vmaxnm_ule_rev(double %a, double %b) {
211 ; CHECK-FAST-LABEL: "fp-armv8_vmaxnm_ule_rev":
212 ; CHECK-FAST-NOT: vcmp
213 ; CHECK-FAST: vmaxnm.f64
214 ; CHECK-LABEL: "fp-armv8_vmaxnm_ule_rev":
215 ; CHECK-NOT: vmaxnm.f64
216   %cmp = fcmp ule double %a, %b
217   %cond = select i1 %cmp, double %b, double %a
218   ret double %cond
219 }
220
221 ; known non-NaNs
222
223 define float @fp-armv8_vminnm_NNNo(float %a) {
224 ; CHECK-FAST-LABEL: "fp-armv8_vminnm_NNNo":
225 ; CHECK-FAST: vminnm.f32
226 ; CHECK-FAST: vminnm.f32
227 ; CHECK-LABEL: "fp-armv8_vminnm_NNNo":
228 ; CHECK: vminnm.f32
229 ; CHECK-NOT: vminnm.f32
230   %cmp1 = fcmp olt float %a, 12.
231   %cond1 = select i1 %cmp1, float %a, float 12.
232   %cmp2 = fcmp olt float 34., %cond1
233   %cond2 = select i1 %cmp2, float 34., float %cond1
234   ret float %cond2
235 }
236
237 define double @fp-armv8_vminnm_NNNole(double %a) {
238 ; CHECK-FAST-LABEL: "fp-armv8_vminnm_NNNole":
239 ; CHECK-FAST: vminnm.f64
240 ; CHECK-FAST: vminnm.f64
241 ; CHECK-LABEL: "fp-armv8_vminnm_NNNole":
242 ; CHECK: vminnm.f64
243 ; CHECK-NOT: vminnm.f64
244   %cmp1 = fcmp ole double %a, 34.
245   %cond1 = select i1 %cmp1, double %a, double 34.
246   %cmp2 = fcmp ole double 56., %cond1
247   %cond2 = select i1 %cmp2, double 56., double %cond1
248   ret double %cond2
249 }
250
251 define float @fp-armv8_vminnm_NNNo_rev(float %a) {
252 ; CHECK-FAST-LABEL: "fp-armv8_vminnm_NNNo_rev":
253 ; CHECK-FAST: vminnm.f32
254 ; CHECK-FAST: vminnm.f32
255 ; CHECK-LABEL: "fp-armv8_vminnm_NNNo_rev":
256 ; CHECK: vminnm.f32
257 ; CHECK-NOT: vminnm.f32
258   %cmp1 = fcmp ogt float %a, 56.
259   %cond1 = select i1 %cmp1, float 56., float %a
260   %cmp2 = fcmp ogt float 78., %cond1
261   %cond2 = select i1 %cmp2, float %cond1, float 78.
262   ret float %cond2
263 }
264
265 define double @fp-armv8_vminnm_NNNoge_rev(double %a) {
266 ; CHECK-FAST-LABEL: "fp-armv8_vminnm_NNNoge_rev":
267 ; CHECK-FAST: vminnm.f64
268 ; CHECK-FAST: vminnm.f64
269 ; CHECK-LABEL: "fp-armv8_vminnm_NNNoge_rev":
270 ; CHECK: vminnm.f64
271 ; CHECK-NOT: vminnm.f64
272   %cmp1 = fcmp oge double %a, 78.
273   %cond1 = select i1 %cmp1, double 78., double %a
274   %cmp2 = fcmp oge double 90., %cond1
275   %cond2 = select i1 %cmp2, double %cond1, double 90.
276   ret double %cond2
277 }
278
279 define float @fp-armv8_vminnm_NNNu(float %b) {
280 ; CHECK-FAST-LABEL: "fp-armv8_vminnm_NNNu":
281 ; CHECK-FAST: vminnm.f32
282 ; CHECK-FAST: vminnm.f32
283 ; CHECK-LABEL: "fp-armv8_vminnm_NNNu":
284 ; CHECK: vminnm.f32
285 ; CHECK-NOT: vminnm.f32
286   %cmp1 = fcmp ult float 12., %b
287   %cond1 = select i1 %cmp1, float 12., float %b
288   %cmp2 = fcmp ult float %cond1, 34.
289   %cond2 = select i1 %cmp2, float %cond1, float 34.
290   ret float %cond2
291 }
292
293 define float @fp-armv8_vminnm_NNNule(float %b) {
294 ; CHECK-FAST-LABEL: "fp-armv8_vminnm_NNNule":
295 ; CHECK-FAST: vminnm.f32
296 ; CHECK-FAST: vminnm.f32
297 ; CHECK-LABEL: "fp-armv8_vminnm_NNNule":
298 ; CHECK: vminnm.f32
299 ; CHECK-NOT: vminnm.f32
300   %cmp1 = fcmp ule float 34., %b
301   %cond1 = select i1 %cmp1, float 34., float %b
302   %cmp2 = fcmp ule float %cond1, 56.
303   %cond2 = select i1 %cmp2, float %cond1, float 56.
304   ret float %cond2
305 }
306
307 define float @fp-armv8_vminnm_NNNu_rev(float %b) {
308 ; CHECK-FAST-LABEL: "fp-armv8_vminnm_NNNu_rev":
309 ; CHECK-FAST: vminnm.f32
310 ; CHECK-FAST: vminnm.f32
311 ; CHECK-LABEL: "fp-armv8_vminnm_NNNu_rev":
312 ; CHECK: vminnm.f32
313 ; CHECK-NOT: vminnm.f32
314   %cmp1 = fcmp ugt float 56., %b
315   %cond1 = select i1 %cmp1, float %b, float 56.
316   %cmp2 = fcmp ugt float %cond1, 78.
317   %cond2 = select i1 %cmp2, float 78., float %cond1
318   ret float %cond2
319 }
320
321 define double @fp-armv8_vminnm_NNNuge_rev(double %b) {
322 ; CHECK-FAST-LABEL: "fp-armv8_vminnm_NNNuge_rev":
323 ; CHECK-FAST: vminnm.f64
324 ; CHECK-FAST: vminnm.f64
325 ; CHECK-LABEL: "fp-armv8_vminnm_NNNuge_rev":
326 ; CHECK: vminnm.f64
327 ; CHECK-NOT: vminnm.f64
328   %cmp1 = fcmp uge double 78., %b
329   %cond1 = select i1 %cmp1, double %b, double 78.
330   %cmp2 = fcmp uge double %cond1, 90.
331   %cond2 = select i1 %cmp2, double 90., double %cond1
332   ret double %cond2
333 }
334
335 define float @fp-armv8_vmaxnm_NNNo(float %a) {
336 ; CHECK-FAST-LABEL: "fp-armv8_vmaxnm_NNNo":
337 ; CHECK-FAST: vmaxnm.f32
338 ; CHECK-FAST: vmaxnm.f32
339 ; CHECK-LABEL: "fp-armv8_vmaxnm_NNNo":
340 ; CHECK: vmaxnm.f32
341 ; CHECK-NOT: vmaxnm.f32
342   %cmp1 = fcmp ogt float %a, 12.
343   %cond1 = select i1 %cmp1, float %a, float 12.
344   %cmp2 = fcmp ogt float 34., %cond1
345   %cond2 = select i1 %cmp2, float 34., float %cond1
346   ret float %cond2
347 }
348
349 define float @fp-armv8_vmaxnm_NNNoge(float %a) {
350 ; CHECK-FAST-LABEL: "fp-armv8_vmaxnm_NNNoge":
351 ; CHECK-FAST: vmaxnm.f32
352 ; CHECK-FAST: vmaxnm.f32
353 ; CHECK-LABEL: "fp-armv8_vmaxnm_NNNoge":
354 ; CHECK: vmaxnm.f32
355 ; CHECK-NOT: vmaxnm.f32
356   %cmp1 = fcmp oge float %a, 34.
357   %cond1 = select i1 %cmp1, float %a, float 34.
358   %cmp2 = fcmp oge float 56., %cond1
359   %cond2 = select i1 %cmp2, float 56., float %cond1
360   ret float %cond2
361 }
362
363 define float @fp-armv8_vmaxnm_NNNo_rev(float %a) {
364 ; CHECK-FAST-LABEL: "fp-armv8_vmaxnm_NNNo_rev":
365 ; CHECK-FAST: vmaxnm.f32
366 ; CHECK-FAST: vmaxnm.f32
367 ; CHECK-LABEL: "fp-armv8_vmaxnm_NNNo_rev":
368 ; CHECK: vmaxnm.f32
369 ; CHECK-NOT: vmaxnm.f32
370   %cmp1 = fcmp olt float %a, 56.
371   %cond1 = select i1 %cmp1, float 56., float %a
372   %cmp2 = fcmp olt float 78., %cond1
373   %cond2 = select i1 %cmp2, float %cond1, float 78.
374   ret float %cond2
375 }
376
377 define float @fp-armv8_vmaxnm_NNNole_rev(float %a) {
378 ; CHECK-FAST-LABEL: "fp-armv8_vmaxnm_NNNole_rev":
379 ; CHECK-FAST: vmaxnm.f32
380 ; CHECK-FAST: vmaxnm.f32
381 ; CHECK-LABEL: "fp-armv8_vmaxnm_NNNole_rev":
382 ; CHECK: vmaxnm.f32
383 ; CHECK-NOT: vmaxnm.f32
384   %cmp1 = fcmp ole float %a, 78.
385   %cond1 = select i1 %cmp1, float 78., float %a
386   %cmp2 = fcmp ole float 90., %cond1
387   %cond2 = select i1 %cmp2, float %cond1, float 90.
388   ret float %cond2
389 }
390
391 define float @fp-armv8_vmaxnm_NNNu(float %b) {
392 ; CHECK-FAST-LABEL: "fp-armv8_vmaxnm_NNNu":
393 ; CHECK-FAST: vmaxnm.f32
394 ; CHECK-FAST: vmaxnm.f32
395 ; CHECK-LABEL: "fp-armv8_vmaxnm_NNNu":
396 ; CHECK: vmaxnm.f32
397 ; CHEC-NOT: vmaxnm.f32
398   %cmp1 = fcmp ugt float 12., %b
399   %cond1 = select i1 %cmp1, float 12., float %b
400   %cmp2 = fcmp ugt float %cond1, 34.
401   %cond2 = select i1 %cmp2, float %cond1, float 34.
402   ret float %cond2
403 }
404
405 define float @fp-armv8_vmaxnm_NNNuge(float %b) {
406 ; CHECK-FAST-LABEL: "fp-armv8_vmaxnm_NNNuge":
407 ; CHECK-FAST: vmaxnm.f32
408 ; CHECK-FAST: vmaxnm.f32
409 ; CHECK-LABEL: "fp-armv8_vmaxnm_NNNuge":
410 ; CHECK: vmaxnm.f32
411 ; CHECK-NOT: vmaxnm.f32
412   %cmp1 = fcmp uge float 34., %b
413   %cond1 = select i1 %cmp1, float 34., float %b
414   %cmp2 = fcmp uge float %cond1, 56.
415   %cond2 = select i1 %cmp2, float %cond1, float 56.
416   ret float %cond2
417 }
418
419 define float @fp-armv8_vmaxnm_NNNu_rev(float %b) {
420 ; CHECK-FAST-LABEL: "fp-armv8_vmaxnm_NNNu_rev":
421 ; CHECK-FAST: vmaxnm.f32
422 ; CHECK-FAST: vmaxnm.f32
423 ; CHECK-LABEL: "fp-armv8_vmaxnm_NNNu_rev":
424 ; CHECK: vmaxnm.f32
425 ; CHECK-NOT: vmaxnm.f32
426   %cmp1 = fcmp ult float 56., %b
427   %cond1 = select i1 %cmp1, float %b, float 56.
428   %cmp2 = fcmp ult float %cond1, 78.
429   %cond2 = select i1 %cmp2, float 78., float %cond1
430   ret float %cond2
431 }
432
433 define double @fp-armv8_vmaxnm_NNNule_rev( double %b) {
434 ; CHECK-FAST-LABEL: "fp-armv8_vmaxnm_NNNule_rev":
435 ; CHECK-FAST: vmaxnm.f64
436 ; CHECK-FAST: vmaxnm.f64
437 ; CHECK-LABEL: "fp-armv8_vmaxnm_NNNule_rev":
438 ; CHECK: vmaxnm.f64
439 ; CHECK-NOT: vmaxnm.f64
440   %cmp1 = fcmp ule double 78., %b
441   %cond1 = select i1 %cmp1, double %b, double 78.
442   %cmp2 = fcmp ule double %cond1, 90.
443   %cond2 = select i1 %cmp2, double 90., double %cond1
444   ret double %cond2
445 }
446
447 define float @fp-armv8_vminmaxnm_0(float %a) {
448 ; CHECK-FAST-LABEL: "fp-armv8_vminmaxnm_0":
449 ; CHECK-FAST-NOT: vcmp
450 ; CHECK-FAST: vminnm.f32
451 ; CHECK-FAST: vmaxnm.f32
452 ; CHECK-LABEL: "fp-armv8_vminmaxnm_0":
453 ; CHECK-NOT: vminnm.f32
454 ; CHECK: vmaxnm.f32
455   %cmp1 = fcmp olt float %a, 0.
456   %cond1 = select i1 %cmp1, float %a, float 0.
457   %cmp2 = fcmp ogt float %cond1, 0.
458   %cond2 = select i1 %cmp2, float %cond1, float 0.
459   ret float %cond2
460 }
461
462 define float @fp-armv8_vminmaxnm_neg0(float %a) {
463 ; CHECK-FAST-LABEL: "fp-armv8_vminmaxnm_neg0":
464 ; CHECK-FAST-NOT: vcmp
465 ; CHECK-FAST: vminnm.f32
466 ; CHECK-FAST: vmaxnm.f32
467 ; CHECK-LABEL: "fp-armv8_vminmaxnm_neg0":
468 ; CHECK: vminnm.f32
469 ; CHECK-NOT: vmaxnm.f32
470   %cmp1 = fcmp olt float %a, -0.
471   %cond1 = select i1 %cmp1, float %a, float -0.
472   %cmp2 = fcmp ogt float %cond1, -0.
473   %cond2 = select i1 %cmp2, float %cond1, float -0.
474   ret float %cond2
475 }
476
477 define float @fp-armv8_vminmaxnm_e_0(float %a) {
478 ; CHECK-FAST-LABEL: "fp-armv8_vminmaxnm_e_0":
479 ; CHECK-FAST-NOT: vcmp
480 ; CHECK-FAST: vminnm.f32
481 ; CHECK-FAST: vmaxnm.f32
482 ; CHECK-LABEL: "fp-armv8_vminmaxnm_e_0":
483 ; CHECK-NOT: vminnm.f32
484 ; CHECK: vmaxnm.f32
485   %cmp1 = fcmp ule float 0., %a
486   %cond1 = select i1 %cmp1, float 0., float %a
487   %cmp2 = fcmp uge float 0., %cond1
488   %cond2 = select i1 %cmp2, float 0., float %cond1
489   ret float %cond2
490 }
491
492 define float @fp-armv8_vminmaxnm_e_neg0(float %a) {
493 ; CHECK-FAST-LABEL: "fp-armv8_vminmaxnm_e_neg0":
494 ; CHECK-FAST-NOT: vcmp
495 ; CHECK-FAST: vminnm.f32
496 ; CHECK-FAST: vmaxnm.f32
497 ; CHECK-LABEL: "fp-armv8_vminmaxnm_e_neg0":
498 ; CHECK: vminnm.f32
499 ; CHECK-NOT: vmaxnm.f32
500   %cmp1 = fcmp ule float -0., %a
501   %cond1 = select i1 %cmp1, float -0., float %a
502   %cmp2 = fcmp uge float -0., %cond1
503   %cond2 = select i1 %cmp2, float -0., float %cond1
504   ret float %cond2
505 }
506
507 declare <4 x float> @llvm.arm.neon.vminnm.v4f32(<4 x float>, <4 x float>) nounwind readnone
508 declare <2 x float> @llvm.arm.neon.vminnm.v2f32(<2 x float>, <2 x float>) nounwind readnone
509 declare <4 x float> @llvm.arm.neon.vmaxnm.v4f32(<4 x float>, <4 x float>) nounwind readnone
510 declare <2 x float> @llvm.arm.neon.vmaxnm.v2f32(<2 x float>, <2 x float>) nounwind readnone