[X86] Updated vector tzcnt tests. Added vec512 tests.
[oota-llvm.git] / test / CodeGen / X86 / vector-tzcnt-512.ll
1 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=knl -mattr=+avx512cd | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512CD
2
3 define <8 x i64> @testv8i64(<8 x i64> %in) nounwind {
4 ; ALL-LABEL: testv8i64:
5 ; ALL:       ## BB#0:
6 ; ALL-NEXT:    vextracti32x4 $3, %zmm0, %xmm1
7 ; ALL-NEXT:    vpextrq $1, %xmm1, %rax
8 ; ALL-NEXT:    tzcntq %rax, %rax
9 ; ALL-NEXT:    vmovq %rax, %xmm2
10 ; ALL-NEXT:    vmovq %xmm1, %rax
11 ; ALL-NEXT:    tzcntq %rax, %rax
12 ; ALL-NEXT:    vmovq %rax, %xmm1
13 ; ALL-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
14 ; ALL-NEXT:    vextracti32x4 $2, %zmm0, %xmm2
15 ; ALL-NEXT:    vpextrq $1, %xmm2, %rax
16 ; ALL-NEXT:    tzcntq %rax, %rax
17 ; ALL-NEXT:    vmovq %rax, %xmm3
18 ; ALL-NEXT:    vmovq %xmm2, %rax
19 ; ALL-NEXT:    tzcntq %rax, %rax
20 ; ALL-NEXT:    vmovq %rax, %xmm2
21 ; ALL-NEXT:    vpunpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]
22 ; ALL-NEXT:    vinserti128 $1, %xmm1, %ymm2, %ymm1
23 ; ALL-NEXT:    vextracti32x4 $1, %zmm0, %xmm2
24 ; ALL-NEXT:    vpextrq $1, %xmm2, %rax
25 ; ALL-NEXT:    tzcntq %rax, %rax
26 ; ALL-NEXT:    vmovq %rax, %xmm3
27 ; ALL-NEXT:    vmovq %xmm2, %rax
28 ; ALL-NEXT:    tzcntq %rax, %rax
29 ; ALL-NEXT:    vmovq %rax, %xmm2
30 ; ALL-NEXT:    vpunpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]
31 ; ALL-NEXT:    vpextrq $1, %xmm0, %rax
32 ; ALL-NEXT:    tzcntq %rax, %rax
33 ; ALL-NEXT:    vmovq %rax, %xmm3
34 ; ALL-NEXT:    vmovq %xmm0, %rax
35 ; ALL-NEXT:    tzcntq %rax, %rax
36 ; ALL-NEXT:    vmovq %rax, %xmm0
37 ; ALL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm3[0]
38 ; ALL-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
39 ; ALL-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
40 ; ALL-NEXT:    retq
41   %out = call <8 x i64> @llvm.cttz.v8i64(<8 x i64> %in, i1 0)
42   ret <8 x i64> %out
43 }
44
45 define <8 x i64> @testv8i64u(<8 x i64> %in) nounwind {
46 ; ALL-LABEL: testv8i64u:
47 ; ALL:       ## BB#0:
48 ; ALL-NEXT:    vextracti32x4 $3, %zmm0, %xmm1
49 ; ALL-NEXT:    vpextrq $1, %xmm1, %rax
50 ; ALL-NEXT:    tzcntq %rax, %rax
51 ; ALL-NEXT:    vmovq %rax, %xmm2
52 ; ALL-NEXT:    vmovq %xmm1, %rax
53 ; ALL-NEXT:    tzcntq %rax, %rax
54 ; ALL-NEXT:    vmovq %rax, %xmm1
55 ; ALL-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
56 ; ALL-NEXT:    vextracti32x4 $2, %zmm0, %xmm2
57 ; ALL-NEXT:    vpextrq $1, %xmm2, %rax
58 ; ALL-NEXT:    tzcntq %rax, %rax
59 ; ALL-NEXT:    vmovq %rax, %xmm3
60 ; ALL-NEXT:    vmovq %xmm2, %rax
61 ; ALL-NEXT:    tzcntq %rax, %rax
62 ; ALL-NEXT:    vmovq %rax, %xmm2
63 ; ALL-NEXT:    vpunpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]
64 ; ALL-NEXT:    vinserti128 $1, %xmm1, %ymm2, %ymm1
65 ; ALL-NEXT:    vextracti32x4 $1, %zmm0, %xmm2
66 ; ALL-NEXT:    vpextrq $1, %xmm2, %rax
67 ; ALL-NEXT:    tzcntq %rax, %rax
68 ; ALL-NEXT:    vmovq %rax, %xmm3
69 ; ALL-NEXT:    vmovq %xmm2, %rax
70 ; ALL-NEXT:    tzcntq %rax, %rax
71 ; ALL-NEXT:    vmovq %rax, %xmm2
72 ; ALL-NEXT:    vpunpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]
73 ; ALL-NEXT:    vpextrq $1, %xmm0, %rax
74 ; ALL-NEXT:    tzcntq %rax, %rax
75 ; ALL-NEXT:    vmovq %rax, %xmm3
76 ; ALL-NEXT:    vmovq %xmm0, %rax
77 ; ALL-NEXT:    tzcntq %rax, %rax
78 ; ALL-NEXT:    vmovq %rax, %xmm0
79 ; ALL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm3[0]
80 ; ALL-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
81 ; ALL-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
82 ; ALL-NEXT:    retq
83   %out = call <8 x i64> @llvm.cttz.v8i64(<8 x i64> %in, i1 -1)
84   ret <8 x i64> %out
85 }
86
87 define <16 x i32> @testv16i32(<16 x i32> %in) nounwind {
88 ; ALL-LABEL: testv16i32:
89 ; ALL:       ## BB#0:
90 ; ALL-NEXT:    vextracti32x4 $3, %zmm0, %xmm1
91 ; ALL-NEXT:    vpextrd $1, %xmm1, %eax
92 ; ALL-NEXT:    tzcntl %eax, %eax
93 ; ALL-NEXT:    vmovd %xmm1, %ecx
94 ; ALL-NEXT:    tzcntl %ecx, %ecx
95 ; ALL-NEXT:    vmovd %ecx, %xmm2
96 ; ALL-NEXT:    vpinsrd $1, %eax, %xmm2, %xmm2
97 ; ALL-NEXT:    vpextrd $2, %xmm1, %eax
98 ; ALL-NEXT:    tzcntl %eax, %eax
99 ; ALL-NEXT:    vpinsrd $2, %eax, %xmm2, %xmm2
100 ; ALL-NEXT:    vpextrd $3, %xmm1, %eax
101 ; ALL-NEXT:    tzcntl %eax, %eax
102 ; ALL-NEXT:    vpinsrd $3, %eax, %xmm2, %xmm1
103 ; ALL-NEXT:    vextracti32x4 $2, %zmm0, %xmm2
104 ; ALL-NEXT:    vpextrd $1, %xmm2, %eax
105 ; ALL-NEXT:    tzcntl %eax, %eax
106 ; ALL-NEXT:    vmovd %xmm2, %ecx
107 ; ALL-NEXT:    tzcntl %ecx, %ecx
108 ; ALL-NEXT:    vmovd %ecx, %xmm3
109 ; ALL-NEXT:    vpinsrd $1, %eax, %xmm3, %xmm3
110 ; ALL-NEXT:    vpextrd $2, %xmm2, %eax
111 ; ALL-NEXT:    tzcntl %eax, %eax
112 ; ALL-NEXT:    vpinsrd $2, %eax, %xmm3, %xmm3
113 ; ALL-NEXT:    vpextrd $3, %xmm2, %eax
114 ; ALL-NEXT:    tzcntl %eax, %eax
115 ; ALL-NEXT:    vpinsrd $3, %eax, %xmm3, %xmm2
116 ; ALL-NEXT:    vinserti128 $1, %xmm1, %ymm2, %ymm1
117 ; ALL-NEXT:    vextracti32x4 $1, %zmm0, %xmm2
118 ; ALL-NEXT:    vpextrd $1, %xmm2, %eax
119 ; ALL-NEXT:    tzcntl %eax, %eax
120 ; ALL-NEXT:    vmovd %xmm2, %ecx
121 ; ALL-NEXT:    tzcntl %ecx, %ecx
122 ; ALL-NEXT:    vmovd %ecx, %xmm3
123 ; ALL-NEXT:    vpinsrd $1, %eax, %xmm3, %xmm3
124 ; ALL-NEXT:    vpextrd $2, %xmm2, %eax
125 ; ALL-NEXT:    tzcntl %eax, %eax
126 ; ALL-NEXT:    vpinsrd $2, %eax, %xmm3, %xmm3
127 ; ALL-NEXT:    vpextrd $3, %xmm2, %eax
128 ; ALL-NEXT:    tzcntl %eax, %eax
129 ; ALL-NEXT:    vpinsrd $3, %eax, %xmm3, %xmm2
130 ; ALL-NEXT:    vpextrd $1, %xmm0, %eax
131 ; ALL-NEXT:    tzcntl %eax, %eax
132 ; ALL-NEXT:    vmovd %xmm0, %ecx
133 ; ALL-NEXT:    tzcntl %ecx, %ecx
134 ; ALL-NEXT:    vmovd %ecx, %xmm3
135 ; ALL-NEXT:    vpinsrd $1, %eax, %xmm3, %xmm3
136 ; ALL-NEXT:    vpextrd $2, %xmm0, %eax
137 ; ALL-NEXT:    tzcntl %eax, %eax
138 ; ALL-NEXT:    vpinsrd $2, %eax, %xmm3, %xmm3
139 ; ALL-NEXT:    vpextrd $3, %xmm0, %eax
140 ; ALL-NEXT:    tzcntl %eax, %eax
141 ; ALL-NEXT:    vpinsrd $3, %eax, %xmm3, %xmm0
142 ; ALL-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
143 ; ALL-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
144 ; ALL-NEXT:    retq
145   %out = call <16 x i32> @llvm.cttz.v16i32(<16 x i32> %in, i1 0)
146   ret <16 x i32> %out
147 }
148
149 define <16 x i32> @testv16i32u(<16 x i32> %in) nounwind {
150 ; ALL-LABEL: testv16i32u:
151 ; ALL:       ## BB#0:
152 ; ALL-NEXT:    vextracti32x4 $3, %zmm0, %xmm1
153 ; ALL-NEXT:    vpextrd $1, %xmm1, %eax
154 ; ALL-NEXT:    tzcntl %eax, %eax
155 ; ALL-NEXT:    vmovd %xmm1, %ecx
156 ; ALL-NEXT:    tzcntl %ecx, %ecx
157 ; ALL-NEXT:    vmovd %ecx, %xmm2
158 ; ALL-NEXT:    vpinsrd $1, %eax, %xmm2, %xmm2
159 ; ALL-NEXT:    vpextrd $2, %xmm1, %eax
160 ; ALL-NEXT:    tzcntl %eax, %eax
161 ; ALL-NEXT:    vpinsrd $2, %eax, %xmm2, %xmm2
162 ; ALL-NEXT:    vpextrd $3, %xmm1, %eax
163 ; ALL-NEXT:    tzcntl %eax, %eax
164 ; ALL-NEXT:    vpinsrd $3, %eax, %xmm2, %xmm1
165 ; ALL-NEXT:    vextracti32x4 $2, %zmm0, %xmm2
166 ; ALL-NEXT:    vpextrd $1, %xmm2, %eax
167 ; ALL-NEXT:    tzcntl %eax, %eax
168 ; ALL-NEXT:    vmovd %xmm2, %ecx
169 ; ALL-NEXT:    tzcntl %ecx, %ecx
170 ; ALL-NEXT:    vmovd %ecx, %xmm3
171 ; ALL-NEXT:    vpinsrd $1, %eax, %xmm3, %xmm3
172 ; ALL-NEXT:    vpextrd $2, %xmm2, %eax
173 ; ALL-NEXT:    tzcntl %eax, %eax
174 ; ALL-NEXT:    vpinsrd $2, %eax, %xmm3, %xmm3
175 ; ALL-NEXT:    vpextrd $3, %xmm2, %eax
176 ; ALL-NEXT:    tzcntl %eax, %eax
177 ; ALL-NEXT:    vpinsrd $3, %eax, %xmm3, %xmm2
178 ; ALL-NEXT:    vinserti128 $1, %xmm1, %ymm2, %ymm1
179 ; ALL-NEXT:    vextracti32x4 $1, %zmm0, %xmm2
180 ; ALL-NEXT:    vpextrd $1, %xmm2, %eax
181 ; ALL-NEXT:    tzcntl %eax, %eax
182 ; ALL-NEXT:    vmovd %xmm2, %ecx
183 ; ALL-NEXT:    tzcntl %ecx, %ecx
184 ; ALL-NEXT:    vmovd %ecx, %xmm3
185 ; ALL-NEXT:    vpinsrd $1, %eax, %xmm3, %xmm3
186 ; ALL-NEXT:    vpextrd $2, %xmm2, %eax
187 ; ALL-NEXT:    tzcntl %eax, %eax
188 ; ALL-NEXT:    vpinsrd $2, %eax, %xmm3, %xmm3
189 ; ALL-NEXT:    vpextrd $3, %xmm2, %eax
190 ; ALL-NEXT:    tzcntl %eax, %eax
191 ; ALL-NEXT:    vpinsrd $3, %eax, %xmm3, %xmm2
192 ; ALL-NEXT:    vpextrd $1, %xmm0, %eax
193 ; ALL-NEXT:    tzcntl %eax, %eax
194 ; ALL-NEXT:    vmovd %xmm0, %ecx
195 ; ALL-NEXT:    tzcntl %ecx, %ecx
196 ; ALL-NEXT:    vmovd %ecx, %xmm3
197 ; ALL-NEXT:    vpinsrd $1, %eax, %xmm3, %xmm3
198 ; ALL-NEXT:    vpextrd $2, %xmm0, %eax
199 ; ALL-NEXT:    tzcntl %eax, %eax
200 ; ALL-NEXT:    vpinsrd $2, %eax, %xmm3, %xmm3
201 ; ALL-NEXT:    vpextrd $3, %xmm0, %eax
202 ; ALL-NEXT:    tzcntl %eax, %eax
203 ; ALL-NEXT:    vpinsrd $3, %eax, %xmm3, %xmm0
204 ; ALL-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
205 ; ALL-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
206 ; ALL-NEXT:    retq
207   %out = call <16 x i32> @llvm.cttz.v16i32(<16 x i32> %in, i1 -1)
208   ret <16 x i32> %out
209 }
210
211 define <32 x i16> @testv32i16(<32 x i16> %in) nounwind {
212 ; ALL-LABEL: testv32i16:
213 ; ALL:       ## BB#0:
214 ; ALL-NEXT:    vextracti128 $1, %ymm0, %xmm2
215 ; ALL-NEXT:    vpextrw $1, %xmm2, %eax
216 ; ALL-NEXT:    tzcntw %ax, %ax
217 ; ALL-NEXT:    vmovd %xmm2, %ecx
218 ; ALL-NEXT:    tzcntw %cx, %cx
219 ; ALL-NEXT:    vmovd %ecx, %xmm3
220 ; ALL-NEXT:    vpinsrw $1, %eax, %xmm3, %xmm3
221 ; ALL-NEXT:    vpextrw $2, %xmm2, %eax
222 ; ALL-NEXT:    tzcntw %ax, %ax
223 ; ALL-NEXT:    vpinsrw $2, %eax, %xmm3, %xmm3
224 ; ALL-NEXT:    vpextrw $3, %xmm2, %eax
225 ; ALL-NEXT:    tzcntw %ax, %ax
226 ; ALL-NEXT:    vpinsrw $3, %eax, %xmm3, %xmm3
227 ; ALL-NEXT:    vpextrw $4, %xmm2, %eax
228 ; ALL-NEXT:    tzcntw %ax, %ax
229 ; ALL-NEXT:    vpinsrw $4, %eax, %xmm3, %xmm3
230 ; ALL-NEXT:    vpextrw $5, %xmm2, %eax
231 ; ALL-NEXT:    tzcntw %ax, %ax
232 ; ALL-NEXT:    vpinsrw $5, %eax, %xmm3, %xmm3
233 ; ALL-NEXT:    vpextrw $6, %xmm2, %eax
234 ; ALL-NEXT:    tzcntw %ax, %ax
235 ; ALL-NEXT:    vpinsrw $6, %eax, %xmm3, %xmm3
236 ; ALL-NEXT:    vpextrw $7, %xmm2, %eax
237 ; ALL-NEXT:    tzcntw %ax, %ax
238 ; ALL-NEXT:    vpinsrw $7, %eax, %xmm3, %xmm2
239 ; ALL-NEXT:    vpextrw $1, %xmm0, %eax
240 ; ALL-NEXT:    tzcntw %ax, %ax
241 ; ALL-NEXT:    vmovd %xmm0, %ecx
242 ; ALL-NEXT:    tzcntw %cx, %cx
243 ; ALL-NEXT:    vmovd %ecx, %xmm3
244 ; ALL-NEXT:    vpinsrw $1, %eax, %xmm3, %xmm3
245 ; ALL-NEXT:    vpextrw $2, %xmm0, %eax
246 ; ALL-NEXT:    tzcntw %ax, %ax
247 ; ALL-NEXT:    vpinsrw $2, %eax, %xmm3, %xmm3
248 ; ALL-NEXT:    vpextrw $3, %xmm0, %eax
249 ; ALL-NEXT:    tzcntw %ax, %ax
250 ; ALL-NEXT:    vpinsrw $3, %eax, %xmm3, %xmm3
251 ; ALL-NEXT:    vpextrw $4, %xmm0, %eax
252 ; ALL-NEXT:    tzcntw %ax, %ax
253 ; ALL-NEXT:    vpinsrw $4, %eax, %xmm3, %xmm3
254 ; ALL-NEXT:    vpextrw $5, %xmm0, %eax
255 ; ALL-NEXT:    tzcntw %ax, %ax
256 ; ALL-NEXT:    vpinsrw $5, %eax, %xmm3, %xmm3
257 ; ALL-NEXT:    vpextrw $6, %xmm0, %eax
258 ; ALL-NEXT:    tzcntw %ax, %ax
259 ; ALL-NEXT:    vpinsrw $6, %eax, %xmm3, %xmm3
260 ; ALL-NEXT:    vpextrw $7, %xmm0, %eax
261 ; ALL-NEXT:    tzcntw %ax, %ax
262 ; ALL-NEXT:    vpinsrw $7, %eax, %xmm3, %xmm0
263 ; ALL-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
264 ; ALL-NEXT:    vextracti128 $1, %ymm1, %xmm2
265 ; ALL-NEXT:    vpextrw $1, %xmm2, %eax
266 ; ALL-NEXT:    tzcntw %ax, %ax
267 ; ALL-NEXT:    vmovd %xmm2, %ecx
268 ; ALL-NEXT:    tzcntw %cx, %cx
269 ; ALL-NEXT:    vmovd %ecx, %xmm3
270 ; ALL-NEXT:    vpinsrw $1, %eax, %xmm3, %xmm3
271 ; ALL-NEXT:    vpextrw $2, %xmm2, %eax
272 ; ALL-NEXT:    tzcntw %ax, %ax
273 ; ALL-NEXT:    vpinsrw $2, %eax, %xmm3, %xmm3
274 ; ALL-NEXT:    vpextrw $3, %xmm2, %eax
275 ; ALL-NEXT:    tzcntw %ax, %ax
276 ; ALL-NEXT:    vpinsrw $3, %eax, %xmm3, %xmm3
277 ; ALL-NEXT:    vpextrw $4, %xmm2, %eax
278 ; ALL-NEXT:    tzcntw %ax, %ax
279 ; ALL-NEXT:    vpinsrw $4, %eax, %xmm3, %xmm3
280 ; ALL-NEXT:    vpextrw $5, %xmm2, %eax
281 ; ALL-NEXT:    tzcntw %ax, %ax
282 ; ALL-NEXT:    vpinsrw $5, %eax, %xmm3, %xmm3
283 ; ALL-NEXT:    vpextrw $6, %xmm2, %eax
284 ; ALL-NEXT:    tzcntw %ax, %ax
285 ; ALL-NEXT:    vpinsrw $6, %eax, %xmm3, %xmm3
286 ; ALL-NEXT:    vpextrw $7, %xmm2, %eax
287 ; ALL-NEXT:    tzcntw %ax, %ax
288 ; ALL-NEXT:    vpinsrw $7, %eax, %xmm3, %xmm2
289 ; ALL-NEXT:    vpextrw $1, %xmm1, %eax
290 ; ALL-NEXT:    tzcntw %ax, %ax
291 ; ALL-NEXT:    vmovd %xmm1, %ecx
292 ; ALL-NEXT:    tzcntw %cx, %cx
293 ; ALL-NEXT:    vmovd %ecx, %xmm3
294 ; ALL-NEXT:    vpinsrw $1, %eax, %xmm3, %xmm3
295 ; ALL-NEXT:    vpextrw $2, %xmm1, %eax
296 ; ALL-NEXT:    tzcntw %ax, %ax
297 ; ALL-NEXT:    vpinsrw $2, %eax, %xmm3, %xmm3
298 ; ALL-NEXT:    vpextrw $3, %xmm1, %eax
299 ; ALL-NEXT:    tzcntw %ax, %ax
300 ; ALL-NEXT:    vpinsrw $3, %eax, %xmm3, %xmm3
301 ; ALL-NEXT:    vpextrw $4, %xmm1, %eax
302 ; ALL-NEXT:    tzcntw %ax, %ax
303 ; ALL-NEXT:    vpinsrw $4, %eax, %xmm3, %xmm3
304 ; ALL-NEXT:    vpextrw $5, %xmm1, %eax
305 ; ALL-NEXT:    tzcntw %ax, %ax
306 ; ALL-NEXT:    vpinsrw $5, %eax, %xmm3, %xmm3
307 ; ALL-NEXT:    vpextrw $6, %xmm1, %eax
308 ; ALL-NEXT:    tzcntw %ax, %ax
309 ; ALL-NEXT:    vpinsrw $6, %eax, %xmm3, %xmm3
310 ; ALL-NEXT:    vpextrw $7, %xmm1, %eax
311 ; ALL-NEXT:    tzcntw %ax, %ax
312 ; ALL-NEXT:    vpinsrw $7, %eax, %xmm3, %xmm1
313 ; ALL-NEXT:    vinserti128 $1, %xmm2, %ymm1, %ymm1
314 ; ALL-NEXT:    retq
315   %out = call <32 x i16> @llvm.cttz.v32i16(<32 x i16> %in, i1 0)
316   ret <32 x i16> %out
317 }
318
319 define <32 x i16> @testv32i16u(<32 x i16> %in) nounwind {
320 ; ALL-LABEL: testv32i16u:
321 ; ALL:       ## BB#0:
322 ; ALL-NEXT:    vextracti128 $1, %ymm0, %xmm2
323 ; ALL-NEXT:    vpextrw $1, %xmm2, %eax
324 ; ALL-NEXT:    tzcntw %ax, %ax
325 ; ALL-NEXT:    vmovd %xmm2, %ecx
326 ; ALL-NEXT:    tzcntw %cx, %cx
327 ; ALL-NEXT:    vmovd %ecx, %xmm3
328 ; ALL-NEXT:    vpinsrw $1, %eax, %xmm3, %xmm3
329 ; ALL-NEXT:    vpextrw $2, %xmm2, %eax
330 ; ALL-NEXT:    tzcntw %ax, %ax
331 ; ALL-NEXT:    vpinsrw $2, %eax, %xmm3, %xmm3
332 ; ALL-NEXT:    vpextrw $3, %xmm2, %eax
333 ; ALL-NEXT:    tzcntw %ax, %ax
334 ; ALL-NEXT:    vpinsrw $3, %eax, %xmm3, %xmm3
335 ; ALL-NEXT:    vpextrw $4, %xmm2, %eax
336 ; ALL-NEXT:    tzcntw %ax, %ax
337 ; ALL-NEXT:    vpinsrw $4, %eax, %xmm3, %xmm3
338 ; ALL-NEXT:    vpextrw $5, %xmm2, %eax
339 ; ALL-NEXT:    tzcntw %ax, %ax
340 ; ALL-NEXT:    vpinsrw $5, %eax, %xmm3, %xmm3
341 ; ALL-NEXT:    vpextrw $6, %xmm2, %eax
342 ; ALL-NEXT:    tzcntw %ax, %ax
343 ; ALL-NEXT:    vpinsrw $6, %eax, %xmm3, %xmm3
344 ; ALL-NEXT:    vpextrw $7, %xmm2, %eax
345 ; ALL-NEXT:    tzcntw %ax, %ax
346 ; ALL-NEXT:    vpinsrw $7, %eax, %xmm3, %xmm2
347 ; ALL-NEXT:    vpextrw $1, %xmm0, %eax
348 ; ALL-NEXT:    tzcntw %ax, %ax
349 ; ALL-NEXT:    vmovd %xmm0, %ecx
350 ; ALL-NEXT:    tzcntw %cx, %cx
351 ; ALL-NEXT:    vmovd %ecx, %xmm3
352 ; ALL-NEXT:    vpinsrw $1, %eax, %xmm3, %xmm3
353 ; ALL-NEXT:    vpextrw $2, %xmm0, %eax
354 ; ALL-NEXT:    tzcntw %ax, %ax
355 ; ALL-NEXT:    vpinsrw $2, %eax, %xmm3, %xmm3
356 ; ALL-NEXT:    vpextrw $3, %xmm0, %eax
357 ; ALL-NEXT:    tzcntw %ax, %ax
358 ; ALL-NEXT:    vpinsrw $3, %eax, %xmm3, %xmm3
359 ; ALL-NEXT:    vpextrw $4, %xmm0, %eax
360 ; ALL-NEXT:    tzcntw %ax, %ax
361 ; ALL-NEXT:    vpinsrw $4, %eax, %xmm3, %xmm3
362 ; ALL-NEXT:    vpextrw $5, %xmm0, %eax
363 ; ALL-NEXT:    tzcntw %ax, %ax
364 ; ALL-NEXT:    vpinsrw $5, %eax, %xmm3, %xmm3
365 ; ALL-NEXT:    vpextrw $6, %xmm0, %eax
366 ; ALL-NEXT:    tzcntw %ax, %ax
367 ; ALL-NEXT:    vpinsrw $6, %eax, %xmm3, %xmm3
368 ; ALL-NEXT:    vpextrw $7, %xmm0, %eax
369 ; ALL-NEXT:    tzcntw %ax, %ax
370 ; ALL-NEXT:    vpinsrw $7, %eax, %xmm3, %xmm0
371 ; ALL-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
372 ; ALL-NEXT:    vextracti128 $1, %ymm1, %xmm2
373 ; ALL-NEXT:    vpextrw $1, %xmm2, %eax
374 ; ALL-NEXT:    tzcntw %ax, %ax
375 ; ALL-NEXT:    vmovd %xmm2, %ecx
376 ; ALL-NEXT:    tzcntw %cx, %cx
377 ; ALL-NEXT:    vmovd %ecx, %xmm3
378 ; ALL-NEXT:    vpinsrw $1, %eax, %xmm3, %xmm3
379 ; ALL-NEXT:    vpextrw $2, %xmm2, %eax
380 ; ALL-NEXT:    tzcntw %ax, %ax
381 ; ALL-NEXT:    vpinsrw $2, %eax, %xmm3, %xmm3
382 ; ALL-NEXT:    vpextrw $3, %xmm2, %eax
383 ; ALL-NEXT:    tzcntw %ax, %ax
384 ; ALL-NEXT:    vpinsrw $3, %eax, %xmm3, %xmm3
385 ; ALL-NEXT:    vpextrw $4, %xmm2, %eax
386 ; ALL-NEXT:    tzcntw %ax, %ax
387 ; ALL-NEXT:    vpinsrw $4, %eax, %xmm3, %xmm3
388 ; ALL-NEXT:    vpextrw $5, %xmm2, %eax
389 ; ALL-NEXT:    tzcntw %ax, %ax
390 ; ALL-NEXT:    vpinsrw $5, %eax, %xmm3, %xmm3
391 ; ALL-NEXT:    vpextrw $6, %xmm2, %eax
392 ; ALL-NEXT:    tzcntw %ax, %ax
393 ; ALL-NEXT:    vpinsrw $6, %eax, %xmm3, %xmm3
394 ; ALL-NEXT:    vpextrw $7, %xmm2, %eax
395 ; ALL-NEXT:    tzcntw %ax, %ax
396 ; ALL-NEXT:    vpinsrw $7, %eax, %xmm3, %xmm2
397 ; ALL-NEXT:    vpextrw $1, %xmm1, %eax
398 ; ALL-NEXT:    tzcntw %ax, %ax
399 ; ALL-NEXT:    vmovd %xmm1, %ecx
400 ; ALL-NEXT:    tzcntw %cx, %cx
401 ; ALL-NEXT:    vmovd %ecx, %xmm3
402 ; ALL-NEXT:    vpinsrw $1, %eax, %xmm3, %xmm3
403 ; ALL-NEXT:    vpextrw $2, %xmm1, %eax
404 ; ALL-NEXT:    tzcntw %ax, %ax
405 ; ALL-NEXT:    vpinsrw $2, %eax, %xmm3, %xmm3
406 ; ALL-NEXT:    vpextrw $3, %xmm1, %eax
407 ; ALL-NEXT:    tzcntw %ax, %ax
408 ; ALL-NEXT:    vpinsrw $3, %eax, %xmm3, %xmm3
409 ; ALL-NEXT:    vpextrw $4, %xmm1, %eax
410 ; ALL-NEXT:    tzcntw %ax, %ax
411 ; ALL-NEXT:    vpinsrw $4, %eax, %xmm3, %xmm3
412 ; ALL-NEXT:    vpextrw $5, %xmm1, %eax
413 ; ALL-NEXT:    tzcntw %ax, %ax
414 ; ALL-NEXT:    vpinsrw $5, %eax, %xmm3, %xmm3
415 ; ALL-NEXT:    vpextrw $6, %xmm1, %eax
416 ; ALL-NEXT:    tzcntw %ax, %ax
417 ; ALL-NEXT:    vpinsrw $6, %eax, %xmm3, %xmm3
418 ; ALL-NEXT:    vpextrw $7, %xmm1, %eax
419 ; ALL-NEXT:    tzcntw %ax, %ax
420 ; ALL-NEXT:    vpinsrw $7, %eax, %xmm3, %xmm1
421 ; ALL-NEXT:    vinserti128 $1, %xmm2, %ymm1, %ymm1
422 ; ALL-NEXT:    retq
423   %out = call <32 x i16> @llvm.cttz.v32i16(<32 x i16> %in, i1 -1)
424   ret <32 x i16> %out
425 }
426
427 define <64 x i8> @testv64i8(<64 x i8> %in) nounwind {
428 ; ALL-LABEL: testv64i8:
429 ; ALL:       ## BB#0:
430 ; ALL-NEXT:    vextracti128 $1, %ymm0, %xmm2
431 ; ALL-NEXT:    vpextrb $1, %xmm2, %eax
432 ; ALL-NEXT:    tzcntl %eax, %ecx
433 ; ALL-NEXT:    cmpl $32, %ecx
434 ; ALL-NEXT:    movl $8, %eax
435 ; ALL-NEXT:    cmovel %eax, %ecx
436 ; ALL-NEXT:    vpextrb $0, %xmm2, %edx
437 ; ALL-NEXT:    tzcntl %edx, %edx
438 ; ALL-NEXT:    cmpl $32, %edx
439 ; ALL-NEXT:    cmovel %eax, %edx
440 ; ALL-NEXT:    vmovd %edx, %xmm3
441 ; ALL-NEXT:    vpinsrb $1, %ecx, %xmm3, %xmm3
442 ; ALL-NEXT:    vpextrb $2, %xmm2, %ecx
443 ; ALL-NEXT:    tzcntl %ecx, %ecx
444 ; ALL-NEXT:    cmpl $32, %ecx
445 ; ALL-NEXT:    cmovel %eax, %ecx
446 ; ALL-NEXT:    vpinsrb $2, %ecx, %xmm3, %xmm3
447 ; ALL-NEXT:    vpextrb $3, %xmm2, %ecx
448 ; ALL-NEXT:    tzcntl %ecx, %ecx
449 ; ALL-NEXT:    cmpl $32, %ecx
450 ; ALL-NEXT:    cmovel %eax, %ecx
451 ; ALL-NEXT:    vpinsrb $3, %ecx, %xmm3, %xmm3
452 ; ALL-NEXT:    vpextrb $4, %xmm2, %ecx
453 ; ALL-NEXT:    tzcntl %ecx, %ecx
454 ; ALL-NEXT:    cmpl $32, %ecx
455 ; ALL-NEXT:    cmovel %eax, %ecx
456 ; ALL-NEXT:    vpinsrb $4, %ecx, %xmm3, %xmm3
457 ; ALL-NEXT:    vpextrb $5, %xmm2, %ecx
458 ; ALL-NEXT:    tzcntl %ecx, %ecx
459 ; ALL-NEXT:    cmpl $32, %ecx
460 ; ALL-NEXT:    cmovel %eax, %ecx
461 ; ALL-NEXT:    vpinsrb $5, %ecx, %xmm3, %xmm3
462 ; ALL-NEXT:    vpextrb $6, %xmm2, %ecx
463 ; ALL-NEXT:    tzcntl %ecx, %ecx
464 ; ALL-NEXT:    cmpl $32, %ecx
465 ; ALL-NEXT:    cmovel %eax, %ecx
466 ; ALL-NEXT:    vpinsrb $6, %ecx, %xmm3, %xmm3
467 ; ALL-NEXT:    vpextrb $7, %xmm2, %ecx
468 ; ALL-NEXT:    tzcntl %ecx, %ecx
469 ; ALL-NEXT:    cmpl $32, %ecx
470 ; ALL-NEXT:    cmovel %eax, %ecx
471 ; ALL-NEXT:    vpinsrb $7, %ecx, %xmm3, %xmm3
472 ; ALL-NEXT:    vpextrb $8, %xmm2, %ecx
473 ; ALL-NEXT:    tzcntl %ecx, %ecx
474 ; ALL-NEXT:    cmpl $32, %ecx
475 ; ALL-NEXT:    cmovel %eax, %ecx
476 ; ALL-NEXT:    vpinsrb $8, %ecx, %xmm3, %xmm3
477 ; ALL-NEXT:    vpextrb $9, %xmm2, %ecx
478 ; ALL-NEXT:    tzcntl %ecx, %ecx
479 ; ALL-NEXT:    cmpl $32, %ecx
480 ; ALL-NEXT:    cmovel %eax, %ecx
481 ; ALL-NEXT:    vpinsrb $9, %ecx, %xmm3, %xmm3
482 ; ALL-NEXT:    vpextrb $10, %xmm2, %ecx
483 ; ALL-NEXT:    tzcntl %ecx, %ecx
484 ; ALL-NEXT:    cmpl $32, %ecx
485 ; ALL-NEXT:    cmovel %eax, %ecx
486 ; ALL-NEXT:    vpinsrb $10, %ecx, %xmm3, %xmm3
487 ; ALL-NEXT:    vpextrb $11, %xmm2, %ecx
488 ; ALL-NEXT:    tzcntl %ecx, %ecx
489 ; ALL-NEXT:    cmpl $32, %ecx
490 ; ALL-NEXT:    cmovel %eax, %ecx
491 ; ALL-NEXT:    vpinsrb $11, %ecx, %xmm3, %xmm3
492 ; ALL-NEXT:    vpextrb $12, %xmm2, %ecx
493 ; ALL-NEXT:    tzcntl %ecx, %ecx
494 ; ALL-NEXT:    cmpl $32, %ecx
495 ; ALL-NEXT:    cmovel %eax, %ecx
496 ; ALL-NEXT:    vpinsrb $12, %ecx, %xmm3, %xmm3
497 ; ALL-NEXT:    vpextrb $13, %xmm2, %ecx
498 ; ALL-NEXT:    tzcntl %ecx, %ecx
499 ; ALL-NEXT:    cmpl $32, %ecx
500 ; ALL-NEXT:    cmovel %eax, %ecx
501 ; ALL-NEXT:    vpinsrb $13, %ecx, %xmm3, %xmm3
502 ; ALL-NEXT:    vpextrb $14, %xmm2, %ecx
503 ; ALL-NEXT:    tzcntl %ecx, %ecx
504 ; ALL-NEXT:    cmpl $32, %ecx
505 ; ALL-NEXT:    cmovel %eax, %ecx
506 ; ALL-NEXT:    vpinsrb $14, %ecx, %xmm3, %xmm3
507 ; ALL-NEXT:    vpextrb $15, %xmm2, %ecx
508 ; ALL-NEXT:    tzcntl %ecx, %ecx
509 ; ALL-NEXT:    cmpl $32, %ecx
510 ; ALL-NEXT:    cmovel %eax, %ecx
511 ; ALL-NEXT:    vpinsrb $15, %ecx, %xmm3, %xmm2
512 ; ALL-NEXT:    vpextrb $1, %xmm0, %ecx
513 ; ALL-NEXT:    tzcntl %ecx, %ecx
514 ; ALL-NEXT:    cmpl $32, %ecx
515 ; ALL-NEXT:    cmovel %eax, %ecx
516 ; ALL-NEXT:    vpextrb $0, %xmm0, %edx
517 ; ALL-NEXT:    tzcntl %edx, %edx
518 ; ALL-NEXT:    cmpl $32, %edx
519 ; ALL-NEXT:    cmovel %eax, %edx
520 ; ALL-NEXT:    vmovd %edx, %xmm3
521 ; ALL-NEXT:    vpinsrb $1, %ecx, %xmm3, %xmm3
522 ; ALL-NEXT:    vpextrb $2, %xmm0, %ecx
523 ; ALL-NEXT:    tzcntl %ecx, %ecx
524 ; ALL-NEXT:    cmpl $32, %ecx
525 ; ALL-NEXT:    cmovel %eax, %ecx
526 ; ALL-NEXT:    vpinsrb $2, %ecx, %xmm3, %xmm3
527 ; ALL-NEXT:    vpextrb $3, %xmm0, %ecx
528 ; ALL-NEXT:    tzcntl %ecx, %ecx
529 ; ALL-NEXT:    cmpl $32, %ecx
530 ; ALL-NEXT:    cmovel %eax, %ecx
531 ; ALL-NEXT:    vpinsrb $3, %ecx, %xmm3, %xmm3
532 ; ALL-NEXT:    vpextrb $4, %xmm0, %ecx
533 ; ALL-NEXT:    tzcntl %ecx, %ecx
534 ; ALL-NEXT:    cmpl $32, %ecx
535 ; ALL-NEXT:    cmovel %eax, %ecx
536 ; ALL-NEXT:    vpinsrb $4, %ecx, %xmm3, %xmm3
537 ; ALL-NEXT:    vpextrb $5, %xmm0, %ecx
538 ; ALL-NEXT:    tzcntl %ecx, %ecx
539 ; ALL-NEXT:    cmpl $32, %ecx
540 ; ALL-NEXT:    cmovel %eax, %ecx
541 ; ALL-NEXT:    vpinsrb $5, %ecx, %xmm3, %xmm3
542 ; ALL-NEXT:    vpextrb $6, %xmm0, %ecx
543 ; ALL-NEXT:    tzcntl %ecx, %ecx
544 ; ALL-NEXT:    cmpl $32, %ecx
545 ; ALL-NEXT:    cmovel %eax, %ecx
546 ; ALL-NEXT:    vpinsrb $6, %ecx, %xmm3, %xmm3
547 ; ALL-NEXT:    vpextrb $7, %xmm0, %ecx
548 ; ALL-NEXT:    tzcntl %ecx, %ecx
549 ; ALL-NEXT:    cmpl $32, %ecx
550 ; ALL-NEXT:    cmovel %eax, %ecx
551 ; ALL-NEXT:    vpinsrb $7, %ecx, %xmm3, %xmm3
552 ; ALL-NEXT:    vpextrb $8, %xmm0, %ecx
553 ; ALL-NEXT:    tzcntl %ecx, %ecx
554 ; ALL-NEXT:    cmpl $32, %ecx
555 ; ALL-NEXT:    cmovel %eax, %ecx
556 ; ALL-NEXT:    vpinsrb $8, %ecx, %xmm3, %xmm3
557 ; ALL-NEXT:    vpextrb $9, %xmm0, %ecx
558 ; ALL-NEXT:    tzcntl %ecx, %ecx
559 ; ALL-NEXT:    cmpl $32, %ecx
560 ; ALL-NEXT:    cmovel %eax, %ecx
561 ; ALL-NEXT:    vpinsrb $9, %ecx, %xmm3, %xmm3
562 ; ALL-NEXT:    vpextrb $10, %xmm0, %ecx
563 ; ALL-NEXT:    tzcntl %ecx, %ecx
564 ; ALL-NEXT:    cmpl $32, %ecx
565 ; ALL-NEXT:    cmovel %eax, %ecx
566 ; ALL-NEXT:    vpinsrb $10, %ecx, %xmm3, %xmm3
567 ; ALL-NEXT:    vpextrb $11, %xmm0, %ecx
568 ; ALL-NEXT:    tzcntl %ecx, %ecx
569 ; ALL-NEXT:    cmpl $32, %ecx
570 ; ALL-NEXT:    cmovel %eax, %ecx
571 ; ALL-NEXT:    vpinsrb $11, %ecx, %xmm3, %xmm3
572 ; ALL-NEXT:    vpextrb $12, %xmm0, %ecx
573 ; ALL-NEXT:    tzcntl %ecx, %ecx
574 ; ALL-NEXT:    cmpl $32, %ecx
575 ; ALL-NEXT:    cmovel %eax, %ecx
576 ; ALL-NEXT:    vpinsrb $12, %ecx, %xmm3, %xmm3
577 ; ALL-NEXT:    vpextrb $13, %xmm0, %ecx
578 ; ALL-NEXT:    tzcntl %ecx, %ecx
579 ; ALL-NEXT:    cmpl $32, %ecx
580 ; ALL-NEXT:    cmovel %eax, %ecx
581 ; ALL-NEXT:    vpinsrb $13, %ecx, %xmm3, %xmm3
582 ; ALL-NEXT:    vpextrb $14, %xmm0, %ecx
583 ; ALL-NEXT:    tzcntl %ecx, %ecx
584 ; ALL-NEXT:    cmpl $32, %ecx
585 ; ALL-NEXT:    cmovel %eax, %ecx
586 ; ALL-NEXT:    vpinsrb $14, %ecx, %xmm3, %xmm3
587 ; ALL-NEXT:    vpextrb $15, %xmm0, %ecx
588 ; ALL-NEXT:    tzcntl %ecx, %ecx
589 ; ALL-NEXT:    cmpl $32, %ecx
590 ; ALL-NEXT:    cmovel %eax, %ecx
591 ; ALL-NEXT:    vpinsrb $15, %ecx, %xmm3, %xmm0
592 ; ALL-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
593 ; ALL-NEXT:    vextracti128 $1, %ymm1, %xmm2
594 ; ALL-NEXT:    vpextrb $1, %xmm2, %ecx
595 ; ALL-NEXT:    tzcntl %ecx, %ecx
596 ; ALL-NEXT:    cmpl $32, %ecx
597 ; ALL-NEXT:    cmovel %eax, %ecx
598 ; ALL-NEXT:    vpextrb $0, %xmm2, %edx
599 ; ALL-NEXT:    tzcntl %edx, %edx
600 ; ALL-NEXT:    cmpl $32, %edx
601 ; ALL-NEXT:    cmovel %eax, %edx
602 ; ALL-NEXT:    vmovd %edx, %xmm3
603 ; ALL-NEXT:    vpinsrb $1, %ecx, %xmm3, %xmm3
604 ; ALL-NEXT:    vpextrb $2, %xmm2, %ecx
605 ; ALL-NEXT:    tzcntl %ecx, %ecx
606 ; ALL-NEXT:    cmpl $32, %ecx
607 ; ALL-NEXT:    cmovel %eax, %ecx
608 ; ALL-NEXT:    vpinsrb $2, %ecx, %xmm3, %xmm3
609 ; ALL-NEXT:    vpextrb $3, %xmm2, %ecx
610 ; ALL-NEXT:    tzcntl %ecx, %ecx
611 ; ALL-NEXT:    cmpl $32, %ecx
612 ; ALL-NEXT:    cmovel %eax, %ecx
613 ; ALL-NEXT:    vpinsrb $3, %ecx, %xmm3, %xmm3
614 ; ALL-NEXT:    vpextrb $4, %xmm2, %ecx
615 ; ALL-NEXT:    tzcntl %ecx, %ecx
616 ; ALL-NEXT:    cmpl $32, %ecx
617 ; ALL-NEXT:    cmovel %eax, %ecx
618 ; ALL-NEXT:    vpinsrb $4, %ecx, %xmm3, %xmm3
619 ; ALL-NEXT:    vpextrb $5, %xmm2, %ecx
620 ; ALL-NEXT:    tzcntl %ecx, %ecx
621 ; ALL-NEXT:    cmpl $32, %ecx
622 ; ALL-NEXT:    cmovel %eax, %ecx
623 ; ALL-NEXT:    vpinsrb $5, %ecx, %xmm3, %xmm3
624 ; ALL-NEXT:    vpextrb $6, %xmm2, %ecx
625 ; ALL-NEXT:    tzcntl %ecx, %ecx
626 ; ALL-NEXT:    cmpl $32, %ecx
627 ; ALL-NEXT:    cmovel %eax, %ecx
628 ; ALL-NEXT:    vpinsrb $6, %ecx, %xmm3, %xmm3
629 ; ALL-NEXT:    vpextrb $7, %xmm2, %ecx
630 ; ALL-NEXT:    tzcntl %ecx, %ecx
631 ; ALL-NEXT:    cmpl $32, %ecx
632 ; ALL-NEXT:    cmovel %eax, %ecx
633 ; ALL-NEXT:    vpinsrb $7, %ecx, %xmm3, %xmm3
634 ; ALL-NEXT:    vpextrb $8, %xmm2, %ecx
635 ; ALL-NEXT:    tzcntl %ecx, %ecx
636 ; ALL-NEXT:    cmpl $32, %ecx
637 ; ALL-NEXT:    cmovel %eax, %ecx
638 ; ALL-NEXT:    vpinsrb $8, %ecx, %xmm3, %xmm3
639 ; ALL-NEXT:    vpextrb $9, %xmm2, %ecx
640 ; ALL-NEXT:    tzcntl %ecx, %ecx
641 ; ALL-NEXT:    cmpl $32, %ecx
642 ; ALL-NEXT:    cmovel %eax, %ecx
643 ; ALL-NEXT:    vpinsrb $9, %ecx, %xmm3, %xmm3
644 ; ALL-NEXT:    vpextrb $10, %xmm2, %ecx
645 ; ALL-NEXT:    tzcntl %ecx, %ecx
646 ; ALL-NEXT:    cmpl $32, %ecx
647 ; ALL-NEXT:    cmovel %eax, %ecx
648 ; ALL-NEXT:    vpinsrb $10, %ecx, %xmm3, %xmm3
649 ; ALL-NEXT:    vpextrb $11, %xmm2, %ecx
650 ; ALL-NEXT:    tzcntl %ecx, %ecx
651 ; ALL-NEXT:    cmpl $32, %ecx
652 ; ALL-NEXT:    cmovel %eax, %ecx
653 ; ALL-NEXT:    vpinsrb $11, %ecx, %xmm3, %xmm3
654 ; ALL-NEXT:    vpextrb $12, %xmm2, %ecx
655 ; ALL-NEXT:    tzcntl %ecx, %ecx
656 ; ALL-NEXT:    cmpl $32, %ecx
657 ; ALL-NEXT:    cmovel %eax, %ecx
658 ; ALL-NEXT:    vpinsrb $12, %ecx, %xmm3, %xmm3
659 ; ALL-NEXT:    vpextrb $13, %xmm2, %ecx
660 ; ALL-NEXT:    tzcntl %ecx, %ecx
661 ; ALL-NEXT:    cmpl $32, %ecx
662 ; ALL-NEXT:    cmovel %eax, %ecx
663 ; ALL-NEXT:    vpinsrb $13, %ecx, %xmm3, %xmm3
664 ; ALL-NEXT:    vpextrb $14, %xmm2, %ecx
665 ; ALL-NEXT:    tzcntl %ecx, %ecx
666 ; ALL-NEXT:    cmpl $32, %ecx
667 ; ALL-NEXT:    cmovel %eax, %ecx
668 ; ALL-NEXT:    vpinsrb $14, %ecx, %xmm3, %xmm3
669 ; ALL-NEXT:    vpextrb $15, %xmm2, %ecx
670 ; ALL-NEXT:    tzcntl %ecx, %ecx
671 ; ALL-NEXT:    cmpl $32, %ecx
672 ; ALL-NEXT:    cmovel %eax, %ecx
673 ; ALL-NEXT:    vpinsrb $15, %ecx, %xmm3, %xmm2
674 ; ALL-NEXT:    vpextrb $1, %xmm1, %ecx
675 ; ALL-NEXT:    tzcntl %ecx, %ecx
676 ; ALL-NEXT:    cmpl $32, %ecx
677 ; ALL-NEXT:    cmovel %eax, %ecx
678 ; ALL-NEXT:    vpextrb $0, %xmm1, %edx
679 ; ALL-NEXT:    tzcntl %edx, %edx
680 ; ALL-NEXT:    cmpl $32, %edx
681 ; ALL-NEXT:    cmovel %eax, %edx
682 ; ALL-NEXT:    vmovd %edx, %xmm3
683 ; ALL-NEXT:    vpinsrb $1, %ecx, %xmm3, %xmm3
684 ; ALL-NEXT:    vpextrb $2, %xmm1, %ecx
685 ; ALL-NEXT:    tzcntl %ecx, %ecx
686 ; ALL-NEXT:    cmpl $32, %ecx
687 ; ALL-NEXT:    cmovel %eax, %ecx
688 ; ALL-NEXT:    vpinsrb $2, %ecx, %xmm3, %xmm3
689 ; ALL-NEXT:    vpextrb $3, %xmm1, %ecx
690 ; ALL-NEXT:    tzcntl %ecx, %ecx
691 ; ALL-NEXT:    cmpl $32, %ecx
692 ; ALL-NEXT:    cmovel %eax, %ecx
693 ; ALL-NEXT:    vpinsrb $3, %ecx, %xmm3, %xmm3
694 ; ALL-NEXT:    vpextrb $4, %xmm1, %ecx
695 ; ALL-NEXT:    tzcntl %ecx, %ecx
696 ; ALL-NEXT:    cmpl $32, %ecx
697 ; ALL-NEXT:    cmovel %eax, %ecx
698 ; ALL-NEXT:    vpinsrb $4, %ecx, %xmm3, %xmm3
699 ; ALL-NEXT:    vpextrb $5, %xmm1, %ecx
700 ; ALL-NEXT:    tzcntl %ecx, %ecx
701 ; ALL-NEXT:    cmpl $32, %ecx
702 ; ALL-NEXT:    cmovel %eax, %ecx
703 ; ALL-NEXT:    vpinsrb $5, %ecx, %xmm3, %xmm3
704 ; ALL-NEXT:    vpextrb $6, %xmm1, %ecx
705 ; ALL-NEXT:    tzcntl %ecx, %ecx
706 ; ALL-NEXT:    cmpl $32, %ecx
707 ; ALL-NEXT:    cmovel %eax, %ecx
708 ; ALL-NEXT:    vpinsrb $6, %ecx, %xmm3, %xmm3
709 ; ALL-NEXT:    vpextrb $7, %xmm1, %ecx
710 ; ALL-NEXT:    tzcntl %ecx, %ecx
711 ; ALL-NEXT:    cmpl $32, %ecx
712 ; ALL-NEXT:    cmovel %eax, %ecx
713 ; ALL-NEXT:    vpinsrb $7, %ecx, %xmm3, %xmm3
714 ; ALL-NEXT:    vpextrb $8, %xmm1, %ecx
715 ; ALL-NEXT:    tzcntl %ecx, %ecx
716 ; ALL-NEXT:    cmpl $32, %ecx
717 ; ALL-NEXT:    cmovel %eax, %ecx
718 ; ALL-NEXT:    vpinsrb $8, %ecx, %xmm3, %xmm3
719 ; ALL-NEXT:    vpextrb $9, %xmm1, %ecx
720 ; ALL-NEXT:    tzcntl %ecx, %ecx
721 ; ALL-NEXT:    cmpl $32, %ecx
722 ; ALL-NEXT:    cmovel %eax, %ecx
723 ; ALL-NEXT:    vpinsrb $9, %ecx, %xmm3, %xmm3
724 ; ALL-NEXT:    vpextrb $10, %xmm1, %ecx
725 ; ALL-NEXT:    tzcntl %ecx, %ecx
726 ; ALL-NEXT:    cmpl $32, %ecx
727 ; ALL-NEXT:    cmovel %eax, %ecx
728 ; ALL-NEXT:    vpinsrb $10, %ecx, %xmm3, %xmm3
729 ; ALL-NEXT:    vpextrb $11, %xmm1, %ecx
730 ; ALL-NEXT:    tzcntl %ecx, %ecx
731 ; ALL-NEXT:    cmpl $32, %ecx
732 ; ALL-NEXT:    cmovel %eax, %ecx
733 ; ALL-NEXT:    vpinsrb $11, %ecx, %xmm3, %xmm3
734 ; ALL-NEXT:    vpextrb $12, %xmm1, %ecx
735 ; ALL-NEXT:    tzcntl %ecx, %ecx
736 ; ALL-NEXT:    cmpl $32, %ecx
737 ; ALL-NEXT:    cmovel %eax, %ecx
738 ; ALL-NEXT:    vpinsrb $12, %ecx, %xmm3, %xmm3
739 ; ALL-NEXT:    vpextrb $13, %xmm1, %ecx
740 ; ALL-NEXT:    tzcntl %ecx, %ecx
741 ; ALL-NEXT:    cmpl $32, %ecx
742 ; ALL-NEXT:    cmovel %eax, %ecx
743 ; ALL-NEXT:    vpinsrb $13, %ecx, %xmm3, %xmm3
744 ; ALL-NEXT:    vpextrb $14, %xmm1, %ecx
745 ; ALL-NEXT:    tzcntl %ecx, %ecx
746 ; ALL-NEXT:    cmpl $32, %ecx
747 ; ALL-NEXT:    cmovel %eax, %ecx
748 ; ALL-NEXT:    vpinsrb $14, %ecx, %xmm3, %xmm3
749 ; ALL-NEXT:    vpextrb $15, %xmm1, %ecx
750 ; ALL-NEXT:    tzcntl %ecx, %ecx
751 ; ALL-NEXT:    cmpl $32, %ecx
752 ; ALL-NEXT:    cmovel %eax, %ecx
753 ; ALL-NEXT:    vpinsrb $15, %ecx, %xmm3, %xmm1
754 ; ALL-NEXT:    vinserti128 $1, %xmm2, %ymm1, %ymm1
755 ; ALL-NEXT:    retq
756   %out = call <64 x i8> @llvm.cttz.v64i8(<64 x i8> %in, i1 0)
757   ret <64 x i8> %out
758 }
759
760 define <64 x i8> @testv64i8u(<64 x i8> %in) nounwind {
761 ; ALL-LABEL: testv64i8u:
762 ; ALL:       ## BB#0:
763 ; ALL-NEXT:    vextracti128 $1, %ymm0, %xmm2
764 ; ALL-NEXT:    vpextrb $1, %xmm2, %eax
765 ; ALL-NEXT:    tzcntl %eax, %eax
766 ; ALL-NEXT:    vpextrb $0, %xmm2, %ecx
767 ; ALL-NEXT:    tzcntl %ecx, %ecx
768 ; ALL-NEXT:    vmovd %ecx, %xmm3
769 ; ALL-NEXT:    vpinsrb $1, %eax, %xmm3, %xmm3
770 ; ALL-NEXT:    vpextrb $2, %xmm2, %eax
771 ; ALL-NEXT:    tzcntl %eax, %eax
772 ; ALL-NEXT:    vpinsrb $2, %eax, %xmm3, %xmm3
773 ; ALL-NEXT:    vpextrb $3, %xmm2, %eax
774 ; ALL-NEXT:    tzcntl %eax, %eax
775 ; ALL-NEXT:    vpinsrb $3, %eax, %xmm3, %xmm3
776 ; ALL-NEXT:    vpextrb $4, %xmm2, %eax
777 ; ALL-NEXT:    tzcntl %eax, %eax
778 ; ALL-NEXT:    vpinsrb $4, %eax, %xmm3, %xmm3
779 ; ALL-NEXT:    vpextrb $5, %xmm2, %eax
780 ; ALL-NEXT:    tzcntl %eax, %eax
781 ; ALL-NEXT:    vpinsrb $5, %eax, %xmm3, %xmm3
782 ; ALL-NEXT:    vpextrb $6, %xmm2, %eax
783 ; ALL-NEXT:    tzcntl %eax, %eax
784 ; ALL-NEXT:    vpinsrb $6, %eax, %xmm3, %xmm3
785 ; ALL-NEXT:    vpextrb $7, %xmm2, %eax
786 ; ALL-NEXT:    tzcntl %eax, %eax
787 ; ALL-NEXT:    vpinsrb $7, %eax, %xmm3, %xmm3
788 ; ALL-NEXT:    vpextrb $8, %xmm2, %eax
789 ; ALL-NEXT:    tzcntl %eax, %eax
790 ; ALL-NEXT:    vpinsrb $8, %eax, %xmm3, %xmm3
791 ; ALL-NEXT:    vpextrb $9, %xmm2, %eax
792 ; ALL-NEXT:    tzcntl %eax, %eax
793 ; ALL-NEXT:    vpinsrb $9, %eax, %xmm3, %xmm3
794 ; ALL-NEXT:    vpextrb $10, %xmm2, %eax
795 ; ALL-NEXT:    tzcntl %eax, %eax
796 ; ALL-NEXT:    vpinsrb $10, %eax, %xmm3, %xmm3
797 ; ALL-NEXT:    vpextrb $11, %xmm2, %eax
798 ; ALL-NEXT:    tzcntl %eax, %eax
799 ; ALL-NEXT:    vpinsrb $11, %eax, %xmm3, %xmm3
800 ; ALL-NEXT:    vpextrb $12, %xmm2, %eax
801 ; ALL-NEXT:    tzcntl %eax, %eax
802 ; ALL-NEXT:    vpinsrb $12, %eax, %xmm3, %xmm3
803 ; ALL-NEXT:    vpextrb $13, %xmm2, %eax
804 ; ALL-NEXT:    tzcntl %eax, %eax
805 ; ALL-NEXT:    vpinsrb $13, %eax, %xmm3, %xmm3
806 ; ALL-NEXT:    vpextrb $14, %xmm2, %eax
807 ; ALL-NEXT:    tzcntl %eax, %eax
808 ; ALL-NEXT:    vpinsrb $14, %eax, %xmm3, %xmm3
809 ; ALL-NEXT:    vpextrb $15, %xmm2, %eax
810 ; ALL-NEXT:    tzcntl %eax, %eax
811 ; ALL-NEXT:    vpinsrb $15, %eax, %xmm3, %xmm2
812 ; ALL-NEXT:    vpextrb $1, %xmm0, %eax
813 ; ALL-NEXT:    tzcntl %eax, %eax
814 ; ALL-NEXT:    vpextrb $0, %xmm0, %ecx
815 ; ALL-NEXT:    tzcntl %ecx, %ecx
816 ; ALL-NEXT:    vmovd %ecx, %xmm3
817 ; ALL-NEXT:    vpinsrb $1, %eax, %xmm3, %xmm3
818 ; ALL-NEXT:    vpextrb $2, %xmm0, %eax
819 ; ALL-NEXT:    tzcntl %eax, %eax
820 ; ALL-NEXT:    vpinsrb $2, %eax, %xmm3, %xmm3
821 ; ALL-NEXT:    vpextrb $3, %xmm0, %eax
822 ; ALL-NEXT:    tzcntl %eax, %eax
823 ; ALL-NEXT:    vpinsrb $3, %eax, %xmm3, %xmm3
824 ; ALL-NEXT:    vpextrb $4, %xmm0, %eax
825 ; ALL-NEXT:    tzcntl %eax, %eax
826 ; ALL-NEXT:    vpinsrb $4, %eax, %xmm3, %xmm3
827 ; ALL-NEXT:    vpextrb $5, %xmm0, %eax
828 ; ALL-NEXT:    tzcntl %eax, %eax
829 ; ALL-NEXT:    vpinsrb $5, %eax, %xmm3, %xmm3
830 ; ALL-NEXT:    vpextrb $6, %xmm0, %eax
831 ; ALL-NEXT:    tzcntl %eax, %eax
832 ; ALL-NEXT:    vpinsrb $6, %eax, %xmm3, %xmm3
833 ; ALL-NEXT:    vpextrb $7, %xmm0, %eax
834 ; ALL-NEXT:    tzcntl %eax, %eax
835 ; ALL-NEXT:    vpinsrb $7, %eax, %xmm3, %xmm3
836 ; ALL-NEXT:    vpextrb $8, %xmm0, %eax
837 ; ALL-NEXT:    tzcntl %eax, %eax
838 ; ALL-NEXT:    vpinsrb $8, %eax, %xmm3, %xmm3
839 ; ALL-NEXT:    vpextrb $9, %xmm0, %eax
840 ; ALL-NEXT:    tzcntl %eax, %eax
841 ; ALL-NEXT:    vpinsrb $9, %eax, %xmm3, %xmm3
842 ; ALL-NEXT:    vpextrb $10, %xmm0, %eax
843 ; ALL-NEXT:    tzcntl %eax, %eax
844 ; ALL-NEXT:    vpinsrb $10, %eax, %xmm3, %xmm3
845 ; ALL-NEXT:    vpextrb $11, %xmm0, %eax
846 ; ALL-NEXT:    tzcntl %eax, %eax
847 ; ALL-NEXT:    vpinsrb $11, %eax, %xmm3, %xmm3
848 ; ALL-NEXT:    vpextrb $12, %xmm0, %eax
849 ; ALL-NEXT:    tzcntl %eax, %eax
850 ; ALL-NEXT:    vpinsrb $12, %eax, %xmm3, %xmm3
851 ; ALL-NEXT:    vpextrb $13, %xmm0, %eax
852 ; ALL-NEXT:    tzcntl %eax, %eax
853 ; ALL-NEXT:    vpinsrb $13, %eax, %xmm3, %xmm3
854 ; ALL-NEXT:    vpextrb $14, %xmm0, %eax
855 ; ALL-NEXT:    tzcntl %eax, %eax
856 ; ALL-NEXT:    vpinsrb $14, %eax, %xmm3, %xmm3
857 ; ALL-NEXT:    vpextrb $15, %xmm0, %eax
858 ; ALL-NEXT:    tzcntl %eax, %eax
859 ; ALL-NEXT:    vpinsrb $15, %eax, %xmm3, %xmm0
860 ; ALL-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
861 ; ALL-NEXT:    vextracti128 $1, %ymm1, %xmm2
862 ; ALL-NEXT:    vpextrb $1, %xmm2, %eax
863 ; ALL-NEXT:    tzcntl %eax, %eax
864 ; ALL-NEXT:    vpextrb $0, %xmm2, %ecx
865 ; ALL-NEXT:    tzcntl %ecx, %ecx
866 ; ALL-NEXT:    vmovd %ecx, %xmm3
867 ; ALL-NEXT:    vpinsrb $1, %eax, %xmm3, %xmm3
868 ; ALL-NEXT:    vpextrb $2, %xmm2, %eax
869 ; ALL-NEXT:    tzcntl %eax, %eax
870 ; ALL-NEXT:    vpinsrb $2, %eax, %xmm3, %xmm3
871 ; ALL-NEXT:    vpextrb $3, %xmm2, %eax
872 ; ALL-NEXT:    tzcntl %eax, %eax
873 ; ALL-NEXT:    vpinsrb $3, %eax, %xmm3, %xmm3
874 ; ALL-NEXT:    vpextrb $4, %xmm2, %eax
875 ; ALL-NEXT:    tzcntl %eax, %eax
876 ; ALL-NEXT:    vpinsrb $4, %eax, %xmm3, %xmm3
877 ; ALL-NEXT:    vpextrb $5, %xmm2, %eax
878 ; ALL-NEXT:    tzcntl %eax, %eax
879 ; ALL-NEXT:    vpinsrb $5, %eax, %xmm3, %xmm3
880 ; ALL-NEXT:    vpextrb $6, %xmm2, %eax
881 ; ALL-NEXT:    tzcntl %eax, %eax
882 ; ALL-NEXT:    vpinsrb $6, %eax, %xmm3, %xmm3
883 ; ALL-NEXT:    vpextrb $7, %xmm2, %eax
884 ; ALL-NEXT:    tzcntl %eax, %eax
885 ; ALL-NEXT:    vpinsrb $7, %eax, %xmm3, %xmm3
886 ; ALL-NEXT:    vpextrb $8, %xmm2, %eax
887 ; ALL-NEXT:    tzcntl %eax, %eax
888 ; ALL-NEXT:    vpinsrb $8, %eax, %xmm3, %xmm3
889 ; ALL-NEXT:    vpextrb $9, %xmm2, %eax
890 ; ALL-NEXT:    tzcntl %eax, %eax
891 ; ALL-NEXT:    vpinsrb $9, %eax, %xmm3, %xmm3
892 ; ALL-NEXT:    vpextrb $10, %xmm2, %eax
893 ; ALL-NEXT:    tzcntl %eax, %eax
894 ; ALL-NEXT:    vpinsrb $10, %eax, %xmm3, %xmm3
895 ; ALL-NEXT:    vpextrb $11, %xmm2, %eax
896 ; ALL-NEXT:    tzcntl %eax, %eax
897 ; ALL-NEXT:    vpinsrb $11, %eax, %xmm3, %xmm3
898 ; ALL-NEXT:    vpextrb $12, %xmm2, %eax
899 ; ALL-NEXT:    tzcntl %eax, %eax
900 ; ALL-NEXT:    vpinsrb $12, %eax, %xmm3, %xmm3
901 ; ALL-NEXT:    vpextrb $13, %xmm2, %eax
902 ; ALL-NEXT:    tzcntl %eax, %eax
903 ; ALL-NEXT:    vpinsrb $13, %eax, %xmm3, %xmm3
904 ; ALL-NEXT:    vpextrb $14, %xmm2, %eax
905 ; ALL-NEXT:    tzcntl %eax, %eax
906 ; ALL-NEXT:    vpinsrb $14, %eax, %xmm3, %xmm3
907 ; ALL-NEXT:    vpextrb $15, %xmm2, %eax
908 ; ALL-NEXT:    tzcntl %eax, %eax
909 ; ALL-NEXT:    vpinsrb $15, %eax, %xmm3, %xmm2
910 ; ALL-NEXT:    vpextrb $1, %xmm1, %eax
911 ; ALL-NEXT:    tzcntl %eax, %eax
912 ; ALL-NEXT:    vpextrb $0, %xmm1, %ecx
913 ; ALL-NEXT:    tzcntl %ecx, %ecx
914 ; ALL-NEXT:    vmovd %ecx, %xmm3
915 ; ALL-NEXT:    vpinsrb $1, %eax, %xmm3, %xmm3
916 ; ALL-NEXT:    vpextrb $2, %xmm1, %eax
917 ; ALL-NEXT:    tzcntl %eax, %eax
918 ; ALL-NEXT:    vpinsrb $2, %eax, %xmm3, %xmm3
919 ; ALL-NEXT:    vpextrb $3, %xmm1, %eax
920 ; ALL-NEXT:    tzcntl %eax, %eax
921 ; ALL-NEXT:    vpinsrb $3, %eax, %xmm3, %xmm3
922 ; ALL-NEXT:    vpextrb $4, %xmm1, %eax
923 ; ALL-NEXT:    tzcntl %eax, %eax
924 ; ALL-NEXT:    vpinsrb $4, %eax, %xmm3, %xmm3
925 ; ALL-NEXT:    vpextrb $5, %xmm1, %eax
926 ; ALL-NEXT:    tzcntl %eax, %eax
927 ; ALL-NEXT:    vpinsrb $5, %eax, %xmm3, %xmm3
928 ; ALL-NEXT:    vpextrb $6, %xmm1, %eax
929 ; ALL-NEXT:    tzcntl %eax, %eax
930 ; ALL-NEXT:    vpinsrb $6, %eax, %xmm3, %xmm3
931 ; ALL-NEXT:    vpextrb $7, %xmm1, %eax
932 ; ALL-NEXT:    tzcntl %eax, %eax
933 ; ALL-NEXT:    vpinsrb $7, %eax, %xmm3, %xmm3
934 ; ALL-NEXT:    vpextrb $8, %xmm1, %eax
935 ; ALL-NEXT:    tzcntl %eax, %eax
936 ; ALL-NEXT:    vpinsrb $8, %eax, %xmm3, %xmm3
937 ; ALL-NEXT:    vpextrb $9, %xmm1, %eax
938 ; ALL-NEXT:    tzcntl %eax, %eax
939 ; ALL-NEXT:    vpinsrb $9, %eax, %xmm3, %xmm3
940 ; ALL-NEXT:    vpextrb $10, %xmm1, %eax
941 ; ALL-NEXT:    tzcntl %eax, %eax
942 ; ALL-NEXT:    vpinsrb $10, %eax, %xmm3, %xmm3
943 ; ALL-NEXT:    vpextrb $11, %xmm1, %eax
944 ; ALL-NEXT:    tzcntl %eax, %eax
945 ; ALL-NEXT:    vpinsrb $11, %eax, %xmm3, %xmm3
946 ; ALL-NEXT:    vpextrb $12, %xmm1, %eax
947 ; ALL-NEXT:    tzcntl %eax, %eax
948 ; ALL-NEXT:    vpinsrb $12, %eax, %xmm3, %xmm3
949 ; ALL-NEXT:    vpextrb $13, %xmm1, %eax
950 ; ALL-NEXT:    tzcntl %eax, %eax
951 ; ALL-NEXT:    vpinsrb $13, %eax, %xmm3, %xmm3
952 ; ALL-NEXT:    vpextrb $14, %xmm1, %eax
953 ; ALL-NEXT:    tzcntl %eax, %eax
954 ; ALL-NEXT:    vpinsrb $14, %eax, %xmm3, %xmm3
955 ; ALL-NEXT:    vpextrb $15, %xmm1, %eax
956 ; ALL-NEXT:    tzcntl %eax, %eax
957 ; ALL-NEXT:    vpinsrb $15, %eax, %xmm3, %xmm1
958 ; ALL-NEXT:    vinserti128 $1, %xmm2, %ymm1, %ymm1
959 ; ALL-NEXT:    retq
960   %out = call <64 x i8> @llvm.cttz.v64i8(<64 x i8> %in, i1 -1)
961   ret <64 x i8> %out
962 }
963
964 declare <8 x i64> @llvm.cttz.v8i64(<8 x i64>, i1)
965 declare <16 x i32> @llvm.cttz.v16i32(<16 x i32>, i1)
966 declare <32 x i16> @llvm.cttz.v32i16(<32 x i16>, i1)
967 declare <64 x i8> @llvm.cttz.v64i8(<64 x i8>, i1)