Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / CodeGen / ARM / fp16-vminmaxnm-safe.ll
blob56e734c4404336f6e0c93c6ca6a42ef280762f5b
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=armv8-eabi -mattr=+fullfp16 | FileCheck %s
3 ; RUN: llc < %s -mtriple thumbv7a -mattr=+fullfp16 | FileCheck %s
5 define half @fp16_vminnm_o(half %a, half %b) {
6 ; CHECK-LABEL: fp16_vminnm_o:
7 ; CHECK:       @ %bb.0: @ %entry
8 ; CHECK-NEXT:    vmov.f16 s0, r1
9 ; CHECK-NEXT:    vmov.f16 s2, r0
10 ; CHECK-NEXT:    vcmp.f16 s0, s2
11 ; CHECK-NEXT:    vmrs APSR_nzcv, fpscr
12 ; CHECK-NEXT:    vselgt.f16 s0, s2, s0
13 ; CHECK-NEXT:    vmov r0, s0
14 ; CHECK-NEXT:    bx lr
15 entry:
16   %cmp = fcmp olt half %a, %b
17   %cond = select i1 %cmp, half %a, half %b
18   ret half %cond
21 define half @fp16_vminnm_o_rev(half %a, half %b) {
22 ; CHECK-LABEL: fp16_vminnm_o_rev:
23 ; CHECK:       @ %bb.0: @ %entry
24 ; CHECK-NEXT:    vmov.f16 s0, r1
25 ; CHECK-NEXT:    vmov.f16 s2, r0
26 ; CHECK-NEXT:    vcmp.f16 s2, s0
27 ; CHECK-NEXT:    vmrs APSR_nzcv, fpscr
28 ; CHECK-NEXT:    vselgt.f16 s0, s2, s0
29 ; CHECK-NEXT:    vmov r0, s0
30 ; CHECK-NEXT:    bx lr
31 entry:
32   %cmp = fcmp ogt half %a, %b
33   %cond = select i1 %cmp, half %a, half %b
34   ret half %cond
37 define half @fp16_vminnm_u(half %a, half %b) {
38 ; CHECK-LABEL: fp16_vminnm_u:
39 ; CHECK:       @ %bb.0: @ %entry
40 ; CHECK-NEXT:    vmov.f16 s0, r0
41 ; CHECK-NEXT:    vmov.f16 s2, r1
42 ; CHECK-NEXT:    vcmp.f16 s0, s2
43 ; CHECK-NEXT:    vmrs APSR_nzcv, fpscr
44 ; CHECK-NEXT:    vselge.f16 s0, s2, s0
45 ; CHECK-NEXT:    vmov r0, s0
46 ; CHECK-NEXT:    bx lr
47 entry:
48   %cmp = fcmp ult half %a, %b
49   %cond = select i1 %cmp, half %a, half %b
50   ret half %cond
53 define half @fp16_vminnm_ule(half %a, half %b) {
54 ; CHECK-LABEL: fp16_vminnm_ule:
55 ; CHECK:       @ %bb.0: @ %entry
56 ; CHECK-NEXT:    vmov.f16 s0, r0
57 ; CHECK-NEXT:    vmov.f16 s2, r1
58 ; CHECK-NEXT:    vcmp.f16 s0, s2
59 ; CHECK-NEXT:    vmrs APSR_nzcv, fpscr
60 ; CHECK-NEXT:    vselgt.f16 s0, s2, s0
61 ; CHECK-NEXT:    vmov r0, s0
62 ; CHECK-NEXT:    bx lr
63 entry:
64   %cmp = fcmp ule half %a, %b
65   %cond = select i1 %cmp, half %a, half %b
66   ret half %cond
69 define half @fp16_vminnm_u_rev(half %a, half %b) {
70 ; CHECK-LABEL: fp16_vminnm_u_rev:
71 ; CHECK:       @ %bb.0: @ %entry
72 ; CHECK-NEXT:    vmov.f16 s0, r1
73 ; CHECK-NEXT:    vmov.f16 s2, r0
74 ; CHECK-NEXT:    vcmp.f16 s0, s2
75 ; CHECK-NEXT:    vmrs APSR_nzcv, fpscr
76 ; CHECK-NEXT:    vselge.f16 s0, s2, s0
77 ; CHECK-NEXT:    vmov r0, s0
78 ; CHECK-NEXT:    bx lr
79 entry:
80   %cmp = fcmp ugt half %a, %b
81   %cond = select i1 %cmp, half %b, half %a
82   ret half %cond
85 define half @fp16_vmaxnm_o(half %a, half %b) {
86 ; CHECK-LABEL: fp16_vmaxnm_o:
87 ; CHECK:       @ %bb.0: @ %entry
88 ; CHECK-NEXT:    vmov.f16 s0, r1
89 ; CHECK-NEXT:    vmov.f16 s2, r0
90 ; CHECK-NEXT:    vcmp.f16 s2, s0
91 ; CHECK-NEXT:    vmrs APSR_nzcv, fpscr
92 ; CHECK-NEXT:    vselgt.f16 s0, s2, s0
93 ; CHECK-NEXT:    vmov r0, s0
94 ; CHECK-NEXT:    bx lr
95 entry:
96   %cmp = fcmp ogt half %a, %b
97   %cond = select i1 %cmp, half %a, half %b
98   ret half %cond
101 define half @fp16_vmaxnm_oge(half %a, half %b) {
102 ; CHECK-LABEL: fp16_vmaxnm_oge:
103 ; CHECK:       @ %bb.0: @ %entry
104 ; CHECK-NEXT:    vmov.f16 s0, r1
105 ; CHECK-NEXT:    vmov.f16 s2, r0
106 ; CHECK-NEXT:    vcmp.f16 s2, s0
107 ; CHECK-NEXT:    vmrs APSR_nzcv, fpscr
108 ; CHECK-NEXT:    vselge.f16 s0, s2, s0
109 ; CHECK-NEXT:    vmov r0, s0
110 ; CHECK-NEXT:    bx lr
111 entry:
112   %cmp = fcmp oge half %a, %b
113   %cond = select i1 %cmp, half %a, half %b
114   ret half %cond
117 define half @fp16_vmaxnm_o_rev(half %a, half %b) {
118 ; CHECK-LABEL: fp16_vmaxnm_o_rev:
119 ; CHECK:       @ %bb.0: @ %entry
120 ; CHECK-NEXT:    vmov.f16 s0, r0
121 ; CHECK-NEXT:    vmov.f16 s2, r1
122 ; CHECK-NEXT:    vcmp.f16 s2, s0
123 ; CHECK-NEXT:    vmrs APSR_nzcv, fpscr
124 ; CHECK-NEXT:    vselgt.f16 s0, s2, s0
125 ; CHECK-NEXT:    vmov r0, s0
126 ; CHECK-NEXT:    bx lr
127 entry:
128   %cmp = fcmp olt half %a, %b
129   %cond = select i1 %cmp, half %b, half %a
130   ret half %cond
133 define half @fp16_vmaxnm_ole_rev(half %a, half %b) {
134 ; CHECK-LABEL: fp16_vmaxnm_ole_rev:
135 ; CHECK:       @ %bb.0: @ %entry
136 ; CHECK-NEXT:    vmov.f16 s0, r0
137 ; CHECK-NEXT:    vmov.f16 s2, r1
138 ; CHECK-NEXT:    vcmp.f16 s2, s0
139 ; CHECK-NEXT:    vmrs APSR_nzcv, fpscr
140 ; CHECK-NEXT:    vselge.f16 s0, s2, s0
141 ; CHECK-NEXT:    vmov r0, s0
142 ; CHECK-NEXT:    bx lr
143 entry:
144   %cmp = fcmp ole half %a, %b
145   %cond = select i1 %cmp, half %b, half %a
146   ret half %cond
149 define half @fp16_vmaxnm_u(half %a, half %b) {
150 ; CHECK-LABEL: fp16_vmaxnm_u:
151 ; CHECK:       @ %bb.0: @ %entry
152 ; CHECK-NEXT:    vmov.f16 s0, r0
153 ; CHECK-NEXT:    vmov.f16 s2, r1
154 ; CHECK-NEXT:    vcmp.f16 s2, s0
155 ; CHECK-NEXT:    vmrs APSR_nzcv, fpscr
156 ; CHECK-NEXT:    vselge.f16 s0, s2, s0
157 ; CHECK-NEXT:    vmov r0, s0
158 ; CHECK-NEXT:    bx lr
159 entry:
160   %cmp = fcmp ugt half %a, %b
161   %cond = select i1 %cmp, half %a, half %b
162   ret half %cond
165 define half @fp16_vmaxnm_uge(half %a, half %b) {
166 ; CHECK-LABEL: fp16_vmaxnm_uge:
167 ; CHECK:       @ %bb.0: @ %entry
168 ; CHECK-NEXT:    vmov.f16 s0, r0
169 ; CHECK-NEXT:    vmov.f16 s2, r1
170 ; CHECK-NEXT:    vcmp.f16 s2, s0
171 ; CHECK-NEXT:    vmrs APSR_nzcv, fpscr
172 ; CHECK-NEXT:    vselgt.f16 s0, s2, s0
173 ; CHECK-NEXT:    vmov r0, s0
174 ; CHECK-NEXT:    bx lr
175 entry:
176   %cmp = fcmp uge half %a, %b
177   %cond = select i1 %cmp, half %a, half %b
178   ret half %cond
181 define half @fp16_vmaxnm_u_rev(half %a, half %b) {
182 ; CHECK-LABEL: fp16_vmaxnm_u_rev:
183 ; CHECK:       @ %bb.0: @ %entry
184 ; CHECK-NEXT:    vmov.f16 s0, r1
185 ; CHECK-NEXT:    vmov.f16 s2, r0
186 ; CHECK-NEXT:    vcmp.f16 s2, s0
187 ; CHECK-NEXT:    vmrs APSR_nzcv, fpscr
188 ; CHECK-NEXT:    vselge.f16 s0, s2, s0
189 ; CHECK-NEXT:    vmov r0, s0
190 ; CHECK-NEXT:    bx lr
191 entry:
192   %cmp = fcmp ult half %a, %b
193   %cond = select i1 %cmp, half %b, half %a
194   ret half %cond
197 ; known non-NaNs
199 define half @fp16_vminnm_NNNo(half %a) {
200 ; CHECK-LABEL: fp16_vminnm_NNNo:
201 ; CHECK:       @ %bb.0: @ %entry
202 ; CHECK-NEXT:    vmov.f16 s0, r0
203 ; CHECK-NEXT:    vmov.f16 s2, #1.200000e+01
204 ; CHECK-NEXT:    vminnm.f16 s0, s0, s2
205 ; CHECK-NEXT:    vldr.16 s2, .LCPI12_0
206 ; CHECK-NEXT:    vcmp.f16 s0, s2
207 ; CHECK-NEXT:    vmrs APSR_nzcv, fpscr
208 ; CHECK-NEXT:    vselgt.f16 s0, s2, s0
209 ; CHECK-NEXT:    vmov r0, s0
210 ; CHECK-NEXT:    bx lr
211 ; CHECK-NEXT:    .p2align 1
212 ; CHECK-NEXT:  @ %bb.1:
213 ; CHECK-NEXT:  .LCPI12_0:
214 ; CHECK-NEXT:    .short 0x5040 @ half 34
215 entry:
216   %cmp1 = fcmp olt half %a, 12.
217   %cond1 = select i1 %cmp1, half %a, half 12.
218   %cmp2 = fcmp olt half 34., %cond1
219   %cond2 = select i1 %cmp2, half 34., half %cond1
220   ret half %cond2
223 define half @fp16_vminnm_NNNo_rev(half %a) {
224 ; CHECK-LABEL: fp16_vminnm_NNNo_rev:
225 ; CHECK:       @ %bb.0: @ %entry
226 ; CHECK-NEXT:    vldr.16 s2, .LCPI13_0
227 ; CHECK-NEXT:    vmov.f16 s0, r0
228 ; CHECK-NEXT:    vcmp.f16 s0, s2
229 ; CHECK-NEXT:    vmrs APSR_nzcv, fpscr
230 ; CHECK-NEXT:    vselgt.f16 s0, s2, s0
231 ; CHECK-NEXT:    vldr.16 s2, .LCPI13_1
232 ; CHECK-NEXT:    vminnm.f16 s0, s0, s2
233 ; CHECK-NEXT:    vmov r0, s0
234 ; CHECK-NEXT:    bx lr
235 ; CHECK-NEXT:    .p2align 1
236 ; CHECK-NEXT:  @ %bb.1:
237 ; CHECK-NEXT:  .LCPI13_0:
238 ; CHECK-NEXT:    .short 0x5300 @ half 56
239 ; CHECK-NEXT:  .LCPI13_1:
240 ; CHECK-NEXT:    .short 0x54e0 @ half 78
241 entry:
242   %cmp1 = fcmp ogt half %a, 56.
243   %cond1 = select i1 %cmp1, half 56., half %a
244   %cmp2 = fcmp ogt half 78., %cond1
245   %cond2 = select i1 %cmp2, half %cond1, half 78.
246   ret half %cond2
249 define half @fp16_vminnm_NNNu(half %b) {
250 ; CHECK-LABEL: fp16_vminnm_NNNu:
251 ; CHECK:       @ %bb.0: @ %entry
252 ; CHECK-NEXT:    vmov.f16 s0, r0
253 ; CHECK-NEXT:    vmov.f16 s2, #1.200000e+01
254 ; CHECK-NEXT:    vminnm.f16 s0, s0, s2
255 ; CHECK-NEXT:    vldr.16 s2, .LCPI14_0
256 ; CHECK-NEXT:    vcmp.f16 s0, s2
257 ; CHECK-NEXT:    vmrs APSR_nzcv, fpscr
258 ; CHECK-NEXT:    vselge.f16 s0, s2, s0
259 ; CHECK-NEXT:    vmov r0, s0
260 ; CHECK-NEXT:    bx lr
261 ; CHECK-NEXT:    .p2align 1
262 ; CHECK-NEXT:  @ %bb.1:
263 ; CHECK-NEXT:  .LCPI14_0:
264 ; CHECK-NEXT:    .short 0x5040 @ half 34
265 entry:
266   %cmp1 = fcmp ult half 12., %b
267   %cond1 = select i1 %cmp1, half 12., half %b
268   %cmp2 = fcmp ult half %cond1, 34.
269   %cond2 = select i1 %cmp2, half %cond1, half 34.
270   ret half %cond2
273 define half @fp16_vminnm_NNNule(half %b) {
274 ; CHECK-LABEL: fp16_vminnm_NNNule:
275 ; CHECK:       @ %bb.0: @ %entry
276 ; CHECK-NEXT:    vldr.16 s2, .LCPI15_0
277 ; CHECK-NEXT:    vmov.f16 s0, r0
278 ; CHECK-NEXT:    vminnm.f16 s0, s0, s2
279 ; CHECK-NEXT:    vldr.16 s2, .LCPI15_1
280 ; CHECK-NEXT:    vcmp.f16 s0, s2
281 ; CHECK-NEXT:    vmrs APSR_nzcv, fpscr
282 ; CHECK-NEXT:    vselgt.f16 s0, s2, s0
283 ; CHECK-NEXT:    vmov r0, s0
284 ; CHECK-NEXT:    bx lr
285 ; CHECK-NEXT:    .p2align 1
286 ; CHECK-NEXT:  @ %bb.1:
287 ; CHECK-NEXT:  .LCPI15_0:
288 ; CHECK-NEXT:    .short 0x5040 @ half 34
289 ; CHECK-NEXT:  .LCPI15_1:
290 ; CHECK-NEXT:    .short 0x5300 @ half 56
292 entry:
293   %cmp1 = fcmp ule half 34., %b
294   %cond1 = select i1 %cmp1, half 34., half %b
295   %cmp2 = fcmp ule half %cond1, 56.
296   %cond2 = select i1 %cmp2, half %cond1, half 56.
297   ret half %cond2
300 define half @fp16_vminnm_NNNu_rev(half %b) {
301 ; CHECK-LABEL: fp16_vminnm_NNNu_rev:
302 ; CHECK:       @ %bb.0: @ %entry
303 ; CHECK-NEXT:    vldr.16 s2, .LCPI16_0
304 ; CHECK-NEXT:    vmov.f16 s0, r0
305 ; CHECK-NEXT:    vcmp.f16 s0, s2
306 ; CHECK-NEXT:    vmrs APSR_nzcv, fpscr
307 ; CHECK-NEXT:    vselge.f16 s0, s2, s0
308 ; CHECK-NEXT:    vldr.16 s2, .LCPI16_1
309 ; CHECK-NEXT:    vminnm.f16 s0, s0, s2
310 ; CHECK-NEXT:    vmov r0, s0
311 ; CHECK-NEXT:    bx lr
312 ; CHECK-NEXT:    .p2align 1
313 ; CHECK-NEXT:  @ %bb.1:
314 ; CHECK-NEXT:  .LCPI16_0:
315 ; CHECK-NEXT:    .short 0x5300 @ half 56
316 ; CHECK-NEXT:  .LCPI16_1:
317 ; CHECK-NEXT:    .short 0x54e0 @ half 78
320 entry:
321   %cmp1 = fcmp ugt half 56., %b
322   %cond1 = select i1 %cmp1, half %b, half 56.
323   %cmp2 = fcmp ugt half %cond1, 78.
324   %cond2 = select i1 %cmp2, half 78., half %cond1
325   ret half %cond2
328 define half @fp16_vmaxnm_NNNo(half %a) {
329 ; CHECK-LABEL: fp16_vmaxnm_NNNo:
330 ; CHECK:       @ %bb.0: @ %entry
331 ; CHECK-NEXT:    vmov.f16 s0, r0
332 ; CHECK-NEXT:    vmov.f16 s2, #1.200000e+01
333 ; CHECK-NEXT:    vmaxnm.f16 s0, s0, s2
334 ; CHECK-NEXT:    vldr.16 s2, .LCPI17_0
335 ; CHECK-NEXT:    vcmp.f16 s2, s0
336 ; CHECK-NEXT:    vmrs APSR_nzcv, fpscr
337 ; CHECK-NEXT:    vselgt.f16 s0, s2, s0
338 ; CHECK-NEXT:    vmov r0, s0
339 ; CHECK-NEXT:    bx lr
340 ; CHECK-NEXT:    .p2align 1
341 ; CHECK-NEXT:  @ %bb.1:
342 ; CHECK-NEXT:  .LCPI17_0:
343 ; CHECK-NEXT:    .short 0x5040 @ half 34
344 entry:
345   %cmp1 = fcmp ogt half %a, 12.
346   %cond1 = select i1 %cmp1, half %a, half 12.
347   %cmp2 = fcmp ogt half 34., %cond1
348   %cond2 = select i1 %cmp2, half 34., half %cond1
349   ret half %cond2
352 define half @fp16_vmaxnm_NNNoge(half %a) {
353 ; CHECK-LABEL: fp16_vmaxnm_NNNoge:
354 ; CHECK:       @ %bb.0: @ %entry
355 ; CHECK-NEXT:    vldr.16 s2, .LCPI18_0
356 ; CHECK-NEXT:    vmov.f16 s0, r0
357 ; CHECK-NEXT:    vmaxnm.f16 s0, s0, s2
358 ; CHECK-NEXT:    vldr.16 s2, .LCPI18_1
359 ; CHECK-NEXT:    vcmp.f16 s2, s0
360 ; CHECK-NEXT:    vmrs APSR_nzcv, fpscr
361 ; CHECK-NEXT:    vselge.f16 s0, s2, s0
362 ; CHECK-NEXT:    vmov r0, s0
363 ; CHECK-NEXT:    bx lr
364 ; CHECK-NEXT:    .p2align 1
365 ; CHECK-NEXT:  @ %bb.1:
366 ; CHECK-NEXT:  .LCPI18_0:
367 ; CHECK-NEXT:    .short 0x5040 @ half 34
368 ; CHECK-NEXT:  .LCPI18_1:
369 ; CHECK-NEXT:    .short 0x5300 @ half 56
370 entry:
371   %cmp1 = fcmp oge half %a, 34.
372   %cond1 = select i1 %cmp1, half %a, half 34.
373   %cmp2 = fcmp oge half 56., %cond1
374   %cond2 = select i1 %cmp2, half 56., half %cond1
375   ret half %cond2
378 define half @fp16_vmaxnm_NNNo_rev(half %a) {
379 ; CHECK-LABEL: fp16_vmaxnm_NNNo_rev:
380 ; CHECK:       @ %bb.0: @ %entry
381 ; CHECK-NEXT:    vldr.16 s2, .LCPI19_0
382 ; CHECK-NEXT:    vmov.f16 s0, r0
383 ; CHECK-NEXT:    vcmp.f16 s2, s0
384 ; CHECK-NEXT:    vmrs APSR_nzcv, fpscr
385 ; CHECK-NEXT:    vselgt.f16 s0, s2, s0
386 ; CHECK-NEXT:    vldr.16 s2, .LCPI19_1
387 ; CHECK-NEXT:    vmaxnm.f16 s0, s0, s2
388 ; CHECK-NEXT:    vmov r0, s0
389 ; CHECK-NEXT:    bx lr
390 ; CHECK-NEXT:    .p2align 1
391 ; CHECK-NEXT:  @ %bb.1:
392 ; CHECK-NEXT:  .LCPI19_0:
393 ; CHECK-NEXT:    .short 0x5300 @ half 56
394 ; CHECK-NEXT:  .LCPI19_1:
395 ; CHECK-NEXT:    .short 0x54e0 @ half 78
396 entry:
397   %cmp1 = fcmp olt half %a, 56.
398   %cond1 = select i1 %cmp1, half 56., half %a
399   %cmp2 = fcmp olt half 78., %cond1
400   %cond2 = select i1 %cmp2, half %cond1, half 78.
401   ret half %cond2
404 define half @fp16_vmaxnm_NNNole_rev(half %a) {
405 ; CHECK-LABEL: fp16_vmaxnm_NNNole_rev:
406 ; CHECK:       @ %bb.0: @ %entry
407 ; CHECK-NEXT:    vldr.16 s2, .LCPI20_0
408 ; CHECK-NEXT:    vmov.f16 s0, r0
409 ; CHECK-NEXT:    vcmp.f16 s2, s0
410 ; CHECK-NEXT:    vmrs APSR_nzcv, fpscr
411 ; CHECK-NEXT:    vselge.f16 s0, s2, s0
412 ; CHECK-NEXT:    vldr.16 s2, .LCPI20_1
413 ; CHECK-NEXT:    vmaxnm.f16 s0, s0, s2
414 ; CHECK-NEXT:    vmov r0, s0
415 ; CHECK-NEXT:    bx lr
416 ; CHECK-NEXT:    .p2align 1
417 ; CHECK-NEXT:  @ %bb.1:
418 ; CHECK-NEXT:  .LCPI20_0:
419 ; CHECK-NEXT:    .short 0x54e0 @ half 78
420 ; CHECK-NEXT:  .LCPI20_1:
421 ; CHECK-NEXT:    .short 0x55a0 @ half 90
422 entry:
423   %cmp1 = fcmp ole half %a, 78.
424   %cond1 = select i1 %cmp1, half 78., half %a
425   %cmp2 = fcmp ole half 90., %cond1
426   %cond2 = select i1 %cmp2, half %cond1, half 90.
427   ret half %cond2
430 define half @fp16_vmaxnm_NNNu(half %b) {
431 ; CHECK-LABEL: fp16_vmaxnm_NNNu:
432 ; CHECK:       @ %bb.0: @ %entry
433 ; CHECK-NEXT:    vmov.f16 s0, r0
434 ; CHECK-NEXT:    vmov.f16 s2, #1.200000e+01
435 ; CHECK-NEXT:    vmaxnm.f16 s0, s0, s2
436 ; CHECK-NEXT:    vldr.16 s2, .LCPI21_0
437 ; CHECK-NEXT:    vcmp.f16 s2, s0
438 ; CHECK-NEXT:    vmrs APSR_nzcv, fpscr
439 ; CHECK-NEXT:    vselge.f16 s0, s2, s0
440 ; CHECK-NEXT:    vmov r0, s0
441 ; CHECK-NEXT:    bx lr
442 ; CHECK-NEXT:    .p2align 1
443 ; CHECK-NEXT:  @ %bb.1:
444 ; CHECK-NEXT:  .LCPI21_0:
445 ; CHECK-NEXT:    .short 0x5040 @ half 34
446 entry:
447   %cmp1 = fcmp ugt half 12., %b
448   %cond1 = select i1 %cmp1, half 12., half %b
449   %cmp2 = fcmp ugt half %cond1, 34.
450   %cond2 = select i1 %cmp2, half %cond1, half 34.
451   ret half %cond2
454 define half @fp16_vmaxnm_NNNuge(half %b) {
455 ; CHECK-LABEL: fp16_vmaxnm_NNNuge:
456 ; CHECK:       @ %bb.0: @ %entry
457 ; CHECK-NEXT:    vldr.16 s2, .LCPI22_0
458 ; CHECK-NEXT:    vmov.f16 s0, r0
459 ; CHECK-NEXT:    vmaxnm.f16 s0, s0, s2
460 ; CHECK-NEXT:    vldr.16 s2, .LCPI22_1
461 ; CHECK-NEXT:    vcmp.f16 s2, s0
462 ; CHECK-NEXT:    vmrs APSR_nzcv, fpscr
463 ; CHECK-NEXT:    vselgt.f16 s0, s2, s0
464 ; CHECK-NEXT:    vmov r0, s0
465 ; CHECK-NEXT:    bx lr
466 ; CHECK-NEXT:    .p2align 1
467 ; CHECK-NEXT:  @ %bb.1:
468 ; CHECK-NEXT:  .LCPI22_0:
469 ; CHECK-NEXT:    .short 0x5040 @ half 34
470 ; CHECK-NEXT:  .LCPI22_1:
471 ; CHECK-NEXT:    .short 0x5300 @ half 56
472 entry:
473   %cmp1 = fcmp uge half 34., %b
474   %cond1 = select i1 %cmp1, half 34., half %b
475   %cmp2 = fcmp uge half %cond1, 56.
476   %cond2 = select i1 %cmp2, half %cond1, half 56.
477   ret half %cond2
480 define half @fp16_vminmaxnm_neg0(half %a) {
481 ; CHECK-LABEL: fp16_vminmaxnm_neg0:
482 ; CHECK:       @ %bb.0: @ %entry
483 ; CHECK-NEXT:    vldr.16 s0, .LCPI23_0
484 ; CHECK-NEXT:    vmov.f16 s2, r0
485 ; CHECK-NEXT:    vminnm.f16 s2, s2, s0
486 ; CHECK-NEXT:    vcmp.f16 s0, s2
487 ; CHECK-NEXT:    vmrs APSR_nzcv, fpscr
488 ; CHECK-NEXT:    vselge.f16 s0, s0, s2
489 ; CHECK-NEXT:    vmov r0, s0
490 ; CHECK-NEXT:    bx lr
491 ; CHECK-NEXT:    .p2align 1
492 ; CHECK-NEXT:  @ %bb.1:
493 ; CHECK-NEXT:  .LCPI23_0:
494 ; CHECK-NEXT:    .short 0x8000 @ half -0
495 entry:
496   %cmp1 = fcmp olt half %a, -0.
497   %cond1 = select i1 %cmp1, half %a, half -0.
498   %cmp2 = fcmp ugt half %cond1, -0.
499   %cond2 = select i1 %cmp2, half %cond1, half -0.
500   ret half %cond2
503 define half @fp16_vminmaxnm_e_0(half %a) {
504 ; CHECK-LABEL: fp16_vminmaxnm_e_0:
505 ; CHECK:       @ %bb.0: @ %entry
506 ; CHECK-NEXT:    vmov.f16 s0, r0
507 ; CHECK-NEXT:    vldr.16 s2, .LCPI24_0
508 ; CHECK-NEXT:    vcmp.f16 s0, #0
509 ; CHECK-NEXT:    vmrs APSR_nzcv, fpscr
510 ; CHECK-NEXT:    vselge.f16 s0, s2, s0
511 ; CHECK-NEXT:    vmaxnm.f16 s0, s0, s2
512 ; CHECK-NEXT:    vmov r0, s0
513 ; CHECK-NEXT:    bx lr
514 ; CHECK-NEXT:    .p2align 1
515 ; CHECK-NEXT:  @ %bb.1:
516 ; CHECK-NEXT:  .LCPI24_0:
517 ; CHECK-NEXT:    .short 0x0000 @ half 0
518 entry:
519   %cmp1 = fcmp nsz ole half 0., %a
520   %cond1 = select i1 %cmp1, half 0., half %a
521   %cmp2 = fcmp nsz uge half 0., %cond1
522   %cond2 = select i1 %cmp2, half 0., half %cond1
523   ret half %cond2
526 define half @fp16_vminmaxnm_e_neg0(half %a) {
527 ; CHECK-LABEL: fp16_vminmaxnm_e_neg0:
528 ; CHECK:       @ %bb.0: @ %entry
529 ; CHECK-NEXT:    vldr.16 s0, .LCPI25_0
530 ; CHECK-NEXT:    vmov.f16 s2, r0
531 ; CHECK-NEXT:    vminnm.f16 s2, s2, s0
532 ; CHECK-NEXT:    vcmp.f16 s0, s2
533 ; CHECK-NEXT:    vmrs APSR_nzcv, fpscr
534 ; CHECK-NEXT:    vselge.f16 s0, s0, s2
535 ; CHECK-NEXT:    vmov r0, s0
536 ; CHECK-NEXT:    bx lr
537 ; CHECK-NEXT:    .p2align 1
538 ; CHECK-NEXT:  @ %bb.1:
539 ; CHECK-NEXT:  .LCPI25_0:
540 ; CHECK-NEXT:    .short 0x8000 @ half -0
541 entry:
542   %cmp1 = fcmp nsz ule half -0., %a
543   %cond1 = select i1 %cmp1, half -0., half %a
544   %cmp2 = fcmp nsz oge half -0., %cond1
545   %cond2 = select i1 %cmp2, half -0., half %cond1
546   ret half %cond2