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-prefixes=ALL,AVX,AVX1
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=ALL,AVX,AVX2
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512cd,+avx512vl | FileCheck %s --check-prefixes=ALL,AVX,AVX512CDVL
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512cd,-avx512vl | FileCheck %s --check-prefixes=ALL,AVX,AVX512CD
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vpopcntdq | FileCheck %s --check-prefixes=ALL,AVX,AVX512VPOPCNTDQ
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vpopcntdq,+avx512vl | FileCheck %s --check-prefixes=ALL,AVX,AVX512VPOPCNTDQVL
8 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bitalg | FileCheck %s --check-prefixes=ALL,BITALG_NOVLX
9 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bitalg,+avx512vl | FileCheck %s --check-prefixes=ALL,BITALG
11 ; Just one 32-bit run to make sure we do reasonable things for i64 tzcnt.
12 ; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=ALL,X32-AVX
14 define <4 x i64> @testv4i64(<4 x i64> %in) nounwind {
15 ; AVX1-LABEL: testv4i64:
17 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
18 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
19 ; AVX1-NEXT: vpaddq %xmm2, %xmm1, %xmm3
20 ; AVX1-NEXT: vpandn %xmm3, %xmm1, %xmm1
21 ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
22 ; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm4
23 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
24 ; AVX1-NEXT: vpshufb %xmm4, %xmm5, %xmm4
25 ; AVX1-NEXT: vpsrlw $4, %xmm1, %xmm1
26 ; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm1
27 ; AVX1-NEXT: vpshufb %xmm1, %xmm5, %xmm1
28 ; AVX1-NEXT: vpaddb %xmm4, %xmm1, %xmm1
29 ; AVX1-NEXT: vpxor %xmm4, %xmm4, %xmm4
30 ; AVX1-NEXT: vpsadbw %xmm4, %xmm1, %xmm1
31 ; AVX1-NEXT: vpaddq %xmm2, %xmm0, %xmm2
32 ; AVX1-NEXT: vpandn %xmm2, %xmm0, %xmm0
33 ; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm2
34 ; AVX1-NEXT: vpshufb %xmm2, %xmm5, %xmm2
35 ; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm0
36 ; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm0
37 ; AVX1-NEXT: vpshufb %xmm0, %xmm5, %xmm0
38 ; AVX1-NEXT: vpaddb %xmm2, %xmm0, %xmm0
39 ; AVX1-NEXT: vpsadbw %xmm4, %xmm0, %xmm0
40 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
43 ; AVX2-LABEL: testv4i64:
45 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
46 ; AVX2-NEXT: vpaddq %ymm1, %ymm0, %ymm1
47 ; AVX2-NEXT: vpandn %ymm1, %ymm0, %ymm0
48 ; AVX2-NEXT: vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
49 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm2
50 ; AVX2-NEXT: vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
51 ; AVX2-NEXT: # ymm3 = mem[0,1,0,1]
52 ; AVX2-NEXT: vpshufb %ymm2, %ymm3, %ymm2
53 ; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm0
54 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
55 ; AVX2-NEXT: vpshufb %ymm0, %ymm3, %ymm0
56 ; AVX2-NEXT: vpaddb %ymm2, %ymm0, %ymm0
57 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1
58 ; AVX2-NEXT: vpsadbw %ymm1, %ymm0, %ymm0
61 ; AVX512CDVL-LABEL: testv4i64:
62 ; AVX512CDVL: # %bb.0:
63 ; AVX512CDVL-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
64 ; AVX512CDVL-NEXT: vpaddq %ymm1, %ymm0, %ymm1
65 ; AVX512CDVL-NEXT: vpandn %ymm1, %ymm0, %ymm0
66 ; AVX512CDVL-NEXT: vplzcntq %ymm0, %ymm0
67 ; AVX512CDVL-NEXT: vpbroadcastq {{.*#+}} ymm1 = [64,64,64,64]
68 ; AVX512CDVL-NEXT: vpsubq %ymm0, %ymm1, %ymm0
69 ; AVX512CDVL-NEXT: retq
71 ; AVX512CD-LABEL: testv4i64:
73 ; AVX512CD-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
74 ; AVX512CD-NEXT: vpaddq %ymm1, %ymm0, %ymm1
75 ; AVX512CD-NEXT: vpandn %ymm1, %ymm0, %ymm0
76 ; AVX512CD-NEXT: vplzcntq %zmm0, %zmm0
77 ; AVX512CD-NEXT: vpbroadcastq {{.*#+}} ymm1 = [64,64,64,64]
78 ; AVX512CD-NEXT: vpsubq %ymm0, %ymm1, %ymm0
81 ; AVX512VPOPCNTDQ-LABEL: testv4i64:
82 ; AVX512VPOPCNTDQ: # %bb.0:
83 ; AVX512VPOPCNTDQ-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
84 ; AVX512VPOPCNTDQ-NEXT: vpaddq %ymm1, %ymm0, %ymm1
85 ; AVX512VPOPCNTDQ-NEXT: vpandn %ymm1, %ymm0, %ymm0
86 ; AVX512VPOPCNTDQ-NEXT: vpopcntq %zmm0, %zmm0
87 ; AVX512VPOPCNTDQ-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0
88 ; AVX512VPOPCNTDQ-NEXT: retq
90 ; AVX512VPOPCNTDQVL-LABEL: testv4i64:
91 ; AVX512VPOPCNTDQVL: # %bb.0:
92 ; AVX512VPOPCNTDQVL-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
93 ; AVX512VPOPCNTDQVL-NEXT: vpaddq %ymm1, %ymm0, %ymm1
94 ; AVX512VPOPCNTDQVL-NEXT: vpandn %ymm1, %ymm0, %ymm0
95 ; AVX512VPOPCNTDQVL-NEXT: vpopcntq %ymm0, %ymm0
96 ; AVX512VPOPCNTDQVL-NEXT: retq
98 ; BITALG_NOVLX-LABEL: testv4i64:
99 ; BITALG_NOVLX: # %bb.0:
100 ; BITALG_NOVLX-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
101 ; BITALG_NOVLX-NEXT: vpaddq %ymm1, %ymm0, %ymm1
102 ; BITALG_NOVLX-NEXT: vpandn %ymm1, %ymm0, %ymm0
103 ; BITALG_NOVLX-NEXT: vpopcntb %zmm0, %zmm0
104 ; BITALG_NOVLX-NEXT: vpxor %xmm1, %xmm1, %xmm1
105 ; BITALG_NOVLX-NEXT: vpsadbw %ymm1, %ymm0, %ymm0
106 ; BITALG_NOVLX-NEXT: retq
108 ; BITALG-LABEL: testv4i64:
110 ; BITALG-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
111 ; BITALG-NEXT: vpaddq %ymm1, %ymm0, %ymm1
112 ; BITALG-NEXT: vpandn %ymm1, %ymm0, %ymm0
113 ; BITALG-NEXT: vpopcntb %ymm0, %ymm0
114 ; BITALG-NEXT: vpxor %xmm1, %xmm1, %xmm1
115 ; BITALG-NEXT: vpsadbw %ymm1, %ymm0, %ymm0
118 ; X32-AVX-LABEL: testv4i64:
120 ; X32-AVX-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
121 ; X32-AVX-NEXT: vpaddq %ymm1, %ymm0, %ymm1
122 ; X32-AVX-NEXT: vpandn %ymm1, %ymm0, %ymm0
123 ; X32-AVX-NEXT: vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
124 ; X32-AVX-NEXT: vpand %ymm1, %ymm0, %ymm2
125 ; X32-AVX-NEXT: vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
126 ; X32-AVX-NEXT: # ymm3 = mem[0,1,0,1]
127 ; X32-AVX-NEXT: vpshufb %ymm2, %ymm3, %ymm2
128 ; X32-AVX-NEXT: vpsrlw $4, %ymm0, %ymm0
129 ; X32-AVX-NEXT: vpand %ymm1, %ymm0, %ymm0
130 ; X32-AVX-NEXT: vpshufb %ymm0, %ymm3, %ymm0
131 ; X32-AVX-NEXT: vpaddb %ymm2, %ymm0, %ymm0
132 ; X32-AVX-NEXT: vpxor %xmm1, %xmm1, %xmm1
133 ; X32-AVX-NEXT: vpsadbw %ymm1, %ymm0, %ymm0
135 %out = call <4 x i64> @llvm.cttz.v4i64(<4 x i64> %in, i1 0)
139 define <4 x i64> @testv4i64u(<4 x i64> %in) nounwind {
140 ; AVX1-LABEL: testv4i64u:
142 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
143 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
144 ; AVX1-NEXT: vpaddq %xmm2, %xmm1, %xmm3
145 ; AVX1-NEXT: vpandn %xmm3, %xmm1, %xmm1
146 ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
147 ; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm4
148 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
149 ; AVX1-NEXT: vpshufb %xmm4, %xmm5, %xmm4
150 ; AVX1-NEXT: vpsrlw $4, %xmm1, %xmm1
151 ; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm1
152 ; AVX1-NEXT: vpshufb %xmm1, %xmm5, %xmm1
153 ; AVX1-NEXT: vpaddb %xmm4, %xmm1, %xmm1
154 ; AVX1-NEXT: vpxor %xmm4, %xmm4, %xmm4
155 ; AVX1-NEXT: vpsadbw %xmm4, %xmm1, %xmm1
156 ; AVX1-NEXT: vpaddq %xmm2, %xmm0, %xmm2
157 ; AVX1-NEXT: vpandn %xmm2, %xmm0, %xmm0
158 ; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm2
159 ; AVX1-NEXT: vpshufb %xmm2, %xmm5, %xmm2
160 ; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm0
161 ; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm0
162 ; AVX1-NEXT: vpshufb %xmm0, %xmm5, %xmm0
163 ; AVX1-NEXT: vpaddb %xmm2, %xmm0, %xmm0
164 ; AVX1-NEXT: vpsadbw %xmm4, %xmm0, %xmm0
165 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
168 ; AVX2-LABEL: testv4i64u:
170 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
171 ; AVX2-NEXT: vpaddq %ymm1, %ymm0, %ymm1
172 ; AVX2-NEXT: vpandn %ymm1, %ymm0, %ymm0
173 ; AVX2-NEXT: vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
174 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm2
175 ; AVX2-NEXT: vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
176 ; AVX2-NEXT: # ymm3 = mem[0,1,0,1]
177 ; AVX2-NEXT: vpshufb %ymm2, %ymm3, %ymm2
178 ; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm0
179 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
180 ; AVX2-NEXT: vpshufb %ymm0, %ymm3, %ymm0
181 ; AVX2-NEXT: vpaddb %ymm2, %ymm0, %ymm0
182 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1
183 ; AVX2-NEXT: vpsadbw %ymm1, %ymm0, %ymm0
186 ; AVX512CDVL-LABEL: testv4i64u:
187 ; AVX512CDVL: # %bb.0:
188 ; AVX512CDVL-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
189 ; AVX512CDVL-NEXT: vpaddq %ymm1, %ymm0, %ymm1
190 ; AVX512CDVL-NEXT: vpandn %ymm1, %ymm0, %ymm0
191 ; AVX512CDVL-NEXT: vplzcntq %ymm0, %ymm0
192 ; AVX512CDVL-NEXT: vpbroadcastq {{.*#+}} ymm1 = [64,64,64,64]
193 ; AVX512CDVL-NEXT: vpsubq %ymm0, %ymm1, %ymm0
194 ; AVX512CDVL-NEXT: retq
196 ; AVX512CD-LABEL: testv4i64u:
198 ; AVX512CD-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
199 ; AVX512CD-NEXT: vpaddq %ymm1, %ymm0, %ymm1
200 ; AVX512CD-NEXT: vpandn %ymm1, %ymm0, %ymm0
201 ; AVX512CD-NEXT: vplzcntq %zmm0, %zmm0
202 ; AVX512CD-NEXT: vpbroadcastq {{.*#+}} ymm1 = [64,64,64,64]
203 ; AVX512CD-NEXT: vpsubq %ymm0, %ymm1, %ymm0
204 ; AVX512CD-NEXT: retq
206 ; AVX512VPOPCNTDQ-LABEL: testv4i64u:
207 ; AVX512VPOPCNTDQ: # %bb.0:
208 ; AVX512VPOPCNTDQ-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
209 ; AVX512VPOPCNTDQ-NEXT: vpaddq %ymm1, %ymm0, %ymm1
210 ; AVX512VPOPCNTDQ-NEXT: vpandn %ymm1, %ymm0, %ymm0
211 ; AVX512VPOPCNTDQ-NEXT: vpopcntq %zmm0, %zmm0
212 ; AVX512VPOPCNTDQ-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0
213 ; AVX512VPOPCNTDQ-NEXT: retq
215 ; AVX512VPOPCNTDQVL-LABEL: testv4i64u:
216 ; AVX512VPOPCNTDQVL: # %bb.0:
217 ; AVX512VPOPCNTDQVL-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
218 ; AVX512VPOPCNTDQVL-NEXT: vpaddq %ymm1, %ymm0, %ymm1
219 ; AVX512VPOPCNTDQVL-NEXT: vpandn %ymm1, %ymm0, %ymm0
220 ; AVX512VPOPCNTDQVL-NEXT: vpopcntq %ymm0, %ymm0
221 ; AVX512VPOPCNTDQVL-NEXT: retq
223 ; BITALG_NOVLX-LABEL: testv4i64u:
224 ; BITALG_NOVLX: # %bb.0:
225 ; BITALG_NOVLX-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
226 ; BITALG_NOVLX-NEXT: vpaddq %ymm1, %ymm0, %ymm1
227 ; BITALG_NOVLX-NEXT: vpandn %ymm1, %ymm0, %ymm0
228 ; BITALG_NOVLX-NEXT: vpopcntb %zmm0, %zmm0
229 ; BITALG_NOVLX-NEXT: vpxor %xmm1, %xmm1, %xmm1
230 ; BITALG_NOVLX-NEXT: vpsadbw %ymm1, %ymm0, %ymm0
231 ; BITALG_NOVLX-NEXT: retq
233 ; BITALG-LABEL: testv4i64u:
235 ; BITALG-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
236 ; BITALG-NEXT: vpaddq %ymm1, %ymm0, %ymm1
237 ; BITALG-NEXT: vpandn %ymm1, %ymm0, %ymm0
238 ; BITALG-NEXT: vpopcntb %ymm0, %ymm0
239 ; BITALG-NEXT: vpxor %xmm1, %xmm1, %xmm1
240 ; BITALG-NEXT: vpsadbw %ymm1, %ymm0, %ymm0
243 ; X32-AVX-LABEL: testv4i64u:
245 ; X32-AVX-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
246 ; X32-AVX-NEXT: vpaddq %ymm1, %ymm0, %ymm1
247 ; X32-AVX-NEXT: vpandn %ymm1, %ymm0, %ymm0
248 ; X32-AVX-NEXT: vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
249 ; X32-AVX-NEXT: vpand %ymm1, %ymm0, %ymm2
250 ; X32-AVX-NEXT: vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
251 ; X32-AVX-NEXT: # ymm3 = mem[0,1,0,1]
252 ; X32-AVX-NEXT: vpshufb %ymm2, %ymm3, %ymm2
253 ; X32-AVX-NEXT: vpsrlw $4, %ymm0, %ymm0
254 ; X32-AVX-NEXT: vpand %ymm1, %ymm0, %ymm0
255 ; X32-AVX-NEXT: vpshufb %ymm0, %ymm3, %ymm0
256 ; X32-AVX-NEXT: vpaddb %ymm2, %ymm0, %ymm0
257 ; X32-AVX-NEXT: vpxor %xmm1, %xmm1, %xmm1
258 ; X32-AVX-NEXT: vpsadbw %ymm1, %ymm0, %ymm0
260 %out = call <4 x i64> @llvm.cttz.v4i64(<4 x i64> %in, i1 -1)
264 define <8 x i32> @testv8i32(<8 x i32> %in) nounwind {
265 ; AVX1-LABEL: testv8i32:
267 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
268 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
269 ; AVX1-NEXT: vpaddd %xmm2, %xmm1, %xmm3
270 ; AVX1-NEXT: vpandn %xmm3, %xmm1, %xmm1
271 ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
272 ; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm4
273 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
274 ; AVX1-NEXT: vpshufb %xmm4, %xmm5, %xmm4
275 ; AVX1-NEXT: vpsrlw $4, %xmm1, %xmm1
276 ; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm1
277 ; AVX1-NEXT: vpshufb %xmm1, %xmm5, %xmm1
278 ; AVX1-NEXT: vpaddb %xmm4, %xmm1, %xmm1
279 ; AVX1-NEXT: vpxor %xmm4, %xmm4, %xmm4
280 ; AVX1-NEXT: vpunpckhdq {{.*#+}} xmm6 = xmm1[2],xmm4[2],xmm1[3],xmm4[3]
281 ; AVX1-NEXT: vpsadbw %xmm4, %xmm6, %xmm6
282 ; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
283 ; AVX1-NEXT: vpsadbw %xmm4, %xmm1, %xmm1
284 ; AVX1-NEXT: vpackuswb %xmm6, %xmm1, %xmm1
285 ; AVX1-NEXT: vpaddd %xmm2, %xmm0, %xmm2
286 ; AVX1-NEXT: vpandn %xmm2, %xmm0, %xmm0
287 ; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm2
288 ; AVX1-NEXT: vpshufb %xmm2, %xmm5, %xmm2
289 ; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm0
290 ; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm0
291 ; AVX1-NEXT: vpshufb %xmm0, %xmm5, %xmm0
292 ; AVX1-NEXT: vpaddb %xmm2, %xmm0, %xmm0
293 ; AVX1-NEXT: vpunpckhdq {{.*#+}} xmm2 = xmm0[2],xmm4[2],xmm0[3],xmm4[3]
294 ; AVX1-NEXT: vpsadbw %xmm4, %xmm2, %xmm2
295 ; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
296 ; AVX1-NEXT: vpsadbw %xmm4, %xmm0, %xmm0
297 ; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0
298 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
301 ; AVX2-LABEL: testv8i32:
303 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
304 ; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm1
305 ; AVX2-NEXT: vpandn %ymm1, %ymm0, %ymm0
306 ; AVX2-NEXT: vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
307 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm2
308 ; AVX2-NEXT: vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
309 ; AVX2-NEXT: # ymm3 = mem[0,1,0,1]
310 ; AVX2-NEXT: vpshufb %ymm2, %ymm3, %ymm2
311 ; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm0
312 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
313 ; AVX2-NEXT: vpshufb %ymm0, %ymm3, %ymm0
314 ; AVX2-NEXT: vpaddb %ymm2, %ymm0, %ymm0
315 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1
316 ; AVX2-NEXT: vpunpckhdq {{.*#+}} ymm2 = ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[6],ymm1[6],ymm0[7],ymm1[7]
317 ; AVX2-NEXT: vpsadbw %ymm1, %ymm2, %ymm2
318 ; AVX2-NEXT: vpunpckldq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[4],ymm1[4],ymm0[5],ymm1[5]
319 ; AVX2-NEXT: vpsadbw %ymm1, %ymm0, %ymm0
320 ; AVX2-NEXT: vpackuswb %ymm2, %ymm0, %ymm0
323 ; AVX512CDVL-LABEL: testv8i32:
324 ; AVX512CDVL: # %bb.0:
325 ; AVX512CDVL-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
326 ; AVX512CDVL-NEXT: vpaddd %ymm1, %ymm0, %ymm1
327 ; AVX512CDVL-NEXT: vpandn %ymm1, %ymm0, %ymm0
328 ; AVX512CDVL-NEXT: vplzcntd %ymm0, %ymm0
329 ; AVX512CDVL-NEXT: vpbroadcastd {{.*#+}} ymm1 = [32,32,32,32,32,32,32,32]
330 ; AVX512CDVL-NEXT: vpsubd %ymm0, %ymm1, %ymm0
331 ; AVX512CDVL-NEXT: retq
333 ; AVX512CD-LABEL: testv8i32:
335 ; AVX512CD-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
336 ; AVX512CD-NEXT: vpaddd %ymm1, %ymm0, %ymm1
337 ; AVX512CD-NEXT: vpandn %ymm1, %ymm0, %ymm0
338 ; AVX512CD-NEXT: vplzcntd %zmm0, %zmm0
339 ; AVX512CD-NEXT: vpbroadcastd {{.*#+}} ymm1 = [32,32,32,32,32,32,32,32]
340 ; AVX512CD-NEXT: vpsubd %ymm0, %ymm1, %ymm0
341 ; AVX512CD-NEXT: retq
343 ; AVX512VPOPCNTDQ-LABEL: testv8i32:
344 ; AVX512VPOPCNTDQ: # %bb.0:
345 ; AVX512VPOPCNTDQ-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
346 ; AVX512VPOPCNTDQ-NEXT: vpaddd %ymm1, %ymm0, %ymm1
347 ; AVX512VPOPCNTDQ-NEXT: vpandn %ymm1, %ymm0, %ymm0
348 ; AVX512VPOPCNTDQ-NEXT: vpopcntd %zmm0, %zmm0
349 ; AVX512VPOPCNTDQ-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0
350 ; AVX512VPOPCNTDQ-NEXT: retq
352 ; AVX512VPOPCNTDQVL-LABEL: testv8i32:
353 ; AVX512VPOPCNTDQVL: # %bb.0:
354 ; AVX512VPOPCNTDQVL-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
355 ; AVX512VPOPCNTDQVL-NEXT: vpaddd %ymm1, %ymm0, %ymm1
356 ; AVX512VPOPCNTDQVL-NEXT: vpandn %ymm1, %ymm0, %ymm0
357 ; AVX512VPOPCNTDQVL-NEXT: vpopcntd %ymm0, %ymm0
358 ; AVX512VPOPCNTDQVL-NEXT: retq
360 ; BITALG_NOVLX-LABEL: testv8i32:
361 ; BITALG_NOVLX: # %bb.0:
362 ; BITALG_NOVLX-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
363 ; BITALG_NOVLX-NEXT: vpaddd %ymm1, %ymm0, %ymm1
364 ; BITALG_NOVLX-NEXT: vpandn %ymm1, %ymm0, %ymm0
365 ; BITALG_NOVLX-NEXT: vpopcntb %zmm0, %zmm0
366 ; BITALG_NOVLX-NEXT: vpxor %xmm1, %xmm1, %xmm1
367 ; BITALG_NOVLX-NEXT: vpunpckhdq {{.*#+}} ymm2 = ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[6],ymm1[6],ymm0[7],ymm1[7]
368 ; BITALG_NOVLX-NEXT: vpsadbw %ymm1, %ymm2, %ymm2
369 ; BITALG_NOVLX-NEXT: vpunpckldq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[4],ymm1[4],ymm0[5],ymm1[5]
370 ; BITALG_NOVLX-NEXT: vpsadbw %ymm1, %ymm0, %ymm0
371 ; BITALG_NOVLX-NEXT: vpackuswb %ymm2, %ymm0, %ymm0
372 ; BITALG_NOVLX-NEXT: retq
374 ; BITALG-LABEL: testv8i32:
376 ; BITALG-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
377 ; BITALG-NEXT: vpaddd %ymm1, %ymm0, %ymm1
378 ; BITALG-NEXT: vpandn %ymm1, %ymm0, %ymm0
379 ; BITALG-NEXT: vpopcntb %ymm0, %ymm0
380 ; BITALG-NEXT: vpxor %xmm1, %xmm1, %xmm1
381 ; BITALG-NEXT: vpunpckhdq {{.*#+}} ymm2 = ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[6],ymm1[6],ymm0[7],ymm1[7]
382 ; BITALG-NEXT: vpsadbw %ymm1, %ymm2, %ymm2
383 ; BITALG-NEXT: vpunpckldq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[4],ymm1[4],ymm0[5],ymm1[5]
384 ; BITALG-NEXT: vpsadbw %ymm1, %ymm0, %ymm0
385 ; BITALG-NEXT: vpackuswb %ymm2, %ymm0, %ymm0
388 ; X32-AVX-LABEL: testv8i32:
390 ; X32-AVX-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
391 ; X32-AVX-NEXT: vpaddd %ymm1, %ymm0, %ymm1
392 ; X32-AVX-NEXT: vpandn %ymm1, %ymm0, %ymm0
393 ; X32-AVX-NEXT: vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
394 ; X32-AVX-NEXT: vpand %ymm1, %ymm0, %ymm2
395 ; X32-AVX-NEXT: vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
396 ; X32-AVX-NEXT: # ymm3 = mem[0,1,0,1]
397 ; X32-AVX-NEXT: vpshufb %ymm2, %ymm3, %ymm2
398 ; X32-AVX-NEXT: vpsrlw $4, %ymm0, %ymm0
399 ; X32-AVX-NEXT: vpand %ymm1, %ymm0, %ymm0
400 ; X32-AVX-NEXT: vpshufb %ymm0, %ymm3, %ymm0
401 ; X32-AVX-NEXT: vpaddb %ymm2, %ymm0, %ymm0
402 ; X32-AVX-NEXT: vpxor %xmm1, %xmm1, %xmm1
403 ; X32-AVX-NEXT: vpunpckhdq {{.*#+}} ymm2 = ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[6],ymm1[6],ymm0[7],ymm1[7]
404 ; X32-AVX-NEXT: vpsadbw %ymm1, %ymm2, %ymm2
405 ; X32-AVX-NEXT: vpunpckldq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[4],ymm1[4],ymm0[5],ymm1[5]
406 ; X32-AVX-NEXT: vpsadbw %ymm1, %ymm0, %ymm0
407 ; X32-AVX-NEXT: vpackuswb %ymm2, %ymm0, %ymm0
409 %out = call <8 x i32> @llvm.cttz.v8i32(<8 x i32> %in, i1 0)
413 define <8 x i32> @testv8i32u(<8 x i32> %in) nounwind {
414 ; AVX1-LABEL: testv8i32u:
416 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
417 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
418 ; AVX1-NEXT: vpaddd %xmm2, %xmm1, %xmm3
419 ; AVX1-NEXT: vpandn %xmm3, %xmm1, %xmm1
420 ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
421 ; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm4
422 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
423 ; AVX1-NEXT: vpshufb %xmm4, %xmm5, %xmm4
424 ; AVX1-NEXT: vpsrlw $4, %xmm1, %xmm1
425 ; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm1
426 ; AVX1-NEXT: vpshufb %xmm1, %xmm5, %xmm1
427 ; AVX1-NEXT: vpaddb %xmm4, %xmm1, %xmm1
428 ; AVX1-NEXT: vpxor %xmm4, %xmm4, %xmm4
429 ; AVX1-NEXT: vpunpckhdq {{.*#+}} xmm6 = xmm1[2],xmm4[2],xmm1[3],xmm4[3]
430 ; AVX1-NEXT: vpsadbw %xmm4, %xmm6, %xmm6
431 ; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
432 ; AVX1-NEXT: vpsadbw %xmm4, %xmm1, %xmm1
433 ; AVX1-NEXT: vpackuswb %xmm6, %xmm1, %xmm1
434 ; AVX1-NEXT: vpaddd %xmm2, %xmm0, %xmm2
435 ; AVX1-NEXT: vpandn %xmm2, %xmm0, %xmm0
436 ; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm2
437 ; AVX1-NEXT: vpshufb %xmm2, %xmm5, %xmm2
438 ; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm0
439 ; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm0
440 ; AVX1-NEXT: vpshufb %xmm0, %xmm5, %xmm0
441 ; AVX1-NEXT: vpaddb %xmm2, %xmm0, %xmm0
442 ; AVX1-NEXT: vpunpckhdq {{.*#+}} xmm2 = xmm0[2],xmm4[2],xmm0[3],xmm4[3]
443 ; AVX1-NEXT: vpsadbw %xmm4, %xmm2, %xmm2
444 ; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
445 ; AVX1-NEXT: vpsadbw %xmm4, %xmm0, %xmm0
446 ; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0
447 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
450 ; AVX2-LABEL: testv8i32u:
452 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
453 ; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm1
454 ; AVX2-NEXT: vpandn %ymm1, %ymm0, %ymm0
455 ; AVX2-NEXT: vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
456 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm2
457 ; AVX2-NEXT: vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
458 ; AVX2-NEXT: # ymm3 = mem[0,1,0,1]
459 ; AVX2-NEXT: vpshufb %ymm2, %ymm3, %ymm2
460 ; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm0
461 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
462 ; AVX2-NEXT: vpshufb %ymm0, %ymm3, %ymm0
463 ; AVX2-NEXT: vpaddb %ymm2, %ymm0, %ymm0
464 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1
465 ; AVX2-NEXT: vpunpckhdq {{.*#+}} ymm2 = ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[6],ymm1[6],ymm0[7],ymm1[7]
466 ; AVX2-NEXT: vpsadbw %ymm1, %ymm2, %ymm2
467 ; AVX2-NEXT: vpunpckldq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[4],ymm1[4],ymm0[5],ymm1[5]
468 ; AVX2-NEXT: vpsadbw %ymm1, %ymm0, %ymm0
469 ; AVX2-NEXT: vpackuswb %ymm2, %ymm0, %ymm0
472 ; AVX512CDVL-LABEL: testv8i32u:
473 ; AVX512CDVL: # %bb.0:
474 ; AVX512CDVL-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
475 ; AVX512CDVL-NEXT: vpaddd %ymm1, %ymm0, %ymm1
476 ; AVX512CDVL-NEXT: vpandn %ymm1, %ymm0, %ymm0
477 ; AVX512CDVL-NEXT: vplzcntd %ymm0, %ymm0
478 ; AVX512CDVL-NEXT: vpbroadcastd {{.*#+}} ymm1 = [32,32,32,32,32,32,32,32]
479 ; AVX512CDVL-NEXT: vpsubd %ymm0, %ymm1, %ymm0
480 ; AVX512CDVL-NEXT: retq
482 ; AVX512CD-LABEL: testv8i32u:
484 ; AVX512CD-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
485 ; AVX512CD-NEXT: vpaddd %ymm1, %ymm0, %ymm1
486 ; AVX512CD-NEXT: vpandn %ymm1, %ymm0, %ymm0
487 ; AVX512CD-NEXT: vplzcntd %zmm0, %zmm0
488 ; AVX512CD-NEXT: vpbroadcastd {{.*#+}} ymm1 = [32,32,32,32,32,32,32,32]
489 ; AVX512CD-NEXT: vpsubd %ymm0, %ymm1, %ymm0
490 ; AVX512CD-NEXT: retq
492 ; AVX512VPOPCNTDQ-LABEL: testv8i32u:
493 ; AVX512VPOPCNTDQ: # %bb.0:
494 ; AVX512VPOPCNTDQ-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
495 ; AVX512VPOPCNTDQ-NEXT: vpaddd %ymm1, %ymm0, %ymm1
496 ; AVX512VPOPCNTDQ-NEXT: vpandn %ymm1, %ymm0, %ymm0
497 ; AVX512VPOPCNTDQ-NEXT: vpopcntd %zmm0, %zmm0
498 ; AVX512VPOPCNTDQ-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0
499 ; AVX512VPOPCNTDQ-NEXT: retq
501 ; AVX512VPOPCNTDQVL-LABEL: testv8i32u:
502 ; AVX512VPOPCNTDQVL: # %bb.0:
503 ; AVX512VPOPCNTDQVL-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
504 ; AVX512VPOPCNTDQVL-NEXT: vpaddd %ymm1, %ymm0, %ymm1
505 ; AVX512VPOPCNTDQVL-NEXT: vpandn %ymm1, %ymm0, %ymm0
506 ; AVX512VPOPCNTDQVL-NEXT: vpopcntd %ymm0, %ymm0
507 ; AVX512VPOPCNTDQVL-NEXT: retq
509 ; BITALG_NOVLX-LABEL: testv8i32u:
510 ; BITALG_NOVLX: # %bb.0:
511 ; BITALG_NOVLX-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
512 ; BITALG_NOVLX-NEXT: vpaddd %ymm1, %ymm0, %ymm1
513 ; BITALG_NOVLX-NEXT: vpandn %ymm1, %ymm0, %ymm0
514 ; BITALG_NOVLX-NEXT: vpopcntb %zmm0, %zmm0
515 ; BITALG_NOVLX-NEXT: vpxor %xmm1, %xmm1, %xmm1
516 ; BITALG_NOVLX-NEXT: vpunpckhdq {{.*#+}} ymm2 = ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[6],ymm1[6],ymm0[7],ymm1[7]
517 ; BITALG_NOVLX-NEXT: vpsadbw %ymm1, %ymm2, %ymm2
518 ; BITALG_NOVLX-NEXT: vpunpckldq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[4],ymm1[4],ymm0[5],ymm1[5]
519 ; BITALG_NOVLX-NEXT: vpsadbw %ymm1, %ymm0, %ymm0
520 ; BITALG_NOVLX-NEXT: vpackuswb %ymm2, %ymm0, %ymm0
521 ; BITALG_NOVLX-NEXT: retq
523 ; BITALG-LABEL: testv8i32u:
525 ; BITALG-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
526 ; BITALG-NEXT: vpaddd %ymm1, %ymm0, %ymm1
527 ; BITALG-NEXT: vpandn %ymm1, %ymm0, %ymm0
528 ; BITALG-NEXT: vpopcntb %ymm0, %ymm0
529 ; BITALG-NEXT: vpxor %xmm1, %xmm1, %xmm1
530 ; BITALG-NEXT: vpunpckhdq {{.*#+}} ymm2 = ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[6],ymm1[6],ymm0[7],ymm1[7]
531 ; BITALG-NEXT: vpsadbw %ymm1, %ymm2, %ymm2
532 ; BITALG-NEXT: vpunpckldq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[4],ymm1[4],ymm0[5],ymm1[5]
533 ; BITALG-NEXT: vpsadbw %ymm1, %ymm0, %ymm0
534 ; BITALG-NEXT: vpackuswb %ymm2, %ymm0, %ymm0
537 ; X32-AVX-LABEL: testv8i32u:
539 ; X32-AVX-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
540 ; X32-AVX-NEXT: vpaddd %ymm1, %ymm0, %ymm1
541 ; X32-AVX-NEXT: vpandn %ymm1, %ymm0, %ymm0
542 ; X32-AVX-NEXT: vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
543 ; X32-AVX-NEXT: vpand %ymm1, %ymm0, %ymm2
544 ; X32-AVX-NEXT: vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
545 ; X32-AVX-NEXT: # ymm3 = mem[0,1,0,1]
546 ; X32-AVX-NEXT: vpshufb %ymm2, %ymm3, %ymm2
547 ; X32-AVX-NEXT: vpsrlw $4, %ymm0, %ymm0
548 ; X32-AVX-NEXT: vpand %ymm1, %ymm0, %ymm0
549 ; X32-AVX-NEXT: vpshufb %ymm0, %ymm3, %ymm0
550 ; X32-AVX-NEXT: vpaddb %ymm2, %ymm0, %ymm0
551 ; X32-AVX-NEXT: vpxor %xmm1, %xmm1, %xmm1
552 ; X32-AVX-NEXT: vpunpckhdq {{.*#+}} ymm2 = ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[6],ymm1[6],ymm0[7],ymm1[7]
553 ; X32-AVX-NEXT: vpsadbw %ymm1, %ymm2, %ymm2
554 ; X32-AVX-NEXT: vpunpckldq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[4],ymm1[4],ymm0[5],ymm1[5]
555 ; X32-AVX-NEXT: vpsadbw %ymm1, %ymm0, %ymm0
556 ; X32-AVX-NEXT: vpackuswb %ymm2, %ymm0, %ymm0
558 %out = call <8 x i32> @llvm.cttz.v8i32(<8 x i32> %in, i1 -1)
562 define <16 x i16> @testv16i16(<16 x i16> %in) nounwind {
563 ; AVX1-LABEL: testv16i16:
565 ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
566 ; AVX1-NEXT: vpaddw %xmm1, %xmm0, %xmm2
567 ; AVX1-NEXT: vpandn %xmm2, %xmm0, %xmm2
568 ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
569 ; AVX1-NEXT: vpand %xmm3, %xmm2, %xmm4
570 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
571 ; AVX1-NEXT: vpshufb %xmm4, %xmm5, %xmm4
572 ; AVX1-NEXT: vpsrlw $4, %xmm2, %xmm2
573 ; AVX1-NEXT: vpand %xmm3, %xmm2, %xmm2
574 ; AVX1-NEXT: vpshufb %xmm2, %xmm5, %xmm2
575 ; AVX1-NEXT: vpaddb %xmm4, %xmm2, %xmm2
576 ; AVX1-NEXT: vpsllw $8, %xmm2, %xmm4
577 ; AVX1-NEXT: vpaddb %xmm2, %xmm4, %xmm2
578 ; AVX1-NEXT: vpsrlw $8, %xmm2, %xmm2
579 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
580 ; AVX1-NEXT: vpaddw %xmm1, %xmm0, %xmm1
581 ; AVX1-NEXT: vpandn %xmm1, %xmm0, %xmm0
582 ; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm1
583 ; AVX1-NEXT: vpshufb %xmm1, %xmm5, %xmm1
584 ; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm0
585 ; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm0
586 ; AVX1-NEXT: vpshufb %xmm0, %xmm5, %xmm0
587 ; AVX1-NEXT: vpaddb %xmm1, %xmm0, %xmm0
588 ; AVX1-NEXT: vpsllw $8, %xmm0, %xmm1
589 ; AVX1-NEXT: vpaddb %xmm0, %xmm1, %xmm0
590 ; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm0
591 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm2, %ymm0
594 ; AVX2-LABEL: testv16i16:
596 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
597 ; AVX2-NEXT: vpaddw %ymm1, %ymm0, %ymm1
598 ; AVX2-NEXT: vpandn %ymm1, %ymm0, %ymm0
599 ; AVX2-NEXT: vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
600 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm2
601 ; AVX2-NEXT: vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
602 ; AVX2-NEXT: # ymm3 = mem[0,1,0,1]
603 ; AVX2-NEXT: vpshufb %ymm2, %ymm3, %ymm2
604 ; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm0
605 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
606 ; AVX2-NEXT: vpshufb %ymm0, %ymm3, %ymm0
607 ; AVX2-NEXT: vpaddb %ymm2, %ymm0, %ymm0
608 ; AVX2-NEXT: vpsllw $8, %ymm0, %ymm1
609 ; AVX2-NEXT: vpaddb %ymm0, %ymm1, %ymm0
610 ; AVX2-NEXT: vpsrlw $8, %ymm0, %ymm0
613 ; AVX512CDVL-LABEL: testv16i16:
614 ; AVX512CDVL: # %bb.0:
615 ; AVX512CDVL-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
616 ; AVX512CDVL-NEXT: vpaddw %ymm1, %ymm0, %ymm1
617 ; AVX512CDVL-NEXT: vpandn %ymm1, %ymm0, %ymm0
618 ; AVX512CDVL-NEXT: vpbroadcastd {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
619 ; AVX512CDVL-NEXT: vpand %ymm1, %ymm0, %ymm2
620 ; AVX512CDVL-NEXT: vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
621 ; AVX512CDVL-NEXT: # ymm3 = mem[0,1,0,1]
622 ; AVX512CDVL-NEXT: vpshufb %ymm2, %ymm3, %ymm2
623 ; AVX512CDVL-NEXT: vpsrlw $4, %ymm0, %ymm0
624 ; AVX512CDVL-NEXT: vpand %ymm1, %ymm0, %ymm0
625 ; AVX512CDVL-NEXT: vpshufb %ymm0, %ymm3, %ymm0
626 ; AVX512CDVL-NEXT: vpaddb %ymm2, %ymm0, %ymm0
627 ; AVX512CDVL-NEXT: vpsllw $8, %ymm0, %ymm1
628 ; AVX512CDVL-NEXT: vpaddb %ymm0, %ymm1, %ymm0
629 ; AVX512CDVL-NEXT: vpsrlw $8, %ymm0, %ymm0
630 ; AVX512CDVL-NEXT: retq
632 ; AVX512CD-LABEL: testv16i16:
634 ; AVX512CD-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
635 ; AVX512CD-NEXT: vpaddw %ymm1, %ymm0, %ymm1
636 ; AVX512CD-NEXT: vpandn %ymm1, %ymm0, %ymm0
637 ; AVX512CD-NEXT: vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
638 ; AVX512CD-NEXT: vpand %ymm1, %ymm0, %ymm2
639 ; AVX512CD-NEXT: vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
640 ; AVX512CD-NEXT: # ymm3 = mem[0,1,0,1]
641 ; AVX512CD-NEXT: vpshufb %ymm2, %ymm3, %ymm2
642 ; AVX512CD-NEXT: vpsrlw $4, %ymm0, %ymm0
643 ; AVX512CD-NEXT: vpand %ymm1, %ymm0, %ymm0
644 ; AVX512CD-NEXT: vpshufb %ymm0, %ymm3, %ymm0
645 ; AVX512CD-NEXT: vpaddb %ymm2, %ymm0, %ymm0
646 ; AVX512CD-NEXT: vpsllw $8, %ymm0, %ymm1
647 ; AVX512CD-NEXT: vpaddb %ymm0, %ymm1, %ymm0
648 ; AVX512CD-NEXT: vpsrlw $8, %ymm0, %ymm0
649 ; AVX512CD-NEXT: retq
651 ; AVX512VPOPCNTDQ-LABEL: testv16i16:
652 ; AVX512VPOPCNTDQ: # %bb.0:
653 ; AVX512VPOPCNTDQ-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
654 ; AVX512VPOPCNTDQ-NEXT: vpaddw %ymm1, %ymm0, %ymm1
655 ; AVX512VPOPCNTDQ-NEXT: vpandn %ymm1, %ymm0, %ymm0
656 ; AVX512VPOPCNTDQ-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
657 ; AVX512VPOPCNTDQ-NEXT: vpopcntd %zmm0, %zmm0
658 ; AVX512VPOPCNTDQ-NEXT: vpmovdw %zmm0, %ymm0
659 ; AVX512VPOPCNTDQ-NEXT: retq
661 ; AVX512VPOPCNTDQVL-LABEL: testv16i16:
662 ; AVX512VPOPCNTDQVL: # %bb.0:
663 ; AVX512VPOPCNTDQVL-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
664 ; AVX512VPOPCNTDQVL-NEXT: vpaddw %ymm1, %ymm0, %ymm1
665 ; AVX512VPOPCNTDQVL-NEXT: vpandn %ymm1, %ymm0, %ymm0
666 ; AVX512VPOPCNTDQVL-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
667 ; AVX512VPOPCNTDQVL-NEXT: vpopcntd %zmm0, %zmm0
668 ; AVX512VPOPCNTDQVL-NEXT: vpmovdw %zmm0, %ymm0
669 ; AVX512VPOPCNTDQVL-NEXT: retq
671 ; BITALG_NOVLX-LABEL: testv16i16:
672 ; BITALG_NOVLX: # %bb.0:
673 ; BITALG_NOVLX-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
674 ; BITALG_NOVLX-NEXT: vpaddw %ymm1, %ymm0, %ymm1
675 ; BITALG_NOVLX-NEXT: vpandn %ymm1, %ymm0, %ymm0
676 ; BITALG_NOVLX-NEXT: vpopcntw %zmm0, %zmm0
677 ; BITALG_NOVLX-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0
678 ; BITALG_NOVLX-NEXT: retq
680 ; BITALG-LABEL: testv16i16:
682 ; BITALG-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
683 ; BITALG-NEXT: vpaddw %ymm1, %ymm0, %ymm1
684 ; BITALG-NEXT: vpandn %ymm1, %ymm0, %ymm0
685 ; BITALG-NEXT: vpopcntw %ymm0, %ymm0
688 ; X32-AVX-LABEL: testv16i16:
690 ; X32-AVX-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
691 ; X32-AVX-NEXT: vpaddw %ymm1, %ymm0, %ymm1
692 ; X32-AVX-NEXT: vpandn %ymm1, %ymm0, %ymm0
693 ; X32-AVX-NEXT: vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
694 ; X32-AVX-NEXT: vpand %ymm1, %ymm0, %ymm2
695 ; X32-AVX-NEXT: vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
696 ; X32-AVX-NEXT: # ymm3 = mem[0,1,0,1]
697 ; X32-AVX-NEXT: vpshufb %ymm2, %ymm3, %ymm2
698 ; X32-AVX-NEXT: vpsrlw $4, %ymm0, %ymm0
699 ; X32-AVX-NEXT: vpand %ymm1, %ymm0, %ymm0
700 ; X32-AVX-NEXT: vpshufb %ymm0, %ymm3, %ymm0
701 ; X32-AVX-NEXT: vpaddb %ymm2, %ymm0, %ymm0
702 ; X32-AVX-NEXT: vpsllw $8, %ymm0, %ymm1
703 ; X32-AVX-NEXT: vpaddb %ymm0, %ymm1, %ymm0
704 ; X32-AVX-NEXT: vpsrlw $8, %ymm0, %ymm0
706 %out = call <16 x i16> @llvm.cttz.v16i16(<16 x i16> %in, i1 0)
710 define <16 x i16> @testv16i16u(<16 x i16> %in) nounwind {
711 ; AVX1-LABEL: testv16i16u:
713 ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
714 ; AVX1-NEXT: vpaddw %xmm1, %xmm0, %xmm2
715 ; AVX1-NEXT: vpandn %xmm2, %xmm0, %xmm2
716 ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
717 ; AVX1-NEXT: vpand %xmm3, %xmm2, %xmm4
718 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
719 ; AVX1-NEXT: vpshufb %xmm4, %xmm5, %xmm4
720 ; AVX1-NEXT: vpsrlw $4, %xmm2, %xmm2
721 ; AVX1-NEXT: vpand %xmm3, %xmm2, %xmm2
722 ; AVX1-NEXT: vpshufb %xmm2, %xmm5, %xmm2
723 ; AVX1-NEXT: vpaddb %xmm4, %xmm2, %xmm2
724 ; AVX1-NEXT: vpsllw $8, %xmm2, %xmm4
725 ; AVX1-NEXT: vpaddb %xmm2, %xmm4, %xmm2
726 ; AVX1-NEXT: vpsrlw $8, %xmm2, %xmm2
727 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
728 ; AVX1-NEXT: vpaddw %xmm1, %xmm0, %xmm1
729 ; AVX1-NEXT: vpandn %xmm1, %xmm0, %xmm0
730 ; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm1
731 ; AVX1-NEXT: vpshufb %xmm1, %xmm5, %xmm1
732 ; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm0
733 ; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm0
734 ; AVX1-NEXT: vpshufb %xmm0, %xmm5, %xmm0
735 ; AVX1-NEXT: vpaddb %xmm1, %xmm0, %xmm0
736 ; AVX1-NEXT: vpsllw $8, %xmm0, %xmm1
737 ; AVX1-NEXT: vpaddb %xmm0, %xmm1, %xmm0
738 ; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm0
739 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm2, %ymm0
742 ; AVX2-LABEL: testv16i16u:
744 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
745 ; AVX2-NEXT: vpaddw %ymm1, %ymm0, %ymm1
746 ; AVX2-NEXT: vpandn %ymm1, %ymm0, %ymm0
747 ; AVX2-NEXT: vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
748 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm2
749 ; AVX2-NEXT: vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
750 ; AVX2-NEXT: # ymm3 = mem[0,1,0,1]
751 ; AVX2-NEXT: vpshufb %ymm2, %ymm3, %ymm2
752 ; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm0
753 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
754 ; AVX2-NEXT: vpshufb %ymm0, %ymm3, %ymm0
755 ; AVX2-NEXT: vpaddb %ymm2, %ymm0, %ymm0
756 ; AVX2-NEXT: vpsllw $8, %ymm0, %ymm1
757 ; AVX2-NEXT: vpaddb %ymm0, %ymm1, %ymm0
758 ; AVX2-NEXT: vpsrlw $8, %ymm0, %ymm0
761 ; AVX512CDVL-LABEL: testv16i16u:
762 ; AVX512CDVL: # %bb.0:
763 ; AVX512CDVL-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
764 ; AVX512CDVL-NEXT: vpaddw %ymm1, %ymm0, %ymm1
765 ; AVX512CDVL-NEXT: vpandn %ymm1, %ymm0, %ymm0
766 ; AVX512CDVL-NEXT: vpbroadcastd {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
767 ; AVX512CDVL-NEXT: vpand %ymm1, %ymm0, %ymm2
768 ; AVX512CDVL-NEXT: vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
769 ; AVX512CDVL-NEXT: # ymm3 = mem[0,1,0,1]
770 ; AVX512CDVL-NEXT: vpshufb %ymm2, %ymm3, %ymm2
771 ; AVX512CDVL-NEXT: vpsrlw $4, %ymm0, %ymm0
772 ; AVX512CDVL-NEXT: vpand %ymm1, %ymm0, %ymm0
773 ; AVX512CDVL-NEXT: vpshufb %ymm0, %ymm3, %ymm0
774 ; AVX512CDVL-NEXT: vpaddb %ymm2, %ymm0, %ymm0
775 ; AVX512CDVL-NEXT: vpsllw $8, %ymm0, %ymm1
776 ; AVX512CDVL-NEXT: vpaddb %ymm0, %ymm1, %ymm0
777 ; AVX512CDVL-NEXT: vpsrlw $8, %ymm0, %ymm0
778 ; AVX512CDVL-NEXT: retq
780 ; AVX512CD-LABEL: testv16i16u:
782 ; AVX512CD-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
783 ; AVX512CD-NEXT: vpaddw %ymm1, %ymm0, %ymm1
784 ; AVX512CD-NEXT: vpandn %ymm1, %ymm0, %ymm0
785 ; AVX512CD-NEXT: vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
786 ; AVX512CD-NEXT: vpand %ymm1, %ymm0, %ymm2
787 ; AVX512CD-NEXT: vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
788 ; AVX512CD-NEXT: # ymm3 = mem[0,1,0,1]
789 ; AVX512CD-NEXT: vpshufb %ymm2, %ymm3, %ymm2
790 ; AVX512CD-NEXT: vpsrlw $4, %ymm0, %ymm0
791 ; AVX512CD-NEXT: vpand %ymm1, %ymm0, %ymm0
792 ; AVX512CD-NEXT: vpshufb %ymm0, %ymm3, %ymm0
793 ; AVX512CD-NEXT: vpaddb %ymm2, %ymm0, %ymm0
794 ; AVX512CD-NEXT: vpsllw $8, %ymm0, %ymm1
795 ; AVX512CD-NEXT: vpaddb %ymm0, %ymm1, %ymm0
796 ; AVX512CD-NEXT: vpsrlw $8, %ymm0, %ymm0
797 ; AVX512CD-NEXT: retq
799 ; AVX512VPOPCNTDQ-LABEL: testv16i16u:
800 ; AVX512VPOPCNTDQ: # %bb.0:
801 ; AVX512VPOPCNTDQ-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
802 ; AVX512VPOPCNTDQ-NEXT: vpaddw %ymm1, %ymm0, %ymm1
803 ; AVX512VPOPCNTDQ-NEXT: vpandn %ymm1, %ymm0, %ymm0
804 ; AVX512VPOPCNTDQ-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
805 ; AVX512VPOPCNTDQ-NEXT: vpopcntd %zmm0, %zmm0
806 ; AVX512VPOPCNTDQ-NEXT: vpmovdw %zmm0, %ymm0
807 ; AVX512VPOPCNTDQ-NEXT: retq
809 ; AVX512VPOPCNTDQVL-LABEL: testv16i16u:
810 ; AVX512VPOPCNTDQVL: # %bb.0:
811 ; AVX512VPOPCNTDQVL-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
812 ; AVX512VPOPCNTDQVL-NEXT: vpaddw %ymm1, %ymm0, %ymm1
813 ; AVX512VPOPCNTDQVL-NEXT: vpandn %ymm1, %ymm0, %ymm0
814 ; AVX512VPOPCNTDQVL-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
815 ; AVX512VPOPCNTDQVL-NEXT: vpopcntd %zmm0, %zmm0
816 ; AVX512VPOPCNTDQVL-NEXT: vpmovdw %zmm0, %ymm0
817 ; AVX512VPOPCNTDQVL-NEXT: retq
819 ; BITALG_NOVLX-LABEL: testv16i16u:
820 ; BITALG_NOVLX: # %bb.0:
821 ; BITALG_NOVLX-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
822 ; BITALG_NOVLX-NEXT: vpaddw %ymm1, %ymm0, %ymm1
823 ; BITALG_NOVLX-NEXT: vpandn %ymm1, %ymm0, %ymm0
824 ; BITALG_NOVLX-NEXT: vpopcntw %zmm0, %zmm0
825 ; BITALG_NOVLX-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0
826 ; BITALG_NOVLX-NEXT: retq
828 ; BITALG-LABEL: testv16i16u:
830 ; BITALG-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
831 ; BITALG-NEXT: vpaddw %ymm1, %ymm0, %ymm1
832 ; BITALG-NEXT: vpandn %ymm1, %ymm0, %ymm0
833 ; BITALG-NEXT: vpopcntw %ymm0, %ymm0
836 ; X32-AVX-LABEL: testv16i16u:
838 ; X32-AVX-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
839 ; X32-AVX-NEXT: vpaddw %ymm1, %ymm0, %ymm1
840 ; X32-AVX-NEXT: vpandn %ymm1, %ymm0, %ymm0
841 ; X32-AVX-NEXT: vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
842 ; X32-AVX-NEXT: vpand %ymm1, %ymm0, %ymm2
843 ; X32-AVX-NEXT: vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
844 ; X32-AVX-NEXT: # ymm3 = mem[0,1,0,1]
845 ; X32-AVX-NEXT: vpshufb %ymm2, %ymm3, %ymm2
846 ; X32-AVX-NEXT: vpsrlw $4, %ymm0, %ymm0
847 ; X32-AVX-NEXT: vpand %ymm1, %ymm0, %ymm0
848 ; X32-AVX-NEXT: vpshufb %ymm0, %ymm3, %ymm0
849 ; X32-AVX-NEXT: vpaddb %ymm2, %ymm0, %ymm0
850 ; X32-AVX-NEXT: vpsllw $8, %ymm0, %ymm1
851 ; X32-AVX-NEXT: vpaddb %ymm0, %ymm1, %ymm0
852 ; X32-AVX-NEXT: vpsrlw $8, %ymm0, %ymm0
854 %out = call <16 x i16> @llvm.cttz.v16i16(<16 x i16> %in, i1 -1)
858 define <32 x i8> @testv32i8(<32 x i8> %in) nounwind {
859 ; AVX1-LABEL: testv32i8:
861 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
862 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
863 ; AVX1-NEXT: vpaddb %xmm2, %xmm1, %xmm3
864 ; AVX1-NEXT: vpandn %xmm3, %xmm1, %xmm1
865 ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
866 ; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm4
867 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
868 ; AVX1-NEXT: vpshufb %xmm4, %xmm5, %xmm4
869 ; AVX1-NEXT: vpsrlw $4, %xmm1, %xmm1
870 ; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm1
871 ; AVX1-NEXT: vpshufb %xmm1, %xmm5, %xmm1
872 ; AVX1-NEXT: vpaddb %xmm4, %xmm1, %xmm1
873 ; AVX1-NEXT: vpaddb %xmm2, %xmm0, %xmm2
874 ; AVX1-NEXT: vpandn %xmm2, %xmm0, %xmm0
875 ; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm2
876 ; AVX1-NEXT: vpshufb %xmm2, %xmm5, %xmm2
877 ; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm0
878 ; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm0
879 ; AVX1-NEXT: vpshufb %xmm0, %xmm5, %xmm0
880 ; AVX1-NEXT: vpaddb %xmm2, %xmm0, %xmm0
881 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
884 ; AVX2-LABEL: testv32i8:
886 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
887 ; AVX2-NEXT: vpaddb %ymm1, %ymm0, %ymm1
888 ; AVX2-NEXT: vpandn %ymm1, %ymm0, %ymm0
889 ; AVX2-NEXT: vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
890 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm2
891 ; AVX2-NEXT: vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
892 ; AVX2-NEXT: # ymm3 = mem[0,1,0,1]
893 ; AVX2-NEXT: vpshufb %ymm2, %ymm3, %ymm2
894 ; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm0
895 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
896 ; AVX2-NEXT: vpshufb %ymm0, %ymm3, %ymm0
897 ; AVX2-NEXT: vpaddb %ymm2, %ymm0, %ymm0
900 ; AVX512CDVL-LABEL: testv32i8:
901 ; AVX512CDVL: # %bb.0:
902 ; AVX512CDVL-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
903 ; AVX512CDVL-NEXT: vpaddb %ymm1, %ymm0, %ymm1
904 ; AVX512CDVL-NEXT: vpandn %ymm1, %ymm0, %ymm0
905 ; AVX512CDVL-NEXT: vpbroadcastd {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
906 ; AVX512CDVL-NEXT: vpand %ymm1, %ymm0, %ymm2
907 ; AVX512CDVL-NEXT: vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
908 ; AVX512CDVL-NEXT: # ymm3 = mem[0,1,0,1]
909 ; AVX512CDVL-NEXT: vpshufb %ymm2, %ymm3, %ymm2
910 ; AVX512CDVL-NEXT: vpsrlw $4, %ymm0, %ymm0
911 ; AVX512CDVL-NEXT: vpand %ymm1, %ymm0, %ymm0
912 ; AVX512CDVL-NEXT: vpshufb %ymm0, %ymm3, %ymm0
913 ; AVX512CDVL-NEXT: vpaddb %ymm2, %ymm0, %ymm0
914 ; AVX512CDVL-NEXT: retq
916 ; AVX512CD-LABEL: testv32i8:
918 ; AVX512CD-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
919 ; AVX512CD-NEXT: vpaddb %ymm1, %ymm0, %ymm1
920 ; AVX512CD-NEXT: vpandn %ymm1, %ymm0, %ymm0
921 ; AVX512CD-NEXT: vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
922 ; AVX512CD-NEXT: vpand %ymm1, %ymm0, %ymm2
923 ; AVX512CD-NEXT: vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
924 ; AVX512CD-NEXT: # ymm3 = mem[0,1,0,1]
925 ; AVX512CD-NEXT: vpshufb %ymm2, %ymm3, %ymm2
926 ; AVX512CD-NEXT: vpsrlw $4, %ymm0, %ymm0
927 ; AVX512CD-NEXT: vpand %ymm1, %ymm0, %ymm0
928 ; AVX512CD-NEXT: vpshufb %ymm0, %ymm3, %ymm0
929 ; AVX512CD-NEXT: vpaddb %ymm2, %ymm0, %ymm0
930 ; AVX512CD-NEXT: retq
932 ; AVX512VPOPCNTDQ-LABEL: testv32i8:
933 ; AVX512VPOPCNTDQ: # %bb.0:
934 ; AVX512VPOPCNTDQ-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
935 ; AVX512VPOPCNTDQ-NEXT: vpaddb %ymm1, %ymm0, %ymm1
936 ; AVX512VPOPCNTDQ-NEXT: vpandn %ymm1, %ymm0, %ymm0
937 ; AVX512VPOPCNTDQ-NEXT: vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
938 ; AVX512VPOPCNTDQ-NEXT: vpand %ymm1, %ymm0, %ymm2
939 ; AVX512VPOPCNTDQ-NEXT: vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
940 ; AVX512VPOPCNTDQ-NEXT: # ymm3 = mem[0,1,0,1]
941 ; AVX512VPOPCNTDQ-NEXT: vpshufb %ymm2, %ymm3, %ymm2
942 ; AVX512VPOPCNTDQ-NEXT: vpsrlw $4, %ymm0, %ymm0
943 ; AVX512VPOPCNTDQ-NEXT: vpand %ymm1, %ymm0, %ymm0
944 ; AVX512VPOPCNTDQ-NEXT: vpshufb %ymm0, %ymm3, %ymm0
945 ; AVX512VPOPCNTDQ-NEXT: vpaddb %ymm2, %ymm0, %ymm0
946 ; AVX512VPOPCNTDQ-NEXT: retq
948 ; AVX512VPOPCNTDQVL-LABEL: testv32i8:
949 ; AVX512VPOPCNTDQVL: # %bb.0:
950 ; AVX512VPOPCNTDQVL-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
951 ; AVX512VPOPCNTDQVL-NEXT: vpaddb %ymm1, %ymm0, %ymm1
952 ; AVX512VPOPCNTDQVL-NEXT: vpandn %ymm1, %ymm0, %ymm0
953 ; AVX512VPOPCNTDQVL-NEXT: vpbroadcastd {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
954 ; AVX512VPOPCNTDQVL-NEXT: vpand %ymm1, %ymm0, %ymm2
955 ; AVX512VPOPCNTDQVL-NEXT: vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
956 ; AVX512VPOPCNTDQVL-NEXT: # ymm3 = mem[0,1,0,1]
957 ; AVX512VPOPCNTDQVL-NEXT: vpshufb %ymm2, %ymm3, %ymm2
958 ; AVX512VPOPCNTDQVL-NEXT: vpsrlw $4, %ymm0, %ymm0
959 ; AVX512VPOPCNTDQVL-NEXT: vpand %ymm1, %ymm0, %ymm0
960 ; AVX512VPOPCNTDQVL-NEXT: vpshufb %ymm0, %ymm3, %ymm0
961 ; AVX512VPOPCNTDQVL-NEXT: vpaddb %ymm2, %ymm0, %ymm0
962 ; AVX512VPOPCNTDQVL-NEXT: retq
964 ; BITALG_NOVLX-LABEL: testv32i8:
965 ; BITALG_NOVLX: # %bb.0:
966 ; BITALG_NOVLX-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
967 ; BITALG_NOVLX-NEXT: vpaddb %ymm1, %ymm0, %ymm1
968 ; BITALG_NOVLX-NEXT: vpandn %ymm1, %ymm0, %ymm0
969 ; BITALG_NOVLX-NEXT: vpopcntb %zmm0, %zmm0
970 ; BITALG_NOVLX-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0
971 ; BITALG_NOVLX-NEXT: retq
973 ; BITALG-LABEL: testv32i8:
975 ; BITALG-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
976 ; BITALG-NEXT: vpaddb %ymm1, %ymm0, %ymm1
977 ; BITALG-NEXT: vpandn %ymm1, %ymm0, %ymm0
978 ; BITALG-NEXT: vpopcntb %ymm0, %ymm0
981 ; X32-AVX-LABEL: testv32i8:
983 ; X32-AVX-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
984 ; X32-AVX-NEXT: vpaddb %ymm1, %ymm0, %ymm1
985 ; X32-AVX-NEXT: vpandn %ymm1, %ymm0, %ymm0
986 ; X32-AVX-NEXT: vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
987 ; X32-AVX-NEXT: vpand %ymm1, %ymm0, %ymm2
988 ; X32-AVX-NEXT: vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
989 ; X32-AVX-NEXT: # ymm3 = mem[0,1,0,1]
990 ; X32-AVX-NEXT: vpshufb %ymm2, %ymm3, %ymm2
991 ; X32-AVX-NEXT: vpsrlw $4, %ymm0, %ymm0
992 ; X32-AVX-NEXT: vpand %ymm1, %ymm0, %ymm0
993 ; X32-AVX-NEXT: vpshufb %ymm0, %ymm3, %ymm0
994 ; X32-AVX-NEXT: vpaddb %ymm2, %ymm0, %ymm0
996 %out = call <32 x i8> @llvm.cttz.v32i8(<32 x i8> %in, i1 0)
1000 define <32 x i8> @testv32i8u(<32 x i8> %in) nounwind {
1001 ; AVX1-LABEL: testv32i8u:
1003 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
1004 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
1005 ; AVX1-NEXT: vpaddb %xmm2, %xmm1, %xmm3
1006 ; AVX1-NEXT: vpandn %xmm3, %xmm1, %xmm1
1007 ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1008 ; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm4
1009 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
1010 ; AVX1-NEXT: vpshufb %xmm4, %xmm5, %xmm4
1011 ; AVX1-NEXT: vpsrlw $4, %xmm1, %xmm1
1012 ; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm1
1013 ; AVX1-NEXT: vpshufb %xmm1, %xmm5, %xmm1
1014 ; AVX1-NEXT: vpaddb %xmm4, %xmm1, %xmm1
1015 ; AVX1-NEXT: vpaddb %xmm2, %xmm0, %xmm2
1016 ; AVX1-NEXT: vpandn %xmm2, %xmm0, %xmm0
1017 ; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm2
1018 ; AVX1-NEXT: vpshufb %xmm2, %xmm5, %xmm2
1019 ; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm0
1020 ; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm0
1021 ; AVX1-NEXT: vpshufb %xmm0, %xmm5, %xmm0
1022 ; AVX1-NEXT: vpaddb %xmm2, %xmm0, %xmm0
1023 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
1026 ; AVX2-LABEL: testv32i8u:
1028 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
1029 ; AVX2-NEXT: vpaddb %ymm1, %ymm0, %ymm1
1030 ; AVX2-NEXT: vpandn %ymm1, %ymm0, %ymm0
1031 ; AVX2-NEXT: vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1032 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm2
1033 ; AVX2-NEXT: vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
1034 ; AVX2-NEXT: # ymm3 = mem[0,1,0,1]
1035 ; AVX2-NEXT: vpshufb %ymm2, %ymm3, %ymm2
1036 ; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm0
1037 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
1038 ; AVX2-NEXT: vpshufb %ymm0, %ymm3, %ymm0
1039 ; AVX2-NEXT: vpaddb %ymm2, %ymm0, %ymm0
1042 ; AVX512CDVL-LABEL: testv32i8u:
1043 ; AVX512CDVL: # %bb.0:
1044 ; AVX512CDVL-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
1045 ; AVX512CDVL-NEXT: vpaddb %ymm1, %ymm0, %ymm1
1046 ; AVX512CDVL-NEXT: vpandn %ymm1, %ymm0, %ymm0
1047 ; AVX512CDVL-NEXT: vpbroadcastd {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1048 ; AVX512CDVL-NEXT: vpand %ymm1, %ymm0, %ymm2
1049 ; AVX512CDVL-NEXT: vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
1050 ; AVX512CDVL-NEXT: # ymm3 = mem[0,1,0,1]
1051 ; AVX512CDVL-NEXT: vpshufb %ymm2, %ymm3, %ymm2
1052 ; AVX512CDVL-NEXT: vpsrlw $4, %ymm0, %ymm0
1053 ; AVX512CDVL-NEXT: vpand %ymm1, %ymm0, %ymm0
1054 ; AVX512CDVL-NEXT: vpshufb %ymm0, %ymm3, %ymm0
1055 ; AVX512CDVL-NEXT: vpaddb %ymm2, %ymm0, %ymm0
1056 ; AVX512CDVL-NEXT: retq
1058 ; AVX512CD-LABEL: testv32i8u:
1059 ; AVX512CD: # %bb.0:
1060 ; AVX512CD-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
1061 ; AVX512CD-NEXT: vpaddb %ymm1, %ymm0, %ymm1
1062 ; AVX512CD-NEXT: vpandn %ymm1, %ymm0, %ymm0
1063 ; AVX512CD-NEXT: vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1064 ; AVX512CD-NEXT: vpand %ymm1, %ymm0, %ymm2
1065 ; AVX512CD-NEXT: vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
1066 ; AVX512CD-NEXT: # ymm3 = mem[0,1,0,1]
1067 ; AVX512CD-NEXT: vpshufb %ymm2, %ymm3, %ymm2
1068 ; AVX512CD-NEXT: vpsrlw $4, %ymm0, %ymm0
1069 ; AVX512CD-NEXT: vpand %ymm1, %ymm0, %ymm0
1070 ; AVX512CD-NEXT: vpshufb %ymm0, %ymm3, %ymm0
1071 ; AVX512CD-NEXT: vpaddb %ymm2, %ymm0, %ymm0
1072 ; AVX512CD-NEXT: retq
1074 ; AVX512VPOPCNTDQ-LABEL: testv32i8u:
1075 ; AVX512VPOPCNTDQ: # %bb.0:
1076 ; AVX512VPOPCNTDQ-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
1077 ; AVX512VPOPCNTDQ-NEXT: vpaddb %ymm1, %ymm0, %ymm1
1078 ; AVX512VPOPCNTDQ-NEXT: vpandn %ymm1, %ymm0, %ymm0
1079 ; AVX512VPOPCNTDQ-NEXT: vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1080 ; AVX512VPOPCNTDQ-NEXT: vpand %ymm1, %ymm0, %ymm2
1081 ; AVX512VPOPCNTDQ-NEXT: vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
1082 ; AVX512VPOPCNTDQ-NEXT: # ymm3 = mem[0,1,0,1]
1083 ; AVX512VPOPCNTDQ-NEXT: vpshufb %ymm2, %ymm3, %ymm2
1084 ; AVX512VPOPCNTDQ-NEXT: vpsrlw $4, %ymm0, %ymm0
1085 ; AVX512VPOPCNTDQ-NEXT: vpand %ymm1, %ymm0, %ymm0
1086 ; AVX512VPOPCNTDQ-NEXT: vpshufb %ymm0, %ymm3, %ymm0
1087 ; AVX512VPOPCNTDQ-NEXT: vpaddb %ymm2, %ymm0, %ymm0
1088 ; AVX512VPOPCNTDQ-NEXT: retq
1090 ; AVX512VPOPCNTDQVL-LABEL: testv32i8u:
1091 ; AVX512VPOPCNTDQVL: # %bb.0:
1092 ; AVX512VPOPCNTDQVL-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
1093 ; AVX512VPOPCNTDQVL-NEXT: vpaddb %ymm1, %ymm0, %ymm1
1094 ; AVX512VPOPCNTDQVL-NEXT: vpandn %ymm1, %ymm0, %ymm0
1095 ; AVX512VPOPCNTDQVL-NEXT: vpbroadcastd {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1096 ; AVX512VPOPCNTDQVL-NEXT: vpand %ymm1, %ymm0, %ymm2
1097 ; AVX512VPOPCNTDQVL-NEXT: vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
1098 ; AVX512VPOPCNTDQVL-NEXT: # ymm3 = mem[0,1,0,1]
1099 ; AVX512VPOPCNTDQVL-NEXT: vpshufb %ymm2, %ymm3, %ymm2
1100 ; AVX512VPOPCNTDQVL-NEXT: vpsrlw $4, %ymm0, %ymm0
1101 ; AVX512VPOPCNTDQVL-NEXT: vpand %ymm1, %ymm0, %ymm0
1102 ; AVX512VPOPCNTDQVL-NEXT: vpshufb %ymm0, %ymm3, %ymm0
1103 ; AVX512VPOPCNTDQVL-NEXT: vpaddb %ymm2, %ymm0, %ymm0
1104 ; AVX512VPOPCNTDQVL-NEXT: retq
1106 ; BITALG_NOVLX-LABEL: testv32i8u:
1107 ; BITALG_NOVLX: # %bb.0:
1108 ; BITALG_NOVLX-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
1109 ; BITALG_NOVLX-NEXT: vpaddb %ymm1, %ymm0, %ymm1
1110 ; BITALG_NOVLX-NEXT: vpandn %ymm1, %ymm0, %ymm0
1111 ; BITALG_NOVLX-NEXT: vpopcntb %zmm0, %zmm0
1112 ; BITALG_NOVLX-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0
1113 ; BITALG_NOVLX-NEXT: retq
1115 ; BITALG-LABEL: testv32i8u:
1117 ; BITALG-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
1118 ; BITALG-NEXT: vpaddb %ymm1, %ymm0, %ymm1
1119 ; BITALG-NEXT: vpandn %ymm1, %ymm0, %ymm0
1120 ; BITALG-NEXT: vpopcntb %ymm0, %ymm0
1123 ; X32-AVX-LABEL: testv32i8u:
1125 ; X32-AVX-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
1126 ; X32-AVX-NEXT: vpaddb %ymm1, %ymm0, %ymm1
1127 ; X32-AVX-NEXT: vpandn %ymm1, %ymm0, %ymm0
1128 ; X32-AVX-NEXT: vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1129 ; X32-AVX-NEXT: vpand %ymm1, %ymm0, %ymm2
1130 ; X32-AVX-NEXT: vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
1131 ; X32-AVX-NEXT: # ymm3 = mem[0,1,0,1]
1132 ; X32-AVX-NEXT: vpshufb %ymm2, %ymm3, %ymm2
1133 ; X32-AVX-NEXT: vpsrlw $4, %ymm0, %ymm0
1134 ; X32-AVX-NEXT: vpand %ymm1, %ymm0, %ymm0
1135 ; X32-AVX-NEXT: vpshufb %ymm0, %ymm3, %ymm0
1136 ; X32-AVX-NEXT: vpaddb %ymm2, %ymm0, %ymm0
1137 ; X32-AVX-NEXT: retl
1138 %out = call <32 x i8> @llvm.cttz.v32i8(<32 x i8> %in, i1 -1)
1142 define <4 x i64> @foldv4i64() nounwind {
1143 ; AVX-LABEL: foldv4i64:
1145 ; AVX-NEXT: vmovaps {{.*#+}} ymm0 = [8,0,64,0]
1148 ; BITALG_NOVLX-LABEL: foldv4i64:
1149 ; BITALG_NOVLX: # %bb.0:
1150 ; BITALG_NOVLX-NEXT: vmovaps {{.*#+}} ymm0 = [8,0,64,0]
1151 ; BITALG_NOVLX-NEXT: retq
1153 ; BITALG-LABEL: foldv4i64:
1155 ; BITALG-NEXT: vmovaps {{.*#+}} ymm0 = [8,0,64,0]
1158 ; X32-AVX-LABEL: foldv4i64:
1160 ; X32-AVX-NEXT: vmovaps {{.*#+}} ymm0 = [8,0,0,0,64,0,0,0]
1161 ; X32-AVX-NEXT: retl
1162 %out = call <4 x i64> @llvm.cttz.v4i64(<4 x i64> <i64 256, i64 -1, i64 0, i64 255>, i1 0)
1166 define <4 x i64> @foldv4i64u() nounwind {
1167 ; AVX-LABEL: foldv4i64u:
1169 ; AVX-NEXT: vmovaps {{.*#+}} ymm0 = [8,0,64,0]
1172 ; BITALG_NOVLX-LABEL: foldv4i64u:
1173 ; BITALG_NOVLX: # %bb.0:
1174 ; BITALG_NOVLX-NEXT: vmovaps {{.*#+}} ymm0 = [8,0,64,0]
1175 ; BITALG_NOVLX-NEXT: retq
1177 ; BITALG-LABEL: foldv4i64u:
1179 ; BITALG-NEXT: vmovaps {{.*#+}} ymm0 = [8,0,64,0]
1182 ; X32-AVX-LABEL: foldv4i64u:
1184 ; X32-AVX-NEXT: vmovaps {{.*#+}} ymm0 = [8,0,0,0,64,0,0,0]
1185 ; X32-AVX-NEXT: retl
1186 %out = call <4 x i64> @llvm.cttz.v4i64(<4 x i64> <i64 256, i64 -1, i64 0, i64 255>, i1 -1)
1190 define <8 x i32> @foldv8i32() nounwind {
1191 ; ALL-LABEL: foldv8i32:
1193 ; ALL-NEXT: vmovaps {{.*#+}} ymm0 = [8,0,32,0,16,0,3,3]
1194 ; ALL-NEXT: ret{{[l|q]}}
1195 %out = call <8 x i32> @llvm.cttz.v8i32(<8 x i32> <i32 256, i32 -1, i32 0, i32 255, i32 -65536, i32 7, i32 24, i32 88>, i1 0)
1199 define <8 x i32> @foldv8i32u() nounwind {
1200 ; ALL-LABEL: foldv8i32u:
1202 ; ALL-NEXT: vmovaps {{.*#+}} ymm0 = [8,0,32,0,16,0,3,3]
1203 ; ALL-NEXT: ret{{[l|q]}}
1204 %out = call <8 x i32> @llvm.cttz.v8i32(<8 x i32> <i32 256, i32 -1, i32 0, i32 255, i32 -65536, i32 7, i32 24, i32 88>, i1 -1)
1208 define <16 x i16> @foldv16i16() nounwind {
1209 ; ALL-LABEL: foldv16i16:
1211 ; ALL-NEXT: vmovaps {{.*#+}} ymm0 = [8,0,16,0,16,0,3,3,1,1,0,1,2,3,4,5]
1212 ; ALL-NEXT: ret{{[l|q]}}
1213 %out = call <16 x i16> @llvm.cttz.v16i16(<16 x i16> <i16 256, i16 -1, i16 0, i16 255, i16 -65536, i16 7, i16 24, i16 88, i16 -2, i16 254, i16 1, i16 2, i16 4, i16 8, i16 16, i16 32>, i1 0)
1217 define <16 x i16> @foldv16i16u() nounwind {
1218 ; ALL-LABEL: foldv16i16u:
1220 ; ALL-NEXT: vmovaps {{.*#+}} ymm0 = [8,0,16,0,16,0,3,3,1,1,0,1,2,3,4,5]
1221 ; ALL-NEXT: ret{{[l|q]}}
1222 %out = call <16 x i16> @llvm.cttz.v16i16(<16 x i16> <i16 256, i16 -1, i16 0, i16 255, i16 -65536, i16 7, i16 24, i16 88, i16 -2, i16 254, i16 1, i16 2, i16 4, i16 8, i16 16, i16 32>, i1 -1)
1226 define <32 x i8> @foldv32i8() nounwind {
1227 ; ALL-LABEL: foldv32i8:
1229 ; ALL-NEXT: vmovaps {{.*#+}} ymm0 = [8,0,8,0,8,0,3,3,1,1,0,1,2,3,4,5,6,7,8,8,7,6,5,4,3,2,1,0,0,0,0,0]
1230 ; ALL-NEXT: ret{{[l|q]}}
1231 %out = call <32 x i8> @llvm.cttz.v32i8(<32 x i8> <i8 256, i8 -1, i8 0, i8 255, i8 -65536, i8 7, i8 24, i8 88, i8 -2, i8 254, i8 1, i8 2, i8 4, i8 8, i8 16, i8 32, i8 64, i8 128, i8 256, i8 -256, i8 -128, i8 -64, i8 -32, i8 -16, i8 -8, i8 -4, i8 -2, i8 -1, i8 3, i8 5, i8 7, i8 127>, i1 0)
1235 define <32 x i8> @foldv32i8u() nounwind {
1236 ; ALL-LABEL: foldv32i8u:
1238 ; ALL-NEXT: vmovaps {{.*#+}} ymm0 = [8,0,8,0,8,0,3,3,1,1,0,1,2,3,4,5,6,7,8,8,7,6,5,4,3,2,1,0,0,0,0,0]
1239 ; ALL-NEXT: ret{{[l|q]}}
1240 %out = call <32 x i8> @llvm.cttz.v32i8(<32 x i8> <i8 256, i8 -1, i8 0, i8 255, i8 -65536, i8 7, i8 24, i8 88, i8 -2, i8 254, i8 1, i8 2, i8 4, i8 8, i8 16, i8 32, i8 64, i8 128, i8 256, i8 -256, i8 -128, i8 -64, i8 -32, i8 -16, i8 -8, i8 -4, i8 -2, i8 -1, i8 3, i8 5, i8 7, i8 127>, i1 -1)
1244 declare <4 x i64> @llvm.cttz.v4i64(<4 x i64>, i1)
1245 declare <8 x i32> @llvm.cttz.v8i32(<8 x i32>, i1)
1246 declare <16 x i16> @llvm.cttz.v16i16(<16 x i16>, i1)
1247 declare <32 x i8> @llvm.cttz.v32i8(<32 x i8>, i1)