Re-land [openmp] Fix warnings when building on Windows with latest MSVC or Clang...
[llvm-project.git] / llvm / test / CodeGen / X86 / avx512-regcall-NoMask.ll
blob2081d201704f3af98db03d45037951926e4f0c1e
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=i386-pc-win32       -mattr=+avx512f -mattr=+avx512vl -mattr=+avx512bw -mattr=+avx512dq -verify-machineinstrs  | FileCheck %s --check-prefix=X32
3 ; RUN: llc < %s -mtriple=x86_64-win32        -mattr=+avx512f -mattr=+avx512vl -mattr=+avx512bw -mattr=+avx512dq -verify-machineinstrs  | FileCheck %s --check-prefix=WIN64
4 ; RUN: llc < %s -mtriple=x86_64-linux-gnu    -mattr=+avx512f -mattr=+avx512vl -mattr=+avx512bw -mattr=+avx512dq -verify-machineinstrs  | FileCheck %s --check-prefix=LINUXOSX64
6 ; Test regcall when receiving/returning i1
7 define dso_local x86_regcallcc i1 @test_argReti1(i1 %a)  {
8 ; X32-LABEL: test_argReti1:
9 ; X32:       # %bb.0:
10 ; X32-NEXT:    incb %al
11 ; X32-NEXT:    # kill: def $al killed $al killed $eax
12 ; X32-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 ; LINUXOSX64-LABEL: test_argReti1:
21 ; LINUXOSX64:       # %bb.0:
22 ; LINUXOSX64-NEXT:    incb %al
23 ; LINUXOSX64-NEXT:    # kill: def $al killed $al killed $eax
24 ; LINUXOSX64-NEXT:    retq
25   %add = add i1 %a, 1
26   ret i1 %add
29 ; Test regcall when passing/retrieving i1
30 define dso_local x86_regcallcc i1 @test_CallargReti1(i1 %a)  {
31 ; X32-LABEL: test_CallargReti1:
32 ; X32:       # %bb.0:
33 ; X32-NEXT:    incb %al
34 ; X32-NEXT:    movzbl %al, %eax
35 ; X32-NEXT:    calll _test_argReti1
36 ; X32-NEXT:    incb %al
37 ; X32-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:    popq %rcx
49 ; WIN64-NEXT:    retq
50 ; WIN64-NEXT:    .seh_endproc
52 ; LINUXOSX64-LABEL: test_CallargReti1:
53 ; LINUXOSX64:       # %bb.0:
54 ; LINUXOSX64-NEXT:    pushq %rax
55 ; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 16
56 ; LINUXOSX64-NEXT:    incb %al
57 ; LINUXOSX64-NEXT:    movzbl %al, %eax
58 ; LINUXOSX64-NEXT:    callq test_argReti1
59 ; LINUXOSX64-NEXT:    incb %al
60 ; LINUXOSX64-NEXT:    popq %rcx
61 ; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 8
62 ; LINUXOSX64-NEXT:    retq
63   %b = add i1 %a, 1
64   %c = call x86_regcallcc i1 @test_argReti1(i1 %b)
65   %d = add i1 %c, 1
66   ret i1 %d
69 ; Test regcall when receiving/returning i8
70 define dso_local x86_regcallcc i8 @test_argReti8(i8 %a)  {
71 ; X32-LABEL: test_argReti8:
72 ; X32:       # %bb.0:
73 ; X32-NEXT:    incb %al
74 ; X32-NEXT:    # kill: def $al killed $al killed $eax
75 ; X32-NEXT:    retl
77 ; WIN64-LABEL: test_argReti8:
78 ; WIN64:       # %bb.0:
79 ; WIN64-NEXT:    incb %al
80 ; WIN64-NEXT:    # kill: def $al killed $al killed $eax
81 ; WIN64-NEXT:    retq
83 ; LINUXOSX64-LABEL: test_argReti8:
84 ; LINUXOSX64:       # %bb.0:
85 ; LINUXOSX64-NEXT:    incb %al
86 ; LINUXOSX64-NEXT:    # kill: def $al killed $al killed $eax
87 ; LINUXOSX64-NEXT:    retq
88   %add = add i8 %a, 1
89   ret i8 %add
92 ; Test regcall when passing/retrieving i8
93 define dso_local x86_regcallcc i8 @test_CallargReti8(i8 %a)  {
94 ; X32-LABEL: test_CallargReti8:
95 ; X32:       # %bb.0:
96 ; X32-NEXT:    incb %al
97 ; X32-NEXT:    movzbl %al, %eax
98 ; X32-NEXT:    calll _test_argReti8
99 ; X32-NEXT:    incb %al
100 ; X32-NEXT:    retl
102 ; WIN64-LABEL: test_CallargReti8:
103 ; WIN64:       # %bb.0:
104 ; WIN64-NEXT:    pushq %rax
105 ; WIN64-NEXT:    .seh_stackalloc 8
106 ; WIN64-NEXT:    .seh_endprologue
107 ; WIN64-NEXT:    incb %al
108 ; WIN64-NEXT:    movzbl %al, %eax
109 ; WIN64-NEXT:    callq test_argReti8
110 ; WIN64-NEXT:    incb %al
111 ; WIN64-NEXT:    popq %rcx
112 ; WIN64-NEXT:    retq
113 ; WIN64-NEXT:    .seh_endproc
115 ; LINUXOSX64-LABEL: test_CallargReti8:
116 ; LINUXOSX64:       # %bb.0:
117 ; LINUXOSX64-NEXT:    pushq %rax
118 ; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 16
119 ; LINUXOSX64-NEXT:    incb %al
120 ; LINUXOSX64-NEXT:    movzbl %al, %eax
121 ; LINUXOSX64-NEXT:    callq test_argReti8
122 ; LINUXOSX64-NEXT:    incb %al
123 ; LINUXOSX64-NEXT:    popq %rcx
124 ; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 8
125 ; LINUXOSX64-NEXT:    retq
126   %b = add i8 %a, 1
127   %c = call x86_regcallcc i8 @test_argReti8(i8 %b)
128   %d = add i8 %c, 1
129   ret i8 %d
132 ; Test regcall when receiving/returning i16
133 define dso_local x86_regcallcc i16 @test_argReti16(i16 %a)  {
134 ; X32-LABEL: test_argReti16:
135 ; X32:       # %bb.0:
136 ; X32-NEXT:    incl %eax
137 ; X32-NEXT:    # kill: def $ax killed $ax killed $eax
138 ; X32-NEXT:    retl
140 ; WIN64-LABEL: test_argReti16:
141 ; WIN64:       # %bb.0:
142 ; WIN64-NEXT:    incl %eax
143 ; WIN64-NEXT:    # kill: def $ax killed $ax killed $eax
144 ; WIN64-NEXT:    retq
146 ; LINUXOSX64-LABEL: test_argReti16:
147 ; LINUXOSX64:       # %bb.0:
148 ; LINUXOSX64-NEXT:    incl %eax
149 ; LINUXOSX64-NEXT:    # kill: def $ax killed $ax killed $eax
150 ; LINUXOSX64-NEXT:    retq
151   %add = add i16 %a, 1
152   ret i16 %add
155 ; Test regcall when passing/retrieving i16
156 define dso_local x86_regcallcc i16 @test_CallargReti16(i16 %a)  {
157 ; X32-LABEL: test_CallargReti16:
158 ; X32:       # %bb.0:
159 ; X32-NEXT:    incl %eax
160 ; X32-NEXT:    calll _test_argReti16
161 ; X32-NEXT:    # kill: def $ax killed $ax def $eax
162 ; X32-NEXT:    incl %eax
163 ; X32-NEXT:    # kill: def $ax killed $ax killed $eax
164 ; X32-NEXT:    retl
166 ; WIN64-LABEL: test_CallargReti16:
167 ; WIN64:       # %bb.0:
168 ; WIN64-NEXT:    pushq %rax
169 ; WIN64-NEXT:    .seh_stackalloc 8
170 ; WIN64-NEXT:    .seh_endprologue
171 ; WIN64-NEXT:    incl %eax
172 ; WIN64-NEXT:    callq test_argReti16
173 ; WIN64-NEXT:    # kill: def $ax killed $ax def $eax
174 ; WIN64-NEXT:    incl %eax
175 ; WIN64-NEXT:    # kill: def $ax killed $ax killed $eax
176 ; WIN64-NEXT:    popq %rcx
177 ; WIN64-NEXT:    retq
178 ; WIN64-NEXT:    .seh_endproc
180 ; LINUXOSX64-LABEL: test_CallargReti16:
181 ; LINUXOSX64:       # %bb.0:
182 ; LINUXOSX64-NEXT:    pushq %rax
183 ; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 16
184 ; LINUXOSX64-NEXT:    incl %eax
185 ; LINUXOSX64-NEXT:    callq test_argReti16
186 ; LINUXOSX64-NEXT:    # kill: def $ax killed $ax def $eax
187 ; LINUXOSX64-NEXT:    incl %eax
188 ; LINUXOSX64-NEXT:    # kill: def $ax killed $ax killed $eax
189 ; LINUXOSX64-NEXT:    popq %rcx
190 ; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 8
191 ; LINUXOSX64-NEXT:    retq
192   %b = add i16 %a, 1
193   %c = call x86_regcallcc i16 @test_argReti16(i16 %b)
194   %d = add i16 %c, 1
195   ret i16 %d
198 ; Test regcall when receiving/returning i32
199 define dso_local x86_regcallcc i32 @test_argReti32(i32 %a)  {
200 ; X32-LABEL: test_argReti32:
201 ; X32:       # %bb.0:
202 ; X32-NEXT:    incl %eax
203 ; X32-NEXT:    retl
205 ; WIN64-LABEL: test_argReti32:
206 ; WIN64:       # %bb.0:
207 ; WIN64-NEXT:    incl %eax
208 ; WIN64-NEXT:    retq
210 ; LINUXOSX64-LABEL: test_argReti32:
211 ; LINUXOSX64:       # %bb.0:
212 ; LINUXOSX64-NEXT:    incl %eax
213 ; LINUXOSX64-NEXT:    retq
214   %add = add i32 %a, 1
215   ret i32 %add
218 ; Test regcall when passing/retrieving i32
219 define dso_local x86_regcallcc i32 @test_CallargReti32(i32 %a)  {
220 ; X32-LABEL: test_CallargReti32:
221 ; X32:       # %bb.0:
222 ; X32-NEXT:    incl %eax
223 ; X32-NEXT:    calll _test_argReti32
224 ; X32-NEXT:    incl %eax
225 ; X32-NEXT:    retl
227 ; WIN64-LABEL: test_CallargReti32:
228 ; WIN64:       # %bb.0:
229 ; WIN64-NEXT:    pushq %rax
230 ; WIN64-NEXT:    .seh_stackalloc 8
231 ; WIN64-NEXT:    .seh_endprologue
232 ; WIN64-NEXT:    incl %eax
233 ; WIN64-NEXT:    callq test_argReti32
234 ; WIN64-NEXT:    incl %eax
235 ; WIN64-NEXT:    popq %rcx
236 ; WIN64-NEXT:    retq
237 ; WIN64-NEXT:    .seh_endproc
239 ; LINUXOSX64-LABEL: test_CallargReti32:
240 ; LINUXOSX64:       # %bb.0:
241 ; LINUXOSX64-NEXT:    pushq %rax
242 ; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 16
243 ; LINUXOSX64-NEXT:    incl %eax
244 ; LINUXOSX64-NEXT:    callq test_argReti32
245 ; LINUXOSX64-NEXT:    incl %eax
246 ; LINUXOSX64-NEXT:    popq %rcx
247 ; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 8
248 ; LINUXOSX64-NEXT:    retq
249   %b = add i32 %a, 1
250   %c = call x86_regcallcc i32 @test_argReti32(i32 %b)
251   %d = add i32 %c, 1
252   ret i32 %d
255 ; Test regcall when receiving/returning i64
256 define dso_local x86_regcallcc i64 @test_argReti64(i64 %a)  {
257 ; X32-LABEL: test_argReti64:
258 ; X32:       # %bb.0:
259 ; X32-NEXT:    addl $3, %eax
260 ; X32-NEXT:    adcl $1, %ecx
261 ; X32-NEXT:    retl
263 ; WIN64-LABEL: test_argReti64:
264 ; WIN64:       # %bb.0:
265 ; WIN64-NEXT:    movabsq $4294967299, %rcx # imm = 0x100000003
266 ; WIN64-NEXT:    addq %rcx, %rax
267 ; WIN64-NEXT:    retq
269 ; LINUXOSX64-LABEL: test_argReti64:
270 ; LINUXOSX64:       # %bb.0:
271 ; LINUXOSX64-NEXT:    movabsq $4294967299, %rcx # imm = 0x100000003
272 ; LINUXOSX64-NEXT:    addq %rcx, %rax
273 ; LINUXOSX64-NEXT:    retq
274   %add = add i64 %a, 4294967299
275   ret i64 %add
278 ; Test regcall when passing/retrieving i64
279 define dso_local x86_regcallcc i64 @test_CallargReti64(i64 %a)  {
280 ; X32-LABEL: test_CallargReti64:
281 ; X32:       # %bb.0:
282 ; X32-NEXT:    addl $1, %eax
283 ; X32-NEXT:    adcl $0, %ecx
284 ; X32-NEXT:    calll _test_argReti64
285 ; X32-NEXT:    addl $1, %eax
286 ; X32-NEXT:    adcl $0, %ecx
287 ; X32-NEXT:    retl
289 ; WIN64-LABEL: test_CallargReti64:
290 ; WIN64:       # %bb.0:
291 ; WIN64-NEXT:    pushq %rax
292 ; WIN64-NEXT:    .seh_stackalloc 8
293 ; WIN64-NEXT:    .seh_endprologue
294 ; WIN64-NEXT:    incq %rax
295 ; WIN64-NEXT:    callq test_argReti64
296 ; WIN64-NEXT:    incq %rax
297 ; WIN64-NEXT:    popq %rcx
298 ; WIN64-NEXT:    retq
299 ; WIN64-NEXT:    .seh_endproc
301 ; LINUXOSX64-LABEL: test_CallargReti64:
302 ; LINUXOSX64:       # %bb.0:
303 ; LINUXOSX64-NEXT:    pushq %rax
304 ; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 16
305 ; LINUXOSX64-NEXT:    incq %rax
306 ; LINUXOSX64-NEXT:    callq test_argReti64
307 ; LINUXOSX64-NEXT:    incq %rax
308 ; LINUXOSX64-NEXT:    popq %rcx
309 ; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 8
310 ; LINUXOSX64-NEXT:    retq
311   %b = add i64 %a, 1
312   %c = call x86_regcallcc i64 @test_argReti64(i64 %b)
313   %d = add i64 %c, 1
314   ret i64 %d
317 ; Test regcall when receiving/returning float
318 define dso_local x86_regcallcc float @test_argRetFloat(float %a)  {
319 ; X32-LABEL: test_argRetFloat:
320 ; X32:       # %bb.0:
321 ; X32-NEXT:    vaddss __real@3f800000, %xmm0, %xmm0
322 ; X32-NEXT:    retl
324 ; WIN64-LABEL: test_argRetFloat:
325 ; WIN64:       # %bb.0:
326 ; WIN64-NEXT:    vaddss __real@3f800000(%rip), %xmm0, %xmm0
327 ; WIN64-NEXT:    retq
329 ; LINUXOSX64-LABEL: test_argRetFloat:
330 ; LINUXOSX64:       # %bb.0:
331 ; LINUXOSX64-NEXT:    vaddss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
332 ; LINUXOSX64-NEXT:    retq
333   %add = fadd float 1.0, %a
334   ret float %add
337 ; Test regcall when passing/retrieving float
338 define dso_local x86_regcallcc float @test_CallargRetFloat(float %a)  {
339 ; X32-LABEL: test_CallargRetFloat:
340 ; X32:       # %bb.0:
341 ; X32-NEXT:    subl $28, %esp
342 ; X32-NEXT:    vmovups %xmm4, (%esp) # 16-byte Spill
343 ; X32-NEXT:    vmovss {{.*#+}} xmm4 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]
344 ; X32-NEXT:    vaddss %xmm4, %xmm0, %xmm0
345 ; X32-NEXT:    calll _test_argRetFloat
346 ; X32-NEXT:    vaddss %xmm4, %xmm0, %xmm0
347 ; X32-NEXT:    vmovups (%esp), %xmm4 # 16-byte Reload
348 ; X32-NEXT:    addl $28, %esp
349 ; X32-NEXT:    retl
351 ; WIN64-LABEL: test_CallargRetFloat:
352 ; WIN64:       # %bb.0:
353 ; WIN64-NEXT:    subq $24, %rsp
354 ; WIN64-NEXT:    .seh_stackalloc 24
355 ; WIN64-NEXT:    vmovaps %xmm8, (%rsp) # 16-byte Spill
356 ; WIN64-NEXT:    .seh_savexmm %xmm8, 0
357 ; WIN64-NEXT:    .seh_endprologue
358 ; WIN64-NEXT:    vmovss {{.*#+}} xmm8 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]
359 ; WIN64-NEXT:    vaddss %xmm0, %xmm8, %xmm0
360 ; WIN64-NEXT:    callq test_argRetFloat
361 ; WIN64-NEXT:    vaddss %xmm0, %xmm8, %xmm0
362 ; WIN64-NEXT:    vmovaps (%rsp), %xmm8 # 16-byte Reload
363 ; WIN64-NEXT:    addq $24, %rsp
364 ; WIN64-NEXT:    retq
365 ; WIN64-NEXT:    .seh_endproc
367 ; LINUXOSX64-LABEL: test_CallargRetFloat:
368 ; LINUXOSX64:       # %bb.0:
369 ; LINUXOSX64-NEXT:    subq $24, %rsp
370 ; LINUXOSX64-NEXT:    vmovaps %xmm8, (%rsp) # 16-byte Spill
371 ; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 32
372 ; LINUXOSX64-NEXT:    .cfi_offset %xmm8, -32
373 ; LINUXOSX64-NEXT:    vmovss {{.*#+}} xmm8 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]
374 ; LINUXOSX64-NEXT:    vaddss %xmm0, %xmm8, %xmm0
375 ; LINUXOSX64-NEXT:    callq test_argRetFloat
376 ; LINUXOSX64-NEXT:    vaddss %xmm0, %xmm8, %xmm0
377 ; LINUXOSX64-NEXT:    vmovaps (%rsp), %xmm8 # 16-byte Reload
378 ; LINUXOSX64-NEXT:    addq $24, %rsp
379 ; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 8
380 ; LINUXOSX64-NEXT:    retq
381   %b = fadd float 1.0, %a
382   %c = call x86_regcallcc float @test_argRetFloat(float %b)
383   %d = fadd float 1.0, %c
384   ret float %d
387 ; Test regcall when receiving/returning double
388 define dso_local x86_regcallcc double @test_argRetDouble(double %a)  {
389 ; X32-LABEL: test_argRetDouble:
390 ; X32:       # %bb.0:
391 ; X32-NEXT:    vaddsd __real@3ff0000000000000, %xmm0, %xmm0
392 ; X32-NEXT:    retl
394 ; WIN64-LABEL: test_argRetDouble:
395 ; WIN64:       # %bb.0:
396 ; WIN64-NEXT:    vaddsd __real@3ff0000000000000(%rip), %xmm0, %xmm0
397 ; WIN64-NEXT:    retq
399 ; LINUXOSX64-LABEL: test_argRetDouble:
400 ; LINUXOSX64:       # %bb.0:
401 ; LINUXOSX64-NEXT:    vaddsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
402 ; LINUXOSX64-NEXT:    retq
403   %add = fadd double %a, 1.0
404   ret double %add
407 ; Test regcall when passing/retrieving double
408 define dso_local x86_regcallcc double @test_CallargRetDouble(double %a)  {
409 ; X32-LABEL: test_CallargRetDouble:
410 ; X32:       # %bb.0:
411 ; X32-NEXT:    subl $28, %esp
412 ; X32-NEXT:    vmovups %xmm4, (%esp) # 16-byte Spill
413 ; X32-NEXT:    vmovsd {{.*#+}} xmm4 = [1.0E+0,0.0E+0]
414 ; X32-NEXT:    vaddsd %xmm4, %xmm0, %xmm0
415 ; X32-NEXT:    calll _test_argRetDouble
416 ; X32-NEXT:    vaddsd %xmm4, %xmm0, %xmm0
417 ; X32-NEXT:    vmovups (%esp), %xmm4 # 16-byte Reload
418 ; X32-NEXT:    addl $28, %esp
419 ; X32-NEXT:    retl
421 ; WIN64-LABEL: test_CallargRetDouble:
422 ; WIN64:       # %bb.0:
423 ; WIN64-NEXT:    subq $24, %rsp
424 ; WIN64-NEXT:    .seh_stackalloc 24
425 ; WIN64-NEXT:    vmovaps %xmm8, (%rsp) # 16-byte Spill
426 ; WIN64-NEXT:    .seh_savexmm %xmm8, 0
427 ; WIN64-NEXT:    .seh_endprologue
428 ; WIN64-NEXT:    vmovsd {{.*#+}} xmm8 = [1.0E+0,0.0E+0]
429 ; WIN64-NEXT:    vaddsd %xmm0, %xmm8, %xmm0
430 ; WIN64-NEXT:    callq test_argRetDouble
431 ; WIN64-NEXT:    vaddsd %xmm0, %xmm8, %xmm0
432 ; WIN64-NEXT:    vmovaps (%rsp), %xmm8 # 16-byte Reload
433 ; WIN64-NEXT:    addq $24, %rsp
434 ; WIN64-NEXT:    retq
435 ; WIN64-NEXT:    .seh_endproc
437 ; LINUXOSX64-LABEL: test_CallargRetDouble:
438 ; LINUXOSX64:       # %bb.0:
439 ; LINUXOSX64-NEXT:    subq $24, %rsp
440 ; LINUXOSX64-NEXT:    vmovaps %xmm8, (%rsp) # 16-byte Spill
441 ; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 32
442 ; LINUXOSX64-NEXT:    .cfi_offset %xmm8, -32
443 ; LINUXOSX64-NEXT:    vmovsd {{.*#+}} xmm8 = [1.0E+0,0.0E+0]
444 ; LINUXOSX64-NEXT:    vaddsd %xmm0, %xmm8, %xmm0
445 ; LINUXOSX64-NEXT:    callq test_argRetDouble
446 ; LINUXOSX64-NEXT:    vaddsd %xmm0, %xmm8, %xmm0
447 ; LINUXOSX64-NEXT:    vmovaps (%rsp), %xmm8 # 16-byte Reload
448 ; LINUXOSX64-NEXT:    addq $24, %rsp
449 ; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 8
450 ; LINUXOSX64-NEXT:    retq
451   %b = fadd double 1.0, %a
452   %c = call x86_regcallcc double @test_argRetDouble(double %b)
453   %d = fadd double 1.0, %c
454   ret double %d
457 ; Test regcall when receiving/returning long double
458 define dso_local x86_regcallcc x86_fp80 @test_argRetf80(x86_fp80 %a0) nounwind {
459 ; X32-LABEL: test_argRetf80:
460 ; X32:       # %bb.0:
461 ; X32-NEXT:    fadd %st, %st(0)
462 ; X32-NEXT:    retl
464 ; WIN64-LABEL: test_argRetf80:
465 ; WIN64:       # %bb.0:
466 ; WIN64-NEXT:    fadd %st, %st(0)
467 ; WIN64-NEXT:    retq
469 ; LINUXOSX64-LABEL: test_argRetf80:
470 ; LINUXOSX64:       # %bb.0:
471 ; LINUXOSX64-NEXT:    fadd %st, %st(0)
472 ; LINUXOSX64-NEXT:    retq
473   %r0 = fadd x86_fp80 %a0, %a0
474   ret x86_fp80 %r0
477 ; Test regcall when receiving/returning long double
478 define dso_local x86_regcallcc double @test_argParamf80(x86_fp80 %a0) nounwind {
479 ; X32-LABEL: test_argParamf80:
480 ; X32:       # %bb.0:
481 ; X32-NEXT:    pushl %ebp
482 ; X32-NEXT:    movl %esp, %ebp
483 ; X32-NEXT:    andl $-8, %esp
484 ; X32-NEXT:    subl $8, %esp
485 ; X32-NEXT:    fstpl (%esp)
486 ; X32-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
487 ; X32-NEXT:    movl %ebp, %esp
488 ; X32-NEXT:    popl %ebp
489 ; X32-NEXT:    retl
491 ; WIN64-LABEL: test_argParamf80:
492 ; WIN64:       # %bb.0:
493 ; WIN64-NEXT:    pushq %rax
494 ; WIN64-NEXT:    fstpl (%rsp)
495 ; WIN64-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
496 ; WIN64-NEXT:    popq %rax
497 ; WIN64-NEXT:    retq
499 ; LINUXOSX64-LABEL: test_argParamf80:
500 ; LINUXOSX64:       # %bb.0:
501 ; LINUXOSX64-NEXT:    fstpl -{{[0-9]+}}(%rsp)
502 ; LINUXOSX64-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
503 ; LINUXOSX64-NEXT:    retq
504   %r0 = fptrunc x86_fp80 %a0 to double
505   ret double %r0
508 ; Test regcall when passing/retrieving long double
509 define x86_regcallcc x86_fp80 @test_CallargRetf80(x86_fp80 %a)  {
510 ; X32-LABEL: test_CallargRetf80:
511 ; X32:       # %bb.0:
512 ; X32-NEXT:    fadd %st, %st(0)
513 ; X32-NEXT:    calll _test_argRetf80
514 ; X32-NEXT:    fadd %st, %st(0)
515 ; X32-NEXT:    retl
517 ; WIN64-LABEL: test_CallargRetf80:
518 ; WIN64:       # %bb.0:
519 ; WIN64-NEXT:    pushq %rax
520 ; WIN64-NEXT:    .seh_stackalloc 8
521 ; WIN64-NEXT:    .seh_endprologue
522 ; WIN64-NEXT:    fadd %st, %st(0)
523 ; WIN64-NEXT:    callq test_argRetf80
524 ; WIN64-NEXT:    fadd %st, %st(0)
525 ; WIN64-NEXT:    popq %rax
526 ; WIN64-NEXT:    retq
527 ; WIN64-NEXT:    .seh_endproc
529 ; LINUXOSX64-LABEL: test_CallargRetf80:
530 ; LINUXOSX64:       # %bb.0:
531 ; LINUXOSX64-NEXT:    pushq %rax
532 ; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 16
533 ; LINUXOSX64-NEXT:    fadd %st, %st(0)
534 ; LINUXOSX64-NEXT:    callq test_argRetf80
535 ; LINUXOSX64-NEXT:    fadd %st, %st(0)
536 ; LINUXOSX64-NEXT:    popq %rax
537 ; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 8
538 ; LINUXOSX64-NEXT:    retq
539   %b = fadd x86_fp80 %a, %a
540   %c = call x86_regcallcc x86_fp80 @test_argRetf80(x86_fp80 %b)
541   %d = fadd x86_fp80 %c, %c
542   ret x86_fp80 %d
545 define dso_local x86_regcallcc double @test_CallargParamf80(x86_fp80 %a)  {
546 ; X32-LABEL: test_CallargParamf80:
547 ; X32:       # %bb.0:
548 ; X32-NEXT:    fadd %st, %st(0)
549 ; X32-NEXT:    calll _test_argParamf80
550 ; X32-NEXT:    vaddsd %xmm0, %xmm0, %xmm0
551 ; X32-NEXT:    retl
553 ; WIN64-LABEL: test_CallargParamf80:
554 ; WIN64:       # %bb.0:
555 ; WIN64-NEXT:    pushq %rax
556 ; WIN64-NEXT:    .seh_stackalloc 8
557 ; WIN64-NEXT:    .seh_endprologue
558 ; WIN64-NEXT:    fadd %st, %st(0)
559 ; WIN64-NEXT:    callq test_argParamf80
560 ; WIN64-NEXT:    vaddsd %xmm0, %xmm0, %xmm0
561 ; WIN64-NEXT:    popq %rax
562 ; WIN64-NEXT:    retq
563 ; WIN64-NEXT:    .seh_endproc
565 ; LINUXOSX64-LABEL: test_CallargParamf80:
566 ; LINUXOSX64:       # %bb.0:
567 ; LINUXOSX64-NEXT:    pushq %rax
568 ; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 16
569 ; LINUXOSX64-NEXT:    fadd %st, %st(0)
570 ; LINUXOSX64-NEXT:    callq test_argParamf80
571 ; LINUXOSX64-NEXT:    vaddsd %xmm0, %xmm0, %xmm0
572 ; LINUXOSX64-NEXT:    popq %rax
573 ; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 8
574 ; LINUXOSX64-NEXT:    retq
575   %b = fadd x86_fp80 %a, %a
576   %c = call x86_regcallcc double @test_argParamf80(x86_fp80 %b)
577   %d = fadd double %c, %c
578   ret double %d
581 ; Test regcall when receiving/returning pointer
582 define dso_local x86_regcallcc ptr @test_argRetPointer(ptr %a)  {
583 ; X32-LABEL: test_argRetPointer:
584 ; X32:       # %bb.0:
585 ; X32-NEXT:    incl %eax
586 ; X32-NEXT:    retl
588 ; WIN64-LABEL: test_argRetPointer:
589 ; WIN64:       # %bb.0:
590 ; WIN64-NEXT:    incl %eax
591 ; WIN64-NEXT:    retq
593 ; LINUXOSX64-LABEL: test_argRetPointer:
594 ; LINUXOSX64:       # %bb.0:
595 ; LINUXOSX64-NEXT:    incl %eax
596 ; LINUXOSX64-NEXT:    retq
597   %b = ptrtoint ptr %a to i32
598   %c = add i32 %b, 1
599   %d = inttoptr i32 %c to ptr
600   ret ptr %d
603 ; Test regcall when passing/retrieving pointer
604 define dso_local x86_regcallcc ptr @test_CallargRetPointer(ptr %a)  {
605 ; X32-LABEL: test_CallargRetPointer:
606 ; X32:       # %bb.0:
607 ; X32-NEXT:    incl %eax
608 ; X32-NEXT:    calll _test_argRetPointer
609 ; X32-NEXT:    incl %eax
610 ; X32-NEXT:    retl
612 ; WIN64-LABEL: test_CallargRetPointer:
613 ; WIN64:       # %bb.0:
614 ; WIN64-NEXT:    pushq %rax
615 ; WIN64-NEXT:    .seh_stackalloc 8
616 ; WIN64-NEXT:    .seh_endprologue
617 ; WIN64-NEXT:    incl %eax
618 ; WIN64-NEXT:    callq test_argRetPointer
619 ; WIN64-NEXT:    incl %eax
620 ; WIN64-NEXT:    popq %rcx
621 ; WIN64-NEXT:    retq
622 ; WIN64-NEXT:    .seh_endproc
624 ; LINUXOSX64-LABEL: test_CallargRetPointer:
625 ; LINUXOSX64:       # %bb.0:
626 ; LINUXOSX64-NEXT:    pushq %rax
627 ; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 16
628 ; LINUXOSX64-NEXT:    incl %eax
629 ; LINUXOSX64-NEXT:    callq test_argRetPointer
630 ; LINUXOSX64-NEXT:    incl %eax
631 ; LINUXOSX64-NEXT:    popq %rcx
632 ; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 8
633 ; LINUXOSX64-NEXT:    retq
634   %b = ptrtoint ptr %a to i32
635   %c = add i32 %b, 1
636   %d = inttoptr i32 %c to ptr
637   %e = call x86_regcallcc ptr @test_argRetPointer(ptr %d)
638   %f = ptrtoint ptr %e to i32
639   %g = add i32 %f, 1
640   %h = inttoptr i32 %g to ptr
641   ret ptr %h
644 ; Test regcall when receiving/returning 128 bit vector
645 define dso_local x86_regcallcc <4 x i32> @test_argRet128Vector(<4 x i1> %x, <4 x i32> %a, <4 x i32> %b)  {
646 ; X32-LABEL: test_argRet128Vector:
647 ; X32:       # %bb.0:
648 ; X32-NEXT:    vpslld $31, %xmm0, %xmm0
649 ; X32-NEXT:    vpmovd2m %xmm0, %k1
650 ; X32-NEXT:    vpblendmd %xmm1, %xmm2, %xmm0 {%k1}
651 ; X32-NEXT:    retl
653 ; WIN64-LABEL: test_argRet128Vector:
654 ; WIN64:       # %bb.0:
655 ; WIN64-NEXT:    vpslld $31, %xmm0, %xmm0
656 ; WIN64-NEXT:    vpmovd2m %xmm0, %k1
657 ; WIN64-NEXT:    vpblendmd %xmm1, %xmm2, %xmm0 {%k1}
658 ; WIN64-NEXT:    retq
660 ; LINUXOSX64-LABEL: test_argRet128Vector:
661 ; LINUXOSX64:       # %bb.0:
662 ; LINUXOSX64-NEXT:    vpslld $31, %xmm0, %xmm0
663 ; LINUXOSX64-NEXT:    vpmovd2m %xmm0, %k1
664 ; LINUXOSX64-NEXT:    vpblendmd %xmm1, %xmm2, %xmm0 {%k1}
665 ; LINUXOSX64-NEXT:    retq
666   %d = select <4 x i1> %x, <4 x i32> %a, <4 x i32> %b
667   ret <4 x i32> %d
670 ; Test regcall when passing/retrieving 128 bit vector
671 define dso_local x86_regcallcc <4 x i32> @test_CallargRet128Vector(<4 x i1> %x, <4 x i32> %a)  {
672 ; X32-LABEL: test_CallargRet128Vector:
673 ; X32:       # %bb.0:
674 ; X32-NEXT:    subl $44, %esp
675 ; X32-NEXT:    vmovups %xmm4, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
676 ; X32-NEXT:    vmovdqa %xmm1, %xmm4
677 ; X32-NEXT:    vpslld $31, %xmm0, %xmm1
678 ; X32-NEXT:    vpmovd2m %xmm1, %k1
679 ; X32-NEXT:    kmovw %k1, {{[-0-9]+}}(%e{{[sb]}}p) # 2-byte Spill
680 ; X32-NEXT:    vmovdqa %xmm4, %xmm1
681 ; X32-NEXT:    vmovdqa %xmm4, %xmm2
682 ; X32-NEXT:    calll _test_argRet128Vector
683 ; X32-NEXT:    kmovw {{[-0-9]+}}(%e{{[sb]}}p), %k1 # 2-byte Reload
684 ; X32-NEXT:    vmovdqa32 %xmm4, %xmm0 {%k1}
685 ; X32-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %xmm4 # 16-byte Reload
686 ; X32-NEXT:    addl $44, %esp
687 ; X32-NEXT:    retl
689 ; WIN64-LABEL: test_CallargRet128Vector:
690 ; WIN64:       # %bb.0:
691 ; WIN64-NEXT:    subq $40, %rsp
692 ; WIN64-NEXT:    .seh_stackalloc 40
693 ; WIN64-NEXT:    vmovaps %xmm8, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
694 ; WIN64-NEXT:    .seh_savexmm %xmm8, 16
695 ; WIN64-NEXT:    .seh_endprologue
696 ; WIN64-NEXT:    vmovdqa %xmm1, %xmm8
697 ; WIN64-NEXT:    vpslld $31, %xmm0, %xmm1
698 ; WIN64-NEXT:    vpmovd2m %xmm1, %k1
699 ; WIN64-NEXT:    kmovw %k1, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill
700 ; WIN64-NEXT:    vmovdqa %xmm8, %xmm1
701 ; WIN64-NEXT:    vmovdqa %xmm8, %xmm2
702 ; WIN64-NEXT:    callq test_argRet128Vector
703 ; WIN64-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k1 # 2-byte Reload
704 ; WIN64-NEXT:    vmovdqa32 %xmm8, %xmm0 {%k1}
705 ; WIN64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm8 # 16-byte Reload
706 ; WIN64-NEXT:    addq $40, %rsp
707 ; WIN64-NEXT:    retq
708 ; WIN64-NEXT:    .seh_endproc
710 ; LINUXOSX64-LABEL: test_CallargRet128Vector:
711 ; LINUXOSX64:       # %bb.0:
712 ; LINUXOSX64-NEXT:    subq $40, %rsp
713 ; LINUXOSX64-NEXT:    vmovaps %xmm8, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
714 ; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 48
715 ; LINUXOSX64-NEXT:    .cfi_offset %xmm8, -32
716 ; LINUXOSX64-NEXT:    vmovdqa %xmm1, %xmm8
717 ; LINUXOSX64-NEXT:    vpslld $31, %xmm0, %xmm1
718 ; LINUXOSX64-NEXT:    vpmovd2m %xmm1, %k1
719 ; LINUXOSX64-NEXT:    kmovw %k1, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill
720 ; LINUXOSX64-NEXT:    vmovdqa %xmm8, %xmm1
721 ; LINUXOSX64-NEXT:    vmovdqa %xmm8, %xmm2
722 ; LINUXOSX64-NEXT:    callq test_argRet128Vector
723 ; LINUXOSX64-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k1 # 2-byte Reload
724 ; LINUXOSX64-NEXT:    vmovdqa32 %xmm8, %xmm0 {%k1}
725 ; LINUXOSX64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm8 # 16-byte Reload
726 ; LINUXOSX64-NEXT:    addq $40, %rsp
727 ; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 8
728 ; LINUXOSX64-NEXT:    retq
729   %b = call x86_regcallcc <4 x i32> @test_argRet128Vector(<4 x i1> %x, <4 x i32> %a, <4 x i32> %a)
730   %c = select <4 x i1> %x, <4 x i32> %a, <4 x i32> %b
731   ret <4 x i32> %c
734 ; Test regcall when receiving/returning 256 bit vector
735 define dso_local x86_regcallcc <8 x i32> @test_argRet256Vector(<8 x i1> %x, <8 x i32> %a, <8 x i32> %b)  {
736 ; X32-LABEL: test_argRet256Vector:
737 ; X32:       # %bb.0:
738 ; X32-NEXT:    kmovd %eax, %k1
739 ; X32-NEXT:    vpblendmd %ymm0, %ymm1, %ymm0 {%k1}
740 ; X32-NEXT:    retl
742 ; WIN64-LABEL: test_argRet256Vector:
743 ; WIN64:       # %bb.0:
744 ; WIN64-NEXT:    kmovd %eax, %k1
745 ; WIN64-NEXT:    vpblendmd %ymm0, %ymm1, %ymm0 {%k1}
746 ; WIN64-NEXT:    retq
748 ; LINUXOSX64-LABEL: test_argRet256Vector:
749 ; LINUXOSX64:       # %bb.0:
750 ; LINUXOSX64-NEXT:    kmovd %eax, %k1
751 ; LINUXOSX64-NEXT:    vpblendmd %ymm0, %ymm1, %ymm0 {%k1}
752 ; LINUXOSX64-NEXT:    retq
753   %d = select <8 x i1> %x, <8 x i32> %a, <8 x i32> %b
754   ret <8 x i32> %d
757 ; Test regcall when passing/retrieving 256 bit vector
758 define dso_local x86_regcallcc <8 x i32> @test_CallargRet256Vector(<8 x i1> %x, <8 x i32> %a)  {
759 ; X32-LABEL: test_CallargRet256Vector:
760 ; X32:       # %bb.0:
761 ; X32-NEXT:    subl $36, %esp
762 ; X32-NEXT:    vmovdqu %ymm0, {{[-0-9]+}}(%e{{[sb]}}p) # 32-byte Spill
763 ; X32-NEXT:    kmovd %eax, %k1
764 ; X32-NEXT:    kmovw %k1, {{[-0-9]+}}(%e{{[sb]}}p) # 2-byte Spill
765 ; X32-NEXT:    vmovdqa %ymm0, %ymm1
766 ; X32-NEXT:    calll _test_argRet256Vector
767 ; X32-NEXT:    kmovw {{[-0-9]+}}(%e{{[sb]}}p), %k1 # 2-byte Reload
768 ; X32-NEXT:    vmovdqu {{[-0-9]+}}(%e{{[sb]}}p), %ymm1 # 32-byte Reload
769 ; X32-NEXT:    vmovdqa32 %ymm1, %ymm0 {%k1}
770 ; X32-NEXT:    addl $36, %esp
771 ; X32-NEXT:    retl
773 ; WIN64-LABEL: test_CallargRet256Vector:
774 ; WIN64:       # %bb.0:
775 ; WIN64-NEXT:    subq $56, %rsp
776 ; WIN64-NEXT:    .seh_stackalloc 56
777 ; WIN64-NEXT:    .seh_endprologue
778 ; WIN64-NEXT:    vmovdqu %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
779 ; WIN64-NEXT:    kmovd %eax, %k1
780 ; WIN64-NEXT:    kmovw %k1, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill
781 ; WIN64-NEXT:    vmovdqa %ymm0, %ymm1
782 ; WIN64-NEXT:    callq test_argRet256Vector
783 ; WIN64-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k1 # 2-byte Reload
784 ; WIN64-NEXT:    vmovdqu {{[-0-9]+}}(%r{{[sb]}}p), %ymm1 # 32-byte Reload
785 ; WIN64-NEXT:    vmovdqa32 %ymm1, %ymm0 {%k1}
786 ; WIN64-NEXT:    addq $56, %rsp
787 ; WIN64-NEXT:    retq
788 ; WIN64-NEXT:    .seh_endproc
790 ; LINUXOSX64-LABEL: test_CallargRet256Vector:
791 ; LINUXOSX64:       # %bb.0:
792 ; LINUXOSX64-NEXT:    subq $56, %rsp
793 ; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 64
794 ; LINUXOSX64-NEXT:    vmovdqu %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
795 ; LINUXOSX64-NEXT:    kmovd %eax, %k1
796 ; LINUXOSX64-NEXT:    kmovw %k1, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill
797 ; LINUXOSX64-NEXT:    vmovdqa %ymm0, %ymm1
798 ; LINUXOSX64-NEXT:    callq test_argRet256Vector
799 ; LINUXOSX64-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k1 # 2-byte Reload
800 ; LINUXOSX64-NEXT:    vmovdqu {{[-0-9]+}}(%r{{[sb]}}p), %ymm1 # 32-byte Reload
801 ; LINUXOSX64-NEXT:    vmovdqa32 %ymm1, %ymm0 {%k1}
802 ; LINUXOSX64-NEXT:    addq $56, %rsp
803 ; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 8
804 ; LINUXOSX64-NEXT:    retq
805   %b = call x86_regcallcc <8 x i32> @test_argRet256Vector(<8 x i1> %x, <8 x i32> %a, <8 x i32> %a)
806   %c = select <8 x i1> %x, <8 x i32> %a, <8 x i32> %b
807   ret <8 x i32> %c
810 ; Test regcall when receiving/returning 512 bit vector
811 define dso_local x86_regcallcc <16 x i32> @test_argRet512Vector(<16 x i1> %x, <16 x i32> %a, <16 x i32> %b)  {
812 ; X32-LABEL: test_argRet512Vector:
813 ; X32:       # %bb.0:
814 ; X32-NEXT:    kmovd %eax, %k1
815 ; X32-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1}
816 ; X32-NEXT:    retl
818 ; WIN64-LABEL: test_argRet512Vector:
819 ; WIN64:       # %bb.0:
820 ; WIN64-NEXT:    kmovd %eax, %k1
821 ; WIN64-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1}
822 ; WIN64-NEXT:    retq
824 ; LINUXOSX64-LABEL: test_argRet512Vector:
825 ; LINUXOSX64:       # %bb.0:
826 ; LINUXOSX64-NEXT:    kmovd %eax, %k1
827 ; LINUXOSX64-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1}
828 ; LINUXOSX64-NEXT:    retq
829   %d = select <16 x i1> %x, <16 x i32> %a, <16 x i32> %b
830   ret <16 x i32> %d
833 ; Test regcall when passing/retrieving 512 bit vector
834 define dso_local x86_regcallcc <16 x i32> @test_CallargRet512Vector(<16 x i1> %x, <16 x i32> %a)  {
835 ; X32-LABEL: test_CallargRet512Vector:
836 ; X32:       # %bb.0:
837 ; X32-NEXT:    subl $68, %esp
838 ; X32-NEXT:    vmovdqu64 %zmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 64-byte Spill
839 ; X32-NEXT:    kmovd %eax, %k1
840 ; X32-NEXT:    kmovw %k1, {{[-0-9]+}}(%e{{[sb]}}p) # 2-byte Spill
841 ; X32-NEXT:    vmovdqa64 %zmm0, %zmm1
842 ; X32-NEXT:    calll _test_argRet512Vector
843 ; X32-NEXT:    kmovw {{[-0-9]+}}(%e{{[sb]}}p), %k1 # 2-byte Reload
844 ; X32-NEXT:    vmovdqu64 {{[-0-9]+}}(%e{{[sb]}}p), %zmm1 # 64-byte Reload
845 ; X32-NEXT:    vmovdqa32 %zmm1, %zmm0 {%k1}
846 ; X32-NEXT:    addl $68, %esp
847 ; X32-NEXT:    retl
849 ; WIN64-LABEL: test_CallargRet512Vector:
850 ; WIN64:       # %bb.0:
851 ; WIN64-NEXT:    subq $88, %rsp
852 ; WIN64-NEXT:    .seh_stackalloc 88
853 ; WIN64-NEXT:    .seh_endprologue
854 ; WIN64-NEXT:    vmovdqu64 %zmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 64-byte Spill
855 ; WIN64-NEXT:    kmovd %eax, %k1
856 ; WIN64-NEXT:    kmovw %k1, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill
857 ; WIN64-NEXT:    vmovdqa64 %zmm0, %zmm1
858 ; WIN64-NEXT:    callq test_argRet512Vector
859 ; WIN64-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k1 # 2-byte Reload
860 ; WIN64-NEXT:    vmovdqu64 {{[-0-9]+}}(%r{{[sb]}}p), %zmm1 # 64-byte Reload
861 ; WIN64-NEXT:    vmovdqa32 %zmm1, %zmm0 {%k1}
862 ; WIN64-NEXT:    addq $88, %rsp
863 ; WIN64-NEXT:    retq
864 ; WIN64-NEXT:    .seh_endproc
866 ; LINUXOSX64-LABEL: test_CallargRet512Vector:
867 ; LINUXOSX64:       # %bb.0:
868 ; LINUXOSX64-NEXT:    subq $88, %rsp
869 ; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 96
870 ; LINUXOSX64-NEXT:    vmovdqu64 %zmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 64-byte Spill
871 ; LINUXOSX64-NEXT:    kmovd %eax, %k1
872 ; LINUXOSX64-NEXT:    kmovw %k1, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill
873 ; LINUXOSX64-NEXT:    vmovdqa64 %zmm0, %zmm1
874 ; LINUXOSX64-NEXT:    callq test_argRet512Vector
875 ; LINUXOSX64-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k1 # 2-byte Reload
876 ; LINUXOSX64-NEXT:    vmovdqu64 {{[-0-9]+}}(%r{{[sb]}}p), %zmm1 # 64-byte Reload
877 ; LINUXOSX64-NEXT:    vmovdqa32 %zmm1, %zmm0 {%k1}
878 ; LINUXOSX64-NEXT:    addq $88, %rsp
879 ; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 8
880 ; LINUXOSX64-NEXT:    retq
881   %b = call x86_regcallcc <16 x i32> @test_argRet512Vector(<16 x i1> %x, <16 x i32> %a, <16 x i32> %a)
882   %c = select <16 x i1> %x, <16 x i32> %a, <16 x i32> %b
883   ret <16 x i32> %c
886 ; Test regcall when running multiple input parameters - callee saved xmms
887 define dso_local x86_regcallcc <32 x float> @testf32_inp(<32 x float> %a, <32 x float> %b, <32 x float> %c) nounwind {
888 ; X32-LABEL: testf32_inp:
889 ; X32:       # %bb.0:
890 ; X32-NEXT:    subl $44, %esp
891 ; X32-NEXT:    vmovups %xmm7, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
892 ; X32-NEXT:    vmovups %xmm6, (%esp) # 16-byte Spill
893 ; X32-NEXT:    vaddps %zmm2, %zmm0, %zmm6
894 ; X32-NEXT:    vaddps %zmm3, %zmm1, %zmm7
895 ; X32-NEXT:    vmulps %zmm2, %zmm0, %zmm0
896 ; X32-NEXT:    vsubps %zmm0, %zmm6, %zmm0
897 ; X32-NEXT:    vmulps %zmm3, %zmm1, %zmm1
898 ; X32-NEXT:    vsubps %zmm1, %zmm7, %zmm1
899 ; X32-NEXT:    vaddps %zmm4, %zmm0, %zmm0
900 ; X32-NEXT:    vaddps %zmm5, %zmm1, %zmm1
901 ; X32-NEXT:    vmovups (%esp), %xmm6 # 16-byte Reload
902 ; X32-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %xmm7 # 16-byte Reload
903 ; X32-NEXT:    addl $44, %esp
904 ; X32-NEXT:    retl
906 ; WIN64-LABEL: testf32_inp:
907 ; WIN64:       # %bb.0:
908 ; WIN64-NEXT:    vaddps %zmm2, %zmm0, %zmm6
909 ; WIN64-NEXT:    vaddps %zmm3, %zmm1, %zmm7
910 ; WIN64-NEXT:    vmulps %zmm2, %zmm0, %zmm0
911 ; WIN64-NEXT:    vsubps %zmm0, %zmm6, %zmm0
912 ; WIN64-NEXT:    vmulps %zmm3, %zmm1, %zmm1
913 ; WIN64-NEXT:    vsubps %zmm1, %zmm7, %zmm1
914 ; WIN64-NEXT:    vaddps %zmm4, %zmm0, %zmm0
915 ; WIN64-NEXT:    vaddps %zmm5, %zmm1, %zmm1
916 ; WIN64-NEXT:    retq
918 ; LINUXOSX64-LABEL: testf32_inp:
919 ; LINUXOSX64:       # %bb.0:
920 ; LINUXOSX64-NEXT:    vaddps %zmm2, %zmm0, %zmm6
921 ; LINUXOSX64-NEXT:    vaddps %zmm3, %zmm1, %zmm7
922 ; LINUXOSX64-NEXT:    vmulps %zmm2, %zmm0, %zmm0
923 ; LINUXOSX64-NEXT:    vsubps %zmm0, %zmm6, %zmm0
924 ; LINUXOSX64-NEXT:    vmulps %zmm3, %zmm1, %zmm1
925 ; LINUXOSX64-NEXT:    vsubps %zmm1, %zmm7, %zmm1
926 ; LINUXOSX64-NEXT:    vaddps %zmm4, %zmm0, %zmm0
927 ; LINUXOSX64-NEXT:    vaddps %zmm5, %zmm1, %zmm1
928 ; LINUXOSX64-NEXT:    retq
929   %x1 = fadd <32 x float> %a, %b
930   %x2 = fmul <32 x float> %a, %b
931   %x3 = fsub <32 x float> %x1, %x2
932   %x4 = fadd <32 x float> %x3, %c
933   ret <32 x float> %x4
936 ; Test regcall when running multiple input parameters - callee saved GPRs
937 define dso_local x86_regcallcc i32 @testi32_inp(i32 %a1, i32 %a2, i32 %a3, i32 %a4, i32 %a5, i32 %a6, i32 %b1, i32 %b2, i32 %b3, i32 %b4, i32 %b5, i32 %b6) nounwind {
938 ; X32-LABEL: testi32_inp:
939 ; X32:       # %bb.0:
940 ; X32-NEXT:    pushl %ebp
941 ; X32-NEXT:    pushl %ebx
942 ; X32-NEXT:    subl $12, %esp
943 ; X32-NEXT:    movl %esi, (%esp) # 4-byte Spill
944 ; X32-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
945 ; X32-NEXT:    movl %eax, %ebp
946 ; X32-NEXT:    leal (%edx,%edi), %eax
947 ; X32-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
948 ; X32-NEXT:    movl %edx, %eax
949 ; X32-NEXT:    subl %edi, %eax
950 ; X32-NEXT:    movl %ebp, %edx
951 ; X32-NEXT:    subl %ecx, %edx
952 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %ebx
953 ; X32-NEXT:    subl {{[0-9]+}}(%esp), %ebx
954 ; X32-NEXT:    imull %edx, %ebx
955 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %esi
956 ; X32-NEXT:    movl %esi, %edx
957 ; X32-NEXT:    subl {{[0-9]+}}(%esp), %edx
958 ; X32-NEXT:    imull %eax, %edx
959 ; X32-NEXT:    addl %ebx, %edx
960 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %ebx
961 ; X32-NEXT:    movl (%esp), %edi # 4-byte Reload
962 ; X32-NEXT:    subl %ebx, %edi
963 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
964 ; X32-NEXT:    movl %ecx, %eax
965 ; X32-NEXT:    subl {{[0-9]+}}(%esp), %eax
966 ; X32-NEXT:    imull %edi, %eax
967 ; X32-NEXT:    addl %edx, %eax
968 ; X32-NEXT:    addl {{[-0-9]+}}(%e{{[sb]}}p), %ebp # 4-byte Folded Reload
969 ; X32-NEXT:    addl (%esp), %ebx # 4-byte Folded Reload
970 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %edx
971 ; X32-NEXT:    addl {{[0-9]+}}(%esp), %edx
972 ; X32-NEXT:    imull %edx, %ebp
973 ; X32-NEXT:    addl {{[0-9]+}}(%esp), %esi
974 ; X32-NEXT:    imull {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload
975 ; X32-NEXT:    addl %esi, %ebp
976 ; X32-NEXT:    addl {{[0-9]+}}(%esp), %ecx
977 ; X32-NEXT:    imull %ebx, %ecx
978 ; X32-NEXT:    addl %ecx, %ebp
979 ; X32-NEXT:    addl %eax, %ebp
980 ; X32-NEXT:    movl %ebp, %eax
981 ; X32-NEXT:    addl $12, %esp
982 ; X32-NEXT:    popl %ebx
983 ; X32-NEXT:    popl %ebp
984 ; X32-NEXT:    retl
986 ; WIN64-LABEL: testi32_inp:
987 ; WIN64:       # %bb.0:
988 ; WIN64-NEXT:    pushq %rbp
989 ; WIN64-NEXT:    pushq %rbx
990 ; WIN64-NEXT:    # kill: def $edx killed $edx def $rdx
991 ; WIN64-NEXT:    # kill: def $esi killed $esi def $rsi
992 ; WIN64-NEXT:    # kill: def $r15d killed $r15d def $r15
993 ; WIN64-NEXT:    # kill: def $r14d killed $r14d def $r14
994 ; WIN64-NEXT:    # kill: def $r12d killed $r12d def $r12
995 ; WIN64-NEXT:    # kill: def $r11d killed $r11d def $r11
996 ; WIN64-NEXT:    # kill: def $r10d killed $r10d def $r10
997 ; WIN64-NEXT:    # kill: def $r9d killed $r9d def $r9
998 ; WIN64-NEXT:    # kill: def $r8d killed $r8d def $r8
999 ; WIN64-NEXT:    # kill: def $edi killed $edi def $rdi
1000 ; WIN64-NEXT:    leal (%rdx,%rdi), %ebx
1001 ; WIN64-NEXT:    movl %edx, %ebp
1002 ; WIN64-NEXT:    subl %edi, %ebp
1003 ; WIN64-NEXT:    leal (%rsi,%r8), %edx
1004 ; WIN64-NEXT:    # kill: def $esi killed $esi killed $rsi
1005 ; WIN64-NEXT:    subl %r8d, %esi
1006 ; WIN64-NEXT:    leal (%r9,%r10), %edi
1007 ; WIN64-NEXT:    movl %r9d, %r8d
1008 ; WIN64-NEXT:    subl %r10d, %r8d
1009 ; WIN64-NEXT:    movl %eax, %r9d
1010 ; WIN64-NEXT:    subl %ecx, %r9d
1011 ; WIN64-NEXT:    imull %r9d, %r8d
1012 ; WIN64-NEXT:    leal (%r11,%r12), %r9d
1013 ; WIN64-NEXT:    movl %r11d, %r10d
1014 ; WIN64-NEXT:    subl %r12d, %r10d
1015 ; WIN64-NEXT:    imull %ebp, %r10d
1016 ; WIN64-NEXT:    addl %r8d, %r10d
1017 ; WIN64-NEXT:    leal (%r14,%r15), %r8d
1018 ; WIN64-NEXT:    movl %r14d, %r11d
1019 ; WIN64-NEXT:    subl %r15d, %r11d
1020 ; WIN64-NEXT:    imull %esi, %r11d
1021 ; WIN64-NEXT:    addl %r10d, %r11d
1022 ; WIN64-NEXT:    addl %ecx, %eax
1023 ; WIN64-NEXT:    imull %edi, %eax
1024 ; WIN64-NEXT:    imull %ebx, %r9d
1025 ; WIN64-NEXT:    addl %r9d, %eax
1026 ; WIN64-NEXT:    imull %edx, %r8d
1027 ; WIN64-NEXT:    addl %r8d, %eax
1028 ; WIN64-NEXT:    addl %r11d, %eax
1029 ; WIN64-NEXT:    popq %rbx
1030 ; WIN64-NEXT:    popq %rbp
1031 ; WIN64-NEXT:    retq
1033 ; LINUXOSX64-LABEL: testi32_inp:
1034 ; LINUXOSX64:       # %bb.0:
1035 ; LINUXOSX64-NEXT:    # kill: def $edx killed $edx def $rdx
1036 ; LINUXOSX64-NEXT:    # kill: def $esi killed $esi def $rsi
1037 ; LINUXOSX64-NEXT:    # kill: def $r14d killed $r14d def $r14
1038 ; LINUXOSX64-NEXT:    # kill: def $r13d killed $r13d def $r13
1039 ; LINUXOSX64-NEXT:    # kill: def $r12d killed $r12d def $r12
1040 ; LINUXOSX64-NEXT:    # kill: def $r9d killed $r9d def $r9
1041 ; LINUXOSX64-NEXT:    # kill: def $r8d killed $r8d def $r8
1042 ; LINUXOSX64-NEXT:    # kill: def $edi killed $edi def $rdi
1043 ; LINUXOSX64-NEXT:    leal (%rdx,%rdi), %r10d
1044 ; LINUXOSX64-NEXT:    movl %edx, %r11d
1045 ; LINUXOSX64-NEXT:    subl %edi, %r11d
1046 ; LINUXOSX64-NEXT:    leal (%rsi,%r8), %edx
1047 ; LINUXOSX64-NEXT:    # kill: def $esi killed $esi killed $rsi
1048 ; LINUXOSX64-NEXT:    subl %r8d, %esi
1049 ; LINUXOSX64-NEXT:    leal (%r9,%r12), %edi
1050 ; LINUXOSX64-NEXT:    movl %r9d, %r8d
1051 ; LINUXOSX64-NEXT:    subl %r12d, %r8d
1052 ; LINUXOSX64-NEXT:    movl %eax, %r9d
1053 ; LINUXOSX64-NEXT:    subl %ecx, %r9d
1054 ; LINUXOSX64-NEXT:    imull %r9d, %r8d
1055 ; LINUXOSX64-NEXT:    leal (%r13,%r14), %r9d
1056 ; LINUXOSX64-NEXT:    movl %r13d, %r12d
1057 ; LINUXOSX64-NEXT:    subl %r14d, %r12d
1058 ; LINUXOSX64-NEXT:    imull %r11d, %r12d
1059 ; LINUXOSX64-NEXT:    movl {{[0-9]+}}(%rsp), %r11d
1060 ; LINUXOSX64-NEXT:    addl %r8d, %r12d
1061 ; LINUXOSX64-NEXT:    movl %r15d, %r8d
1062 ; LINUXOSX64-NEXT:    subl %r11d, %r8d
1063 ; LINUXOSX64-NEXT:    imull %esi, %r8d
1064 ; LINUXOSX64-NEXT:    addl %r12d, %r8d
1065 ; LINUXOSX64-NEXT:    addl %ecx, %eax
1066 ; LINUXOSX64-NEXT:    imull %edi, %eax
1067 ; LINUXOSX64-NEXT:    imull %r10d, %r9d
1068 ; LINUXOSX64-NEXT:    addl %r9d, %eax
1069 ; LINUXOSX64-NEXT:    addl %r15d, %r11d
1070 ; LINUXOSX64-NEXT:    imull %edx, %r11d
1071 ; LINUXOSX64-NEXT:    addl %r11d, %eax
1072 ; LINUXOSX64-NEXT:    addl %r8d, %eax
1073 ; LINUXOSX64-NEXT:    retq
1074   %x1 = sub i32 %a1, %a2
1075   %x2 = sub i32 %a3, %a4
1076   %x3 = sub i32 %a5, %a6
1077   %y1 = sub i32 %b1, %b2
1078   %y2 = sub i32 %b3, %b4
1079   %y3 = sub i32 %b5, %b6
1080   %v1 = add i32 %a1, %a2
1081   %v2 = add i32 %a3, %a4
1082   %v3 = add i32 %a5, %a6
1083   %w1 = add i32 %b1, %b2
1084   %w2 = add i32 %b3, %b4
1085   %w3 = add i32 %b5, %b6
1086   %s1 = mul i32 %x1, %y1
1087   %s2 = mul i32 %x2, %y2
1088   %s3 = mul i32 %x3, %y3
1089   %t1 = mul i32 %v1, %w1
1090   %t2 = mul i32 %v2, %w2
1091   %t3 = mul i32 %v3, %w3
1092   %m1 = add i32 %s1, %s2
1093   %m2 = add i32 %m1, %s3
1094   %n1 = add i32 %t1, %t2
1095   %n2 = add i32 %n1, %t3
1096   %r1 = add i32 %m2, %n2
1097   ret i32 %r1
1100 ; Test that parameters, overflowing register capacity, are passed through the stack
1101 define dso_local x86_regcallcc <32 x float> @testf32_stack(<32 x float> %a0, <32 x float> %b0, <32 x float> %c0, <32 x float> %a1, <32 x float> %b1, <32 x float> %c1, <32 x float> %a2, <32 x float> %b2, <32 x float> %c2) nounwind {
1102 ; X32-LABEL: testf32_stack:
1103 ; X32:       # %bb.0:
1104 ; X32-NEXT:    pushl %ebp
1105 ; X32-NEXT:    movl %esp, %ebp
1106 ; X32-NEXT:    andl $-64, %esp
1107 ; X32-NEXT:    subl $64, %esp
1108 ; X32-NEXT:    vaddps %zmm3, %zmm1, %zmm1
1109 ; X32-NEXT:    vaddps %zmm2, %zmm0, %zmm0
1110 ; X32-NEXT:    vaddps %zmm0, %zmm4, %zmm0
1111 ; X32-NEXT:    vaddps %zmm1, %zmm5, %zmm1
1112 ; X32-NEXT:    vaddps %zmm1, %zmm7, %zmm1
1113 ; X32-NEXT:    vaddps %zmm0, %zmm6, %zmm0
1114 ; X32-NEXT:    vaddps 8(%ebp), %zmm0, %zmm0
1115 ; X32-NEXT:    vaddps 72(%ebp), %zmm1, %zmm1
1116 ; X32-NEXT:    vaddps 200(%ebp), %zmm1, %zmm1
1117 ; X32-NEXT:    vaddps 136(%ebp), %zmm0, %zmm0
1118 ; X32-NEXT:    vaddps 264(%ebp), %zmm0, %zmm0
1119 ; X32-NEXT:    vaddps 328(%ebp), %zmm1, %zmm1
1120 ; X32-NEXT:    vaddps 456(%ebp), %zmm1, %zmm1
1121 ; X32-NEXT:    vaddps 392(%ebp), %zmm0, %zmm0
1122 ; X32-NEXT:    vaddps 520(%ebp), %zmm0, %zmm0
1123 ; X32-NEXT:    vaddps 584(%ebp), %zmm1, %zmm1
1124 ; X32-NEXT:    movl %ebp, %esp
1125 ; X32-NEXT:    popl %ebp
1126 ; X32-NEXT:    retl
1128 ; WIN64-LABEL: testf32_stack:
1129 ; WIN64:       # %bb.0:
1130 ; WIN64-NEXT:    pushq %rbp
1131 ; WIN64-NEXT:    subq $48, %rsp
1132 ; WIN64-NEXT:    leaq {{[0-9]+}}(%rsp), %rbp
1133 ; WIN64-NEXT:    andq $-64, %rsp
1134 ; WIN64-NEXT:    vaddps %zmm3, %zmm1, %zmm1
1135 ; WIN64-NEXT:    vaddps %zmm2, %zmm0, %zmm0
1136 ; WIN64-NEXT:    vaddps %zmm0, %zmm4, %zmm0
1137 ; WIN64-NEXT:    vaddps %zmm1, %zmm5, %zmm1
1138 ; WIN64-NEXT:    vaddps %zmm1, %zmm7, %zmm1
1139 ; WIN64-NEXT:    vaddps %zmm0, %zmm6, %zmm0
1140 ; WIN64-NEXT:    vaddps %zmm0, %zmm8, %zmm0
1141 ; WIN64-NEXT:    vaddps %zmm1, %zmm9, %zmm1
1142 ; WIN64-NEXT:    vaddps %zmm1, %zmm11, %zmm1
1143 ; WIN64-NEXT:    vaddps %zmm0, %zmm10, %zmm0
1144 ; WIN64-NEXT:    vaddps %zmm0, %zmm12, %zmm0
1145 ; WIN64-NEXT:    vaddps %zmm1, %zmm13, %zmm1
1146 ; WIN64-NEXT:    vaddps %zmm1, %zmm15, %zmm1
1147 ; WIN64-NEXT:    vaddps %zmm0, %zmm14, %zmm0
1148 ; WIN64-NEXT:    vaddps 16(%rbp), %zmm0, %zmm0
1149 ; WIN64-NEXT:    vaddps 80(%rbp), %zmm1, %zmm1
1150 ; WIN64-NEXT:    movq %rbp, %rsp
1151 ; WIN64-NEXT:    popq %rbp
1152 ; WIN64-NEXT:    retq
1154 ; LINUXOSX64-LABEL: testf32_stack:
1155 ; LINUXOSX64:       # %bb.0:
1156 ; LINUXOSX64-NEXT:    pushq %rbp
1157 ; LINUXOSX64-NEXT:    movq %rsp, %rbp
1158 ; LINUXOSX64-NEXT:    andq $-64, %rsp
1159 ; LINUXOSX64-NEXT:    subq $64, %rsp
1160 ; LINUXOSX64-NEXT:    vaddps %zmm3, %zmm1, %zmm1
1161 ; LINUXOSX64-NEXT:    vaddps %zmm2, %zmm0, %zmm0
1162 ; LINUXOSX64-NEXT:    vaddps %zmm0, %zmm4, %zmm0
1163 ; LINUXOSX64-NEXT:    vaddps %zmm1, %zmm5, %zmm1
1164 ; LINUXOSX64-NEXT:    vaddps %zmm1, %zmm7, %zmm1
1165 ; LINUXOSX64-NEXT:    vaddps %zmm0, %zmm6, %zmm0
1166 ; LINUXOSX64-NEXT:    vaddps %zmm0, %zmm8, %zmm0
1167 ; LINUXOSX64-NEXT:    vaddps %zmm1, %zmm9, %zmm1
1168 ; LINUXOSX64-NEXT:    vaddps %zmm1, %zmm11, %zmm1
1169 ; LINUXOSX64-NEXT:    vaddps %zmm0, %zmm10, %zmm0
1170 ; LINUXOSX64-NEXT:    vaddps %zmm0, %zmm12, %zmm0
1171 ; LINUXOSX64-NEXT:    vaddps %zmm1, %zmm13, %zmm1
1172 ; LINUXOSX64-NEXT:    vaddps %zmm1, %zmm15, %zmm1
1173 ; LINUXOSX64-NEXT:    vaddps %zmm0, %zmm14, %zmm0
1174 ; LINUXOSX64-NEXT:    vaddps 16(%rbp), %zmm0, %zmm0
1175 ; LINUXOSX64-NEXT:    vaddps 80(%rbp), %zmm1, %zmm1
1176 ; LINUXOSX64-NEXT:    movq %rbp, %rsp
1177 ; LINUXOSX64-NEXT:    popq %rbp
1178 ; LINUXOSX64-NEXT:    retq
1179   %x1 = fadd <32 x float> %a0, %b0
1180   %x2 = fadd <32 x float> %c0, %x1
1181   %x3 = fadd <32 x float> %a1, %x2
1182   %x4 = fadd <32 x float> %b1, %x3
1183   %x5 = fadd <32 x float> %c1, %x4
1184   %x6 = fadd <32 x float> %a2, %x5
1185   %x7 = fadd <32 x float> %b2, %x6
1186   %x8 = fadd <32 x float> %c2, %x7
1187   ret <32 x float> %x8
1190 ; Test regcall when passing/retrieving mixed types
1191 define dso_local x86_regcallcc i32 @test_argRetMixTypes(double, float, i8 signext, i32, i64, i16 signext, ptr) #0 {
1192 ; X32-LABEL: test_argRetMixTypes:
1193 ; X32:       # %bb.0:
1194 ; X32-NEXT:    pushl %ebx
1195 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %ebx
1196 ; X32-NEXT:    vcvtss2sd %xmm1, %xmm1, %xmm1
1197 ; X32-NEXT:    vaddsd %xmm0, %xmm1, %xmm0
1198 ; X32-NEXT:    vcvtsi2sd %eax, %xmm2, %xmm1
1199 ; X32-NEXT:    vaddsd %xmm1, %xmm0, %xmm0
1200 ; X32-NEXT:    vcvtsi2sd %ecx, %xmm2, %xmm1
1201 ; X32-NEXT:    vaddsd %xmm1, %xmm0, %xmm0
1202 ; X32-NEXT:    vmovd %edx, %xmm1
1203 ; X32-NEXT:    vpinsrd $1, %edi, %xmm1, %xmm1
1204 ; X32-NEXT:    vcvtqq2pd %ymm1, %ymm1
1205 ; X32-NEXT:    vaddsd %xmm1, %xmm0, %xmm0
1206 ; X32-NEXT:    vcvtsi2sd %esi, %xmm2, %xmm1
1207 ; X32-NEXT:    vaddsd %xmm1, %xmm0, %xmm0
1208 ; X32-NEXT:    vcvtsi2sdl (%ebx), %xmm2, %xmm1
1209 ; X32-NEXT:    vaddsd %xmm1, %xmm0, %xmm0
1210 ; X32-NEXT:    vcvttsd2si %xmm0, %eax
1211 ; X32-NEXT:    popl %ebx
1212 ; X32-NEXT:    vzeroupper
1213 ; X32-NEXT:    retl
1215 ; WIN64-LABEL: test_argRetMixTypes:
1216 ; WIN64:       # %bb.0:
1217 ; WIN64-NEXT:    vcvtss2sd %xmm1, %xmm1, %xmm1
1218 ; WIN64-NEXT:    vaddsd %xmm0, %xmm1, %xmm0
1219 ; WIN64-NEXT:    vcvtsi2sd %eax, %xmm2, %xmm1
1220 ; WIN64-NEXT:    vaddsd %xmm1, %xmm0, %xmm0
1221 ; WIN64-NEXT:    vcvtsi2sd %ecx, %xmm2, %xmm1
1222 ; WIN64-NEXT:    vaddsd %xmm1, %xmm0, %xmm0
1223 ; WIN64-NEXT:    vcvtsi2sd %rdx, %xmm2, %xmm1
1224 ; WIN64-NEXT:    vaddsd %xmm1, %xmm0, %xmm0
1225 ; WIN64-NEXT:    vcvtsi2sd %edi, %xmm2, %xmm1
1226 ; WIN64-NEXT:    vaddsd %xmm1, %xmm0, %xmm0
1227 ; WIN64-NEXT:    vcvtsi2sdl (%rsi), %xmm2, %xmm1
1228 ; WIN64-NEXT:    vaddsd %xmm1, %xmm0, %xmm0
1229 ; WIN64-NEXT:    vcvttsd2si %xmm0, %eax
1230 ; WIN64-NEXT:    retq
1232 ; LINUXOSX64-LABEL: test_argRetMixTypes:
1233 ; LINUXOSX64:       # %bb.0:
1234 ; LINUXOSX64-NEXT:    vcvtss2sd %xmm1, %xmm1, %xmm1
1235 ; LINUXOSX64-NEXT:    vaddsd %xmm0, %xmm1, %xmm0
1236 ; LINUXOSX64-NEXT:    vcvtsi2sd %eax, %xmm2, %xmm1
1237 ; LINUXOSX64-NEXT:    vaddsd %xmm1, %xmm0, %xmm0
1238 ; LINUXOSX64-NEXT:    vcvtsi2sd %ecx, %xmm2, %xmm1
1239 ; LINUXOSX64-NEXT:    vaddsd %xmm1, %xmm0, %xmm0
1240 ; LINUXOSX64-NEXT:    vcvtsi2sd %rdx, %xmm2, %xmm1
1241 ; LINUXOSX64-NEXT:    vaddsd %xmm1, %xmm0, %xmm0
1242 ; LINUXOSX64-NEXT:    vcvtsi2sd %edi, %xmm2, %xmm1
1243 ; LINUXOSX64-NEXT:    vaddsd %xmm1, %xmm0, %xmm0
1244 ; LINUXOSX64-NEXT:    vcvtsi2sdl (%rsi), %xmm2, %xmm1
1245 ; LINUXOSX64-NEXT:    vaddsd %xmm1, %xmm0, %xmm0
1246 ; LINUXOSX64-NEXT:    vcvttsd2si %xmm0, %eax
1247 ; LINUXOSX64-NEXT:    retq
1248   %8 = fpext float %1 to double
1249   %9 = fadd double %8, %0
1250   %10 = sitofp i8 %2 to double
1251   %11 = fadd double %9, %10
1252   %12 = sitofp i32 %3 to double
1253   %13 = fadd double %11, %12
1254   %14 = sitofp i64 %4 to double
1255   %15 = fadd double %13, %14
1256   %16 = sitofp i16 %5 to double
1257   %17 = fadd double %15, %16
1258   %18 = load i32, ptr %6, align 4
1259   %19 = sitofp i32 %18 to double
1260   %20 = fadd double %17, %19
1261   %21 = fptosi double %20 to i32
1262   ret i32 %21
1265 %struct.complex = type { float, double, i32, i8, i64}
1267 define x86_regcallcc %struct.complex @test_argMultiRet(float, double, i32, i8, i64) local_unnamed_addr #0 {
1268 ; X32-LABEL: test_argMultiRet:
1269 ; X32:       # %bb.0:
1270 ; X32-NEXT:    vaddsd __real@4014000000000000, %xmm1, %xmm1
1271 ; X32-NEXT:    movl $4, %eax
1272 ; X32-NEXT:    movb $7, %cl
1273 ; X32-NEXT:    movl $999, %edx # imm = 0x3E7
1274 ; X32-NEXT:    xorl %edi, %edi
1275 ; X32-NEXT:    retl
1277 ; WIN64-LABEL: test_argMultiRet:
1278 ; WIN64:       # %bb.0:
1279 ; WIN64-NEXT:    vaddsd __real@4014000000000000(%rip), %xmm1, %xmm1
1280 ; WIN64-NEXT:    movl $999, %edx # imm = 0x3E7
1281 ; WIN64-NEXT:    movl $4, %eax
1282 ; WIN64-NEXT:    movb $7, %cl
1283 ; WIN64-NEXT:    retq
1285 ; LINUXOSX64-LABEL: test_argMultiRet:
1286 ; LINUXOSX64:       # %bb.0:
1287 ; LINUXOSX64-NEXT:    vaddsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
1288 ; LINUXOSX64-NEXT:    movl $999, %edx # imm = 0x3E7
1289 ; LINUXOSX64-NEXT:    movl $4, %eax
1290 ; LINUXOSX64-NEXT:    movb $7, %cl
1291 ; LINUXOSX64-NEXT:    retq
1292   %6 = fadd double %1, 5.000000e+00
1293   %7 = insertvalue %struct.complex undef, float %0, 0
1294   %8 = insertvalue %struct.complex %7, double %6, 1
1295   %9 = insertvalue %struct.complex %8, i32 4, 2
1296   %10 = insertvalue %struct.complex %9, i8 7, 3
1297   %11 = insertvalue %struct.complex %10, i64 999, 4
1298   ret %struct.complex %11