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