edb6bef1a4ac0541d6577ee09c4cee23aeffd1ee
[oota-llvm.git] / test / CodeGen / X86 / avx512-calling-conv.ll
1 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=knl | FileCheck %s --check-prefix=KNL
2 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=skx | FileCheck %s --check-prefix=SKX
3 ; RUN: llc < %s -mtriple=i686-apple-darwin -mcpu=knl | FileCheck %s --check-prefix=KNL_X32
4
5 ; KNL-LABEL: test1
6 ; KNL: vxorps
7 define <16 x i1> @test1() {
8   ret <16 x i1> zeroinitializer
9 }
10
11 ; SKX-LABEL: test2
12 ; SKX: vpmovb2m
13 ; SKX: vpmovb2m
14 ; SKX: kandw
15 ; SKX: vpmovm2b
16 ; KNL-LABEL: test2
17 ; KNL: vpmovsxbd
18 ; KNL: vpmovsxbd
19 ; KNL: vpandd
20 ; KNL: vpmovdb
21 define <16 x i1> @test2(<16 x i1>%a, <16 x i1>%b) {
22   %c = and <16 x i1>%a, %b
23   ret <16 x i1> %c
24 }
25
26 ; SKX-LABEL: test3
27 ; SKX: vpmovw2m
28 ; SKX: vpmovw2m
29 ; SKX: kandb
30 ; SKX: vpmovm2w
31 define <8 x i1> @test3(<8 x i1>%a, <8 x i1>%b) {
32   %c = and <8 x i1>%a, %b
33   ret <8 x i1> %c
34 }
35
36 ; SKX-LABEL: test4
37 ; SKX: vpmovd2m
38 ; SKX: vpmovd2m
39 ; SKX: kandw
40 ; SKX: vpmovm2d
41 define <4 x i1> @test4(<4 x i1>%a, <4 x i1>%b) {
42   %c = and <4 x i1>%a, %b
43   ret <4 x i1> %c
44 }
45
46 ; SKX-LABEL: test5
47 ; SKX: vpcmpgtd
48 ; SKX: vpmovm2w
49 ; SKX: call
50 ; SKX: vpmovzxwd
51 declare <8 x i1> @func8xi1(<8 x i1> %a)
52 define <8 x i32> @test5(<8 x i32>%a, <8 x i32>%b) {
53   %cmpRes = icmp sgt <8 x i32>%a, %b
54   %resi = call <8 x i1> @func8xi1(<8 x i1> %cmpRes)
55   %res = sext <8 x i1>%resi to <8 x i32>
56   ret <8 x i32> %res
57 }
58
59 declare <16 x i1> @func16xi1(<16 x i1> %a)
60
61 ; KNL-LABEL: test6
62 ; KNL: vpbroadcastd
63 ; KNL: vpmovdb
64 ; KNL: call
65 ; KNL: vpmovzxbd
66 ; KNL: vpslld  $31, %zmm
67 ; KNL: vpsrad  $31, %zmm
68 define <16 x i32> @test6(<16 x i32>%a, <16 x i32>%b) {
69   %cmpRes = icmp sgt <16 x i32>%a, %b
70   %resi = call <16 x i1> @func16xi1(<16 x i1> %cmpRes)
71   %res = sext <16 x i1>%resi to <16 x i32>
72   ret <16 x i32> %res
73 }
74
75 declare <4 x i1> @func4xi1(<4 x i1> %a)
76 ; SKX-LABEL: test7
77 ; SKX: vpmovm2d
78 ; SKX: call
79 ; SKX: vpslld  $31, %xmm
80 ; SKX: vpsrad  $31, %xmm
81
82 define <4 x i32> @test7(<4 x i32>%a, <4 x i32>%b) {
83   %cmpRes = icmp sgt <4 x i32>%a, %b
84   %resi = call <4 x i1> @func4xi1(<4 x i1> %cmpRes)
85   %res = sext <4 x i1>%resi to <4 x i32>
86   ret <4 x i32> %res
87 }
88
89 ; SKX-LABEL: test7a
90 ; SKX: call
91 ; SKX: vpmovw2m  %xmm0, %k0
92 ; SKX: kandb
93 define <8 x i1> @test7a(<8 x i32>%a, <8 x i32>%b) {
94   %cmpRes = icmp sgt <8 x i32>%a, %b
95   %resi = call <8 x i1> @func8xi1(<8 x i1> %cmpRes)
96   %res = and <8 x i1>%resi,  <i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false>
97   ret <8 x i1> %res
98 }
99
100
101 ; KNL_X32-LABEL: test8
102 ; KNL_X32: testb $1, 4(%esp)
103 ; KNL_X32:jne
104
105 ; KNL-LABEL: test8
106 ; KNL: testb   $1, %dil
107 ; KNL:jne
108
109 define <16 x i8> @test8(<16 x i8> %a1, <16 x i8> %a2, i1 %cond) {
110   %res = select i1 %cond, <16 x i8> %a1, <16 x i8> %a2
111   ret <16 x i8> %res
112 }
113
114 ; KNL-LABEL: test9
115 ; KNL: vucomisd
116 ; KNL: setb
117 define i1 @test9(double %a, double %b) {
118   %c = fcmp ugt double %a, %b
119   ret i1 %c
120 }
121
122 ; KNL_X32-LABEL: test10
123 ; KNL_X32: testb $1, 12(%esp)
124 ; KNL_X32: cmovnel
125
126 ; KNL-LABEL: test10
127 ; KNL: testb   $1, %dl
128 ; KNL: cmovel
129 define i32 @test10(i32 %a, i32 %b, i1 %cond) {
130   %c = select i1 %cond, i32 %a, i32 %b
131   ret i32 %c
132 }
133
134 ; KNL-LABEL: test11
135 ; KNL: cmp
136 ; KNL: setg
137 define i1 @test11(i32 %a, i32 %b) {
138   %c = icmp sgt i32 %a, %b
139   ret i1 %c
140 }
141
142 ; KNL-LABEL: test12
143 ; KNL: callq _test11
144 ;; return value in %al
145 ; KNL: movzbl   %al, %ebx
146 ; KNL: callq _test10
147 ; KNL: testb   $1, %bl
148
149 define i32 @test12(i32 %a1, i32 %a2, i32 %b1) {
150   %cond = call i1 @test11(i32 %a1, i32 %b1)
151   %res = call i32 @test10(i32 %a1, i32 %a2, i1 %cond)
152   %res1 = select i1 %cond, i32 %res, i32 0
153   ret i32 %res1
154 }