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