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