OSDN Git Service

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