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