[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / CodeGen / AArch64 / min-max.ll
blob95b3f85af0ae9379b2c516802fc15d9b8942fd4c
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=aarch64-eabi %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-ISEL
3 ; RUN: llc -mtriple=aarch64-eabi -global-isel %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-GLOBAL
6 ; These tests just check that the plumbing is in place for @llvm.smax, @llvm.umax,
7 ; @llvm.smin, @llvm.umin.
9 declare i8 @llvm.smax.i8(i8 %a, i8 %b) readnone
11 define i8 @smaxi8(i8 %a, i8 %b) {
12 ; CHECK-ISEL-LABEL: smaxi8:
13 ; CHECK-ISEL:       // %bb.0:
14 ; CHECK-ISEL-NEXT:    sxtb w8, w1
15 ; CHECK-ISEL-NEXT:    sxtb w9, w0
16 ; CHECK-ISEL-NEXT:    cmp w9, w8
17 ; CHECK-ISEL-NEXT:    csel w0, w9, w8, gt
18 ; CHECK-ISEL-NEXT:    ret
20 ; CHECK-GLOBAL-LABEL: smaxi8:
21 ; CHECK-GLOBAL:       // %bb.0:
22 ; CHECK-GLOBAL-NEXT:    sxtb w8, w0
23 ; CHECK-GLOBAL-NEXT:    cmp w8, w1, sxtb
24 ; CHECK-GLOBAL-NEXT:    csel w0, w0, w1, gt
25 ; CHECK-GLOBAL-NEXT:    ret
26   %c = call i8 @llvm.smax.i8(i8 %a, i8 %b)
27   ret i8 %c
30 declare i16 @llvm.smax.i16(i16 %a, i16 %b) readnone
32 define i16 @smaxi16(i16 %a, i16 %b) {
33 ; CHECK-ISEL-LABEL: smaxi16:
34 ; CHECK-ISEL:       // %bb.0:
35 ; CHECK-ISEL-NEXT:    sxth w8, w1
36 ; CHECK-ISEL-NEXT:    sxth w9, w0
37 ; CHECK-ISEL-NEXT:    cmp w9, w8
38 ; CHECK-ISEL-NEXT:    csel w0, w9, w8, gt
39 ; CHECK-ISEL-NEXT:    ret
41 ; CHECK-GLOBAL-LABEL: smaxi16:
42 ; CHECK-GLOBAL:       // %bb.0:
43 ; CHECK-GLOBAL-NEXT:    sxth w8, w0
44 ; CHECK-GLOBAL-NEXT:    cmp w8, w1, sxth
45 ; CHECK-GLOBAL-NEXT:    csel w0, w0, w1, gt
46 ; CHECK-GLOBAL-NEXT:    ret
47   %c = call i16 @llvm.smax.i16(i16 %a, i16 %b)
48   ret i16 %c
51 declare i32 @llvm.smax.i32(i32 %a, i32 %b) readnone
53 define i32 @smaxi32(i32 %a, i32 %b) {
54 ; CHECK-LABEL: smaxi32:
55 ; CHECK:       // %bb.0:
56 ; CHECK-NEXT:    cmp w0, w1
57 ; CHECK-NEXT:    csel w0, w0, w1, gt
58 ; CHECK-NEXT:    ret
59   %c = call i32 @llvm.smax.i32(i32 %a, i32 %b)
60   ret i32 %c
63 declare i64 @llvm.smax.i64(i64 %a, i64 %b) readnone
65 define i64 @smaxi64(i64 %a, i64 %b) {
66 ; CHECK-LABEL: smaxi64:
67 ; CHECK:       // %bb.0:
68 ; CHECK-NEXT:    cmp x0, x1
69 ; CHECK-NEXT:    csel x0, x0, x1, gt
70 ; CHECK-NEXT:    ret
71   %c = call i64 @llvm.smax.i64(i64 %a, i64 %b)
72   ret i64 %c
75 declare <8 x i8> @llvm.smax.v8i8(<8 x i8> %a, <8 x i8> %b) readnone
77 define <8 x i8> @smax8i8(<8 x i8> %a, <8 x i8> %b) {
78 ; CHECK-LABEL: smax8i8:
79 ; CHECK:       // %bb.0:
80 ; CHECK-NEXT:    smax v0.8b, v0.8b, v1.8b
81 ; CHECK-NEXT:    ret
82   %c = call <8 x i8> @llvm.smax.v8i8(<8 x i8> %a, <8 x i8> %b)
83   ret <8 x i8> %c
86 declare <16 x i8> @llvm.smax.v16i8(<16 x i8> %a, <16 x i8> %b) readnone
88 define <16 x i8> @smax16i8(<16 x i8> %a, <16 x i8> %b) {
89 ; CHECK-LABEL: smax16i8:
90 ; CHECK:       // %bb.0:
91 ; CHECK-NEXT:    smax v0.16b, v0.16b, v1.16b
92 ; CHECK-NEXT:    ret
93   %c = call <16 x i8> @llvm.smax.v16i8(<16 x i8> %a, <16 x i8> %b)
94   ret <16 x i8> %c
97 declare <32 x i8> @llvm.smax.v32i8(<32 x i8> %a, <32 x i8> %b) readnone
99 define void @smax32i8(<32 x i8> %a, <32 x i8> %b, <32 x i8>* %p) {
100 ; CHECK-LABEL: smax32i8:
101 ; CHECK:       // %bb.0:
102 ; CHECK-NEXT:    smax v0.16b, v0.16b, v2.16b
103 ; CHECK-NEXT:    smax v1.16b, v1.16b, v3.16b
104 ; CHECK-NEXT:    stp q0, q1, [x0]
105 ; CHECK-NEXT:    ret
106   %c = call <32 x i8> @llvm.smax.v32i8(<32 x i8> %a, <32 x i8> %b)
107   store <32 x i8> %c, <32 x i8>* %p
108   ret void
111 declare <4 x i16> @llvm.smax.v4i16(<4 x i16> %a, <4 x i16> %b) readnone
113 define <4 x i16> @smax4i16(<4 x i16> %a, <4 x i16> %b) {
114 ; CHECK-LABEL: smax4i16:
115 ; CHECK:       // %bb.0:
116 ; CHECK-NEXT:    smax v0.4h, v0.4h, v1.4h
117 ; CHECK-NEXT:    ret
118   %c = call <4 x i16> @llvm.smax.v4i16(<4 x i16> %a, <4 x i16> %b)
119   ret <4 x i16> %c
122 declare <8 x i16> @llvm.smax.v8i16(<8 x i16> %a, <8 x i16> %b) readnone
124 define <8 x i16> @smax8i16(<8 x i16> %a, <8 x i16> %b) {
125 ; CHECK-LABEL: smax8i16:
126 ; CHECK:       // %bb.0:
127 ; CHECK-NEXT:    smax v0.8h, v0.8h, v1.8h
128 ; CHECK-NEXT:    ret
129   %c = call <8 x i16> @llvm.smax.v8i16(<8 x i16> %a, <8 x i16> %b)
130   ret <8 x i16> %c
133 declare <16 x i16> @llvm.smax.v16i16(<16 x i16> %a, <16 x i16> %b) readnone
135 define void @smax16i16(<16 x i16> %a, <16 x i16> %b, <16 x i16>* %p) {
136 ; CHECK-LABEL: smax16i16:
137 ; CHECK:       // %bb.0:
138 ; CHECK-NEXT:    smax v0.8h, v0.8h, v2.8h
139 ; CHECK-NEXT:    smax v1.8h, v1.8h, v3.8h
140 ; CHECK-NEXT:    stp q0, q1, [x0]
141 ; CHECK-NEXT:    ret
142   %c = call <16 x i16> @llvm.smax.v16i16(<16 x i16> %a, <16 x i16> %b)
143   store <16 x i16> %c, <16 x i16>* %p
144   ret void
147 declare <2 x i32> @llvm.smax.v2i32(<2 x i32> %a, <2 x i32> %b) readnone
149 define <2 x i32> @smax2i32(<2 x i32> %a, <2 x i32> %b) {
150 ; CHECK-LABEL: smax2i32:
151 ; CHECK:       // %bb.0:
152 ; CHECK-NEXT:    smax v0.2s, v0.2s, v1.2s
153 ; CHECK-NEXT:    ret
154   %c = call <2 x i32> @llvm.smax.v2i32(<2 x i32> %a, <2 x i32> %b)
155   ret <2 x i32> %c
158 declare <4 x i32> @llvm.smax.v4i32(<4 x i32> %a, <4 x i32> %b) readnone
160 define <4 x i32> @smax4i32(<4 x i32> %a, <4 x i32> %b) {
161 ; CHECK-LABEL: smax4i32:
162 ; CHECK:       // %bb.0:
163 ; CHECK-NEXT:    smax v0.4s, v0.4s, v1.4s
164 ; CHECK-NEXT:    ret
165   %c = call <4 x i32> @llvm.smax.v4i32(<4 x i32> %a, <4 x i32> %b)
166   ret <4 x i32> %c
169 declare <8 x i32> @llvm.smax.v8i32(<8 x i32> %a, <8 x i32> %b) readnone
171 define void @smax8i32(<8 x i32> %a, <8 x i32> %b, <8 x i32>* %p) {
172 ; CHECK-LABEL: smax8i32:
173 ; CHECK:       // %bb.0:
174 ; CHECK-NEXT:    smax v0.4s, v0.4s, v2.4s
175 ; CHECK-NEXT:    smax v1.4s, v1.4s, v3.4s
176 ; CHECK-NEXT:    stp q0, q1, [x0]
177 ; CHECK-NEXT:    ret
178   %c = call <8 x i32>@llvm.smax.v8i32(<8 x i32> %a, <8 x i32> %b)
179   store <8 x i32> %c, <8 x i32>* %p
180   ret void
183 declare <1 x i64> @llvm.smax.v1i64(<1 x i64> %a, <1 x i64> %b) readnone
185 define <1 x i64> @smax1i64(<1 x i64> %a, <1 x i64> %b) {
186 ; CHECK-ISEL-LABEL: smax1i64:
187 ; CHECK-ISEL:       // %bb.0:
188 ; CHECK-ISEL-NEXT:    cmgt d2, d0, d1
189 ; CHECK-ISEL-NEXT:    bif v0.8b, v1.8b, v2.8b
190 ; CHECK-ISEL-NEXT:    ret
192 ; CHECK-GLOBAL-LABEL: smax1i64:
193 ; CHECK-GLOBAL:       // %bb.0:
194 ; CHECK-GLOBAL-NEXT:    fmov x8, d0
195 ; CHECK-GLOBAL-NEXT:    fmov x9, d1
196 ; CHECK-GLOBAL-NEXT:    cmp x8, x9
197 ; CHECK-GLOBAL-NEXT:    fcsel d0, d0, d1, gt
198 ; CHECK-GLOBAL-NEXT:    ret
199   %c = call <1 x i64> @llvm.smax.v1i64(<1 x i64> %a, <1 x i64> %b)
200   ret <1 x i64> %c
203 declare <2 x i64> @llvm.smax.v2i64(<2 x i64> %a, <2 x i64> %b) readnone
205 define <2 x i64> @smax2i64(<2 x i64> %a, <2 x i64> %b) {
206 ; CHECK-ISEL-LABEL: smax2i64:
207 ; CHECK-ISEL:       // %bb.0:
208 ; CHECK-ISEL-NEXT:    cmgt v2.2d, v0.2d, v1.2d
209 ; CHECK-ISEL-NEXT:    bif v0.16b, v1.16b, v2.16b
210 ; CHECK-ISEL-NEXT:    ret
212 ; CHECK-GLOBAL-LABEL: smax2i64:
213 ; CHECK-GLOBAL:       // %bb.0:
214 ; CHECK-GLOBAL-NEXT:    cmgt v2.2d, v0.2d, v1.2d
215 ; CHECK-GLOBAL-NEXT:    shl v2.2d, v2.2d, #63
216 ; CHECK-GLOBAL-NEXT:    sshr v2.2d, v2.2d, #63
217 ; CHECK-GLOBAL-NEXT:    bif v0.16b, v1.16b, v2.16b
218 ; CHECK-GLOBAL-NEXT:    ret
219   %c = call <2 x i64> @llvm.smax.v2i64(<2 x i64> %a, <2 x i64> %b)
220   ret <2 x i64> %c
223 declare <4 x i64> @llvm.smax.v4i64(<4 x i64> %a, <4 x i64> %b) readnone
225 define void @smax4i64(<4 x i64> %a, <4 x i64> %b, <4 x i64>* %p) {
226 ; CHECK-ISEL-LABEL: smax4i64:
227 ; CHECK-ISEL:       // %bb.0:
228 ; CHECK-ISEL-NEXT:    cmgt v4.2d, v0.2d, v2.2d
229 ; CHECK-ISEL-NEXT:    cmgt v5.2d, v1.2d, v3.2d
230 ; CHECK-ISEL-NEXT:    bif v0.16b, v2.16b, v4.16b
231 ; CHECK-ISEL-NEXT:    bif v1.16b, v3.16b, v5.16b
232 ; CHECK-ISEL-NEXT:    stp q0, q1, [x0]
233 ; CHECK-ISEL-NEXT:    ret
235 ; CHECK-GLOBAL-LABEL: smax4i64:
236 ; CHECK-GLOBAL:       // %bb.0:
237 ; CHECK-GLOBAL-NEXT:    cmgt v4.2d, v0.2d, v2.2d
238 ; CHECK-GLOBAL-NEXT:    cmgt v5.2d, v1.2d, v3.2d
239 ; CHECK-GLOBAL-NEXT:    shl v4.2d, v4.2d, #63
240 ; CHECK-GLOBAL-NEXT:    shl v5.2d, v5.2d, #63
241 ; CHECK-GLOBAL-NEXT:    sshr v4.2d, v4.2d, #63
242 ; CHECK-GLOBAL-NEXT:    sshr v5.2d, v5.2d, #63
243 ; CHECK-GLOBAL-NEXT:    bif v0.16b, v2.16b, v4.16b
244 ; CHECK-GLOBAL-NEXT:    bif v1.16b, v3.16b, v5.16b
245 ; CHECK-GLOBAL-NEXT:    stp q0, q1, [x0]
246 ; CHECK-GLOBAL-NEXT:    ret
247   %c = call <4 x i64> @llvm.smax.v4i64(<4 x i64> %a, <4 x i64> %b)
248   store <4 x i64> %c, <4 x i64>* %p
249   ret void
252 declare i8 @llvm.umax.i8(i8 %a, i8 %b) readnone
254 define i8 @umaxi8(i8 %a, i8 %b) {
255 ; CHECK-ISEL-LABEL: umaxi8:
256 ; CHECK-ISEL:       // %bb.0:
257 ; CHECK-ISEL-NEXT:    and w8, w1, #0xff
258 ; CHECK-ISEL-NEXT:    and w9, w0, #0xff
259 ; CHECK-ISEL-NEXT:    cmp w9, w8
260 ; CHECK-ISEL-NEXT:    csel w0, w9, w8, hi
261 ; CHECK-ISEL-NEXT:    ret
263 ; CHECK-GLOBAL-LABEL: umaxi8:
264 ; CHECK-GLOBAL:       // %bb.0:
265 ; CHECK-GLOBAL-NEXT:    and w8, w0, #0xff
266 ; CHECK-GLOBAL-NEXT:    cmp w8, w1, uxtb
267 ; CHECK-GLOBAL-NEXT:    csel w0, w0, w1, hi
268 ; CHECK-GLOBAL-NEXT:    ret
269   %c = call i8 @llvm.umax.i8(i8 %a, i8 %b)
270   ret i8 %c
273 declare i16 @llvm.umax.i16(i16 %a, i16 %b) readnone
275 define i16 @umaxi16(i16 %a, i16 %b) {
276 ; CHECK-ISEL-LABEL: umaxi16:
277 ; CHECK-ISEL:       // %bb.0:
278 ; CHECK-ISEL-NEXT:    and w8, w1, #0xffff
279 ; CHECK-ISEL-NEXT:    and w9, w0, #0xffff
280 ; CHECK-ISEL-NEXT:    cmp w9, w8
281 ; CHECK-ISEL-NEXT:    csel w0, w9, w8, hi
282 ; CHECK-ISEL-NEXT:    ret
284 ; CHECK-GLOBAL-LABEL: umaxi16:
285 ; CHECK-GLOBAL:       // %bb.0:
286 ; CHECK-GLOBAL-NEXT:    and w8, w0, #0xffff
287 ; CHECK-GLOBAL-NEXT:    cmp w8, w1, uxth
288 ; CHECK-GLOBAL-NEXT:    csel w0, w0, w1, hi
289 ; CHECK-GLOBAL-NEXT:    ret
290   %c = call i16 @llvm.umax.i16(i16 %a, i16 %b)
291   ret i16 %c
294 declare i32 @llvm.umax.i32(i32 %a, i32 %b) readnone
296 define i32 @umaxi32(i32 %a, i32 %b) {
297 ; CHECK-LABEL: umaxi32:
298 ; CHECK:       // %bb.0:
299 ; CHECK-NEXT:    cmp w0, w1
300 ; CHECK-NEXT:    csel w0, w0, w1, hi
301 ; CHECK-NEXT:    ret
302   %c = call i32 @llvm.umax.i32(i32 %a, i32 %b)
303   ret i32 %c
306 declare i64 @llvm.umax.i64(i64 %a, i64 %b) readnone
308 define i64 @umaxi64(i64 %a, i64 %b) {
309 ; CHECK-LABEL: umaxi64:
310 ; CHECK:       // %bb.0:
311 ; CHECK-NEXT:    cmp x0, x1
312 ; CHECK-NEXT:    csel x0, x0, x1, hi
313 ; CHECK-NEXT:    ret
314   %c = call i64 @llvm.umax.i64(i64 %a, i64 %b)
315   ret i64 %c
318 declare <8 x i8> @llvm.umax.v8i8(<8 x i8> %a, <8 x i8> %b) readnone
320 define <8 x i8> @umax8i8(<8 x i8> %a, <8 x i8> %b) {
321 ; CHECK-LABEL: umax8i8:
322 ; CHECK:       // %bb.0:
323 ; CHECK-NEXT:    umax v0.8b, v0.8b, v1.8b
324 ; CHECK-NEXT:    ret
325   %c = call <8 x i8> @llvm.umax.v8i8(<8 x i8> %a, <8 x i8> %b)
326   ret <8 x i8> %c
329 declare <16 x i8> @llvm.umax.v16i8(<16 x i8> %a, <16 x i8> %b) readnone
331 define <16 x i8> @umax16i8(<16 x i8> %a, <16 x i8> %b) {
332 ; CHECK-LABEL: umax16i8:
333 ; CHECK:       // %bb.0:
334 ; CHECK-NEXT:    umax v0.16b, v0.16b, v1.16b
335 ; CHECK-NEXT:    ret
336   %c = call <16 x i8> @llvm.umax.v16i8(<16 x i8> %a, <16 x i8> %b)
337   ret <16 x i8> %c
340 declare <32 x i8> @llvm.umax.v32i8(<32 x i8> %a, <32 x i8> %b) readnone
342 define void @umax32i8(<32 x i8> %a, <32 x i8> %b, <32 x i8>* %p) {
343 ; CHECK-LABEL: umax32i8:
344 ; CHECK:       // %bb.0:
345 ; CHECK-NEXT:    umax v0.16b, v0.16b, v2.16b
346 ; CHECK-NEXT:    umax v1.16b, v1.16b, v3.16b
347 ; CHECK-NEXT:    stp q0, q1, [x0]
348 ; CHECK-NEXT:    ret
349   %c = call <32 x i8> @llvm.umax.v32i8(<32 x i8> %a, <32 x i8> %b)
350   store <32 x i8> %c, <32 x i8>* %p
351   ret void
354 declare <4 x i16> @llvm.umax.v4i16(<4 x i16> %a, <4 x i16> %b) readnone
356 define <4 x i16> @umax4i16(<4 x i16> %a, <4 x i16> %b) {
357 ; CHECK-LABEL: umax4i16:
358 ; CHECK:       // %bb.0:
359 ; CHECK-NEXT:    umax v0.4h, v0.4h, v1.4h
360 ; CHECK-NEXT:    ret
361   %c = call <4 x i16> @llvm.umax.v4i16(<4 x i16> %a, <4 x i16> %b)
362   ret <4 x i16> %c
365 declare <8 x i16> @llvm.umax.v8i16(<8 x i16> %a, <8 x i16> %b) readnone
367 define <8 x i16> @umax8i16(<8 x i16> %a, <8 x i16> %b) {
368 ; CHECK-LABEL: umax8i16:
369 ; CHECK:       // %bb.0:
370 ; CHECK-NEXT:    umax v0.8h, v0.8h, v1.8h
371 ; CHECK-NEXT:    ret
372   %c = call <8 x i16> @llvm.umax.v8i16(<8 x i16> %a, <8 x i16> %b)
373   ret <8 x i16> %c
376 declare <16 x i16> @llvm.umax.v16i16(<16 x i16> %a, <16 x i16> %b) readnone
378 define void @umax16i16(<16 x i16> %a, <16 x i16> %b, <16 x i16>* %p) {
379 ; CHECK-LABEL: umax16i16:
380 ; CHECK:       // %bb.0:
381 ; CHECK-NEXT:    umax v0.8h, v0.8h, v2.8h
382 ; CHECK-NEXT:    umax v1.8h, v1.8h, v3.8h
383 ; CHECK-NEXT:    stp q0, q1, [x0]
384 ; CHECK-NEXT:    ret
385   %c = call <16 x i16> @llvm.umax.v16i16(<16 x i16> %a, <16 x i16> %b)
386   store <16 x i16> %c, <16 x i16>* %p
387   ret void
390 declare <2 x i32> @llvm.umax.v2i32(<2 x i32> %a, <2 x i32> %b) readnone
392 define <2 x i32> @umax2i32(<2 x i32> %a, <2 x i32> %b) {
393 ; CHECK-LABEL: umax2i32:
394 ; CHECK:       // %bb.0:
395 ; CHECK-NEXT:    umax v0.2s, v0.2s, v1.2s
396 ; CHECK-NEXT:    ret
397   %c = call <2 x i32> @llvm.umax.v2i32(<2 x i32> %a, <2 x i32> %b)
398   ret <2 x i32> %c
401 declare <4 x i32> @llvm.umax.v4i32(<4 x i32> %a, <4 x i32> %b) readnone
403 define <4 x i32> @umax4i32(<4 x i32> %a, <4 x i32> %b) {
404 ; CHECK-LABEL: umax4i32:
405 ; CHECK:       // %bb.0:
406 ; CHECK-NEXT:    umax v0.4s, v0.4s, v1.4s
407 ; CHECK-NEXT:    ret
408   %c = call <4 x i32> @llvm.umax.v4i32(<4 x i32> %a, <4 x i32> %b)
409   ret <4 x i32> %c
412 declare <8 x i32> @llvm.umax.v8i32(<8 x i32> %a, <8 x i32> %b) readnone
414 define void @umax8i32(<8 x i32> %a, <8 x i32> %b, <8 x i32>* %p) {
415 ; CHECK-LABEL: umax8i32:
416 ; CHECK:       // %bb.0:
417 ; CHECK-NEXT:    umax v0.4s, v0.4s, v2.4s
418 ; CHECK-NEXT:    umax v1.4s, v1.4s, v3.4s
419 ; CHECK-NEXT:    stp q0, q1, [x0]
420 ; CHECK-NEXT:    ret
421   %c = call <8 x i32>@llvm.umax.v8i32(<8 x i32> %a, <8 x i32> %b)
422   store <8 x i32> %c, <8 x i32>* %p
423   ret void
426 declare <1 x i64> @llvm.umax.v1i64(<1 x i64> %a, <1 x i64> %b) readnone
428 define <1 x i64> @umax1i64(<1 x i64> %a, <1 x i64> %b) {
429 ; CHECK-ISEL-LABEL: umax1i64:
430 ; CHECK-ISEL:       // %bb.0:
431 ; CHECK-ISEL-NEXT:    cmhi d2, d0, d1
432 ; CHECK-ISEL-NEXT:    bif v0.8b, v1.8b, v2.8b
433 ; CHECK-ISEL-NEXT:    ret
435 ; CHECK-GLOBAL-LABEL: umax1i64:
436 ; CHECK-GLOBAL:       // %bb.0:
437 ; CHECK-GLOBAL-NEXT:    fmov x8, d0
438 ; CHECK-GLOBAL-NEXT:    fmov x9, d1
439 ; CHECK-GLOBAL-NEXT:    cmp x8, x9
440 ; CHECK-GLOBAL-NEXT:    fcsel d0, d0, d1, hi
441 ; CHECK-GLOBAL-NEXT:    ret
442   %c = call <1 x i64> @llvm.umax.v1i64(<1 x i64> %a, <1 x i64> %b)
443   ret <1 x i64> %c
446 declare <2 x i64> @llvm.umax.v2i64(<2 x i64> %a, <2 x i64> %b) readnone
448 define <2 x i64> @umax2i64(<2 x i64> %a, <2 x i64> %b) {
449 ; CHECK-ISEL-LABEL: umax2i64:
450 ; CHECK-ISEL:       // %bb.0:
451 ; CHECK-ISEL-NEXT:    cmhi v2.2d, v0.2d, v1.2d
452 ; CHECK-ISEL-NEXT:    bif v0.16b, v1.16b, v2.16b
453 ; CHECK-ISEL-NEXT:    ret
455 ; CHECK-GLOBAL-LABEL: umax2i64:
456 ; CHECK-GLOBAL:       // %bb.0:
457 ; CHECK-GLOBAL-NEXT:    cmhi v2.2d, v0.2d, v1.2d
458 ; CHECK-GLOBAL-NEXT:    shl v2.2d, v2.2d, #63
459 ; CHECK-GLOBAL-NEXT:    sshr v2.2d, v2.2d, #63
460 ; CHECK-GLOBAL-NEXT:    bif v0.16b, v1.16b, v2.16b
461 ; CHECK-GLOBAL-NEXT:    ret
462   %c = call <2 x i64> @llvm.umax.v2i64(<2 x i64> %a, <2 x i64> %b)
463   ret <2 x i64> %c
466 declare <4 x i64> @llvm.umax.v4i64(<4 x i64> %a, <4 x i64> %b) readnone
468 define void @umax4i64(<4 x i64> %a, <4 x i64> %b, <4 x i64>* %p) {
469 ; CHECK-ISEL-LABEL: umax4i64:
470 ; CHECK-ISEL:       // %bb.0:
471 ; CHECK-ISEL-NEXT:    cmhi v4.2d, v0.2d, v2.2d
472 ; CHECK-ISEL-NEXT:    cmhi v5.2d, v1.2d, v3.2d
473 ; CHECK-ISEL-NEXT:    bif v0.16b, v2.16b, v4.16b
474 ; CHECK-ISEL-NEXT:    bif v1.16b, v3.16b, v5.16b
475 ; CHECK-ISEL-NEXT:    stp q0, q1, [x0]
476 ; CHECK-ISEL-NEXT:    ret
478 ; CHECK-GLOBAL-LABEL: umax4i64:
479 ; CHECK-GLOBAL:       // %bb.0:
480 ; CHECK-GLOBAL-NEXT:    cmhi v4.2d, v0.2d, v2.2d
481 ; CHECK-GLOBAL-NEXT:    cmhi v5.2d, v1.2d, v3.2d
482 ; CHECK-GLOBAL-NEXT:    shl v4.2d, v4.2d, #63
483 ; CHECK-GLOBAL-NEXT:    shl v5.2d, v5.2d, #63
484 ; CHECK-GLOBAL-NEXT:    sshr v4.2d, v4.2d, #63
485 ; CHECK-GLOBAL-NEXT:    sshr v5.2d, v5.2d, #63
486 ; CHECK-GLOBAL-NEXT:    bif v0.16b, v2.16b, v4.16b
487 ; CHECK-GLOBAL-NEXT:    bif v1.16b, v3.16b, v5.16b
488 ; CHECK-GLOBAL-NEXT:    stp q0, q1, [x0]
489 ; CHECK-GLOBAL-NEXT:    ret
490   %c = call <4 x i64> @llvm.umax.v4i64(<4 x i64> %a, <4 x i64> %b)
491   store <4 x i64> %c, <4 x i64>* %p
492   ret void
495 declare i8 @llvm.smin.i8(i8 %a, i8 %b) readnone
497 define i8 @smini8(i8 %a, i8 %b) {
498 ; CHECK-ISEL-LABEL: smini8:
499 ; CHECK-ISEL:       // %bb.0:
500 ; CHECK-ISEL-NEXT:    sxtb w8, w1
501 ; CHECK-ISEL-NEXT:    sxtb w9, w0
502 ; CHECK-ISEL-NEXT:    cmp w9, w8
503 ; CHECK-ISEL-NEXT:    csel w0, w9, w8, lt
504 ; CHECK-ISEL-NEXT:    ret
506 ; CHECK-GLOBAL-LABEL: smini8:
507 ; CHECK-GLOBAL:       // %bb.0:
508 ; CHECK-GLOBAL-NEXT:    sxtb w8, w0
509 ; CHECK-GLOBAL-NEXT:    cmp w8, w1, sxtb
510 ; CHECK-GLOBAL-NEXT:    csel w0, w0, w1, lt
511 ; CHECK-GLOBAL-NEXT:    ret
512   %c = call i8 @llvm.smin.i8(i8 %a, i8 %b)
513   ret i8 %c
516 declare i16 @llvm.smin.i16(i16 %a, i16 %b) readnone
518 define i16 @smini16(i16 %a, i16 %b) {
519 ; CHECK-ISEL-LABEL: smini16:
520 ; CHECK-ISEL:       // %bb.0:
521 ; CHECK-ISEL-NEXT:    sxth w8, w1
522 ; CHECK-ISEL-NEXT:    sxth w9, w0
523 ; CHECK-ISEL-NEXT:    cmp w9, w8
524 ; CHECK-ISEL-NEXT:    csel w0, w9, w8, lt
525 ; CHECK-ISEL-NEXT:    ret
527 ; CHECK-GLOBAL-LABEL: smini16:
528 ; CHECK-GLOBAL:       // %bb.0:
529 ; CHECK-GLOBAL-NEXT:    sxth w8, w0
530 ; CHECK-GLOBAL-NEXT:    cmp w8, w1, sxth
531 ; CHECK-GLOBAL-NEXT:    csel w0, w0, w1, lt
532 ; CHECK-GLOBAL-NEXT:    ret
533   %c = call i16 @llvm.smin.i16(i16 %a, i16 %b)
534   ret i16 %c
537 declare i32 @llvm.smin.i32(i32 %a, i32 %b) readnone
539 define i32 @smini32(i32 %a, i32 %b) {
540 ; CHECK-LABEL: smini32:
541 ; CHECK:       // %bb.0:
542 ; CHECK-NEXT:    cmp w0, w1
543 ; CHECK-NEXT:    csel w0, w0, w1, lt
544 ; CHECK-NEXT:    ret
545   %c = call i32 @llvm.smin.i32(i32 %a, i32 %b)
546   ret i32 %c
549 declare i64 @llvm.smin.i64(i64 %a, i64 %b) readnone
551 define i64 @smini64(i64 %a, i64 %b) {
552 ; CHECK-LABEL: smini64:
553 ; CHECK:       // %bb.0:
554 ; CHECK-NEXT:    cmp x0, x1
555 ; CHECK-NEXT:    csel x0, x0, x1, lt
556 ; CHECK-NEXT:    ret
557   %c = call i64 @llvm.smin.i64(i64 %a, i64 %b)
558   ret i64 %c
561 declare <8 x i8> @llvm.smin.v8i8(<8 x i8> %a, <8 x i8> %b) readnone
563 define <8 x i8> @smin8i8(<8 x i8> %a, <8 x i8> %b) {
564 ; CHECK-LABEL: smin8i8:
565 ; CHECK:       // %bb.0:
566 ; CHECK-NEXT:    smin v0.8b, v0.8b, v1.8b
567 ; CHECK-NEXT:    ret
568   %c = call <8 x i8> @llvm.smin.v8i8(<8 x i8> %a, <8 x i8> %b)
569   ret <8 x i8> %c
572 declare <16 x i8> @llvm.smin.v16i8(<16 x i8> %a, <16 x i8> %b) readnone
574 define <16 x i8> @smin16i8(<16 x i8> %a, <16 x i8> %b) {
575 ; CHECK-LABEL: smin16i8:
576 ; CHECK:       // %bb.0:
577 ; CHECK-NEXT:    smin v0.16b, v0.16b, v1.16b
578 ; CHECK-NEXT:    ret
579   %c = call <16 x i8> @llvm.smin.v16i8(<16 x i8> %a, <16 x i8> %b)
580   ret <16 x i8> %c
583 declare <32 x i8> @llvm.smin.v32i8(<32 x i8> %a, <32 x i8> %b) readnone
585 define void @smin32i8(<32 x i8> %a, <32 x i8> %b, <32 x i8>* %p) {
586 ; CHECK-LABEL: smin32i8:
587 ; CHECK:       // %bb.0:
588 ; CHECK-NEXT:    smin v0.16b, v0.16b, v2.16b
589 ; CHECK-NEXT:    smin v1.16b, v1.16b, v3.16b
590 ; CHECK-NEXT:    stp q0, q1, [x0]
591 ; CHECK-NEXT:    ret
592   %c = call <32 x i8> @llvm.smin.v32i8(<32 x i8> %a, <32 x i8> %b)
593   store <32 x i8> %c, <32 x i8>* %p
594   ret void
597 declare <4 x i16> @llvm.smin.v4i16(<4 x i16> %a, <4 x i16> %b) readnone
599 define <4 x i16> @smin4i16(<4 x i16> %a, <4 x i16> %b) {
600 ; CHECK-LABEL: smin4i16:
601 ; CHECK:       // %bb.0:
602 ; CHECK-NEXT:    smin v0.4h, v0.4h, v1.4h
603 ; CHECK-NEXT:    ret
604   %c = call <4 x i16> @llvm.smin.v4i16(<4 x i16> %a, <4 x i16> %b)
605   ret <4 x i16> %c
608 declare <8 x i16> @llvm.smin.v8i16(<8 x i16> %a, <8 x i16> %b) readnone
610 define <8 x i16> @smin8i16(<8 x i16> %a, <8 x i16> %b) {
611 ; CHECK-LABEL: smin8i16:
612 ; CHECK:       // %bb.0:
613 ; CHECK-NEXT:    smin v0.8h, v0.8h, v1.8h
614 ; CHECK-NEXT:    ret
615   %c = call <8 x i16> @llvm.smin.v8i16(<8 x i16> %a, <8 x i16> %b)
616   ret <8 x i16> %c
619 declare <16 x i16> @llvm.smin.v16i16(<16 x i16> %a, <16 x i16> %b) readnone
621 define void @smin16i16(<16 x i16> %a, <16 x i16> %b, <16 x i16>* %p) {
622 ; CHECK-LABEL: smin16i16:
623 ; CHECK:       // %bb.0:
624 ; CHECK-NEXT:    smin v0.8h, v0.8h, v2.8h
625 ; CHECK-NEXT:    smin v1.8h, v1.8h, v3.8h
626 ; CHECK-NEXT:    stp q0, q1, [x0]
627 ; CHECK-NEXT:    ret
628   %c = call <16 x i16> @llvm.smin.v16i16(<16 x i16> %a, <16 x i16> %b)
629   store <16 x i16> %c, <16 x i16>* %p
630   ret void
633 declare <2 x i32> @llvm.smin.v2i32(<2 x i32> %a, <2 x i32> %b) readnone
635 define <2 x i32> @smin2i32(<2 x i32> %a, <2 x i32> %b) {
636 ; CHECK-LABEL: smin2i32:
637 ; CHECK:       // %bb.0:
638 ; CHECK-NEXT:    smin v0.2s, v0.2s, v1.2s
639 ; CHECK-NEXT:    ret
640   %c = call <2 x i32> @llvm.smin.v2i32(<2 x i32> %a, <2 x i32> %b)
641   ret <2 x i32> %c
644 declare <4 x i32> @llvm.smin.v4i32(<4 x i32> %a, <4 x i32> %b) readnone
646 define <4 x i32> @smin4i32(<4 x i32> %a, <4 x i32> %b) {
647 ; CHECK-LABEL: smin4i32:
648 ; CHECK:       // %bb.0:
649 ; CHECK-NEXT:    smin v0.4s, v0.4s, v1.4s
650 ; CHECK-NEXT:    ret
651   %c = call <4 x i32> @llvm.smin.v4i32(<4 x i32> %a, <4 x i32> %b)
652   ret <4 x i32> %c
655 declare <8 x i32> @llvm.smin.v8i32(<8 x i32> %a, <8 x i32> %b) readnone
657 define void @smin8i32(<8 x i32> %a, <8 x i32> %b, <8 x i32>* %p) {
658 ; CHECK-LABEL: smin8i32:
659 ; CHECK:       // %bb.0:
660 ; CHECK-NEXT:    smin v0.4s, v0.4s, v2.4s
661 ; CHECK-NEXT:    smin v1.4s, v1.4s, v3.4s
662 ; CHECK-NEXT:    stp q0, q1, [x0]
663 ; CHECK-NEXT:    ret
664   %c = call <8 x i32>@llvm.smin.v8i32(<8 x i32> %a, <8 x i32> %b)
665   store <8 x i32> %c, <8 x i32>* %p
666   ret void
669 declare <1 x i64> @llvm.smin.v1i64(<1 x i64> %a, <1 x i64> %b) readnone
671 define <1 x i64> @smin1i64(<1 x i64> %a, <1 x i64> %b) {
672 ; CHECK-ISEL-LABEL: smin1i64:
673 ; CHECK-ISEL:       // %bb.0:
674 ; CHECK-ISEL-NEXT:    cmgt d2, d1, d0
675 ; CHECK-ISEL-NEXT:    bif v0.8b, v1.8b, v2.8b
676 ; CHECK-ISEL-NEXT:    ret
678 ; CHECK-GLOBAL-LABEL: smin1i64:
679 ; CHECK-GLOBAL:       // %bb.0:
680 ; CHECK-GLOBAL-NEXT:    fmov x8, d0
681 ; CHECK-GLOBAL-NEXT:    fmov x9, d1
682 ; CHECK-GLOBAL-NEXT:    cmp x8, x9
683 ; CHECK-GLOBAL-NEXT:    fcsel d0, d0, d1, lt
684 ; CHECK-GLOBAL-NEXT:    ret
685   %c = call <1 x i64> @llvm.smin.v1i64(<1 x i64> %a, <1 x i64> %b)
686   ret <1 x i64> %c
689 declare <2 x i64> @llvm.smin.v2i64(<2 x i64> %a, <2 x i64> %b) readnone
691 define <2 x i64> @smin2i64(<2 x i64> %a, <2 x i64> %b) {
692 ; CHECK-ISEL-LABEL: smin2i64:
693 ; CHECK-ISEL:       // %bb.0:
694 ; CHECK-ISEL-NEXT:    cmgt v2.2d, v1.2d, v0.2d
695 ; CHECK-ISEL-NEXT:    bif v0.16b, v1.16b, v2.16b
696 ; CHECK-ISEL-NEXT:    ret
698 ; CHECK-GLOBAL-LABEL: smin2i64:
699 ; CHECK-GLOBAL:       // %bb.0:
700 ; CHECK-GLOBAL-NEXT:    cmgt v2.2d, v1.2d, v0.2d
701 ; CHECK-GLOBAL-NEXT:    shl v2.2d, v2.2d, #63
702 ; CHECK-GLOBAL-NEXT:    sshr v2.2d, v2.2d, #63
703 ; CHECK-GLOBAL-NEXT:    bif v0.16b, v1.16b, v2.16b
704 ; CHECK-GLOBAL-NEXT:    ret
705   %c = call <2 x i64> @llvm.smin.v2i64(<2 x i64> %a, <2 x i64> %b)
706   ret <2 x i64> %c
709 declare <4 x i64> @llvm.smin.v4i64(<4 x i64> %a, <4 x i64> %b) readnone
711 define void @smin4i64(<4 x i64> %a, <4 x i64> %b, <4 x i64>* %p) {
712 ; CHECK-ISEL-LABEL: smin4i64:
713 ; CHECK-ISEL:       // %bb.0:
714 ; CHECK-ISEL-NEXT:    cmgt v4.2d, v2.2d, v0.2d
715 ; CHECK-ISEL-NEXT:    cmgt v5.2d, v3.2d, v1.2d
716 ; CHECK-ISEL-NEXT:    bif v0.16b, v2.16b, v4.16b
717 ; CHECK-ISEL-NEXT:    bif v1.16b, v3.16b, v5.16b
718 ; CHECK-ISEL-NEXT:    stp q0, q1, [x0]
719 ; CHECK-ISEL-NEXT:    ret
721 ; CHECK-GLOBAL-LABEL: smin4i64:
722 ; CHECK-GLOBAL:       // %bb.0:
723 ; CHECK-GLOBAL-NEXT:    cmgt v4.2d, v2.2d, v0.2d
724 ; CHECK-GLOBAL-NEXT:    cmgt v5.2d, v3.2d, v1.2d
725 ; CHECK-GLOBAL-NEXT:    shl v4.2d, v4.2d, #63
726 ; CHECK-GLOBAL-NEXT:    shl v5.2d, v5.2d, #63
727 ; CHECK-GLOBAL-NEXT:    sshr v4.2d, v4.2d, #63
728 ; CHECK-GLOBAL-NEXT:    sshr v5.2d, v5.2d, #63
729 ; CHECK-GLOBAL-NEXT:    bif v0.16b, v2.16b, v4.16b
730 ; CHECK-GLOBAL-NEXT:    bif v1.16b, v3.16b, v5.16b
731 ; CHECK-GLOBAL-NEXT:    stp q0, q1, [x0]
732 ; CHECK-GLOBAL-NEXT:    ret
733   %c = call <4 x i64> @llvm.smin.v4i64(<4 x i64> %a, <4 x i64> %b)
734   store <4 x i64> %c, <4 x i64>* %p
735   ret void
738 declare i8 @llvm.umin.i8(i8 %a, i8 %b) readnone
740 define i8 @umini8(i8 %a, i8 %b) {
741 ; CHECK-ISEL-LABEL: umini8:
742 ; CHECK-ISEL:       // %bb.0:
743 ; CHECK-ISEL-NEXT:    and w8, w1, #0xff
744 ; CHECK-ISEL-NEXT:    and w9, w0, #0xff
745 ; CHECK-ISEL-NEXT:    cmp w9, w8
746 ; CHECK-ISEL-NEXT:    csel w0, w9, w8, lo
747 ; CHECK-ISEL-NEXT:    ret
749 ; CHECK-GLOBAL-LABEL: umini8:
750 ; CHECK-GLOBAL:       // %bb.0:
751 ; CHECK-GLOBAL-NEXT:    and w8, w0, #0xff
752 ; CHECK-GLOBAL-NEXT:    cmp w8, w1, uxtb
753 ; CHECK-GLOBAL-NEXT:    csel w0, w0, w1, lo
754 ; CHECK-GLOBAL-NEXT:    ret
755   %c = call i8 @llvm.umin.i8(i8 %a, i8 %b)
756   ret i8 %c
759 declare i16 @llvm.umin.i16(i16 %a, i16 %b) readnone
761 define i16 @umini16(i16 %a, i16 %b) {
762 ; CHECK-ISEL-LABEL: umini16:
763 ; CHECK-ISEL:       // %bb.0:
764 ; CHECK-ISEL-NEXT:    and w8, w1, #0xffff
765 ; CHECK-ISEL-NEXT:    and w9, w0, #0xffff
766 ; CHECK-ISEL-NEXT:    cmp w9, w8
767 ; CHECK-ISEL-NEXT:    csel w0, w9, w8, lo
768 ; CHECK-ISEL-NEXT:    ret
770 ; CHECK-GLOBAL-LABEL: umini16:
771 ; CHECK-GLOBAL:       // %bb.0:
772 ; CHECK-GLOBAL-NEXT:    and w8, w0, #0xffff
773 ; CHECK-GLOBAL-NEXT:    cmp w8, w1, uxth
774 ; CHECK-GLOBAL-NEXT:    csel w0, w0, w1, lo
775 ; CHECK-GLOBAL-NEXT:    ret
776   %c = call i16 @llvm.umin.i16(i16 %a, i16 %b)
777   ret i16 %c
780 declare i32 @llvm.umin.i32(i32 %a, i32 %b) readnone
782 define i32 @umini32(i32 %a, i32 %b) {
783 ; CHECK-LABEL: umini32:
784 ; CHECK:       // %bb.0:
785 ; CHECK-NEXT:    cmp w0, w1
786 ; CHECK-NEXT:    csel w0, w0, w1, lo
787 ; CHECK-NEXT:    ret
788   %c = call i32 @llvm.umin.i32(i32 %a, i32 %b)
789   ret i32 %c
792 declare i64 @llvm.umin.i64(i64 %a, i64 %b) readnone
794 define i64 @umini64(i64 %a, i64 %b) {
795 ; CHECK-LABEL: umini64:
796 ; CHECK:       // %bb.0:
797 ; CHECK-NEXT:    cmp x0, x1
798 ; CHECK-NEXT:    csel x0, x0, x1, lo
799 ; CHECK-NEXT:    ret
800   %c = call i64 @llvm.umin.i64(i64 %a, i64 %b)
801   ret i64 %c
804 declare <8 x i8> @llvm.umin.v8i8(<8 x i8> %a, <8 x i8> %b) readnone
806 define <8 x i8> @umin8i8(<8 x i8> %a, <8 x i8> %b) {
807 ; CHECK-LABEL: umin8i8:
808 ; CHECK:       // %bb.0:
809 ; CHECK-NEXT:    umin v0.8b, v0.8b, v1.8b
810 ; CHECK-NEXT:    ret
811   %c = call <8 x i8> @llvm.umin.v8i8(<8 x i8> %a, <8 x i8> %b)
812   ret <8 x i8> %c
815 declare <16 x i8> @llvm.umin.v16i8(<16 x i8> %a, <16 x i8> %b) readnone
817 define <16 x i8> @umin16i8(<16 x i8> %a, <16 x i8> %b) {
818 ; CHECK-LABEL: umin16i8:
819 ; CHECK:       // %bb.0:
820 ; CHECK-NEXT:    umin v0.16b, v0.16b, v1.16b
821 ; CHECK-NEXT:    ret
822   %c = call <16 x i8> @llvm.umin.v16i8(<16 x i8> %a, <16 x i8> %b)
823   ret <16 x i8> %c
826 declare <32 x i8> @llvm.umin.v32i8(<32 x i8> %a, <32 x i8> %b) readnone
828 define void @umin32i8(<32 x i8> %a, <32 x i8> %b, <32 x i8>* %p) {
829 ; CHECK-LABEL: umin32i8:
830 ; CHECK:       // %bb.0:
831 ; CHECK-NEXT:    umin v0.16b, v0.16b, v2.16b
832 ; CHECK-NEXT:    umin v1.16b, v1.16b, v3.16b
833 ; CHECK-NEXT:    stp q0, q1, [x0]
834 ; CHECK-NEXT:    ret
835   %c = call <32 x i8> @llvm.umin.v32i8(<32 x i8> %a, <32 x i8> %b)
836   store <32 x i8> %c, <32 x i8>* %p
837   ret void
840 declare <4 x i16> @llvm.umin.v4i16(<4 x i16> %a, <4 x i16> %b) readnone
842 define <4 x i16> @umin4i16(<4 x i16> %a, <4 x i16> %b) {
843 ; CHECK-LABEL: umin4i16:
844 ; CHECK:       // %bb.0:
845 ; CHECK-NEXT:    umin v0.4h, v0.4h, v1.4h
846 ; CHECK-NEXT:    ret
847   %c = call <4 x i16> @llvm.umin.v4i16(<4 x i16> %a, <4 x i16> %b)
848   ret <4 x i16> %c
851 declare <8 x i16> @llvm.umin.v8i16(<8 x i16> %a, <8 x i16> %b) readnone
853 define <8 x i16> @umin8i16(<8 x i16> %a, <8 x i16> %b) {
854 ; CHECK-LABEL: umin8i16:
855 ; CHECK:       // %bb.0:
856 ; CHECK-NEXT:    umin v0.8h, v0.8h, v1.8h
857 ; CHECK-NEXT:    ret
858   %c = call <8 x i16> @llvm.umin.v8i16(<8 x i16> %a, <8 x i16> %b)
859   ret <8 x i16> %c
862 declare <16 x i16> @llvm.umin.v16i16(<16 x i16> %a, <16 x i16> %b) readnone
864 define void @umin16i16(<16 x i16> %a, <16 x i16> %b, <16 x i16>* %p) {
865 ; CHECK-LABEL: umin16i16:
866 ; CHECK:       // %bb.0:
867 ; CHECK-NEXT:    umin v0.8h, v0.8h, v2.8h
868 ; CHECK-NEXT:    umin v1.8h, v1.8h, v3.8h
869 ; CHECK-NEXT:    stp q0, q1, [x0]
870 ; CHECK-NEXT:    ret
871   %c = call <16 x i16> @llvm.umin.v16i16(<16 x i16> %a, <16 x i16> %b)
872   store <16 x i16> %c, <16 x i16>* %p
873   ret void
876 declare <2 x i32> @llvm.umin.v2i32(<2 x i32> %a, <2 x i32> %b) readnone
878 define <2 x i32> @umin2i32(<2 x i32> %a, <2 x i32> %b) {
879 ; CHECK-LABEL: umin2i32:
880 ; CHECK:       // %bb.0:
881 ; CHECK-NEXT:    umin v0.2s, v0.2s, v1.2s
882 ; CHECK-NEXT:    ret
883   %c = call <2 x i32> @llvm.umin.v2i32(<2 x i32> %a, <2 x i32> %b)
884   ret <2 x i32> %c
887 declare <4 x i32> @llvm.umin.v4i32(<4 x i32> %a, <4 x i32> %b) readnone
889 define <4 x i32> @umin4i32(<4 x i32> %a, <4 x i32> %b) {
890 ; CHECK-LABEL: umin4i32:
891 ; CHECK:       // %bb.0:
892 ; CHECK-NEXT:    umin v0.4s, v0.4s, v1.4s
893 ; CHECK-NEXT:    ret
894   %c = call <4 x i32> @llvm.umin.v4i32(<4 x i32> %a, <4 x i32> %b)
895   ret <4 x i32> %c
898 declare <8 x i32> @llvm.umin.v8i32(<8 x i32> %a, <8 x i32> %b) readnone
900 define void @umin8i32(<8 x i32> %a, <8 x i32> %b, <8 x i32>* %p) {
901 ; CHECK-LABEL: umin8i32:
902 ; CHECK:       // %bb.0:
903 ; CHECK-NEXT:    umin v0.4s, v0.4s, v2.4s
904 ; CHECK-NEXT:    umin v1.4s, v1.4s, v3.4s
905 ; CHECK-NEXT:    stp q0, q1, [x0]
906 ; CHECK-NEXT:    ret
907   %c = call <8 x i32>@llvm.umin.v8i32(<8 x i32> %a, <8 x i32> %b)
908   store <8 x i32> %c, <8 x i32>* %p
909   ret void
912 declare <1 x i64> @llvm.umin.v1i64(<1 x i64> %a, <1 x i64> %b) readnone
914 define <1 x i64> @umin1i64(<1 x i64> %a, <1 x i64> %b) {
915 ; CHECK-ISEL-LABEL: umin1i64:
916 ; CHECK-ISEL:       // %bb.0:
917 ; CHECK-ISEL-NEXT:    cmhi d2, d1, d0
918 ; CHECK-ISEL-NEXT:    bif v0.8b, v1.8b, v2.8b
919 ; CHECK-ISEL-NEXT:    ret
921 ; CHECK-GLOBAL-LABEL: umin1i64:
922 ; CHECK-GLOBAL:       // %bb.0:
923 ; CHECK-GLOBAL-NEXT:    fmov x8, d0
924 ; CHECK-GLOBAL-NEXT:    fmov x9, d1
925 ; CHECK-GLOBAL-NEXT:    cmp x8, x9
926 ; CHECK-GLOBAL-NEXT:    fcsel d0, d0, d1, lo
927 ; CHECK-GLOBAL-NEXT:    ret
928   %c = call <1 x i64> @llvm.umin.v1i64(<1 x i64> %a, <1 x i64> %b)
929   ret <1 x i64> %c
932 declare <2 x i64> @llvm.umin.v2i64(<2 x i64> %a, <2 x i64> %b) readnone
934 define <2 x i64> @umin2i64(<2 x i64> %a, <2 x i64> %b) {
935 ; CHECK-ISEL-LABEL: umin2i64:
936 ; CHECK-ISEL:       // %bb.0:
937 ; CHECK-ISEL-NEXT:    cmhi v2.2d, v1.2d, v0.2d
938 ; CHECK-ISEL-NEXT:    bif v0.16b, v1.16b, v2.16b
939 ; CHECK-ISEL-NEXT:    ret
941 ; CHECK-GLOBAL-LABEL: umin2i64:
942 ; CHECK-GLOBAL:       // %bb.0:
943 ; CHECK-GLOBAL-NEXT:    cmhi v2.2d, v1.2d, v0.2d
944 ; CHECK-GLOBAL-NEXT:    shl v2.2d, v2.2d, #63
945 ; CHECK-GLOBAL-NEXT:    sshr v2.2d, v2.2d, #63
946 ; CHECK-GLOBAL-NEXT:    bif v0.16b, v1.16b, v2.16b
947 ; CHECK-GLOBAL-NEXT:    ret
948   %c = call <2 x i64> @llvm.umin.v2i64(<2 x i64> %a, <2 x i64> %b)
949   ret <2 x i64> %c
952 declare <4 x i64> @llvm.umin.v4i64(<4 x i64> %a, <4 x i64> %b) readnone
954 define void @umin4i64(<4 x i64> %a, <4 x i64> %b, <4 x i64>* %p) {
955 ; CHECK-ISEL-LABEL: umin4i64:
956 ; CHECK-ISEL:       // %bb.0:
957 ; CHECK-ISEL-NEXT:    cmhi v4.2d, v2.2d, v0.2d
958 ; CHECK-ISEL-NEXT:    cmhi v5.2d, v3.2d, v1.2d
959 ; CHECK-ISEL-NEXT:    bif v0.16b, v2.16b, v4.16b
960 ; CHECK-ISEL-NEXT:    bif v1.16b, v3.16b, v5.16b
961 ; CHECK-ISEL-NEXT:    stp q0, q1, [x0]
962 ; CHECK-ISEL-NEXT:    ret
964 ; CHECK-GLOBAL-LABEL: umin4i64:
965 ; CHECK-GLOBAL:       // %bb.0:
966 ; CHECK-GLOBAL-NEXT:    cmhi v4.2d, v2.2d, v0.2d
967 ; CHECK-GLOBAL-NEXT:    cmhi v5.2d, v3.2d, v1.2d
968 ; CHECK-GLOBAL-NEXT:    shl v4.2d, v4.2d, #63
969 ; CHECK-GLOBAL-NEXT:    shl v5.2d, v5.2d, #63
970 ; CHECK-GLOBAL-NEXT:    sshr v4.2d, v4.2d, #63
971 ; CHECK-GLOBAL-NEXT:    sshr v5.2d, v5.2d, #63
972 ; CHECK-GLOBAL-NEXT:    bif v0.16b, v2.16b, v4.16b
973 ; CHECK-GLOBAL-NEXT:    bif v1.16b, v3.16b, v5.16b
974 ; CHECK-GLOBAL-NEXT:    stp q0, q1, [x0]
975 ; CHECK-GLOBAL-NEXT:    ret
976   %c = call <4 x i64> @llvm.umin.v4i64(<4 x i64> %a, <4 x i64> %b)
977   store <4 x i64> %c, <4 x i64>* %p
978   ret void