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