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