[X86] Updated vector tzcnt tests. Added vec512 tests.
[oota-llvm.git] / test / CodeGen / X86 / vector-tzcnt-256.ll
1 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2
3
4 define <4 x i64> @testv4i64(<4 x i64> %in) nounwind {
5 ; AVX1-LABEL: testv4i64:
6 ; AVX1:       # BB#0:
7 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
8 ; AVX1-NEXT:    vpextrq $1, %xmm1, %rax
9 ; AVX1-NEXT:    bsfq %rax, %rax
10 ; AVX1-NEXT:    movl $64, %ecx
11 ; AVX1-NEXT:    cmoveq %rcx, %rax
12 ; AVX1-NEXT:    vmovq %rax, %xmm2
13 ; AVX1-NEXT:    vmovq %xmm1, %rax
14 ; AVX1-NEXT:    bsfq %rax, %rax
15 ; AVX1-NEXT:    cmoveq %rcx, %rax
16 ; AVX1-NEXT:    vmovq %rax, %xmm1
17 ; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
18 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
19 ; AVX1-NEXT:    bsfq %rax, %rax
20 ; AVX1-NEXT:    cmoveq %rcx, %rax
21 ; AVX1-NEXT:    vmovq %rax, %xmm2
22 ; AVX1-NEXT:    vmovq %xmm0, %rax
23 ; AVX1-NEXT:    bsfq %rax, %rax
24 ; AVX1-NEXT:    cmoveq %rcx, %rax
25 ; AVX1-NEXT:    vmovq %rax, %xmm0
26 ; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
27 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
28 ; AVX1-NEXT:    retq
29 ;
30 ; AVX2-LABEL: testv4i64:
31 ; AVX2:       # BB#0:
32 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
33 ; AVX2-NEXT:    vpextrq $1, %xmm1, %rax
34 ; AVX2-NEXT:    bsfq %rax, %rax
35 ; AVX2-NEXT:    movl $64, %ecx
36 ; AVX2-NEXT:    cmoveq %rcx, %rax
37 ; AVX2-NEXT:    vmovq %rax, %xmm2
38 ; AVX2-NEXT:    vmovq %xmm1, %rax
39 ; AVX2-NEXT:    bsfq %rax, %rax
40 ; AVX2-NEXT:    cmoveq %rcx, %rax
41 ; AVX2-NEXT:    vmovq %rax, %xmm1
42 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
43 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
44 ; AVX2-NEXT:    bsfq %rax, %rax
45 ; AVX2-NEXT:    cmoveq %rcx, %rax
46 ; AVX2-NEXT:    vmovq %rax, %xmm2
47 ; AVX2-NEXT:    vmovq %xmm0, %rax
48 ; AVX2-NEXT:    bsfq %rax, %rax
49 ; AVX2-NEXT:    cmoveq %rcx, %rax
50 ; AVX2-NEXT:    vmovq %rax, %xmm0
51 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
52 ; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
53 ; AVX2-NEXT:    retq
54   %out = call <4 x i64> @llvm.cttz.v4i64(<4 x i64> %in, i1 0)
55   ret <4 x i64> %out
56 }
57
58 define <4 x i64> @testv4i64u(<4 x i64> %in) nounwind {
59 ; AVX1-LABEL: testv4i64u:
60 ; AVX1:       # BB#0:
61 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
62 ; AVX1-NEXT:    vpextrq $1, %xmm1, %rax
63 ; AVX1-NEXT:    bsfq %rax, %rax
64 ; AVX1-NEXT:    vmovq %rax, %xmm2
65 ; AVX1-NEXT:    vmovq %xmm1, %rax
66 ; AVX1-NEXT:    bsfq %rax, %rax
67 ; AVX1-NEXT:    vmovq %rax, %xmm1
68 ; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
69 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
70 ; AVX1-NEXT:    bsfq %rax, %rax
71 ; AVX1-NEXT:    vmovq %rax, %xmm2
72 ; AVX1-NEXT:    vmovq %xmm0, %rax
73 ; AVX1-NEXT:    bsfq %rax, %rax
74 ; AVX1-NEXT:    vmovq %rax, %xmm0
75 ; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
76 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
77 ; AVX1-NEXT:    retq
78 ;
79 ; AVX2-LABEL: testv4i64u:
80 ; AVX2:       # BB#0:
81 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
82 ; AVX2-NEXT:    vpextrq $1, %xmm1, %rax
83 ; AVX2-NEXT:    bsfq %rax, %rax
84 ; AVX2-NEXT:    vmovq %rax, %xmm2
85 ; AVX2-NEXT:    vmovq %xmm1, %rax
86 ; AVX2-NEXT:    bsfq %rax, %rax
87 ; AVX2-NEXT:    vmovq %rax, %xmm1
88 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
89 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
90 ; AVX2-NEXT:    bsfq %rax, %rax
91 ; AVX2-NEXT:    vmovq %rax, %xmm2
92 ; AVX2-NEXT:    vmovq %xmm0, %rax
93 ; AVX2-NEXT:    bsfq %rax, %rax
94 ; AVX2-NEXT:    vmovq %rax, %xmm0
95 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
96 ; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
97 ; AVX2-NEXT:    retq
98   %out = call <4 x i64> @llvm.cttz.v4i64(<4 x i64> %in, i1 -1)
99   ret <4 x i64> %out
100 }
101
102 define <8 x i32> @testv8i32(<8 x i32> %in) nounwind {
103 ; AVX1-LABEL: testv8i32:
104 ; AVX1:       # BB#0:
105 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
106 ; AVX1-NEXT:    vpextrd $1, %xmm1, %eax
107 ; AVX1-NEXT:    bsfl %eax, %ecx
108 ; AVX1-NEXT:    movl $32, %eax
109 ; AVX1-NEXT:    cmovel %eax, %ecx
110 ; AVX1-NEXT:    vmovd %xmm1, %edx
111 ; AVX1-NEXT:    bsfl %edx, %edx
112 ; AVX1-NEXT:    cmovel %eax, %edx
113 ; AVX1-NEXT:    vmovd %edx, %xmm2
114 ; AVX1-NEXT:    vpinsrd $1, %ecx, %xmm2, %xmm2
115 ; AVX1-NEXT:    vpextrd $2, %xmm1, %ecx
116 ; AVX1-NEXT:    bsfl %ecx, %ecx
117 ; AVX1-NEXT:    cmovel %eax, %ecx
118 ; AVX1-NEXT:    vpinsrd $2, %ecx, %xmm2, %xmm2
119 ; AVX1-NEXT:    vpextrd $3, %xmm1, %ecx
120 ; AVX1-NEXT:    bsfl %ecx, %ecx
121 ; AVX1-NEXT:    cmovel %eax, %ecx
122 ; AVX1-NEXT:    vpinsrd $3, %ecx, %xmm2, %xmm1
123 ; AVX1-NEXT:    vpextrd $1, %xmm0, %ecx
124 ; AVX1-NEXT:    bsfl %ecx, %ecx
125 ; AVX1-NEXT:    cmovel %eax, %ecx
126 ; AVX1-NEXT:    vmovd %xmm0, %edx
127 ; AVX1-NEXT:    bsfl %edx, %edx
128 ; AVX1-NEXT:    cmovel %eax, %edx
129 ; AVX1-NEXT:    vmovd %edx, %xmm2
130 ; AVX1-NEXT:    vpinsrd $1, %ecx, %xmm2, %xmm2
131 ; AVX1-NEXT:    vpextrd $2, %xmm0, %ecx
132 ; AVX1-NEXT:    bsfl %ecx, %ecx
133 ; AVX1-NEXT:    cmovel %eax, %ecx
134 ; AVX1-NEXT:    vpinsrd $2, %ecx, %xmm2, %xmm2
135 ; AVX1-NEXT:    vpextrd $3, %xmm0, %ecx
136 ; AVX1-NEXT:    bsfl %ecx, %ecx
137 ; AVX1-NEXT:    cmovel %eax, %ecx
138 ; AVX1-NEXT:    vpinsrd $3, %ecx, %xmm2, %xmm0
139 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
140 ; AVX1-NEXT:    retq
141 ;
142 ; AVX2-LABEL: testv8i32:
143 ; AVX2:       # BB#0:
144 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
145 ; AVX2-NEXT:    vpextrd $1, %xmm1, %eax
146 ; AVX2-NEXT:    bsfl %eax, %ecx
147 ; AVX2-NEXT:    movl $32, %eax
148 ; AVX2-NEXT:    cmovel %eax, %ecx
149 ; AVX2-NEXT:    vmovd %xmm1, %edx
150 ; AVX2-NEXT:    bsfl %edx, %edx
151 ; AVX2-NEXT:    cmovel %eax, %edx
152 ; AVX2-NEXT:    vmovd %edx, %xmm2
153 ; AVX2-NEXT:    vpinsrd $1, %ecx, %xmm2, %xmm2
154 ; AVX2-NEXT:    vpextrd $2, %xmm1, %ecx
155 ; AVX2-NEXT:    bsfl %ecx, %ecx
156 ; AVX2-NEXT:    cmovel %eax, %ecx
157 ; AVX2-NEXT:    vpinsrd $2, %ecx, %xmm2, %xmm2
158 ; AVX2-NEXT:    vpextrd $3, %xmm1, %ecx
159 ; AVX2-NEXT:    bsfl %ecx, %ecx
160 ; AVX2-NEXT:    cmovel %eax, %ecx
161 ; AVX2-NEXT:    vpinsrd $3, %ecx, %xmm2, %xmm1
162 ; AVX2-NEXT:    vpextrd $1, %xmm0, %ecx
163 ; AVX2-NEXT:    bsfl %ecx, %ecx
164 ; AVX2-NEXT:    cmovel %eax, %ecx
165 ; AVX2-NEXT:    vmovd %xmm0, %edx
166 ; AVX2-NEXT:    bsfl %edx, %edx
167 ; AVX2-NEXT:    cmovel %eax, %edx
168 ; AVX2-NEXT:    vmovd %edx, %xmm2
169 ; AVX2-NEXT:    vpinsrd $1, %ecx, %xmm2, %xmm2
170 ; AVX2-NEXT:    vpextrd $2, %xmm0, %ecx
171 ; AVX2-NEXT:    bsfl %ecx, %ecx
172 ; AVX2-NEXT:    cmovel %eax, %ecx
173 ; AVX2-NEXT:    vpinsrd $2, %ecx, %xmm2, %xmm2
174 ; AVX2-NEXT:    vpextrd $3, %xmm0, %ecx
175 ; AVX2-NEXT:    bsfl %ecx, %ecx
176 ; AVX2-NEXT:    cmovel %eax, %ecx
177 ; AVX2-NEXT:    vpinsrd $3, %ecx, %xmm2, %xmm0
178 ; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
179 ; AVX2-NEXT:    retq
180   %out = call <8 x i32> @llvm.cttz.v8i32(<8 x i32> %in, i1 0)
181   ret <8 x i32> %out
182 }
183
184 define <8 x i32> @testv8i32u(<8 x i32> %in) nounwind {
185 ; AVX1-LABEL: testv8i32u:
186 ; AVX1:       # BB#0:
187 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
188 ; AVX1-NEXT:    vpextrd $1, %xmm1, %eax
189 ; AVX1-NEXT:    bsfl %eax, %eax
190 ; AVX1-NEXT:    vmovd %xmm1, %ecx
191 ; AVX1-NEXT:    bsfl %ecx, %ecx
192 ; AVX1-NEXT:    vmovd %ecx, %xmm2
193 ; AVX1-NEXT:    vpinsrd $1, %eax, %xmm2, %xmm2
194 ; AVX1-NEXT:    vpextrd $2, %xmm1, %eax
195 ; AVX1-NEXT:    bsfl %eax, %eax
196 ; AVX1-NEXT:    vpinsrd $2, %eax, %xmm2, %xmm2
197 ; AVX1-NEXT:    vpextrd $3, %xmm1, %eax
198 ; AVX1-NEXT:    bsfl %eax, %eax
199 ; AVX1-NEXT:    vpinsrd $3, %eax, %xmm2, %xmm1
200 ; AVX1-NEXT:    vpextrd $1, %xmm0, %eax
201 ; AVX1-NEXT:    bsfl %eax, %eax
202 ; AVX1-NEXT:    vmovd %xmm0, %ecx
203 ; AVX1-NEXT:    bsfl %ecx, %ecx
204 ; AVX1-NEXT:    vmovd %ecx, %xmm2
205 ; AVX1-NEXT:    vpinsrd $1, %eax, %xmm2, %xmm2
206 ; AVX1-NEXT:    vpextrd $2, %xmm0, %eax
207 ; AVX1-NEXT:    bsfl %eax, %eax
208 ; AVX1-NEXT:    vpinsrd $2, %eax, %xmm2, %xmm2
209 ; AVX1-NEXT:    vpextrd $3, %xmm0, %eax
210 ; AVX1-NEXT:    bsfl %eax, %eax
211 ; AVX1-NEXT:    vpinsrd $3, %eax, %xmm2, %xmm0
212 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
213 ; AVX1-NEXT:    retq
214 ;
215 ; AVX2-LABEL: testv8i32u:
216 ; AVX2:       # BB#0:
217 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
218 ; AVX2-NEXT:    vpextrd $1, %xmm1, %eax
219 ; AVX2-NEXT:    bsfl %eax, %eax
220 ; AVX2-NEXT:    vmovd %xmm1, %ecx
221 ; AVX2-NEXT:    bsfl %ecx, %ecx
222 ; AVX2-NEXT:    vmovd %ecx, %xmm2
223 ; AVX2-NEXT:    vpinsrd $1, %eax, %xmm2, %xmm2
224 ; AVX2-NEXT:    vpextrd $2, %xmm1, %eax
225 ; AVX2-NEXT:    bsfl %eax, %eax
226 ; AVX2-NEXT:    vpinsrd $2, %eax, %xmm2, %xmm2
227 ; AVX2-NEXT:    vpextrd $3, %xmm1, %eax
228 ; AVX2-NEXT:    bsfl %eax, %eax
229 ; AVX2-NEXT:    vpinsrd $3, %eax, %xmm2, %xmm1
230 ; AVX2-NEXT:    vpextrd $1, %xmm0, %eax
231 ; AVX2-NEXT:    bsfl %eax, %eax
232 ; AVX2-NEXT:    vmovd %xmm0, %ecx
233 ; AVX2-NEXT:    bsfl %ecx, %ecx
234 ; AVX2-NEXT:    vmovd %ecx, %xmm2
235 ; AVX2-NEXT:    vpinsrd $1, %eax, %xmm2, %xmm2
236 ; AVX2-NEXT:    vpextrd $2, %xmm0, %eax
237 ; AVX2-NEXT:    bsfl %eax, %eax
238 ; AVX2-NEXT:    vpinsrd $2, %eax, %xmm2, %xmm2
239 ; AVX2-NEXT:    vpextrd $3, %xmm0, %eax
240 ; AVX2-NEXT:    bsfl %eax, %eax
241 ; AVX2-NEXT:    vpinsrd $3, %eax, %xmm2, %xmm0
242 ; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
243 ; AVX2-NEXT:    retq
244   %out = call <8 x i32> @llvm.cttz.v8i32(<8 x i32> %in, i1 -1)
245   ret <8 x i32> %out
246 }
247
248 define <16 x i16> @testv16i16(<16 x i16> %in) nounwind {
249 ; AVX1-LABEL: testv16i16:
250 ; AVX1:       # BB#0:
251 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
252 ; AVX1-NEXT:    vpextrw $1, %xmm1, %eax
253 ; AVX1-NEXT:    bsfw %ax, %cx
254 ; AVX1-NEXT:    movw $16, %ax
255 ; AVX1-NEXT:    cmovew %ax, %cx
256 ; AVX1-NEXT:    vmovd %xmm1, %edx
257 ; AVX1-NEXT:    bsfw %dx, %dx
258 ; AVX1-NEXT:    cmovew %ax, %dx
259 ; AVX1-NEXT:    vmovd %edx, %xmm2
260 ; AVX1-NEXT:    vpinsrw $1, %ecx, %xmm2, %xmm2
261 ; AVX1-NEXT:    vpextrw $2, %xmm1, %ecx
262 ; AVX1-NEXT:    bsfw %cx, %cx
263 ; AVX1-NEXT:    cmovew %ax, %cx
264 ; AVX1-NEXT:    vpinsrw $2, %ecx, %xmm2, %xmm2
265 ; AVX1-NEXT:    vpextrw $3, %xmm1, %ecx
266 ; AVX1-NEXT:    bsfw %cx, %cx
267 ; AVX1-NEXT:    cmovew %ax, %cx
268 ; AVX1-NEXT:    vpinsrw $3, %ecx, %xmm2, %xmm2
269 ; AVX1-NEXT:    vpextrw $4, %xmm1, %ecx
270 ; AVX1-NEXT:    bsfw %cx, %cx
271 ; AVX1-NEXT:    cmovew %ax, %cx
272 ; AVX1-NEXT:    vpinsrw $4, %ecx, %xmm2, %xmm2
273 ; AVX1-NEXT:    vpextrw $5, %xmm1, %ecx
274 ; AVX1-NEXT:    bsfw %cx, %cx
275 ; AVX1-NEXT:    cmovew %ax, %cx
276 ; AVX1-NEXT:    vpinsrw $5, %ecx, %xmm2, %xmm2
277 ; AVX1-NEXT:    vpextrw $6, %xmm1, %ecx
278 ; AVX1-NEXT:    bsfw %cx, %cx
279 ; AVX1-NEXT:    cmovew %ax, %cx
280 ; AVX1-NEXT:    vpinsrw $6, %ecx, %xmm2, %xmm2
281 ; AVX1-NEXT:    vpextrw $7, %xmm1, %ecx
282 ; AVX1-NEXT:    bsfw %cx, %cx
283 ; AVX1-NEXT:    cmovew %ax, %cx
284 ; AVX1-NEXT:    vpinsrw $7, %ecx, %xmm2, %xmm1
285 ; AVX1-NEXT:    vpextrw $1, %xmm0, %ecx
286 ; AVX1-NEXT:    bsfw %cx, %cx
287 ; AVX1-NEXT:    cmovew %ax, %cx
288 ; AVX1-NEXT:    vmovd %xmm0, %edx
289 ; AVX1-NEXT:    bsfw %dx, %dx
290 ; AVX1-NEXT:    cmovew %ax, %dx
291 ; AVX1-NEXT:    vmovd %edx, %xmm2
292 ; AVX1-NEXT:    vpinsrw $1, %ecx, %xmm2, %xmm2
293 ; AVX1-NEXT:    vpextrw $2, %xmm0, %ecx
294 ; AVX1-NEXT:    bsfw %cx, %cx
295 ; AVX1-NEXT:    cmovew %ax, %cx
296 ; AVX1-NEXT:    vpinsrw $2, %ecx, %xmm2, %xmm2
297 ; AVX1-NEXT:    vpextrw $3, %xmm0, %ecx
298 ; AVX1-NEXT:    bsfw %cx, %cx
299 ; AVX1-NEXT:    cmovew %ax, %cx
300 ; AVX1-NEXT:    vpinsrw $3, %ecx, %xmm2, %xmm2
301 ; AVX1-NEXT:    vpextrw $4, %xmm0, %ecx
302 ; AVX1-NEXT:    bsfw %cx, %cx
303 ; AVX1-NEXT:    cmovew %ax, %cx
304 ; AVX1-NEXT:    vpinsrw $4, %ecx, %xmm2, %xmm2
305 ; AVX1-NEXT:    vpextrw $5, %xmm0, %ecx
306 ; AVX1-NEXT:    bsfw %cx, %cx
307 ; AVX1-NEXT:    cmovew %ax, %cx
308 ; AVX1-NEXT:    vpinsrw $5, %ecx, %xmm2, %xmm2
309 ; AVX1-NEXT:    vpextrw $6, %xmm0, %ecx
310 ; AVX1-NEXT:    bsfw %cx, %cx
311 ; AVX1-NEXT:    cmovew %ax, %cx
312 ; AVX1-NEXT:    vpinsrw $6, %ecx, %xmm2, %xmm2
313 ; AVX1-NEXT:    vpextrw $7, %xmm0, %ecx
314 ; AVX1-NEXT:    bsfw %cx, %cx
315 ; AVX1-NEXT:    cmovew %ax, %cx
316 ; AVX1-NEXT:    vpinsrw $7, %ecx, %xmm2, %xmm0
317 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
318 ; AVX1-NEXT:    retq
319 ;
320 ; AVX2-LABEL: testv16i16:
321 ; AVX2:       # BB#0:
322 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
323 ; AVX2-NEXT:    vpextrw $1, %xmm1, %eax
324 ; AVX2-NEXT:    bsfw %ax, %cx
325 ; AVX2-NEXT:    movw $16, %ax
326 ; AVX2-NEXT:    cmovew %ax, %cx
327 ; AVX2-NEXT:    vmovd %xmm1, %edx
328 ; AVX2-NEXT:    bsfw %dx, %dx
329 ; AVX2-NEXT:    cmovew %ax, %dx
330 ; AVX2-NEXT:    vmovd %edx, %xmm2
331 ; AVX2-NEXT:    vpinsrw $1, %ecx, %xmm2, %xmm2
332 ; AVX2-NEXT:    vpextrw $2, %xmm1, %ecx
333 ; AVX2-NEXT:    bsfw %cx, %cx
334 ; AVX2-NEXT:    cmovew %ax, %cx
335 ; AVX2-NEXT:    vpinsrw $2, %ecx, %xmm2, %xmm2
336 ; AVX2-NEXT:    vpextrw $3, %xmm1, %ecx
337 ; AVX2-NEXT:    bsfw %cx, %cx
338 ; AVX2-NEXT:    cmovew %ax, %cx
339 ; AVX2-NEXT:    vpinsrw $3, %ecx, %xmm2, %xmm2
340 ; AVX2-NEXT:    vpextrw $4, %xmm1, %ecx
341 ; AVX2-NEXT:    bsfw %cx, %cx
342 ; AVX2-NEXT:    cmovew %ax, %cx
343 ; AVX2-NEXT:    vpinsrw $4, %ecx, %xmm2, %xmm2
344 ; AVX2-NEXT:    vpextrw $5, %xmm1, %ecx
345 ; AVX2-NEXT:    bsfw %cx, %cx
346 ; AVX2-NEXT:    cmovew %ax, %cx
347 ; AVX2-NEXT:    vpinsrw $5, %ecx, %xmm2, %xmm2
348 ; AVX2-NEXT:    vpextrw $6, %xmm1, %ecx
349 ; AVX2-NEXT:    bsfw %cx, %cx
350 ; AVX2-NEXT:    cmovew %ax, %cx
351 ; AVX2-NEXT:    vpinsrw $6, %ecx, %xmm2, %xmm2
352 ; AVX2-NEXT:    vpextrw $7, %xmm1, %ecx
353 ; AVX2-NEXT:    bsfw %cx, %cx
354 ; AVX2-NEXT:    cmovew %ax, %cx
355 ; AVX2-NEXT:    vpinsrw $7, %ecx, %xmm2, %xmm1
356 ; AVX2-NEXT:    vpextrw $1, %xmm0, %ecx
357 ; AVX2-NEXT:    bsfw %cx, %cx
358 ; AVX2-NEXT:    cmovew %ax, %cx
359 ; AVX2-NEXT:    vmovd %xmm0, %edx
360 ; AVX2-NEXT:    bsfw %dx, %dx
361 ; AVX2-NEXT:    cmovew %ax, %dx
362 ; AVX2-NEXT:    vmovd %edx, %xmm2
363 ; AVX2-NEXT:    vpinsrw $1, %ecx, %xmm2, %xmm2
364 ; AVX2-NEXT:    vpextrw $2, %xmm0, %ecx
365 ; AVX2-NEXT:    bsfw %cx, %cx
366 ; AVX2-NEXT:    cmovew %ax, %cx
367 ; AVX2-NEXT:    vpinsrw $2, %ecx, %xmm2, %xmm2
368 ; AVX2-NEXT:    vpextrw $3, %xmm0, %ecx
369 ; AVX2-NEXT:    bsfw %cx, %cx
370 ; AVX2-NEXT:    cmovew %ax, %cx
371 ; AVX2-NEXT:    vpinsrw $3, %ecx, %xmm2, %xmm2
372 ; AVX2-NEXT:    vpextrw $4, %xmm0, %ecx
373 ; AVX2-NEXT:    bsfw %cx, %cx
374 ; AVX2-NEXT:    cmovew %ax, %cx
375 ; AVX2-NEXT:    vpinsrw $4, %ecx, %xmm2, %xmm2
376 ; AVX2-NEXT:    vpextrw $5, %xmm0, %ecx
377 ; AVX2-NEXT:    bsfw %cx, %cx
378 ; AVX2-NEXT:    cmovew %ax, %cx
379 ; AVX2-NEXT:    vpinsrw $5, %ecx, %xmm2, %xmm2
380 ; AVX2-NEXT:    vpextrw $6, %xmm0, %ecx
381 ; AVX2-NEXT:    bsfw %cx, %cx
382 ; AVX2-NEXT:    cmovew %ax, %cx
383 ; AVX2-NEXT:    vpinsrw $6, %ecx, %xmm2, %xmm2
384 ; AVX2-NEXT:    vpextrw $7, %xmm0, %ecx
385 ; AVX2-NEXT:    bsfw %cx, %cx
386 ; AVX2-NEXT:    cmovew %ax, %cx
387 ; AVX2-NEXT:    vpinsrw $7, %ecx, %xmm2, %xmm0
388 ; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
389 ; AVX2-NEXT:    retq
390   %out = call <16 x i16> @llvm.cttz.v16i16(<16 x i16> %in, i1 0)
391   ret <16 x i16> %out
392 }
393
394 define <16 x i16> @testv16i16u(<16 x i16> %in) nounwind {
395 ; AVX1-LABEL: testv16i16u:
396 ; AVX1:       # BB#0:
397 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
398 ; AVX1-NEXT:    vpextrw $1, %xmm1, %eax
399 ; AVX1-NEXT:    bsfw %ax, %ax
400 ; AVX1-NEXT:    vmovd %xmm1, %ecx
401 ; AVX1-NEXT:    bsfw %cx, %cx
402 ; AVX1-NEXT:    vmovd %ecx, %xmm2
403 ; AVX1-NEXT:    vpinsrw $1, %eax, %xmm2, %xmm2
404 ; AVX1-NEXT:    vpextrw $2, %xmm1, %eax
405 ; AVX1-NEXT:    bsfw %ax, %ax
406 ; AVX1-NEXT:    vpinsrw $2, %eax, %xmm2, %xmm2
407 ; AVX1-NEXT:    vpextrw $3, %xmm1, %eax
408 ; AVX1-NEXT:    bsfw %ax, %ax
409 ; AVX1-NEXT:    vpinsrw $3, %eax, %xmm2, %xmm2
410 ; AVX1-NEXT:    vpextrw $4, %xmm1, %eax
411 ; AVX1-NEXT:    bsfw %ax, %ax
412 ; AVX1-NEXT:    vpinsrw $4, %eax, %xmm2, %xmm2
413 ; AVX1-NEXT:    vpextrw $5, %xmm1, %eax
414 ; AVX1-NEXT:    bsfw %ax, %ax
415 ; AVX1-NEXT:    vpinsrw $5, %eax, %xmm2, %xmm2
416 ; AVX1-NEXT:    vpextrw $6, %xmm1, %eax
417 ; AVX1-NEXT:    bsfw %ax, %ax
418 ; AVX1-NEXT:    vpinsrw $6, %eax, %xmm2, %xmm2
419 ; AVX1-NEXT:    vpextrw $7, %xmm1, %eax
420 ; AVX1-NEXT:    bsfw %ax, %ax
421 ; AVX1-NEXT:    vpinsrw $7, %eax, %xmm2, %xmm1
422 ; AVX1-NEXT:    vpextrw $1, %xmm0, %eax
423 ; AVX1-NEXT:    bsfw %ax, %ax
424 ; AVX1-NEXT:    vmovd %xmm0, %ecx
425 ; AVX1-NEXT:    bsfw %cx, %cx
426 ; AVX1-NEXT:    vmovd %ecx, %xmm2
427 ; AVX1-NEXT:    vpinsrw $1, %eax, %xmm2, %xmm2
428 ; AVX1-NEXT:    vpextrw $2, %xmm0, %eax
429 ; AVX1-NEXT:    bsfw %ax, %ax
430 ; AVX1-NEXT:    vpinsrw $2, %eax, %xmm2, %xmm2
431 ; AVX1-NEXT:    vpextrw $3, %xmm0, %eax
432 ; AVX1-NEXT:    bsfw %ax, %ax
433 ; AVX1-NEXT:    vpinsrw $3, %eax, %xmm2, %xmm2
434 ; AVX1-NEXT:    vpextrw $4, %xmm0, %eax
435 ; AVX1-NEXT:    bsfw %ax, %ax
436 ; AVX1-NEXT:    vpinsrw $4, %eax, %xmm2, %xmm2
437 ; AVX1-NEXT:    vpextrw $5, %xmm0, %eax
438 ; AVX1-NEXT:    bsfw %ax, %ax
439 ; AVX1-NEXT:    vpinsrw $5, %eax, %xmm2, %xmm2
440 ; AVX1-NEXT:    vpextrw $6, %xmm0, %eax
441 ; AVX1-NEXT:    bsfw %ax, %ax
442 ; AVX1-NEXT:    vpinsrw $6, %eax, %xmm2, %xmm2
443 ; AVX1-NEXT:    vpextrw $7, %xmm0, %eax
444 ; AVX1-NEXT:    bsfw %ax, %ax
445 ; AVX1-NEXT:    vpinsrw $7, %eax, %xmm2, %xmm0
446 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
447 ; AVX1-NEXT:    retq
448 ;
449 ; AVX2-LABEL: testv16i16u:
450 ; AVX2:       # BB#0:
451 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
452 ; AVX2-NEXT:    vpextrw $1, %xmm1, %eax
453 ; AVX2-NEXT:    bsfw %ax, %ax
454 ; AVX2-NEXT:    vmovd %xmm1, %ecx
455 ; AVX2-NEXT:    bsfw %cx, %cx
456 ; AVX2-NEXT:    vmovd %ecx, %xmm2
457 ; AVX2-NEXT:    vpinsrw $1, %eax, %xmm2, %xmm2
458 ; AVX2-NEXT:    vpextrw $2, %xmm1, %eax
459 ; AVX2-NEXT:    bsfw %ax, %ax
460 ; AVX2-NEXT:    vpinsrw $2, %eax, %xmm2, %xmm2
461 ; AVX2-NEXT:    vpextrw $3, %xmm1, %eax
462 ; AVX2-NEXT:    bsfw %ax, %ax
463 ; AVX2-NEXT:    vpinsrw $3, %eax, %xmm2, %xmm2
464 ; AVX2-NEXT:    vpextrw $4, %xmm1, %eax
465 ; AVX2-NEXT:    bsfw %ax, %ax
466 ; AVX2-NEXT:    vpinsrw $4, %eax, %xmm2, %xmm2
467 ; AVX2-NEXT:    vpextrw $5, %xmm1, %eax
468 ; AVX2-NEXT:    bsfw %ax, %ax
469 ; AVX2-NEXT:    vpinsrw $5, %eax, %xmm2, %xmm2
470 ; AVX2-NEXT:    vpextrw $6, %xmm1, %eax
471 ; AVX2-NEXT:    bsfw %ax, %ax
472 ; AVX2-NEXT:    vpinsrw $6, %eax, %xmm2, %xmm2
473 ; AVX2-NEXT:    vpextrw $7, %xmm1, %eax
474 ; AVX2-NEXT:    bsfw %ax, %ax
475 ; AVX2-NEXT:    vpinsrw $7, %eax, %xmm2, %xmm1
476 ; AVX2-NEXT:    vpextrw $1, %xmm0, %eax
477 ; AVX2-NEXT:    bsfw %ax, %ax
478 ; AVX2-NEXT:    vmovd %xmm0, %ecx
479 ; AVX2-NEXT:    bsfw %cx, %cx
480 ; AVX2-NEXT:    vmovd %ecx, %xmm2
481 ; AVX2-NEXT:    vpinsrw $1, %eax, %xmm2, %xmm2
482 ; AVX2-NEXT:    vpextrw $2, %xmm0, %eax
483 ; AVX2-NEXT:    bsfw %ax, %ax
484 ; AVX2-NEXT:    vpinsrw $2, %eax, %xmm2, %xmm2
485 ; AVX2-NEXT:    vpextrw $3, %xmm0, %eax
486 ; AVX2-NEXT:    bsfw %ax, %ax
487 ; AVX2-NEXT:    vpinsrw $3, %eax, %xmm2, %xmm2
488 ; AVX2-NEXT:    vpextrw $4, %xmm0, %eax
489 ; AVX2-NEXT:    bsfw %ax, %ax
490 ; AVX2-NEXT:    vpinsrw $4, %eax, %xmm2, %xmm2
491 ; AVX2-NEXT:    vpextrw $5, %xmm0, %eax
492 ; AVX2-NEXT:    bsfw %ax, %ax
493 ; AVX2-NEXT:    vpinsrw $5, %eax, %xmm2, %xmm2
494 ; AVX2-NEXT:    vpextrw $6, %xmm0, %eax
495 ; AVX2-NEXT:    bsfw %ax, %ax
496 ; AVX2-NEXT:    vpinsrw $6, %eax, %xmm2, %xmm2
497 ; AVX2-NEXT:    vpextrw $7, %xmm0, %eax
498 ; AVX2-NEXT:    bsfw %ax, %ax
499 ; AVX2-NEXT:    vpinsrw $7, %eax, %xmm2, %xmm0
500 ; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
501 ; AVX2-NEXT:    retq
502   %out = call <16 x i16> @llvm.cttz.v16i16(<16 x i16> %in, i1 -1)
503   ret <16 x i16> %out
504 }
505
506 define <32 x i8> @testv32i8(<32 x i8> %in) nounwind {
507 ; AVX1-LABEL: testv32i8:
508 ; AVX1:       # BB#0:
509 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
510 ; AVX1-NEXT:    vpextrb $1, %xmm1, %eax
511 ; AVX1-NEXT:    bsfl %eax, %edx
512 ; AVX1-NEXT:    movl $32, %eax
513 ; AVX1-NEXT:    cmovel %eax, %edx
514 ; AVX1-NEXT:    cmpl $32, %edx
515 ; AVX1-NEXT:    movl $8, %ecx
516 ; AVX1-NEXT:    cmovel %ecx, %edx
517 ; AVX1-NEXT:    vpextrb $0, %xmm1, %esi
518 ; AVX1-NEXT:    bsfl %esi, %esi
519 ; AVX1-NEXT:    cmovel %eax, %esi
520 ; AVX1-NEXT:    cmpl $32, %esi
521 ; AVX1-NEXT:    cmovel %ecx, %esi
522 ; AVX1-NEXT:    vmovd %esi, %xmm2
523 ; AVX1-NEXT:    vpinsrb $1, %edx, %xmm2, %xmm2
524 ; AVX1-NEXT:    vpextrb $2, %xmm1, %edx
525 ; AVX1-NEXT:    bsfl %edx, %edx
526 ; AVX1-NEXT:    cmovel %eax, %edx
527 ; AVX1-NEXT:    cmpl $32, %edx
528 ; AVX1-NEXT:    cmovel %ecx, %edx
529 ; AVX1-NEXT:    vpinsrb $2, %edx, %xmm2, %xmm2
530 ; AVX1-NEXT:    vpextrb $3, %xmm1, %edx
531 ; AVX1-NEXT:    bsfl %edx, %edx
532 ; AVX1-NEXT:    cmovel %eax, %edx
533 ; AVX1-NEXT:    cmpl $32, %edx
534 ; AVX1-NEXT:    cmovel %ecx, %edx
535 ; AVX1-NEXT:    vpinsrb $3, %edx, %xmm2, %xmm2
536 ; AVX1-NEXT:    vpextrb $4, %xmm1, %edx
537 ; AVX1-NEXT:    bsfl %edx, %edx
538 ; AVX1-NEXT:    cmovel %eax, %edx
539 ; AVX1-NEXT:    cmpl $32, %edx
540 ; AVX1-NEXT:    cmovel %ecx, %edx
541 ; AVX1-NEXT:    vpinsrb $4, %edx, %xmm2, %xmm2
542 ; AVX1-NEXT:    vpextrb $5, %xmm1, %edx
543 ; AVX1-NEXT:    bsfl %edx, %edx
544 ; AVX1-NEXT:    cmovel %eax, %edx
545 ; AVX1-NEXT:    cmpl $32, %edx
546 ; AVX1-NEXT:    cmovel %ecx, %edx
547 ; AVX1-NEXT:    vpinsrb $5, %edx, %xmm2, %xmm2
548 ; AVX1-NEXT:    vpextrb $6, %xmm1, %edx
549 ; AVX1-NEXT:    bsfl %edx, %edx
550 ; AVX1-NEXT:    cmovel %eax, %edx
551 ; AVX1-NEXT:    cmpl $32, %edx
552 ; AVX1-NEXT:    cmovel %ecx, %edx
553 ; AVX1-NEXT:    vpinsrb $6, %edx, %xmm2, %xmm2
554 ; AVX1-NEXT:    vpextrb $7, %xmm1, %edx
555 ; AVX1-NEXT:    bsfl %edx, %edx
556 ; AVX1-NEXT:    cmovel %eax, %edx
557 ; AVX1-NEXT:    cmpl $32, %edx
558 ; AVX1-NEXT:    cmovel %ecx, %edx
559 ; AVX1-NEXT:    vpinsrb $7, %edx, %xmm2, %xmm2
560 ; AVX1-NEXT:    vpextrb $8, %xmm1, %edx
561 ; AVX1-NEXT:    bsfl %edx, %edx
562 ; AVX1-NEXT:    cmovel %eax, %edx
563 ; AVX1-NEXT:    cmpl $32, %edx
564 ; AVX1-NEXT:    cmovel %ecx, %edx
565 ; AVX1-NEXT:    vpinsrb $8, %edx, %xmm2, %xmm2
566 ; AVX1-NEXT:    vpextrb $9, %xmm1, %edx
567 ; AVX1-NEXT:    bsfl %edx, %edx
568 ; AVX1-NEXT:    cmovel %eax, %edx
569 ; AVX1-NEXT:    cmpl $32, %edx
570 ; AVX1-NEXT:    cmovel %ecx, %edx
571 ; AVX1-NEXT:    vpinsrb $9, %edx, %xmm2, %xmm2
572 ; AVX1-NEXT:    vpextrb $10, %xmm1, %edx
573 ; AVX1-NEXT:    bsfl %edx, %edx
574 ; AVX1-NEXT:    cmovel %eax, %edx
575 ; AVX1-NEXT:    cmpl $32, %edx
576 ; AVX1-NEXT:    cmovel %ecx, %edx
577 ; AVX1-NEXT:    vpinsrb $10, %edx, %xmm2, %xmm2
578 ; AVX1-NEXT:    vpextrb $11, %xmm1, %edx
579 ; AVX1-NEXT:    bsfl %edx, %edx
580 ; AVX1-NEXT:    cmovel %eax, %edx
581 ; AVX1-NEXT:    cmpl $32, %edx
582 ; AVX1-NEXT:    cmovel %ecx, %edx
583 ; AVX1-NEXT:    vpinsrb $11, %edx, %xmm2, %xmm2
584 ; AVX1-NEXT:    vpextrb $12, %xmm1, %edx
585 ; AVX1-NEXT:    bsfl %edx, %edx
586 ; AVX1-NEXT:    cmovel %eax, %edx
587 ; AVX1-NEXT:    cmpl $32, %edx
588 ; AVX1-NEXT:    cmovel %ecx, %edx
589 ; AVX1-NEXT:    vpinsrb $12, %edx, %xmm2, %xmm2
590 ; AVX1-NEXT:    vpextrb $13, %xmm1, %edx
591 ; AVX1-NEXT:    bsfl %edx, %edx
592 ; AVX1-NEXT:    cmovel %eax, %edx
593 ; AVX1-NEXT:    cmpl $32, %edx
594 ; AVX1-NEXT:    cmovel %ecx, %edx
595 ; AVX1-NEXT:    vpinsrb $13, %edx, %xmm2, %xmm2
596 ; AVX1-NEXT:    vpextrb $14, %xmm1, %edx
597 ; AVX1-NEXT:    bsfl %edx, %edx
598 ; AVX1-NEXT:    cmovel %eax, %edx
599 ; AVX1-NEXT:    cmpl $32, %edx
600 ; AVX1-NEXT:    cmovel %ecx, %edx
601 ; AVX1-NEXT:    vpinsrb $14, %edx, %xmm2, %xmm2
602 ; AVX1-NEXT:    vpextrb $15, %xmm1, %edx
603 ; AVX1-NEXT:    bsfl %edx, %edx
604 ; AVX1-NEXT:    cmovel %eax, %edx
605 ; AVX1-NEXT:    cmpl $32, %edx
606 ; AVX1-NEXT:    cmovel %ecx, %edx
607 ; AVX1-NEXT:    vpinsrb $15, %edx, %xmm2, %xmm1
608 ; AVX1-NEXT:    vpextrb $1, %xmm0, %edx
609 ; AVX1-NEXT:    bsfl %edx, %edx
610 ; AVX1-NEXT:    cmovel %eax, %edx
611 ; AVX1-NEXT:    cmpl $32, %edx
612 ; AVX1-NEXT:    cmovel %ecx, %edx
613 ; AVX1-NEXT:    vpextrb $0, %xmm0, %esi
614 ; AVX1-NEXT:    bsfl %esi, %esi
615 ; AVX1-NEXT:    cmovel %eax, %esi
616 ; AVX1-NEXT:    cmpl $32, %esi
617 ; AVX1-NEXT:    cmovel %ecx, %esi
618 ; AVX1-NEXT:    vmovd %esi, %xmm2
619 ; AVX1-NEXT:    vpinsrb $1, %edx, %xmm2, %xmm2
620 ; AVX1-NEXT:    vpextrb $2, %xmm0, %edx
621 ; AVX1-NEXT:    bsfl %edx, %edx
622 ; AVX1-NEXT:    cmovel %eax, %edx
623 ; AVX1-NEXT:    cmpl $32, %edx
624 ; AVX1-NEXT:    cmovel %ecx, %edx
625 ; AVX1-NEXT:    vpinsrb $2, %edx, %xmm2, %xmm2
626 ; AVX1-NEXT:    vpextrb $3, %xmm0, %edx
627 ; AVX1-NEXT:    bsfl %edx, %edx
628 ; AVX1-NEXT:    cmovel %eax, %edx
629 ; AVX1-NEXT:    cmpl $32, %edx
630 ; AVX1-NEXT:    cmovel %ecx, %edx
631 ; AVX1-NEXT:    vpinsrb $3, %edx, %xmm2, %xmm2
632 ; AVX1-NEXT:    vpextrb $4, %xmm0, %edx
633 ; AVX1-NEXT:    bsfl %edx, %edx
634 ; AVX1-NEXT:    cmovel %eax, %edx
635 ; AVX1-NEXT:    cmpl $32, %edx
636 ; AVX1-NEXT:    cmovel %ecx, %edx
637 ; AVX1-NEXT:    vpinsrb $4, %edx, %xmm2, %xmm2
638 ; AVX1-NEXT:    vpextrb $5, %xmm0, %edx
639 ; AVX1-NEXT:    bsfl %edx, %edx
640 ; AVX1-NEXT:    cmovel %eax, %edx
641 ; AVX1-NEXT:    cmpl $32, %edx
642 ; AVX1-NEXT:    cmovel %ecx, %edx
643 ; AVX1-NEXT:    vpinsrb $5, %edx, %xmm2, %xmm2
644 ; AVX1-NEXT:    vpextrb $6, %xmm0, %edx
645 ; AVX1-NEXT:    bsfl %edx, %edx
646 ; AVX1-NEXT:    cmovel %eax, %edx
647 ; AVX1-NEXT:    cmpl $32, %edx
648 ; AVX1-NEXT:    cmovel %ecx, %edx
649 ; AVX1-NEXT:    vpinsrb $6, %edx, %xmm2, %xmm2
650 ; AVX1-NEXT:    vpextrb $7, %xmm0, %edx
651 ; AVX1-NEXT:    bsfl %edx, %edx
652 ; AVX1-NEXT:    cmovel %eax, %edx
653 ; AVX1-NEXT:    cmpl $32, %edx
654 ; AVX1-NEXT:    cmovel %ecx, %edx
655 ; AVX1-NEXT:    vpinsrb $7, %edx, %xmm2, %xmm2
656 ; AVX1-NEXT:    vpextrb $8, %xmm0, %edx
657 ; AVX1-NEXT:    bsfl %edx, %edx
658 ; AVX1-NEXT:    cmovel %eax, %edx
659 ; AVX1-NEXT:    cmpl $32, %edx
660 ; AVX1-NEXT:    cmovel %ecx, %edx
661 ; AVX1-NEXT:    vpinsrb $8, %edx, %xmm2, %xmm2
662 ; AVX1-NEXT:    vpextrb $9, %xmm0, %edx
663 ; AVX1-NEXT:    bsfl %edx, %edx
664 ; AVX1-NEXT:    cmovel %eax, %edx
665 ; AVX1-NEXT:    cmpl $32, %edx
666 ; AVX1-NEXT:    cmovel %ecx, %edx
667 ; AVX1-NEXT:    vpinsrb $9, %edx, %xmm2, %xmm2
668 ; AVX1-NEXT:    vpextrb $10, %xmm0, %edx
669 ; AVX1-NEXT:    bsfl %edx, %edx
670 ; AVX1-NEXT:    cmovel %eax, %edx
671 ; AVX1-NEXT:    cmpl $32, %edx
672 ; AVX1-NEXT:    cmovel %ecx, %edx
673 ; AVX1-NEXT:    vpinsrb $10, %edx, %xmm2, %xmm2
674 ; AVX1-NEXT:    vpextrb $11, %xmm0, %edx
675 ; AVX1-NEXT:    bsfl %edx, %edx
676 ; AVX1-NEXT:    cmovel %eax, %edx
677 ; AVX1-NEXT:    cmpl $32, %edx
678 ; AVX1-NEXT:    cmovel %ecx, %edx
679 ; AVX1-NEXT:    vpinsrb $11, %edx, %xmm2, %xmm2
680 ; AVX1-NEXT:    vpextrb $12, %xmm0, %edx
681 ; AVX1-NEXT:    bsfl %edx, %edx
682 ; AVX1-NEXT:    cmovel %eax, %edx
683 ; AVX1-NEXT:    cmpl $32, %edx
684 ; AVX1-NEXT:    cmovel %ecx, %edx
685 ; AVX1-NEXT:    vpinsrb $12, %edx, %xmm2, %xmm2
686 ; AVX1-NEXT:    vpextrb $13, %xmm0, %edx
687 ; AVX1-NEXT:    bsfl %edx, %edx
688 ; AVX1-NEXT:    cmovel %eax, %edx
689 ; AVX1-NEXT:    cmpl $32, %edx
690 ; AVX1-NEXT:    cmovel %ecx, %edx
691 ; AVX1-NEXT:    vpinsrb $13, %edx, %xmm2, %xmm2
692 ; AVX1-NEXT:    vpextrb $14, %xmm0, %edx
693 ; AVX1-NEXT:    bsfl %edx, %edx
694 ; AVX1-NEXT:    cmovel %eax, %edx
695 ; AVX1-NEXT:    cmpl $32, %edx
696 ; AVX1-NEXT:    cmovel %ecx, %edx
697 ; AVX1-NEXT:    vpinsrb $14, %edx, %xmm2, %xmm2
698 ; AVX1-NEXT:    vpextrb $15, %xmm0, %edx
699 ; AVX1-NEXT:    bsfl %edx, %edx
700 ; AVX1-NEXT:    cmovel %eax, %edx
701 ; AVX1-NEXT:    cmpl $32, %edx
702 ; AVX1-NEXT:    cmovel %ecx, %edx
703 ; AVX1-NEXT:    vpinsrb $15, %edx, %xmm2, %xmm0
704 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
705 ; AVX1-NEXT:    retq
706 ;
707 ; AVX2-LABEL: testv32i8:
708 ; AVX2:       # BB#0:
709 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
710 ; AVX2-NEXT:    vpextrb $1, %xmm1, %eax
711 ; AVX2-NEXT:    bsfl %eax, %edx
712 ; AVX2-NEXT:    movl $32, %eax
713 ; AVX2-NEXT:    cmovel %eax, %edx
714 ; AVX2-NEXT:    cmpl $32, %edx
715 ; AVX2-NEXT:    movl $8, %ecx
716 ; AVX2-NEXT:    cmovel %ecx, %edx
717 ; AVX2-NEXT:    vpextrb $0, %xmm1, %esi
718 ; AVX2-NEXT:    bsfl %esi, %esi
719 ; AVX2-NEXT:    cmovel %eax, %esi
720 ; AVX2-NEXT:    cmpl $32, %esi
721 ; AVX2-NEXT:    cmovel %ecx, %esi
722 ; AVX2-NEXT:    vmovd %esi, %xmm2
723 ; AVX2-NEXT:    vpinsrb $1, %edx, %xmm2, %xmm2
724 ; AVX2-NEXT:    vpextrb $2, %xmm1, %edx
725 ; AVX2-NEXT:    bsfl %edx, %edx
726 ; AVX2-NEXT:    cmovel %eax, %edx
727 ; AVX2-NEXT:    cmpl $32, %edx
728 ; AVX2-NEXT:    cmovel %ecx, %edx
729 ; AVX2-NEXT:    vpinsrb $2, %edx, %xmm2, %xmm2
730 ; AVX2-NEXT:    vpextrb $3, %xmm1, %edx
731 ; AVX2-NEXT:    bsfl %edx, %edx
732 ; AVX2-NEXT:    cmovel %eax, %edx
733 ; AVX2-NEXT:    cmpl $32, %edx
734 ; AVX2-NEXT:    cmovel %ecx, %edx
735 ; AVX2-NEXT:    vpinsrb $3, %edx, %xmm2, %xmm2
736 ; AVX2-NEXT:    vpextrb $4, %xmm1, %edx
737 ; AVX2-NEXT:    bsfl %edx, %edx
738 ; AVX2-NEXT:    cmovel %eax, %edx
739 ; AVX2-NEXT:    cmpl $32, %edx
740 ; AVX2-NEXT:    cmovel %ecx, %edx
741 ; AVX2-NEXT:    vpinsrb $4, %edx, %xmm2, %xmm2
742 ; AVX2-NEXT:    vpextrb $5, %xmm1, %edx
743 ; AVX2-NEXT:    bsfl %edx, %edx
744 ; AVX2-NEXT:    cmovel %eax, %edx
745 ; AVX2-NEXT:    cmpl $32, %edx
746 ; AVX2-NEXT:    cmovel %ecx, %edx
747 ; AVX2-NEXT:    vpinsrb $5, %edx, %xmm2, %xmm2
748 ; AVX2-NEXT:    vpextrb $6, %xmm1, %edx
749 ; AVX2-NEXT:    bsfl %edx, %edx
750 ; AVX2-NEXT:    cmovel %eax, %edx
751 ; AVX2-NEXT:    cmpl $32, %edx
752 ; AVX2-NEXT:    cmovel %ecx, %edx
753 ; AVX2-NEXT:    vpinsrb $6, %edx, %xmm2, %xmm2
754 ; AVX2-NEXT:    vpextrb $7, %xmm1, %edx
755 ; AVX2-NEXT:    bsfl %edx, %edx
756 ; AVX2-NEXT:    cmovel %eax, %edx
757 ; AVX2-NEXT:    cmpl $32, %edx
758 ; AVX2-NEXT:    cmovel %ecx, %edx
759 ; AVX2-NEXT:    vpinsrb $7, %edx, %xmm2, %xmm2
760 ; AVX2-NEXT:    vpextrb $8, %xmm1, %edx
761 ; AVX2-NEXT:    bsfl %edx, %edx
762 ; AVX2-NEXT:    cmovel %eax, %edx
763 ; AVX2-NEXT:    cmpl $32, %edx
764 ; AVX2-NEXT:    cmovel %ecx, %edx
765 ; AVX2-NEXT:    vpinsrb $8, %edx, %xmm2, %xmm2
766 ; AVX2-NEXT:    vpextrb $9, %xmm1, %edx
767 ; AVX2-NEXT:    bsfl %edx, %edx
768 ; AVX2-NEXT:    cmovel %eax, %edx
769 ; AVX2-NEXT:    cmpl $32, %edx
770 ; AVX2-NEXT:    cmovel %ecx, %edx
771 ; AVX2-NEXT:    vpinsrb $9, %edx, %xmm2, %xmm2
772 ; AVX2-NEXT:    vpextrb $10, %xmm1, %edx
773 ; AVX2-NEXT:    bsfl %edx, %edx
774 ; AVX2-NEXT:    cmovel %eax, %edx
775 ; AVX2-NEXT:    cmpl $32, %edx
776 ; AVX2-NEXT:    cmovel %ecx, %edx
777 ; AVX2-NEXT:    vpinsrb $10, %edx, %xmm2, %xmm2
778 ; AVX2-NEXT:    vpextrb $11, %xmm1, %edx
779 ; AVX2-NEXT:    bsfl %edx, %edx
780 ; AVX2-NEXT:    cmovel %eax, %edx
781 ; AVX2-NEXT:    cmpl $32, %edx
782 ; AVX2-NEXT:    cmovel %ecx, %edx
783 ; AVX2-NEXT:    vpinsrb $11, %edx, %xmm2, %xmm2
784 ; AVX2-NEXT:    vpextrb $12, %xmm1, %edx
785 ; AVX2-NEXT:    bsfl %edx, %edx
786 ; AVX2-NEXT:    cmovel %eax, %edx
787 ; AVX2-NEXT:    cmpl $32, %edx
788 ; AVX2-NEXT:    cmovel %ecx, %edx
789 ; AVX2-NEXT:    vpinsrb $12, %edx, %xmm2, %xmm2
790 ; AVX2-NEXT:    vpextrb $13, %xmm1, %edx
791 ; AVX2-NEXT:    bsfl %edx, %edx
792 ; AVX2-NEXT:    cmovel %eax, %edx
793 ; AVX2-NEXT:    cmpl $32, %edx
794 ; AVX2-NEXT:    cmovel %ecx, %edx
795 ; AVX2-NEXT:    vpinsrb $13, %edx, %xmm2, %xmm2
796 ; AVX2-NEXT:    vpextrb $14, %xmm1, %edx
797 ; AVX2-NEXT:    bsfl %edx, %edx
798 ; AVX2-NEXT:    cmovel %eax, %edx
799 ; AVX2-NEXT:    cmpl $32, %edx
800 ; AVX2-NEXT:    cmovel %ecx, %edx
801 ; AVX2-NEXT:    vpinsrb $14, %edx, %xmm2, %xmm2
802 ; AVX2-NEXT:    vpextrb $15, %xmm1, %edx
803 ; AVX2-NEXT:    bsfl %edx, %edx
804 ; AVX2-NEXT:    cmovel %eax, %edx
805 ; AVX2-NEXT:    cmpl $32, %edx
806 ; AVX2-NEXT:    cmovel %ecx, %edx
807 ; AVX2-NEXT:    vpinsrb $15, %edx, %xmm2, %xmm1
808 ; AVX2-NEXT:    vpextrb $1, %xmm0, %edx
809 ; AVX2-NEXT:    bsfl %edx, %edx
810 ; AVX2-NEXT:    cmovel %eax, %edx
811 ; AVX2-NEXT:    cmpl $32, %edx
812 ; AVX2-NEXT:    cmovel %ecx, %edx
813 ; AVX2-NEXT:    vpextrb $0, %xmm0, %esi
814 ; AVX2-NEXT:    bsfl %esi, %esi
815 ; AVX2-NEXT:    cmovel %eax, %esi
816 ; AVX2-NEXT:    cmpl $32, %esi
817 ; AVX2-NEXT:    cmovel %ecx, %esi
818 ; AVX2-NEXT:    vmovd %esi, %xmm2
819 ; AVX2-NEXT:    vpinsrb $1, %edx, %xmm2, %xmm2
820 ; AVX2-NEXT:    vpextrb $2, %xmm0, %edx
821 ; AVX2-NEXT:    bsfl %edx, %edx
822 ; AVX2-NEXT:    cmovel %eax, %edx
823 ; AVX2-NEXT:    cmpl $32, %edx
824 ; AVX2-NEXT:    cmovel %ecx, %edx
825 ; AVX2-NEXT:    vpinsrb $2, %edx, %xmm2, %xmm2
826 ; AVX2-NEXT:    vpextrb $3, %xmm0, %edx
827 ; AVX2-NEXT:    bsfl %edx, %edx
828 ; AVX2-NEXT:    cmovel %eax, %edx
829 ; AVX2-NEXT:    cmpl $32, %edx
830 ; AVX2-NEXT:    cmovel %ecx, %edx
831 ; AVX2-NEXT:    vpinsrb $3, %edx, %xmm2, %xmm2
832 ; AVX2-NEXT:    vpextrb $4, %xmm0, %edx
833 ; AVX2-NEXT:    bsfl %edx, %edx
834 ; AVX2-NEXT:    cmovel %eax, %edx
835 ; AVX2-NEXT:    cmpl $32, %edx
836 ; AVX2-NEXT:    cmovel %ecx, %edx
837 ; AVX2-NEXT:    vpinsrb $4, %edx, %xmm2, %xmm2
838 ; AVX2-NEXT:    vpextrb $5, %xmm0, %edx
839 ; AVX2-NEXT:    bsfl %edx, %edx
840 ; AVX2-NEXT:    cmovel %eax, %edx
841 ; AVX2-NEXT:    cmpl $32, %edx
842 ; AVX2-NEXT:    cmovel %ecx, %edx
843 ; AVX2-NEXT:    vpinsrb $5, %edx, %xmm2, %xmm2
844 ; AVX2-NEXT:    vpextrb $6, %xmm0, %edx
845 ; AVX2-NEXT:    bsfl %edx, %edx
846 ; AVX2-NEXT:    cmovel %eax, %edx
847 ; AVX2-NEXT:    cmpl $32, %edx
848 ; AVX2-NEXT:    cmovel %ecx, %edx
849 ; AVX2-NEXT:    vpinsrb $6, %edx, %xmm2, %xmm2
850 ; AVX2-NEXT:    vpextrb $7, %xmm0, %edx
851 ; AVX2-NEXT:    bsfl %edx, %edx
852 ; AVX2-NEXT:    cmovel %eax, %edx
853 ; AVX2-NEXT:    cmpl $32, %edx
854 ; AVX2-NEXT:    cmovel %ecx, %edx
855 ; AVX2-NEXT:    vpinsrb $7, %edx, %xmm2, %xmm2
856 ; AVX2-NEXT:    vpextrb $8, %xmm0, %edx
857 ; AVX2-NEXT:    bsfl %edx, %edx
858 ; AVX2-NEXT:    cmovel %eax, %edx
859 ; AVX2-NEXT:    cmpl $32, %edx
860 ; AVX2-NEXT:    cmovel %ecx, %edx
861 ; AVX2-NEXT:    vpinsrb $8, %edx, %xmm2, %xmm2
862 ; AVX2-NEXT:    vpextrb $9, %xmm0, %edx
863 ; AVX2-NEXT:    bsfl %edx, %edx
864 ; AVX2-NEXT:    cmovel %eax, %edx
865 ; AVX2-NEXT:    cmpl $32, %edx
866 ; AVX2-NEXT:    cmovel %ecx, %edx
867 ; AVX2-NEXT:    vpinsrb $9, %edx, %xmm2, %xmm2
868 ; AVX2-NEXT:    vpextrb $10, %xmm0, %edx
869 ; AVX2-NEXT:    bsfl %edx, %edx
870 ; AVX2-NEXT:    cmovel %eax, %edx
871 ; AVX2-NEXT:    cmpl $32, %edx
872 ; AVX2-NEXT:    cmovel %ecx, %edx
873 ; AVX2-NEXT:    vpinsrb $10, %edx, %xmm2, %xmm2
874 ; AVX2-NEXT:    vpextrb $11, %xmm0, %edx
875 ; AVX2-NEXT:    bsfl %edx, %edx
876 ; AVX2-NEXT:    cmovel %eax, %edx
877 ; AVX2-NEXT:    cmpl $32, %edx
878 ; AVX2-NEXT:    cmovel %ecx, %edx
879 ; AVX2-NEXT:    vpinsrb $11, %edx, %xmm2, %xmm2
880 ; AVX2-NEXT:    vpextrb $12, %xmm0, %edx
881 ; AVX2-NEXT:    bsfl %edx, %edx
882 ; AVX2-NEXT:    cmovel %eax, %edx
883 ; AVX2-NEXT:    cmpl $32, %edx
884 ; AVX2-NEXT:    cmovel %ecx, %edx
885 ; AVX2-NEXT:    vpinsrb $12, %edx, %xmm2, %xmm2
886 ; AVX2-NEXT:    vpextrb $13, %xmm0, %edx
887 ; AVX2-NEXT:    bsfl %edx, %edx
888 ; AVX2-NEXT:    cmovel %eax, %edx
889 ; AVX2-NEXT:    cmpl $32, %edx
890 ; AVX2-NEXT:    cmovel %ecx, %edx
891 ; AVX2-NEXT:    vpinsrb $13, %edx, %xmm2, %xmm2
892 ; AVX2-NEXT:    vpextrb $14, %xmm0, %edx
893 ; AVX2-NEXT:    bsfl %edx, %edx
894 ; AVX2-NEXT:    cmovel %eax, %edx
895 ; AVX2-NEXT:    cmpl $32, %edx
896 ; AVX2-NEXT:    cmovel %ecx, %edx
897 ; AVX2-NEXT:    vpinsrb $14, %edx, %xmm2, %xmm2
898 ; AVX2-NEXT:    vpextrb $15, %xmm0, %edx
899 ; AVX2-NEXT:    bsfl %edx, %edx
900 ; AVX2-NEXT:    cmovel %eax, %edx
901 ; AVX2-NEXT:    cmpl $32, %edx
902 ; AVX2-NEXT:    cmovel %ecx, %edx
903 ; AVX2-NEXT:    vpinsrb $15, %edx, %xmm2, %xmm0
904 ; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
905 ; AVX2-NEXT:    retq
906   %out = call <32 x i8> @llvm.cttz.v32i8(<32 x i8> %in, i1 0)
907   ret <32 x i8> %out
908 }
909
910 define <32 x i8> @testv32i8u(<32 x i8> %in) nounwind {
911 ; AVX1-LABEL: testv32i8u:
912 ; AVX1:       # BB#0:
913 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
914 ; AVX1-NEXT:    vpextrb $1, %xmm1, %eax
915 ; AVX1-NEXT:    bsfl %eax, %eax
916 ; AVX1-NEXT:    vpextrb $0, %xmm1, %ecx
917 ; AVX1-NEXT:    bsfl %ecx, %ecx
918 ; AVX1-NEXT:    vmovd %ecx, %xmm2
919 ; AVX1-NEXT:    vpinsrb $1, %eax, %xmm2, %xmm2
920 ; AVX1-NEXT:    vpextrb $2, %xmm1, %eax
921 ; AVX1-NEXT:    bsfl %eax, %eax
922 ; AVX1-NEXT:    vpinsrb $2, %eax, %xmm2, %xmm2
923 ; AVX1-NEXT:    vpextrb $3, %xmm1, %eax
924 ; AVX1-NEXT:    bsfl %eax, %eax
925 ; AVX1-NEXT:    vpinsrb $3, %eax, %xmm2, %xmm2
926 ; AVX1-NEXT:    vpextrb $4, %xmm1, %eax
927 ; AVX1-NEXT:    bsfl %eax, %eax
928 ; AVX1-NEXT:    vpinsrb $4, %eax, %xmm2, %xmm2
929 ; AVX1-NEXT:    vpextrb $5, %xmm1, %eax
930 ; AVX1-NEXT:    bsfl %eax, %eax
931 ; AVX1-NEXT:    vpinsrb $5, %eax, %xmm2, %xmm2
932 ; AVX1-NEXT:    vpextrb $6, %xmm1, %eax
933 ; AVX1-NEXT:    bsfl %eax, %eax
934 ; AVX1-NEXT:    vpinsrb $6, %eax, %xmm2, %xmm2
935 ; AVX1-NEXT:    vpextrb $7, %xmm1, %eax
936 ; AVX1-NEXT:    bsfl %eax, %eax
937 ; AVX1-NEXT:    vpinsrb $7, %eax, %xmm2, %xmm2
938 ; AVX1-NEXT:    vpextrb $8, %xmm1, %eax
939 ; AVX1-NEXT:    bsfl %eax, %eax
940 ; AVX1-NEXT:    vpinsrb $8, %eax, %xmm2, %xmm2
941 ; AVX1-NEXT:    vpextrb $9, %xmm1, %eax
942 ; AVX1-NEXT:    bsfl %eax, %eax
943 ; AVX1-NEXT:    vpinsrb $9, %eax, %xmm2, %xmm2
944 ; AVX1-NEXT:    vpextrb $10, %xmm1, %eax
945 ; AVX1-NEXT:    bsfl %eax, %eax
946 ; AVX1-NEXT:    vpinsrb $10, %eax, %xmm2, %xmm2
947 ; AVX1-NEXT:    vpextrb $11, %xmm1, %eax
948 ; AVX1-NEXT:    bsfl %eax, %eax
949 ; AVX1-NEXT:    vpinsrb $11, %eax, %xmm2, %xmm2
950 ; AVX1-NEXT:    vpextrb $12, %xmm1, %eax
951 ; AVX1-NEXT:    bsfl %eax, %eax
952 ; AVX1-NEXT:    vpinsrb $12, %eax, %xmm2, %xmm2
953 ; AVX1-NEXT:    vpextrb $13, %xmm1, %eax
954 ; AVX1-NEXT:    bsfl %eax, %eax
955 ; AVX1-NEXT:    vpinsrb $13, %eax, %xmm2, %xmm2
956 ; AVX1-NEXT:    vpextrb $14, %xmm1, %eax
957 ; AVX1-NEXT:    bsfl %eax, %eax
958 ; AVX1-NEXT:    vpinsrb $14, %eax, %xmm2, %xmm2
959 ; AVX1-NEXT:    vpextrb $15, %xmm1, %eax
960 ; AVX1-NEXT:    bsfl %eax, %eax
961 ; AVX1-NEXT:    vpinsrb $15, %eax, %xmm2, %xmm1
962 ; AVX1-NEXT:    vpextrb $1, %xmm0, %eax
963 ; AVX1-NEXT:    bsfl %eax, %eax
964 ; AVX1-NEXT:    vpextrb $0, %xmm0, %ecx
965 ; AVX1-NEXT:    bsfl %ecx, %ecx
966 ; AVX1-NEXT:    vmovd %ecx, %xmm2
967 ; AVX1-NEXT:    vpinsrb $1, %eax, %xmm2, %xmm2
968 ; AVX1-NEXT:    vpextrb $2, %xmm0, %eax
969 ; AVX1-NEXT:    bsfl %eax, %eax
970 ; AVX1-NEXT:    vpinsrb $2, %eax, %xmm2, %xmm2
971 ; AVX1-NEXT:    vpextrb $3, %xmm0, %eax
972 ; AVX1-NEXT:    bsfl %eax, %eax
973 ; AVX1-NEXT:    vpinsrb $3, %eax, %xmm2, %xmm2
974 ; AVX1-NEXT:    vpextrb $4, %xmm0, %eax
975 ; AVX1-NEXT:    bsfl %eax, %eax
976 ; AVX1-NEXT:    vpinsrb $4, %eax, %xmm2, %xmm2
977 ; AVX1-NEXT:    vpextrb $5, %xmm0, %eax
978 ; AVX1-NEXT:    bsfl %eax, %eax
979 ; AVX1-NEXT:    vpinsrb $5, %eax, %xmm2, %xmm2
980 ; AVX1-NEXT:    vpextrb $6, %xmm0, %eax
981 ; AVX1-NEXT:    bsfl %eax, %eax
982 ; AVX1-NEXT:    vpinsrb $6, %eax, %xmm2, %xmm2
983 ; AVX1-NEXT:    vpextrb $7, %xmm0, %eax
984 ; AVX1-NEXT:    bsfl %eax, %eax
985 ; AVX1-NEXT:    vpinsrb $7, %eax, %xmm2, %xmm2
986 ; AVX1-NEXT:    vpextrb $8, %xmm0, %eax
987 ; AVX1-NEXT:    bsfl %eax, %eax
988 ; AVX1-NEXT:    vpinsrb $8, %eax, %xmm2, %xmm2
989 ; AVX1-NEXT:    vpextrb $9, %xmm0, %eax
990 ; AVX1-NEXT:    bsfl %eax, %eax
991 ; AVX1-NEXT:    vpinsrb $9, %eax, %xmm2, %xmm2
992 ; AVX1-NEXT:    vpextrb $10, %xmm0, %eax
993 ; AVX1-NEXT:    bsfl %eax, %eax
994 ; AVX1-NEXT:    vpinsrb $10, %eax, %xmm2, %xmm2
995 ; AVX1-NEXT:    vpextrb $11, %xmm0, %eax
996 ; AVX1-NEXT:    bsfl %eax, %eax
997 ; AVX1-NEXT:    vpinsrb $11, %eax, %xmm2, %xmm2
998 ; AVX1-NEXT:    vpextrb $12, %xmm0, %eax
999 ; AVX1-NEXT:    bsfl %eax, %eax
1000 ; AVX1-NEXT:    vpinsrb $12, %eax, %xmm2, %xmm2
1001 ; AVX1-NEXT:    vpextrb $13, %xmm0, %eax
1002 ; AVX1-NEXT:    bsfl %eax, %eax
1003 ; AVX1-NEXT:    vpinsrb $13, %eax, %xmm2, %xmm2
1004 ; AVX1-NEXT:    vpextrb $14, %xmm0, %eax
1005 ; AVX1-NEXT:    bsfl %eax, %eax
1006 ; AVX1-NEXT:    vpinsrb $14, %eax, %xmm2, %xmm2
1007 ; AVX1-NEXT:    vpextrb $15, %xmm0, %eax
1008 ; AVX1-NEXT:    bsfl %eax, %eax
1009 ; AVX1-NEXT:    vpinsrb $15, %eax, %xmm2, %xmm0
1010 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1011 ; AVX1-NEXT:    retq
1012 ;
1013 ; AVX2-LABEL: testv32i8u:
1014 ; AVX2:       # BB#0:
1015 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1016 ; AVX2-NEXT:    vpextrb $1, %xmm1, %eax
1017 ; AVX2-NEXT:    bsfl %eax, %eax
1018 ; AVX2-NEXT:    vpextrb $0, %xmm1, %ecx
1019 ; AVX2-NEXT:    bsfl %ecx, %ecx
1020 ; AVX2-NEXT:    vmovd %ecx, %xmm2
1021 ; AVX2-NEXT:    vpinsrb $1, %eax, %xmm2, %xmm2
1022 ; AVX2-NEXT:    vpextrb $2, %xmm1, %eax
1023 ; AVX2-NEXT:    bsfl %eax, %eax
1024 ; AVX2-NEXT:    vpinsrb $2, %eax, %xmm2, %xmm2
1025 ; AVX2-NEXT:    vpextrb $3, %xmm1, %eax
1026 ; AVX2-NEXT:    bsfl %eax, %eax
1027 ; AVX2-NEXT:    vpinsrb $3, %eax, %xmm2, %xmm2
1028 ; AVX2-NEXT:    vpextrb $4, %xmm1, %eax
1029 ; AVX2-NEXT:    bsfl %eax, %eax
1030 ; AVX2-NEXT:    vpinsrb $4, %eax, %xmm2, %xmm2
1031 ; AVX2-NEXT:    vpextrb $5, %xmm1, %eax
1032 ; AVX2-NEXT:    bsfl %eax, %eax
1033 ; AVX2-NEXT:    vpinsrb $5, %eax, %xmm2, %xmm2
1034 ; AVX2-NEXT:    vpextrb $6, %xmm1, %eax
1035 ; AVX2-NEXT:    bsfl %eax, %eax
1036 ; AVX2-NEXT:    vpinsrb $6, %eax, %xmm2, %xmm2
1037 ; AVX2-NEXT:    vpextrb $7, %xmm1, %eax
1038 ; AVX2-NEXT:    bsfl %eax, %eax
1039 ; AVX2-NEXT:    vpinsrb $7, %eax, %xmm2, %xmm2
1040 ; AVX2-NEXT:    vpextrb $8, %xmm1, %eax
1041 ; AVX2-NEXT:    bsfl %eax, %eax
1042 ; AVX2-NEXT:    vpinsrb $8, %eax, %xmm2, %xmm2
1043 ; AVX2-NEXT:    vpextrb $9, %xmm1, %eax
1044 ; AVX2-NEXT:    bsfl %eax, %eax
1045 ; AVX2-NEXT:    vpinsrb $9, %eax, %xmm2, %xmm2
1046 ; AVX2-NEXT:    vpextrb $10, %xmm1, %eax
1047 ; AVX2-NEXT:    bsfl %eax, %eax
1048 ; AVX2-NEXT:    vpinsrb $10, %eax, %xmm2, %xmm2
1049 ; AVX2-NEXT:    vpextrb $11, %xmm1, %eax
1050 ; AVX2-NEXT:    bsfl %eax, %eax
1051 ; AVX2-NEXT:    vpinsrb $11, %eax, %xmm2, %xmm2
1052 ; AVX2-NEXT:    vpextrb $12, %xmm1, %eax
1053 ; AVX2-NEXT:    bsfl %eax, %eax
1054 ; AVX2-NEXT:    vpinsrb $12, %eax, %xmm2, %xmm2
1055 ; AVX2-NEXT:    vpextrb $13, %xmm1, %eax
1056 ; AVX2-NEXT:    bsfl %eax, %eax
1057 ; AVX2-NEXT:    vpinsrb $13, %eax, %xmm2, %xmm2
1058 ; AVX2-NEXT:    vpextrb $14, %xmm1, %eax
1059 ; AVX2-NEXT:    bsfl %eax, %eax
1060 ; AVX2-NEXT:    vpinsrb $14, %eax, %xmm2, %xmm2
1061 ; AVX2-NEXT:    vpextrb $15, %xmm1, %eax
1062 ; AVX2-NEXT:    bsfl %eax, %eax
1063 ; AVX2-NEXT:    vpinsrb $15, %eax, %xmm2, %xmm1
1064 ; AVX2-NEXT:    vpextrb $1, %xmm0, %eax
1065 ; AVX2-NEXT:    bsfl %eax, %eax
1066 ; AVX2-NEXT:    vpextrb $0, %xmm0, %ecx
1067 ; AVX2-NEXT:    bsfl %ecx, %ecx
1068 ; AVX2-NEXT:    vmovd %ecx, %xmm2
1069 ; AVX2-NEXT:    vpinsrb $1, %eax, %xmm2, %xmm2
1070 ; AVX2-NEXT:    vpextrb $2, %xmm0, %eax
1071 ; AVX2-NEXT:    bsfl %eax, %eax
1072 ; AVX2-NEXT:    vpinsrb $2, %eax, %xmm2, %xmm2
1073 ; AVX2-NEXT:    vpextrb $3, %xmm0, %eax
1074 ; AVX2-NEXT:    bsfl %eax, %eax
1075 ; AVX2-NEXT:    vpinsrb $3, %eax, %xmm2, %xmm2
1076 ; AVX2-NEXT:    vpextrb $4, %xmm0, %eax
1077 ; AVX2-NEXT:    bsfl %eax, %eax
1078 ; AVX2-NEXT:    vpinsrb $4, %eax, %xmm2, %xmm2
1079 ; AVX2-NEXT:    vpextrb $5, %xmm0, %eax
1080 ; AVX2-NEXT:    bsfl %eax, %eax
1081 ; AVX2-NEXT:    vpinsrb $5, %eax, %xmm2, %xmm2
1082 ; AVX2-NEXT:    vpextrb $6, %xmm0, %eax
1083 ; AVX2-NEXT:    bsfl %eax, %eax
1084 ; AVX2-NEXT:    vpinsrb $6, %eax, %xmm2, %xmm2
1085 ; AVX2-NEXT:    vpextrb $7, %xmm0, %eax
1086 ; AVX2-NEXT:    bsfl %eax, %eax
1087 ; AVX2-NEXT:    vpinsrb $7, %eax, %xmm2, %xmm2
1088 ; AVX2-NEXT:    vpextrb $8, %xmm0, %eax
1089 ; AVX2-NEXT:    bsfl %eax, %eax
1090 ; AVX2-NEXT:    vpinsrb $8, %eax, %xmm2, %xmm2
1091 ; AVX2-NEXT:    vpextrb $9, %xmm0, %eax
1092 ; AVX2-NEXT:    bsfl %eax, %eax
1093 ; AVX2-NEXT:    vpinsrb $9, %eax, %xmm2, %xmm2
1094 ; AVX2-NEXT:    vpextrb $10, %xmm0, %eax
1095 ; AVX2-NEXT:    bsfl %eax, %eax
1096 ; AVX2-NEXT:    vpinsrb $10, %eax, %xmm2, %xmm2
1097 ; AVX2-NEXT:    vpextrb $11, %xmm0, %eax
1098 ; AVX2-NEXT:    bsfl %eax, %eax
1099 ; AVX2-NEXT:    vpinsrb $11, %eax, %xmm2, %xmm2
1100 ; AVX2-NEXT:    vpextrb $12, %xmm0, %eax
1101 ; AVX2-NEXT:    bsfl %eax, %eax
1102 ; AVX2-NEXT:    vpinsrb $12, %eax, %xmm2, %xmm2
1103 ; AVX2-NEXT:    vpextrb $13, %xmm0, %eax
1104 ; AVX2-NEXT:    bsfl %eax, %eax
1105 ; AVX2-NEXT:    vpinsrb $13, %eax, %xmm2, %xmm2
1106 ; AVX2-NEXT:    vpextrb $14, %xmm0, %eax
1107 ; AVX2-NEXT:    bsfl %eax, %eax
1108 ; AVX2-NEXT:    vpinsrb $14, %eax, %xmm2, %xmm2
1109 ; AVX2-NEXT:    vpextrb $15, %xmm0, %eax
1110 ; AVX2-NEXT:    bsfl %eax, %eax
1111 ; AVX2-NEXT:    vpinsrb $15, %eax, %xmm2, %xmm0
1112 ; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
1113 ; AVX2-NEXT:    retq
1114   %out = call <32 x i8> @llvm.cttz.v32i8(<32 x i8> %in, i1 -1)
1115   ret <32 x i8> %out
1116 }
1117
1118 define <4 x i64> @foldv4i64() nounwind {
1119 ; ALL-LABEL: foldv4i64:
1120 ; ALL:       # BB#0:
1121 ; ALL-NEXT:    vmovaps {{.*#+}} ymm0 = [8,0,64,0]
1122 ; ALL-NEXT:    retq
1123   %out = call <4 x i64> @llvm.cttz.v4i64(<4 x i64> <i64 256, i64 -1, i64 0, i64 255>, i1 0)
1124   ret <4 x i64> %out
1125 }
1126
1127 define <4 x i64> @foldv4i64u() nounwind {
1128 ; ALL-LABEL: foldv4i64u:
1129 ; ALL:       # BB#0:
1130 ; ALL-NEXT:    vmovaps {{.*#+}} ymm0 = [8,0,64,0]
1131 ; ALL-NEXT:    retq
1132   %out = call <4 x i64> @llvm.cttz.v4i64(<4 x i64> <i64 256, i64 -1, i64 0, i64 255>, i1 -1)
1133   ret <4 x i64> %out
1134 }
1135
1136 define <8 x i32> @foldv8i32() nounwind {
1137 ; ALL-LABEL: foldv8i32:
1138 ; ALL:       # BB#0:
1139 ; ALL-NEXT:    vmovaps {{.*#+}} ymm0 = [8,0,32,0,16,0,3,3]
1140 ; ALL-NEXT:    retq
1141   %out = call <8 x i32> @llvm.cttz.v8i32(<8 x i32> <i32 256, i32 -1, i32 0, i32 255, i32 -65536, i32 7, i32 24, i32 88>, i1 0)
1142   ret <8 x i32> %out
1143 }
1144
1145 define <8 x i32> @foldv8i32u() nounwind {
1146 ; ALL-LABEL: foldv8i32u:
1147 ; ALL:       # BB#0:
1148 ; ALL-NEXT:    vmovaps {{.*#+}} ymm0 = [8,0,32,0,16,0,3,3]
1149 ; ALL-NEXT:    retq
1150   %out = call <8 x i32> @llvm.cttz.v8i32(<8 x i32> <i32 256, i32 -1, i32 0, i32 255, i32 -65536, i32 7, i32 24, i32 88>, i1 -1)
1151   ret <8 x i32> %out
1152 }
1153
1154 define <16 x i16> @foldv16i16() nounwind {
1155 ; ALL-LABEL: foldv16i16:
1156 ; ALL:       # BB#0:
1157 ; ALL-NEXT:    vmovaps {{.*#+}} ymm0 = [8,0,16,0,16,0,3,3,1,1,0,1,2,3,4,5]
1158 ; ALL-NEXT:    retq
1159   %out = call <16 x i16> @llvm.cttz.v16i16(<16 x i16> <i16 256, i16 -1, i16 0, i16 255, i16 -65536, i16 7, i16 24, i16 88, i16 -2, i16 254, i16 1, i16 2, i16 4, i16 8, i16 16, i16 32>, i1 0)
1160   ret <16 x i16> %out
1161 }
1162
1163 define <16 x i16> @foldv16i16u() nounwind {
1164 ; ALL-LABEL: foldv16i16u:
1165 ; ALL:       # BB#0:
1166 ; ALL-NEXT:    vmovaps {{.*#+}} ymm0 = [8,0,16,0,16,0,3,3,1,1,0,1,2,3,4,5]
1167 ; ALL-NEXT:    retq
1168   %out = call <16 x i16> @llvm.cttz.v16i16(<16 x i16> <i16 256, i16 -1, i16 0, i16 255, i16 -65536, i16 7, i16 24, i16 88, i16 -2, i16 254, i16 1, i16 2, i16 4, i16 8, i16 16, i16 32>, i1 -1)
1169   ret <16 x i16> %out
1170 }
1171
1172 define <32 x i8> @foldv32i8() nounwind {
1173 ; ALL-LABEL: foldv32i8:
1174 ; ALL:       # BB#0:
1175 ; ALL-NEXT:    vmovaps {{.*#+}} ymm0 = [8,0,8,0,8,0,3,3,1,1,0,1,2,3,4,5,6,7,8,8,7,6,5,4,3,2,1,0,0,0,0,0]
1176 ; ALL-NEXT:    retq
1177   %out = call <32 x i8> @llvm.cttz.v32i8(<32 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, i8 64, i8 128, i8 256, i8 -256, i8 -128, i8 -64, i8 -32, i8 -16, i8 -8, i8 -4, i8 -2, i8 -1, i8 3, i8 5, i8 7, i8 127>, i1 0)
1178   ret <32 x i8> %out
1179 }
1180
1181 define <32 x i8> @foldv32i8u() nounwind {
1182 ; ALL-LABEL: foldv32i8u:
1183 ; ALL:       # BB#0:
1184 ; ALL-NEXT:    vmovaps {{.*#+}} ymm0 = [8,0,8,0,8,0,3,3,1,1,0,1,2,3,4,5,6,7,8,8,7,6,5,4,3,2,1,0,0,0,0,0]
1185 ; ALL-NEXT:    retq
1186   %out = call <32 x i8> @llvm.cttz.v32i8(<32 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, i8 64, i8 128, i8 256, i8 -256, i8 -128, i8 -64, i8 -32, i8 -16, i8 -8, i8 -4, i8 -2, i8 -1, i8 3, i8 5, i8 7, i8 127>, i1 -1)
1187   ret <32 x i8> %out
1188 }
1189
1190 declare <4 x i64> @llvm.cttz.v4i64(<4 x i64>, i1)
1191 declare <8 x i32> @llvm.cttz.v8i32(<8 x i32>, i1)
1192 declare <16 x i16> @llvm.cttz.v16i16(<16 x i16>, i1)
1193 declare <32 x i8> @llvm.cttz.v32i8(<32 x i8>, i1)