1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -verify-machineinstrs -mtriple=x86_64-unknown-unknown -mattr=+mmx,+sse2 -fast-isel -O0 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE2
3 ; RUN: llc < %s -verify-machineinstrs -mtriple=x86_64-unknown-unknown -mattr=+mmx,+sse4a -fast-isel -O0 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE4A
4 ; RUN: llc < %s -verify-machineinstrs -mtriple=x86_64-unknown-unknown -mattr=+mmx,+sse4.1 -fast-isel -O0 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE41
5 ; RUN: llc < %s -verify-machineinstrs -mtriple=x86_64-unknown-unknown -mattr=+mmx,+avx -fast-isel -O0 | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1
6 ; RUN: llc < %s -verify-machineinstrs -mtriple=x86_64-unknown-unknown -mattr=+mmx,+avx2 -fast-isel -O0 | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2
7 ; RUN: llc < %s -verify-machineinstrs -mtriple=x86_64-unknown-unknown -mattr=+mmx,+avx512vl -fast-isel -O0 | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512VL
8 ; RUN: llc < %s -verify-machineinstrs -mtriple=x86_64-unknown-unknown -mattr=+mmx,+avx512f -fast-isel -O0 | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512F
9 ; RUN: llc < %s -verify-machineinstrs -mtriple=x86_64-unknown-unknown -mattr=+mmx,+avx512bw -fast-isel -O0 | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512BW
15 define void @test_nti32(i32* nocapture %ptr, i32 %X) {
16 ; ALL-LABEL: test_nti32:
17 ; ALL: # %bb.0: # %entry
18 ; ALL-NEXT: movntil %esi, (%rdi)
21 store i32 %X, i32* %ptr, align 4, !nontemporal !1
25 define void @test_nti64(i64* nocapture %ptr, i64 %X) {
26 ; ALL-LABEL: test_nti64:
27 ; ALL: # %bb.0: # %entry
28 ; ALL-NEXT: movntiq %rsi, (%rdi)
31 store i64 %X, i64* %ptr, align 8, !nontemporal !1
35 define void @test_ntfloat(float* nocapture %ptr, float %X) {
36 ; SSE2-LABEL: test_ntfloat:
37 ; SSE2: # %bb.0: # %entry
38 ; SSE2-NEXT: movss %xmm0, (%rdi)
41 ; SSE4A-LABEL: test_ntfloat:
42 ; SSE4A: # %bb.0: # %entry
43 ; SSE4A-NEXT: movntss %xmm0, (%rdi)
46 ; SSE41-LABEL: test_ntfloat:
47 ; SSE41: # %bb.0: # %entry
48 ; SSE41-NEXT: movss %xmm0, (%rdi)
51 ; AVX-LABEL: test_ntfloat:
52 ; AVX: # %bb.0: # %entry
53 ; AVX-NEXT: vmovss %xmm0, (%rdi)
56 ; AVX512-LABEL: test_ntfloat:
57 ; AVX512: # %bb.0: # %entry
58 ; AVX512-NEXT: vmovss %xmm0, (%rdi)
61 store float %X, float* %ptr, align 4, !nontemporal !1
65 define void @test_ntdouble(double* nocapture %ptr, double %X) {
66 ; SSE2-LABEL: test_ntdouble:
67 ; SSE2: # %bb.0: # %entry
68 ; SSE2-NEXT: movsd %xmm0, (%rdi)
71 ; SSE4A-LABEL: test_ntdouble:
72 ; SSE4A: # %bb.0: # %entry
73 ; SSE4A-NEXT: movntsd %xmm0, (%rdi)
76 ; SSE41-LABEL: test_ntdouble:
77 ; SSE41: # %bb.0: # %entry
78 ; SSE41-NEXT: movsd %xmm0, (%rdi)
81 ; AVX-LABEL: test_ntdouble:
82 ; AVX: # %bb.0: # %entry
83 ; AVX-NEXT: vmovsd %xmm0, (%rdi)
86 ; AVX512-LABEL: test_ntdouble:
87 ; AVX512: # %bb.0: # %entry
88 ; AVX512-NEXT: vmovsd %xmm0, (%rdi)
91 store double %X, double* %ptr, align 8, !nontemporal !1
99 define void @test_mmx(x86_mmx* nocapture %a0, x86_mmx* nocapture %a1) {
100 ; ALL-LABEL: test_mmx:
101 ; ALL: # %bb.0: # %entry
102 ; ALL-NEXT: movq (%rdi), %mm0
103 ; ALL-NEXT: psrlq $3, %mm0
104 ; ALL-NEXT: movntq %mm0, (%rsi)
107 %0 = load x86_mmx, x86_mmx* %a0
108 %1 = call x86_mmx @llvm.x86.mmx.psrli.q(x86_mmx %0, i32 3)
109 store x86_mmx %1, x86_mmx* %a1, align 8, !nontemporal !1
112 declare x86_mmx @llvm.x86.mmx.psrli.q(x86_mmx, i32) nounwind readnone
115 ; 128-bit Vector Stores
118 define void @test_nt4xfloat(<4 x float>* nocapture %ptr, <4 x float> %X) {
119 ; SSE-LABEL: test_nt4xfloat:
120 ; SSE: # %bb.0: # %entry
121 ; SSE-NEXT: movntps %xmm0, (%rdi)
124 ; AVX-LABEL: test_nt4xfloat:
125 ; AVX: # %bb.0: # %entry
126 ; AVX-NEXT: vmovntps %xmm0, (%rdi)
129 ; AVX512-LABEL: test_nt4xfloat:
130 ; AVX512: # %bb.0: # %entry
131 ; AVX512-NEXT: vmovntps %xmm0, (%rdi)
134 store <4 x float> %X, <4 x float>* %ptr, align 16, !nontemporal !1
138 define void @test_nt2xdouble(<2 x double>* nocapture %ptr, <2 x double> %X) {
139 ; SSE-LABEL: test_nt2xdouble:
140 ; SSE: # %bb.0: # %entry
141 ; SSE-NEXT: movntpd %xmm0, (%rdi)
144 ; AVX-LABEL: test_nt2xdouble:
145 ; AVX: # %bb.0: # %entry
146 ; AVX-NEXT: vmovntpd %xmm0, (%rdi)
149 ; AVX512-LABEL: test_nt2xdouble:
150 ; AVX512: # %bb.0: # %entry
151 ; AVX512-NEXT: vmovntpd %xmm0, (%rdi)
154 store <2 x double> %X, <2 x double>* %ptr, align 16, !nontemporal !1
158 define void @test_nt16xi8(<16 x i8>* nocapture %ptr, <16 x i8> %X) {
159 ; SSE-LABEL: test_nt16xi8:
160 ; SSE: # %bb.0: # %entry
161 ; SSE-NEXT: movntdq %xmm0, (%rdi)
164 ; AVX-LABEL: test_nt16xi8:
165 ; AVX: # %bb.0: # %entry
166 ; AVX-NEXT: vmovntdq %xmm0, (%rdi)
169 ; AVX512-LABEL: test_nt16xi8:
170 ; AVX512: # %bb.0: # %entry
171 ; AVX512-NEXT: vmovntdq %xmm0, (%rdi)
174 store <16 x i8> %X, <16 x i8>* %ptr, align 16, !nontemporal !1
178 define void @test_nt8xi16(<8 x i16>* nocapture %ptr, <8 x i16> %X) {
179 ; SSE-LABEL: test_nt8xi16:
180 ; SSE: # %bb.0: # %entry
181 ; SSE-NEXT: movntdq %xmm0, (%rdi)
184 ; AVX-LABEL: test_nt8xi16:
185 ; AVX: # %bb.0: # %entry
186 ; AVX-NEXT: vmovntdq %xmm0, (%rdi)
189 ; AVX512-LABEL: test_nt8xi16:
190 ; AVX512: # %bb.0: # %entry
191 ; AVX512-NEXT: vmovntdq %xmm0, (%rdi)
194 store <8 x i16> %X, <8 x i16>* %ptr, align 16, !nontemporal !1
198 define void @test_nt4xi32(<4 x i32>* nocapture %ptr, <4 x i32> %X) {
199 ; SSE-LABEL: test_nt4xi32:
200 ; SSE: # %bb.0: # %entry
201 ; SSE-NEXT: movntdq %xmm0, (%rdi)
204 ; AVX-LABEL: test_nt4xi32:
205 ; AVX: # %bb.0: # %entry
206 ; AVX-NEXT: vmovntdq %xmm0, (%rdi)
209 ; AVX512-LABEL: test_nt4xi32:
210 ; AVX512: # %bb.0: # %entry
211 ; AVX512-NEXT: vmovntdq %xmm0, (%rdi)
214 store <4 x i32> %X, <4 x i32>* %ptr, align 16, !nontemporal !1
218 define void @test_nt2xi64(<2 x i64>* nocapture %ptr, <2 x i64> %X) {
219 ; SSE-LABEL: test_nt2xi64:
220 ; SSE: # %bb.0: # %entry
221 ; SSE-NEXT: movntdq %xmm0, (%rdi)
224 ; AVX-LABEL: test_nt2xi64:
225 ; AVX: # %bb.0: # %entry
226 ; AVX-NEXT: vmovntdq %xmm0, (%rdi)
229 ; AVX512-LABEL: test_nt2xi64:
230 ; AVX512: # %bb.0: # %entry
231 ; AVX512-NEXT: vmovntdq %xmm0, (%rdi)
234 store <2 x i64> %X, <2 x i64>* %ptr, align 16, !nontemporal !1
239 ; 128-bit Vector Loads
242 define <4 x float> @test_load_nt4xfloat(<4 x float>* nocapture %ptr) {
243 ; SSE2-LABEL: test_load_nt4xfloat:
244 ; SSE2: # %bb.0: # %entry
245 ; SSE2-NEXT: movaps (%rdi), %xmm0
248 ; SSE4A-LABEL: test_load_nt4xfloat:
249 ; SSE4A: # %bb.0: # %entry
250 ; SSE4A-NEXT: movaps (%rdi), %xmm0
253 ; SSE41-LABEL: test_load_nt4xfloat:
254 ; SSE41: # %bb.0: # %entry
255 ; SSE41-NEXT: movntdqa (%rdi), %xmm0
258 ; AVX-LABEL: test_load_nt4xfloat:
259 ; AVX: # %bb.0: # %entry
260 ; AVX-NEXT: vmovntdqa (%rdi), %xmm0
263 ; AVX512-LABEL: test_load_nt4xfloat:
264 ; AVX512: # %bb.0: # %entry
265 ; AVX512-NEXT: vmovntdqa (%rdi), %xmm0
268 %0 = load <4 x float>, <4 x float>* %ptr, align 16, !nontemporal !1
272 define <2 x double> @test_load_nt2xdouble(<2 x double>* nocapture %ptr) {
273 ; SSE2-LABEL: test_load_nt2xdouble:
274 ; SSE2: # %bb.0: # %entry
275 ; SSE2-NEXT: movapd (%rdi), %xmm0
278 ; SSE4A-LABEL: test_load_nt2xdouble:
279 ; SSE4A: # %bb.0: # %entry
280 ; SSE4A-NEXT: movapd (%rdi), %xmm0
283 ; SSE41-LABEL: test_load_nt2xdouble:
284 ; SSE41: # %bb.0: # %entry
285 ; SSE41-NEXT: movntdqa (%rdi), %xmm0
288 ; AVX-LABEL: test_load_nt2xdouble:
289 ; AVX: # %bb.0: # %entry
290 ; AVX-NEXT: vmovntdqa (%rdi), %xmm0
293 ; AVX512-LABEL: test_load_nt2xdouble:
294 ; AVX512: # %bb.0: # %entry
295 ; AVX512-NEXT: vmovntdqa (%rdi), %xmm0
298 %0 = load <2 x double>, <2 x double>* %ptr, align 16, !nontemporal !1
302 define <16 x i8> @test_load_nt16xi8(<16 x i8>* nocapture %ptr) {
303 ; SSE-LABEL: test_load_nt16xi8:
304 ; SSE: # %bb.0: # %entry
305 ; SSE-NEXT: movntdqa (%rdi), %xmm0
308 ; AVX-LABEL: test_load_nt16xi8:
309 ; AVX: # %bb.0: # %entry
310 ; AVX-NEXT: vmovntdqa (%rdi), %xmm0
313 ; AVX512-LABEL: test_load_nt16xi8:
314 ; AVX512: # %bb.0: # %entry
315 ; AVX512-NEXT: vmovntdqa (%rdi), %xmm0
318 %0 = load <16 x i8>, <16 x i8>* %ptr, align 16, !nontemporal !1
322 define <8 x i16> @test_load_nt8xi16(<8 x i16>* nocapture %ptr) {
323 ; SSE-LABEL: test_load_nt8xi16:
324 ; SSE: # %bb.0: # %entry
325 ; SSE-NEXT: movntdqa (%rdi), %xmm0
328 ; AVX-LABEL: test_load_nt8xi16:
329 ; AVX: # %bb.0: # %entry
330 ; AVX-NEXT: vmovntdqa (%rdi), %xmm0
333 ; AVX512-LABEL: test_load_nt8xi16:
334 ; AVX512: # %bb.0: # %entry
335 ; AVX512-NEXT: vmovntdqa (%rdi), %xmm0
338 %0 = load <8 x i16>, <8 x i16>* %ptr, align 16, !nontemporal !1
342 define <4 x i32> @test_load_nt4xi32(<4 x i32>* nocapture %ptr) {
343 ; SSE-LABEL: test_load_nt4xi32:
344 ; SSE: # %bb.0: # %entry
345 ; SSE-NEXT: movntdqa (%rdi), %xmm0
348 ; AVX-LABEL: test_load_nt4xi32:
349 ; AVX: # %bb.0: # %entry
350 ; AVX-NEXT: vmovntdqa (%rdi), %xmm0
353 ; AVX512-LABEL: test_load_nt4xi32:
354 ; AVX512: # %bb.0: # %entry
355 ; AVX512-NEXT: vmovntdqa (%rdi), %xmm0
358 %0 = load <4 x i32>, <4 x i32>* %ptr, align 16, !nontemporal !1
362 define <2 x i64> @test_load_nt2xi64(<2 x i64>* nocapture %ptr) {
363 ; SSE-LABEL: test_load_nt2xi64:
364 ; SSE: # %bb.0: # %entry
365 ; SSE-NEXT: movntdqa (%rdi), %xmm0
368 ; AVX-LABEL: test_load_nt2xi64:
369 ; AVX: # %bb.0: # %entry
370 ; AVX-NEXT: vmovntdqa (%rdi), %xmm0
373 ; AVX512-LABEL: test_load_nt2xi64:
374 ; AVX512: # %bb.0: # %entry
375 ; AVX512-NEXT: vmovntdqa (%rdi), %xmm0
378 %0 = load <2 x i64>, <2 x i64>* %ptr, align 16, !nontemporal !1
383 ; 256-bit Vector Stores
386 define void @test_nt8xfloat(<8 x float>* nocapture %ptr, <8 x float> %X) {
387 ; SSE-LABEL: test_nt8xfloat:
388 ; SSE: # %bb.0: # %entry
389 ; SSE-NEXT: movntps %xmm0, (%rdi)
390 ; SSE-NEXT: movntps %xmm1, 16(%rdi)
393 ; AVX-LABEL: test_nt8xfloat:
394 ; AVX: # %bb.0: # %entry
395 ; AVX-NEXT: vmovntps %ymm0, (%rdi)
396 ; AVX-NEXT: vzeroupper
399 ; AVX512-LABEL: test_nt8xfloat:
400 ; AVX512: # %bb.0: # %entry
401 ; AVX512-NEXT: vmovntps %ymm0, (%rdi)
402 ; AVX512-NEXT: vzeroupper
405 store <8 x float> %X, <8 x float>* %ptr, align 32, !nontemporal !1
409 define void @test_nt4xdouble(<4 x double>* nocapture %ptr, <4 x double> %X) {
410 ; SSE-LABEL: test_nt4xdouble:
411 ; SSE: # %bb.0: # %entry
412 ; SSE-NEXT: movntpd %xmm0, (%rdi)
413 ; SSE-NEXT: movntpd %xmm1, 16(%rdi)
416 ; AVX-LABEL: test_nt4xdouble:
417 ; AVX: # %bb.0: # %entry
418 ; AVX-NEXT: vmovntpd %ymm0, (%rdi)
419 ; AVX-NEXT: vzeroupper
422 ; AVX512-LABEL: test_nt4xdouble:
423 ; AVX512: # %bb.0: # %entry
424 ; AVX512-NEXT: vmovntpd %ymm0, (%rdi)
425 ; AVX512-NEXT: vzeroupper
428 store <4 x double> %X, <4 x double>* %ptr, align 32, !nontemporal !1
432 define void @test_nt32xi8(<32 x i8>* nocapture %ptr, <32 x i8> %X) {
433 ; SSE-LABEL: test_nt32xi8:
434 ; SSE: # %bb.0: # %entry
435 ; SSE-NEXT: movntdq %xmm0, (%rdi)
436 ; SSE-NEXT: movntdq %xmm1, 16(%rdi)
439 ; AVX-LABEL: test_nt32xi8:
440 ; AVX: # %bb.0: # %entry
441 ; AVX-NEXT: vmovntdq %ymm0, (%rdi)
442 ; AVX-NEXT: vzeroupper
445 ; AVX512-LABEL: test_nt32xi8:
446 ; AVX512: # %bb.0: # %entry
447 ; AVX512-NEXT: vmovntdq %ymm0, (%rdi)
448 ; AVX512-NEXT: vzeroupper
451 store <32 x i8> %X, <32 x i8>* %ptr, align 32, !nontemporal !1
455 define void @test_nt16xi16(<16 x i16>* nocapture %ptr, <16 x i16> %X) {
456 ; SSE-LABEL: test_nt16xi16:
457 ; SSE: # %bb.0: # %entry
458 ; SSE-NEXT: movntdq %xmm0, (%rdi)
459 ; SSE-NEXT: movntdq %xmm1, 16(%rdi)
462 ; AVX-LABEL: test_nt16xi16:
463 ; AVX: # %bb.0: # %entry
464 ; AVX-NEXT: vmovntdq %ymm0, (%rdi)
465 ; AVX-NEXT: vzeroupper
468 ; AVX512-LABEL: test_nt16xi16:
469 ; AVX512: # %bb.0: # %entry
470 ; AVX512-NEXT: vmovntdq %ymm0, (%rdi)
471 ; AVX512-NEXT: vzeroupper
474 store <16 x i16> %X, <16 x i16>* %ptr, align 32, !nontemporal !1
478 define void @test_nt8xi32(<8 x i32>* nocapture %ptr, <8 x i32> %X) {
479 ; SSE-LABEL: test_nt8xi32:
480 ; SSE: # %bb.0: # %entry
481 ; SSE-NEXT: movntdq %xmm0, (%rdi)
482 ; SSE-NEXT: movntdq %xmm1, 16(%rdi)
485 ; AVX-LABEL: test_nt8xi32:
486 ; AVX: # %bb.0: # %entry
487 ; AVX-NEXT: vmovntdq %ymm0, (%rdi)
488 ; AVX-NEXT: vzeroupper
491 ; AVX512-LABEL: test_nt8xi32:
492 ; AVX512: # %bb.0: # %entry
493 ; AVX512-NEXT: vmovntdq %ymm0, (%rdi)
494 ; AVX512-NEXT: vzeroupper
497 store <8 x i32> %X, <8 x i32>* %ptr, align 32, !nontemporal !1
501 define void @test_nt4xi64(<4 x i64>* nocapture %ptr, <4 x i64> %X) {
502 ; SSE-LABEL: test_nt4xi64:
503 ; SSE: # %bb.0: # %entry
504 ; SSE-NEXT: movntdq %xmm0, (%rdi)
505 ; SSE-NEXT: movntdq %xmm1, 16(%rdi)
508 ; AVX-LABEL: test_nt4xi64:
509 ; AVX: # %bb.0: # %entry
510 ; AVX-NEXT: vmovntdq %ymm0, (%rdi)
511 ; AVX-NEXT: vzeroupper
514 ; AVX512-LABEL: test_nt4xi64:
515 ; AVX512: # %bb.0: # %entry
516 ; AVX512-NEXT: vmovntdq %ymm0, (%rdi)
517 ; AVX512-NEXT: vzeroupper
520 store <4 x i64> %X, <4 x i64>* %ptr, align 32, !nontemporal !1
525 ; 256-bit Vector Loads
528 define <8 x float> @test_load_nt8xfloat(<8 x float>* nocapture %ptr) {
529 ; SSE2-LABEL: test_load_nt8xfloat:
530 ; SSE2: # %bb.0: # %entry
531 ; SSE2-NEXT: movaps (%rdi), %xmm0
532 ; SSE2-NEXT: movaps 16(%rdi), %xmm1
535 ; SSE4A-LABEL: test_load_nt8xfloat:
536 ; SSE4A: # %bb.0: # %entry
537 ; SSE4A-NEXT: movaps (%rdi), %xmm0
538 ; SSE4A-NEXT: movaps 16(%rdi), %xmm1
541 ; SSE41-LABEL: test_load_nt8xfloat:
542 ; SSE41: # %bb.0: # %entry
543 ; SSE41-NEXT: movntdqa (%rdi), %xmm0
544 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm1
547 ; AVX1-LABEL: test_load_nt8xfloat:
548 ; AVX1: # %bb.0: # %entry
549 ; AVX1-NEXT: vmovntdqa (%rdi), %xmm0
550 ; AVX1-NEXT: # implicit-def: $ymm1
551 ; AVX1-NEXT: vmovaps %xmm0, %xmm1
552 ; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm0
553 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
556 ; AVX2-LABEL: test_load_nt8xfloat:
557 ; AVX2: # %bb.0: # %entry
558 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm0
561 ; AVX512-LABEL: test_load_nt8xfloat:
562 ; AVX512: # %bb.0: # %entry
563 ; AVX512-NEXT: vmovntdqa (%rdi), %ymm0
566 %0 = load <8 x float>, <8 x float>* %ptr, align 32, !nontemporal !1
570 define <4 x double> @test_load_nt4xdouble(<4 x double>* nocapture %ptr) {
571 ; SSE2-LABEL: test_load_nt4xdouble:
572 ; SSE2: # %bb.0: # %entry
573 ; SSE2-NEXT: movapd (%rdi), %xmm0
574 ; SSE2-NEXT: movapd 16(%rdi), %xmm1
577 ; SSE4A-LABEL: test_load_nt4xdouble:
578 ; SSE4A: # %bb.0: # %entry
579 ; SSE4A-NEXT: movapd (%rdi), %xmm0
580 ; SSE4A-NEXT: movapd 16(%rdi), %xmm1
583 ; SSE41-LABEL: test_load_nt4xdouble:
584 ; SSE41: # %bb.0: # %entry
585 ; SSE41-NEXT: movntdqa (%rdi), %xmm0
586 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm1
589 ; AVX1-LABEL: test_load_nt4xdouble:
590 ; AVX1: # %bb.0: # %entry
591 ; AVX1-NEXT: vmovntdqa (%rdi), %xmm0
592 ; AVX1-NEXT: # implicit-def: $ymm1
593 ; AVX1-NEXT: vmovaps %xmm0, %xmm1
594 ; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm0
595 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
598 ; AVX2-LABEL: test_load_nt4xdouble:
599 ; AVX2: # %bb.0: # %entry
600 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm0
603 ; AVX512-LABEL: test_load_nt4xdouble:
604 ; AVX512: # %bb.0: # %entry
605 ; AVX512-NEXT: vmovntdqa (%rdi), %ymm0
608 %0 = load <4 x double>, <4 x double>* %ptr, align 32, !nontemporal !1
612 define <32 x i8> @test_load_nt32xi8(<32 x i8>* nocapture %ptr) {
613 ; SSE2-LABEL: test_load_nt32xi8:
614 ; SSE2: # %bb.0: # %entry
615 ; SSE2-NEXT: movaps (%rdi), %xmm0
616 ; SSE2-NEXT: movaps 16(%rdi), %xmm1
619 ; SSE4A-LABEL: test_load_nt32xi8:
620 ; SSE4A: # %bb.0: # %entry
621 ; SSE4A-NEXT: movaps (%rdi), %xmm0
622 ; SSE4A-NEXT: movaps 16(%rdi), %xmm1
625 ; SSE41-LABEL: test_load_nt32xi8:
626 ; SSE41: # %bb.0: # %entry
627 ; SSE41-NEXT: movntdqa (%rdi), %xmm0
628 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm1
631 ; AVX1-LABEL: test_load_nt32xi8:
632 ; AVX1: # %bb.0: # %entry
633 ; AVX1-NEXT: vmovntdqa (%rdi), %xmm0
634 ; AVX1-NEXT: # implicit-def: $ymm1
635 ; AVX1-NEXT: vmovaps %xmm0, %xmm1
636 ; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm0
637 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
640 ; AVX2-LABEL: test_load_nt32xi8:
641 ; AVX2: # %bb.0: # %entry
642 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm0
645 ; AVX512-LABEL: test_load_nt32xi8:
646 ; AVX512: # %bb.0: # %entry
647 ; AVX512-NEXT: vmovntdqa (%rdi), %ymm0
650 %0 = load <32 x i8>, <32 x i8>* %ptr, align 32, !nontemporal !1
654 define <16 x i16> @test_load_nt16xi16(<16 x i16>* nocapture %ptr) {
655 ; SSE2-LABEL: test_load_nt16xi16:
656 ; SSE2: # %bb.0: # %entry
657 ; SSE2-NEXT: movaps (%rdi), %xmm0
658 ; SSE2-NEXT: movaps 16(%rdi), %xmm1
661 ; SSE4A-LABEL: test_load_nt16xi16:
662 ; SSE4A: # %bb.0: # %entry
663 ; SSE4A-NEXT: movaps (%rdi), %xmm0
664 ; SSE4A-NEXT: movaps 16(%rdi), %xmm1
667 ; SSE41-LABEL: test_load_nt16xi16:
668 ; SSE41: # %bb.0: # %entry
669 ; SSE41-NEXT: movntdqa (%rdi), %xmm0
670 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm1
673 ; AVX1-LABEL: test_load_nt16xi16:
674 ; AVX1: # %bb.0: # %entry
675 ; AVX1-NEXT: vmovntdqa (%rdi), %xmm0
676 ; AVX1-NEXT: # implicit-def: $ymm1
677 ; AVX1-NEXT: vmovaps %xmm0, %xmm1
678 ; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm0
679 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
682 ; AVX2-LABEL: test_load_nt16xi16:
683 ; AVX2: # %bb.0: # %entry
684 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm0
687 ; AVX512-LABEL: test_load_nt16xi16:
688 ; AVX512: # %bb.0: # %entry
689 ; AVX512-NEXT: vmovntdqa (%rdi), %ymm0
692 %0 = load <16 x i16>, <16 x i16>* %ptr, align 32, !nontemporal !1
696 define <8 x i32> @test_load_nt8xi32(<8 x i32>* nocapture %ptr) {
697 ; SSE2-LABEL: test_load_nt8xi32:
698 ; SSE2: # %bb.0: # %entry
699 ; SSE2-NEXT: movaps (%rdi), %xmm0
700 ; SSE2-NEXT: movaps 16(%rdi), %xmm1
703 ; SSE4A-LABEL: test_load_nt8xi32:
704 ; SSE4A: # %bb.0: # %entry
705 ; SSE4A-NEXT: movaps (%rdi), %xmm0
706 ; SSE4A-NEXT: movaps 16(%rdi), %xmm1
709 ; SSE41-LABEL: test_load_nt8xi32:
710 ; SSE41: # %bb.0: # %entry
711 ; SSE41-NEXT: movntdqa (%rdi), %xmm0
712 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm1
715 ; AVX1-LABEL: test_load_nt8xi32:
716 ; AVX1: # %bb.0: # %entry
717 ; AVX1-NEXT: vmovntdqa (%rdi), %xmm0
718 ; AVX1-NEXT: # implicit-def: $ymm1
719 ; AVX1-NEXT: vmovaps %xmm0, %xmm1
720 ; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm0
721 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
724 ; AVX2-LABEL: test_load_nt8xi32:
725 ; AVX2: # %bb.0: # %entry
726 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm0
729 ; AVX512-LABEL: test_load_nt8xi32:
730 ; AVX512: # %bb.0: # %entry
731 ; AVX512-NEXT: vmovntdqa (%rdi), %ymm0
734 %0 = load <8 x i32>, <8 x i32>* %ptr, align 32, !nontemporal !1
738 define <4 x i64> @test_load_nt4xi64(<4 x i64>* nocapture %ptr) {
739 ; SSE2-LABEL: test_load_nt4xi64:
740 ; SSE2: # %bb.0: # %entry
741 ; SSE2-NEXT: movaps (%rdi), %xmm0
742 ; SSE2-NEXT: movaps 16(%rdi), %xmm1
745 ; SSE4A-LABEL: test_load_nt4xi64:
746 ; SSE4A: # %bb.0: # %entry
747 ; SSE4A-NEXT: movaps (%rdi), %xmm0
748 ; SSE4A-NEXT: movaps 16(%rdi), %xmm1
751 ; SSE41-LABEL: test_load_nt4xi64:
752 ; SSE41: # %bb.0: # %entry
753 ; SSE41-NEXT: movntdqa (%rdi), %xmm0
754 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm1
757 ; AVX1-LABEL: test_load_nt4xi64:
758 ; AVX1: # %bb.0: # %entry
759 ; AVX1-NEXT: vmovntdqa (%rdi), %xmm0
760 ; AVX1-NEXT: # implicit-def: $ymm1
761 ; AVX1-NEXT: vmovaps %xmm0, %xmm1
762 ; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm0
763 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
766 ; AVX2-LABEL: test_load_nt4xi64:
767 ; AVX2: # %bb.0: # %entry
768 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm0
771 ; AVX512-LABEL: test_load_nt4xi64:
772 ; AVX512: # %bb.0: # %entry
773 ; AVX512-NEXT: vmovntdqa (%rdi), %ymm0
776 %0 = load <4 x i64>, <4 x i64>* %ptr, align 32, !nontemporal !1
781 ; 512-bit Vector Stores
784 define void @test_nt16xfloat(<16 x float>* nocapture %ptr, <16 x float> %X) {
785 ; SSE-LABEL: test_nt16xfloat:
786 ; SSE: # %bb.0: # %entry
787 ; SSE-NEXT: movntps %xmm0, (%rdi)
788 ; SSE-NEXT: movntps %xmm1, 16(%rdi)
789 ; SSE-NEXT: movntps %xmm2, 32(%rdi)
790 ; SSE-NEXT: movntps %xmm3, 48(%rdi)
793 ; AVX-LABEL: test_nt16xfloat:
794 ; AVX: # %bb.0: # %entry
795 ; AVX-NEXT: vmovntps %ymm0, (%rdi)
796 ; AVX-NEXT: vmovntps %ymm1, 32(%rdi)
797 ; AVX-NEXT: vzeroupper
800 ; AVX512-LABEL: test_nt16xfloat:
801 ; AVX512: # %bb.0: # %entry
802 ; AVX512-NEXT: vmovntps %zmm0, (%rdi)
803 ; AVX512-NEXT: vzeroupper
806 store <16 x float> %X, <16 x float>* %ptr, align 64, !nontemporal !1
810 define void @test_nt8xdouble(<8 x double>* nocapture %ptr, <8 x double> %X) {
811 ; SSE-LABEL: test_nt8xdouble:
812 ; SSE: # %bb.0: # %entry
813 ; SSE-NEXT: movntpd %xmm0, (%rdi)
814 ; SSE-NEXT: movntpd %xmm1, 16(%rdi)
815 ; SSE-NEXT: movntpd %xmm2, 32(%rdi)
816 ; SSE-NEXT: movntpd %xmm3, 48(%rdi)
819 ; AVX-LABEL: test_nt8xdouble:
820 ; AVX: # %bb.0: # %entry
821 ; AVX-NEXT: vmovntpd %ymm0, (%rdi)
822 ; AVX-NEXT: vmovntpd %ymm1, 32(%rdi)
823 ; AVX-NEXT: vzeroupper
826 ; AVX512-LABEL: test_nt8xdouble:
827 ; AVX512: # %bb.0: # %entry
828 ; AVX512-NEXT: vmovntpd %zmm0, (%rdi)
829 ; AVX512-NEXT: vzeroupper
832 store <8 x double> %X, <8 x double>* %ptr, align 64, !nontemporal !1
836 define void @test_nt64xi8(<64 x i8>* nocapture %ptr, <64 x i8> %X) {
837 ; SSE-LABEL: test_nt64xi8:
838 ; SSE: # %bb.0: # %entry
839 ; SSE-NEXT: movntdq %xmm0, (%rdi)
840 ; SSE-NEXT: movntdq %xmm1, 16(%rdi)
841 ; SSE-NEXT: movntdq %xmm2, 32(%rdi)
842 ; SSE-NEXT: movntdq %xmm3, 48(%rdi)
845 ; AVX-LABEL: test_nt64xi8:
846 ; AVX: # %bb.0: # %entry
847 ; AVX-NEXT: vmovntdq %ymm0, (%rdi)
848 ; AVX-NEXT: vmovntdq %ymm1, 32(%rdi)
849 ; AVX-NEXT: vzeroupper
852 ; AVX512VL-LABEL: test_nt64xi8:
853 ; AVX512VL: # %bb.0: # %entry
854 ; AVX512VL-NEXT: vmovntdq %ymm0, (%rdi)
855 ; AVX512VL-NEXT: vmovntdq %ymm1, 32(%rdi)
856 ; AVX512VL-NEXT: vzeroupper
857 ; AVX512VL-NEXT: retq
859 ; AVX512F-LABEL: test_nt64xi8:
860 ; AVX512F: # %bb.0: # %entry
861 ; AVX512F-NEXT: vmovntdq %ymm0, (%rdi)
862 ; AVX512F-NEXT: vmovntdq %ymm1, 32(%rdi)
863 ; AVX512F-NEXT: vzeroupper
866 ; AVX512BW-LABEL: test_nt64xi8:
867 ; AVX512BW: # %bb.0: # %entry
868 ; AVX512BW-NEXT: vmovntdq %zmm0, (%rdi)
869 ; AVX512BW-NEXT: vzeroupper
870 ; AVX512BW-NEXT: retq
872 store <64 x i8> %X, <64 x i8>* %ptr, align 64, !nontemporal !1
876 define void @test_nt32xi16(<32 x i16>* nocapture %ptr, <32 x i16> %X) {
877 ; SSE-LABEL: test_nt32xi16:
878 ; SSE: # %bb.0: # %entry
879 ; SSE-NEXT: movntdq %xmm0, (%rdi)
880 ; SSE-NEXT: movntdq %xmm1, 16(%rdi)
881 ; SSE-NEXT: movntdq %xmm2, 32(%rdi)
882 ; SSE-NEXT: movntdq %xmm3, 48(%rdi)
885 ; AVX-LABEL: test_nt32xi16:
886 ; AVX: # %bb.0: # %entry
887 ; AVX-NEXT: vmovntdq %ymm0, (%rdi)
888 ; AVX-NEXT: vmovntdq %ymm1, 32(%rdi)
889 ; AVX-NEXT: vzeroupper
892 ; AVX512VL-LABEL: test_nt32xi16:
893 ; AVX512VL: # %bb.0: # %entry
894 ; AVX512VL-NEXT: vmovntdq %ymm0, (%rdi)
895 ; AVX512VL-NEXT: vmovntdq %ymm1, 32(%rdi)
896 ; AVX512VL-NEXT: vzeroupper
897 ; AVX512VL-NEXT: retq
899 ; AVX512F-LABEL: test_nt32xi16:
900 ; AVX512F: # %bb.0: # %entry
901 ; AVX512F-NEXT: vmovntdq %ymm0, (%rdi)
902 ; AVX512F-NEXT: vmovntdq %ymm1, 32(%rdi)
903 ; AVX512F-NEXT: vzeroupper
906 ; AVX512BW-LABEL: test_nt32xi16:
907 ; AVX512BW: # %bb.0: # %entry
908 ; AVX512BW-NEXT: vmovntdq %zmm0, (%rdi)
909 ; AVX512BW-NEXT: vzeroupper
910 ; AVX512BW-NEXT: retq
912 store <32 x i16> %X, <32 x i16>* %ptr, align 64, !nontemporal !1
916 define void @test_nt16xi32(<16 x i32>* nocapture %ptr, <16 x i32> %X) {
917 ; SSE-LABEL: test_nt16xi32:
918 ; SSE: # %bb.0: # %entry
919 ; SSE-NEXT: movntdq %xmm0, (%rdi)
920 ; SSE-NEXT: movntdq %xmm1, 16(%rdi)
921 ; SSE-NEXT: movntdq %xmm2, 32(%rdi)
922 ; SSE-NEXT: movntdq %xmm3, 48(%rdi)
925 ; AVX-LABEL: test_nt16xi32:
926 ; AVX: # %bb.0: # %entry
927 ; AVX-NEXT: vmovntdq %ymm0, (%rdi)
928 ; AVX-NEXT: vmovntdq %ymm1, 32(%rdi)
929 ; AVX-NEXT: vzeroupper
932 ; AVX512-LABEL: test_nt16xi32:
933 ; AVX512: # %bb.0: # %entry
934 ; AVX512-NEXT: vmovntdq %zmm0, (%rdi)
935 ; AVX512-NEXT: vzeroupper
938 store <16 x i32> %X, <16 x i32>* %ptr, align 64, !nontemporal !1
942 define void @test_nt8xi64(<8 x i64>* nocapture %ptr, <8 x i64> %X) {
943 ; SSE-LABEL: test_nt8xi64:
944 ; SSE: # %bb.0: # %entry
945 ; SSE-NEXT: movntdq %xmm0, (%rdi)
946 ; SSE-NEXT: movntdq %xmm1, 16(%rdi)
947 ; SSE-NEXT: movntdq %xmm2, 32(%rdi)
948 ; SSE-NEXT: movntdq %xmm3, 48(%rdi)
951 ; AVX-LABEL: test_nt8xi64:
952 ; AVX: # %bb.0: # %entry
953 ; AVX-NEXT: vmovntdq %ymm0, (%rdi)
954 ; AVX-NEXT: vmovntdq %ymm1, 32(%rdi)
955 ; AVX-NEXT: vzeroupper
958 ; AVX512-LABEL: test_nt8xi64:
959 ; AVX512: # %bb.0: # %entry
960 ; AVX512-NEXT: vmovntdq %zmm0, (%rdi)
961 ; AVX512-NEXT: vzeroupper
964 store <8 x i64> %X, <8 x i64>* %ptr, align 64, !nontemporal !1
969 ; 512-bit Vector Loads
972 define <16 x float> @test_load_nt16xfloat(<16 x float>* nocapture %ptr) {
973 ; SSE2-LABEL: test_load_nt16xfloat:
974 ; SSE2: # %bb.0: # %entry
975 ; SSE2-NEXT: movaps (%rdi), %xmm0
976 ; SSE2-NEXT: movaps 16(%rdi), %xmm1
977 ; SSE2-NEXT: movaps 32(%rdi), %xmm2
978 ; SSE2-NEXT: movaps 48(%rdi), %xmm3
981 ; SSE4A-LABEL: test_load_nt16xfloat:
982 ; SSE4A: # %bb.0: # %entry
983 ; SSE4A-NEXT: movaps (%rdi), %xmm0
984 ; SSE4A-NEXT: movaps 16(%rdi), %xmm1
985 ; SSE4A-NEXT: movaps 32(%rdi), %xmm2
986 ; SSE4A-NEXT: movaps 48(%rdi), %xmm3
989 ; SSE41-LABEL: test_load_nt16xfloat:
990 ; SSE41: # %bb.0: # %entry
991 ; SSE41-NEXT: movntdqa (%rdi), %xmm0
992 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm1
993 ; SSE41-NEXT: movntdqa 32(%rdi), %xmm2
994 ; SSE41-NEXT: movntdqa 48(%rdi), %xmm3
997 ; AVX1-LABEL: test_load_nt16xfloat:
998 ; AVX1: # %bb.0: # %entry
999 ; AVX1-NEXT: vmovntdqa (%rdi), %xmm0
1000 ; AVX1-NEXT: # implicit-def: $ymm1
1001 ; AVX1-NEXT: vmovaps %xmm0, %xmm1
1002 ; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm0
1003 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
1004 ; AVX1-NEXT: vmovntdqa 32(%rdi), %xmm2
1005 ; AVX1-NEXT: # implicit-def: $ymm1
1006 ; AVX1-NEXT: vmovaps %xmm2, %xmm1
1007 ; AVX1-NEXT: vmovntdqa 48(%rdi), %xmm2
1008 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
1011 ; AVX2-LABEL: test_load_nt16xfloat:
1012 ; AVX2: # %bb.0: # %entry
1013 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm0
1014 ; AVX2-NEXT: vmovntdqa 32(%rdi), %ymm1
1017 ; AVX512-LABEL: test_load_nt16xfloat:
1018 ; AVX512: # %bb.0: # %entry
1019 ; AVX512-NEXT: vmovntdqa (%rdi), %zmm0
1022 %0 = load <16 x float>, <16 x float>* %ptr, align 64, !nontemporal !1
1026 define <8 x double> @test_load_nt8xdouble(<8 x double>* nocapture %ptr) {
1027 ; SSE2-LABEL: test_load_nt8xdouble:
1028 ; SSE2: # %bb.0: # %entry
1029 ; SSE2-NEXT: movapd (%rdi), %xmm0
1030 ; SSE2-NEXT: movapd 16(%rdi), %xmm1
1031 ; SSE2-NEXT: movapd 32(%rdi), %xmm2
1032 ; SSE2-NEXT: movapd 48(%rdi), %xmm3
1035 ; SSE4A-LABEL: test_load_nt8xdouble:
1036 ; SSE4A: # %bb.0: # %entry
1037 ; SSE4A-NEXT: movapd (%rdi), %xmm0
1038 ; SSE4A-NEXT: movapd 16(%rdi), %xmm1
1039 ; SSE4A-NEXT: movapd 32(%rdi), %xmm2
1040 ; SSE4A-NEXT: movapd 48(%rdi), %xmm3
1043 ; SSE41-LABEL: test_load_nt8xdouble:
1044 ; SSE41: # %bb.0: # %entry
1045 ; SSE41-NEXT: movntdqa (%rdi), %xmm0
1046 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm1
1047 ; SSE41-NEXT: movntdqa 32(%rdi), %xmm2
1048 ; SSE41-NEXT: movntdqa 48(%rdi), %xmm3
1051 ; AVX1-LABEL: test_load_nt8xdouble:
1052 ; AVX1: # %bb.0: # %entry
1053 ; AVX1-NEXT: vmovntdqa (%rdi), %xmm0
1054 ; AVX1-NEXT: # implicit-def: $ymm1
1055 ; AVX1-NEXT: vmovaps %xmm0, %xmm1
1056 ; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm0
1057 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
1058 ; AVX1-NEXT: vmovntdqa 32(%rdi), %xmm2
1059 ; AVX1-NEXT: # implicit-def: $ymm1
1060 ; AVX1-NEXT: vmovaps %xmm2, %xmm1
1061 ; AVX1-NEXT: vmovntdqa 48(%rdi), %xmm2
1062 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
1065 ; AVX2-LABEL: test_load_nt8xdouble:
1066 ; AVX2: # %bb.0: # %entry
1067 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm0
1068 ; AVX2-NEXT: vmovntdqa 32(%rdi), %ymm1
1071 ; AVX512-LABEL: test_load_nt8xdouble:
1072 ; AVX512: # %bb.0: # %entry
1073 ; AVX512-NEXT: vmovntdqa (%rdi), %zmm0
1076 %0 = load <8 x double>, <8 x double>* %ptr, align 64, !nontemporal !1
1080 define <64 x i8> @test_load_nt64xi8(<64 x i8>* nocapture %ptr) {
1081 ; SSE2-LABEL: test_load_nt64xi8:
1082 ; SSE2: # %bb.0: # %entry
1083 ; SSE2-NEXT: movaps (%rdi), %xmm0
1084 ; SSE2-NEXT: movaps 16(%rdi), %xmm1
1085 ; SSE2-NEXT: movaps 32(%rdi), %xmm2
1086 ; SSE2-NEXT: movaps 48(%rdi), %xmm3
1089 ; SSE4A-LABEL: test_load_nt64xi8:
1090 ; SSE4A: # %bb.0: # %entry
1091 ; SSE4A-NEXT: movaps (%rdi), %xmm0
1092 ; SSE4A-NEXT: movaps 16(%rdi), %xmm1
1093 ; SSE4A-NEXT: movaps 32(%rdi), %xmm2
1094 ; SSE4A-NEXT: movaps 48(%rdi), %xmm3
1097 ; SSE41-LABEL: test_load_nt64xi8:
1098 ; SSE41: # %bb.0: # %entry
1099 ; SSE41-NEXT: movntdqa (%rdi), %xmm0
1100 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm1
1101 ; SSE41-NEXT: movntdqa 32(%rdi), %xmm2
1102 ; SSE41-NEXT: movntdqa 48(%rdi), %xmm3
1105 ; AVX1-LABEL: test_load_nt64xi8:
1106 ; AVX1: # %bb.0: # %entry
1107 ; AVX1-NEXT: vmovntdqa (%rdi), %xmm0
1108 ; AVX1-NEXT: # implicit-def: $ymm1
1109 ; AVX1-NEXT: vmovaps %xmm0, %xmm1
1110 ; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm0
1111 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
1112 ; AVX1-NEXT: vmovntdqa 32(%rdi), %xmm2
1113 ; AVX1-NEXT: # implicit-def: $ymm1
1114 ; AVX1-NEXT: vmovaps %xmm2, %xmm1
1115 ; AVX1-NEXT: vmovntdqa 48(%rdi), %xmm2
1116 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
1119 ; AVX2-LABEL: test_load_nt64xi8:
1120 ; AVX2: # %bb.0: # %entry
1121 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm0
1122 ; AVX2-NEXT: vmovntdqa 32(%rdi), %ymm1
1125 ; AVX512VL-LABEL: test_load_nt64xi8:
1126 ; AVX512VL: # %bb.0: # %entry
1127 ; AVX512VL-NEXT: vmovntdqa (%rdi), %ymm0
1128 ; AVX512VL-NEXT: vmovntdqa 32(%rdi), %ymm1
1129 ; AVX512VL-NEXT: retq
1131 ; AVX512F-LABEL: test_load_nt64xi8:
1132 ; AVX512F: # %bb.0: # %entry
1133 ; AVX512F-NEXT: vmovntdqa (%rdi), %ymm0
1134 ; AVX512F-NEXT: vmovntdqa 32(%rdi), %ymm1
1135 ; AVX512F-NEXT: retq
1137 ; AVX512BW-LABEL: test_load_nt64xi8:
1138 ; AVX512BW: # %bb.0: # %entry
1139 ; AVX512BW-NEXT: vmovntdqa (%rdi), %zmm0
1140 ; AVX512BW-NEXT: retq
1142 %0 = load <64 x i8>, <64 x i8>* %ptr, align 64, !nontemporal !1
1146 define <32 x i16> @test_load_nt32xi16(<32 x i16>* nocapture %ptr) {
1147 ; SSE2-LABEL: test_load_nt32xi16:
1148 ; SSE2: # %bb.0: # %entry
1149 ; SSE2-NEXT: movaps (%rdi), %xmm0
1150 ; SSE2-NEXT: movaps 16(%rdi), %xmm1
1151 ; SSE2-NEXT: movaps 32(%rdi), %xmm2
1152 ; SSE2-NEXT: movaps 48(%rdi), %xmm3
1155 ; SSE4A-LABEL: test_load_nt32xi16:
1156 ; SSE4A: # %bb.0: # %entry
1157 ; SSE4A-NEXT: movaps (%rdi), %xmm0
1158 ; SSE4A-NEXT: movaps 16(%rdi), %xmm1
1159 ; SSE4A-NEXT: movaps 32(%rdi), %xmm2
1160 ; SSE4A-NEXT: movaps 48(%rdi), %xmm3
1163 ; SSE41-LABEL: test_load_nt32xi16:
1164 ; SSE41: # %bb.0: # %entry
1165 ; SSE41-NEXT: movntdqa (%rdi), %xmm0
1166 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm1
1167 ; SSE41-NEXT: movntdqa 32(%rdi), %xmm2
1168 ; SSE41-NEXT: movntdqa 48(%rdi), %xmm3
1171 ; AVX1-LABEL: test_load_nt32xi16:
1172 ; AVX1: # %bb.0: # %entry
1173 ; AVX1-NEXT: vmovntdqa (%rdi), %xmm0
1174 ; AVX1-NEXT: # implicit-def: $ymm1
1175 ; AVX1-NEXT: vmovaps %xmm0, %xmm1
1176 ; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm0
1177 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
1178 ; AVX1-NEXT: vmovntdqa 32(%rdi), %xmm2
1179 ; AVX1-NEXT: # implicit-def: $ymm1
1180 ; AVX1-NEXT: vmovaps %xmm2, %xmm1
1181 ; AVX1-NEXT: vmovntdqa 48(%rdi), %xmm2
1182 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
1185 ; AVX2-LABEL: test_load_nt32xi16:
1186 ; AVX2: # %bb.0: # %entry
1187 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm0
1188 ; AVX2-NEXT: vmovntdqa 32(%rdi), %ymm1
1191 ; AVX512VL-LABEL: test_load_nt32xi16:
1192 ; AVX512VL: # %bb.0: # %entry
1193 ; AVX512VL-NEXT: vmovntdqa (%rdi), %ymm0
1194 ; AVX512VL-NEXT: vmovntdqa 32(%rdi), %ymm1
1195 ; AVX512VL-NEXT: retq
1197 ; AVX512F-LABEL: test_load_nt32xi16:
1198 ; AVX512F: # %bb.0: # %entry
1199 ; AVX512F-NEXT: vmovntdqa (%rdi), %ymm0
1200 ; AVX512F-NEXT: vmovntdqa 32(%rdi), %ymm1
1201 ; AVX512F-NEXT: retq
1203 ; AVX512BW-LABEL: test_load_nt32xi16:
1204 ; AVX512BW: # %bb.0: # %entry
1205 ; AVX512BW-NEXT: vmovntdqa (%rdi), %zmm0
1206 ; AVX512BW-NEXT: retq
1208 %0 = load <32 x i16>, <32 x i16>* %ptr, align 64, !nontemporal !1
1212 define <16 x i32> @test_load_nt16xi32(<16 x i32>* nocapture %ptr) {
1213 ; SSE2-LABEL: test_load_nt16xi32:
1214 ; SSE2: # %bb.0: # %entry
1215 ; SSE2-NEXT: movaps (%rdi), %xmm0
1216 ; SSE2-NEXT: movaps 16(%rdi), %xmm1
1217 ; SSE2-NEXT: movaps 32(%rdi), %xmm2
1218 ; SSE2-NEXT: movaps 48(%rdi), %xmm3
1221 ; SSE4A-LABEL: test_load_nt16xi32:
1222 ; SSE4A: # %bb.0: # %entry
1223 ; SSE4A-NEXT: movaps (%rdi), %xmm0
1224 ; SSE4A-NEXT: movaps 16(%rdi), %xmm1
1225 ; SSE4A-NEXT: movaps 32(%rdi), %xmm2
1226 ; SSE4A-NEXT: movaps 48(%rdi), %xmm3
1229 ; SSE41-LABEL: test_load_nt16xi32:
1230 ; SSE41: # %bb.0: # %entry
1231 ; SSE41-NEXT: movntdqa (%rdi), %xmm0
1232 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm1
1233 ; SSE41-NEXT: movntdqa 32(%rdi), %xmm2
1234 ; SSE41-NEXT: movntdqa 48(%rdi), %xmm3
1237 ; AVX1-LABEL: test_load_nt16xi32:
1238 ; AVX1: # %bb.0: # %entry
1239 ; AVX1-NEXT: vmovntdqa (%rdi), %xmm0
1240 ; AVX1-NEXT: # implicit-def: $ymm1
1241 ; AVX1-NEXT: vmovaps %xmm0, %xmm1
1242 ; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm0
1243 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
1244 ; AVX1-NEXT: vmovntdqa 32(%rdi), %xmm2
1245 ; AVX1-NEXT: # implicit-def: $ymm1
1246 ; AVX1-NEXT: vmovaps %xmm2, %xmm1
1247 ; AVX1-NEXT: vmovntdqa 48(%rdi), %xmm2
1248 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
1251 ; AVX2-LABEL: test_load_nt16xi32:
1252 ; AVX2: # %bb.0: # %entry
1253 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm0
1254 ; AVX2-NEXT: vmovntdqa 32(%rdi), %ymm1
1257 ; AVX512-LABEL: test_load_nt16xi32:
1258 ; AVX512: # %bb.0: # %entry
1259 ; AVX512-NEXT: vmovntdqa (%rdi), %zmm0
1262 %0 = load <16 x i32>, <16 x i32>* %ptr, align 64, !nontemporal !1
1266 define <8 x i64> @test_load_nt8xi64(<8 x i64>* nocapture %ptr) {
1267 ; SSE2-LABEL: test_load_nt8xi64:
1268 ; SSE2: # %bb.0: # %entry
1269 ; SSE2-NEXT: movaps (%rdi), %xmm0
1270 ; SSE2-NEXT: movaps 16(%rdi), %xmm1
1271 ; SSE2-NEXT: movaps 32(%rdi), %xmm2
1272 ; SSE2-NEXT: movaps 48(%rdi), %xmm3
1275 ; SSE4A-LABEL: test_load_nt8xi64:
1276 ; SSE4A: # %bb.0: # %entry
1277 ; SSE4A-NEXT: movaps (%rdi), %xmm0
1278 ; SSE4A-NEXT: movaps 16(%rdi), %xmm1
1279 ; SSE4A-NEXT: movaps 32(%rdi), %xmm2
1280 ; SSE4A-NEXT: movaps 48(%rdi), %xmm3
1283 ; SSE41-LABEL: test_load_nt8xi64:
1284 ; SSE41: # %bb.0: # %entry
1285 ; SSE41-NEXT: movntdqa (%rdi), %xmm0
1286 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm1
1287 ; SSE41-NEXT: movntdqa 32(%rdi), %xmm2
1288 ; SSE41-NEXT: movntdqa 48(%rdi), %xmm3
1291 ; AVX1-LABEL: test_load_nt8xi64:
1292 ; AVX1: # %bb.0: # %entry
1293 ; AVX1-NEXT: vmovntdqa (%rdi), %xmm0
1294 ; AVX1-NEXT: # implicit-def: $ymm1
1295 ; AVX1-NEXT: vmovaps %xmm0, %xmm1
1296 ; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm0
1297 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
1298 ; AVX1-NEXT: vmovntdqa 32(%rdi), %xmm2
1299 ; AVX1-NEXT: # implicit-def: $ymm1
1300 ; AVX1-NEXT: vmovaps %xmm2, %xmm1
1301 ; AVX1-NEXT: vmovntdqa 48(%rdi), %xmm2
1302 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
1305 ; AVX2-LABEL: test_load_nt8xi64:
1306 ; AVX2: # %bb.0: # %entry
1307 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm0
1308 ; AVX2-NEXT: vmovntdqa 32(%rdi), %ymm1
1311 ; AVX512-LABEL: test_load_nt8xi64:
1312 ; AVX512: # %bb.0: # %entry
1313 ; AVX512-NEXT: vmovntdqa (%rdi), %zmm0
1316 %0 = load <8 x i64>, <8 x i64>* %ptr, align 64, !nontemporal !1