• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=SSE --check-prefix=SSE2
3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=SSE --check-prefix=SSE41
4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX1
5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX --check-prefix=AVX2
6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=AVX512 --check-prefix=AVX512F
7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw | FileCheck %s --check-prefix=AVX512 --check-prefix=AVX512BW
8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl | FileCheck %s --check-prefix=AVX512 --check-prefix=AVX512VL
9
10define <4 x float> @test_v4f32(<4 x float>* %src) {
11; SSE2-LABEL: test_v4f32:
12; SSE2:       # %bb.0:
13; SSE2-NEXT:    movaps (%rdi), %xmm0
14; SSE2-NEXT:    retq
15;
16; SSE41-LABEL: test_v4f32:
17; SSE41:       # %bb.0:
18; SSE41-NEXT:    movntdqa (%rdi), %xmm0
19; SSE41-NEXT:    retq
20;
21; AVX-LABEL: test_v4f32:
22; AVX:       # %bb.0:
23; AVX-NEXT:    vmovntdqa (%rdi), %xmm0
24; AVX-NEXT:    retq
25;
26; AVX512-LABEL: test_v4f32:
27; AVX512:       # %bb.0:
28; AVX512-NEXT:    vmovntdqa (%rdi), %xmm0
29; AVX512-NEXT:    retq
30  %1 = load <4 x float>, <4 x float>* %src, align 16, !nontemporal !1
31  ret <4 x float> %1
32}
33
34define <4 x i32> @test_v4i32(<4 x i32>* %src) {
35; SSE2-LABEL: test_v4i32:
36; SSE2:       # %bb.0:
37; SSE2-NEXT:    movaps (%rdi), %xmm0
38; SSE2-NEXT:    retq
39;
40; SSE41-LABEL: test_v4i32:
41; SSE41:       # %bb.0:
42; SSE41-NEXT:    movntdqa (%rdi), %xmm0
43; SSE41-NEXT:    retq
44;
45; AVX-LABEL: test_v4i32:
46; AVX:       # %bb.0:
47; AVX-NEXT:    vmovntdqa (%rdi), %xmm0
48; AVX-NEXT:    retq
49;
50; AVX512-LABEL: test_v4i32:
51; AVX512:       # %bb.0:
52; AVX512-NEXT:    vmovntdqa (%rdi), %xmm0
53; AVX512-NEXT:    retq
54  %1 = load <4 x i32>, <4 x i32>* %src, align 16, !nontemporal !1
55  ret <4 x i32> %1
56}
57
58define <2 x double> @test_v2f64(<2 x double>* %src) {
59; SSE2-LABEL: test_v2f64:
60; SSE2:       # %bb.0:
61; SSE2-NEXT:    movaps (%rdi), %xmm0
62; SSE2-NEXT:    retq
63;
64; SSE41-LABEL: test_v2f64:
65; SSE41:       # %bb.0:
66; SSE41-NEXT:    movntdqa (%rdi), %xmm0
67; SSE41-NEXT:    retq
68;
69; AVX-LABEL: test_v2f64:
70; AVX:       # %bb.0:
71; AVX-NEXT:    vmovntdqa (%rdi), %xmm0
72; AVX-NEXT:    retq
73;
74; AVX512-LABEL: test_v2f64:
75; AVX512:       # %bb.0:
76; AVX512-NEXT:    vmovntdqa (%rdi), %xmm0
77; AVX512-NEXT:    retq
78  %1 = load <2 x double>, <2 x double>* %src, align 16, !nontemporal !1
79  ret <2 x double> %1
80}
81
82define <2 x i64> @test_v2i64(<2 x i64>* %src) {
83; SSE2-LABEL: test_v2i64:
84; SSE2:       # %bb.0:
85; SSE2-NEXT:    movaps (%rdi), %xmm0
86; SSE2-NEXT:    retq
87;
88; SSE41-LABEL: test_v2i64:
89; SSE41:       # %bb.0:
90; SSE41-NEXT:    movntdqa (%rdi), %xmm0
91; SSE41-NEXT:    retq
92;
93; AVX-LABEL: test_v2i64:
94; AVX:       # %bb.0:
95; AVX-NEXT:    vmovntdqa (%rdi), %xmm0
96; AVX-NEXT:    retq
97;
98; AVX512-LABEL: test_v2i64:
99; AVX512:       # %bb.0:
100; AVX512-NEXT:    vmovntdqa (%rdi), %xmm0
101; AVX512-NEXT:    retq
102  %1 = load <2 x i64>, <2 x i64>* %src, align 16, !nontemporal !1
103  ret <2 x i64> %1
104}
105
106define <8 x i16> @test_v8i16(<8 x i16>* %src) {
107; SSE2-LABEL: test_v8i16:
108; SSE2:       # %bb.0:
109; SSE2-NEXT:    movaps (%rdi), %xmm0
110; SSE2-NEXT:    retq
111;
112; SSE41-LABEL: test_v8i16:
113; SSE41:       # %bb.0:
114; SSE41-NEXT:    movntdqa (%rdi), %xmm0
115; SSE41-NEXT:    retq
116;
117; AVX-LABEL: test_v8i16:
118; AVX:       # %bb.0:
119; AVX-NEXT:    vmovntdqa (%rdi), %xmm0
120; AVX-NEXT:    retq
121;
122; AVX512-LABEL: test_v8i16:
123; AVX512:       # %bb.0:
124; AVX512-NEXT:    vmovntdqa (%rdi), %xmm0
125; AVX512-NEXT:    retq
126  %1 = load <8 x i16>, <8 x i16>* %src, align 16, !nontemporal !1
127  ret <8 x i16> %1
128}
129
130define <16 x i8> @test_v16i8(<16 x i8>* %src) {
131; SSE2-LABEL: test_v16i8:
132; SSE2:       # %bb.0:
133; SSE2-NEXT:    movaps (%rdi), %xmm0
134; SSE2-NEXT:    retq
135;
136; SSE41-LABEL: test_v16i8:
137; SSE41:       # %bb.0:
138; SSE41-NEXT:    movntdqa (%rdi), %xmm0
139; SSE41-NEXT:    retq
140;
141; AVX-LABEL: test_v16i8:
142; AVX:       # %bb.0:
143; AVX-NEXT:    vmovntdqa (%rdi), %xmm0
144; AVX-NEXT:    retq
145;
146; AVX512-LABEL: test_v16i8:
147; AVX512:       # %bb.0:
148; AVX512-NEXT:    vmovntdqa (%rdi), %xmm0
149; AVX512-NEXT:    retq
150  %1 = load <16 x i8>, <16 x i8>* %src, align 16, !nontemporal !1
151  ret <16 x i8> %1
152}
153
154; And now YMM versions.
155
156define <8 x float> @test_v8f32(<8 x float>* %src) {
157; SSE2-LABEL: test_v8f32:
158; SSE2:       # %bb.0:
159; SSE2-NEXT:    movaps (%rdi), %xmm0
160; SSE2-NEXT:    movaps 16(%rdi), %xmm1
161; SSE2-NEXT:    retq
162;
163; SSE41-LABEL: test_v8f32:
164; SSE41:       # %bb.0:
165; SSE41-NEXT:    movntdqa (%rdi), %xmm0
166; SSE41-NEXT:    movntdqa 16(%rdi), %xmm1
167; SSE41-NEXT:    retq
168;
169; AVX1-LABEL: test_v8f32:
170; AVX1:       # %bb.0:
171; AVX1-NEXT:    vmovntdqa (%rdi), %xmm0
172; AVX1-NEXT:    vmovntdqa 16(%rdi), %xmm1
173; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
174; AVX1-NEXT:    retq
175;
176; AVX2-LABEL: test_v8f32:
177; AVX2:       # %bb.0:
178; AVX2-NEXT:    vmovntdqa (%rdi), %ymm0
179; AVX2-NEXT:    retq
180;
181; AVX512-LABEL: test_v8f32:
182; AVX512:       # %bb.0:
183; AVX512-NEXT:    vmovntdqa (%rdi), %ymm0
184; AVX512-NEXT:    retq
185  %1 = load <8 x float>, <8 x float>* %src, align 32, !nontemporal !1
186  ret <8 x float> %1
187}
188
189define <8 x i32> @test_v8i32(<8 x i32>* %src) {
190; SSE2-LABEL: test_v8i32:
191; SSE2:       # %bb.0:
192; SSE2-NEXT:    movaps (%rdi), %xmm0
193; SSE2-NEXT:    movaps 16(%rdi), %xmm1
194; SSE2-NEXT:    retq
195;
196; SSE41-LABEL: test_v8i32:
197; SSE41:       # %bb.0:
198; SSE41-NEXT:    movntdqa (%rdi), %xmm0
199; SSE41-NEXT:    movntdqa 16(%rdi), %xmm1
200; SSE41-NEXT:    retq
201;
202; AVX1-LABEL: test_v8i32:
203; AVX1:       # %bb.0:
204; AVX1-NEXT:    vmovntdqa (%rdi), %xmm0
205; AVX1-NEXT:    vmovntdqa 16(%rdi), %xmm1
206; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
207; AVX1-NEXT:    retq
208;
209; AVX2-LABEL: test_v8i32:
210; AVX2:       # %bb.0:
211; AVX2-NEXT:    vmovntdqa (%rdi), %ymm0
212; AVX2-NEXT:    retq
213;
214; AVX512-LABEL: test_v8i32:
215; AVX512:       # %bb.0:
216; AVX512-NEXT:    vmovntdqa (%rdi), %ymm0
217; AVX512-NEXT:    retq
218  %1 = load <8 x i32>, <8 x i32>* %src, align 32, !nontemporal !1
219  ret <8 x i32> %1
220}
221
222define <4 x double> @test_v4f64(<4 x double>* %src) {
223; SSE2-LABEL: test_v4f64:
224; SSE2:       # %bb.0:
225; SSE2-NEXT:    movaps (%rdi), %xmm0
226; SSE2-NEXT:    movaps 16(%rdi), %xmm1
227; SSE2-NEXT:    retq
228;
229; SSE41-LABEL: test_v4f64:
230; SSE41:       # %bb.0:
231; SSE41-NEXT:    movntdqa (%rdi), %xmm0
232; SSE41-NEXT:    movntdqa 16(%rdi), %xmm1
233; SSE41-NEXT:    retq
234;
235; AVX1-LABEL: test_v4f64:
236; AVX1:       # %bb.0:
237; AVX1-NEXT:    vmovntdqa (%rdi), %xmm0
238; AVX1-NEXT:    vmovntdqa 16(%rdi), %xmm1
239; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
240; AVX1-NEXT:    retq
241;
242; AVX2-LABEL: test_v4f64:
243; AVX2:       # %bb.0:
244; AVX2-NEXT:    vmovntdqa (%rdi), %ymm0
245; AVX2-NEXT:    retq
246;
247; AVX512-LABEL: test_v4f64:
248; AVX512:       # %bb.0:
249; AVX512-NEXT:    vmovntdqa (%rdi), %ymm0
250; AVX512-NEXT:    retq
251  %1 = load <4 x double>, <4 x double>* %src, align 32, !nontemporal !1
252  ret <4 x double> %1
253}
254
255define <4 x i64> @test_v4i64(<4 x i64>* %src) {
256; SSE2-LABEL: test_v4i64:
257; SSE2:       # %bb.0:
258; SSE2-NEXT:    movaps (%rdi), %xmm0
259; SSE2-NEXT:    movaps 16(%rdi), %xmm1
260; SSE2-NEXT:    retq
261;
262; SSE41-LABEL: test_v4i64:
263; SSE41:       # %bb.0:
264; SSE41-NEXT:    movntdqa (%rdi), %xmm0
265; SSE41-NEXT:    movntdqa 16(%rdi), %xmm1
266; SSE41-NEXT:    retq
267;
268; AVX1-LABEL: test_v4i64:
269; AVX1:       # %bb.0:
270; AVX1-NEXT:    vmovntdqa (%rdi), %xmm0
271; AVX1-NEXT:    vmovntdqa 16(%rdi), %xmm1
272; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
273; AVX1-NEXT:    retq
274;
275; AVX2-LABEL: test_v4i64:
276; AVX2:       # %bb.0:
277; AVX2-NEXT:    vmovntdqa (%rdi), %ymm0
278; AVX2-NEXT:    retq
279;
280; AVX512-LABEL: test_v4i64:
281; AVX512:       # %bb.0:
282; AVX512-NEXT:    vmovntdqa (%rdi), %ymm0
283; AVX512-NEXT:    retq
284  %1 = load <4 x i64>, <4 x i64>* %src, align 32, !nontemporal !1
285  ret <4 x i64> %1
286}
287
288define <16 x i16> @test_v16i16(<16 x i16>* %src) {
289; SSE2-LABEL: test_v16i16:
290; SSE2:       # %bb.0:
291; SSE2-NEXT:    movaps (%rdi), %xmm0
292; SSE2-NEXT:    movaps 16(%rdi), %xmm1
293; SSE2-NEXT:    retq
294;
295; SSE41-LABEL: test_v16i16:
296; SSE41:       # %bb.0:
297; SSE41-NEXT:    movntdqa (%rdi), %xmm0
298; SSE41-NEXT:    movntdqa 16(%rdi), %xmm1
299; SSE41-NEXT:    retq
300;
301; AVX1-LABEL: test_v16i16:
302; AVX1:       # %bb.0:
303; AVX1-NEXT:    vmovntdqa (%rdi), %xmm0
304; AVX1-NEXT:    vmovntdqa 16(%rdi), %xmm1
305; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
306; AVX1-NEXT:    retq
307;
308; AVX2-LABEL: test_v16i16:
309; AVX2:       # %bb.0:
310; AVX2-NEXT:    vmovntdqa (%rdi), %ymm0
311; AVX2-NEXT:    retq
312;
313; AVX512-LABEL: test_v16i16:
314; AVX512:       # %bb.0:
315; AVX512-NEXT:    vmovntdqa (%rdi), %ymm0
316; AVX512-NEXT:    retq
317  %1 = load <16 x i16>, <16 x i16>* %src, align 32, !nontemporal !1
318  ret <16 x i16> %1
319}
320
321define <32 x i8> @test_v32i8(<32 x i8>* %src) {
322; SSE2-LABEL: test_v32i8:
323; SSE2:       # %bb.0:
324; SSE2-NEXT:    movaps (%rdi), %xmm0
325; SSE2-NEXT:    movaps 16(%rdi), %xmm1
326; SSE2-NEXT:    retq
327;
328; SSE41-LABEL: test_v32i8:
329; SSE41:       # %bb.0:
330; SSE41-NEXT:    movntdqa (%rdi), %xmm0
331; SSE41-NEXT:    movntdqa 16(%rdi), %xmm1
332; SSE41-NEXT:    retq
333;
334; AVX1-LABEL: test_v32i8:
335; AVX1:       # %bb.0:
336; AVX1-NEXT:    vmovntdqa (%rdi), %xmm0
337; AVX1-NEXT:    vmovntdqa 16(%rdi), %xmm1
338; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
339; AVX1-NEXT:    retq
340;
341; AVX2-LABEL: test_v32i8:
342; AVX2:       # %bb.0:
343; AVX2-NEXT:    vmovntdqa (%rdi), %ymm0
344; AVX2-NEXT:    retq
345;
346; AVX512-LABEL: test_v32i8:
347; AVX512:       # %bb.0:
348; AVX512-NEXT:    vmovntdqa (%rdi), %ymm0
349; AVX512-NEXT:    retq
350  %1 = load <32 x i8>, <32 x i8>* %src, align 32, !nontemporal !1
351  ret <32 x i8> %1
352}
353
354; And now ZMM versions.
355
356define <16 x float> @test_v16f32(<16 x float>* %src) {
357; SSE2-LABEL: test_v16f32:
358; SSE2:       # %bb.0:
359; SSE2-NEXT:    movaps (%rdi), %xmm0
360; SSE2-NEXT:    movaps 16(%rdi), %xmm1
361; SSE2-NEXT:    movaps 32(%rdi), %xmm2
362; SSE2-NEXT:    movaps 48(%rdi), %xmm3
363; SSE2-NEXT:    retq
364;
365; SSE41-LABEL: test_v16f32:
366; SSE41:       # %bb.0:
367; SSE41-NEXT:    movntdqa (%rdi), %xmm0
368; SSE41-NEXT:    movntdqa 16(%rdi), %xmm1
369; SSE41-NEXT:    movntdqa 32(%rdi), %xmm2
370; SSE41-NEXT:    movntdqa 48(%rdi), %xmm3
371; SSE41-NEXT:    retq
372;
373; AVX1-LABEL: test_v16f32:
374; AVX1:       # %bb.0:
375; AVX1-NEXT:    vmovntdqa (%rdi), %xmm0
376; AVX1-NEXT:    vmovntdqa 16(%rdi), %xmm1
377; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
378; AVX1-NEXT:    vmovntdqa 32(%rdi), %xmm1
379; AVX1-NEXT:    vmovntdqa 48(%rdi), %xmm2
380; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
381; AVX1-NEXT:    retq
382;
383; AVX2-LABEL: test_v16f32:
384; AVX2:       # %bb.0:
385; AVX2-NEXT:    vmovntdqa (%rdi), %ymm0
386; AVX2-NEXT:    vmovntdqa 32(%rdi), %ymm1
387; AVX2-NEXT:    retq
388;
389; AVX512-LABEL: test_v16f32:
390; AVX512:       # %bb.0:
391; AVX512-NEXT:    vmovntdqa (%rdi), %zmm0
392; AVX512-NEXT:    retq
393  %1 = load <16 x float>, <16 x float>* %src, align 64, !nontemporal !1
394  ret <16 x float> %1
395}
396
397define <16 x i32> @test_v16i32(<16 x i32>* %src) {
398; SSE2-LABEL: test_v16i32:
399; SSE2:       # %bb.0:
400; SSE2-NEXT:    movaps (%rdi), %xmm0
401; SSE2-NEXT:    movaps 16(%rdi), %xmm1
402; SSE2-NEXT:    movaps 32(%rdi), %xmm2
403; SSE2-NEXT:    movaps 48(%rdi), %xmm3
404; SSE2-NEXT:    retq
405;
406; SSE41-LABEL: test_v16i32:
407; SSE41:       # %bb.0:
408; SSE41-NEXT:    movntdqa (%rdi), %xmm0
409; SSE41-NEXT:    movntdqa 16(%rdi), %xmm1
410; SSE41-NEXT:    movntdqa 32(%rdi), %xmm2
411; SSE41-NEXT:    movntdqa 48(%rdi), %xmm3
412; SSE41-NEXT:    retq
413;
414; AVX1-LABEL: test_v16i32:
415; AVX1:       # %bb.0:
416; AVX1-NEXT:    vmovntdqa (%rdi), %xmm0
417; AVX1-NEXT:    vmovntdqa 16(%rdi), %xmm1
418; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
419; AVX1-NEXT:    vmovntdqa 32(%rdi), %xmm1
420; AVX1-NEXT:    vmovntdqa 48(%rdi), %xmm2
421; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
422; AVX1-NEXT:    retq
423;
424; AVX2-LABEL: test_v16i32:
425; AVX2:       # %bb.0:
426; AVX2-NEXT:    vmovntdqa (%rdi), %ymm0
427; AVX2-NEXT:    vmovntdqa 32(%rdi), %ymm1
428; AVX2-NEXT:    retq
429;
430; AVX512-LABEL: test_v16i32:
431; AVX512:       # %bb.0:
432; AVX512-NEXT:    vmovntdqa (%rdi), %zmm0
433; AVX512-NEXT:    retq
434  %1 = load <16 x i32>, <16 x i32>* %src, align 64, !nontemporal !1
435  ret <16 x i32> %1
436}
437
438define <8 x double> @test_v8f64(<8 x double>* %src) {
439; SSE2-LABEL: test_v8f64:
440; SSE2:       # %bb.0:
441; SSE2-NEXT:    movaps (%rdi), %xmm0
442; SSE2-NEXT:    movaps 16(%rdi), %xmm1
443; SSE2-NEXT:    movaps 32(%rdi), %xmm2
444; SSE2-NEXT:    movaps 48(%rdi), %xmm3
445; SSE2-NEXT:    retq
446;
447; SSE41-LABEL: test_v8f64:
448; SSE41:       # %bb.0:
449; SSE41-NEXT:    movntdqa (%rdi), %xmm0
450; SSE41-NEXT:    movntdqa 16(%rdi), %xmm1
451; SSE41-NEXT:    movntdqa 32(%rdi), %xmm2
452; SSE41-NEXT:    movntdqa 48(%rdi), %xmm3
453; SSE41-NEXT:    retq
454;
455; AVX1-LABEL: test_v8f64:
456; AVX1:       # %bb.0:
457; AVX1-NEXT:    vmovntdqa (%rdi), %xmm0
458; AVX1-NEXT:    vmovntdqa 16(%rdi), %xmm1
459; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
460; AVX1-NEXT:    vmovntdqa 32(%rdi), %xmm1
461; AVX1-NEXT:    vmovntdqa 48(%rdi), %xmm2
462; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
463; AVX1-NEXT:    retq
464;
465; AVX2-LABEL: test_v8f64:
466; AVX2:       # %bb.0:
467; AVX2-NEXT:    vmovntdqa (%rdi), %ymm0
468; AVX2-NEXT:    vmovntdqa 32(%rdi), %ymm1
469; AVX2-NEXT:    retq
470;
471; AVX512-LABEL: test_v8f64:
472; AVX512:       # %bb.0:
473; AVX512-NEXT:    vmovntdqa (%rdi), %zmm0
474; AVX512-NEXT:    retq
475  %1 = load <8 x double>, <8 x double>* %src, align 64, !nontemporal !1
476  ret <8 x double> %1
477}
478
479define <8 x i64> @test_v8i64(<8 x i64>* %src) {
480; SSE2-LABEL: test_v8i64:
481; SSE2:       # %bb.0:
482; SSE2-NEXT:    movaps (%rdi), %xmm0
483; SSE2-NEXT:    movaps 16(%rdi), %xmm1
484; SSE2-NEXT:    movaps 32(%rdi), %xmm2
485; SSE2-NEXT:    movaps 48(%rdi), %xmm3
486; SSE2-NEXT:    retq
487;
488; SSE41-LABEL: test_v8i64:
489; SSE41:       # %bb.0:
490; SSE41-NEXT:    movntdqa (%rdi), %xmm0
491; SSE41-NEXT:    movntdqa 16(%rdi), %xmm1
492; SSE41-NEXT:    movntdqa 32(%rdi), %xmm2
493; SSE41-NEXT:    movntdqa 48(%rdi), %xmm3
494; SSE41-NEXT:    retq
495;
496; AVX1-LABEL: test_v8i64:
497; AVX1:       # %bb.0:
498; AVX1-NEXT:    vmovntdqa (%rdi), %xmm0
499; AVX1-NEXT:    vmovntdqa 16(%rdi), %xmm1
500; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
501; AVX1-NEXT:    vmovntdqa 32(%rdi), %xmm1
502; AVX1-NEXT:    vmovntdqa 48(%rdi), %xmm2
503; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
504; AVX1-NEXT:    retq
505;
506; AVX2-LABEL: test_v8i64:
507; AVX2:       # %bb.0:
508; AVX2-NEXT:    vmovntdqa (%rdi), %ymm0
509; AVX2-NEXT:    vmovntdqa 32(%rdi), %ymm1
510; AVX2-NEXT:    retq
511;
512; AVX512-LABEL: test_v8i64:
513; AVX512:       # %bb.0:
514; AVX512-NEXT:    vmovntdqa (%rdi), %zmm0
515; AVX512-NEXT:    retq
516  %1 = load <8 x i64>, <8 x i64>* %src, align 64, !nontemporal !1
517  ret <8 x i64> %1
518}
519
520define <32 x i16> @test_v32i16(<32 x i16>* %src) {
521; SSE2-LABEL: test_v32i16:
522; SSE2:       # %bb.0:
523; SSE2-NEXT:    movaps (%rdi), %xmm0
524; SSE2-NEXT:    movaps 16(%rdi), %xmm1
525; SSE2-NEXT:    movaps 32(%rdi), %xmm2
526; SSE2-NEXT:    movaps 48(%rdi), %xmm3
527; SSE2-NEXT:    retq
528;
529; SSE41-LABEL: test_v32i16:
530; SSE41:       # %bb.0:
531; SSE41-NEXT:    movntdqa (%rdi), %xmm0
532; SSE41-NEXT:    movntdqa 16(%rdi), %xmm1
533; SSE41-NEXT:    movntdqa 32(%rdi), %xmm2
534; SSE41-NEXT:    movntdqa 48(%rdi), %xmm3
535; SSE41-NEXT:    retq
536;
537; AVX1-LABEL: test_v32i16:
538; AVX1:       # %bb.0:
539; AVX1-NEXT:    vmovntdqa (%rdi), %xmm0
540; AVX1-NEXT:    vmovntdqa 16(%rdi), %xmm1
541; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
542; AVX1-NEXT:    vmovntdqa 32(%rdi), %xmm1
543; AVX1-NEXT:    vmovntdqa 48(%rdi), %xmm2
544; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
545; AVX1-NEXT:    retq
546;
547; AVX2-LABEL: test_v32i16:
548; AVX2:       # %bb.0:
549; AVX2-NEXT:    vmovntdqa (%rdi), %ymm0
550; AVX2-NEXT:    vmovntdqa 32(%rdi), %ymm1
551; AVX2-NEXT:    retq
552;
553; AVX512F-LABEL: test_v32i16:
554; AVX512F:       # %bb.0:
555; AVX512F-NEXT:    vmovntdqa (%rdi), %ymm0
556; AVX512F-NEXT:    vmovntdqa 32(%rdi), %ymm1
557; AVX512F-NEXT:    retq
558;
559; AVX512BW-LABEL: test_v32i16:
560; AVX512BW:       # %bb.0:
561; AVX512BW-NEXT:    vmovntdqa (%rdi), %zmm0
562; AVX512BW-NEXT:    retq
563;
564; AVX512VL-LABEL: test_v32i16:
565; AVX512VL:       # %bb.0:
566; AVX512VL-NEXT:    vmovntdqa (%rdi), %ymm0
567; AVX512VL-NEXT:    vmovntdqa 32(%rdi), %ymm1
568; AVX512VL-NEXT:    retq
569  %1 = load <32 x i16>, <32 x i16>* %src, align 64, !nontemporal !1
570  ret <32 x i16> %1
571}
572
573define <64 x i8> @test_v64i8(<64 x i8>* %src) {
574; SSE2-LABEL: test_v64i8:
575; SSE2:       # %bb.0:
576; SSE2-NEXT:    movaps (%rdi), %xmm0
577; SSE2-NEXT:    movaps 16(%rdi), %xmm1
578; SSE2-NEXT:    movaps 32(%rdi), %xmm2
579; SSE2-NEXT:    movaps 48(%rdi), %xmm3
580; SSE2-NEXT:    retq
581;
582; SSE41-LABEL: test_v64i8:
583; SSE41:       # %bb.0:
584; SSE41-NEXT:    movntdqa (%rdi), %xmm0
585; SSE41-NEXT:    movntdqa 16(%rdi), %xmm1
586; SSE41-NEXT:    movntdqa 32(%rdi), %xmm2
587; SSE41-NEXT:    movntdqa 48(%rdi), %xmm3
588; SSE41-NEXT:    retq
589;
590; AVX1-LABEL: test_v64i8:
591; AVX1:       # %bb.0:
592; AVX1-NEXT:    vmovntdqa (%rdi), %xmm0
593; AVX1-NEXT:    vmovntdqa 16(%rdi), %xmm1
594; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
595; AVX1-NEXT:    vmovntdqa 32(%rdi), %xmm1
596; AVX1-NEXT:    vmovntdqa 48(%rdi), %xmm2
597; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
598; AVX1-NEXT:    retq
599;
600; AVX2-LABEL: test_v64i8:
601; AVX2:       # %bb.0:
602; AVX2-NEXT:    vmovntdqa (%rdi), %ymm0
603; AVX2-NEXT:    vmovntdqa 32(%rdi), %ymm1
604; AVX2-NEXT:    retq
605;
606; AVX512F-LABEL: test_v64i8:
607; AVX512F:       # %bb.0:
608; AVX512F-NEXT:    vmovntdqa (%rdi), %ymm0
609; AVX512F-NEXT:    vmovntdqa 32(%rdi), %ymm1
610; AVX512F-NEXT:    retq
611;
612; AVX512BW-LABEL: test_v64i8:
613; AVX512BW:       # %bb.0:
614; AVX512BW-NEXT:    vmovntdqa (%rdi), %zmm0
615; AVX512BW-NEXT:    retq
616;
617; AVX512VL-LABEL: test_v64i8:
618; AVX512VL:       # %bb.0:
619; AVX512VL-NEXT:    vmovntdqa (%rdi), %ymm0
620; AVX512VL-NEXT:    vmovntdqa 32(%rdi), %ymm1
621; AVX512VL-NEXT:    retq
622  %1 = load <64 x i8>, <64 x i8>* %src, align 64, !nontemporal !1
623  ret <64 x i8> %1
624}
625
626
627; Check cases where the load would be folded.
628
629define <4 x float> @test_arg_v4f32(<4 x float> %arg, <4 x float>* %src) {
630; SSE2-LABEL: test_arg_v4f32:
631; SSE2:       # %bb.0:
632; SSE2-NEXT:    addps (%rdi), %xmm0
633; SSE2-NEXT:    retq
634;
635; SSE41-LABEL: test_arg_v4f32:
636; SSE41:       # %bb.0:
637; SSE41-NEXT:    movntdqa (%rdi), %xmm1
638; SSE41-NEXT:    addps %xmm1, %xmm0
639; SSE41-NEXT:    retq
640;
641; AVX-LABEL: test_arg_v4f32:
642; AVX:       # %bb.0:
643; AVX-NEXT:    vmovntdqa (%rdi), %xmm1
644; AVX-NEXT:    vaddps %xmm1, %xmm0, %xmm0
645; AVX-NEXT:    retq
646;
647; AVX512-LABEL: test_arg_v4f32:
648; AVX512:       # %bb.0:
649; AVX512-NEXT:    vmovntdqa (%rdi), %xmm1
650; AVX512-NEXT:    vaddps %xmm1, %xmm0, %xmm0
651; AVX512-NEXT:    retq
652  %1 = load <4 x float>, <4 x float>* %src, align 16, !nontemporal !1
653  %2 = fadd <4 x float> %arg, %1
654  ret <4 x float> %2
655}
656
657define <4 x i32> @test_arg_v4i32(<4 x i32> %arg, <4 x i32>* %src) {
658; SSE2-LABEL: test_arg_v4i32:
659; SSE2:       # %bb.0:
660; SSE2-NEXT:    paddd (%rdi), %xmm0
661; SSE2-NEXT:    retq
662;
663; SSE41-LABEL: test_arg_v4i32:
664; SSE41:       # %bb.0:
665; SSE41-NEXT:    movntdqa (%rdi), %xmm1
666; SSE41-NEXT:    paddd %xmm1, %xmm0
667; SSE41-NEXT:    retq
668;
669; AVX-LABEL: test_arg_v4i32:
670; AVX:       # %bb.0:
671; AVX-NEXT:    vmovntdqa (%rdi), %xmm1
672; AVX-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
673; AVX-NEXT:    retq
674;
675; AVX512-LABEL: test_arg_v4i32:
676; AVX512:       # %bb.0:
677; AVX512-NEXT:    vmovntdqa (%rdi), %xmm1
678; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
679; AVX512-NEXT:    retq
680  %1 = load <4 x i32>, <4 x i32>* %src, align 16, !nontemporal !1
681  %2 = add <4 x i32> %arg, %1
682  ret <4 x i32> %2
683}
684
685define <2 x double> @test_arg_v2f64(<2 x double> %arg, <2 x double>* %src) {
686; SSE2-LABEL: test_arg_v2f64:
687; SSE2:       # %bb.0:
688; SSE2-NEXT:    addpd (%rdi), %xmm0
689; SSE2-NEXT:    retq
690;
691; SSE41-LABEL: test_arg_v2f64:
692; SSE41:       # %bb.0:
693; SSE41-NEXT:    movntdqa (%rdi), %xmm1
694; SSE41-NEXT:    addpd %xmm1, %xmm0
695; SSE41-NEXT:    retq
696;
697; AVX-LABEL: test_arg_v2f64:
698; AVX:       # %bb.0:
699; AVX-NEXT:    vmovntdqa (%rdi), %xmm1
700; AVX-NEXT:    vaddpd %xmm1, %xmm0, %xmm0
701; AVX-NEXT:    retq
702;
703; AVX512-LABEL: test_arg_v2f64:
704; AVX512:       # %bb.0:
705; AVX512-NEXT:    vmovntdqa (%rdi), %xmm1
706; AVX512-NEXT:    vaddpd %xmm1, %xmm0, %xmm0
707; AVX512-NEXT:    retq
708  %1 = load <2 x double>, <2 x double>* %src, align 16, !nontemporal !1
709  %2 = fadd <2 x double> %arg, %1
710  ret <2 x double> %2
711}
712
713define <2 x i64> @test_arg_v2i64(<2 x i64> %arg, <2 x i64>* %src) {
714; SSE2-LABEL: test_arg_v2i64:
715; SSE2:       # %bb.0:
716; SSE2-NEXT:    paddq (%rdi), %xmm0
717; SSE2-NEXT:    retq
718;
719; SSE41-LABEL: test_arg_v2i64:
720; SSE41:       # %bb.0:
721; SSE41-NEXT:    movntdqa (%rdi), %xmm1
722; SSE41-NEXT:    paddq %xmm1, %xmm0
723; SSE41-NEXT:    retq
724;
725; AVX-LABEL: test_arg_v2i64:
726; AVX:       # %bb.0:
727; AVX-NEXT:    vmovntdqa (%rdi), %xmm1
728; AVX-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
729; AVX-NEXT:    retq
730;
731; AVX512-LABEL: test_arg_v2i64:
732; AVX512:       # %bb.0:
733; AVX512-NEXT:    vmovntdqa (%rdi), %xmm1
734; AVX512-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
735; AVX512-NEXT:    retq
736  %1 = load <2 x i64>, <2 x i64>* %src, align 16, !nontemporal !1
737  %2 = add <2 x i64> %arg, %1
738  ret <2 x i64> %2
739}
740
741define <8 x i16> @test_arg_v8i16(<8 x i16> %arg, <8 x i16>* %src) {
742; SSE2-LABEL: test_arg_v8i16:
743; SSE2:       # %bb.0:
744; SSE2-NEXT:    paddw (%rdi), %xmm0
745; SSE2-NEXT:    retq
746;
747; SSE41-LABEL: test_arg_v8i16:
748; SSE41:       # %bb.0:
749; SSE41-NEXT:    movntdqa (%rdi), %xmm1
750; SSE41-NEXT:    paddw %xmm1, %xmm0
751; SSE41-NEXT:    retq
752;
753; AVX-LABEL: test_arg_v8i16:
754; AVX:       # %bb.0:
755; AVX-NEXT:    vmovntdqa (%rdi), %xmm1
756; AVX-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
757; AVX-NEXT:    retq
758;
759; AVX512-LABEL: test_arg_v8i16:
760; AVX512:       # %bb.0:
761; AVX512-NEXT:    vmovntdqa (%rdi), %xmm1
762; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
763; AVX512-NEXT:    retq
764  %1 = load <8 x i16>, <8 x i16>* %src, align 16, !nontemporal !1
765  %2 = add <8 x i16> %arg, %1
766  ret <8 x i16> %2
767}
768
769define <16 x i8> @test_arg_v16i8(<16 x i8> %arg, <16 x i8>* %src) {
770; SSE2-LABEL: test_arg_v16i8:
771; SSE2:       # %bb.0:
772; SSE2-NEXT:    paddb (%rdi), %xmm0
773; SSE2-NEXT:    retq
774;
775; SSE41-LABEL: test_arg_v16i8:
776; SSE41:       # %bb.0:
777; SSE41-NEXT:    movntdqa (%rdi), %xmm1
778; SSE41-NEXT:    paddb %xmm1, %xmm0
779; SSE41-NEXT:    retq
780;
781; AVX-LABEL: test_arg_v16i8:
782; AVX:       # %bb.0:
783; AVX-NEXT:    vmovntdqa (%rdi), %xmm1
784; AVX-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
785; AVX-NEXT:    retq
786;
787; AVX512-LABEL: test_arg_v16i8:
788; AVX512:       # %bb.0:
789; AVX512-NEXT:    vmovntdqa (%rdi), %xmm1
790; AVX512-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
791; AVX512-NEXT:    retq
792  %1 = load <16 x i8>, <16 x i8>* %src, align 16, !nontemporal !1
793  %2 = add <16 x i8> %arg, %1
794  ret <16 x i8> %2
795}
796
797; And now YMM versions.
798
799define <8 x float> @test_arg_v8f32(<8 x float> %arg, <8 x float>* %src) {
800; SSE2-LABEL: test_arg_v8f32:
801; SSE2:       # %bb.0:
802; SSE2-NEXT:    addps (%rdi), %xmm0
803; SSE2-NEXT:    addps 16(%rdi), %xmm1
804; SSE2-NEXT:    retq
805;
806; SSE41-LABEL: test_arg_v8f32:
807; SSE41:       # %bb.0:
808; SSE41-NEXT:    movntdqa 16(%rdi), %xmm2
809; SSE41-NEXT:    movntdqa (%rdi), %xmm3
810; SSE41-NEXT:    addps %xmm3, %xmm0
811; SSE41-NEXT:    addps %xmm2, %xmm1
812; SSE41-NEXT:    retq
813;
814; AVX1-LABEL: test_arg_v8f32:
815; AVX1:       # %bb.0:
816; AVX1-NEXT:    vmovntdqa (%rdi), %xmm1
817; AVX1-NEXT:    vmovntdqa 16(%rdi), %xmm2
818; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
819; AVX1-NEXT:    vaddps %ymm1, %ymm0, %ymm0
820; AVX1-NEXT:    retq
821;
822; AVX2-LABEL: test_arg_v8f32:
823; AVX2:       # %bb.0:
824; AVX2-NEXT:    vmovntdqa (%rdi), %ymm1
825; AVX2-NEXT:    vaddps %ymm1, %ymm0, %ymm0
826; AVX2-NEXT:    retq
827;
828; AVX512-LABEL: test_arg_v8f32:
829; AVX512:       # %bb.0:
830; AVX512-NEXT:    vmovntdqa (%rdi), %ymm1
831; AVX512-NEXT:    vaddps %ymm1, %ymm0, %ymm0
832; AVX512-NEXT:    retq
833  %1 = load <8 x float>, <8 x float>* %src, align 32, !nontemporal !1
834  %2 = fadd <8 x float> %arg, %1
835  ret <8 x float> %2
836}
837
838define <8 x i32> @test_arg_v8i32(<8 x i32> %arg, <8 x i32>* %src) {
839; SSE2-LABEL: test_arg_v8i32:
840; SSE2:       # %bb.0:
841; SSE2-NEXT:    paddd (%rdi), %xmm0
842; SSE2-NEXT:    paddd 16(%rdi), %xmm1
843; SSE2-NEXT:    retq
844;
845; SSE41-LABEL: test_arg_v8i32:
846; SSE41:       # %bb.0:
847; SSE41-NEXT:    movntdqa 16(%rdi), %xmm2
848; SSE41-NEXT:    movntdqa (%rdi), %xmm3
849; SSE41-NEXT:    paddd %xmm3, %xmm0
850; SSE41-NEXT:    paddd %xmm2, %xmm1
851; SSE41-NEXT:    retq
852;
853; AVX1-LABEL: test_arg_v8i32:
854; AVX1:       # %bb.0:
855; AVX1-NEXT:    vmovntdqa (%rdi), %xmm1
856; AVX1-NEXT:    vmovntdqa 16(%rdi), %xmm2
857; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
858; AVX1-NEXT:    vpaddd %xmm2, %xmm3, %xmm2
859; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
860; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
861; AVX1-NEXT:    retq
862;
863; AVX2-LABEL: test_arg_v8i32:
864; AVX2:       # %bb.0:
865; AVX2-NEXT:    vmovntdqa (%rdi), %ymm1
866; AVX2-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
867; AVX2-NEXT:    retq
868;
869; AVX512-LABEL: test_arg_v8i32:
870; AVX512:       # %bb.0:
871; AVX512-NEXT:    vmovntdqa (%rdi), %ymm1
872; AVX512-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
873; AVX512-NEXT:    retq
874  %1 = load <8 x i32>, <8 x i32>* %src, align 32, !nontemporal !1
875  %2 = add <8 x i32> %arg, %1
876  ret <8 x i32> %2
877}
878
879define <4 x double> @test_arg_v4f64(<4 x double> %arg, <4 x double>* %src) {
880; SSE2-LABEL: test_arg_v4f64:
881; SSE2:       # %bb.0:
882; SSE2-NEXT:    addpd (%rdi), %xmm0
883; SSE2-NEXT:    addpd 16(%rdi), %xmm1
884; SSE2-NEXT:    retq
885;
886; SSE41-LABEL: test_arg_v4f64:
887; SSE41:       # %bb.0:
888; SSE41-NEXT:    movntdqa 16(%rdi), %xmm2
889; SSE41-NEXT:    movntdqa (%rdi), %xmm3
890; SSE41-NEXT:    addpd %xmm3, %xmm0
891; SSE41-NEXT:    addpd %xmm2, %xmm1
892; SSE41-NEXT:    retq
893;
894; AVX1-LABEL: test_arg_v4f64:
895; AVX1:       # %bb.0:
896; AVX1-NEXT:    vmovntdqa (%rdi), %xmm1
897; AVX1-NEXT:    vmovntdqa 16(%rdi), %xmm2
898; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
899; AVX1-NEXT:    vaddpd %ymm1, %ymm0, %ymm0
900; AVX1-NEXT:    retq
901;
902; AVX2-LABEL: test_arg_v4f64:
903; AVX2:       # %bb.0:
904; AVX2-NEXT:    vmovntdqa (%rdi), %ymm1
905; AVX2-NEXT:    vaddpd %ymm1, %ymm0, %ymm0
906; AVX2-NEXT:    retq
907;
908; AVX512-LABEL: test_arg_v4f64:
909; AVX512:       # %bb.0:
910; AVX512-NEXT:    vmovntdqa (%rdi), %ymm1
911; AVX512-NEXT:    vaddpd %ymm1, %ymm0, %ymm0
912; AVX512-NEXT:    retq
913  %1 = load <4 x double>, <4 x double>* %src, align 32, !nontemporal !1
914  %2 = fadd <4 x double> %arg, %1
915  ret <4 x double> %2
916}
917
918define <4 x i64> @test_arg_v4i64(<4 x i64> %arg, <4 x i64>* %src) {
919; SSE2-LABEL: test_arg_v4i64:
920; SSE2:       # %bb.0:
921; SSE2-NEXT:    paddq (%rdi), %xmm0
922; SSE2-NEXT:    paddq 16(%rdi), %xmm1
923; SSE2-NEXT:    retq
924;
925; SSE41-LABEL: test_arg_v4i64:
926; SSE41:       # %bb.0:
927; SSE41-NEXT:    movntdqa 16(%rdi), %xmm2
928; SSE41-NEXT:    movntdqa (%rdi), %xmm3
929; SSE41-NEXT:    paddq %xmm3, %xmm0
930; SSE41-NEXT:    paddq %xmm2, %xmm1
931; SSE41-NEXT:    retq
932;
933; AVX1-LABEL: test_arg_v4i64:
934; AVX1:       # %bb.0:
935; AVX1-NEXT:    vmovntdqa (%rdi), %xmm1
936; AVX1-NEXT:    vmovntdqa 16(%rdi), %xmm2
937; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
938; AVX1-NEXT:    vpaddq %xmm2, %xmm3, %xmm2
939; AVX1-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
940; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
941; AVX1-NEXT:    retq
942;
943; AVX2-LABEL: test_arg_v4i64:
944; AVX2:       # %bb.0:
945; AVX2-NEXT:    vmovntdqa (%rdi), %ymm1
946; AVX2-NEXT:    vpaddq %ymm1, %ymm0, %ymm0
947; AVX2-NEXT:    retq
948;
949; AVX512-LABEL: test_arg_v4i64:
950; AVX512:       # %bb.0:
951; AVX512-NEXT:    vmovntdqa (%rdi), %ymm1
952; AVX512-NEXT:    vpaddq %ymm1, %ymm0, %ymm0
953; AVX512-NEXT:    retq
954  %1 = load <4 x i64>, <4 x i64>* %src, align 32, !nontemporal !1
955  %2 = add <4 x i64> %arg, %1
956  ret <4 x i64> %2
957}
958
959define <16 x i16> @test_arg_v16i16(<16 x i16> %arg, <16 x i16>* %src) {
960; SSE2-LABEL: test_arg_v16i16:
961; SSE2:       # %bb.0:
962; SSE2-NEXT:    paddw (%rdi), %xmm0
963; SSE2-NEXT:    paddw 16(%rdi), %xmm1
964; SSE2-NEXT:    retq
965;
966; SSE41-LABEL: test_arg_v16i16:
967; SSE41:       # %bb.0:
968; SSE41-NEXT:    movntdqa 16(%rdi), %xmm2
969; SSE41-NEXT:    movntdqa (%rdi), %xmm3
970; SSE41-NEXT:    paddw %xmm3, %xmm0
971; SSE41-NEXT:    paddw %xmm2, %xmm1
972; SSE41-NEXT:    retq
973;
974; AVX1-LABEL: test_arg_v16i16:
975; AVX1:       # %bb.0:
976; AVX1-NEXT:    vmovntdqa (%rdi), %xmm1
977; AVX1-NEXT:    vmovntdqa 16(%rdi), %xmm2
978; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
979; AVX1-NEXT:    vpaddw %xmm2, %xmm3, %xmm2
980; AVX1-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
981; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
982; AVX1-NEXT:    retq
983;
984; AVX2-LABEL: test_arg_v16i16:
985; AVX2:       # %bb.0:
986; AVX2-NEXT:    vmovntdqa (%rdi), %ymm1
987; AVX2-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
988; AVX2-NEXT:    retq
989;
990; AVX512-LABEL: test_arg_v16i16:
991; AVX512:       # %bb.0:
992; AVX512-NEXT:    vmovntdqa (%rdi), %ymm1
993; AVX512-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
994; AVX512-NEXT:    retq
995  %1 = load <16 x i16>, <16 x i16>* %src, align 32, !nontemporal !1
996  %2 = add <16 x i16> %arg, %1
997  ret <16 x i16> %2
998}
999
1000define <32 x i8> @test_arg_v32i8(<32 x i8> %arg, <32 x i8>* %src) {
1001; SSE2-LABEL: test_arg_v32i8:
1002; SSE2:       # %bb.0:
1003; SSE2-NEXT:    paddb (%rdi), %xmm0
1004; SSE2-NEXT:    paddb 16(%rdi), %xmm1
1005; SSE2-NEXT:    retq
1006;
1007; SSE41-LABEL: test_arg_v32i8:
1008; SSE41:       # %bb.0:
1009; SSE41-NEXT:    movntdqa 16(%rdi), %xmm2
1010; SSE41-NEXT:    movntdqa (%rdi), %xmm3
1011; SSE41-NEXT:    paddb %xmm3, %xmm0
1012; SSE41-NEXT:    paddb %xmm2, %xmm1
1013; SSE41-NEXT:    retq
1014;
1015; AVX1-LABEL: test_arg_v32i8:
1016; AVX1:       # %bb.0:
1017; AVX1-NEXT:    vmovntdqa (%rdi), %xmm1
1018; AVX1-NEXT:    vmovntdqa 16(%rdi), %xmm2
1019; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1020; AVX1-NEXT:    vpaddb %xmm2, %xmm3, %xmm2
1021; AVX1-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
1022; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1023; AVX1-NEXT:    retq
1024;
1025; AVX2-LABEL: test_arg_v32i8:
1026; AVX2:       # %bb.0:
1027; AVX2-NEXT:    vmovntdqa (%rdi), %ymm1
1028; AVX2-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
1029; AVX2-NEXT:    retq
1030;
1031; AVX512-LABEL: test_arg_v32i8:
1032; AVX512:       # %bb.0:
1033; AVX512-NEXT:    vmovntdqa (%rdi), %ymm1
1034; AVX512-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
1035; AVX512-NEXT:    retq
1036  %1 = load <32 x i8>, <32 x i8>* %src, align 32, !nontemporal !1
1037  %2 = add <32 x i8> %arg, %1
1038  ret <32 x i8> %2
1039}
1040
1041; And now ZMM versions.
1042
1043define <16 x float> @test_arg_v16f32(<16 x float> %arg, <16 x float>* %src) {
1044; SSE2-LABEL: test_arg_v16f32:
1045; SSE2:       # %bb.0:
1046; SSE2-NEXT:    addps (%rdi), %xmm0
1047; SSE2-NEXT:    addps 16(%rdi), %xmm1
1048; SSE2-NEXT:    addps 32(%rdi), %xmm2
1049; SSE2-NEXT:    addps 48(%rdi), %xmm3
1050; SSE2-NEXT:    retq
1051;
1052; SSE41-LABEL: test_arg_v16f32:
1053; SSE41:       # %bb.0:
1054; SSE41-NEXT:    movntdqa 48(%rdi), %xmm4
1055; SSE41-NEXT:    movntdqa 32(%rdi), %xmm5
1056; SSE41-NEXT:    movntdqa 16(%rdi), %xmm6
1057; SSE41-NEXT:    movntdqa (%rdi), %xmm7
1058; SSE41-NEXT:    addps %xmm7, %xmm0
1059; SSE41-NEXT:    addps %xmm6, %xmm1
1060; SSE41-NEXT:    addps %xmm5, %xmm2
1061; SSE41-NEXT:    addps %xmm4, %xmm3
1062; SSE41-NEXT:    retq
1063;
1064; AVX1-LABEL: test_arg_v16f32:
1065; AVX1:       # %bb.0:
1066; AVX1-NEXT:    vmovntdqa 32(%rdi), %xmm2
1067; AVX1-NEXT:    vmovntdqa 48(%rdi), %xmm3
1068; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm2, %ymm2
1069; AVX1-NEXT:    vmovntdqa (%rdi), %xmm3
1070; AVX1-NEXT:    vmovntdqa 16(%rdi), %xmm4
1071; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm3, %ymm3
1072; AVX1-NEXT:    vaddps %ymm3, %ymm0, %ymm0
1073; AVX1-NEXT:    vaddps %ymm2, %ymm1, %ymm1
1074; AVX1-NEXT:    retq
1075;
1076; AVX2-LABEL: test_arg_v16f32:
1077; AVX2:       # %bb.0:
1078; AVX2-NEXT:    vmovntdqa 32(%rdi), %ymm2
1079; AVX2-NEXT:    vmovntdqa (%rdi), %ymm3
1080; AVX2-NEXT:    vaddps %ymm3, %ymm0, %ymm0
1081; AVX2-NEXT:    vaddps %ymm2, %ymm1, %ymm1
1082; AVX2-NEXT:    retq
1083;
1084; AVX512-LABEL: test_arg_v16f32:
1085; AVX512:       # %bb.0:
1086; AVX512-NEXT:    vmovntdqa (%rdi), %zmm1
1087; AVX512-NEXT:    vaddps %zmm1, %zmm0, %zmm0
1088; AVX512-NEXT:    retq
1089  %1 = load <16 x float>, <16 x float>* %src, align 64, !nontemporal !1
1090  %2 = fadd <16 x float> %arg, %1
1091  ret <16 x float> %2
1092}
1093
1094define <16 x i32> @test_arg_v16i32(<16 x i32> %arg, <16 x i32>* %src) {
1095; SSE2-LABEL: test_arg_v16i32:
1096; SSE2:       # %bb.0:
1097; SSE2-NEXT:    paddd (%rdi), %xmm0
1098; SSE2-NEXT:    paddd 16(%rdi), %xmm1
1099; SSE2-NEXT:    paddd 32(%rdi), %xmm2
1100; SSE2-NEXT:    paddd 48(%rdi), %xmm3
1101; SSE2-NEXT:    retq
1102;
1103; SSE41-LABEL: test_arg_v16i32:
1104; SSE41:       # %bb.0:
1105; SSE41-NEXT:    movntdqa 48(%rdi), %xmm4
1106; SSE41-NEXT:    movntdqa 32(%rdi), %xmm5
1107; SSE41-NEXT:    movntdqa 16(%rdi), %xmm6
1108; SSE41-NEXT:    movntdqa (%rdi), %xmm7
1109; SSE41-NEXT:    paddd %xmm7, %xmm0
1110; SSE41-NEXT:    paddd %xmm6, %xmm1
1111; SSE41-NEXT:    paddd %xmm5, %xmm2
1112; SSE41-NEXT:    paddd %xmm4, %xmm3
1113; SSE41-NEXT:    retq
1114;
1115; AVX1-LABEL: test_arg_v16i32:
1116; AVX1:       # %bb.0:
1117; AVX1-NEXT:    vmovntdqa 32(%rdi), %xmm2
1118; AVX1-NEXT:    vmovntdqa 48(%rdi), %xmm3
1119; AVX1-NEXT:    vmovntdqa (%rdi), %xmm4
1120; AVX1-NEXT:    vmovntdqa 16(%rdi), %xmm5
1121; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm6
1122; AVX1-NEXT:    vpaddd %xmm5, %xmm6, %xmm5
1123; AVX1-NEXT:    vpaddd %xmm4, %xmm0, %xmm0
1124; AVX1-NEXT:    vinsertf128 $1, %xmm5, %ymm0, %ymm0
1125; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
1126; AVX1-NEXT:    vpaddd %xmm3, %xmm4, %xmm3
1127; AVX1-NEXT:    vpaddd %xmm2, %xmm1, %xmm1
1128; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm1
1129; AVX1-NEXT:    retq
1130;
1131; AVX2-LABEL: test_arg_v16i32:
1132; AVX2:       # %bb.0:
1133; AVX2-NEXT:    vmovntdqa 32(%rdi), %ymm2
1134; AVX2-NEXT:    vmovntdqa (%rdi), %ymm3
1135; AVX2-NEXT:    vpaddd %ymm3, %ymm0, %ymm0
1136; AVX2-NEXT:    vpaddd %ymm2, %ymm1, %ymm1
1137; AVX2-NEXT:    retq
1138;
1139; AVX512-LABEL: test_arg_v16i32:
1140; AVX512:       # %bb.0:
1141; AVX512-NEXT:    vmovntdqa (%rdi), %zmm1
1142; AVX512-NEXT:    vpaddd %zmm1, %zmm0, %zmm0
1143; AVX512-NEXT:    retq
1144  %1 = load <16 x i32>, <16 x i32>* %src, align 64, !nontemporal !1
1145  %2 = add <16 x i32> %arg, %1
1146  ret <16 x i32> %2
1147}
1148
1149define <8 x double> @test_arg_v8f64(<8 x double> %arg, <8 x double>* %src) {
1150; SSE2-LABEL: test_arg_v8f64:
1151; SSE2:       # %bb.0:
1152; SSE2-NEXT:    addpd (%rdi), %xmm0
1153; SSE2-NEXT:    addpd 16(%rdi), %xmm1
1154; SSE2-NEXT:    addpd 32(%rdi), %xmm2
1155; SSE2-NEXT:    addpd 48(%rdi), %xmm3
1156; SSE2-NEXT:    retq
1157;
1158; SSE41-LABEL: test_arg_v8f64:
1159; SSE41:       # %bb.0:
1160; SSE41-NEXT:    movntdqa 48(%rdi), %xmm4
1161; SSE41-NEXT:    movntdqa 32(%rdi), %xmm5
1162; SSE41-NEXT:    movntdqa 16(%rdi), %xmm6
1163; SSE41-NEXT:    movntdqa (%rdi), %xmm7
1164; SSE41-NEXT:    addpd %xmm7, %xmm0
1165; SSE41-NEXT:    addpd %xmm6, %xmm1
1166; SSE41-NEXT:    addpd %xmm5, %xmm2
1167; SSE41-NEXT:    addpd %xmm4, %xmm3
1168; SSE41-NEXT:    retq
1169;
1170; AVX1-LABEL: test_arg_v8f64:
1171; AVX1:       # %bb.0:
1172; AVX1-NEXT:    vmovntdqa 32(%rdi), %xmm2
1173; AVX1-NEXT:    vmovntdqa 48(%rdi), %xmm3
1174; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm2, %ymm2
1175; AVX1-NEXT:    vmovntdqa (%rdi), %xmm3
1176; AVX1-NEXT:    vmovntdqa 16(%rdi), %xmm4
1177; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm3, %ymm3
1178; AVX1-NEXT:    vaddpd %ymm3, %ymm0, %ymm0
1179; AVX1-NEXT:    vaddpd %ymm2, %ymm1, %ymm1
1180; AVX1-NEXT:    retq
1181;
1182; AVX2-LABEL: test_arg_v8f64:
1183; AVX2:       # %bb.0:
1184; AVX2-NEXT:    vmovntdqa 32(%rdi), %ymm2
1185; AVX2-NEXT:    vmovntdqa (%rdi), %ymm3
1186; AVX2-NEXT:    vaddpd %ymm3, %ymm0, %ymm0
1187; AVX2-NEXT:    vaddpd %ymm2, %ymm1, %ymm1
1188; AVX2-NEXT:    retq
1189;
1190; AVX512-LABEL: test_arg_v8f64:
1191; AVX512:       # %bb.0:
1192; AVX512-NEXT:    vmovntdqa (%rdi), %zmm1
1193; AVX512-NEXT:    vaddpd %zmm1, %zmm0, %zmm0
1194; AVX512-NEXT:    retq
1195  %1 = load <8 x double>, <8 x double>* %src, align 64, !nontemporal !1
1196  %2 = fadd <8 x double> %arg, %1
1197  ret <8 x double> %2
1198}
1199
1200define <8 x i64> @test_arg_v8i64(<8 x i64> %arg, <8 x i64>* %src) {
1201; SSE2-LABEL: test_arg_v8i64:
1202; SSE2:       # %bb.0:
1203; SSE2-NEXT:    paddq (%rdi), %xmm0
1204; SSE2-NEXT:    paddq 16(%rdi), %xmm1
1205; SSE2-NEXT:    paddq 32(%rdi), %xmm2
1206; SSE2-NEXT:    paddq 48(%rdi), %xmm3
1207; SSE2-NEXT:    retq
1208;
1209; SSE41-LABEL: test_arg_v8i64:
1210; SSE41:       # %bb.0:
1211; SSE41-NEXT:    movntdqa 48(%rdi), %xmm4
1212; SSE41-NEXT:    movntdqa 32(%rdi), %xmm5
1213; SSE41-NEXT:    movntdqa 16(%rdi), %xmm6
1214; SSE41-NEXT:    movntdqa (%rdi), %xmm7
1215; SSE41-NEXT:    paddq %xmm7, %xmm0
1216; SSE41-NEXT:    paddq %xmm6, %xmm1
1217; SSE41-NEXT:    paddq %xmm5, %xmm2
1218; SSE41-NEXT:    paddq %xmm4, %xmm3
1219; SSE41-NEXT:    retq
1220;
1221; AVX1-LABEL: test_arg_v8i64:
1222; AVX1:       # %bb.0:
1223; AVX1-NEXT:    vmovntdqa 32(%rdi), %xmm2
1224; AVX1-NEXT:    vmovntdqa 48(%rdi), %xmm3
1225; AVX1-NEXT:    vmovntdqa (%rdi), %xmm4
1226; AVX1-NEXT:    vmovntdqa 16(%rdi), %xmm5
1227; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm6
1228; AVX1-NEXT:    vpaddq %xmm5, %xmm6, %xmm5
1229; AVX1-NEXT:    vpaddq %xmm4, %xmm0, %xmm0
1230; AVX1-NEXT:    vinsertf128 $1, %xmm5, %ymm0, %ymm0
1231; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
1232; AVX1-NEXT:    vpaddq %xmm3, %xmm4, %xmm3
1233; AVX1-NEXT:    vpaddq %xmm2, %xmm1, %xmm1
1234; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm1
1235; AVX1-NEXT:    retq
1236;
1237; AVX2-LABEL: test_arg_v8i64:
1238; AVX2:       # %bb.0:
1239; AVX2-NEXT:    vmovntdqa 32(%rdi), %ymm2
1240; AVX2-NEXT:    vmovntdqa (%rdi), %ymm3
1241; AVX2-NEXT:    vpaddq %ymm3, %ymm0, %ymm0
1242; AVX2-NEXT:    vpaddq %ymm2, %ymm1, %ymm1
1243; AVX2-NEXT:    retq
1244;
1245; AVX512-LABEL: test_arg_v8i64:
1246; AVX512:       # %bb.0:
1247; AVX512-NEXT:    vmovntdqa (%rdi), %zmm1
1248; AVX512-NEXT:    vpaddq %zmm1, %zmm0, %zmm0
1249; AVX512-NEXT:    retq
1250  %1 = load <8 x i64>, <8 x i64>* %src, align 64, !nontemporal !1
1251  %2 = add <8 x i64> %arg, %1
1252  ret <8 x i64> %2
1253}
1254
1255define <32 x i16> @test_arg_v32i16(<32 x i16> %arg, <32 x i16>* %src) {
1256; SSE2-LABEL: test_arg_v32i16:
1257; SSE2:       # %bb.0:
1258; SSE2-NEXT:    paddw (%rdi), %xmm0
1259; SSE2-NEXT:    paddw 16(%rdi), %xmm1
1260; SSE2-NEXT:    paddw 32(%rdi), %xmm2
1261; SSE2-NEXT:    paddw 48(%rdi), %xmm3
1262; SSE2-NEXT:    retq
1263;
1264; SSE41-LABEL: test_arg_v32i16:
1265; SSE41:       # %bb.0:
1266; SSE41-NEXT:    movntdqa 48(%rdi), %xmm4
1267; SSE41-NEXT:    movntdqa 32(%rdi), %xmm5
1268; SSE41-NEXT:    movntdqa 16(%rdi), %xmm6
1269; SSE41-NEXT:    movntdqa (%rdi), %xmm7
1270; SSE41-NEXT:    paddw %xmm7, %xmm0
1271; SSE41-NEXT:    paddw %xmm6, %xmm1
1272; SSE41-NEXT:    paddw %xmm5, %xmm2
1273; SSE41-NEXT:    paddw %xmm4, %xmm3
1274; SSE41-NEXT:    retq
1275;
1276; AVX1-LABEL: test_arg_v32i16:
1277; AVX1:       # %bb.0:
1278; AVX1-NEXT:    vmovntdqa 32(%rdi), %xmm2
1279; AVX1-NEXT:    vmovntdqa 48(%rdi), %xmm3
1280; AVX1-NEXT:    vmovntdqa (%rdi), %xmm4
1281; AVX1-NEXT:    vmovntdqa 16(%rdi), %xmm5
1282; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm6
1283; AVX1-NEXT:    vpaddw %xmm5, %xmm6, %xmm5
1284; AVX1-NEXT:    vpaddw %xmm4, %xmm0, %xmm0
1285; AVX1-NEXT:    vinsertf128 $1, %xmm5, %ymm0, %ymm0
1286; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
1287; AVX1-NEXT:    vpaddw %xmm3, %xmm4, %xmm3
1288; AVX1-NEXT:    vpaddw %xmm2, %xmm1, %xmm1
1289; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm1
1290; AVX1-NEXT:    retq
1291;
1292; AVX2-LABEL: test_arg_v32i16:
1293; AVX2:       # %bb.0:
1294; AVX2-NEXT:    vmovntdqa 32(%rdi), %ymm2
1295; AVX2-NEXT:    vmovntdqa (%rdi), %ymm3
1296; AVX2-NEXT:    vpaddw %ymm3, %ymm0, %ymm0
1297; AVX2-NEXT:    vpaddw %ymm2, %ymm1, %ymm1
1298; AVX2-NEXT:    retq
1299;
1300; AVX512F-LABEL: test_arg_v32i16:
1301; AVX512F:       # %bb.0:
1302; AVX512F-NEXT:    vmovntdqa 32(%rdi), %ymm2
1303; AVX512F-NEXT:    vmovntdqa (%rdi), %ymm3
1304; AVX512F-NEXT:    vpaddw %ymm3, %ymm0, %ymm0
1305; AVX512F-NEXT:    vpaddw %ymm2, %ymm1, %ymm1
1306; AVX512F-NEXT:    retq
1307;
1308; AVX512BW-LABEL: test_arg_v32i16:
1309; AVX512BW:       # %bb.0:
1310; AVX512BW-NEXT:    vmovntdqa (%rdi), %zmm1
1311; AVX512BW-NEXT:    vpaddw %zmm1, %zmm0, %zmm0
1312; AVX512BW-NEXT:    retq
1313;
1314; AVX512VL-LABEL: test_arg_v32i16:
1315; AVX512VL:       # %bb.0:
1316; AVX512VL-NEXT:    vmovntdqa 32(%rdi), %ymm2
1317; AVX512VL-NEXT:    vmovntdqa (%rdi), %ymm3
1318; AVX512VL-NEXT:    vpaddw %ymm3, %ymm0, %ymm0
1319; AVX512VL-NEXT:    vpaddw %ymm2, %ymm1, %ymm1
1320; AVX512VL-NEXT:    retq
1321  %1 = load <32 x i16>, <32 x i16>* %src, align 64, !nontemporal !1
1322  %2 = add <32 x i16> %arg, %1
1323  ret <32 x i16> %2
1324}
1325
1326define <64 x i8> @test_arg_v64i8(<64 x i8> %arg, <64 x i8>* %src) {
1327; SSE2-LABEL: test_arg_v64i8:
1328; SSE2:       # %bb.0:
1329; SSE2-NEXT:    paddb (%rdi), %xmm0
1330; SSE2-NEXT:    paddb 16(%rdi), %xmm1
1331; SSE2-NEXT:    paddb 32(%rdi), %xmm2
1332; SSE2-NEXT:    paddb 48(%rdi), %xmm3
1333; SSE2-NEXT:    retq
1334;
1335; SSE41-LABEL: test_arg_v64i8:
1336; SSE41:       # %bb.0:
1337; SSE41-NEXT:    movntdqa 48(%rdi), %xmm4
1338; SSE41-NEXT:    movntdqa 32(%rdi), %xmm5
1339; SSE41-NEXT:    movntdqa 16(%rdi), %xmm6
1340; SSE41-NEXT:    movntdqa (%rdi), %xmm7
1341; SSE41-NEXT:    paddb %xmm7, %xmm0
1342; SSE41-NEXT:    paddb %xmm6, %xmm1
1343; SSE41-NEXT:    paddb %xmm5, %xmm2
1344; SSE41-NEXT:    paddb %xmm4, %xmm3
1345; SSE41-NEXT:    retq
1346;
1347; AVX1-LABEL: test_arg_v64i8:
1348; AVX1:       # %bb.0:
1349; AVX1-NEXT:    vmovntdqa 32(%rdi), %xmm2
1350; AVX1-NEXT:    vmovntdqa 48(%rdi), %xmm3
1351; AVX1-NEXT:    vmovntdqa (%rdi), %xmm4
1352; AVX1-NEXT:    vmovntdqa 16(%rdi), %xmm5
1353; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm6
1354; AVX1-NEXT:    vpaddb %xmm5, %xmm6, %xmm5
1355; AVX1-NEXT:    vpaddb %xmm4, %xmm0, %xmm0
1356; AVX1-NEXT:    vinsertf128 $1, %xmm5, %ymm0, %ymm0
1357; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
1358; AVX1-NEXT:    vpaddb %xmm3, %xmm4, %xmm3
1359; AVX1-NEXT:    vpaddb %xmm2, %xmm1, %xmm1
1360; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm1
1361; AVX1-NEXT:    retq
1362;
1363; AVX2-LABEL: test_arg_v64i8:
1364; AVX2:       # %bb.0:
1365; AVX2-NEXT:    vmovntdqa 32(%rdi), %ymm2
1366; AVX2-NEXT:    vmovntdqa (%rdi), %ymm3
1367; AVX2-NEXT:    vpaddb %ymm3, %ymm0, %ymm0
1368; AVX2-NEXT:    vpaddb %ymm2, %ymm1, %ymm1
1369; AVX2-NEXT:    retq
1370;
1371; AVX512F-LABEL: test_arg_v64i8:
1372; AVX512F:       # %bb.0:
1373; AVX512F-NEXT:    vmovntdqa 32(%rdi), %ymm2
1374; AVX512F-NEXT:    vmovntdqa (%rdi), %ymm3
1375; AVX512F-NEXT:    vpaddb %ymm3, %ymm0, %ymm0
1376; AVX512F-NEXT:    vpaddb %ymm2, %ymm1, %ymm1
1377; AVX512F-NEXT:    retq
1378;
1379; AVX512BW-LABEL: test_arg_v64i8:
1380; AVX512BW:       # %bb.0:
1381; AVX512BW-NEXT:    vmovntdqa (%rdi), %zmm1
1382; AVX512BW-NEXT:    vpaddb %zmm1, %zmm0, %zmm0
1383; AVX512BW-NEXT:    retq
1384;
1385; AVX512VL-LABEL: test_arg_v64i8:
1386; AVX512VL:       # %bb.0:
1387; AVX512VL-NEXT:    vmovntdqa 32(%rdi), %ymm2
1388; AVX512VL-NEXT:    vmovntdqa (%rdi), %ymm3
1389; AVX512VL-NEXT:    vpaddb %ymm3, %ymm0, %ymm0
1390; AVX512VL-NEXT:    vpaddb %ymm2, %ymm1, %ymm1
1391; AVX512VL-NEXT:    retq
1392  %1 = load <64 x i8>, <64 x i8>* %src, align 64, !nontemporal !1
1393  %2 = add <64 x i8> %arg, %1
1394  ret <64 x i8> %2
1395}
1396
1397
1398; Unaligned non-temporal loads (not supported)
1399
1400define <4 x float> @test_unaligned_v4f32(<4 x float>* %src) {
1401; SSE-LABEL: test_unaligned_v4f32:
1402; SSE:       # %bb.0:
1403; SSE-NEXT:    movups (%rdi), %xmm0
1404; SSE-NEXT:    retq
1405;
1406; AVX-LABEL: test_unaligned_v4f32:
1407; AVX:       # %bb.0:
1408; AVX-NEXT:    vmovups (%rdi), %xmm0
1409; AVX-NEXT:    retq
1410;
1411; AVX512-LABEL: test_unaligned_v4f32:
1412; AVX512:       # %bb.0:
1413; AVX512-NEXT:    vmovups (%rdi), %xmm0
1414; AVX512-NEXT:    retq
1415  %1 = load <4 x float>, <4 x float>* %src, align 1, !nontemporal !1
1416  ret <4 x float> %1
1417}
1418
1419define <4 x i32> @test_unaligned_v4i32(<4 x i32>* %src) {
1420; SSE-LABEL: test_unaligned_v4i32:
1421; SSE:       # %bb.0:
1422; SSE-NEXT:    movups (%rdi), %xmm0
1423; SSE-NEXT:    retq
1424;
1425; AVX-LABEL: test_unaligned_v4i32:
1426; AVX:       # %bb.0:
1427; AVX-NEXT:    vmovups (%rdi), %xmm0
1428; AVX-NEXT:    retq
1429;
1430; AVX512-LABEL: test_unaligned_v4i32:
1431; AVX512:       # %bb.0:
1432; AVX512-NEXT:    vmovups (%rdi), %xmm0
1433; AVX512-NEXT:    retq
1434  %1 = load <4 x i32>, <4 x i32>* %src, align 1, !nontemporal !1
1435  ret <4 x i32> %1
1436}
1437
1438define <2 x double> @test_unaligned_v2f64(<2 x double>* %src) {
1439; SSE-LABEL: test_unaligned_v2f64:
1440; SSE:       # %bb.0:
1441; SSE-NEXT:    movups (%rdi), %xmm0
1442; SSE-NEXT:    retq
1443;
1444; AVX-LABEL: test_unaligned_v2f64:
1445; AVX:       # %bb.0:
1446; AVX-NEXT:    vmovups (%rdi), %xmm0
1447; AVX-NEXT:    retq
1448;
1449; AVX512-LABEL: test_unaligned_v2f64:
1450; AVX512:       # %bb.0:
1451; AVX512-NEXT:    vmovups (%rdi), %xmm0
1452; AVX512-NEXT:    retq
1453  %1 = load <2 x double>, <2 x double>* %src, align 1, !nontemporal !1
1454  ret <2 x double> %1
1455}
1456
1457define <2 x i64> @test_unaligned_v2i64(<2 x i64>* %src) {
1458; SSE-LABEL: test_unaligned_v2i64:
1459; SSE:       # %bb.0:
1460; SSE-NEXT:    movups (%rdi), %xmm0
1461; SSE-NEXT:    retq
1462;
1463; AVX-LABEL: test_unaligned_v2i64:
1464; AVX:       # %bb.0:
1465; AVX-NEXT:    vmovups (%rdi), %xmm0
1466; AVX-NEXT:    retq
1467;
1468; AVX512-LABEL: test_unaligned_v2i64:
1469; AVX512:       # %bb.0:
1470; AVX512-NEXT:    vmovups (%rdi), %xmm0
1471; AVX512-NEXT:    retq
1472  %1 = load <2 x i64>, <2 x i64>* %src, align 1, !nontemporal !1
1473  ret <2 x i64> %1
1474}
1475
1476define <8 x i16> @test_unaligned_v8i16(<8 x i16>* %src) {
1477; SSE-LABEL: test_unaligned_v8i16:
1478; SSE:       # %bb.0:
1479; SSE-NEXT:    movups (%rdi), %xmm0
1480; SSE-NEXT:    retq
1481;
1482; AVX-LABEL: test_unaligned_v8i16:
1483; AVX:       # %bb.0:
1484; AVX-NEXT:    vmovups (%rdi), %xmm0
1485; AVX-NEXT:    retq
1486;
1487; AVX512-LABEL: test_unaligned_v8i16:
1488; AVX512:       # %bb.0:
1489; AVX512-NEXT:    vmovups (%rdi), %xmm0
1490; AVX512-NEXT:    retq
1491  %1 = load <8 x i16>, <8 x i16>* %src, align 1, !nontemporal !1
1492  ret <8 x i16> %1
1493}
1494
1495define <16 x i8> @test_unaligned_v16i8(<16 x i8>* %src) {
1496; SSE-LABEL: test_unaligned_v16i8:
1497; SSE:       # %bb.0:
1498; SSE-NEXT:    movups (%rdi), %xmm0
1499; SSE-NEXT:    retq
1500;
1501; AVX-LABEL: test_unaligned_v16i8:
1502; AVX:       # %bb.0:
1503; AVX-NEXT:    vmovups (%rdi), %xmm0
1504; AVX-NEXT:    retq
1505;
1506; AVX512-LABEL: test_unaligned_v16i8:
1507; AVX512:       # %bb.0:
1508; AVX512-NEXT:    vmovups (%rdi), %xmm0
1509; AVX512-NEXT:    retq
1510  %1 = load <16 x i8>, <16 x i8>* %src, align 1, !nontemporal !1
1511  ret <16 x i8> %1
1512}
1513
1514; And now YMM versions.
1515
1516define <8 x float> @test_unaligned_v8f32(<8 x float>* %src) {
1517; SSE-LABEL: test_unaligned_v8f32:
1518; SSE:       # %bb.0:
1519; SSE-NEXT:    movups (%rdi), %xmm0
1520; SSE-NEXT:    movups 16(%rdi), %xmm1
1521; SSE-NEXT:    retq
1522;
1523; AVX-LABEL: test_unaligned_v8f32:
1524; AVX:       # %bb.0:
1525; AVX-NEXT:    vmovups (%rdi), %ymm0
1526; AVX-NEXT:    retq
1527;
1528; AVX512-LABEL: test_unaligned_v8f32:
1529; AVX512:       # %bb.0:
1530; AVX512-NEXT:    vmovups (%rdi), %ymm0
1531; AVX512-NEXT:    retq
1532  %1 = load <8 x float>, <8 x float>* %src, align 1, !nontemporal !1
1533  ret <8 x float> %1
1534}
1535
1536define <8 x i32> @test_unaligned_v8i32(<8 x i32>* %src) {
1537; SSE-LABEL: test_unaligned_v8i32:
1538; SSE:       # %bb.0:
1539; SSE-NEXT:    movups (%rdi), %xmm0
1540; SSE-NEXT:    movups 16(%rdi), %xmm1
1541; SSE-NEXT:    retq
1542;
1543; AVX-LABEL: test_unaligned_v8i32:
1544; AVX:       # %bb.0:
1545; AVX-NEXT:    vmovups (%rdi), %ymm0
1546; AVX-NEXT:    retq
1547;
1548; AVX512-LABEL: test_unaligned_v8i32:
1549; AVX512:       # %bb.0:
1550; AVX512-NEXT:    vmovups (%rdi), %ymm0
1551; AVX512-NEXT:    retq
1552  %1 = load <8 x i32>, <8 x i32>* %src, align 1, !nontemporal !1
1553  ret <8 x i32> %1
1554}
1555
1556define <4 x double> @test_unaligned_v4f64(<4 x double>* %src) {
1557; SSE-LABEL: test_unaligned_v4f64:
1558; SSE:       # %bb.0:
1559; SSE-NEXT:    movups (%rdi), %xmm0
1560; SSE-NEXT:    movups 16(%rdi), %xmm1
1561; SSE-NEXT:    retq
1562;
1563; AVX-LABEL: test_unaligned_v4f64:
1564; AVX:       # %bb.0:
1565; AVX-NEXT:    vmovups (%rdi), %ymm0
1566; AVX-NEXT:    retq
1567;
1568; AVX512-LABEL: test_unaligned_v4f64:
1569; AVX512:       # %bb.0:
1570; AVX512-NEXT:    vmovups (%rdi), %ymm0
1571; AVX512-NEXT:    retq
1572  %1 = load <4 x double>, <4 x double>* %src, align 1, !nontemporal !1
1573  ret <4 x double> %1
1574}
1575
1576define <4 x i64> @test_unaligned_v4i64(<4 x i64>* %src) {
1577; SSE-LABEL: test_unaligned_v4i64:
1578; SSE:       # %bb.0:
1579; SSE-NEXT:    movups (%rdi), %xmm0
1580; SSE-NEXT:    movups 16(%rdi), %xmm1
1581; SSE-NEXT:    retq
1582;
1583; AVX-LABEL: test_unaligned_v4i64:
1584; AVX:       # %bb.0:
1585; AVX-NEXT:    vmovups (%rdi), %ymm0
1586; AVX-NEXT:    retq
1587;
1588; AVX512-LABEL: test_unaligned_v4i64:
1589; AVX512:       # %bb.0:
1590; AVX512-NEXT:    vmovups (%rdi), %ymm0
1591; AVX512-NEXT:    retq
1592  %1 = load <4 x i64>, <4 x i64>* %src, align 1, !nontemporal !1
1593  ret <4 x i64> %1
1594}
1595
1596define <16 x i16> @test_unaligned_v16i16(<16 x i16>* %src) {
1597; SSE-LABEL: test_unaligned_v16i16:
1598; SSE:       # %bb.0:
1599; SSE-NEXT:    movups (%rdi), %xmm0
1600; SSE-NEXT:    movups 16(%rdi), %xmm1
1601; SSE-NEXT:    retq
1602;
1603; AVX-LABEL: test_unaligned_v16i16:
1604; AVX:       # %bb.0:
1605; AVX-NEXT:    vmovups (%rdi), %ymm0
1606; AVX-NEXT:    retq
1607;
1608; AVX512-LABEL: test_unaligned_v16i16:
1609; AVX512:       # %bb.0:
1610; AVX512-NEXT:    vmovups (%rdi), %ymm0
1611; AVX512-NEXT:    retq
1612  %1 = load <16 x i16>, <16 x i16>* %src, align 1, !nontemporal !1
1613  ret <16 x i16> %1
1614}
1615
1616define <32 x i8> @test_unaligned_v32i8(<32 x i8>* %src) {
1617; SSE-LABEL: test_unaligned_v32i8:
1618; SSE:       # %bb.0:
1619; SSE-NEXT:    movups (%rdi), %xmm0
1620; SSE-NEXT:    movups 16(%rdi), %xmm1
1621; SSE-NEXT:    retq
1622;
1623; AVX-LABEL: test_unaligned_v32i8:
1624; AVX:       # %bb.0:
1625; AVX-NEXT:    vmovups (%rdi), %ymm0
1626; AVX-NEXT:    retq
1627;
1628; AVX512-LABEL: test_unaligned_v32i8:
1629; AVX512:       # %bb.0:
1630; AVX512-NEXT:    vmovups (%rdi), %ymm0
1631; AVX512-NEXT:    retq
1632  %1 = load <32 x i8>, <32 x i8>* %src, align 1, !nontemporal !1
1633  ret <32 x i8> %1
1634}
1635
1636; And now ZMM versions.
1637
1638define <16 x float> @test_unaligned_v16f32(<16 x float>* %src) {
1639; SSE-LABEL: test_unaligned_v16f32:
1640; SSE:       # %bb.0:
1641; SSE-NEXT:    movups (%rdi), %xmm0
1642; SSE-NEXT:    movups 16(%rdi), %xmm1
1643; SSE-NEXT:    movups 32(%rdi), %xmm2
1644; SSE-NEXT:    movups 48(%rdi), %xmm3
1645; SSE-NEXT:    retq
1646;
1647; AVX-LABEL: test_unaligned_v16f32:
1648; AVX:       # %bb.0:
1649; AVX-NEXT:    vmovups (%rdi), %ymm0
1650; AVX-NEXT:    vmovups 32(%rdi), %ymm1
1651; AVX-NEXT:    retq
1652;
1653; AVX512-LABEL: test_unaligned_v16f32:
1654; AVX512:       # %bb.0:
1655; AVX512-NEXT:    vmovups (%rdi), %zmm0
1656; AVX512-NEXT:    retq
1657  %1 = load <16 x float>, <16 x float>* %src, align 1, !nontemporal !1
1658  ret <16 x float> %1
1659}
1660
1661define <16 x i32> @test_unaligned_v16i32(<16 x i32>* %src) {
1662; SSE-LABEL: test_unaligned_v16i32:
1663; SSE:       # %bb.0:
1664; SSE-NEXT:    movups (%rdi), %xmm0
1665; SSE-NEXT:    movups 16(%rdi), %xmm1
1666; SSE-NEXT:    movups 32(%rdi), %xmm2
1667; SSE-NEXT:    movups 48(%rdi), %xmm3
1668; SSE-NEXT:    retq
1669;
1670; AVX-LABEL: test_unaligned_v16i32:
1671; AVX:       # %bb.0:
1672; AVX-NEXT:    vmovups (%rdi), %ymm0
1673; AVX-NEXT:    vmovups 32(%rdi), %ymm1
1674; AVX-NEXT:    retq
1675;
1676; AVX512-LABEL: test_unaligned_v16i32:
1677; AVX512:       # %bb.0:
1678; AVX512-NEXT:    vmovups (%rdi), %zmm0
1679; AVX512-NEXT:    retq
1680  %1 = load <16 x i32>, <16 x i32>* %src, align 1, !nontemporal !1
1681  ret <16 x i32> %1
1682}
1683
1684define <8 x double> @test_unaligned_v8f64(<8 x double>* %src) {
1685; SSE-LABEL: test_unaligned_v8f64:
1686; SSE:       # %bb.0:
1687; SSE-NEXT:    movups (%rdi), %xmm0
1688; SSE-NEXT:    movups 16(%rdi), %xmm1
1689; SSE-NEXT:    movups 32(%rdi), %xmm2
1690; SSE-NEXT:    movups 48(%rdi), %xmm3
1691; SSE-NEXT:    retq
1692;
1693; AVX-LABEL: test_unaligned_v8f64:
1694; AVX:       # %bb.0:
1695; AVX-NEXT:    vmovups (%rdi), %ymm0
1696; AVX-NEXT:    vmovups 32(%rdi), %ymm1
1697; AVX-NEXT:    retq
1698;
1699; AVX512-LABEL: test_unaligned_v8f64:
1700; AVX512:       # %bb.0:
1701; AVX512-NEXT:    vmovups (%rdi), %zmm0
1702; AVX512-NEXT:    retq
1703  %1 = load <8 x double>, <8 x double>* %src, align 1, !nontemporal !1
1704  ret <8 x double> %1
1705}
1706
1707define <8 x i64> @test_unaligned_v8i64(<8 x i64>* %src) {
1708; SSE-LABEL: test_unaligned_v8i64:
1709; SSE:       # %bb.0:
1710; SSE-NEXT:    movups (%rdi), %xmm0
1711; SSE-NEXT:    movups 16(%rdi), %xmm1
1712; SSE-NEXT:    movups 32(%rdi), %xmm2
1713; SSE-NEXT:    movups 48(%rdi), %xmm3
1714; SSE-NEXT:    retq
1715;
1716; AVX-LABEL: test_unaligned_v8i64:
1717; AVX:       # %bb.0:
1718; AVX-NEXT:    vmovups (%rdi), %ymm0
1719; AVX-NEXT:    vmovups 32(%rdi), %ymm1
1720; AVX-NEXT:    retq
1721;
1722; AVX512-LABEL: test_unaligned_v8i64:
1723; AVX512:       # %bb.0:
1724; AVX512-NEXT:    vmovups (%rdi), %zmm0
1725; AVX512-NEXT:    retq
1726  %1 = load <8 x i64>, <8 x i64>* %src, align 1, !nontemporal !1
1727  ret <8 x i64> %1
1728}
1729
1730define <32 x i16> @test_unaligned_v32i16(<32 x i16>* %src) {
1731; SSE-LABEL: test_unaligned_v32i16:
1732; SSE:       # %bb.0:
1733; SSE-NEXT:    movups (%rdi), %xmm0
1734; SSE-NEXT:    movups 16(%rdi), %xmm1
1735; SSE-NEXT:    movups 32(%rdi), %xmm2
1736; SSE-NEXT:    movups 48(%rdi), %xmm3
1737; SSE-NEXT:    retq
1738;
1739; AVX-LABEL: test_unaligned_v32i16:
1740; AVX:       # %bb.0:
1741; AVX-NEXT:    vmovups (%rdi), %ymm0
1742; AVX-NEXT:    vmovups 32(%rdi), %ymm1
1743; AVX-NEXT:    retq
1744;
1745; AVX512F-LABEL: test_unaligned_v32i16:
1746; AVX512F:       # %bb.0:
1747; AVX512F-NEXT:    vmovups (%rdi), %ymm0
1748; AVX512F-NEXT:    vmovups 32(%rdi), %ymm1
1749; AVX512F-NEXT:    retq
1750;
1751; AVX512BW-LABEL: test_unaligned_v32i16:
1752; AVX512BW:       # %bb.0:
1753; AVX512BW-NEXT:    vmovups (%rdi), %zmm0
1754; AVX512BW-NEXT:    retq
1755;
1756; AVX512VL-LABEL: test_unaligned_v32i16:
1757; AVX512VL:       # %bb.0:
1758; AVX512VL-NEXT:    vmovups (%rdi), %ymm0
1759; AVX512VL-NEXT:    vmovups 32(%rdi), %ymm1
1760; AVX512VL-NEXT:    retq
1761  %1 = load <32 x i16>, <32 x i16>* %src, align 1, !nontemporal !1
1762  ret <32 x i16> %1
1763}
1764
1765define <64 x i8> @test_unaligned_v64i8(<64 x i8>* %src) {
1766; SSE-LABEL: test_unaligned_v64i8:
1767; SSE:       # %bb.0:
1768; SSE-NEXT:    movups (%rdi), %xmm0
1769; SSE-NEXT:    movups 16(%rdi), %xmm1
1770; SSE-NEXT:    movups 32(%rdi), %xmm2
1771; SSE-NEXT:    movups 48(%rdi), %xmm3
1772; SSE-NEXT:    retq
1773;
1774; AVX-LABEL: test_unaligned_v64i8:
1775; AVX:       # %bb.0:
1776; AVX-NEXT:    vmovups (%rdi), %ymm0
1777; AVX-NEXT:    vmovups 32(%rdi), %ymm1
1778; AVX-NEXT:    retq
1779;
1780; AVX512F-LABEL: test_unaligned_v64i8:
1781; AVX512F:       # %bb.0:
1782; AVX512F-NEXT:    vmovups (%rdi), %ymm0
1783; AVX512F-NEXT:    vmovups 32(%rdi), %ymm1
1784; AVX512F-NEXT:    retq
1785;
1786; AVX512BW-LABEL: test_unaligned_v64i8:
1787; AVX512BW:       # %bb.0:
1788; AVX512BW-NEXT:    vmovups (%rdi), %zmm0
1789; AVX512BW-NEXT:    retq
1790;
1791; AVX512VL-LABEL: test_unaligned_v64i8:
1792; AVX512VL:       # %bb.0:
1793; AVX512VL-NEXT:    vmovups (%rdi), %ymm0
1794; AVX512VL-NEXT:    vmovups 32(%rdi), %ymm1
1795; AVX512VL-NEXT:    retq
1796  %1 = load <64 x i8>, <64 x i8>* %src, align 1, !nontemporal !1
1797  ret <64 x i8> %1
1798}
1799
1800define <16 x i32> @test_masked_v16i32(i8 * %addr, <16 x i32> %old, <16 x i32> %mask1) {
1801; SSE2-LABEL: test_masked_v16i32:
1802; SSE2:       # %bb.0:
1803; SSE2-NEXT:    movdqa %xmm0, %xmm10
1804; SSE2-NEXT:    pxor %xmm12, %xmm12
1805; SSE2-NEXT:    pcmpeqd %xmm12, %xmm7
1806; SSE2-NEXT:    pcmpeqd %xmm0, %xmm0
1807; SSE2-NEXT:    movdqa %xmm7, %xmm8
1808; SSE2-NEXT:    pxor %xmm0, %xmm8
1809; SSE2-NEXT:    pcmpeqd %xmm12, %xmm6
1810; SSE2-NEXT:    movdqa %xmm6, %xmm9
1811; SSE2-NEXT:    pxor %xmm0, %xmm9
1812; SSE2-NEXT:    pcmpeqd %xmm12, %xmm5
1813; SSE2-NEXT:    movdqa %xmm5, %xmm11
1814; SSE2-NEXT:    pxor %xmm0, %xmm11
1815; SSE2-NEXT:    pcmpeqd %xmm12, %xmm4
1816; SSE2-NEXT:    pxor %xmm4, %xmm0
1817; SSE2-NEXT:    pandn (%rdi), %xmm4
1818; SSE2-NEXT:    pandn %xmm10, %xmm0
1819; SSE2-NEXT:    por %xmm4, %xmm0
1820; SSE2-NEXT:    pandn 16(%rdi), %xmm5
1821; SSE2-NEXT:    pandn %xmm1, %xmm11
1822; SSE2-NEXT:    por %xmm5, %xmm11
1823; SSE2-NEXT:    pandn 32(%rdi), %xmm6
1824; SSE2-NEXT:    pandn %xmm2, %xmm9
1825; SSE2-NEXT:    por %xmm6, %xmm9
1826; SSE2-NEXT:    pandn 48(%rdi), %xmm7
1827; SSE2-NEXT:    pandn %xmm3, %xmm8
1828; SSE2-NEXT:    por %xmm7, %xmm8
1829; SSE2-NEXT:    movdqa %xmm11, %xmm1
1830; SSE2-NEXT:    movdqa %xmm9, %xmm2
1831; SSE2-NEXT:    movdqa %xmm8, %xmm3
1832; SSE2-NEXT:    retq
1833;
1834; SSE41-LABEL: test_masked_v16i32:
1835; SSE41:       # %bb.0:
1836; SSE41-NEXT:    movdqa %xmm0, %xmm8
1837; SSE41-NEXT:    pxor %xmm0, %xmm0
1838; SSE41-NEXT:    pcmpeqd %xmm0, %xmm7
1839; SSE41-NEXT:    pcmpeqd %xmm9, %xmm9
1840; SSE41-NEXT:    pxor %xmm9, %xmm7
1841; SSE41-NEXT:    pcmpeqd %xmm0, %xmm6
1842; SSE41-NEXT:    pxor %xmm9, %xmm6
1843; SSE41-NEXT:    pcmpeqd %xmm0, %xmm5
1844; SSE41-NEXT:    pxor %xmm9, %xmm5
1845; SSE41-NEXT:    pcmpeqd %xmm4, %xmm0
1846; SSE41-NEXT:    pxor %xmm9, %xmm0
1847; SSE41-NEXT:    movntdqa 48(%rdi), %xmm9
1848; SSE41-NEXT:    movntdqa 32(%rdi), %xmm10
1849; SSE41-NEXT:    movntdqa 16(%rdi), %xmm11
1850; SSE41-NEXT:    movntdqa (%rdi), %xmm4
1851; SSE41-NEXT:    blendvps %xmm0, %xmm4, %xmm8
1852; SSE41-NEXT:    movdqa %xmm5, %xmm0
1853; SSE41-NEXT:    blendvps %xmm0, %xmm11, %xmm1
1854; SSE41-NEXT:    movdqa %xmm6, %xmm0
1855; SSE41-NEXT:    blendvps %xmm0, %xmm10, %xmm2
1856; SSE41-NEXT:    movdqa %xmm7, %xmm0
1857; SSE41-NEXT:    blendvps %xmm0, %xmm9, %xmm3
1858; SSE41-NEXT:    movaps %xmm8, %xmm0
1859; SSE41-NEXT:    retq
1860;
1861; AVX1-LABEL: test_masked_v16i32:
1862; AVX1:       # %bb.0:
1863; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm4
1864; AVX1-NEXT:    vpxor %xmm5, %xmm5, %xmm5
1865; AVX1-NEXT:    vpcmpeqd %xmm5, %xmm4, %xmm4
1866; AVX1-NEXT:    vpcmpeqd %xmm6, %xmm6, %xmm6
1867; AVX1-NEXT:    vpxor %xmm6, %xmm4, %xmm4
1868; AVX1-NEXT:    vpcmpeqd %xmm5, %xmm3, %xmm3
1869; AVX1-NEXT:    vpxor %xmm6, %xmm3, %xmm3
1870; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm3, %ymm3
1871; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
1872; AVX1-NEXT:    vpcmpeqd %xmm5, %xmm4, %xmm4
1873; AVX1-NEXT:    vpxor %xmm6, %xmm4, %xmm4
1874; AVX1-NEXT:    vpcmpeqd %xmm5, %xmm2, %xmm2
1875; AVX1-NEXT:    vpxor %xmm6, %xmm2, %xmm2
1876; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm2, %ymm2
1877; AVX1-NEXT:    vmovntdqa 32(%rdi), %xmm4
1878; AVX1-NEXT:    vmovntdqa 48(%rdi), %xmm5
1879; AVX1-NEXT:    vinsertf128 $1, %xmm5, %ymm4, %ymm4
1880; AVX1-NEXT:    vblendvps %ymm3, %ymm4, %ymm1, %ymm1
1881; AVX1-NEXT:    vmovntdqa (%rdi), %xmm3
1882; AVX1-NEXT:    vmovntdqa 16(%rdi), %xmm4
1883; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm3, %ymm3
1884; AVX1-NEXT:    vblendvps %ymm2, %ymm3, %ymm0, %ymm0
1885; AVX1-NEXT:    retq
1886;
1887; AVX2-LABEL: test_masked_v16i32:
1888; AVX2:       # %bb.0:
1889; AVX2-NEXT:    vpxor %xmm4, %xmm4, %xmm4
1890; AVX2-NEXT:    vpcmpeqd %ymm4, %ymm3, %ymm3
1891; AVX2-NEXT:    vpcmpeqd %ymm5, %ymm5, %ymm5
1892; AVX2-NEXT:    vpxor %ymm5, %ymm3, %ymm3
1893; AVX2-NEXT:    vpcmpeqd %ymm4, %ymm2, %ymm2
1894; AVX2-NEXT:    vpxor %ymm5, %ymm2, %ymm2
1895; AVX2-NEXT:    vmovntdqa 32(%rdi), %ymm4
1896; AVX2-NEXT:    vblendvps %ymm3, %ymm4, %ymm1, %ymm1
1897; AVX2-NEXT:    vmovntdqa (%rdi), %ymm3
1898; AVX2-NEXT:    vblendvps %ymm2, %ymm3, %ymm0, %ymm0
1899; AVX2-NEXT:    retq
1900;
1901; AVX512-LABEL: test_masked_v16i32:
1902; AVX512:       # %bb.0:
1903; AVX512-NEXT:    vptestmd %zmm1, %zmm1, %k1
1904; AVX512-NEXT:    vmovntdqa (%rdi), %zmm1
1905; AVX512-NEXT:    vmovdqa32 %zmm1, %zmm0 {%k1}
1906; AVX512-NEXT:    retq
1907  %mask = icmp ne <16 x i32> %mask1, zeroinitializer
1908  %vaddr = bitcast i8* %addr to <16 x i32>*
1909  %r = load <16 x i32>, <16 x i32>* %vaddr, align 64, !nontemporal !1
1910  %res = select <16 x i1> %mask, <16 x i32> %r, <16 x i32> %old
1911  ret <16 x i32>%res
1912}
1913
1914!1 = !{i32 1}
1915