d799e0719c022a6b7346d151a31a32807788b0d8
[oota-llvm.git] / test / CodeGen / X86 / vector-lzcnt-256.ll
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
5
6 define <4 x i64> @testv4i64(<4 x i64> %in) nounwind {
7 ; AVX1-LABEL: testv4i64:
8 ; AVX1:       # BB#0:
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
34 ; AVX1-NEXT:    retq
35 ;
36 ; AVX2-LABEL: testv4i64:
37 ; AVX2:       # BB#0:
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
63 ; AVX2-NEXT:    retq
64 ;
65 ; AVX512VLCD-LABEL: testv4i64:
66 ; AVX512VLCD:       ## BB#0:
67 ; AVX512VLCD-NEXT:    vplzcntq %ymm0, %ymm0
68 ; AVX512VLCD-NEXT:    retq
69 ;
70 ; AVX512CD-LABEL: testv4i64:
71 ; AVX512CD:       ## BB#0:
72 ; AVX512CD-NEXT:    vplzcntq %zmm0, %zmm0
73 ; AVX512CD-NEXT:    retq
74
75   %out = call <4 x i64> @llvm.ctlz.v4i64(<4 x i64> %in, i1 0)
76   ret <4 x i64> %out
77 }
78
79 define <4 x i64> @testv4i64u(<4 x i64> %in) nounwind {
80 ; AVX1-LABEL: testv4i64u:
81 ; AVX1:       # BB#0:
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
102 ; AVX1-NEXT:    retq
103 ;
104 ; AVX2-LABEL: testv4i64u:
105 ; AVX2:       # BB#0:
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
126 ; AVX2-NEXT:    retq
127 ;
128 ; AVX512VLCD-LABEL: testv4i64u:
129 ; AVX512VLCD:       ## BB#0:
130 ; AVX512VLCD-NEXT:    vplzcntq %ymm0, %ymm0
131 ; AVX512VLCD-NEXT:    retq
132 ;
133 ; AVX512CD-LABEL: testv4i64u:
134 ; AVX512CD:       ## BB#0:
135 ; AVX512CD-NEXT:    vplzcntq %zmm0, %zmm0
136 ; AVX512CD-NEXT:    retq
137
138   %out = call <4 x i64> @llvm.ctlz.v4i64(<4 x i64> %in, i1 -1)
139   ret <4 x i64> %out
140 }
141
142 define <8 x i32> @testv8i32(<8 x i32> %in) nounwind {
143 ; AVX1-LABEL: testv8i32:
144 ; AVX1:       # BB#0:
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
188 ; AVX1-NEXT:    retq
189 ;
190 ; AVX2-LABEL: testv8i32:
191 ; AVX2:       # BB#0:
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
235 ; AVX2-NEXT:    retq
236 ;
237 ; AVX512VLCD-LABEL: testv8i32:
238 ; AVX512VLCD:       ## BB#0:
239 ; AVX512VLCD-NEXT:    vplzcntd %ymm0, %ymm0
240 ; AVX512VLCD-NEXT:    retq
241 ;
242 ; AVX512CD-LABEL: testv8i32:
243 ; AVX512CD:       ## BB#0:
244 ; AVX512CD-NEXT:    vplzcntd %zmm0, %zmm0
245 ; AVX512CD-NEXT:    retq
246
247   %out = call <8 x i32> @llvm.ctlz.v8i32(<8 x i32> %in, i1 0)
248   ret <8 x i32> %out
249 }
250
251 define <8 x i32> @testv8i32u(<8 x i32> %in) nounwind {
252 ; AVX1-LABEL: testv8i32u:
253 ; AVX1:       # BB#0:
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
288 ; AVX1-NEXT:    retq
289 ;
290 ; AVX2-LABEL: testv8i32u:
291 ; AVX2:       # BB#0:
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
326 ; AVX2-NEXT:    retq
327 ;
328 ; AVX512VLCD-LABEL: testv8i32u:
329 ; AVX512VLCD:       ## BB#0:
330 ; AVX512VLCD-NEXT:    vplzcntd %ymm0, %ymm0
331 ; AVX512VLCD-NEXT:    retq
332 ;
333 ; AVX512CD-LABEL: testv8i32u:
334 ; AVX512CD:       ## BB#0:
335 ; AVX512CD-NEXT:    vplzcntd %zmm0, %zmm0
336 ; AVX512CD-NEXT:    retq
337
338   %out = call <8 x i32> @llvm.ctlz.v8i32(<8 x i32> %in, i1 -1)
339   ret <8 x i32> %out
340 }
341
342 define <16 x i16> @testv16i16(<16 x i16> %in) nounwind {
343 ; AVX1-LABEL: testv16i16:
344 ; AVX1:       # BB#0:
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
428 ; AVX1-NEXT:    retq
429 ;
430 ; AVX2-LABEL: testv16i16:
431 ; AVX2:       # BB#0:
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
515 ; AVX2-NEXT:    retq
516 ;
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
524 ;
525 ; AVX512CD-LABEL: testv16i16:
526 ; AVX512CD:       ## BB#0:
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)
533   ret <16 x i16> %out
534 }
535
536 define <16 x i16> @testv16i16u(<16 x i16> %in) nounwind {
537 ; AVX1-LABEL: testv16i16u:
538 ; AVX1:       # BB#0:
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
605 ; AVX1-NEXT:    retq
606 ;
607 ; AVX2-LABEL: testv16i16u:
608 ; AVX2:       # BB#0:
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
675 ; AVX2-NEXT:    retq
676 ;
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
684 ;
685 ; AVX512CD-LABEL: testv16i16u:
686 ; AVX512CD:       ## BB#0:
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)
693   ret <16 x i16> %out
694 }
695
696 define <32 x i8> @testv32i8(<32 x i8> %in) nounwind {
697 ; AVX1-LABEL: testv32i8:
698 ; AVX1:       # BB#0:
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
862 ; AVX1-NEXT:    retq
863 ;
864 ; AVX2-LABEL: testv32i8:
865 ; AVX2:       # BB#0:
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
1029 ; AVX2-NEXT:    retq
1030 ;
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
1045 ;
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)
1061   ret <32 x i8> %out
1062 }
1063
1064 define <32 x i8> @testv32i8u(<32 x i8> %in) nounwind {
1065 ; AVX1-LABEL: testv32i8u:
1066 ; AVX1:       # BB#0:
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
1197 ; AVX1-NEXT:    retq
1198 ;
1199 ; AVX2-LABEL: testv32i8u:
1200 ; AVX2:       # BB#0:
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
1331 ; AVX2-NEXT:    retq
1332 ;
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
1347 ;
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)
1363   ret <32 x i8> %out
1364 }
1365
1366 define <4 x i64> @foldv4i64() nounwind {
1367 ; AVX-LABEL: foldv4i64:
1368 ; AVX:       # BB#0:
1369 ; AVX-NEXT:    vmovaps {{.*#+}} ymm0 = [55,0,64,56]
1370 ; AVX-NEXT:    retq
1371 ;
1372 ; AVX512VLCD-LABEL: foldv4i64:
1373 ; AVX512VLCD:       ## BB#0:
1374 ; AVX512VLCD-NEXT:    vmovdqa64 {{.*#+}} ymm0 = [55,0,64,56]
1375 ; AVX512VLCD-NEXT:    retq
1376 ;
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)
1382   ret <4 x i64> %out
1383 }
1384
1385 define <4 x i64> @foldv4i64u() nounwind {
1386 ; AVX-LABEL: foldv4i64u:
1387 ; AVX:       # BB#0:
1388 ; AVX-NEXT:    vmovaps {{.*#+}} ymm0 = [55,0,64,56]
1389 ; AVX-NEXT:    retq
1390 ;
1391 ; AVX512VLCD-LABEL: foldv4i64u:
1392 ; AVX512VLCD:       ## BB#0:
1393 ; AVX512VLCD-NEXT:    vmovdqa64 {{.*#+}} ymm0 = [55,0,64,56]
1394 ; AVX512VLCD-NEXT:    retq
1395 ;
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)
1401   ret <4 x i64> %out
1402 }
1403
1404 define <8 x i32> @foldv8i32() nounwind {
1405 ; AVX-LABEL: foldv8i32:
1406 ; AVX:       # BB#0:
1407 ; AVX-NEXT:    vmovaps {{.*#+}} ymm0 = [23,0,32,24,0,29,27,25]
1408 ; AVX-NEXT:    retq
1409 ;
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
1414 ;
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)
1420   ret <8 x i32> %out
1421 }
1422
1423 define <8 x i32> @foldv8i32u() nounwind {
1424 ; AVX-LABEL: foldv8i32u:
1425 ; AVX:       # BB#0:
1426 ; AVX-NEXT:    vmovaps {{.*#+}} ymm0 = [23,0,32,24,0,29,27,25]
1427 ; AVX-NEXT:    retq
1428 ;
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
1433 ;
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)
1439   ret <8 x i32> %out
1440 }
1441
1442 define <16 x i16> @foldv16i16() nounwind {
1443 ; AVX-LABEL: foldv16i16:
1444 ; AVX:       # BB#0:
1445 ; AVX-NEXT:    vmovaps {{.*#+}} ymm0 = [7,0,16,8,16,13,11,9,0,8,15,14,13,12,11,10]
1446 ; AVX-NEXT:    retq
1447 ;
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
1452 ;
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)
1458   ret <16 x i16> %out
1459 }
1460
1461 define <16 x i16> @foldv16i16u() nounwind {
1462 ; AVX-LABEL: foldv16i16u:
1463 ; AVX:       # BB#0:
1464 ; AVX-NEXT:    vmovaps {{.*#+}} ymm0 = [7,0,16,8,16,13,11,9,0,8,15,14,13,12,11,10]
1465 ; AVX-NEXT:    retq
1466 ;
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
1471 ;
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)
1477   ret <16 x i16> %out
1478 }
1479
1480 define <32 x i8> @foldv32i8() nounwind {
1481 ; AVX-LABEL: foldv32i8:
1482 ; AVX:       # BB#0:
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]
1484 ; AVX-NEXT:    retq
1485 ;
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
1490 ;
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)
1496   ret <32 x i8> %out
1497 }
1498
1499 define <32 x i8> @foldv32i8u() nounwind {
1500 ; AVX-LABEL: foldv32i8u:
1501 ; AVX:       # BB#0:
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]
1503 ; AVX-NEXT:    retq
1504 ;
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
1509 ;
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)
1515   ret <32 x i8> %out
1516 }
1517
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)