Enhance BranchProbabilityInfo::calcUnreachableHeuristics for InvokeInst
[oota-llvm.git] / test / CodeGen / X86 / vector-lzcnt-128.ll
1 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE2
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse3 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE3
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSSE3
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE41
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2
7 ; 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
8 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=knl -mattr=+avx512cd | FileCheck %s --check-prefix=AVX512CD --check-prefix=ALL --check-prefix=AVX512
9
10 define <2 x i64> @testv2i64(<2 x i64> %in) nounwind {
11 ; SSE2-LABEL: testv2i64:
12 ; SSE2:       # BB#0:
13 ; SSE2-NEXT:    movd %xmm0, %rax
14 ; SSE2-NEXT:    bsrq %rax, %rax
15 ; SSE2-NEXT:    movl $127, %ecx
16 ; SSE2-NEXT:    cmoveq %rcx, %rax
17 ; SSE2-NEXT:    xorq $63, %rax
18 ; SSE2-NEXT:    movd %rax, %xmm1
19 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
20 ; SSE2-NEXT:    movd %xmm0, %rax
21 ; SSE2-NEXT:    bsrq %rax, %rax
22 ; SSE2-NEXT:    cmoveq %rcx, %rax
23 ; SSE2-NEXT:    xorq $63, %rax
24 ; SSE2-NEXT:    movd %rax, %xmm0
25 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
26 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
27 ; SSE2-NEXT:    retq
28 ;
29 ; SSE3-LABEL: testv2i64:
30 ; SSE3:       # BB#0:
31 ; SSE3-NEXT:    movd %xmm0, %rax
32 ; SSE3-NEXT:    bsrq %rax, %rax
33 ; SSE3-NEXT:    movl $127, %ecx
34 ; SSE3-NEXT:    cmoveq %rcx, %rax
35 ; SSE3-NEXT:    xorq $63, %rax
36 ; SSE3-NEXT:    movd %rax, %xmm1
37 ; SSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
38 ; SSE3-NEXT:    movd %xmm0, %rax
39 ; SSE3-NEXT:    bsrq %rax, %rax
40 ; SSE3-NEXT:    cmoveq %rcx, %rax
41 ; SSE3-NEXT:    xorq $63, %rax
42 ; SSE3-NEXT:    movd %rax, %xmm0
43 ; SSE3-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
44 ; SSE3-NEXT:    movdqa %xmm1, %xmm0
45 ; SSE3-NEXT:    retq
46 ;
47 ; SSSE3-LABEL: testv2i64:
48 ; SSSE3:       # BB#0:
49 ; SSSE3-NEXT:    movd %xmm0, %rax
50 ; SSSE3-NEXT:    bsrq %rax, %rax
51 ; SSSE3-NEXT:    movl $127, %ecx
52 ; SSSE3-NEXT:    cmoveq %rcx, %rax
53 ; SSSE3-NEXT:    xorq $63, %rax
54 ; SSSE3-NEXT:    movd %rax, %xmm1
55 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
56 ; SSSE3-NEXT:    movd %xmm0, %rax
57 ; SSSE3-NEXT:    bsrq %rax, %rax
58 ; SSSE3-NEXT:    cmoveq %rcx, %rax
59 ; SSSE3-NEXT:    xorq $63, %rax
60 ; SSSE3-NEXT:    movd %rax, %xmm0
61 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
62 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
63 ; SSSE3-NEXT:    retq
64 ;
65 ; SSE41-LABEL: testv2i64:
66 ; SSE41:       # BB#0:
67 ; SSE41-NEXT:    pextrq $1, %xmm0, %rax
68 ; SSE41-NEXT:    bsrq %rax, %rax
69 ; SSE41-NEXT:    movl $127, %ecx
70 ; SSE41-NEXT:    cmoveq %rcx, %rax
71 ; SSE41-NEXT:    xorq $63, %rax
72 ; SSE41-NEXT:    movd %rax, %xmm1
73 ; SSE41-NEXT:    movd %xmm0, %rax
74 ; SSE41-NEXT:    bsrq %rax, %rax
75 ; SSE41-NEXT:    cmoveq %rcx, %rax
76 ; SSE41-NEXT:    xorq $63, %rax
77 ; SSE41-NEXT:    movd %rax, %xmm0
78 ; SSE41-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
79 ; SSE41-NEXT:    retq
80 ;
81 ; AVX-LABEL: testv2i64:
82 ; AVX:       # BB#0:
83 ; AVX-NEXT:    vpextrq $1, %xmm0, %rax
84 ; AVX-NEXT:    bsrq %rax, %rax
85 ; AVX-NEXT:    movl $127, %ecx
86 ; AVX-NEXT:    cmoveq %rcx, %rax
87 ; AVX-NEXT:    xorq $63, %rax
88 ; AVX-NEXT:    vmovq %rax, %xmm1
89 ; AVX-NEXT:    vmovq %xmm0, %rax
90 ; AVX-NEXT:    bsrq %rax, %rax
91 ; AVX-NEXT:    cmoveq %rcx, %rax
92 ; AVX-NEXT:    xorq $63, %rax
93 ; AVX-NEXT:    vmovq %rax, %xmm0
94 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
95 ; AVX-NEXT:    retq
96 ;
97 ; AVX512VLCD-LABEL: testv2i64:
98 ; AVX512VLCD:       ## BB#0:
99 ; AVX512VLCD-NEXT:    vplzcntq %xmm0, %xmm0
100 ; AVX512VLCD-NEXT:    retq
101 ;
102 ; AVX512CD-LABEL: testv2i64:
103 ; AVX512CD:       ## BB#0:
104 ; AVX512CD-NEXT:    vplzcntq %zmm0, %zmm0
105 ; AVX512CD-NEXT:    retq
106
107   %out = call <2 x i64> @llvm.ctlz.v2i64(<2 x i64> %in, i1 0)
108   ret <2 x i64> %out
109 }
110
111 define <2 x i64> @testv2i64u(<2 x i64> %in) nounwind {
112 ; SSE2-LABEL: testv2i64u:
113 ; SSE2:       # BB#0:
114 ; SSE2-NEXT:    movd %xmm0, %rax
115 ; SSE2-NEXT:    bsrq %rax, %rax
116 ; SSE2-NEXT:    xorq $63, %rax
117 ; SSE2-NEXT:    movd %rax, %xmm1
118 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
119 ; SSE2-NEXT:    movd %xmm0, %rax
120 ; SSE2-NEXT:    bsrq %rax, %rax
121 ; SSE2-NEXT:    xorq $63, %rax
122 ; SSE2-NEXT:    movd %rax, %xmm0
123 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
124 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
125 ; SSE2-NEXT:    retq
126 ;
127 ; SSE3-LABEL: testv2i64u:
128 ; SSE3:       # BB#0:
129 ; SSE3-NEXT:    movd %xmm0, %rax
130 ; SSE3-NEXT:    bsrq %rax, %rax
131 ; SSE3-NEXT:    xorq $63, %rax
132 ; SSE3-NEXT:    movd %rax, %xmm1
133 ; SSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
134 ; SSE3-NEXT:    movd %xmm0, %rax
135 ; SSE3-NEXT:    bsrq %rax, %rax
136 ; SSE3-NEXT:    xorq $63, %rax
137 ; SSE3-NEXT:    movd %rax, %xmm0
138 ; SSE3-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
139 ; SSE3-NEXT:    movdqa %xmm1, %xmm0
140 ; SSE3-NEXT:    retq
141 ;
142 ; SSSE3-LABEL: testv2i64u:
143 ; SSSE3:       # BB#0:
144 ; SSSE3-NEXT:    movd %xmm0, %rax
145 ; SSSE3-NEXT:    bsrq %rax, %rax
146 ; SSSE3-NEXT:    xorq $63, %rax
147 ; SSSE3-NEXT:    movd %rax, %xmm1
148 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
149 ; SSSE3-NEXT:    movd %xmm0, %rax
150 ; SSSE3-NEXT:    bsrq %rax, %rax
151 ; SSSE3-NEXT:    xorq $63, %rax
152 ; SSSE3-NEXT:    movd %rax, %xmm0
153 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
154 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
155 ; SSSE3-NEXT:    retq
156 ;
157 ; SSE41-LABEL: testv2i64u:
158 ; SSE41:       # BB#0:
159 ; SSE41-NEXT:    pextrq $1, %xmm0, %rax
160 ; SSE41-NEXT:    bsrq %rax, %rax
161 ; SSE41-NEXT:    xorq $63, %rax
162 ; SSE41-NEXT:    movd %rax, %xmm1
163 ; SSE41-NEXT:    movd %xmm0, %rax
164 ; SSE41-NEXT:    bsrq %rax, %rax
165 ; SSE41-NEXT:    xorq $63, %rax
166 ; SSE41-NEXT:    movd %rax, %xmm0
167 ; SSE41-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
168 ; SSE41-NEXT:    retq
169 ;
170 ; AVX-LABEL: testv2i64u:
171 ; AVX:       # BB#0:
172 ; AVX-NEXT:    vpextrq $1, %xmm0, %rax
173 ; AVX-NEXT:    bsrq %rax, %rax
174 ; AVX-NEXT:    xorq $63, %rax
175 ; AVX-NEXT:    vmovq %rax, %xmm1
176 ; AVX-NEXT:    vmovq %xmm0, %rax
177 ; AVX-NEXT:    bsrq %rax, %rax
178 ; AVX-NEXT:    xorq $63, %rax
179 ; AVX-NEXT:    vmovq %rax, %xmm0
180 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
181 ; AVX-NEXT:    retq
182 ;
183 ; AVX512VLCD-LABEL: testv2i64u:
184 ; AVX512VLCD:       ## BB#0:
185 ; AVX512VLCD-NEXT:    vplzcntq %xmm0, %xmm0
186 ; AVX512VLCD-NEXT:    retq
187 ;
188 ; AVX512CD-LABEL: testv2i64u:
189 ; AVX512CD:       ## BB#0:
190 ; AVX512CD-NEXT:    vplzcntq %zmm0, %zmm0
191 ; AVX512CD-NEXT:    retq
192
193   %out = call <2 x i64> @llvm.ctlz.v2i64(<2 x i64> %in, i1 -1)
194   ret <2 x i64> %out
195 }
196
197 define <4 x i32> @testv4i32(<4 x i32> %in) nounwind {
198 ; SSE2-LABEL: testv4i32:
199 ; SSE2:       # BB#0:
200 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[3,1,2,3]
201 ; SSE2-NEXT:    movd %xmm1, %eax
202 ; SSE2-NEXT:    bsrl %eax, %eax
203 ; SSE2-NEXT:    movl $63, %ecx
204 ; SSE2-NEXT:    cmovel %ecx, %eax
205 ; SSE2-NEXT:    xorl $31, %eax
206 ; SSE2-NEXT:    movd %eax, %xmm1
207 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,2,3]
208 ; SSE2-NEXT:    movd %xmm2, %eax
209 ; SSE2-NEXT:    bsrl %eax, %eax
210 ; SSE2-NEXT:    cmovel %ecx, %eax
211 ; SSE2-NEXT:    xorl $31, %eax
212 ; SSE2-NEXT:    movd %eax, %xmm2
213 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
214 ; SSE2-NEXT:    movd %xmm0, %eax
215 ; SSE2-NEXT:    bsrl %eax, %eax
216 ; SSE2-NEXT:    cmovel %ecx, %eax
217 ; SSE2-NEXT:    xorl $31, %eax
218 ; SSE2-NEXT:    movd %eax, %xmm1
219 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
220 ; SSE2-NEXT:    movd %xmm0, %eax
221 ; SSE2-NEXT:    bsrl %eax, %eax
222 ; SSE2-NEXT:    cmovel %ecx, %eax
223 ; SSE2-NEXT:    xorl $31, %eax
224 ; SSE2-NEXT:    movd %eax, %xmm0
225 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
226 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
227 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
228 ; SSE2-NEXT:    retq
229 ;
230 ; SSE3-LABEL: testv4i32:
231 ; SSE3:       # BB#0:
232 ; SSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[3,1,2,3]
233 ; SSE3-NEXT:    movd %xmm1, %eax
234 ; SSE3-NEXT:    bsrl %eax, %eax
235 ; SSE3-NEXT:    movl $63, %ecx
236 ; SSE3-NEXT:    cmovel %ecx, %eax
237 ; SSE3-NEXT:    xorl $31, %eax
238 ; SSE3-NEXT:    movd %eax, %xmm1
239 ; SSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,2,3]
240 ; SSE3-NEXT:    movd %xmm2, %eax
241 ; SSE3-NEXT:    bsrl %eax, %eax
242 ; SSE3-NEXT:    cmovel %ecx, %eax
243 ; SSE3-NEXT:    xorl $31, %eax
244 ; SSE3-NEXT:    movd %eax, %xmm2
245 ; SSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
246 ; SSE3-NEXT:    movd %xmm0, %eax
247 ; SSE3-NEXT:    bsrl %eax, %eax
248 ; SSE3-NEXT:    cmovel %ecx, %eax
249 ; SSE3-NEXT:    xorl $31, %eax
250 ; SSE3-NEXT:    movd %eax, %xmm1
251 ; SSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
252 ; SSE3-NEXT:    movd %xmm0, %eax
253 ; SSE3-NEXT:    bsrl %eax, %eax
254 ; SSE3-NEXT:    cmovel %ecx, %eax
255 ; SSE3-NEXT:    xorl $31, %eax
256 ; SSE3-NEXT:    movd %eax, %xmm0
257 ; SSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
258 ; SSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
259 ; SSE3-NEXT:    movdqa %xmm1, %xmm0
260 ; SSE3-NEXT:    retq
261 ;
262 ; SSSE3-LABEL: testv4i32:
263 ; SSSE3:       # BB#0:
264 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[3,1,2,3]
265 ; SSSE3-NEXT:    movd %xmm1, %eax
266 ; SSSE3-NEXT:    bsrl %eax, %eax
267 ; SSSE3-NEXT:    movl $63, %ecx
268 ; SSSE3-NEXT:    cmovel %ecx, %eax
269 ; SSSE3-NEXT:    xorl $31, %eax
270 ; SSSE3-NEXT:    movd %eax, %xmm1
271 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,2,3]
272 ; SSSE3-NEXT:    movd %xmm2, %eax
273 ; SSSE3-NEXT:    bsrl %eax, %eax
274 ; SSSE3-NEXT:    cmovel %ecx, %eax
275 ; SSSE3-NEXT:    xorl $31, %eax
276 ; SSSE3-NEXT:    movd %eax, %xmm2
277 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
278 ; SSSE3-NEXT:    movd %xmm0, %eax
279 ; SSSE3-NEXT:    bsrl %eax, %eax
280 ; SSSE3-NEXT:    cmovel %ecx, %eax
281 ; SSSE3-NEXT:    xorl $31, %eax
282 ; SSSE3-NEXT:    movd %eax, %xmm1
283 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
284 ; SSSE3-NEXT:    movd %xmm0, %eax
285 ; SSSE3-NEXT:    bsrl %eax, %eax
286 ; SSSE3-NEXT:    cmovel %ecx, %eax
287 ; SSSE3-NEXT:    xorl $31, %eax
288 ; SSSE3-NEXT:    movd %eax, %xmm0
289 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
290 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
291 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
292 ; SSSE3-NEXT:    retq
293 ;
294 ; SSE41-LABEL: testv4i32:
295 ; SSE41:       # BB#0:
296 ; SSE41-NEXT:    pextrd $1, %xmm0, %eax
297 ; SSE41-NEXT:    bsrl %eax, %eax
298 ; SSE41-NEXT:    movl $63, %ecx
299 ; SSE41-NEXT:    cmovel %ecx, %eax
300 ; SSE41-NEXT:    xorl $31, %eax
301 ; SSE41-NEXT:    movd %xmm0, %edx
302 ; SSE41-NEXT:    bsrl %edx, %edx
303 ; SSE41-NEXT:    cmovel %ecx, %edx
304 ; SSE41-NEXT:    xorl $31, %edx
305 ; SSE41-NEXT:    movd %edx, %xmm1
306 ; SSE41-NEXT:    pinsrd $1, %eax, %xmm1
307 ; SSE41-NEXT:    pextrd $2, %xmm0, %eax
308 ; SSE41-NEXT:    bsrl %eax, %eax
309 ; SSE41-NEXT:    cmovel %ecx, %eax
310 ; SSE41-NEXT:    xorl $31, %eax
311 ; SSE41-NEXT:    pinsrd $2, %eax, %xmm1
312 ; SSE41-NEXT:    pextrd $3, %xmm0, %eax
313 ; SSE41-NEXT:    bsrl %eax, %eax
314 ; SSE41-NEXT:    cmovel %ecx, %eax
315 ; SSE41-NEXT:    xorl $31, %eax
316 ; SSE41-NEXT:    pinsrd $3, %eax, %xmm1
317 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
318 ; SSE41-NEXT:    retq
319 ;
320 ; AVX-LABEL: testv4i32:
321 ; AVX:       # BB#0:
322 ; AVX-NEXT:    vpextrd $1, %xmm0, %eax
323 ; AVX-NEXT:    bsrl %eax, %eax
324 ; AVX-NEXT:    movl $63, %ecx
325 ; AVX-NEXT:    cmovel %ecx, %eax
326 ; AVX-NEXT:    xorl $31, %eax
327 ; AVX-NEXT:    vmovd %xmm0, %edx
328 ; AVX-NEXT:    bsrl %edx, %edx
329 ; AVX-NEXT:    cmovel %ecx, %edx
330 ; AVX-NEXT:    xorl $31, %edx
331 ; AVX-NEXT:    vmovd %edx, %xmm1
332 ; AVX-NEXT:    vpinsrd $1, %eax, %xmm1, %xmm1
333 ; AVX-NEXT:    vpextrd $2, %xmm0, %eax
334 ; AVX-NEXT:    bsrl %eax, %eax
335 ; AVX-NEXT:    cmovel %ecx, %eax
336 ; AVX-NEXT:    xorl $31, %eax
337 ; AVX-NEXT:    vpinsrd $2, %eax, %xmm1, %xmm1
338 ; AVX-NEXT:    vpextrd $3, %xmm0, %eax
339 ; AVX-NEXT:    bsrl %eax, %eax
340 ; AVX-NEXT:    cmovel %ecx, %eax
341 ; AVX-NEXT:    xorl $31, %eax
342 ; AVX-NEXT:    vpinsrd $3, %eax, %xmm1, %xmm0
343 ; AVX-NEXT:    retq
344 ;
345 ; AVX512VLCD-LABEL: testv4i32:
346 ; AVX512VLCD:       ## BB#0:
347 ; AVX512VLCD-NEXT:    vplzcntd %xmm0, %xmm0
348 ; AVX512VLCD-NEXT:    retq
349 ;
350 ; AVX512CD-LABEL: testv4i32:
351 ; AVX512CD:       ## BB#0:
352 ; AVX512CD-NEXT:    vplzcntd %zmm0, %zmm0
353 ; AVX512CD-NEXT:    retq
354
355   %out = call <4 x i32> @llvm.ctlz.v4i32(<4 x i32> %in, i1 0)
356   ret <4 x i32> %out
357 }
358
359 define <4 x i32> @testv4i32u(<4 x i32> %in) nounwind {
360 ; SSE2-LABEL: testv4i32u:
361 ; SSE2:       # BB#0:
362 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[3,1,2,3]
363 ; SSE2-NEXT:    movd %xmm1, %eax
364 ; SSE2-NEXT:    bsrl %eax, %eax
365 ; SSE2-NEXT:    xorl $31, %eax
366 ; SSE2-NEXT:    movd %eax, %xmm1
367 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,2,3]
368 ; SSE2-NEXT:    movd %xmm2, %eax
369 ; SSE2-NEXT:    bsrl %eax, %eax
370 ; SSE2-NEXT:    xorl $31, %eax
371 ; SSE2-NEXT:    movd %eax, %xmm2
372 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
373 ; SSE2-NEXT:    movd %xmm0, %eax
374 ; SSE2-NEXT:    bsrl %eax, %eax
375 ; SSE2-NEXT:    xorl $31, %eax
376 ; SSE2-NEXT:    movd %eax, %xmm1
377 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
378 ; SSE2-NEXT:    movd %xmm0, %eax
379 ; SSE2-NEXT:    bsrl %eax, %eax
380 ; SSE2-NEXT:    xorl $31, %eax
381 ; SSE2-NEXT:    movd %eax, %xmm0
382 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
383 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
384 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
385 ; SSE2-NEXT:    retq
386 ;
387 ; SSE3-LABEL: testv4i32u:
388 ; SSE3:       # BB#0:
389 ; SSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[3,1,2,3]
390 ; SSE3-NEXT:    movd %xmm1, %eax
391 ; SSE3-NEXT:    bsrl %eax, %eax
392 ; SSE3-NEXT:    xorl $31, %eax
393 ; SSE3-NEXT:    movd %eax, %xmm1
394 ; SSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,2,3]
395 ; SSE3-NEXT:    movd %xmm2, %eax
396 ; SSE3-NEXT:    bsrl %eax, %eax
397 ; SSE3-NEXT:    xorl $31, %eax
398 ; SSE3-NEXT:    movd %eax, %xmm2
399 ; SSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
400 ; SSE3-NEXT:    movd %xmm0, %eax
401 ; SSE3-NEXT:    bsrl %eax, %eax
402 ; SSE3-NEXT:    xorl $31, %eax
403 ; SSE3-NEXT:    movd %eax, %xmm1
404 ; SSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
405 ; SSE3-NEXT:    movd %xmm0, %eax
406 ; SSE3-NEXT:    bsrl %eax, %eax
407 ; SSE3-NEXT:    xorl $31, %eax
408 ; SSE3-NEXT:    movd %eax, %xmm0
409 ; SSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
410 ; SSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
411 ; SSE3-NEXT:    movdqa %xmm1, %xmm0
412 ; SSE3-NEXT:    retq
413 ;
414 ; SSSE3-LABEL: testv4i32u:
415 ; SSSE3:       # BB#0:
416 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[3,1,2,3]
417 ; SSSE3-NEXT:    movd %xmm1, %eax
418 ; SSSE3-NEXT:    bsrl %eax, %eax
419 ; SSSE3-NEXT:    xorl $31, %eax
420 ; SSSE3-NEXT:    movd %eax, %xmm1
421 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,2,3]
422 ; SSSE3-NEXT:    movd %xmm2, %eax
423 ; SSSE3-NEXT:    bsrl %eax, %eax
424 ; SSSE3-NEXT:    xorl $31, %eax
425 ; SSSE3-NEXT:    movd %eax, %xmm2
426 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
427 ; SSSE3-NEXT:    movd %xmm0, %eax
428 ; SSSE3-NEXT:    bsrl %eax, %eax
429 ; SSSE3-NEXT:    xorl $31, %eax
430 ; SSSE3-NEXT:    movd %eax, %xmm1
431 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
432 ; SSSE3-NEXT:    movd %xmm0, %eax
433 ; SSSE3-NEXT:    bsrl %eax, %eax
434 ; SSSE3-NEXT:    xorl $31, %eax
435 ; SSSE3-NEXT:    movd %eax, %xmm0
436 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
437 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
438 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
439 ; SSSE3-NEXT:    retq
440 ;
441 ; SSE41-LABEL: testv4i32u:
442 ; SSE41:       # BB#0:
443 ; SSE41-NEXT:    pextrd $1, %xmm0, %eax
444 ; SSE41-NEXT:    bsrl %eax, %eax
445 ; SSE41-NEXT:    xorl $31, %eax
446 ; SSE41-NEXT:    movd %xmm0, %ecx
447 ; SSE41-NEXT:    bsrl %ecx, %ecx
448 ; SSE41-NEXT:    xorl $31, %ecx
449 ; SSE41-NEXT:    movd %ecx, %xmm1
450 ; SSE41-NEXT:    pinsrd $1, %eax, %xmm1
451 ; SSE41-NEXT:    pextrd $2, %xmm0, %eax
452 ; SSE41-NEXT:    bsrl %eax, %eax
453 ; SSE41-NEXT:    xorl $31, %eax
454 ; SSE41-NEXT:    pinsrd $2, %eax, %xmm1
455 ; SSE41-NEXT:    pextrd $3, %xmm0, %eax
456 ; SSE41-NEXT:    bsrl %eax, %eax
457 ; SSE41-NEXT:    xorl $31, %eax
458 ; SSE41-NEXT:    pinsrd $3, %eax, %xmm1
459 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
460 ; SSE41-NEXT:    retq
461 ;
462 ; AVX-LABEL: testv4i32u:
463 ; AVX:       # BB#0:
464 ; AVX-NEXT:    vpextrd $1, %xmm0, %eax
465 ; AVX-NEXT:    bsrl %eax, %eax
466 ; AVX-NEXT:    xorl $31, %eax
467 ; AVX-NEXT:    vmovd %xmm0, %ecx
468 ; AVX-NEXT:    bsrl %ecx, %ecx
469 ; AVX-NEXT:    xorl $31, %ecx
470 ; AVX-NEXT:    vmovd %ecx, %xmm1
471 ; AVX-NEXT:    vpinsrd $1, %eax, %xmm1, %xmm1
472 ; AVX-NEXT:    vpextrd $2, %xmm0, %eax
473 ; AVX-NEXT:    bsrl %eax, %eax
474 ; AVX-NEXT:    xorl $31, %eax
475 ; AVX-NEXT:    vpinsrd $2, %eax, %xmm1, %xmm1
476 ; AVX-NEXT:    vpextrd $3, %xmm0, %eax
477 ; AVX-NEXT:    bsrl %eax, %eax
478 ; AVX-NEXT:    xorl $31, %eax
479 ; AVX-NEXT:    vpinsrd $3, %eax, %xmm1, %xmm0
480 ; AVX-NEXT:    retq
481 ;
482 ; AVX512VLCD-LABEL: testv4i32u:
483 ; AVX512VLCD:       ## BB#0:
484 ; AVX512VLCD-NEXT:    vplzcntd %xmm0, %xmm0
485 ; AVX512VLCD-NEXT:    retq
486 ;
487 ; AVX512CD-LABEL: testv4i32u:
488 ; AVX512CD:       ## BB#0:
489 ; AVX512CD-NEXT:    vplzcntd %zmm0, %zmm0
490 ; AVX512CD-NEXT:    retq
491
492   %out = call <4 x i32> @llvm.ctlz.v4i32(<4 x i32> %in, i1 -1)
493   ret <4 x i32> %out
494 }
495
496 define <8 x i16> @testv8i16(<8 x i16> %in) nounwind {
497 ; SSE2-LABEL: testv8i16:
498 ; SSE2:       # BB#0:
499 ; SSE2-NEXT:    pextrw $7, %xmm0, %eax
500 ; SSE2-NEXT:    bsrw %ax, %cx
501 ; SSE2-NEXT:    movw $31, %ax
502 ; SSE2-NEXT:    cmovew %ax, %cx
503 ; SSE2-NEXT:    xorl $15, %ecx
504 ; SSE2-NEXT:    movd %ecx, %xmm1
505 ; SSE2-NEXT:    pextrw $3, %xmm0, %ecx
506 ; SSE2-NEXT:    bsrw %cx, %cx
507 ; SSE2-NEXT:    cmovew %ax, %cx
508 ; SSE2-NEXT:    xorl $15, %ecx
509 ; SSE2-NEXT:    movd %ecx, %xmm2
510 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
511 ; SSE2-NEXT:    pextrw $5, %xmm0, %ecx
512 ; SSE2-NEXT:    bsrw %cx, %cx
513 ; SSE2-NEXT:    cmovew %ax, %cx
514 ; SSE2-NEXT:    xorl $15, %ecx
515 ; SSE2-NEXT:    movd %ecx, %xmm3
516 ; SSE2-NEXT:    pextrw $1, %xmm0, %ecx
517 ; SSE2-NEXT:    bsrw %cx, %cx
518 ; SSE2-NEXT:    cmovew %ax, %cx
519 ; SSE2-NEXT:    xorl $15, %ecx
520 ; SSE2-NEXT:    movd %ecx, %xmm1
521 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3]
522 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
523 ; SSE2-NEXT:    pextrw $6, %xmm0, %ecx
524 ; SSE2-NEXT:    bsrw %cx, %cx
525 ; SSE2-NEXT:    cmovew %ax, %cx
526 ; SSE2-NEXT:    xorl $15, %ecx
527 ; SSE2-NEXT:    movd %ecx, %xmm2
528 ; SSE2-NEXT:    pextrw $2, %xmm0, %ecx
529 ; SSE2-NEXT:    bsrw %cx, %cx
530 ; SSE2-NEXT:    cmovew %ax, %cx
531 ; SSE2-NEXT:    xorl $15, %ecx
532 ; SSE2-NEXT:    movd %ecx, %xmm3
533 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3]
534 ; SSE2-NEXT:    pextrw $4, %xmm0, %ecx
535 ; SSE2-NEXT:    bsrw %cx, %cx
536 ; SSE2-NEXT:    cmovew %ax, %cx
537 ; SSE2-NEXT:    xorl $15, %ecx
538 ; SSE2-NEXT:    movd %ecx, %xmm2
539 ; SSE2-NEXT:    movd %xmm0, %ecx
540 ; SSE2-NEXT:    bsrw %cx, %cx
541 ; SSE2-NEXT:    cmovew %ax, %cx
542 ; SSE2-NEXT:    xorl $15, %ecx
543 ; SSE2-NEXT:    movd %ecx, %xmm0
544 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
545 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3]
546 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
547 ; SSE2-NEXT:    retq
548 ;
549 ; SSE3-LABEL: testv8i16:
550 ; SSE3:       # BB#0:
551 ; SSE3-NEXT:    pextrw $7, %xmm0, %eax
552 ; SSE3-NEXT:    bsrw %ax, %cx
553 ; SSE3-NEXT:    movw $31, %ax
554 ; SSE3-NEXT:    cmovew %ax, %cx
555 ; SSE3-NEXT:    xorl $15, %ecx
556 ; SSE3-NEXT:    movd %ecx, %xmm1
557 ; SSE3-NEXT:    pextrw $3, %xmm0, %ecx
558 ; SSE3-NEXT:    bsrw %cx, %cx
559 ; SSE3-NEXT:    cmovew %ax, %cx
560 ; SSE3-NEXT:    xorl $15, %ecx
561 ; SSE3-NEXT:    movd %ecx, %xmm2
562 ; SSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
563 ; SSE3-NEXT:    pextrw $5, %xmm0, %ecx
564 ; SSE3-NEXT:    bsrw %cx, %cx
565 ; SSE3-NEXT:    cmovew %ax, %cx
566 ; SSE3-NEXT:    xorl $15, %ecx
567 ; SSE3-NEXT:    movd %ecx, %xmm3
568 ; SSE3-NEXT:    pextrw $1, %xmm0, %ecx
569 ; SSE3-NEXT:    bsrw %cx, %cx
570 ; SSE3-NEXT:    cmovew %ax, %cx
571 ; SSE3-NEXT:    xorl $15, %ecx
572 ; SSE3-NEXT:    movd %ecx, %xmm1
573 ; SSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3]
574 ; SSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
575 ; SSE3-NEXT:    pextrw $6, %xmm0, %ecx
576 ; SSE3-NEXT:    bsrw %cx, %cx
577 ; SSE3-NEXT:    cmovew %ax, %cx
578 ; SSE3-NEXT:    xorl $15, %ecx
579 ; SSE3-NEXT:    movd %ecx, %xmm2
580 ; SSE3-NEXT:    pextrw $2, %xmm0, %ecx
581 ; SSE3-NEXT:    bsrw %cx, %cx
582 ; SSE3-NEXT:    cmovew %ax, %cx
583 ; SSE3-NEXT:    xorl $15, %ecx
584 ; SSE3-NEXT:    movd %ecx, %xmm3
585 ; SSE3-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3]
586 ; SSE3-NEXT:    pextrw $4, %xmm0, %ecx
587 ; SSE3-NEXT:    bsrw %cx, %cx
588 ; SSE3-NEXT:    cmovew %ax, %cx
589 ; SSE3-NEXT:    xorl $15, %ecx
590 ; SSE3-NEXT:    movd %ecx, %xmm2
591 ; SSE3-NEXT:    movd %xmm0, %ecx
592 ; SSE3-NEXT:    bsrw %cx, %cx
593 ; SSE3-NEXT:    cmovew %ax, %cx
594 ; SSE3-NEXT:    xorl $15, %ecx
595 ; SSE3-NEXT:    movd %ecx, %xmm0
596 ; SSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
597 ; SSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3]
598 ; SSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
599 ; SSE3-NEXT:    retq
600 ;
601 ; SSSE3-LABEL: testv8i16:
602 ; SSSE3:       # BB#0:
603 ; SSSE3-NEXT:    pextrw $7, %xmm0, %eax
604 ; SSSE3-NEXT:    bsrw %ax, %cx
605 ; SSSE3-NEXT:    movw $31, %ax
606 ; SSSE3-NEXT:    cmovew %ax, %cx
607 ; SSSE3-NEXT:    xorl $15, %ecx
608 ; SSSE3-NEXT:    movd %ecx, %xmm1
609 ; SSSE3-NEXT:    pextrw $3, %xmm0, %ecx
610 ; SSSE3-NEXT:    bsrw %cx, %cx
611 ; SSSE3-NEXT:    cmovew %ax, %cx
612 ; SSSE3-NEXT:    xorl $15, %ecx
613 ; SSSE3-NEXT:    movd %ecx, %xmm2
614 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
615 ; SSSE3-NEXT:    pextrw $5, %xmm0, %ecx
616 ; SSSE3-NEXT:    bsrw %cx, %cx
617 ; SSSE3-NEXT:    cmovew %ax, %cx
618 ; SSSE3-NEXT:    xorl $15, %ecx
619 ; SSSE3-NEXT:    movd %ecx, %xmm3
620 ; SSSE3-NEXT:    pextrw $1, %xmm0, %ecx
621 ; SSSE3-NEXT:    bsrw %cx, %cx
622 ; SSSE3-NEXT:    cmovew %ax, %cx
623 ; SSSE3-NEXT:    xorl $15, %ecx
624 ; SSSE3-NEXT:    movd %ecx, %xmm1
625 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3]
626 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
627 ; SSSE3-NEXT:    pextrw $6, %xmm0, %ecx
628 ; SSSE3-NEXT:    bsrw %cx, %cx
629 ; SSSE3-NEXT:    cmovew %ax, %cx
630 ; SSSE3-NEXT:    xorl $15, %ecx
631 ; SSSE3-NEXT:    movd %ecx, %xmm2
632 ; SSSE3-NEXT:    pextrw $2, %xmm0, %ecx
633 ; SSSE3-NEXT:    bsrw %cx, %cx
634 ; SSSE3-NEXT:    cmovew %ax, %cx
635 ; SSSE3-NEXT:    xorl $15, %ecx
636 ; SSSE3-NEXT:    movd %ecx, %xmm3
637 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3]
638 ; SSSE3-NEXT:    pextrw $4, %xmm0, %ecx
639 ; SSSE3-NEXT:    bsrw %cx, %cx
640 ; SSSE3-NEXT:    cmovew %ax, %cx
641 ; SSSE3-NEXT:    xorl $15, %ecx
642 ; SSSE3-NEXT:    movd %ecx, %xmm2
643 ; SSSE3-NEXT:    movd %xmm0, %ecx
644 ; SSSE3-NEXT:    bsrw %cx, %cx
645 ; SSSE3-NEXT:    cmovew %ax, %cx
646 ; SSSE3-NEXT:    xorl $15, %ecx
647 ; SSSE3-NEXT:    movd %ecx, %xmm0
648 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
649 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3]
650 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
651 ; SSSE3-NEXT:    retq
652 ;
653 ; SSE41-LABEL: testv8i16:
654 ; SSE41:       # BB#0:
655 ; SSE41-NEXT:    pextrw $1, %xmm0, %eax
656 ; SSE41-NEXT:    bsrw %ax, %cx
657 ; SSE41-NEXT:    movw $31, %ax
658 ; SSE41-NEXT:    cmovew %ax, %cx
659 ; SSE41-NEXT:    xorl $15, %ecx
660 ; SSE41-NEXT:    movd %xmm0, %edx
661 ; SSE41-NEXT:    bsrw %dx, %dx
662 ; SSE41-NEXT:    cmovew %ax, %dx
663 ; SSE41-NEXT:    xorl $15, %edx
664 ; SSE41-NEXT:    movd %edx, %xmm1
665 ; SSE41-NEXT:    pinsrw $1, %ecx, %xmm1
666 ; SSE41-NEXT:    pextrw $2, %xmm0, %ecx
667 ; SSE41-NEXT:    bsrw %cx, %cx
668 ; SSE41-NEXT:    cmovew %ax, %cx
669 ; SSE41-NEXT:    xorl $15, %ecx
670 ; SSE41-NEXT:    pinsrw $2, %ecx, %xmm1
671 ; SSE41-NEXT:    pextrw $3, %xmm0, %ecx
672 ; SSE41-NEXT:    bsrw %cx, %cx
673 ; SSE41-NEXT:    cmovew %ax, %cx
674 ; SSE41-NEXT:    xorl $15, %ecx
675 ; SSE41-NEXT:    pinsrw $3, %ecx, %xmm1
676 ; SSE41-NEXT:    pextrw $4, %xmm0, %ecx
677 ; SSE41-NEXT:    bsrw %cx, %cx
678 ; SSE41-NEXT:    cmovew %ax, %cx
679 ; SSE41-NEXT:    xorl $15, %ecx
680 ; SSE41-NEXT:    pinsrw $4, %ecx, %xmm1
681 ; SSE41-NEXT:    pextrw $5, %xmm0, %ecx
682 ; SSE41-NEXT:    bsrw %cx, %cx
683 ; SSE41-NEXT:    cmovew %ax, %cx
684 ; SSE41-NEXT:    xorl $15, %ecx
685 ; SSE41-NEXT:    pinsrw $5, %ecx, %xmm1
686 ; SSE41-NEXT:    pextrw $6, %xmm0, %ecx
687 ; SSE41-NEXT:    bsrw %cx, %cx
688 ; SSE41-NEXT:    cmovew %ax, %cx
689 ; SSE41-NEXT:    xorl $15, %ecx
690 ; SSE41-NEXT:    pinsrw $6, %ecx, %xmm1
691 ; SSE41-NEXT:    pextrw $7, %xmm0, %ecx
692 ; SSE41-NEXT:    bsrw %cx, %cx
693 ; SSE41-NEXT:    cmovew %ax, %cx
694 ; SSE41-NEXT:    xorl $15, %ecx
695 ; SSE41-NEXT:    pinsrw $7, %ecx, %xmm1
696 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
697 ; SSE41-NEXT:    retq
698 ;
699 ; AVX-LABEL: testv8i16:
700 ; AVX:       # BB#0:
701 ; AVX-NEXT:    vpextrw $1, %xmm0, %eax
702 ; AVX-NEXT:    bsrw %ax, %cx
703 ; AVX-NEXT:    movw $31, %ax
704 ; AVX-NEXT:    cmovew %ax, %cx
705 ; AVX-NEXT:    xorl $15, %ecx
706 ; AVX-NEXT:    vmovd %xmm0, %edx
707 ; AVX-NEXT:    bsrw %dx, %dx
708 ; AVX-NEXT:    cmovew %ax, %dx
709 ; AVX-NEXT:    xorl $15, %edx
710 ; AVX-NEXT:    vmovd %edx, %xmm1
711 ; AVX-NEXT:    vpinsrw $1, %ecx, %xmm1, %xmm1
712 ; AVX-NEXT:    vpextrw $2, %xmm0, %ecx
713 ; AVX-NEXT:    bsrw %cx, %cx
714 ; AVX-NEXT:    cmovew %ax, %cx
715 ; AVX-NEXT:    xorl $15, %ecx
716 ; AVX-NEXT:    vpinsrw $2, %ecx, %xmm1, %xmm1
717 ; AVX-NEXT:    vpextrw $3, %xmm0, %ecx
718 ; AVX-NEXT:    bsrw %cx, %cx
719 ; AVX-NEXT:    cmovew %ax, %cx
720 ; AVX-NEXT:    xorl $15, %ecx
721 ; AVX-NEXT:    vpinsrw $3, %ecx, %xmm1, %xmm1
722 ; AVX-NEXT:    vpextrw $4, %xmm0, %ecx
723 ; AVX-NEXT:    bsrw %cx, %cx
724 ; AVX-NEXT:    cmovew %ax, %cx
725 ; AVX-NEXT:    xorl $15, %ecx
726 ; AVX-NEXT:    vpinsrw $4, %ecx, %xmm1, %xmm1
727 ; AVX-NEXT:    vpextrw $5, %xmm0, %ecx
728 ; AVX-NEXT:    bsrw %cx, %cx
729 ; AVX-NEXT:    cmovew %ax, %cx
730 ; AVX-NEXT:    xorl $15, %ecx
731 ; AVX-NEXT:    vpinsrw $5, %ecx, %xmm1, %xmm1
732 ; AVX-NEXT:    vpextrw $6, %xmm0, %ecx
733 ; AVX-NEXT:    bsrw %cx, %cx
734 ; AVX-NEXT:    cmovew %ax, %cx
735 ; AVX-NEXT:    xorl $15, %ecx
736 ; AVX-NEXT:    vpinsrw $6, %ecx, %xmm1, %xmm1
737 ; AVX-NEXT:    vpextrw $7, %xmm0, %ecx
738 ; AVX-NEXT:    bsrw %cx, %cx
739 ; AVX-NEXT:    cmovew %ax, %cx
740 ; AVX-NEXT:    xorl $15, %ecx
741 ; AVX-NEXT:    vpinsrw $7, %ecx, %xmm1, %xmm0
742 ; AVX-NEXT:    retq
743 ;
744 ; AVX512VLCD-LABEL: testv8i16:
745 ; AVX512VLCD:       ## BB#0:
746 ; AVX512VLCD-NEXT:    vpmovzxwd %xmm0, %ymm0
747 ; AVX512VLCD-NEXT:    vplzcntd %ymm0, %ymm0
748 ; AVX512VLCD-NEXT:    vpmovdw %ymm0, %xmm0
749 ; AVX512VLCD-NEXT:    vpsubw {{.*}}(%rip), %xmm0, %xmm0
750 ; AVX512VLCD-NEXT:    retq
751 ;
752 ; AVX512CD-LABEL: testv8i16:
753 ; AVX512CD:       ## BB#0:
754 ; AVX512CD-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
755 ; AVX512CD-NEXT:    vplzcntd %zmm0, %zmm0
756 ; AVX512CD-NEXT:    vpmovdw %zmm0, %ymm0
757 ; AVX512CD-NEXT:    vpsubw {{.*}}(%rip), %xmm0, %xmm0
758 ; AVX512CD-NEXT:    retq
759   %out = call <8 x i16> @llvm.ctlz.v8i16(<8 x i16> %in, i1 0)
760   ret <8 x i16> %out
761 }
762
763 define <8 x i16> @testv8i16u(<8 x i16> %in) nounwind {
764 ; SSE2-LABEL: testv8i16u:
765 ; SSE2:       # BB#0:
766 ; SSE2-NEXT:    pextrw $7, %xmm0, %eax
767 ; SSE2-NEXT:    bsrw %ax, %ax
768 ; SSE2-NEXT:    xorl $15, %eax
769 ; SSE2-NEXT:    movd %eax, %xmm1
770 ; SSE2-NEXT:    pextrw $3, %xmm0, %eax
771 ; SSE2-NEXT:    bsrw %ax, %ax
772 ; SSE2-NEXT:    xorl $15, %eax
773 ; SSE2-NEXT:    movd %eax, %xmm2
774 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
775 ; SSE2-NEXT:    pextrw $5, %xmm0, %eax
776 ; SSE2-NEXT:    bsrw %ax, %ax
777 ; SSE2-NEXT:    xorl $15, %eax
778 ; SSE2-NEXT:    movd %eax, %xmm3
779 ; SSE2-NEXT:    pextrw $1, %xmm0, %eax
780 ; SSE2-NEXT:    bsrw %ax, %ax
781 ; SSE2-NEXT:    xorl $15, %eax
782 ; SSE2-NEXT:    movd %eax, %xmm1
783 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3]
784 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
785 ; SSE2-NEXT:    pextrw $6, %xmm0, %eax
786 ; SSE2-NEXT:    bsrw %ax, %ax
787 ; SSE2-NEXT:    xorl $15, %eax
788 ; SSE2-NEXT:    movd %eax, %xmm2
789 ; SSE2-NEXT:    pextrw $2, %xmm0, %eax
790 ; SSE2-NEXT:    bsrw %ax, %ax
791 ; SSE2-NEXT:    xorl $15, %eax
792 ; SSE2-NEXT:    movd %eax, %xmm3
793 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3]
794 ; SSE2-NEXT:    pextrw $4, %xmm0, %eax
795 ; SSE2-NEXT:    bsrw %ax, %ax
796 ; SSE2-NEXT:    xorl $15, %eax
797 ; SSE2-NEXT:    movd %eax, %xmm2
798 ; SSE2-NEXT:    movd %xmm0, %eax
799 ; SSE2-NEXT:    bsrw %ax, %ax
800 ; SSE2-NEXT:    xorl $15, %eax
801 ; SSE2-NEXT:    movd %eax, %xmm0
802 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
803 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3]
804 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
805 ; SSE2-NEXT:    retq
806 ;
807 ; SSE3-LABEL: testv8i16u:
808 ; SSE3:       # BB#0:
809 ; SSE3-NEXT:    pextrw $7, %xmm0, %eax
810 ; SSE3-NEXT:    bsrw %ax, %ax
811 ; SSE3-NEXT:    xorl $15, %eax
812 ; SSE3-NEXT:    movd %eax, %xmm1
813 ; SSE3-NEXT:    pextrw $3, %xmm0, %eax
814 ; SSE3-NEXT:    bsrw %ax, %ax
815 ; SSE3-NEXT:    xorl $15, %eax
816 ; SSE3-NEXT:    movd %eax, %xmm2
817 ; SSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
818 ; SSE3-NEXT:    pextrw $5, %xmm0, %eax
819 ; SSE3-NEXT:    bsrw %ax, %ax
820 ; SSE3-NEXT:    xorl $15, %eax
821 ; SSE3-NEXT:    movd %eax, %xmm3
822 ; SSE3-NEXT:    pextrw $1, %xmm0, %eax
823 ; SSE3-NEXT:    bsrw %ax, %ax
824 ; SSE3-NEXT:    xorl $15, %eax
825 ; SSE3-NEXT:    movd %eax, %xmm1
826 ; SSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3]
827 ; SSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
828 ; SSE3-NEXT:    pextrw $6, %xmm0, %eax
829 ; SSE3-NEXT:    bsrw %ax, %ax
830 ; SSE3-NEXT:    xorl $15, %eax
831 ; SSE3-NEXT:    movd %eax, %xmm2
832 ; SSE3-NEXT:    pextrw $2, %xmm0, %eax
833 ; SSE3-NEXT:    bsrw %ax, %ax
834 ; SSE3-NEXT:    xorl $15, %eax
835 ; SSE3-NEXT:    movd %eax, %xmm3
836 ; SSE3-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3]
837 ; SSE3-NEXT:    pextrw $4, %xmm0, %eax
838 ; SSE3-NEXT:    bsrw %ax, %ax
839 ; SSE3-NEXT:    xorl $15, %eax
840 ; SSE3-NEXT:    movd %eax, %xmm2
841 ; SSE3-NEXT:    movd %xmm0, %eax
842 ; SSE3-NEXT:    bsrw %ax, %ax
843 ; SSE3-NEXT:    xorl $15, %eax
844 ; SSE3-NEXT:    movd %eax, %xmm0
845 ; SSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
846 ; SSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3]
847 ; SSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
848 ; SSE3-NEXT:    retq
849 ;
850 ; SSSE3-LABEL: testv8i16u:
851 ; SSSE3:       # BB#0:
852 ; SSSE3-NEXT:    pextrw $7, %xmm0, %eax
853 ; SSSE3-NEXT:    bsrw %ax, %ax
854 ; SSSE3-NEXT:    xorl $15, %eax
855 ; SSSE3-NEXT:    movd %eax, %xmm1
856 ; SSSE3-NEXT:    pextrw $3, %xmm0, %eax
857 ; SSSE3-NEXT:    bsrw %ax, %ax
858 ; SSSE3-NEXT:    xorl $15, %eax
859 ; SSSE3-NEXT:    movd %eax, %xmm2
860 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
861 ; SSSE3-NEXT:    pextrw $5, %xmm0, %eax
862 ; SSSE3-NEXT:    bsrw %ax, %ax
863 ; SSSE3-NEXT:    xorl $15, %eax
864 ; SSSE3-NEXT:    movd %eax, %xmm3
865 ; SSSE3-NEXT:    pextrw $1, %xmm0, %eax
866 ; SSSE3-NEXT:    bsrw %ax, %ax
867 ; SSSE3-NEXT:    xorl $15, %eax
868 ; SSSE3-NEXT:    movd %eax, %xmm1
869 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3]
870 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
871 ; SSSE3-NEXT:    pextrw $6, %xmm0, %eax
872 ; SSSE3-NEXT:    bsrw %ax, %ax
873 ; SSSE3-NEXT:    xorl $15, %eax
874 ; SSSE3-NEXT:    movd %eax, %xmm2
875 ; SSSE3-NEXT:    pextrw $2, %xmm0, %eax
876 ; SSSE3-NEXT:    bsrw %ax, %ax
877 ; SSSE3-NEXT:    xorl $15, %eax
878 ; SSSE3-NEXT:    movd %eax, %xmm3
879 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3]
880 ; SSSE3-NEXT:    pextrw $4, %xmm0, %eax
881 ; SSSE3-NEXT:    bsrw %ax, %ax
882 ; SSSE3-NEXT:    xorl $15, %eax
883 ; SSSE3-NEXT:    movd %eax, %xmm2
884 ; SSSE3-NEXT:    movd %xmm0, %eax
885 ; SSSE3-NEXT:    bsrw %ax, %ax
886 ; SSSE3-NEXT:    xorl $15, %eax
887 ; SSSE3-NEXT:    movd %eax, %xmm0
888 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
889 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3]
890 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
891 ; SSSE3-NEXT:    retq
892 ;
893 ; SSE41-LABEL: testv8i16u:
894 ; SSE41:       # BB#0:
895 ; SSE41-NEXT:    pextrw $1, %xmm0, %eax
896 ; SSE41-NEXT:    bsrw %ax, %ax
897 ; SSE41-NEXT:    xorl $15, %eax
898 ; SSE41-NEXT:    movd %xmm0, %ecx
899 ; SSE41-NEXT:    bsrw %cx, %cx
900 ; SSE41-NEXT:    xorl $15, %ecx
901 ; SSE41-NEXT:    movd %ecx, %xmm1
902 ; SSE41-NEXT:    pinsrw $1, %eax, %xmm1
903 ; SSE41-NEXT:    pextrw $2, %xmm0, %eax
904 ; SSE41-NEXT:    bsrw %ax, %ax
905 ; SSE41-NEXT:    xorl $15, %eax
906 ; SSE41-NEXT:    pinsrw $2, %eax, %xmm1
907 ; SSE41-NEXT:    pextrw $3, %xmm0, %eax
908 ; SSE41-NEXT:    bsrw %ax, %ax
909 ; SSE41-NEXT:    xorl $15, %eax
910 ; SSE41-NEXT:    pinsrw $3, %eax, %xmm1
911 ; SSE41-NEXT:    pextrw $4, %xmm0, %eax
912 ; SSE41-NEXT:    bsrw %ax, %ax
913 ; SSE41-NEXT:    xorl $15, %eax
914 ; SSE41-NEXT:    pinsrw $4, %eax, %xmm1
915 ; SSE41-NEXT:    pextrw $5, %xmm0, %eax
916 ; SSE41-NEXT:    bsrw %ax, %ax
917 ; SSE41-NEXT:    xorl $15, %eax
918 ; SSE41-NEXT:    pinsrw $5, %eax, %xmm1
919 ; SSE41-NEXT:    pextrw $6, %xmm0, %eax
920 ; SSE41-NEXT:    bsrw %ax, %ax
921 ; SSE41-NEXT:    xorl $15, %eax
922 ; SSE41-NEXT:    pinsrw $6, %eax, %xmm1
923 ; SSE41-NEXT:    pextrw $7, %xmm0, %eax
924 ; SSE41-NEXT:    bsrw %ax, %ax
925 ; SSE41-NEXT:    xorl $15, %eax
926 ; SSE41-NEXT:    pinsrw $7, %eax, %xmm1
927 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
928 ; SSE41-NEXT:    retq
929 ;
930 ; AVX-LABEL: testv8i16u:
931 ; AVX:       # BB#0:
932 ; AVX-NEXT:    vpextrw $1, %xmm0, %eax
933 ; AVX-NEXT:    bsrw %ax, %ax
934 ; AVX-NEXT:    xorl $15, %eax
935 ; AVX-NEXT:    vmovd %xmm0, %ecx
936 ; AVX-NEXT:    bsrw %cx, %cx
937 ; AVX-NEXT:    xorl $15, %ecx
938 ; AVX-NEXT:    vmovd %ecx, %xmm1
939 ; AVX-NEXT:    vpinsrw $1, %eax, %xmm1, %xmm1
940 ; AVX-NEXT:    vpextrw $2, %xmm0, %eax
941 ; AVX-NEXT:    bsrw %ax, %ax
942 ; AVX-NEXT:    xorl $15, %eax
943 ; AVX-NEXT:    vpinsrw $2, %eax, %xmm1, %xmm1
944 ; AVX-NEXT:    vpextrw $3, %xmm0, %eax
945 ; AVX-NEXT:    bsrw %ax, %ax
946 ; AVX-NEXT:    xorl $15, %eax
947 ; AVX-NEXT:    vpinsrw $3, %eax, %xmm1, %xmm1
948 ; AVX-NEXT:    vpextrw $4, %xmm0, %eax
949 ; AVX-NEXT:    bsrw %ax, %ax
950 ; AVX-NEXT:    xorl $15, %eax
951 ; AVX-NEXT:    vpinsrw $4, %eax, %xmm1, %xmm1
952 ; AVX-NEXT:    vpextrw $5, %xmm0, %eax
953 ; AVX-NEXT:    bsrw %ax, %ax
954 ; AVX-NEXT:    xorl $15, %eax
955 ; AVX-NEXT:    vpinsrw $5, %eax, %xmm1, %xmm1
956 ; AVX-NEXT:    vpextrw $6, %xmm0, %eax
957 ; AVX-NEXT:    bsrw %ax, %ax
958 ; AVX-NEXT:    xorl $15, %eax
959 ; AVX-NEXT:    vpinsrw $6, %eax, %xmm1, %xmm1
960 ; AVX-NEXT:    vpextrw $7, %xmm0, %eax
961 ; AVX-NEXT:    bsrw %ax, %ax
962 ; AVX-NEXT:    xorl $15, %eax
963 ; AVX-NEXT:    vpinsrw $7, %eax, %xmm1, %xmm0
964 ; AVX-NEXT:    retq
965 ;
966 ; AVX512VLCD-LABEL: testv8i16u:
967 ; AVX512VLCD:       ## BB#0:
968 ; AVX512VLCD-NEXT:    vpmovzxwd %xmm0, %ymm0
969 ; AVX512VLCD-NEXT:    vplzcntd %ymm0, %ymm0
970 ; AVX512VLCD-NEXT:    vpmovdw %ymm0, %xmm0
971 ; AVX512VLCD-NEXT:    vpsubw {{.*}}(%rip), %xmm0, %xmm0
972 ; AVX512VLCD-NEXT:    retq
973 ;
974 ; AVX512CD-LABEL: testv8i16u:
975 ; AVX512CD:       ## BB#0:
976 ; AVX512CD-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
977 ; AVX512CD-NEXT:    vplzcntd %zmm0, %zmm0
978 ; AVX512CD-NEXT:    vpmovdw %zmm0, %ymm0
979 ; AVX512CD-NEXT:    vpsubw {{.*}}(%rip), %xmm0, %xmm0
980 ; AVX512CD-NEXT:    retq
981   %out = call <8 x i16> @llvm.ctlz.v8i16(<8 x i16> %in, i1 -1)
982   ret <8 x i16> %out
983 }
984
985 define <16 x i8> @testv16i8(<16 x i8> %in) nounwind {
986 ; SSE2-LABEL: testv16i8:
987 ; SSE2:       # BB#0:
988 ; SSE2-NEXT:    pushq %rbp
989 ; SSE2-NEXT:    pushq %rbx
990 ; SSE2-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp)
991 ; SSE2-NEXT:    movzbl -{{[0-9]+}}(%rsp), %eax
992 ; SSE2-NEXT:    bsrl %eax, %ecx
993 ; SSE2-NEXT:    movl $15, %eax
994 ; SSE2-NEXT:    cmovel %eax, %ecx
995 ; SSE2-NEXT:    xorl $7, %ecx
996 ; SSE2-NEXT:    movd %ecx, %xmm0
997 ; SSE2-NEXT:    movzbl -{{[0-9]+}}(%rsp), %ebx
998 ; SSE2-NEXT:    movzbl -{{[0-9]+}}(%rsp), %edi
999 ; SSE2-NEXT:    movzbl -{{[0-9]+}}(%rsp), %r9d
1000 ; SSE2-NEXT:    movzbl -{{[0-9]+}}(%rsp), %edx
1001 ; SSE2-NEXT:    movzbl -{{[0-9]+}}(%rsp), %r11d
1002 ; SSE2-NEXT:    movzbl -{{[0-9]+}}(%rsp), %esi
1003 ; SSE2-NEXT:    movzbl -{{[0-9]+}}(%rsp), %r8d
1004 ; SSE2-NEXT:    movzbl -{{[0-9]+}}(%rsp), %ecx
1005 ; SSE2-NEXT:    bsrl %ecx, %ecx
1006 ; SSE2-NEXT:    cmovel %eax, %ecx
1007 ; SSE2-NEXT:    xorl $7, %ecx
1008 ; SSE2-NEXT:    movd %ecx, %xmm1
1009 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1010 ; SSE2-NEXT:    bsrl %edx, %ecx
1011 ; SSE2-NEXT:    cmovel %eax, %ecx
1012 ; SSE2-NEXT:    xorl $7, %ecx
1013 ; SSE2-NEXT:    movd %ecx, %xmm2
1014 ; SSE2-NEXT:    movzbl -{{[0-9]+}}(%rsp), %edx
1015 ; SSE2-NEXT:    movzbl -{{[0-9]+}}(%rsp), %ecx
1016 ; SSE2-NEXT:    movzbl -{{[0-9]+}}(%rsp), %r10d
1017 ; SSE2-NEXT:    movzbl -{{[0-9]+}}(%rsp), %ebp
1018 ; SSE2-NEXT:    bsrl %ebp, %ebp
1019 ; SSE2-NEXT:    cmovel %eax, %ebp
1020 ; SSE2-NEXT:    xorl $7, %ebp
1021 ; SSE2-NEXT:    movd %ebp, %xmm0
1022 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
1023 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
1024 ; SSE2-NEXT:    bsrl %edi, %edi
1025 ; SSE2-NEXT:    cmovel %eax, %edi
1026 ; SSE2-NEXT:    xorl $7, %edi
1027 ; SSE2-NEXT:    movd %edi, %xmm1
1028 ; SSE2-NEXT:    bsrl %ecx, %ecx
1029 ; SSE2-NEXT:    cmovel %eax, %ecx
1030 ; SSE2-NEXT:    xorl $7, %ecx
1031 ; SSE2-NEXT:    movd %ecx, %xmm2
1032 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3],xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]
1033 ; SSE2-NEXT:    bsrl %esi, %ecx
1034 ; SSE2-NEXT:    cmovel %eax, %ecx
1035 ; SSE2-NEXT:    xorl $7, %ecx
1036 ; SSE2-NEXT:    movd %ecx, %xmm3
1037 ; SSE2-NEXT:    movzbl -{{[0-9]+}}(%rsp), %esi
1038 ; SSE2-NEXT:    movzbl -{{[0-9]+}}(%rsp), %ecx
1039 ; SSE2-NEXT:    bsrl %ecx, %ecx
1040 ; SSE2-NEXT:    cmovel %eax, %ecx
1041 ; SSE2-NEXT:    xorl $7, %ecx
1042 ; SSE2-NEXT:    movd %ecx, %xmm1
1043 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3],xmm1[4],xmm3[4],xmm1[5],xmm3[5],xmm1[6],xmm3[6],xmm1[7],xmm3[7]
1044 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
1045 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1046 ; SSE2-NEXT:    bsrl %ebx, %ecx
1047 ; SSE2-NEXT:    cmovel %eax, %ecx
1048 ; SSE2-NEXT:    xorl $7, %ecx
1049 ; SSE2-NEXT:    movd %ecx, %xmm0
1050 ; SSE2-NEXT:    bsrl %edx, %ecx
1051 ; SSE2-NEXT:    cmovel %eax, %ecx
1052 ; SSE2-NEXT:    xorl $7, %ecx
1053 ; SSE2-NEXT:    movd %ecx, %xmm3
1054 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
1055 ; SSE2-NEXT:    bsrl %r11d, %ecx
1056 ; SSE2-NEXT:    cmovel %eax, %ecx
1057 ; SSE2-NEXT:    xorl $7, %ecx
1058 ; SSE2-NEXT:    movd %ecx, %xmm0
1059 ; SSE2-NEXT:    bsrl %esi, %ecx
1060 ; SSE2-NEXT:    cmovel %eax, %ecx
1061 ; SSE2-NEXT:    xorl $7, %ecx
1062 ; SSE2-NEXT:    movd %ecx, %xmm2
1063 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
1064 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1],xmm2[2],xmm3[2],xmm2[3],xmm3[3],xmm2[4],xmm3[4],xmm2[5],xmm3[5],xmm2[6],xmm3[6],xmm2[7],xmm3[7]
1065 ; SSE2-NEXT:    bsrl %r9d, %ecx
1066 ; SSE2-NEXT:    cmovel %eax, %ecx
1067 ; SSE2-NEXT:    xorl $7, %ecx
1068 ; SSE2-NEXT:    movd %ecx, %xmm0
1069 ; SSE2-NEXT:    bsrl %r10d, %ecx
1070 ; SSE2-NEXT:    cmovel %eax, %ecx
1071 ; SSE2-NEXT:    xorl $7, %ecx
1072 ; SSE2-NEXT:    movd %ecx, %xmm3
1073 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
1074 ; SSE2-NEXT:    bsrl %r8d, %ecx
1075 ; SSE2-NEXT:    cmovel %eax, %ecx
1076 ; SSE2-NEXT:    xorl $7, %ecx
1077 ; SSE2-NEXT:    movd %ecx, %xmm4
1078 ; SSE2-NEXT:    movzbl -{{[0-9]+}}(%rsp), %ecx
1079 ; SSE2-NEXT:    bsrl %ecx, %ecx
1080 ; SSE2-NEXT:    cmovel %eax, %ecx
1081 ; SSE2-NEXT:    xorl $7, %ecx
1082 ; SSE2-NEXT:    movd %ecx, %xmm0
1083 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3],xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7]
1084 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3],xmm0[4],xmm3[4],xmm0[5],xmm3[5],xmm0[6],xmm3[6],xmm0[7],xmm3[7]
1085 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
1086 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
1087 ; SSE2-NEXT:    popq %rbx
1088 ; SSE2-NEXT:    popq %rbp
1089 ; SSE2-NEXT:    retq
1090 ;
1091 ; SSE3-LABEL: testv16i8:
1092 ; SSE3:       # BB#0:
1093 ; SSE3-NEXT:    pushq %rbp
1094 ; SSE3-NEXT:    pushq %rbx
1095 ; SSE3-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp)
1096 ; SSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %eax
1097 ; SSE3-NEXT:    bsrl %eax, %ecx
1098 ; SSE3-NEXT:    movl $15, %eax
1099 ; SSE3-NEXT:    cmovel %eax, %ecx
1100 ; SSE3-NEXT:    xorl $7, %ecx
1101 ; SSE3-NEXT:    movd %ecx, %xmm0
1102 ; SSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %ebx
1103 ; SSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %edi
1104 ; SSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %r9d
1105 ; SSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %edx
1106 ; SSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %r11d
1107 ; SSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %esi
1108 ; SSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %r8d
1109 ; SSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %ecx
1110 ; SSE3-NEXT:    bsrl %ecx, %ecx
1111 ; SSE3-NEXT:    cmovel %eax, %ecx
1112 ; SSE3-NEXT:    xorl $7, %ecx
1113 ; SSE3-NEXT:    movd %ecx, %xmm1
1114 ; SSE3-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1115 ; SSE3-NEXT:    bsrl %edx, %ecx
1116 ; SSE3-NEXT:    cmovel %eax, %ecx
1117 ; SSE3-NEXT:    xorl $7, %ecx
1118 ; SSE3-NEXT:    movd %ecx, %xmm2
1119 ; SSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %edx
1120 ; SSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %ecx
1121 ; SSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %r10d
1122 ; SSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %ebp
1123 ; SSE3-NEXT:    bsrl %ebp, %ebp
1124 ; SSE3-NEXT:    cmovel %eax, %ebp
1125 ; SSE3-NEXT:    xorl $7, %ebp
1126 ; SSE3-NEXT:    movd %ebp, %xmm0
1127 ; SSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
1128 ; SSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
1129 ; SSE3-NEXT:    bsrl %edi, %edi
1130 ; SSE3-NEXT:    cmovel %eax, %edi
1131 ; SSE3-NEXT:    xorl $7, %edi
1132 ; SSE3-NEXT:    movd %edi, %xmm1
1133 ; SSE3-NEXT:    bsrl %ecx, %ecx
1134 ; SSE3-NEXT:    cmovel %eax, %ecx
1135 ; SSE3-NEXT:    xorl $7, %ecx
1136 ; SSE3-NEXT:    movd %ecx, %xmm2
1137 ; SSE3-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3],xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]
1138 ; SSE3-NEXT:    bsrl %esi, %ecx
1139 ; SSE3-NEXT:    cmovel %eax, %ecx
1140 ; SSE3-NEXT:    xorl $7, %ecx
1141 ; SSE3-NEXT:    movd %ecx, %xmm3
1142 ; SSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %esi
1143 ; SSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %ecx
1144 ; SSE3-NEXT:    bsrl %ecx, %ecx
1145 ; SSE3-NEXT:    cmovel %eax, %ecx
1146 ; SSE3-NEXT:    xorl $7, %ecx
1147 ; SSE3-NEXT:    movd %ecx, %xmm1
1148 ; SSE3-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3],xmm1[4],xmm3[4],xmm1[5],xmm3[5],xmm1[6],xmm3[6],xmm1[7],xmm3[7]
1149 ; SSE3-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
1150 ; SSE3-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1151 ; SSE3-NEXT:    bsrl %ebx, %ecx
1152 ; SSE3-NEXT:    cmovel %eax, %ecx
1153 ; SSE3-NEXT:    xorl $7, %ecx
1154 ; SSE3-NEXT:    movd %ecx, %xmm0
1155 ; SSE3-NEXT:    bsrl %edx, %ecx
1156 ; SSE3-NEXT:    cmovel %eax, %ecx
1157 ; SSE3-NEXT:    xorl $7, %ecx
1158 ; SSE3-NEXT:    movd %ecx, %xmm3
1159 ; SSE3-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
1160 ; SSE3-NEXT:    bsrl %r11d, %ecx
1161 ; SSE3-NEXT:    cmovel %eax, %ecx
1162 ; SSE3-NEXT:    xorl $7, %ecx
1163 ; SSE3-NEXT:    movd %ecx, %xmm0
1164 ; SSE3-NEXT:    bsrl %esi, %ecx
1165 ; SSE3-NEXT:    cmovel %eax, %ecx
1166 ; SSE3-NEXT:    xorl $7, %ecx
1167 ; SSE3-NEXT:    movd %ecx, %xmm2
1168 ; SSE3-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
1169 ; SSE3-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1],xmm2[2],xmm3[2],xmm2[3],xmm3[3],xmm2[4],xmm3[4],xmm2[5],xmm3[5],xmm2[6],xmm3[6],xmm2[7],xmm3[7]
1170 ; SSE3-NEXT:    bsrl %r9d, %ecx
1171 ; SSE3-NEXT:    cmovel %eax, %ecx
1172 ; SSE3-NEXT:    xorl $7, %ecx
1173 ; SSE3-NEXT:    movd %ecx, %xmm0
1174 ; SSE3-NEXT:    bsrl %r10d, %ecx
1175 ; SSE3-NEXT:    cmovel %eax, %ecx
1176 ; SSE3-NEXT:    xorl $7, %ecx
1177 ; SSE3-NEXT:    movd %ecx, %xmm3
1178 ; SSE3-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
1179 ; SSE3-NEXT:    bsrl %r8d, %ecx
1180 ; SSE3-NEXT:    cmovel %eax, %ecx
1181 ; SSE3-NEXT:    xorl $7, %ecx
1182 ; SSE3-NEXT:    movd %ecx, %xmm4
1183 ; SSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %ecx
1184 ; SSE3-NEXT:    bsrl %ecx, %ecx
1185 ; SSE3-NEXT:    cmovel %eax, %ecx
1186 ; SSE3-NEXT:    xorl $7, %ecx
1187 ; SSE3-NEXT:    movd %ecx, %xmm0
1188 ; SSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3],xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7]
1189 ; SSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3],xmm0[4],xmm3[4],xmm0[5],xmm3[5],xmm0[6],xmm3[6],xmm0[7],xmm3[7]
1190 ; SSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
1191 ; SSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
1192 ; SSE3-NEXT:    popq %rbx
1193 ; SSE3-NEXT:    popq %rbp
1194 ; SSE3-NEXT:    retq
1195 ;
1196 ; SSSE3-LABEL: testv16i8:
1197 ; SSSE3:       # BB#0:
1198 ; SSSE3-NEXT:    pushq %rbp
1199 ; SSSE3-NEXT:    pushq %rbx
1200 ; SSSE3-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp)
1201 ; SSSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %eax
1202 ; SSSE3-NEXT:    bsrl %eax, %ecx
1203 ; SSSE3-NEXT:    movl $15, %eax
1204 ; SSSE3-NEXT:    cmovel %eax, %ecx
1205 ; SSSE3-NEXT:    xorl $7, %ecx
1206 ; SSSE3-NEXT:    movd %ecx, %xmm0
1207 ; SSSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %ebx
1208 ; SSSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %edi
1209 ; SSSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %r9d
1210 ; SSSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %edx
1211 ; SSSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %r11d
1212 ; SSSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %esi
1213 ; SSSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %r8d
1214 ; SSSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %ecx
1215 ; SSSE3-NEXT:    bsrl %ecx, %ecx
1216 ; SSSE3-NEXT:    cmovel %eax, %ecx
1217 ; SSSE3-NEXT:    xorl $7, %ecx
1218 ; SSSE3-NEXT:    movd %ecx, %xmm1
1219 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1220 ; SSSE3-NEXT:    bsrl %edx, %ecx
1221 ; SSSE3-NEXT:    cmovel %eax, %ecx
1222 ; SSSE3-NEXT:    xorl $7, %ecx
1223 ; SSSE3-NEXT:    movd %ecx, %xmm2
1224 ; SSSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %edx
1225 ; SSSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %ecx
1226 ; SSSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %r10d
1227 ; SSSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %ebp
1228 ; SSSE3-NEXT:    bsrl %ebp, %ebp
1229 ; SSSE3-NEXT:    cmovel %eax, %ebp
1230 ; SSSE3-NEXT:    xorl $7, %ebp
1231 ; SSSE3-NEXT:    movd %ebp, %xmm0
1232 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
1233 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
1234 ; SSSE3-NEXT:    bsrl %edi, %edi
1235 ; SSSE3-NEXT:    cmovel %eax, %edi
1236 ; SSSE3-NEXT:    xorl $7, %edi
1237 ; SSSE3-NEXT:    movd %edi, %xmm1
1238 ; SSSE3-NEXT:    bsrl %ecx, %ecx
1239 ; SSSE3-NEXT:    cmovel %eax, %ecx
1240 ; SSSE3-NEXT:    xorl $7, %ecx
1241 ; SSSE3-NEXT:    movd %ecx, %xmm2
1242 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3],xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]
1243 ; SSSE3-NEXT:    bsrl %esi, %ecx
1244 ; SSSE3-NEXT:    cmovel %eax, %ecx
1245 ; SSSE3-NEXT:    xorl $7, %ecx
1246 ; SSSE3-NEXT:    movd %ecx, %xmm3
1247 ; SSSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %esi
1248 ; SSSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %ecx
1249 ; SSSE3-NEXT:    bsrl %ecx, %ecx
1250 ; SSSE3-NEXT:    cmovel %eax, %ecx
1251 ; SSSE3-NEXT:    xorl $7, %ecx
1252 ; SSSE3-NEXT:    movd %ecx, %xmm1
1253 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3],xmm1[4],xmm3[4],xmm1[5],xmm3[5],xmm1[6],xmm3[6],xmm1[7],xmm3[7]
1254 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
1255 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1256 ; SSSE3-NEXT:    bsrl %ebx, %ecx
1257 ; SSSE3-NEXT:    cmovel %eax, %ecx
1258 ; SSSE3-NEXT:    xorl $7, %ecx
1259 ; SSSE3-NEXT:    movd %ecx, %xmm0
1260 ; SSSE3-NEXT:    bsrl %edx, %ecx
1261 ; SSSE3-NEXT:    cmovel %eax, %ecx
1262 ; SSSE3-NEXT:    xorl $7, %ecx
1263 ; SSSE3-NEXT:    movd %ecx, %xmm3
1264 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
1265 ; SSSE3-NEXT:    bsrl %r11d, %ecx
1266 ; SSSE3-NEXT:    cmovel %eax, %ecx
1267 ; SSSE3-NEXT:    xorl $7, %ecx
1268 ; SSSE3-NEXT:    movd %ecx, %xmm0
1269 ; SSSE3-NEXT:    bsrl %esi, %ecx
1270 ; SSSE3-NEXT:    cmovel %eax, %ecx
1271 ; SSSE3-NEXT:    xorl $7, %ecx
1272 ; SSSE3-NEXT:    movd %ecx, %xmm2
1273 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
1274 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1],xmm2[2],xmm3[2],xmm2[3],xmm3[3],xmm2[4],xmm3[4],xmm2[5],xmm3[5],xmm2[6],xmm3[6],xmm2[7],xmm3[7]
1275 ; SSSE3-NEXT:    bsrl %r9d, %ecx
1276 ; SSSE3-NEXT:    cmovel %eax, %ecx
1277 ; SSSE3-NEXT:    xorl $7, %ecx
1278 ; SSSE3-NEXT:    movd %ecx, %xmm0
1279 ; SSSE3-NEXT:    bsrl %r10d, %ecx
1280 ; SSSE3-NEXT:    cmovel %eax, %ecx
1281 ; SSSE3-NEXT:    xorl $7, %ecx
1282 ; SSSE3-NEXT:    movd %ecx, %xmm3
1283 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
1284 ; SSSE3-NEXT:    bsrl %r8d, %ecx
1285 ; SSSE3-NEXT:    cmovel %eax, %ecx
1286 ; SSSE3-NEXT:    xorl $7, %ecx
1287 ; SSSE3-NEXT:    movd %ecx, %xmm4
1288 ; SSSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %ecx
1289 ; SSSE3-NEXT:    bsrl %ecx, %ecx
1290 ; SSSE3-NEXT:    cmovel %eax, %ecx
1291 ; SSSE3-NEXT:    xorl $7, %ecx
1292 ; SSSE3-NEXT:    movd %ecx, %xmm0
1293 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3],xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7]
1294 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3],xmm0[4],xmm3[4],xmm0[5],xmm3[5],xmm0[6],xmm3[6],xmm0[7],xmm3[7]
1295 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
1296 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
1297 ; SSSE3-NEXT:    popq %rbx
1298 ; SSSE3-NEXT:    popq %rbp
1299 ; SSSE3-NEXT:    retq
1300 ;
1301 ; SSE41-LABEL: testv16i8:
1302 ; SSE41:       # BB#0:
1303 ; SSE41-NEXT:    pextrb $1, %xmm0, %eax
1304 ; SSE41-NEXT:    bsrl %eax, %ecx
1305 ; SSE41-NEXT:    movl $15, %eax
1306 ; SSE41-NEXT:    cmovel %eax, %ecx
1307 ; SSE41-NEXT:    xorl $7, %ecx
1308 ; SSE41-NEXT:    pextrb $0, %xmm0, %edx
1309 ; SSE41-NEXT:    bsrl %edx, %edx
1310 ; SSE41-NEXT:    cmovel %eax, %edx
1311 ; SSE41-NEXT:    xorl $7, %edx
1312 ; SSE41-NEXT:    movd %edx, %xmm1
1313 ; SSE41-NEXT:    pinsrb $1, %ecx, %xmm1
1314 ; SSE41-NEXT:    pextrb $2, %xmm0, %ecx
1315 ; SSE41-NEXT:    bsrl %ecx, %ecx
1316 ; SSE41-NEXT:    cmovel %eax, %ecx
1317 ; SSE41-NEXT:    xorl $7, %ecx
1318 ; SSE41-NEXT:    pinsrb $2, %ecx, %xmm1
1319 ; SSE41-NEXT:    pextrb $3, %xmm0, %ecx
1320 ; SSE41-NEXT:    bsrl %ecx, %ecx
1321 ; SSE41-NEXT:    cmovel %eax, %ecx
1322 ; SSE41-NEXT:    xorl $7, %ecx
1323 ; SSE41-NEXT:    pinsrb $3, %ecx, %xmm1
1324 ; SSE41-NEXT:    pextrb $4, %xmm0, %ecx
1325 ; SSE41-NEXT:    bsrl %ecx, %ecx
1326 ; SSE41-NEXT:    cmovel %eax, %ecx
1327 ; SSE41-NEXT:    xorl $7, %ecx
1328 ; SSE41-NEXT:    pinsrb $4, %ecx, %xmm1
1329 ; SSE41-NEXT:    pextrb $5, %xmm0, %ecx
1330 ; SSE41-NEXT:    bsrl %ecx, %ecx
1331 ; SSE41-NEXT:    cmovel %eax, %ecx
1332 ; SSE41-NEXT:    xorl $7, %ecx
1333 ; SSE41-NEXT:    pinsrb $5, %ecx, %xmm1
1334 ; SSE41-NEXT:    pextrb $6, %xmm0, %ecx
1335 ; SSE41-NEXT:    bsrl %ecx, %ecx
1336 ; SSE41-NEXT:    cmovel %eax, %ecx
1337 ; SSE41-NEXT:    xorl $7, %ecx
1338 ; SSE41-NEXT:    pinsrb $6, %ecx, %xmm1
1339 ; SSE41-NEXT:    pextrb $7, %xmm0, %ecx
1340 ; SSE41-NEXT:    bsrl %ecx, %ecx
1341 ; SSE41-NEXT:    cmovel %eax, %ecx
1342 ; SSE41-NEXT:    xorl $7, %ecx
1343 ; SSE41-NEXT:    pinsrb $7, %ecx, %xmm1
1344 ; SSE41-NEXT:    pextrb $8, %xmm0, %ecx
1345 ; SSE41-NEXT:    bsrl %ecx, %ecx
1346 ; SSE41-NEXT:    cmovel %eax, %ecx
1347 ; SSE41-NEXT:    xorl $7, %ecx
1348 ; SSE41-NEXT:    pinsrb $8, %ecx, %xmm1
1349 ; SSE41-NEXT:    pextrb $9, %xmm0, %ecx
1350 ; SSE41-NEXT:    bsrl %ecx, %ecx
1351 ; SSE41-NEXT:    cmovel %eax, %ecx
1352 ; SSE41-NEXT:    xorl $7, %ecx
1353 ; SSE41-NEXT:    pinsrb $9, %ecx, %xmm1
1354 ; SSE41-NEXT:    pextrb $10, %xmm0, %ecx
1355 ; SSE41-NEXT:    bsrl %ecx, %ecx
1356 ; SSE41-NEXT:    cmovel %eax, %ecx
1357 ; SSE41-NEXT:    xorl $7, %ecx
1358 ; SSE41-NEXT:    pinsrb $10, %ecx, %xmm1
1359 ; SSE41-NEXT:    pextrb $11, %xmm0, %ecx
1360 ; SSE41-NEXT:    bsrl %ecx, %ecx
1361 ; SSE41-NEXT:    cmovel %eax, %ecx
1362 ; SSE41-NEXT:    xorl $7, %ecx
1363 ; SSE41-NEXT:    pinsrb $11, %ecx, %xmm1
1364 ; SSE41-NEXT:    pextrb $12, %xmm0, %ecx
1365 ; SSE41-NEXT:    bsrl %ecx, %ecx
1366 ; SSE41-NEXT:    cmovel %eax, %ecx
1367 ; SSE41-NEXT:    xorl $7, %ecx
1368 ; SSE41-NEXT:    pinsrb $12, %ecx, %xmm1
1369 ; SSE41-NEXT:    pextrb $13, %xmm0, %ecx
1370 ; SSE41-NEXT:    bsrl %ecx, %ecx
1371 ; SSE41-NEXT:    cmovel %eax, %ecx
1372 ; SSE41-NEXT:    xorl $7, %ecx
1373 ; SSE41-NEXT:    pinsrb $13, %ecx, %xmm1
1374 ; SSE41-NEXT:    pextrb $14, %xmm0, %ecx
1375 ; SSE41-NEXT:    bsrl %ecx, %ecx
1376 ; SSE41-NEXT:    cmovel %eax, %ecx
1377 ; SSE41-NEXT:    xorl $7, %ecx
1378 ; SSE41-NEXT:    pinsrb $14, %ecx, %xmm1
1379 ; SSE41-NEXT:    pextrb $15, %xmm0, %ecx
1380 ; SSE41-NEXT:    bsrl %ecx, %ecx
1381 ; SSE41-NEXT:    cmovel %eax, %ecx
1382 ; SSE41-NEXT:    xorl $7, %ecx
1383 ; SSE41-NEXT:    pinsrb $15, %ecx, %xmm1
1384 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1385 ; SSE41-NEXT:    retq
1386 ;
1387 ; AVX-LABEL: testv16i8:
1388 ; AVX:       # BB#0:
1389 ; AVX-NEXT:    vpextrb $1, %xmm0, %eax
1390 ; AVX-NEXT:    bsrl %eax, %ecx
1391 ; AVX-NEXT:    movl $15, %eax
1392 ; AVX-NEXT:    cmovel %eax, %ecx
1393 ; AVX-NEXT:    xorl $7, %ecx
1394 ; AVX-NEXT:    vpextrb $0, %xmm0, %edx
1395 ; AVX-NEXT:    bsrl %edx, %edx
1396 ; AVX-NEXT:    cmovel %eax, %edx
1397 ; AVX-NEXT:    xorl $7, %edx
1398 ; AVX-NEXT:    vmovd %edx, %xmm1
1399 ; AVX-NEXT:    vpinsrb $1, %ecx, %xmm1, %xmm1
1400 ; AVX-NEXT:    vpextrb $2, %xmm0, %ecx
1401 ; AVX-NEXT:    bsrl %ecx, %ecx
1402 ; AVX-NEXT:    cmovel %eax, %ecx
1403 ; AVX-NEXT:    xorl $7, %ecx
1404 ; AVX-NEXT:    vpinsrb $2, %ecx, %xmm1, %xmm1
1405 ; AVX-NEXT:    vpextrb $3, %xmm0, %ecx
1406 ; AVX-NEXT:    bsrl %ecx, %ecx
1407 ; AVX-NEXT:    cmovel %eax, %ecx
1408 ; AVX-NEXT:    xorl $7, %ecx
1409 ; AVX-NEXT:    vpinsrb $3, %ecx, %xmm1, %xmm1
1410 ; AVX-NEXT:    vpextrb $4, %xmm0, %ecx
1411 ; AVX-NEXT:    bsrl %ecx, %ecx
1412 ; AVX-NEXT:    cmovel %eax, %ecx
1413 ; AVX-NEXT:    xorl $7, %ecx
1414 ; AVX-NEXT:    vpinsrb $4, %ecx, %xmm1, %xmm1
1415 ; AVX-NEXT:    vpextrb $5, %xmm0, %ecx
1416 ; AVX-NEXT:    bsrl %ecx, %ecx
1417 ; AVX-NEXT:    cmovel %eax, %ecx
1418 ; AVX-NEXT:    xorl $7, %ecx
1419 ; AVX-NEXT:    vpinsrb $5, %ecx, %xmm1, %xmm1
1420 ; AVX-NEXT:    vpextrb $6, %xmm0, %ecx
1421 ; AVX-NEXT:    bsrl %ecx, %ecx
1422 ; AVX-NEXT:    cmovel %eax, %ecx
1423 ; AVX-NEXT:    xorl $7, %ecx
1424 ; AVX-NEXT:    vpinsrb $6, %ecx, %xmm1, %xmm1
1425 ; AVX-NEXT:    vpextrb $7, %xmm0, %ecx
1426 ; AVX-NEXT:    bsrl %ecx, %ecx
1427 ; AVX-NEXT:    cmovel %eax, %ecx
1428 ; AVX-NEXT:    xorl $7, %ecx
1429 ; AVX-NEXT:    vpinsrb $7, %ecx, %xmm1, %xmm1
1430 ; AVX-NEXT:    vpextrb $8, %xmm0, %ecx
1431 ; AVX-NEXT:    bsrl %ecx, %ecx
1432 ; AVX-NEXT:    cmovel %eax, %ecx
1433 ; AVX-NEXT:    xorl $7, %ecx
1434 ; AVX-NEXT:    vpinsrb $8, %ecx, %xmm1, %xmm1
1435 ; AVX-NEXT:    vpextrb $9, %xmm0, %ecx
1436 ; AVX-NEXT:    bsrl %ecx, %ecx
1437 ; AVX-NEXT:    cmovel %eax, %ecx
1438 ; AVX-NEXT:    xorl $7, %ecx
1439 ; AVX-NEXT:    vpinsrb $9, %ecx, %xmm1, %xmm1
1440 ; AVX-NEXT:    vpextrb $10, %xmm0, %ecx
1441 ; AVX-NEXT:    bsrl %ecx, %ecx
1442 ; AVX-NEXT:    cmovel %eax, %ecx
1443 ; AVX-NEXT:    xorl $7, %ecx
1444 ; AVX-NEXT:    vpinsrb $10, %ecx, %xmm1, %xmm1
1445 ; AVX-NEXT:    vpextrb $11, %xmm0, %ecx
1446 ; AVX-NEXT:    bsrl %ecx, %ecx
1447 ; AVX-NEXT:    cmovel %eax, %ecx
1448 ; AVX-NEXT:    xorl $7, %ecx
1449 ; AVX-NEXT:    vpinsrb $11, %ecx, %xmm1, %xmm1
1450 ; AVX-NEXT:    vpextrb $12, %xmm0, %ecx
1451 ; AVX-NEXT:    bsrl %ecx, %ecx
1452 ; AVX-NEXT:    cmovel %eax, %ecx
1453 ; AVX-NEXT:    xorl $7, %ecx
1454 ; AVX-NEXT:    vpinsrb $12, %ecx, %xmm1, %xmm1
1455 ; AVX-NEXT:    vpextrb $13, %xmm0, %ecx
1456 ; AVX-NEXT:    bsrl %ecx, %ecx
1457 ; AVX-NEXT:    cmovel %eax, %ecx
1458 ; AVX-NEXT:    xorl $7, %ecx
1459 ; AVX-NEXT:    vpinsrb $13, %ecx, %xmm1, %xmm1
1460 ; AVX-NEXT:    vpextrb $14, %xmm0, %ecx
1461 ; AVX-NEXT:    bsrl %ecx, %ecx
1462 ; AVX-NEXT:    cmovel %eax, %ecx
1463 ; AVX-NEXT:    xorl $7, %ecx
1464 ; AVX-NEXT:    vpinsrb $14, %ecx, %xmm1, %xmm1
1465 ; AVX-NEXT:    vpextrb $15, %xmm0, %ecx
1466 ; AVX-NEXT:    bsrl %ecx, %ecx
1467 ; AVX-NEXT:    cmovel %eax, %ecx
1468 ; AVX-NEXT:    xorl $7, %ecx
1469 ; AVX-NEXT:    vpinsrb $15, %ecx, %xmm1, %xmm0
1470 ; AVX-NEXT:    retq
1471 ;
1472 ; AVX512VLCD-LABEL: testv16i8:
1473 ; AVX512VLCD:       ## BB#0:
1474 ; AVX512VLCD-NEXT:    vpmovzxbd %xmm0, %zmm0
1475 ; AVX512VLCD-NEXT:    vplzcntd %zmm0, %zmm0
1476 ; AVX512VLCD-NEXT:    vpmovdb %zmm0, %xmm0
1477 ; AVX512VLCD-NEXT:    vpsubb {{.*}}(%rip), %xmm0, %xmm0
1478 ; AVX512VLCD-NEXT:    retq
1479 ;
1480 ; AVX512CD-LABEL: testv16i8:
1481 ; AVX512CD:       ## BB#0:
1482 ; AVX512CD-NEXT:    vpmovzxbd %xmm0, %zmm0
1483 ; AVX512CD-NEXT:    vplzcntd %zmm0, %zmm0
1484 ; AVX512CD-NEXT:    vpmovdb %zmm0, %xmm0
1485 ; AVX512CD-NEXT:    vpsubb {{.*}}(%rip), %xmm0, %xmm0
1486 ; AVX512CD-NEXT:    retq
1487   %out = call <16 x i8> @llvm.ctlz.v16i8(<16 x i8> %in, i1 0)
1488   ret <16 x i8> %out
1489 }
1490
1491 define <16 x i8> @testv16i8u(<16 x i8> %in) nounwind {
1492 ; SSE2-LABEL: testv16i8u:
1493 ; SSE2:       # BB#0:
1494 ; SSE2-NEXT:    pushq %rbx
1495 ; SSE2-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp)
1496 ; SSE2-NEXT:    movzbl -{{[0-9]+}}(%rsp), %eax
1497 ; SSE2-NEXT:    bsrl %eax, %eax
1498 ; SSE2-NEXT:    xorl $7, %eax
1499 ; SSE2-NEXT:    movd %eax, %xmm0
1500 ; SSE2-NEXT:    movzbl -{{[0-9]+}}(%rsp), %edi
1501 ; SSE2-NEXT:    movzbl -{{[0-9]+}}(%rsp), %edx
1502 ; SSE2-NEXT:    movzbl -{{[0-9]+}}(%rsp), %r9d
1503 ; SSE2-NEXT:    movzbl -{{[0-9]+}}(%rsp), %eax
1504 ; SSE2-NEXT:    movzbl -{{[0-9]+}}(%rsp), %r10d
1505 ; SSE2-NEXT:    movzbl -{{[0-9]+}}(%rsp), %ecx
1506 ; SSE2-NEXT:    movzbl -{{[0-9]+}}(%rsp), %r8d
1507 ; SSE2-NEXT:    movzbl -{{[0-9]+}}(%rsp), %esi
1508 ; SSE2-NEXT:    bsrl %esi, %esi
1509 ; SSE2-NEXT:    xorl $7, %esi
1510 ; SSE2-NEXT:    movd %esi, %xmm1
1511 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1512 ; SSE2-NEXT:    bsrl %eax, %eax
1513 ; SSE2-NEXT:    xorl $7, %eax
1514 ; SSE2-NEXT:    movd %eax, %xmm0
1515 ; SSE2-NEXT:    movzbl -{{[0-9]+}}(%rsp), %eax
1516 ; SSE2-NEXT:    movzbl -{{[0-9]+}}(%rsp), %esi
1517 ; SSE2-NEXT:    movzbl -{{[0-9]+}}(%rsp), %r11d
1518 ; SSE2-NEXT:    movzbl -{{[0-9]+}}(%rsp), %ebx
1519 ; SSE2-NEXT:    bsrl %ebx, %ebx
1520 ; SSE2-NEXT:    xorl $7, %ebx
1521 ; SSE2-NEXT:    movd %ebx, %xmm2
1522 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
1523 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3],xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]
1524 ; SSE2-NEXT:    bsrl %edx, %edx
1525 ; SSE2-NEXT:    xorl $7, %edx
1526 ; SSE2-NEXT:    movd %edx, %xmm0
1527 ; SSE2-NEXT:    bsrl %esi, %edx
1528 ; SSE2-NEXT:    xorl $7, %edx
1529 ; SSE2-NEXT:    movd %edx, %xmm3
1530 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
1531 ; SSE2-NEXT:    bsrl %ecx, %ecx
1532 ; SSE2-NEXT:    xorl $7, %ecx
1533 ; SSE2-NEXT:    movd %ecx, %xmm0
1534 ; SSE2-NEXT:    movzbl -{{[0-9]+}}(%rsp), %ecx
1535 ; SSE2-NEXT:    movzbl -{{[0-9]+}}(%rsp), %edx
1536 ; SSE2-NEXT:    bsrl %edx, %edx
1537 ; SSE2-NEXT:    xorl $7, %edx
1538 ; SSE2-NEXT:    movd %edx, %xmm1
1539 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1540 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3],xmm1[4],xmm3[4],xmm1[5],xmm3[5],xmm1[6],xmm3[6],xmm1[7],xmm3[7]
1541 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
1542 ; SSE2-NEXT:    bsrl %edi, %edx
1543 ; SSE2-NEXT:    xorl $7, %edx
1544 ; SSE2-NEXT:    movd %edx, %xmm0
1545 ; SSE2-NEXT:    bsrl %eax, %eax
1546 ; SSE2-NEXT:    xorl $7, %eax
1547 ; SSE2-NEXT:    movd %eax, %xmm2
1548 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
1549 ; SSE2-NEXT:    bsrl %r10d, %eax
1550 ; SSE2-NEXT:    xorl $7, %eax
1551 ; SSE2-NEXT:    movd %eax, %xmm0
1552 ; SSE2-NEXT:    bsrl %ecx, %eax
1553 ; SSE2-NEXT:    xorl $7, %eax
1554 ; SSE2-NEXT:    movd %eax, %xmm3
1555 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
1556 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3],xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7]
1557 ; SSE2-NEXT:    bsrl %r9d, %eax
1558 ; SSE2-NEXT:    xorl $7, %eax
1559 ; SSE2-NEXT:    movd %eax, %xmm0
1560 ; SSE2-NEXT:    bsrl %r11d, %eax
1561 ; SSE2-NEXT:    xorl $7, %eax
1562 ; SSE2-NEXT:    movd %eax, %xmm2
1563 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
1564 ; SSE2-NEXT:    bsrl %r8d, %eax
1565 ; SSE2-NEXT:    xorl $7, %eax
1566 ; SSE2-NEXT:    movd %eax, %xmm4
1567 ; SSE2-NEXT:    movzbl -{{[0-9]+}}(%rsp), %eax
1568 ; SSE2-NEXT:    bsrl %eax, %eax
1569 ; SSE2-NEXT:    xorl $7, %eax
1570 ; SSE2-NEXT:    movd %eax, %xmm0
1571 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3],xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7]
1572 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
1573 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3],xmm0[4],xmm3[4],xmm0[5],xmm3[5],xmm0[6],xmm3[6],xmm0[7],xmm3[7]
1574 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
1575 ; SSE2-NEXT:    popq %rbx
1576 ; SSE2-NEXT:    retq
1577 ;
1578 ; SSE3-LABEL: testv16i8u:
1579 ; SSE3:       # BB#0:
1580 ; SSE3-NEXT:    pushq %rbx
1581 ; SSE3-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp)
1582 ; SSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %eax
1583 ; SSE3-NEXT:    bsrl %eax, %eax
1584 ; SSE3-NEXT:    xorl $7, %eax
1585 ; SSE3-NEXT:    movd %eax, %xmm0
1586 ; SSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %edi
1587 ; SSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %edx
1588 ; SSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %r9d
1589 ; SSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %eax
1590 ; SSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %r10d
1591 ; SSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %ecx
1592 ; SSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %r8d
1593 ; SSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %esi
1594 ; SSE3-NEXT:    bsrl %esi, %esi
1595 ; SSE3-NEXT:    xorl $7, %esi
1596 ; SSE3-NEXT:    movd %esi, %xmm1
1597 ; SSE3-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1598 ; SSE3-NEXT:    bsrl %eax, %eax
1599 ; SSE3-NEXT:    xorl $7, %eax
1600 ; SSE3-NEXT:    movd %eax, %xmm0
1601 ; SSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %eax
1602 ; SSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %esi
1603 ; SSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %r11d
1604 ; SSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %ebx
1605 ; SSE3-NEXT:    bsrl %ebx, %ebx
1606 ; SSE3-NEXT:    xorl $7, %ebx
1607 ; SSE3-NEXT:    movd %ebx, %xmm2
1608 ; SSE3-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
1609 ; SSE3-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3],xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]
1610 ; SSE3-NEXT:    bsrl %edx, %edx
1611 ; SSE3-NEXT:    xorl $7, %edx
1612 ; SSE3-NEXT:    movd %edx, %xmm0
1613 ; SSE3-NEXT:    bsrl %esi, %edx
1614 ; SSE3-NEXT:    xorl $7, %edx
1615 ; SSE3-NEXT:    movd %edx, %xmm3
1616 ; SSE3-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
1617 ; SSE3-NEXT:    bsrl %ecx, %ecx
1618 ; SSE3-NEXT:    xorl $7, %ecx
1619 ; SSE3-NEXT:    movd %ecx, %xmm0
1620 ; SSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %ecx
1621 ; SSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %edx
1622 ; SSE3-NEXT:    bsrl %edx, %edx
1623 ; SSE3-NEXT:    xorl $7, %edx
1624 ; SSE3-NEXT:    movd %edx, %xmm1
1625 ; SSE3-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1626 ; SSE3-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3],xmm1[4],xmm3[4],xmm1[5],xmm3[5],xmm1[6],xmm3[6],xmm1[7],xmm3[7]
1627 ; SSE3-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
1628 ; SSE3-NEXT:    bsrl %edi, %edx
1629 ; SSE3-NEXT:    xorl $7, %edx
1630 ; SSE3-NEXT:    movd %edx, %xmm0
1631 ; SSE3-NEXT:    bsrl %eax, %eax
1632 ; SSE3-NEXT:    xorl $7, %eax
1633 ; SSE3-NEXT:    movd %eax, %xmm2
1634 ; SSE3-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
1635 ; SSE3-NEXT:    bsrl %r10d, %eax
1636 ; SSE3-NEXT:    xorl $7, %eax
1637 ; SSE3-NEXT:    movd %eax, %xmm0
1638 ; SSE3-NEXT:    bsrl %ecx, %eax
1639 ; SSE3-NEXT:    xorl $7, %eax
1640 ; SSE3-NEXT:    movd %eax, %xmm3
1641 ; SSE3-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
1642 ; SSE3-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3],xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7]
1643 ; SSE3-NEXT:    bsrl %r9d, %eax
1644 ; SSE3-NEXT:    xorl $7, %eax
1645 ; SSE3-NEXT:    movd %eax, %xmm0
1646 ; SSE3-NEXT:    bsrl %r11d, %eax
1647 ; SSE3-NEXT:    xorl $7, %eax
1648 ; SSE3-NEXT:    movd %eax, %xmm2
1649 ; SSE3-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
1650 ; SSE3-NEXT:    bsrl %r8d, %eax
1651 ; SSE3-NEXT:    xorl $7, %eax
1652 ; SSE3-NEXT:    movd %eax, %xmm4
1653 ; SSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %eax
1654 ; SSE3-NEXT:    bsrl %eax, %eax
1655 ; SSE3-NEXT:    xorl $7, %eax
1656 ; SSE3-NEXT:    movd %eax, %xmm0
1657 ; SSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3],xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7]
1658 ; SSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
1659 ; SSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3],xmm0[4],xmm3[4],xmm0[5],xmm3[5],xmm0[6],xmm3[6],xmm0[7],xmm3[7]
1660 ; SSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
1661 ; SSE3-NEXT:    popq %rbx
1662 ; SSE3-NEXT:    retq
1663 ;
1664 ; SSSE3-LABEL: testv16i8u:
1665 ; SSSE3:       # BB#0:
1666 ; SSSE3-NEXT:    pushq %rbx
1667 ; SSSE3-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp)
1668 ; SSSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %eax
1669 ; SSSE3-NEXT:    bsrl %eax, %eax
1670 ; SSSE3-NEXT:    xorl $7, %eax
1671 ; SSSE3-NEXT:    movd %eax, %xmm0
1672 ; SSSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %edi
1673 ; SSSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %edx
1674 ; SSSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %r9d
1675 ; SSSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %eax
1676 ; SSSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %r10d
1677 ; SSSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %ecx
1678 ; SSSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %r8d
1679 ; SSSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %esi
1680 ; SSSE3-NEXT:    bsrl %esi, %esi
1681 ; SSSE3-NEXT:    xorl $7, %esi
1682 ; SSSE3-NEXT:    movd %esi, %xmm1
1683 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1684 ; SSSE3-NEXT:    bsrl %eax, %eax
1685 ; SSSE3-NEXT:    xorl $7, %eax
1686 ; SSSE3-NEXT:    movd %eax, %xmm0
1687 ; SSSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %eax
1688 ; SSSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %esi
1689 ; SSSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %r11d
1690 ; SSSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %ebx
1691 ; SSSE3-NEXT:    bsrl %ebx, %ebx
1692 ; SSSE3-NEXT:    xorl $7, %ebx
1693 ; SSSE3-NEXT:    movd %ebx, %xmm2
1694 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
1695 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3],xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]
1696 ; SSSE3-NEXT:    bsrl %edx, %edx
1697 ; SSSE3-NEXT:    xorl $7, %edx
1698 ; SSSE3-NEXT:    movd %edx, %xmm0
1699 ; SSSE3-NEXT:    bsrl %esi, %edx
1700 ; SSSE3-NEXT:    xorl $7, %edx
1701 ; SSSE3-NEXT:    movd %edx, %xmm3
1702 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
1703 ; SSSE3-NEXT:    bsrl %ecx, %ecx
1704 ; SSSE3-NEXT:    xorl $7, %ecx
1705 ; SSSE3-NEXT:    movd %ecx, %xmm0
1706 ; SSSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %ecx
1707 ; SSSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %edx
1708 ; SSSE3-NEXT:    bsrl %edx, %edx
1709 ; SSSE3-NEXT:    xorl $7, %edx
1710 ; SSSE3-NEXT:    movd %edx, %xmm1
1711 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1712 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3],xmm1[4],xmm3[4],xmm1[5],xmm3[5],xmm1[6],xmm3[6],xmm1[7],xmm3[7]
1713 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
1714 ; SSSE3-NEXT:    bsrl %edi, %edx
1715 ; SSSE3-NEXT:    xorl $7, %edx
1716 ; SSSE3-NEXT:    movd %edx, %xmm0
1717 ; SSSE3-NEXT:    bsrl %eax, %eax
1718 ; SSSE3-NEXT:    xorl $7, %eax
1719 ; SSSE3-NEXT:    movd %eax, %xmm2
1720 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
1721 ; SSSE3-NEXT:    bsrl %r10d, %eax
1722 ; SSSE3-NEXT:    xorl $7, %eax
1723 ; SSSE3-NEXT:    movd %eax, %xmm0
1724 ; SSSE3-NEXT:    bsrl %ecx, %eax
1725 ; SSSE3-NEXT:    xorl $7, %eax
1726 ; SSSE3-NEXT:    movd %eax, %xmm3
1727 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
1728 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3],xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7]
1729 ; SSSE3-NEXT:    bsrl %r9d, %eax
1730 ; SSSE3-NEXT:    xorl $7, %eax
1731 ; SSSE3-NEXT:    movd %eax, %xmm0
1732 ; SSSE3-NEXT:    bsrl %r11d, %eax
1733 ; SSSE3-NEXT:    xorl $7, %eax
1734 ; SSSE3-NEXT:    movd %eax, %xmm2
1735 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
1736 ; SSSE3-NEXT:    bsrl %r8d, %eax
1737 ; SSSE3-NEXT:    xorl $7, %eax
1738 ; SSSE3-NEXT:    movd %eax, %xmm4
1739 ; SSSE3-NEXT:    movzbl -{{[0-9]+}}(%rsp), %eax
1740 ; SSSE3-NEXT:    bsrl %eax, %eax
1741 ; SSSE3-NEXT:    xorl $7, %eax
1742 ; SSSE3-NEXT:    movd %eax, %xmm0
1743 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3],xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7]
1744 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
1745 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3],xmm0[4],xmm3[4],xmm0[5],xmm3[5],xmm0[6],xmm3[6],xmm0[7],xmm3[7]
1746 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
1747 ; SSSE3-NEXT:    popq %rbx
1748 ; SSSE3-NEXT:    retq
1749 ;
1750 ; SSE41-LABEL: testv16i8u:
1751 ; SSE41:       # BB#0:
1752 ; SSE41-NEXT:    pextrb $1, %xmm0, %eax
1753 ; SSE41-NEXT:    bsrl %eax, %eax
1754 ; SSE41-NEXT:    xorl $7, %eax
1755 ; SSE41-NEXT:    pextrb $0, %xmm0, %ecx
1756 ; SSE41-NEXT:    bsrl %ecx, %ecx
1757 ; SSE41-NEXT:    xorl $7, %ecx
1758 ; SSE41-NEXT:    movd %ecx, %xmm1
1759 ; SSE41-NEXT:    pinsrb $1, %eax, %xmm1
1760 ; SSE41-NEXT:    pextrb $2, %xmm0, %eax
1761 ; SSE41-NEXT:    bsrl %eax, %eax
1762 ; SSE41-NEXT:    xorl $7, %eax
1763 ; SSE41-NEXT:    pinsrb $2, %eax, %xmm1
1764 ; SSE41-NEXT:    pextrb $3, %xmm0, %eax
1765 ; SSE41-NEXT:    bsrl %eax, %eax
1766 ; SSE41-NEXT:    xorl $7, %eax
1767 ; SSE41-NEXT:    pinsrb $3, %eax, %xmm1
1768 ; SSE41-NEXT:    pextrb $4, %xmm0, %eax
1769 ; SSE41-NEXT:    bsrl %eax, %eax
1770 ; SSE41-NEXT:    xorl $7, %eax
1771 ; SSE41-NEXT:    pinsrb $4, %eax, %xmm1
1772 ; SSE41-NEXT:    pextrb $5, %xmm0, %eax
1773 ; SSE41-NEXT:    bsrl %eax, %eax
1774 ; SSE41-NEXT:    xorl $7, %eax
1775 ; SSE41-NEXT:    pinsrb $5, %eax, %xmm1
1776 ; SSE41-NEXT:    pextrb $6, %xmm0, %eax
1777 ; SSE41-NEXT:    bsrl %eax, %eax
1778 ; SSE41-NEXT:    xorl $7, %eax
1779 ; SSE41-NEXT:    pinsrb $6, %eax, %xmm1
1780 ; SSE41-NEXT:    pextrb $7, %xmm0, %eax
1781 ; SSE41-NEXT:    bsrl %eax, %eax
1782 ; SSE41-NEXT:    xorl $7, %eax
1783 ; SSE41-NEXT:    pinsrb $7, %eax, %xmm1
1784 ; SSE41-NEXT:    pextrb $8, %xmm0, %eax
1785 ; SSE41-NEXT:    bsrl %eax, %eax
1786 ; SSE41-NEXT:    xorl $7, %eax
1787 ; SSE41-NEXT:    pinsrb $8, %eax, %xmm1
1788 ; SSE41-NEXT:    pextrb $9, %xmm0, %eax
1789 ; SSE41-NEXT:    bsrl %eax, %eax
1790 ; SSE41-NEXT:    xorl $7, %eax
1791 ; SSE41-NEXT:    pinsrb $9, %eax, %xmm1
1792 ; SSE41-NEXT:    pextrb $10, %xmm0, %eax
1793 ; SSE41-NEXT:    bsrl %eax, %eax
1794 ; SSE41-NEXT:    xorl $7, %eax
1795 ; SSE41-NEXT:    pinsrb $10, %eax, %xmm1
1796 ; SSE41-NEXT:    pextrb $11, %xmm0, %eax
1797 ; SSE41-NEXT:    bsrl %eax, %eax
1798 ; SSE41-NEXT:    xorl $7, %eax
1799 ; SSE41-NEXT:    pinsrb $11, %eax, %xmm1
1800 ; SSE41-NEXT:    pextrb $12, %xmm0, %eax
1801 ; SSE41-NEXT:    bsrl %eax, %eax
1802 ; SSE41-NEXT:    xorl $7, %eax
1803 ; SSE41-NEXT:    pinsrb $12, %eax, %xmm1
1804 ; SSE41-NEXT:    pextrb $13, %xmm0, %eax
1805 ; SSE41-NEXT:    bsrl %eax, %eax
1806 ; SSE41-NEXT:    xorl $7, %eax
1807 ; SSE41-NEXT:    pinsrb $13, %eax, %xmm1
1808 ; SSE41-NEXT:    pextrb $14, %xmm0, %eax
1809 ; SSE41-NEXT:    bsrl %eax, %eax
1810 ; SSE41-NEXT:    xorl $7, %eax
1811 ; SSE41-NEXT:    pinsrb $14, %eax, %xmm1
1812 ; SSE41-NEXT:    pextrb $15, %xmm0, %eax
1813 ; SSE41-NEXT:    bsrl %eax, %eax
1814 ; SSE41-NEXT:    xorl $7, %eax
1815 ; SSE41-NEXT:    pinsrb $15, %eax, %xmm1
1816 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1817 ; SSE41-NEXT:    retq
1818 ;
1819 ; AVX-LABEL: testv16i8u:
1820 ; AVX:       # BB#0:
1821 ; AVX-NEXT:    vpextrb $1, %xmm0, %eax
1822 ; AVX-NEXT:    bsrl %eax, %eax
1823 ; AVX-NEXT:    xorl $7, %eax
1824 ; AVX-NEXT:    vpextrb $0, %xmm0, %ecx
1825 ; AVX-NEXT:    bsrl %ecx, %ecx
1826 ; AVX-NEXT:    xorl $7, %ecx
1827 ; AVX-NEXT:    vmovd %ecx, %xmm1
1828 ; AVX-NEXT:    vpinsrb $1, %eax, %xmm1, %xmm1
1829 ; AVX-NEXT:    vpextrb $2, %xmm0, %eax
1830 ; AVX-NEXT:    bsrl %eax, %eax
1831 ; AVX-NEXT:    xorl $7, %eax
1832 ; AVX-NEXT:    vpinsrb $2, %eax, %xmm1, %xmm1
1833 ; AVX-NEXT:    vpextrb $3, %xmm0, %eax
1834 ; AVX-NEXT:    bsrl %eax, %eax
1835 ; AVX-NEXT:    xorl $7, %eax
1836 ; AVX-NEXT:    vpinsrb $3, %eax, %xmm1, %xmm1
1837 ; AVX-NEXT:    vpextrb $4, %xmm0, %eax
1838 ; AVX-NEXT:    bsrl %eax, %eax
1839 ; AVX-NEXT:    xorl $7, %eax
1840 ; AVX-NEXT:    vpinsrb $4, %eax, %xmm1, %xmm1
1841 ; AVX-NEXT:    vpextrb $5, %xmm0, %eax
1842 ; AVX-NEXT:    bsrl %eax, %eax
1843 ; AVX-NEXT:    xorl $7, %eax
1844 ; AVX-NEXT:    vpinsrb $5, %eax, %xmm1, %xmm1
1845 ; AVX-NEXT:    vpextrb $6, %xmm0, %eax
1846 ; AVX-NEXT:    bsrl %eax, %eax
1847 ; AVX-NEXT:    xorl $7, %eax
1848 ; AVX-NEXT:    vpinsrb $6, %eax, %xmm1, %xmm1
1849 ; AVX-NEXT:    vpextrb $7, %xmm0, %eax
1850 ; AVX-NEXT:    bsrl %eax, %eax
1851 ; AVX-NEXT:    xorl $7, %eax
1852 ; AVX-NEXT:    vpinsrb $7, %eax, %xmm1, %xmm1
1853 ; AVX-NEXT:    vpextrb $8, %xmm0, %eax
1854 ; AVX-NEXT:    bsrl %eax, %eax
1855 ; AVX-NEXT:    xorl $7, %eax
1856 ; AVX-NEXT:    vpinsrb $8, %eax, %xmm1, %xmm1
1857 ; AVX-NEXT:    vpextrb $9, %xmm0, %eax
1858 ; AVX-NEXT:    bsrl %eax, %eax
1859 ; AVX-NEXT:    xorl $7, %eax
1860 ; AVX-NEXT:    vpinsrb $9, %eax, %xmm1, %xmm1
1861 ; AVX-NEXT:    vpextrb $10, %xmm0, %eax
1862 ; AVX-NEXT:    bsrl %eax, %eax
1863 ; AVX-NEXT:    xorl $7, %eax
1864 ; AVX-NEXT:    vpinsrb $10, %eax, %xmm1, %xmm1
1865 ; AVX-NEXT:    vpextrb $11, %xmm0, %eax
1866 ; AVX-NEXT:    bsrl %eax, %eax
1867 ; AVX-NEXT:    xorl $7, %eax
1868 ; AVX-NEXT:    vpinsrb $11, %eax, %xmm1, %xmm1
1869 ; AVX-NEXT:    vpextrb $12, %xmm0, %eax
1870 ; AVX-NEXT:    bsrl %eax, %eax
1871 ; AVX-NEXT:    xorl $7, %eax
1872 ; AVX-NEXT:    vpinsrb $12, %eax, %xmm1, %xmm1
1873 ; AVX-NEXT:    vpextrb $13, %xmm0, %eax
1874 ; AVX-NEXT:    bsrl %eax, %eax
1875 ; AVX-NEXT:    xorl $7, %eax
1876 ; AVX-NEXT:    vpinsrb $13, %eax, %xmm1, %xmm1
1877 ; AVX-NEXT:    vpextrb $14, %xmm0, %eax
1878 ; AVX-NEXT:    bsrl %eax, %eax
1879 ; AVX-NEXT:    xorl $7, %eax
1880 ; AVX-NEXT:    vpinsrb $14, %eax, %xmm1, %xmm1
1881 ; AVX-NEXT:    vpextrb $15, %xmm0, %eax
1882 ; AVX-NEXT:    bsrl %eax, %eax
1883 ; AVX-NEXT:    xorl $7, %eax
1884 ; AVX-NEXT:    vpinsrb $15, %eax, %xmm1, %xmm0
1885 ; AVX-NEXT:    retq
1886 ;
1887 ; AVX512VLCD-LABEL: testv16i8u:
1888 ; AVX512VLCD:       ## BB#0:
1889 ; AVX512VLCD-NEXT:    vpmovzxbd %xmm0, %zmm0
1890 ; AVX512VLCD-NEXT:    vplzcntd %zmm0, %zmm0
1891 ; AVX512VLCD-NEXT:    vpmovdb %zmm0, %xmm0
1892 ; AVX512VLCD-NEXT:    vpsubb {{.*}}(%rip), %xmm0, %xmm0
1893 ; AVX512VLCD-NEXT:    retq
1894 ;
1895 ; AVX512CD-LABEL: testv16i8u:
1896 ; AVX512CD:       ## BB#0:
1897 ; AVX512CD-NEXT:    vpmovzxbd %xmm0, %zmm0
1898 ; AVX512CD-NEXT:    vplzcntd %zmm0, %zmm0
1899 ; AVX512CD-NEXT:    vpmovdb %zmm0, %xmm0
1900 ; AVX512CD-NEXT:    vpsubb {{.*}}(%rip), %xmm0, %xmm0
1901 ; AVX512CD-NEXT:    retq
1902   %out = call <16 x i8> @llvm.ctlz.v16i8(<16 x i8> %in, i1 -1)
1903   ret <16 x i8> %out
1904 }
1905
1906 define <2 x i64> @foldv2i64() nounwind {
1907 ; SSE-LABEL: foldv2i64:
1908 ; SSE:       # BB#0:
1909 ; SSE-NEXT:    movl $55, %eax
1910 ; SSE-NEXT:    movd %rax, %xmm0
1911 ; SSE-NEXT:    retq
1912 ;
1913 ; AVX-LABEL: foldv2i64:
1914 ; AVX:       # BB#0:
1915 ; AVX-NEXT:    movl $55, %eax
1916 ; AVX-NEXT:    vmovq %rax, %xmm0
1917 ; AVX-NEXT:    retq
1918 ;
1919 ; AVX512VLCD-LABEL: foldv2i64:
1920 ; AVX512VLCD:       ## BB#0:
1921 ; AVX512VLCD-NEXT:    movl $55, %eax
1922 ; AVX512VLCD-NEXT:    vmovq %rax, %xmm0
1923 ; AVX512VLCD-NEXT:    retq
1924 ;
1925 ; AVX512CD-LABEL: foldv2i64:
1926 ; AVX512CD:       ## BB#0:
1927 ; AVX512CD-NEXT:    movl $55, %eax
1928 ; AVX512CD-NEXT:    vmovq %rax, %xmm0
1929 ; AVX512CD-NEXT:    retq
1930   %out = call <2 x i64> @llvm.ctlz.v2i64(<2 x i64> <i64 256, i64 -1>, i1 0)
1931   ret <2 x i64> %out
1932 }
1933
1934 define <2 x i64> @foldv2i64u() nounwind {
1935 ; SSE-LABEL: foldv2i64u:
1936 ; SSE:       # BB#0:
1937 ; SSE-NEXT:    movl $55, %eax
1938 ; SSE-NEXT:    movd %rax, %xmm0
1939 ; SSE-NEXT:    retq
1940 ;
1941 ; AVX-LABEL: foldv2i64u:
1942 ; AVX:       # BB#0:
1943 ; AVX-NEXT:    movl $55, %eax
1944 ; AVX-NEXT:    vmovq %rax, %xmm0
1945 ; AVX-NEXT:    retq
1946 ;
1947 ; AVX512VLCD-LABEL: foldv2i64u:
1948 ; AVX512VLCD:       ## BB#0:
1949 ; AVX512VLCD-NEXT:    movl $55, %eax
1950 ; AVX512VLCD-NEXT:    vmovq %rax, %xmm0
1951 ; AVX512VLCD-NEXT:    retq
1952 ;
1953 ; AVX512CD-LABEL: foldv2i64u:
1954 ; AVX512CD:       ## BB#0:
1955 ; AVX512CD-NEXT:    movl $55, %eax
1956 ; AVX512CD-NEXT:    vmovq %rax, %xmm0
1957 ; AVX512CD-NEXT:    retq
1958   %out = call <2 x i64> @llvm.ctlz.v2i64(<2 x i64> <i64 256, i64 -1>, i1 -1)
1959   ret <2 x i64> %out
1960 }
1961
1962 define <4 x i32> @foldv4i32() nounwind {
1963 ; SSE-LABEL: foldv4i32:
1964 ; SSE:       # BB#0:
1965 ; SSE-NEXT:    movaps {{.*#+}} xmm0 = [23,0,32,24]
1966 ; SSE-NEXT:    retq
1967 ;
1968 ; AVX-LABEL: foldv4i32:
1969 ; AVX:       # BB#0:
1970 ; AVX-NEXT:    vmovaps {{.*#+}} xmm0 = [23,0,32,24]
1971 ; AVX-NEXT:    retq
1972 ;
1973 ; AVX512VLCD-LABEL: foldv4i32:
1974 ; AVX512VLCD:       ## BB#0:
1975 ; AVX512VLCD-NEXT:    vmovdqa32 {{.*#+}} xmm0 = [23,0,32,24]
1976 ; AVX512VLCD-NEXT:    retq
1977 ;
1978 ; AVX512CD-LABEL: foldv4i32:
1979 ; AVX512CD:       ## BB#0:
1980 ; AVX512CD-NEXT:    vmovaps {{.*#+}} xmm0 = [23,0,32,24]
1981 ; AVX512CD-NEXT:    retq
1982   %out = call <4 x i32> @llvm.ctlz.v4i32(<4 x i32> <i32 256, i32 -1, i32 0, i32 255>, i1 0)
1983   ret <4 x i32> %out
1984 }
1985
1986 define <4 x i32> @foldv4i32u() nounwind {
1987 ; SSE-LABEL: foldv4i32u:
1988 ; SSE:       # BB#0:
1989 ; SSE-NEXT:    movaps {{.*#+}} xmm0 = [23,0,32,24]
1990 ; SSE-NEXT:    retq
1991 ;
1992 ; AVX-LABEL: foldv4i32u:
1993 ; AVX:       # BB#0:
1994 ; AVX-NEXT:    vmovaps {{.*#+}} xmm0 = [23,0,32,24]
1995 ; AVX-NEXT:    retq
1996 ;
1997 ; AVX512VLCD-LABEL: foldv4i32u:
1998 ; AVX512VLCD:       ## BB#0:
1999 ; AVX512VLCD-NEXT:    vmovdqa32 {{.*#+}} xmm0 = [23,0,32,24]
2000 ; AVX512VLCD-NEXT:    retq
2001 ;
2002 ; AVX512CD-LABEL: foldv4i32u:
2003 ; AVX512CD:       ## BB#0:
2004 ; AVX512CD-NEXT:    vmovaps {{.*#+}} xmm0 = [23,0,32,24]
2005 ; AVX512CD-NEXT:    retq
2006   %out = call <4 x i32> @llvm.ctlz.v4i32(<4 x i32> <i32 256, i32 -1, i32 0, i32 255>, i1 -1)
2007   ret <4 x i32> %out
2008 }
2009
2010 define <8 x i16> @foldv8i16() nounwind {
2011 ; SSE-LABEL: foldv8i16:
2012 ; SSE:       # BB#0:
2013 ; SSE-NEXT:    movaps {{.*#+}} xmm0 = [7,0,16,8,16,13,11,9]
2014 ; SSE-NEXT:    retq
2015 ;
2016 ; AVX-LABEL: foldv8i16:
2017 ; AVX:       # BB#0:
2018 ; AVX-NEXT:    vmovaps {{.*#+}} xmm0 = [7,0,16,8,16,13,11,9]
2019 ; AVX-NEXT:    retq
2020 ;
2021 ; AVX512VLCD-LABEL: foldv8i16:
2022 ; AVX512VLCD:       ## BB#0:
2023 ; AVX512VLCD-NEXT:    vmovdqa64 {{.*#+}} xmm0 = [7,0,16,8,16,13,11,9]
2024 ; AVX512VLCD-NEXT:    retq
2025 ;
2026 ; AVX512CD-LABEL: foldv8i16:
2027 ; AVX512CD:       ## BB#0:
2028 ; AVX512CD-NEXT:    vmovaps {{.*#+}} xmm0 = [7,0,16,8,16,13,11,9]
2029 ; AVX512CD-NEXT:    retq
2030   %out = call <8 x i16> @llvm.ctlz.v8i16(<8 x i16> <i16 256, i16 -1, i16 0, i16 255, i16 -65536, i16 7, i16 24, i16 88>, i1 0)
2031   ret <8 x i16> %out
2032 }
2033
2034 define <8 x i16> @foldv8i16u() nounwind {
2035 ; SSE-LABEL: foldv8i16u:
2036 ; SSE:       # BB#0:
2037 ; SSE-NEXT:    movaps {{.*#+}} xmm0 = [7,0,16,8,16,13,11,9]
2038 ; SSE-NEXT:    retq
2039 ;
2040 ; AVX-LABEL: foldv8i16u:
2041 ; AVX:       # BB#0:
2042 ; AVX-NEXT:    vmovaps {{.*#+}} xmm0 = [7,0,16,8,16,13,11,9]
2043 ; AVX-NEXT:    retq
2044 ;
2045 ; AVX512VLCD-LABEL: foldv8i16u:
2046 ; AVX512VLCD:       ## BB#0:
2047 ; AVX512VLCD-NEXT:    vmovdqa64 {{.*#+}} xmm0 = [7,0,16,8,16,13,11,9]
2048 ; AVX512VLCD-NEXT:    retq
2049 ;
2050 ; AVX512CD-LABEL: foldv8i16u:
2051 ; AVX512CD:       ## BB#0:
2052 ; AVX512CD-NEXT:    vmovaps {{.*#+}} xmm0 = [7,0,16,8,16,13,11,9]
2053 ; AVX512CD-NEXT:    retq
2054   %out = call <8 x i16> @llvm.ctlz.v8i16(<8 x i16> <i16 256, i16 -1, i16 0, i16 255, i16 -65536, i16 7, i16 24, i16 88>, i1 -1)
2055   ret <8 x i16> %out
2056 }
2057
2058 define <16 x i8> @foldv16i8() nounwind {
2059 ; SSE-LABEL: foldv16i8:
2060 ; SSE:       # BB#0:
2061 ; SSE-NEXT:    movaps {{.*#+}} xmm0 = [8,0,8,0,8,5,3,1,0,0,7,6,5,4,3,2]
2062 ; SSE-NEXT:    retq
2063 ;
2064 ; AVX-LABEL: foldv16i8:
2065 ; AVX:       # BB#0:
2066 ; AVX-NEXT:    vmovaps {{.*#+}} xmm0 = [8,0,8,0,8,5,3,1,0,0,7,6,5,4,3,2]
2067 ; AVX-NEXT:    retq
2068 ;
2069 ; AVX512VLCD-LABEL: foldv16i8:
2070 ; AVX512VLCD:       ## BB#0:
2071 ; AVX512VLCD-NEXT:    vmovdqa64 {{.*#+}} xmm0 = [8,0,8,0,8,5,3,1,0,0,7,6,5,4,3,2]
2072 ; AVX512VLCD-NEXT:    retq
2073 ;
2074 ; AVX512CD-LABEL: foldv16i8:
2075 ; AVX512CD:       ## BB#0:
2076 ; AVX512CD-NEXT:    vmovaps {{.*#+}} xmm0 = [8,0,8,0,8,5,3,1,0,0,7,6,5,4,3,2]
2077 ; AVX512CD-NEXT:    retq
2078   %out = call <16 x i8> @llvm.ctlz.v16i8(<16 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>, i1 0)
2079   ret <16 x i8> %out
2080 }
2081
2082 define <16 x i8> @foldv16i8u() nounwind {
2083 ; SSE-LABEL: foldv16i8u:
2084 ; SSE:       # BB#0:
2085 ; SSE-NEXT:    movaps {{.*#+}} xmm0 = [8,0,8,0,8,5,3,1,0,0,7,6,5,4,3,2]
2086 ; SSE-NEXT:    retq
2087 ;
2088 ; AVX-LABEL: foldv16i8u:
2089 ; AVX:       # BB#0:
2090 ; AVX-NEXT:    vmovaps {{.*#+}} xmm0 = [8,0,8,0,8,5,3,1,0,0,7,6,5,4,3,2]
2091 ; AVX-NEXT:    retq
2092 ;
2093 ; AVX512VLCD-LABEL: foldv16i8u:
2094 ; AVX512VLCD:       ## BB#0:
2095 ; AVX512VLCD-NEXT:    vmovdqa64 {{.*#+}} xmm0 = [8,0,8,0,8,5,3,1,0,0,7,6,5,4,3,2]
2096 ; AVX512VLCD-NEXT:    retq
2097 ;
2098 ; AVX512CD-LABEL: foldv16i8u:
2099 ; AVX512CD:       ## BB#0:
2100 ; AVX512CD-NEXT:    vmovaps {{.*#+}} xmm0 = [8,0,8,0,8,5,3,1,0,0,7,6,5,4,3,2]
2101 ; AVX512CD-NEXT:    retq
2102   %out = call <16 x i8> @llvm.ctlz.v16i8(<16 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>, i1 -1)
2103   ret <16 x i8> %out
2104 }
2105
2106 declare <2 x i64> @llvm.ctlz.v2i64(<2 x i64>, i1)
2107 declare <4 x i32> @llvm.ctlz.v4i32(<4 x i32>, i1)
2108 declare <8 x i16> @llvm.ctlz.v8i16(<8 x i16>, i1)
2109 declare <16 x i8> @llvm.ctlz.v16i8(<16 x i8>, i1)