[X86] Add intrinsics for reading and writing to the flags register
[oota-llvm.git] / test / CodeGen / X86 / avx512-calling-conv.ll
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=knl | FileCheck %s --check-prefix=ALL_X64 --check-prefix=KNL
3 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=skx | FileCheck %s --check-prefix=ALL_X64 --check-prefix=SKX
4 ; RUN: llc < %s -mtriple=i686-apple-darwin -mcpu=knl | FileCheck %s --check-prefix=KNL_X32
5
6 define <16 x i1> @test1() {
7 ; ALL_X64-LABEL: test1:
8 ; ALL_X64:       ## BB#0:
9 ; ALL_X64-NEXT:    vxorps %xmm0, %xmm0, %xmm0
10 ; ALL_X64-NEXT:    retq
11 ;
12 ; KNL_X32-LABEL: test1:
13 ; KNL_X32:       ## BB#0:
14 ; KNL_X32-NEXT:    vxorps %xmm0, %xmm0, %xmm0
15 ; KNL_X32-NEXT:    retl
16   ret <16 x i1> zeroinitializer
17 }
18
19 define <16 x i1> @test2(<16 x i1>%a, <16 x i1>%b) {
20 ; KNL-LABEL: test2:
21 ; KNL:       ## BB#0:
22 ; KNL-NEXT:    vpmovsxbd %xmm1, %zmm1
23 ; KNL-NEXT:    vpslld $31, %zmm1, %zmm1
24 ; KNL-NEXT:    vpmovsxbd %xmm0, %zmm0
25 ; KNL-NEXT:    vpslld $31, %zmm0, %zmm0
26 ; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k1
27 ; KNL-NEXT:    vptestmd %zmm1, %zmm1, %k1 {%k1}
28 ; KNL-NEXT:    vpbroadcastd {{.*}}(%rip), %zmm0 {%k1} {z}
29 ; KNL-NEXT:    vpmovdb %zmm0, %xmm0
30 ; KNL-NEXT:    retq
31 ;
32 ; SKX-LABEL: test2:
33 ; SKX:       ## BB#0:
34 ; SKX-NEXT:    vpsllw $7, %xmm1, %xmm1
35 ; SKX-NEXT:    vpmovb2m %xmm1, %k0
36 ; SKX-NEXT:    vpsllw $7, %xmm0, %xmm0
37 ; SKX-NEXT:    vpmovb2m %xmm0, %k1
38 ; SKX-NEXT:    kandw %k0, %k1, %k0
39 ; SKX-NEXT:    vpmovm2b %k0, %xmm0
40 ; SKX-NEXT:    retq
41 ;
42 ; KNL_X32-LABEL: test2:
43 ; KNL_X32:       ## BB#0:
44 ; KNL_X32-NEXT:    vpmovsxbd %xmm1, %zmm1
45 ; KNL_X32-NEXT:    vpslld $31, %zmm1, %zmm1
46 ; KNL_X32-NEXT:    vpmovsxbd %xmm0, %zmm0
47 ; KNL_X32-NEXT:    vpslld $31, %zmm0, %zmm0
48 ; KNL_X32-NEXT:    vptestmd %zmm0, %zmm0, %k1
49 ; KNL_X32-NEXT:    vptestmd %zmm1, %zmm1, %k1 {%k1}
50 ; KNL_X32-NEXT:    vpbroadcastd LCPI1_0, %zmm0 {%k1} {z}
51 ; KNL_X32-NEXT:    vpmovdb %zmm0, %xmm0
52 ; KNL_X32-NEXT:    retl
53   %c = and <16 x i1>%a, %b
54   ret <16 x i1> %c
55 }
56
57 define <8 x i1> @test3(<8 x i1>%a, <8 x i1>%b) {
58 ; KNL-LABEL: test3:
59 ; KNL:       ## BB#0:
60 ; KNL-NEXT:    vpmovsxwq %xmm1, %zmm1
61 ; KNL-NEXT:    vpsllq $63, %zmm1, %zmm1
62 ; KNL-NEXT:    vpmovsxwq %xmm0, %zmm0
63 ; KNL-NEXT:    vpsllq $63, %zmm0, %zmm0
64 ; KNL-NEXT:    vptestmq %zmm0, %zmm0, %k1
65 ; KNL-NEXT:    vptestmq %zmm1, %zmm1, %k1 {%k1}
66 ; KNL-NEXT:    vpbroadcastq {{.*}}(%rip), %zmm0 {%k1} {z}
67 ; KNL-NEXT:    vpmovqw %zmm0, %xmm0
68 ; KNL-NEXT:    retq
69 ;
70 ; SKX-LABEL: test3:
71 ; SKX:       ## BB#0:
72 ; SKX-NEXT:    vpsllw $15, %xmm1, %xmm1
73 ; SKX-NEXT:    vpmovw2m %xmm1, %k0
74 ; SKX-NEXT:    vpsllw $15, %xmm0, %xmm0
75 ; SKX-NEXT:    vpmovw2m %xmm0, %k1
76 ; SKX-NEXT:    kandb %k0, %k1, %k0
77 ; SKX-NEXT:    vpmovm2w %k0, %xmm0
78 ; SKX-NEXT:    retq
79 ;
80 ; KNL_X32-LABEL: test3:
81 ; KNL_X32:       ## BB#0:
82 ; KNL_X32-NEXT:    vpmovsxwq %xmm1, %zmm1
83 ; KNL_X32-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [63,0,63,0,63,0,63,0,63,0,63,0,63,0,63,0]
84 ; KNL_X32-NEXT:    vpsllvq %zmm2, %zmm1, %zmm1
85 ; KNL_X32-NEXT:    vpmovsxwq %xmm0, %zmm0
86 ; KNL_X32-NEXT:    vpsllvq %zmm2, %zmm0, %zmm0
87 ; KNL_X32-NEXT:    vptestmq %zmm0, %zmm0, %k1
88 ; KNL_X32-NEXT:    vptestmq %zmm1, %zmm1, %k1 {%k1}
89 ; KNL_X32-NEXT:    vpbroadcastd LCPI2_1, %zmm0
90 ; KNL_X32-NEXT:    vmovdqu64 %zmm0, %zmm0 {%k1} {z}
91 ; KNL_X32-NEXT:    vpmovqw %zmm0, %xmm0
92 ; KNL_X32-NEXT:    retl
93   %c = and <8 x i1>%a, %b
94   ret <8 x i1> %c
95 }
96
97 define <4 x i1> @test4(<4 x i1>%a, <4 x i1>%b) {
98 ; KNL-LABEL: test4:
99 ; KNL:       ## BB#0:
100 ; KNL-NEXT:    vandps %xmm1, %xmm0, %xmm0
101 ; KNL-NEXT:    retq
102 ;
103 ; SKX-LABEL: test4:
104 ; SKX:       ## BB#0:
105 ; SKX-NEXT:    vpslld $31, %xmm0, %xmm0
106 ; SKX-NEXT:    vpmovd2m %xmm0, %k0
107 ; SKX-NEXT:    vpslld $31, %xmm1, %xmm0
108 ; SKX-NEXT:    vpmovd2m %xmm0, %k1
109 ; SKX-NEXT:    kandw %k1, %k0, %k0
110 ; SKX-NEXT:    vpmovm2d %k0, %xmm0
111 ; SKX-NEXT:    retq
112 ;
113 ; KNL_X32-LABEL: test4:
114 ; KNL_X32:       ## BB#0:
115 ; KNL_X32-NEXT:    vandps %xmm1, %xmm0, %xmm0
116 ; KNL_X32-NEXT:    retl
117   %c = and <4 x i1>%a, %b
118   ret <4 x i1> %c
119 }
120
121 declare <8 x i1> @func8xi1(<8 x i1> %a)
122
123 define <8 x i32> @test5(<8 x i32>%a, <8 x i32>%b) {
124 ; KNL-LABEL: test5:
125 ; KNL:       ## BB#0:
126 ; KNL-NEXT:    pushq %rax
127 ; KNL-NEXT:  Ltmp0:
128 ; KNL-NEXT:    .cfi_def_cfa_offset 16
129 ; KNL-NEXT:    vpcmpgtd %ymm1, %ymm0, %ymm0
130 ; KNL-NEXT:    vpmovdw %zmm0, %ymm0
131 ; KNL-NEXT:    callq _func8xi1
132 ; KNL-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
133 ; KNL-NEXT:    vpslld $31, %ymm0, %ymm0
134 ; KNL-NEXT:    vpsrad $31, %ymm0, %ymm0
135 ; KNL-NEXT:    popq %rax
136 ; KNL-NEXT:    retq
137 ;
138 ; SKX-LABEL: test5:
139 ; SKX:       ## BB#0:
140 ; SKX-NEXT:    pushq %rax
141 ; SKX-NEXT:  Ltmp0:
142 ; SKX-NEXT:    .cfi_def_cfa_offset 16
143 ; SKX-NEXT:    vpcmpgtd %ymm1, %ymm0, %k0
144 ; SKX-NEXT:    vpmovm2w %k0, %xmm0
145 ; SKX-NEXT:    callq _func8xi1
146 ; SKX-NEXT:    vpmovzxwd %xmm0, %ymm0
147 ; SKX-NEXT:    vpslld $31, %ymm0, %ymm0
148 ; SKX-NEXT:    vpsrad $31, %ymm0, %ymm0
149 ; SKX-NEXT:    popq %rax
150 ; SKX-NEXT:    retq
151 ;
152 ; KNL_X32-LABEL: test5:
153 ; KNL_X32:       ## BB#0:
154 ; KNL_X32-NEXT:    subl $12, %esp
155 ; KNL_X32-NEXT:  Ltmp0:
156 ; KNL_X32-NEXT:    .cfi_def_cfa_offset 16
157 ; KNL_X32-NEXT:    vpcmpgtd %ymm1, %ymm0, %ymm0
158 ; KNL_X32-NEXT:    vpmovdw %zmm0, %ymm0
159 ; KNL_X32-NEXT:    calll L_func8xi1$stub
160 ; KNL_X32-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
161 ; KNL_X32-NEXT:    vpslld $31, %ymm0, %ymm0
162 ; KNL_X32-NEXT:    vpsrad $31, %ymm0, %ymm0
163 ; KNL_X32-NEXT:    addl $12, %esp
164 ; KNL_X32-NEXT:    retl
165   %cmpRes = icmp sgt <8 x i32>%a, %b
166   %resi = call <8 x i1> @func8xi1(<8 x i1> %cmpRes)
167   %res = sext <8 x i1>%resi to <8 x i32>
168   ret <8 x i32> %res
169 }
170
171 declare <16 x i1> @func16xi1(<16 x i1> %a)
172
173 define <16 x i32> @test6(<16 x i32>%a, <16 x i32>%b) {
174 ; KNL-LABEL: test6:
175 ; KNL:       ## BB#0:
176 ; KNL-NEXT:    pushq %rax
177 ; KNL-NEXT:  Ltmp1:
178 ; KNL-NEXT:    .cfi_def_cfa_offset 16
179 ; KNL-NEXT:    vpcmpgtd %zmm1, %zmm0, %k1
180 ; KNL-NEXT:    vpbroadcastd {{.*}}(%rip), %zmm0 {%k1} {z}
181 ; KNL-NEXT:    vpmovdb %zmm0, %xmm0
182 ; KNL-NEXT:    callq _func16xi1
183 ; KNL-NEXT:    vpmovzxbd %xmm0, %zmm0
184 ; KNL-NEXT:    vpslld $31, %zmm0, %zmm0
185 ; KNL-NEXT:    vpsrad $31, %zmm0, %zmm0
186 ; KNL-NEXT:    popq %rax
187 ; KNL-NEXT:    retq
188 ;
189 ; SKX-LABEL: test6:
190 ; SKX:       ## BB#0:
191 ; SKX-NEXT:    pushq %rax
192 ; SKX-NEXT:  Ltmp1:
193 ; SKX-NEXT:    .cfi_def_cfa_offset 16
194 ; SKX-NEXT:    vpcmpgtd %zmm1, %zmm0, %k0
195 ; SKX-NEXT:    vpmovm2b %k0, %xmm0
196 ; SKX-NEXT:    callq _func16xi1
197 ; SKX-NEXT:    vpmovzxbd %xmm0, %zmm0
198 ; SKX-NEXT:    vpslld $31, %zmm0, %zmm0
199 ; SKX-NEXT:    vpsrad $31, %zmm0, %zmm0
200 ; SKX-NEXT:    popq %rax
201 ; SKX-NEXT:    retq
202 ;
203 ; KNL_X32-LABEL: test6:
204 ; KNL_X32:       ## BB#0:
205 ; KNL_X32-NEXT:    subl $12, %esp
206 ; KNL_X32-NEXT:  Ltmp1:
207 ; KNL_X32-NEXT:    .cfi_def_cfa_offset 16
208 ; KNL_X32-NEXT:    vpcmpgtd %zmm1, %zmm0, %k1
209 ; KNL_X32-NEXT:    vpbroadcastd LCPI5_0, %zmm0 {%k1} {z}
210 ; KNL_X32-NEXT:    vpmovdb %zmm0, %xmm0
211 ; KNL_X32-NEXT:    calll L_func16xi1$stub
212 ; KNL_X32-NEXT:    vpmovzxbd %xmm0, %zmm0
213 ; KNL_X32-NEXT:    vpslld $31, %zmm0, %zmm0
214 ; KNL_X32-NEXT:    vpsrad $31, %zmm0, %zmm0
215 ; KNL_X32-NEXT:    addl $12, %esp
216 ; KNL_X32-NEXT:    retl
217   %cmpRes = icmp sgt <16 x i32>%a, %b
218   %resi = call <16 x i1> @func16xi1(<16 x i1> %cmpRes)
219   %res = sext <16 x i1>%resi to <16 x i32>
220   ret <16 x i32> %res
221 }
222
223 declare <4 x i1> @func4xi1(<4 x i1> %a)
224
225 define <4 x i32> @test7(<4 x i32>%a, <4 x i32>%b) {
226 ; KNL-LABEL: test7:
227 ; KNL:       ## BB#0:
228 ; KNL-NEXT:    pushq %rax
229 ; KNL-NEXT:  Ltmp2:
230 ; KNL-NEXT:    .cfi_def_cfa_offset 16
231 ; KNL-NEXT:    vpcmpgtd %xmm1, %xmm0, %xmm0
232 ; KNL-NEXT:    callq _func4xi1
233 ; KNL-NEXT:    vpslld $31, %xmm0, %xmm0
234 ; KNL-NEXT:    vpsrad $31, %xmm0, %xmm0
235 ; KNL-NEXT:    popq %rax
236 ; KNL-NEXT:    retq
237 ;
238 ; SKX-LABEL: test7:
239 ; SKX:       ## BB#0:
240 ; SKX-NEXT:    pushq %rax
241 ; SKX-NEXT:  Ltmp2:
242 ; SKX-NEXT:    .cfi_def_cfa_offset 16
243 ; SKX-NEXT:    vpcmpgtd %xmm1, %xmm0, %k0
244 ; SKX-NEXT:    vpmovm2d %k0, %xmm0
245 ; SKX-NEXT:    callq _func4xi1
246 ; SKX-NEXT:    vpslld $31, %xmm0, %xmm0
247 ; SKX-NEXT:    vpsrad $31, %xmm0, %xmm0
248 ; SKX-NEXT:    popq %rax
249 ; SKX-NEXT:    retq
250 ;
251 ; KNL_X32-LABEL: test7:
252 ; KNL_X32:       ## BB#0:
253 ; KNL_X32-NEXT:    subl $12, %esp
254 ; KNL_X32-NEXT:  Ltmp2:
255 ; KNL_X32-NEXT:    .cfi_def_cfa_offset 16
256 ; KNL_X32-NEXT:    vpcmpgtd %xmm1, %xmm0, %xmm0
257 ; KNL_X32-NEXT:    calll L_func4xi1$stub
258 ; KNL_X32-NEXT:    vpslld $31, %xmm0, %xmm0
259 ; KNL_X32-NEXT:    vpsrad $31, %xmm0, %xmm0
260 ; KNL_X32-NEXT:    addl $12, %esp
261 ; KNL_X32-NEXT:    retl
262   %cmpRes = icmp sgt <4 x i32>%a, %b
263   %resi = call <4 x i1> @func4xi1(<4 x i1> %cmpRes)
264   %res = sext <4 x i1>%resi to <4 x i32>
265   ret <4 x i32> %res
266 }
267
268 define <8 x i1> @test7a(<8 x i32>%a, <8 x i32>%b) {
269 ; KNL-LABEL: test7a:
270 ; KNL:       ## BB#0:
271 ; KNL-NEXT:    pushq %rax
272 ; KNL-NEXT:  Ltmp3:
273 ; KNL-NEXT:    .cfi_def_cfa_offset 16
274 ; KNL-NEXT:    vpcmpgtd %ymm1, %ymm0, %ymm0
275 ; KNL-NEXT:    vpmovdw %zmm0, %ymm0
276 ; KNL-NEXT:    callq _func8xi1
277 ; KNL-NEXT:    vpmovsxwq %xmm0, %zmm0
278 ; KNL-NEXT:    vpsllq $63, %zmm0, %zmm0
279 ; KNL-NEXT:    movb $85, %al
280 ; KNL-NEXT:    movzbl %al, %eax
281 ; KNL-NEXT:    kmovw %eax, %k1
282 ; KNL-NEXT:    vptestmq %zmm0, %zmm0, %k1 {%k1}
283 ; KNL-NEXT:    vpbroadcastq {{.*}}(%rip), %zmm0 {%k1} {z}
284 ; KNL-NEXT:    vpmovqw %zmm0, %xmm0
285 ; KNL-NEXT:    popq %rax
286 ; KNL-NEXT:    retq
287 ;
288 ; SKX-LABEL: test7a:
289 ; SKX:       ## BB#0:
290 ; SKX-NEXT:    pushq %rax
291 ; SKX-NEXT:  Ltmp3:
292 ; SKX-NEXT:    .cfi_def_cfa_offset 16
293 ; SKX-NEXT:    vpcmpgtd %ymm1, %ymm0, %k0
294 ; SKX-NEXT:    vpmovm2w %k0, %xmm0
295 ; SKX-NEXT:    callq _func8xi1
296 ; SKX-NEXT:    vpsllw $15, %xmm0, %xmm0
297 ; SKX-NEXT:    vpmovw2m %xmm0, %k0
298 ; SKX-NEXT:    movb $85, %al
299 ; SKX-NEXT:    kmovb %eax, %k1
300 ; SKX-NEXT:    kandb %k1, %k0, %k0
301 ; SKX-NEXT:    vpmovm2w %k0, %xmm0
302 ; SKX-NEXT:    popq %rax
303 ; SKX-NEXT:    retq
304 ;
305 ; KNL_X32-LABEL: test7a:
306 ; KNL_X32:       ## BB#0:
307 ; KNL_X32-NEXT:    subl $12, %esp
308 ; KNL_X32-NEXT:  Ltmp3:
309 ; KNL_X32-NEXT:    .cfi_def_cfa_offset 16
310 ; KNL_X32-NEXT:    vpcmpgtd %ymm1, %ymm0, %ymm0
311 ; KNL_X32-NEXT:    vpmovdw %zmm0, %ymm0
312 ; KNL_X32-NEXT:    calll L_func8xi1$stub
313 ; KNL_X32-NEXT:    vpmovsxwq %xmm0, %zmm0
314 ; KNL_X32-NEXT:    vpsllvq LCPI7_0, %zmm0, %zmm0
315 ; KNL_X32-NEXT:    movb $85, %al
316 ; KNL_X32-NEXT:    movzbl %al, %eax
317 ; KNL_X32-NEXT:    kmovw %eax, %k1
318 ; KNL_X32-NEXT:    vptestmq %zmm0, %zmm0, %k1 {%k1}
319 ; KNL_X32-NEXT:    vpbroadcastd LCPI7_1, %zmm0
320 ; KNL_X32-NEXT:    vmovdqu64 %zmm0, %zmm0 {%k1} {z}
321 ; KNL_X32-NEXT:    vpmovqw %zmm0, %xmm0
322 ; KNL_X32-NEXT:    addl $12, %esp
323 ; KNL_X32-NEXT:    retl
324   %cmpRes = icmp sgt <8 x i32>%a, %b
325   %resi = call <8 x i1> @func8xi1(<8 x i1> %cmpRes)
326   %res = and <8 x i1>%resi,  <i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false>
327   ret <8 x i1> %res
328 }
329
330 define <16 x i8> @test8(<16 x i8> %a1, <16 x i8> %a2, i1 %cond) {
331 ; ALL_X64-LABEL: test8:
332 ; ALL_X64:       ## BB#0:
333 ; ALL_X64-NEXT:    testb $1, %dil
334 ; ALL_X64-NEXT:    jne LBB8_2
335 ; ALL_X64-NEXT:  ## BB#1:
336 ; ALL_X64-NEXT:    vmovaps %zmm1, %zmm0
337 ; ALL_X64-NEXT:  LBB8_2:
338 ; ALL_X64-NEXT:    retq
339 ;
340 ; KNL_X32-LABEL: test8:
341 ; KNL_X32:       ## BB#0:
342 ; KNL_X32-NEXT:    testb $1, {{[0-9]+}}(%esp)
343 ; KNL_X32-NEXT:    jne LBB8_2
344 ; KNL_X32-NEXT:  ## BB#1:
345 ; KNL_X32-NEXT:    vmovaps %zmm1, %zmm0
346 ; KNL_X32-NEXT:  LBB8_2:
347 ; KNL_X32-NEXT:    retl
348   %res = select i1 %cond, <16 x i8> %a1, <16 x i8> %a2
349   ret <16 x i8> %res
350 }
351
352 define i1 @test9(double %a, double %b) {
353 ; ALL_X64-LABEL: test9:
354 ; ALL_X64:       ## BB#0:
355 ; ALL_X64-NEXT:    vucomisd %xmm0, %xmm1
356 ; ALL_X64-NEXT:    setb %al
357 ; ALL_X64-NEXT:    retq
358 ;
359 ; KNL_X32-LABEL: test9:
360 ; KNL_X32:       ## BB#0:
361 ; KNL_X32-NEXT:    vmovsd {{[0-9]+}}(%esp), %xmm0
362 ; KNL_X32-NEXT:    vucomisd {{[0-9]+}}(%esp), %xmm0
363 ; KNL_X32-NEXT:    setb %al
364 ; KNL_X32-NEXT:    retl
365   %c = fcmp ugt double %a, %b
366   ret i1 %c
367 }
368
369 define i32 @test10(i32 %a, i32 %b, i1 %cond) {
370 ; ALL_X64-LABEL: test10:
371 ; ALL_X64:       ## BB#0:
372 ; ALL_X64-NEXT:    testb $1, %dl
373 ; ALL_X64-NEXT:    cmovel %esi, %edi
374 ; ALL_X64-NEXT:    movl %edi, %eax
375 ; ALL_X64-NEXT:    retq
376 ;
377 ; KNL_X32-LABEL: test10:
378 ; KNL_X32:       ## BB#0:
379 ; KNL_X32-NEXT:    testb $1, {{[0-9]+}}(%esp)
380 ; KNL_X32-NEXT:    leal {{[0-9]+}}(%esp), %eax
381 ; KNL_X32-NEXT:    leal {{[0-9]+}}(%esp), %ecx
382 ; KNL_X32-NEXT:    cmovnel %eax, %ecx
383 ; KNL_X32-NEXT:    movl (%ecx), %eax
384 ; KNL_X32-NEXT:    retl
385   %c = select i1 %cond, i32 %a, i32 %b
386   ret i32 %c
387 }
388
389 define i1 @test11(i32 %a, i32 %b) {
390 ; ALL_X64-LABEL: test11:
391 ; ALL_X64:       ## BB#0:
392 ; ALL_X64-NEXT:    cmpl %esi, %edi
393 ; ALL_X64-NEXT:    setg %al
394 ; ALL_X64-NEXT:    retq
395 ;
396 ; KNL_X32-LABEL: test11:
397 ; KNL_X32:       ## BB#0:
398 ; KNL_X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
399 ; KNL_X32-NEXT:    cmpl {{[0-9]+}}(%esp), %eax
400 ; KNL_X32-NEXT:    setg %al
401 ; KNL_X32-NEXT:    retl
402   %c = icmp sgt i32 %a, %b
403   ret i1 %c
404 }
405
406 define i32 @test12(i32 %a1, i32 %a2, i32 %b1) {
407 ; ALL_X64-LABEL: test12:
408 ; ALL_X64:       ## BB#0:
409 ; ALL_X64-NEXT:    pushq %rbp
410 ; ALL_X64-NEXT:  Ltmp4:
411 ; ALL_X64-NEXT:    .cfi_def_cfa_offset 16
412 ; ALL_X64-NEXT:    pushq %r14
413 ; ALL_X64-NEXT:  Ltmp5:
414 ; ALL_X64-NEXT:    .cfi_def_cfa_offset 24
415 ; ALL_X64-NEXT:    pushq %rbx
416 ; ALL_X64-NEXT:  Ltmp6:
417 ; ALL_X64-NEXT:    .cfi_def_cfa_offset 32
418 ; ALL_X64-NEXT:  Ltmp7:
419 ; ALL_X64-NEXT:    .cfi_offset %rbx, -32
420 ; ALL_X64-NEXT:  Ltmp8:
421 ; ALL_X64-NEXT:    .cfi_offset %r14, -24
422 ; ALL_X64-NEXT:  Ltmp9:
423 ; ALL_X64-NEXT:    .cfi_offset %rbp, -16
424 ; ALL_X64-NEXT:    movl %esi, %r14d
425 ; ALL_X64-NEXT:    movl %edi, %ebp
426 ; ALL_X64-NEXT:    movl %edx, %esi
427 ; ALL_X64-NEXT:    callq _test11
428 ; ALL_X64-NEXT:    movzbl %al, %ebx
429 ; ALL_X64-NEXT:    movl %ebp, %edi
430 ; ALL_X64-NEXT:    movl %r14d, %esi
431 ; ALL_X64-NEXT:    movl %ebx, %edx
432 ; ALL_X64-NEXT:    callq _test10
433 ; ALL_X64-NEXT:    xorl %ecx, %ecx
434 ; ALL_X64-NEXT:    testb $1, %bl
435 ; ALL_X64-NEXT:    cmovel %ecx, %eax
436 ; ALL_X64-NEXT:    popq %rbx
437 ; ALL_X64-NEXT:    popq %r14
438 ; ALL_X64-NEXT:    popq %rbp
439 ; ALL_X64-NEXT:    retq
440 ;
441 ; KNL_X32-LABEL: test12:
442 ; KNL_X32:       ## BB#0:
443 ; KNL_X32-NEXT:    pushl %ebx
444 ; KNL_X32-NEXT:  Ltmp4:
445 ; KNL_X32-NEXT:    .cfi_def_cfa_offset 8
446 ; KNL_X32-NEXT:    pushl %edi
447 ; KNL_X32-NEXT:  Ltmp5:
448 ; KNL_X32-NEXT:    .cfi_def_cfa_offset 12
449 ; KNL_X32-NEXT:    pushl %esi
450 ; KNL_X32-NEXT:  Ltmp6:
451 ; KNL_X32-NEXT:    .cfi_def_cfa_offset 16
452 ; KNL_X32-NEXT:    subl $16, %esp
453 ; KNL_X32-NEXT:  Ltmp7:
454 ; KNL_X32-NEXT:    .cfi_def_cfa_offset 32
455 ; KNL_X32-NEXT:  Ltmp8:
456 ; KNL_X32-NEXT:    .cfi_offset %esi, -16
457 ; KNL_X32-NEXT:  Ltmp9:
458 ; KNL_X32-NEXT:    .cfi_offset %edi, -12
459 ; KNL_X32-NEXT:  Ltmp10:
460 ; KNL_X32-NEXT:    .cfi_offset %ebx, -8
461 ; KNL_X32-NEXT:    movl {{[0-9]+}}(%esp), %esi
462 ; KNL_X32-NEXT:    movl {{[0-9]+}}(%esp), %edi
463 ; KNL_X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
464 ; KNL_X32-NEXT:    movl %eax, {{[0-9]+}}(%esp)
465 ; KNL_X32-NEXT:    movl %edi, (%esp)
466 ; KNL_X32-NEXT:    calll _test11
467 ; KNL_X32-NEXT:    movb %al, %bl
468 ; KNL_X32-NEXT:    movzbl %bl, %eax
469 ; KNL_X32-NEXT:    movl %eax, {{[0-9]+}}(%esp)
470 ; KNL_X32-NEXT:    movl %esi, {{[0-9]+}}(%esp)
471 ; KNL_X32-NEXT:    movl %edi, (%esp)
472 ; KNL_X32-NEXT:    calll _test10
473 ; KNL_X32-NEXT:    xorl %ecx, %ecx
474 ; KNL_X32-NEXT:    testb $1, %bl
475 ; KNL_X32-NEXT:    cmovel %ecx, %eax
476 ; KNL_X32-NEXT:    addl $16, %esp
477 ; KNL_X32-NEXT:    popl %esi
478 ; KNL_X32-NEXT:    popl %edi
479 ; KNL_X32-NEXT:    popl %ebx
480 ; KNL_X32-NEXT:    retl
481   %cond = call i1 @test11(i32 %a1, i32 %b1)
482   %res = call i32 @test10(i32 %a1, i32 %a2, i1 %cond)
483   %res1 = select i1 %cond, i32 %res, i32 0
484   ret i32 %res1
485 }