1 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2
3 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=knl -mattr=+avx512cd -mattr=+avx512vl| FileCheck %s --check-prefix=AVX512VLCD --check-prefix=ALL --check-prefix=AVX512
4 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=knl -mattr=+avx512cd | FileCheck %s --check-prefix=AVX512CD --check-prefix=ALL --check-prefix=AVX512
6 define <4 x i64> @testv4i64(<4 x i64> %in) nounwind {
7 ; AVX1-LABEL: testv4i64:
9 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
10 ; AVX1-NEXT: vpextrq $1, %xmm1, %rax
11 ; AVX1-NEXT: bsrq %rax, %rax
12 ; AVX1-NEXT: movl $127, %ecx
13 ; AVX1-NEXT: cmoveq %rcx, %rax
14 ; AVX1-NEXT: xorq $63, %rax
15 ; AVX1-NEXT: vmovq %rax, %xmm2
16 ; AVX1-NEXT: vmovq %xmm1, %rax
17 ; AVX1-NEXT: bsrq %rax, %rax
18 ; AVX1-NEXT: cmoveq %rcx, %rax
19 ; AVX1-NEXT: xorq $63, %rax
20 ; AVX1-NEXT: vmovq %rax, %xmm1
21 ; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
22 ; AVX1-NEXT: vpextrq $1, %xmm0, %rax
23 ; AVX1-NEXT: bsrq %rax, %rax
24 ; AVX1-NEXT: cmoveq %rcx, %rax
25 ; AVX1-NEXT: xorq $63, %rax
26 ; AVX1-NEXT: vmovq %rax, %xmm2
27 ; AVX1-NEXT: vmovq %xmm0, %rax
28 ; AVX1-NEXT: bsrq %rax, %rax
29 ; AVX1-NEXT: cmoveq %rcx, %rax
30 ; AVX1-NEXT: xorq $63, %rax
31 ; AVX1-NEXT: vmovq %rax, %xmm0
32 ; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
33 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
36 ; AVX2-LABEL: testv4i64:
38 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
39 ; AVX2-NEXT: vpextrq $1, %xmm1, %rax
40 ; AVX2-NEXT: bsrq %rax, %rax
41 ; AVX2-NEXT: movl $127, %ecx
42 ; AVX2-NEXT: cmoveq %rcx, %rax
43 ; AVX2-NEXT: xorq $63, %rax
44 ; AVX2-NEXT: vmovq %rax, %xmm2
45 ; AVX2-NEXT: vmovq %xmm1, %rax
46 ; AVX2-NEXT: bsrq %rax, %rax
47 ; AVX2-NEXT: cmoveq %rcx, %rax
48 ; AVX2-NEXT: xorq $63, %rax
49 ; AVX2-NEXT: vmovq %rax, %xmm1
50 ; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
51 ; AVX2-NEXT: vpextrq $1, %xmm0, %rax
52 ; AVX2-NEXT: bsrq %rax, %rax
53 ; AVX2-NEXT: cmoveq %rcx, %rax
54 ; AVX2-NEXT: xorq $63, %rax
55 ; AVX2-NEXT: vmovq %rax, %xmm2
56 ; AVX2-NEXT: vmovq %xmm0, %rax
57 ; AVX2-NEXT: bsrq %rax, %rax
58 ; AVX2-NEXT: cmoveq %rcx, %rax
59 ; AVX2-NEXT: xorq $63, %rax
60 ; AVX2-NEXT: vmovq %rax, %xmm0
61 ; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
62 ; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
65 ; AVX512VLCD-LABEL: testv4i64:
66 ; AVX512VLCD: ## BB#0:
67 ; AVX512VLCD-NEXT: vplzcntq %ymm0, %ymm0
68 ; AVX512VLCD-NEXT: retq
70 ; AVX512CD-LABEL: testv4i64:
72 ; AVX512CD-NEXT: vplzcntq %zmm0, %zmm0
75 %out = call <4 x i64> @llvm.ctlz.v4i64(<4 x i64> %in, i1 0)
79 define <4 x i64> @testv4i64u(<4 x i64> %in) nounwind {
80 ; AVX1-LABEL: testv4i64u:
82 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
83 ; AVX1-NEXT: vpextrq $1, %xmm1, %rax
84 ; AVX1-NEXT: bsrq %rax, %rax
85 ; AVX1-NEXT: xorq $63, %rax
86 ; AVX1-NEXT: vmovq %rax, %xmm2
87 ; AVX1-NEXT: vmovq %xmm1, %rax
88 ; AVX1-NEXT: bsrq %rax, %rax
89 ; AVX1-NEXT: xorq $63, %rax
90 ; AVX1-NEXT: vmovq %rax, %xmm1
91 ; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
92 ; AVX1-NEXT: vpextrq $1, %xmm0, %rax
93 ; AVX1-NEXT: bsrq %rax, %rax
94 ; AVX1-NEXT: xorq $63, %rax
95 ; AVX1-NEXT: vmovq %rax, %xmm2
96 ; AVX1-NEXT: vmovq %xmm0, %rax
97 ; AVX1-NEXT: bsrq %rax, %rax
98 ; AVX1-NEXT: xorq $63, %rax
99 ; AVX1-NEXT: vmovq %rax, %xmm0
100 ; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
101 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
104 ; AVX2-LABEL: testv4i64u:
106 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
107 ; AVX2-NEXT: vpextrq $1, %xmm1, %rax
108 ; AVX2-NEXT: bsrq %rax, %rax
109 ; AVX2-NEXT: xorq $63, %rax
110 ; AVX2-NEXT: vmovq %rax, %xmm2
111 ; AVX2-NEXT: vmovq %xmm1, %rax
112 ; AVX2-NEXT: bsrq %rax, %rax
113 ; AVX2-NEXT: xorq $63, %rax
114 ; AVX2-NEXT: vmovq %rax, %xmm1
115 ; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
116 ; AVX2-NEXT: vpextrq $1, %xmm0, %rax
117 ; AVX2-NEXT: bsrq %rax, %rax
118 ; AVX2-NEXT: xorq $63, %rax
119 ; AVX2-NEXT: vmovq %rax, %xmm2
120 ; AVX2-NEXT: vmovq %xmm0, %rax
121 ; AVX2-NEXT: bsrq %rax, %rax
122 ; AVX2-NEXT: xorq $63, %rax
123 ; AVX2-NEXT: vmovq %rax, %xmm0
124 ; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
125 ; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
128 ; AVX512VLCD-LABEL: testv4i64u:
129 ; AVX512VLCD: ## BB#0:
130 ; AVX512VLCD-NEXT: vplzcntq %ymm0, %ymm0
131 ; AVX512VLCD-NEXT: retq
133 ; AVX512CD-LABEL: testv4i64u:
135 ; AVX512CD-NEXT: vplzcntq %zmm0, %zmm0
136 ; AVX512CD-NEXT: retq
138 %out = call <4 x i64> @llvm.ctlz.v4i64(<4 x i64> %in, i1 -1)
142 define <8 x i32> @testv8i32(<8 x i32> %in) nounwind {
143 ; AVX1-LABEL: testv8i32:
145 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
146 ; AVX1-NEXT: vpextrd $1, %xmm1, %eax
147 ; AVX1-NEXT: bsrl %eax, %ecx
148 ; AVX1-NEXT: movl $63, %eax
149 ; AVX1-NEXT: cmovel %eax, %ecx
150 ; AVX1-NEXT: xorl $31, %ecx
151 ; AVX1-NEXT: vmovd %xmm1, %edx
152 ; AVX1-NEXT: bsrl %edx, %edx
153 ; AVX1-NEXT: cmovel %eax, %edx
154 ; AVX1-NEXT: xorl $31, %edx
155 ; AVX1-NEXT: vmovd %edx, %xmm2
156 ; AVX1-NEXT: vpinsrd $1, %ecx, %xmm2, %xmm2
157 ; AVX1-NEXT: vpextrd $2, %xmm1, %ecx
158 ; AVX1-NEXT: bsrl %ecx, %ecx
159 ; AVX1-NEXT: cmovel %eax, %ecx
160 ; AVX1-NEXT: xorl $31, %ecx
161 ; AVX1-NEXT: vpinsrd $2, %ecx, %xmm2, %xmm2
162 ; AVX1-NEXT: vpextrd $3, %xmm1, %ecx
163 ; AVX1-NEXT: bsrl %ecx, %ecx
164 ; AVX1-NEXT: cmovel %eax, %ecx
165 ; AVX1-NEXT: xorl $31, %ecx
166 ; AVX1-NEXT: vpinsrd $3, %ecx, %xmm2, %xmm1
167 ; AVX1-NEXT: vpextrd $1, %xmm0, %ecx
168 ; AVX1-NEXT: bsrl %ecx, %ecx
169 ; AVX1-NEXT: cmovel %eax, %ecx
170 ; AVX1-NEXT: xorl $31, %ecx
171 ; AVX1-NEXT: vmovd %xmm0, %edx
172 ; AVX1-NEXT: bsrl %edx, %edx
173 ; AVX1-NEXT: cmovel %eax, %edx
174 ; AVX1-NEXT: xorl $31, %edx
175 ; AVX1-NEXT: vmovd %edx, %xmm2
176 ; AVX1-NEXT: vpinsrd $1, %ecx, %xmm2, %xmm2
177 ; AVX1-NEXT: vpextrd $2, %xmm0, %ecx
178 ; AVX1-NEXT: bsrl %ecx, %ecx
179 ; AVX1-NEXT: cmovel %eax, %ecx
180 ; AVX1-NEXT: xorl $31, %ecx
181 ; AVX1-NEXT: vpinsrd $2, %ecx, %xmm2, %xmm2
182 ; AVX1-NEXT: vpextrd $3, %xmm0, %ecx
183 ; AVX1-NEXT: bsrl %ecx, %ecx
184 ; AVX1-NEXT: cmovel %eax, %ecx
185 ; AVX1-NEXT: xorl $31, %ecx
186 ; AVX1-NEXT: vpinsrd $3, %ecx, %xmm2, %xmm0
187 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
190 ; AVX2-LABEL: testv8i32:
192 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
193 ; AVX2-NEXT: vpextrd $1, %xmm1, %eax
194 ; AVX2-NEXT: bsrl %eax, %ecx
195 ; AVX2-NEXT: movl $63, %eax
196 ; AVX2-NEXT: cmovel %eax, %ecx
197 ; AVX2-NEXT: xorl $31, %ecx
198 ; AVX2-NEXT: vmovd %xmm1, %edx
199 ; AVX2-NEXT: bsrl %edx, %edx
200 ; AVX2-NEXT: cmovel %eax, %edx
201 ; AVX2-NEXT: xorl $31, %edx
202 ; AVX2-NEXT: vmovd %edx, %xmm2
203 ; AVX2-NEXT: vpinsrd $1, %ecx, %xmm2, %xmm2
204 ; AVX2-NEXT: vpextrd $2, %xmm1, %ecx
205 ; AVX2-NEXT: bsrl %ecx, %ecx
206 ; AVX2-NEXT: cmovel %eax, %ecx
207 ; AVX2-NEXT: xorl $31, %ecx
208 ; AVX2-NEXT: vpinsrd $2, %ecx, %xmm2, %xmm2
209 ; AVX2-NEXT: vpextrd $3, %xmm1, %ecx
210 ; AVX2-NEXT: bsrl %ecx, %ecx
211 ; AVX2-NEXT: cmovel %eax, %ecx
212 ; AVX2-NEXT: xorl $31, %ecx
213 ; AVX2-NEXT: vpinsrd $3, %ecx, %xmm2, %xmm1
214 ; AVX2-NEXT: vpextrd $1, %xmm0, %ecx
215 ; AVX2-NEXT: bsrl %ecx, %ecx
216 ; AVX2-NEXT: cmovel %eax, %ecx
217 ; AVX2-NEXT: xorl $31, %ecx
218 ; AVX2-NEXT: vmovd %xmm0, %edx
219 ; AVX2-NEXT: bsrl %edx, %edx
220 ; AVX2-NEXT: cmovel %eax, %edx
221 ; AVX2-NEXT: xorl $31, %edx
222 ; AVX2-NEXT: vmovd %edx, %xmm2
223 ; AVX2-NEXT: vpinsrd $1, %ecx, %xmm2, %xmm2
224 ; AVX2-NEXT: vpextrd $2, %xmm0, %ecx
225 ; AVX2-NEXT: bsrl %ecx, %ecx
226 ; AVX2-NEXT: cmovel %eax, %ecx
227 ; AVX2-NEXT: xorl $31, %ecx
228 ; AVX2-NEXT: vpinsrd $2, %ecx, %xmm2, %xmm2
229 ; AVX2-NEXT: vpextrd $3, %xmm0, %ecx
230 ; AVX2-NEXT: bsrl %ecx, %ecx
231 ; AVX2-NEXT: cmovel %eax, %ecx
232 ; AVX2-NEXT: xorl $31, %ecx
233 ; AVX2-NEXT: vpinsrd $3, %ecx, %xmm2, %xmm0
234 ; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
237 ; AVX512VLCD-LABEL: testv8i32:
238 ; AVX512VLCD: ## BB#0:
239 ; AVX512VLCD-NEXT: vplzcntd %ymm0, %ymm0
240 ; AVX512VLCD-NEXT: retq
242 ; AVX512CD-LABEL: testv8i32:
244 ; AVX512CD-NEXT: vplzcntd %zmm0, %zmm0
245 ; AVX512CD-NEXT: retq
247 %out = call <8 x i32> @llvm.ctlz.v8i32(<8 x i32> %in, i1 0)
251 define <8 x i32> @testv8i32u(<8 x i32> %in) nounwind {
252 ; AVX1-LABEL: testv8i32u:
254 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
255 ; AVX1-NEXT: vpextrd $1, %xmm1, %eax
256 ; AVX1-NEXT: bsrl %eax, %eax
257 ; AVX1-NEXT: xorl $31, %eax
258 ; AVX1-NEXT: vmovd %xmm1, %ecx
259 ; AVX1-NEXT: bsrl %ecx, %ecx
260 ; AVX1-NEXT: xorl $31, %ecx
261 ; AVX1-NEXT: vmovd %ecx, %xmm2
262 ; AVX1-NEXT: vpinsrd $1, %eax, %xmm2, %xmm2
263 ; AVX1-NEXT: vpextrd $2, %xmm1, %eax
264 ; AVX1-NEXT: bsrl %eax, %eax
265 ; AVX1-NEXT: xorl $31, %eax
266 ; AVX1-NEXT: vpinsrd $2, %eax, %xmm2, %xmm2
267 ; AVX1-NEXT: vpextrd $3, %xmm1, %eax
268 ; AVX1-NEXT: bsrl %eax, %eax
269 ; AVX1-NEXT: xorl $31, %eax
270 ; AVX1-NEXT: vpinsrd $3, %eax, %xmm2, %xmm1
271 ; AVX1-NEXT: vpextrd $1, %xmm0, %eax
272 ; AVX1-NEXT: bsrl %eax, %eax
273 ; AVX1-NEXT: xorl $31, %eax
274 ; AVX1-NEXT: vmovd %xmm0, %ecx
275 ; AVX1-NEXT: bsrl %ecx, %ecx
276 ; AVX1-NEXT: xorl $31, %ecx
277 ; AVX1-NEXT: vmovd %ecx, %xmm2
278 ; AVX1-NEXT: vpinsrd $1, %eax, %xmm2, %xmm2
279 ; AVX1-NEXT: vpextrd $2, %xmm0, %eax
280 ; AVX1-NEXT: bsrl %eax, %eax
281 ; AVX1-NEXT: xorl $31, %eax
282 ; AVX1-NEXT: vpinsrd $2, %eax, %xmm2, %xmm2
283 ; AVX1-NEXT: vpextrd $3, %xmm0, %eax
284 ; AVX1-NEXT: bsrl %eax, %eax
285 ; AVX1-NEXT: xorl $31, %eax
286 ; AVX1-NEXT: vpinsrd $3, %eax, %xmm2, %xmm0
287 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
290 ; AVX2-LABEL: testv8i32u:
292 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
293 ; AVX2-NEXT: vpextrd $1, %xmm1, %eax
294 ; AVX2-NEXT: bsrl %eax, %eax
295 ; AVX2-NEXT: xorl $31, %eax
296 ; AVX2-NEXT: vmovd %xmm1, %ecx
297 ; AVX2-NEXT: bsrl %ecx, %ecx
298 ; AVX2-NEXT: xorl $31, %ecx
299 ; AVX2-NEXT: vmovd %ecx, %xmm2
300 ; AVX2-NEXT: vpinsrd $1, %eax, %xmm2, %xmm2
301 ; AVX2-NEXT: vpextrd $2, %xmm1, %eax
302 ; AVX2-NEXT: bsrl %eax, %eax
303 ; AVX2-NEXT: xorl $31, %eax
304 ; AVX2-NEXT: vpinsrd $2, %eax, %xmm2, %xmm2
305 ; AVX2-NEXT: vpextrd $3, %xmm1, %eax
306 ; AVX2-NEXT: bsrl %eax, %eax
307 ; AVX2-NEXT: xorl $31, %eax
308 ; AVX2-NEXT: vpinsrd $3, %eax, %xmm2, %xmm1
309 ; AVX2-NEXT: vpextrd $1, %xmm0, %eax
310 ; AVX2-NEXT: bsrl %eax, %eax
311 ; AVX2-NEXT: xorl $31, %eax
312 ; AVX2-NEXT: vmovd %xmm0, %ecx
313 ; AVX2-NEXT: bsrl %ecx, %ecx
314 ; AVX2-NEXT: xorl $31, %ecx
315 ; AVX2-NEXT: vmovd %ecx, %xmm2
316 ; AVX2-NEXT: vpinsrd $1, %eax, %xmm2, %xmm2
317 ; AVX2-NEXT: vpextrd $2, %xmm0, %eax
318 ; AVX2-NEXT: bsrl %eax, %eax
319 ; AVX2-NEXT: xorl $31, %eax
320 ; AVX2-NEXT: vpinsrd $2, %eax, %xmm2, %xmm2
321 ; AVX2-NEXT: vpextrd $3, %xmm0, %eax
322 ; AVX2-NEXT: bsrl %eax, %eax
323 ; AVX2-NEXT: xorl $31, %eax
324 ; AVX2-NEXT: vpinsrd $3, %eax, %xmm2, %xmm0
325 ; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
328 ; AVX512VLCD-LABEL: testv8i32u:
329 ; AVX512VLCD: ## BB#0:
330 ; AVX512VLCD-NEXT: vplzcntd %ymm0, %ymm0
331 ; AVX512VLCD-NEXT: retq
333 ; AVX512CD-LABEL: testv8i32u:
335 ; AVX512CD-NEXT: vplzcntd %zmm0, %zmm0
336 ; AVX512CD-NEXT: retq
338 %out = call <8 x i32> @llvm.ctlz.v8i32(<8 x i32> %in, i1 -1)
342 define <16 x i16> @testv16i16(<16 x i16> %in) nounwind {
343 ; AVX1-LABEL: testv16i16:
345 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
346 ; AVX1-NEXT: vpextrw $1, %xmm1, %eax
347 ; AVX1-NEXT: bsrw %ax, %cx
348 ; AVX1-NEXT: movw $31, %ax
349 ; AVX1-NEXT: cmovew %ax, %cx
350 ; AVX1-NEXT: xorl $15, %ecx
351 ; AVX1-NEXT: vmovd %xmm1, %edx
352 ; AVX1-NEXT: bsrw %dx, %dx
353 ; AVX1-NEXT: cmovew %ax, %dx
354 ; AVX1-NEXT: xorl $15, %edx
355 ; AVX1-NEXT: vmovd %edx, %xmm2
356 ; AVX1-NEXT: vpinsrw $1, %ecx, %xmm2, %xmm2
357 ; AVX1-NEXT: vpextrw $2, %xmm1, %ecx
358 ; AVX1-NEXT: bsrw %cx, %cx
359 ; AVX1-NEXT: cmovew %ax, %cx
360 ; AVX1-NEXT: xorl $15, %ecx
361 ; AVX1-NEXT: vpinsrw $2, %ecx, %xmm2, %xmm2
362 ; AVX1-NEXT: vpextrw $3, %xmm1, %ecx
363 ; AVX1-NEXT: bsrw %cx, %cx
364 ; AVX1-NEXT: cmovew %ax, %cx
365 ; AVX1-NEXT: xorl $15, %ecx
366 ; AVX1-NEXT: vpinsrw $3, %ecx, %xmm2, %xmm2
367 ; AVX1-NEXT: vpextrw $4, %xmm1, %ecx
368 ; AVX1-NEXT: bsrw %cx, %cx
369 ; AVX1-NEXT: cmovew %ax, %cx
370 ; AVX1-NEXT: xorl $15, %ecx
371 ; AVX1-NEXT: vpinsrw $4, %ecx, %xmm2, %xmm2
372 ; AVX1-NEXT: vpextrw $5, %xmm1, %ecx
373 ; AVX1-NEXT: bsrw %cx, %cx
374 ; AVX1-NEXT: cmovew %ax, %cx
375 ; AVX1-NEXT: xorl $15, %ecx
376 ; AVX1-NEXT: vpinsrw $5, %ecx, %xmm2, %xmm2
377 ; AVX1-NEXT: vpextrw $6, %xmm1, %ecx
378 ; AVX1-NEXT: bsrw %cx, %cx
379 ; AVX1-NEXT: cmovew %ax, %cx
380 ; AVX1-NEXT: xorl $15, %ecx
381 ; AVX1-NEXT: vpinsrw $6, %ecx, %xmm2, %xmm2
382 ; AVX1-NEXT: vpextrw $7, %xmm1, %ecx
383 ; AVX1-NEXT: bsrw %cx, %cx
384 ; AVX1-NEXT: cmovew %ax, %cx
385 ; AVX1-NEXT: xorl $15, %ecx
386 ; AVX1-NEXT: vpinsrw $7, %ecx, %xmm2, %xmm1
387 ; AVX1-NEXT: vpextrw $1, %xmm0, %ecx
388 ; AVX1-NEXT: bsrw %cx, %cx
389 ; AVX1-NEXT: cmovew %ax, %cx
390 ; AVX1-NEXT: xorl $15, %ecx
391 ; AVX1-NEXT: vmovd %xmm0, %edx
392 ; AVX1-NEXT: bsrw %dx, %dx
393 ; AVX1-NEXT: cmovew %ax, %dx
394 ; AVX1-NEXT: xorl $15, %edx
395 ; AVX1-NEXT: vmovd %edx, %xmm2
396 ; AVX1-NEXT: vpinsrw $1, %ecx, %xmm2, %xmm2
397 ; AVX1-NEXT: vpextrw $2, %xmm0, %ecx
398 ; AVX1-NEXT: bsrw %cx, %cx
399 ; AVX1-NEXT: cmovew %ax, %cx
400 ; AVX1-NEXT: xorl $15, %ecx
401 ; AVX1-NEXT: vpinsrw $2, %ecx, %xmm2, %xmm2
402 ; AVX1-NEXT: vpextrw $3, %xmm0, %ecx
403 ; AVX1-NEXT: bsrw %cx, %cx
404 ; AVX1-NEXT: cmovew %ax, %cx
405 ; AVX1-NEXT: xorl $15, %ecx
406 ; AVX1-NEXT: vpinsrw $3, %ecx, %xmm2, %xmm2
407 ; AVX1-NEXT: vpextrw $4, %xmm0, %ecx
408 ; AVX1-NEXT: bsrw %cx, %cx
409 ; AVX1-NEXT: cmovew %ax, %cx
410 ; AVX1-NEXT: xorl $15, %ecx
411 ; AVX1-NEXT: vpinsrw $4, %ecx, %xmm2, %xmm2
412 ; AVX1-NEXT: vpextrw $5, %xmm0, %ecx
413 ; AVX1-NEXT: bsrw %cx, %cx
414 ; AVX1-NEXT: cmovew %ax, %cx
415 ; AVX1-NEXT: xorl $15, %ecx
416 ; AVX1-NEXT: vpinsrw $5, %ecx, %xmm2, %xmm2
417 ; AVX1-NEXT: vpextrw $6, %xmm0, %ecx
418 ; AVX1-NEXT: bsrw %cx, %cx
419 ; AVX1-NEXT: cmovew %ax, %cx
420 ; AVX1-NEXT: xorl $15, %ecx
421 ; AVX1-NEXT: vpinsrw $6, %ecx, %xmm2, %xmm2
422 ; AVX1-NEXT: vpextrw $7, %xmm0, %ecx
423 ; AVX1-NEXT: bsrw %cx, %cx
424 ; AVX1-NEXT: cmovew %ax, %cx
425 ; AVX1-NEXT: xorl $15, %ecx
426 ; AVX1-NEXT: vpinsrw $7, %ecx, %xmm2, %xmm0
427 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
430 ; AVX2-LABEL: testv16i16:
432 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
433 ; AVX2-NEXT: vpextrw $1, %xmm1, %eax
434 ; AVX2-NEXT: bsrw %ax, %cx
435 ; AVX2-NEXT: movw $31, %ax
436 ; AVX2-NEXT: cmovew %ax, %cx
437 ; AVX2-NEXT: xorl $15, %ecx
438 ; AVX2-NEXT: vmovd %xmm1, %edx
439 ; AVX2-NEXT: bsrw %dx, %dx
440 ; AVX2-NEXT: cmovew %ax, %dx
441 ; AVX2-NEXT: xorl $15, %edx
442 ; AVX2-NEXT: vmovd %edx, %xmm2
443 ; AVX2-NEXT: vpinsrw $1, %ecx, %xmm2, %xmm2
444 ; AVX2-NEXT: vpextrw $2, %xmm1, %ecx
445 ; AVX2-NEXT: bsrw %cx, %cx
446 ; AVX2-NEXT: cmovew %ax, %cx
447 ; AVX2-NEXT: xorl $15, %ecx
448 ; AVX2-NEXT: vpinsrw $2, %ecx, %xmm2, %xmm2
449 ; AVX2-NEXT: vpextrw $3, %xmm1, %ecx
450 ; AVX2-NEXT: bsrw %cx, %cx
451 ; AVX2-NEXT: cmovew %ax, %cx
452 ; AVX2-NEXT: xorl $15, %ecx
453 ; AVX2-NEXT: vpinsrw $3, %ecx, %xmm2, %xmm2
454 ; AVX2-NEXT: vpextrw $4, %xmm1, %ecx
455 ; AVX2-NEXT: bsrw %cx, %cx
456 ; AVX2-NEXT: cmovew %ax, %cx
457 ; AVX2-NEXT: xorl $15, %ecx
458 ; AVX2-NEXT: vpinsrw $4, %ecx, %xmm2, %xmm2
459 ; AVX2-NEXT: vpextrw $5, %xmm1, %ecx
460 ; AVX2-NEXT: bsrw %cx, %cx
461 ; AVX2-NEXT: cmovew %ax, %cx
462 ; AVX2-NEXT: xorl $15, %ecx
463 ; AVX2-NEXT: vpinsrw $5, %ecx, %xmm2, %xmm2
464 ; AVX2-NEXT: vpextrw $6, %xmm1, %ecx
465 ; AVX2-NEXT: bsrw %cx, %cx
466 ; AVX2-NEXT: cmovew %ax, %cx
467 ; AVX2-NEXT: xorl $15, %ecx
468 ; AVX2-NEXT: vpinsrw $6, %ecx, %xmm2, %xmm2
469 ; AVX2-NEXT: vpextrw $7, %xmm1, %ecx
470 ; AVX2-NEXT: bsrw %cx, %cx
471 ; AVX2-NEXT: cmovew %ax, %cx
472 ; AVX2-NEXT: xorl $15, %ecx
473 ; AVX2-NEXT: vpinsrw $7, %ecx, %xmm2, %xmm1
474 ; AVX2-NEXT: vpextrw $1, %xmm0, %ecx
475 ; AVX2-NEXT: bsrw %cx, %cx
476 ; AVX2-NEXT: cmovew %ax, %cx
477 ; AVX2-NEXT: xorl $15, %ecx
478 ; AVX2-NEXT: vmovd %xmm0, %edx
479 ; AVX2-NEXT: bsrw %dx, %dx
480 ; AVX2-NEXT: cmovew %ax, %dx
481 ; AVX2-NEXT: xorl $15, %edx
482 ; AVX2-NEXT: vmovd %edx, %xmm2
483 ; AVX2-NEXT: vpinsrw $1, %ecx, %xmm2, %xmm2
484 ; AVX2-NEXT: vpextrw $2, %xmm0, %ecx
485 ; AVX2-NEXT: bsrw %cx, %cx
486 ; AVX2-NEXT: cmovew %ax, %cx
487 ; AVX2-NEXT: xorl $15, %ecx
488 ; AVX2-NEXT: vpinsrw $2, %ecx, %xmm2, %xmm2
489 ; AVX2-NEXT: vpextrw $3, %xmm0, %ecx
490 ; AVX2-NEXT: bsrw %cx, %cx
491 ; AVX2-NEXT: cmovew %ax, %cx
492 ; AVX2-NEXT: xorl $15, %ecx
493 ; AVX2-NEXT: vpinsrw $3, %ecx, %xmm2, %xmm2
494 ; AVX2-NEXT: vpextrw $4, %xmm0, %ecx
495 ; AVX2-NEXT: bsrw %cx, %cx
496 ; AVX2-NEXT: cmovew %ax, %cx
497 ; AVX2-NEXT: xorl $15, %ecx
498 ; AVX2-NEXT: vpinsrw $4, %ecx, %xmm2, %xmm2
499 ; AVX2-NEXT: vpextrw $5, %xmm0, %ecx
500 ; AVX2-NEXT: bsrw %cx, %cx
501 ; AVX2-NEXT: cmovew %ax, %cx
502 ; AVX2-NEXT: xorl $15, %ecx
503 ; AVX2-NEXT: vpinsrw $5, %ecx, %xmm2, %xmm2
504 ; AVX2-NEXT: vpextrw $6, %xmm0, %ecx
505 ; AVX2-NEXT: bsrw %cx, %cx
506 ; AVX2-NEXT: cmovew %ax, %cx
507 ; AVX2-NEXT: xorl $15, %ecx
508 ; AVX2-NEXT: vpinsrw $6, %ecx, %xmm2, %xmm2
509 ; AVX2-NEXT: vpextrw $7, %xmm0, %ecx
510 ; AVX2-NEXT: bsrw %cx, %cx
511 ; AVX2-NEXT: cmovew %ax, %cx
512 ; AVX2-NEXT: xorl $15, %ecx
513 ; AVX2-NEXT: vpinsrw $7, %ecx, %xmm2, %xmm0
514 ; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
517 ; AVX512VLCD-LABEL: testv16i16:
518 ; AVX512VLCD: ## BB#0:
519 ; AVX512VLCD-NEXT: vpmovzxwd %ymm0, %zmm0
520 ; AVX512VLCD-NEXT: vplzcntd %zmm0, %zmm0
521 ; AVX512VLCD-NEXT: vpmovdw %zmm0, %ymm0
522 ; AVX512VLCD-NEXT: vpsubw {{.*}}(%rip), %ymm0, %ymm0
523 ; AVX512VLCD-NEXT: retq
525 ; AVX512CD-LABEL: testv16i16:
527 ; AVX512CD-NEXT: vpmovzxwd %ymm0, %zmm0
528 ; AVX512CD-NEXT: vplzcntd %zmm0, %zmm0
529 ; AVX512CD-NEXT: vpmovdw %zmm0, %ymm0
530 ; AVX512CD-NEXT: vpsubw {{.*}}(%rip), %ymm0, %ymm0
531 ; AVX512CD-NEXT: retq
532 %out = call <16 x i16> @llvm.ctlz.v16i16(<16 x i16> %in, i1 0)
536 define <16 x i16> @testv16i16u(<16 x i16> %in) nounwind {
537 ; AVX1-LABEL: testv16i16u:
539 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
540 ; AVX1-NEXT: vpextrw $1, %xmm1, %eax
541 ; AVX1-NEXT: bsrw %ax, %ax
542 ; AVX1-NEXT: xorl $15, %eax
543 ; AVX1-NEXT: vmovd %xmm1, %ecx
544 ; AVX1-NEXT: bsrw %cx, %cx
545 ; AVX1-NEXT: xorl $15, %ecx
546 ; AVX1-NEXT: vmovd %ecx, %xmm2
547 ; AVX1-NEXT: vpinsrw $1, %eax, %xmm2, %xmm2
548 ; AVX1-NEXT: vpextrw $2, %xmm1, %eax
549 ; AVX1-NEXT: bsrw %ax, %ax
550 ; AVX1-NEXT: xorl $15, %eax
551 ; AVX1-NEXT: vpinsrw $2, %eax, %xmm2, %xmm2
552 ; AVX1-NEXT: vpextrw $3, %xmm1, %eax
553 ; AVX1-NEXT: bsrw %ax, %ax
554 ; AVX1-NEXT: xorl $15, %eax
555 ; AVX1-NEXT: vpinsrw $3, %eax, %xmm2, %xmm2
556 ; AVX1-NEXT: vpextrw $4, %xmm1, %eax
557 ; AVX1-NEXT: bsrw %ax, %ax
558 ; AVX1-NEXT: xorl $15, %eax
559 ; AVX1-NEXT: vpinsrw $4, %eax, %xmm2, %xmm2
560 ; AVX1-NEXT: vpextrw $5, %xmm1, %eax
561 ; AVX1-NEXT: bsrw %ax, %ax
562 ; AVX1-NEXT: xorl $15, %eax
563 ; AVX1-NEXT: vpinsrw $5, %eax, %xmm2, %xmm2
564 ; AVX1-NEXT: vpextrw $6, %xmm1, %eax
565 ; AVX1-NEXT: bsrw %ax, %ax
566 ; AVX1-NEXT: xorl $15, %eax
567 ; AVX1-NEXT: vpinsrw $6, %eax, %xmm2, %xmm2
568 ; AVX1-NEXT: vpextrw $7, %xmm1, %eax
569 ; AVX1-NEXT: bsrw %ax, %ax
570 ; AVX1-NEXT: xorl $15, %eax
571 ; AVX1-NEXT: vpinsrw $7, %eax, %xmm2, %xmm1
572 ; AVX1-NEXT: vpextrw $1, %xmm0, %eax
573 ; AVX1-NEXT: bsrw %ax, %ax
574 ; AVX1-NEXT: xorl $15, %eax
575 ; AVX1-NEXT: vmovd %xmm0, %ecx
576 ; AVX1-NEXT: bsrw %cx, %cx
577 ; AVX1-NEXT: xorl $15, %ecx
578 ; AVX1-NEXT: vmovd %ecx, %xmm2
579 ; AVX1-NEXT: vpinsrw $1, %eax, %xmm2, %xmm2
580 ; AVX1-NEXT: vpextrw $2, %xmm0, %eax
581 ; AVX1-NEXT: bsrw %ax, %ax
582 ; AVX1-NEXT: xorl $15, %eax
583 ; AVX1-NEXT: vpinsrw $2, %eax, %xmm2, %xmm2
584 ; AVX1-NEXT: vpextrw $3, %xmm0, %eax
585 ; AVX1-NEXT: bsrw %ax, %ax
586 ; AVX1-NEXT: xorl $15, %eax
587 ; AVX1-NEXT: vpinsrw $3, %eax, %xmm2, %xmm2
588 ; AVX1-NEXT: vpextrw $4, %xmm0, %eax
589 ; AVX1-NEXT: bsrw %ax, %ax
590 ; AVX1-NEXT: xorl $15, %eax
591 ; AVX1-NEXT: vpinsrw $4, %eax, %xmm2, %xmm2
592 ; AVX1-NEXT: vpextrw $5, %xmm0, %eax
593 ; AVX1-NEXT: bsrw %ax, %ax
594 ; AVX1-NEXT: xorl $15, %eax
595 ; AVX1-NEXT: vpinsrw $5, %eax, %xmm2, %xmm2
596 ; AVX1-NEXT: vpextrw $6, %xmm0, %eax
597 ; AVX1-NEXT: bsrw %ax, %ax
598 ; AVX1-NEXT: xorl $15, %eax
599 ; AVX1-NEXT: vpinsrw $6, %eax, %xmm2, %xmm2
600 ; AVX1-NEXT: vpextrw $7, %xmm0, %eax
601 ; AVX1-NEXT: bsrw %ax, %ax
602 ; AVX1-NEXT: xorl $15, %eax
603 ; AVX1-NEXT: vpinsrw $7, %eax, %xmm2, %xmm0
604 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
607 ; AVX2-LABEL: testv16i16u:
609 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
610 ; AVX2-NEXT: vpextrw $1, %xmm1, %eax
611 ; AVX2-NEXT: bsrw %ax, %ax
612 ; AVX2-NEXT: xorl $15, %eax
613 ; AVX2-NEXT: vmovd %xmm1, %ecx
614 ; AVX2-NEXT: bsrw %cx, %cx
615 ; AVX2-NEXT: xorl $15, %ecx
616 ; AVX2-NEXT: vmovd %ecx, %xmm2
617 ; AVX2-NEXT: vpinsrw $1, %eax, %xmm2, %xmm2
618 ; AVX2-NEXT: vpextrw $2, %xmm1, %eax
619 ; AVX2-NEXT: bsrw %ax, %ax
620 ; AVX2-NEXT: xorl $15, %eax
621 ; AVX2-NEXT: vpinsrw $2, %eax, %xmm2, %xmm2
622 ; AVX2-NEXT: vpextrw $3, %xmm1, %eax
623 ; AVX2-NEXT: bsrw %ax, %ax
624 ; AVX2-NEXT: xorl $15, %eax
625 ; AVX2-NEXT: vpinsrw $3, %eax, %xmm2, %xmm2
626 ; AVX2-NEXT: vpextrw $4, %xmm1, %eax
627 ; AVX2-NEXT: bsrw %ax, %ax
628 ; AVX2-NEXT: xorl $15, %eax
629 ; AVX2-NEXT: vpinsrw $4, %eax, %xmm2, %xmm2
630 ; AVX2-NEXT: vpextrw $5, %xmm1, %eax
631 ; AVX2-NEXT: bsrw %ax, %ax
632 ; AVX2-NEXT: xorl $15, %eax
633 ; AVX2-NEXT: vpinsrw $5, %eax, %xmm2, %xmm2
634 ; AVX2-NEXT: vpextrw $6, %xmm1, %eax
635 ; AVX2-NEXT: bsrw %ax, %ax
636 ; AVX2-NEXT: xorl $15, %eax
637 ; AVX2-NEXT: vpinsrw $6, %eax, %xmm2, %xmm2
638 ; AVX2-NEXT: vpextrw $7, %xmm1, %eax
639 ; AVX2-NEXT: bsrw %ax, %ax
640 ; AVX2-NEXT: xorl $15, %eax
641 ; AVX2-NEXT: vpinsrw $7, %eax, %xmm2, %xmm1
642 ; AVX2-NEXT: vpextrw $1, %xmm0, %eax
643 ; AVX2-NEXT: bsrw %ax, %ax
644 ; AVX2-NEXT: xorl $15, %eax
645 ; AVX2-NEXT: vmovd %xmm0, %ecx
646 ; AVX2-NEXT: bsrw %cx, %cx
647 ; AVX2-NEXT: xorl $15, %ecx
648 ; AVX2-NEXT: vmovd %ecx, %xmm2
649 ; AVX2-NEXT: vpinsrw $1, %eax, %xmm2, %xmm2
650 ; AVX2-NEXT: vpextrw $2, %xmm0, %eax
651 ; AVX2-NEXT: bsrw %ax, %ax
652 ; AVX2-NEXT: xorl $15, %eax
653 ; AVX2-NEXT: vpinsrw $2, %eax, %xmm2, %xmm2
654 ; AVX2-NEXT: vpextrw $3, %xmm0, %eax
655 ; AVX2-NEXT: bsrw %ax, %ax
656 ; AVX2-NEXT: xorl $15, %eax
657 ; AVX2-NEXT: vpinsrw $3, %eax, %xmm2, %xmm2
658 ; AVX2-NEXT: vpextrw $4, %xmm0, %eax
659 ; AVX2-NEXT: bsrw %ax, %ax
660 ; AVX2-NEXT: xorl $15, %eax
661 ; AVX2-NEXT: vpinsrw $4, %eax, %xmm2, %xmm2
662 ; AVX2-NEXT: vpextrw $5, %xmm0, %eax
663 ; AVX2-NEXT: bsrw %ax, %ax
664 ; AVX2-NEXT: xorl $15, %eax
665 ; AVX2-NEXT: vpinsrw $5, %eax, %xmm2, %xmm2
666 ; AVX2-NEXT: vpextrw $6, %xmm0, %eax
667 ; AVX2-NEXT: bsrw %ax, %ax
668 ; AVX2-NEXT: xorl $15, %eax
669 ; AVX2-NEXT: vpinsrw $6, %eax, %xmm2, %xmm2
670 ; AVX2-NEXT: vpextrw $7, %xmm0, %eax
671 ; AVX2-NEXT: bsrw %ax, %ax
672 ; AVX2-NEXT: xorl $15, %eax
673 ; AVX2-NEXT: vpinsrw $7, %eax, %xmm2, %xmm0
674 ; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
677 ; AVX512VLCD-LABEL: testv16i16u:
678 ; AVX512VLCD: ## BB#0:
679 ; AVX512VLCD-NEXT: vpmovzxwd %ymm0, %zmm0
680 ; AVX512VLCD-NEXT: vplzcntd %zmm0, %zmm0
681 ; AVX512VLCD-NEXT: vpmovdw %zmm0, %ymm0
682 ; AVX512VLCD-NEXT: vpsubw {{.*}}(%rip), %ymm0, %ymm0
683 ; AVX512VLCD-NEXT: retq
685 ; AVX512CD-LABEL: testv16i16u:
687 ; AVX512CD-NEXT: vpmovzxwd %ymm0, %zmm0
688 ; AVX512CD-NEXT: vplzcntd %zmm0, %zmm0
689 ; AVX512CD-NEXT: vpmovdw %zmm0, %ymm0
690 ; AVX512CD-NEXT: vpsubw {{.*}}(%rip), %ymm0, %ymm0
691 ; AVX512CD-NEXT: retq
692 %out = call <16 x i16> @llvm.ctlz.v16i16(<16 x i16> %in, i1 -1)
696 define <32 x i8> @testv32i8(<32 x i8> %in) nounwind {
697 ; AVX1-LABEL: testv32i8:
699 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
700 ; AVX1-NEXT: vpextrb $1, %xmm1, %eax
701 ; AVX1-NEXT: bsrl %eax, %ecx
702 ; AVX1-NEXT: movl $15, %eax
703 ; AVX1-NEXT: cmovel %eax, %ecx
704 ; AVX1-NEXT: xorl $7, %ecx
705 ; AVX1-NEXT: vpextrb $0, %xmm1, %edx
706 ; AVX1-NEXT: bsrl %edx, %edx
707 ; AVX1-NEXT: cmovel %eax, %edx
708 ; AVX1-NEXT: xorl $7, %edx
709 ; AVX1-NEXT: vmovd %edx, %xmm2
710 ; AVX1-NEXT: vpinsrb $1, %ecx, %xmm2, %xmm2
711 ; AVX1-NEXT: vpextrb $2, %xmm1, %ecx
712 ; AVX1-NEXT: bsrl %ecx, %ecx
713 ; AVX1-NEXT: cmovel %eax, %ecx
714 ; AVX1-NEXT: xorl $7, %ecx
715 ; AVX1-NEXT: vpinsrb $2, %ecx, %xmm2, %xmm2
716 ; AVX1-NEXT: vpextrb $3, %xmm1, %ecx
717 ; AVX1-NEXT: bsrl %ecx, %ecx
718 ; AVX1-NEXT: cmovel %eax, %ecx
719 ; AVX1-NEXT: xorl $7, %ecx
720 ; AVX1-NEXT: vpinsrb $3, %ecx, %xmm2, %xmm2
721 ; AVX1-NEXT: vpextrb $4, %xmm1, %ecx
722 ; AVX1-NEXT: bsrl %ecx, %ecx
723 ; AVX1-NEXT: cmovel %eax, %ecx
724 ; AVX1-NEXT: xorl $7, %ecx
725 ; AVX1-NEXT: vpinsrb $4, %ecx, %xmm2, %xmm2
726 ; AVX1-NEXT: vpextrb $5, %xmm1, %ecx
727 ; AVX1-NEXT: bsrl %ecx, %ecx
728 ; AVX1-NEXT: cmovel %eax, %ecx
729 ; AVX1-NEXT: xorl $7, %ecx
730 ; AVX1-NEXT: vpinsrb $5, %ecx, %xmm2, %xmm2
731 ; AVX1-NEXT: vpextrb $6, %xmm1, %ecx
732 ; AVX1-NEXT: bsrl %ecx, %ecx
733 ; AVX1-NEXT: cmovel %eax, %ecx
734 ; AVX1-NEXT: xorl $7, %ecx
735 ; AVX1-NEXT: vpinsrb $6, %ecx, %xmm2, %xmm2
736 ; AVX1-NEXT: vpextrb $7, %xmm1, %ecx
737 ; AVX1-NEXT: bsrl %ecx, %ecx
738 ; AVX1-NEXT: cmovel %eax, %ecx
739 ; AVX1-NEXT: xorl $7, %ecx
740 ; AVX1-NEXT: vpinsrb $7, %ecx, %xmm2, %xmm2
741 ; AVX1-NEXT: vpextrb $8, %xmm1, %ecx
742 ; AVX1-NEXT: bsrl %ecx, %ecx
743 ; AVX1-NEXT: cmovel %eax, %ecx
744 ; AVX1-NEXT: xorl $7, %ecx
745 ; AVX1-NEXT: vpinsrb $8, %ecx, %xmm2, %xmm2
746 ; AVX1-NEXT: vpextrb $9, %xmm1, %ecx
747 ; AVX1-NEXT: bsrl %ecx, %ecx
748 ; AVX1-NEXT: cmovel %eax, %ecx
749 ; AVX1-NEXT: xorl $7, %ecx
750 ; AVX1-NEXT: vpinsrb $9, %ecx, %xmm2, %xmm2
751 ; AVX1-NEXT: vpextrb $10, %xmm1, %ecx
752 ; AVX1-NEXT: bsrl %ecx, %ecx
753 ; AVX1-NEXT: cmovel %eax, %ecx
754 ; AVX1-NEXT: xorl $7, %ecx
755 ; AVX1-NEXT: vpinsrb $10, %ecx, %xmm2, %xmm2
756 ; AVX1-NEXT: vpextrb $11, %xmm1, %ecx
757 ; AVX1-NEXT: bsrl %ecx, %ecx
758 ; AVX1-NEXT: cmovel %eax, %ecx
759 ; AVX1-NEXT: xorl $7, %ecx
760 ; AVX1-NEXT: vpinsrb $11, %ecx, %xmm2, %xmm2
761 ; AVX1-NEXT: vpextrb $12, %xmm1, %ecx
762 ; AVX1-NEXT: bsrl %ecx, %ecx
763 ; AVX1-NEXT: cmovel %eax, %ecx
764 ; AVX1-NEXT: xorl $7, %ecx
765 ; AVX1-NEXT: vpinsrb $12, %ecx, %xmm2, %xmm2
766 ; AVX1-NEXT: vpextrb $13, %xmm1, %ecx
767 ; AVX1-NEXT: bsrl %ecx, %ecx
768 ; AVX1-NEXT: cmovel %eax, %ecx
769 ; AVX1-NEXT: xorl $7, %ecx
770 ; AVX1-NEXT: vpinsrb $13, %ecx, %xmm2, %xmm2
771 ; AVX1-NEXT: vpextrb $14, %xmm1, %ecx
772 ; AVX1-NEXT: bsrl %ecx, %ecx
773 ; AVX1-NEXT: cmovel %eax, %ecx
774 ; AVX1-NEXT: xorl $7, %ecx
775 ; AVX1-NEXT: vpinsrb $14, %ecx, %xmm2, %xmm2
776 ; AVX1-NEXT: vpextrb $15, %xmm1, %ecx
777 ; AVX1-NEXT: bsrl %ecx, %ecx
778 ; AVX1-NEXT: cmovel %eax, %ecx
779 ; AVX1-NEXT: xorl $7, %ecx
780 ; AVX1-NEXT: vpinsrb $15, %ecx, %xmm2, %xmm1
781 ; AVX1-NEXT: vpextrb $1, %xmm0, %ecx
782 ; AVX1-NEXT: bsrl %ecx, %ecx
783 ; AVX1-NEXT: cmovel %eax, %ecx
784 ; AVX1-NEXT: xorl $7, %ecx
785 ; AVX1-NEXT: vpextrb $0, %xmm0, %edx
786 ; AVX1-NEXT: bsrl %edx, %edx
787 ; AVX1-NEXT: cmovel %eax, %edx
788 ; AVX1-NEXT: xorl $7, %edx
789 ; AVX1-NEXT: vmovd %edx, %xmm2
790 ; AVX1-NEXT: vpinsrb $1, %ecx, %xmm2, %xmm2
791 ; AVX1-NEXT: vpextrb $2, %xmm0, %ecx
792 ; AVX1-NEXT: bsrl %ecx, %ecx
793 ; AVX1-NEXT: cmovel %eax, %ecx
794 ; AVX1-NEXT: xorl $7, %ecx
795 ; AVX1-NEXT: vpinsrb $2, %ecx, %xmm2, %xmm2
796 ; AVX1-NEXT: vpextrb $3, %xmm0, %ecx
797 ; AVX1-NEXT: bsrl %ecx, %ecx
798 ; AVX1-NEXT: cmovel %eax, %ecx
799 ; AVX1-NEXT: xorl $7, %ecx
800 ; AVX1-NEXT: vpinsrb $3, %ecx, %xmm2, %xmm2
801 ; AVX1-NEXT: vpextrb $4, %xmm0, %ecx
802 ; AVX1-NEXT: bsrl %ecx, %ecx
803 ; AVX1-NEXT: cmovel %eax, %ecx
804 ; AVX1-NEXT: xorl $7, %ecx
805 ; AVX1-NEXT: vpinsrb $4, %ecx, %xmm2, %xmm2
806 ; AVX1-NEXT: vpextrb $5, %xmm0, %ecx
807 ; AVX1-NEXT: bsrl %ecx, %ecx
808 ; AVX1-NEXT: cmovel %eax, %ecx
809 ; AVX1-NEXT: xorl $7, %ecx
810 ; AVX1-NEXT: vpinsrb $5, %ecx, %xmm2, %xmm2
811 ; AVX1-NEXT: vpextrb $6, %xmm0, %ecx
812 ; AVX1-NEXT: bsrl %ecx, %ecx
813 ; AVX1-NEXT: cmovel %eax, %ecx
814 ; AVX1-NEXT: xorl $7, %ecx
815 ; AVX1-NEXT: vpinsrb $6, %ecx, %xmm2, %xmm2
816 ; AVX1-NEXT: vpextrb $7, %xmm0, %ecx
817 ; AVX1-NEXT: bsrl %ecx, %ecx
818 ; AVX1-NEXT: cmovel %eax, %ecx
819 ; AVX1-NEXT: xorl $7, %ecx
820 ; AVX1-NEXT: vpinsrb $7, %ecx, %xmm2, %xmm2
821 ; AVX1-NEXT: vpextrb $8, %xmm0, %ecx
822 ; AVX1-NEXT: bsrl %ecx, %ecx
823 ; AVX1-NEXT: cmovel %eax, %ecx
824 ; AVX1-NEXT: xorl $7, %ecx
825 ; AVX1-NEXT: vpinsrb $8, %ecx, %xmm2, %xmm2
826 ; AVX1-NEXT: vpextrb $9, %xmm0, %ecx
827 ; AVX1-NEXT: bsrl %ecx, %ecx
828 ; AVX1-NEXT: cmovel %eax, %ecx
829 ; AVX1-NEXT: xorl $7, %ecx
830 ; AVX1-NEXT: vpinsrb $9, %ecx, %xmm2, %xmm2
831 ; AVX1-NEXT: vpextrb $10, %xmm0, %ecx
832 ; AVX1-NEXT: bsrl %ecx, %ecx
833 ; AVX1-NEXT: cmovel %eax, %ecx
834 ; AVX1-NEXT: xorl $7, %ecx
835 ; AVX1-NEXT: vpinsrb $10, %ecx, %xmm2, %xmm2
836 ; AVX1-NEXT: vpextrb $11, %xmm0, %ecx
837 ; AVX1-NEXT: bsrl %ecx, %ecx
838 ; AVX1-NEXT: cmovel %eax, %ecx
839 ; AVX1-NEXT: xorl $7, %ecx
840 ; AVX1-NEXT: vpinsrb $11, %ecx, %xmm2, %xmm2
841 ; AVX1-NEXT: vpextrb $12, %xmm0, %ecx
842 ; AVX1-NEXT: bsrl %ecx, %ecx
843 ; AVX1-NEXT: cmovel %eax, %ecx
844 ; AVX1-NEXT: xorl $7, %ecx
845 ; AVX1-NEXT: vpinsrb $12, %ecx, %xmm2, %xmm2
846 ; AVX1-NEXT: vpextrb $13, %xmm0, %ecx
847 ; AVX1-NEXT: bsrl %ecx, %ecx
848 ; AVX1-NEXT: cmovel %eax, %ecx
849 ; AVX1-NEXT: xorl $7, %ecx
850 ; AVX1-NEXT: vpinsrb $13, %ecx, %xmm2, %xmm2
851 ; AVX1-NEXT: vpextrb $14, %xmm0, %ecx
852 ; AVX1-NEXT: bsrl %ecx, %ecx
853 ; AVX1-NEXT: cmovel %eax, %ecx
854 ; AVX1-NEXT: xorl $7, %ecx
855 ; AVX1-NEXT: vpinsrb $14, %ecx, %xmm2, %xmm2
856 ; AVX1-NEXT: vpextrb $15, %xmm0, %ecx
857 ; AVX1-NEXT: bsrl %ecx, %ecx
858 ; AVX1-NEXT: cmovel %eax, %ecx
859 ; AVX1-NEXT: xorl $7, %ecx
860 ; AVX1-NEXT: vpinsrb $15, %ecx, %xmm2, %xmm0
861 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
864 ; AVX2-LABEL: testv32i8:
866 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
867 ; AVX2-NEXT: vpextrb $1, %xmm1, %eax
868 ; AVX2-NEXT: bsrl %eax, %ecx
869 ; AVX2-NEXT: movl $15, %eax
870 ; AVX2-NEXT: cmovel %eax, %ecx
871 ; AVX2-NEXT: xorl $7, %ecx
872 ; AVX2-NEXT: vpextrb $0, %xmm1, %edx
873 ; AVX2-NEXT: bsrl %edx, %edx
874 ; AVX2-NEXT: cmovel %eax, %edx
875 ; AVX2-NEXT: xorl $7, %edx
876 ; AVX2-NEXT: vmovd %edx, %xmm2
877 ; AVX2-NEXT: vpinsrb $1, %ecx, %xmm2, %xmm2
878 ; AVX2-NEXT: vpextrb $2, %xmm1, %ecx
879 ; AVX2-NEXT: bsrl %ecx, %ecx
880 ; AVX2-NEXT: cmovel %eax, %ecx
881 ; AVX2-NEXT: xorl $7, %ecx
882 ; AVX2-NEXT: vpinsrb $2, %ecx, %xmm2, %xmm2
883 ; AVX2-NEXT: vpextrb $3, %xmm1, %ecx
884 ; AVX2-NEXT: bsrl %ecx, %ecx
885 ; AVX2-NEXT: cmovel %eax, %ecx
886 ; AVX2-NEXT: xorl $7, %ecx
887 ; AVX2-NEXT: vpinsrb $3, %ecx, %xmm2, %xmm2
888 ; AVX2-NEXT: vpextrb $4, %xmm1, %ecx
889 ; AVX2-NEXT: bsrl %ecx, %ecx
890 ; AVX2-NEXT: cmovel %eax, %ecx
891 ; AVX2-NEXT: xorl $7, %ecx
892 ; AVX2-NEXT: vpinsrb $4, %ecx, %xmm2, %xmm2
893 ; AVX2-NEXT: vpextrb $5, %xmm1, %ecx
894 ; AVX2-NEXT: bsrl %ecx, %ecx
895 ; AVX2-NEXT: cmovel %eax, %ecx
896 ; AVX2-NEXT: xorl $7, %ecx
897 ; AVX2-NEXT: vpinsrb $5, %ecx, %xmm2, %xmm2
898 ; AVX2-NEXT: vpextrb $6, %xmm1, %ecx
899 ; AVX2-NEXT: bsrl %ecx, %ecx
900 ; AVX2-NEXT: cmovel %eax, %ecx
901 ; AVX2-NEXT: xorl $7, %ecx
902 ; AVX2-NEXT: vpinsrb $6, %ecx, %xmm2, %xmm2
903 ; AVX2-NEXT: vpextrb $7, %xmm1, %ecx
904 ; AVX2-NEXT: bsrl %ecx, %ecx
905 ; AVX2-NEXT: cmovel %eax, %ecx
906 ; AVX2-NEXT: xorl $7, %ecx
907 ; AVX2-NEXT: vpinsrb $7, %ecx, %xmm2, %xmm2
908 ; AVX2-NEXT: vpextrb $8, %xmm1, %ecx
909 ; AVX2-NEXT: bsrl %ecx, %ecx
910 ; AVX2-NEXT: cmovel %eax, %ecx
911 ; AVX2-NEXT: xorl $7, %ecx
912 ; AVX2-NEXT: vpinsrb $8, %ecx, %xmm2, %xmm2
913 ; AVX2-NEXT: vpextrb $9, %xmm1, %ecx
914 ; AVX2-NEXT: bsrl %ecx, %ecx
915 ; AVX2-NEXT: cmovel %eax, %ecx
916 ; AVX2-NEXT: xorl $7, %ecx
917 ; AVX2-NEXT: vpinsrb $9, %ecx, %xmm2, %xmm2
918 ; AVX2-NEXT: vpextrb $10, %xmm1, %ecx
919 ; AVX2-NEXT: bsrl %ecx, %ecx
920 ; AVX2-NEXT: cmovel %eax, %ecx
921 ; AVX2-NEXT: xorl $7, %ecx
922 ; AVX2-NEXT: vpinsrb $10, %ecx, %xmm2, %xmm2
923 ; AVX2-NEXT: vpextrb $11, %xmm1, %ecx
924 ; AVX2-NEXT: bsrl %ecx, %ecx
925 ; AVX2-NEXT: cmovel %eax, %ecx
926 ; AVX2-NEXT: xorl $7, %ecx
927 ; AVX2-NEXT: vpinsrb $11, %ecx, %xmm2, %xmm2
928 ; AVX2-NEXT: vpextrb $12, %xmm1, %ecx
929 ; AVX2-NEXT: bsrl %ecx, %ecx
930 ; AVX2-NEXT: cmovel %eax, %ecx
931 ; AVX2-NEXT: xorl $7, %ecx
932 ; AVX2-NEXT: vpinsrb $12, %ecx, %xmm2, %xmm2
933 ; AVX2-NEXT: vpextrb $13, %xmm1, %ecx
934 ; AVX2-NEXT: bsrl %ecx, %ecx
935 ; AVX2-NEXT: cmovel %eax, %ecx
936 ; AVX2-NEXT: xorl $7, %ecx
937 ; AVX2-NEXT: vpinsrb $13, %ecx, %xmm2, %xmm2
938 ; AVX2-NEXT: vpextrb $14, %xmm1, %ecx
939 ; AVX2-NEXT: bsrl %ecx, %ecx
940 ; AVX2-NEXT: cmovel %eax, %ecx
941 ; AVX2-NEXT: xorl $7, %ecx
942 ; AVX2-NEXT: vpinsrb $14, %ecx, %xmm2, %xmm2
943 ; AVX2-NEXT: vpextrb $15, %xmm1, %ecx
944 ; AVX2-NEXT: bsrl %ecx, %ecx
945 ; AVX2-NEXT: cmovel %eax, %ecx
946 ; AVX2-NEXT: xorl $7, %ecx
947 ; AVX2-NEXT: vpinsrb $15, %ecx, %xmm2, %xmm1
948 ; AVX2-NEXT: vpextrb $1, %xmm0, %ecx
949 ; AVX2-NEXT: bsrl %ecx, %ecx
950 ; AVX2-NEXT: cmovel %eax, %ecx
951 ; AVX2-NEXT: xorl $7, %ecx
952 ; AVX2-NEXT: vpextrb $0, %xmm0, %edx
953 ; AVX2-NEXT: bsrl %edx, %edx
954 ; AVX2-NEXT: cmovel %eax, %edx
955 ; AVX2-NEXT: xorl $7, %edx
956 ; AVX2-NEXT: vmovd %edx, %xmm2
957 ; AVX2-NEXT: vpinsrb $1, %ecx, %xmm2, %xmm2
958 ; AVX2-NEXT: vpextrb $2, %xmm0, %ecx
959 ; AVX2-NEXT: bsrl %ecx, %ecx
960 ; AVX2-NEXT: cmovel %eax, %ecx
961 ; AVX2-NEXT: xorl $7, %ecx
962 ; AVX2-NEXT: vpinsrb $2, %ecx, %xmm2, %xmm2
963 ; AVX2-NEXT: vpextrb $3, %xmm0, %ecx
964 ; AVX2-NEXT: bsrl %ecx, %ecx
965 ; AVX2-NEXT: cmovel %eax, %ecx
966 ; AVX2-NEXT: xorl $7, %ecx
967 ; AVX2-NEXT: vpinsrb $3, %ecx, %xmm2, %xmm2
968 ; AVX2-NEXT: vpextrb $4, %xmm0, %ecx
969 ; AVX2-NEXT: bsrl %ecx, %ecx
970 ; AVX2-NEXT: cmovel %eax, %ecx
971 ; AVX2-NEXT: xorl $7, %ecx
972 ; AVX2-NEXT: vpinsrb $4, %ecx, %xmm2, %xmm2
973 ; AVX2-NEXT: vpextrb $5, %xmm0, %ecx
974 ; AVX2-NEXT: bsrl %ecx, %ecx
975 ; AVX2-NEXT: cmovel %eax, %ecx
976 ; AVX2-NEXT: xorl $7, %ecx
977 ; AVX2-NEXT: vpinsrb $5, %ecx, %xmm2, %xmm2
978 ; AVX2-NEXT: vpextrb $6, %xmm0, %ecx
979 ; AVX2-NEXT: bsrl %ecx, %ecx
980 ; AVX2-NEXT: cmovel %eax, %ecx
981 ; AVX2-NEXT: xorl $7, %ecx
982 ; AVX2-NEXT: vpinsrb $6, %ecx, %xmm2, %xmm2
983 ; AVX2-NEXT: vpextrb $7, %xmm0, %ecx
984 ; AVX2-NEXT: bsrl %ecx, %ecx
985 ; AVX2-NEXT: cmovel %eax, %ecx
986 ; AVX2-NEXT: xorl $7, %ecx
987 ; AVX2-NEXT: vpinsrb $7, %ecx, %xmm2, %xmm2
988 ; AVX2-NEXT: vpextrb $8, %xmm0, %ecx
989 ; AVX2-NEXT: bsrl %ecx, %ecx
990 ; AVX2-NEXT: cmovel %eax, %ecx
991 ; AVX2-NEXT: xorl $7, %ecx
992 ; AVX2-NEXT: vpinsrb $8, %ecx, %xmm2, %xmm2
993 ; AVX2-NEXT: vpextrb $9, %xmm0, %ecx
994 ; AVX2-NEXT: bsrl %ecx, %ecx
995 ; AVX2-NEXT: cmovel %eax, %ecx
996 ; AVX2-NEXT: xorl $7, %ecx
997 ; AVX2-NEXT: vpinsrb $9, %ecx, %xmm2, %xmm2
998 ; AVX2-NEXT: vpextrb $10, %xmm0, %ecx
999 ; AVX2-NEXT: bsrl %ecx, %ecx
1000 ; AVX2-NEXT: cmovel %eax, %ecx
1001 ; AVX2-NEXT: xorl $7, %ecx
1002 ; AVX2-NEXT: vpinsrb $10, %ecx, %xmm2, %xmm2
1003 ; AVX2-NEXT: vpextrb $11, %xmm0, %ecx
1004 ; AVX2-NEXT: bsrl %ecx, %ecx
1005 ; AVX2-NEXT: cmovel %eax, %ecx
1006 ; AVX2-NEXT: xorl $7, %ecx
1007 ; AVX2-NEXT: vpinsrb $11, %ecx, %xmm2, %xmm2
1008 ; AVX2-NEXT: vpextrb $12, %xmm0, %ecx
1009 ; AVX2-NEXT: bsrl %ecx, %ecx
1010 ; AVX2-NEXT: cmovel %eax, %ecx
1011 ; AVX2-NEXT: xorl $7, %ecx
1012 ; AVX2-NEXT: vpinsrb $12, %ecx, %xmm2, %xmm2
1013 ; AVX2-NEXT: vpextrb $13, %xmm0, %ecx
1014 ; AVX2-NEXT: bsrl %ecx, %ecx
1015 ; AVX2-NEXT: cmovel %eax, %ecx
1016 ; AVX2-NEXT: xorl $7, %ecx
1017 ; AVX2-NEXT: vpinsrb $13, %ecx, %xmm2, %xmm2
1018 ; AVX2-NEXT: vpextrb $14, %xmm0, %ecx
1019 ; AVX2-NEXT: bsrl %ecx, %ecx
1020 ; AVX2-NEXT: cmovel %eax, %ecx
1021 ; AVX2-NEXT: xorl $7, %ecx
1022 ; AVX2-NEXT: vpinsrb $14, %ecx, %xmm2, %xmm2
1023 ; AVX2-NEXT: vpextrb $15, %xmm0, %ecx
1024 ; AVX2-NEXT: bsrl %ecx, %ecx
1025 ; AVX2-NEXT: cmovel %eax, %ecx
1026 ; AVX2-NEXT: xorl $7, %ecx
1027 ; AVX2-NEXT: vpinsrb $15, %ecx, %xmm2, %xmm0
1028 ; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
1031 ; AVX512VLCD-LABEL: testv32i8:
1032 ; AVX512VLCD: ## BB#0:
1033 ; AVX512VLCD-NEXT: vextractf128 $1, %ymm0, %xmm1
1034 ; AVX512VLCD-NEXT: vpmovzxbd %xmm1, %zmm1
1035 ; AVX512VLCD-NEXT: vplzcntd %zmm1, %zmm1
1036 ; AVX512VLCD-NEXT: vpmovdb %zmm1, %xmm1
1037 ; AVX512VLCD-NEXT: vmovdqa64 {{.*#+}} xmm2 = [24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24]
1038 ; AVX512VLCD-NEXT: vpsubb %xmm2, %xmm1, %xmm1
1039 ; AVX512VLCD-NEXT: vpmovzxbd %xmm0, %zmm0
1040 ; AVX512VLCD-NEXT: vplzcntd %zmm0, %zmm0
1041 ; AVX512VLCD-NEXT: vpmovdb %zmm0, %xmm0
1042 ; AVX512VLCD-NEXT: vpsubb %xmm2, %xmm0, %xmm0
1043 ; AVX512VLCD-NEXT: vinserti32x4 $1, %xmm1, %ymm0, %ymm0
1044 ; AVX512VLCD-NEXT: retq
1046 ; AVX512CD-LABEL: testv32i8:
1047 ; AVX512CD: ## BB#0:
1048 ; AVX512CD-NEXT: vextractf128 $1, %ymm0, %xmm1
1049 ; AVX512CD-NEXT: vpmovzxbd %xmm1, %zmm1
1050 ; AVX512CD-NEXT: vplzcntd %zmm1, %zmm1
1051 ; AVX512CD-NEXT: vpmovdb %zmm1, %xmm1
1052 ; AVX512CD-NEXT: vmovdqa {{.*#+}} xmm2 = [24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24]
1053 ; AVX512CD-NEXT: vpsubb %xmm2, %xmm1, %xmm1
1054 ; AVX512CD-NEXT: vpmovzxbd %xmm0, %zmm0
1055 ; AVX512CD-NEXT: vplzcntd %zmm0, %zmm0
1056 ; AVX512CD-NEXT: vpmovdb %zmm0, %xmm0
1057 ; AVX512CD-NEXT: vpsubb %xmm2, %xmm0, %xmm0
1058 ; AVX512CD-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
1059 ; AVX512CD-NEXT: retq
1060 %out = call <32 x i8> @llvm.ctlz.v32i8(<32 x i8> %in, i1 0)
1064 define <32 x i8> @testv32i8u(<32 x i8> %in) nounwind {
1065 ; AVX1-LABEL: testv32i8u:
1067 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
1068 ; AVX1-NEXT: vpextrb $1, %xmm1, %eax
1069 ; AVX1-NEXT: bsrl %eax, %eax
1070 ; AVX1-NEXT: xorl $7, %eax
1071 ; AVX1-NEXT: vpextrb $0, %xmm1, %ecx
1072 ; AVX1-NEXT: bsrl %ecx, %ecx
1073 ; AVX1-NEXT: xorl $7, %ecx
1074 ; AVX1-NEXT: vmovd %ecx, %xmm2
1075 ; AVX1-NEXT: vpinsrb $1, %eax, %xmm2, %xmm2
1076 ; AVX1-NEXT: vpextrb $2, %xmm1, %eax
1077 ; AVX1-NEXT: bsrl %eax, %eax
1078 ; AVX1-NEXT: xorl $7, %eax
1079 ; AVX1-NEXT: vpinsrb $2, %eax, %xmm2, %xmm2
1080 ; AVX1-NEXT: vpextrb $3, %xmm1, %eax
1081 ; AVX1-NEXT: bsrl %eax, %eax
1082 ; AVX1-NEXT: xorl $7, %eax
1083 ; AVX1-NEXT: vpinsrb $3, %eax, %xmm2, %xmm2
1084 ; AVX1-NEXT: vpextrb $4, %xmm1, %eax
1085 ; AVX1-NEXT: bsrl %eax, %eax
1086 ; AVX1-NEXT: xorl $7, %eax
1087 ; AVX1-NEXT: vpinsrb $4, %eax, %xmm2, %xmm2
1088 ; AVX1-NEXT: vpextrb $5, %xmm1, %eax
1089 ; AVX1-NEXT: bsrl %eax, %eax
1090 ; AVX1-NEXT: xorl $7, %eax
1091 ; AVX1-NEXT: vpinsrb $5, %eax, %xmm2, %xmm2
1092 ; AVX1-NEXT: vpextrb $6, %xmm1, %eax
1093 ; AVX1-NEXT: bsrl %eax, %eax
1094 ; AVX1-NEXT: xorl $7, %eax
1095 ; AVX1-NEXT: vpinsrb $6, %eax, %xmm2, %xmm2
1096 ; AVX1-NEXT: vpextrb $7, %xmm1, %eax
1097 ; AVX1-NEXT: bsrl %eax, %eax
1098 ; AVX1-NEXT: xorl $7, %eax
1099 ; AVX1-NEXT: vpinsrb $7, %eax, %xmm2, %xmm2
1100 ; AVX1-NEXT: vpextrb $8, %xmm1, %eax
1101 ; AVX1-NEXT: bsrl %eax, %eax
1102 ; AVX1-NEXT: xorl $7, %eax
1103 ; AVX1-NEXT: vpinsrb $8, %eax, %xmm2, %xmm2
1104 ; AVX1-NEXT: vpextrb $9, %xmm1, %eax
1105 ; AVX1-NEXT: bsrl %eax, %eax
1106 ; AVX1-NEXT: xorl $7, %eax
1107 ; AVX1-NEXT: vpinsrb $9, %eax, %xmm2, %xmm2
1108 ; AVX1-NEXT: vpextrb $10, %xmm1, %eax
1109 ; AVX1-NEXT: bsrl %eax, %eax
1110 ; AVX1-NEXT: xorl $7, %eax
1111 ; AVX1-NEXT: vpinsrb $10, %eax, %xmm2, %xmm2
1112 ; AVX1-NEXT: vpextrb $11, %xmm1, %eax
1113 ; AVX1-NEXT: bsrl %eax, %eax
1114 ; AVX1-NEXT: xorl $7, %eax
1115 ; AVX1-NEXT: vpinsrb $11, %eax, %xmm2, %xmm2
1116 ; AVX1-NEXT: vpextrb $12, %xmm1, %eax
1117 ; AVX1-NEXT: bsrl %eax, %eax
1118 ; AVX1-NEXT: xorl $7, %eax
1119 ; AVX1-NEXT: vpinsrb $12, %eax, %xmm2, %xmm2
1120 ; AVX1-NEXT: vpextrb $13, %xmm1, %eax
1121 ; AVX1-NEXT: bsrl %eax, %eax
1122 ; AVX1-NEXT: xorl $7, %eax
1123 ; AVX1-NEXT: vpinsrb $13, %eax, %xmm2, %xmm2
1124 ; AVX1-NEXT: vpextrb $14, %xmm1, %eax
1125 ; AVX1-NEXT: bsrl %eax, %eax
1126 ; AVX1-NEXT: xorl $7, %eax
1127 ; AVX1-NEXT: vpinsrb $14, %eax, %xmm2, %xmm2
1128 ; AVX1-NEXT: vpextrb $15, %xmm1, %eax
1129 ; AVX1-NEXT: bsrl %eax, %eax
1130 ; AVX1-NEXT: xorl $7, %eax
1131 ; AVX1-NEXT: vpinsrb $15, %eax, %xmm2, %xmm1
1132 ; AVX1-NEXT: vpextrb $1, %xmm0, %eax
1133 ; AVX1-NEXT: bsrl %eax, %eax
1134 ; AVX1-NEXT: xorl $7, %eax
1135 ; AVX1-NEXT: vpextrb $0, %xmm0, %ecx
1136 ; AVX1-NEXT: bsrl %ecx, %ecx
1137 ; AVX1-NEXT: xorl $7, %ecx
1138 ; AVX1-NEXT: vmovd %ecx, %xmm2
1139 ; AVX1-NEXT: vpinsrb $1, %eax, %xmm2, %xmm2
1140 ; AVX1-NEXT: vpextrb $2, %xmm0, %eax
1141 ; AVX1-NEXT: bsrl %eax, %eax
1142 ; AVX1-NEXT: xorl $7, %eax
1143 ; AVX1-NEXT: vpinsrb $2, %eax, %xmm2, %xmm2
1144 ; AVX1-NEXT: vpextrb $3, %xmm0, %eax
1145 ; AVX1-NEXT: bsrl %eax, %eax
1146 ; AVX1-NEXT: xorl $7, %eax
1147 ; AVX1-NEXT: vpinsrb $3, %eax, %xmm2, %xmm2
1148 ; AVX1-NEXT: vpextrb $4, %xmm0, %eax
1149 ; AVX1-NEXT: bsrl %eax, %eax
1150 ; AVX1-NEXT: xorl $7, %eax
1151 ; AVX1-NEXT: vpinsrb $4, %eax, %xmm2, %xmm2
1152 ; AVX1-NEXT: vpextrb $5, %xmm0, %eax
1153 ; AVX1-NEXT: bsrl %eax, %eax
1154 ; AVX1-NEXT: xorl $7, %eax
1155 ; AVX1-NEXT: vpinsrb $5, %eax, %xmm2, %xmm2
1156 ; AVX1-NEXT: vpextrb $6, %xmm0, %eax
1157 ; AVX1-NEXT: bsrl %eax, %eax
1158 ; AVX1-NEXT: xorl $7, %eax
1159 ; AVX1-NEXT: vpinsrb $6, %eax, %xmm2, %xmm2
1160 ; AVX1-NEXT: vpextrb $7, %xmm0, %eax
1161 ; AVX1-NEXT: bsrl %eax, %eax
1162 ; AVX1-NEXT: xorl $7, %eax
1163 ; AVX1-NEXT: vpinsrb $7, %eax, %xmm2, %xmm2
1164 ; AVX1-NEXT: vpextrb $8, %xmm0, %eax
1165 ; AVX1-NEXT: bsrl %eax, %eax
1166 ; AVX1-NEXT: xorl $7, %eax
1167 ; AVX1-NEXT: vpinsrb $8, %eax, %xmm2, %xmm2
1168 ; AVX1-NEXT: vpextrb $9, %xmm0, %eax
1169 ; AVX1-NEXT: bsrl %eax, %eax
1170 ; AVX1-NEXT: xorl $7, %eax
1171 ; AVX1-NEXT: vpinsrb $9, %eax, %xmm2, %xmm2
1172 ; AVX1-NEXT: vpextrb $10, %xmm0, %eax
1173 ; AVX1-NEXT: bsrl %eax, %eax
1174 ; AVX1-NEXT: xorl $7, %eax
1175 ; AVX1-NEXT: vpinsrb $10, %eax, %xmm2, %xmm2
1176 ; AVX1-NEXT: vpextrb $11, %xmm0, %eax
1177 ; AVX1-NEXT: bsrl %eax, %eax
1178 ; AVX1-NEXT: xorl $7, %eax
1179 ; AVX1-NEXT: vpinsrb $11, %eax, %xmm2, %xmm2
1180 ; AVX1-NEXT: vpextrb $12, %xmm0, %eax
1181 ; AVX1-NEXT: bsrl %eax, %eax
1182 ; AVX1-NEXT: xorl $7, %eax
1183 ; AVX1-NEXT: vpinsrb $12, %eax, %xmm2, %xmm2
1184 ; AVX1-NEXT: vpextrb $13, %xmm0, %eax
1185 ; AVX1-NEXT: bsrl %eax, %eax
1186 ; AVX1-NEXT: xorl $7, %eax
1187 ; AVX1-NEXT: vpinsrb $13, %eax, %xmm2, %xmm2
1188 ; AVX1-NEXT: vpextrb $14, %xmm0, %eax
1189 ; AVX1-NEXT: bsrl %eax, %eax
1190 ; AVX1-NEXT: xorl $7, %eax
1191 ; AVX1-NEXT: vpinsrb $14, %eax, %xmm2, %xmm2
1192 ; AVX1-NEXT: vpextrb $15, %xmm0, %eax
1193 ; AVX1-NEXT: bsrl %eax, %eax
1194 ; AVX1-NEXT: xorl $7, %eax
1195 ; AVX1-NEXT: vpinsrb $15, %eax, %xmm2, %xmm0
1196 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
1199 ; AVX2-LABEL: testv32i8u:
1201 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
1202 ; AVX2-NEXT: vpextrb $1, %xmm1, %eax
1203 ; AVX2-NEXT: bsrl %eax, %eax
1204 ; AVX2-NEXT: xorl $7, %eax
1205 ; AVX2-NEXT: vpextrb $0, %xmm1, %ecx
1206 ; AVX2-NEXT: bsrl %ecx, %ecx
1207 ; AVX2-NEXT: xorl $7, %ecx
1208 ; AVX2-NEXT: vmovd %ecx, %xmm2
1209 ; AVX2-NEXT: vpinsrb $1, %eax, %xmm2, %xmm2
1210 ; AVX2-NEXT: vpextrb $2, %xmm1, %eax
1211 ; AVX2-NEXT: bsrl %eax, %eax
1212 ; AVX2-NEXT: xorl $7, %eax
1213 ; AVX2-NEXT: vpinsrb $2, %eax, %xmm2, %xmm2
1214 ; AVX2-NEXT: vpextrb $3, %xmm1, %eax
1215 ; AVX2-NEXT: bsrl %eax, %eax
1216 ; AVX2-NEXT: xorl $7, %eax
1217 ; AVX2-NEXT: vpinsrb $3, %eax, %xmm2, %xmm2
1218 ; AVX2-NEXT: vpextrb $4, %xmm1, %eax
1219 ; AVX2-NEXT: bsrl %eax, %eax
1220 ; AVX2-NEXT: xorl $7, %eax
1221 ; AVX2-NEXT: vpinsrb $4, %eax, %xmm2, %xmm2
1222 ; AVX2-NEXT: vpextrb $5, %xmm1, %eax
1223 ; AVX2-NEXT: bsrl %eax, %eax
1224 ; AVX2-NEXT: xorl $7, %eax
1225 ; AVX2-NEXT: vpinsrb $5, %eax, %xmm2, %xmm2
1226 ; AVX2-NEXT: vpextrb $6, %xmm1, %eax
1227 ; AVX2-NEXT: bsrl %eax, %eax
1228 ; AVX2-NEXT: xorl $7, %eax
1229 ; AVX2-NEXT: vpinsrb $6, %eax, %xmm2, %xmm2
1230 ; AVX2-NEXT: vpextrb $7, %xmm1, %eax
1231 ; AVX2-NEXT: bsrl %eax, %eax
1232 ; AVX2-NEXT: xorl $7, %eax
1233 ; AVX2-NEXT: vpinsrb $7, %eax, %xmm2, %xmm2
1234 ; AVX2-NEXT: vpextrb $8, %xmm1, %eax
1235 ; AVX2-NEXT: bsrl %eax, %eax
1236 ; AVX2-NEXT: xorl $7, %eax
1237 ; AVX2-NEXT: vpinsrb $8, %eax, %xmm2, %xmm2
1238 ; AVX2-NEXT: vpextrb $9, %xmm1, %eax
1239 ; AVX2-NEXT: bsrl %eax, %eax
1240 ; AVX2-NEXT: xorl $7, %eax
1241 ; AVX2-NEXT: vpinsrb $9, %eax, %xmm2, %xmm2
1242 ; AVX2-NEXT: vpextrb $10, %xmm1, %eax
1243 ; AVX2-NEXT: bsrl %eax, %eax
1244 ; AVX2-NEXT: xorl $7, %eax
1245 ; AVX2-NEXT: vpinsrb $10, %eax, %xmm2, %xmm2
1246 ; AVX2-NEXT: vpextrb $11, %xmm1, %eax
1247 ; AVX2-NEXT: bsrl %eax, %eax
1248 ; AVX2-NEXT: xorl $7, %eax
1249 ; AVX2-NEXT: vpinsrb $11, %eax, %xmm2, %xmm2
1250 ; AVX2-NEXT: vpextrb $12, %xmm1, %eax
1251 ; AVX2-NEXT: bsrl %eax, %eax
1252 ; AVX2-NEXT: xorl $7, %eax
1253 ; AVX2-NEXT: vpinsrb $12, %eax, %xmm2, %xmm2
1254 ; AVX2-NEXT: vpextrb $13, %xmm1, %eax
1255 ; AVX2-NEXT: bsrl %eax, %eax
1256 ; AVX2-NEXT: xorl $7, %eax
1257 ; AVX2-NEXT: vpinsrb $13, %eax, %xmm2, %xmm2
1258 ; AVX2-NEXT: vpextrb $14, %xmm1, %eax
1259 ; AVX2-NEXT: bsrl %eax, %eax
1260 ; AVX2-NEXT: xorl $7, %eax
1261 ; AVX2-NEXT: vpinsrb $14, %eax, %xmm2, %xmm2
1262 ; AVX2-NEXT: vpextrb $15, %xmm1, %eax
1263 ; AVX2-NEXT: bsrl %eax, %eax
1264 ; AVX2-NEXT: xorl $7, %eax
1265 ; AVX2-NEXT: vpinsrb $15, %eax, %xmm2, %xmm1
1266 ; AVX2-NEXT: vpextrb $1, %xmm0, %eax
1267 ; AVX2-NEXT: bsrl %eax, %eax
1268 ; AVX2-NEXT: xorl $7, %eax
1269 ; AVX2-NEXT: vpextrb $0, %xmm0, %ecx
1270 ; AVX2-NEXT: bsrl %ecx, %ecx
1271 ; AVX2-NEXT: xorl $7, %ecx
1272 ; AVX2-NEXT: vmovd %ecx, %xmm2
1273 ; AVX2-NEXT: vpinsrb $1, %eax, %xmm2, %xmm2
1274 ; AVX2-NEXT: vpextrb $2, %xmm0, %eax
1275 ; AVX2-NEXT: bsrl %eax, %eax
1276 ; AVX2-NEXT: xorl $7, %eax
1277 ; AVX2-NEXT: vpinsrb $2, %eax, %xmm2, %xmm2
1278 ; AVX2-NEXT: vpextrb $3, %xmm0, %eax
1279 ; AVX2-NEXT: bsrl %eax, %eax
1280 ; AVX2-NEXT: xorl $7, %eax
1281 ; AVX2-NEXT: vpinsrb $3, %eax, %xmm2, %xmm2
1282 ; AVX2-NEXT: vpextrb $4, %xmm0, %eax
1283 ; AVX2-NEXT: bsrl %eax, %eax
1284 ; AVX2-NEXT: xorl $7, %eax
1285 ; AVX2-NEXT: vpinsrb $4, %eax, %xmm2, %xmm2
1286 ; AVX2-NEXT: vpextrb $5, %xmm0, %eax
1287 ; AVX2-NEXT: bsrl %eax, %eax
1288 ; AVX2-NEXT: xorl $7, %eax
1289 ; AVX2-NEXT: vpinsrb $5, %eax, %xmm2, %xmm2
1290 ; AVX2-NEXT: vpextrb $6, %xmm0, %eax
1291 ; AVX2-NEXT: bsrl %eax, %eax
1292 ; AVX2-NEXT: xorl $7, %eax
1293 ; AVX2-NEXT: vpinsrb $6, %eax, %xmm2, %xmm2
1294 ; AVX2-NEXT: vpextrb $7, %xmm0, %eax
1295 ; AVX2-NEXT: bsrl %eax, %eax
1296 ; AVX2-NEXT: xorl $7, %eax
1297 ; AVX2-NEXT: vpinsrb $7, %eax, %xmm2, %xmm2
1298 ; AVX2-NEXT: vpextrb $8, %xmm0, %eax
1299 ; AVX2-NEXT: bsrl %eax, %eax
1300 ; AVX2-NEXT: xorl $7, %eax
1301 ; AVX2-NEXT: vpinsrb $8, %eax, %xmm2, %xmm2
1302 ; AVX2-NEXT: vpextrb $9, %xmm0, %eax
1303 ; AVX2-NEXT: bsrl %eax, %eax
1304 ; AVX2-NEXT: xorl $7, %eax
1305 ; AVX2-NEXT: vpinsrb $9, %eax, %xmm2, %xmm2
1306 ; AVX2-NEXT: vpextrb $10, %xmm0, %eax
1307 ; AVX2-NEXT: bsrl %eax, %eax
1308 ; AVX2-NEXT: xorl $7, %eax
1309 ; AVX2-NEXT: vpinsrb $10, %eax, %xmm2, %xmm2
1310 ; AVX2-NEXT: vpextrb $11, %xmm0, %eax
1311 ; AVX2-NEXT: bsrl %eax, %eax
1312 ; AVX2-NEXT: xorl $7, %eax
1313 ; AVX2-NEXT: vpinsrb $11, %eax, %xmm2, %xmm2
1314 ; AVX2-NEXT: vpextrb $12, %xmm0, %eax
1315 ; AVX2-NEXT: bsrl %eax, %eax
1316 ; AVX2-NEXT: xorl $7, %eax
1317 ; AVX2-NEXT: vpinsrb $12, %eax, %xmm2, %xmm2
1318 ; AVX2-NEXT: vpextrb $13, %xmm0, %eax
1319 ; AVX2-NEXT: bsrl %eax, %eax
1320 ; AVX2-NEXT: xorl $7, %eax
1321 ; AVX2-NEXT: vpinsrb $13, %eax, %xmm2, %xmm2
1322 ; AVX2-NEXT: vpextrb $14, %xmm0, %eax
1323 ; AVX2-NEXT: bsrl %eax, %eax
1324 ; AVX2-NEXT: xorl $7, %eax
1325 ; AVX2-NEXT: vpinsrb $14, %eax, %xmm2, %xmm2
1326 ; AVX2-NEXT: vpextrb $15, %xmm0, %eax
1327 ; AVX2-NEXT: bsrl %eax, %eax
1328 ; AVX2-NEXT: xorl $7, %eax
1329 ; AVX2-NEXT: vpinsrb $15, %eax, %xmm2, %xmm0
1330 ; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
1333 ; AVX512VLCD-LABEL: testv32i8u:
1334 ; AVX512VLCD: ## BB#0:
1335 ; AVX512VLCD-NEXT: vextractf128 $1, %ymm0, %xmm1
1336 ; AVX512VLCD-NEXT: vpmovzxbd %xmm1, %zmm1
1337 ; AVX512VLCD-NEXT: vplzcntd %zmm1, %zmm1
1338 ; AVX512VLCD-NEXT: vpmovdb %zmm1, %xmm1
1339 ; AVX512VLCD-NEXT: vmovdqa64 {{.*#+}} xmm2 = [24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24]
1340 ; AVX512VLCD-NEXT: vpsubb %xmm2, %xmm1, %xmm1
1341 ; AVX512VLCD-NEXT: vpmovzxbd %xmm0, %zmm0
1342 ; AVX512VLCD-NEXT: vplzcntd %zmm0, %zmm0
1343 ; AVX512VLCD-NEXT: vpmovdb %zmm0, %xmm0
1344 ; AVX512VLCD-NEXT: vpsubb %xmm2, %xmm0, %xmm0
1345 ; AVX512VLCD-NEXT: vinserti32x4 $1, %xmm1, %ymm0, %ymm0
1346 ; AVX512VLCD-NEXT: retq
1348 ; AVX512CD-LABEL: testv32i8u:
1349 ; AVX512CD: ## BB#0:
1350 ; AVX512CD-NEXT: vextractf128 $1, %ymm0, %xmm1
1351 ; AVX512CD-NEXT: vpmovzxbd %xmm1, %zmm1
1352 ; AVX512CD-NEXT: vplzcntd %zmm1, %zmm1
1353 ; AVX512CD-NEXT: vpmovdb %zmm1, %xmm1
1354 ; AVX512CD-NEXT: vmovdqa {{.*#+}} xmm2 = [24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24]
1355 ; AVX512CD-NEXT: vpsubb %xmm2, %xmm1, %xmm1
1356 ; AVX512CD-NEXT: vpmovzxbd %xmm0, %zmm0
1357 ; AVX512CD-NEXT: vplzcntd %zmm0, %zmm0
1358 ; AVX512CD-NEXT: vpmovdb %zmm0, %xmm0
1359 ; AVX512CD-NEXT: vpsubb %xmm2, %xmm0, %xmm0
1360 ; AVX512CD-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
1361 ; AVX512CD-NEXT: retq
1362 %out = call <32 x i8> @llvm.ctlz.v32i8(<32 x i8> %in, i1 -1)
1366 define <4 x i64> @foldv4i64() nounwind {
1367 ; AVX-LABEL: foldv4i64:
1369 ; AVX-NEXT: vmovaps {{.*#+}} ymm0 = [55,0,64,56]
1372 ; AVX512VLCD-LABEL: foldv4i64:
1373 ; AVX512VLCD: ## BB#0:
1374 ; AVX512VLCD-NEXT: vmovdqa64 {{.*#+}} ymm0 = [55,0,64,56]
1375 ; AVX512VLCD-NEXT: retq
1377 ; AVX512CD-LABEL: foldv4i64:
1378 ; AVX512CD: ## BB#0:
1379 ; AVX512CD-NEXT: vmovaps {{.*#+}} ymm0 = [55,0,64,56]
1380 ; AVX512CD-NEXT: retq
1381 %out = call <4 x i64> @llvm.ctlz.v4i64(<4 x i64> <i64 256, i64 -1, i64 0, i64 255>, i1 0)
1385 define <4 x i64> @foldv4i64u() nounwind {
1386 ; AVX-LABEL: foldv4i64u:
1388 ; AVX-NEXT: vmovaps {{.*#+}} ymm0 = [55,0,64,56]
1391 ; AVX512VLCD-LABEL: foldv4i64u:
1392 ; AVX512VLCD: ## BB#0:
1393 ; AVX512VLCD-NEXT: vmovdqa64 {{.*#+}} ymm0 = [55,0,64,56]
1394 ; AVX512VLCD-NEXT: retq
1396 ; AVX512CD-LABEL: foldv4i64u:
1397 ; AVX512CD: ## BB#0:
1398 ; AVX512CD-NEXT: vmovaps {{.*#+}} ymm0 = [55,0,64,56]
1399 ; AVX512CD-NEXT: retq
1400 %out = call <4 x i64> @llvm.ctlz.v4i64(<4 x i64> <i64 256, i64 -1, i64 0, i64 255>, i1 -1)
1404 define <8 x i32> @foldv8i32() nounwind {
1405 ; AVX-LABEL: foldv8i32:
1407 ; AVX-NEXT: vmovaps {{.*#+}} ymm0 = [23,0,32,24,0,29,27,25]
1410 ; AVX512VLCD-LABEL: foldv8i32:
1411 ; AVX512VLCD: ## BB#0:
1412 ; AVX512VLCD-NEXT: vmovdqa32 {{.*#+}} ymm0 = [23,0,32,24,0,29,27,25]
1413 ; AVX512VLCD-NEXT: retq
1415 ; AVX512CD-LABEL: foldv8i32:
1416 ; AVX512CD: ## BB#0:
1417 ; AVX512CD-NEXT: vmovaps {{.*#+}} ymm0 = [23,0,32,24,0,29,27,25]
1418 ; AVX512CD-NEXT: retq
1419 %out = call <8 x i32> @llvm.ctlz.v8i32(<8 x i32> <i32 256, i32 -1, i32 0, i32 255, i32 -65536, i32 7, i32 24, i32 88>, i1 0)
1423 define <8 x i32> @foldv8i32u() nounwind {
1424 ; AVX-LABEL: foldv8i32u:
1426 ; AVX-NEXT: vmovaps {{.*#+}} ymm0 = [23,0,32,24,0,29,27,25]
1429 ; AVX512VLCD-LABEL: foldv8i32u:
1430 ; AVX512VLCD: ## BB#0:
1431 ; AVX512VLCD-NEXT: vmovdqa32 {{.*#+}} ymm0 = [23,0,32,24,0,29,27,25]
1432 ; AVX512VLCD-NEXT: retq
1434 ; AVX512CD-LABEL: foldv8i32u:
1435 ; AVX512CD: ## BB#0:
1436 ; AVX512CD-NEXT: vmovaps {{.*#+}} ymm0 = [23,0,32,24,0,29,27,25]
1437 ; AVX512CD-NEXT: retq
1438 %out = call <8 x i32> @llvm.ctlz.v8i32(<8 x i32> <i32 256, i32 -1, i32 0, i32 255, i32 -65536, i32 7, i32 24, i32 88>, i1 -1)
1442 define <16 x i16> @foldv16i16() nounwind {
1443 ; AVX-LABEL: foldv16i16:
1445 ; AVX-NEXT: vmovaps {{.*#+}} ymm0 = [7,0,16,8,16,13,11,9,0,8,15,14,13,12,11,10]
1448 ; AVX512VLCD-LABEL: foldv16i16:
1449 ; AVX512VLCD: ## BB#0:
1450 ; AVX512VLCD-NEXT: vmovdqa64 {{.*#+}} ymm0 = [7,0,16,8,16,13,11,9,0,8,15,14,13,12,11,10]
1451 ; AVX512VLCD-NEXT: retq
1453 ; AVX512CD-LABEL: foldv16i16:
1454 ; AVX512CD: ## BB#0:
1455 ; AVX512CD-NEXT: vmovaps {{.*#+}} ymm0 = [7,0,16,8,16,13,11,9,0,8,15,14,13,12,11,10]
1456 ; AVX512CD-NEXT: retq
1457 %out = call <16 x i16> @llvm.ctlz.v16i16(<16 x i16> <i16 256, i16 -1, i16 0, i16 255, i16 -65536, i16 7, i16 24, i16 88, i16 -2, i16 254, i16 1, i16 2, i16 4, i16 8, i16 16, i16 32>, i1 0)
1461 define <16 x i16> @foldv16i16u() nounwind {
1462 ; AVX-LABEL: foldv16i16u:
1464 ; AVX-NEXT: vmovaps {{.*#+}} ymm0 = [7,0,16,8,16,13,11,9,0,8,15,14,13,12,11,10]
1467 ; AVX512VLCD-LABEL: foldv16i16u:
1468 ; AVX512VLCD: ## BB#0:
1469 ; AVX512VLCD-NEXT: vmovdqa64 {{.*#+}} ymm0 = [7,0,16,8,16,13,11,9,0,8,15,14,13,12,11,10]
1470 ; AVX512VLCD-NEXT: retq
1472 ; AVX512CD-LABEL: foldv16i16u:
1473 ; AVX512CD: ## BB#0:
1474 ; AVX512CD-NEXT: vmovaps {{.*#+}} ymm0 = [7,0,16,8,16,13,11,9,0,8,15,14,13,12,11,10]
1475 ; AVX512CD-NEXT: retq
1476 %out = call <16 x i16> @llvm.ctlz.v16i16(<16 x i16> <i16 256, i16 -1, i16 0, i16 255, i16 -65536, i16 7, i16 24, i16 88, i16 -2, i16 254, i16 1, i16 2, i16 4, i16 8, i16 16, i16 32>, i1 -1)
1480 define <32 x i8> @foldv32i8() nounwind {
1481 ; AVX-LABEL: foldv32i8:
1483 ; AVX-NEXT: vmovaps {{.*#+}} ymm0 = [8,0,8,0,8,5,3,1,0,0,7,6,5,4,3,2,1,0,8,8,0,0,0,0,0,0,0,0,6,5,5,1]
1486 ; AVX512VLCD-LABEL: foldv32i8:
1487 ; AVX512VLCD: ## BB#0:
1488 ; AVX512VLCD-NEXT: vmovdqa64 {{.*#+}} ymm0 = [8,0,8,0,8,5,3,1,0,0,7,6,5,4,3,2,1,0,8,8,0,0,0,0,0,0,0,0,6,5,5,1]
1489 ; AVX512VLCD-NEXT: retq
1491 ; AVX512CD-LABEL: foldv32i8:
1492 ; AVX512CD: ## BB#0:
1493 ; AVX512CD-NEXT: vmovaps {{.*#+}} ymm0 = [8,0,8,0,8,5,3,1,0,0,7,6,5,4,3,2,1,0,8,8,0,0,0,0,0,0,0,0,6,5,5,1]
1494 ; AVX512CD-NEXT: retq
1495 %out = call <32 x i8> @llvm.ctlz.v32i8(<32 x i8> <i8 256, i8 -1, i8 0, i8 255, i8 -65536, i8 7, i8 24, i8 88, i8 -2, i8 254, i8 1, i8 2, i8 4, i8 8, i8 16, i8 32, i8 64, i8 128, i8 256, i8 -256, i8 -128, i8 -64, i8 -32, i8 -16, i8 -8, i8 -4, i8 -2, i8 -1, i8 3, i8 5, i8 7, i8 127>, i1 0)
1499 define <32 x i8> @foldv32i8u() nounwind {
1500 ; AVX-LABEL: foldv32i8u:
1502 ; AVX-NEXT: vmovaps {{.*#+}} ymm0 = [8,0,8,0,8,5,3,1,0,0,7,6,5,4,3,2,1,0,8,8,0,0,0,0,0,0,0,0,6,5,5,1]
1505 ; AVX512VLCD-LABEL: foldv32i8u:
1506 ; AVX512VLCD: ## BB#0:
1507 ; AVX512VLCD-NEXT: vmovdqa64 {{.*#+}} ymm0 = [8,0,8,0,8,5,3,1,0,0,7,6,5,4,3,2,1,0,8,8,0,0,0,0,0,0,0,0,6,5,5,1]
1508 ; AVX512VLCD-NEXT: retq
1510 ; AVX512CD-LABEL: foldv32i8u:
1511 ; AVX512CD: ## BB#0:
1512 ; AVX512CD-NEXT: vmovaps {{.*#+}} ymm0 = [8,0,8,0,8,5,3,1,0,0,7,6,5,4,3,2,1,0,8,8,0,0,0,0,0,0,0,0,6,5,5,1]
1513 ; AVX512CD-NEXT: retq
1514 %out = call <32 x i8> @llvm.ctlz.v32i8(<32 x i8> <i8 256, i8 -1, i8 0, i8 255, i8 -65536, i8 7, i8 24, i8 88, i8 -2, i8 254, i8 1, i8 2, i8 4, i8 8, i8 16, i8 32, i8 64, i8 128, i8 256, i8 -256, i8 -128, i8 -64, i8 -32, i8 -16, i8 -8, i8 -4, i8 -2, i8 -1, i8 3, i8 5, i8 7, i8 127>, i1 -1)
1518 declare <4 x i64> @llvm.ctlz.v4i64(<4 x i64>, i1)
1519 declare <8 x i32> @llvm.ctlz.v8i32(<8 x i32>, i1)
1520 declare <16 x i16> @llvm.ctlz.v16i16(<16 x i16>, i1)
1521 declare <32 x i8> @llvm.ctlz.v32i8(<32 x i8>, i1)