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
8 define <2 x i64> @testv2i64(<2 x i64> %in) nounwind {
9 ; SSE2-LABEL: testv2i64:
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
25 ; SSE3-LABEL: testv2i64:
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
41 ; SSSE3-LABEL: testv2i64:
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
57 ; SSE41-LABEL: testv2i64:
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]
71 ; AVX-LABEL: testv2i64:
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]
84 %out = call <2 x i64> @llvm.cttz.v2i64(<2 x i64> %in, i1 0)
88 define <2 x i64> @testv2i64u(<2 x i64> %in) nounwind {
89 ; SSE2-LABEL: testv2i64u:
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
102 ; SSE3-LABEL: testv2i64u:
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
115 ; SSSE3-LABEL: testv2i64u:
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
128 ; SSE41-LABEL: testv2i64u:
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]
139 ; AVX-LABEL: testv2i64u:
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]
149 %out = call <2 x i64> @llvm.cttz.v2i64(<2 x i64> %in, i1 -1)
153 define <4 x i32> @testv4i32(<4 x i32> %in) nounwind {
154 ; SSE2-LABEL: testv4i32:
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
182 ; SSE3-LABEL: testv4i32:
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
210 ; SSSE3-LABEL: testv4i32:
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
238 ; SSE41-LABEL: testv4i32:
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
260 ; AVX-LABEL: testv4i32:
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
280 %out = call <4 x i32> @llvm.cttz.v4i32(<4 x i32> %in, i1 0)
284 define <4 x i32> @testv4i32u(<4 x i32> %in) nounwind {
285 ; SSE2-LABEL: testv4i32u:
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
308 ; SSE3-LABEL: testv4i32u:
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
331 ; SSSE3-LABEL: testv4i32u:
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
354 ; SSE41-LABEL: testv4i32u:
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
371 ; AVX-LABEL: testv4i32u:
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
386 %out = call <4 x i32> @llvm.cttz.v4i32(<4 x i32> %in, i1 -1)
390 define <8 x i16> @testv8i16(<8 x i16> %in) nounwind {
391 ; SSE2-LABEL: testv8i16:
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]
435 ; SSE3-LABEL: testv8i16:
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]
479 ; SSSE3-LABEL: testv8i16:
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]
523 ; SSE41-LABEL: testv8i16:
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
561 ; AVX-LABEL: testv8i16:
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
597 %out = call <8 x i16> @llvm.cttz.v8i16(<8 x i16> %in, i1 0)
601 define <8 x i16> @testv8i16u(<8 x i16> %in) nounwind {
602 ; SSE2-LABEL: testv8i16u:
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]
637 ; SSE3-LABEL: testv8i16u:
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]
672 ; SSSE3-LABEL: testv8i16u:
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]
707 ; SSE41-LABEL: testv8i16u:
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
736 ; AVX-LABEL: testv8i16u:
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
763 %out = call <8 x i16> @llvm.cttz.v8i16(<8 x i16> %in, i1 -1)
767 define <16 x i8> @testv16i8(<16 x i8> %in) nounwind {
768 ; SSE2-LABEL: testv16i8:
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
892 ; SSE3-LABEL: testv16i8:
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
1016 ; SSSE3-LABEL: testv16i8:
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
1140 ; SSE41-LABEL: testv16i8:
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
1243 ; AVX-LABEL: testv16i8:
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
1344 %out = call <16 x i8> @llvm.cttz.v16i8(<16 x i8> %in, i1 0)
1348 define <16 x i8> @testv16i8u(<16 x i8> %in) nounwind {
1349 ; SSE2-LABEL: testv16i8u:
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
1419 ; SSE3-LABEL: testv16i8u:
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
1489 ; SSSE3-LABEL: testv16i8u:
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
1559 ; SSE41-LABEL: testv16i8u:
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
1612 ; AVX-LABEL: testv16i8u:
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
1663 %out = call <16 x i8> @llvm.cttz.v16i8(<16 x i8> %in, i1 -1)
1667 define <2 x i64> @foldv2i64() nounwind {
1668 ; SSE-LABEL: foldv2i64:
1670 ; SSE-NEXT: movl $8, %eax
1671 ; SSE-NEXT: movd %rax, %xmm0
1674 ; AVX-LABEL: foldv2i64:
1676 ; AVX-NEXT: movl $8, %eax
1677 ; AVX-NEXT: vmovq %rax, %xmm0
1679 %out = call <2 x i64> @llvm.cttz.v2i64(<2 x i64> <i64 256, i64 -1>, i1 0)
1683 define <2 x i64> @foldv2i64u() nounwind {
1684 ; SSE-LABEL: foldv2i64u:
1686 ; SSE-NEXT: movl $8, %eax
1687 ; SSE-NEXT: movd %rax, %xmm0
1690 ; AVX-LABEL: foldv2i64u:
1692 ; AVX-NEXT: movl $8, %eax
1693 ; AVX-NEXT: vmovq %rax, %xmm0
1695 %out = call <2 x i64> @llvm.cttz.v2i64(<2 x i64> <i64 256, i64 -1>, i1 -1)
1699 define <4 x i32> @foldv4i32() nounwind {
1700 ; SSE-LABEL: foldv4i32:
1702 ; SSE-NEXT: movaps {{.*#+}} xmm0 = [8,0,32,0]
1705 ; AVX-LABEL: foldv4i32:
1707 ; AVX-NEXT: vmovaps {{.*#+}} xmm0 = [8,0,32,0]
1709 %out = call <4 x i32> @llvm.cttz.v4i32(<4 x i32> <i32 256, i32 -1, i32 0, i32 255>, i1 0)
1713 define <4 x i32> @foldv4i32u() nounwind {
1714 ; SSE-LABEL: foldv4i32u:
1716 ; SSE-NEXT: movaps {{.*#+}} xmm0 = [8,0,32,0]
1719 ; AVX-LABEL: foldv4i32u:
1721 ; AVX-NEXT: vmovaps {{.*#+}} xmm0 = [8,0,32,0]
1723 %out = call <4 x i32> @llvm.cttz.v4i32(<4 x i32> <i32 256, i32 -1, i32 0, i32 255>, i1 -1)
1727 define <8 x i16> @foldv8i16() nounwind {
1728 ; SSE-LABEL: foldv8i16:
1730 ; SSE-NEXT: movaps {{.*#+}} xmm0 = [8,0,16,0,16,0,3,3]
1733 ; AVX-LABEL: foldv8i16:
1735 ; AVX-NEXT: vmovaps {{.*#+}} xmm0 = [8,0,16,0,16,0,3,3]
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)
1741 define <8 x i16> @foldv8i16u() nounwind {
1742 ; SSE-LABEL: foldv8i16u:
1744 ; SSE-NEXT: movaps {{.*#+}} xmm0 = [8,0,16,0,16,0,3,3]
1747 ; AVX-LABEL: foldv8i16u:
1749 ; AVX-NEXT: vmovaps {{.*#+}} xmm0 = [8,0,16,0,16,0,3,3]
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)
1755 define <16 x i8> @foldv16i8() nounwind {
1756 ; SSE-LABEL: foldv16i8:
1758 ; SSE-NEXT: movaps {{.*#+}} xmm0 = [8,0,8,0,8,0,3,3,1,1,0,1,2,3,4,5]
1761 ; AVX-LABEL: foldv16i8:
1763 ; AVX-NEXT: vmovaps {{.*#+}} xmm0 = [8,0,8,0,8,0,3,3,1,1,0,1,2,3,4,5]
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)
1769 define <16 x i8> @foldv16i8u() nounwind {
1770 ; SSE-LABEL: foldv16i8u:
1772 ; SSE-NEXT: movaps {{.*#+}} xmm0 = [8,0,8,0,8,0,3,3,1,1,0,1,2,3,4,5]
1775 ; AVX-LABEL: foldv16i8u:
1777 ; AVX-NEXT: vmovaps {{.*#+}} xmm0 = [8,0,8,0,8,0,3,3,1,1,0,1,2,3,4,5]
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)
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)