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