llvm.org GIT mirror llvm / 209a267
[X86][SSE] Added nontemporal load tests These currently all lower to regular loads, generic nontemporal load support will be added in a future patch git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@271659 91177308-0d34-0410-b5e6-96231b3b80d8 Simon Pilgrim 4 years ago
1 changed file(s) with 776 addition(s) and 0 deletion(s). Raw diff Collapse all Expand all
0 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
1 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=SSE --check-prefix=SSE2
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=SSE --check-prefix=SSE41
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX1
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX --check-prefix=AVX2
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl | FileCheck %s --check-prefix=VLX
6
7 ; FIXME: Tests for nontemporal load support which was introduced in SSE41
8
9 define <4 x float> @test_v4f32(<4 x float>* %src) {
10 ; SSE-LABEL: test_v4f32:
11 ; SSE: # BB#0:
12 ; SSE-NEXT: movaps (%rdi), %xmm0
13 ; SSE-NEXT: retq
14 ;
15 ; AVX-LABEL: test_v4f32:
16 ; AVX: # BB#0:
17 ; AVX-NEXT: vmovaps (%rdi), %xmm0
18 ; AVX-NEXT: retq
19 ;
20 ; VLX-LABEL: test_v4f32:
21 ; VLX: # BB#0:
22 ; VLX-NEXT: vmovaps (%rdi), %xmm0
23 ; VLX-NEXT: retq
24 %1 = load <4 x float>, <4 x float>* %src, align 16, !nontemporal !1
25 ret <4 x float> %1
26 }
27
28 define <4 x i32> @test_v4i32(<4 x i32>* %src) {
29 ; SSE-LABEL: test_v4i32:
30 ; SSE: # BB#0:
31 ; SSE-NEXT: movaps (%rdi), %xmm0
32 ; SSE-NEXT: retq
33 ;
34 ; AVX-LABEL: test_v4i32:
35 ; AVX: # BB#0:
36 ; AVX-NEXT: vmovaps (%rdi), %xmm0
37 ; AVX-NEXT: retq
38 ;
39 ; VLX-LABEL: test_v4i32:
40 ; VLX: # BB#0:
41 ; VLX-NEXT: vmovdqa32 (%rdi), %xmm0
42 ; VLX-NEXT: retq
43 %1 = load <4 x i32>, <4 x i32>* %src, align 16, !nontemporal !1
44 ret <4 x i32> %1
45 }
46
47 define <2 x double> @test_v2f64(<2 x double>* %src) {
48 ; SSE-LABEL: test_v2f64:
49 ; SSE: # BB#0:
50 ; SSE-NEXT: movaps (%rdi), %xmm0
51 ; SSE-NEXT: retq
52 ;
53 ; AVX-LABEL: test_v2f64:
54 ; AVX: # BB#0:
55 ; AVX-NEXT: vmovaps (%rdi), %xmm0
56 ; AVX-NEXT: retq
57 ;
58 ; VLX-LABEL: test_v2f64:
59 ; VLX: # BB#0:
60 ; VLX-NEXT: vmovapd (%rdi), %xmm0
61 ; VLX-NEXT: retq
62 %1 = load <2 x double>, <2 x double>* %src, align 16, !nontemporal !1
63 ret <2 x double> %1
64 }
65
66 define <2 x i64> @test_v2i64(<2 x i64>* %src) {
67 ; SSE-LABEL: test_v2i64:
68 ; SSE: # BB#0:
69 ; SSE-NEXT: movaps (%rdi), %xmm0
70 ; SSE-NEXT: retq
71 ;
72 ; AVX-LABEL: test_v2i64:
73 ; AVX: # BB#0:
74 ; AVX-NEXT: vmovaps (%rdi), %xmm0
75 ; AVX-NEXT: retq
76 ;
77 ; VLX-LABEL: test_v2i64:
78 ; VLX: # BB#0:
79 ; VLX-NEXT: vmovdqa64 (%rdi), %xmm0
80 ; VLX-NEXT: retq
81 %1 = load <2 x i64>, <2 x i64>* %src, align 16, !nontemporal !1
82 ret <2 x i64> %1
83 }
84
85 define <8 x i16> @test_v8i16(<8 x i16>* %src) {
86 ; SSE-LABEL: test_v8i16:
87 ; SSE: # BB#0:
88 ; SSE-NEXT: movaps (%rdi), %xmm0
89 ; SSE-NEXT: retq
90 ;
91 ; AVX-LABEL: test_v8i16:
92 ; AVX: # BB#0:
93 ; AVX-NEXT: vmovaps (%rdi), %xmm0
94 ; AVX-NEXT: retq
95 ;
96 ; VLX-LABEL: test_v8i16:
97 ; VLX: # BB#0:
98 ; VLX-NEXT: vmovdqa64 (%rdi), %xmm0
99 ; VLX-NEXT: retq
100 %1 = load <8 x i16>, <8 x i16>* %src, align 16, !nontemporal !1
101 ret <8 x i16> %1
102 }
103
104 define <16 x i8> @test_v16i8(<16 x i8>* %src) {
105 ; SSE-LABEL: test_v16i8:
106 ; SSE: # BB#0:
107 ; SSE-NEXT: movaps (%rdi), %xmm0
108 ; SSE-NEXT: retq
109 ;
110 ; AVX-LABEL: test_v16i8:
111 ; AVX: # BB#0:
112 ; AVX-NEXT: vmovaps (%rdi), %xmm0
113 ; AVX-NEXT: retq
114 ;
115 ; VLX-LABEL: test_v16i8:
116 ; VLX: # BB#0:
117 ; VLX-NEXT: vmovdqa64 (%rdi), %xmm0
118 ; VLX-NEXT: retq
119 %1 = load <16 x i8>, <16 x i8>* %src, align 16, !nontemporal !1
120 ret <16 x i8> %1
121 }
122
123 ; And now YMM versions.
124
125 define <8 x float> @test_v8f32(<8 x float>* %src) {
126 ; SSE-LABEL: test_v8f32:
127 ; SSE: # BB#0:
128 ; SSE-NEXT: movaps (%rdi), %xmm0
129 ; SSE-NEXT: movaps 16(%rdi), %xmm1
130 ; SSE-NEXT: retq
131 ;
132 ; AVX-LABEL: test_v8f32:
133 ; AVX: # BB#0:
134 ; AVX-NEXT: vmovaps (%rdi), %ymm0
135 ; AVX-NEXT: retq
136 ;
137 ; VLX-LABEL: test_v8f32:
138 ; VLX: # BB#0:
139 ; VLX-NEXT: vmovaps (%rdi), %ymm0
140 ; VLX-NEXT: retq
141 %1 = load <8 x float>, <8 x float>* %src, align 32, !nontemporal !1
142 ret <8 x float> %1
143 }
144
145 define <8 x i32> @test_v8i32(<8 x i32>* %src) {
146 ; SSE-LABEL: test_v8i32:
147 ; SSE: # BB#0:
148 ; SSE-NEXT: movaps (%rdi), %xmm0
149 ; SSE-NEXT: movaps 16(%rdi), %xmm1
150 ; SSE-NEXT: retq
151 ;
152 ; AVX-LABEL: test_v8i32:
153 ; AVX: # BB#0:
154 ; AVX-NEXT: vmovaps (%rdi), %ymm0
155 ; AVX-NEXT: retq
156 ;
157 ; VLX-LABEL: test_v8i32:
158 ; VLX: # BB#0:
159 ; VLX-NEXT: vmovdqa32 (%rdi), %ymm0
160 ; VLX-NEXT: retq
161 %1 = load <8 x i32>, <8 x i32>* %src, align 32, !nontemporal !1
162 ret <8 x i32> %1
163 }
164
165 define <4 x double> @test_v4f64(<4 x double>* %src) {
166 ; SSE-LABEL: test_v4f64:
167 ; SSE: # BB#0:
168 ; SSE-NEXT: movaps (%rdi), %xmm0
169 ; SSE-NEXT: movaps 16(%rdi), %xmm1
170 ; SSE-NEXT: retq
171 ;
172 ; AVX-LABEL: test_v4f64:
173 ; AVX: # BB#0:
174 ; AVX-NEXT: vmovaps (%rdi), %ymm0
175 ; AVX-NEXT: retq
176 ;
177 ; VLX-LABEL: test_v4f64:
178 ; VLX: # BB#0:
179 ; VLX-NEXT: vmovapd (%rdi), %ymm0
180 ; VLX-NEXT: retq
181 %1 = load <4 x double>, <4 x double>* %src, align 32, !nontemporal !1
182 ret <4 x double> %1
183 }
184
185 define <4 x i64> @test_v4i64(<4 x i64>* %src) {
186 ; SSE-LABEL: test_v4i64:
187 ; SSE: # BB#0:
188 ; SSE-NEXT: movaps (%rdi), %xmm0
189 ; SSE-NEXT: movaps 16(%rdi), %xmm1
190 ; SSE-NEXT: retq
191 ;
192 ; AVX-LABEL: test_v4i64:
193 ; AVX: # BB#0:
194 ; AVX-NEXT: vmovaps (%rdi), %ymm0
195 ; AVX-NEXT: retq
196 ;
197 ; VLX-LABEL: test_v4i64:
198 ; VLX: # BB#0:
199 ; VLX-NEXT: vmovdqa64 (%rdi), %ymm0
200 ; VLX-NEXT: retq
201 %1 = load <4 x i64>, <4 x i64>* %src, align 32, !nontemporal !1
202 ret <4 x i64> %1
203 }
204
205 define <16 x i16> @test_v16i16(<16 x i16>* %src) {
206 ; SSE-LABEL: test_v16i16:
207 ; SSE: # BB#0:
208 ; SSE-NEXT: movaps (%rdi), %xmm0
209 ; SSE-NEXT: movaps 16(%rdi), %xmm1
210 ; SSE-NEXT: retq
211 ;
212 ; AVX-LABEL: test_v16i16:
213 ; AVX: # BB#0:
214 ; AVX-NEXT: vmovaps (%rdi), %ymm0
215 ; AVX-NEXT: retq
216 ;
217 ; VLX-LABEL: test_v16i16:
218 ; VLX: # BB#0:
219 ; VLX-NEXT: vmovdqa64 (%rdi), %ymm0
220 ; VLX-NEXT: retq
221 %1 = load <16 x i16>, <16 x i16>* %src, align 32, !nontemporal !1
222 ret <16 x i16> %1
223 }
224
225 define <32 x i8> @test_v32i8(<32 x i8>* %src) {
226 ; SSE-LABEL: test_v32i8:
227 ; SSE: # BB#0:
228 ; SSE-NEXT: movaps (%rdi), %xmm0
229 ; SSE-NEXT: movaps 16(%rdi), %xmm1
230 ; SSE-NEXT: retq
231 ;
232 ; AVX-LABEL: test_v32i8:
233 ; AVX: # BB#0:
234 ; AVX-NEXT: vmovaps (%rdi), %ymm0
235 ; AVX-NEXT: retq
236 ;
237 ; VLX-LABEL: test_v32i8:
238 ; VLX: # BB#0:
239 ; VLX-NEXT: vmovdqa64 (%rdi), %ymm0
240 ; VLX-NEXT: retq
241 %1 = load <32 x i8>, <32 x i8>* %src, align 32, !nontemporal !1
242 ret <32 x i8> %1
243 }
244
245
246 ; Check cases where the load would be folded.
247
248 define <4 x float> @test_arg_v4f32(<4 x float> %arg, <4 x float>* %src) {
249 ; SSE-LABEL: test_arg_v4f32:
250 ; SSE: # BB#0:
251 ; SSE-NEXT: addps (%rdi), %xmm0
252 ; SSE-NEXT: retq
253 ;
254 ; AVX-LABEL: test_arg_v4f32:
255 ; AVX: # BB#0:
256 ; AVX-NEXT: vaddps (%rdi), %xmm0, %xmm0
257 ; AVX-NEXT: retq
258 ;
259 ; VLX-LABEL: test_arg_v4f32:
260 ; VLX: # BB#0:
261 ; VLX-NEXT: vaddps (%rdi), %xmm0, %xmm0
262 ; VLX-NEXT: retq
263 %1 = load <4 x float>, <4 x float>* %src, align 16, !nontemporal !1
264 %2 = fadd <4 x float> %arg, %1
265 ret <4 x float> %2
266 }
267
268 define <4 x i32> @test_arg_v4i32(<4 x i32> %arg, <4 x i32>* %src) {
269 ; SSE-LABEL: test_arg_v4i32:
270 ; SSE: # BB#0:
271 ; SSE-NEXT: paddd (%rdi), %xmm0
272 ; SSE-NEXT: retq
273 ;
274 ; AVX-LABEL: test_arg_v4i32:
275 ; AVX: # BB#0:
276 ; AVX-NEXT: vpaddd (%rdi), %xmm0, %xmm0
277 ; AVX-NEXT: retq
278 ;
279 ; VLX-LABEL: test_arg_v4i32:
280 ; VLX: # BB#0:
281 ; VLX-NEXT: vpaddd (%rdi), %xmm0, %xmm0
282 ; VLX-NEXT: retq
283 %1 = load <4 x i32>, <4 x i32>* %src, align 16, !nontemporal !1
284 %2 = add <4 x i32> %arg, %1
285 ret <4 x i32> %2
286 }
287
288 define <2 x double> @test_arg_v2f64(<2 x double> %arg, <2 x double>* %src) {
289 ; SSE-LABEL: test_arg_v2f64:
290 ; SSE: # BB#0:
291 ; SSE-NEXT: addpd (%rdi), %xmm0
292 ; SSE-NEXT: retq
293 ;
294 ; AVX-LABEL: test_arg_v2f64:
295 ; AVX: # BB#0:
296 ; AVX-NEXT: vaddpd (%rdi), %xmm0, %xmm0
297 ; AVX-NEXT: retq
298 ;
299 ; VLX-LABEL: test_arg_v2f64:
300 ; VLX: # BB#0:
301 ; VLX-NEXT: vaddpd (%rdi), %xmm0, %xmm0
302 ; VLX-NEXT: retq
303 %1 = load <2 x double>, <2 x double>* %src, align 16, !nontemporal !1
304 %2 = fadd <2 x double> %arg, %1
305 ret <2 x double> %2
306 }
307
308 define <2 x i64> @test_arg_v2i64(<2 x i64> %arg, <2 x i64>* %src) {
309 ; SSE-LABEL: test_arg_v2i64:
310 ; SSE: # BB#0:
311 ; SSE-NEXT: paddq (%rdi), %xmm0
312 ; SSE-NEXT: retq
313 ;
314 ; AVX-LABEL: test_arg_v2i64:
315 ; AVX: # BB#0:
316 ; AVX-NEXT: vpaddq (%rdi), %xmm0, %xmm0
317 ; AVX-NEXT: retq
318 ;
319 ; VLX-LABEL: test_arg_v2i64:
320 ; VLX: # BB#0:
321 ; VLX-NEXT: vpaddq (%rdi), %xmm0, %xmm0
322 ; VLX-NEXT: retq
323 %1 = load <2 x i64>, <2 x i64>* %src, align 16, !nontemporal !1
324 %2 = add <2 x i64> %arg, %1
325 ret <2 x i64> %2
326 }
327
328 define <8 x i16> @test_arg_v8i16(<8 x i16> %arg, <8 x i16>* %src) {
329 ; SSE-LABEL: test_arg_v8i16:
330 ; SSE: # BB#0:
331 ; SSE-NEXT: paddw (%rdi), %xmm0
332 ; SSE-NEXT: retq
333 ;
334 ; AVX-LABEL: test_arg_v8i16:
335 ; AVX: # BB#0:
336 ; AVX-NEXT: vpaddw (%rdi), %xmm0, %xmm0
337 ; AVX-NEXT: retq
338 ;
339 ; VLX-LABEL: test_arg_v8i16:
340 ; VLX: # BB#0:
341 ; VLX-NEXT: vpaddw (%rdi), %xmm0, %xmm0
342 ; VLX-NEXT: retq
343 %1 = load <8 x i16>, <8 x i16>* %src, align 16, !nontemporal !1
344 %2 = add <8 x i16> %arg, %1
345 ret <8 x i16> %2
346 }
347
348 define <16 x i8> @test_arg_v16i8(<16 x i8> %arg, <16 x i8>* %src) {
349 ; SSE-LABEL: test_arg_v16i8:
350 ; SSE: # BB#0:
351 ; SSE-NEXT: paddb (%rdi), %xmm0
352 ; SSE-NEXT: retq
353 ;
354 ; AVX-LABEL: test_arg_v16i8:
355 ; AVX: # BB#0:
356 ; AVX-NEXT: vpaddb (%rdi), %xmm0, %xmm0
357 ; AVX-NEXT: retq
358 ;
359 ; VLX-LABEL: test_arg_v16i8:
360 ; VLX: # BB#0:
361 ; VLX-NEXT: vpaddb (%rdi), %xmm0, %xmm0
362 ; VLX-NEXT: retq
363 %1 = load <16 x i8>, <16 x i8>* %src, align 16, !nontemporal !1
364 %2 = add <16 x i8> %arg, %1
365 ret <16 x i8> %2
366 }
367
368 ; And now YMM versions.
369
370 define <8 x float> @test_arg_v8f32(<8 x float> %arg, <8 x float>* %src) {
371 ; SSE-LABEL: test_arg_v8f32:
372 ; SSE: # BB#0:
373 ; SSE-NEXT: addps (%rdi), %xmm0
374 ; SSE-NEXT: addps 16(%rdi), %xmm1
375 ; SSE-NEXT: retq
376 ;
377 ; AVX-LABEL: test_arg_v8f32:
378 ; AVX: # BB#0:
379 ; AVX-NEXT: vaddps (%rdi), %ymm0, %ymm0
380 ; AVX-NEXT: retq
381 ;
382 ; VLX-LABEL: test_arg_v8f32:
383 ; VLX: # BB#0:
384 ; VLX-NEXT: vaddps (%rdi), %ymm0, %ymm0
385 ; VLX-NEXT: retq
386 %1 = load <8 x float>, <8 x float>* %src, align 32, !nontemporal !1
387 %2 = fadd <8 x float> %arg, %1
388 ret <8 x float> %2
389 }
390
391 define <8 x i32> @test_arg_v8i32(<8 x i32> %arg, <8 x i32>* %src) {
392 ; SSE-LABEL: test_arg_v8i32:
393 ; SSE: # BB#0:
394 ; SSE-NEXT: paddd (%rdi), %xmm0
395 ; SSE-NEXT: paddd 16(%rdi), %xmm1
396 ; SSE-NEXT: retq
397 ;
398 ; AVX1-LABEL: test_arg_v8i32:
399 ; AVX1: # BB#0:
400 ; AVX1-NEXT: vmovaps (%rdi), %ymm1
401 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
402 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3
403 ; AVX1-NEXT: vpaddd %xmm3, %xmm2, %xmm2
404 ; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm0
405 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
406 ; AVX1-NEXT: retq
407 ;
408 ; AVX2-LABEL: test_arg_v8i32:
409 ; AVX2: # BB#0:
410 ; AVX2-NEXT: vpaddd (%rdi), %ymm0, %ymm0
411 ; AVX2-NEXT: retq
412 ;
413 ; VLX-LABEL: test_arg_v8i32:
414 ; VLX: # BB#0:
415 ; VLX-NEXT: vpaddd (%rdi), %ymm0, %ymm0
416 ; VLX-NEXT: retq
417 %1 = load <8 x i32>, <8 x i32>* %src, align 32, !nontemporal !1
418 %2 = add <8 x i32> %arg, %1
419 ret <8 x i32> %2
420 }
421
422 define <4 x double> @test_arg_v4f64(<4 x double> %arg, <4 x double>* %src) {
423 ; SSE-LABEL: test_arg_v4f64:
424 ; SSE: # BB#0:
425 ; SSE-NEXT: addpd (%rdi), %xmm0
426 ; SSE-NEXT: addpd 16(%rdi), %xmm1
427 ; SSE-NEXT: retq
428 ;
429 ; AVX-LABEL: test_arg_v4f64:
430 ; AVX: # BB#0:
431 ; AVX-NEXT: vaddpd (%rdi), %ymm0, %ymm0
432 ; AVX-NEXT: retq
433 ;
434 ; VLX-LABEL: test_arg_v4f64:
435 ; VLX: # BB#0:
436 ; VLX-NEXT: vaddpd (%rdi), %ymm0, %ymm0
437 ; VLX-NEXT: retq
438 %1 = load <4 x double>, <4 x double>* %src, align 32, !nontemporal !1
439 %2 = fadd <4 x double> %arg, %1
440 ret <4 x double> %2
441 }
442
443 define <4 x i64> @test_arg_v4i64(<4 x i64> %arg, <4 x i64>* %src) {
444 ; SSE-LABEL: test_arg_v4i64:
445 ; SSE: # BB#0:
446 ; SSE-NEXT: paddq (%rdi), %xmm0
447 ; SSE-NEXT: paddq 16(%rdi), %xmm1
448 ; SSE-NEXT: retq
449 ;
450 ; AVX1-LABEL: test_arg_v4i64:
451 ; AVX1: # BB#0:
452 ; AVX1-NEXT: vmovaps (%rdi), %ymm1
453 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
454 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3
455 ; AVX1-NEXT: vpaddq %xmm3, %xmm2, %xmm2
456 ; AVX1-NEXT: vpaddq %xmm1, %xmm0, %xmm0
457 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
458 ; AVX1-NEXT: retq
459 ;
460 ; AVX2-LABEL: test_arg_v4i64:
461 ; AVX2: # BB#0:
462 ; AVX2-NEXT: vpaddq (%rdi), %ymm0, %ymm0
463 ; AVX2-NEXT: retq
464 ;
465 ; VLX-LABEL: test_arg_v4i64:
466 ; VLX: # BB#0:
467 ; VLX-NEXT: vpaddq (%rdi), %ymm0, %ymm0
468 ; VLX-NEXT: retq
469 %1 = load <4 x i64>, <4 x i64>* %src, align 32, !nontemporal !1
470 %2 = add <4 x i64> %arg, %1
471 ret <4 x i64> %2
472 }
473
474 define <16 x i16> @test_arg_v16i16(<16 x i16> %arg, <16 x i16>* %src) {
475 ; SSE-LABEL: test_arg_v16i16:
476 ; SSE: # BB#0:
477 ; SSE-NEXT: paddw (%rdi), %xmm0
478 ; SSE-NEXT: paddw 16(%rdi), %xmm1
479 ; SSE-NEXT: retq
480 ;
481 ; AVX1-LABEL: test_arg_v16i16:
482 ; AVX1: # BB#0:
483 ; AVX1-NEXT: vmovaps (%rdi), %ymm1
484 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
485 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3
486 ; AVX1-NEXT: vpaddw %xmm3, %xmm2, %xmm2
487 ; AVX1-NEXT: vpaddw %xmm1, %xmm0, %xmm0
488 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
489 ; AVX1-NEXT: retq
490 ;
491 ; AVX2-LABEL: test_arg_v16i16:
492 ; AVX2: # BB#0:
493 ; AVX2-NEXT: vpaddw (%rdi), %ymm0, %ymm0
494 ; AVX2-NEXT: retq
495 ;
496 ; VLX-LABEL: test_arg_v16i16:
497 ; VLX: # BB#0:
498 ; VLX-NEXT: vpaddw (%rdi), %ymm0, %ymm0
499 ; VLX-NEXT: retq
500 %1 = load <16 x i16>, <16 x i16>* %src, align 32, !nontemporal !1
501 %2 = add <16 x i16> %arg, %1
502 ret <16 x i16> %2
503 }
504
505 define <32 x i8> @test_arg_v32i8(<32 x i8> %arg, <32 x i8>* %src) {
506 ; SSE-LABEL: test_arg_v32i8:
507 ; SSE: # BB#0:
508 ; SSE-NEXT: paddb (%rdi), %xmm0
509 ; SSE-NEXT: paddb 16(%rdi), %xmm1
510 ; SSE-NEXT: retq
511 ;
512 ; AVX1-LABEL: test_arg_v32i8:
513 ; AVX1: # BB#0:
514 ; AVX1-NEXT: vmovaps (%rdi), %ymm1
515 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
516 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3
517 ; AVX1-NEXT: vpaddb %xmm3, %xmm2, %xmm2
518 ; AVX1-NEXT: vpaddb %xmm1, %xmm0, %xmm0
519 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
520 ; AVX1-NEXT: retq
521 ;
522 ; AVX2-LABEL: test_arg_v32i8:
523 ; AVX2: # BB#0:
524 ; AVX2-NEXT: vpaddb (%rdi), %ymm0, %ymm0
525 ; AVX2-NEXT: retq
526 ;
527 ; VLX-LABEL: test_arg_v32i8:
528 ; VLX: # BB#0:
529 ; VLX-NEXT: vpaddb (%rdi), %ymm0, %ymm0
530 ; VLX-NEXT: retq
531 %1 = load <32 x i8>, <32 x i8>* %src, align 32, !nontemporal !1
532 %2 = add <32 x i8> %arg, %1
533 ret <32 x i8> %2
534 }
535
536
537 ; Unaligned non-temporal loads (not supported)
538
539 define <4 x float> @test_unaligned_v4f32(<4 x float>* %src) {
540 ; SSE-LABEL: test_unaligned_v4f32:
541 ; SSE: # BB#0:
542 ; SSE-NEXT: movups (%rdi), %xmm0
543 ; SSE-NEXT: retq
544 ;
545 ; AVX-LABEL: test_unaligned_v4f32:
546 ; AVX: # BB#0:
547 ; AVX-NEXT: vmovups (%rdi), %xmm0
548 ; AVX-NEXT: retq
549 ;
550 ; VLX-LABEL: test_unaligned_v4f32:
551 ; VLX: # BB#0:
552 ; VLX-NEXT: vmovups (%rdi), %xmm0
553 ; VLX-NEXT: retq
554 %1 = load <4 x float>, <4 x float>* %src, align 1, !nontemporal !1
555 ret <4 x float> %1
556 }
557
558 define <4 x i32> @test_unaligned_v4i32(<4 x i32>* %src) {
559 ; SSE-LABEL: test_unaligned_v4i32:
560 ; SSE: # BB#0:
561 ; SSE-NEXT: movups (%rdi), %xmm0
562 ; SSE-NEXT: retq
563 ;
564 ; AVX-LABEL: test_unaligned_v4i32:
565 ; AVX: # BB#0:
566 ; AVX-NEXT: vmovups (%rdi), %xmm0
567 ; AVX-NEXT: retq
568 ;
569 ; VLX-LABEL: test_unaligned_v4i32:
570 ; VLX: # BB#0:
571 ; VLX-NEXT: vmovdqu32 (%rdi), %xmm0
572 ; VLX-NEXT: retq
573 %1 = load <4 x i32>, <4 x i32>* %src, align 1, !nontemporal !1
574 ret <4 x i32> %1
575 }
576
577 define <2 x double> @test_unaligned_v2f64(<2 x double>* %src) {
578 ; SSE-LABEL: test_unaligned_v2f64:
579 ; SSE: # BB#0:
580 ; SSE-NEXT: movups (%rdi), %xmm0
581 ; SSE-NEXT: retq
582 ;
583 ; AVX-LABEL: test_unaligned_v2f64:
584 ; AVX: # BB#0:
585 ; AVX-NEXT: vmovups (%rdi), %xmm0
586 ; AVX-NEXT: retq
587 ;
588 ; VLX-LABEL: test_unaligned_v2f64:
589 ; VLX: # BB#0:
590 ; VLX-NEXT: vmovupd (%rdi), %xmm0
591 ; VLX-NEXT: retq
592 %1 = load <2 x double>, <2 x double>* %src, align 1, !nontemporal !1
593 ret <2 x double> %1
594 }
595
596 define <2 x i64> @test_unaligned_v2i64(<2 x i64>* %src) {
597 ; SSE-LABEL: test_unaligned_v2i64:
598 ; SSE: # BB#0:
599 ; SSE-NEXT: movups (%rdi), %xmm0
600 ; SSE-NEXT: retq
601 ;
602 ; AVX-LABEL: test_unaligned_v2i64:
603 ; AVX: # BB#0:
604 ; AVX-NEXT: vmovups (%rdi), %xmm0
605 ; AVX-NEXT: retq
606 ;
607 ; VLX-LABEL: test_unaligned_v2i64:
608 ; VLX: # BB#0:
609 ; VLX-NEXT: vmovdqu64 (%rdi), %xmm0
610 ; VLX-NEXT: retq
611 %1 = load <2 x i64>, <2 x i64>* %src, align 1, !nontemporal !1
612 ret <2 x i64> %1
613 }
614
615 define <8 x i16> @test_unaligned_v8i16(<8 x i16>* %src) {
616 ; SSE-LABEL: test_unaligned_v8i16:
617 ; SSE: # BB#0:
618 ; SSE-NEXT: movups (%rdi), %xmm0
619 ; SSE-NEXT: retq
620 ;
621 ; AVX-LABEL: test_unaligned_v8i16:
622 ; AVX: # BB#0:
623 ; AVX-NEXT: vmovups (%rdi), %xmm0
624 ; AVX-NEXT: retq
625 ;
626 ; VLX-LABEL: test_unaligned_v8i16:
627 ; VLX: # BB#0:
628 ; VLX-NEXT: vmovdqu64 (%rdi), %xmm0
629 ; VLX-NEXT: retq
630 %1 = load <8 x i16>, <8 x i16>* %src, align 1, !nontemporal !1
631 ret <8 x i16> %1
632 }
633
634 define <16 x i8> @test_unaligned_v16i8(<16 x i8>* %src) {
635 ; SSE-LABEL: test_unaligned_v16i8:
636 ; SSE: # BB#0:
637 ; SSE-NEXT: movups (%rdi), %xmm0
638 ; SSE-NEXT: retq
639 ;
640 ; AVX-LABEL: test_unaligned_v16i8:
641 ; AVX: # BB#0:
642 ; AVX-NEXT: vmovups (%rdi), %xmm0
643 ; AVX-NEXT: retq
644 ;
645 ; VLX-LABEL: test_unaligned_v16i8:
646 ; VLX: # BB#0:
647 ; VLX-NEXT: vmovdqu64 (%rdi), %xmm0
648 ; VLX-NEXT: retq
649 %1 = load <16 x i8>, <16 x i8>* %src, align 1, !nontemporal !1
650 ret <16 x i8> %1
651 }
652
653 ; And now YMM versions.
654
655 define <8 x float> @test_unaligned_v8f32(<8 x float>* %src) {
656 ; SSE-LABEL: test_unaligned_v8f32:
657 ; SSE: # BB#0:
658 ; SSE-NEXT: movups (%rdi), %xmm0
659 ; SSE-NEXT: movups 16(%rdi), %xmm1
660 ; SSE-NEXT: retq
661 ;
662 ; AVX-LABEL: test_unaligned_v8f32:
663 ; AVX: # BB#0:
664 ; AVX-NEXT: vmovups (%rdi), %ymm0
665 ; AVX-NEXT: retq
666 ;
667 ; VLX-LABEL: test_unaligned_v8f32:
668 ; VLX: # BB#0:
669 ; VLX-NEXT: vmovups (%rdi), %ymm0
670 ; VLX-NEXT: retq
671 %1 = load <8 x float>, <8 x float>* %src, align 1, !nontemporal !1
672 ret <8 x float> %1
673 }
674
675 define <8 x i32> @test_unaligned_v8i32(<8 x i32>* %src) {
676 ; SSE-LABEL: test_unaligned_v8i32:
677 ; SSE: # BB#0:
678 ; SSE-NEXT: movups (%rdi), %xmm0
679 ; SSE-NEXT: movups 16(%rdi), %xmm1
680 ; SSE-NEXT: retq
681 ;
682 ; AVX-LABEL: test_unaligned_v8i32:
683 ; AVX: # BB#0:
684 ; AVX-NEXT: vmovups (%rdi), %ymm0
685 ; AVX-NEXT: retq
686 ;
687 ; VLX-LABEL: test_unaligned_v8i32:
688 ; VLX: # BB#0:
689 ; VLX-NEXT: vmovdqu32 (%rdi), %ymm0
690 ; VLX-NEXT: retq
691 %1 = load <8 x i32>, <8 x i32>* %src, align 1, !nontemporal !1
692 ret <8 x i32> %1
693 }
694
695 define <4 x double> @test_unaligned_v4f64(<4 x double>* %src) {
696 ; SSE-LABEL: test_unaligned_v4f64:
697 ; SSE: # BB#0:
698 ; SSE-NEXT: movups (%rdi), %xmm0
699 ; SSE-NEXT: movups 16(%rdi), %xmm1
700 ; SSE-NEXT: retq
701 ;
702 ; AVX-LABEL: test_unaligned_v4f64:
703 ; AVX: # BB#0:
704 ; AVX-NEXT: vmovups (%rdi), %ymm0
705 ; AVX-NEXT: retq
706 ;
707 ; VLX-LABEL: test_unaligned_v4f64:
708 ; VLX: # BB#0:
709 ; VLX-NEXT: vmovupd (%rdi), %ymm0
710 ; VLX-NEXT: retq
711 %1 = load <4 x double>, <4 x double>* %src, align 1, !nontemporal !1
712 ret <4 x double> %1
713 }
714
715 define <4 x i64> @test_unaligned_v4i64(<4 x i64>* %src) {
716 ; SSE-LABEL: test_unaligned_v4i64:
717 ; SSE: # BB#0:
718 ; SSE-NEXT: movups (%rdi), %xmm0
719 ; SSE-NEXT: movups 16(%rdi), %xmm1
720 ; SSE-NEXT: retq
721 ;
722 ; AVX-LABEL: test_unaligned_v4i64:
723 ; AVX: # BB#0:
724 ; AVX-NEXT: vmovups (%rdi), %ymm0
725 ; AVX-NEXT: retq
726 ;
727 ; VLX-LABEL: test_unaligned_v4i64:
728 ; VLX: # BB#0:
729 ; VLX-NEXT: vmovdqu64 (%rdi), %ymm0
730 ; VLX-NEXT: retq
731 %1 = load <4 x i64>, <4 x i64>* %src, align 1, !nontemporal !1
732 ret <4 x i64> %1
733 }
734
735 define <16 x i16> @test_unaligned_v16i16(<16 x i16>* %src) {
736 ; SSE-LABEL: test_unaligned_v16i16:
737 ; SSE: # BB#0:
738 ; SSE-NEXT: movups (%rdi), %xmm0
739 ; SSE-NEXT: movups 16(%rdi), %xmm1
740 ; SSE-NEXT: retq
741 ;
742 ; AVX-LABEL: test_unaligned_v16i16:
743 ; AVX: # BB#0:
744 ; AVX-NEXT: vmovups (%rdi), %ymm0
745 ; AVX-NEXT: retq
746 ;
747 ; VLX-LABEL: test_unaligned_v16i16:
748 ; VLX: # BB#0:
749 ; VLX-NEXT: vmovdqu64 (%rdi), %ymm0
750 ; VLX-NEXT: retq
751 %1 = load <16 x i16>, <16 x i16>* %src, align 1, !nontemporal !1
752 ret <16 x i16> %1
753 }
754
755 define <32 x i8> @test_unaligned_v32i8(<32 x i8>* %src) {
756 ; SSE-LABEL: test_unaligned_v32i8:
757 ; SSE: # BB#0:
758 ; SSE-NEXT: movups (%rdi), %xmm0
759 ; SSE-NEXT: movups 16(%rdi), %xmm1
760 ; SSE-NEXT: retq
761 ;
762 ; AVX-LABEL: test_unaligned_v32i8:
763 ; AVX: # BB#0:
764 ; AVX-NEXT: vmovups (%rdi), %ymm0
765 ; AVX-NEXT: retq
766 ;
767 ; VLX-LABEL: test_unaligned_v32i8:
768 ; VLX: # BB#0:
769 ; VLX-NEXT: vmovdqu64 (%rdi), %ymm0
770 ; VLX-NEXT: retq
771 %1 = load <32 x i8>, <32 x i8>* %src, align 1, !nontemporal !1
772 ret <32 x i8> %1
773 }
774
775 !1 = !{i32 1}