[InstCombine] Signed saturation patterns
[llvm-core.git] / test / CodeGen / X86 / fast-isel-nontemporal.ll
blob7345df7ae0f8a3469d634785db9d1216cea8d77c
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 ; SSE2-LABEL: test_load_nt16xi8:
304 ; SSE2:       # %bb.0: # %entry
305 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
306 ; SSE2-NEXT:    retq
308 ; SSE4A-LABEL: test_load_nt16xi8:
309 ; SSE4A:       # %bb.0: # %entry
310 ; SSE4A-NEXT:    movdqa (%rdi), %xmm0
311 ; SSE4A-NEXT:    retq
313 ; SSE41-LABEL: test_load_nt16xi8:
314 ; SSE41:       # %bb.0: # %entry
315 ; SSE41-NEXT:    movntdqa (%rdi), %xmm0
316 ; SSE41-NEXT:    retq
318 ; AVX-LABEL: test_load_nt16xi8:
319 ; AVX:       # %bb.0: # %entry
320 ; AVX-NEXT:    vmovntdqa (%rdi), %xmm0
321 ; AVX-NEXT:    retq
323 ; AVX512-LABEL: test_load_nt16xi8:
324 ; AVX512:       # %bb.0: # %entry
325 ; AVX512-NEXT:    vmovntdqa (%rdi), %xmm0
326 ; AVX512-NEXT:    retq
327 entry:
328   %0 = load <16 x i8>, <16 x i8>* %ptr, align 16, !nontemporal !1
329   ret <16 x i8> %0
332 define <8 x i16> @test_load_nt8xi16(<8 x i16>* nocapture %ptr) {
333 ; SSE2-LABEL: test_load_nt8xi16:
334 ; SSE2:       # %bb.0: # %entry
335 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
336 ; SSE2-NEXT:    retq
338 ; SSE4A-LABEL: test_load_nt8xi16:
339 ; SSE4A:       # %bb.0: # %entry
340 ; SSE4A-NEXT:    movdqa (%rdi), %xmm0
341 ; SSE4A-NEXT:    retq
343 ; SSE41-LABEL: test_load_nt8xi16:
344 ; SSE41:       # %bb.0: # %entry
345 ; SSE41-NEXT:    movntdqa (%rdi), %xmm0
346 ; SSE41-NEXT:    retq
348 ; AVX-LABEL: test_load_nt8xi16:
349 ; AVX:       # %bb.0: # %entry
350 ; AVX-NEXT:    vmovntdqa (%rdi), %xmm0
351 ; AVX-NEXT:    retq
353 ; AVX512-LABEL: test_load_nt8xi16:
354 ; AVX512:       # %bb.0: # %entry
355 ; AVX512-NEXT:    vmovntdqa (%rdi), %xmm0
356 ; AVX512-NEXT:    retq
357 entry:
358   %0 = load <8 x i16>, <8 x i16>* %ptr, align 16, !nontemporal !1
359   ret <8 x i16> %0
362 define <4 x i32> @test_load_nt4xi32(<4 x i32>* nocapture %ptr) {
363 ; SSE2-LABEL: test_load_nt4xi32:
364 ; SSE2:       # %bb.0: # %entry
365 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
366 ; SSE2-NEXT:    retq
368 ; SSE4A-LABEL: test_load_nt4xi32:
369 ; SSE4A:       # %bb.0: # %entry
370 ; SSE4A-NEXT:    movdqa (%rdi), %xmm0
371 ; SSE4A-NEXT:    retq
373 ; SSE41-LABEL: test_load_nt4xi32:
374 ; SSE41:       # %bb.0: # %entry
375 ; SSE41-NEXT:    movntdqa (%rdi), %xmm0
376 ; SSE41-NEXT:    retq
378 ; AVX-LABEL: test_load_nt4xi32:
379 ; AVX:       # %bb.0: # %entry
380 ; AVX-NEXT:    vmovntdqa (%rdi), %xmm0
381 ; AVX-NEXT:    retq
383 ; AVX512-LABEL: test_load_nt4xi32:
384 ; AVX512:       # %bb.0: # %entry
385 ; AVX512-NEXT:    vmovntdqa (%rdi), %xmm0
386 ; AVX512-NEXT:    retq
387 entry:
388   %0 = load <4 x i32>, <4 x i32>* %ptr, align 16, !nontemporal !1
389   ret <4 x i32> %0
392 define <2 x i64> @test_load_nt2xi64(<2 x i64>* nocapture %ptr) {
393 ; SSE2-LABEL: test_load_nt2xi64:
394 ; SSE2:       # %bb.0: # %entry
395 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
396 ; SSE2-NEXT:    retq
398 ; SSE4A-LABEL: test_load_nt2xi64:
399 ; SSE4A:       # %bb.0: # %entry
400 ; SSE4A-NEXT:    movdqa (%rdi), %xmm0
401 ; SSE4A-NEXT:    retq
403 ; SSE41-LABEL: test_load_nt2xi64:
404 ; SSE41:       # %bb.0: # %entry
405 ; SSE41-NEXT:    movntdqa (%rdi), %xmm0
406 ; SSE41-NEXT:    retq
408 ; AVX-LABEL: test_load_nt2xi64:
409 ; AVX:       # %bb.0: # %entry
410 ; AVX-NEXT:    vmovntdqa (%rdi), %xmm0
411 ; AVX-NEXT:    retq
413 ; AVX512-LABEL: test_load_nt2xi64:
414 ; AVX512:       # %bb.0: # %entry
415 ; AVX512-NEXT:    vmovntdqa (%rdi), %xmm0
416 ; AVX512-NEXT:    retq
417 entry:
418   %0 = load <2 x i64>, <2 x i64>* %ptr, align 16, !nontemporal !1
419   ret <2 x i64> %0
423 ; 256-bit Vector Stores
426 define void @test_nt8xfloat(<8 x float>* nocapture %ptr, <8 x float> %X) {
427 ; SSE-LABEL: test_nt8xfloat:
428 ; SSE:       # %bb.0: # %entry
429 ; SSE-NEXT:    movntps %xmm0, (%rdi)
430 ; SSE-NEXT:    movntps %xmm1, 16(%rdi)
431 ; SSE-NEXT:    retq
433 ; AVX-LABEL: test_nt8xfloat:
434 ; AVX:       # %bb.0: # %entry
435 ; AVX-NEXT:    vmovntps %ymm0, (%rdi)
436 ; AVX-NEXT:    vzeroupper
437 ; AVX-NEXT:    retq
439 ; AVX512-LABEL: test_nt8xfloat:
440 ; AVX512:       # %bb.0: # %entry
441 ; AVX512-NEXT:    vmovntps %ymm0, (%rdi)
442 ; AVX512-NEXT:    vzeroupper
443 ; AVX512-NEXT:    retq
444 entry:
445   store <8 x float> %X, <8 x float>* %ptr, align 32, !nontemporal !1
446   ret void
449 define void @test_nt4xdouble(<4 x double>* nocapture %ptr, <4 x double> %X) {
450 ; SSE-LABEL: test_nt4xdouble:
451 ; SSE:       # %bb.0: # %entry
452 ; SSE-NEXT:    movntpd %xmm0, (%rdi)
453 ; SSE-NEXT:    movntpd %xmm1, 16(%rdi)
454 ; SSE-NEXT:    retq
456 ; AVX-LABEL: test_nt4xdouble:
457 ; AVX:       # %bb.0: # %entry
458 ; AVX-NEXT:    vmovntpd %ymm0, (%rdi)
459 ; AVX-NEXT:    vzeroupper
460 ; AVX-NEXT:    retq
462 ; AVX512-LABEL: test_nt4xdouble:
463 ; AVX512:       # %bb.0: # %entry
464 ; AVX512-NEXT:    vmovntpd %ymm0, (%rdi)
465 ; AVX512-NEXT:    vzeroupper
466 ; AVX512-NEXT:    retq
467 entry:
468   store <4 x double> %X, <4 x double>* %ptr, align 32, !nontemporal !1
469   ret void
472 define void @test_nt32xi8(<32 x i8>* nocapture %ptr, <32 x i8> %X) {
473 ; SSE-LABEL: test_nt32xi8:
474 ; SSE:       # %bb.0: # %entry
475 ; SSE-NEXT:    movntdq %xmm0, (%rdi)
476 ; SSE-NEXT:    movntdq %xmm1, 16(%rdi)
477 ; SSE-NEXT:    retq
479 ; AVX-LABEL: test_nt32xi8:
480 ; AVX:       # %bb.0: # %entry
481 ; AVX-NEXT:    vmovntdq %ymm0, (%rdi)
482 ; AVX-NEXT:    vzeroupper
483 ; AVX-NEXT:    retq
485 ; AVX512-LABEL: test_nt32xi8:
486 ; AVX512:       # %bb.0: # %entry
487 ; AVX512-NEXT:    vmovntdq %ymm0, (%rdi)
488 ; AVX512-NEXT:    vzeroupper
489 ; AVX512-NEXT:    retq
490 entry:
491   store <32 x i8> %X, <32 x i8>* %ptr, align 32, !nontemporal !1
492   ret void
495 define void @test_nt16xi16(<16 x i16>* nocapture %ptr, <16 x i16> %X) {
496 ; SSE-LABEL: test_nt16xi16:
497 ; SSE:       # %bb.0: # %entry
498 ; SSE-NEXT:    movntdq %xmm0, (%rdi)
499 ; SSE-NEXT:    movntdq %xmm1, 16(%rdi)
500 ; SSE-NEXT:    retq
502 ; AVX-LABEL: test_nt16xi16:
503 ; AVX:       # %bb.0: # %entry
504 ; AVX-NEXT:    vmovntdq %ymm0, (%rdi)
505 ; AVX-NEXT:    vzeroupper
506 ; AVX-NEXT:    retq
508 ; AVX512-LABEL: test_nt16xi16:
509 ; AVX512:       # %bb.0: # %entry
510 ; AVX512-NEXT:    vmovntdq %ymm0, (%rdi)
511 ; AVX512-NEXT:    vzeroupper
512 ; AVX512-NEXT:    retq
513 entry:
514   store <16 x i16> %X, <16 x i16>* %ptr, align 32, !nontemporal !1
515   ret void
518 define void @test_nt8xi32(<8 x i32>* nocapture %ptr, <8 x i32> %X) {
519 ; SSE-LABEL: test_nt8xi32:
520 ; SSE:       # %bb.0: # %entry
521 ; SSE-NEXT:    movntdq %xmm0, (%rdi)
522 ; SSE-NEXT:    movntdq %xmm1, 16(%rdi)
523 ; SSE-NEXT:    retq
525 ; AVX-LABEL: test_nt8xi32:
526 ; AVX:       # %bb.0: # %entry
527 ; AVX-NEXT:    vmovntdq %ymm0, (%rdi)
528 ; AVX-NEXT:    vzeroupper
529 ; AVX-NEXT:    retq
531 ; AVX512-LABEL: test_nt8xi32:
532 ; AVX512:       # %bb.0: # %entry
533 ; AVX512-NEXT:    vmovntdq %ymm0, (%rdi)
534 ; AVX512-NEXT:    vzeroupper
535 ; AVX512-NEXT:    retq
536 entry:
537   store <8 x i32> %X, <8 x i32>* %ptr, align 32, !nontemporal !1
538   ret void
541 define void @test_nt4xi64(<4 x i64>* nocapture %ptr, <4 x i64> %X) {
542 ; SSE-LABEL: test_nt4xi64:
543 ; SSE:       # %bb.0: # %entry
544 ; SSE-NEXT:    movntdq %xmm0, (%rdi)
545 ; SSE-NEXT:    movntdq %xmm1, 16(%rdi)
546 ; SSE-NEXT:    retq
548 ; AVX-LABEL: test_nt4xi64:
549 ; AVX:       # %bb.0: # %entry
550 ; AVX-NEXT:    vmovntdq %ymm0, (%rdi)
551 ; AVX-NEXT:    vzeroupper
552 ; AVX-NEXT:    retq
554 ; AVX512-LABEL: test_nt4xi64:
555 ; AVX512:       # %bb.0: # %entry
556 ; AVX512-NEXT:    vmovntdq %ymm0, (%rdi)
557 ; AVX512-NEXT:    vzeroupper
558 ; AVX512-NEXT:    retq
559 entry:
560   store <4 x i64> %X, <4 x i64>* %ptr, align 32, !nontemporal !1
561   ret void
565 ; 256-bit Vector Loads
568 define <8 x float> @test_load_nt8xfloat(<8 x float>* nocapture %ptr) {
569 ; SSE2-LABEL: test_load_nt8xfloat:
570 ; SSE2:       # %bb.0: # %entry
571 ; SSE2-NEXT:    movaps (%rdi), %xmm0
572 ; SSE2-NEXT:    movaps 16(%rdi), %xmm1
573 ; SSE2-NEXT:    retq
575 ; SSE4A-LABEL: test_load_nt8xfloat:
576 ; SSE4A:       # %bb.0: # %entry
577 ; SSE4A-NEXT:    movaps (%rdi), %xmm0
578 ; SSE4A-NEXT:    movaps 16(%rdi), %xmm1
579 ; SSE4A-NEXT:    retq
581 ; SSE41-LABEL: test_load_nt8xfloat:
582 ; SSE41:       # %bb.0: # %entry
583 ; SSE41-NEXT:    movntdqa (%rdi), %xmm0
584 ; SSE41-NEXT:    movntdqa 16(%rdi), %xmm1
585 ; SSE41-NEXT:    retq
587 ; AVX1-LABEL: test_load_nt8xfloat:
588 ; AVX1:       # %bb.0: # %entry
589 ; AVX1-NEXT:    vmovntdqa (%rdi), %xmm0
590 ; AVX1-NEXT:    # implicit-def: $ymm1
591 ; AVX1-NEXT:    vmovaps %xmm0, %xmm1
592 ; AVX1-NEXT:    vmovntdqa 16(%rdi), %xmm0
593 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
594 ; AVX1-NEXT:    retq
596 ; AVX2-LABEL: test_load_nt8xfloat:
597 ; AVX2:       # %bb.0: # %entry
598 ; AVX2-NEXT:    vmovntdqa (%rdi), %ymm0
599 ; AVX2-NEXT:    retq
601 ; AVX512-LABEL: test_load_nt8xfloat:
602 ; AVX512:       # %bb.0: # %entry
603 ; AVX512-NEXT:    vmovntdqa (%rdi), %ymm0
604 ; AVX512-NEXT:    retq
605 entry:
606   %0 = load <8 x float>, <8 x float>* %ptr, align 32, !nontemporal !1
607   ret <8 x float> %0
610 define <4 x double> @test_load_nt4xdouble(<4 x double>* nocapture %ptr) {
611 ; SSE2-LABEL: test_load_nt4xdouble:
612 ; SSE2:       # %bb.0: # %entry
613 ; SSE2-NEXT:    movapd (%rdi), %xmm0
614 ; SSE2-NEXT:    movapd 16(%rdi), %xmm1
615 ; SSE2-NEXT:    retq
617 ; SSE4A-LABEL: test_load_nt4xdouble:
618 ; SSE4A:       # %bb.0: # %entry
619 ; SSE4A-NEXT:    movapd (%rdi), %xmm0
620 ; SSE4A-NEXT:    movapd 16(%rdi), %xmm1
621 ; SSE4A-NEXT:    retq
623 ; SSE41-LABEL: test_load_nt4xdouble:
624 ; SSE41:       # %bb.0: # %entry
625 ; SSE41-NEXT:    movntdqa (%rdi), %xmm0
626 ; SSE41-NEXT:    movntdqa 16(%rdi), %xmm1
627 ; SSE41-NEXT:    retq
629 ; AVX1-LABEL: test_load_nt4xdouble:
630 ; AVX1:       # %bb.0: # %entry
631 ; AVX1-NEXT:    vmovntdqa (%rdi), %xmm0
632 ; AVX1-NEXT:    # implicit-def: $ymm1
633 ; AVX1-NEXT:    vmovaps %xmm0, %xmm1
634 ; AVX1-NEXT:    vmovntdqa 16(%rdi), %xmm0
635 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
636 ; AVX1-NEXT:    retq
638 ; AVX2-LABEL: test_load_nt4xdouble:
639 ; AVX2:       # %bb.0: # %entry
640 ; AVX2-NEXT:    vmovntdqa (%rdi), %ymm0
641 ; AVX2-NEXT:    retq
643 ; AVX512-LABEL: test_load_nt4xdouble:
644 ; AVX512:       # %bb.0: # %entry
645 ; AVX512-NEXT:    vmovntdqa (%rdi), %ymm0
646 ; AVX512-NEXT:    retq
647 entry:
648   %0 = load <4 x double>, <4 x double>* %ptr, align 32, !nontemporal !1
649   ret <4 x double> %0
652 define <32 x i8> @test_load_nt32xi8(<32 x i8>* nocapture %ptr) {
653 ; SSE2-LABEL: test_load_nt32xi8:
654 ; SSE2:       # %bb.0: # %entry
655 ; SSE2-NEXT:    movaps (%rdi), %xmm0
656 ; SSE2-NEXT:    movaps 16(%rdi), %xmm1
657 ; SSE2-NEXT:    retq
659 ; SSE4A-LABEL: test_load_nt32xi8:
660 ; SSE4A:       # %bb.0: # %entry
661 ; SSE4A-NEXT:    movaps (%rdi), %xmm0
662 ; SSE4A-NEXT:    movaps 16(%rdi), %xmm1
663 ; SSE4A-NEXT:    retq
665 ; SSE41-LABEL: test_load_nt32xi8:
666 ; SSE41:       # %bb.0: # %entry
667 ; SSE41-NEXT:    movntdqa (%rdi), %xmm0
668 ; SSE41-NEXT:    movntdqa 16(%rdi), %xmm1
669 ; SSE41-NEXT:    retq
671 ; AVX1-LABEL: test_load_nt32xi8:
672 ; AVX1:       # %bb.0: # %entry
673 ; AVX1-NEXT:    vmovntdqa (%rdi), %xmm0
674 ; AVX1-NEXT:    # implicit-def: $ymm1
675 ; AVX1-NEXT:    vmovaps %xmm0, %xmm1
676 ; AVX1-NEXT:    vmovntdqa 16(%rdi), %xmm0
677 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
678 ; AVX1-NEXT:    retq
680 ; AVX2-LABEL: test_load_nt32xi8:
681 ; AVX2:       # %bb.0: # %entry
682 ; AVX2-NEXT:    vmovntdqa (%rdi), %ymm0
683 ; AVX2-NEXT:    retq
685 ; AVX512-LABEL: test_load_nt32xi8:
686 ; AVX512:       # %bb.0: # %entry
687 ; AVX512-NEXT:    vmovntdqa (%rdi), %ymm0
688 ; AVX512-NEXT:    retq
689 entry:
690   %0 = load <32 x i8>, <32 x i8>* %ptr, align 32, !nontemporal !1
691   ret <32 x i8> %0
694 define <16 x i16> @test_load_nt16xi16(<16 x i16>* nocapture %ptr) {
695 ; SSE2-LABEL: test_load_nt16xi16:
696 ; SSE2:       # %bb.0: # %entry
697 ; SSE2-NEXT:    movaps (%rdi), %xmm0
698 ; SSE2-NEXT:    movaps 16(%rdi), %xmm1
699 ; SSE2-NEXT:    retq
701 ; SSE4A-LABEL: test_load_nt16xi16:
702 ; SSE4A:       # %bb.0: # %entry
703 ; SSE4A-NEXT:    movaps (%rdi), %xmm0
704 ; SSE4A-NEXT:    movaps 16(%rdi), %xmm1
705 ; SSE4A-NEXT:    retq
707 ; SSE41-LABEL: test_load_nt16xi16:
708 ; SSE41:       # %bb.0: # %entry
709 ; SSE41-NEXT:    movntdqa (%rdi), %xmm0
710 ; SSE41-NEXT:    movntdqa 16(%rdi), %xmm1
711 ; SSE41-NEXT:    retq
713 ; AVX1-LABEL: test_load_nt16xi16:
714 ; AVX1:       # %bb.0: # %entry
715 ; AVX1-NEXT:    vmovntdqa (%rdi), %xmm0
716 ; AVX1-NEXT:    # implicit-def: $ymm1
717 ; AVX1-NEXT:    vmovaps %xmm0, %xmm1
718 ; AVX1-NEXT:    vmovntdqa 16(%rdi), %xmm0
719 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
720 ; AVX1-NEXT:    retq
722 ; AVX2-LABEL: test_load_nt16xi16:
723 ; AVX2:       # %bb.0: # %entry
724 ; AVX2-NEXT:    vmovntdqa (%rdi), %ymm0
725 ; AVX2-NEXT:    retq
727 ; AVX512-LABEL: test_load_nt16xi16:
728 ; AVX512:       # %bb.0: # %entry
729 ; AVX512-NEXT:    vmovntdqa (%rdi), %ymm0
730 ; AVX512-NEXT:    retq
731 entry:
732   %0 = load <16 x i16>, <16 x i16>* %ptr, align 32, !nontemporal !1
733   ret <16 x i16> %0
736 define <8 x i32> @test_load_nt8xi32(<8 x i32>* nocapture %ptr) {
737 ; SSE2-LABEL: test_load_nt8xi32:
738 ; SSE2:       # %bb.0: # %entry
739 ; SSE2-NEXT:    movaps (%rdi), %xmm0
740 ; SSE2-NEXT:    movaps 16(%rdi), %xmm1
741 ; SSE2-NEXT:    retq
743 ; SSE4A-LABEL: test_load_nt8xi32:
744 ; SSE4A:       # %bb.0: # %entry
745 ; SSE4A-NEXT:    movaps (%rdi), %xmm0
746 ; SSE4A-NEXT:    movaps 16(%rdi), %xmm1
747 ; SSE4A-NEXT:    retq
749 ; SSE41-LABEL: test_load_nt8xi32:
750 ; SSE41:       # %bb.0: # %entry
751 ; SSE41-NEXT:    movntdqa (%rdi), %xmm0
752 ; SSE41-NEXT:    movntdqa 16(%rdi), %xmm1
753 ; SSE41-NEXT:    retq
755 ; AVX1-LABEL: test_load_nt8xi32:
756 ; AVX1:       # %bb.0: # %entry
757 ; AVX1-NEXT:    vmovntdqa (%rdi), %xmm0
758 ; AVX1-NEXT:    # implicit-def: $ymm1
759 ; AVX1-NEXT:    vmovaps %xmm0, %xmm1
760 ; AVX1-NEXT:    vmovntdqa 16(%rdi), %xmm0
761 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
762 ; AVX1-NEXT:    retq
764 ; AVX2-LABEL: test_load_nt8xi32:
765 ; AVX2:       # %bb.0: # %entry
766 ; AVX2-NEXT:    vmovntdqa (%rdi), %ymm0
767 ; AVX2-NEXT:    retq
769 ; AVX512-LABEL: test_load_nt8xi32:
770 ; AVX512:       # %bb.0: # %entry
771 ; AVX512-NEXT:    vmovntdqa (%rdi), %ymm0
772 ; AVX512-NEXT:    retq
773 entry:
774   %0 = load <8 x i32>, <8 x i32>* %ptr, align 32, !nontemporal !1
775   ret <8 x i32> %0
778 define <4 x i64> @test_load_nt4xi64(<4 x i64>* nocapture %ptr) {
779 ; SSE2-LABEL: test_load_nt4xi64:
780 ; SSE2:       # %bb.0: # %entry
781 ; SSE2-NEXT:    movaps (%rdi), %xmm0
782 ; SSE2-NEXT:    movaps 16(%rdi), %xmm1
783 ; SSE2-NEXT:    retq
785 ; SSE4A-LABEL: test_load_nt4xi64:
786 ; SSE4A:       # %bb.0: # %entry
787 ; SSE4A-NEXT:    movaps (%rdi), %xmm0
788 ; SSE4A-NEXT:    movaps 16(%rdi), %xmm1
789 ; SSE4A-NEXT:    retq
791 ; SSE41-LABEL: test_load_nt4xi64:
792 ; SSE41:       # %bb.0: # %entry
793 ; SSE41-NEXT:    movntdqa (%rdi), %xmm0
794 ; SSE41-NEXT:    movntdqa 16(%rdi), %xmm1
795 ; SSE41-NEXT:    retq
797 ; AVX1-LABEL: test_load_nt4xi64:
798 ; AVX1:       # %bb.0: # %entry
799 ; AVX1-NEXT:    vmovntdqa (%rdi), %xmm0
800 ; AVX1-NEXT:    # implicit-def: $ymm1
801 ; AVX1-NEXT:    vmovaps %xmm0, %xmm1
802 ; AVX1-NEXT:    vmovntdqa 16(%rdi), %xmm0
803 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
804 ; AVX1-NEXT:    retq
806 ; AVX2-LABEL: test_load_nt4xi64:
807 ; AVX2:       # %bb.0: # %entry
808 ; AVX2-NEXT:    vmovntdqa (%rdi), %ymm0
809 ; AVX2-NEXT:    retq
811 ; AVX512-LABEL: test_load_nt4xi64:
812 ; AVX512:       # %bb.0: # %entry
813 ; AVX512-NEXT:    vmovntdqa (%rdi), %ymm0
814 ; AVX512-NEXT:    retq
815 entry:
816   %0 = load <4 x i64>, <4 x i64>* %ptr, align 32, !nontemporal !1
817   ret <4 x i64> %0
821 ; 512-bit Vector Stores
824 define void @test_nt16xfloat(<16 x float>* nocapture %ptr, <16 x float> %X) {
825 ; SSE-LABEL: test_nt16xfloat:
826 ; SSE:       # %bb.0: # %entry
827 ; SSE-NEXT:    movntps %xmm0, (%rdi)
828 ; SSE-NEXT:    movntps %xmm1, 16(%rdi)
829 ; SSE-NEXT:    movntps %xmm2, 32(%rdi)
830 ; SSE-NEXT:    movntps %xmm3, 48(%rdi)
831 ; SSE-NEXT:    retq
833 ; AVX-LABEL: test_nt16xfloat:
834 ; AVX:       # %bb.0: # %entry
835 ; AVX-NEXT:    vmovntps %ymm0, (%rdi)
836 ; AVX-NEXT:    vmovntps %ymm1, 32(%rdi)
837 ; AVX-NEXT:    vzeroupper
838 ; AVX-NEXT:    retq
840 ; AVX512-LABEL: test_nt16xfloat:
841 ; AVX512:       # %bb.0: # %entry
842 ; AVX512-NEXT:    vmovntps %zmm0, (%rdi)
843 ; AVX512-NEXT:    vzeroupper
844 ; AVX512-NEXT:    retq
845 entry:
846   store <16 x float> %X, <16 x float>* %ptr, align 64, !nontemporal !1
847   ret void
850 define void @test_nt8xdouble(<8 x double>* nocapture %ptr, <8 x double> %X) {
851 ; SSE-LABEL: test_nt8xdouble:
852 ; SSE:       # %bb.0: # %entry
853 ; SSE-NEXT:    movntpd %xmm0, (%rdi)
854 ; SSE-NEXT:    movntpd %xmm1, 16(%rdi)
855 ; SSE-NEXT:    movntpd %xmm2, 32(%rdi)
856 ; SSE-NEXT:    movntpd %xmm3, 48(%rdi)
857 ; SSE-NEXT:    retq
859 ; AVX-LABEL: test_nt8xdouble:
860 ; AVX:       # %bb.0: # %entry
861 ; AVX-NEXT:    vmovntpd %ymm0, (%rdi)
862 ; AVX-NEXT:    vmovntpd %ymm1, 32(%rdi)
863 ; AVX-NEXT:    vzeroupper
864 ; AVX-NEXT:    retq
866 ; AVX512-LABEL: test_nt8xdouble:
867 ; AVX512:       # %bb.0: # %entry
868 ; AVX512-NEXT:    vmovntpd %zmm0, (%rdi)
869 ; AVX512-NEXT:    vzeroupper
870 ; AVX512-NEXT:    retq
871 entry:
872   store <8 x double> %X, <8 x double>* %ptr, align 64, !nontemporal !1
873   ret void
876 define void @test_nt64xi8(<64 x i8>* nocapture %ptr, <64 x i8> %X) {
877 ; SSE-LABEL: test_nt64xi8:
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_nt64xi8:
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_nt64xi8:
893 ; AVX512VL:       # %bb.0: # %entry
894 ; AVX512VL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
895 ; AVX512VL-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
896 ; AVX512VL-NEXT:    vmovntdq %ymm0, (%rdi)
897 ; AVX512VL-NEXT:    vmovntdq %ymm1, 32(%rdi)
898 ; AVX512VL-NEXT:    vzeroupper
899 ; AVX512VL-NEXT:    retq
901 ; AVX512F-LABEL: test_nt64xi8:
902 ; AVX512F:       # %bb.0: # %entry
903 ; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
904 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
905 ; AVX512F-NEXT:    vmovntdq %ymm0, (%rdi)
906 ; AVX512F-NEXT:    vmovntdq %ymm1, 32(%rdi)
907 ; AVX512F-NEXT:    vzeroupper
908 ; AVX512F-NEXT:    retq
910 ; AVX512BW-LABEL: test_nt64xi8:
911 ; AVX512BW:       # %bb.0: # %entry
912 ; AVX512BW-NEXT:    vmovntdq %zmm0, (%rdi)
913 ; AVX512BW-NEXT:    vzeroupper
914 ; AVX512BW-NEXT:    retq
915 entry:
916   store <64 x i8> %X, <64 x i8>* %ptr, align 64, !nontemporal !1
917   ret void
920 define void @test_nt32xi16(<32 x i16>* nocapture %ptr, <32 x i16> %X) {
921 ; SSE-LABEL: test_nt32xi16:
922 ; SSE:       # %bb.0: # %entry
923 ; SSE-NEXT:    movntdq %xmm0, (%rdi)
924 ; SSE-NEXT:    movntdq %xmm1, 16(%rdi)
925 ; SSE-NEXT:    movntdq %xmm2, 32(%rdi)
926 ; SSE-NEXT:    movntdq %xmm3, 48(%rdi)
927 ; SSE-NEXT:    retq
929 ; AVX-LABEL: test_nt32xi16:
930 ; AVX:       # %bb.0: # %entry
931 ; AVX-NEXT:    vmovntdq %ymm0, (%rdi)
932 ; AVX-NEXT:    vmovntdq %ymm1, 32(%rdi)
933 ; AVX-NEXT:    vzeroupper
934 ; AVX-NEXT:    retq
936 ; AVX512VL-LABEL: test_nt32xi16:
937 ; AVX512VL:       # %bb.0: # %entry
938 ; AVX512VL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
939 ; AVX512VL-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
940 ; AVX512VL-NEXT:    vmovntdq %ymm0, (%rdi)
941 ; AVX512VL-NEXT:    vmovntdq %ymm1, 32(%rdi)
942 ; AVX512VL-NEXT:    vzeroupper
943 ; AVX512VL-NEXT:    retq
945 ; AVX512F-LABEL: test_nt32xi16:
946 ; AVX512F:       # %bb.0: # %entry
947 ; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
948 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
949 ; AVX512F-NEXT:    vmovntdq %ymm0, (%rdi)
950 ; AVX512F-NEXT:    vmovntdq %ymm1, 32(%rdi)
951 ; AVX512F-NEXT:    vzeroupper
952 ; AVX512F-NEXT:    retq
954 ; AVX512BW-LABEL: test_nt32xi16:
955 ; AVX512BW:       # %bb.0: # %entry
956 ; AVX512BW-NEXT:    vmovntdq %zmm0, (%rdi)
957 ; AVX512BW-NEXT:    vzeroupper
958 ; AVX512BW-NEXT:    retq
959 entry:
960   store <32 x i16> %X, <32 x i16>* %ptr, align 64, !nontemporal !1
961   ret void
964 define void @test_nt16xi32(<16 x i32>* nocapture %ptr, <16 x i32> %X) {
965 ; SSE-LABEL: test_nt16xi32:
966 ; SSE:       # %bb.0: # %entry
967 ; SSE-NEXT:    movntdq %xmm0, (%rdi)
968 ; SSE-NEXT:    movntdq %xmm1, 16(%rdi)
969 ; SSE-NEXT:    movntdq %xmm2, 32(%rdi)
970 ; SSE-NEXT:    movntdq %xmm3, 48(%rdi)
971 ; SSE-NEXT:    retq
973 ; AVX-LABEL: test_nt16xi32:
974 ; AVX:       # %bb.0: # %entry
975 ; AVX-NEXT:    vmovntdq %ymm0, (%rdi)
976 ; AVX-NEXT:    vmovntdq %ymm1, 32(%rdi)
977 ; AVX-NEXT:    vzeroupper
978 ; AVX-NEXT:    retq
980 ; AVX512-LABEL: test_nt16xi32:
981 ; AVX512:       # %bb.0: # %entry
982 ; AVX512-NEXT:    vmovntdq %zmm0, (%rdi)
983 ; AVX512-NEXT:    vzeroupper
984 ; AVX512-NEXT:    retq
985 entry:
986   store <16 x i32> %X, <16 x i32>* %ptr, align 64, !nontemporal !1
987   ret void
990 define void @test_nt8xi64(<8 x i64>* nocapture %ptr, <8 x i64> %X) {
991 ; SSE-LABEL: test_nt8xi64:
992 ; SSE:       # %bb.0: # %entry
993 ; SSE-NEXT:    movntdq %xmm0, (%rdi)
994 ; SSE-NEXT:    movntdq %xmm1, 16(%rdi)
995 ; SSE-NEXT:    movntdq %xmm2, 32(%rdi)
996 ; SSE-NEXT:    movntdq %xmm3, 48(%rdi)
997 ; SSE-NEXT:    retq
999 ; AVX-LABEL: test_nt8xi64:
1000 ; AVX:       # %bb.0: # %entry
1001 ; AVX-NEXT:    vmovntdq %ymm0, (%rdi)
1002 ; AVX-NEXT:    vmovntdq %ymm1, 32(%rdi)
1003 ; AVX-NEXT:    vzeroupper
1004 ; AVX-NEXT:    retq
1006 ; AVX512-LABEL: test_nt8xi64:
1007 ; AVX512:       # %bb.0: # %entry
1008 ; AVX512-NEXT:    vmovntdq %zmm0, (%rdi)
1009 ; AVX512-NEXT:    vzeroupper
1010 ; AVX512-NEXT:    retq
1011 entry:
1012   store <8 x i64> %X, <8 x i64>* %ptr, align 64, !nontemporal !1
1013   ret void
1017 ; 512-bit Vector Loads
1020 define <16 x float> @test_load_nt16xfloat(<16 x float>* nocapture %ptr) {
1021 ; SSE2-LABEL: test_load_nt16xfloat:
1022 ; SSE2:       # %bb.0: # %entry
1023 ; SSE2-NEXT:    movaps (%rdi), %xmm0
1024 ; SSE2-NEXT:    movaps 16(%rdi), %xmm1
1025 ; SSE2-NEXT:    movaps 32(%rdi), %xmm2
1026 ; SSE2-NEXT:    movaps 48(%rdi), %xmm3
1027 ; SSE2-NEXT:    retq
1029 ; SSE4A-LABEL: test_load_nt16xfloat:
1030 ; SSE4A:       # %bb.0: # %entry
1031 ; SSE4A-NEXT:    movaps (%rdi), %xmm0
1032 ; SSE4A-NEXT:    movaps 16(%rdi), %xmm1
1033 ; SSE4A-NEXT:    movaps 32(%rdi), %xmm2
1034 ; SSE4A-NEXT:    movaps 48(%rdi), %xmm3
1035 ; SSE4A-NEXT:    retq
1037 ; SSE41-LABEL: test_load_nt16xfloat:
1038 ; SSE41:       # %bb.0: # %entry
1039 ; SSE41-NEXT:    movntdqa (%rdi), %xmm0
1040 ; SSE41-NEXT:    movntdqa 16(%rdi), %xmm1
1041 ; SSE41-NEXT:    movntdqa 32(%rdi), %xmm2
1042 ; SSE41-NEXT:    movntdqa 48(%rdi), %xmm3
1043 ; SSE41-NEXT:    retq
1045 ; AVX1-LABEL: test_load_nt16xfloat:
1046 ; AVX1:       # %bb.0: # %entry
1047 ; AVX1-NEXT:    vmovntdqa (%rdi), %xmm0
1048 ; AVX1-NEXT:    # implicit-def: $ymm1
1049 ; AVX1-NEXT:    vmovaps %xmm0, %xmm1
1050 ; AVX1-NEXT:    vmovntdqa 16(%rdi), %xmm0
1051 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1052 ; AVX1-NEXT:    vmovntdqa 32(%rdi), %xmm2
1053 ; AVX1-NEXT:    # implicit-def: $ymm1
1054 ; AVX1-NEXT:    vmovaps %xmm2, %xmm1
1055 ; AVX1-NEXT:    vmovntdqa 48(%rdi), %xmm2
1056 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
1057 ; AVX1-NEXT:    retq
1059 ; AVX2-LABEL: test_load_nt16xfloat:
1060 ; AVX2:       # %bb.0: # %entry
1061 ; AVX2-NEXT:    vmovntdqa (%rdi), %ymm0
1062 ; AVX2-NEXT:    vmovntdqa 32(%rdi), %ymm1
1063 ; AVX2-NEXT:    retq
1065 ; AVX512-LABEL: test_load_nt16xfloat:
1066 ; AVX512:       # %bb.0: # %entry
1067 ; AVX512-NEXT:    vmovntdqa (%rdi), %zmm0
1068 ; AVX512-NEXT:    retq
1069 entry:
1070   %0 = load <16 x float>, <16 x float>* %ptr, align 64, !nontemporal !1
1071   ret <16 x float> %0
1074 define <8 x double> @test_load_nt8xdouble(<8 x double>* nocapture %ptr) {
1075 ; SSE2-LABEL: test_load_nt8xdouble:
1076 ; SSE2:       # %bb.0: # %entry
1077 ; SSE2-NEXT:    movapd (%rdi), %xmm0
1078 ; SSE2-NEXT:    movapd 16(%rdi), %xmm1
1079 ; SSE2-NEXT:    movapd 32(%rdi), %xmm2
1080 ; SSE2-NEXT:    movapd 48(%rdi), %xmm3
1081 ; SSE2-NEXT:    retq
1083 ; SSE4A-LABEL: test_load_nt8xdouble:
1084 ; SSE4A:       # %bb.0: # %entry
1085 ; SSE4A-NEXT:    movapd (%rdi), %xmm0
1086 ; SSE4A-NEXT:    movapd 16(%rdi), %xmm1
1087 ; SSE4A-NEXT:    movapd 32(%rdi), %xmm2
1088 ; SSE4A-NEXT:    movapd 48(%rdi), %xmm3
1089 ; SSE4A-NEXT:    retq
1091 ; SSE41-LABEL: test_load_nt8xdouble:
1092 ; SSE41:       # %bb.0: # %entry
1093 ; SSE41-NEXT:    movntdqa (%rdi), %xmm0
1094 ; SSE41-NEXT:    movntdqa 16(%rdi), %xmm1
1095 ; SSE41-NEXT:    movntdqa 32(%rdi), %xmm2
1096 ; SSE41-NEXT:    movntdqa 48(%rdi), %xmm3
1097 ; SSE41-NEXT:    retq
1099 ; AVX1-LABEL: test_load_nt8xdouble:
1100 ; AVX1:       # %bb.0: # %entry
1101 ; AVX1-NEXT:    vmovntdqa (%rdi), %xmm0
1102 ; AVX1-NEXT:    # implicit-def: $ymm1
1103 ; AVX1-NEXT:    vmovaps %xmm0, %xmm1
1104 ; AVX1-NEXT:    vmovntdqa 16(%rdi), %xmm0
1105 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1106 ; AVX1-NEXT:    vmovntdqa 32(%rdi), %xmm2
1107 ; AVX1-NEXT:    # implicit-def: $ymm1
1108 ; AVX1-NEXT:    vmovaps %xmm2, %xmm1
1109 ; AVX1-NEXT:    vmovntdqa 48(%rdi), %xmm2
1110 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
1111 ; AVX1-NEXT:    retq
1113 ; AVX2-LABEL: test_load_nt8xdouble:
1114 ; AVX2:       # %bb.0: # %entry
1115 ; AVX2-NEXT:    vmovntdqa (%rdi), %ymm0
1116 ; AVX2-NEXT:    vmovntdqa 32(%rdi), %ymm1
1117 ; AVX2-NEXT:    retq
1119 ; AVX512-LABEL: test_load_nt8xdouble:
1120 ; AVX512:       # %bb.0: # %entry
1121 ; AVX512-NEXT:    vmovntdqa (%rdi), %zmm0
1122 ; AVX512-NEXT:    retq
1123 entry:
1124   %0 = load <8 x double>, <8 x double>* %ptr, align 64, !nontemporal !1
1125   ret <8 x double> %0
1128 define <64 x i8> @test_load_nt64xi8(<64 x i8>* nocapture %ptr) {
1129 ; SSE2-LABEL: test_load_nt64xi8:
1130 ; SSE2:       # %bb.0: # %entry
1131 ; SSE2-NEXT:    movaps (%rdi), %xmm0
1132 ; SSE2-NEXT:    movaps 16(%rdi), %xmm1
1133 ; SSE2-NEXT:    movaps 32(%rdi), %xmm2
1134 ; SSE2-NEXT:    movaps 48(%rdi), %xmm3
1135 ; SSE2-NEXT:    retq
1137 ; SSE4A-LABEL: test_load_nt64xi8:
1138 ; SSE4A:       # %bb.0: # %entry
1139 ; SSE4A-NEXT:    movaps (%rdi), %xmm0
1140 ; SSE4A-NEXT:    movaps 16(%rdi), %xmm1
1141 ; SSE4A-NEXT:    movaps 32(%rdi), %xmm2
1142 ; SSE4A-NEXT:    movaps 48(%rdi), %xmm3
1143 ; SSE4A-NEXT:    retq
1145 ; SSE41-LABEL: test_load_nt64xi8:
1146 ; SSE41:       # %bb.0: # %entry
1147 ; SSE41-NEXT:    movntdqa (%rdi), %xmm0
1148 ; SSE41-NEXT:    movntdqa 16(%rdi), %xmm1
1149 ; SSE41-NEXT:    movntdqa 32(%rdi), %xmm2
1150 ; SSE41-NEXT:    movntdqa 48(%rdi), %xmm3
1151 ; SSE41-NEXT:    retq
1153 ; AVX1-LABEL: test_load_nt64xi8:
1154 ; AVX1:       # %bb.0: # %entry
1155 ; AVX1-NEXT:    vmovntdqa (%rdi), %xmm0
1156 ; AVX1-NEXT:    # implicit-def: $ymm1
1157 ; AVX1-NEXT:    vmovaps %xmm0, %xmm1
1158 ; AVX1-NEXT:    vmovntdqa 16(%rdi), %xmm0
1159 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1160 ; AVX1-NEXT:    vmovntdqa 32(%rdi), %xmm2
1161 ; AVX1-NEXT:    # implicit-def: $ymm1
1162 ; AVX1-NEXT:    vmovaps %xmm2, %xmm1
1163 ; AVX1-NEXT:    vmovntdqa 48(%rdi), %xmm2
1164 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
1165 ; AVX1-NEXT:    retq
1167 ; AVX2-LABEL: test_load_nt64xi8:
1168 ; AVX2:       # %bb.0: # %entry
1169 ; AVX2-NEXT:    vmovntdqa (%rdi), %ymm0
1170 ; AVX2-NEXT:    vmovntdqa 32(%rdi), %ymm1
1171 ; AVX2-NEXT:    retq
1173 ; AVX512-LABEL: test_load_nt64xi8:
1174 ; AVX512:       # %bb.0: # %entry
1175 ; AVX512-NEXT:    vmovntdqa (%rdi), %zmm0
1176 ; AVX512-NEXT:    retq
1177 entry:
1178   %0 = load <64 x i8>, <64 x i8>* %ptr, align 64, !nontemporal !1
1179   ret <64 x i8> %0
1182 define <32 x i16> @test_load_nt32xi16(<32 x i16>* nocapture %ptr) {
1183 ; SSE2-LABEL: test_load_nt32xi16:
1184 ; SSE2:       # %bb.0: # %entry
1185 ; SSE2-NEXT:    movaps (%rdi), %xmm0
1186 ; SSE2-NEXT:    movaps 16(%rdi), %xmm1
1187 ; SSE2-NEXT:    movaps 32(%rdi), %xmm2
1188 ; SSE2-NEXT:    movaps 48(%rdi), %xmm3
1189 ; SSE2-NEXT:    retq
1191 ; SSE4A-LABEL: test_load_nt32xi16:
1192 ; SSE4A:       # %bb.0: # %entry
1193 ; SSE4A-NEXT:    movaps (%rdi), %xmm0
1194 ; SSE4A-NEXT:    movaps 16(%rdi), %xmm1
1195 ; SSE4A-NEXT:    movaps 32(%rdi), %xmm2
1196 ; SSE4A-NEXT:    movaps 48(%rdi), %xmm3
1197 ; SSE4A-NEXT:    retq
1199 ; SSE41-LABEL: test_load_nt32xi16:
1200 ; SSE41:       # %bb.0: # %entry
1201 ; SSE41-NEXT:    movntdqa (%rdi), %xmm0
1202 ; SSE41-NEXT:    movntdqa 16(%rdi), %xmm1
1203 ; SSE41-NEXT:    movntdqa 32(%rdi), %xmm2
1204 ; SSE41-NEXT:    movntdqa 48(%rdi), %xmm3
1205 ; SSE41-NEXT:    retq
1207 ; AVX1-LABEL: test_load_nt32xi16:
1208 ; AVX1:       # %bb.0: # %entry
1209 ; AVX1-NEXT:    vmovntdqa (%rdi), %xmm0
1210 ; AVX1-NEXT:    # implicit-def: $ymm1
1211 ; AVX1-NEXT:    vmovaps %xmm0, %xmm1
1212 ; AVX1-NEXT:    vmovntdqa 16(%rdi), %xmm0
1213 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1214 ; AVX1-NEXT:    vmovntdqa 32(%rdi), %xmm2
1215 ; AVX1-NEXT:    # implicit-def: $ymm1
1216 ; AVX1-NEXT:    vmovaps %xmm2, %xmm1
1217 ; AVX1-NEXT:    vmovntdqa 48(%rdi), %xmm2
1218 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
1219 ; AVX1-NEXT:    retq
1221 ; AVX2-LABEL: test_load_nt32xi16:
1222 ; AVX2:       # %bb.0: # %entry
1223 ; AVX2-NEXT:    vmovntdqa (%rdi), %ymm0
1224 ; AVX2-NEXT:    vmovntdqa 32(%rdi), %ymm1
1225 ; AVX2-NEXT:    retq
1227 ; AVX512-LABEL: test_load_nt32xi16:
1228 ; AVX512:       # %bb.0: # %entry
1229 ; AVX512-NEXT:    vmovntdqa (%rdi), %zmm0
1230 ; AVX512-NEXT:    retq
1231 entry:
1232   %0 = load <32 x i16>, <32 x i16>* %ptr, align 64, !nontemporal !1
1233   ret <32 x i16> %0
1236 define <16 x i32> @test_load_nt16xi32(<16 x i32>* nocapture %ptr) {
1237 ; SSE2-LABEL: test_load_nt16xi32:
1238 ; SSE2:       # %bb.0: # %entry
1239 ; SSE2-NEXT:    movaps (%rdi), %xmm0
1240 ; SSE2-NEXT:    movaps 16(%rdi), %xmm1
1241 ; SSE2-NEXT:    movaps 32(%rdi), %xmm2
1242 ; SSE2-NEXT:    movaps 48(%rdi), %xmm3
1243 ; SSE2-NEXT:    retq
1245 ; SSE4A-LABEL: test_load_nt16xi32:
1246 ; SSE4A:       # %bb.0: # %entry
1247 ; SSE4A-NEXT:    movaps (%rdi), %xmm0
1248 ; SSE4A-NEXT:    movaps 16(%rdi), %xmm1
1249 ; SSE4A-NEXT:    movaps 32(%rdi), %xmm2
1250 ; SSE4A-NEXT:    movaps 48(%rdi), %xmm3
1251 ; SSE4A-NEXT:    retq
1253 ; SSE41-LABEL: test_load_nt16xi32:
1254 ; SSE41:       # %bb.0: # %entry
1255 ; SSE41-NEXT:    movntdqa (%rdi), %xmm0
1256 ; SSE41-NEXT:    movntdqa 16(%rdi), %xmm1
1257 ; SSE41-NEXT:    movntdqa 32(%rdi), %xmm2
1258 ; SSE41-NEXT:    movntdqa 48(%rdi), %xmm3
1259 ; SSE41-NEXT:    retq
1261 ; AVX1-LABEL: test_load_nt16xi32:
1262 ; AVX1:       # %bb.0: # %entry
1263 ; AVX1-NEXT:    vmovntdqa (%rdi), %xmm0
1264 ; AVX1-NEXT:    # implicit-def: $ymm1
1265 ; AVX1-NEXT:    vmovaps %xmm0, %xmm1
1266 ; AVX1-NEXT:    vmovntdqa 16(%rdi), %xmm0
1267 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1268 ; AVX1-NEXT:    vmovntdqa 32(%rdi), %xmm2
1269 ; AVX1-NEXT:    # implicit-def: $ymm1
1270 ; AVX1-NEXT:    vmovaps %xmm2, %xmm1
1271 ; AVX1-NEXT:    vmovntdqa 48(%rdi), %xmm2
1272 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
1273 ; AVX1-NEXT:    retq
1275 ; AVX2-LABEL: test_load_nt16xi32:
1276 ; AVX2:       # %bb.0: # %entry
1277 ; AVX2-NEXT:    vmovntdqa (%rdi), %ymm0
1278 ; AVX2-NEXT:    vmovntdqa 32(%rdi), %ymm1
1279 ; AVX2-NEXT:    retq
1281 ; AVX512-LABEL: test_load_nt16xi32:
1282 ; AVX512:       # %bb.0: # %entry
1283 ; AVX512-NEXT:    vmovntdqa (%rdi), %zmm0
1284 ; AVX512-NEXT:    retq
1285 entry:
1286   %0 = load <16 x i32>, <16 x i32>* %ptr, align 64, !nontemporal !1
1287   ret <16 x i32> %0
1290 define <8 x i64> @test_load_nt8xi64(<8 x i64>* nocapture %ptr) {
1291 ; SSE2-LABEL: test_load_nt8xi64:
1292 ; SSE2:       # %bb.0: # %entry
1293 ; SSE2-NEXT:    movaps (%rdi), %xmm0
1294 ; SSE2-NEXT:    movaps 16(%rdi), %xmm1
1295 ; SSE2-NEXT:    movaps 32(%rdi), %xmm2
1296 ; SSE2-NEXT:    movaps 48(%rdi), %xmm3
1297 ; SSE2-NEXT:    retq
1299 ; SSE4A-LABEL: test_load_nt8xi64:
1300 ; SSE4A:       # %bb.0: # %entry
1301 ; SSE4A-NEXT:    movaps (%rdi), %xmm0
1302 ; SSE4A-NEXT:    movaps 16(%rdi), %xmm1
1303 ; SSE4A-NEXT:    movaps 32(%rdi), %xmm2
1304 ; SSE4A-NEXT:    movaps 48(%rdi), %xmm3
1305 ; SSE4A-NEXT:    retq
1307 ; SSE41-LABEL: test_load_nt8xi64:
1308 ; SSE41:       # %bb.0: # %entry
1309 ; SSE41-NEXT:    movntdqa (%rdi), %xmm0
1310 ; SSE41-NEXT:    movntdqa 16(%rdi), %xmm1
1311 ; SSE41-NEXT:    movntdqa 32(%rdi), %xmm2
1312 ; SSE41-NEXT:    movntdqa 48(%rdi), %xmm3
1313 ; SSE41-NEXT:    retq
1315 ; AVX1-LABEL: test_load_nt8xi64:
1316 ; AVX1:       # %bb.0: # %entry
1317 ; AVX1-NEXT:    vmovntdqa (%rdi), %xmm0
1318 ; AVX1-NEXT:    # implicit-def: $ymm1
1319 ; AVX1-NEXT:    vmovaps %xmm0, %xmm1
1320 ; AVX1-NEXT:    vmovntdqa 16(%rdi), %xmm0
1321 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1322 ; AVX1-NEXT:    vmovntdqa 32(%rdi), %xmm2
1323 ; AVX1-NEXT:    # implicit-def: $ymm1
1324 ; AVX1-NEXT:    vmovaps %xmm2, %xmm1
1325 ; AVX1-NEXT:    vmovntdqa 48(%rdi), %xmm2
1326 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
1327 ; AVX1-NEXT:    retq
1329 ; AVX2-LABEL: test_load_nt8xi64:
1330 ; AVX2:       # %bb.0: # %entry
1331 ; AVX2-NEXT:    vmovntdqa (%rdi), %ymm0
1332 ; AVX2-NEXT:    vmovntdqa 32(%rdi), %ymm1
1333 ; AVX2-NEXT:    retq
1335 ; AVX512-LABEL: test_load_nt8xi64:
1336 ; AVX512:       # %bb.0: # %entry
1337 ; AVX512-NEXT:    vmovntdqa (%rdi), %zmm0
1338 ; AVX512-NEXT:    retq
1339 entry:
1340   %0 = load <8 x i64>, <8 x i64>* %ptr, align 64, !nontemporal !1
1341   ret <8 x i64> %0
1344 !1 = !{i32 1}