llvm.org GIT mirror llvm / 181a1d1
[X86][AVX512] Added 512-bit vector nontemporal load tests git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@271668 91177308-0d34-0410-b5e6-96231b3b80d8 Simon Pilgrim 4 years ago
1 changed file(s) with 909 addition(s) and 145 deletion(s). Raw diff Collapse all Expand all
22 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=SSE --check-prefix=SSE41
33 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX1
44 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX --check-prefix=AVX2
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl | FileCheck %s --check-prefix=VLX
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=AVX512 --check-prefix=AVX512F
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw | FileCheck %s --check-prefix=AVX512 --check-prefix=AVX512BW
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl | FileCheck %s --check-prefix=AVX512 --check-prefix=AVX512VL
68
79 ; FIXME: Tests for nontemporal load support which was introduced in SSE41
810
1719 ; AVX-NEXT: vmovaps (%rdi), %xmm0
1820 ; AVX-NEXT: retq
1921 ;
20 ; VLX-LABEL: test_v4f32:
21 ; VLX: # BB#0:
22 ; VLX-NEXT: vmovaps (%rdi), %xmm0
23 ; VLX-NEXT: retq
22 ; AVX512-LABEL: test_v4f32:
23 ; AVX512: # BB#0:
24 ; AVX512-NEXT: vmovaps (%rdi), %xmm0
25 ; AVX512-NEXT: retq
2426 %1 = load <4 x float>, <4 x float>* %src, align 16, !nontemporal !1
2527 ret <4 x float> %1
2628 }
3638 ; AVX-NEXT: vmovaps (%rdi), %xmm0
3739 ; AVX-NEXT: retq
3840 ;
39 ; VLX-LABEL: test_v4i32:
40 ; VLX: # BB#0:
41 ; VLX-NEXT: vmovdqa32 (%rdi), %xmm0
42 ; VLX-NEXT: retq
41 ; AVX512F-LABEL: test_v4i32:
42 ; AVX512F: # BB#0:
43 ; AVX512F-NEXT: vmovaps (%rdi), %xmm0
44 ; AVX512F-NEXT: retq
45 ;
46 ; AVX512BW-LABEL: test_v4i32:
47 ; AVX512BW: # BB#0:
48 ; AVX512BW-NEXT: vmovaps (%rdi), %xmm0
49 ; AVX512BW-NEXT: retq
50 ;
51 ; AVX512VL-LABEL: test_v4i32:
52 ; AVX512VL: # BB#0:
53 ; AVX512VL-NEXT: vmovdqa32 (%rdi), %xmm0
54 ; AVX512VL-NEXT: retq
4355 %1 = load <4 x i32>, <4 x i32>* %src, align 16, !nontemporal !1
4456 ret <4 x i32> %1
4557 }
5567 ; AVX-NEXT: vmovaps (%rdi), %xmm0
5668 ; AVX-NEXT: retq
5769 ;
58 ; VLX-LABEL: test_v2f64:
59 ; VLX: # BB#0:
60 ; VLX-NEXT: vmovapd (%rdi), %xmm0
61 ; VLX-NEXT: retq
70 ; AVX512F-LABEL: test_v2f64:
71 ; AVX512F: # BB#0:
72 ; AVX512F-NEXT: vmovaps (%rdi), %xmm0
73 ; AVX512F-NEXT: retq
74 ;
75 ; AVX512BW-LABEL: test_v2f64:
76 ; AVX512BW: # BB#0:
77 ; AVX512BW-NEXT: vmovaps (%rdi), %xmm0
78 ; AVX512BW-NEXT: retq
79 ;
80 ; AVX512VL-LABEL: test_v2f64:
81 ; AVX512VL: # BB#0:
82 ; AVX512VL-NEXT: vmovapd (%rdi), %xmm0
83 ; AVX512VL-NEXT: retq
6284 %1 = load <2 x double>, <2 x double>* %src, align 16, !nontemporal !1
6385 ret <2 x double> %1
6486 }
7496 ; AVX-NEXT: vmovaps (%rdi), %xmm0
7597 ; AVX-NEXT: retq
7698 ;
77 ; VLX-LABEL: test_v2i64:
78 ; VLX: # BB#0:
79 ; VLX-NEXT: vmovdqa64 (%rdi), %xmm0
80 ; VLX-NEXT: retq
99 ; AVX512F-LABEL: test_v2i64:
100 ; AVX512F: # BB#0:
101 ; AVX512F-NEXT: vmovaps (%rdi), %xmm0
102 ; AVX512F-NEXT: retq
103 ;
104 ; AVX512BW-LABEL: test_v2i64:
105 ; AVX512BW: # BB#0:
106 ; AVX512BW-NEXT: vmovaps (%rdi), %xmm0
107 ; AVX512BW-NEXT: retq
108 ;
109 ; AVX512VL-LABEL: test_v2i64:
110 ; AVX512VL: # BB#0:
111 ; AVX512VL-NEXT: vmovdqa64 (%rdi), %xmm0
112 ; AVX512VL-NEXT: retq
81113 %1 = load <2 x i64>, <2 x i64>* %src, align 16, !nontemporal !1
82114 ret <2 x i64> %1
83115 }
93125 ; AVX-NEXT: vmovaps (%rdi), %xmm0
94126 ; AVX-NEXT: retq
95127 ;
96 ; VLX-LABEL: test_v8i16:
97 ; VLX: # BB#0:
98 ; VLX-NEXT: vmovdqa64 (%rdi), %xmm0
99 ; VLX-NEXT: retq
128 ; AVX512F-LABEL: test_v8i16:
129 ; AVX512F: # BB#0:
130 ; AVX512F-NEXT: vmovaps (%rdi), %xmm0
131 ; AVX512F-NEXT: retq
132 ;
133 ; AVX512BW-LABEL: test_v8i16:
134 ; AVX512BW: # BB#0:
135 ; AVX512BW-NEXT: vmovaps (%rdi), %xmm0
136 ; AVX512BW-NEXT: retq
137 ;
138 ; AVX512VL-LABEL: test_v8i16:
139 ; AVX512VL: # BB#0:
140 ; AVX512VL-NEXT: vmovdqa64 (%rdi), %xmm0
141 ; AVX512VL-NEXT: retq
100142 %1 = load <8 x i16>, <8 x i16>* %src, align 16, !nontemporal !1
101143 ret <8 x i16> %1
102144 }
112154 ; AVX-NEXT: vmovaps (%rdi), %xmm0
113155 ; AVX-NEXT: retq
114156 ;
115 ; VLX-LABEL: test_v16i8:
116 ; VLX: # BB#0:
117 ; VLX-NEXT: vmovdqa64 (%rdi), %xmm0
118 ; VLX-NEXT: retq
157 ; AVX512F-LABEL: test_v16i8:
158 ; AVX512F: # BB#0:
159 ; AVX512F-NEXT: vmovaps (%rdi), %xmm0
160 ; AVX512F-NEXT: retq
161 ;
162 ; AVX512BW-LABEL: test_v16i8:
163 ; AVX512BW: # BB#0:
164 ; AVX512BW-NEXT: vmovaps (%rdi), %xmm0
165 ; AVX512BW-NEXT: retq
166 ;
167 ; AVX512VL-LABEL: test_v16i8:
168 ; AVX512VL: # BB#0:
169 ; AVX512VL-NEXT: vmovdqa64 (%rdi), %xmm0
170 ; AVX512VL-NEXT: retq
119171 %1 = load <16 x i8>, <16 x i8>* %src, align 16, !nontemporal !1
120172 ret <16 x i8> %1
121173 }
134186 ; AVX-NEXT: vmovaps (%rdi), %ymm0
135187 ; AVX-NEXT: retq
136188 ;
137 ; VLX-LABEL: test_v8f32:
138 ; VLX: # BB#0:
139 ; VLX-NEXT: vmovaps (%rdi), %ymm0
140 ; VLX-NEXT: retq
189 ; AVX512-LABEL: test_v8f32:
190 ; AVX512: # BB#0:
191 ; AVX512-NEXT: vmovaps (%rdi), %ymm0
192 ; AVX512-NEXT: retq
141193 %1 = load <8 x float>, <8 x float>* %src, align 32, !nontemporal !1
142194 ret <8 x float> %1
143195 }
154206 ; AVX-NEXT: vmovaps (%rdi), %ymm0
155207 ; AVX-NEXT: retq
156208 ;
157 ; VLX-LABEL: test_v8i32:
158 ; VLX: # BB#0:
159 ; VLX-NEXT: vmovdqa32 (%rdi), %ymm0
160 ; VLX-NEXT: retq
209 ; AVX512F-LABEL: test_v8i32:
210 ; AVX512F: # BB#0:
211 ; AVX512F-NEXT: vmovaps (%rdi), %ymm0
212 ; AVX512F-NEXT: retq
213 ;
214 ; AVX512BW-LABEL: test_v8i32:
215 ; AVX512BW: # BB#0:
216 ; AVX512BW-NEXT: vmovaps (%rdi), %ymm0
217 ; AVX512BW-NEXT: retq
218 ;
219 ; AVX512VL-LABEL: test_v8i32:
220 ; AVX512VL: # BB#0:
221 ; AVX512VL-NEXT: vmovdqa32 (%rdi), %ymm0
222 ; AVX512VL-NEXT: retq
161223 %1 = load <8 x i32>, <8 x i32>* %src, align 32, !nontemporal !1
162224 ret <8 x i32> %1
163225 }
174236 ; AVX-NEXT: vmovaps (%rdi), %ymm0
175237 ; AVX-NEXT: retq
176238 ;
177 ; VLX-LABEL: test_v4f64:
178 ; VLX: # BB#0:
179 ; VLX-NEXT: vmovapd (%rdi), %ymm0
180 ; VLX-NEXT: retq
239 ; AVX512F-LABEL: test_v4f64:
240 ; AVX512F: # BB#0:
241 ; AVX512F-NEXT: vmovaps (%rdi), %ymm0
242 ; AVX512F-NEXT: retq
243 ;
244 ; AVX512BW-LABEL: test_v4f64:
245 ; AVX512BW: # BB#0:
246 ; AVX512BW-NEXT: vmovaps (%rdi), %ymm0
247 ; AVX512BW-NEXT: retq
248 ;
249 ; AVX512VL-LABEL: test_v4f64:
250 ; AVX512VL: # BB#0:
251 ; AVX512VL-NEXT: vmovapd (%rdi), %ymm0
252 ; AVX512VL-NEXT: retq
181253 %1 = load <4 x double>, <4 x double>* %src, align 32, !nontemporal !1
182254 ret <4 x double> %1
183255 }
194266 ; AVX-NEXT: vmovaps (%rdi), %ymm0
195267 ; AVX-NEXT: retq
196268 ;
197 ; VLX-LABEL: test_v4i64:
198 ; VLX: # BB#0:
199 ; VLX-NEXT: vmovdqa64 (%rdi), %ymm0
200 ; VLX-NEXT: retq
269 ; AVX512F-LABEL: test_v4i64:
270 ; AVX512F: # BB#0:
271 ; AVX512F-NEXT: vmovaps (%rdi), %ymm0
272 ; AVX512F-NEXT: retq
273 ;
274 ; AVX512BW-LABEL: test_v4i64:
275 ; AVX512BW: # BB#0:
276 ; AVX512BW-NEXT: vmovaps (%rdi), %ymm0
277 ; AVX512BW-NEXT: retq
278 ;
279 ; AVX512VL-LABEL: test_v4i64:
280 ; AVX512VL: # BB#0:
281 ; AVX512VL-NEXT: vmovdqa64 (%rdi), %ymm0
282 ; AVX512VL-NEXT: retq
201283 %1 = load <4 x i64>, <4 x i64>* %src, align 32, !nontemporal !1
202284 ret <4 x i64> %1
203285 }
214296 ; AVX-NEXT: vmovaps (%rdi), %ymm0
215297 ; AVX-NEXT: retq
216298 ;
217 ; VLX-LABEL: test_v16i16:
218 ; VLX: # BB#0:
219 ; VLX-NEXT: vmovdqa64 (%rdi), %ymm0
220 ; VLX-NEXT: retq
299 ; AVX512F-LABEL: test_v16i16:
300 ; AVX512F: # BB#0:
301 ; AVX512F-NEXT: vmovaps (%rdi), %ymm0
302 ; AVX512F-NEXT: retq
303 ;
304 ; AVX512BW-LABEL: test_v16i16:
305 ; AVX512BW: # BB#0:
306 ; AVX512BW-NEXT: vmovaps (%rdi), %ymm0
307 ; AVX512BW-NEXT: retq
308 ;
309 ; AVX512VL-LABEL: test_v16i16:
310 ; AVX512VL: # BB#0:
311 ; AVX512VL-NEXT: vmovdqa64 (%rdi), %ymm0
312 ; AVX512VL-NEXT: retq
221313 %1 = load <16 x i16>, <16 x i16>* %src, align 32, !nontemporal !1
222314 ret <16 x i16> %1
223315 }
234326 ; AVX-NEXT: vmovaps (%rdi), %ymm0
235327 ; AVX-NEXT: retq
236328 ;
237 ; VLX-LABEL: test_v32i8:
238 ; VLX: # BB#0:
239 ; VLX-NEXT: vmovdqa64 (%rdi), %ymm0
240 ; VLX-NEXT: retq
329 ; AVX512F-LABEL: test_v32i8:
330 ; AVX512F: # BB#0:
331 ; AVX512F-NEXT: vmovaps (%rdi), %ymm0
332 ; AVX512F-NEXT: retq
333 ;
334 ; AVX512BW-LABEL: test_v32i8:
335 ; AVX512BW: # BB#0:
336 ; AVX512BW-NEXT: vmovaps (%rdi), %ymm0
337 ; AVX512BW-NEXT: retq
338 ;
339 ; AVX512VL-LABEL: test_v32i8:
340 ; AVX512VL: # BB#0:
341 ; AVX512VL-NEXT: vmovdqa64 (%rdi), %ymm0
342 ; AVX512VL-NEXT: retq
241343 %1 = load <32 x i8>, <32 x i8>* %src, align 32, !nontemporal !1
242344 ret <32 x i8> %1
243345 }
244346
347 ; And now ZMM versions.
348
349 define <16 x float> @test_v16f32(<16 x float>* %src) {
350 ; SSE-LABEL: test_v16f32:
351 ; SSE: # BB#0:
352 ; SSE-NEXT: movaps (%rdi), %xmm0
353 ; SSE-NEXT: movaps 16(%rdi), %xmm1
354 ; SSE-NEXT: movaps 32(%rdi), %xmm2
355 ; SSE-NEXT: movaps 48(%rdi), %xmm3
356 ; SSE-NEXT: retq
357 ;
358 ; AVX-LABEL: test_v16f32:
359 ; AVX: # BB#0:
360 ; AVX-NEXT: vmovaps (%rdi), %ymm0
361 ; AVX-NEXT: vmovaps 32(%rdi), %ymm1
362 ; AVX-NEXT: retq
363 ;
364 ; AVX512-LABEL: test_v16f32:
365 ; AVX512: # BB#0:
366 ; AVX512-NEXT: vmovups (%rdi), %zmm0
367 ; AVX512-NEXT: retq
368 %1 = load <16 x float>, <16 x float>* %src, align 32, !nontemporal !1
369 ret <16 x float> %1
370 }
371
372 define <16 x i32> @test_v16i32(<16 x i32>* %src) {
373 ; SSE-LABEL: test_v16i32:
374 ; SSE: # BB#0:
375 ; SSE-NEXT: movaps (%rdi), %xmm0
376 ; SSE-NEXT: movaps 16(%rdi), %xmm1
377 ; SSE-NEXT: movaps 32(%rdi), %xmm2
378 ; SSE-NEXT: movaps 48(%rdi), %xmm3
379 ; SSE-NEXT: retq
380 ;
381 ; AVX-LABEL: test_v16i32:
382 ; AVX: # BB#0:
383 ; AVX-NEXT: vmovaps (%rdi), %ymm0
384 ; AVX-NEXT: vmovaps 32(%rdi), %ymm1
385 ; AVX-NEXT: retq
386 ;
387 ; AVX512-LABEL: test_v16i32:
388 ; AVX512: # BB#0:
389 ; AVX512-NEXT: vmovdqu32 (%rdi), %zmm0
390 ; AVX512-NEXT: retq
391 %1 = load <16 x i32>, <16 x i32>* %src, align 32, !nontemporal !1
392 ret <16 x i32> %1
393 }
394
395 define <8 x double> @test_v8f64(<8 x double>* %src) {
396 ; SSE-LABEL: test_v8f64:
397 ; SSE: # BB#0:
398 ; SSE-NEXT: movaps (%rdi), %xmm0
399 ; SSE-NEXT: movaps 16(%rdi), %xmm1
400 ; SSE-NEXT: movaps 32(%rdi), %xmm2
401 ; SSE-NEXT: movaps 48(%rdi), %xmm3
402 ; SSE-NEXT: retq
403 ;
404 ; AVX-LABEL: test_v8f64:
405 ; AVX: # BB#0:
406 ; AVX-NEXT: vmovaps (%rdi), %ymm0
407 ; AVX-NEXT: vmovaps 32(%rdi), %ymm1
408 ; AVX-NEXT: retq
409 ;
410 ; AVX512-LABEL: test_v8f64:
411 ; AVX512: # BB#0:
412 ; AVX512-NEXT: vmovupd (%rdi), %zmm0
413 ; AVX512-NEXT: retq
414 %1 = load <8 x double>, <8 x double>* %src, align 32, !nontemporal !1
415 ret <8 x double> %1
416 }
417
418 define <8 x i64> @test_v8i64(<8 x i64>* %src) {
419 ; SSE-LABEL: test_v8i64:
420 ; SSE: # BB#0:
421 ; SSE-NEXT: movaps (%rdi), %xmm0
422 ; SSE-NEXT: movaps 16(%rdi), %xmm1
423 ; SSE-NEXT: movaps 32(%rdi), %xmm2
424 ; SSE-NEXT: movaps 48(%rdi), %xmm3
425 ; SSE-NEXT: retq
426 ;
427 ; AVX-LABEL: test_v8i64:
428 ; AVX: # BB#0:
429 ; AVX-NEXT: vmovaps (%rdi), %ymm0
430 ; AVX-NEXT: vmovaps 32(%rdi), %ymm1
431 ; AVX-NEXT: retq
432 ;
433 ; AVX512-LABEL: test_v8i64:
434 ; AVX512: # BB#0:
435 ; AVX512-NEXT: vmovdqu64 (%rdi), %zmm0
436 ; AVX512-NEXT: retq
437 %1 = load <8 x i64>, <8 x i64>* %src, align 32, !nontemporal !1
438 ret <8 x i64> %1
439 }
440
441 define <32 x i16> @test_v32i16(<32 x i16>* %src) {
442 ; SSE-LABEL: test_v32i16:
443 ; SSE: # BB#0:
444 ; SSE-NEXT: movaps (%rdi), %xmm0
445 ; SSE-NEXT: movaps 16(%rdi), %xmm1
446 ; SSE-NEXT: movaps 32(%rdi), %xmm2
447 ; SSE-NEXT: movaps 48(%rdi), %xmm3
448 ; SSE-NEXT: retq
449 ;
450 ; AVX-LABEL: test_v32i16:
451 ; AVX: # BB#0:
452 ; AVX-NEXT: vmovaps (%rdi), %ymm0
453 ; AVX-NEXT: vmovaps 32(%rdi), %ymm1
454 ; AVX-NEXT: retq
455 ;
456 ; AVX512F-LABEL: test_v32i16:
457 ; AVX512F: # BB#0:
458 ; AVX512F-NEXT: vmovaps (%rdi), %ymm0
459 ; AVX512F-NEXT: vmovaps 32(%rdi), %ymm1
460 ; AVX512F-NEXT: retq
461 ;
462 ; AVX512BW-LABEL: test_v32i16:
463 ; AVX512BW: # BB#0:
464 ; AVX512BW-NEXT: vmovdqu16 (%rdi), %zmm0
465 ; AVX512BW-NEXT: retq
466 ;
467 ; AVX512VL-LABEL: test_v32i16:
468 ; AVX512VL: # BB#0:
469 ; AVX512VL-NEXT: vmovdqa64 (%rdi), %ymm0
470 ; AVX512VL-NEXT: vmovdqa64 32(%rdi), %ymm1
471 ; AVX512VL-NEXT: retq
472 %1 = load <32 x i16>, <32 x i16>* %src, align 32, !nontemporal !1
473 ret <32 x i16> %1
474 }
475
476 define <64 x i8> @test_v64i8(<64 x i8>* %src) {
477 ; SSE-LABEL: test_v64i8:
478 ; SSE: # BB#0:
479 ; SSE-NEXT: movaps (%rdi), %xmm0
480 ; SSE-NEXT: movaps 16(%rdi), %xmm1
481 ; SSE-NEXT: movaps 32(%rdi), %xmm2
482 ; SSE-NEXT: movaps 48(%rdi), %xmm3
483 ; SSE-NEXT: retq
484 ;
485 ; AVX-LABEL: test_v64i8:
486 ; AVX: # BB#0:
487 ; AVX-NEXT: vmovaps (%rdi), %ymm0
488 ; AVX-NEXT: vmovaps 32(%rdi), %ymm1
489 ; AVX-NEXT: retq
490 ;
491 ; AVX512F-LABEL: test_v64i8:
492 ; AVX512F: # BB#0:
493 ; AVX512F-NEXT: vmovaps (%rdi), %ymm0
494 ; AVX512F-NEXT: vmovaps 32(%rdi), %ymm1
495 ; AVX512F-NEXT: retq
496 ;
497 ; AVX512BW-LABEL: test_v64i8:
498 ; AVX512BW: # BB#0:
499 ; AVX512BW-NEXT: vmovdqu8 (%rdi), %zmm0
500 ; AVX512BW-NEXT: retq
501 ;
502 ; AVX512VL-LABEL: test_v64i8:
503 ; AVX512VL: # BB#0:
504 ; AVX512VL-NEXT: vmovdqa64 (%rdi), %ymm0
505 ; AVX512VL-NEXT: vmovdqa64 32(%rdi), %ymm1
506 ; AVX512VL-NEXT: retq
507 %1 = load <64 x i8>, <64 x i8>* %src, align 32, !nontemporal !1
508 ret <64 x i8> %1
509 }
510
245511
246512 ; Check cases where the load would be folded.
247513
256522 ; AVX-NEXT: vaddps (%rdi), %xmm0, %xmm0
257523 ; AVX-NEXT: retq
258524 ;
259 ; VLX-LABEL: test_arg_v4f32:
260 ; VLX: # BB#0:
261 ; VLX-NEXT: vaddps (%rdi), %xmm0, %xmm0
262 ; VLX-NEXT: retq
525 ; AVX512-LABEL: test_arg_v4f32:
526 ; AVX512: # BB#0:
527 ; AVX512-NEXT: vaddps (%rdi), %xmm0, %xmm0
528 ; AVX512-NEXT: retq
263529 %1 = load <4 x float>, <4 x float>* %src, align 16, !nontemporal !1
264530 %2 = fadd <4 x float> %arg, %1
265531 ret <4 x float> %2
276542 ; AVX-NEXT: vpaddd (%rdi), %xmm0, %xmm0
277543 ; AVX-NEXT: retq
278544 ;
279 ; VLX-LABEL: test_arg_v4i32:
280 ; VLX: # BB#0:
281 ; VLX-NEXT: vpaddd (%rdi), %xmm0, %xmm0
282 ; VLX-NEXT: retq
545 ; AVX512-LABEL: test_arg_v4i32:
546 ; AVX512: # BB#0:
547 ; AVX512-NEXT: vpaddd (%rdi), %xmm0, %xmm0
548 ; AVX512-NEXT: retq
283549 %1 = load <4 x i32>, <4 x i32>* %src, align 16, !nontemporal !1
284550 %2 = add <4 x i32> %arg, %1
285551 ret <4 x i32> %2
296562 ; AVX-NEXT: vaddpd (%rdi), %xmm0, %xmm0
297563 ; AVX-NEXT: retq
298564 ;
299 ; VLX-LABEL: test_arg_v2f64:
300 ; VLX: # BB#0:
301 ; VLX-NEXT: vaddpd (%rdi), %xmm0, %xmm0
302 ; VLX-NEXT: retq
565 ; AVX512-LABEL: test_arg_v2f64:
566 ; AVX512: # BB#0:
567 ; AVX512-NEXT: vaddpd (%rdi), %xmm0, %xmm0
568 ; AVX512-NEXT: retq
303569 %1 = load <2 x double>, <2 x double>* %src, align 16, !nontemporal !1
304570 %2 = fadd <2 x double> %arg, %1
305571 ret <2 x double> %2
316582 ; AVX-NEXT: vpaddq (%rdi), %xmm0, %xmm0
317583 ; AVX-NEXT: retq
318584 ;
319 ; VLX-LABEL: test_arg_v2i64:
320 ; VLX: # BB#0:
321 ; VLX-NEXT: vpaddq (%rdi), %xmm0, %xmm0
322 ; VLX-NEXT: retq
585 ; AVX512-LABEL: test_arg_v2i64:
586 ; AVX512: # BB#0:
587 ; AVX512-NEXT: vpaddq (%rdi), %xmm0, %xmm0
588 ; AVX512-NEXT: retq
323589 %1 = load <2 x i64>, <2 x i64>* %src, align 16, !nontemporal !1
324590 %2 = add <2 x i64> %arg, %1
325591 ret <2 x i64> %2
336602 ; AVX-NEXT: vpaddw (%rdi), %xmm0, %xmm0
337603 ; AVX-NEXT: retq
338604 ;
339 ; VLX-LABEL: test_arg_v8i16:
340 ; VLX: # BB#0:
341 ; VLX-NEXT: vpaddw (%rdi), %xmm0, %xmm0
342 ; VLX-NEXT: retq
605 ; AVX512-LABEL: test_arg_v8i16:
606 ; AVX512: # BB#0:
607 ; AVX512-NEXT: vpaddw (%rdi), %xmm0, %xmm0
608 ; AVX512-NEXT: retq
343609 %1 = load <8 x i16>, <8 x i16>* %src, align 16, !nontemporal !1
344610 %2 = add <8 x i16> %arg, %1
345611 ret <8 x i16> %2
356622 ; AVX-NEXT: vpaddb (%rdi), %xmm0, %xmm0
357623 ; AVX-NEXT: retq
358624 ;
359 ; VLX-LABEL: test_arg_v16i8:
360 ; VLX: # BB#0:
361 ; VLX-NEXT: vpaddb (%rdi), %xmm0, %xmm0
362 ; VLX-NEXT: retq
625 ; AVX512-LABEL: test_arg_v16i8:
626 ; AVX512: # BB#0:
627 ; AVX512-NEXT: vpaddb (%rdi), %xmm0, %xmm0
628 ; AVX512-NEXT: retq
363629 %1 = load <16 x i8>, <16 x i8>* %src, align 16, !nontemporal !1
364630 %2 = add <16 x i8> %arg, %1
365631 ret <16 x i8> %2
379645 ; AVX-NEXT: vaddps (%rdi), %ymm0, %ymm0
380646 ; AVX-NEXT: retq
381647 ;
382 ; VLX-LABEL: test_arg_v8f32:
383 ; VLX: # BB#0:
384 ; VLX-NEXT: vaddps (%rdi), %ymm0, %ymm0
385 ; VLX-NEXT: retq
648 ; AVX512-LABEL: test_arg_v8f32:
649 ; AVX512: # BB#0:
650 ; AVX512-NEXT: vaddps (%rdi), %ymm0, %ymm0
651 ; AVX512-NEXT: retq
386652 %1 = load <8 x float>, <8 x float>* %src, align 32, !nontemporal !1
387653 %2 = fadd <8 x float> %arg, %1
388654 ret <8 x float> %2
410676 ; AVX2-NEXT: vpaddd (%rdi), %ymm0, %ymm0
411677 ; AVX2-NEXT: retq
412678 ;
413 ; VLX-LABEL: test_arg_v8i32:
414 ; VLX: # BB#0:
415 ; VLX-NEXT: vpaddd (%rdi), %ymm0, %ymm0
416 ; VLX-NEXT: retq
679 ; AVX512-LABEL: test_arg_v8i32:
680 ; AVX512: # BB#0:
681 ; AVX512-NEXT: vpaddd (%rdi), %ymm0, %ymm0
682 ; AVX512-NEXT: retq
417683 %1 = load <8 x i32>, <8 x i32>* %src, align 32, !nontemporal !1
418684 %2 = add <8 x i32> %arg, %1
419685 ret <8 x i32> %2
431697 ; AVX-NEXT: vaddpd (%rdi), %ymm0, %ymm0
432698 ; AVX-NEXT: retq
433699 ;
434 ; VLX-LABEL: test_arg_v4f64:
435 ; VLX: # BB#0:
436 ; VLX-NEXT: vaddpd (%rdi), %ymm0, %ymm0
437 ; VLX-NEXT: retq
700 ; AVX512-LABEL: test_arg_v4f64:
701 ; AVX512: # BB#0:
702 ; AVX512-NEXT: vaddpd (%rdi), %ymm0, %ymm0
703 ; AVX512-NEXT: retq
438704 %1 = load <4 x double>, <4 x double>* %src, align 32, !nontemporal !1
439705 %2 = fadd <4 x double> %arg, %1
440706 ret <4 x double> %2
462728 ; AVX2-NEXT: vpaddq (%rdi), %ymm0, %ymm0
463729 ; AVX2-NEXT: retq
464730 ;
465 ; VLX-LABEL: test_arg_v4i64:
466 ; VLX: # BB#0:
467 ; VLX-NEXT: vpaddq (%rdi), %ymm0, %ymm0
468 ; VLX-NEXT: retq
731 ; AVX512-LABEL: test_arg_v4i64:
732 ; AVX512: # BB#0:
733 ; AVX512-NEXT: vpaddq (%rdi), %ymm0, %ymm0
734 ; AVX512-NEXT: retq
469735 %1 = load <4 x i64>, <4 x i64>* %src, align 32, !nontemporal !1
470736 %2 = add <4 x i64> %arg, %1
471737 ret <4 x i64> %2
493759 ; AVX2-NEXT: vpaddw (%rdi), %ymm0, %ymm0
494760 ; AVX2-NEXT: retq
495761 ;
496 ; VLX-LABEL: test_arg_v16i16:
497 ; VLX: # BB#0:
498 ; VLX-NEXT: vpaddw (%rdi), %ymm0, %ymm0
499 ; VLX-NEXT: retq
762 ; AVX512-LABEL: test_arg_v16i16:
763 ; AVX512: # BB#0:
764 ; AVX512-NEXT: vpaddw (%rdi), %ymm0, %ymm0
765 ; AVX512-NEXT: retq
500766 %1 = load <16 x i16>, <16 x i16>* %src, align 32, !nontemporal !1
501767 %2 = add <16 x i16> %arg, %1
502768 ret <16 x i16> %2
524790 ; AVX2-NEXT: vpaddb (%rdi), %ymm0, %ymm0
525791 ; AVX2-NEXT: retq
526792 ;
527 ; VLX-LABEL: test_arg_v32i8:
528 ; VLX: # BB#0:
529 ; VLX-NEXT: vpaddb (%rdi), %ymm0, %ymm0
530 ; VLX-NEXT: retq
793 ; AVX512-LABEL: test_arg_v32i8:
794 ; AVX512: # BB#0:
795 ; AVX512-NEXT: vpaddb (%rdi), %ymm0, %ymm0
796 ; AVX512-NEXT: retq
531797 %1 = load <32 x i8>, <32 x i8>* %src, align 32, !nontemporal !1
532798 %2 = add <32 x i8> %arg, %1
533799 ret <32 x i8> %2
534800 }
535801
802 ; And now ZMM versions.
803
804 define <16 x float> @test_arg_v16f32(<16 x float> %arg, <16 x float>* %src) {
805 ; SSE-LABEL: test_arg_v16f32:
806 ; SSE: # BB#0:
807 ; SSE-NEXT: addps (%rdi), %xmm0
808 ; SSE-NEXT: addps 16(%rdi), %xmm1
809 ; SSE-NEXT: addps 32(%rdi), %xmm2
810 ; SSE-NEXT: addps 48(%rdi), %xmm3
811 ; SSE-NEXT: retq
812 ;
813 ; AVX-LABEL: test_arg_v16f32:
814 ; AVX: # BB#0:
815 ; AVX-NEXT: vaddps (%rdi), %ymm0, %ymm0
816 ; AVX-NEXT: vaddps 32(%rdi), %ymm1, %ymm1
817 ; AVX-NEXT: retq
818 ;
819 ; AVX512-LABEL: test_arg_v16f32:
820 ; AVX512: # BB#0:
821 ; AVX512-NEXT: vaddps (%rdi), %zmm0, %zmm0
822 ; AVX512-NEXT: retq
823 %1 = load <16 x float>, <16 x float>* %src, align 32, !nontemporal !1
824 %2 = fadd <16 x float> %arg, %1
825 ret <16 x float> %2
826 }
827
828 define <16 x i32> @test_arg_v16i32(<16 x i32> %arg, <16 x i32>* %src) {
829 ; SSE-LABEL: test_arg_v16i32:
830 ; SSE: # BB#0:
831 ; SSE-NEXT: paddd (%rdi), %xmm0
832 ; SSE-NEXT: paddd 16(%rdi), %xmm1
833 ; SSE-NEXT: paddd 32(%rdi), %xmm2
834 ; SSE-NEXT: paddd 48(%rdi), %xmm3
835 ; SSE-NEXT: retq
836 ;
837 ; AVX1-LABEL: test_arg_v16i32:
838 ; AVX1: # BB#0:
839 ; AVX1-NEXT: vmovaps (%rdi), %ymm2
840 ; AVX1-NEXT: vmovaps 32(%rdi), %ymm3
841 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
842 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm5
843 ; AVX1-NEXT: vpaddd %xmm5, %xmm4, %xmm4
844 ; AVX1-NEXT: vpaddd %xmm2, %xmm0, %xmm0
845 ; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm0
846 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
847 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4
848 ; AVX1-NEXT: vpaddd %xmm4, %xmm2, %xmm2
849 ; AVX1-NEXT: vpaddd %xmm3, %xmm1, %xmm1
850 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
851 ; AVX1-NEXT: retq
852 ;
853 ; AVX2-LABEL: test_arg_v16i32:
854 ; AVX2: # BB#0:
855 ; AVX2-NEXT: vpaddd (%rdi), %ymm0, %ymm0
856 ; AVX2-NEXT: vpaddd 32(%rdi), %ymm1, %ymm1
857 ; AVX2-NEXT: retq
858 ;
859 ; AVX512-LABEL: test_arg_v16i32:
860 ; AVX512: # BB#0:
861 ; AVX512-NEXT: vpaddd (%rdi), %zmm0, %zmm0
862 ; AVX512-NEXT: retq
863 %1 = load <16 x i32>, <16 x i32>* %src, align 32, !nontemporal !1
864 %2 = add <16 x i32> %arg, %1
865 ret <16 x i32> %2
866 }
867
868 define <8 x double> @test_arg_v8f64(<8 x double> %arg, <8 x double>* %src) {
869 ; SSE-LABEL: test_arg_v8f64:
870 ; SSE: # BB#0:
871 ; SSE-NEXT: addpd (%rdi), %xmm0
872 ; SSE-NEXT: addpd 16(%rdi), %xmm1
873 ; SSE-NEXT: addpd 32(%rdi), %xmm2
874 ; SSE-NEXT: addpd 48(%rdi), %xmm3
875 ; SSE-NEXT: retq
876 ;
877 ; AVX-LABEL: test_arg_v8f64:
878 ; AVX: # BB#0:
879 ; AVX-NEXT: vaddpd (%rdi), %ymm0, %ymm0
880 ; AVX-NEXT: vaddpd 32(%rdi), %ymm1, %ymm1
881 ; AVX-NEXT: retq
882 ;
883 ; AVX512-LABEL: test_arg_v8f64:
884 ; AVX512: # BB#0:
885 ; AVX512-NEXT: vaddpd (%rdi), %zmm0, %zmm0
886 ; AVX512-NEXT: retq
887 %1 = load <8 x double>, <8 x double>* %src, align 32, !nontemporal !1
888 %2 = fadd <8 x double> %arg, %1
889 ret <8 x double> %2
890 }
891
892 define <8 x i64> @test_arg_v8i64(<8 x i64> %arg, <8 x i64>* %src) {
893 ; SSE-LABEL: test_arg_v8i64:
894 ; SSE: # BB#0:
895 ; SSE-NEXT: paddq (%rdi), %xmm0
896 ; SSE-NEXT: paddq 16(%rdi), %xmm1
897 ; SSE-NEXT: paddq 32(%rdi), %xmm2
898 ; SSE-NEXT: paddq 48(%rdi), %xmm3
899 ; SSE-NEXT: retq
900 ;
901 ; AVX1-LABEL: test_arg_v8i64:
902 ; AVX1: # BB#0:
903 ; AVX1-NEXT: vmovaps (%rdi), %ymm2
904 ; AVX1-NEXT: vmovaps 32(%rdi), %ymm3
905 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
906 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm5
907 ; AVX1-NEXT: vpaddq %xmm5, %xmm4, %xmm4
908 ; AVX1-NEXT: vpaddq %xmm2, %xmm0, %xmm0
909 ; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm0
910 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
911 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4
912 ; AVX1-NEXT: vpaddq %xmm4, %xmm2, %xmm2
913 ; AVX1-NEXT: vpaddq %xmm3, %xmm1, %xmm1
914 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
915 ; AVX1-NEXT: retq
916 ;
917 ; AVX2-LABEL: test_arg_v8i64:
918 ; AVX2: # BB#0:
919 ; AVX2-NEXT: vpaddq (%rdi), %ymm0, %ymm0
920 ; AVX2-NEXT: vpaddq 32(%rdi), %ymm1, %ymm1
921 ; AVX2-NEXT: retq
922 ;
923 ; AVX512-LABEL: test_arg_v8i64:
924 ; AVX512: # BB#0:
925 ; AVX512-NEXT: vpaddq (%rdi), %zmm0, %zmm0
926 ; AVX512-NEXT: retq
927 %1 = load <8 x i64>, <8 x i64>* %src, align 32, !nontemporal !1
928 %2 = add <8 x i64> %arg, %1
929 ret <8 x i64> %2
930 }
931
932 define <32 x i16> @test_arg_v32i16(<32 x i16> %arg, <32 x i16>* %src) {
933 ; SSE-LABEL: test_arg_v32i16:
934 ; SSE: # BB#0:
935 ; SSE-NEXT: paddw (%rdi), %xmm0
936 ; SSE-NEXT: paddw 16(%rdi), %xmm1
937 ; SSE-NEXT: paddw 32(%rdi), %xmm2
938 ; SSE-NEXT: paddw 48(%rdi), %xmm3
939 ; SSE-NEXT: retq
940 ;
941 ; AVX1-LABEL: test_arg_v32i16:
942 ; AVX1: # BB#0:
943 ; AVX1-NEXT: vmovaps (%rdi), %ymm2
944 ; AVX1-NEXT: vmovaps 32(%rdi), %ymm3
945 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
946 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm5
947 ; AVX1-NEXT: vpaddw %xmm5, %xmm4, %xmm4
948 ; AVX1-NEXT: vpaddw %xmm2, %xmm0, %xmm0
949 ; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm0
950 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
951 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4
952 ; AVX1-NEXT: vpaddw %xmm4, %xmm2, %xmm2
953 ; AVX1-NEXT: vpaddw %xmm3, %xmm1, %xmm1
954 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
955 ; AVX1-NEXT: retq
956 ;
957 ; AVX2-LABEL: test_arg_v32i16:
958 ; AVX2: # BB#0:
959 ; AVX2-NEXT: vpaddw (%rdi), %ymm0, %ymm0
960 ; AVX2-NEXT: vpaddw 32(%rdi), %ymm1, %ymm1
961 ; AVX2-NEXT: retq
962 ;
963 ; AVX512F-LABEL: test_arg_v32i16:
964 ; AVX512F: # BB#0:
965 ; AVX512F-NEXT: vpaddw (%rdi), %ymm0, %ymm0
966 ; AVX512F-NEXT: vpaddw 32(%rdi), %ymm1, %ymm1
967 ; AVX512F-NEXT: retq
968 ;
969 ; AVX512BW-LABEL: test_arg_v32i16:
970 ; AVX512BW: # BB#0:
971 ; AVX512BW-NEXT: vpaddw (%rdi), %zmm0, %zmm0
972 ; AVX512BW-NEXT: retq
973 ;
974 ; AVX512VL-LABEL: test_arg_v32i16:
975 ; AVX512VL: # BB#0:
976 ; AVX512VL-NEXT: vpaddw (%rdi), %ymm0, %ymm0
977 ; AVX512VL-NEXT: vpaddw 32(%rdi), %ymm1, %ymm1
978 ; AVX512VL-NEXT: retq
979 %1 = load <32 x i16>, <32 x i16>* %src, align 32, !nontemporal !1
980 %2 = add <32 x i16> %arg, %1
981 ret <32 x i16> %2
982 }
983
984 define <64 x i8> @test_arg_v64i8(<64 x i8> %arg, <64 x i8>* %src) {
985 ; SSE-LABEL: test_arg_v64i8:
986 ; SSE: # BB#0:
987 ; SSE-NEXT: paddb (%rdi), %xmm0
988 ; SSE-NEXT: paddb 16(%rdi), %xmm1
989 ; SSE-NEXT: paddb 32(%rdi), %xmm2
990 ; SSE-NEXT: paddb 48(%rdi), %xmm3
991 ; SSE-NEXT: retq
992 ;
993 ; AVX1-LABEL: test_arg_v64i8:
994 ; AVX1: # BB#0:
995 ; AVX1-NEXT: vmovaps (%rdi), %ymm2
996 ; AVX1-NEXT: vmovaps 32(%rdi), %ymm3
997 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
998 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm5
999 ; AVX1-NEXT: vpaddb %xmm5, %xmm4, %xmm4
1000 ; AVX1-NEXT: vpaddb %xmm2, %xmm0, %xmm0
1001 ; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm0
1002 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
1003 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4
1004 ; AVX1-NEXT: vpaddb %xmm4, %xmm2, %xmm2
1005 ; AVX1-NEXT: vpaddb %xmm3, %xmm1, %xmm1
1006 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
1007 ; AVX1-NEXT: retq
1008 ;
1009 ; AVX2-LABEL: test_arg_v64i8:
1010 ; AVX2: # BB#0:
1011 ; AVX2-NEXT: vpaddb (%rdi), %ymm0, %ymm0
1012 ; AVX2-NEXT: vpaddb 32(%rdi), %ymm1, %ymm1
1013 ; AVX2-NEXT: retq
1014 ;
1015 ; AVX512F-LABEL: test_arg_v64i8:
1016 ; AVX512F: # BB#0:
1017 ; AVX512F-NEXT: vpaddb (%rdi), %ymm0, %ymm0
1018 ; AVX512F-NEXT: vpaddb 32(%rdi), %ymm1, %ymm1
1019 ; AVX512F-NEXT: retq
1020 ;
1021 ; AVX512BW-LABEL: test_arg_v64i8:
1022 ; AVX512BW: # BB#0:
1023 ; AVX512BW-NEXT: vpaddb (%rdi), %zmm0, %zmm0
1024 ; AVX512BW-NEXT: retq
1025 ;
1026 ; AVX512VL-LABEL: test_arg_v64i8:
1027 ; AVX512VL: # BB#0:
1028 ; AVX512VL-NEXT: vpaddb (%rdi), %ymm0, %ymm0
1029 ; AVX512VL-NEXT: vpaddb 32(%rdi), %ymm1, %ymm1
1030 ; AVX512VL-NEXT: retq
1031 %1 = load <64 x i8>, <64 x i8>* %src, align 32, !nontemporal !1
1032 %2 = add <64 x i8> %arg, %1
1033 ret <64 x i8> %2
1034 }
1035
5361036
5371037 ; Unaligned non-temporal loads (not supported)
5381038
5471047 ; AVX-NEXT: vmovups (%rdi), %xmm0
5481048 ; AVX-NEXT: retq
5491049 ;
550 ; VLX-LABEL: test_unaligned_v4f32:
551 ; VLX: # BB#0:
552 ; VLX-NEXT: vmovups (%rdi), %xmm0
553 ; VLX-NEXT: retq
1050 ; AVX512-LABEL: test_unaligned_v4f32:
1051 ; AVX512: # BB#0:
1052 ; AVX512-NEXT: vmovups (%rdi), %xmm0
1053 ; AVX512-NEXT: retq
5541054 %1 = load <4 x float>, <4 x float>* %src, align 1, !nontemporal !1
5551055 ret <4 x float> %1
5561056 }
5661066 ; AVX-NEXT: vmovups (%rdi), %xmm0
5671067 ; AVX-NEXT: retq
5681068 ;
569 ; VLX-LABEL: test_unaligned_v4i32:
570 ; VLX: # BB#0:
571 ; VLX-NEXT: vmovdqu32 (%rdi), %xmm0
572 ; VLX-NEXT: retq
1069 ; AVX512F-LABEL: test_unaligned_v4i32:
1070 ; AVX512F: # BB#0:
1071 ; AVX512F-NEXT: vmovups (%rdi), %xmm0
1072 ; AVX512F-NEXT: retq
1073 ;
1074 ; AVX512BW-LABEL: test_unaligned_v4i32:
1075 ; AVX512BW: # BB#0:
1076 ; AVX512BW-NEXT: vmovups (%rdi), %xmm0
1077 ; AVX512BW-NEXT: retq
1078 ;
1079 ; AVX512VL-LABEL: test_unaligned_v4i32:
1080 ; AVX512VL: # BB#0:
1081 ; AVX512VL-NEXT: vmovdqu32 (%rdi), %xmm0
1082 ; AVX512VL-NEXT: retq
5731083 %1 = load <4 x i32>, <4 x i32>* %src, align 1, !nontemporal !1
5741084 ret <4 x i32> %1
5751085 }
5851095 ; AVX-NEXT: vmovups (%rdi), %xmm0
5861096 ; AVX-NEXT: retq
5871097 ;
588 ; VLX-LABEL: test_unaligned_v2f64:
589 ; VLX: # BB#0:
590 ; VLX-NEXT: vmovupd (%rdi), %xmm0
591 ; VLX-NEXT: retq
1098 ; AVX512F-LABEL: test_unaligned_v2f64:
1099 ; AVX512F: # BB#0:
1100 ; AVX512F-NEXT: vmovups (%rdi), %xmm0
1101 ; AVX512F-NEXT: retq
1102 ;
1103 ; AVX512BW-LABEL: test_unaligned_v2f64:
1104 ; AVX512BW: # BB#0:
1105 ; AVX512BW-NEXT: vmovups (%rdi), %xmm0
1106 ; AVX512BW-NEXT: retq
1107 ;
1108 ; AVX512VL-LABEL: test_unaligned_v2f64:
1109 ; AVX512VL: # BB#0:
1110 ; AVX512VL-NEXT: vmovupd (%rdi), %xmm0
1111 ; AVX512VL-NEXT: retq
5921112 %1 = load <2 x double>, <2 x double>* %src, align 1, !nontemporal !1
5931113 ret <2 x double> %1
5941114 }
6041124 ; AVX-NEXT: vmovups (%rdi), %xmm0
6051125 ; AVX-NEXT: retq
6061126 ;
607 ; VLX-LABEL: test_unaligned_v2i64:
608 ; VLX: # BB#0:
609 ; VLX-NEXT: vmovdqu64 (%rdi), %xmm0
610 ; VLX-NEXT: retq
1127 ; AVX512F-LABEL: test_unaligned_v2i64:
1128 ; AVX512F: # BB#0:
1129 ; AVX512F-NEXT: vmovups (%rdi), %xmm0
1130 ; AVX512F-NEXT: retq
1131 ;
1132 ; AVX512BW-LABEL: test_unaligned_v2i64:
1133 ; AVX512BW: # BB#0:
1134 ; AVX512BW-NEXT: vmovups (%rdi), %xmm0
1135 ; AVX512BW-NEXT: retq
1136 ;
1137 ; AVX512VL-LABEL: test_unaligned_v2i64:
1138 ; AVX512VL: # BB#0:
1139 ; AVX512VL-NEXT: vmovdqu64 (%rdi), %xmm0
1140 ; AVX512VL-NEXT: retq
6111141 %1 = load <2 x i64>, <2 x i64>* %src, align 1, !nontemporal !1
6121142 ret <2 x i64> %1
6131143 }
6231153 ; AVX-NEXT: vmovups (%rdi), %xmm0
6241154 ; AVX-NEXT: retq
6251155 ;
626 ; VLX-LABEL: test_unaligned_v8i16:
627 ; VLX: # BB#0:
628 ; VLX-NEXT: vmovdqu64 (%rdi), %xmm0
629 ; VLX-NEXT: retq
1156 ; AVX512F-LABEL: test_unaligned_v8i16:
1157 ; AVX512F: # BB#0:
1158 ; AVX512F-NEXT: vmovups (%rdi), %xmm0
1159 ; AVX512F-NEXT: retq
1160 ;
1161 ; AVX512BW-LABEL: test_unaligned_v8i16:
1162 ; AVX512BW: # BB#0:
1163 ; AVX512BW-NEXT: vmovups (%rdi), %xmm0
1164 ; AVX512BW-NEXT: retq
1165 ;
1166 ; AVX512VL-LABEL: test_unaligned_v8i16:
1167 ; AVX512VL: # BB#0:
1168 ; AVX512VL-NEXT: vmovdqu64 (%rdi), %xmm0
1169 ; AVX512VL-NEXT: retq
6301170 %1 = load <8 x i16>, <8 x i16>* %src, align 1, !nontemporal !1
6311171 ret <8 x i16> %1
6321172 }
6421182 ; AVX-NEXT: vmovups (%rdi), %xmm0
6431183 ; AVX-NEXT: retq
6441184 ;
645 ; VLX-LABEL: test_unaligned_v16i8:
646 ; VLX: # BB#0:
647 ; VLX-NEXT: vmovdqu64 (%rdi), %xmm0
648 ; VLX-NEXT: retq
1185 ; AVX512F-LABEL: test_unaligned_v16i8:
1186 ; AVX512F: # BB#0:
1187 ; AVX512F-NEXT: vmovups (%rdi), %xmm0
1188 ; AVX512F-NEXT: retq
1189 ;
1190 ; AVX512BW-LABEL: test_unaligned_v16i8:
1191 ; AVX512BW: # BB#0:
1192 ; AVX512BW-NEXT: vmovups (%rdi), %xmm0
1193 ; AVX512BW-NEXT: retq
1194 ;
1195 ; AVX512VL-LABEL: test_unaligned_v16i8:
1196 ; AVX512VL: # BB#0:
1197 ; AVX512VL-NEXT: vmovdqu64 (%rdi), %xmm0
1198 ; AVX512VL-NEXT: retq
6491199 %1 = load <16 x i8>, <16 x i8>* %src, align 1, !nontemporal !1
6501200 ret <16 x i8> %1
6511201 }
6641214 ; AVX-NEXT: vmovups (%rdi), %ymm0
6651215 ; AVX-NEXT: retq
6661216 ;
667 ; VLX-LABEL: test_unaligned_v8f32:
668 ; VLX: # BB#0:
669 ; VLX-NEXT: vmovups (%rdi), %ymm0
670 ; VLX-NEXT: retq
1217 ; AVX512-LABEL: test_unaligned_v8f32:
1218 ; AVX512: # BB#0:
1219 ; AVX512-NEXT: vmovups (%rdi), %ymm0
1220 ; AVX512-NEXT: retq
6711221 %1 = load <8 x float>, <8 x float>* %src, align 1, !nontemporal !1
6721222 ret <8 x float> %1
6731223 }
6841234 ; AVX-NEXT: vmovups (%rdi), %ymm0
6851235 ; AVX-NEXT: retq
6861236 ;
687 ; VLX-LABEL: test_unaligned_v8i32:
688 ; VLX: # BB#0:
689 ; VLX-NEXT: vmovdqu32 (%rdi), %ymm0
690 ; VLX-NEXT: retq
1237 ; AVX512F-LABEL: test_unaligned_v8i32:
1238 ; AVX512F: # BB#0:
1239 ; AVX512F-NEXT: vmovups (%rdi), %ymm0
1240 ; AVX512F-NEXT: retq
1241 ;
1242 ; AVX512BW-LABEL: test_unaligned_v8i32:
1243 ; AVX512BW: # BB#0:
1244 ; AVX512BW-NEXT: vmovups (%rdi), %ymm0
1245 ; AVX512BW-NEXT: retq
1246 ;
1247 ; AVX512VL-LABEL: test_unaligned_v8i32:
1248 ; AVX512VL: # BB#0:
1249 ; AVX512VL-NEXT: vmovdqu32 (%rdi), %ymm0
1250 ; AVX512VL-NEXT: retq
6911251 %1 = load <8 x i32>, <8 x i32>* %src, align 1, !nontemporal !1
6921252 ret <8 x i32> %1
6931253 }
7041264 ; AVX-NEXT: vmovups (%rdi), %ymm0
7051265 ; AVX-NEXT: retq
7061266 ;
707 ; VLX-LABEL: test_unaligned_v4f64:
708 ; VLX: # BB#0:
709 ; VLX-NEXT: vmovupd (%rdi), %ymm0
710 ; VLX-NEXT: retq
1267 ; AVX512F-LABEL: test_unaligned_v4f64:
1268 ; AVX512F: # BB#0:
1269 ; AVX512F-NEXT: vmovups (%rdi), %ymm0
1270 ; AVX512F-NEXT: retq
1271 ;
1272 ; AVX512BW-LABEL: test_unaligned_v4f64:
1273 ; AVX512BW: # BB#0:
1274 ; AVX512BW-NEXT: vmovups (%rdi), %ymm0
1275 ; AVX512BW-NEXT: retq
1276 ;
1277 ; AVX512VL-LABEL: test_unaligned_v4f64:
1278 ; AVX512VL: # BB#0:
1279 ; AVX512VL-NEXT: vmovupd (%rdi), %ymm0
1280 ; AVX512VL-NEXT: retq
7111281 %1 = load <4 x double>, <4 x double>* %src, align 1, !nontemporal !1
7121282 ret <4 x double> %1
7131283 }
7241294 ; AVX-NEXT: vmovups (%rdi), %ymm0
7251295 ; AVX-NEXT: retq
7261296 ;
727 ; VLX-LABEL: test_unaligned_v4i64:
728 ; VLX: # BB#0:
729 ; VLX-NEXT: vmovdqu64 (%rdi), %ymm0
730 ; VLX-NEXT: retq
1297 ; AVX512F-LABEL: test_unaligned_v4i64:
1298 ; AVX512F: # BB#0:
1299 ; AVX512F-NEXT: vmovups (%rdi), %ymm0
1300 ; AVX512F-NEXT: retq
1301 ;
1302 ; AVX512BW-LABEL: test_unaligned_v4i64:
1303 ; AVX512BW: # BB#0:
1304 ; AVX512BW-NEXT: vmovups (%rdi), %ymm0
1305 ; AVX512BW-NEXT: retq
1306 ;
1307 ; AVX512VL-LABEL: test_unaligned_v4i64:
1308 ; AVX512VL: # BB#0:
1309 ; AVX512VL-NEXT: vmovdqu64 (%rdi), %ymm0
1310 ; AVX512VL-NEXT: retq
7311311 %1 = load <4 x i64>, <4 x i64>* %src, align 1, !nontemporal !1
7321312 ret <4 x i64> %1
7331313 }
7441324 ; AVX-NEXT: vmovups (%rdi), %ymm0
7451325 ; AVX-NEXT: retq
7461326 ;
747 ; VLX-LABEL: test_unaligned_v16i16:
748 ; VLX: # BB#0:
749 ; VLX-NEXT: vmovdqu64 (%rdi), %ymm0
750 ; VLX-NEXT: retq
1327 ; AVX512F-LABEL: test_unaligned_v16i16:
1328 ; AVX512F: # BB#0:
1329 ; AVX512F-NEXT: vmovups (%rdi), %ymm0
1330 ; AVX512F-NEXT: retq
1331 ;
1332 ; AVX512BW-LABEL: test_unaligned_v16i16:
1333 ; AVX512BW: # BB#0:
1334 ; AVX512BW-NEXT: vmovups (%rdi), %ymm0
1335 ; AVX512BW-NEXT: retq
1336 ;
1337 ; AVX512VL-LABEL: test_unaligned_v16i16:
1338 ; AVX512VL: # BB#0:
1339 ; AVX512VL-NEXT: vmovdqu64 (%rdi), %ymm0
1340 ; AVX512VL-NEXT: retq
7511341 %1 = load <16 x i16>, <16 x i16>* %src, align 1, !nontemporal !1
7521342 ret <16 x i16> %1
7531343 }
7641354 ; AVX-NEXT: vmovups (%rdi), %ymm0
7651355 ; AVX-NEXT: retq
7661356 ;
767 ; VLX-LABEL: test_unaligned_v32i8:
768 ; VLX: # BB#0:
769 ; VLX-NEXT: vmovdqu64 (%rdi), %ymm0
770 ; VLX-NEXT: retq
1357 ; AVX512F-LABEL: test_unaligned_v32i8:
1358 ; AVX512F: # BB#0:
1359 ; AVX512F-NEXT: vmovups (%rdi), %ymm0
1360 ; AVX512F-NEXT: retq
1361 ;
1362 ; AVX512BW-LABEL: test_unaligned_v32i8:
1363 ; AVX512BW: # BB#0:
1364 ; AVX512BW-NEXT: vmovups (%rdi), %ymm0
1365 ; AVX512BW-NEXT: retq
1366 ;
1367 ; AVX512VL-LABEL: test_unaligned_v32i8:
1368 ; AVX512VL: # BB#0:
1369 ; AVX512VL-NEXT: vmovdqu64 (%rdi), %ymm0
1370 ; AVX512VL-NEXT: retq
7711371 %1 = load <32 x i8>, <32 x i8>* %src, align 1, !nontemporal !1
7721372 ret <32 x i8> %1
7731373 }
7741374
1375 ; And now ZMM versions.
1376
1377 define <16 x float> @test_unaligned_v16f32(<16 x float>* %src) {
1378 ; SSE-LABEL: test_unaligned_v16f32:
1379 ; SSE: # BB#0:
1380 ; SSE-NEXT: movups (%rdi), %xmm0
1381 ; SSE-NEXT: movups 16(%rdi), %xmm1
1382 ; SSE-NEXT: movups 32(%rdi), %xmm2
1383 ; SSE-NEXT: movups 48(%rdi), %xmm3
1384 ; SSE-NEXT: retq
1385 ;
1386 ; AVX-LABEL: test_unaligned_v16f32:
1387 ; AVX: # BB#0:
1388 ; AVX-NEXT: vmovups (%rdi), %ymm0
1389 ; AVX-NEXT: vmovups 32(%rdi), %ymm1
1390 ; AVX-NEXT: retq
1391 ;
1392 ; AVX512-LABEL: test_unaligned_v16f32:
1393 ; AVX512: # BB#0:
1394 ; AVX512-NEXT: vmovups (%rdi), %zmm0
1395 ; AVX512-NEXT: retq
1396 %1 = load <16 x float>, <16 x float>* %src, align 1, !nontemporal !1
1397 ret <16 x float> %1
1398 }
1399
1400 define <16 x i32> @test_unaligned_v16i32(<16 x i32>* %src) {
1401 ; SSE-LABEL: test_unaligned_v16i32:
1402 ; SSE: # BB#0:
1403 ; SSE-NEXT: movups (%rdi), %xmm0
1404 ; SSE-NEXT: movups 16(%rdi), %xmm1
1405 ; SSE-NEXT: movups 32(%rdi), %xmm2
1406 ; SSE-NEXT: movups 48(%rdi), %xmm3
1407 ; SSE-NEXT: retq
1408 ;
1409 ; AVX-LABEL: test_unaligned_v16i32:
1410 ; AVX: # BB#0:
1411 ; AVX-NEXT: vmovups (%rdi), %ymm0
1412 ; AVX-NEXT: vmovups 32(%rdi), %ymm1
1413 ; AVX-NEXT: retq
1414 ;
1415 ; AVX512-LABEL: test_unaligned_v16i32:
1416 ; AVX512: # BB#0:
1417 ; AVX512-NEXT: vmovdqu32 (%rdi), %zmm0
1418 ; AVX512-NEXT: retq
1419 %1 = load <16 x i32>, <16 x i32>* %src, align 1, !nontemporal !1
1420 ret <16 x i32> %1
1421 }
1422
1423 define <8 x double> @test_unaligned_v8f64(<8 x double>* %src) {
1424 ; SSE-LABEL: test_unaligned_v8f64:
1425 ; SSE: # BB#0:
1426 ; SSE-NEXT: movups (%rdi), %xmm0
1427 ; SSE-NEXT: movups 16(%rdi), %xmm1
1428 ; SSE-NEXT: movups 32(%rdi), %xmm2
1429 ; SSE-NEXT: movups 48(%rdi), %xmm3
1430 ; SSE-NEXT: retq
1431 ;
1432 ; AVX-LABEL: test_unaligned_v8f64:
1433 ; AVX: # BB#0:
1434 ; AVX-NEXT: vmovups (%rdi), %ymm0
1435 ; AVX-NEXT: vmovups 32(%rdi), %ymm1
1436 ; AVX-NEXT: retq
1437 ;
1438 ; AVX512-LABEL: test_unaligned_v8f64:
1439 ; AVX512: # BB#0:
1440 ; AVX512-NEXT: vmovupd (%rdi), %zmm0
1441 ; AVX512-NEXT: retq
1442 %1 = load <8 x double>, <8 x double>* %src, align 1, !nontemporal !1
1443 ret <8 x double> %1
1444 }
1445
1446 define <8 x i64> @test_unaligned_v8i64(<8 x i64>* %src) {
1447 ; SSE-LABEL: test_unaligned_v8i64:
1448 ; SSE: # BB#0:
1449 ; SSE-NEXT: movups (%rdi), %xmm0
1450 ; SSE-NEXT: movups 16(%rdi), %xmm1
1451 ; SSE-NEXT: movups 32(%rdi), %xmm2
1452 ; SSE-NEXT: movups 48(%rdi), %xmm3
1453 ; SSE-NEXT: retq
1454 ;
1455 ; AVX-LABEL: test_unaligned_v8i64:
1456 ; AVX: # BB#0:
1457 ; AVX-NEXT: vmovups (%rdi), %ymm0
1458 ; AVX-NEXT: vmovups 32(%rdi), %ymm1
1459 ; AVX-NEXT: retq
1460 ;
1461 ; AVX512-LABEL: test_unaligned_v8i64:
1462 ; AVX512: # BB#0:
1463 ; AVX512-NEXT: vmovdqu64 (%rdi), %zmm0
1464 ; AVX512-NEXT: retq
1465 %1 = load <8 x i64>, <8 x i64>* %src, align 1, !nontemporal !1
1466 ret <8 x i64> %1
1467 }
1468
1469 define <32 x i16> @test_unaligned_v32i16(<32 x i16>* %src) {
1470 ; SSE-LABEL: test_unaligned_v32i16:
1471 ; SSE: # BB#0:
1472 ; SSE-NEXT: movups (%rdi), %xmm0
1473 ; SSE-NEXT: movups 16(%rdi), %xmm1
1474 ; SSE-NEXT: movups 32(%rdi), %xmm2
1475 ; SSE-NEXT: movups 48(%rdi), %xmm3
1476 ; SSE-NEXT: retq
1477 ;
1478 ; AVX-LABEL: test_unaligned_v32i16:
1479 ; AVX: # BB#0:
1480 ; AVX-NEXT: vmovups (%rdi), %ymm0
1481 ; AVX-NEXT: vmovups 32(%rdi), %ymm1
1482 ; AVX-NEXT: retq
1483 ;
1484 ; AVX512F-LABEL: test_unaligned_v32i16:
1485 ; AVX512F: # BB#0:
1486 ; AVX512F-NEXT: vmovups (%rdi), %ymm0
1487 ; AVX512F-NEXT: vmovups 32(%rdi), %ymm1
1488 ; AVX512F-NEXT: retq
1489 ;
1490 ; AVX512BW-LABEL: test_unaligned_v32i16:
1491 ; AVX512BW: # BB#0:
1492 ; AVX512BW-NEXT: vmovdqu16 (%rdi), %zmm0
1493 ; AVX512BW-NEXT: retq
1494 ;
1495 ; AVX512VL-LABEL: test_unaligned_v32i16:
1496 ; AVX512VL: # BB#0:
1497 ; AVX512VL-NEXT: vmovdqu64 (%rdi), %ymm0
1498 ; AVX512VL-NEXT: vmovdqu64 32(%rdi), %ymm1
1499 ; AVX512VL-NEXT: retq
1500 %1 = load <32 x i16>, <32 x i16>* %src, align 1, !nontemporal !1
1501 ret <32 x i16> %1
1502 }
1503
1504 define <64 x i8> @test_unaligned_v64i8(<64 x i8>* %src) {
1505 ; SSE-LABEL: test_unaligned_v64i8:
1506 ; SSE: # BB#0:
1507 ; SSE-NEXT: movups (%rdi), %xmm0
1508 ; SSE-NEXT: movups 16(%rdi), %xmm1
1509 ; SSE-NEXT: movups 32(%rdi), %xmm2
1510 ; SSE-NEXT: movups 48(%rdi), %xmm3
1511 ; SSE-NEXT: retq
1512 ;
1513 ; AVX-LABEL: test_unaligned_v64i8:
1514 ; AVX: # BB#0:
1515 ; AVX-NEXT: vmovups (%rdi), %ymm0
1516 ; AVX-NEXT: vmovups 32(%rdi), %ymm1
1517 ; AVX-NEXT: retq
1518 ;
1519 ; AVX512F-LABEL: test_unaligned_v64i8:
1520 ; AVX512F: # BB#0:
1521 ; AVX512F-NEXT: vmovups (%rdi), %ymm0
1522 ; AVX512F-NEXT: vmovups 32(%rdi), %ymm1
1523 ; AVX512F-NEXT: retq
1524 ;
1525 ; AVX512BW-LABEL: test_unaligned_v64i8:
1526 ; AVX512BW: # BB#0:
1527 ; AVX512BW-NEXT: vmovdqu8 (%rdi), %zmm0
1528 ; AVX512BW-NEXT: retq
1529 ;
1530 ; AVX512VL-LABEL: test_unaligned_v64i8:
1531 ; AVX512VL: # BB#0:
1532 ; AVX512VL-NEXT: vmovdqu64 (%rdi), %ymm0
1533 ; AVX512VL-NEXT: vmovdqu64 32(%rdi), %ymm1
1534 ; AVX512VL-NEXT: retq
1535 %1 = load <64 x i8>, <64 x i8>* %src, align 1, !nontemporal !1
1536 ret <64 x i8> %1
1537 }
1538
7751539 !1 = !{i32 1}