Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / X86 / avx512-regcall-Mask.ll
blob34a205a7baa86418af2e9e91ac59752c7d6988d5
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=i386-pc-win32       -mattr=+avx512bw  | FileCheck %s --check-prefix=X32
3 ; RUN: llc < %s -mtriple=x86_64-win32        -mattr=+avx512bw  | FileCheck %s --check-prefix=CHECK64 --check-prefix=WIN64
4 ; RUN: llc < %s -mtriple=x86_64-linux-gnu    -mattr=+avx512bw  | FileCheck %s --check-prefix=CHECK64 --check-prefix=LINUXOSX64
6 ; Test regcall when receiving arguments of v64i1 type
7 define dso_local x86_regcallcc i64 @test_argv64i1(<64 x i1> %x0, <64 x i1> %x1, <64 x i1> %x2, <64 x i1> %x3, <64 x i1> %x4, <64 x i1> %x5, <64 x i1> %x6, <64 x i1> %x7, <64 x i1> %x8, <64 x i1> %x9, <64 x i1> %x10, <64 x i1> %x11, <64 x i1> %x12)  {
8 ; X32-LABEL: test_argv64i1:
9 ; X32:       # %bb.0:
10 ; X32-NEXT:    addl %edx, %eax
11 ; X32-NEXT:    adcl %edi, %ecx
12 ; X32-NEXT:    addl {{[0-9]+}}(%esp), %eax
13 ; X32-NEXT:    adcl {{[0-9]+}}(%esp), %ecx
14 ; X32-NEXT:    addl {{[0-9]+}}(%esp), %eax
15 ; X32-NEXT:    adcl {{[0-9]+}}(%esp), %ecx
16 ; X32-NEXT:    addl {{[0-9]+}}(%esp), %eax
17 ; X32-NEXT:    adcl {{[0-9]+}}(%esp), %ecx
18 ; X32-NEXT:    addl {{[0-9]+}}(%esp), %eax
19 ; X32-NEXT:    adcl {{[0-9]+}}(%esp), %ecx
20 ; X32-NEXT:    addl {{[0-9]+}}(%esp), %eax
21 ; X32-NEXT:    adcl {{[0-9]+}}(%esp), %ecx
22 ; X32-NEXT:    addl {{[0-9]+}}(%esp), %eax
23 ; X32-NEXT:    adcl {{[0-9]+}}(%esp), %ecx
24 ; X32-NEXT:    addl {{[0-9]+}}(%esp), %eax
25 ; X32-NEXT:    adcl {{[0-9]+}}(%esp), %ecx
26 ; X32-NEXT:    addl {{[0-9]+}}(%esp), %eax
27 ; X32-NEXT:    adcl {{[0-9]+}}(%esp), %ecx
28 ; X32-NEXT:    addl {{[0-9]+}}(%esp), %eax
29 ; X32-NEXT:    adcl {{[0-9]+}}(%esp), %ecx
30 ; X32-NEXT:    addl {{[0-9]+}}(%esp), %eax
31 ; X32-NEXT:    adcl {{[0-9]+}}(%esp), %ecx
32 ; X32-NEXT:    addl {{[0-9]+}}(%esp), %eax
33 ; X32-NEXT:    adcl {{[0-9]+}}(%esp), %ecx
34 ; X32-NEXT:    retl
36 ; WIN64-LABEL: test_argv64i1:
37 ; WIN64:       # %bb.0:
38 ; WIN64-NEXT:    addq %rcx, %rax
39 ; WIN64-NEXT:    addq %rdx, %rax
40 ; WIN64-NEXT:    addq %rdi, %rax
41 ; WIN64-NEXT:    leaq (%rsi,%r8), %rcx
42 ; WIN64-NEXT:    addq %r9, %rcx
43 ; WIN64-NEXT:    addq %rcx, %rax
44 ; WIN64-NEXT:    leaq (%r10,%r11), %rcx
45 ; WIN64-NEXT:    addq %r12, %rcx
46 ; WIN64-NEXT:    addq %r14, %rcx
47 ; WIN64-NEXT:    addq %rcx, %rax
48 ; WIN64-NEXT:    addq %r15, %rax
49 ; WIN64-NEXT:    addq {{[0-9]+}}(%rsp), %rax
50 ; WIN64-NEXT:    retq
52 ; LINUXOSX64-LABEL: test_argv64i1:
53 ; LINUXOSX64:       # %bb.0:
54 ; LINUXOSX64-NEXT:    addq %rcx, %rax
55 ; LINUXOSX64-NEXT:    addq %rdx, %rax
56 ; LINUXOSX64-NEXT:    addq %rdi, %rax
57 ; LINUXOSX64-NEXT:    leaq (%rsi,%r8), %rcx
58 ; LINUXOSX64-NEXT:    addq %r9, %rcx
59 ; LINUXOSX64-NEXT:    addq %rcx, %rax
60 ; LINUXOSX64-NEXT:    leaq (%r12,%r13), %rcx
61 ; LINUXOSX64-NEXT:    addq %r14, %rcx
62 ; LINUXOSX64-NEXT:    addq %r15, %rcx
63 ; LINUXOSX64-NEXT:    addq %rcx, %rax
64 ; LINUXOSX64-NEXT:    addq {{[0-9]+}}(%rsp), %rax
65 ; LINUXOSX64-NEXT:    addq {{[0-9]+}}(%rsp), %rax
66 ; LINUXOSX64-NEXT:    retq
67   %y0 = bitcast <64 x i1> %x0 to i64
68   %y1 = bitcast <64 x i1> %x1 to i64
69   %y2 = bitcast <64 x i1> %x2 to i64
70   %y3 = bitcast <64 x i1> %x3 to i64
71   %y4 = bitcast <64 x i1> %x4 to i64
72   %y5 = bitcast <64 x i1> %x5 to i64
73   %y6 = bitcast <64 x i1> %x6 to i64
74   %y7 = bitcast <64 x i1> %x7 to i64
75   %y8 = bitcast <64 x i1> %x8 to i64
76   %y9 = bitcast <64 x i1> %x9 to i64
77   %y10 = bitcast <64 x i1> %x10 to i64
78   %y11 = bitcast <64 x i1> %x11 to i64
79   %y12 = bitcast <64 x i1> %x12 to i64
80   %add1 = add i64 %y0, %y1
81   %add2 = add i64 %add1, %y2
82   %add3 = add i64 %add2, %y3
83   %add4 = add i64 %add3, %y4
84   %add5 = add i64 %add4, %y5
85   %add6 = add i64 %add5, %y6
86   %add7 = add i64 %add6, %y7
87   %add8 = add i64 %add7, %y8
88   %add9 = add i64 %add8, %y9
89   %add10 = add i64 %add9, %y10
90   %add11 = add i64 %add10, %y11
91   %add12 = add i64 %add11, %y12
92   ret i64 %add12
95 ; Test regcall when passing arguments of v64i1 type
96 define dso_local i64 @caller_argv64i1() #0 {
97 ; X32-LABEL: caller_argv64i1:
98 ; X32:       # %bb.0: # %entry
99 ; X32-NEXT:    pushl %edi
100 ; X32-NEXT:    subl $88, %esp
101 ; X32-NEXT:    vmovddup {{.*#+}} xmm0 = [2,1,2,1]
102 ; X32-NEXT:    # xmm0 = mem[0,0]
103 ; X32-NEXT:    vmovups %xmm0, {{[0-9]+}}(%esp)
104 ; X32-NEXT:    vbroadcastsd {{.*#+}} zmm0 = [2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1]
105 ; X32-NEXT:    vmovups %zmm0, (%esp)
106 ; X32-NEXT:    movl $1, {{[0-9]+}}(%esp)
107 ; X32-NEXT:    movl $2, {{[0-9]+}}(%esp)
108 ; X32-NEXT:    movl $2, %eax
109 ; X32-NEXT:    movl $1, %ecx
110 ; X32-NEXT:    movl $2, %edx
111 ; X32-NEXT:    movl $1, %edi
112 ; X32-NEXT:    vzeroupper
113 ; X32-NEXT:    calll _test_argv64i1
114 ; X32-NEXT:    movl %ecx, %edx
115 ; X32-NEXT:    addl $88, %esp
116 ; X32-NEXT:    popl %edi
117 ; X32-NEXT:    retl
119 ; WIN64-LABEL: caller_argv64i1:
120 ; WIN64:       # %bb.0: # %entry
121 ; WIN64-NEXT:    pushq %r15
122 ; WIN64-NEXT:    .seh_pushreg %r15
123 ; WIN64-NEXT:    pushq %r14
124 ; WIN64-NEXT:    .seh_pushreg %r14
125 ; WIN64-NEXT:    pushq %r12
126 ; WIN64-NEXT:    .seh_pushreg %r12
127 ; WIN64-NEXT:    pushq %rsi
128 ; WIN64-NEXT:    .seh_pushreg %rsi
129 ; WIN64-NEXT:    pushq %rdi
130 ; WIN64-NEXT:    .seh_pushreg %rdi
131 ; WIN64-NEXT:    subq $48, %rsp
132 ; WIN64-NEXT:    .seh_stackalloc 48
133 ; WIN64-NEXT:    vmovaps %xmm7, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
134 ; WIN64-NEXT:    .seh_savexmm %xmm7, 32
135 ; WIN64-NEXT:    vmovaps %xmm6, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
136 ; WIN64-NEXT:    .seh_savexmm %xmm6, 16
137 ; WIN64-NEXT:    .seh_endprologue
138 ; WIN64-NEXT:    movabsq $4294967298, %rax # imm = 0x100000002
139 ; WIN64-NEXT:    movq %rax, (%rsp)
140 ; WIN64-NEXT:    movq %rax, %rcx
141 ; WIN64-NEXT:    movq %rax, %rdx
142 ; WIN64-NEXT:    movq %rax, %rdi
143 ; WIN64-NEXT:    movq %rax, %r8
144 ; WIN64-NEXT:    movq %rax, %r9
145 ; WIN64-NEXT:    movq %rax, %r10
146 ; WIN64-NEXT:    movq %rax, %r11
147 ; WIN64-NEXT:    movq %rax, %r12
148 ; WIN64-NEXT:    movq %rax, %r14
149 ; WIN64-NEXT:    movq %rax, %r15
150 ; WIN64-NEXT:    movq %rax, %rsi
151 ; WIN64-NEXT:    callq test_argv64i1
152 ; WIN64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm6 # 16-byte Reload
153 ; WIN64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm7 # 16-byte Reload
154 ; WIN64-NEXT:    addq $48, %rsp
155 ; WIN64-NEXT:    popq %rdi
156 ; WIN64-NEXT:    popq %rsi
157 ; WIN64-NEXT:    popq %r12
158 ; WIN64-NEXT:    popq %r14
159 ; WIN64-NEXT:    popq %r15
160 ; WIN64-NEXT:    retq
161 ; WIN64-NEXT:    .seh_endproc
163 ; LINUXOSX64-LABEL: caller_argv64i1:
164 ; LINUXOSX64:       # %bb.0: # %entry
165 ; LINUXOSX64-NEXT:    pushq %r15
166 ; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 16
167 ; LINUXOSX64-NEXT:    pushq %r14
168 ; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 24
169 ; LINUXOSX64-NEXT:    pushq %r13
170 ; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 32
171 ; LINUXOSX64-NEXT:    pushq %r12
172 ; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 40
173 ; LINUXOSX64-NEXT:    pushq %rax
174 ; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 48
175 ; LINUXOSX64-NEXT:    .cfi_offset %r12, -40
176 ; LINUXOSX64-NEXT:    .cfi_offset %r13, -32
177 ; LINUXOSX64-NEXT:    .cfi_offset %r14, -24
178 ; LINUXOSX64-NEXT:    .cfi_offset %r15, -16
179 ; LINUXOSX64-NEXT:    movabsq $4294967298, %rax # imm = 0x100000002
180 ; LINUXOSX64-NEXT:    movq %rax, %rcx
181 ; LINUXOSX64-NEXT:    movq %rax, %rdx
182 ; LINUXOSX64-NEXT:    movq %rax, %rdi
183 ; LINUXOSX64-NEXT:    movq %rax, %r8
184 ; LINUXOSX64-NEXT:    movq %rax, %r9
185 ; LINUXOSX64-NEXT:    movq %rax, %r12
186 ; LINUXOSX64-NEXT:    movq %rax, %r13
187 ; LINUXOSX64-NEXT:    movq %rax, %r14
188 ; LINUXOSX64-NEXT:    movq %rax, %r15
189 ; LINUXOSX64-NEXT:    movq %rax, %rsi
190 ; LINUXOSX64-NEXT:    pushq %rax
191 ; LINUXOSX64-NEXT:    .cfi_adjust_cfa_offset 8
192 ; LINUXOSX64-NEXT:    pushq %rax
193 ; LINUXOSX64-NEXT:    .cfi_adjust_cfa_offset 8
194 ; LINUXOSX64-NEXT:    callq test_argv64i1
195 ; LINUXOSX64-NEXT:    addq $24, %rsp
196 ; LINUXOSX64-NEXT:    .cfi_adjust_cfa_offset -24
197 ; LINUXOSX64-NEXT:    popq %r12
198 ; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 32
199 ; LINUXOSX64-NEXT:    popq %r13
200 ; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 24
201 ; LINUXOSX64-NEXT:    popq %r14
202 ; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 16
203 ; LINUXOSX64-NEXT:    popq %r15
204 ; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 8
205 ; LINUXOSX64-NEXT:    retq
206 entry:
207   %v0 = bitcast i64 4294967298 to <64 x i1>
208   %call = call x86_regcallcc i64 @test_argv64i1(<64 x i1> %v0, <64 x i1> %v0, <64 x i1> %v0,
209                                                 <64 x i1> %v0, <64 x i1> %v0, <64 x i1> %v0,
210                                                 <64 x i1> %v0, <64 x i1> %v0, <64 x i1> %v0,
211                                                 <64 x i1> %v0, <64 x i1> %v0, <64 x i1> %v0,
212                                                 <64 x i1> %v0)
213   ret i64 %call
216 ; Test regcall when returning v64i1 type
217 define dso_local x86_regcallcc <64 x i1> @test_retv64i1()  {
218 ; X32-LABEL: test_retv64i1:
219 ; X32:       # %bb.0:
220 ; X32-NEXT:    movl $2, %eax
221 ; X32-NEXT:    movl $1, %ecx
222 ; X32-NEXT:    retl
224 ; CHECK64-LABEL: test_retv64i1:
225 ; CHECK64:       # %bb.0:
226 ; CHECK64-NEXT:    movabsq $4294967298, %rax # imm = 0x100000002
227 ; CHECK64-NEXT:    retq
228   %a = bitcast i64 4294967298 to <64 x i1>
229  ret <64 x i1> %a
232 ; Test regcall when processing result of v64i1 type
233 define dso_local <64 x i1> @caller_retv64i1() #0 {
234 ; X32-LABEL: caller_retv64i1:
235 ; X32:       # %bb.0: # %entry
236 ; X32-NEXT:    calll _test_retv64i1
237 ; X32-NEXT:    kmovd %eax, %k0
238 ; X32-NEXT:    kmovd %ecx, %k1
239 ; X32-NEXT:    kunpckdq %k0, %k1, %k0
240 ; X32-NEXT:    vpmovm2b %k0, %zmm0
241 ; X32-NEXT:    retl
243 ; WIN64-LABEL: caller_retv64i1:
244 ; WIN64:       # %bb.0: # %entry
245 ; WIN64-NEXT:    pushq %rsi
246 ; WIN64-NEXT:    .seh_pushreg %rsi
247 ; WIN64-NEXT:    pushq %rdi
248 ; WIN64-NEXT:    .seh_pushreg %rdi
249 ; WIN64-NEXT:    subq $40, %rsp
250 ; WIN64-NEXT:    .seh_stackalloc 40
251 ; WIN64-NEXT:    vmovaps %xmm7, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
252 ; WIN64-NEXT:    .seh_savexmm %xmm7, 16
253 ; WIN64-NEXT:    vmovaps %xmm6, (%rsp) # 16-byte Spill
254 ; WIN64-NEXT:    .seh_savexmm %xmm6, 0
255 ; WIN64-NEXT:    .seh_endprologue
256 ; WIN64-NEXT:    callq test_retv64i1
257 ; WIN64-NEXT:    kmovq %rax, %k0
258 ; WIN64-NEXT:    vpmovm2b %k0, %zmm0
259 ; WIN64-NEXT:    vmovaps (%rsp), %xmm6 # 16-byte Reload
260 ; WIN64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm7 # 16-byte Reload
261 ; WIN64-NEXT:    addq $40, %rsp
262 ; WIN64-NEXT:    popq %rdi
263 ; WIN64-NEXT:    popq %rsi
264 ; WIN64-NEXT:    retq
265 ; WIN64-NEXT:    .seh_endproc
267 ; LINUXOSX64-LABEL: caller_retv64i1:
268 ; LINUXOSX64:       # %bb.0: # %entry
269 ; LINUXOSX64-NEXT:    pushq %rax
270 ; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 16
271 ; LINUXOSX64-NEXT:    callq test_retv64i1
272 ; LINUXOSX64-NEXT:    kmovq %rax, %k0
273 ; LINUXOSX64-NEXT:    vpmovm2b %k0, %zmm0
274 ; LINUXOSX64-NEXT:    popq %rax
275 ; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 8
276 ; LINUXOSX64-NEXT:    retq
277 entry:
278   %call = call x86_regcallcc <64 x i1> @test_retv64i1()
279   ret <64 x i1> %call
282 ; Test regcall when receiving arguments of v32i1 type
283 declare i32 @test_argv32i1helper(<32 x i1> %x0, <32 x i1> %x1, <32 x i1> %x2)
284 define dso_local x86_regcallcc i32 @test_argv32i1(<32 x i1> %x0, <32 x i1> %x1, <32 x i1> %x2)  {
285 ; X32-LABEL: test_argv32i1:
286 ; X32:       # %bb.0: # %entry
287 ; X32-NEXT:    subl $76, %esp
288 ; X32-NEXT:    vmovups %xmm7, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
289 ; X32-NEXT:    vmovups %xmm6, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
290 ; X32-NEXT:    vmovups %xmm5, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
291 ; X32-NEXT:    vmovups %xmm4, (%esp) # 16-byte Spill
292 ; X32-NEXT:    kmovd %edx, %k0
293 ; X32-NEXT:    kmovd %ecx, %k1
294 ; X32-NEXT:    kmovd %eax, %k2
295 ; X32-NEXT:    vpmovm2b %k2, %zmm0
296 ; X32-NEXT:    vpmovm2b %k1, %zmm1
297 ; X32-NEXT:    vpmovm2b %k0, %zmm2
298 ; X32-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
299 ; X32-NEXT:    # kill: def $ymm1 killed $ymm1 killed $zmm1
300 ; X32-NEXT:    # kill: def $ymm2 killed $ymm2 killed $zmm2
301 ; X32-NEXT:    calll _test_argv32i1helper
302 ; X32-NEXT:    vmovups (%esp), %xmm4 # 16-byte Reload
303 ; X32-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %xmm5 # 16-byte Reload
304 ; X32-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %xmm6 # 16-byte Reload
305 ; X32-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %xmm7 # 16-byte Reload
306 ; X32-NEXT:    addl $76, %esp
307 ; X32-NEXT:    vzeroupper
308 ; X32-NEXT:    retl
310 ; WIN64-LABEL: test_argv32i1:
311 ; WIN64:       # %bb.0: # %entry
312 ; WIN64-NEXT:    pushq %rbp
313 ; WIN64-NEXT:    .seh_pushreg %rbp
314 ; WIN64-NEXT:    pushq %r11
315 ; WIN64-NEXT:    .seh_pushreg %r11
316 ; WIN64-NEXT:    pushq %r10
317 ; WIN64-NEXT:    .seh_pushreg %r10
318 ; WIN64-NEXT:    subq $128, %rsp
319 ; WIN64-NEXT:    .seh_stackalloc 128
320 ; WIN64-NEXT:    leaq {{[0-9]+}}(%rsp), %rbp
321 ; WIN64-NEXT:    .seh_setframe %rbp, 128
322 ; WIN64-NEXT:    .seh_endprologue
323 ; WIN64-NEXT:    andq $-32, %rsp
324 ; WIN64-NEXT:    kmovd %edx, %k0
325 ; WIN64-NEXT:    kmovd %eax, %k1
326 ; WIN64-NEXT:    kmovd %ecx, %k2
327 ; WIN64-NEXT:    vpmovm2b %k2, %zmm0
328 ; WIN64-NEXT:    vmovdqa %ymm0, {{[0-9]+}}(%rsp)
329 ; WIN64-NEXT:    vpmovm2b %k1, %zmm0
330 ; WIN64-NEXT:    vmovdqa %ymm0, {{[0-9]+}}(%rsp)
331 ; WIN64-NEXT:    vpmovm2b %k0, %zmm0
332 ; WIN64-NEXT:    vmovdqa %ymm0, {{[0-9]+}}(%rsp)
333 ; WIN64-NEXT:    leaq {{[0-9]+}}(%rsp), %rcx
334 ; WIN64-NEXT:    leaq {{[0-9]+}}(%rsp), %rdx
335 ; WIN64-NEXT:    leaq {{[0-9]+}}(%rsp), %r8
336 ; WIN64-NEXT:    vzeroupper
337 ; WIN64-NEXT:    callq test_argv32i1helper
338 ; WIN64-NEXT:    nop
339 ; WIN64-NEXT:    movq %rbp, %rsp
340 ; WIN64-NEXT:    popq %r10
341 ; WIN64-NEXT:    popq %r11
342 ; WIN64-NEXT:    popq %rbp
343 ; WIN64-NEXT:    retq
344 ; WIN64-NEXT:    .seh_endproc
346 ; LINUXOSX64-LABEL: test_argv32i1:
347 ; LINUXOSX64:       # %bb.0: # %entry
348 ; LINUXOSX64-NEXT:    subq $136, %rsp
349 ; LINUXOSX64-NEXT:    vmovaps %xmm15, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
350 ; LINUXOSX64-NEXT:    vmovaps %xmm14, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
351 ; LINUXOSX64-NEXT:    vmovaps %xmm13, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
352 ; LINUXOSX64-NEXT:    vmovaps %xmm12, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
353 ; LINUXOSX64-NEXT:    vmovaps %xmm11, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
354 ; LINUXOSX64-NEXT:    vmovaps %xmm10, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
355 ; LINUXOSX64-NEXT:    vmovaps %xmm9, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
356 ; LINUXOSX64-NEXT:    vmovaps %xmm8, (%rsp) # 16-byte Spill
357 ; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 144
358 ; LINUXOSX64-NEXT:    .cfi_offset %xmm8, -144
359 ; LINUXOSX64-NEXT:    .cfi_offset %xmm9, -128
360 ; LINUXOSX64-NEXT:    .cfi_offset %xmm10, -112
361 ; LINUXOSX64-NEXT:    .cfi_offset %xmm11, -96
362 ; LINUXOSX64-NEXT:    .cfi_offset %xmm12, -80
363 ; LINUXOSX64-NEXT:    .cfi_offset %xmm13, -64
364 ; LINUXOSX64-NEXT:    .cfi_offset %xmm14, -48
365 ; LINUXOSX64-NEXT:    .cfi_offset %xmm15, -32
366 ; LINUXOSX64-NEXT:    kmovd %edx, %k0
367 ; LINUXOSX64-NEXT:    kmovd %ecx, %k1
368 ; LINUXOSX64-NEXT:    kmovd %eax, %k2
369 ; LINUXOSX64-NEXT:    vpmovm2b %k2, %zmm0
370 ; LINUXOSX64-NEXT:    vpmovm2b %k1, %zmm1
371 ; LINUXOSX64-NEXT:    vpmovm2b %k0, %zmm2
372 ; LINUXOSX64-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
373 ; LINUXOSX64-NEXT:    # kill: def $ymm1 killed $ymm1 killed $zmm1
374 ; LINUXOSX64-NEXT:    # kill: def $ymm2 killed $ymm2 killed $zmm2
375 ; LINUXOSX64-NEXT:    callq test_argv32i1helper@PLT
376 ; LINUXOSX64-NEXT:    vmovaps (%rsp), %xmm8 # 16-byte Reload
377 ; LINUXOSX64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm9 # 16-byte Reload
378 ; LINUXOSX64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm10 # 16-byte Reload
379 ; LINUXOSX64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm11 # 16-byte Reload
380 ; LINUXOSX64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm12 # 16-byte Reload
381 ; LINUXOSX64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm13 # 16-byte Reload
382 ; LINUXOSX64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm14 # 16-byte Reload
383 ; LINUXOSX64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm15 # 16-byte Reload
384 ; LINUXOSX64-NEXT:    addq $136, %rsp
385 ; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 8
386 ; LINUXOSX64-NEXT:    vzeroupper
387 ; LINUXOSX64-NEXT:    retq
388 entry:
389   %res = call i32 @test_argv32i1helper(<32 x i1> %x0, <32 x i1> %x1, <32 x i1> %x2)
390   ret i32 %res
393 ; Test regcall when passing arguments of v32i1 type
394 define dso_local i32 @caller_argv32i1() #0 {
395 ; X32-LABEL: caller_argv32i1:
396 ; X32:       # %bb.0: # %entry
397 ; X32-NEXT:    movl $1, %eax
398 ; X32-NEXT:    movl $1, %ecx
399 ; X32-NEXT:    movl $1, %edx
400 ; X32-NEXT:    calll _test_argv32i1
401 ; X32-NEXT:    retl
403 ; WIN64-LABEL: caller_argv32i1:
404 ; WIN64:       # %bb.0: # %entry
405 ; WIN64-NEXT:    pushq %rsi
406 ; WIN64-NEXT:    .seh_pushreg %rsi
407 ; WIN64-NEXT:    pushq %rdi
408 ; WIN64-NEXT:    .seh_pushreg %rdi
409 ; WIN64-NEXT:    subq $40, %rsp
410 ; WIN64-NEXT:    .seh_stackalloc 40
411 ; WIN64-NEXT:    vmovaps %xmm7, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
412 ; WIN64-NEXT:    .seh_savexmm %xmm7, 16
413 ; WIN64-NEXT:    vmovaps %xmm6, (%rsp) # 16-byte Spill
414 ; WIN64-NEXT:    .seh_savexmm %xmm6, 0
415 ; WIN64-NEXT:    .seh_endprologue
416 ; WIN64-NEXT:    movl $1, %eax
417 ; WIN64-NEXT:    movl $1, %ecx
418 ; WIN64-NEXT:    movl $1, %edx
419 ; WIN64-NEXT:    callq test_argv32i1
420 ; WIN64-NEXT:    vmovaps (%rsp), %xmm6 # 16-byte Reload
421 ; WIN64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm7 # 16-byte Reload
422 ; WIN64-NEXT:    addq $40, %rsp
423 ; WIN64-NEXT:    popq %rdi
424 ; WIN64-NEXT:    popq %rsi
425 ; WIN64-NEXT:    retq
426 ; WIN64-NEXT:    .seh_endproc
428 ; LINUXOSX64-LABEL: caller_argv32i1:
429 ; LINUXOSX64:       # %bb.0: # %entry
430 ; LINUXOSX64-NEXT:    pushq %rax
431 ; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 16
432 ; LINUXOSX64-NEXT:    movl $1, %eax
433 ; LINUXOSX64-NEXT:    movl $1, %ecx
434 ; LINUXOSX64-NEXT:    movl $1, %edx
435 ; LINUXOSX64-NEXT:    callq test_argv32i1
436 ; LINUXOSX64-NEXT:    popq %rcx
437 ; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 8
438 ; LINUXOSX64-NEXT:    retq
439 entry:
440   %v0 = bitcast i32 1 to <32 x i1>
441   %call = call x86_regcallcc i32 @test_argv32i1(<32 x i1> %v0, <32 x i1> %v0, <32 x i1> %v0)
442   ret i32 %call
445 ; Test regcall when returning v32i1 type
446 define dso_local x86_regcallcc <32 x i1> @test_retv32i1()  {
447 ; X32-LABEL: test_retv32i1:
448 ; X32:       # %bb.0:
449 ; X32-NEXT:    movl $1, %eax
450 ; X32-NEXT:    retl
452 ; CHECK64-LABEL: test_retv32i1:
453 ; CHECK64:       # %bb.0:
454 ; CHECK64-NEXT:    movl $1, %eax
455 ; CHECK64-NEXT:    retq
456   %a = bitcast i32 1 to <32 x i1>
457   ret <32 x i1> %a
460 ; Test regcall when processing result of v32i1 type
461 define dso_local i32 @caller_retv32i1() #0 {
462 ; X32-LABEL: caller_retv32i1:
463 ; X32:       # %bb.0: # %entry
464 ; X32-NEXT:    calll _test_retv32i1
465 ; X32-NEXT:    incl %eax
466 ; X32-NEXT:    retl
468 ; WIN64-LABEL: caller_retv32i1:
469 ; WIN64:       # %bb.0: # %entry
470 ; WIN64-NEXT:    pushq %rsi
471 ; WIN64-NEXT:    .seh_pushreg %rsi
472 ; WIN64-NEXT:    pushq %rdi
473 ; WIN64-NEXT:    .seh_pushreg %rdi
474 ; WIN64-NEXT:    subq $40, %rsp
475 ; WIN64-NEXT:    .seh_stackalloc 40
476 ; WIN64-NEXT:    vmovaps %xmm7, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
477 ; WIN64-NEXT:    .seh_savexmm %xmm7, 16
478 ; WIN64-NEXT:    vmovaps %xmm6, (%rsp) # 16-byte Spill
479 ; WIN64-NEXT:    .seh_savexmm %xmm6, 0
480 ; WIN64-NEXT:    .seh_endprologue
481 ; WIN64-NEXT:    callq test_retv32i1
482 ; WIN64-NEXT:    incl %eax
483 ; WIN64-NEXT:    vmovaps (%rsp), %xmm6 # 16-byte Reload
484 ; WIN64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm7 # 16-byte Reload
485 ; WIN64-NEXT:    addq $40, %rsp
486 ; WIN64-NEXT:    popq %rdi
487 ; WIN64-NEXT:    popq %rsi
488 ; WIN64-NEXT:    retq
489 ; WIN64-NEXT:    .seh_endproc
491 ; LINUXOSX64-LABEL: caller_retv32i1:
492 ; LINUXOSX64:       # %bb.0: # %entry
493 ; LINUXOSX64-NEXT:    pushq %rax
494 ; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 16
495 ; LINUXOSX64-NEXT:    callq test_retv32i1
496 ; LINUXOSX64-NEXT:    incl %eax
497 ; LINUXOSX64-NEXT:    popq %rcx
498 ; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 8
499 ; LINUXOSX64-NEXT:    retq
500 entry:
501   %call = call x86_regcallcc <32 x i1> @test_retv32i1()
502   %c = bitcast <32 x i1> %call to i32
503   %add = add i32 %c, 1
504   ret i32 %add
507 ; Test regcall when receiving arguments of v16i1 type
508 declare i16 @test_argv16i1helper(<16 x i1> %x0, <16 x i1> %x1, <16 x i1> %x2)
509 define dso_local x86_regcallcc i16 @test_argv16i1(<16 x i1> %x0, <16 x i1> %x1, <16 x i1> %x2)  {
510 ; X32-LABEL: test_argv16i1:
511 ; X32:       # %bb.0:
512 ; X32-NEXT:    subl $76, %esp
513 ; X32-NEXT:    vmovups %xmm7, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
514 ; X32-NEXT:    vmovups %xmm6, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
515 ; X32-NEXT:    vmovups %xmm5, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
516 ; X32-NEXT:    vmovups %xmm4, (%esp) # 16-byte Spill
517 ; X32-NEXT:    kmovd %edx, %k0
518 ; X32-NEXT:    kmovd %ecx, %k1
519 ; X32-NEXT:    kmovd %eax, %k2
520 ; X32-NEXT:    vpmovm2b %k2, %zmm0
521 ; X32-NEXT:    vpmovm2b %k1, %zmm1
522 ; X32-NEXT:    vpmovm2b %k0, %zmm2
523 ; X32-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
524 ; X32-NEXT:    # kill: def $xmm1 killed $xmm1 killed $zmm1
525 ; X32-NEXT:    # kill: def $xmm2 killed $xmm2 killed $zmm2
526 ; X32-NEXT:    vzeroupper
527 ; X32-NEXT:    calll _test_argv16i1helper
528 ; X32-NEXT:    vmovups (%esp), %xmm4 # 16-byte Reload
529 ; X32-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %xmm5 # 16-byte Reload
530 ; X32-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %xmm6 # 16-byte Reload
531 ; X32-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %xmm7 # 16-byte Reload
532 ; X32-NEXT:    addl $76, %esp
533 ; X32-NEXT:    retl
535 ; WIN64-LABEL: test_argv16i1:
536 ; WIN64:       # %bb.0:
537 ; WIN64-NEXT:    pushq %r11
538 ; WIN64-NEXT:    .seh_pushreg %r11
539 ; WIN64-NEXT:    pushq %r10
540 ; WIN64-NEXT:    .seh_pushreg %r10
541 ; WIN64-NEXT:    subq $88, %rsp
542 ; WIN64-NEXT:    .seh_stackalloc 88
543 ; WIN64-NEXT:    .seh_endprologue
544 ; WIN64-NEXT:    kmovd %edx, %k0
545 ; WIN64-NEXT:    kmovd %eax, %k1
546 ; WIN64-NEXT:    kmovd %ecx, %k2
547 ; WIN64-NEXT:    vpmovm2b %k2, %zmm0
548 ; WIN64-NEXT:    vmovdqa %xmm0, {{[0-9]+}}(%rsp)
549 ; WIN64-NEXT:    vpmovm2b %k1, %zmm0
550 ; WIN64-NEXT:    vmovdqa %xmm0, {{[0-9]+}}(%rsp)
551 ; WIN64-NEXT:    vpmovm2b %k0, %zmm0
552 ; WIN64-NEXT:    vmovdqa %xmm0, {{[0-9]+}}(%rsp)
553 ; WIN64-NEXT:    leaq {{[0-9]+}}(%rsp), %rcx
554 ; WIN64-NEXT:    leaq {{[0-9]+}}(%rsp), %rdx
555 ; WIN64-NEXT:    leaq {{[0-9]+}}(%rsp), %r8
556 ; WIN64-NEXT:    vzeroupper
557 ; WIN64-NEXT:    callq test_argv16i1helper
558 ; WIN64-NEXT:    nop
559 ; WIN64-NEXT:    addq $88, %rsp
560 ; WIN64-NEXT:    popq %r10
561 ; WIN64-NEXT:    popq %r11
562 ; WIN64-NEXT:    retq
563 ; WIN64-NEXT:    .seh_endproc
565 ; LINUXOSX64-LABEL: test_argv16i1:
566 ; LINUXOSX64:       # %bb.0:
567 ; LINUXOSX64-NEXT:    subq $136, %rsp
568 ; LINUXOSX64-NEXT:    vmovaps %xmm15, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
569 ; LINUXOSX64-NEXT:    vmovaps %xmm14, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
570 ; LINUXOSX64-NEXT:    vmovaps %xmm13, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
571 ; LINUXOSX64-NEXT:    vmovaps %xmm12, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
572 ; LINUXOSX64-NEXT:    vmovaps %xmm11, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
573 ; LINUXOSX64-NEXT:    vmovaps %xmm10, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
574 ; LINUXOSX64-NEXT:    vmovaps %xmm9, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
575 ; LINUXOSX64-NEXT:    vmovaps %xmm8, (%rsp) # 16-byte Spill
576 ; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 144
577 ; LINUXOSX64-NEXT:    .cfi_offset %xmm8, -144
578 ; LINUXOSX64-NEXT:    .cfi_offset %xmm9, -128
579 ; LINUXOSX64-NEXT:    .cfi_offset %xmm10, -112
580 ; LINUXOSX64-NEXT:    .cfi_offset %xmm11, -96
581 ; LINUXOSX64-NEXT:    .cfi_offset %xmm12, -80
582 ; LINUXOSX64-NEXT:    .cfi_offset %xmm13, -64
583 ; LINUXOSX64-NEXT:    .cfi_offset %xmm14, -48
584 ; LINUXOSX64-NEXT:    .cfi_offset %xmm15, -32
585 ; LINUXOSX64-NEXT:    kmovd %edx, %k0
586 ; LINUXOSX64-NEXT:    kmovd %ecx, %k1
587 ; LINUXOSX64-NEXT:    kmovd %eax, %k2
588 ; LINUXOSX64-NEXT:    vpmovm2b %k2, %zmm0
589 ; LINUXOSX64-NEXT:    vpmovm2b %k1, %zmm1
590 ; LINUXOSX64-NEXT:    vpmovm2b %k0, %zmm2
591 ; LINUXOSX64-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
592 ; LINUXOSX64-NEXT:    # kill: def $xmm1 killed $xmm1 killed $zmm1
593 ; LINUXOSX64-NEXT:    # kill: def $xmm2 killed $xmm2 killed $zmm2
594 ; LINUXOSX64-NEXT:    vzeroupper
595 ; LINUXOSX64-NEXT:    callq test_argv16i1helper@PLT
596 ; LINUXOSX64-NEXT:    vmovaps (%rsp), %xmm8 # 16-byte Reload
597 ; LINUXOSX64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm9 # 16-byte Reload
598 ; LINUXOSX64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm10 # 16-byte Reload
599 ; LINUXOSX64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm11 # 16-byte Reload
600 ; LINUXOSX64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm12 # 16-byte Reload
601 ; LINUXOSX64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm13 # 16-byte Reload
602 ; LINUXOSX64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm14 # 16-byte Reload
603 ; LINUXOSX64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm15 # 16-byte Reload
604 ; LINUXOSX64-NEXT:    addq $136, %rsp
605 ; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 8
606 ; LINUXOSX64-NEXT:    retq
607   %res = call i16 @test_argv16i1helper(<16 x i1> %x0, <16 x i1> %x1, <16 x i1> %x2)
608   ret i16 %res
611 ; Test regcall when passing arguments of v16i1 type
612 define dso_local i16 @caller_argv16i1() #0 {
613 ; X32-LABEL: caller_argv16i1:
614 ; X32:       # %bb.0: # %entry
615 ; X32-NEXT:    movl $1, %eax
616 ; X32-NEXT:    movl $1, %ecx
617 ; X32-NEXT:    movl $1, %edx
618 ; X32-NEXT:    calll _test_argv16i1
619 ; X32-NEXT:    retl
621 ; WIN64-LABEL: caller_argv16i1:
622 ; WIN64:       # %bb.0: # %entry
623 ; WIN64-NEXT:    pushq %rsi
624 ; WIN64-NEXT:    .seh_pushreg %rsi
625 ; WIN64-NEXT:    pushq %rdi
626 ; WIN64-NEXT:    .seh_pushreg %rdi
627 ; WIN64-NEXT:    subq $40, %rsp
628 ; WIN64-NEXT:    .seh_stackalloc 40
629 ; WIN64-NEXT:    vmovaps %xmm7, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
630 ; WIN64-NEXT:    .seh_savexmm %xmm7, 16
631 ; WIN64-NEXT:    vmovaps %xmm6, (%rsp) # 16-byte Spill
632 ; WIN64-NEXT:    .seh_savexmm %xmm6, 0
633 ; WIN64-NEXT:    .seh_endprologue
634 ; WIN64-NEXT:    movl $1, %eax
635 ; WIN64-NEXT:    movl $1, %ecx
636 ; WIN64-NEXT:    movl $1, %edx
637 ; WIN64-NEXT:    callq test_argv16i1
638 ; WIN64-NEXT:    vmovaps (%rsp), %xmm6 # 16-byte Reload
639 ; WIN64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm7 # 16-byte Reload
640 ; WIN64-NEXT:    addq $40, %rsp
641 ; WIN64-NEXT:    popq %rdi
642 ; WIN64-NEXT:    popq %rsi
643 ; WIN64-NEXT:    retq
644 ; WIN64-NEXT:    .seh_endproc
646 ; LINUXOSX64-LABEL: caller_argv16i1:
647 ; LINUXOSX64:       # %bb.0: # %entry
648 ; LINUXOSX64-NEXT:    pushq %rax
649 ; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 16
650 ; LINUXOSX64-NEXT:    movl $1, %eax
651 ; LINUXOSX64-NEXT:    movl $1, %ecx
652 ; LINUXOSX64-NEXT:    movl $1, %edx
653 ; LINUXOSX64-NEXT:    callq test_argv16i1
654 ; LINUXOSX64-NEXT:    popq %rcx
655 ; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 8
656 ; LINUXOSX64-NEXT:    retq
657 entry:
658   %v0 = bitcast i16 1 to <16 x i1>
659   %call = call x86_regcallcc i16 @test_argv16i1(<16 x i1> %v0, <16 x i1> %v0, <16 x i1> %v0)
660   ret i16 %call
663 ; Test regcall when returning v16i1 type
664 define dso_local x86_regcallcc <16 x i1> @test_retv16i1()  {
665 ; X32-LABEL: test_retv16i1:
666 ; X32:       # %bb.0:
667 ; X32-NEXT:    movw $1, %ax
668 ; X32-NEXT:    retl
670 ; CHECK64-LABEL: test_retv16i1:
671 ; CHECK64:       # %bb.0:
672 ; CHECK64-NEXT:    movw $1, %ax
673 ; CHECK64-NEXT:    retq
674   %a = bitcast i16 1 to <16 x i1>
675   ret <16 x i1> %a
678 ; Test regcall when processing result of v16i1 type
679 define dso_local i16 @caller_retv16i1() #0 {
680 ; X32-LABEL: caller_retv16i1:
681 ; X32:       # %bb.0: # %entry
682 ; X32-NEXT:    calll _test_retv16i1
683 ; X32-NEXT:    # kill: def $ax killed $ax def $eax
684 ; X32-NEXT:    incl %eax
685 ; X32-NEXT:    # kill: def $ax killed $ax killed $eax
686 ; X32-NEXT:    retl
688 ; WIN64-LABEL: caller_retv16i1:
689 ; WIN64:       # %bb.0: # %entry
690 ; WIN64-NEXT:    pushq %rsi
691 ; WIN64-NEXT:    .seh_pushreg %rsi
692 ; WIN64-NEXT:    pushq %rdi
693 ; WIN64-NEXT:    .seh_pushreg %rdi
694 ; WIN64-NEXT:    subq $40, %rsp
695 ; WIN64-NEXT:    .seh_stackalloc 40
696 ; WIN64-NEXT:    vmovaps %xmm7, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
697 ; WIN64-NEXT:    .seh_savexmm %xmm7, 16
698 ; WIN64-NEXT:    vmovaps %xmm6, (%rsp) # 16-byte Spill
699 ; WIN64-NEXT:    .seh_savexmm %xmm6, 0
700 ; WIN64-NEXT:    .seh_endprologue
701 ; WIN64-NEXT:    callq test_retv16i1
702 ; WIN64-NEXT:    # kill: def $ax killed $ax def $eax
703 ; WIN64-NEXT:    incl %eax
704 ; WIN64-NEXT:    # kill: def $ax killed $ax killed $eax
705 ; WIN64-NEXT:    vmovaps (%rsp), %xmm6 # 16-byte Reload
706 ; WIN64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm7 # 16-byte Reload
707 ; WIN64-NEXT:    addq $40, %rsp
708 ; WIN64-NEXT:    popq %rdi
709 ; WIN64-NEXT:    popq %rsi
710 ; WIN64-NEXT:    retq
711 ; WIN64-NEXT:    .seh_endproc
713 ; LINUXOSX64-LABEL: caller_retv16i1:
714 ; LINUXOSX64:       # %bb.0: # %entry
715 ; LINUXOSX64-NEXT:    pushq %rax
716 ; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 16
717 ; LINUXOSX64-NEXT:    callq test_retv16i1
718 ; LINUXOSX64-NEXT:    # kill: def $ax killed $ax def $eax
719 ; LINUXOSX64-NEXT:    incl %eax
720 ; LINUXOSX64-NEXT:    # kill: def $ax killed $ax killed $eax
721 ; LINUXOSX64-NEXT:    popq %rcx
722 ; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 8
723 ; LINUXOSX64-NEXT:    retq
724 entry:
725   %call = call x86_regcallcc <16 x i1> @test_retv16i1()
726   %c = bitcast <16 x i1> %call to i16
727   %add = add i16 %c, 1
728   ret i16 %add
731 ; Test regcall when receiving arguments of v8i1 type
732 declare i8 @test_argv8i1helper(<8 x i1> %x0, <8 x i1> %x1, <8 x i1> %x2)
733 define dso_local x86_regcallcc i8 @test_argv8i1(<8 x i1> %x0, <8 x i1> %x1, <8 x i1> %x2)  {
734 ; X32-LABEL: test_argv8i1:
735 ; X32:       # %bb.0:
736 ; X32-NEXT:    subl $76, %esp
737 ; X32-NEXT:    vmovups %xmm7, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
738 ; X32-NEXT:    vmovups %xmm6, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
739 ; X32-NEXT:    vmovups %xmm5, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
740 ; X32-NEXT:    vmovups %xmm4, (%esp) # 16-byte Spill
741 ; X32-NEXT:    kmovd %edx, %k0
742 ; X32-NEXT:    kmovd %ecx, %k1
743 ; X32-NEXT:    kmovd %eax, %k2
744 ; X32-NEXT:    vpmovm2w %k2, %zmm0
745 ; X32-NEXT:    vpmovm2w %k1, %zmm1
746 ; X32-NEXT:    vpmovm2w %k0, %zmm2
747 ; X32-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
748 ; X32-NEXT:    # kill: def $xmm1 killed $xmm1 killed $zmm1
749 ; X32-NEXT:    # kill: def $xmm2 killed $xmm2 killed $zmm2
750 ; X32-NEXT:    vzeroupper
751 ; X32-NEXT:    calll _test_argv8i1helper
752 ; X32-NEXT:    vmovups (%esp), %xmm4 # 16-byte Reload
753 ; X32-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %xmm5 # 16-byte Reload
754 ; X32-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %xmm6 # 16-byte Reload
755 ; X32-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %xmm7 # 16-byte Reload
756 ; X32-NEXT:    addl $76, %esp
757 ; X32-NEXT:    retl
759 ; WIN64-LABEL: test_argv8i1:
760 ; WIN64:       # %bb.0:
761 ; WIN64-NEXT:    pushq %r11
762 ; WIN64-NEXT:    .seh_pushreg %r11
763 ; WIN64-NEXT:    pushq %r10
764 ; WIN64-NEXT:    .seh_pushreg %r10
765 ; WIN64-NEXT:    subq $88, %rsp
766 ; WIN64-NEXT:    .seh_stackalloc 88
767 ; WIN64-NEXT:    .seh_endprologue
768 ; WIN64-NEXT:    kmovd %edx, %k0
769 ; WIN64-NEXT:    kmovd %eax, %k1
770 ; WIN64-NEXT:    kmovd %ecx, %k2
771 ; WIN64-NEXT:    vpmovm2w %k2, %zmm0
772 ; WIN64-NEXT:    vmovdqa %xmm0, {{[0-9]+}}(%rsp)
773 ; WIN64-NEXT:    vpmovm2w %k1, %zmm0
774 ; WIN64-NEXT:    vmovdqa %xmm0, {{[0-9]+}}(%rsp)
775 ; WIN64-NEXT:    vpmovm2w %k0, %zmm0
776 ; WIN64-NEXT:    vmovdqa %xmm0, {{[0-9]+}}(%rsp)
777 ; WIN64-NEXT:    leaq {{[0-9]+}}(%rsp), %rcx
778 ; WIN64-NEXT:    leaq {{[0-9]+}}(%rsp), %rdx
779 ; WIN64-NEXT:    leaq {{[0-9]+}}(%rsp), %r8
780 ; WIN64-NEXT:    vzeroupper
781 ; WIN64-NEXT:    callq test_argv8i1helper
782 ; WIN64-NEXT:    nop
783 ; WIN64-NEXT:    addq $88, %rsp
784 ; WIN64-NEXT:    popq %r10
785 ; WIN64-NEXT:    popq %r11
786 ; WIN64-NEXT:    retq
787 ; WIN64-NEXT:    .seh_endproc
789 ; LINUXOSX64-LABEL: test_argv8i1:
790 ; LINUXOSX64:       # %bb.0:
791 ; LINUXOSX64-NEXT:    subq $136, %rsp
792 ; LINUXOSX64-NEXT:    vmovaps %xmm15, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
793 ; LINUXOSX64-NEXT:    vmovaps %xmm14, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
794 ; LINUXOSX64-NEXT:    vmovaps %xmm13, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
795 ; LINUXOSX64-NEXT:    vmovaps %xmm12, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
796 ; LINUXOSX64-NEXT:    vmovaps %xmm11, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
797 ; LINUXOSX64-NEXT:    vmovaps %xmm10, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
798 ; LINUXOSX64-NEXT:    vmovaps %xmm9, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
799 ; LINUXOSX64-NEXT:    vmovaps %xmm8, (%rsp) # 16-byte Spill
800 ; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 144
801 ; LINUXOSX64-NEXT:    .cfi_offset %xmm8, -144
802 ; LINUXOSX64-NEXT:    .cfi_offset %xmm9, -128
803 ; LINUXOSX64-NEXT:    .cfi_offset %xmm10, -112
804 ; LINUXOSX64-NEXT:    .cfi_offset %xmm11, -96
805 ; LINUXOSX64-NEXT:    .cfi_offset %xmm12, -80
806 ; LINUXOSX64-NEXT:    .cfi_offset %xmm13, -64
807 ; LINUXOSX64-NEXT:    .cfi_offset %xmm14, -48
808 ; LINUXOSX64-NEXT:    .cfi_offset %xmm15, -32
809 ; LINUXOSX64-NEXT:    kmovd %edx, %k0
810 ; LINUXOSX64-NEXT:    kmovd %ecx, %k1
811 ; LINUXOSX64-NEXT:    kmovd %eax, %k2
812 ; LINUXOSX64-NEXT:    vpmovm2w %k2, %zmm0
813 ; LINUXOSX64-NEXT:    vpmovm2w %k1, %zmm1
814 ; LINUXOSX64-NEXT:    vpmovm2w %k0, %zmm2
815 ; LINUXOSX64-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
816 ; LINUXOSX64-NEXT:    # kill: def $xmm1 killed $xmm1 killed $zmm1
817 ; LINUXOSX64-NEXT:    # kill: def $xmm2 killed $xmm2 killed $zmm2
818 ; LINUXOSX64-NEXT:    vzeroupper
819 ; LINUXOSX64-NEXT:    callq test_argv8i1helper@PLT
820 ; LINUXOSX64-NEXT:    vmovaps (%rsp), %xmm8 # 16-byte Reload
821 ; LINUXOSX64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm9 # 16-byte Reload
822 ; LINUXOSX64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm10 # 16-byte Reload
823 ; LINUXOSX64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm11 # 16-byte Reload
824 ; LINUXOSX64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm12 # 16-byte Reload
825 ; LINUXOSX64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm13 # 16-byte Reload
826 ; LINUXOSX64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm14 # 16-byte Reload
827 ; LINUXOSX64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm15 # 16-byte Reload
828 ; LINUXOSX64-NEXT:    addq $136, %rsp
829 ; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 8
830 ; LINUXOSX64-NEXT:    retq
831   %res = call i8 @test_argv8i1helper(<8 x i1> %x0, <8 x i1> %x1, <8 x i1> %x2)
832   ret i8 %res
835 ; Test regcall when passing arguments of v8i1 type
836 define dso_local i8 @caller_argv8i1() #0 {
837 ; X32-LABEL: caller_argv8i1:
838 ; X32:       # %bb.0: # %entry
839 ; X32-NEXT:    movl $1, %eax
840 ; X32-NEXT:    movl $1, %ecx
841 ; X32-NEXT:    movl $1, %edx
842 ; X32-NEXT:    calll _test_argv8i1
843 ; X32-NEXT:    retl
845 ; WIN64-LABEL: caller_argv8i1:
846 ; WIN64:       # %bb.0: # %entry
847 ; WIN64-NEXT:    pushq %rsi
848 ; WIN64-NEXT:    .seh_pushreg %rsi
849 ; WIN64-NEXT:    pushq %rdi
850 ; WIN64-NEXT:    .seh_pushreg %rdi
851 ; WIN64-NEXT:    subq $40, %rsp
852 ; WIN64-NEXT:    .seh_stackalloc 40
853 ; WIN64-NEXT:    vmovaps %xmm7, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
854 ; WIN64-NEXT:    .seh_savexmm %xmm7, 16
855 ; WIN64-NEXT:    vmovaps %xmm6, (%rsp) # 16-byte Spill
856 ; WIN64-NEXT:    .seh_savexmm %xmm6, 0
857 ; WIN64-NEXT:    .seh_endprologue
858 ; WIN64-NEXT:    movl $1, %eax
859 ; WIN64-NEXT:    movl $1, %ecx
860 ; WIN64-NEXT:    movl $1, %edx
861 ; WIN64-NEXT:    callq test_argv8i1
862 ; WIN64-NEXT:    vmovaps (%rsp), %xmm6 # 16-byte Reload
863 ; WIN64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm7 # 16-byte Reload
864 ; WIN64-NEXT:    addq $40, %rsp
865 ; WIN64-NEXT:    popq %rdi
866 ; WIN64-NEXT:    popq %rsi
867 ; WIN64-NEXT:    retq
868 ; WIN64-NEXT:    .seh_endproc
870 ; LINUXOSX64-LABEL: caller_argv8i1:
871 ; LINUXOSX64:       # %bb.0: # %entry
872 ; LINUXOSX64-NEXT:    pushq %rax
873 ; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 16
874 ; LINUXOSX64-NEXT:    movl $1, %eax
875 ; LINUXOSX64-NEXT:    movl $1, %ecx
876 ; LINUXOSX64-NEXT:    movl $1, %edx
877 ; LINUXOSX64-NEXT:    callq test_argv8i1
878 ; LINUXOSX64-NEXT:    popq %rcx
879 ; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 8
880 ; LINUXOSX64-NEXT:    retq
881 entry:
882   %v0 = bitcast i8 1 to <8 x i1>
883   %call = call x86_regcallcc i8 @test_argv8i1(<8 x i1> %v0, <8 x i1> %v0, <8 x i1> %v0)
884   ret i8 %call
887 ; Test regcall when returning v8i1 type
888 define dso_local x86_regcallcc <8 x i1> @test_retv8i1()  {
889 ; X32-LABEL: test_retv8i1:
890 ; X32:       # %bb.0:
891 ; X32-NEXT:    movb $1, %al
892 ; X32-NEXT:    retl
894 ; CHECK64-LABEL: test_retv8i1:
895 ; CHECK64:       # %bb.0:
896 ; CHECK64-NEXT:    movb $1, %al
897 ; CHECK64-NEXT:    retq
898   %a = bitcast i8 1 to <8 x i1>
899   ret <8 x i1> %a
902 ; Test regcall when processing result of v8i1 type
903 define dso_local <8 x i1> @caller_retv8i1() #0 {
904 ; X32-LABEL: caller_retv8i1:
905 ; X32:       # %bb.0: # %entry
906 ; X32-NEXT:    calll _test_retv8i1
907 ; X32-NEXT:    # kill: def $al killed $al def $eax
908 ; X32-NEXT:    kmovd %eax, %k0
909 ; X32-NEXT:    vpmovm2w %k0, %zmm0
910 ; X32-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
911 ; X32-NEXT:    vzeroupper
912 ; X32-NEXT:    retl
914 ; WIN64-LABEL: caller_retv8i1:
915 ; WIN64:       # %bb.0: # %entry
916 ; WIN64-NEXT:    pushq %rsi
917 ; WIN64-NEXT:    .seh_pushreg %rsi
918 ; WIN64-NEXT:    pushq %rdi
919 ; WIN64-NEXT:    .seh_pushreg %rdi
920 ; WIN64-NEXT:    subq $40, %rsp
921 ; WIN64-NEXT:    .seh_stackalloc 40
922 ; WIN64-NEXT:    vmovaps %xmm7, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
923 ; WIN64-NEXT:    .seh_savexmm %xmm7, 16
924 ; WIN64-NEXT:    vmovaps %xmm6, (%rsp) # 16-byte Spill
925 ; WIN64-NEXT:    .seh_savexmm %xmm6, 0
926 ; WIN64-NEXT:    .seh_endprologue
927 ; WIN64-NEXT:    callq test_retv8i1
928 ; WIN64-NEXT:    # kill: def $al killed $al def $eax
929 ; WIN64-NEXT:    kmovd %eax, %k0
930 ; WIN64-NEXT:    vpmovm2w %k0, %zmm0
931 ; WIN64-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
932 ; WIN64-NEXT:    vmovaps (%rsp), %xmm6 # 16-byte Reload
933 ; WIN64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm7 # 16-byte Reload
934 ; WIN64-NEXT:    addq $40, %rsp
935 ; WIN64-NEXT:    popq %rdi
936 ; WIN64-NEXT:    popq %rsi
937 ; WIN64-NEXT:    vzeroupper
938 ; WIN64-NEXT:    retq
939 ; WIN64-NEXT:    .seh_endproc
941 ; LINUXOSX64-LABEL: caller_retv8i1:
942 ; LINUXOSX64:       # %bb.0: # %entry
943 ; LINUXOSX64-NEXT:    pushq %rax
944 ; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 16
945 ; LINUXOSX64-NEXT:    callq test_retv8i1
946 ; LINUXOSX64-NEXT:    # kill: def $al killed $al def $eax
947 ; LINUXOSX64-NEXT:    kmovd %eax, %k0
948 ; LINUXOSX64-NEXT:    vpmovm2w %k0, %zmm0
949 ; LINUXOSX64-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
950 ; LINUXOSX64-NEXT:    popq %rax
951 ; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 8
952 ; LINUXOSX64-NEXT:    vzeroupper
953 ; LINUXOSX64-NEXT:    retq
954 entry:
955   %call = call x86_regcallcc <8 x i1> @test_retv8i1()
956   ret <8 x i1> %call