1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=i686-apple-darwin -mcpu=knl | FileCheck %s -check-prefix=X32
3 ; RUN: llc < %s -mtriple=i686-apple-darwin -mcpu=skx | FileCheck %s -check-prefix=X32
4 ; RUN: llc < %s -mtriple=i386-pc-win32 -mcpu=knl | FileCheck %s -check-prefix=WIN32
5 ; RUN: llc < %s -mtriple=i386-pc-win32 -mcpu=skx | FileCheck %s -check-prefix=WIN32
6 ; RUN: llc < %s -mtriple=x86_64-win32 -mcpu=knl | FileCheck %s -check-prefixes=WIN64,WIN64-KNL
7 ; RUN: llc < %s -mtriple=x86_64-win32 -mcpu=skx | FileCheck %s -check-prefixes=WIN64,WIN64-SKX
8 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=knl | FileCheck %s -check-prefixes=X64,X64-KNL
9 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=skx | FileCheck %s -check-prefixes=X64,X64-SKX
11 declare <16 x float> @func_float16_ptr(<16 x float>, ptr)
12 declare <16 x float> @func_float16(<16 x float>, <16 x float>)
13 declare i32 @func_int(i32, i32)
15 ;test calling conventions - input parameters
16 define <16 x float> @testf16_inp(<16 x float> %a, <16 x float> %b) nounwind {
17 ; X32-LABEL: testf16_inp:
19 ; X32-NEXT: pushl %ebp
20 ; X32-NEXT: movl %esp, %ebp
21 ; X32-NEXT: andl $-64, %esp
22 ; X32-NEXT: subl $192, %esp
23 ; X32-NEXT: vaddps %zmm1, %zmm0, %zmm0
24 ; X32-NEXT: leal {{[0-9]+}}(%esp), %eax
25 ; X32-NEXT: movl %eax, (%esp)
26 ; X32-NEXT: calll _func_float16_ptr
27 ; X32-NEXT: vaddps {{[0-9]+}}(%esp), %zmm0, %zmm0
28 ; X32-NEXT: movl %ebp, %esp
32 ; WIN32-LABEL: testf16_inp:
34 ; WIN32-NEXT: pushl %ebp
35 ; WIN32-NEXT: movl %esp, %ebp
36 ; WIN32-NEXT: andl $-64, %esp
37 ; WIN32-NEXT: subl $128, %esp
38 ; WIN32-NEXT: vaddps %zmm1, %zmm0, %zmm0
39 ; WIN32-NEXT: movl %esp, %eax
40 ; WIN32-NEXT: pushl %eax
41 ; WIN32-NEXT: calll _func_float16_ptr
42 ; WIN32-NEXT: addl $4, %esp
43 ; WIN32-NEXT: vaddps (%esp), %zmm0, %zmm0
44 ; WIN32-NEXT: movl %ebp, %esp
45 ; WIN32-NEXT: popl %ebp
48 ; WIN64-LABEL: testf16_inp:
50 ; WIN64-NEXT: pushq %rbp
51 ; WIN64-NEXT: subq $176, %rsp
52 ; WIN64-NEXT: leaq {{[0-9]+}}(%rsp), %rbp
53 ; WIN64-NEXT: andq $-64, %rsp
54 ; WIN64-NEXT: vmovaps (%rcx), %zmm0
55 ; WIN64-NEXT: vaddps (%rdx), %zmm0, %zmm0
56 ; WIN64-NEXT: leaq {{[0-9]+}}(%rsp), %rcx
57 ; WIN64-NEXT: callq func_float16_ptr
58 ; WIN64-NEXT: vaddps {{[0-9]+}}(%rsp), %zmm0, %zmm0
59 ; WIN64-NEXT: leaq 48(%rbp), %rsp
60 ; WIN64-NEXT: popq %rbp
63 ; X64-LABEL: testf16_inp:
65 ; X64-NEXT: pushq %rbp
66 ; X64-NEXT: movq %rsp, %rbp
67 ; X64-NEXT: pushq %r13
68 ; X64-NEXT: pushq %r12
69 ; X64-NEXT: andq $-64, %rsp
70 ; X64-NEXT: subq $128, %rsp
71 ; X64-NEXT: vaddps %zmm1, %zmm0, %zmm0
72 ; X64-NEXT: movq %rsp, %rdi
73 ; X64-NEXT: pushq %rbp
74 ; X64-NEXT: pushq %rax
75 ; X64-NEXT: callq _func_float16_ptr
76 ; X64-NEXT: addq $8, %rsp
78 ; X64-NEXT: vaddps (%rsp), %zmm0, %zmm0
79 ; X64-NEXT: leaq -16(%rbp), %rsp
84 %y = alloca <16 x float>, align 64
85 %x = fadd <16 x float> %a, %b
86 %1 = call intel_ocl_bicc <16 x float> @func_float16_ptr(<16 x float> %x, ptr %y)
87 %2 = load <16 x float>, ptr %y, align 16
88 %3 = fadd <16 x float> %2, %1
92 ;test calling conventions - preserved registers
94 define <16 x float> @testf16_regs(<16 x float> %a, <16 x float> %b) nounwind {
95 ; X32-LABEL: testf16_regs:
97 ; X32-NEXT: pushl %ebp
98 ; X32-NEXT: movl %esp, %ebp
99 ; X32-NEXT: andl $-64, %esp
100 ; X32-NEXT: subl $256, %esp ## imm = 0x100
101 ; X32-NEXT: vmovaps %zmm1, {{[-0-9]+}}(%e{{[sb]}}p) ## 64-byte Spill
102 ; X32-NEXT: vaddps %zmm1, %zmm0, %zmm0
103 ; X32-NEXT: leal {{[0-9]+}}(%esp), %eax
104 ; X32-NEXT: movl %eax, (%esp)
105 ; X32-NEXT: calll _func_float16_ptr
106 ; X32-NEXT: vaddps {{[-0-9]+}}(%e{{[sb]}}p), %zmm0, %zmm0 ## 64-byte Folded Reload
107 ; X32-NEXT: vaddps {{[0-9]+}}(%esp), %zmm0, %zmm0
108 ; X32-NEXT: movl %ebp, %esp
109 ; X32-NEXT: popl %ebp
112 ; WIN32-LABEL: testf16_regs:
114 ; WIN32-NEXT: pushl %ebp
115 ; WIN32-NEXT: movl %esp, %ebp
116 ; WIN32-NEXT: andl $-64, %esp
117 ; WIN32-NEXT: subl $192, %esp
118 ; WIN32-NEXT: vmovaps %zmm1, (%esp) # 64-byte Spill
119 ; WIN32-NEXT: vaddps %zmm1, %zmm0, %zmm0
120 ; WIN32-NEXT: leal {{[0-9]+}}(%esp), %eax
121 ; WIN32-NEXT: pushl %eax
122 ; WIN32-NEXT: calll _func_float16_ptr
123 ; WIN32-NEXT: addl $4, %esp
124 ; WIN32-NEXT: vaddps (%esp), %zmm0, %zmm0 # 64-byte Folded Reload
125 ; WIN32-NEXT: vaddps {{[0-9]+}}(%esp), %zmm0, %zmm0
126 ; WIN32-NEXT: movl %ebp, %esp
127 ; WIN32-NEXT: popl %ebp
130 ; WIN64-LABEL: testf16_regs:
132 ; WIN64-NEXT: pushq %rbp
133 ; WIN64-NEXT: subq $176, %rsp
134 ; WIN64-NEXT: leaq {{[0-9]+}}(%rsp), %rbp
135 ; WIN64-NEXT: andq $-64, %rsp
136 ; WIN64-NEXT: vmovaps (%rdx), %zmm16
137 ; WIN64-NEXT: vaddps (%rcx), %zmm16, %zmm0
138 ; WIN64-NEXT: leaq {{[0-9]+}}(%rsp), %rcx
139 ; WIN64-NEXT: callq func_float16_ptr
140 ; WIN64-NEXT: vaddps %zmm16, %zmm0, %zmm0
141 ; WIN64-NEXT: vaddps {{[0-9]+}}(%rsp), %zmm0, %zmm0
142 ; WIN64-NEXT: leaq 48(%rbp), %rsp
143 ; WIN64-NEXT: popq %rbp
146 ; X64-LABEL: testf16_regs:
148 ; X64-NEXT: pushq %rbp
149 ; X64-NEXT: movq %rsp, %rbp
150 ; X64-NEXT: pushq %r13
151 ; X64-NEXT: pushq %r12
152 ; X64-NEXT: andq $-64, %rsp
153 ; X64-NEXT: subq $128, %rsp
154 ; X64-NEXT: vmovaps %zmm1, %zmm16
155 ; X64-NEXT: vaddps %zmm1, %zmm0, %zmm0
156 ; X64-NEXT: movq %rsp, %rdi
157 ; X64-NEXT: pushq %rbp
158 ; X64-NEXT: pushq %rax
159 ; X64-NEXT: callq _func_float16_ptr
160 ; X64-NEXT: addq $8, %rsp
161 ; X64-NEXT: popq %rbp
162 ; X64-NEXT: vaddps %zmm16, %zmm0, %zmm0
163 ; X64-NEXT: vaddps (%rsp), %zmm0, %zmm0
164 ; X64-NEXT: leaq -16(%rbp), %rsp
165 ; X64-NEXT: popq %r12
166 ; X64-NEXT: popq %r13
167 ; X64-NEXT: popq %rbp
169 %y = alloca <16 x float>, align 64
170 %x = fadd <16 x float> %a, %b
171 %1 = call intel_ocl_bicc <16 x float> @func_float16_ptr(<16 x float> %x, ptr %y)
172 %2 = load <16 x float>, ptr %y, align 16
173 %3 = fadd <16 x float> %1, %b
174 %4 = fadd <16 x float> %2, %3
178 ; test calling conventions - prolog and epilog
179 define intel_ocl_bicc <16 x float> @test_prolog_epilog(<16 x float> %a, <16 x float> %b) nounwind {
180 ; X32-LABEL: test_prolog_epilog:
182 ; X32-NEXT: subl $12, %esp
183 ; X32-NEXT: calll _func_float16
184 ; X32-NEXT: addl $12, %esp
187 ; WIN32-LABEL: test_prolog_epilog:
189 ; WIN32-NEXT: calll _func_float16
192 ; WIN64-KNL-LABEL: test_prolog_epilog:
193 ; WIN64-KNL: # %bb.0:
194 ; WIN64-KNL-NEXT: pushq %rbp
195 ; WIN64-KNL-NEXT: subq $1264, %rsp # imm = 0x4F0
196 ; WIN64-KNL-NEXT: leaq {{[0-9]+}}(%rsp), %rbp
197 ; WIN64-KNL-NEXT: kmovw %k7, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill
198 ; WIN64-KNL-NEXT: kmovw %k6, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill
199 ; WIN64-KNL-NEXT: kmovw %k5, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill
200 ; WIN64-KNL-NEXT: kmovw %k4, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill
201 ; WIN64-KNL-NEXT: vmovups %zmm21, {{[-0-9]+}}(%r{{[sb]}}p) # 64-byte Spill
202 ; WIN64-KNL-NEXT: vmovups %zmm20, {{[-0-9]+}}(%r{{[sb]}}p) # 64-byte Spill
203 ; WIN64-KNL-NEXT: vmovups %zmm19, {{[-0-9]+}}(%r{{[sb]}}p) # 64-byte Spill
204 ; WIN64-KNL-NEXT: vmovups %zmm18, {{[-0-9]+}}(%r{{[sb]}}p) # 64-byte Spill
205 ; WIN64-KNL-NEXT: vmovups %zmm17, {{[-0-9]+}}(%r{{[sb]}}p) # 64-byte Spill
206 ; WIN64-KNL-NEXT: vmovups %zmm16, {{[-0-9]+}}(%r{{[sb]}}p) # 64-byte Spill
207 ; WIN64-KNL-NEXT: vmovups %zmm15, {{[-0-9]+}}(%r{{[sb]}}p) # 64-byte Spill
208 ; WIN64-KNL-NEXT: vmovups %zmm14, {{[-0-9]+}}(%r{{[sb]}}p) # 64-byte Spill
209 ; WIN64-KNL-NEXT: vmovups %zmm13, {{[-0-9]+}}(%r{{[sb]}}p) # 64-byte Spill
210 ; WIN64-KNL-NEXT: vmovups %zmm12, {{[-0-9]+}}(%r{{[sb]}}p) # 64-byte Spill
211 ; WIN64-KNL-NEXT: vmovups %zmm11, {{[-0-9]+}}(%r{{[sb]}}p) # 64-byte Spill
212 ; WIN64-KNL-NEXT: vmovups %zmm10, {{[-0-9]+}}(%r{{[sb]}}p) # 64-byte Spill
213 ; WIN64-KNL-NEXT: vmovups %zmm9, {{[-0-9]+}}(%r{{[sb]}}p) # 64-byte Spill
214 ; WIN64-KNL-NEXT: vmovups %zmm8, {{[-0-9]+}}(%r{{[sb]}}p) # 64-byte Spill
215 ; WIN64-KNL-NEXT: vmovups %zmm7, {{[-0-9]+}}(%r{{[sb]}}p) # 64-byte Spill
216 ; WIN64-KNL-NEXT: vmovups %zmm6, {{[-0-9]+}}(%r{{[sb]}}p) # 64-byte Spill
217 ; WIN64-KNL-NEXT: andq $-64, %rsp
218 ; WIN64-KNL-NEXT: vmovaps %zmm1, {{[0-9]+}}(%rsp)
219 ; WIN64-KNL-NEXT: vmovaps %zmm0, {{[0-9]+}}(%rsp)
220 ; WIN64-KNL-NEXT: leaq {{[0-9]+}}(%rsp), %rcx
221 ; WIN64-KNL-NEXT: leaq {{[0-9]+}}(%rsp), %rdx
222 ; WIN64-KNL-NEXT: callq func_float16
223 ; WIN64-KNL-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm6 # 64-byte Reload
224 ; WIN64-KNL-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm7 # 64-byte Reload
225 ; WIN64-KNL-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm8 # 64-byte Reload
226 ; WIN64-KNL-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm9 # 64-byte Reload
227 ; WIN64-KNL-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm10 # 64-byte Reload
228 ; WIN64-KNL-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm11 # 64-byte Reload
229 ; WIN64-KNL-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm12 # 64-byte Reload
230 ; WIN64-KNL-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm13 # 64-byte Reload
231 ; WIN64-KNL-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm14 # 64-byte Reload
232 ; WIN64-KNL-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm15 # 64-byte Reload
233 ; WIN64-KNL-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm16 # 64-byte Reload
234 ; WIN64-KNL-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm17 # 64-byte Reload
235 ; WIN64-KNL-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm18 # 64-byte Reload
236 ; WIN64-KNL-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm19 # 64-byte Reload
237 ; WIN64-KNL-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm20 # 64-byte Reload
238 ; WIN64-KNL-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm21 # 64-byte Reload
239 ; WIN64-KNL-NEXT: kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k4 # 2-byte Reload
240 ; WIN64-KNL-NEXT: kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k5 # 2-byte Reload
241 ; WIN64-KNL-NEXT: kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k6 # 2-byte Reload
242 ; WIN64-KNL-NEXT: kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k7 # 2-byte Reload
243 ; WIN64-KNL-NEXT: leaq 1136(%rbp), %rsp
244 ; WIN64-KNL-NEXT: popq %rbp
245 ; WIN64-KNL-NEXT: retq
247 ; WIN64-SKX-LABEL: test_prolog_epilog:
248 ; WIN64-SKX: # %bb.0:
249 ; WIN64-SKX-NEXT: pushq %rbp
250 ; WIN64-SKX-NEXT: subq $1264, %rsp # imm = 0x4F0
251 ; WIN64-SKX-NEXT: leaq {{[0-9]+}}(%rsp), %rbp
252 ; WIN64-SKX-NEXT: kmovq %k7, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
253 ; WIN64-SKX-NEXT: kmovq %k6, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
254 ; WIN64-SKX-NEXT: kmovq %k5, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
255 ; WIN64-SKX-NEXT: kmovq %k4, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
256 ; WIN64-SKX-NEXT: vmovups %zmm21, {{[-0-9]+}}(%r{{[sb]}}p) # 64-byte Spill
257 ; WIN64-SKX-NEXT: vmovups %zmm20, {{[-0-9]+}}(%r{{[sb]}}p) # 64-byte Spill
258 ; WIN64-SKX-NEXT: vmovups %zmm19, {{[-0-9]+}}(%r{{[sb]}}p) # 64-byte Spill
259 ; WIN64-SKX-NEXT: vmovups %zmm18, {{[-0-9]+}}(%r{{[sb]}}p) # 64-byte Spill
260 ; WIN64-SKX-NEXT: vmovups %zmm17, {{[-0-9]+}}(%r{{[sb]}}p) # 64-byte Spill
261 ; WIN64-SKX-NEXT: vmovups %zmm16, {{[-0-9]+}}(%r{{[sb]}}p) # 64-byte Spill
262 ; WIN64-SKX-NEXT: vmovups %zmm15, {{[-0-9]+}}(%r{{[sb]}}p) # 64-byte Spill
263 ; WIN64-SKX-NEXT: vmovups %zmm14, {{[-0-9]+}}(%r{{[sb]}}p) # 64-byte Spill
264 ; WIN64-SKX-NEXT: vmovups %zmm13, {{[-0-9]+}}(%r{{[sb]}}p) # 64-byte Spill
265 ; WIN64-SKX-NEXT: vmovups %zmm12, {{[-0-9]+}}(%r{{[sb]}}p) # 64-byte Spill
266 ; WIN64-SKX-NEXT: vmovups %zmm11, {{[-0-9]+}}(%r{{[sb]}}p) # 64-byte Spill
267 ; WIN64-SKX-NEXT: vmovups %zmm10, {{[-0-9]+}}(%r{{[sb]}}p) # 64-byte Spill
268 ; WIN64-SKX-NEXT: vmovups %zmm9, {{[-0-9]+}}(%r{{[sb]}}p) # 64-byte Spill
269 ; WIN64-SKX-NEXT: vmovups %zmm8, {{[-0-9]+}}(%r{{[sb]}}p) # 64-byte Spill
270 ; WIN64-SKX-NEXT: vmovups %zmm7, {{[-0-9]+}}(%r{{[sb]}}p) # 64-byte Spill
271 ; WIN64-SKX-NEXT: vmovups %zmm6, {{[-0-9]+}}(%r{{[sb]}}p) # 64-byte Spill
272 ; WIN64-SKX-NEXT: andq $-64, %rsp
273 ; WIN64-SKX-NEXT: vmovaps %zmm1, {{[0-9]+}}(%rsp)
274 ; WIN64-SKX-NEXT: vmovaps %zmm0, {{[0-9]+}}(%rsp)
275 ; WIN64-SKX-NEXT: leaq {{[0-9]+}}(%rsp), %rcx
276 ; WIN64-SKX-NEXT: leaq {{[0-9]+}}(%rsp), %rdx
277 ; WIN64-SKX-NEXT: callq func_float16
278 ; WIN64-SKX-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm6 # 64-byte Reload
279 ; WIN64-SKX-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm7 # 64-byte Reload
280 ; WIN64-SKX-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm8 # 64-byte Reload
281 ; WIN64-SKX-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm9 # 64-byte Reload
282 ; WIN64-SKX-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm10 # 64-byte Reload
283 ; WIN64-SKX-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm11 # 64-byte Reload
284 ; WIN64-SKX-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm12 # 64-byte Reload
285 ; WIN64-SKX-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm13 # 64-byte Reload
286 ; WIN64-SKX-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm14 # 64-byte Reload
287 ; WIN64-SKX-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm15 # 64-byte Reload
288 ; WIN64-SKX-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm16 # 64-byte Reload
289 ; WIN64-SKX-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm17 # 64-byte Reload
290 ; WIN64-SKX-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm18 # 64-byte Reload
291 ; WIN64-SKX-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm19 # 64-byte Reload
292 ; WIN64-SKX-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm20 # 64-byte Reload
293 ; WIN64-SKX-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm21 # 64-byte Reload
294 ; WIN64-SKX-NEXT: kmovq {{[-0-9]+}}(%r{{[sb]}}p), %k4 # 8-byte Reload
295 ; WIN64-SKX-NEXT: kmovq {{[-0-9]+}}(%r{{[sb]}}p), %k5 # 8-byte Reload
296 ; WIN64-SKX-NEXT: kmovq {{[-0-9]+}}(%r{{[sb]}}p), %k6 # 8-byte Reload
297 ; WIN64-SKX-NEXT: kmovq {{[-0-9]+}}(%r{{[sb]}}p), %k7 # 8-byte Reload
298 ; WIN64-SKX-NEXT: leaq 1136(%rbp), %rsp
299 ; WIN64-SKX-NEXT: popq %rbp
300 ; WIN64-SKX-NEXT: retq
302 ; X64-KNL-LABEL: test_prolog_epilog:
304 ; X64-KNL-NEXT: pushq %rsi
305 ; X64-KNL-NEXT: subq $1072, %rsp ## imm = 0x430
306 ; X64-KNL-NEXT: kmovw %k7, {{[-0-9]+}}(%r{{[sb]}}p) ## 2-byte Spill
307 ; X64-KNL-NEXT: kmovw %k6, {{[-0-9]+}}(%r{{[sb]}}p) ## 2-byte Spill
308 ; X64-KNL-NEXT: kmovw %k5, {{[-0-9]+}}(%r{{[sb]}}p) ## 2-byte Spill
309 ; X64-KNL-NEXT: kmovw %k4, {{[-0-9]+}}(%r{{[sb]}}p) ## 2-byte Spill
310 ; X64-KNL-NEXT: vmovups %zmm31, {{[-0-9]+}}(%r{{[sb]}}p) ## 64-byte Spill
311 ; X64-KNL-NEXT: vmovups %zmm30, {{[-0-9]+}}(%r{{[sb]}}p) ## 64-byte Spill
312 ; X64-KNL-NEXT: vmovups %zmm29, {{[-0-9]+}}(%r{{[sb]}}p) ## 64-byte Spill
313 ; X64-KNL-NEXT: vmovups %zmm28, {{[-0-9]+}}(%r{{[sb]}}p) ## 64-byte Spill
314 ; X64-KNL-NEXT: vmovups %zmm27, {{[-0-9]+}}(%r{{[sb]}}p) ## 64-byte Spill
315 ; X64-KNL-NEXT: vmovups %zmm26, {{[-0-9]+}}(%r{{[sb]}}p) ## 64-byte Spill
316 ; X64-KNL-NEXT: vmovups %zmm25, {{[-0-9]+}}(%r{{[sb]}}p) ## 64-byte Spill
317 ; X64-KNL-NEXT: vmovups %zmm24, {{[-0-9]+}}(%r{{[sb]}}p) ## 64-byte Spill
318 ; X64-KNL-NEXT: vmovups %zmm23, {{[-0-9]+}}(%r{{[sb]}}p) ## 64-byte Spill
319 ; X64-KNL-NEXT: vmovups %zmm22, {{[-0-9]+}}(%r{{[sb]}}p) ## 64-byte Spill
320 ; X64-KNL-NEXT: vmovups %zmm21, {{[-0-9]+}}(%r{{[sb]}}p) ## 64-byte Spill
321 ; X64-KNL-NEXT: vmovups %zmm20, {{[-0-9]+}}(%r{{[sb]}}p) ## 64-byte Spill
322 ; X64-KNL-NEXT: vmovups %zmm19, {{[-0-9]+}}(%r{{[sb]}}p) ## 64-byte Spill
323 ; X64-KNL-NEXT: vmovups %zmm18, {{[-0-9]+}}(%r{{[sb]}}p) ## 64-byte Spill
324 ; X64-KNL-NEXT: vmovups %zmm17, {{[-0-9]+}}(%r{{[sb]}}p) ## 64-byte Spill
325 ; X64-KNL-NEXT: vmovups %zmm16, (%rsp) ## 64-byte Spill
326 ; X64-KNL-NEXT: callq _func_float16
327 ; X64-KNL-NEXT: vmovups (%rsp), %zmm16 ## 64-byte Reload
328 ; X64-KNL-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm17 ## 64-byte Reload
329 ; X64-KNL-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm18 ## 64-byte Reload
330 ; X64-KNL-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm19 ## 64-byte Reload
331 ; X64-KNL-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm20 ## 64-byte Reload
332 ; X64-KNL-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm21 ## 64-byte Reload
333 ; X64-KNL-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm22 ## 64-byte Reload
334 ; X64-KNL-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm23 ## 64-byte Reload
335 ; X64-KNL-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm24 ## 64-byte Reload
336 ; X64-KNL-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm25 ## 64-byte Reload
337 ; X64-KNL-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm26 ## 64-byte Reload
338 ; X64-KNL-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm27 ## 64-byte Reload
339 ; X64-KNL-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm28 ## 64-byte Reload
340 ; X64-KNL-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm29 ## 64-byte Reload
341 ; X64-KNL-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm30 ## 64-byte Reload
342 ; X64-KNL-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm31 ## 64-byte Reload
343 ; X64-KNL-NEXT: kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k4 ## 2-byte Reload
344 ; X64-KNL-NEXT: kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k5 ## 2-byte Reload
345 ; X64-KNL-NEXT: kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k6 ## 2-byte Reload
346 ; X64-KNL-NEXT: kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k7 ## 2-byte Reload
347 ; X64-KNL-NEXT: addq $1072, %rsp ## imm = 0x430
348 ; X64-KNL-NEXT: popq %rsi
351 ; X64-SKX-LABEL: test_prolog_epilog:
353 ; X64-SKX-NEXT: pushq %rsi
354 ; X64-SKX-NEXT: subq $1072, %rsp ## imm = 0x430
355 ; X64-SKX-NEXT: kmovq %k7, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
356 ; X64-SKX-NEXT: kmovq %k6, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
357 ; X64-SKX-NEXT: kmovq %k5, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
358 ; X64-SKX-NEXT: kmovq %k4, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
359 ; X64-SKX-NEXT: vmovups %zmm31, {{[-0-9]+}}(%r{{[sb]}}p) ## 64-byte Spill
360 ; X64-SKX-NEXT: vmovups %zmm30, {{[-0-9]+}}(%r{{[sb]}}p) ## 64-byte Spill
361 ; X64-SKX-NEXT: vmovups %zmm29, {{[-0-9]+}}(%r{{[sb]}}p) ## 64-byte Spill
362 ; X64-SKX-NEXT: vmovups %zmm28, {{[-0-9]+}}(%r{{[sb]}}p) ## 64-byte Spill
363 ; X64-SKX-NEXT: vmovups %zmm27, {{[-0-9]+}}(%r{{[sb]}}p) ## 64-byte Spill
364 ; X64-SKX-NEXT: vmovups %zmm26, {{[-0-9]+}}(%r{{[sb]}}p) ## 64-byte Spill
365 ; X64-SKX-NEXT: vmovups %zmm25, {{[-0-9]+}}(%r{{[sb]}}p) ## 64-byte Spill
366 ; X64-SKX-NEXT: vmovups %zmm24, {{[-0-9]+}}(%r{{[sb]}}p) ## 64-byte Spill
367 ; X64-SKX-NEXT: vmovups %zmm23, {{[-0-9]+}}(%r{{[sb]}}p) ## 64-byte Spill
368 ; X64-SKX-NEXT: vmovups %zmm22, {{[-0-9]+}}(%r{{[sb]}}p) ## 64-byte Spill
369 ; X64-SKX-NEXT: vmovups %zmm21, {{[-0-9]+}}(%r{{[sb]}}p) ## 64-byte Spill
370 ; X64-SKX-NEXT: vmovups %zmm20, {{[-0-9]+}}(%r{{[sb]}}p) ## 64-byte Spill
371 ; X64-SKX-NEXT: vmovups %zmm19, {{[-0-9]+}}(%r{{[sb]}}p) ## 64-byte Spill
372 ; X64-SKX-NEXT: vmovups %zmm18, {{[-0-9]+}}(%r{{[sb]}}p) ## 64-byte Spill
373 ; X64-SKX-NEXT: vmovups %zmm17, {{[-0-9]+}}(%r{{[sb]}}p) ## 64-byte Spill
374 ; X64-SKX-NEXT: vmovups %zmm16, (%rsp) ## 64-byte Spill
375 ; X64-SKX-NEXT: callq _func_float16
376 ; X64-SKX-NEXT: vmovups (%rsp), %zmm16 ## 64-byte Reload
377 ; X64-SKX-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm17 ## 64-byte Reload
378 ; X64-SKX-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm18 ## 64-byte Reload
379 ; X64-SKX-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm19 ## 64-byte Reload
380 ; X64-SKX-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm20 ## 64-byte Reload
381 ; X64-SKX-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm21 ## 64-byte Reload
382 ; X64-SKX-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm22 ## 64-byte Reload
383 ; X64-SKX-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm23 ## 64-byte Reload
384 ; X64-SKX-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm24 ## 64-byte Reload
385 ; X64-SKX-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm25 ## 64-byte Reload
386 ; X64-SKX-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm26 ## 64-byte Reload
387 ; X64-SKX-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm27 ## 64-byte Reload
388 ; X64-SKX-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm28 ## 64-byte Reload
389 ; X64-SKX-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm29 ## 64-byte Reload
390 ; X64-SKX-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm30 ## 64-byte Reload
391 ; X64-SKX-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm31 ## 64-byte Reload
392 ; X64-SKX-NEXT: kmovq {{[-0-9]+}}(%r{{[sb]}}p), %k4 ## 8-byte Reload
393 ; X64-SKX-NEXT: kmovq {{[-0-9]+}}(%r{{[sb]}}p), %k5 ## 8-byte Reload
394 ; X64-SKX-NEXT: kmovq {{[-0-9]+}}(%r{{[sb]}}p), %k6 ## 8-byte Reload
395 ; X64-SKX-NEXT: kmovq {{[-0-9]+}}(%r{{[sb]}}p), %k7 ## 8-byte Reload
396 ; X64-SKX-NEXT: addq $1072, %rsp ## imm = 0x430
397 ; X64-SKX-NEXT: popq %rsi
399 %c = call <16 x float> @func_float16(<16 x float> %a, <16 x float> %b)
404 declare <16 x float> @func_float16_mask(<16 x float>, <16 x i1>)
406 define <16 x float> @testf16_inp_mask(<16 x float> %a, i16 %mask) {
407 ; X32-LABEL: testf16_inp_mask:
409 ; X32-NEXT: subl $12, %esp
410 ; X32-NEXT: .cfi_def_cfa_offset 16
411 ; X32-NEXT: kmovw {{[0-9]+}}(%esp), %k1
412 ; X32-NEXT: calll _func_float16_mask
413 ; X32-NEXT: addl $12, %esp
416 ; WIN32-LABEL: testf16_inp_mask:
418 ; WIN32-NEXT: kmovw {{[0-9]+}}(%esp), %k1
419 ; WIN32-NEXT: calll _func_float16_mask
422 ; WIN64-KNL-LABEL: testf16_inp_mask:
423 ; WIN64-KNL: # %bb.0:
424 ; WIN64-KNL-NEXT: subq $40, %rsp
425 ; WIN64-KNL-NEXT: .seh_stackalloc 40
426 ; WIN64-KNL-NEXT: .seh_endprologue
427 ; WIN64-KNL-NEXT: # kill: def $dx killed $dx def $edx
428 ; WIN64-KNL-NEXT: vmovaps (%rcx), %zmm0
429 ; WIN64-KNL-NEXT: kmovw %edx, %k1
430 ; WIN64-KNL-NEXT: callq func_float16_mask
431 ; WIN64-KNL-NEXT: nop
432 ; WIN64-KNL-NEXT: addq $40, %rsp
433 ; WIN64-KNL-NEXT: retq
434 ; WIN64-KNL-NEXT: .seh_endproc
436 ; WIN64-SKX-LABEL: testf16_inp_mask:
437 ; WIN64-SKX: # %bb.0:
438 ; WIN64-SKX-NEXT: subq $40, %rsp
439 ; WIN64-SKX-NEXT: .seh_stackalloc 40
440 ; WIN64-SKX-NEXT: .seh_endprologue
441 ; WIN64-SKX-NEXT: # kill: def $dx killed $dx def $edx
442 ; WIN64-SKX-NEXT: vmovaps (%rcx), %zmm0
443 ; WIN64-SKX-NEXT: kmovd %edx, %k1
444 ; WIN64-SKX-NEXT: callq func_float16_mask
445 ; WIN64-SKX-NEXT: nop
446 ; WIN64-SKX-NEXT: addq $40, %rsp
447 ; WIN64-SKX-NEXT: retq
448 ; WIN64-SKX-NEXT: .seh_endproc
450 ; X64-KNL-LABEL: testf16_inp_mask:
452 ; X64-KNL-NEXT: pushq %rbp
453 ; X64-KNL-NEXT: .cfi_def_cfa_offset 16
454 ; X64-KNL-NEXT: pushq %r13
455 ; X64-KNL-NEXT: .cfi_def_cfa_offset 24
456 ; X64-KNL-NEXT: pushq %r12
457 ; X64-KNL-NEXT: .cfi_def_cfa_offset 32
458 ; X64-KNL-NEXT: .cfi_offset %r12, -32
459 ; X64-KNL-NEXT: .cfi_offset %r13, -24
460 ; X64-KNL-NEXT: .cfi_offset %rbp, -16
461 ; X64-KNL-NEXT: kmovw %edi, %k1
462 ; X64-KNL-NEXT: callq _func_float16_mask
463 ; X64-KNL-NEXT: popq %r12
464 ; X64-KNL-NEXT: popq %r13
465 ; X64-KNL-NEXT: popq %rbp
468 ; X64-SKX-LABEL: testf16_inp_mask:
470 ; X64-SKX-NEXT: pushq %rbp
471 ; X64-SKX-NEXT: .cfi_def_cfa_offset 16
472 ; X64-SKX-NEXT: pushq %r13
473 ; X64-SKX-NEXT: .cfi_def_cfa_offset 24
474 ; X64-SKX-NEXT: pushq %r12
475 ; X64-SKX-NEXT: .cfi_def_cfa_offset 32
476 ; X64-SKX-NEXT: .cfi_offset %r12, -32
477 ; X64-SKX-NEXT: .cfi_offset %r13, -24
478 ; X64-SKX-NEXT: .cfi_offset %rbp, -16
479 ; X64-SKX-NEXT: kmovd %edi, %k1
480 ; X64-SKX-NEXT: callq _func_float16_mask
481 ; X64-SKX-NEXT: popq %r12
482 ; X64-SKX-NEXT: popq %r13
483 ; X64-SKX-NEXT: popq %rbp
485 %imask = bitcast i16 %mask to <16 x i1>
486 %1 = call intel_ocl_bicc <16 x float> @func_float16_mask(<16 x float> %a, <16 x i1> %imask)
490 define intel_ocl_bicc <16 x float> @test_prolog_epilog_with_mask(<16 x float> %a, <16 x i32> %x1, <16 x i32>%x2, <16 x i1> %mask) nounwind {
491 ; X32-LABEL: test_prolog_epilog_with_mask:
493 ; X32-NEXT: subl $12, %esp
494 ; X32-NEXT: vpcmpeqd %zmm2, %zmm1, %k0
495 ; X32-NEXT: kxorw %k1, %k0, %k1
496 ; X32-NEXT: calll _func_float16_mask
497 ; X32-NEXT: addl $12, %esp
500 ; WIN32-LABEL: test_prolog_epilog_with_mask:
502 ; WIN32-NEXT: vpcmpeqd %zmm2, %zmm1, %k0
503 ; WIN32-NEXT: kxorw %k1, %k0, %k1
504 ; WIN32-NEXT: calll _func_float16_mask
507 ; WIN64-LABEL: test_prolog_epilog_with_mask:
509 ; WIN64-NEXT: subq $40, %rsp
510 ; WIN64-NEXT: vpcmpeqd %zmm2, %zmm1, %k0
511 ; WIN64-NEXT: kxorw %k1, %k0, %k1
512 ; WIN64-NEXT: callq func_float16_mask
513 ; WIN64-NEXT: addq $40, %rsp
516 ; X64-LABEL: test_prolog_epilog_with_mask:
518 ; X64-NEXT: pushq %rax
519 ; X64-NEXT: vpcmpeqd %zmm2, %zmm1, %k0
520 ; X64-NEXT: kxorw %k1, %k0, %k1
521 ; X64-NEXT: callq _func_float16_mask
522 ; X64-NEXT: popq %rax
524 %cmp_res = icmp eq <16 x i32>%x1, %x2
525 %mask1 = xor <16 x i1> %cmp_res, %mask
526 %c = call intel_ocl_bicc <16 x float> @func_float16_mask(<16 x float> %a, <16 x i1>%mask1)