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