Make utils/update_llc_test_checks.py note that the assertions are
[oota-llvm.git] / test / CodeGen / X86 / vector-tzcnt-512.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 -mattr=+avx512cd | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512CD
3
4 define <8 x i64> @testv8i64(<8 x i64> %in) nounwind {
5 ; ALL-LABEL: testv8i64:
6 ; ALL:       ## BB#0:
7 ; ALL-NEXT:    vextracti32x4 $3, %zmm0, %xmm1
8 ; ALL-NEXT:    vpextrq $1, %xmm1, %rax
9 ; ALL-NEXT:    tzcntq %rax, %rax
10 ; ALL-NEXT:    vmovq %rax, %xmm2
11 ; ALL-NEXT:    vmovq %xmm1, %rax
12 ; ALL-NEXT:    tzcntq %rax, %rax
13 ; ALL-NEXT:    vmovq %rax, %xmm1
14 ; ALL-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
15 ; ALL-NEXT:    vextracti32x4 $2, %zmm0, %xmm2
16 ; ALL-NEXT:    vpextrq $1, %xmm2, %rax
17 ; ALL-NEXT:    tzcntq %rax, %rax
18 ; ALL-NEXT:    vmovq %rax, %xmm3
19 ; ALL-NEXT:    vmovq %xmm2, %rax
20 ; ALL-NEXT:    tzcntq %rax, %rax
21 ; ALL-NEXT:    vmovq %rax, %xmm2
22 ; ALL-NEXT:    vpunpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]
23 ; ALL-NEXT:    vinserti128 $1, %xmm1, %ymm2, %ymm1
24 ; ALL-NEXT:    vextracti32x4 $1, %zmm0, %xmm2
25 ; ALL-NEXT:    vpextrq $1, %xmm2, %rax
26 ; ALL-NEXT:    tzcntq %rax, %rax
27 ; ALL-NEXT:    vmovq %rax, %xmm3
28 ; ALL-NEXT:    vmovq %xmm2, %rax
29 ; ALL-NEXT:    tzcntq %rax, %rax
30 ; ALL-NEXT:    vmovq %rax, %xmm2
31 ; ALL-NEXT:    vpunpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]
32 ; ALL-NEXT:    vpextrq $1, %xmm0, %rax
33 ; ALL-NEXT:    tzcntq %rax, %rax
34 ; ALL-NEXT:    vmovq %rax, %xmm3
35 ; ALL-NEXT:    vmovq %xmm0, %rax
36 ; ALL-NEXT:    tzcntq %rax, %rax
37 ; ALL-NEXT:    vmovq %rax, %xmm0
38 ; ALL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm3[0]
39 ; ALL-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
40 ; ALL-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
41 ; ALL-NEXT:    retq
42   %out = call <8 x i64> @llvm.cttz.v8i64(<8 x i64> %in, i1 0)
43   ret <8 x i64> %out
44 }
45
46 define <8 x i64> @testv8i64u(<8 x i64> %in) nounwind {
47 ; ALL-LABEL: testv8i64u:
48 ; ALL:       ## BB#0:
49 ; ALL-NEXT:    vpxord %zmm1, %zmm1, %zmm1
50 ; ALL-NEXT:    vpsubq %zmm0, %zmm1, %zmm1
51 ; ALL-NEXT:    vpandq %zmm1, %zmm0, %zmm0
52 ; ALL-NEXT:    vplzcntq %zmm0, %zmm0
53 ; ALL-NEXT:    vpbroadcastq {{.*}}(%rip), %zmm1
54 ; ALL-NEXT:    vpsubq %zmm0, %zmm1, %zmm0
55 ; ALL-NEXT:    retq
56   %out = call <8 x i64> @llvm.cttz.v8i64(<8 x i64> %in, i1 -1)
57   ret <8 x i64> %out
58 }
59
60 define <16 x i32> @testv16i32(<16 x i32> %in) nounwind {
61 ; ALL-LABEL: testv16i32:
62 ; ALL:       ## BB#0:
63 ; ALL-NEXT:    vextracti32x4 $3, %zmm0, %xmm1
64 ; ALL-NEXT:    vpextrd $1, %xmm1, %eax
65 ; ALL-NEXT:    tzcntl %eax, %eax
66 ; ALL-NEXT:    vmovd %xmm1, %ecx
67 ; ALL-NEXT:    tzcntl %ecx, %ecx
68 ; ALL-NEXT:    vmovd %ecx, %xmm2
69 ; ALL-NEXT:    vpinsrd $1, %eax, %xmm2, %xmm2
70 ; ALL-NEXT:    vpextrd $2, %xmm1, %eax
71 ; ALL-NEXT:    tzcntl %eax, %eax
72 ; ALL-NEXT:    vpinsrd $2, %eax, %xmm2, %xmm2
73 ; ALL-NEXT:    vpextrd $3, %xmm1, %eax
74 ; ALL-NEXT:    tzcntl %eax, %eax
75 ; ALL-NEXT:    vpinsrd $3, %eax, %xmm2, %xmm1
76 ; ALL-NEXT:    vextracti32x4 $2, %zmm0, %xmm2
77 ; ALL-NEXT:    vpextrd $1, %xmm2, %eax
78 ; ALL-NEXT:    tzcntl %eax, %eax
79 ; ALL-NEXT:    vmovd %xmm2, %ecx
80 ; ALL-NEXT:    tzcntl %ecx, %ecx
81 ; ALL-NEXT:    vmovd %ecx, %xmm3
82 ; ALL-NEXT:    vpinsrd $1, %eax, %xmm3, %xmm3
83 ; ALL-NEXT:    vpextrd $2, %xmm2, %eax
84 ; ALL-NEXT:    tzcntl %eax, %eax
85 ; ALL-NEXT:    vpinsrd $2, %eax, %xmm3, %xmm3
86 ; ALL-NEXT:    vpextrd $3, %xmm2, %eax
87 ; ALL-NEXT:    tzcntl %eax, %eax
88 ; ALL-NEXT:    vpinsrd $3, %eax, %xmm3, %xmm2
89 ; ALL-NEXT:    vinserti128 $1, %xmm1, %ymm2, %ymm1
90 ; ALL-NEXT:    vextracti32x4 $1, %zmm0, %xmm2
91 ; ALL-NEXT:    vpextrd $1, %xmm2, %eax
92 ; ALL-NEXT:    tzcntl %eax, %eax
93 ; ALL-NEXT:    vmovd %xmm2, %ecx
94 ; ALL-NEXT:    tzcntl %ecx, %ecx
95 ; ALL-NEXT:    vmovd %ecx, %xmm3
96 ; ALL-NEXT:    vpinsrd $1, %eax, %xmm3, %xmm3
97 ; ALL-NEXT:    vpextrd $2, %xmm2, %eax
98 ; ALL-NEXT:    tzcntl %eax, %eax
99 ; ALL-NEXT:    vpinsrd $2, %eax, %xmm3, %xmm3
100 ; ALL-NEXT:    vpextrd $3, %xmm2, %eax
101 ; ALL-NEXT:    tzcntl %eax, %eax
102 ; ALL-NEXT:    vpinsrd $3, %eax, %xmm3, %xmm2
103 ; ALL-NEXT:    vpextrd $1, %xmm0, %eax
104 ; ALL-NEXT:    tzcntl %eax, %eax
105 ; ALL-NEXT:    vmovd %xmm0, %ecx
106 ; ALL-NEXT:    tzcntl %ecx, %ecx
107 ; ALL-NEXT:    vmovd %ecx, %xmm3
108 ; ALL-NEXT:    vpinsrd $1, %eax, %xmm3, %xmm3
109 ; ALL-NEXT:    vpextrd $2, %xmm0, %eax
110 ; ALL-NEXT:    tzcntl %eax, %eax
111 ; ALL-NEXT:    vpinsrd $2, %eax, %xmm3, %xmm3
112 ; ALL-NEXT:    vpextrd $3, %xmm0, %eax
113 ; ALL-NEXT:    tzcntl %eax, %eax
114 ; ALL-NEXT:    vpinsrd $3, %eax, %xmm3, %xmm0
115 ; ALL-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
116 ; ALL-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
117 ; ALL-NEXT:    retq
118   %out = call <16 x i32> @llvm.cttz.v16i32(<16 x i32> %in, i1 0)
119   ret <16 x i32> %out
120 }
121
122 define <16 x i32> @testv16i32u(<16 x i32> %in) nounwind {
123 ; ALL-LABEL: testv16i32u:
124 ; ALL:       ## BB#0:
125 ; ALL-NEXT:    vpxord %zmm1, %zmm1, %zmm1
126 ; ALL-NEXT:    vpsubd %zmm0, %zmm1, %zmm1
127 ; ALL-NEXT:    vpandd %zmm1, %zmm0, %zmm0
128 ; ALL-NEXT:    vplzcntd %zmm0, %zmm0
129 ; ALL-NEXT:    vpbroadcastd {{.*}}(%rip), %zmm1
130 ; ALL-NEXT:    vpsubd %zmm0, %zmm1, %zmm0
131 ; ALL-NEXT:    retq
132   %out = call <16 x i32> @llvm.cttz.v16i32(<16 x i32> %in, i1 -1)
133   ret <16 x i32> %out
134 }
135
136 define <32 x i16> @testv32i16(<32 x i16> %in) nounwind {
137 ; ALL-LABEL: testv32i16:
138 ; ALL:       ## BB#0:
139 ; ALL-NEXT:    vpxor %ymm2, %ymm2, %ymm2
140 ; ALL-NEXT:    vpsubw %ymm0, %ymm2, %ymm3
141 ; ALL-NEXT:    vpand %ymm3, %ymm0, %ymm0
142 ; ALL-NEXT:    vmovdqa {{.*#+}} ymm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
143 ; ALL-NEXT:    vpsubw %ymm3, %ymm0, %ymm0
144 ; ALL-NEXT:    vmovdqa {{.*#+}} ymm4 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
145 ; ALL-NEXT:    vpand %ymm4, %ymm0, %ymm5
146 ; ALL-NEXT:    vmovdqa {{.*#+}} ymm6 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
147 ; ALL-NEXT:    vpshufb %ymm5, %ymm6, %ymm5
148 ; ALL-NEXT:    vpsrlw $4, %ymm0, %ymm0
149 ; ALL-NEXT:    vpand %ymm4, %ymm0, %ymm0
150 ; ALL-NEXT:    vpshufb %ymm0, %ymm6, %ymm0
151 ; ALL-NEXT:    vpaddb %ymm5, %ymm0, %ymm0
152 ; ALL-NEXT:    vpsllw $8, %ymm0, %ymm5
153 ; ALL-NEXT:    vpaddb %ymm0, %ymm5, %ymm0
154 ; ALL-NEXT:    vpsrlw $8, %ymm0, %ymm0
155 ; ALL-NEXT:    vpsubw %ymm1, %ymm2, %ymm2
156 ; ALL-NEXT:    vpand %ymm2, %ymm1, %ymm1
157 ; ALL-NEXT:    vpsubw %ymm3, %ymm1, %ymm1
158 ; ALL-NEXT:    vpand %ymm4, %ymm1, %ymm2
159 ; ALL-NEXT:    vpshufb %ymm2, %ymm6, %ymm2
160 ; ALL-NEXT:    vpsrlw $4, %ymm1, %ymm1
161 ; ALL-NEXT:    vpand %ymm4, %ymm1, %ymm1
162 ; ALL-NEXT:    vpshufb %ymm1, %ymm6, %ymm1
163 ; ALL-NEXT:    vpaddb %ymm2, %ymm1, %ymm1
164 ; ALL-NEXT:    vpsllw $8, %ymm1, %ymm2
165 ; ALL-NEXT:    vpaddb %ymm1, %ymm2, %ymm1
166 ; ALL-NEXT:    vpsrlw $8, %ymm1, %ymm1
167 ; ALL-NEXT:    retq
168   %out = call <32 x i16> @llvm.cttz.v32i16(<32 x i16> %in, i1 0)
169   ret <32 x i16> %out
170 }
171
172 define <32 x i16> @testv32i16u(<32 x i16> %in) nounwind {
173 ; ALL-LABEL: testv32i16u:
174 ; ALL:       ## BB#0:
175 ; ALL-NEXT:    vpxor %ymm2, %ymm2, %ymm2
176 ; ALL-NEXT:    vpsubw %ymm0, %ymm2, %ymm3
177 ; ALL-NEXT:    vpand %ymm3, %ymm0, %ymm0
178 ; ALL-NEXT:    vmovdqa {{.*#+}} ymm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
179 ; ALL-NEXT:    vpsubw %ymm3, %ymm0, %ymm0
180 ; ALL-NEXT:    vmovdqa {{.*#+}} ymm4 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
181 ; ALL-NEXT:    vpand %ymm4, %ymm0, %ymm5
182 ; ALL-NEXT:    vmovdqa {{.*#+}} ymm6 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
183 ; ALL-NEXT:    vpshufb %ymm5, %ymm6, %ymm5
184 ; ALL-NEXT:    vpsrlw $4, %ymm0, %ymm0
185 ; ALL-NEXT:    vpand %ymm4, %ymm0, %ymm0
186 ; ALL-NEXT:    vpshufb %ymm0, %ymm6, %ymm0
187 ; ALL-NEXT:    vpaddb %ymm5, %ymm0, %ymm0
188 ; ALL-NEXT:    vpsllw $8, %ymm0, %ymm5
189 ; ALL-NEXT:    vpaddb %ymm0, %ymm5, %ymm0
190 ; ALL-NEXT:    vpsrlw $8, %ymm0, %ymm0
191 ; ALL-NEXT:    vpsubw %ymm1, %ymm2, %ymm2
192 ; ALL-NEXT:    vpand %ymm2, %ymm1, %ymm1
193 ; ALL-NEXT:    vpsubw %ymm3, %ymm1, %ymm1
194 ; ALL-NEXT:    vpand %ymm4, %ymm1, %ymm2
195 ; ALL-NEXT:    vpshufb %ymm2, %ymm6, %ymm2
196 ; ALL-NEXT:    vpsrlw $4, %ymm1, %ymm1
197 ; ALL-NEXT:    vpand %ymm4, %ymm1, %ymm1
198 ; ALL-NEXT:    vpshufb %ymm1, %ymm6, %ymm1
199 ; ALL-NEXT:    vpaddb %ymm2, %ymm1, %ymm1
200 ; ALL-NEXT:    vpsllw $8, %ymm1, %ymm2
201 ; ALL-NEXT:    vpaddb %ymm1, %ymm2, %ymm1
202 ; ALL-NEXT:    vpsrlw $8, %ymm1, %ymm1
203 ; ALL-NEXT:    retq
204   %out = call <32 x i16> @llvm.cttz.v32i16(<32 x i16> %in, i1 -1)
205   ret <32 x i16> %out
206 }
207
208 define <64 x i8> @testv64i8(<64 x i8> %in) nounwind {
209 ; ALL-LABEL: testv64i8:
210 ; ALL:       ## BB#0:
211 ; ALL-NEXT:    vpxor %ymm2, %ymm2, %ymm2
212 ; ALL-NEXT:    vpsubb %ymm0, %ymm2, %ymm3
213 ; ALL-NEXT:    vpand %ymm3, %ymm0, %ymm0
214 ; ALL-NEXT:    vmovdqa {{.*#+}} ymm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
215 ; ALL-NEXT:    vpsubb %ymm3, %ymm0, %ymm0
216 ; ALL-NEXT:    vmovdqa {{.*#+}} ymm4 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
217 ; ALL-NEXT:    vpand %ymm4, %ymm0, %ymm5
218 ; ALL-NEXT:    vmovdqa {{.*#+}} ymm6 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
219 ; ALL-NEXT:    vpshufb %ymm5, %ymm6, %ymm5
220 ; ALL-NEXT:    vpsrlw $4, %ymm0, %ymm0
221 ; ALL-NEXT:    vpand %ymm4, %ymm0, %ymm0
222 ; ALL-NEXT:    vpshufb %ymm0, %ymm6, %ymm0
223 ; ALL-NEXT:    vpaddb %ymm5, %ymm0, %ymm0
224 ; ALL-NEXT:    vpsubb %ymm1, %ymm2, %ymm2
225 ; ALL-NEXT:    vpand %ymm2, %ymm1, %ymm1
226 ; ALL-NEXT:    vpsubb %ymm3, %ymm1, %ymm1
227 ; ALL-NEXT:    vpand %ymm4, %ymm1, %ymm2
228 ; ALL-NEXT:    vpshufb %ymm2, %ymm6, %ymm2
229 ; ALL-NEXT:    vpsrlw $4, %ymm1, %ymm1
230 ; ALL-NEXT:    vpand %ymm4, %ymm1, %ymm1
231 ; ALL-NEXT:    vpshufb %ymm1, %ymm6, %ymm1
232 ; ALL-NEXT:    vpaddb %ymm2, %ymm1, %ymm1
233 ; ALL-NEXT:    retq
234   %out = call <64 x i8> @llvm.cttz.v64i8(<64 x i8> %in, i1 0)
235   ret <64 x i8> %out
236 }
237
238 define <64 x i8> @testv64i8u(<64 x i8> %in) nounwind {
239 ; ALL-LABEL: testv64i8u:
240 ; ALL:       ## BB#0:
241 ; ALL-NEXT:    vpxor %ymm2, %ymm2, %ymm2
242 ; ALL-NEXT:    vpsubb %ymm0, %ymm2, %ymm3
243 ; ALL-NEXT:    vpand %ymm3, %ymm0, %ymm0
244 ; ALL-NEXT:    vmovdqa {{.*#+}} ymm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
245 ; ALL-NEXT:    vpsubb %ymm3, %ymm0, %ymm0
246 ; ALL-NEXT:    vmovdqa {{.*#+}} ymm4 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
247 ; ALL-NEXT:    vpand %ymm4, %ymm0, %ymm5
248 ; ALL-NEXT:    vmovdqa {{.*#+}} ymm6 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
249 ; ALL-NEXT:    vpshufb %ymm5, %ymm6, %ymm5
250 ; ALL-NEXT:    vpsrlw $4, %ymm0, %ymm0
251 ; ALL-NEXT:    vpand %ymm4, %ymm0, %ymm0
252 ; ALL-NEXT:    vpshufb %ymm0, %ymm6, %ymm0
253 ; ALL-NEXT:    vpaddb %ymm5, %ymm0, %ymm0
254 ; ALL-NEXT:    vpsubb %ymm1, %ymm2, %ymm2
255 ; ALL-NEXT:    vpand %ymm2, %ymm1, %ymm1
256 ; ALL-NEXT:    vpsubb %ymm3, %ymm1, %ymm1
257 ; ALL-NEXT:    vpand %ymm4, %ymm1, %ymm2
258 ; ALL-NEXT:    vpshufb %ymm2, %ymm6, %ymm2
259 ; ALL-NEXT:    vpsrlw $4, %ymm1, %ymm1
260 ; ALL-NEXT:    vpand %ymm4, %ymm1, %ymm1
261 ; ALL-NEXT:    vpshufb %ymm1, %ymm6, %ymm1
262 ; ALL-NEXT:    vpaddb %ymm2, %ymm1, %ymm1
263 ; ALL-NEXT:    retq
264   %out = call <64 x i8> @llvm.cttz.v64i8(<64 x i8> %in, i1 -1)
265   ret <64 x i8> %out
266 }
267
268 declare <8 x i64> @llvm.cttz.v8i64(<8 x i64>, i1)
269 declare <16 x i32> @llvm.cttz.v16i32(<16 x i32>, i1)
270 declare <32 x i16> @llvm.cttz.v32i16(<32 x i16>, i1)
271 declare <64 x i8> @llvm.cttz.v64i8(<64 x i8>, i1)