Revert r354244 "[DAGCombiner] Eliminate dead stores to stack."
[llvm-complete.git] / test / CodeGen / X86 / fast-isel-store.ll
blob1b91fcbbcfbbb9e4db2dbda0dd3970159e8783d4
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=x86_64-none-linux -fast-isel -fast-isel-abort=1 -mattr=+sse2 < %s | FileCheck %s --check-prefix=ALL32 --check-prefix=SSE32
3 ; RUN: llc -mtriple=i686-none-linux -fast-isel -fast-isel-abort=1 -mattr=+sse2 < %s | FileCheck %s --check-prefix=ALL64 --check-prefix=SSE64
4 ; RUN: llc -mtriple=x86_64-none-linux -fast-isel -fast-isel-abort=1 -mattr=+avx < %s | FileCheck %s --check-prefix=ALL32 --check-prefix=AVX32 --check-prefix=AVXONLY32
5 ; RUN: llc -mtriple=i686-none-linux -fast-isel -fast-isel-abort=1 -mattr=+avx < %s | FileCheck %s --check-prefix=ALL64 --check-prefix=AVX64 --check-prefix=AVXONLY64
6 ; RUN: llc -mtriple=x86_64-none-linux -fast-isel -fast-isel-abort=1 -mattr=+avx512f < %s | FileCheck %s --check-prefix=ALL32 --check-prefix=AVX32 --check-prefix=AVX51232 --check-prefix=KNL32
7 ; RUN: llc -mtriple=i686-none-linux -fast-isel -fast-isel-abort=1 -mattr=+avx512f < %s | FileCheck %s --check-prefix=ALL64 --check-prefix=AVX64 --check-prefix=AVX51264 --check-prefix=KNL64
8 ; RUN: llc -mtriple=x86_64-none-linux -fast-isel -fast-isel-abort=1 -mattr=+avx512vl,+avx512dq,+avx512bw < %s | FileCheck %s --check-prefix=ALL32 --check-prefix=AVX32 --check-prefix=AVX51232 --check-prefix=SKX32
9 ; RUN: llc -mtriple=i686-none-linux -fast-isel -fast-isel-abort=1 -mattr=+avx512f,+avx512dq,+avx512bw < %s | FileCheck %s --check-prefix=ALL64 --check-prefix=AVX64 --check-prefix=AVX51264 --check-prefix=SKX64
11 define i32 @test_store_32(i32* nocapture %addr, i32 %value) {
12 ; ALL32-LABEL: test_store_32:
13 ; ALL32:       # %bb.0: # %entry
14 ; ALL32-NEXT:    movl %esi, %eax
15 ; ALL32-NEXT:    movl %esi, (%rdi)
16 ; ALL32-NEXT:    retq
18 ; ALL64-LABEL: test_store_32:
19 ; ALL64:       # %bb.0: # %entry
20 ; ALL64-NEXT:    movl {{[0-9]+}}(%esp), %eax
21 ; ALL64-NEXT:    movl {{[0-9]+}}(%esp), %ecx
22 ; ALL64-NEXT:    movl %eax, (%ecx)
23 ; ALL64-NEXT:    retl
24 entry:
25   store i32 %value, i32* %addr, align 1
26   ret i32 %value
29 define i16 @test_store_16(i16* nocapture %addr, i16 %value) {
30 ; ALL32-LABEL: test_store_16:
31 ; ALL32:       # %bb.0: # %entry
32 ; ALL32-NEXT:    movl %esi, %eax
33 ; ALL32-NEXT:    movw %ax, (%rdi)
34 ; ALL32-NEXT:    # kill: def $ax killed $ax killed $eax
35 ; ALL32-NEXT:    retq
37 ; ALL64-LABEL: test_store_16:
38 ; ALL64:       # %bb.0: # %entry
39 ; ALL64-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
40 ; ALL64-NEXT:    movl {{[0-9]+}}(%esp), %ecx
41 ; ALL64-NEXT:    movw %ax, (%ecx)
42 ; ALL64-NEXT:    retl
43 entry:
44   store i16 %value, i16* %addr, align 1
45   ret i16 %value
48 define <4 x i32> @test_store_4xi32(<4 x i32>* nocapture %addr, <4 x i32> %value, <4 x i32> %value2) {
49 ; SSE32-LABEL: test_store_4xi32:
50 ; SSE32:       # %bb.0:
51 ; SSE32-NEXT:    paddd %xmm1, %xmm0
52 ; SSE32-NEXT:    movdqu %xmm0, (%rdi)
53 ; SSE32-NEXT:    retq
55 ; SSE64-LABEL: test_store_4xi32:
56 ; SSE64:       # %bb.0:
57 ; SSE64-NEXT:    movl {{[0-9]+}}(%esp), %eax
58 ; SSE64-NEXT:    paddd %xmm1, %xmm0
59 ; SSE64-NEXT:    movdqu %xmm0, (%eax)
60 ; SSE64-NEXT:    retl
62 ; AVX32-LABEL: test_store_4xi32:
63 ; AVX32:       # %bb.0:
64 ; AVX32-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
65 ; AVX32-NEXT:    vmovdqu %xmm0, (%rdi)
66 ; AVX32-NEXT:    retq
68 ; AVX64-LABEL: test_store_4xi32:
69 ; AVX64:       # %bb.0:
70 ; AVX64-NEXT:    movl {{[0-9]+}}(%esp), %eax
71 ; AVX64-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
72 ; AVX64-NEXT:    vmovdqu %xmm0, (%eax)
73 ; AVX64-NEXT:    retl
74   %foo = add <4 x i32> %value, %value2 ; to force integer type on store
75   store <4 x i32> %foo, <4 x i32>* %addr, align 1
76   ret <4 x i32> %foo
79 define <4 x i32> @test_store_4xi32_aligned(<4 x i32>* nocapture %addr, <4 x i32> %value, <4 x i32> %value2) {
80 ; SSE32-LABEL: test_store_4xi32_aligned:
81 ; SSE32:       # %bb.0:
82 ; SSE32-NEXT:    paddd %xmm1, %xmm0
83 ; SSE32-NEXT:    movdqa %xmm0, (%rdi)
84 ; SSE32-NEXT:    retq
86 ; SSE64-LABEL: test_store_4xi32_aligned:
87 ; SSE64:       # %bb.0:
88 ; SSE64-NEXT:    movl {{[0-9]+}}(%esp), %eax
89 ; SSE64-NEXT:    paddd %xmm1, %xmm0
90 ; SSE64-NEXT:    movdqa %xmm0, (%eax)
91 ; SSE64-NEXT:    retl
93 ; AVX32-LABEL: test_store_4xi32_aligned:
94 ; AVX32:       # %bb.0:
95 ; AVX32-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
96 ; AVX32-NEXT:    vmovdqa %xmm0, (%rdi)
97 ; AVX32-NEXT:    retq
99 ; AVX64-LABEL: test_store_4xi32_aligned:
100 ; AVX64:       # %bb.0:
101 ; AVX64-NEXT:    movl {{[0-9]+}}(%esp), %eax
102 ; AVX64-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
103 ; AVX64-NEXT:    vmovdqa %xmm0, (%eax)
104 ; AVX64-NEXT:    retl
105   %foo = add <4 x i32> %value, %value2 ; to force integer type on store
106   store <4 x i32> %foo, <4 x i32>* %addr, align 16
107   ret <4 x i32> %foo
110 define <4 x float> @test_store_4xf32(<4 x float>* nocapture %addr, <4 x float> %value) {
111 ; SSE32-LABEL: test_store_4xf32:
112 ; SSE32:       # %bb.0:
113 ; SSE32-NEXT:    movups %xmm0, (%rdi)
114 ; SSE32-NEXT:    retq
116 ; SSE64-LABEL: test_store_4xf32:
117 ; SSE64:       # %bb.0:
118 ; SSE64-NEXT:    movl {{[0-9]+}}(%esp), %eax
119 ; SSE64-NEXT:    movups %xmm0, (%eax)
120 ; SSE64-NEXT:    retl
122 ; AVX32-LABEL: test_store_4xf32:
123 ; AVX32:       # %bb.0:
124 ; AVX32-NEXT:    vmovups %xmm0, (%rdi)
125 ; AVX32-NEXT:    retq
127 ; AVX64-LABEL: test_store_4xf32:
128 ; AVX64:       # %bb.0:
129 ; AVX64-NEXT:    movl {{[0-9]+}}(%esp), %eax
130 ; AVX64-NEXT:    vmovups %xmm0, (%eax)
131 ; AVX64-NEXT:    retl
132   store <4 x float> %value, <4 x float>* %addr, align 1
133   ret <4 x float> %value
136 define <4 x float> @test_store_4xf32_aligned(<4 x float>* nocapture %addr, <4 x float> %value) {
137 ; SSE32-LABEL: test_store_4xf32_aligned:
138 ; SSE32:       # %bb.0:
139 ; SSE32-NEXT:    movaps %xmm0, (%rdi)
140 ; SSE32-NEXT:    retq
142 ; SSE64-LABEL: test_store_4xf32_aligned:
143 ; SSE64:       # %bb.0:
144 ; SSE64-NEXT:    movl {{[0-9]+}}(%esp), %eax
145 ; SSE64-NEXT:    movaps %xmm0, (%eax)
146 ; SSE64-NEXT:    retl
148 ; AVX32-LABEL: test_store_4xf32_aligned:
149 ; AVX32:       # %bb.0:
150 ; AVX32-NEXT:    vmovaps %xmm0, (%rdi)
151 ; AVX32-NEXT:    retq
153 ; AVX64-LABEL: test_store_4xf32_aligned:
154 ; AVX64:       # %bb.0:
155 ; AVX64-NEXT:    movl {{[0-9]+}}(%esp), %eax
156 ; AVX64-NEXT:    vmovaps %xmm0, (%eax)
157 ; AVX64-NEXT:    retl
158   store <4 x float> %value, <4 x float>* %addr, align 16
159   ret <4 x float> %value
162 define <2 x double> @test_store_2xf64(<2 x double>* nocapture %addr, <2 x double> %value, <2 x double> %value2) {
163 ; SSE32-LABEL: test_store_2xf64:
164 ; SSE32:       # %bb.0:
165 ; SSE32-NEXT:    addpd %xmm1, %xmm0
166 ; SSE32-NEXT:    movupd %xmm0, (%rdi)
167 ; SSE32-NEXT:    retq
169 ; SSE64-LABEL: test_store_2xf64:
170 ; SSE64:       # %bb.0:
171 ; SSE64-NEXT:    movl {{[0-9]+}}(%esp), %eax
172 ; SSE64-NEXT:    addpd %xmm1, %xmm0
173 ; SSE64-NEXT:    movupd %xmm0, (%eax)
174 ; SSE64-NEXT:    retl
176 ; AVX32-LABEL: test_store_2xf64:
177 ; AVX32:       # %bb.0:
178 ; AVX32-NEXT:    vaddpd %xmm1, %xmm0, %xmm0
179 ; AVX32-NEXT:    vmovupd %xmm0, (%rdi)
180 ; AVX32-NEXT:    retq
182 ; AVX64-LABEL: test_store_2xf64:
183 ; AVX64:       # %bb.0:
184 ; AVX64-NEXT:    movl {{[0-9]+}}(%esp), %eax
185 ; AVX64-NEXT:    vaddpd %xmm1, %xmm0, %xmm0
186 ; AVX64-NEXT:    vmovupd %xmm0, (%eax)
187 ; AVX64-NEXT:    retl
188   %foo = fadd <2 x double> %value, %value2 ; to force dobule type on store
189   store <2 x double> %foo, <2 x double>* %addr, align 1
190   ret <2 x double> %foo
193 define <2 x double> @test_store_2xf64_aligned(<2 x double>* nocapture %addr, <2 x double> %value, <2 x double> %value2) {
194 ; SSE32-LABEL: test_store_2xf64_aligned:
195 ; SSE32:       # %bb.0:
196 ; SSE32-NEXT:    addpd %xmm1, %xmm0
197 ; SSE32-NEXT:    movapd %xmm0, (%rdi)
198 ; SSE32-NEXT:    retq
200 ; SSE64-LABEL: test_store_2xf64_aligned:
201 ; SSE64:       # %bb.0:
202 ; SSE64-NEXT:    movl {{[0-9]+}}(%esp), %eax
203 ; SSE64-NEXT:    addpd %xmm1, %xmm0
204 ; SSE64-NEXT:    movapd %xmm0, (%eax)
205 ; SSE64-NEXT:    retl
207 ; AVX32-LABEL: test_store_2xf64_aligned:
208 ; AVX32:       # %bb.0:
209 ; AVX32-NEXT:    vaddpd %xmm1, %xmm0, %xmm0
210 ; AVX32-NEXT:    vmovapd %xmm0, (%rdi)
211 ; AVX32-NEXT:    retq
213 ; AVX64-LABEL: test_store_2xf64_aligned:
214 ; AVX64:       # %bb.0:
215 ; AVX64-NEXT:    movl {{[0-9]+}}(%esp), %eax
216 ; AVX64-NEXT:    vaddpd %xmm1, %xmm0, %xmm0
217 ; AVX64-NEXT:    vmovapd %xmm0, (%eax)
218 ; AVX64-NEXT:    retl
219   %foo = fadd <2 x double> %value, %value2 ; to force dobule type on store
220   store <2 x double> %foo, <2 x double>* %addr, align 16
221   ret <2 x double> %foo
224 define <8 x i32> @test_store_8xi32(<8 x i32>* nocapture %addr, <8 x i32> %value) {
225 ; SSE32-LABEL: test_store_8xi32:
226 ; SSE32:       # %bb.0:
227 ; SSE32-NEXT:    movups %xmm0, (%rdi)
228 ; SSE32-NEXT:    movups %xmm1, 16(%rdi)
229 ; SSE32-NEXT:    retq
231 ; SSE64-LABEL: test_store_8xi32:
232 ; SSE64:       # %bb.0:
233 ; SSE64-NEXT:    movl {{[0-9]+}}(%esp), %eax
234 ; SSE64-NEXT:    movups %xmm0, (%eax)
235 ; SSE64-NEXT:    movups %xmm1, 16(%eax)
236 ; SSE64-NEXT:    retl
238 ; AVX32-LABEL: test_store_8xi32:
239 ; AVX32:       # %bb.0:
240 ; AVX32-NEXT:    vmovups %ymm0, (%rdi)
241 ; AVX32-NEXT:    retq
243 ; AVX64-LABEL: test_store_8xi32:
244 ; AVX64:       # %bb.0:
245 ; AVX64-NEXT:    movl {{[0-9]+}}(%esp), %eax
246 ; AVX64-NEXT:    vmovups %ymm0, (%eax)
247 ; AVX64-NEXT:    retl
248   store <8 x i32> %value, <8 x i32>* %addr, align 1
249   ret <8 x i32> %value
252 define <8 x i32> @test_store_8xi32_aligned(<8 x i32>* nocapture %addr, <8 x i32> %value) {
253 ; SSE32-LABEL: test_store_8xi32_aligned:
254 ; SSE32:       # %bb.0:
255 ; SSE32-NEXT:    movaps %xmm0, (%rdi)
256 ; SSE32-NEXT:    movaps %xmm1, 16(%rdi)
257 ; SSE32-NEXT:    retq
259 ; SSE64-LABEL: test_store_8xi32_aligned:
260 ; SSE64:       # %bb.0:
261 ; SSE64-NEXT:    movl {{[0-9]+}}(%esp), %eax
262 ; SSE64-NEXT:    movaps %xmm0, (%eax)
263 ; SSE64-NEXT:    movaps %xmm1, 16(%eax)
264 ; SSE64-NEXT:    retl
266 ; AVX32-LABEL: test_store_8xi32_aligned:
267 ; AVX32:       # %bb.0:
268 ; AVX32-NEXT:    vmovaps %ymm0, (%rdi)
269 ; AVX32-NEXT:    retq
271 ; AVX64-LABEL: test_store_8xi32_aligned:
272 ; AVX64:       # %bb.0:
273 ; AVX64-NEXT:    movl {{[0-9]+}}(%esp), %eax
274 ; AVX64-NEXT:    vmovaps %ymm0, (%eax)
275 ; AVX64-NEXT:    retl
276   store <8 x i32> %value, <8 x i32>* %addr, align 32
277   ret <8 x i32> %value
280 define <8 x float> @test_store_8xf32(<8 x float>* nocapture %addr, <8 x float> %value) {
281 ; SSE32-LABEL: test_store_8xf32:
282 ; SSE32:       # %bb.0:
283 ; SSE32-NEXT:    movups %xmm0, (%rdi)
284 ; SSE32-NEXT:    movups %xmm1, 16(%rdi)
285 ; SSE32-NEXT:    retq
287 ; SSE64-LABEL: test_store_8xf32:
288 ; SSE64:       # %bb.0:
289 ; SSE64-NEXT:    movl {{[0-9]+}}(%esp), %eax
290 ; SSE64-NEXT:    movups %xmm0, (%eax)
291 ; SSE64-NEXT:    movups %xmm1, 16(%eax)
292 ; SSE64-NEXT:    retl
294 ; AVX32-LABEL: test_store_8xf32:
295 ; AVX32:       # %bb.0:
296 ; AVX32-NEXT:    vmovups %ymm0, (%rdi)
297 ; AVX32-NEXT:    retq
299 ; AVX64-LABEL: test_store_8xf32:
300 ; AVX64:       # %bb.0:
301 ; AVX64-NEXT:    movl {{[0-9]+}}(%esp), %eax
302 ; AVX64-NEXT:    vmovups %ymm0, (%eax)
303 ; AVX64-NEXT:    retl
304   store <8 x float> %value, <8 x float>* %addr, align 1
305   ret <8 x float> %value
308 define <8 x float> @test_store_8xf32_aligned(<8 x float>* nocapture %addr, <8 x float> %value) {
309 ; SSE32-LABEL: test_store_8xf32_aligned:
310 ; SSE32:       # %bb.0:
311 ; SSE32-NEXT:    movaps %xmm0, (%rdi)
312 ; SSE32-NEXT:    movaps %xmm1, 16(%rdi)
313 ; SSE32-NEXT:    retq
315 ; SSE64-LABEL: test_store_8xf32_aligned:
316 ; SSE64:       # %bb.0:
317 ; SSE64-NEXT:    movl {{[0-9]+}}(%esp), %eax
318 ; SSE64-NEXT:    movaps %xmm0, (%eax)
319 ; SSE64-NEXT:    movaps %xmm1, 16(%eax)
320 ; SSE64-NEXT:    retl
322 ; AVX32-LABEL: test_store_8xf32_aligned:
323 ; AVX32:       # %bb.0:
324 ; AVX32-NEXT:    vmovaps %ymm0, (%rdi)
325 ; AVX32-NEXT:    retq
327 ; AVX64-LABEL: test_store_8xf32_aligned:
328 ; AVX64:       # %bb.0:
329 ; AVX64-NEXT:    movl {{[0-9]+}}(%esp), %eax
330 ; AVX64-NEXT:    vmovaps %ymm0, (%eax)
331 ; AVX64-NEXT:    retl
332   store <8 x float> %value, <8 x float>* %addr, align 32
333   ret <8 x float> %value
336 define <4 x double> @test_store_4xf64(<4 x double>* nocapture %addr, <4 x double> %value, <4 x double> %value2) {
337 ; SSE32-LABEL: test_store_4xf64:
338 ; SSE32:       # %bb.0:
339 ; SSE32-NEXT:    addpd %xmm3, %xmm1
340 ; SSE32-NEXT:    addpd %xmm2, %xmm0
341 ; SSE32-NEXT:    movupd %xmm0, (%rdi)
342 ; SSE32-NEXT:    movupd %xmm1, 16(%rdi)
343 ; SSE32-NEXT:    retq
345 ; SSE64-LABEL: test_store_4xf64:
346 ; SSE64:       # %bb.0:
347 ; SSE64-NEXT:    subl $12, %esp
348 ; SSE64-NEXT:    .cfi_def_cfa_offset 16
349 ; SSE64-NEXT:    movl {{[0-9]+}}(%esp), %eax
350 ; SSE64-NEXT:    addpd {{[0-9]+}}(%esp), %xmm1
351 ; SSE64-NEXT:    addpd %xmm2, %xmm0
352 ; SSE64-NEXT:    movupd %xmm0, (%eax)
353 ; SSE64-NEXT:    movupd %xmm1, 16(%eax)
354 ; SSE64-NEXT:    addl $12, %esp
355 ; SSE64-NEXT:    .cfi_def_cfa_offset 4
356 ; SSE64-NEXT:    retl
358 ; AVX32-LABEL: test_store_4xf64:
359 ; AVX32:       # %bb.0:
360 ; AVX32-NEXT:    vaddpd %ymm1, %ymm0, %ymm0
361 ; AVX32-NEXT:    vmovupd %ymm0, (%rdi)
362 ; AVX32-NEXT:    retq
364 ; AVX64-LABEL: test_store_4xf64:
365 ; AVX64:       # %bb.0:
366 ; AVX64-NEXT:    movl {{[0-9]+}}(%esp), %eax
367 ; AVX64-NEXT:    vaddpd %ymm1, %ymm0, %ymm0
368 ; AVX64-NEXT:    vmovupd %ymm0, (%eax)
369 ; AVX64-NEXT:    retl
370   %foo = fadd <4 x double> %value, %value2 ; to force dobule type on store
371   store <4 x double> %foo, <4 x double>* %addr, align 1
372   ret <4 x double> %foo
375 define <4 x double> @test_store_4xf64_aligned(<4 x double>* nocapture %addr, <4 x double> %value, <4 x double> %value2) {
376 ; SSE32-LABEL: test_store_4xf64_aligned:
377 ; SSE32:       # %bb.0:
378 ; SSE32-NEXT:    addpd %xmm3, %xmm1
379 ; SSE32-NEXT:    addpd %xmm2, %xmm0
380 ; SSE32-NEXT:    movapd %xmm0, (%rdi)
381 ; SSE32-NEXT:    movapd %xmm1, 16(%rdi)
382 ; SSE32-NEXT:    retq
384 ; SSE64-LABEL: test_store_4xf64_aligned:
385 ; SSE64:       # %bb.0:
386 ; SSE64-NEXT:    subl $12, %esp
387 ; SSE64-NEXT:    .cfi_def_cfa_offset 16
388 ; SSE64-NEXT:    movl {{[0-9]+}}(%esp), %eax
389 ; SSE64-NEXT:    addpd {{[0-9]+}}(%esp), %xmm1
390 ; SSE64-NEXT:    addpd %xmm2, %xmm0
391 ; SSE64-NEXT:    movapd %xmm0, (%eax)
392 ; SSE64-NEXT:    movapd %xmm1, 16(%eax)
393 ; SSE64-NEXT:    addl $12, %esp
394 ; SSE64-NEXT:    .cfi_def_cfa_offset 4
395 ; SSE64-NEXT:    retl
397 ; AVX32-LABEL: test_store_4xf64_aligned:
398 ; AVX32:       # %bb.0:
399 ; AVX32-NEXT:    vaddpd %ymm1, %ymm0, %ymm0
400 ; AVX32-NEXT:    vmovapd %ymm0, (%rdi)
401 ; AVX32-NEXT:    retq
403 ; AVX64-LABEL: test_store_4xf64_aligned:
404 ; AVX64:       # %bb.0:
405 ; AVX64-NEXT:    movl {{[0-9]+}}(%esp), %eax
406 ; AVX64-NEXT:    vaddpd %ymm1, %ymm0, %ymm0
407 ; AVX64-NEXT:    vmovapd %ymm0, (%eax)
408 ; AVX64-NEXT:    retl
409   %foo = fadd <4 x double> %value, %value2 ; to force dobule type on store
410   store <4 x double> %foo, <4 x double>* %addr, align 32
411   ret <4 x double> %foo
414 define <16 x i32> @test_store_16xi32(<16 x i32>* nocapture %addr, <16 x i32> %value) {
415 ; SSE32-LABEL: test_store_16xi32:
416 ; SSE32:       # %bb.0:
417 ; SSE32-NEXT:    movups %xmm0, (%rdi)
418 ; SSE32-NEXT:    movups %xmm1, 16(%rdi)
419 ; SSE32-NEXT:    movups %xmm2, 32(%rdi)
420 ; SSE32-NEXT:    movups %xmm3, 48(%rdi)
421 ; SSE32-NEXT:    retq
423 ; SSE64-LABEL: test_store_16xi32:
424 ; SSE64:       # %bb.0:
425 ; SSE64-NEXT:    subl $12, %esp
426 ; SSE64-NEXT:    .cfi_def_cfa_offset 16
427 ; SSE64-NEXT:    movaps {{[0-9]+}}(%esp), %xmm3
428 ; SSE64-NEXT:    movl {{[0-9]+}}(%esp), %eax
429 ; SSE64-NEXT:    movups %xmm0, (%eax)
430 ; SSE64-NEXT:    movups %xmm1, 16(%eax)
431 ; SSE64-NEXT:    movups %xmm2, 32(%eax)
432 ; SSE64-NEXT:    movups %xmm3, 48(%eax)
433 ; SSE64-NEXT:    addl $12, %esp
434 ; SSE64-NEXT:    .cfi_def_cfa_offset 4
435 ; SSE64-NEXT:    retl
437 ; AVXONLY32-LABEL: test_store_16xi32:
438 ; AVXONLY32:       # %bb.0:
439 ; AVXONLY32-NEXT:    vmovups %ymm0, (%rdi)
440 ; AVXONLY32-NEXT:    vmovups %ymm1, 32(%rdi)
441 ; AVXONLY32-NEXT:    retq
443 ; AVXONLY64-LABEL: test_store_16xi32:
444 ; AVXONLY64:       # %bb.0:
445 ; AVXONLY64-NEXT:    movl {{[0-9]+}}(%esp), %eax
446 ; AVXONLY64-NEXT:    vmovups %ymm0, (%eax)
447 ; AVXONLY64-NEXT:    vmovups %ymm1, 32(%eax)
448 ; AVXONLY64-NEXT:    retl
450 ; AVX51232-LABEL: test_store_16xi32:
451 ; AVX51232:       # %bb.0:
452 ; AVX51232-NEXT:    vmovups %zmm0, (%rdi)
453 ; AVX51232-NEXT:    retq
455 ; AVX51264-LABEL: test_store_16xi32:
456 ; AVX51264:       # %bb.0:
457 ; AVX51264-NEXT:    movl {{[0-9]+}}(%esp), %eax
458 ; AVX51264-NEXT:    vmovups %zmm0, (%eax)
459 ; AVX51264-NEXT:    retl
460   store <16 x i32> %value, <16 x i32>* %addr, align 1
461   ret <16 x i32> %value
464 define <16 x i32> @test_store_16xi32_aligned(<16 x i32>* nocapture %addr, <16 x i32> %value) {
465 ; SSE32-LABEL: test_store_16xi32_aligned:
466 ; SSE32:       # %bb.0:
467 ; SSE32-NEXT:    movaps %xmm0, (%rdi)
468 ; SSE32-NEXT:    movaps %xmm1, 16(%rdi)
469 ; SSE32-NEXT:    movaps %xmm2, 32(%rdi)
470 ; SSE32-NEXT:    movaps %xmm3, 48(%rdi)
471 ; SSE32-NEXT:    retq
473 ; SSE64-LABEL: test_store_16xi32_aligned:
474 ; SSE64:       # %bb.0:
475 ; SSE64-NEXT:    subl $12, %esp
476 ; SSE64-NEXT:    .cfi_def_cfa_offset 16
477 ; SSE64-NEXT:    movaps {{[0-9]+}}(%esp), %xmm3
478 ; SSE64-NEXT:    movl {{[0-9]+}}(%esp), %eax
479 ; SSE64-NEXT:    movaps %xmm0, (%eax)
480 ; SSE64-NEXT:    movaps %xmm1, 16(%eax)
481 ; SSE64-NEXT:    movaps %xmm2, 32(%eax)
482 ; SSE64-NEXT:    movaps %xmm3, 48(%eax)
483 ; SSE64-NEXT:    addl $12, %esp
484 ; SSE64-NEXT:    .cfi_def_cfa_offset 4
485 ; SSE64-NEXT:    retl
487 ; AVXONLY32-LABEL: test_store_16xi32_aligned:
488 ; AVXONLY32:       # %bb.0:
489 ; AVXONLY32-NEXT:    vmovaps %ymm0, (%rdi)
490 ; AVXONLY32-NEXT:    vmovaps %ymm1, 32(%rdi)
491 ; AVXONLY32-NEXT:    retq
493 ; AVXONLY64-LABEL: test_store_16xi32_aligned:
494 ; AVXONLY64:       # %bb.0:
495 ; AVXONLY64-NEXT:    movl {{[0-9]+}}(%esp), %eax
496 ; AVXONLY64-NEXT:    vmovaps %ymm0, (%eax)
497 ; AVXONLY64-NEXT:    vmovaps %ymm1, 32(%eax)
498 ; AVXONLY64-NEXT:    retl
500 ; AVX51232-LABEL: test_store_16xi32_aligned:
501 ; AVX51232:       # %bb.0:
502 ; AVX51232-NEXT:    vmovaps %zmm0, (%rdi)
503 ; AVX51232-NEXT:    retq
505 ; AVX51264-LABEL: test_store_16xi32_aligned:
506 ; AVX51264:       # %bb.0:
507 ; AVX51264-NEXT:    movl {{[0-9]+}}(%esp), %eax
508 ; AVX51264-NEXT:    vmovaps %zmm0, (%eax)
509 ; AVX51264-NEXT:    retl
510   store <16 x i32> %value, <16 x i32>* %addr, align 64
511   ret <16 x i32> %value
514 define <16 x float> @test_store_16xf32(<16 x float>* nocapture %addr, <16 x float> %value) {
515 ; SSE32-LABEL: test_store_16xf32:
516 ; SSE32:       # %bb.0:
517 ; SSE32-NEXT:    movups %xmm0, (%rdi)
518 ; SSE32-NEXT:    movups %xmm1, 16(%rdi)
519 ; SSE32-NEXT:    movups %xmm2, 32(%rdi)
520 ; SSE32-NEXT:    movups %xmm3, 48(%rdi)
521 ; SSE32-NEXT:    retq
523 ; SSE64-LABEL: test_store_16xf32:
524 ; SSE64:       # %bb.0:
525 ; SSE64-NEXT:    subl $12, %esp
526 ; SSE64-NEXT:    .cfi_def_cfa_offset 16
527 ; SSE64-NEXT:    movaps {{[0-9]+}}(%esp), %xmm3
528 ; SSE64-NEXT:    movl {{[0-9]+}}(%esp), %eax
529 ; SSE64-NEXT:    movups %xmm0, (%eax)
530 ; SSE64-NEXT:    movups %xmm1, 16(%eax)
531 ; SSE64-NEXT:    movups %xmm2, 32(%eax)
532 ; SSE64-NEXT:    movups %xmm3, 48(%eax)
533 ; SSE64-NEXT:    addl $12, %esp
534 ; SSE64-NEXT:    .cfi_def_cfa_offset 4
535 ; SSE64-NEXT:    retl
537 ; AVXONLY32-LABEL: test_store_16xf32:
538 ; AVXONLY32:       # %bb.0:
539 ; AVXONLY32-NEXT:    vmovups %ymm0, (%rdi)
540 ; AVXONLY32-NEXT:    vmovups %ymm1, 32(%rdi)
541 ; AVXONLY32-NEXT:    retq
543 ; AVXONLY64-LABEL: test_store_16xf32:
544 ; AVXONLY64:       # %bb.0:
545 ; AVXONLY64-NEXT:    movl {{[0-9]+}}(%esp), %eax
546 ; AVXONLY64-NEXT:    vmovups %ymm0, (%eax)
547 ; AVXONLY64-NEXT:    vmovups %ymm1, 32(%eax)
548 ; AVXONLY64-NEXT:    retl
550 ; AVX51232-LABEL: test_store_16xf32:
551 ; AVX51232:       # %bb.0:
552 ; AVX51232-NEXT:    vmovups %zmm0, (%rdi)
553 ; AVX51232-NEXT:    retq
555 ; AVX51264-LABEL: test_store_16xf32:
556 ; AVX51264:       # %bb.0:
557 ; AVX51264-NEXT:    movl {{[0-9]+}}(%esp), %eax
558 ; AVX51264-NEXT:    vmovups %zmm0, (%eax)
559 ; AVX51264-NEXT:    retl
560   store <16 x float> %value, <16 x float>* %addr, align 1
561   ret <16 x float> %value
564 define <16 x float> @test_store_16xf32_aligned(<16 x float>* nocapture %addr, <16 x float> %value) {
565 ; SSE32-LABEL: test_store_16xf32_aligned:
566 ; SSE32:       # %bb.0:
567 ; SSE32-NEXT:    movaps %xmm0, (%rdi)
568 ; SSE32-NEXT:    movaps %xmm1, 16(%rdi)
569 ; SSE32-NEXT:    movaps %xmm2, 32(%rdi)
570 ; SSE32-NEXT:    movaps %xmm3, 48(%rdi)
571 ; SSE32-NEXT:    retq
573 ; SSE64-LABEL: test_store_16xf32_aligned:
574 ; SSE64:       # %bb.0:
575 ; SSE64-NEXT:    subl $12, %esp
576 ; SSE64-NEXT:    .cfi_def_cfa_offset 16
577 ; SSE64-NEXT:    movaps {{[0-9]+}}(%esp), %xmm3
578 ; SSE64-NEXT:    movl {{[0-9]+}}(%esp), %eax
579 ; SSE64-NEXT:    movaps %xmm0, (%eax)
580 ; SSE64-NEXT:    movaps %xmm1, 16(%eax)
581 ; SSE64-NEXT:    movaps %xmm2, 32(%eax)
582 ; SSE64-NEXT:    movaps %xmm3, 48(%eax)
583 ; SSE64-NEXT:    addl $12, %esp
584 ; SSE64-NEXT:    .cfi_def_cfa_offset 4
585 ; SSE64-NEXT:    retl
587 ; AVXONLY32-LABEL: test_store_16xf32_aligned:
588 ; AVXONLY32:       # %bb.0:
589 ; AVXONLY32-NEXT:    vmovaps %ymm0, (%rdi)
590 ; AVXONLY32-NEXT:    vmovaps %ymm1, 32(%rdi)
591 ; AVXONLY32-NEXT:    retq
593 ; AVXONLY64-LABEL: test_store_16xf32_aligned:
594 ; AVXONLY64:       # %bb.0:
595 ; AVXONLY64-NEXT:    movl {{[0-9]+}}(%esp), %eax
596 ; AVXONLY64-NEXT:    vmovaps %ymm0, (%eax)
597 ; AVXONLY64-NEXT:    vmovaps %ymm1, 32(%eax)
598 ; AVXONLY64-NEXT:    retl
600 ; AVX51232-LABEL: test_store_16xf32_aligned:
601 ; AVX51232:       # %bb.0:
602 ; AVX51232-NEXT:    vmovaps %zmm0, (%rdi)
603 ; AVX51232-NEXT:    retq
605 ; AVX51264-LABEL: test_store_16xf32_aligned:
606 ; AVX51264:       # %bb.0:
607 ; AVX51264-NEXT:    movl {{[0-9]+}}(%esp), %eax
608 ; AVX51264-NEXT:    vmovaps %zmm0, (%eax)
609 ; AVX51264-NEXT:    retl
610   store <16 x float> %value, <16 x float>* %addr, align 64
611   ret <16 x float> %value
614 define <8 x double> @test_store_8xf64(<8 x double>* nocapture %addr, <8 x double> %value, <8 x double> %value2) {
615 ; SSE32-LABEL: test_store_8xf64:
616 ; SSE32:       # %bb.0:
617 ; SSE32-NEXT:    addpd %xmm7, %xmm3
618 ; SSE32-NEXT:    addpd %xmm6, %xmm2
619 ; SSE32-NEXT:    addpd %xmm5, %xmm1
620 ; SSE32-NEXT:    addpd %xmm4, %xmm0
621 ; SSE32-NEXT:    movupd %xmm0, (%rdi)
622 ; SSE32-NEXT:    movupd %xmm1, 16(%rdi)
623 ; SSE32-NEXT:    movupd %xmm2, 32(%rdi)
624 ; SSE32-NEXT:    movupd %xmm3, 48(%rdi)
625 ; SSE32-NEXT:    retq
627 ; SSE64-LABEL: test_store_8xf64:
628 ; SSE64:       # %bb.0:
629 ; SSE64-NEXT:    subl $12, %esp
630 ; SSE64-NEXT:    .cfi_def_cfa_offset 16
631 ; SSE64-NEXT:    movapd {{[0-9]+}}(%esp), %xmm3
632 ; SSE64-NEXT:    movl {{[0-9]+}}(%esp), %eax
633 ; SSE64-NEXT:    addpd {{[0-9]+}}(%esp), %xmm3
634 ; SSE64-NEXT:    addpd {{[0-9]+}}(%esp), %xmm2
635 ; SSE64-NEXT:    addpd {{[0-9]+}}(%esp), %xmm1
636 ; SSE64-NEXT:    addpd {{[0-9]+}}(%esp), %xmm0
637 ; SSE64-NEXT:    movupd %xmm0, (%eax)
638 ; SSE64-NEXT:    movupd %xmm1, 16(%eax)
639 ; SSE64-NEXT:    movupd %xmm2, 32(%eax)
640 ; SSE64-NEXT:    movupd %xmm3, 48(%eax)
641 ; SSE64-NEXT:    addl $12, %esp
642 ; SSE64-NEXT:    .cfi_def_cfa_offset 4
643 ; SSE64-NEXT:    retl
645 ; AVXONLY32-LABEL: test_store_8xf64:
646 ; AVXONLY32:       # %bb.0:
647 ; AVXONLY32-NEXT:    vaddpd %ymm3, %ymm1, %ymm1
648 ; AVXONLY32-NEXT:    vaddpd %ymm2, %ymm0, %ymm0
649 ; AVXONLY32-NEXT:    vmovupd %ymm0, (%rdi)
650 ; AVXONLY32-NEXT:    vmovupd %ymm1, 32(%rdi)
651 ; AVXONLY32-NEXT:    retq
653 ; AVXONLY64-LABEL: test_store_8xf64:
654 ; AVXONLY64:       # %bb.0:
655 ; AVXONLY64-NEXT:    pushl %ebp
656 ; AVXONLY64-NEXT:    .cfi_def_cfa_offset 8
657 ; AVXONLY64-NEXT:    .cfi_offset %ebp, -8
658 ; AVXONLY64-NEXT:    movl %esp, %ebp
659 ; AVXONLY64-NEXT:    .cfi_def_cfa_register %ebp
660 ; AVXONLY64-NEXT:    andl $-32, %esp
661 ; AVXONLY64-NEXT:    subl $32, %esp
662 ; AVXONLY64-NEXT:    movl 8(%ebp), %eax
663 ; AVXONLY64-NEXT:    vaddpd 40(%ebp), %ymm1, %ymm1
664 ; AVXONLY64-NEXT:    vaddpd %ymm2, %ymm0, %ymm0
665 ; AVXONLY64-NEXT:    vmovupd %ymm0, (%eax)
666 ; AVXONLY64-NEXT:    vmovupd %ymm1, 32(%eax)
667 ; AVXONLY64-NEXT:    movl %ebp, %esp
668 ; AVXONLY64-NEXT:    popl %ebp
669 ; AVXONLY64-NEXT:    .cfi_def_cfa %esp, 4
670 ; AVXONLY64-NEXT:    retl
672 ; AVX51232-LABEL: test_store_8xf64:
673 ; AVX51232:       # %bb.0:
674 ; AVX51232-NEXT:    vaddpd %zmm1, %zmm0, %zmm0
675 ; AVX51232-NEXT:    vmovupd %zmm0, (%rdi)
676 ; AVX51232-NEXT:    retq
678 ; AVX51264-LABEL: test_store_8xf64:
679 ; AVX51264:       # %bb.0:
680 ; AVX51264-NEXT:    movl {{[0-9]+}}(%esp), %eax
681 ; AVX51264-NEXT:    vaddpd %zmm1, %zmm0, %zmm0
682 ; AVX51264-NEXT:    vmovupd %zmm0, (%eax)
683 ; AVX51264-NEXT:    retl
684   %foo = fadd <8 x double> %value, %value2 ; to force dobule type on store
685   store <8 x double> %foo, <8 x double>* %addr, align 1
686   ret <8 x double> %foo
689 define <8 x double> @test_store_8xf64_aligned(<8 x double>* nocapture %addr, <8 x double> %value, <8 x double> %value2) {
690 ; SSE32-LABEL: test_store_8xf64_aligned:
691 ; SSE32:       # %bb.0:
692 ; SSE32-NEXT:    addpd %xmm7, %xmm3
693 ; SSE32-NEXT:    addpd %xmm6, %xmm2
694 ; SSE32-NEXT:    addpd %xmm5, %xmm1
695 ; SSE32-NEXT:    addpd %xmm4, %xmm0
696 ; SSE32-NEXT:    movapd %xmm0, (%rdi)
697 ; SSE32-NEXT:    movapd %xmm1, 16(%rdi)
698 ; SSE32-NEXT:    movapd %xmm2, 32(%rdi)
699 ; SSE32-NEXT:    movapd %xmm3, 48(%rdi)
700 ; SSE32-NEXT:    retq
702 ; SSE64-LABEL: test_store_8xf64_aligned:
703 ; SSE64:       # %bb.0:
704 ; SSE64-NEXT:    subl $12, %esp
705 ; SSE64-NEXT:    .cfi_def_cfa_offset 16
706 ; SSE64-NEXT:    movapd {{[0-9]+}}(%esp), %xmm3
707 ; SSE64-NEXT:    movl {{[0-9]+}}(%esp), %eax
708 ; SSE64-NEXT:    addpd {{[0-9]+}}(%esp), %xmm3
709 ; SSE64-NEXT:    addpd {{[0-9]+}}(%esp), %xmm2
710 ; SSE64-NEXT:    addpd {{[0-9]+}}(%esp), %xmm1
711 ; SSE64-NEXT:    addpd {{[0-9]+}}(%esp), %xmm0
712 ; SSE64-NEXT:    movapd %xmm0, (%eax)
713 ; SSE64-NEXT:    movapd %xmm1, 16(%eax)
714 ; SSE64-NEXT:    movapd %xmm2, 32(%eax)
715 ; SSE64-NEXT:    movapd %xmm3, 48(%eax)
716 ; SSE64-NEXT:    addl $12, %esp
717 ; SSE64-NEXT:    .cfi_def_cfa_offset 4
718 ; SSE64-NEXT:    retl
720 ; AVXONLY32-LABEL: test_store_8xf64_aligned:
721 ; AVXONLY32:       # %bb.0:
722 ; AVXONLY32-NEXT:    vaddpd %ymm3, %ymm1, %ymm1
723 ; AVXONLY32-NEXT:    vaddpd %ymm2, %ymm0, %ymm0
724 ; AVXONLY32-NEXT:    vmovapd %ymm0, (%rdi)
725 ; AVXONLY32-NEXT:    vmovapd %ymm1, 32(%rdi)
726 ; AVXONLY32-NEXT:    retq
728 ; AVXONLY64-LABEL: test_store_8xf64_aligned:
729 ; AVXONLY64:       # %bb.0:
730 ; AVXONLY64-NEXT:    pushl %ebp
731 ; AVXONLY64-NEXT:    .cfi_def_cfa_offset 8
732 ; AVXONLY64-NEXT:    .cfi_offset %ebp, -8
733 ; AVXONLY64-NEXT:    movl %esp, %ebp
734 ; AVXONLY64-NEXT:    .cfi_def_cfa_register %ebp
735 ; AVXONLY64-NEXT:    andl $-32, %esp
736 ; AVXONLY64-NEXT:    subl $32, %esp
737 ; AVXONLY64-NEXT:    movl 8(%ebp), %eax
738 ; AVXONLY64-NEXT:    vaddpd 40(%ebp), %ymm1, %ymm1
739 ; AVXONLY64-NEXT:    vaddpd %ymm2, %ymm0, %ymm0
740 ; AVXONLY64-NEXT:    vmovapd %ymm0, (%eax)
741 ; AVXONLY64-NEXT:    vmovapd %ymm1, 32(%eax)
742 ; AVXONLY64-NEXT:    movl %ebp, %esp
743 ; AVXONLY64-NEXT:    popl %ebp
744 ; AVXONLY64-NEXT:    .cfi_def_cfa %esp, 4
745 ; AVXONLY64-NEXT:    retl
747 ; AVX51232-LABEL: test_store_8xf64_aligned:
748 ; AVX51232:       # %bb.0:
749 ; AVX51232-NEXT:    vaddpd %zmm1, %zmm0, %zmm0
750 ; AVX51232-NEXT:    vmovapd %zmm0, (%rdi)
751 ; AVX51232-NEXT:    retq
753 ; AVX51264-LABEL: test_store_8xf64_aligned:
754 ; AVX51264:       # %bb.0:
755 ; AVX51264-NEXT:    movl {{[0-9]+}}(%esp), %eax
756 ; AVX51264-NEXT:    vaddpd %zmm1, %zmm0, %zmm0
757 ; AVX51264-NEXT:    vmovapd %zmm0, (%eax)
758 ; AVX51264-NEXT:    retl
759   %foo = fadd <8 x double> %value, %value2 ; to force dobule type on store
760   store <8 x double> %foo, <8 x double>* %addr, align 64
761   ret <8 x double> %foo