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)
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)
51 declare i32 @llvm.smax.i32(i32 %a, i32 %b) readnone
53 define i32 @smaxi32(i32 %a, i32 %b) {
54 ; CHECK-LABEL: smaxi32:
56 ; CHECK-NEXT: cmp w0, w1
57 ; CHECK-NEXT: csel w0, w0, w1, gt
59 %c = call i32 @llvm.smax.i32(i32 %a, i32 %b)
63 declare i64 @llvm.smax.i64(i64 %a, i64 %b) readnone
65 define i64 @smaxi64(i64 %a, i64 %b) {
66 ; CHECK-LABEL: smaxi64:
68 ; CHECK-NEXT: cmp x0, x1
69 ; CHECK-NEXT: csel x0, x0, x1, gt
71 %c = call i64 @llvm.smax.i64(i64 %a, i64 %b)
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:
80 ; CHECK-NEXT: smax v0.8b, v0.8b, v1.8b
82 %c = call <8 x i8> @llvm.smax.v8i8(<8 x i8> %a, <8 x i8> %b)
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:
91 ; CHECK-NEXT: smax v0.16b, v0.16b, v1.16b
93 %c = call <16 x i8> @llvm.smax.v16i8(<16 x i8> %a, <16 x i8> %b)
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:
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]
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
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:
116 ; CHECK-NEXT: smax v0.4h, v0.4h, v1.4h
118 %c = call <4 x i16> @llvm.smax.v4i16(<4 x i16> %a, <4 x i16> %b)
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:
127 ; CHECK-NEXT: smax v0.8h, v0.8h, v1.8h
129 %c = call <8 x i16> @llvm.smax.v8i16(<8 x i16> %a, <8 x i16> %b)
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:
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]
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
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:
152 ; CHECK-NEXT: smax v0.2s, v0.2s, v1.2s
154 %c = call <2 x i32> @llvm.smax.v2i32(<2 x i32> %a, <2 x i32> %b)
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:
163 ; CHECK-NEXT: smax v0.4s, v0.4s, v1.4s
165 %c = call <4 x i32> @llvm.smax.v4i32(<4 x i32> %a, <4 x i32> %b)
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:
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]
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
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)
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)
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
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)
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)
294 declare i32 @llvm.umax.i32(i32 %a, i32 %b) readnone
296 define i32 @umaxi32(i32 %a, i32 %b) {
297 ; CHECK-LABEL: umaxi32:
299 ; CHECK-NEXT: cmp w0, w1
300 ; CHECK-NEXT: csel w0, w0, w1, hi
302 %c = call i32 @llvm.umax.i32(i32 %a, i32 %b)
306 declare i64 @llvm.umax.i64(i64 %a, i64 %b) readnone
308 define i64 @umaxi64(i64 %a, i64 %b) {
309 ; CHECK-LABEL: umaxi64:
311 ; CHECK-NEXT: cmp x0, x1
312 ; CHECK-NEXT: csel x0, x0, x1, hi
314 %c = call i64 @llvm.umax.i64(i64 %a, i64 %b)
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:
323 ; CHECK-NEXT: umax v0.8b, v0.8b, v1.8b
325 %c = call <8 x i8> @llvm.umax.v8i8(<8 x i8> %a, <8 x i8> %b)
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:
334 ; CHECK-NEXT: umax v0.16b, v0.16b, v1.16b
336 %c = call <16 x i8> @llvm.umax.v16i8(<16 x i8> %a, <16 x i8> %b)
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:
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]
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
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:
359 ; CHECK-NEXT: umax v0.4h, v0.4h, v1.4h
361 %c = call <4 x i16> @llvm.umax.v4i16(<4 x i16> %a, <4 x i16> %b)
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:
370 ; CHECK-NEXT: umax v0.8h, v0.8h, v1.8h
372 %c = call <8 x i16> @llvm.umax.v8i16(<8 x i16> %a, <8 x i16> %b)
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:
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]
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
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:
395 ; CHECK-NEXT: umax v0.2s, v0.2s, v1.2s
397 %c = call <2 x i32> @llvm.umax.v2i32(<2 x i32> %a, <2 x i32> %b)
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:
406 ; CHECK-NEXT: umax v0.4s, v0.4s, v1.4s
408 %c = call <4 x i32> @llvm.umax.v4i32(<4 x i32> %a, <4 x i32> %b)
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:
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]
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
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)
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)
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
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)
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)
537 declare i32 @llvm.smin.i32(i32 %a, i32 %b) readnone
539 define i32 @smini32(i32 %a, i32 %b) {
540 ; CHECK-LABEL: smini32:
542 ; CHECK-NEXT: cmp w0, w1
543 ; CHECK-NEXT: csel w0, w0, w1, lt
545 %c = call i32 @llvm.smin.i32(i32 %a, i32 %b)
549 declare i64 @llvm.smin.i64(i64 %a, i64 %b) readnone
551 define i64 @smini64(i64 %a, i64 %b) {
552 ; CHECK-LABEL: smini64:
554 ; CHECK-NEXT: cmp x0, x1
555 ; CHECK-NEXT: csel x0, x0, x1, lt
557 %c = call i64 @llvm.smin.i64(i64 %a, i64 %b)
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:
566 ; CHECK-NEXT: smin v0.8b, v0.8b, v1.8b
568 %c = call <8 x i8> @llvm.smin.v8i8(<8 x i8> %a, <8 x i8> %b)
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:
577 ; CHECK-NEXT: smin v0.16b, v0.16b, v1.16b
579 %c = call <16 x i8> @llvm.smin.v16i8(<16 x i8> %a, <16 x i8> %b)
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:
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]
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
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:
602 ; CHECK-NEXT: smin v0.4h, v0.4h, v1.4h
604 %c = call <4 x i16> @llvm.smin.v4i16(<4 x i16> %a, <4 x i16> %b)
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:
613 ; CHECK-NEXT: smin v0.8h, v0.8h, v1.8h
615 %c = call <8 x i16> @llvm.smin.v8i16(<8 x i16> %a, <8 x i16> %b)
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:
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]
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
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:
638 ; CHECK-NEXT: smin v0.2s, v0.2s, v1.2s
640 %c = call <2 x i32> @llvm.smin.v2i32(<2 x i32> %a, <2 x i32> %b)
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:
649 ; CHECK-NEXT: smin v0.4s, v0.4s, v1.4s
651 %c = call <4 x i32> @llvm.smin.v4i32(<4 x i32> %a, <4 x i32> %b)
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:
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]
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
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)
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)
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
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)
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)
780 declare i32 @llvm.umin.i32(i32 %a, i32 %b) readnone
782 define i32 @umini32(i32 %a, i32 %b) {
783 ; CHECK-LABEL: umini32:
785 ; CHECK-NEXT: cmp w0, w1
786 ; CHECK-NEXT: csel w0, w0, w1, lo
788 %c = call i32 @llvm.umin.i32(i32 %a, i32 %b)
792 declare i64 @llvm.umin.i64(i64 %a, i64 %b) readnone
794 define i64 @umini64(i64 %a, i64 %b) {
795 ; CHECK-LABEL: umini64:
797 ; CHECK-NEXT: cmp x0, x1
798 ; CHECK-NEXT: csel x0, x0, x1, lo
800 %c = call i64 @llvm.umin.i64(i64 %a, i64 %b)
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:
809 ; CHECK-NEXT: umin v0.8b, v0.8b, v1.8b
811 %c = call <8 x i8> @llvm.umin.v8i8(<8 x i8> %a, <8 x i8> %b)
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:
820 ; CHECK-NEXT: umin v0.16b, v0.16b, v1.16b
822 %c = call <16 x i8> @llvm.umin.v16i8(<16 x i8> %a, <16 x i8> %b)
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:
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]
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
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:
845 ; CHECK-NEXT: umin v0.4h, v0.4h, v1.4h
847 %c = call <4 x i16> @llvm.umin.v4i16(<4 x i16> %a, <4 x i16> %b)
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:
856 ; CHECK-NEXT: umin v0.8h, v0.8h, v1.8h
858 %c = call <8 x i16> @llvm.umin.v8i16(<8 x i16> %a, <8 x i16> %b)
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:
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]
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
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:
881 ; CHECK-NEXT: umin v0.2s, v0.2s, v1.2s
883 %c = call <2 x i32> @llvm.umin.v2i32(<2 x i32> %a, <2 x i32> %b)
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:
892 ; CHECK-NEXT: umin v0.4s, v0.4s, v1.4s
894 %c = call <4 x i32> @llvm.umin.v4i32(<4 x i32> %a, <4 x i32> %b)
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:
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]
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
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)
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)
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