[TTI] getTypeBasedIntrinsicInstrCost - add basic handling for strided load/store...
[llvm-project.git] / llvm / test / CodeGen / X86 / sse-regcall4.ll
blob4be1f39a7d764dde956fa4ba354c231b8daf3c58
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=i386-pc-win32 -mattr=+sse | FileCheck --check-prefix=WIN32 %s
3 ; RUN: llc < %s -mtriple=x86_64-win32 -mattr=+sse | FileCheck --check-prefix=WIN64 %s
4 ; RUN: llc < %s -mtriple=x86_64-linux-gnu -mattr=+sse | FileCheck --check-prefix=LINUXOSX %s
6 ; Test regcall when receiving/returning i1
7 define x86_regcallcc i1 @test_argReti1(i1 %a)  {
8 ; WIN32-LABEL: test_argReti1:
9 ; WIN32:       # %bb.0:
10 ; WIN32-NEXT:    incb %cl
11 ; WIN32-NEXT:    # kill: def $cl killed $cl killed $ecx
12 ; WIN32-NEXT:    retl
14 ; WIN64-LABEL: test_argReti1:
15 ; WIN64:       # %bb.0:
16 ; WIN64-NEXT:    incb %al
17 ; WIN64-NEXT:    # kill: def $al killed $al killed $eax
18 ; WIN64-NEXT:    retq
20 ; LINUXOSX-LABEL: test_argReti1:
21 ; LINUXOSX:       # %bb.0:
22 ; LINUXOSX-NEXT:    incb %al
23 ; LINUXOSX-NEXT:    # kill: def $al killed $al killed $eax
24 ; LINUXOSX-NEXT:    retq
25   %add = add i1 %a, 1
26   ret i1 %add
29 ; Test regcall when passing/retrieving i1
30 define x86_regcallcc i1 @test_CallargReti1(i1 %a)  {
31 ; WIN32-LABEL: test_CallargReti1:
32 ; WIN32:       # %bb.0:
33 ; WIN32-NEXT:    incb %cl
34 ; WIN32-NEXT:    movzbl %cl, %ecx
35 ; WIN32-NEXT:    calll _test_argReti1
36 ; WIN32-NEXT:    incb %cl
37 ; WIN32-NEXT:    retl
39 ; WIN64-LABEL: test_CallargReti1:
40 ; WIN64:       # %bb.0:
41 ; WIN64-NEXT:    pushq %rax
42 ; WIN64-NEXT:    .seh_stackalloc 8
43 ; WIN64-NEXT:    .seh_endprologue
44 ; WIN64-NEXT:    incb %al
45 ; WIN64-NEXT:    movzbl %al, %eax
46 ; WIN64-NEXT:    callq test_argReti1
47 ; WIN64-NEXT:    incb %al
48 ; WIN64-NEXT:    .seh_startepilogue
49 ; WIN64-NEXT:    popq %rcx
50 ; WIN64-NEXT:    .seh_endepilogue
51 ; WIN64-NEXT:    retq
52 ; WIN64-NEXT:    .seh_endproc
54 ; LINUXOSX-LABEL: test_CallargReti1:
55 ; LINUXOSX:       # %bb.0:
56 ; LINUXOSX-NEXT:    pushq %rax
57 ; LINUXOSX-NEXT:    .cfi_def_cfa_offset 16
58 ; LINUXOSX-NEXT:    incb %al
59 ; LINUXOSX-NEXT:    movzbl %al, %eax
60 ; LINUXOSX-NEXT:    callq *test_argReti1@GOTPCREL(%rip)
61 ; LINUXOSX-NEXT:    incb %al
62 ; LINUXOSX-NEXT:    popq %rcx
63 ; LINUXOSX-NEXT:    .cfi_def_cfa_offset 8
64 ; LINUXOSX-NEXT:    retq
65   %b = add i1 %a, 1
66   %c = call x86_regcallcc i1 @test_argReti1(i1 %b)
67   %d = add i1 %c, 1
68   ret i1 %d
71 ;test calling conventions - input parameters, callee saved xmms
72 define x86_regcallcc <16 x float> @testf32_inp(<16 x float> %a, <16 x float> %b, <16 x float> %c) nounwind {
73 ; WIN32-LABEL: testf32_inp:
74 ; WIN32:       # %bb.0:
75 ; WIN32-NEXT:    pushl %ebp
76 ; WIN32-NEXT:    movl %esp, %ebp
77 ; WIN32-NEXT:    andl $-16, %esp
78 ; WIN32-NEXT:    subl $32, %esp
79 ; WIN32-NEXT:    movaps %xmm7, (%esp) # 16-byte Spill
80 ; WIN32-NEXT:    movaps %xmm6, %xmm7
81 ; WIN32-NEXT:    movaps %xmm5, %xmm6
82 ; WIN32-NEXT:    movaps %xmm4, %xmm5
83 ; WIN32-NEXT:    movaps %xmm1, %xmm4
84 ; WIN32-NEXT:    movaps %xmm0, %xmm1
85 ; WIN32-NEXT:    addps %xmm5, %xmm0
86 ; WIN32-NEXT:    mulps %xmm5, %xmm1
87 ; WIN32-NEXT:    subps %xmm1, %xmm0
88 ; WIN32-NEXT:    movups 8(%ebp), %xmm1
89 ; WIN32-NEXT:    addps %xmm1, %xmm0
90 ; WIN32-NEXT:    movaps %xmm4, %xmm1
91 ; WIN32-NEXT:    addps %xmm6, %xmm1
92 ; WIN32-NEXT:    mulps %xmm6, %xmm4
93 ; WIN32-NEXT:    subps %xmm4, %xmm1
94 ; WIN32-NEXT:    movups 24(%ebp), %xmm4
95 ; WIN32-NEXT:    addps %xmm4, %xmm1
96 ; WIN32-NEXT:    movaps %xmm2, %xmm4
97 ; WIN32-NEXT:    addps %xmm7, %xmm4
98 ; WIN32-NEXT:    mulps %xmm7, %xmm2
99 ; WIN32-NEXT:    subps %xmm2, %xmm4
100 ; WIN32-NEXT:    movups 40(%ebp), %xmm2
101 ; WIN32-NEXT:    addps %xmm2, %xmm4
102 ; WIN32-NEXT:    movaps %xmm3, %xmm5
103 ; WIN32-NEXT:    movaps (%esp), %xmm2 # 16-byte Reload
104 ; WIN32-NEXT:    addps %xmm2, %xmm5
105 ; WIN32-NEXT:    mulps %xmm2, %xmm3
106 ; WIN32-NEXT:    subps %xmm3, %xmm5
107 ; WIN32-NEXT:    movups 56(%ebp), %xmm2
108 ; WIN32-NEXT:    addps %xmm2, %xmm5
109 ; WIN32-NEXT:    movaps %xmm4, %xmm2
110 ; WIN32-NEXT:    movaps %xmm5, %xmm3
111 ; WIN32-NEXT:    movl %ebp, %esp
112 ; WIN32-NEXT:    popl %ebp
113 ; WIN32-NEXT:    retl
115 ; WIN64-LABEL: testf32_inp:
116 ; WIN64:       # %bb.0:
117 ; WIN64-NEXT:    subq $72, %rsp
118 ; WIN64-NEXT:    movaps %xmm15, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
119 ; WIN64-NEXT:    movaps %xmm14, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
120 ; WIN64-NEXT:    movaps %xmm13, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
121 ; WIN64-NEXT:    movaps %xmm12, (%rsp) # 16-byte Spill
122 ; WIN64-NEXT:    movaps %xmm0, %xmm12
123 ; WIN64-NEXT:    addps %xmm4, %xmm12
124 ; WIN64-NEXT:    movaps %xmm1, %xmm13
125 ; WIN64-NEXT:    addps %xmm5, %xmm13
126 ; WIN64-NEXT:    movaps %xmm2, %xmm14
127 ; WIN64-NEXT:    addps %xmm6, %xmm14
128 ; WIN64-NEXT:    movaps %xmm3, %xmm15
129 ; WIN64-NEXT:    addps %xmm7, %xmm15
130 ; WIN64-NEXT:    mulps %xmm4, %xmm0
131 ; WIN64-NEXT:    subps %xmm0, %xmm12
132 ; WIN64-NEXT:    mulps %xmm5, %xmm1
133 ; WIN64-NEXT:    subps %xmm1, %xmm13
134 ; WIN64-NEXT:    mulps %xmm6, %xmm2
135 ; WIN64-NEXT:    subps %xmm2, %xmm14
136 ; WIN64-NEXT:    mulps %xmm7, %xmm3
137 ; WIN64-NEXT:    subps %xmm3, %xmm15
138 ; WIN64-NEXT:    addps %xmm8, %xmm12
139 ; WIN64-NEXT:    addps %xmm9, %xmm13
140 ; WIN64-NEXT:    addps %xmm10, %xmm14
141 ; WIN64-NEXT:    addps %xmm11, %xmm15
142 ; WIN64-NEXT:    movaps %xmm12, %xmm0
143 ; WIN64-NEXT:    movaps %xmm13, %xmm1
144 ; WIN64-NEXT:    movaps %xmm14, %xmm2
145 ; WIN64-NEXT:    movaps %xmm15, %xmm3
146 ; WIN64-NEXT:    movaps (%rsp), %xmm12 # 16-byte Reload
147 ; WIN64-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm13 # 16-byte Reload
148 ; WIN64-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm14 # 16-byte Reload
149 ; WIN64-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm15 # 16-byte Reload
150 ; WIN64-NEXT:    addq $72, %rsp
151 ; WIN64-NEXT:    retq
153 ; LINUXOSX-LABEL: testf32_inp:
154 ; LINUXOSX:       # %bb.0:
155 ; LINUXOSX-NEXT:    movaps %xmm15, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
156 ; LINUXOSX-NEXT:    movaps %xmm14, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
157 ; LINUXOSX-NEXT:    movaps %xmm13, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
158 ; LINUXOSX-NEXT:    movaps %xmm12, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
159 ; LINUXOSX-NEXT:    movaps %xmm0, %xmm12
160 ; LINUXOSX-NEXT:    addps %xmm4, %xmm12
161 ; LINUXOSX-NEXT:    movaps %xmm1, %xmm13
162 ; LINUXOSX-NEXT:    addps %xmm5, %xmm13
163 ; LINUXOSX-NEXT:    movaps %xmm2, %xmm14
164 ; LINUXOSX-NEXT:    addps %xmm6, %xmm14
165 ; LINUXOSX-NEXT:    movaps %xmm3, %xmm15
166 ; LINUXOSX-NEXT:    addps %xmm7, %xmm15
167 ; LINUXOSX-NEXT:    mulps %xmm4, %xmm0
168 ; LINUXOSX-NEXT:    subps %xmm0, %xmm12
169 ; LINUXOSX-NEXT:    mulps %xmm5, %xmm1
170 ; LINUXOSX-NEXT:    subps %xmm1, %xmm13
171 ; LINUXOSX-NEXT:    mulps %xmm6, %xmm2
172 ; LINUXOSX-NEXT:    subps %xmm2, %xmm14
173 ; LINUXOSX-NEXT:    mulps %xmm7, %xmm3
174 ; LINUXOSX-NEXT:    subps %xmm3, %xmm15
175 ; LINUXOSX-NEXT:    addps %xmm8, %xmm12
176 ; LINUXOSX-NEXT:    addps %xmm9, %xmm13
177 ; LINUXOSX-NEXT:    addps %xmm10, %xmm14
178 ; LINUXOSX-NEXT:    addps %xmm11, %xmm15
179 ; LINUXOSX-NEXT:    movaps %xmm12, %xmm0
180 ; LINUXOSX-NEXT:    movaps %xmm13, %xmm1
181 ; LINUXOSX-NEXT:    movaps %xmm14, %xmm2
182 ; LINUXOSX-NEXT:    movaps %xmm15, %xmm3
183 ; LINUXOSX-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm12 # 16-byte Reload
184 ; LINUXOSX-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm13 # 16-byte Reload
185 ; LINUXOSX-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm14 # 16-byte Reload
186 ; LINUXOSX-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm15 # 16-byte Reload
187 ; LINUXOSX-NEXT:    retq
188   %x1 = fadd <16 x float> %a, %b
189   %x2 = fmul <16 x float> %a, %b
190   %x3 = fsub <16 x float> %x1, %x2
191   %x4 = fadd <16 x float> %x3, %c
192   ret <16 x float> %x4
195 ;test calling conventions - input parameters, callee saved GPRs
196 define x86_regcallcc i32 @testi32_inp(i32 %a1, i32 %a2, i32 %a3, i32 %a4, i32 %a5, i32 %a6,
197 ; WIN32-LABEL: testi32_inp:
198 ; WIN32:       # %bb.0:
199 ; WIN32-NEXT:    pushl %ebp
200 ; WIN32-NEXT:    pushl %ebx
201 ; WIN32-NEXT:    subl $8, %esp
202 ; WIN32-NEXT:    movl %edi, %eax
203 ; WIN32-NEXT:    movl %edx, (%esp) # 4-byte Spill
204 ; WIN32-NEXT:    movl %ecx, %edi
205 ; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %ebp
206 ; WIN32-NEXT:    leal (%eax,%esi), %ecx
207 ; WIN32-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
208 ; WIN32-NEXT:    movl %eax, %ebx
209 ; WIN32-NEXT:    subl %esi, %ebx
210 ; WIN32-NEXT:    movl %edi, %eax
211 ; WIN32-NEXT:    subl %edx, %eax
212 ; WIN32-NEXT:    subl {{[0-9]+}}(%esp), %ebp
213 ; WIN32-NEXT:    imull %eax, %ebp
214 ; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %edx
215 ; WIN32-NEXT:    movl %edx, %esi
216 ; WIN32-NEXT:    subl {{[0-9]+}}(%esp), %esi
217 ; WIN32-NEXT:    imull %ebx, %esi
218 ; WIN32-NEXT:    addl %ebp, %esi
219 ; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %ebp
220 ; WIN32-NEXT:    movl %ebp, %ebx
221 ; WIN32-NEXT:    subl {{[0-9]+}}(%esp), %ebx
222 ; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
223 ; WIN32-NEXT:    movl %ecx, %eax
224 ; WIN32-NEXT:    subl {{[0-9]+}}(%esp), %eax
225 ; WIN32-NEXT:    imull %ebx, %eax
226 ; WIN32-NEXT:    addl %esi, %eax
227 ; WIN32-NEXT:    addl (%esp), %edi # 4-byte Folded Reload
228 ; WIN32-NEXT:    addl {{[0-9]+}}(%esp), %ebp
229 ; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %esi
230 ; WIN32-NEXT:    addl {{[0-9]+}}(%esp), %esi
231 ; WIN32-NEXT:    imull %esi, %edi
232 ; WIN32-NEXT:    addl {{[0-9]+}}(%esp), %edx
233 ; WIN32-NEXT:    imull {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
234 ; WIN32-NEXT:    addl %edx, %edi
235 ; WIN32-NEXT:    addl {{[0-9]+}}(%esp), %ecx
236 ; WIN32-NEXT:    imull %ebp, %ecx
237 ; WIN32-NEXT:    addl %ecx, %edi
238 ; WIN32-NEXT:    addl %eax, %edi
239 ; WIN32-NEXT:    movl %edi, %ecx
240 ; WIN32-NEXT:    addl $8, %esp
241 ; WIN32-NEXT:    popl %ebx
242 ; WIN32-NEXT:    popl %ebp
243 ; WIN32-NEXT:    retl
245 ; WIN64-LABEL: testi32_inp:
246 ; WIN64:       # %bb.0:
247 ; WIN64-NEXT:    pushq %rbp
248 ; WIN64-NEXT:    pushq %rbx
249 ; WIN64-NEXT:    # kill: def $edx killed $edx def $rdx
250 ; WIN64-NEXT:    # kill: def $esi killed $esi def $rsi
251 ; WIN64-NEXT:    # kill: def $r14d killed $r14d def $r14
252 ; WIN64-NEXT:    # kill: def $r12d killed $r12d def $r12
253 ; WIN64-NEXT:    # kill: def $r11d killed $r11d def $r11
254 ; WIN64-NEXT:    # kill: def $r9d killed $r9d def $r9
255 ; WIN64-NEXT:    # kill: def $r8d killed $r8d def $r8
256 ; WIN64-NEXT:    # kill: def $edi killed $edi def $rdi
257 ; WIN64-NEXT:    leal (%rdx,%rdi), %ebx
258 ; WIN64-NEXT:    movl %edx, %ebp
259 ; WIN64-NEXT:    subl %edi, %ebp
260 ; WIN64-NEXT:    leal (%rsi,%r8), %edx
261 ; WIN64-NEXT:    # kill: def $esi killed $esi killed $rsi
262 ; WIN64-NEXT:    subl %r8d, %esi
263 ; WIN64-NEXT:    leal (%r9,%r11), %edi
264 ; WIN64-NEXT:    movl %r9d, %r8d
265 ; WIN64-NEXT:    subl %r11d, %r8d
266 ; WIN64-NEXT:    movl %eax, %r9d
267 ; WIN64-NEXT:    subl %ecx, %r9d
268 ; WIN64-NEXT:    imull %r9d, %r8d
269 ; WIN64-NEXT:    leal (%r12,%r14), %r9d
270 ; WIN64-NEXT:    movl %r12d, %r11d
271 ; WIN64-NEXT:    subl %r14d, %r11d
272 ; WIN64-NEXT:    imull %ebp, %r11d
273 ; WIN64-NEXT:    movl {{[0-9]+}}(%rsp), %r14d
274 ; WIN64-NEXT:    addl %r8d, %r11d
275 ; WIN64-NEXT:    movl %r15d, %r8d
276 ; WIN64-NEXT:    subl %r14d, %r8d
277 ; WIN64-NEXT:    imull %esi, %r8d
278 ; WIN64-NEXT:    addl %r11d, %r8d
279 ; WIN64-NEXT:    addl %ecx, %eax
280 ; WIN64-NEXT:    imull %edi, %eax
281 ; WIN64-NEXT:    imull %ebx, %r9d
282 ; WIN64-NEXT:    addl %r9d, %eax
283 ; WIN64-NEXT:    addl %r15d, %r14d
284 ; WIN64-NEXT:    imull %edx, %r14d
285 ; WIN64-NEXT:    addl %r14d, %eax
286 ; WIN64-NEXT:    addl %r8d, %eax
287 ; WIN64-NEXT:    popq %rbx
288 ; WIN64-NEXT:    popq %rbp
289 ; WIN64-NEXT:    retq
291 ; LINUXOSX-LABEL: testi32_inp:
292 ; LINUXOSX:       # %bb.0:
293 ; LINUXOSX-NEXT:    # kill: def $edx killed $edx def $rdx
294 ; LINUXOSX-NEXT:    # kill: def $esi killed $esi def $rsi
295 ; LINUXOSX-NEXT:    # kill: def $r14d killed $r14d def $r14
296 ; LINUXOSX-NEXT:    # kill: def $r13d killed $r13d def $r13
297 ; LINUXOSX-NEXT:    # kill: def $r12d killed $r12d def $r12
298 ; LINUXOSX-NEXT:    # kill: def $r9d killed $r9d def $r9
299 ; LINUXOSX-NEXT:    # kill: def $r8d killed $r8d def $r8
300 ; LINUXOSX-NEXT:    # kill: def $edi killed $edi def $rdi
301 ; LINUXOSX-NEXT:    leal (%rdx,%rdi), %r10d
302 ; LINUXOSX-NEXT:    movl %edx, %r11d
303 ; LINUXOSX-NEXT:    subl %edi, %r11d
304 ; LINUXOSX-NEXT:    leal (%rsi,%r8), %edx
305 ; LINUXOSX-NEXT:    # kill: def $esi killed $esi killed $rsi
306 ; LINUXOSX-NEXT:    subl %r8d, %esi
307 ; LINUXOSX-NEXT:    leal (%r9,%r12), %edi
308 ; LINUXOSX-NEXT:    movl %r9d, %r8d
309 ; LINUXOSX-NEXT:    subl %r12d, %r8d
310 ; LINUXOSX-NEXT:    movl %eax, %r9d
311 ; LINUXOSX-NEXT:    subl %ecx, %r9d
312 ; LINUXOSX-NEXT:    imull %r9d, %r8d
313 ; LINUXOSX-NEXT:    leal (%r13,%r14), %r9d
314 ; LINUXOSX-NEXT:    movl %r13d, %r12d
315 ; LINUXOSX-NEXT:    subl %r14d, %r12d
316 ; LINUXOSX-NEXT:    imull %r11d, %r12d
317 ; LINUXOSX-NEXT:    movl {{[0-9]+}}(%rsp), %r11d
318 ; LINUXOSX-NEXT:    addl %r8d, %r12d
319 ; LINUXOSX-NEXT:    movl %r15d, %r8d
320 ; LINUXOSX-NEXT:    subl %r11d, %r8d
321 ; LINUXOSX-NEXT:    imull %esi, %r8d
322 ; LINUXOSX-NEXT:    addl %r12d, %r8d
323 ; LINUXOSX-NEXT:    addl %ecx, %eax
324 ; LINUXOSX-NEXT:    imull %edi, %eax
325 ; LINUXOSX-NEXT:    imull %r10d, %r9d
326 ; LINUXOSX-NEXT:    addl %r9d, %eax
327 ; LINUXOSX-NEXT:    addl %r15d, %r11d
328 ; LINUXOSX-NEXT:    imull %edx, %r11d
329 ; LINUXOSX-NEXT:    addl %r11d, %eax
330 ; LINUXOSX-NEXT:    addl %r8d, %eax
331 ; LINUXOSX-NEXT:    retq
332                                       i32 %b1, i32 %b2, i32 %b3, i32 %b4, i32 %b5, i32 %b6) nounwind {
333   %x1 = sub i32 %a1, %a2
334   %x2 = sub i32 %a3, %a4
335   %x3 = sub i32 %a5, %a6
336   %y1 = sub i32 %b1, %b2
337   %y2 = sub i32 %b3, %b4
338   %y3 = sub i32 %b5, %b6
339   %v1 = add i32 %a1, %a2
340   %v2 = add i32 %a3, %a4
341   %v3 = add i32 %a5, %a6
342   %w1 = add i32 %b1, %b2
343   %w2 = add i32 %b3, %b4
344   %w3 = add i32 %b5, %b6
345   %s1 = mul i32 %x1, %y1
346   %s2 = mul i32 %x2, %y2
347   %s3 = mul i32 %x3, %y3
348   %t1 = mul i32 %v1, %w1
349   %t2 = mul i32 %v2, %w2
350   %t3 = mul i32 %v3, %w3
351   %m1 = add i32 %s1, %s2
352   %m2 = add i32 %m1, %s3
353   %n1 = add i32 %t1, %t2
354   %n2 = add i32 %n1, %t3
355   %r1 = add i32 %m2, %n2
356   ret i32 %r1
359 ; Test that parameters, overflowing register capacity, are passed through the stack
360 define x86_regcallcc <32 x float> @testf32_stack(<32 x float> %a, <32 x float> %b, <32 x float> %c) nounwind {
361 ; WIN32-LABEL: testf32_stack:
362 ; WIN32:       # %bb.0:
363 ; WIN32-NEXT:    pushl %ebp
364 ; WIN32-NEXT:    movl %esp, %ebp
365 ; WIN32-NEXT:    andl $-16, %esp
366 ; WIN32-NEXT:    subl $48, %esp
367 ; WIN32-NEXT:    movaps %xmm7, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
368 ; WIN32-NEXT:    movaps %xmm6, (%esp) # 16-byte Spill
369 ; WIN32-NEXT:    movaps %xmm5, %xmm6
370 ; WIN32-NEXT:    movaps %xmm4, %xmm5
371 ; WIN32-NEXT:    movaps %xmm3, %xmm4
372 ; WIN32-NEXT:    movaps %xmm2, %xmm3
373 ; WIN32-NEXT:    movaps %xmm1, %xmm2
374 ; WIN32-NEXT:    movaps %xmm0, %xmm1
375 ; WIN32-NEXT:    movups 120(%ebp), %xmm7
376 ; WIN32-NEXT:    movaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
377 ; WIN32-NEXT:    addps %xmm7, %xmm0
378 ; WIN32-NEXT:    movups 248(%ebp), %xmm7
379 ; WIN32-NEXT:    addps %xmm7, %xmm0
380 ; WIN32-NEXT:    movaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
381 ; WIN32-NEXT:    movups 104(%ebp), %xmm7
382 ; WIN32-NEXT:    movaps (%esp), %xmm0 # 16-byte Reload
383 ; WIN32-NEXT:    addps %xmm7, %xmm0
384 ; WIN32-NEXT:    movups 232(%ebp), %xmm7
385 ; WIN32-NEXT:    addps %xmm7, %xmm0
386 ; WIN32-NEXT:    movaps %xmm0, (%esp) # 16-byte Spill
387 ; WIN32-NEXT:    movups 88(%ebp), %xmm7
388 ; WIN32-NEXT:    addps %xmm7, %xmm6
389 ; WIN32-NEXT:    movups 216(%ebp), %xmm7
390 ; WIN32-NEXT:    addps %xmm7, %xmm6
391 ; WIN32-NEXT:    movups 72(%ebp), %xmm7
392 ; WIN32-NEXT:    addps %xmm7, %xmm5
393 ; WIN32-NEXT:    movups 200(%ebp), %xmm7
394 ; WIN32-NEXT:    addps %xmm7, %xmm5
395 ; WIN32-NEXT:    movups 56(%ebp), %xmm7
396 ; WIN32-NEXT:    addps %xmm7, %xmm4
397 ; WIN32-NEXT:    movups 184(%ebp), %xmm7
398 ; WIN32-NEXT:    addps %xmm7, %xmm4
399 ; WIN32-NEXT:    movups 40(%ebp), %xmm7
400 ; WIN32-NEXT:    addps %xmm7, %xmm3
401 ; WIN32-NEXT:    movups 168(%ebp), %xmm7
402 ; WIN32-NEXT:    addps %xmm7, %xmm3
403 ; WIN32-NEXT:    movups 24(%ebp), %xmm7
404 ; WIN32-NEXT:    addps %xmm7, %xmm2
405 ; WIN32-NEXT:    movups 152(%ebp), %xmm7
406 ; WIN32-NEXT:    addps %xmm7, %xmm2
407 ; WIN32-NEXT:    movups 8(%ebp), %xmm7
408 ; WIN32-NEXT:    addps %xmm7, %xmm1
409 ; WIN32-NEXT:    movups 136(%ebp), %xmm7
410 ; WIN32-NEXT:    addps %xmm7, %xmm1
411 ; WIN32-NEXT:    movaps %xmm1, %xmm0
412 ; WIN32-NEXT:    movaps %xmm2, %xmm1
413 ; WIN32-NEXT:    movaps %xmm3, %xmm2
414 ; WIN32-NEXT:    movaps %xmm4, %xmm3
415 ; WIN32-NEXT:    movaps %xmm5, %xmm4
416 ; WIN32-NEXT:    movaps %xmm6, %xmm5
417 ; WIN32-NEXT:    movaps (%esp), %xmm6 # 16-byte Reload
418 ; WIN32-NEXT:    movaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm7 # 16-byte Reload
419 ; WIN32-NEXT:    movl %ebp, %esp
420 ; WIN32-NEXT:    popl %ebp
421 ; WIN32-NEXT:    retl
423 ; WIN64-LABEL: testf32_stack:
424 ; WIN64:       # %bb.0:
425 ; WIN64-NEXT:    pushq %rax
426 ; WIN64-NEXT:    addps %xmm15, %xmm7
427 ; WIN64-NEXT:    addps %xmm14, %xmm6
428 ; WIN64-NEXT:    addps %xmm13, %xmm5
429 ; WIN64-NEXT:    addps %xmm12, %xmm4
430 ; WIN64-NEXT:    addps %xmm11, %xmm3
431 ; WIN64-NEXT:    addps %xmm10, %xmm2
432 ; WIN64-NEXT:    addps %xmm9, %xmm1
433 ; WIN64-NEXT:    addps %xmm8, %xmm0
434 ; WIN64-NEXT:    addps {{[0-9]+}}(%rsp), %xmm0
435 ; WIN64-NEXT:    addps {{[0-9]+}}(%rsp), %xmm1
436 ; WIN64-NEXT:    addps {{[0-9]+}}(%rsp), %xmm2
437 ; WIN64-NEXT:    addps {{[0-9]+}}(%rsp), %xmm3
438 ; WIN64-NEXT:    addps {{[0-9]+}}(%rsp), %xmm4
439 ; WIN64-NEXT:    addps {{[0-9]+}}(%rsp), %xmm5
440 ; WIN64-NEXT:    addps {{[0-9]+}}(%rsp), %xmm6
441 ; WIN64-NEXT:    addps {{[0-9]+}}(%rsp), %xmm7
442 ; WIN64-NEXT:    popq %rax
443 ; WIN64-NEXT:    retq
445 ; LINUXOSX-LABEL: testf32_stack:
446 ; LINUXOSX:       # %bb.0:
447 ; LINUXOSX-NEXT:    addps %xmm15, %xmm7
448 ; LINUXOSX-NEXT:    addps %xmm14, %xmm6
449 ; LINUXOSX-NEXT:    addps %xmm13, %xmm5
450 ; LINUXOSX-NEXT:    addps %xmm12, %xmm4
451 ; LINUXOSX-NEXT:    addps %xmm11, %xmm3
452 ; LINUXOSX-NEXT:    addps %xmm10, %xmm2
453 ; LINUXOSX-NEXT:    addps %xmm9, %xmm1
454 ; LINUXOSX-NEXT:    addps %xmm8, %xmm0
455 ; LINUXOSX-NEXT:    addps {{[0-9]+}}(%rsp), %xmm0
456 ; LINUXOSX-NEXT:    addps {{[0-9]+}}(%rsp), %xmm1
457 ; LINUXOSX-NEXT:    addps {{[0-9]+}}(%rsp), %xmm2
458 ; LINUXOSX-NEXT:    addps {{[0-9]+}}(%rsp), %xmm3
459 ; LINUXOSX-NEXT:    addps {{[0-9]+}}(%rsp), %xmm4
460 ; LINUXOSX-NEXT:    addps {{[0-9]+}}(%rsp), %xmm5
461 ; LINUXOSX-NEXT:    addps {{[0-9]+}}(%rsp), %xmm6
462 ; LINUXOSX-NEXT:    addps {{[0-9]+}}(%rsp), %xmm7
463 ; LINUXOSX-NEXT:    retq
464   %x1 = fadd <32 x float> %a, %b
465   %x2 = fadd <32 x float> %x1, %c
466   ret <32 x float> %x2
469 !llvm.module.flags = !{!0}
470 !0 = !{i32 4, !"RegCallv4", i32 1}