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