Revert r354244 "[DAGCombiner] Eliminate dead stores to stack."
[llvm-complete.git] / test / CodeGen / X86 / fast-isel-nontemporal.ll
blobdb1ebfe6060f82ff3bbb7fa5a83504a96fc446a7
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
12 ; Scalar Stores
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)
19 ; ALL-NEXT:    retq
20 entry:
21   store i32 %X, i32* %ptr, align 4, !nontemporal !1
22   ret void
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)
29 ; ALL-NEXT:    retq
30 entry:
31   store i64 %X, i64* %ptr, align 8, !nontemporal !1
32   ret void
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)
39 ; SSE2-NEXT:    retq
41 ; SSE4A-LABEL: test_ntfloat:
42 ; SSE4A:       # %bb.0: # %entry
43 ; SSE4A-NEXT:    movntss %xmm0, (%rdi)
44 ; SSE4A-NEXT:    retq
46 ; SSE41-LABEL: test_ntfloat:
47 ; SSE41:       # %bb.0: # %entry
48 ; SSE41-NEXT:    movss %xmm0, (%rdi)
49 ; SSE41-NEXT:    retq
51 ; AVX-LABEL: test_ntfloat:
52 ; AVX:       # %bb.0: # %entry
53 ; AVX-NEXT:    vmovss %xmm0, (%rdi)
54 ; AVX-NEXT:    retq
56 ; AVX512-LABEL: test_ntfloat:
57 ; AVX512:       # %bb.0: # %entry
58 ; AVX512-NEXT:    vmovss %xmm0, (%rdi)
59 ; AVX512-NEXT:    retq
60 entry:
61   store float %X, float* %ptr, align 4, !nontemporal !1
62   ret void
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)
69 ; SSE2-NEXT:    retq
71 ; SSE4A-LABEL: test_ntdouble:
72 ; SSE4A:       # %bb.0: # %entry
73 ; SSE4A-NEXT:    movntsd %xmm0, (%rdi)
74 ; SSE4A-NEXT:    retq
76 ; SSE41-LABEL: test_ntdouble:
77 ; SSE41:       # %bb.0: # %entry
78 ; SSE41-NEXT:    movsd %xmm0, (%rdi)
79 ; SSE41-NEXT:    retq
81 ; AVX-LABEL: test_ntdouble:
82 ; AVX:       # %bb.0: # %entry
83 ; AVX-NEXT:    vmovsd %xmm0, (%rdi)
84 ; AVX-NEXT:    retq
86 ; AVX512-LABEL: test_ntdouble:
87 ; AVX512:       # %bb.0: # %entry
88 ; AVX512-NEXT:    vmovsd %xmm0, (%rdi)
89 ; AVX512-NEXT:    retq
90 entry:
91   store double %X, double* %ptr, align 8, !nontemporal !1
92   ret void
96 ; MMX Store
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)
105 ; ALL-NEXT:    retq
106 entry:
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
110   ret void
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)
122 ; SSE-NEXT:    retq
124 ; AVX-LABEL: test_nt4xfloat:
125 ; AVX:       # %bb.0: # %entry
126 ; AVX-NEXT:    vmovntps %xmm0, (%rdi)
127 ; AVX-NEXT:    retq
129 ; AVX512-LABEL: test_nt4xfloat:
130 ; AVX512:       # %bb.0: # %entry
131 ; AVX512-NEXT:    vmovntps %xmm0, (%rdi)
132 ; AVX512-NEXT:    retq
133 entry:
134   store <4 x float> %X, <4 x float>* %ptr, align 16, !nontemporal !1
135   ret void
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)
142 ; SSE-NEXT:    retq
144 ; AVX-LABEL: test_nt2xdouble:
145 ; AVX:       # %bb.0: # %entry
146 ; AVX-NEXT:    vmovntpd %xmm0, (%rdi)
147 ; AVX-NEXT:    retq
149 ; AVX512-LABEL: test_nt2xdouble:
150 ; AVX512:       # %bb.0: # %entry
151 ; AVX512-NEXT:    vmovntpd %xmm0, (%rdi)
152 ; AVX512-NEXT:    retq
153 entry:
154   store <2 x double> %X, <2 x double>* %ptr, align 16, !nontemporal !1
155   ret void
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)
162 ; SSE-NEXT:    retq
164 ; AVX-LABEL: test_nt16xi8:
165 ; AVX:       # %bb.0: # %entry
166 ; AVX-NEXT:    vmovntdq %xmm0, (%rdi)
167 ; AVX-NEXT:    retq
169 ; AVX512-LABEL: test_nt16xi8:
170 ; AVX512:       # %bb.0: # %entry
171 ; AVX512-NEXT:    vmovntdq %xmm0, (%rdi)
172 ; AVX512-NEXT:    retq
173 entry:
174   store <16 x i8> %X, <16 x i8>* %ptr, align 16, !nontemporal !1
175   ret void
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)
182 ; SSE-NEXT:    retq
184 ; AVX-LABEL: test_nt8xi16:
185 ; AVX:       # %bb.0: # %entry
186 ; AVX-NEXT:    vmovntdq %xmm0, (%rdi)
187 ; AVX-NEXT:    retq
189 ; AVX512-LABEL: test_nt8xi16:
190 ; AVX512:       # %bb.0: # %entry
191 ; AVX512-NEXT:    vmovntdq %xmm0, (%rdi)
192 ; AVX512-NEXT:    retq
193 entry:
194   store <8 x i16> %X, <8 x i16>* %ptr, align 16, !nontemporal !1
195   ret void
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)
202 ; SSE-NEXT:    retq
204 ; AVX-LABEL: test_nt4xi32:
205 ; AVX:       # %bb.0: # %entry
206 ; AVX-NEXT:    vmovntdq %xmm0, (%rdi)
207 ; AVX-NEXT:    retq
209 ; AVX512-LABEL: test_nt4xi32:
210 ; AVX512:       # %bb.0: # %entry
211 ; AVX512-NEXT:    vmovntdq %xmm0, (%rdi)
212 ; AVX512-NEXT:    retq
213 entry:
214   store <4 x i32> %X, <4 x i32>* %ptr, align 16, !nontemporal !1
215   ret void
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)
222 ; SSE-NEXT:    retq
224 ; AVX-LABEL: test_nt2xi64:
225 ; AVX:       # %bb.0: # %entry
226 ; AVX-NEXT:    vmovntdq %xmm0, (%rdi)
227 ; AVX-NEXT:    retq
229 ; AVX512-LABEL: test_nt2xi64:
230 ; AVX512:       # %bb.0: # %entry
231 ; AVX512-NEXT:    vmovntdq %xmm0, (%rdi)
232 ; AVX512-NEXT:    retq
233 entry:
234   store <2 x i64> %X, <2 x i64>* %ptr, align 16, !nontemporal !1
235   ret void
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
246 ; SSE2-NEXT:    retq
248 ; SSE4A-LABEL: test_load_nt4xfloat:
249 ; SSE4A:       # %bb.0: # %entry
250 ; SSE4A-NEXT:    movaps (%rdi), %xmm0
251 ; SSE4A-NEXT:    retq
253 ; SSE41-LABEL: test_load_nt4xfloat:
254 ; SSE41:       # %bb.0: # %entry
255 ; SSE41-NEXT:    movntdqa (%rdi), %xmm0
256 ; SSE41-NEXT:    retq
258 ; AVX-LABEL: test_load_nt4xfloat:
259 ; AVX:       # %bb.0: # %entry
260 ; AVX-NEXT:    vmovntdqa (%rdi), %xmm0
261 ; AVX-NEXT:    retq
263 ; AVX512-LABEL: test_load_nt4xfloat:
264 ; AVX512:       # %bb.0: # %entry
265 ; AVX512-NEXT:    vmovntdqa (%rdi), %xmm0
266 ; AVX512-NEXT:    retq
267 entry:
268   %0 = load <4 x float>, <4 x float>* %ptr, align 16, !nontemporal !1
269   ret <4 x float> %0
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
276 ; SSE2-NEXT:    retq
278 ; SSE4A-LABEL: test_load_nt2xdouble:
279 ; SSE4A:       # %bb.0: # %entry
280 ; SSE4A-NEXT:    movapd (%rdi), %xmm0
281 ; SSE4A-NEXT:    retq
283 ; SSE41-LABEL: test_load_nt2xdouble:
284 ; SSE41:       # %bb.0: # %entry
285 ; SSE41-NEXT:    movntdqa (%rdi), %xmm0
286 ; SSE41-NEXT:    retq
288 ; AVX-LABEL: test_load_nt2xdouble:
289 ; AVX:       # %bb.0: # %entry
290 ; AVX-NEXT:    vmovntdqa (%rdi), %xmm0
291 ; AVX-NEXT:    retq
293 ; AVX512-LABEL: test_load_nt2xdouble:
294 ; AVX512:       # %bb.0: # %entry
295 ; AVX512-NEXT:    vmovntdqa (%rdi), %xmm0
296 ; AVX512-NEXT:    retq
297 entry:
298   %0 = load <2 x double>, <2 x double>* %ptr, align 16, !nontemporal !1
299   ret <2 x double> %0
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
306 ; SSE-NEXT:    retq
308 ; AVX-LABEL: test_load_nt16xi8:
309 ; AVX:       # %bb.0: # %entry
310 ; AVX-NEXT:    vmovntdqa (%rdi), %xmm0
311 ; AVX-NEXT:    retq
313 ; AVX512-LABEL: test_load_nt16xi8:
314 ; AVX512:       # %bb.0: # %entry
315 ; AVX512-NEXT:    vmovntdqa (%rdi), %xmm0
316 ; AVX512-NEXT:    retq
317 entry:
318   %0 = load <16 x i8>, <16 x i8>* %ptr, align 16, !nontemporal !1
319   ret <16 x i8> %0
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
326 ; SSE-NEXT:    retq
328 ; AVX-LABEL: test_load_nt8xi16:
329 ; AVX:       # %bb.0: # %entry
330 ; AVX-NEXT:    vmovntdqa (%rdi), %xmm0
331 ; AVX-NEXT:    retq
333 ; AVX512-LABEL: test_load_nt8xi16:
334 ; AVX512:       # %bb.0: # %entry
335 ; AVX512-NEXT:    vmovntdqa (%rdi), %xmm0
336 ; AVX512-NEXT:    retq
337 entry:
338   %0 = load <8 x i16>, <8 x i16>* %ptr, align 16, !nontemporal !1
339   ret <8 x i16> %0
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
346 ; SSE-NEXT:    retq
348 ; AVX-LABEL: test_load_nt4xi32:
349 ; AVX:       # %bb.0: # %entry
350 ; AVX-NEXT:    vmovntdqa (%rdi), %xmm0
351 ; AVX-NEXT:    retq
353 ; AVX512-LABEL: test_load_nt4xi32:
354 ; AVX512:       # %bb.0: # %entry
355 ; AVX512-NEXT:    vmovntdqa (%rdi), %xmm0
356 ; AVX512-NEXT:    retq
357 entry:
358   %0 = load <4 x i32>, <4 x i32>* %ptr, align 16, !nontemporal !1
359   ret <4 x i32> %0
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
366 ; SSE-NEXT:    retq
368 ; AVX-LABEL: test_load_nt2xi64:
369 ; AVX:       # %bb.0: # %entry
370 ; AVX-NEXT:    vmovntdqa (%rdi), %xmm0
371 ; AVX-NEXT:    retq
373 ; AVX512-LABEL: test_load_nt2xi64:
374 ; AVX512:       # %bb.0: # %entry
375 ; AVX512-NEXT:    vmovntdqa (%rdi), %xmm0
376 ; AVX512-NEXT:    retq
377 entry:
378   %0 = load <2 x i64>, <2 x i64>* %ptr, align 16, !nontemporal !1
379   ret <2 x i64> %0
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)
391 ; SSE-NEXT:    retq
393 ; AVX-LABEL: test_nt8xfloat:
394 ; AVX:       # %bb.0: # %entry
395 ; AVX-NEXT:    vmovntps %ymm0, (%rdi)
396 ; AVX-NEXT:    vzeroupper
397 ; AVX-NEXT:    retq
399 ; AVX512-LABEL: test_nt8xfloat:
400 ; AVX512:       # %bb.0: # %entry
401 ; AVX512-NEXT:    vmovntps %ymm0, (%rdi)
402 ; AVX512-NEXT:    vzeroupper
403 ; AVX512-NEXT:    retq
404 entry:
405   store <8 x float> %X, <8 x float>* %ptr, align 32, !nontemporal !1
406   ret void
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)
414 ; SSE-NEXT:    retq
416 ; AVX-LABEL: test_nt4xdouble:
417 ; AVX:       # %bb.0: # %entry
418 ; AVX-NEXT:    vmovntpd %ymm0, (%rdi)
419 ; AVX-NEXT:    vzeroupper
420 ; AVX-NEXT:    retq
422 ; AVX512-LABEL: test_nt4xdouble:
423 ; AVX512:       # %bb.0: # %entry
424 ; AVX512-NEXT:    vmovntpd %ymm0, (%rdi)
425 ; AVX512-NEXT:    vzeroupper
426 ; AVX512-NEXT:    retq
427 entry:
428   store <4 x double> %X, <4 x double>* %ptr, align 32, !nontemporal !1
429   ret void
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)
437 ; SSE-NEXT:    retq
439 ; AVX-LABEL: test_nt32xi8:
440 ; AVX:       # %bb.0: # %entry
441 ; AVX-NEXT:    vmovntdq %ymm0, (%rdi)
442 ; AVX-NEXT:    vzeroupper
443 ; AVX-NEXT:    retq
445 ; AVX512-LABEL: test_nt32xi8:
446 ; AVX512:       # %bb.0: # %entry
447 ; AVX512-NEXT:    vmovntdq %ymm0, (%rdi)
448 ; AVX512-NEXT:    vzeroupper
449 ; AVX512-NEXT:    retq
450 entry:
451   store <32 x i8> %X, <32 x i8>* %ptr, align 32, !nontemporal !1
452   ret void
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)
460 ; SSE-NEXT:    retq
462 ; AVX-LABEL: test_nt16xi16:
463 ; AVX:       # %bb.0: # %entry
464 ; AVX-NEXT:    vmovntdq %ymm0, (%rdi)
465 ; AVX-NEXT:    vzeroupper
466 ; AVX-NEXT:    retq
468 ; AVX512-LABEL: test_nt16xi16:
469 ; AVX512:       # %bb.0: # %entry
470 ; AVX512-NEXT:    vmovntdq %ymm0, (%rdi)
471 ; AVX512-NEXT:    vzeroupper
472 ; AVX512-NEXT:    retq
473 entry:
474   store <16 x i16> %X, <16 x i16>* %ptr, align 32, !nontemporal !1
475   ret void
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)
483 ; SSE-NEXT:    retq
485 ; AVX-LABEL: test_nt8xi32:
486 ; AVX:       # %bb.0: # %entry
487 ; AVX-NEXT:    vmovntdq %ymm0, (%rdi)
488 ; AVX-NEXT:    vzeroupper
489 ; AVX-NEXT:    retq
491 ; AVX512-LABEL: test_nt8xi32:
492 ; AVX512:       # %bb.0: # %entry
493 ; AVX512-NEXT:    vmovntdq %ymm0, (%rdi)
494 ; AVX512-NEXT:    vzeroupper
495 ; AVX512-NEXT:    retq
496 entry:
497   store <8 x i32> %X, <8 x i32>* %ptr, align 32, !nontemporal !1
498   ret void
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)
506 ; SSE-NEXT:    retq
508 ; AVX-LABEL: test_nt4xi64:
509 ; AVX:       # %bb.0: # %entry
510 ; AVX-NEXT:    vmovntdq %ymm0, (%rdi)
511 ; AVX-NEXT:    vzeroupper
512 ; AVX-NEXT:    retq
514 ; AVX512-LABEL: test_nt4xi64:
515 ; AVX512:       # %bb.0: # %entry
516 ; AVX512-NEXT:    vmovntdq %ymm0, (%rdi)
517 ; AVX512-NEXT:    vzeroupper
518 ; AVX512-NEXT:    retq
519 entry:
520   store <4 x i64> %X, <4 x i64>* %ptr, align 32, !nontemporal !1
521   ret void
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
533 ; SSE2-NEXT:    retq
535 ; SSE4A-LABEL: test_load_nt8xfloat:
536 ; SSE4A:       # %bb.0: # %entry
537 ; SSE4A-NEXT:    movaps (%rdi), %xmm0
538 ; SSE4A-NEXT:    movaps 16(%rdi), %xmm1
539 ; SSE4A-NEXT:    retq
541 ; SSE41-LABEL: test_load_nt8xfloat:
542 ; SSE41:       # %bb.0: # %entry
543 ; SSE41-NEXT:    movntdqa (%rdi), %xmm0
544 ; SSE41-NEXT:    movntdqa 16(%rdi), %xmm1
545 ; SSE41-NEXT:    retq
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
554 ; AVX1-NEXT:    retq
556 ; AVX2-LABEL: test_load_nt8xfloat:
557 ; AVX2:       # %bb.0: # %entry
558 ; AVX2-NEXT:    vmovntdqa (%rdi), %ymm0
559 ; AVX2-NEXT:    retq
561 ; AVX512-LABEL: test_load_nt8xfloat:
562 ; AVX512:       # %bb.0: # %entry
563 ; AVX512-NEXT:    vmovntdqa (%rdi), %ymm0
564 ; AVX512-NEXT:    retq
565 entry:
566   %0 = load <8 x float>, <8 x float>* %ptr, align 32, !nontemporal !1
567   ret <8 x float> %0
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
575 ; SSE2-NEXT:    retq
577 ; SSE4A-LABEL: test_load_nt4xdouble:
578 ; SSE4A:       # %bb.0: # %entry
579 ; SSE4A-NEXT:    movapd (%rdi), %xmm0
580 ; SSE4A-NEXT:    movapd 16(%rdi), %xmm1
581 ; SSE4A-NEXT:    retq
583 ; SSE41-LABEL: test_load_nt4xdouble:
584 ; SSE41:       # %bb.0: # %entry
585 ; SSE41-NEXT:    movntdqa (%rdi), %xmm0
586 ; SSE41-NEXT:    movntdqa 16(%rdi), %xmm1
587 ; SSE41-NEXT:    retq
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
596 ; AVX1-NEXT:    retq
598 ; AVX2-LABEL: test_load_nt4xdouble:
599 ; AVX2:       # %bb.0: # %entry
600 ; AVX2-NEXT:    vmovntdqa (%rdi), %ymm0
601 ; AVX2-NEXT:    retq
603 ; AVX512-LABEL: test_load_nt4xdouble:
604 ; AVX512:       # %bb.0: # %entry
605 ; AVX512-NEXT:    vmovntdqa (%rdi), %ymm0
606 ; AVX512-NEXT:    retq
607 entry:
608   %0 = load <4 x double>, <4 x double>* %ptr, align 32, !nontemporal !1
609   ret <4 x double> %0
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
617 ; SSE2-NEXT:    retq
619 ; SSE4A-LABEL: test_load_nt32xi8:
620 ; SSE4A:       # %bb.0: # %entry
621 ; SSE4A-NEXT:    movaps (%rdi), %xmm0
622 ; SSE4A-NEXT:    movaps 16(%rdi), %xmm1
623 ; SSE4A-NEXT:    retq
625 ; SSE41-LABEL: test_load_nt32xi8:
626 ; SSE41:       # %bb.0: # %entry
627 ; SSE41-NEXT:    movntdqa (%rdi), %xmm0
628 ; SSE41-NEXT:    movntdqa 16(%rdi), %xmm1
629 ; SSE41-NEXT:    retq
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
638 ; AVX1-NEXT:    retq
640 ; AVX2-LABEL: test_load_nt32xi8:
641 ; AVX2:       # %bb.0: # %entry
642 ; AVX2-NEXT:    vmovntdqa (%rdi), %ymm0
643 ; AVX2-NEXT:    retq
645 ; AVX512-LABEL: test_load_nt32xi8:
646 ; AVX512:       # %bb.0: # %entry
647 ; AVX512-NEXT:    vmovntdqa (%rdi), %ymm0
648 ; AVX512-NEXT:    retq
649 entry:
650   %0 = load <32 x i8>, <32 x i8>* %ptr, align 32, !nontemporal !1
651   ret <32 x i8> %0
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
659 ; SSE2-NEXT:    retq
661 ; SSE4A-LABEL: test_load_nt16xi16:
662 ; SSE4A:       # %bb.0: # %entry
663 ; SSE4A-NEXT:    movaps (%rdi), %xmm0
664 ; SSE4A-NEXT:    movaps 16(%rdi), %xmm1
665 ; SSE4A-NEXT:    retq
667 ; SSE41-LABEL: test_load_nt16xi16:
668 ; SSE41:       # %bb.0: # %entry
669 ; SSE41-NEXT:    movntdqa (%rdi), %xmm0
670 ; SSE41-NEXT:    movntdqa 16(%rdi), %xmm1
671 ; SSE41-NEXT:    retq
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
680 ; AVX1-NEXT:    retq
682 ; AVX2-LABEL: test_load_nt16xi16:
683 ; AVX2:       # %bb.0: # %entry
684 ; AVX2-NEXT:    vmovntdqa (%rdi), %ymm0
685 ; AVX2-NEXT:    retq
687 ; AVX512-LABEL: test_load_nt16xi16:
688 ; AVX512:       # %bb.0: # %entry
689 ; AVX512-NEXT:    vmovntdqa (%rdi), %ymm0
690 ; AVX512-NEXT:    retq
691 entry:
692   %0 = load <16 x i16>, <16 x i16>* %ptr, align 32, !nontemporal !1
693   ret <16 x i16> %0
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
701 ; SSE2-NEXT:    retq
703 ; SSE4A-LABEL: test_load_nt8xi32:
704 ; SSE4A:       # %bb.0: # %entry
705 ; SSE4A-NEXT:    movaps (%rdi), %xmm0
706 ; SSE4A-NEXT:    movaps 16(%rdi), %xmm1
707 ; SSE4A-NEXT:    retq
709 ; SSE41-LABEL: test_load_nt8xi32:
710 ; SSE41:       # %bb.0: # %entry
711 ; SSE41-NEXT:    movntdqa (%rdi), %xmm0
712 ; SSE41-NEXT:    movntdqa 16(%rdi), %xmm1
713 ; SSE41-NEXT:    retq
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
722 ; AVX1-NEXT:    retq
724 ; AVX2-LABEL: test_load_nt8xi32:
725 ; AVX2:       # %bb.0: # %entry
726 ; AVX2-NEXT:    vmovntdqa (%rdi), %ymm0
727 ; AVX2-NEXT:    retq
729 ; AVX512-LABEL: test_load_nt8xi32:
730 ; AVX512:       # %bb.0: # %entry
731 ; AVX512-NEXT:    vmovntdqa (%rdi), %ymm0
732 ; AVX512-NEXT:    retq
733 entry:
734   %0 = load <8 x i32>, <8 x i32>* %ptr, align 32, !nontemporal !1
735   ret <8 x i32> %0
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
743 ; SSE2-NEXT:    retq
745 ; SSE4A-LABEL: test_load_nt4xi64:
746 ; SSE4A:       # %bb.0: # %entry
747 ; SSE4A-NEXT:    movaps (%rdi), %xmm0
748 ; SSE4A-NEXT:    movaps 16(%rdi), %xmm1
749 ; SSE4A-NEXT:    retq
751 ; SSE41-LABEL: test_load_nt4xi64:
752 ; SSE41:       # %bb.0: # %entry
753 ; SSE41-NEXT:    movntdqa (%rdi), %xmm0
754 ; SSE41-NEXT:    movntdqa 16(%rdi), %xmm1
755 ; SSE41-NEXT:    retq
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
764 ; AVX1-NEXT:    retq
766 ; AVX2-LABEL: test_load_nt4xi64:
767 ; AVX2:       # %bb.0: # %entry
768 ; AVX2-NEXT:    vmovntdqa (%rdi), %ymm0
769 ; AVX2-NEXT:    retq
771 ; AVX512-LABEL: test_load_nt4xi64:
772 ; AVX512:       # %bb.0: # %entry
773 ; AVX512-NEXT:    vmovntdqa (%rdi), %ymm0
774 ; AVX512-NEXT:    retq
775 entry:
776   %0 = load <4 x i64>, <4 x i64>* %ptr, align 32, !nontemporal !1
777   ret <4 x i64> %0
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)
791 ; SSE-NEXT:    retq
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
798 ; AVX-NEXT:    retq
800 ; AVX512-LABEL: test_nt16xfloat:
801 ; AVX512:       # %bb.0: # %entry
802 ; AVX512-NEXT:    vmovntps %zmm0, (%rdi)
803 ; AVX512-NEXT:    vzeroupper
804 ; AVX512-NEXT:    retq
805 entry:
806   store <16 x float> %X, <16 x float>* %ptr, align 64, !nontemporal !1
807   ret void
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)
817 ; SSE-NEXT:    retq
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
824 ; AVX-NEXT:    retq
826 ; AVX512-LABEL: test_nt8xdouble:
827 ; AVX512:       # %bb.0: # %entry
828 ; AVX512-NEXT:    vmovntpd %zmm0, (%rdi)
829 ; AVX512-NEXT:    vzeroupper
830 ; AVX512-NEXT:    retq
831 entry:
832   store <8 x double> %X, <8 x double>* %ptr, align 64, !nontemporal !1
833   ret void
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)
843 ; SSE-NEXT:    retq
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
850 ; AVX-NEXT:    retq
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
864 ; AVX512F-NEXT:    retq
866 ; AVX512BW-LABEL: test_nt64xi8:
867 ; AVX512BW:       # %bb.0: # %entry
868 ; AVX512BW-NEXT:    vmovntdq %zmm0, (%rdi)
869 ; AVX512BW-NEXT:    vzeroupper
870 ; AVX512BW-NEXT:    retq
871 entry:
872   store <64 x i8> %X, <64 x i8>* %ptr, align 64, !nontemporal !1
873   ret void
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)
883 ; SSE-NEXT:    retq
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
890 ; AVX-NEXT:    retq
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
904 ; AVX512F-NEXT:    retq
906 ; AVX512BW-LABEL: test_nt32xi16:
907 ; AVX512BW:       # %bb.0: # %entry
908 ; AVX512BW-NEXT:    vmovntdq %zmm0, (%rdi)
909 ; AVX512BW-NEXT:    vzeroupper
910 ; AVX512BW-NEXT:    retq
911 entry:
912   store <32 x i16> %X, <32 x i16>* %ptr, align 64, !nontemporal !1
913   ret void
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)
923 ; SSE-NEXT:    retq
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
930 ; AVX-NEXT:    retq
932 ; AVX512-LABEL: test_nt16xi32:
933 ; AVX512:       # %bb.0: # %entry
934 ; AVX512-NEXT:    vmovntdq %zmm0, (%rdi)
935 ; AVX512-NEXT:    vzeroupper
936 ; AVX512-NEXT:    retq
937 entry:
938   store <16 x i32> %X, <16 x i32>* %ptr, align 64, !nontemporal !1
939   ret void
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)
949 ; SSE-NEXT:    retq
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
956 ; AVX-NEXT:    retq
958 ; AVX512-LABEL: test_nt8xi64:
959 ; AVX512:       # %bb.0: # %entry
960 ; AVX512-NEXT:    vmovntdq %zmm0, (%rdi)
961 ; AVX512-NEXT:    vzeroupper
962 ; AVX512-NEXT:    retq
963 entry:
964   store <8 x i64> %X, <8 x i64>* %ptr, align 64, !nontemporal !1
965   ret void
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
979 ; SSE2-NEXT:    retq
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
987 ; SSE4A-NEXT:    retq
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
995 ; SSE41-NEXT:    retq
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
1009 ; AVX1-NEXT:    retq
1011 ; AVX2-LABEL: test_load_nt16xfloat:
1012 ; AVX2:       # %bb.0: # %entry
1013 ; AVX2-NEXT:    vmovntdqa (%rdi), %ymm0
1014 ; AVX2-NEXT:    vmovntdqa 32(%rdi), %ymm1
1015 ; AVX2-NEXT:    retq
1017 ; AVX512-LABEL: test_load_nt16xfloat:
1018 ; AVX512:       # %bb.0: # %entry
1019 ; AVX512-NEXT:    vmovntdqa (%rdi), %zmm0
1020 ; AVX512-NEXT:    retq
1021 entry:
1022   %0 = load <16 x float>, <16 x float>* %ptr, align 64, !nontemporal !1
1023   ret <16 x float> %0
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
1033 ; SSE2-NEXT:    retq
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
1041 ; SSE4A-NEXT:    retq
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
1049 ; SSE41-NEXT:    retq
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
1063 ; AVX1-NEXT:    retq
1065 ; AVX2-LABEL: test_load_nt8xdouble:
1066 ; AVX2:       # %bb.0: # %entry
1067 ; AVX2-NEXT:    vmovntdqa (%rdi), %ymm0
1068 ; AVX2-NEXT:    vmovntdqa 32(%rdi), %ymm1
1069 ; AVX2-NEXT:    retq
1071 ; AVX512-LABEL: test_load_nt8xdouble:
1072 ; AVX512:       # %bb.0: # %entry
1073 ; AVX512-NEXT:    vmovntdqa (%rdi), %zmm0
1074 ; AVX512-NEXT:    retq
1075 entry:
1076   %0 = load <8 x double>, <8 x double>* %ptr, align 64, !nontemporal !1
1077   ret <8 x double> %0
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
1087 ; SSE2-NEXT:    retq
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
1095 ; SSE4A-NEXT:    retq
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
1103 ; SSE41-NEXT:    retq
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
1117 ; AVX1-NEXT:    retq
1119 ; AVX2-LABEL: test_load_nt64xi8:
1120 ; AVX2:       # %bb.0: # %entry
1121 ; AVX2-NEXT:    vmovntdqa (%rdi), %ymm0
1122 ; AVX2-NEXT:    vmovntdqa 32(%rdi), %ymm1
1123 ; AVX2-NEXT:    retq
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
1141 entry:
1142   %0 = load <64 x i8>, <64 x i8>* %ptr, align 64, !nontemporal !1
1143   ret <64 x i8> %0
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
1153 ; SSE2-NEXT:    retq
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
1161 ; SSE4A-NEXT:    retq
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
1169 ; SSE41-NEXT:    retq
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
1183 ; AVX1-NEXT:    retq
1185 ; AVX2-LABEL: test_load_nt32xi16:
1186 ; AVX2:       # %bb.0: # %entry
1187 ; AVX2-NEXT:    vmovntdqa (%rdi), %ymm0
1188 ; AVX2-NEXT:    vmovntdqa 32(%rdi), %ymm1
1189 ; AVX2-NEXT:    retq
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
1207 entry:
1208   %0 = load <32 x i16>, <32 x i16>* %ptr, align 64, !nontemporal !1
1209   ret <32 x i16> %0
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
1219 ; SSE2-NEXT:    retq
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
1227 ; SSE4A-NEXT:    retq
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
1235 ; SSE41-NEXT:    retq
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
1249 ; AVX1-NEXT:    retq
1251 ; AVX2-LABEL: test_load_nt16xi32:
1252 ; AVX2:       # %bb.0: # %entry
1253 ; AVX2-NEXT:    vmovntdqa (%rdi), %ymm0
1254 ; AVX2-NEXT:    vmovntdqa 32(%rdi), %ymm1
1255 ; AVX2-NEXT:    retq
1257 ; AVX512-LABEL: test_load_nt16xi32:
1258 ; AVX512:       # %bb.0: # %entry
1259 ; AVX512-NEXT:    vmovntdqa (%rdi), %zmm0
1260 ; AVX512-NEXT:    retq
1261 entry:
1262   %0 = load <16 x i32>, <16 x i32>* %ptr, align 64, !nontemporal !1
1263   ret <16 x i32> %0
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
1273 ; SSE2-NEXT:    retq
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
1281 ; SSE4A-NEXT:    retq
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
1289 ; SSE41-NEXT:    retq
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
1303 ; AVX1-NEXT:    retq
1305 ; AVX2-LABEL: test_load_nt8xi64:
1306 ; AVX2:       # %bb.0: # %entry
1307 ; AVX2-NEXT:    vmovntdqa (%rdi), %ymm0
1308 ; AVX2-NEXT:    vmovntdqa 32(%rdi), %ymm1
1309 ; AVX2-NEXT:    retq
1311 ; AVX512-LABEL: test_load_nt8xi64:
1312 ; AVX512:       # %bb.0: # %entry
1313 ; AVX512-NEXT:    vmovntdqa (%rdi), %zmm0
1314 ; AVX512-NEXT:    retq
1315 entry:
1316   %0 = load <8 x i64>, <8 x i64>* %ptr, align 64, !nontemporal !1
1317   ret <8 x i64> %0
1320 !1 = !{i32 1}