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