1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -verify-machineinstrs -mtriple=x86_64-unknown-unknown -mattr=+sse2 -fast-isel -O0 < %s | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE2
3; RUN: llc -verify-machineinstrs -mtriple=x86_64-unknown-unknown -mattr=+sse4a -fast-isel -O0 < %s | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE4A
4; RUN: llc -verify-machineinstrs -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 -fast-isel -O0 < %s | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE41
5; RUN: llc -verify-machineinstrs -mtriple=x86_64-unknown-unknown -mattr=+avx -fast-isel -O0 < %s | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1
6; RUN: llc -verify-machineinstrs -mtriple=x86_64-unknown-unknown -mattr=+avx2 -fast-isel -O0 < %s | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2
7; RUN: llc -verify-machineinstrs -mtriple=x86_64-unknown-unknown -mattr=+avx512f -fast-isel -O0 < %s | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512F
8; RUN: llc -verify-machineinstrs -mtriple=x86_64-unknown-unknown -mattr=+avx512bw -fast-isel -O0 < %s | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512BW
9
10;
11; Scalar Stores
12;
13
14define void @test_nti32(i32* nocapture %ptr, i32 %X) {
15; ALL-LABEL: test_nti32:
16; ALL:       # BB#0: # %entry
17; ALL-NEXT:    movntil %esi, (%rdi)
18; ALL-NEXT:    retq
19entry:
20  store i32 %X, i32* %ptr, align 4, !nontemporal !1
21  ret void
22}
23
24define void @test_nti64(i64* nocapture %ptr, i64 %X) {
25; ALL-LABEL: test_nti64:
26; ALL:       # BB#0: # %entry
27; ALL-NEXT:    movntiq %rsi, (%rdi)
28; ALL-NEXT:    retq
29entry:
30  store i64 %X, i64* %ptr, align 8, !nontemporal !1
31  ret void
32}
33
34define void @test_ntfloat(float* nocapture %ptr, float %X) {
35; SSE2-LABEL: test_ntfloat:
36; SSE2:       # BB#0: # %entry
37; SSE2-NEXT:    movss %xmm0, (%rdi)
38; SSE2-NEXT:    retq
39;
40; SSE4A-LABEL: test_ntfloat:
41; SSE4A:       # BB#0: # %entry
42; SSE4A-NEXT:    movntss %xmm0, (%rdi)
43; SSE4A-NEXT:    retq
44;
45; SSE41-LABEL: test_ntfloat:
46; SSE41:       # BB#0: # %entry
47; SSE41-NEXT:    movss %xmm0, (%rdi)
48; SSE41-NEXT:    retq
49;
50; AVX-LABEL: test_ntfloat:
51; AVX:       # BB#0: # %entry
52; AVX-NEXT:    vmovss %xmm0, (%rdi)
53; AVX-NEXT:    retq
54;
55; AVX512-LABEL: test_ntfloat:
56; AVX512:       # BB#0: # %entry
57; AVX512-NEXT:    vmovss %xmm0, (%rdi)
58; AVX512-NEXT:    retq
59entry:
60  store float %X, float* %ptr, align 4, !nontemporal !1
61  ret void
62}
63
64define void @test_ntdouble(double* nocapture %ptr, double %X) {
65; SSE2-LABEL: test_ntdouble:
66; SSE2:       # BB#0: # %entry
67; SSE2-NEXT:    movsd %xmm0, (%rdi)
68; SSE2-NEXT:    retq
69;
70; SSE4A-LABEL: test_ntdouble:
71; SSE4A:       # BB#0: # %entry
72; SSE4A-NEXT:    movntsd %xmm0, (%rdi)
73; SSE4A-NEXT:    retq
74;
75; SSE41-LABEL: test_ntdouble:
76; SSE41:       # BB#0: # %entry
77; SSE41-NEXT:    movsd %xmm0, (%rdi)
78; SSE41-NEXT:    retq
79;
80; AVX-LABEL: test_ntdouble:
81; AVX:       # BB#0: # %entry
82; AVX-NEXT:    vmovsd %xmm0, (%rdi)
83; AVX-NEXT:    retq
84;
85; AVX512-LABEL: test_ntdouble:
86; AVX512:       # BB#0: # %entry
87; AVX512-NEXT:    vmovsd %xmm0, (%rdi)
88; AVX512-NEXT:    retq
89entry:
90  store double %X, double* %ptr, align 8, !nontemporal !1
91  ret void
92}
93
94;
95; 128-bit Vector Stores
96;
97
98define void @test_nt4xfloat(<4 x float>* nocapture %ptr, <4 x float> %X) {
99; SSE-LABEL: test_nt4xfloat:
100; SSE:       # BB#0: # %entry
101; SSE-NEXT:    movntps %xmm0, (%rdi)
102; SSE-NEXT:    retq
103;
104; AVX-LABEL: test_nt4xfloat:
105; AVX:       # BB#0: # %entry
106; AVX-NEXT:    vmovntps %xmm0, (%rdi)
107; AVX-NEXT:    retq
108;
109; AVX512-LABEL: test_nt4xfloat:
110; AVX512:       # BB#0: # %entry
111; AVX512-NEXT:    vmovntps %xmm0, (%rdi)
112; AVX512-NEXT:    retq
113entry:
114  store <4 x float> %X, <4 x float>* %ptr, align 16, !nontemporal !1
115  ret void
116}
117
118define void @test_nt2xdouble(<2 x double>* nocapture %ptr, <2 x double> %X) {
119; SSE-LABEL: test_nt2xdouble:
120; SSE:       # BB#0: # %entry
121; SSE-NEXT:    movntpd %xmm0, (%rdi)
122; SSE-NEXT:    retq
123;
124; AVX-LABEL: test_nt2xdouble:
125; AVX:       # BB#0: # %entry
126; AVX-NEXT:    vmovntpd %xmm0, (%rdi)
127; AVX-NEXT:    retq
128;
129; AVX512-LABEL: test_nt2xdouble:
130; AVX512:       # BB#0: # %entry
131; AVX512-NEXT:    vmovntpd %xmm0, (%rdi)
132; AVX512-NEXT:    retq
133entry:
134  store <2 x double> %X, <2 x double>* %ptr, align 16, !nontemporal !1
135  ret void
136}
137
138define void @test_nt16xi8(<16 x i8>* nocapture %ptr, <16 x i8> %X) {
139; SSE-LABEL: test_nt16xi8:
140; SSE:       # BB#0: # %entry
141; SSE-NEXT:    movntdq %xmm0, (%rdi)
142; SSE-NEXT:    retq
143;
144; AVX-LABEL: test_nt16xi8:
145; AVX:       # BB#0: # %entry
146; AVX-NEXT:    vmovntdq %xmm0, (%rdi)
147; AVX-NEXT:    retq
148;
149; AVX512-LABEL: test_nt16xi8:
150; AVX512:       # BB#0: # %entry
151; AVX512-NEXT:    vmovntdq %xmm0, (%rdi)
152; AVX512-NEXT:    retq
153entry:
154  store <16 x i8> %X, <16 x i8>* %ptr, align 16, !nontemporal !1
155  ret void
156}
157
158define void @test_nt8xi16(<8 x i16>* nocapture %ptr, <8 x i16> %X) {
159; SSE-LABEL: test_nt8xi16:
160; SSE:       # BB#0: # %entry
161; SSE-NEXT:    movntdq %xmm0, (%rdi)
162; SSE-NEXT:    retq
163;
164; AVX-LABEL: test_nt8xi16:
165; AVX:       # BB#0: # %entry
166; AVX-NEXT:    vmovntdq %xmm0, (%rdi)
167; AVX-NEXT:    retq
168;
169; AVX512-LABEL: test_nt8xi16:
170; AVX512:       # BB#0: # %entry
171; AVX512-NEXT:    vmovntdq %xmm0, (%rdi)
172; AVX512-NEXT:    retq
173entry:
174  store <8 x i16> %X, <8 x i16>* %ptr, align 16, !nontemporal !1
175  ret void
176}
177
178define void @test_nt4xi32(<4 x i32>* nocapture %ptr, <4 x i32> %X) {
179; SSE-LABEL: test_nt4xi32:
180; SSE:       # BB#0: # %entry
181; SSE-NEXT:    movntdq %xmm0, (%rdi)
182; SSE-NEXT:    retq
183;
184; AVX-LABEL: test_nt4xi32:
185; AVX:       # BB#0: # %entry
186; AVX-NEXT:    vmovntdq %xmm0, (%rdi)
187; AVX-NEXT:    retq
188;
189; AVX512-LABEL: test_nt4xi32:
190; AVX512:       # BB#0: # %entry
191; AVX512-NEXT:    vmovntdq %xmm0, (%rdi)
192; AVX512-NEXT:    retq
193entry:
194  store <4 x i32> %X, <4 x i32>* %ptr, align 16, !nontemporal !1
195  ret void
196}
197
198define void @test_nt2xi64(<2 x i64>* nocapture %ptr, <2 x i64> %X) {
199; SSE-LABEL: test_nt2xi64:
200; SSE:       # BB#0: # %entry
201; SSE-NEXT:    movntdq %xmm0, (%rdi)
202; SSE-NEXT:    retq
203;
204; AVX-LABEL: test_nt2xi64:
205; AVX:       # BB#0: # %entry
206; AVX-NEXT:    vmovntdq %xmm0, (%rdi)
207; AVX-NEXT:    retq
208;
209; AVX512-LABEL: test_nt2xi64:
210; AVX512:       # BB#0: # %entry
211; AVX512-NEXT:    vmovntdq %xmm0, (%rdi)
212; AVX512-NEXT:    retq
213entry:
214  store <2 x i64> %X, <2 x i64>* %ptr, align 16, !nontemporal !1
215  ret void
216}
217
218;
219; 128-bit Vector Loads
220;
221
222define <4 x float> @test_load_nt4xfloat(<4 x float>* nocapture %ptr) {
223; SSE2-LABEL: test_load_nt4xfloat:
224; SSE2:       # BB#0: # %entry
225; SSE2-NEXT:    movaps (%rdi), %xmm0
226; SSE2-NEXT:    retq
227;
228; SSE4A-LABEL: test_load_nt4xfloat:
229; SSE4A:       # BB#0: # %entry
230; SSE4A-NEXT:    movaps (%rdi), %xmm0
231; SSE4A-NEXT:    retq
232;
233; SSE41-LABEL: test_load_nt4xfloat:
234; SSE41:       # BB#0: # %entry
235; SSE41-NEXT:    movntdqa (%rdi), %xmm0
236; SSE41-NEXT:    retq
237;
238; AVX-LABEL: test_load_nt4xfloat:
239; AVX:       # BB#0: # %entry
240; AVX-NEXT:    vmovntdqa (%rdi), %xmm0
241; AVX-NEXT:    retq
242;
243; AVX512-LABEL: test_load_nt4xfloat:
244; AVX512:       # BB#0: # %entry
245; AVX512-NEXT:    vmovntdqa (%rdi), %xmm0
246; AVX512-NEXT:    retq
247entry:
248  %0 = load <4 x float>, <4 x float>* %ptr, align 16, !nontemporal !1
249  ret <4 x float> %0
250}
251
252define <2 x double> @test_load_nt2xdouble(<2 x double>* nocapture %ptr) {
253; SSE2-LABEL: test_load_nt2xdouble:
254; SSE2:       # BB#0: # %entry
255; SSE2-NEXT:    movapd (%rdi), %xmm0
256; SSE2-NEXT:    retq
257;
258; SSE4A-LABEL: test_load_nt2xdouble:
259; SSE4A:       # BB#0: # %entry
260; SSE4A-NEXT:    movapd (%rdi), %xmm0
261; SSE4A-NEXT:    retq
262;
263; SSE41-LABEL: test_load_nt2xdouble:
264; SSE41:       # BB#0: # %entry
265; SSE41-NEXT:    movntdqa (%rdi), %xmm0
266; SSE41-NEXT:    retq
267;
268; AVX-LABEL: test_load_nt2xdouble:
269; AVX:       # BB#0: # %entry
270; AVX-NEXT:    vmovntdqa (%rdi), %xmm0
271; AVX-NEXT:    retq
272;
273; AVX512-LABEL: test_load_nt2xdouble:
274; AVX512:       # BB#0: # %entry
275; AVX512-NEXT:    vmovntdqa (%rdi), %xmm0
276; AVX512-NEXT:    retq
277entry:
278  %0 = load <2 x double>, <2 x double>* %ptr, align 16, !nontemporal !1
279  ret <2 x double> %0
280}
281
282define <16 x i8> @test_load_nt16xi8(<16 x i8>* nocapture %ptr) {
283; SSE-LABEL: test_load_nt16xi8:
284; SSE:       # BB#0: # %entry
285; SSE-NEXT:    movntdqa (%rdi), %xmm0
286; SSE-NEXT:    retq
287;
288; AVX-LABEL: test_load_nt16xi8:
289; AVX:       # BB#0: # %entry
290; AVX-NEXT:    vmovntdqa (%rdi), %xmm0
291; AVX-NEXT:    retq
292;
293; AVX512-LABEL: test_load_nt16xi8:
294; AVX512:       # BB#0: # %entry
295; AVX512-NEXT:    vmovntdqa (%rdi), %xmm0
296; AVX512-NEXT:    retq
297entry:
298  %0 = load <16 x i8>, <16 x i8>* %ptr, align 16, !nontemporal !1
299  ret <16 x i8> %0
300}
301
302define <8 x i16> @test_load_nt8xi16(<8 x i16>* nocapture %ptr) {
303; SSE-LABEL: test_load_nt8xi16:
304; SSE:       # BB#0: # %entry
305; SSE-NEXT:    movntdqa (%rdi), %xmm0
306; SSE-NEXT:    retq
307;
308; AVX-LABEL: test_load_nt8xi16:
309; AVX:       # BB#0: # %entry
310; AVX-NEXT:    vmovntdqa (%rdi), %xmm0
311; AVX-NEXT:    retq
312;
313; AVX512-LABEL: test_load_nt8xi16:
314; AVX512:       # BB#0: # %entry
315; AVX512-NEXT:    vmovntdqa (%rdi), %xmm0
316; AVX512-NEXT:    retq
317entry:
318  %0 = load <8 x i16>, <8 x i16>* %ptr, align 16, !nontemporal !1
319  ret <8 x i16> %0
320}
321
322define <4 x i32> @test_load_nt4xi32(<4 x i32>* nocapture %ptr) {
323; SSE-LABEL: test_load_nt4xi32:
324; SSE:       # BB#0: # %entry
325; SSE-NEXT:    movntdqa (%rdi), %xmm0
326; SSE-NEXT:    retq
327;
328; AVX-LABEL: test_load_nt4xi32:
329; AVX:       # BB#0: # %entry
330; AVX-NEXT:    vmovntdqa (%rdi), %xmm0
331; AVX-NEXT:    retq
332;
333; AVX512-LABEL: test_load_nt4xi32:
334; AVX512:       # BB#0: # %entry
335; AVX512-NEXT:    vmovntdqa (%rdi), %xmm0
336; AVX512-NEXT:    retq
337entry:
338  %0 = load <4 x i32>, <4 x i32>* %ptr, align 16, !nontemporal !1
339  ret <4 x i32> %0
340}
341
342define <2 x i64> @test_load_nt2xi64(<2 x i64>* nocapture %ptr) {
343; SSE-LABEL: test_load_nt2xi64:
344; SSE:       # BB#0: # %entry
345; SSE-NEXT:    movntdqa (%rdi), %xmm0
346; SSE-NEXT:    retq
347;
348; AVX-LABEL: test_load_nt2xi64:
349; AVX:       # BB#0: # %entry
350; AVX-NEXT:    vmovntdqa (%rdi), %xmm0
351; AVX-NEXT:    retq
352;
353; AVX512-LABEL: test_load_nt2xi64:
354; AVX512:       # BB#0: # %entry
355; AVX512-NEXT:    vmovntdqa (%rdi), %xmm0
356; AVX512-NEXT:    retq
357entry:
358  %0 = load <2 x i64>, <2 x i64>* %ptr, align 16, !nontemporal !1
359  ret <2 x i64> %0
360}
361
362;
363; 256-bit Vector Stores
364;
365
366define void @test_nt8xfloat(<8 x float>* nocapture %ptr, <8 x float> %X) {
367; SSE-LABEL: test_nt8xfloat:
368; SSE:       # BB#0: # %entry
369; SSE-NEXT:    movntps %xmm0, (%rdi)
370; SSE-NEXT:    movntps %xmm1, 16(%rdi)
371; SSE-NEXT:    retq
372;
373; AVX-LABEL: test_nt8xfloat:
374; AVX:       # BB#0: # %entry
375; AVX-NEXT:    vmovntps %ymm0, (%rdi)
376; AVX-NEXT:    vzeroupper
377; AVX-NEXT:    retq
378;
379; AVX512-LABEL: test_nt8xfloat:
380; AVX512:       # BB#0: # %entry
381; AVX512-NEXT:    vmovntps %ymm0, (%rdi)
382; AVX512-NEXT:    retq
383entry:
384  store <8 x float> %X, <8 x float>* %ptr, align 32, !nontemporal !1
385  ret void
386}
387
388define void @test_nt4xdouble(<4 x double>* nocapture %ptr, <4 x double> %X) {
389; SSE-LABEL: test_nt4xdouble:
390; SSE:       # BB#0: # %entry
391; SSE-NEXT:    movntpd %xmm0, (%rdi)
392; SSE-NEXT:    movntpd %xmm1, 16(%rdi)
393; SSE-NEXT:    retq
394;
395; AVX-LABEL: test_nt4xdouble:
396; AVX:       # BB#0: # %entry
397; AVX-NEXT:    vmovntpd %ymm0, (%rdi)
398; AVX-NEXT:    vzeroupper
399; AVX-NEXT:    retq
400;
401; AVX512-LABEL: test_nt4xdouble:
402; AVX512:       # BB#0: # %entry
403; AVX512-NEXT:    vmovntpd %ymm0, (%rdi)
404; AVX512-NEXT:    retq
405entry:
406  store <4 x double> %X, <4 x double>* %ptr, align 32, !nontemporal !1
407  ret void
408}
409
410define void @test_nt32xi8(<32 x i8>* nocapture %ptr, <32 x i8> %X) {
411; SSE-LABEL: test_nt32xi8:
412; SSE:       # BB#0: # %entry
413; SSE-NEXT:    movntdq %xmm0, (%rdi)
414; SSE-NEXT:    movntdq %xmm1, 16(%rdi)
415; SSE-NEXT:    retq
416;
417; AVX-LABEL: test_nt32xi8:
418; AVX:       # BB#0: # %entry
419; AVX-NEXT:    vmovntdq %ymm0, (%rdi)
420; AVX-NEXT:    vzeroupper
421; AVX-NEXT:    retq
422;
423; AVX512-LABEL: test_nt32xi8:
424; AVX512:       # BB#0: # %entry
425; AVX512-NEXT:    vmovntdq %ymm0, (%rdi)
426; AVX512-NEXT:    retq
427entry:
428  store <32 x i8> %X, <32 x i8>* %ptr, align 32, !nontemporal !1
429  ret void
430}
431
432define void @test_nt16xi16(<16 x i16>* nocapture %ptr, <16 x i16> %X) {
433; SSE-LABEL: test_nt16xi16:
434; SSE:       # BB#0: # %entry
435; SSE-NEXT:    movntdq %xmm0, (%rdi)
436; SSE-NEXT:    movntdq %xmm1, 16(%rdi)
437; SSE-NEXT:    retq
438;
439; AVX-LABEL: test_nt16xi16:
440; AVX:       # BB#0: # %entry
441; AVX-NEXT:    vmovntdq %ymm0, (%rdi)
442; AVX-NEXT:    vzeroupper
443; AVX-NEXT:    retq
444;
445; AVX512-LABEL: test_nt16xi16:
446; AVX512:       # BB#0: # %entry
447; AVX512-NEXT:    vmovntdq %ymm0, (%rdi)
448; AVX512-NEXT:    retq
449entry:
450  store <16 x i16> %X, <16 x i16>* %ptr, align 32, !nontemporal !1
451  ret void
452}
453
454define void @test_nt8xi32(<8 x i32>* nocapture %ptr, <8 x i32> %X) {
455; SSE-LABEL: test_nt8xi32:
456; SSE:       # BB#0: # %entry
457; SSE-NEXT:    movntdq %xmm0, (%rdi)
458; SSE-NEXT:    movntdq %xmm1, 16(%rdi)
459; SSE-NEXT:    retq
460;
461; AVX-LABEL: test_nt8xi32:
462; AVX:       # BB#0: # %entry
463; AVX-NEXT:    vmovntdq %ymm0, (%rdi)
464; AVX-NEXT:    vzeroupper
465; AVX-NEXT:    retq
466;
467; AVX512-LABEL: test_nt8xi32:
468; AVX512:       # BB#0: # %entry
469; AVX512-NEXT:    vmovntdq %ymm0, (%rdi)
470; AVX512-NEXT:    retq
471entry:
472  store <8 x i32> %X, <8 x i32>* %ptr, align 32, !nontemporal !1
473  ret void
474}
475
476define void @test_nt4xi64(<4 x i64>* nocapture %ptr, <4 x i64> %X) {
477; SSE-LABEL: test_nt4xi64:
478; SSE:       # BB#0: # %entry
479; SSE-NEXT:    movntdq %xmm0, (%rdi)
480; SSE-NEXT:    movntdq %xmm1, 16(%rdi)
481; SSE-NEXT:    retq
482;
483; AVX-LABEL: test_nt4xi64:
484; AVX:       # BB#0: # %entry
485; AVX-NEXT:    vmovntdq %ymm0, (%rdi)
486; AVX-NEXT:    vzeroupper
487; AVX-NEXT:    retq
488;
489; AVX512-LABEL: test_nt4xi64:
490; AVX512:       # BB#0: # %entry
491; AVX512-NEXT:    vmovntdq %ymm0, (%rdi)
492; AVX512-NEXT:    retq
493entry:
494  store <4 x i64> %X, <4 x i64>* %ptr, align 32, !nontemporal !1
495  ret void
496}
497
498;
499; 256-bit Vector Loads
500;
501
502define <8 x float> @test_load_nt8xfloat(<8 x float>* nocapture %ptr) {
503; SSE2-LABEL: test_load_nt8xfloat:
504; SSE2:       # BB#0: # %entry
505; SSE2-NEXT:    movaps (%rdi), %xmm0
506; SSE2-NEXT:    movaps 16(%rdi), %xmm1
507; SSE2-NEXT:    retq
508;
509; SSE4A-LABEL: test_load_nt8xfloat:
510; SSE4A:       # BB#0: # %entry
511; SSE4A-NEXT:    movaps (%rdi), %xmm0
512; SSE4A-NEXT:    movaps 16(%rdi), %xmm1
513; SSE4A-NEXT:    retq
514;
515; SSE41-LABEL: test_load_nt8xfloat:
516; SSE41:       # BB#0: # %entry
517; SSE41-NEXT:    movntdqa (%rdi), %xmm0
518; SSE41-NEXT:    movntdqa 16(%rdi), %xmm1
519; SSE41-NEXT:    retq
520;
521; AVX1-LABEL: test_load_nt8xfloat:
522; AVX1:       # BB#0: # %entry
523; AVX1-NEXT:    vmovaps (%rdi), %ymm0
524; AVX1-NEXT:    retq
525;
526; AVX2-LABEL: test_load_nt8xfloat:
527; AVX2:       # BB#0: # %entry
528; AVX2-NEXT:    vmovntdqa (%rdi), %ymm0
529; AVX2-NEXT:    retq
530;
531; AVX512-LABEL: test_load_nt8xfloat:
532; AVX512:       # BB#0: # %entry
533; AVX512-NEXT:    vmovntdqa (%rdi), %ymm0
534; AVX512-NEXT:    retq
535entry:
536  %0 = load <8 x float>, <8 x float>* %ptr, align 32, !nontemporal !1
537  ret <8 x float> %0
538}
539
540define <4 x double> @test_load_nt4xdouble(<4 x double>* nocapture %ptr) {
541; SSE2-LABEL: test_load_nt4xdouble:
542; SSE2:       # BB#0: # %entry
543; SSE2-NEXT:    movapd (%rdi), %xmm0
544; SSE2-NEXT:    movapd 16(%rdi), %xmm1
545; SSE2-NEXT:    retq
546;
547; SSE4A-LABEL: test_load_nt4xdouble:
548; SSE4A:       # BB#0: # %entry
549; SSE4A-NEXT:    movapd (%rdi), %xmm0
550; SSE4A-NEXT:    movapd 16(%rdi), %xmm1
551; SSE4A-NEXT:    retq
552;
553; SSE41-LABEL: test_load_nt4xdouble:
554; SSE41:       # BB#0: # %entry
555; SSE41-NEXT:    movntdqa (%rdi), %xmm0
556; SSE41-NEXT:    movntdqa 16(%rdi), %xmm1
557; SSE41-NEXT:    retq
558;
559; AVX1-LABEL: test_load_nt4xdouble:
560; AVX1:       # BB#0: # %entry
561; AVX1-NEXT:    vmovapd (%rdi), %ymm0
562; AVX1-NEXT:    retq
563;
564; AVX2-LABEL: test_load_nt4xdouble:
565; AVX2:       # BB#0: # %entry
566; AVX2-NEXT:    vmovntdqa (%rdi), %ymm0
567; AVX2-NEXT:    retq
568;
569; AVX512-LABEL: test_load_nt4xdouble:
570; AVX512:       # BB#0: # %entry
571; AVX512-NEXT:    vmovntdqa (%rdi), %ymm0
572; AVX512-NEXT:    retq
573entry:
574  %0 = load <4 x double>, <4 x double>* %ptr, align 32, !nontemporal !1
575  ret <4 x double> %0
576}
577
578define <32 x i8> @test_load_nt32xi8(<32 x i8>* nocapture %ptr) {
579; SSE2-LABEL: test_load_nt32xi8:
580; SSE2:       # BB#0: # %entry
581; SSE2-NEXT:    movaps (%rdi), %xmm0
582; SSE2-NEXT:    movaps 16(%rdi), %xmm1
583; SSE2-NEXT:    retq
584;
585; SSE4A-LABEL: test_load_nt32xi8:
586; SSE4A:       # BB#0: # %entry
587; SSE4A-NEXT:    movaps (%rdi), %xmm0
588; SSE4A-NEXT:    movaps 16(%rdi), %xmm1
589; SSE4A-NEXT:    retq
590;
591; SSE41-LABEL: test_load_nt32xi8:
592; SSE41:       # BB#0: # %entry
593; SSE41-NEXT:    movntdqa (%rdi), %xmm0
594; SSE41-NEXT:    movntdqa 16(%rdi), %xmm1
595; SSE41-NEXT:    retq
596;
597; AVX1-LABEL: test_load_nt32xi8:
598; AVX1:       # BB#0: # %entry
599; AVX1-NEXT:    vmovdqa (%rdi), %ymm0
600; AVX1-NEXT:    retq
601;
602; AVX2-LABEL: test_load_nt32xi8:
603; AVX2:       # BB#0: # %entry
604; AVX2-NEXT:    vmovntdqa (%rdi), %ymm0
605; AVX2-NEXT:    retq
606;
607; AVX512-LABEL: test_load_nt32xi8:
608; AVX512:       # BB#0: # %entry
609; AVX512-NEXT:    vmovntdqa (%rdi), %ymm0
610; AVX512-NEXT:    retq
611entry:
612  %0 = load <32 x i8>, <32 x i8>* %ptr, align 32, !nontemporal !1
613  ret <32 x i8> %0
614}
615
616define <16 x i16> @test_load_nt16xi16(<16 x i16>* nocapture %ptr) {
617; SSE2-LABEL: test_load_nt16xi16:
618; SSE2:       # BB#0: # %entry
619; SSE2-NEXT:    movaps (%rdi), %xmm0
620; SSE2-NEXT:    movaps 16(%rdi), %xmm1
621; SSE2-NEXT:    retq
622;
623; SSE4A-LABEL: test_load_nt16xi16:
624; SSE4A:       # BB#0: # %entry
625; SSE4A-NEXT:    movaps (%rdi), %xmm0
626; SSE4A-NEXT:    movaps 16(%rdi), %xmm1
627; SSE4A-NEXT:    retq
628;
629; SSE41-LABEL: test_load_nt16xi16:
630; SSE41:       # BB#0: # %entry
631; SSE41-NEXT:    movntdqa (%rdi), %xmm0
632; SSE41-NEXT:    movntdqa 16(%rdi), %xmm1
633; SSE41-NEXT:    retq
634;
635; AVX1-LABEL: test_load_nt16xi16:
636; AVX1:       # BB#0: # %entry
637; AVX1-NEXT:    vmovdqa (%rdi), %ymm0
638; AVX1-NEXT:    retq
639;
640; AVX2-LABEL: test_load_nt16xi16:
641; AVX2:       # BB#0: # %entry
642; AVX2-NEXT:    vmovntdqa (%rdi), %ymm0
643; AVX2-NEXT:    retq
644;
645; AVX512-LABEL: test_load_nt16xi16:
646; AVX512:       # BB#0: # %entry
647; AVX512-NEXT:    vmovntdqa (%rdi), %ymm0
648; AVX512-NEXT:    retq
649entry:
650  %0 = load <16 x i16>, <16 x i16>* %ptr, align 32, !nontemporal !1
651  ret <16 x i16> %0
652}
653
654define <8 x i32> @test_load_nt8xi32(<8 x i32>* nocapture %ptr) {
655; SSE2-LABEL: test_load_nt8xi32:
656; SSE2:       # BB#0: # %entry
657; SSE2-NEXT:    movaps (%rdi), %xmm0
658; SSE2-NEXT:    movaps 16(%rdi), %xmm1
659; SSE2-NEXT:    retq
660;
661; SSE4A-LABEL: test_load_nt8xi32:
662; SSE4A:       # BB#0: # %entry
663; SSE4A-NEXT:    movaps (%rdi), %xmm0
664; SSE4A-NEXT:    movaps 16(%rdi), %xmm1
665; SSE4A-NEXT:    retq
666;
667; SSE41-LABEL: test_load_nt8xi32:
668; SSE41:       # BB#0: # %entry
669; SSE41-NEXT:    movntdqa (%rdi), %xmm0
670; SSE41-NEXT:    movntdqa 16(%rdi), %xmm1
671; SSE41-NEXT:    retq
672;
673; AVX1-LABEL: test_load_nt8xi32:
674; AVX1:       # BB#0: # %entry
675; AVX1-NEXT:    vmovdqa (%rdi), %ymm0
676; AVX1-NEXT:    retq
677;
678; AVX2-LABEL: test_load_nt8xi32:
679; AVX2:       # BB#0: # %entry
680; AVX2-NEXT:    vmovntdqa (%rdi), %ymm0
681; AVX2-NEXT:    retq
682;
683; AVX512-LABEL: test_load_nt8xi32:
684; AVX512:       # BB#0: # %entry
685; AVX512-NEXT:    vmovntdqa (%rdi), %ymm0
686; AVX512-NEXT:    retq
687entry:
688  %0 = load <8 x i32>, <8 x i32>* %ptr, align 32, !nontemporal !1
689  ret <8 x i32> %0
690}
691
692define <4 x i64> @test_load_nt4xi64(<4 x i64>* nocapture %ptr) {
693; SSE2-LABEL: test_load_nt4xi64:
694; SSE2:       # BB#0: # %entry
695; SSE2-NEXT:    movaps (%rdi), %xmm0
696; SSE2-NEXT:    movaps 16(%rdi), %xmm1
697; SSE2-NEXT:    retq
698;
699; SSE4A-LABEL: test_load_nt4xi64:
700; SSE4A:       # BB#0: # %entry
701; SSE4A-NEXT:    movaps (%rdi), %xmm0
702; SSE4A-NEXT:    movaps 16(%rdi), %xmm1
703; SSE4A-NEXT:    retq
704;
705; SSE41-LABEL: test_load_nt4xi64:
706; SSE41:       # BB#0: # %entry
707; SSE41-NEXT:    movntdqa (%rdi), %xmm0
708; SSE41-NEXT:    movntdqa 16(%rdi), %xmm1
709; SSE41-NEXT:    retq
710;
711; AVX1-LABEL: test_load_nt4xi64:
712; AVX1:       # BB#0: # %entry
713; AVX1-NEXT:    vmovdqa (%rdi), %ymm0
714; AVX1-NEXT:    retq
715;
716; AVX2-LABEL: test_load_nt4xi64:
717; AVX2:       # BB#0: # %entry
718; AVX2-NEXT:    vmovntdqa (%rdi), %ymm0
719; AVX2-NEXT:    retq
720;
721; AVX512-LABEL: test_load_nt4xi64:
722; AVX512:       # BB#0: # %entry
723; AVX512-NEXT:    vmovntdqa (%rdi), %ymm0
724; AVX512-NEXT:    retq
725entry:
726  %0 = load <4 x i64>, <4 x i64>* %ptr, align 32, !nontemporal !1
727  ret <4 x i64> %0
728}
729
730;
731; 512-bit Vector Stores
732;
733
734define void @test_nt16xfloat(<16 x float>* nocapture %ptr, <16 x float> %X) {
735; SSE-LABEL: test_nt16xfloat:
736; SSE:       # BB#0: # %entry
737; SSE-NEXT:    movntps %xmm0, (%rdi)
738; SSE-NEXT:    movntps %xmm1, 16(%rdi)
739; SSE-NEXT:    movntps %xmm2, 32(%rdi)
740; SSE-NEXT:    movntps %xmm3, 48(%rdi)
741; SSE-NEXT:    retq
742;
743; AVX-LABEL: test_nt16xfloat:
744; AVX:       # BB#0: # %entry
745; AVX-NEXT:    vmovntps %ymm0, (%rdi)
746; AVX-NEXT:    vmovntps %ymm1, 32(%rdi)
747; AVX-NEXT:    vzeroupper
748; AVX-NEXT:    retq
749;
750; AVX512-LABEL: test_nt16xfloat:
751; AVX512:       # BB#0: # %entry
752; AVX512-NEXT:    vmovntps %zmm0, (%rdi)
753; AVX512-NEXT:    retq
754entry:
755  store <16 x float> %X, <16 x float>* %ptr, align 64, !nontemporal !1
756  ret void
757}
758
759define void @test_nt8xdouble(<8 x double>* nocapture %ptr, <8 x double> %X) {
760; SSE-LABEL: test_nt8xdouble:
761; SSE:       # BB#0: # %entry
762; SSE-NEXT:    movntpd %xmm0, (%rdi)
763; SSE-NEXT:    movntpd %xmm1, 16(%rdi)
764; SSE-NEXT:    movntpd %xmm2, 32(%rdi)
765; SSE-NEXT:    movntpd %xmm3, 48(%rdi)
766; SSE-NEXT:    retq
767;
768; AVX-LABEL: test_nt8xdouble:
769; AVX:       # BB#0: # %entry
770; AVX-NEXT:    vmovntpd %ymm0, (%rdi)
771; AVX-NEXT:    vmovntpd %ymm1, 32(%rdi)
772; AVX-NEXT:    vzeroupper
773; AVX-NEXT:    retq
774;
775; AVX512-LABEL: test_nt8xdouble:
776; AVX512:       # BB#0: # %entry
777; AVX512-NEXT:    vmovntpd %zmm0, (%rdi)
778; AVX512-NEXT:    retq
779entry:
780  store <8 x double> %X, <8 x double>* %ptr, align 64, !nontemporal !1
781  ret void
782}
783
784define void @test_nt64xi8(<64 x i8>* nocapture %ptr, <64 x i8> %X) {
785; SSE-LABEL: test_nt64xi8:
786; SSE:       # BB#0: # %entry
787; SSE-NEXT:    movntdq %xmm0, (%rdi)
788; SSE-NEXT:    movntdq %xmm1, 16(%rdi)
789; SSE-NEXT:    movntdq %xmm2, 32(%rdi)
790; SSE-NEXT:    movntdq %xmm3, 48(%rdi)
791; SSE-NEXT:    retq
792;
793; AVX-LABEL: test_nt64xi8:
794; AVX:       # BB#0: # %entry
795; AVX-NEXT:    vmovntdq %ymm0, (%rdi)
796; AVX-NEXT:    vmovntdq %ymm1, 32(%rdi)
797; AVX-NEXT:    vzeroupper
798; AVX-NEXT:    retq
799;
800; AVX512F-LABEL: test_nt64xi8:
801; AVX512F:       # BB#0: # %entry
802; AVX512F-NEXT:    vmovntdq %ymm0, (%rdi)
803; AVX512F-NEXT:    vmovntdq %ymm1, 32(%rdi)
804; AVX512F-NEXT:    retq
805;
806; AVX512BW-LABEL: test_nt64xi8:
807; AVX512BW:       # BB#0: # %entry
808; AVX512BW-NEXT:    vmovntdq %zmm0, (%rdi)
809; AVX512BW-NEXT:    retq
810entry:
811  store <64 x i8> %X, <64 x i8>* %ptr, align 64, !nontemporal !1
812  ret void
813}
814
815define void @test_nt32xi16(<32 x i16>* nocapture %ptr, <32 x i16> %X) {
816; SSE-LABEL: test_nt32xi16:
817; SSE:       # BB#0: # %entry
818; SSE-NEXT:    movntdq %xmm0, (%rdi)
819; SSE-NEXT:    movntdq %xmm1, 16(%rdi)
820; SSE-NEXT:    movntdq %xmm2, 32(%rdi)
821; SSE-NEXT:    movntdq %xmm3, 48(%rdi)
822; SSE-NEXT:    retq
823;
824; AVX-LABEL: test_nt32xi16:
825; AVX:       # BB#0: # %entry
826; AVX-NEXT:    vmovntdq %ymm0, (%rdi)
827; AVX-NEXT:    vmovntdq %ymm1, 32(%rdi)
828; AVX-NEXT:    vzeroupper
829; AVX-NEXT:    retq
830;
831; AVX512F-LABEL: test_nt32xi16:
832; AVX512F:       # BB#0: # %entry
833; AVX512F-NEXT:    vmovntdq %ymm0, (%rdi)
834; AVX512F-NEXT:    vmovntdq %ymm1, 32(%rdi)
835; AVX512F-NEXT:    retq
836;
837; AVX512BW-LABEL: test_nt32xi16:
838; AVX512BW:       # BB#0: # %entry
839; AVX512BW-NEXT:    vmovntdq %zmm0, (%rdi)
840; AVX512BW-NEXT:    retq
841entry:
842  store <32 x i16> %X, <32 x i16>* %ptr, align 64, !nontemporal !1
843  ret void
844}
845
846define void @test_nt16xi32(<16 x i32>* nocapture %ptr, <16 x i32> %X) {
847; SSE-LABEL: test_nt16xi32:
848; SSE:       # BB#0: # %entry
849; SSE-NEXT:    movntdq %xmm0, (%rdi)
850; SSE-NEXT:    movntdq %xmm1, 16(%rdi)
851; SSE-NEXT:    movntdq %xmm2, 32(%rdi)
852; SSE-NEXT:    movntdq %xmm3, 48(%rdi)
853; SSE-NEXT:    retq
854;
855; AVX-LABEL: test_nt16xi32:
856; AVX:       # BB#0: # %entry
857; AVX-NEXT:    vmovntdq %ymm0, (%rdi)
858; AVX-NEXT:    vmovntdq %ymm1, 32(%rdi)
859; AVX-NEXT:    vzeroupper
860; AVX-NEXT:    retq
861;
862; AVX512-LABEL: test_nt16xi32:
863; AVX512:       # BB#0: # %entry
864; AVX512-NEXT:    vmovntdq %zmm0, (%rdi)
865; AVX512-NEXT:    retq
866entry:
867  store <16 x i32> %X, <16 x i32>* %ptr, align 64, !nontemporal !1
868  ret void
869}
870
871define void @test_nt8xi64(<8 x i64>* nocapture %ptr, <8 x i64> %X) {
872; SSE-LABEL: test_nt8xi64:
873; SSE:       # BB#0: # %entry
874; SSE-NEXT:    movntdq %xmm0, (%rdi)
875; SSE-NEXT:    movntdq %xmm1, 16(%rdi)
876; SSE-NEXT:    movntdq %xmm2, 32(%rdi)
877; SSE-NEXT:    movntdq %xmm3, 48(%rdi)
878; SSE-NEXT:    retq
879;
880; AVX-LABEL: test_nt8xi64:
881; AVX:       # BB#0: # %entry
882; AVX-NEXT:    vmovntdq %ymm0, (%rdi)
883; AVX-NEXT:    vmovntdq %ymm1, 32(%rdi)
884; AVX-NEXT:    vzeroupper
885; AVX-NEXT:    retq
886;
887; AVX512-LABEL: test_nt8xi64:
888; AVX512:       # BB#0: # %entry
889; AVX512-NEXT:    vmovntdq %zmm0, (%rdi)
890; AVX512-NEXT:    retq
891entry:
892  store <8 x i64> %X, <8 x i64>* %ptr, align 64, !nontemporal !1
893  ret void
894}
895
896;
897; 512-bit Vector Loads
898;
899
900define <16 x float> @test_load_nt16xfloat(<16 x float>* nocapture %ptr) {
901; SSE2-LABEL: test_load_nt16xfloat:
902; SSE2:       # BB#0: # %entry
903; SSE2-NEXT:    movaps (%rdi), %xmm0
904; SSE2-NEXT:    movaps 16(%rdi), %xmm1
905; SSE2-NEXT:    movaps 32(%rdi), %xmm2
906; SSE2-NEXT:    movaps 48(%rdi), %xmm3
907; SSE2-NEXT:    retq
908;
909; SSE4A-LABEL: test_load_nt16xfloat:
910; SSE4A:       # BB#0: # %entry
911; SSE4A-NEXT:    movaps (%rdi), %xmm0
912; SSE4A-NEXT:    movaps 16(%rdi), %xmm1
913; SSE4A-NEXT:    movaps 32(%rdi), %xmm2
914; SSE4A-NEXT:    movaps 48(%rdi), %xmm3
915; SSE4A-NEXT:    retq
916;
917; SSE41-LABEL: test_load_nt16xfloat:
918; SSE41:       # BB#0: # %entry
919; SSE41-NEXT:    movntdqa (%rdi), %xmm0
920; SSE41-NEXT:    movntdqa 16(%rdi), %xmm1
921; SSE41-NEXT:    movntdqa 32(%rdi), %xmm2
922; SSE41-NEXT:    movntdqa 48(%rdi), %xmm3
923; SSE41-NEXT:    retq
924;
925; AVX1-LABEL: test_load_nt16xfloat:
926; AVX1:       # BB#0: # %entry
927; AVX1-NEXT:    vmovaps (%rdi), %ymm0
928; AVX1-NEXT:    vmovaps 32(%rdi), %ymm1
929; AVX1-NEXT:    retq
930;
931; AVX2-LABEL: test_load_nt16xfloat:
932; AVX2:       # BB#0: # %entry
933; AVX2-NEXT:    vmovntdqa (%rdi), %ymm0
934; AVX2-NEXT:    vmovntdqa 32(%rdi), %ymm1
935; AVX2-NEXT:    retq
936;
937; AVX512-LABEL: test_load_nt16xfloat:
938; AVX512:       # BB#0: # %entry
939; AVX512-NEXT:    vmovntdqa (%rdi), %zmm0
940; AVX512-NEXT:    retq
941entry:
942  %0 = load <16 x float>, <16 x float>* %ptr, align 64, !nontemporal !1
943  ret <16 x float> %0
944}
945
946define <8 x double> @test_load_nt8xdouble(<8 x double>* nocapture %ptr) {
947; SSE2-LABEL: test_load_nt8xdouble:
948; SSE2:       # BB#0: # %entry
949; SSE2-NEXT:    movapd (%rdi), %xmm0
950; SSE2-NEXT:    movapd 16(%rdi), %xmm1
951; SSE2-NEXT:    movapd 32(%rdi), %xmm2
952; SSE2-NEXT:    movapd 48(%rdi), %xmm3
953; SSE2-NEXT:    retq
954;
955; SSE4A-LABEL: test_load_nt8xdouble:
956; SSE4A:       # BB#0: # %entry
957; SSE4A-NEXT:    movapd (%rdi), %xmm0
958; SSE4A-NEXT:    movapd 16(%rdi), %xmm1
959; SSE4A-NEXT:    movapd 32(%rdi), %xmm2
960; SSE4A-NEXT:    movapd 48(%rdi), %xmm3
961; SSE4A-NEXT:    retq
962;
963; SSE41-LABEL: test_load_nt8xdouble:
964; SSE41:       # BB#0: # %entry
965; SSE41-NEXT:    movntdqa (%rdi), %xmm0
966; SSE41-NEXT:    movntdqa 16(%rdi), %xmm1
967; SSE41-NEXT:    movntdqa 32(%rdi), %xmm2
968; SSE41-NEXT:    movntdqa 48(%rdi), %xmm3
969; SSE41-NEXT:    retq
970;
971; AVX1-LABEL: test_load_nt8xdouble:
972; AVX1:       # BB#0: # %entry
973; AVX1-NEXT:    vmovapd (%rdi), %ymm0
974; AVX1-NEXT:    vmovapd 32(%rdi), %ymm1
975; AVX1-NEXT:    retq
976;
977; AVX2-LABEL: test_load_nt8xdouble:
978; AVX2:       # BB#0: # %entry
979; AVX2-NEXT:    vmovntdqa (%rdi), %ymm0
980; AVX2-NEXT:    vmovntdqa 32(%rdi), %ymm1
981; AVX2-NEXT:    retq
982;
983; AVX512-LABEL: test_load_nt8xdouble:
984; AVX512:       # BB#0: # %entry
985; AVX512-NEXT:    vmovntdqa (%rdi), %zmm0
986; AVX512-NEXT:    retq
987entry:
988  %0 = load <8 x double>, <8 x double>* %ptr, align 64, !nontemporal !1
989  ret <8 x double> %0
990}
991
992define <64 x i8> @test_load_nt64xi8(<64 x i8>* nocapture %ptr) {
993; SSE2-LABEL: test_load_nt64xi8:
994; SSE2:       # BB#0: # %entry
995; SSE2-NEXT:    movaps (%rdi), %xmm0
996; SSE2-NEXT:    movaps 16(%rdi), %xmm1
997; SSE2-NEXT:    movaps 32(%rdi), %xmm2
998; SSE2-NEXT:    movaps 48(%rdi), %xmm3
999; SSE2-NEXT:    retq
1000;
1001; SSE4A-LABEL: test_load_nt64xi8:
1002; SSE4A:       # BB#0: # %entry
1003; SSE4A-NEXT:    movaps (%rdi), %xmm0
1004; SSE4A-NEXT:    movaps 16(%rdi), %xmm1
1005; SSE4A-NEXT:    movaps 32(%rdi), %xmm2
1006; SSE4A-NEXT:    movaps 48(%rdi), %xmm3
1007; SSE4A-NEXT:    retq
1008;
1009; SSE41-LABEL: test_load_nt64xi8:
1010; SSE41:       # BB#0: # %entry
1011; SSE41-NEXT:    movntdqa (%rdi), %xmm0
1012; SSE41-NEXT:    movntdqa 16(%rdi), %xmm1
1013; SSE41-NEXT:    movntdqa 32(%rdi), %xmm2
1014; SSE41-NEXT:    movntdqa 48(%rdi), %xmm3
1015; SSE41-NEXT:    retq
1016;
1017; AVX1-LABEL: test_load_nt64xi8:
1018; AVX1:       # BB#0: # %entry
1019; AVX1-NEXT:    vmovaps (%rdi), %ymm0
1020; AVX1-NEXT:    vmovaps 32(%rdi), %ymm1
1021; AVX1-NEXT:    retq
1022;
1023; AVX2-LABEL: test_load_nt64xi8:
1024; AVX2:       # BB#0: # %entry
1025; AVX2-NEXT:    vmovntdqa (%rdi), %ymm0
1026; AVX2-NEXT:    vmovntdqa 32(%rdi), %ymm1
1027; AVX2-NEXT:    retq
1028;
1029; AVX512F-LABEL: test_load_nt64xi8:
1030; AVX512F:       # BB#0: # %entry
1031; AVX512F-NEXT:    vmovntdqa (%rdi), %ymm0
1032; AVX512F-NEXT:    vmovntdqa 32(%rdi), %ymm1
1033; AVX512F-NEXT:    retq
1034;
1035; AVX512BW-LABEL: test_load_nt64xi8:
1036; AVX512BW:       # BB#0: # %entry
1037; AVX512BW-NEXT:    vmovntdqa (%rdi), %zmm0
1038; AVX512BW-NEXT:    retq
1039entry:
1040  %0 = load <64 x i8>, <64 x i8>* %ptr, align 64, !nontemporal !1
1041  ret <64 x i8> %0
1042}
1043
1044define <32 x i16> @test_load_nt32xi16(<32 x i16>* nocapture %ptr) {
1045; SSE2-LABEL: test_load_nt32xi16:
1046; SSE2:       # BB#0: # %entry
1047; SSE2-NEXT:    movaps (%rdi), %xmm0
1048; SSE2-NEXT:    movaps 16(%rdi), %xmm1
1049; SSE2-NEXT:    movaps 32(%rdi), %xmm2
1050; SSE2-NEXT:    movaps 48(%rdi), %xmm3
1051; SSE2-NEXT:    retq
1052;
1053; SSE4A-LABEL: test_load_nt32xi16:
1054; SSE4A:       # BB#0: # %entry
1055; SSE4A-NEXT:    movaps (%rdi), %xmm0
1056; SSE4A-NEXT:    movaps 16(%rdi), %xmm1
1057; SSE4A-NEXT:    movaps 32(%rdi), %xmm2
1058; SSE4A-NEXT:    movaps 48(%rdi), %xmm3
1059; SSE4A-NEXT:    retq
1060;
1061; SSE41-LABEL: test_load_nt32xi16:
1062; SSE41:       # BB#0: # %entry
1063; SSE41-NEXT:    movntdqa (%rdi), %xmm0
1064; SSE41-NEXT:    movntdqa 16(%rdi), %xmm1
1065; SSE41-NEXT:    movntdqa 32(%rdi), %xmm2
1066; SSE41-NEXT:    movntdqa 48(%rdi), %xmm3
1067; SSE41-NEXT:    retq
1068;
1069; AVX1-LABEL: test_load_nt32xi16:
1070; AVX1:       # BB#0: # %entry
1071; AVX1-NEXT:    vmovaps (%rdi), %ymm0
1072; AVX1-NEXT:    vmovaps 32(%rdi), %ymm1
1073; AVX1-NEXT:    retq
1074;
1075; AVX2-LABEL: test_load_nt32xi16:
1076; AVX2:       # BB#0: # %entry
1077; AVX2-NEXT:    vmovntdqa (%rdi), %ymm0
1078; AVX2-NEXT:    vmovntdqa 32(%rdi), %ymm1
1079; AVX2-NEXT:    retq
1080;
1081; AVX512F-LABEL: test_load_nt32xi16:
1082; AVX512F:       # BB#0: # %entry
1083; AVX512F-NEXT:    vmovntdqa (%rdi), %ymm0
1084; AVX512F-NEXT:    vmovntdqa 32(%rdi), %ymm1
1085; AVX512F-NEXT:    retq
1086;
1087; AVX512BW-LABEL: test_load_nt32xi16:
1088; AVX512BW:       # BB#0: # %entry
1089; AVX512BW-NEXT:    vmovntdqa (%rdi), %zmm0
1090; AVX512BW-NEXT:    retq
1091entry:
1092  %0 = load <32 x i16>, <32 x i16>* %ptr, align 64, !nontemporal !1
1093  ret <32 x i16> %0
1094}
1095
1096define <16 x i32> @test_load_nt16xi32(<16 x i32>* nocapture %ptr) {
1097; SSE2-LABEL: test_load_nt16xi32:
1098; SSE2:       # BB#0: # %entry
1099; SSE2-NEXT:    movaps (%rdi), %xmm0
1100; SSE2-NEXT:    movaps 16(%rdi), %xmm1
1101; SSE2-NEXT:    movaps 32(%rdi), %xmm2
1102; SSE2-NEXT:    movaps 48(%rdi), %xmm3
1103; SSE2-NEXT:    retq
1104;
1105; SSE4A-LABEL: test_load_nt16xi32:
1106; SSE4A:       # BB#0: # %entry
1107; SSE4A-NEXT:    movaps (%rdi), %xmm0
1108; SSE4A-NEXT:    movaps 16(%rdi), %xmm1
1109; SSE4A-NEXT:    movaps 32(%rdi), %xmm2
1110; SSE4A-NEXT:    movaps 48(%rdi), %xmm3
1111; SSE4A-NEXT:    retq
1112;
1113; SSE41-LABEL: test_load_nt16xi32:
1114; SSE41:       # BB#0: # %entry
1115; SSE41-NEXT:    movntdqa (%rdi), %xmm0
1116; SSE41-NEXT:    movntdqa 16(%rdi), %xmm1
1117; SSE41-NEXT:    movntdqa 32(%rdi), %xmm2
1118; SSE41-NEXT:    movntdqa 48(%rdi), %xmm3
1119; SSE41-NEXT:    retq
1120;
1121; AVX1-LABEL: test_load_nt16xi32:
1122; AVX1:       # BB#0: # %entry
1123; AVX1-NEXT:    vmovaps (%rdi), %ymm0
1124; AVX1-NEXT:    vmovaps 32(%rdi), %ymm1
1125; AVX1-NEXT:    retq
1126;
1127; AVX2-LABEL: test_load_nt16xi32:
1128; AVX2:       # BB#0: # %entry
1129; AVX2-NEXT:    vmovntdqa (%rdi), %ymm0
1130; AVX2-NEXT:    vmovntdqa 32(%rdi), %ymm1
1131; AVX2-NEXT:    retq
1132;
1133; AVX512-LABEL: test_load_nt16xi32:
1134; AVX512:       # BB#0: # %entry
1135; AVX512-NEXT:    vmovntdqa (%rdi), %zmm0
1136; AVX512-NEXT:    retq
1137entry:
1138  %0 = load <16 x i32>, <16 x i32>* %ptr, align 64, !nontemporal !1
1139  ret <16 x i32> %0
1140}
1141
1142define <8 x i64> @test_load_nt8xi64(<8 x i64>* nocapture %ptr) {
1143; SSE2-LABEL: test_load_nt8xi64:
1144; SSE2:       # BB#0: # %entry
1145; SSE2-NEXT:    movaps (%rdi), %xmm0
1146; SSE2-NEXT:    movaps 16(%rdi), %xmm1
1147; SSE2-NEXT:    movaps 32(%rdi), %xmm2
1148; SSE2-NEXT:    movaps 48(%rdi), %xmm3
1149; SSE2-NEXT:    retq
1150;
1151; SSE4A-LABEL: test_load_nt8xi64:
1152; SSE4A:       # BB#0: # %entry
1153; SSE4A-NEXT:    movaps (%rdi), %xmm0
1154; SSE4A-NEXT:    movaps 16(%rdi), %xmm1
1155; SSE4A-NEXT:    movaps 32(%rdi), %xmm2
1156; SSE4A-NEXT:    movaps 48(%rdi), %xmm3
1157; SSE4A-NEXT:    retq
1158;
1159; SSE41-LABEL: test_load_nt8xi64:
1160; SSE41:       # BB#0: # %entry
1161; SSE41-NEXT:    movntdqa (%rdi), %xmm0
1162; SSE41-NEXT:    movntdqa 16(%rdi), %xmm1
1163; SSE41-NEXT:    movntdqa 32(%rdi), %xmm2
1164; SSE41-NEXT:    movntdqa 48(%rdi), %xmm3
1165; SSE41-NEXT:    retq
1166;
1167; AVX1-LABEL: test_load_nt8xi64:
1168; AVX1:       # BB#0: # %entry
1169; AVX1-NEXT:    vmovaps (%rdi), %ymm0
1170; AVX1-NEXT:    vmovaps 32(%rdi), %ymm1
1171; AVX1-NEXT:    retq
1172;
1173; AVX2-LABEL: test_load_nt8xi64:
1174; AVX2:       # BB#0: # %entry
1175; AVX2-NEXT:    vmovntdqa (%rdi), %ymm0
1176; AVX2-NEXT:    vmovntdqa 32(%rdi), %ymm1
1177; AVX2-NEXT:    retq
1178;
1179; AVX512-LABEL: test_load_nt8xi64:
1180; AVX512:       # BB#0: # %entry
1181; AVX512-NEXT:    vmovntdqa (%rdi), %zmm0
1182; AVX512-NEXT:    retq
1183entry:
1184  %0 = load <8 x i64>, <8 x i64>* %ptr, align 64, !nontemporal !1
1185  ret <8 x i64> %0
1186}
1187
1188!1 = !{i32 1}
1189