Re-land [openmp] Fix warnings when building on Windows with latest MSVC or Clang...
[llvm-project.git] / llvm / test / CodeGen / RISCV / rvv / ctpop-vp.ll
blob2310f85b1fba93236da0b301cf63e86414e71901
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv32 -mattr=+d,+zfh,+zvfh,+v,+m -target-abi=ilp32d \
3 ; RUN:     -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV32
4 ; RUN: llc -mtriple=riscv64 -mattr=+d,+zfh,+zvfh,+v,+m -target-abi=lp64d \
5 ; RUN:     -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV64
6 ; RUN: llc -mtriple=riscv32 -mattr=+v,+zvbb,+m -target-abi=ilp32d \
7 ; RUN:     -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK-ZVBB
8 ; RUN: llc -mtriple=riscv64 -mattr=+v,+zvbb,+m -target-abi=lp64d \
9 ; RUN:     -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK-ZVBB
11 declare <vscale x 1 x i8> @llvm.vp.ctpop.nxv1i8(<vscale x 1 x i8>, <vscale x 1 x i1>, i32)
13 define <vscale x 1 x i8> @vp_ctpop_nxv1i8(<vscale x 1 x i8> %va, <vscale x 1 x i1> %m, i32 zeroext %evl) {
14 ; CHECK-LABEL: vp_ctpop_nxv1i8:
15 ; CHECK:       # %bb.0:
16 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf8, ta, ma
17 ; CHECK-NEXT:    vsrl.vi v9, v8, 1, v0.t
18 ; CHECK-NEXT:    li a0, 85
19 ; CHECK-NEXT:    vand.vx v9, v9, a0, v0.t
20 ; CHECK-NEXT:    vsub.vv v8, v8, v9, v0.t
21 ; CHECK-NEXT:    li a0, 51
22 ; CHECK-NEXT:    vand.vx v9, v8, a0, v0.t
23 ; CHECK-NEXT:    vsrl.vi v8, v8, 2, v0.t
24 ; CHECK-NEXT:    vand.vx v8, v8, a0, v0.t
25 ; CHECK-NEXT:    vadd.vv v8, v9, v8, v0.t
26 ; CHECK-NEXT:    vsrl.vi v9, v8, 4, v0.t
27 ; CHECK-NEXT:    vadd.vv v8, v8, v9, v0.t
28 ; CHECK-NEXT:    vand.vi v8, v8, 15, v0.t
29 ; CHECK-NEXT:    ret
31 ; CHECK-ZVBB-LABEL: vp_ctpop_nxv1i8:
32 ; CHECK-ZVBB:       # %bb.0:
33 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e8, mf8, ta, ma
34 ; CHECK-ZVBB-NEXT:    vcpop.v v8, v8, v0.t
35 ; CHECK-ZVBB-NEXT:    ret
36   %v = call <vscale x 1 x i8> @llvm.vp.ctpop.nxv1i8(<vscale x 1 x i8> %va, <vscale x 1 x i1> %m, i32 %evl)
37   ret <vscale x 1 x i8> %v
40 define <vscale x 1 x i8> @vp_ctpop_nxv1i8_unmasked(<vscale x 1 x i8> %va, i32 zeroext %evl) {
41 ; CHECK-LABEL: vp_ctpop_nxv1i8_unmasked:
42 ; CHECK:       # %bb.0:
43 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf8, ta, ma
44 ; CHECK-NEXT:    vsrl.vi v9, v8, 1
45 ; CHECK-NEXT:    li a0, 85
46 ; CHECK-NEXT:    vand.vx v9, v9, a0
47 ; CHECK-NEXT:    vsub.vv v8, v8, v9
48 ; CHECK-NEXT:    li a0, 51
49 ; CHECK-NEXT:    vand.vx v9, v8, a0
50 ; CHECK-NEXT:    vsrl.vi v8, v8, 2
51 ; CHECK-NEXT:    vand.vx v8, v8, a0
52 ; CHECK-NEXT:    vadd.vv v8, v9, v8
53 ; CHECK-NEXT:    vsrl.vi v9, v8, 4
54 ; CHECK-NEXT:    vadd.vv v8, v8, v9
55 ; CHECK-NEXT:    vand.vi v8, v8, 15
56 ; CHECK-NEXT:    ret
58 ; CHECK-ZVBB-LABEL: vp_ctpop_nxv1i8_unmasked:
59 ; CHECK-ZVBB:       # %bb.0:
60 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e8, mf8, ta, ma
61 ; CHECK-ZVBB-NEXT:    vcpop.v v8, v8
62 ; CHECK-ZVBB-NEXT:    ret
63   %head = insertelement <vscale x 1 x i1> poison, i1 true, i32 0
64   %m = shufflevector <vscale x 1 x i1> %head, <vscale x 1 x i1> poison, <vscale x 1 x i32> zeroinitializer
65   %v = call <vscale x 1 x i8> @llvm.vp.ctpop.nxv1i8(<vscale x 1 x i8> %va, <vscale x 1 x i1> %m, i32 %evl)
66   ret <vscale x 1 x i8> %v
69 declare <vscale x 2 x i8> @llvm.vp.ctpop.nxv2i8(<vscale x 2 x i8>, <vscale x 2 x i1>, i32)
71 define <vscale x 2 x i8> @vp_ctpop_nxv2i8(<vscale x 2 x i8> %va, <vscale x 2 x i1> %m, i32 zeroext %evl) {
72 ; CHECK-LABEL: vp_ctpop_nxv2i8:
73 ; CHECK:       # %bb.0:
74 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf4, ta, ma
75 ; CHECK-NEXT:    vsrl.vi v9, v8, 1, v0.t
76 ; CHECK-NEXT:    li a0, 85
77 ; CHECK-NEXT:    vand.vx v9, v9, a0, v0.t
78 ; CHECK-NEXT:    vsub.vv v8, v8, v9, v0.t
79 ; CHECK-NEXT:    li a0, 51
80 ; CHECK-NEXT:    vand.vx v9, v8, a0, v0.t
81 ; CHECK-NEXT:    vsrl.vi v8, v8, 2, v0.t
82 ; CHECK-NEXT:    vand.vx v8, v8, a0, v0.t
83 ; CHECK-NEXT:    vadd.vv v8, v9, v8, v0.t
84 ; CHECK-NEXT:    vsrl.vi v9, v8, 4, v0.t
85 ; CHECK-NEXT:    vadd.vv v8, v8, v9, v0.t
86 ; CHECK-NEXT:    vand.vi v8, v8, 15, v0.t
87 ; CHECK-NEXT:    ret
89 ; CHECK-ZVBB-LABEL: vp_ctpop_nxv2i8:
90 ; CHECK-ZVBB:       # %bb.0:
91 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e8, mf4, ta, ma
92 ; CHECK-ZVBB-NEXT:    vcpop.v v8, v8, v0.t
93 ; CHECK-ZVBB-NEXT:    ret
94   %v = call <vscale x 2 x i8> @llvm.vp.ctpop.nxv2i8(<vscale x 2 x i8> %va, <vscale x 2 x i1> %m, i32 %evl)
95   ret <vscale x 2 x i8> %v
98 define <vscale x 2 x i8> @vp_ctpop_nxv2i8_unmasked(<vscale x 2 x i8> %va, i32 zeroext %evl) {
99 ; CHECK-LABEL: vp_ctpop_nxv2i8_unmasked:
100 ; CHECK:       # %bb.0:
101 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf4, ta, ma
102 ; CHECK-NEXT:    vsrl.vi v9, v8, 1
103 ; CHECK-NEXT:    li a0, 85
104 ; CHECK-NEXT:    vand.vx v9, v9, a0
105 ; CHECK-NEXT:    vsub.vv v8, v8, v9
106 ; CHECK-NEXT:    li a0, 51
107 ; CHECK-NEXT:    vand.vx v9, v8, a0
108 ; CHECK-NEXT:    vsrl.vi v8, v8, 2
109 ; CHECK-NEXT:    vand.vx v8, v8, a0
110 ; CHECK-NEXT:    vadd.vv v8, v9, v8
111 ; CHECK-NEXT:    vsrl.vi v9, v8, 4
112 ; CHECK-NEXT:    vadd.vv v8, v8, v9
113 ; CHECK-NEXT:    vand.vi v8, v8, 15
114 ; CHECK-NEXT:    ret
116 ; CHECK-ZVBB-LABEL: vp_ctpop_nxv2i8_unmasked:
117 ; CHECK-ZVBB:       # %bb.0:
118 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e8, mf4, ta, ma
119 ; CHECK-ZVBB-NEXT:    vcpop.v v8, v8
120 ; CHECK-ZVBB-NEXT:    ret
121   %head = insertelement <vscale x 2 x i1> poison, i1 true, i32 0
122   %m = shufflevector <vscale x 2 x i1> %head, <vscale x 2 x i1> poison, <vscale x 2 x i32> zeroinitializer
123   %v = call <vscale x 2 x i8> @llvm.vp.ctpop.nxv2i8(<vscale x 2 x i8> %va, <vscale x 2 x i1> %m, i32 %evl)
124   ret <vscale x 2 x i8> %v
127 declare <vscale x 4 x i8> @llvm.vp.ctpop.nxv4i8(<vscale x 4 x i8>, <vscale x 4 x i1>, i32)
129 define <vscale x 4 x i8> @vp_ctpop_nxv4i8(<vscale x 4 x i8> %va, <vscale x 4 x i1> %m, i32 zeroext %evl) {
130 ; CHECK-LABEL: vp_ctpop_nxv4i8:
131 ; CHECK:       # %bb.0:
132 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf2, ta, ma
133 ; CHECK-NEXT:    vsrl.vi v9, v8, 1, v0.t
134 ; CHECK-NEXT:    li a0, 85
135 ; CHECK-NEXT:    vand.vx v9, v9, a0, v0.t
136 ; CHECK-NEXT:    vsub.vv v8, v8, v9, v0.t
137 ; CHECK-NEXT:    li a0, 51
138 ; CHECK-NEXT:    vand.vx v9, v8, a0, v0.t
139 ; CHECK-NEXT:    vsrl.vi v8, v8, 2, v0.t
140 ; CHECK-NEXT:    vand.vx v8, v8, a0, v0.t
141 ; CHECK-NEXT:    vadd.vv v8, v9, v8, v0.t
142 ; CHECK-NEXT:    vsrl.vi v9, v8, 4, v0.t
143 ; CHECK-NEXT:    vadd.vv v8, v8, v9, v0.t
144 ; CHECK-NEXT:    vand.vi v8, v8, 15, v0.t
145 ; CHECK-NEXT:    ret
147 ; CHECK-ZVBB-LABEL: vp_ctpop_nxv4i8:
148 ; CHECK-ZVBB:       # %bb.0:
149 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e8, mf2, ta, ma
150 ; CHECK-ZVBB-NEXT:    vcpop.v v8, v8, v0.t
151 ; CHECK-ZVBB-NEXT:    ret
152   %v = call <vscale x 4 x i8> @llvm.vp.ctpop.nxv4i8(<vscale x 4 x i8> %va, <vscale x 4 x i1> %m, i32 %evl)
153   ret <vscale x 4 x i8> %v
156 define <vscale x 4 x i8> @vp_ctpop_nxv4i8_unmasked(<vscale x 4 x i8> %va, i32 zeroext %evl) {
157 ; CHECK-LABEL: vp_ctpop_nxv4i8_unmasked:
158 ; CHECK:       # %bb.0:
159 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf2, ta, ma
160 ; CHECK-NEXT:    vsrl.vi v9, v8, 1
161 ; CHECK-NEXT:    li a0, 85
162 ; CHECK-NEXT:    vand.vx v9, v9, a0
163 ; CHECK-NEXT:    vsub.vv v8, v8, v9
164 ; CHECK-NEXT:    li a0, 51
165 ; CHECK-NEXT:    vand.vx v9, v8, a0
166 ; CHECK-NEXT:    vsrl.vi v8, v8, 2
167 ; CHECK-NEXT:    vand.vx v8, v8, a0
168 ; CHECK-NEXT:    vadd.vv v8, v9, v8
169 ; CHECK-NEXT:    vsrl.vi v9, v8, 4
170 ; CHECK-NEXT:    vadd.vv v8, v8, v9
171 ; CHECK-NEXT:    vand.vi v8, v8, 15
172 ; CHECK-NEXT:    ret
174 ; CHECK-ZVBB-LABEL: vp_ctpop_nxv4i8_unmasked:
175 ; CHECK-ZVBB:       # %bb.0:
176 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e8, mf2, ta, ma
177 ; CHECK-ZVBB-NEXT:    vcpop.v v8, v8
178 ; CHECK-ZVBB-NEXT:    ret
179   %head = insertelement <vscale x 4 x i1> poison, i1 true, i32 0
180   %m = shufflevector <vscale x 4 x i1> %head, <vscale x 4 x i1> poison, <vscale x 4 x i32> zeroinitializer
181   %v = call <vscale x 4 x i8> @llvm.vp.ctpop.nxv4i8(<vscale x 4 x i8> %va, <vscale x 4 x i1> %m, i32 %evl)
182   ret <vscale x 4 x i8> %v
185 declare <vscale x 8 x i8> @llvm.vp.ctpop.nxv8i8(<vscale x 8 x i8>, <vscale x 8 x i1>, i32)
187 define <vscale x 8 x i8> @vp_ctpop_nxv8i8(<vscale x 8 x i8> %va, <vscale x 8 x i1> %m, i32 zeroext %evl) {
188 ; CHECK-LABEL: vp_ctpop_nxv8i8:
189 ; CHECK:       # %bb.0:
190 ; CHECK-NEXT:    vsetvli zero, a0, e8, m1, ta, ma
191 ; CHECK-NEXT:    vsrl.vi v9, v8, 1, v0.t
192 ; CHECK-NEXT:    li a0, 85
193 ; CHECK-NEXT:    vand.vx v9, v9, a0, v0.t
194 ; CHECK-NEXT:    vsub.vv v8, v8, v9, v0.t
195 ; CHECK-NEXT:    li a0, 51
196 ; CHECK-NEXT:    vand.vx v9, v8, a0, v0.t
197 ; CHECK-NEXT:    vsrl.vi v8, v8, 2, v0.t
198 ; CHECK-NEXT:    vand.vx v8, v8, a0, v0.t
199 ; CHECK-NEXT:    vadd.vv v8, v9, v8, v0.t
200 ; CHECK-NEXT:    vsrl.vi v9, v8, 4, v0.t
201 ; CHECK-NEXT:    vadd.vv v8, v8, v9, v0.t
202 ; CHECK-NEXT:    vand.vi v8, v8, 15, v0.t
203 ; CHECK-NEXT:    ret
205 ; CHECK-ZVBB-LABEL: vp_ctpop_nxv8i8:
206 ; CHECK-ZVBB:       # %bb.0:
207 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e8, m1, ta, ma
208 ; CHECK-ZVBB-NEXT:    vcpop.v v8, v8, v0.t
209 ; CHECK-ZVBB-NEXT:    ret
210   %v = call <vscale x 8 x i8> @llvm.vp.ctpop.nxv8i8(<vscale x 8 x i8> %va, <vscale x 8 x i1> %m, i32 %evl)
211   ret <vscale x 8 x i8> %v
214 define <vscale x 8 x i8> @vp_ctpop_nxv8i8_unmasked(<vscale x 8 x i8> %va, i32 zeroext %evl) {
215 ; CHECK-LABEL: vp_ctpop_nxv8i8_unmasked:
216 ; CHECK:       # %bb.0:
217 ; CHECK-NEXT:    vsetvli zero, a0, e8, m1, ta, ma
218 ; CHECK-NEXT:    vsrl.vi v9, v8, 1
219 ; CHECK-NEXT:    li a0, 85
220 ; CHECK-NEXT:    vand.vx v9, v9, a0
221 ; CHECK-NEXT:    vsub.vv v8, v8, v9
222 ; CHECK-NEXT:    li a0, 51
223 ; CHECK-NEXT:    vand.vx v9, v8, a0
224 ; CHECK-NEXT:    vsrl.vi v8, v8, 2
225 ; CHECK-NEXT:    vand.vx v8, v8, a0
226 ; CHECK-NEXT:    vadd.vv v8, v9, v8
227 ; CHECK-NEXT:    vsrl.vi v9, v8, 4
228 ; CHECK-NEXT:    vadd.vv v8, v8, v9
229 ; CHECK-NEXT:    vand.vi v8, v8, 15
230 ; CHECK-NEXT:    ret
232 ; CHECK-ZVBB-LABEL: vp_ctpop_nxv8i8_unmasked:
233 ; CHECK-ZVBB:       # %bb.0:
234 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e8, m1, ta, ma
235 ; CHECK-ZVBB-NEXT:    vcpop.v v8, v8
236 ; CHECK-ZVBB-NEXT:    ret
237   %head = insertelement <vscale x 8 x i1> poison, i1 true, i32 0
238   %m = shufflevector <vscale x 8 x i1> %head, <vscale x 8 x i1> poison, <vscale x 8 x i32> zeroinitializer
239   %v = call <vscale x 8 x i8> @llvm.vp.ctpop.nxv8i8(<vscale x 8 x i8> %va, <vscale x 8 x i1> %m, i32 %evl)
240   ret <vscale x 8 x i8> %v
243 declare <vscale x 16 x i8> @llvm.vp.ctpop.nxv16i8(<vscale x 16 x i8>, <vscale x 16 x i1>, i32)
245 define <vscale x 16 x i8> @vp_ctpop_nxv16i8(<vscale x 16 x i8> %va, <vscale x 16 x i1> %m, i32 zeroext %evl) {
246 ; CHECK-LABEL: vp_ctpop_nxv16i8:
247 ; CHECK:       # %bb.0:
248 ; CHECK-NEXT:    vsetvli zero, a0, e8, m2, ta, ma
249 ; CHECK-NEXT:    vsrl.vi v10, v8, 1, v0.t
250 ; CHECK-NEXT:    li a0, 85
251 ; CHECK-NEXT:    vand.vx v10, v10, a0, v0.t
252 ; CHECK-NEXT:    vsub.vv v8, v8, v10, v0.t
253 ; CHECK-NEXT:    li a0, 51
254 ; CHECK-NEXT:    vand.vx v10, v8, a0, v0.t
255 ; CHECK-NEXT:    vsrl.vi v8, v8, 2, v0.t
256 ; CHECK-NEXT:    vand.vx v8, v8, a0, v0.t
257 ; CHECK-NEXT:    vadd.vv v8, v10, v8, v0.t
258 ; CHECK-NEXT:    vsrl.vi v10, v8, 4, v0.t
259 ; CHECK-NEXT:    vadd.vv v8, v8, v10, v0.t
260 ; CHECK-NEXT:    vand.vi v8, v8, 15, v0.t
261 ; CHECK-NEXT:    ret
263 ; CHECK-ZVBB-LABEL: vp_ctpop_nxv16i8:
264 ; CHECK-ZVBB:       # %bb.0:
265 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e8, m2, ta, ma
266 ; CHECK-ZVBB-NEXT:    vcpop.v v8, v8, v0.t
267 ; CHECK-ZVBB-NEXT:    ret
268   %v = call <vscale x 16 x i8> @llvm.vp.ctpop.nxv16i8(<vscale x 16 x i8> %va, <vscale x 16 x i1> %m, i32 %evl)
269   ret <vscale x 16 x i8> %v
272 define <vscale x 16 x i8> @vp_ctpop_nxv16i8_unmasked(<vscale x 16 x i8> %va, i32 zeroext %evl) {
273 ; CHECK-LABEL: vp_ctpop_nxv16i8_unmasked:
274 ; CHECK:       # %bb.0:
275 ; CHECK-NEXT:    vsetvli zero, a0, e8, m2, ta, ma
276 ; CHECK-NEXT:    vsrl.vi v10, v8, 1
277 ; CHECK-NEXT:    li a0, 85
278 ; CHECK-NEXT:    vand.vx v10, v10, a0
279 ; CHECK-NEXT:    vsub.vv v8, v8, v10
280 ; CHECK-NEXT:    li a0, 51
281 ; CHECK-NEXT:    vand.vx v10, v8, a0
282 ; CHECK-NEXT:    vsrl.vi v8, v8, 2
283 ; CHECK-NEXT:    vand.vx v8, v8, a0
284 ; CHECK-NEXT:    vadd.vv v8, v10, v8
285 ; CHECK-NEXT:    vsrl.vi v10, v8, 4
286 ; CHECK-NEXT:    vadd.vv v8, v8, v10
287 ; CHECK-NEXT:    vand.vi v8, v8, 15
288 ; CHECK-NEXT:    ret
290 ; CHECK-ZVBB-LABEL: vp_ctpop_nxv16i8_unmasked:
291 ; CHECK-ZVBB:       # %bb.0:
292 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e8, m2, ta, ma
293 ; CHECK-ZVBB-NEXT:    vcpop.v v8, v8
294 ; CHECK-ZVBB-NEXT:    ret
295   %head = insertelement <vscale x 16 x i1> poison, i1 true, i32 0
296   %m = shufflevector <vscale x 16 x i1> %head, <vscale x 16 x i1> poison, <vscale x 16 x i32> zeroinitializer
297   %v = call <vscale x 16 x i8> @llvm.vp.ctpop.nxv16i8(<vscale x 16 x i8> %va, <vscale x 16 x i1> %m, i32 %evl)
298   ret <vscale x 16 x i8> %v
301 declare <vscale x 32 x i8> @llvm.vp.ctpop.nxv32i8(<vscale x 32 x i8>, <vscale x 32 x i1>, i32)
303 define <vscale x 32 x i8> @vp_ctpop_nxv32i8(<vscale x 32 x i8> %va, <vscale x 32 x i1> %m, i32 zeroext %evl) {
304 ; CHECK-LABEL: vp_ctpop_nxv32i8:
305 ; CHECK:       # %bb.0:
306 ; CHECK-NEXT:    vsetvli zero, a0, e8, m4, ta, ma
307 ; CHECK-NEXT:    vsrl.vi v12, v8, 1, v0.t
308 ; CHECK-NEXT:    li a0, 85
309 ; CHECK-NEXT:    vand.vx v12, v12, a0, v0.t
310 ; CHECK-NEXT:    vsub.vv v8, v8, v12, v0.t
311 ; CHECK-NEXT:    li a0, 51
312 ; CHECK-NEXT:    vand.vx v12, v8, a0, v0.t
313 ; CHECK-NEXT:    vsrl.vi v8, v8, 2, v0.t
314 ; CHECK-NEXT:    vand.vx v8, v8, a0, v0.t
315 ; CHECK-NEXT:    vadd.vv v8, v12, v8, v0.t
316 ; CHECK-NEXT:    vsrl.vi v12, v8, 4, v0.t
317 ; CHECK-NEXT:    vadd.vv v8, v8, v12, v0.t
318 ; CHECK-NEXT:    vand.vi v8, v8, 15, v0.t
319 ; CHECK-NEXT:    ret
321 ; CHECK-ZVBB-LABEL: vp_ctpop_nxv32i8:
322 ; CHECK-ZVBB:       # %bb.0:
323 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e8, m4, ta, ma
324 ; CHECK-ZVBB-NEXT:    vcpop.v v8, v8, v0.t
325 ; CHECK-ZVBB-NEXT:    ret
326   %v = call <vscale x 32 x i8> @llvm.vp.ctpop.nxv32i8(<vscale x 32 x i8> %va, <vscale x 32 x i1> %m, i32 %evl)
327   ret <vscale x 32 x i8> %v
330 define <vscale x 32 x i8> @vp_ctpop_nxv32i8_unmasked(<vscale x 32 x i8> %va, i32 zeroext %evl) {
331 ; CHECK-LABEL: vp_ctpop_nxv32i8_unmasked:
332 ; CHECK:       # %bb.0:
333 ; CHECK-NEXT:    vsetvli zero, a0, e8, m4, ta, ma
334 ; CHECK-NEXT:    vsrl.vi v12, v8, 1
335 ; CHECK-NEXT:    li a0, 85
336 ; CHECK-NEXT:    vand.vx v12, v12, a0
337 ; CHECK-NEXT:    vsub.vv v8, v8, v12
338 ; CHECK-NEXT:    li a0, 51
339 ; CHECK-NEXT:    vand.vx v12, v8, a0
340 ; CHECK-NEXT:    vsrl.vi v8, v8, 2
341 ; CHECK-NEXT:    vand.vx v8, v8, a0
342 ; CHECK-NEXT:    vadd.vv v8, v12, v8
343 ; CHECK-NEXT:    vsrl.vi v12, v8, 4
344 ; CHECK-NEXT:    vadd.vv v8, v8, v12
345 ; CHECK-NEXT:    vand.vi v8, v8, 15
346 ; CHECK-NEXT:    ret
348 ; CHECK-ZVBB-LABEL: vp_ctpop_nxv32i8_unmasked:
349 ; CHECK-ZVBB:       # %bb.0:
350 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e8, m4, ta, ma
351 ; CHECK-ZVBB-NEXT:    vcpop.v v8, v8
352 ; CHECK-ZVBB-NEXT:    ret
353   %head = insertelement <vscale x 32 x i1> poison, i1 true, i32 0
354   %m = shufflevector <vscale x 32 x i1> %head, <vscale x 32 x i1> poison, <vscale x 32 x i32> zeroinitializer
355   %v = call <vscale x 32 x i8> @llvm.vp.ctpop.nxv32i8(<vscale x 32 x i8> %va, <vscale x 32 x i1> %m, i32 %evl)
356   ret <vscale x 32 x i8> %v
359 declare <vscale x 64 x i8> @llvm.vp.ctpop.nxv64i8(<vscale x 64 x i8>, <vscale x 64 x i1>, i32)
361 define <vscale x 64 x i8> @vp_ctpop_nxv64i8(<vscale x 64 x i8> %va, <vscale x 64 x i1> %m, i32 zeroext %evl) {
362 ; CHECK-LABEL: vp_ctpop_nxv64i8:
363 ; CHECK:       # %bb.0:
364 ; CHECK-NEXT:    vsetvli zero, a0, e8, m8, ta, ma
365 ; CHECK-NEXT:    vsrl.vi v16, v8, 1, v0.t
366 ; CHECK-NEXT:    li a0, 85
367 ; CHECK-NEXT:    vand.vx v16, v16, a0, v0.t
368 ; CHECK-NEXT:    vsub.vv v8, v8, v16, v0.t
369 ; CHECK-NEXT:    li a0, 51
370 ; CHECK-NEXT:    vand.vx v16, v8, a0, v0.t
371 ; CHECK-NEXT:    vsrl.vi v8, v8, 2, v0.t
372 ; CHECK-NEXT:    vand.vx v8, v8, a0, v0.t
373 ; CHECK-NEXT:    vadd.vv v8, v16, v8, v0.t
374 ; CHECK-NEXT:    vsrl.vi v16, v8, 4, v0.t
375 ; CHECK-NEXT:    vadd.vv v8, v8, v16, v0.t
376 ; CHECK-NEXT:    vand.vi v8, v8, 15, v0.t
377 ; CHECK-NEXT:    ret
379 ; CHECK-ZVBB-LABEL: vp_ctpop_nxv64i8:
380 ; CHECK-ZVBB:       # %bb.0:
381 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e8, m8, ta, ma
382 ; CHECK-ZVBB-NEXT:    vcpop.v v8, v8, v0.t
383 ; CHECK-ZVBB-NEXT:    ret
384   %v = call <vscale x 64 x i8> @llvm.vp.ctpop.nxv64i8(<vscale x 64 x i8> %va, <vscale x 64 x i1> %m, i32 %evl)
385   ret <vscale x 64 x i8> %v
388 define <vscale x 64 x i8> @vp_ctpop_nxv64i8_unmasked(<vscale x 64 x i8> %va, i32 zeroext %evl) {
389 ; CHECK-LABEL: vp_ctpop_nxv64i8_unmasked:
390 ; CHECK:       # %bb.0:
391 ; CHECK-NEXT:    vsetvli zero, a0, e8, m8, ta, ma
392 ; CHECK-NEXT:    vsrl.vi v16, v8, 1
393 ; CHECK-NEXT:    li a0, 85
394 ; CHECK-NEXT:    vand.vx v16, v16, a0
395 ; CHECK-NEXT:    vsub.vv v8, v8, v16
396 ; CHECK-NEXT:    li a0, 51
397 ; CHECK-NEXT:    vand.vx v16, v8, a0
398 ; CHECK-NEXT:    vsrl.vi v8, v8, 2
399 ; CHECK-NEXT:    vand.vx v8, v8, a0
400 ; CHECK-NEXT:    vadd.vv v8, v16, v8
401 ; CHECK-NEXT:    vsrl.vi v16, v8, 4
402 ; CHECK-NEXT:    vadd.vv v8, v8, v16
403 ; CHECK-NEXT:    vand.vi v8, v8, 15
404 ; CHECK-NEXT:    ret
406 ; CHECK-ZVBB-LABEL: vp_ctpop_nxv64i8_unmasked:
407 ; CHECK-ZVBB:       # %bb.0:
408 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e8, m8, ta, ma
409 ; CHECK-ZVBB-NEXT:    vcpop.v v8, v8
410 ; CHECK-ZVBB-NEXT:    ret
411   %head = insertelement <vscale x 64 x i1> poison, i1 true, i32 0
412   %m = shufflevector <vscale x 64 x i1> %head, <vscale x 64 x i1> poison, <vscale x 64 x i32> zeroinitializer
413   %v = call <vscale x 64 x i8> @llvm.vp.ctpop.nxv64i8(<vscale x 64 x i8> %va, <vscale x 64 x i1> %m, i32 %evl)
414   ret <vscale x 64 x i8> %v
417 declare <vscale x 1 x i16> @llvm.vp.ctpop.nxv1i16(<vscale x 1 x i16>, <vscale x 1 x i1>, i32)
419 define <vscale x 1 x i16> @vp_ctpop_nxv1i16(<vscale x 1 x i16> %va, <vscale x 1 x i1> %m, i32 zeroext %evl) {
420 ; CHECK-LABEL: vp_ctpop_nxv1i16:
421 ; CHECK:       # %bb.0:
422 ; CHECK-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
423 ; CHECK-NEXT:    vsrl.vi v9, v8, 1, v0.t
424 ; CHECK-NEXT:    lui a0, 5
425 ; CHECK-NEXT:    addi a0, a0, 1365
426 ; CHECK-NEXT:    vand.vx v9, v9, a0, v0.t
427 ; CHECK-NEXT:    vsub.vv v8, v8, v9, v0.t
428 ; CHECK-NEXT:    lui a0, 3
429 ; CHECK-NEXT:    addi a0, a0, 819
430 ; CHECK-NEXT:    vand.vx v9, v8, a0, v0.t
431 ; CHECK-NEXT:    vsrl.vi v8, v8, 2, v0.t
432 ; CHECK-NEXT:    vand.vx v8, v8, a0, v0.t
433 ; CHECK-NEXT:    vadd.vv v8, v9, v8, v0.t
434 ; CHECK-NEXT:    vsrl.vi v9, v8, 4, v0.t
435 ; CHECK-NEXT:    vadd.vv v8, v8, v9, v0.t
436 ; CHECK-NEXT:    lui a0, 1
437 ; CHECK-NEXT:    addi a0, a0, -241
438 ; CHECK-NEXT:    vand.vx v8, v8, a0, v0.t
439 ; CHECK-NEXT:    li a0, 257
440 ; CHECK-NEXT:    vmul.vx v8, v8, a0, v0.t
441 ; CHECK-NEXT:    vsrl.vi v8, v8, 8, v0.t
442 ; CHECK-NEXT:    ret
444 ; CHECK-ZVBB-LABEL: vp_ctpop_nxv1i16:
445 ; CHECK-ZVBB:       # %bb.0:
446 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
447 ; CHECK-ZVBB-NEXT:    vcpop.v v8, v8, v0.t
448 ; CHECK-ZVBB-NEXT:    ret
449   %v = call <vscale x 1 x i16> @llvm.vp.ctpop.nxv1i16(<vscale x 1 x i16> %va, <vscale x 1 x i1> %m, i32 %evl)
450   ret <vscale x 1 x i16> %v
453 define <vscale x 1 x i16> @vp_ctpop_nxv1i16_unmasked(<vscale x 1 x i16> %va, i32 zeroext %evl) {
454 ; CHECK-LABEL: vp_ctpop_nxv1i16_unmasked:
455 ; CHECK:       # %bb.0:
456 ; CHECK-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
457 ; CHECK-NEXT:    vsrl.vi v9, v8, 1
458 ; CHECK-NEXT:    lui a0, 5
459 ; CHECK-NEXT:    addi a0, a0, 1365
460 ; CHECK-NEXT:    vand.vx v9, v9, a0
461 ; CHECK-NEXT:    vsub.vv v8, v8, v9
462 ; CHECK-NEXT:    lui a0, 3
463 ; CHECK-NEXT:    addi a0, a0, 819
464 ; CHECK-NEXT:    vand.vx v9, v8, a0
465 ; CHECK-NEXT:    vsrl.vi v8, v8, 2
466 ; CHECK-NEXT:    vand.vx v8, v8, a0
467 ; CHECK-NEXT:    vadd.vv v8, v9, v8
468 ; CHECK-NEXT:    vsrl.vi v9, v8, 4
469 ; CHECK-NEXT:    vadd.vv v8, v8, v9
470 ; CHECK-NEXT:    lui a0, 1
471 ; CHECK-NEXT:    addi a0, a0, -241
472 ; CHECK-NEXT:    vand.vx v8, v8, a0
473 ; CHECK-NEXT:    li a0, 257
474 ; CHECK-NEXT:    vmul.vx v8, v8, a0
475 ; CHECK-NEXT:    vsrl.vi v8, v8, 8
476 ; CHECK-NEXT:    ret
478 ; CHECK-ZVBB-LABEL: vp_ctpop_nxv1i16_unmasked:
479 ; CHECK-ZVBB:       # %bb.0:
480 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
481 ; CHECK-ZVBB-NEXT:    vcpop.v v8, v8
482 ; CHECK-ZVBB-NEXT:    ret
483   %head = insertelement <vscale x 1 x i1> poison, i1 true, i32 0
484   %m = shufflevector <vscale x 1 x i1> %head, <vscale x 1 x i1> poison, <vscale x 1 x i32> zeroinitializer
485   %v = call <vscale x 1 x i16> @llvm.vp.ctpop.nxv1i16(<vscale x 1 x i16> %va, <vscale x 1 x i1> %m, i32 %evl)
486   ret <vscale x 1 x i16> %v
489 declare <vscale x 2 x i16> @llvm.vp.ctpop.nxv2i16(<vscale x 2 x i16>, <vscale x 2 x i1>, i32)
491 define <vscale x 2 x i16> @vp_ctpop_nxv2i16(<vscale x 2 x i16> %va, <vscale x 2 x i1> %m, i32 zeroext %evl) {
492 ; CHECK-LABEL: vp_ctpop_nxv2i16:
493 ; CHECK:       # %bb.0:
494 ; CHECK-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
495 ; CHECK-NEXT:    vsrl.vi v9, v8, 1, v0.t
496 ; CHECK-NEXT:    lui a0, 5
497 ; CHECK-NEXT:    addi a0, a0, 1365
498 ; CHECK-NEXT:    vand.vx v9, v9, a0, v0.t
499 ; CHECK-NEXT:    vsub.vv v8, v8, v9, v0.t
500 ; CHECK-NEXT:    lui a0, 3
501 ; CHECK-NEXT:    addi a0, a0, 819
502 ; CHECK-NEXT:    vand.vx v9, v8, a0, v0.t
503 ; CHECK-NEXT:    vsrl.vi v8, v8, 2, v0.t
504 ; CHECK-NEXT:    vand.vx v8, v8, a0, v0.t
505 ; CHECK-NEXT:    vadd.vv v8, v9, v8, v0.t
506 ; CHECK-NEXT:    vsrl.vi v9, v8, 4, v0.t
507 ; CHECK-NEXT:    vadd.vv v8, v8, v9, v0.t
508 ; CHECK-NEXT:    lui a0, 1
509 ; CHECK-NEXT:    addi a0, a0, -241
510 ; CHECK-NEXT:    vand.vx v8, v8, a0, v0.t
511 ; CHECK-NEXT:    li a0, 257
512 ; CHECK-NEXT:    vmul.vx v8, v8, a0, v0.t
513 ; CHECK-NEXT:    vsrl.vi v8, v8, 8, v0.t
514 ; CHECK-NEXT:    ret
516 ; CHECK-ZVBB-LABEL: vp_ctpop_nxv2i16:
517 ; CHECK-ZVBB:       # %bb.0:
518 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
519 ; CHECK-ZVBB-NEXT:    vcpop.v v8, v8, v0.t
520 ; CHECK-ZVBB-NEXT:    ret
521   %v = call <vscale x 2 x i16> @llvm.vp.ctpop.nxv2i16(<vscale x 2 x i16> %va, <vscale x 2 x i1> %m, i32 %evl)
522   ret <vscale x 2 x i16> %v
525 define <vscale x 2 x i16> @vp_ctpop_nxv2i16_unmasked(<vscale x 2 x i16> %va, i32 zeroext %evl) {
526 ; CHECK-LABEL: vp_ctpop_nxv2i16_unmasked:
527 ; CHECK:       # %bb.0:
528 ; CHECK-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
529 ; CHECK-NEXT:    vsrl.vi v9, v8, 1
530 ; CHECK-NEXT:    lui a0, 5
531 ; CHECK-NEXT:    addi a0, a0, 1365
532 ; CHECK-NEXT:    vand.vx v9, v9, a0
533 ; CHECK-NEXT:    vsub.vv v8, v8, v9
534 ; CHECK-NEXT:    lui a0, 3
535 ; CHECK-NEXT:    addi a0, a0, 819
536 ; CHECK-NEXT:    vand.vx v9, v8, a0
537 ; CHECK-NEXT:    vsrl.vi v8, v8, 2
538 ; CHECK-NEXT:    vand.vx v8, v8, a0
539 ; CHECK-NEXT:    vadd.vv v8, v9, v8
540 ; CHECK-NEXT:    vsrl.vi v9, v8, 4
541 ; CHECK-NEXT:    vadd.vv v8, v8, v9
542 ; CHECK-NEXT:    lui a0, 1
543 ; CHECK-NEXT:    addi a0, a0, -241
544 ; CHECK-NEXT:    vand.vx v8, v8, a0
545 ; CHECK-NEXT:    li a0, 257
546 ; CHECK-NEXT:    vmul.vx v8, v8, a0
547 ; CHECK-NEXT:    vsrl.vi v8, v8, 8
548 ; CHECK-NEXT:    ret
550 ; CHECK-ZVBB-LABEL: vp_ctpop_nxv2i16_unmasked:
551 ; CHECK-ZVBB:       # %bb.0:
552 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
553 ; CHECK-ZVBB-NEXT:    vcpop.v v8, v8
554 ; CHECK-ZVBB-NEXT:    ret
555   %head = insertelement <vscale x 2 x i1> poison, i1 true, i32 0
556   %m = shufflevector <vscale x 2 x i1> %head, <vscale x 2 x i1> poison, <vscale x 2 x i32> zeroinitializer
557   %v = call <vscale x 2 x i16> @llvm.vp.ctpop.nxv2i16(<vscale x 2 x i16> %va, <vscale x 2 x i1> %m, i32 %evl)
558   ret <vscale x 2 x i16> %v
561 declare <vscale x 4 x i16> @llvm.vp.ctpop.nxv4i16(<vscale x 4 x i16>, <vscale x 4 x i1>, i32)
563 define <vscale x 4 x i16> @vp_ctpop_nxv4i16(<vscale x 4 x i16> %va, <vscale x 4 x i1> %m, i32 zeroext %evl) {
564 ; CHECK-LABEL: vp_ctpop_nxv4i16:
565 ; CHECK:       # %bb.0:
566 ; CHECK-NEXT:    vsetvli zero, a0, e16, m1, ta, ma
567 ; CHECK-NEXT:    vsrl.vi v9, v8, 1, v0.t
568 ; CHECK-NEXT:    lui a0, 5
569 ; CHECK-NEXT:    addi a0, a0, 1365
570 ; CHECK-NEXT:    vand.vx v9, v9, a0, v0.t
571 ; CHECK-NEXT:    vsub.vv v8, v8, v9, v0.t
572 ; CHECK-NEXT:    lui a0, 3
573 ; CHECK-NEXT:    addi a0, a0, 819
574 ; CHECK-NEXT:    vand.vx v9, v8, a0, v0.t
575 ; CHECK-NEXT:    vsrl.vi v8, v8, 2, v0.t
576 ; CHECK-NEXT:    vand.vx v8, v8, a0, v0.t
577 ; CHECK-NEXT:    vadd.vv v8, v9, v8, v0.t
578 ; CHECK-NEXT:    vsrl.vi v9, v8, 4, v0.t
579 ; CHECK-NEXT:    vadd.vv v8, v8, v9, v0.t
580 ; CHECK-NEXT:    lui a0, 1
581 ; CHECK-NEXT:    addi a0, a0, -241
582 ; CHECK-NEXT:    vand.vx v8, v8, a0, v0.t
583 ; CHECK-NEXT:    li a0, 257
584 ; CHECK-NEXT:    vmul.vx v8, v8, a0, v0.t
585 ; CHECK-NEXT:    vsrl.vi v8, v8, 8, v0.t
586 ; CHECK-NEXT:    ret
588 ; CHECK-ZVBB-LABEL: vp_ctpop_nxv4i16:
589 ; CHECK-ZVBB:       # %bb.0:
590 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e16, m1, ta, ma
591 ; CHECK-ZVBB-NEXT:    vcpop.v v8, v8, v0.t
592 ; CHECK-ZVBB-NEXT:    ret
593   %v = call <vscale x 4 x i16> @llvm.vp.ctpop.nxv4i16(<vscale x 4 x i16> %va, <vscale x 4 x i1> %m, i32 %evl)
594   ret <vscale x 4 x i16> %v
597 define <vscale x 4 x i16> @vp_ctpop_nxv4i16_unmasked(<vscale x 4 x i16> %va, i32 zeroext %evl) {
598 ; CHECK-LABEL: vp_ctpop_nxv4i16_unmasked:
599 ; CHECK:       # %bb.0:
600 ; CHECK-NEXT:    vsetvli zero, a0, e16, m1, ta, ma
601 ; CHECK-NEXT:    vsrl.vi v9, v8, 1
602 ; CHECK-NEXT:    lui a0, 5
603 ; CHECK-NEXT:    addi a0, a0, 1365
604 ; CHECK-NEXT:    vand.vx v9, v9, a0
605 ; CHECK-NEXT:    vsub.vv v8, v8, v9
606 ; CHECK-NEXT:    lui a0, 3
607 ; CHECK-NEXT:    addi a0, a0, 819
608 ; CHECK-NEXT:    vand.vx v9, v8, a0
609 ; CHECK-NEXT:    vsrl.vi v8, v8, 2
610 ; CHECK-NEXT:    vand.vx v8, v8, a0
611 ; CHECK-NEXT:    vadd.vv v8, v9, v8
612 ; CHECK-NEXT:    vsrl.vi v9, v8, 4
613 ; CHECK-NEXT:    vadd.vv v8, v8, v9
614 ; CHECK-NEXT:    lui a0, 1
615 ; CHECK-NEXT:    addi a0, a0, -241
616 ; CHECK-NEXT:    vand.vx v8, v8, a0
617 ; CHECK-NEXT:    li a0, 257
618 ; CHECK-NEXT:    vmul.vx v8, v8, a0
619 ; CHECK-NEXT:    vsrl.vi v8, v8, 8
620 ; CHECK-NEXT:    ret
622 ; CHECK-ZVBB-LABEL: vp_ctpop_nxv4i16_unmasked:
623 ; CHECK-ZVBB:       # %bb.0:
624 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e16, m1, ta, ma
625 ; CHECK-ZVBB-NEXT:    vcpop.v v8, v8
626 ; CHECK-ZVBB-NEXT:    ret
627   %head = insertelement <vscale x 4 x i1> poison, i1 true, i32 0
628   %m = shufflevector <vscale x 4 x i1> %head, <vscale x 4 x i1> poison, <vscale x 4 x i32> zeroinitializer
629   %v = call <vscale x 4 x i16> @llvm.vp.ctpop.nxv4i16(<vscale x 4 x i16> %va, <vscale x 4 x i1> %m, i32 %evl)
630   ret <vscale x 4 x i16> %v
633 declare <vscale x 8 x i16> @llvm.vp.ctpop.nxv8i16(<vscale x 8 x i16>, <vscale x 8 x i1>, i32)
635 define <vscale x 8 x i16> @vp_ctpop_nxv8i16(<vscale x 8 x i16> %va, <vscale x 8 x i1> %m, i32 zeroext %evl) {
636 ; CHECK-LABEL: vp_ctpop_nxv8i16:
637 ; CHECK:       # %bb.0:
638 ; CHECK-NEXT:    vsetvli zero, a0, e16, m2, ta, ma
639 ; CHECK-NEXT:    vsrl.vi v10, v8, 1, v0.t
640 ; CHECK-NEXT:    lui a0, 5
641 ; CHECK-NEXT:    addi a0, a0, 1365
642 ; CHECK-NEXT:    vand.vx v10, v10, a0, v0.t
643 ; CHECK-NEXT:    vsub.vv v8, v8, v10, v0.t
644 ; CHECK-NEXT:    lui a0, 3
645 ; CHECK-NEXT:    addi a0, a0, 819
646 ; CHECK-NEXT:    vand.vx v10, v8, a0, v0.t
647 ; CHECK-NEXT:    vsrl.vi v8, v8, 2, v0.t
648 ; CHECK-NEXT:    vand.vx v8, v8, a0, v0.t
649 ; CHECK-NEXT:    vadd.vv v8, v10, v8, v0.t
650 ; CHECK-NEXT:    vsrl.vi v10, v8, 4, v0.t
651 ; CHECK-NEXT:    vadd.vv v8, v8, v10, v0.t
652 ; CHECK-NEXT:    lui a0, 1
653 ; CHECK-NEXT:    addi a0, a0, -241
654 ; CHECK-NEXT:    vand.vx v8, v8, a0, v0.t
655 ; CHECK-NEXT:    li a0, 257
656 ; CHECK-NEXT:    vmul.vx v8, v8, a0, v0.t
657 ; CHECK-NEXT:    vsrl.vi v8, v8, 8, v0.t
658 ; CHECK-NEXT:    ret
660 ; CHECK-ZVBB-LABEL: vp_ctpop_nxv8i16:
661 ; CHECK-ZVBB:       # %bb.0:
662 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e16, m2, ta, ma
663 ; CHECK-ZVBB-NEXT:    vcpop.v v8, v8, v0.t
664 ; CHECK-ZVBB-NEXT:    ret
665   %v = call <vscale x 8 x i16> @llvm.vp.ctpop.nxv8i16(<vscale x 8 x i16> %va, <vscale x 8 x i1> %m, i32 %evl)
666   ret <vscale x 8 x i16> %v
669 define <vscale x 8 x i16> @vp_ctpop_nxv8i16_unmasked(<vscale x 8 x i16> %va, i32 zeroext %evl) {
670 ; CHECK-LABEL: vp_ctpop_nxv8i16_unmasked:
671 ; CHECK:       # %bb.0:
672 ; CHECK-NEXT:    vsetvli zero, a0, e16, m2, ta, ma
673 ; CHECK-NEXT:    vsrl.vi v10, v8, 1
674 ; CHECK-NEXT:    lui a0, 5
675 ; CHECK-NEXT:    addi a0, a0, 1365
676 ; CHECK-NEXT:    vand.vx v10, v10, a0
677 ; CHECK-NEXT:    vsub.vv v8, v8, v10
678 ; CHECK-NEXT:    lui a0, 3
679 ; CHECK-NEXT:    addi a0, a0, 819
680 ; CHECK-NEXT:    vand.vx v10, v8, a0
681 ; CHECK-NEXT:    vsrl.vi v8, v8, 2
682 ; CHECK-NEXT:    vand.vx v8, v8, a0
683 ; CHECK-NEXT:    vadd.vv v8, v10, v8
684 ; CHECK-NEXT:    vsrl.vi v10, v8, 4
685 ; CHECK-NEXT:    vadd.vv v8, v8, v10
686 ; CHECK-NEXT:    lui a0, 1
687 ; CHECK-NEXT:    addi a0, a0, -241
688 ; CHECK-NEXT:    vand.vx v8, v8, a0
689 ; CHECK-NEXT:    li a0, 257
690 ; CHECK-NEXT:    vmul.vx v8, v8, a0
691 ; CHECK-NEXT:    vsrl.vi v8, v8, 8
692 ; CHECK-NEXT:    ret
694 ; CHECK-ZVBB-LABEL: vp_ctpop_nxv8i16_unmasked:
695 ; CHECK-ZVBB:       # %bb.0:
696 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e16, m2, ta, ma
697 ; CHECK-ZVBB-NEXT:    vcpop.v v8, v8
698 ; CHECK-ZVBB-NEXT:    ret
699   %head = insertelement <vscale x 8 x i1> poison, i1 true, i32 0
700   %m = shufflevector <vscale x 8 x i1> %head, <vscale x 8 x i1> poison, <vscale x 8 x i32> zeroinitializer
701   %v = call <vscale x 8 x i16> @llvm.vp.ctpop.nxv8i16(<vscale x 8 x i16> %va, <vscale x 8 x i1> %m, i32 %evl)
702   ret <vscale x 8 x i16> %v
705 declare <vscale x 16 x i16> @llvm.vp.ctpop.nxv16i16(<vscale x 16 x i16>, <vscale x 16 x i1>, i32)
707 define <vscale x 16 x i16> @vp_ctpop_nxv16i16(<vscale x 16 x i16> %va, <vscale x 16 x i1> %m, i32 zeroext %evl) {
708 ; CHECK-LABEL: vp_ctpop_nxv16i16:
709 ; CHECK:       # %bb.0:
710 ; CHECK-NEXT:    vsetvli zero, a0, e16, m4, ta, ma
711 ; CHECK-NEXT:    vsrl.vi v12, v8, 1, v0.t
712 ; CHECK-NEXT:    lui a0, 5
713 ; CHECK-NEXT:    addi a0, a0, 1365
714 ; CHECK-NEXT:    vand.vx v12, v12, a0, v0.t
715 ; CHECK-NEXT:    vsub.vv v8, v8, v12, v0.t
716 ; CHECK-NEXT:    lui a0, 3
717 ; CHECK-NEXT:    addi a0, a0, 819
718 ; CHECK-NEXT:    vand.vx v12, v8, a0, v0.t
719 ; CHECK-NEXT:    vsrl.vi v8, v8, 2, v0.t
720 ; CHECK-NEXT:    vand.vx v8, v8, a0, v0.t
721 ; CHECK-NEXT:    vadd.vv v8, v12, v8, v0.t
722 ; CHECK-NEXT:    vsrl.vi v12, v8, 4, v0.t
723 ; CHECK-NEXT:    vadd.vv v8, v8, v12, v0.t
724 ; CHECK-NEXT:    lui a0, 1
725 ; CHECK-NEXT:    addi a0, a0, -241
726 ; CHECK-NEXT:    vand.vx v8, v8, a0, v0.t
727 ; CHECK-NEXT:    li a0, 257
728 ; CHECK-NEXT:    vmul.vx v8, v8, a0, v0.t
729 ; CHECK-NEXT:    vsrl.vi v8, v8, 8, v0.t
730 ; CHECK-NEXT:    ret
732 ; CHECK-ZVBB-LABEL: vp_ctpop_nxv16i16:
733 ; CHECK-ZVBB:       # %bb.0:
734 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e16, m4, ta, ma
735 ; CHECK-ZVBB-NEXT:    vcpop.v v8, v8, v0.t
736 ; CHECK-ZVBB-NEXT:    ret
737   %v = call <vscale x 16 x i16> @llvm.vp.ctpop.nxv16i16(<vscale x 16 x i16> %va, <vscale x 16 x i1> %m, i32 %evl)
738   ret <vscale x 16 x i16> %v
741 define <vscale x 16 x i16> @vp_ctpop_nxv16i16_unmasked(<vscale x 16 x i16> %va, i32 zeroext %evl) {
742 ; CHECK-LABEL: vp_ctpop_nxv16i16_unmasked:
743 ; CHECK:       # %bb.0:
744 ; CHECK-NEXT:    vsetvli zero, a0, e16, m4, ta, ma
745 ; CHECK-NEXT:    vsrl.vi v12, v8, 1
746 ; CHECK-NEXT:    lui a0, 5
747 ; CHECK-NEXT:    addi a0, a0, 1365
748 ; CHECK-NEXT:    vand.vx v12, v12, a0
749 ; CHECK-NEXT:    vsub.vv v8, v8, v12
750 ; CHECK-NEXT:    lui a0, 3
751 ; CHECK-NEXT:    addi a0, a0, 819
752 ; CHECK-NEXT:    vand.vx v12, v8, a0
753 ; CHECK-NEXT:    vsrl.vi v8, v8, 2
754 ; CHECK-NEXT:    vand.vx v8, v8, a0
755 ; CHECK-NEXT:    vadd.vv v8, v12, v8
756 ; CHECK-NEXT:    vsrl.vi v12, v8, 4
757 ; CHECK-NEXT:    vadd.vv v8, v8, v12
758 ; CHECK-NEXT:    lui a0, 1
759 ; CHECK-NEXT:    addi a0, a0, -241
760 ; CHECK-NEXT:    vand.vx v8, v8, a0
761 ; CHECK-NEXT:    li a0, 257
762 ; CHECK-NEXT:    vmul.vx v8, v8, a0
763 ; CHECK-NEXT:    vsrl.vi v8, v8, 8
764 ; CHECK-NEXT:    ret
766 ; CHECK-ZVBB-LABEL: vp_ctpop_nxv16i16_unmasked:
767 ; CHECK-ZVBB:       # %bb.0:
768 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e16, m4, ta, ma
769 ; CHECK-ZVBB-NEXT:    vcpop.v v8, v8
770 ; CHECK-ZVBB-NEXT:    ret
771   %head = insertelement <vscale x 16 x i1> poison, i1 true, i32 0
772   %m = shufflevector <vscale x 16 x i1> %head, <vscale x 16 x i1> poison, <vscale x 16 x i32> zeroinitializer
773   %v = call <vscale x 16 x i16> @llvm.vp.ctpop.nxv16i16(<vscale x 16 x i16> %va, <vscale x 16 x i1> %m, i32 %evl)
774   ret <vscale x 16 x i16> %v
777 declare <vscale x 32 x i16> @llvm.vp.ctpop.nxv32i16(<vscale x 32 x i16>, <vscale x 32 x i1>, i32)
779 define <vscale x 32 x i16> @vp_ctpop_nxv32i16(<vscale x 32 x i16> %va, <vscale x 32 x i1> %m, i32 zeroext %evl) {
780 ; CHECK-LABEL: vp_ctpop_nxv32i16:
781 ; CHECK:       # %bb.0:
782 ; CHECK-NEXT:    vsetvli zero, a0, e16, m8, ta, ma
783 ; CHECK-NEXT:    vsrl.vi v16, v8, 1, v0.t
784 ; CHECK-NEXT:    lui a0, 5
785 ; CHECK-NEXT:    addi a0, a0, 1365
786 ; CHECK-NEXT:    vand.vx v16, v16, a0, v0.t
787 ; CHECK-NEXT:    vsub.vv v8, v8, v16, v0.t
788 ; CHECK-NEXT:    lui a0, 3
789 ; CHECK-NEXT:    addi a0, a0, 819
790 ; CHECK-NEXT:    vand.vx v16, v8, a0, v0.t
791 ; CHECK-NEXT:    vsrl.vi v8, v8, 2, v0.t
792 ; CHECK-NEXT:    vand.vx v8, v8, a0, v0.t
793 ; CHECK-NEXT:    vadd.vv v8, v16, v8, v0.t
794 ; CHECK-NEXT:    vsrl.vi v16, v8, 4, v0.t
795 ; CHECK-NEXT:    vadd.vv v8, v8, v16, v0.t
796 ; CHECK-NEXT:    lui a0, 1
797 ; CHECK-NEXT:    addi a0, a0, -241
798 ; CHECK-NEXT:    vand.vx v8, v8, a0, v0.t
799 ; CHECK-NEXT:    li a0, 257
800 ; CHECK-NEXT:    vmul.vx v8, v8, a0, v0.t
801 ; CHECK-NEXT:    vsrl.vi v8, v8, 8, v0.t
802 ; CHECK-NEXT:    ret
804 ; CHECK-ZVBB-LABEL: vp_ctpop_nxv32i16:
805 ; CHECK-ZVBB:       # %bb.0:
806 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e16, m8, ta, ma
807 ; CHECK-ZVBB-NEXT:    vcpop.v v8, v8, v0.t
808 ; CHECK-ZVBB-NEXT:    ret
809   %v = call <vscale x 32 x i16> @llvm.vp.ctpop.nxv32i16(<vscale x 32 x i16> %va, <vscale x 32 x i1> %m, i32 %evl)
810   ret <vscale x 32 x i16> %v
813 define <vscale x 32 x i16> @vp_ctpop_nxv32i16_unmasked(<vscale x 32 x i16> %va, i32 zeroext %evl) {
814 ; CHECK-LABEL: vp_ctpop_nxv32i16_unmasked:
815 ; CHECK:       # %bb.0:
816 ; CHECK-NEXT:    vsetvli zero, a0, e16, m8, ta, ma
817 ; CHECK-NEXT:    vsrl.vi v16, v8, 1
818 ; CHECK-NEXT:    lui a0, 5
819 ; CHECK-NEXT:    addi a0, a0, 1365
820 ; CHECK-NEXT:    vand.vx v16, v16, a0
821 ; CHECK-NEXT:    vsub.vv v8, v8, v16
822 ; CHECK-NEXT:    lui a0, 3
823 ; CHECK-NEXT:    addi a0, a0, 819
824 ; CHECK-NEXT:    vand.vx v16, v8, a0
825 ; CHECK-NEXT:    vsrl.vi v8, v8, 2
826 ; CHECK-NEXT:    vand.vx v8, v8, a0
827 ; CHECK-NEXT:    vadd.vv v8, v16, v8
828 ; CHECK-NEXT:    vsrl.vi v16, v8, 4
829 ; CHECK-NEXT:    vadd.vv v8, v8, v16
830 ; CHECK-NEXT:    lui a0, 1
831 ; CHECK-NEXT:    addi a0, a0, -241
832 ; CHECK-NEXT:    vand.vx v8, v8, a0
833 ; CHECK-NEXT:    li a0, 257
834 ; CHECK-NEXT:    vmul.vx v8, v8, a0
835 ; CHECK-NEXT:    vsrl.vi v8, v8, 8
836 ; CHECK-NEXT:    ret
838 ; CHECK-ZVBB-LABEL: vp_ctpop_nxv32i16_unmasked:
839 ; CHECK-ZVBB:       # %bb.0:
840 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e16, m8, ta, ma
841 ; CHECK-ZVBB-NEXT:    vcpop.v v8, v8
842 ; CHECK-ZVBB-NEXT:    ret
843   %head = insertelement <vscale x 32 x i1> poison, i1 true, i32 0
844   %m = shufflevector <vscale x 32 x i1> %head, <vscale x 32 x i1> poison, <vscale x 32 x i32> zeroinitializer
845   %v = call <vscale x 32 x i16> @llvm.vp.ctpop.nxv32i16(<vscale x 32 x i16> %va, <vscale x 32 x i1> %m, i32 %evl)
846   ret <vscale x 32 x i16> %v
849 declare <vscale x 1 x i32> @llvm.vp.ctpop.nxv1i32(<vscale x 1 x i32>, <vscale x 1 x i1>, i32)
851 define <vscale x 1 x i32> @vp_ctpop_nxv1i32(<vscale x 1 x i32> %va, <vscale x 1 x i1> %m, i32 zeroext %evl) {
852 ; CHECK-LABEL: vp_ctpop_nxv1i32:
853 ; CHECK:       # %bb.0:
854 ; CHECK-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
855 ; CHECK-NEXT:    vsrl.vi v9, v8, 1, v0.t
856 ; CHECK-NEXT:    lui a0, 349525
857 ; CHECK-NEXT:    addi a0, a0, 1365
858 ; CHECK-NEXT:    vand.vx v9, v9, a0, v0.t
859 ; CHECK-NEXT:    vsub.vv v8, v8, v9, v0.t
860 ; CHECK-NEXT:    lui a0, 209715
861 ; CHECK-NEXT:    addi a0, a0, 819
862 ; CHECK-NEXT:    vand.vx v9, v8, a0, v0.t
863 ; CHECK-NEXT:    vsrl.vi v8, v8, 2, v0.t
864 ; CHECK-NEXT:    vand.vx v8, v8, a0, v0.t
865 ; CHECK-NEXT:    vadd.vv v8, v9, v8, v0.t
866 ; CHECK-NEXT:    vsrl.vi v9, v8, 4, v0.t
867 ; CHECK-NEXT:    vadd.vv v8, v8, v9, v0.t
868 ; CHECK-NEXT:    lui a0, 61681
869 ; CHECK-NEXT:    addi a0, a0, -241
870 ; CHECK-NEXT:    vand.vx v8, v8, a0, v0.t
871 ; CHECK-NEXT:    lui a0, 4112
872 ; CHECK-NEXT:    addi a0, a0, 257
873 ; CHECK-NEXT:    vmul.vx v8, v8, a0, v0.t
874 ; CHECK-NEXT:    vsrl.vi v8, v8, 24, v0.t
875 ; CHECK-NEXT:    ret
877 ; CHECK-ZVBB-LABEL: vp_ctpop_nxv1i32:
878 ; CHECK-ZVBB:       # %bb.0:
879 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
880 ; CHECK-ZVBB-NEXT:    vcpop.v v8, v8, v0.t
881 ; CHECK-ZVBB-NEXT:    ret
882   %v = call <vscale x 1 x i32> @llvm.vp.ctpop.nxv1i32(<vscale x 1 x i32> %va, <vscale x 1 x i1> %m, i32 %evl)
883   ret <vscale x 1 x i32> %v
886 define <vscale x 1 x i32> @vp_ctpop_nxv1i32_unmasked(<vscale x 1 x i32> %va, i32 zeroext %evl) {
887 ; CHECK-LABEL: vp_ctpop_nxv1i32_unmasked:
888 ; CHECK:       # %bb.0:
889 ; CHECK-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
890 ; CHECK-NEXT:    vsrl.vi v9, v8, 1
891 ; CHECK-NEXT:    lui a0, 349525
892 ; CHECK-NEXT:    addi a0, a0, 1365
893 ; CHECK-NEXT:    vand.vx v9, v9, a0
894 ; CHECK-NEXT:    vsub.vv v8, v8, v9
895 ; CHECK-NEXT:    lui a0, 209715
896 ; CHECK-NEXT:    addi a0, a0, 819
897 ; CHECK-NEXT:    vand.vx v9, v8, a0
898 ; CHECK-NEXT:    vsrl.vi v8, v8, 2
899 ; CHECK-NEXT:    vand.vx v8, v8, a0
900 ; CHECK-NEXT:    vadd.vv v8, v9, v8
901 ; CHECK-NEXT:    vsrl.vi v9, v8, 4
902 ; CHECK-NEXT:    vadd.vv v8, v8, v9
903 ; CHECK-NEXT:    lui a0, 61681
904 ; CHECK-NEXT:    addi a0, a0, -241
905 ; CHECK-NEXT:    vand.vx v8, v8, a0
906 ; CHECK-NEXT:    lui a0, 4112
907 ; CHECK-NEXT:    addi a0, a0, 257
908 ; CHECK-NEXT:    vmul.vx v8, v8, a0
909 ; CHECK-NEXT:    vsrl.vi v8, v8, 24
910 ; CHECK-NEXT:    ret
912 ; CHECK-ZVBB-LABEL: vp_ctpop_nxv1i32_unmasked:
913 ; CHECK-ZVBB:       # %bb.0:
914 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
915 ; CHECK-ZVBB-NEXT:    vcpop.v v8, v8
916 ; CHECK-ZVBB-NEXT:    ret
917   %head = insertelement <vscale x 1 x i1> poison, i1 true, i32 0
918   %m = shufflevector <vscale x 1 x i1> %head, <vscale x 1 x i1> poison, <vscale x 1 x i32> zeroinitializer
919   %v = call <vscale x 1 x i32> @llvm.vp.ctpop.nxv1i32(<vscale x 1 x i32> %va, <vscale x 1 x i1> %m, i32 %evl)
920   ret <vscale x 1 x i32> %v
923 declare <vscale x 2 x i32> @llvm.vp.ctpop.nxv2i32(<vscale x 2 x i32>, <vscale x 2 x i1>, i32)
925 define <vscale x 2 x i32> @vp_ctpop_nxv2i32(<vscale x 2 x i32> %va, <vscale x 2 x i1> %m, i32 zeroext %evl) {
926 ; CHECK-LABEL: vp_ctpop_nxv2i32:
927 ; CHECK:       # %bb.0:
928 ; CHECK-NEXT:    vsetvli zero, a0, e32, m1, ta, ma
929 ; CHECK-NEXT:    vsrl.vi v9, v8, 1, v0.t
930 ; CHECK-NEXT:    lui a0, 349525
931 ; CHECK-NEXT:    addi a0, a0, 1365
932 ; CHECK-NEXT:    vand.vx v9, v9, a0, v0.t
933 ; CHECK-NEXT:    vsub.vv v8, v8, v9, v0.t
934 ; CHECK-NEXT:    lui a0, 209715
935 ; CHECK-NEXT:    addi a0, a0, 819
936 ; CHECK-NEXT:    vand.vx v9, v8, a0, v0.t
937 ; CHECK-NEXT:    vsrl.vi v8, v8, 2, v0.t
938 ; CHECK-NEXT:    vand.vx v8, v8, a0, v0.t
939 ; CHECK-NEXT:    vadd.vv v8, v9, v8, v0.t
940 ; CHECK-NEXT:    vsrl.vi v9, v8, 4, v0.t
941 ; CHECK-NEXT:    vadd.vv v8, v8, v9, v0.t
942 ; CHECK-NEXT:    lui a0, 61681
943 ; CHECK-NEXT:    addi a0, a0, -241
944 ; CHECK-NEXT:    vand.vx v8, v8, a0, v0.t
945 ; CHECK-NEXT:    lui a0, 4112
946 ; CHECK-NEXT:    addi a0, a0, 257
947 ; CHECK-NEXT:    vmul.vx v8, v8, a0, v0.t
948 ; CHECK-NEXT:    vsrl.vi v8, v8, 24, v0.t
949 ; CHECK-NEXT:    ret
951 ; CHECK-ZVBB-LABEL: vp_ctpop_nxv2i32:
952 ; CHECK-ZVBB:       # %bb.0:
953 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e32, m1, ta, ma
954 ; CHECK-ZVBB-NEXT:    vcpop.v v8, v8, v0.t
955 ; CHECK-ZVBB-NEXT:    ret
956   %v = call <vscale x 2 x i32> @llvm.vp.ctpop.nxv2i32(<vscale x 2 x i32> %va, <vscale x 2 x i1> %m, i32 %evl)
957   ret <vscale x 2 x i32> %v
960 define <vscale x 2 x i32> @vp_ctpop_nxv2i32_unmasked(<vscale x 2 x i32> %va, i32 zeroext %evl) {
961 ; CHECK-LABEL: vp_ctpop_nxv2i32_unmasked:
962 ; CHECK:       # %bb.0:
963 ; CHECK-NEXT:    vsetvli zero, a0, e32, m1, ta, ma
964 ; CHECK-NEXT:    vsrl.vi v9, v8, 1
965 ; CHECK-NEXT:    lui a0, 349525
966 ; CHECK-NEXT:    addi a0, a0, 1365
967 ; CHECK-NEXT:    vand.vx v9, v9, a0
968 ; CHECK-NEXT:    vsub.vv v8, v8, v9
969 ; CHECK-NEXT:    lui a0, 209715
970 ; CHECK-NEXT:    addi a0, a0, 819
971 ; CHECK-NEXT:    vand.vx v9, v8, a0
972 ; CHECK-NEXT:    vsrl.vi v8, v8, 2
973 ; CHECK-NEXT:    vand.vx v8, v8, a0
974 ; CHECK-NEXT:    vadd.vv v8, v9, v8
975 ; CHECK-NEXT:    vsrl.vi v9, v8, 4
976 ; CHECK-NEXT:    vadd.vv v8, v8, v9
977 ; CHECK-NEXT:    lui a0, 61681
978 ; CHECK-NEXT:    addi a0, a0, -241
979 ; CHECK-NEXT:    vand.vx v8, v8, a0
980 ; CHECK-NEXT:    lui a0, 4112
981 ; CHECK-NEXT:    addi a0, a0, 257
982 ; CHECK-NEXT:    vmul.vx v8, v8, a0
983 ; CHECK-NEXT:    vsrl.vi v8, v8, 24
984 ; CHECK-NEXT:    ret
986 ; CHECK-ZVBB-LABEL: vp_ctpop_nxv2i32_unmasked:
987 ; CHECK-ZVBB:       # %bb.0:
988 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e32, m1, ta, ma
989 ; CHECK-ZVBB-NEXT:    vcpop.v v8, v8
990 ; CHECK-ZVBB-NEXT:    ret
991   %head = insertelement <vscale x 2 x i1> poison, i1 true, i32 0
992   %m = shufflevector <vscale x 2 x i1> %head, <vscale x 2 x i1> poison, <vscale x 2 x i32> zeroinitializer
993   %v = call <vscale x 2 x i32> @llvm.vp.ctpop.nxv2i32(<vscale x 2 x i32> %va, <vscale x 2 x i1> %m, i32 %evl)
994   ret <vscale x 2 x i32> %v
997 declare <vscale x 4 x i32> @llvm.vp.ctpop.nxv4i32(<vscale x 4 x i32>, <vscale x 4 x i1>, i32)
999 define <vscale x 4 x i32> @vp_ctpop_nxv4i32(<vscale x 4 x i32> %va, <vscale x 4 x i1> %m, i32 zeroext %evl) {
1000 ; CHECK-LABEL: vp_ctpop_nxv4i32:
1001 ; CHECK:       # %bb.0:
1002 ; CHECK-NEXT:    vsetvli zero, a0, e32, m2, ta, ma
1003 ; CHECK-NEXT:    vsrl.vi v10, v8, 1, v0.t
1004 ; CHECK-NEXT:    lui a0, 349525
1005 ; CHECK-NEXT:    addi a0, a0, 1365
1006 ; CHECK-NEXT:    vand.vx v10, v10, a0, v0.t
1007 ; CHECK-NEXT:    vsub.vv v8, v8, v10, v0.t
1008 ; CHECK-NEXT:    lui a0, 209715
1009 ; CHECK-NEXT:    addi a0, a0, 819
1010 ; CHECK-NEXT:    vand.vx v10, v8, a0, v0.t
1011 ; CHECK-NEXT:    vsrl.vi v8, v8, 2, v0.t
1012 ; CHECK-NEXT:    vand.vx v8, v8, a0, v0.t
1013 ; CHECK-NEXT:    vadd.vv v8, v10, v8, v0.t
1014 ; CHECK-NEXT:    vsrl.vi v10, v8, 4, v0.t
1015 ; CHECK-NEXT:    vadd.vv v8, v8, v10, v0.t
1016 ; CHECK-NEXT:    lui a0, 61681
1017 ; CHECK-NEXT:    addi a0, a0, -241
1018 ; CHECK-NEXT:    vand.vx v8, v8, a0, v0.t
1019 ; CHECK-NEXT:    lui a0, 4112
1020 ; CHECK-NEXT:    addi a0, a0, 257
1021 ; CHECK-NEXT:    vmul.vx v8, v8, a0, v0.t
1022 ; CHECK-NEXT:    vsrl.vi v8, v8, 24, v0.t
1023 ; CHECK-NEXT:    ret
1025 ; CHECK-ZVBB-LABEL: vp_ctpop_nxv4i32:
1026 ; CHECK-ZVBB:       # %bb.0:
1027 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e32, m2, ta, ma
1028 ; CHECK-ZVBB-NEXT:    vcpop.v v8, v8, v0.t
1029 ; CHECK-ZVBB-NEXT:    ret
1030   %v = call <vscale x 4 x i32> @llvm.vp.ctpop.nxv4i32(<vscale x 4 x i32> %va, <vscale x 4 x i1> %m, i32 %evl)
1031   ret <vscale x 4 x i32> %v
1034 define <vscale x 4 x i32> @vp_ctpop_nxv4i32_unmasked(<vscale x 4 x i32> %va, i32 zeroext %evl) {
1035 ; CHECK-LABEL: vp_ctpop_nxv4i32_unmasked:
1036 ; CHECK:       # %bb.0:
1037 ; CHECK-NEXT:    vsetvli zero, a0, e32, m2, ta, ma
1038 ; CHECK-NEXT:    vsrl.vi v10, v8, 1
1039 ; CHECK-NEXT:    lui a0, 349525
1040 ; CHECK-NEXT:    addi a0, a0, 1365
1041 ; CHECK-NEXT:    vand.vx v10, v10, a0
1042 ; CHECK-NEXT:    vsub.vv v8, v8, v10
1043 ; CHECK-NEXT:    lui a0, 209715
1044 ; CHECK-NEXT:    addi a0, a0, 819
1045 ; CHECK-NEXT:    vand.vx v10, v8, a0
1046 ; CHECK-NEXT:    vsrl.vi v8, v8, 2
1047 ; CHECK-NEXT:    vand.vx v8, v8, a0
1048 ; CHECK-NEXT:    vadd.vv v8, v10, v8
1049 ; CHECK-NEXT:    vsrl.vi v10, v8, 4
1050 ; CHECK-NEXT:    vadd.vv v8, v8, v10
1051 ; CHECK-NEXT:    lui a0, 61681
1052 ; CHECK-NEXT:    addi a0, a0, -241
1053 ; CHECK-NEXT:    vand.vx v8, v8, a0
1054 ; CHECK-NEXT:    lui a0, 4112
1055 ; CHECK-NEXT:    addi a0, a0, 257
1056 ; CHECK-NEXT:    vmul.vx v8, v8, a0
1057 ; CHECK-NEXT:    vsrl.vi v8, v8, 24
1058 ; CHECK-NEXT:    ret
1060 ; CHECK-ZVBB-LABEL: vp_ctpop_nxv4i32_unmasked:
1061 ; CHECK-ZVBB:       # %bb.0:
1062 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e32, m2, ta, ma
1063 ; CHECK-ZVBB-NEXT:    vcpop.v v8, v8
1064 ; CHECK-ZVBB-NEXT:    ret
1065   %head = insertelement <vscale x 4 x i1> poison, i1 true, i32 0
1066   %m = shufflevector <vscale x 4 x i1> %head, <vscale x 4 x i1> poison, <vscale x 4 x i32> zeroinitializer
1067   %v = call <vscale x 4 x i32> @llvm.vp.ctpop.nxv4i32(<vscale x 4 x i32> %va, <vscale x 4 x i1> %m, i32 %evl)
1068   ret <vscale x 4 x i32> %v
1071 declare <vscale x 8 x i32> @llvm.vp.ctpop.nxv8i32(<vscale x 8 x i32>, <vscale x 8 x i1>, i32)
1073 define <vscale x 8 x i32> @vp_ctpop_nxv8i32(<vscale x 8 x i32> %va, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1074 ; CHECK-LABEL: vp_ctpop_nxv8i32:
1075 ; CHECK:       # %bb.0:
1076 ; CHECK-NEXT:    vsetvli zero, a0, e32, m4, ta, ma
1077 ; CHECK-NEXT:    vsrl.vi v12, v8, 1, v0.t
1078 ; CHECK-NEXT:    lui a0, 349525
1079 ; CHECK-NEXT:    addi a0, a0, 1365
1080 ; CHECK-NEXT:    vand.vx v12, v12, a0, v0.t
1081 ; CHECK-NEXT:    vsub.vv v8, v8, v12, v0.t
1082 ; CHECK-NEXT:    lui a0, 209715
1083 ; CHECK-NEXT:    addi a0, a0, 819
1084 ; CHECK-NEXT:    vand.vx v12, v8, a0, v0.t
1085 ; CHECK-NEXT:    vsrl.vi v8, v8, 2, v0.t
1086 ; CHECK-NEXT:    vand.vx v8, v8, a0, v0.t
1087 ; CHECK-NEXT:    vadd.vv v8, v12, v8, v0.t
1088 ; CHECK-NEXT:    vsrl.vi v12, v8, 4, v0.t
1089 ; CHECK-NEXT:    vadd.vv v8, v8, v12, v0.t
1090 ; CHECK-NEXT:    lui a0, 61681
1091 ; CHECK-NEXT:    addi a0, a0, -241
1092 ; CHECK-NEXT:    vand.vx v8, v8, a0, v0.t
1093 ; CHECK-NEXT:    lui a0, 4112
1094 ; CHECK-NEXT:    addi a0, a0, 257
1095 ; CHECK-NEXT:    vmul.vx v8, v8, a0, v0.t
1096 ; CHECK-NEXT:    vsrl.vi v8, v8, 24, v0.t
1097 ; CHECK-NEXT:    ret
1099 ; CHECK-ZVBB-LABEL: vp_ctpop_nxv8i32:
1100 ; CHECK-ZVBB:       # %bb.0:
1101 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e32, m4, ta, ma
1102 ; CHECK-ZVBB-NEXT:    vcpop.v v8, v8, v0.t
1103 ; CHECK-ZVBB-NEXT:    ret
1104   %v = call <vscale x 8 x i32> @llvm.vp.ctpop.nxv8i32(<vscale x 8 x i32> %va, <vscale x 8 x i1> %m, i32 %evl)
1105   ret <vscale x 8 x i32> %v
1108 define <vscale x 8 x i32> @vp_ctpop_nxv8i32_unmasked(<vscale x 8 x i32> %va, i32 zeroext %evl) {
1109 ; CHECK-LABEL: vp_ctpop_nxv8i32_unmasked:
1110 ; CHECK:       # %bb.0:
1111 ; CHECK-NEXT:    vsetvli zero, a0, e32, m4, ta, ma
1112 ; CHECK-NEXT:    vsrl.vi v12, v8, 1
1113 ; CHECK-NEXT:    lui a0, 349525
1114 ; CHECK-NEXT:    addi a0, a0, 1365
1115 ; CHECK-NEXT:    vand.vx v12, v12, a0
1116 ; CHECK-NEXT:    vsub.vv v8, v8, v12
1117 ; CHECK-NEXT:    lui a0, 209715
1118 ; CHECK-NEXT:    addi a0, a0, 819
1119 ; CHECK-NEXT:    vand.vx v12, v8, a0
1120 ; CHECK-NEXT:    vsrl.vi v8, v8, 2
1121 ; CHECK-NEXT:    vand.vx v8, v8, a0
1122 ; CHECK-NEXT:    vadd.vv v8, v12, v8
1123 ; CHECK-NEXT:    vsrl.vi v12, v8, 4
1124 ; CHECK-NEXT:    vadd.vv v8, v8, v12
1125 ; CHECK-NEXT:    lui a0, 61681
1126 ; CHECK-NEXT:    addi a0, a0, -241
1127 ; CHECK-NEXT:    vand.vx v8, v8, a0
1128 ; CHECK-NEXT:    lui a0, 4112
1129 ; CHECK-NEXT:    addi a0, a0, 257
1130 ; CHECK-NEXT:    vmul.vx v8, v8, a0
1131 ; CHECK-NEXT:    vsrl.vi v8, v8, 24
1132 ; CHECK-NEXT:    ret
1134 ; CHECK-ZVBB-LABEL: vp_ctpop_nxv8i32_unmasked:
1135 ; CHECK-ZVBB:       # %bb.0:
1136 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e32, m4, ta, ma
1137 ; CHECK-ZVBB-NEXT:    vcpop.v v8, v8
1138 ; CHECK-ZVBB-NEXT:    ret
1139   %head = insertelement <vscale x 8 x i1> poison, i1 true, i32 0
1140   %m = shufflevector <vscale x 8 x i1> %head, <vscale x 8 x i1> poison, <vscale x 8 x i32> zeroinitializer
1141   %v = call <vscale x 8 x i32> @llvm.vp.ctpop.nxv8i32(<vscale x 8 x i32> %va, <vscale x 8 x i1> %m, i32 %evl)
1142   ret <vscale x 8 x i32> %v
1145 declare <vscale x 16 x i32> @llvm.vp.ctpop.nxv16i32(<vscale x 16 x i32>, <vscale x 16 x i1>, i32)
1147 define <vscale x 16 x i32> @vp_ctpop_nxv16i32(<vscale x 16 x i32> %va, <vscale x 16 x i1> %m, i32 zeroext %evl) {
1148 ; CHECK-LABEL: vp_ctpop_nxv16i32:
1149 ; CHECK:       # %bb.0:
1150 ; CHECK-NEXT:    vsetvli zero, a0, e32, m8, ta, ma
1151 ; CHECK-NEXT:    vsrl.vi v16, v8, 1, v0.t
1152 ; CHECK-NEXT:    lui a0, 349525
1153 ; CHECK-NEXT:    addi a0, a0, 1365
1154 ; CHECK-NEXT:    vand.vx v16, v16, a0, v0.t
1155 ; CHECK-NEXT:    vsub.vv v8, v8, v16, v0.t
1156 ; CHECK-NEXT:    lui a0, 209715
1157 ; CHECK-NEXT:    addi a0, a0, 819
1158 ; CHECK-NEXT:    vand.vx v16, v8, a0, v0.t
1159 ; CHECK-NEXT:    vsrl.vi v8, v8, 2, v0.t
1160 ; CHECK-NEXT:    vand.vx v8, v8, a0, v0.t
1161 ; CHECK-NEXT:    vadd.vv v8, v16, v8, v0.t
1162 ; CHECK-NEXT:    vsrl.vi v16, v8, 4, v0.t
1163 ; CHECK-NEXT:    vadd.vv v8, v8, v16, v0.t
1164 ; CHECK-NEXT:    lui a0, 61681
1165 ; CHECK-NEXT:    addi a0, a0, -241
1166 ; CHECK-NEXT:    vand.vx v8, v8, a0, v0.t
1167 ; CHECK-NEXT:    lui a0, 4112
1168 ; CHECK-NEXT:    addi a0, a0, 257
1169 ; CHECK-NEXT:    vmul.vx v8, v8, a0, v0.t
1170 ; CHECK-NEXT:    vsrl.vi v8, v8, 24, v0.t
1171 ; CHECK-NEXT:    ret
1173 ; CHECK-ZVBB-LABEL: vp_ctpop_nxv16i32:
1174 ; CHECK-ZVBB:       # %bb.0:
1175 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e32, m8, ta, ma
1176 ; CHECK-ZVBB-NEXT:    vcpop.v v8, v8, v0.t
1177 ; CHECK-ZVBB-NEXT:    ret
1178   %v = call <vscale x 16 x i32> @llvm.vp.ctpop.nxv16i32(<vscale x 16 x i32> %va, <vscale x 16 x i1> %m, i32 %evl)
1179   ret <vscale x 16 x i32> %v
1182 define <vscale x 16 x i32> @vp_ctpop_nxv16i32_unmasked(<vscale x 16 x i32> %va, i32 zeroext %evl) {
1183 ; CHECK-LABEL: vp_ctpop_nxv16i32_unmasked:
1184 ; CHECK:       # %bb.0:
1185 ; CHECK-NEXT:    vsetvli zero, a0, e32, m8, ta, ma
1186 ; CHECK-NEXT:    vsrl.vi v16, v8, 1
1187 ; CHECK-NEXT:    lui a0, 349525
1188 ; CHECK-NEXT:    addi a0, a0, 1365
1189 ; CHECK-NEXT:    vand.vx v16, v16, a0
1190 ; CHECK-NEXT:    vsub.vv v8, v8, v16
1191 ; CHECK-NEXT:    lui a0, 209715
1192 ; CHECK-NEXT:    addi a0, a0, 819
1193 ; CHECK-NEXT:    vand.vx v16, v8, a0
1194 ; CHECK-NEXT:    vsrl.vi v8, v8, 2
1195 ; CHECK-NEXT:    vand.vx v8, v8, a0
1196 ; CHECK-NEXT:    vadd.vv v8, v16, v8
1197 ; CHECK-NEXT:    vsrl.vi v16, v8, 4
1198 ; CHECK-NEXT:    vadd.vv v8, v8, v16
1199 ; CHECK-NEXT:    lui a0, 61681
1200 ; CHECK-NEXT:    addi a0, a0, -241
1201 ; CHECK-NEXT:    vand.vx v8, v8, a0
1202 ; CHECK-NEXT:    lui a0, 4112
1203 ; CHECK-NEXT:    addi a0, a0, 257
1204 ; CHECK-NEXT:    vmul.vx v8, v8, a0
1205 ; CHECK-NEXT:    vsrl.vi v8, v8, 24
1206 ; CHECK-NEXT:    ret
1208 ; CHECK-ZVBB-LABEL: vp_ctpop_nxv16i32_unmasked:
1209 ; CHECK-ZVBB:       # %bb.0:
1210 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e32, m8, ta, ma
1211 ; CHECK-ZVBB-NEXT:    vcpop.v v8, v8
1212 ; CHECK-ZVBB-NEXT:    ret
1213   %head = insertelement <vscale x 16 x i1> poison, i1 true, i32 0
1214   %m = shufflevector <vscale x 16 x i1> %head, <vscale x 16 x i1> poison, <vscale x 16 x i32> zeroinitializer
1215   %v = call <vscale x 16 x i32> @llvm.vp.ctpop.nxv16i32(<vscale x 16 x i32> %va, <vscale x 16 x i1> %m, i32 %evl)
1216   ret <vscale x 16 x i32> %v
1219 declare <vscale x 1 x i64> @llvm.vp.ctpop.nxv1i64(<vscale x 1 x i64>, <vscale x 1 x i1>, i32)
1221 define <vscale x 1 x i64> @vp_ctpop_nxv1i64(<vscale x 1 x i64> %va, <vscale x 1 x i1> %m, i32 zeroext %evl) {
1222 ; RV32-LABEL: vp_ctpop_nxv1i64:
1223 ; RV32:       # %bb.0:
1224 ; RV32-NEXT:    vsetvli zero, a0, e64, m1, ta, ma
1225 ; RV32-NEXT:    vsrl.vi v9, v8, 1, v0.t
1226 ; RV32-NEXT:    lui a1, 349525
1227 ; RV32-NEXT:    addi a1, a1, 1365
1228 ; RV32-NEXT:    vsetvli a2, zero, e32, m1, ta, ma
1229 ; RV32-NEXT:    vmv.v.x v10, a1
1230 ; RV32-NEXT:    vsetvli zero, a0, e64, m1, ta, ma
1231 ; RV32-NEXT:    vand.vv v9, v9, v10, v0.t
1232 ; RV32-NEXT:    vsub.vv v8, v8, v9, v0.t
1233 ; RV32-NEXT:    lui a1, 209715
1234 ; RV32-NEXT:    addi a1, a1, 819
1235 ; RV32-NEXT:    vsetvli a2, zero, e32, m1, ta, ma
1236 ; RV32-NEXT:    vmv.v.x v9, a1
1237 ; RV32-NEXT:    vsetvli zero, a0, e64, m1, ta, ma
1238 ; RV32-NEXT:    vand.vv v10, v8, v9, v0.t
1239 ; RV32-NEXT:    vsrl.vi v8, v8, 2, v0.t
1240 ; RV32-NEXT:    vand.vv v8, v8, v9, v0.t
1241 ; RV32-NEXT:    vadd.vv v8, v10, v8, v0.t
1242 ; RV32-NEXT:    vsrl.vi v9, v8, 4, v0.t
1243 ; RV32-NEXT:    vadd.vv v8, v8, v9, v0.t
1244 ; RV32-NEXT:    lui a1, 61681
1245 ; RV32-NEXT:    addi a1, a1, -241
1246 ; RV32-NEXT:    vsetvli a2, zero, e32, m1, ta, ma
1247 ; RV32-NEXT:    vmv.v.x v9, a1
1248 ; RV32-NEXT:    vsetvli zero, a0, e64, m1, ta, ma
1249 ; RV32-NEXT:    vand.vv v8, v8, v9, v0.t
1250 ; RV32-NEXT:    lui a1, 4112
1251 ; RV32-NEXT:    addi a1, a1, 257
1252 ; RV32-NEXT:    vsetvli a2, zero, e32, m1, ta, ma
1253 ; RV32-NEXT:    vmv.v.x v9, a1
1254 ; RV32-NEXT:    vsetvli zero, a0, e64, m1, ta, ma
1255 ; RV32-NEXT:    vmul.vv v8, v8, v9, v0.t
1256 ; RV32-NEXT:    li a0, 56
1257 ; RV32-NEXT:    vsrl.vx v8, v8, a0, v0.t
1258 ; RV32-NEXT:    ret
1260 ; RV64-LABEL: vp_ctpop_nxv1i64:
1261 ; RV64:       # %bb.0:
1262 ; RV64-NEXT:    vsetvli zero, a0, e64, m1, ta, ma
1263 ; RV64-NEXT:    vsrl.vi v9, v8, 1, v0.t
1264 ; RV64-NEXT:    lui a0, 349525
1265 ; RV64-NEXT:    addiw a0, a0, 1365
1266 ; RV64-NEXT:    slli a1, a0, 32
1267 ; RV64-NEXT:    add a0, a0, a1
1268 ; RV64-NEXT:    vand.vx v9, v9, a0, v0.t
1269 ; RV64-NEXT:    vsub.vv v8, v8, v9, v0.t
1270 ; RV64-NEXT:    lui a0, 209715
1271 ; RV64-NEXT:    addiw a0, a0, 819
1272 ; RV64-NEXT:    slli a1, a0, 32
1273 ; RV64-NEXT:    add a0, a0, a1
1274 ; RV64-NEXT:    vand.vx v9, v8, a0, v0.t
1275 ; RV64-NEXT:    vsrl.vi v8, v8, 2, v0.t
1276 ; RV64-NEXT:    vand.vx v8, v8, a0, v0.t
1277 ; RV64-NEXT:    vadd.vv v8, v9, v8, v0.t
1278 ; RV64-NEXT:    vsrl.vi v9, v8, 4, v0.t
1279 ; RV64-NEXT:    vadd.vv v8, v8, v9, v0.t
1280 ; RV64-NEXT:    lui a0, 61681
1281 ; RV64-NEXT:    addiw a0, a0, -241
1282 ; RV64-NEXT:    slli a1, a0, 32
1283 ; RV64-NEXT:    add a0, a0, a1
1284 ; RV64-NEXT:    vand.vx v8, v8, a0, v0.t
1285 ; RV64-NEXT:    lui a0, 4112
1286 ; RV64-NEXT:    addiw a0, a0, 257
1287 ; RV64-NEXT:    slli a1, a0, 32
1288 ; RV64-NEXT:    add a0, a0, a1
1289 ; RV64-NEXT:    vmul.vx v8, v8, a0, v0.t
1290 ; RV64-NEXT:    li a0, 56
1291 ; RV64-NEXT:    vsrl.vx v8, v8, a0, v0.t
1292 ; RV64-NEXT:    ret
1294 ; CHECK-ZVBB-LABEL: vp_ctpop_nxv1i64:
1295 ; CHECK-ZVBB:       # %bb.0:
1296 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e64, m1, ta, ma
1297 ; CHECK-ZVBB-NEXT:    vcpop.v v8, v8, v0.t
1298 ; CHECK-ZVBB-NEXT:    ret
1299   %v = call <vscale x 1 x i64> @llvm.vp.ctpop.nxv1i64(<vscale x 1 x i64> %va, <vscale x 1 x i1> %m, i32 %evl)
1300   ret <vscale x 1 x i64> %v
1303 define <vscale x 1 x i64> @vp_ctpop_nxv1i64_unmasked(<vscale x 1 x i64> %va, i32 zeroext %evl) {
1304 ; RV32-LABEL: vp_ctpop_nxv1i64_unmasked:
1305 ; RV32:       # %bb.0:
1306 ; RV32-NEXT:    vsetvli zero, a0, e64, m1, ta, ma
1307 ; RV32-NEXT:    vsrl.vi v9, v8, 1
1308 ; RV32-NEXT:    lui a1, 349525
1309 ; RV32-NEXT:    addi a1, a1, 1365
1310 ; RV32-NEXT:    vsetvli a2, zero, e32, m1, ta, ma
1311 ; RV32-NEXT:    vmv.v.x v10, a1
1312 ; RV32-NEXT:    vsetvli zero, a0, e64, m1, ta, ma
1313 ; RV32-NEXT:    vand.vv v9, v9, v10
1314 ; RV32-NEXT:    vsub.vv v8, v8, v9
1315 ; RV32-NEXT:    lui a1, 209715
1316 ; RV32-NEXT:    addi a1, a1, 819
1317 ; RV32-NEXT:    vsetvli a2, zero, e32, m1, ta, ma
1318 ; RV32-NEXT:    vmv.v.x v9, a1
1319 ; RV32-NEXT:    vsetvli zero, a0, e64, m1, ta, ma
1320 ; RV32-NEXT:    vand.vv v10, v8, v9
1321 ; RV32-NEXT:    vsrl.vi v8, v8, 2
1322 ; RV32-NEXT:    vand.vv v8, v8, v9
1323 ; RV32-NEXT:    vadd.vv v8, v10, v8
1324 ; RV32-NEXT:    vsrl.vi v9, v8, 4
1325 ; RV32-NEXT:    vadd.vv v8, v8, v9
1326 ; RV32-NEXT:    lui a1, 61681
1327 ; RV32-NEXT:    addi a1, a1, -241
1328 ; RV32-NEXT:    vsetvli a2, zero, e32, m1, ta, ma
1329 ; RV32-NEXT:    vmv.v.x v9, a1
1330 ; RV32-NEXT:    vsetvli zero, a0, e64, m1, ta, ma
1331 ; RV32-NEXT:    vand.vv v8, v8, v9
1332 ; RV32-NEXT:    lui a1, 4112
1333 ; RV32-NEXT:    addi a1, a1, 257
1334 ; RV32-NEXT:    vsetvli a2, zero, e32, m1, ta, ma
1335 ; RV32-NEXT:    vmv.v.x v9, a1
1336 ; RV32-NEXT:    vsetvli zero, a0, e64, m1, ta, ma
1337 ; RV32-NEXT:    vmul.vv v8, v8, v9
1338 ; RV32-NEXT:    li a0, 56
1339 ; RV32-NEXT:    vsrl.vx v8, v8, a0
1340 ; RV32-NEXT:    ret
1342 ; RV64-LABEL: vp_ctpop_nxv1i64_unmasked:
1343 ; RV64:       # %bb.0:
1344 ; RV64-NEXT:    vsetvli zero, a0, e64, m1, ta, ma
1345 ; RV64-NEXT:    vsrl.vi v9, v8, 1
1346 ; RV64-NEXT:    lui a0, 349525
1347 ; RV64-NEXT:    addiw a0, a0, 1365
1348 ; RV64-NEXT:    slli a1, a0, 32
1349 ; RV64-NEXT:    add a0, a0, a1
1350 ; RV64-NEXT:    vand.vx v9, v9, a0
1351 ; RV64-NEXT:    vsub.vv v8, v8, v9
1352 ; RV64-NEXT:    lui a0, 209715
1353 ; RV64-NEXT:    addiw a0, a0, 819
1354 ; RV64-NEXT:    slli a1, a0, 32
1355 ; RV64-NEXT:    add a0, a0, a1
1356 ; RV64-NEXT:    vand.vx v9, v8, a0
1357 ; RV64-NEXT:    vsrl.vi v8, v8, 2
1358 ; RV64-NEXT:    vand.vx v8, v8, a0
1359 ; RV64-NEXT:    vadd.vv v8, v9, v8
1360 ; RV64-NEXT:    vsrl.vi v9, v8, 4
1361 ; RV64-NEXT:    vadd.vv v8, v8, v9
1362 ; RV64-NEXT:    lui a0, 61681
1363 ; RV64-NEXT:    addiw a0, a0, -241
1364 ; RV64-NEXT:    slli a1, a0, 32
1365 ; RV64-NEXT:    add a0, a0, a1
1366 ; RV64-NEXT:    vand.vx v8, v8, a0
1367 ; RV64-NEXT:    lui a0, 4112
1368 ; RV64-NEXT:    addiw a0, a0, 257
1369 ; RV64-NEXT:    slli a1, a0, 32
1370 ; RV64-NEXT:    add a0, a0, a1
1371 ; RV64-NEXT:    vmul.vx v8, v8, a0
1372 ; RV64-NEXT:    li a0, 56
1373 ; RV64-NEXT:    vsrl.vx v8, v8, a0
1374 ; RV64-NEXT:    ret
1376 ; CHECK-ZVBB-LABEL: vp_ctpop_nxv1i64_unmasked:
1377 ; CHECK-ZVBB:       # %bb.0:
1378 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e64, m1, ta, ma
1379 ; CHECK-ZVBB-NEXT:    vcpop.v v8, v8
1380 ; CHECK-ZVBB-NEXT:    ret
1381   %head = insertelement <vscale x 1 x i1> poison, i1 true, i32 0
1382   %m = shufflevector <vscale x 1 x i1> %head, <vscale x 1 x i1> poison, <vscale x 1 x i32> zeroinitializer
1383   %v = call <vscale x 1 x i64> @llvm.vp.ctpop.nxv1i64(<vscale x 1 x i64> %va, <vscale x 1 x i1> %m, i32 %evl)
1384   ret <vscale x 1 x i64> %v
1387 declare <vscale x 2 x i64> @llvm.vp.ctpop.nxv2i64(<vscale x 2 x i64>, <vscale x 2 x i1>, i32)
1389 define <vscale x 2 x i64> @vp_ctpop_nxv2i64(<vscale x 2 x i64> %va, <vscale x 2 x i1> %m, i32 zeroext %evl) {
1390 ; RV32-LABEL: vp_ctpop_nxv2i64:
1391 ; RV32:       # %bb.0:
1392 ; RV32-NEXT:    vsetvli zero, a0, e64, m2, ta, ma
1393 ; RV32-NEXT:    vsrl.vi v10, v8, 1, v0.t
1394 ; RV32-NEXT:    lui a1, 349525
1395 ; RV32-NEXT:    addi a1, a1, 1365
1396 ; RV32-NEXT:    vsetvli a2, zero, e32, m2, ta, ma
1397 ; RV32-NEXT:    vmv.v.x v12, a1
1398 ; RV32-NEXT:    vsetvli zero, a0, e64, m2, ta, ma
1399 ; RV32-NEXT:    vand.vv v10, v10, v12, v0.t
1400 ; RV32-NEXT:    vsub.vv v8, v8, v10, v0.t
1401 ; RV32-NEXT:    lui a1, 209715
1402 ; RV32-NEXT:    addi a1, a1, 819
1403 ; RV32-NEXT:    vsetvli a2, zero, e32, m2, ta, ma
1404 ; RV32-NEXT:    vmv.v.x v10, a1
1405 ; RV32-NEXT:    vsetvli zero, a0, e64, m2, ta, ma
1406 ; RV32-NEXT:    vand.vv v12, v8, v10, v0.t
1407 ; RV32-NEXT:    vsrl.vi v8, v8, 2, v0.t
1408 ; RV32-NEXT:    vand.vv v8, v8, v10, v0.t
1409 ; RV32-NEXT:    vadd.vv v8, v12, v8, v0.t
1410 ; RV32-NEXT:    vsrl.vi v10, v8, 4, v0.t
1411 ; RV32-NEXT:    vadd.vv v8, v8, v10, v0.t
1412 ; RV32-NEXT:    lui a1, 61681
1413 ; RV32-NEXT:    addi a1, a1, -241
1414 ; RV32-NEXT:    vsetvli a2, zero, e32, m2, ta, ma
1415 ; RV32-NEXT:    vmv.v.x v10, a1
1416 ; RV32-NEXT:    vsetvli zero, a0, e64, m2, ta, ma
1417 ; RV32-NEXT:    vand.vv v8, v8, v10, v0.t
1418 ; RV32-NEXT:    lui a1, 4112
1419 ; RV32-NEXT:    addi a1, a1, 257
1420 ; RV32-NEXT:    vsetvli a2, zero, e32, m2, ta, ma
1421 ; RV32-NEXT:    vmv.v.x v10, a1
1422 ; RV32-NEXT:    vsetvli zero, a0, e64, m2, ta, ma
1423 ; RV32-NEXT:    vmul.vv v8, v8, v10, v0.t
1424 ; RV32-NEXT:    li a0, 56
1425 ; RV32-NEXT:    vsrl.vx v8, v8, a0, v0.t
1426 ; RV32-NEXT:    ret
1428 ; RV64-LABEL: vp_ctpop_nxv2i64:
1429 ; RV64:       # %bb.0:
1430 ; RV64-NEXT:    vsetvli zero, a0, e64, m2, ta, ma
1431 ; RV64-NEXT:    vsrl.vi v10, v8, 1, v0.t
1432 ; RV64-NEXT:    lui a0, 349525
1433 ; RV64-NEXT:    addiw a0, a0, 1365
1434 ; RV64-NEXT:    slli a1, a0, 32
1435 ; RV64-NEXT:    add a0, a0, a1
1436 ; RV64-NEXT:    vand.vx v10, v10, a0, v0.t
1437 ; RV64-NEXT:    vsub.vv v8, v8, v10, v0.t
1438 ; RV64-NEXT:    lui a0, 209715
1439 ; RV64-NEXT:    addiw a0, a0, 819
1440 ; RV64-NEXT:    slli a1, a0, 32
1441 ; RV64-NEXT:    add a0, a0, a1
1442 ; RV64-NEXT:    vand.vx v10, v8, a0, v0.t
1443 ; RV64-NEXT:    vsrl.vi v8, v8, 2, v0.t
1444 ; RV64-NEXT:    vand.vx v8, v8, a0, v0.t
1445 ; RV64-NEXT:    vadd.vv v8, v10, v8, v0.t
1446 ; RV64-NEXT:    vsrl.vi v10, v8, 4, v0.t
1447 ; RV64-NEXT:    vadd.vv v8, v8, v10, v0.t
1448 ; RV64-NEXT:    lui a0, 61681
1449 ; RV64-NEXT:    addiw a0, a0, -241
1450 ; RV64-NEXT:    slli a1, a0, 32
1451 ; RV64-NEXT:    add a0, a0, a1
1452 ; RV64-NEXT:    vand.vx v8, v8, a0, v0.t
1453 ; RV64-NEXT:    lui a0, 4112
1454 ; RV64-NEXT:    addiw a0, a0, 257
1455 ; RV64-NEXT:    slli a1, a0, 32
1456 ; RV64-NEXT:    add a0, a0, a1
1457 ; RV64-NEXT:    vmul.vx v8, v8, a0, v0.t
1458 ; RV64-NEXT:    li a0, 56
1459 ; RV64-NEXT:    vsrl.vx v8, v8, a0, v0.t
1460 ; RV64-NEXT:    ret
1462 ; CHECK-ZVBB-LABEL: vp_ctpop_nxv2i64:
1463 ; CHECK-ZVBB:       # %bb.0:
1464 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e64, m2, ta, ma
1465 ; CHECK-ZVBB-NEXT:    vcpop.v v8, v8, v0.t
1466 ; CHECK-ZVBB-NEXT:    ret
1467   %v = call <vscale x 2 x i64> @llvm.vp.ctpop.nxv2i64(<vscale x 2 x i64> %va, <vscale x 2 x i1> %m, i32 %evl)
1468   ret <vscale x 2 x i64> %v
1471 define <vscale x 2 x i64> @vp_ctpop_nxv2i64_unmasked(<vscale x 2 x i64> %va, i32 zeroext %evl) {
1472 ; RV32-LABEL: vp_ctpop_nxv2i64_unmasked:
1473 ; RV32:       # %bb.0:
1474 ; RV32-NEXT:    vsetvli zero, a0, e64, m2, ta, ma
1475 ; RV32-NEXT:    vsrl.vi v10, v8, 1
1476 ; RV32-NEXT:    lui a1, 349525
1477 ; RV32-NEXT:    addi a1, a1, 1365
1478 ; RV32-NEXT:    vsetvli a2, zero, e32, m2, ta, ma
1479 ; RV32-NEXT:    vmv.v.x v12, a1
1480 ; RV32-NEXT:    vsetvli zero, a0, e64, m2, ta, ma
1481 ; RV32-NEXT:    vand.vv v10, v10, v12
1482 ; RV32-NEXT:    vsub.vv v8, v8, v10
1483 ; RV32-NEXT:    lui a1, 209715
1484 ; RV32-NEXT:    addi a1, a1, 819
1485 ; RV32-NEXT:    vsetvli a2, zero, e32, m2, ta, ma
1486 ; RV32-NEXT:    vmv.v.x v10, a1
1487 ; RV32-NEXT:    vsetvli zero, a0, e64, m2, ta, ma
1488 ; RV32-NEXT:    vand.vv v12, v8, v10
1489 ; RV32-NEXT:    vsrl.vi v8, v8, 2
1490 ; RV32-NEXT:    vand.vv v8, v8, v10
1491 ; RV32-NEXT:    vadd.vv v8, v12, v8
1492 ; RV32-NEXT:    vsrl.vi v10, v8, 4
1493 ; RV32-NEXT:    vadd.vv v8, v8, v10
1494 ; RV32-NEXT:    lui a1, 61681
1495 ; RV32-NEXT:    addi a1, a1, -241
1496 ; RV32-NEXT:    vsetvli a2, zero, e32, m2, ta, ma
1497 ; RV32-NEXT:    vmv.v.x v10, a1
1498 ; RV32-NEXT:    vsetvli zero, a0, e64, m2, ta, ma
1499 ; RV32-NEXT:    vand.vv v8, v8, v10
1500 ; RV32-NEXT:    lui a1, 4112
1501 ; RV32-NEXT:    addi a1, a1, 257
1502 ; RV32-NEXT:    vsetvli a2, zero, e32, m2, ta, ma
1503 ; RV32-NEXT:    vmv.v.x v10, a1
1504 ; RV32-NEXT:    vsetvli zero, a0, e64, m2, ta, ma
1505 ; RV32-NEXT:    vmul.vv v8, v8, v10
1506 ; RV32-NEXT:    li a0, 56
1507 ; RV32-NEXT:    vsrl.vx v8, v8, a0
1508 ; RV32-NEXT:    ret
1510 ; RV64-LABEL: vp_ctpop_nxv2i64_unmasked:
1511 ; RV64:       # %bb.0:
1512 ; RV64-NEXT:    vsetvli zero, a0, e64, m2, ta, ma
1513 ; RV64-NEXT:    vsrl.vi v10, v8, 1
1514 ; RV64-NEXT:    lui a0, 349525
1515 ; RV64-NEXT:    addiw a0, a0, 1365
1516 ; RV64-NEXT:    slli a1, a0, 32
1517 ; RV64-NEXT:    add a0, a0, a1
1518 ; RV64-NEXT:    vand.vx v10, v10, a0
1519 ; RV64-NEXT:    vsub.vv v8, v8, v10
1520 ; RV64-NEXT:    lui a0, 209715
1521 ; RV64-NEXT:    addiw a0, a0, 819
1522 ; RV64-NEXT:    slli a1, a0, 32
1523 ; RV64-NEXT:    add a0, a0, a1
1524 ; RV64-NEXT:    vand.vx v10, v8, a0
1525 ; RV64-NEXT:    vsrl.vi v8, v8, 2
1526 ; RV64-NEXT:    vand.vx v8, v8, a0
1527 ; RV64-NEXT:    vadd.vv v8, v10, v8
1528 ; RV64-NEXT:    vsrl.vi v10, v8, 4
1529 ; RV64-NEXT:    vadd.vv v8, v8, v10
1530 ; RV64-NEXT:    lui a0, 61681
1531 ; RV64-NEXT:    addiw a0, a0, -241
1532 ; RV64-NEXT:    slli a1, a0, 32
1533 ; RV64-NEXT:    add a0, a0, a1
1534 ; RV64-NEXT:    vand.vx v8, v8, a0
1535 ; RV64-NEXT:    lui a0, 4112
1536 ; RV64-NEXT:    addiw a0, a0, 257
1537 ; RV64-NEXT:    slli a1, a0, 32
1538 ; RV64-NEXT:    add a0, a0, a1
1539 ; RV64-NEXT:    vmul.vx v8, v8, a0
1540 ; RV64-NEXT:    li a0, 56
1541 ; RV64-NEXT:    vsrl.vx v8, v8, a0
1542 ; RV64-NEXT:    ret
1544 ; CHECK-ZVBB-LABEL: vp_ctpop_nxv2i64_unmasked:
1545 ; CHECK-ZVBB:       # %bb.0:
1546 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e64, m2, ta, ma
1547 ; CHECK-ZVBB-NEXT:    vcpop.v v8, v8
1548 ; CHECK-ZVBB-NEXT:    ret
1549   %head = insertelement <vscale x 2 x i1> poison, i1 true, i32 0
1550   %m = shufflevector <vscale x 2 x i1> %head, <vscale x 2 x i1> poison, <vscale x 2 x i32> zeroinitializer
1551   %v = call <vscale x 2 x i64> @llvm.vp.ctpop.nxv2i64(<vscale x 2 x i64> %va, <vscale x 2 x i1> %m, i32 %evl)
1552   ret <vscale x 2 x i64> %v
1555 declare <vscale x 4 x i64> @llvm.vp.ctpop.nxv4i64(<vscale x 4 x i64>, <vscale x 4 x i1>, i32)
1557 define <vscale x 4 x i64> @vp_ctpop_nxv4i64(<vscale x 4 x i64> %va, <vscale x 4 x i1> %m, i32 zeroext %evl) {
1558 ; RV32-LABEL: vp_ctpop_nxv4i64:
1559 ; RV32:       # %bb.0:
1560 ; RV32-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
1561 ; RV32-NEXT:    vsrl.vi v12, v8, 1, v0.t
1562 ; RV32-NEXT:    lui a1, 349525
1563 ; RV32-NEXT:    addi a1, a1, 1365
1564 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1565 ; RV32-NEXT:    vmv.v.x v16, a1
1566 ; RV32-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
1567 ; RV32-NEXT:    vand.vv v12, v12, v16, v0.t
1568 ; RV32-NEXT:    vsub.vv v8, v8, v12, v0.t
1569 ; RV32-NEXT:    lui a1, 209715
1570 ; RV32-NEXT:    addi a1, a1, 819
1571 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1572 ; RV32-NEXT:    vmv.v.x v12, a1
1573 ; RV32-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
1574 ; RV32-NEXT:    vand.vv v16, v8, v12, v0.t
1575 ; RV32-NEXT:    vsrl.vi v8, v8, 2, v0.t
1576 ; RV32-NEXT:    vand.vv v8, v8, v12, v0.t
1577 ; RV32-NEXT:    vadd.vv v8, v16, v8, v0.t
1578 ; RV32-NEXT:    vsrl.vi v12, v8, 4, v0.t
1579 ; RV32-NEXT:    vadd.vv v8, v8, v12, v0.t
1580 ; RV32-NEXT:    lui a1, 61681
1581 ; RV32-NEXT:    addi a1, a1, -241
1582 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1583 ; RV32-NEXT:    vmv.v.x v12, a1
1584 ; RV32-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
1585 ; RV32-NEXT:    vand.vv v8, v8, v12, v0.t
1586 ; RV32-NEXT:    lui a1, 4112
1587 ; RV32-NEXT:    addi a1, a1, 257
1588 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1589 ; RV32-NEXT:    vmv.v.x v12, a1
1590 ; RV32-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
1591 ; RV32-NEXT:    vmul.vv v8, v8, v12, v0.t
1592 ; RV32-NEXT:    li a0, 56
1593 ; RV32-NEXT:    vsrl.vx v8, v8, a0, v0.t
1594 ; RV32-NEXT:    ret
1596 ; RV64-LABEL: vp_ctpop_nxv4i64:
1597 ; RV64:       # %bb.0:
1598 ; RV64-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
1599 ; RV64-NEXT:    vsrl.vi v12, v8, 1, v0.t
1600 ; RV64-NEXT:    lui a0, 349525
1601 ; RV64-NEXT:    addiw a0, a0, 1365
1602 ; RV64-NEXT:    slli a1, a0, 32
1603 ; RV64-NEXT:    add a0, a0, a1
1604 ; RV64-NEXT:    vand.vx v12, v12, a0, v0.t
1605 ; RV64-NEXT:    vsub.vv v8, v8, v12, v0.t
1606 ; RV64-NEXT:    lui a0, 209715
1607 ; RV64-NEXT:    addiw a0, a0, 819
1608 ; RV64-NEXT:    slli a1, a0, 32
1609 ; RV64-NEXT:    add a0, a0, a1
1610 ; RV64-NEXT:    vand.vx v12, v8, a0, v0.t
1611 ; RV64-NEXT:    vsrl.vi v8, v8, 2, v0.t
1612 ; RV64-NEXT:    vand.vx v8, v8, a0, v0.t
1613 ; RV64-NEXT:    vadd.vv v8, v12, v8, v0.t
1614 ; RV64-NEXT:    vsrl.vi v12, v8, 4, v0.t
1615 ; RV64-NEXT:    vadd.vv v8, v8, v12, v0.t
1616 ; RV64-NEXT:    lui a0, 61681
1617 ; RV64-NEXT:    addiw a0, a0, -241
1618 ; RV64-NEXT:    slli a1, a0, 32
1619 ; RV64-NEXT:    add a0, a0, a1
1620 ; RV64-NEXT:    vand.vx v8, v8, a0, v0.t
1621 ; RV64-NEXT:    lui a0, 4112
1622 ; RV64-NEXT:    addiw a0, a0, 257
1623 ; RV64-NEXT:    slli a1, a0, 32
1624 ; RV64-NEXT:    add a0, a0, a1
1625 ; RV64-NEXT:    vmul.vx v8, v8, a0, v0.t
1626 ; RV64-NEXT:    li a0, 56
1627 ; RV64-NEXT:    vsrl.vx v8, v8, a0, v0.t
1628 ; RV64-NEXT:    ret
1630 ; CHECK-ZVBB-LABEL: vp_ctpop_nxv4i64:
1631 ; CHECK-ZVBB:       # %bb.0:
1632 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
1633 ; CHECK-ZVBB-NEXT:    vcpop.v v8, v8, v0.t
1634 ; CHECK-ZVBB-NEXT:    ret
1635   %v = call <vscale x 4 x i64> @llvm.vp.ctpop.nxv4i64(<vscale x 4 x i64> %va, <vscale x 4 x i1> %m, i32 %evl)
1636   ret <vscale x 4 x i64> %v
1639 define <vscale x 4 x i64> @vp_ctpop_nxv4i64_unmasked(<vscale x 4 x i64> %va, i32 zeroext %evl) {
1640 ; RV32-LABEL: vp_ctpop_nxv4i64_unmasked:
1641 ; RV32:       # %bb.0:
1642 ; RV32-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
1643 ; RV32-NEXT:    vsrl.vi v12, v8, 1
1644 ; RV32-NEXT:    lui a1, 349525
1645 ; RV32-NEXT:    addi a1, a1, 1365
1646 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1647 ; RV32-NEXT:    vmv.v.x v16, a1
1648 ; RV32-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
1649 ; RV32-NEXT:    vand.vv v12, v12, v16
1650 ; RV32-NEXT:    vsub.vv v8, v8, v12
1651 ; RV32-NEXT:    lui a1, 209715
1652 ; RV32-NEXT:    addi a1, a1, 819
1653 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1654 ; RV32-NEXT:    vmv.v.x v12, a1
1655 ; RV32-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
1656 ; RV32-NEXT:    vand.vv v16, v8, v12
1657 ; RV32-NEXT:    vsrl.vi v8, v8, 2
1658 ; RV32-NEXT:    vand.vv v8, v8, v12
1659 ; RV32-NEXT:    vadd.vv v8, v16, v8
1660 ; RV32-NEXT:    vsrl.vi v12, v8, 4
1661 ; RV32-NEXT:    vadd.vv v8, v8, v12
1662 ; RV32-NEXT:    lui a1, 61681
1663 ; RV32-NEXT:    addi a1, a1, -241
1664 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1665 ; RV32-NEXT:    vmv.v.x v12, a1
1666 ; RV32-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
1667 ; RV32-NEXT:    vand.vv v8, v8, v12
1668 ; RV32-NEXT:    lui a1, 4112
1669 ; RV32-NEXT:    addi a1, a1, 257
1670 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1671 ; RV32-NEXT:    vmv.v.x v12, a1
1672 ; RV32-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
1673 ; RV32-NEXT:    vmul.vv v8, v8, v12
1674 ; RV32-NEXT:    li a0, 56
1675 ; RV32-NEXT:    vsrl.vx v8, v8, a0
1676 ; RV32-NEXT:    ret
1678 ; RV64-LABEL: vp_ctpop_nxv4i64_unmasked:
1679 ; RV64:       # %bb.0:
1680 ; RV64-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
1681 ; RV64-NEXT:    vsrl.vi v12, v8, 1
1682 ; RV64-NEXT:    lui a0, 349525
1683 ; RV64-NEXT:    addiw a0, a0, 1365
1684 ; RV64-NEXT:    slli a1, a0, 32
1685 ; RV64-NEXT:    add a0, a0, a1
1686 ; RV64-NEXT:    vand.vx v12, v12, a0
1687 ; RV64-NEXT:    vsub.vv v8, v8, v12
1688 ; RV64-NEXT:    lui a0, 209715
1689 ; RV64-NEXT:    addiw a0, a0, 819
1690 ; RV64-NEXT:    slli a1, a0, 32
1691 ; RV64-NEXT:    add a0, a0, a1
1692 ; RV64-NEXT:    vand.vx v12, v8, a0
1693 ; RV64-NEXT:    vsrl.vi v8, v8, 2
1694 ; RV64-NEXT:    vand.vx v8, v8, a0
1695 ; RV64-NEXT:    vadd.vv v8, v12, v8
1696 ; RV64-NEXT:    vsrl.vi v12, v8, 4
1697 ; RV64-NEXT:    vadd.vv v8, v8, v12
1698 ; RV64-NEXT:    lui a0, 61681
1699 ; RV64-NEXT:    addiw a0, a0, -241
1700 ; RV64-NEXT:    slli a1, a0, 32
1701 ; RV64-NEXT:    add a0, a0, a1
1702 ; RV64-NEXT:    vand.vx v8, v8, a0
1703 ; RV64-NEXT:    lui a0, 4112
1704 ; RV64-NEXT:    addiw a0, a0, 257
1705 ; RV64-NEXT:    slli a1, a0, 32
1706 ; RV64-NEXT:    add a0, a0, a1
1707 ; RV64-NEXT:    vmul.vx v8, v8, a0
1708 ; RV64-NEXT:    li a0, 56
1709 ; RV64-NEXT:    vsrl.vx v8, v8, a0
1710 ; RV64-NEXT:    ret
1712 ; CHECK-ZVBB-LABEL: vp_ctpop_nxv4i64_unmasked:
1713 ; CHECK-ZVBB:       # %bb.0:
1714 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
1715 ; CHECK-ZVBB-NEXT:    vcpop.v v8, v8
1716 ; CHECK-ZVBB-NEXT:    ret
1717   %head = insertelement <vscale x 4 x i1> poison, i1 true, i32 0
1718   %m = shufflevector <vscale x 4 x i1> %head, <vscale x 4 x i1> poison, <vscale x 4 x i32> zeroinitializer
1719   %v = call <vscale x 4 x i64> @llvm.vp.ctpop.nxv4i64(<vscale x 4 x i64> %va, <vscale x 4 x i1> %m, i32 %evl)
1720   ret <vscale x 4 x i64> %v
1723 declare <vscale x 7 x i64> @llvm.vp.ctpop.nxv7i64(<vscale x 7 x i64>, <vscale x 7 x i1>, i32)
1725 define <vscale x 7 x i64> @vp_ctpop_nxv7i64(<vscale x 7 x i64> %va, <vscale x 7 x i1> %m, i32 zeroext %evl) {
1726 ; RV32-LABEL: vp_ctpop_nxv7i64:
1727 ; RV32:       # %bb.0:
1728 ; RV32-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1729 ; RV32-NEXT:    vsrl.vi v16, v8, 1, v0.t
1730 ; RV32-NEXT:    lui a1, 349525
1731 ; RV32-NEXT:    addi a1, a1, 1365
1732 ; RV32-NEXT:    vsetvli a2, zero, e32, m8, ta, ma
1733 ; RV32-NEXT:    vmv.v.x v24, a1
1734 ; RV32-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1735 ; RV32-NEXT:    vand.vv v16, v16, v24, v0.t
1736 ; RV32-NEXT:    vsub.vv v8, v8, v16, v0.t
1737 ; RV32-NEXT:    lui a1, 209715
1738 ; RV32-NEXT:    addi a1, a1, 819
1739 ; RV32-NEXT:    vsetvli a2, zero, e32, m8, ta, ma
1740 ; RV32-NEXT:    vmv.v.x v16, a1
1741 ; RV32-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1742 ; RV32-NEXT:    vand.vv v24, v8, v16, v0.t
1743 ; RV32-NEXT:    vsrl.vi v8, v8, 2, v0.t
1744 ; RV32-NEXT:    vand.vv v8, v8, v16, v0.t
1745 ; RV32-NEXT:    vadd.vv v8, v24, v8, v0.t
1746 ; RV32-NEXT:    vsrl.vi v16, v8, 4, v0.t
1747 ; RV32-NEXT:    vadd.vv v8, v8, v16, v0.t
1748 ; RV32-NEXT:    lui a1, 61681
1749 ; RV32-NEXT:    addi a1, a1, -241
1750 ; RV32-NEXT:    vsetvli a2, zero, e32, m8, ta, ma
1751 ; RV32-NEXT:    vmv.v.x v16, a1
1752 ; RV32-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1753 ; RV32-NEXT:    vand.vv v8, v8, v16, v0.t
1754 ; RV32-NEXT:    lui a1, 4112
1755 ; RV32-NEXT:    addi a1, a1, 257
1756 ; RV32-NEXT:    vsetvli a2, zero, e32, m8, ta, ma
1757 ; RV32-NEXT:    vmv.v.x v16, a1
1758 ; RV32-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1759 ; RV32-NEXT:    vmul.vv v8, v8, v16, v0.t
1760 ; RV32-NEXT:    li a0, 56
1761 ; RV32-NEXT:    vsrl.vx v8, v8, a0, v0.t
1762 ; RV32-NEXT:    ret
1764 ; RV64-LABEL: vp_ctpop_nxv7i64:
1765 ; RV64:       # %bb.0:
1766 ; RV64-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1767 ; RV64-NEXT:    vsrl.vi v16, v8, 1, v0.t
1768 ; RV64-NEXT:    lui a0, 349525
1769 ; RV64-NEXT:    addiw a0, a0, 1365
1770 ; RV64-NEXT:    slli a1, a0, 32
1771 ; RV64-NEXT:    add a0, a0, a1
1772 ; RV64-NEXT:    vand.vx v16, v16, a0, v0.t
1773 ; RV64-NEXT:    vsub.vv v8, v8, v16, v0.t
1774 ; RV64-NEXT:    lui a0, 209715
1775 ; RV64-NEXT:    addiw a0, a0, 819
1776 ; RV64-NEXT:    slli a1, a0, 32
1777 ; RV64-NEXT:    add a0, a0, a1
1778 ; RV64-NEXT:    vand.vx v16, v8, a0, v0.t
1779 ; RV64-NEXT:    vsrl.vi v8, v8, 2, v0.t
1780 ; RV64-NEXT:    vand.vx v8, v8, a0, v0.t
1781 ; RV64-NEXT:    vadd.vv v8, v16, v8, v0.t
1782 ; RV64-NEXT:    vsrl.vi v16, v8, 4, v0.t
1783 ; RV64-NEXT:    vadd.vv v8, v8, v16, v0.t
1784 ; RV64-NEXT:    lui a0, 61681
1785 ; RV64-NEXT:    addiw a0, a0, -241
1786 ; RV64-NEXT:    slli a1, a0, 32
1787 ; RV64-NEXT:    add a0, a0, a1
1788 ; RV64-NEXT:    vand.vx v8, v8, a0, v0.t
1789 ; RV64-NEXT:    lui a0, 4112
1790 ; RV64-NEXT:    addiw a0, a0, 257
1791 ; RV64-NEXT:    slli a1, a0, 32
1792 ; RV64-NEXT:    add a0, a0, a1
1793 ; RV64-NEXT:    vmul.vx v8, v8, a0, v0.t
1794 ; RV64-NEXT:    li a0, 56
1795 ; RV64-NEXT:    vsrl.vx v8, v8, a0, v0.t
1796 ; RV64-NEXT:    ret
1798 ; CHECK-ZVBB-LABEL: vp_ctpop_nxv7i64:
1799 ; CHECK-ZVBB:       # %bb.0:
1800 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1801 ; CHECK-ZVBB-NEXT:    vcpop.v v8, v8, v0.t
1802 ; CHECK-ZVBB-NEXT:    ret
1803   %v = call <vscale x 7 x i64> @llvm.vp.ctpop.nxv7i64(<vscale x 7 x i64> %va, <vscale x 7 x i1> %m, i32 %evl)
1804   ret <vscale x 7 x i64> %v
1807 define <vscale x 7 x i64> @vp_ctpop_nxv7i64_unmasked(<vscale x 7 x i64> %va, i32 zeroext %evl) {
1808 ; RV32-LABEL: vp_ctpop_nxv7i64_unmasked:
1809 ; RV32:       # %bb.0:
1810 ; RV32-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1811 ; RV32-NEXT:    vsrl.vi v16, v8, 1
1812 ; RV32-NEXT:    lui a1, 349525
1813 ; RV32-NEXT:    addi a1, a1, 1365
1814 ; RV32-NEXT:    vsetvli a2, zero, e32, m8, ta, ma
1815 ; RV32-NEXT:    vmv.v.x v24, a1
1816 ; RV32-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1817 ; RV32-NEXT:    vand.vv v16, v16, v24
1818 ; RV32-NEXT:    vsub.vv v8, v8, v16
1819 ; RV32-NEXT:    lui a1, 209715
1820 ; RV32-NEXT:    addi a1, a1, 819
1821 ; RV32-NEXT:    vsetvli a2, zero, e32, m8, ta, ma
1822 ; RV32-NEXT:    vmv.v.x v16, a1
1823 ; RV32-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1824 ; RV32-NEXT:    vand.vv v24, v8, v16
1825 ; RV32-NEXT:    vsrl.vi v8, v8, 2
1826 ; RV32-NEXT:    vand.vv v8, v8, v16
1827 ; RV32-NEXT:    vadd.vv v8, v24, v8
1828 ; RV32-NEXT:    vsrl.vi v16, v8, 4
1829 ; RV32-NEXT:    vadd.vv v8, v8, v16
1830 ; RV32-NEXT:    lui a1, 61681
1831 ; RV32-NEXT:    addi a1, a1, -241
1832 ; RV32-NEXT:    vsetvli a2, zero, e32, m8, ta, ma
1833 ; RV32-NEXT:    vmv.v.x v16, a1
1834 ; RV32-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1835 ; RV32-NEXT:    vand.vv v8, v8, v16
1836 ; RV32-NEXT:    lui a1, 4112
1837 ; RV32-NEXT:    addi a1, a1, 257
1838 ; RV32-NEXT:    vsetvli a2, zero, e32, m8, ta, ma
1839 ; RV32-NEXT:    vmv.v.x v16, a1
1840 ; RV32-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1841 ; RV32-NEXT:    vmul.vv v8, v8, v16
1842 ; RV32-NEXT:    li a0, 56
1843 ; RV32-NEXT:    vsrl.vx v8, v8, a0
1844 ; RV32-NEXT:    ret
1846 ; RV64-LABEL: vp_ctpop_nxv7i64_unmasked:
1847 ; RV64:       # %bb.0:
1848 ; RV64-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1849 ; RV64-NEXT:    vsrl.vi v16, v8, 1
1850 ; RV64-NEXT:    lui a0, 349525
1851 ; RV64-NEXT:    addiw a0, a0, 1365
1852 ; RV64-NEXT:    slli a1, a0, 32
1853 ; RV64-NEXT:    add a0, a0, a1
1854 ; RV64-NEXT:    vand.vx v16, v16, a0
1855 ; RV64-NEXT:    vsub.vv v8, v8, v16
1856 ; RV64-NEXT:    lui a0, 209715
1857 ; RV64-NEXT:    addiw a0, a0, 819
1858 ; RV64-NEXT:    slli a1, a0, 32
1859 ; RV64-NEXT:    add a0, a0, a1
1860 ; RV64-NEXT:    vand.vx v16, v8, a0
1861 ; RV64-NEXT:    vsrl.vi v8, v8, 2
1862 ; RV64-NEXT:    vand.vx v8, v8, a0
1863 ; RV64-NEXT:    vadd.vv v8, v16, v8
1864 ; RV64-NEXT:    vsrl.vi v16, v8, 4
1865 ; RV64-NEXT:    vadd.vv v8, v8, v16
1866 ; RV64-NEXT:    lui a0, 61681
1867 ; RV64-NEXT:    addiw a0, a0, -241
1868 ; RV64-NEXT:    slli a1, a0, 32
1869 ; RV64-NEXT:    add a0, a0, a1
1870 ; RV64-NEXT:    vand.vx v8, v8, a0
1871 ; RV64-NEXT:    lui a0, 4112
1872 ; RV64-NEXT:    addiw a0, a0, 257
1873 ; RV64-NEXT:    slli a1, a0, 32
1874 ; RV64-NEXT:    add a0, a0, a1
1875 ; RV64-NEXT:    vmul.vx v8, v8, a0
1876 ; RV64-NEXT:    li a0, 56
1877 ; RV64-NEXT:    vsrl.vx v8, v8, a0
1878 ; RV64-NEXT:    ret
1880 ; CHECK-ZVBB-LABEL: vp_ctpop_nxv7i64_unmasked:
1881 ; CHECK-ZVBB:       # %bb.0:
1882 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1883 ; CHECK-ZVBB-NEXT:    vcpop.v v8, v8
1884 ; CHECK-ZVBB-NEXT:    ret
1885   %head = insertelement <vscale x 7 x i1> poison, i1 true, i32 0
1886   %m = shufflevector <vscale x 7 x i1> %head, <vscale x 7 x i1> poison, <vscale x 7 x i32> zeroinitializer
1887   %v = call <vscale x 7 x i64> @llvm.vp.ctpop.nxv7i64(<vscale x 7 x i64> %va, <vscale x 7 x i1> %m, i32 %evl)
1888   ret <vscale x 7 x i64> %v
1891 declare <vscale x 8 x i64> @llvm.vp.ctpop.nxv8i64(<vscale x 8 x i64>, <vscale x 8 x i1>, i32)
1893 define <vscale x 8 x i64> @vp_ctpop_nxv8i64(<vscale x 8 x i64> %va, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1894 ; RV32-LABEL: vp_ctpop_nxv8i64:
1895 ; RV32:       # %bb.0:
1896 ; RV32-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1897 ; RV32-NEXT:    vsrl.vi v16, v8, 1, v0.t
1898 ; RV32-NEXT:    lui a1, 349525
1899 ; RV32-NEXT:    addi a1, a1, 1365
1900 ; RV32-NEXT:    vsetvli a2, zero, e32, m8, ta, ma
1901 ; RV32-NEXT:    vmv.v.x v24, a1
1902 ; RV32-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1903 ; RV32-NEXT:    vand.vv v16, v16, v24, v0.t
1904 ; RV32-NEXT:    vsub.vv v8, v8, v16, v0.t
1905 ; RV32-NEXT:    lui a1, 209715
1906 ; RV32-NEXT:    addi a1, a1, 819
1907 ; RV32-NEXT:    vsetvli a2, zero, e32, m8, ta, ma
1908 ; RV32-NEXT:    vmv.v.x v16, a1
1909 ; RV32-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1910 ; RV32-NEXT:    vand.vv v24, v8, v16, v0.t
1911 ; RV32-NEXT:    vsrl.vi v8, v8, 2, v0.t
1912 ; RV32-NEXT:    vand.vv v8, v8, v16, v0.t
1913 ; RV32-NEXT:    vadd.vv v8, v24, v8, v0.t
1914 ; RV32-NEXT:    vsrl.vi v16, v8, 4, v0.t
1915 ; RV32-NEXT:    vadd.vv v8, v8, v16, v0.t
1916 ; RV32-NEXT:    lui a1, 61681
1917 ; RV32-NEXT:    addi a1, a1, -241
1918 ; RV32-NEXT:    vsetvli a2, zero, e32, m8, ta, ma
1919 ; RV32-NEXT:    vmv.v.x v16, a1
1920 ; RV32-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1921 ; RV32-NEXT:    vand.vv v8, v8, v16, v0.t
1922 ; RV32-NEXT:    lui a1, 4112
1923 ; RV32-NEXT:    addi a1, a1, 257
1924 ; RV32-NEXT:    vsetvli a2, zero, e32, m8, ta, ma
1925 ; RV32-NEXT:    vmv.v.x v16, a1
1926 ; RV32-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1927 ; RV32-NEXT:    vmul.vv v8, v8, v16, v0.t
1928 ; RV32-NEXT:    li a0, 56
1929 ; RV32-NEXT:    vsrl.vx v8, v8, a0, v0.t
1930 ; RV32-NEXT:    ret
1932 ; RV64-LABEL: vp_ctpop_nxv8i64:
1933 ; RV64:       # %bb.0:
1934 ; RV64-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1935 ; RV64-NEXT:    vsrl.vi v16, v8, 1, v0.t
1936 ; RV64-NEXT:    lui a0, 349525
1937 ; RV64-NEXT:    addiw a0, a0, 1365
1938 ; RV64-NEXT:    slli a1, a0, 32
1939 ; RV64-NEXT:    add a0, a0, a1
1940 ; RV64-NEXT:    vand.vx v16, v16, a0, v0.t
1941 ; RV64-NEXT:    vsub.vv v8, v8, v16, v0.t
1942 ; RV64-NEXT:    lui a0, 209715
1943 ; RV64-NEXT:    addiw a0, a0, 819
1944 ; RV64-NEXT:    slli a1, a0, 32
1945 ; RV64-NEXT:    add a0, a0, a1
1946 ; RV64-NEXT:    vand.vx v16, v8, a0, v0.t
1947 ; RV64-NEXT:    vsrl.vi v8, v8, 2, v0.t
1948 ; RV64-NEXT:    vand.vx v8, v8, a0, v0.t
1949 ; RV64-NEXT:    vadd.vv v8, v16, v8, v0.t
1950 ; RV64-NEXT:    vsrl.vi v16, v8, 4, v0.t
1951 ; RV64-NEXT:    vadd.vv v8, v8, v16, v0.t
1952 ; RV64-NEXT:    lui a0, 61681
1953 ; RV64-NEXT:    addiw a0, a0, -241
1954 ; RV64-NEXT:    slli a1, a0, 32
1955 ; RV64-NEXT:    add a0, a0, a1
1956 ; RV64-NEXT:    vand.vx v8, v8, a0, v0.t
1957 ; RV64-NEXT:    lui a0, 4112
1958 ; RV64-NEXT:    addiw a0, a0, 257
1959 ; RV64-NEXT:    slli a1, a0, 32
1960 ; RV64-NEXT:    add a0, a0, a1
1961 ; RV64-NEXT:    vmul.vx v8, v8, a0, v0.t
1962 ; RV64-NEXT:    li a0, 56
1963 ; RV64-NEXT:    vsrl.vx v8, v8, a0, v0.t
1964 ; RV64-NEXT:    ret
1966 ; CHECK-ZVBB-LABEL: vp_ctpop_nxv8i64:
1967 ; CHECK-ZVBB:       # %bb.0:
1968 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1969 ; CHECK-ZVBB-NEXT:    vcpop.v v8, v8, v0.t
1970 ; CHECK-ZVBB-NEXT:    ret
1971   %v = call <vscale x 8 x i64> @llvm.vp.ctpop.nxv8i64(<vscale x 8 x i64> %va, <vscale x 8 x i1> %m, i32 %evl)
1972   ret <vscale x 8 x i64> %v
1975 define <vscale x 8 x i64> @vp_ctpop_nxv8i64_unmasked(<vscale x 8 x i64> %va, i32 zeroext %evl) {
1976 ; RV32-LABEL: vp_ctpop_nxv8i64_unmasked:
1977 ; RV32:       # %bb.0:
1978 ; RV32-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1979 ; RV32-NEXT:    vsrl.vi v16, v8, 1
1980 ; RV32-NEXT:    lui a1, 349525
1981 ; RV32-NEXT:    addi a1, a1, 1365
1982 ; RV32-NEXT:    vsetvli a2, zero, e32, m8, ta, ma
1983 ; RV32-NEXT:    vmv.v.x v24, a1
1984 ; RV32-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1985 ; RV32-NEXT:    vand.vv v16, v16, v24
1986 ; RV32-NEXT:    vsub.vv v8, v8, v16
1987 ; RV32-NEXT:    lui a1, 209715
1988 ; RV32-NEXT:    addi a1, a1, 819
1989 ; RV32-NEXT:    vsetvli a2, zero, e32, m8, ta, ma
1990 ; RV32-NEXT:    vmv.v.x v16, a1
1991 ; RV32-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1992 ; RV32-NEXT:    vand.vv v24, v8, v16
1993 ; RV32-NEXT:    vsrl.vi v8, v8, 2
1994 ; RV32-NEXT:    vand.vv v8, v8, v16
1995 ; RV32-NEXT:    vadd.vv v8, v24, v8
1996 ; RV32-NEXT:    vsrl.vi v16, v8, 4
1997 ; RV32-NEXT:    vadd.vv v8, v8, v16
1998 ; RV32-NEXT:    lui a1, 61681
1999 ; RV32-NEXT:    addi a1, a1, -241
2000 ; RV32-NEXT:    vsetvli a2, zero, e32, m8, ta, ma
2001 ; RV32-NEXT:    vmv.v.x v16, a1
2002 ; RV32-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
2003 ; RV32-NEXT:    vand.vv v8, v8, v16
2004 ; RV32-NEXT:    lui a1, 4112
2005 ; RV32-NEXT:    addi a1, a1, 257
2006 ; RV32-NEXT:    vsetvli a2, zero, e32, m8, ta, ma
2007 ; RV32-NEXT:    vmv.v.x v16, a1
2008 ; RV32-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
2009 ; RV32-NEXT:    vmul.vv v8, v8, v16
2010 ; RV32-NEXT:    li a0, 56
2011 ; RV32-NEXT:    vsrl.vx v8, v8, a0
2012 ; RV32-NEXT:    ret
2014 ; RV64-LABEL: vp_ctpop_nxv8i64_unmasked:
2015 ; RV64:       # %bb.0:
2016 ; RV64-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
2017 ; RV64-NEXT:    vsrl.vi v16, v8, 1
2018 ; RV64-NEXT:    lui a0, 349525
2019 ; RV64-NEXT:    addiw a0, a0, 1365
2020 ; RV64-NEXT:    slli a1, a0, 32
2021 ; RV64-NEXT:    add a0, a0, a1
2022 ; RV64-NEXT:    vand.vx v16, v16, a0
2023 ; RV64-NEXT:    vsub.vv v8, v8, v16
2024 ; RV64-NEXT:    lui a0, 209715
2025 ; RV64-NEXT:    addiw a0, a0, 819
2026 ; RV64-NEXT:    slli a1, a0, 32
2027 ; RV64-NEXT:    add a0, a0, a1
2028 ; RV64-NEXT:    vand.vx v16, v8, a0
2029 ; RV64-NEXT:    vsrl.vi v8, v8, 2
2030 ; RV64-NEXT:    vand.vx v8, v8, a0
2031 ; RV64-NEXT:    vadd.vv v8, v16, v8
2032 ; RV64-NEXT:    vsrl.vi v16, v8, 4
2033 ; RV64-NEXT:    vadd.vv v8, v8, v16
2034 ; RV64-NEXT:    lui a0, 61681
2035 ; RV64-NEXT:    addiw a0, a0, -241
2036 ; RV64-NEXT:    slli a1, a0, 32
2037 ; RV64-NEXT:    add a0, a0, a1
2038 ; RV64-NEXT:    vand.vx v8, v8, a0
2039 ; RV64-NEXT:    lui a0, 4112
2040 ; RV64-NEXT:    addiw a0, a0, 257
2041 ; RV64-NEXT:    slli a1, a0, 32
2042 ; RV64-NEXT:    add a0, a0, a1
2043 ; RV64-NEXT:    vmul.vx v8, v8, a0
2044 ; RV64-NEXT:    li a0, 56
2045 ; RV64-NEXT:    vsrl.vx v8, v8, a0
2046 ; RV64-NEXT:    ret
2048 ; CHECK-ZVBB-LABEL: vp_ctpop_nxv8i64_unmasked:
2049 ; CHECK-ZVBB:       # %bb.0:
2050 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
2051 ; CHECK-ZVBB-NEXT:    vcpop.v v8, v8
2052 ; CHECK-ZVBB-NEXT:    ret
2053   %head = insertelement <vscale x 8 x i1> poison, i1 true, i32 0
2054   %m = shufflevector <vscale x 8 x i1> %head, <vscale x 8 x i1> poison, <vscale x 8 x i32> zeroinitializer
2055   %v = call <vscale x 8 x i64> @llvm.vp.ctpop.nxv8i64(<vscale x 8 x i64> %va, <vscale x 8 x i1> %m, i32 %evl)
2056   ret <vscale x 8 x i64> %v
2059 declare <vscale x 16 x i64> @llvm.vp.ctpop.nxv16i64(<vscale x 16 x i64>, <vscale x 16 x i1>, i32)
2061 define <vscale x 16 x i64> @vp_ctpop_nxv16i64(<vscale x 16 x i64> %va, <vscale x 16 x i1> %m, i32 zeroext %evl) {
2062 ; RV32-LABEL: vp_ctpop_nxv16i64:
2063 ; RV32:       # %bb.0:
2064 ; RV32-NEXT:    addi sp, sp, -16
2065 ; RV32-NEXT:    .cfi_def_cfa_offset 16
2066 ; RV32-NEXT:    csrr a1, vlenb
2067 ; RV32-NEXT:    li a2, 56
2068 ; RV32-NEXT:    mul a1, a1, a2
2069 ; RV32-NEXT:    sub sp, sp, a1
2070 ; RV32-NEXT:    .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x38, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 56 * vlenb
2071 ; RV32-NEXT:    vmv1r.v v24, v0
2072 ; RV32-NEXT:    csrr a1, vlenb
2073 ; RV32-NEXT:    li a2, 40
2074 ; RV32-NEXT:    mul a1, a1, a2
2075 ; RV32-NEXT:    add a1, sp, a1
2076 ; RV32-NEXT:    addi a1, a1, 16
2077 ; RV32-NEXT:    vs8r.v v16, (a1) # Unknown-size Folded Spill
2078 ; RV32-NEXT:    csrr a1, vlenb
2079 ; RV32-NEXT:    li a2, 48
2080 ; RV32-NEXT:    mul a1, a1, a2
2081 ; RV32-NEXT:    add a1, sp, a1
2082 ; RV32-NEXT:    addi a1, a1, 16
2083 ; RV32-NEXT:    vs8r.v v8, (a1) # Unknown-size Folded Spill
2084 ; RV32-NEXT:    csrr a1, vlenb
2085 ; RV32-NEXT:    srli a2, a1, 3
2086 ; RV32-NEXT:    vsetvli a3, zero, e8, mf4, ta, ma
2087 ; RV32-NEXT:    vslidedown.vx v0, v0, a2
2088 ; RV32-NEXT:    sub a2, a0, a1
2089 ; RV32-NEXT:    sltu a3, a0, a2
2090 ; RV32-NEXT:    addi a3, a3, -1
2091 ; RV32-NEXT:    and a2, a3, a2
2092 ; RV32-NEXT:    vsetvli zero, a2, e64, m8, ta, ma
2093 ; RV32-NEXT:    csrr a3, vlenb
2094 ; RV32-NEXT:    li a4, 40
2095 ; RV32-NEXT:    mul a3, a3, a4
2096 ; RV32-NEXT:    add a3, sp, a3
2097 ; RV32-NEXT:    addi a3, a3, 16
2098 ; RV32-NEXT:    vl8r.v v8, (a3) # Unknown-size Folded Reload
2099 ; RV32-NEXT:    vsrl.vi v16, v8, 1, v0.t
2100 ; RV32-NEXT:    lui a3, 349525
2101 ; RV32-NEXT:    addi a3, a3, 1365
2102 ; RV32-NEXT:    vsetvli a4, zero, e32, m8, ta, ma
2103 ; RV32-NEXT:    vmv.v.x v8, a3
2104 ; RV32-NEXT:    vsetvli zero, a2, e64, m8, ta, ma
2105 ; RV32-NEXT:    csrr a3, vlenb
2106 ; RV32-NEXT:    li a4, 24
2107 ; RV32-NEXT:    mul a3, a3, a4
2108 ; RV32-NEXT:    add a3, sp, a3
2109 ; RV32-NEXT:    addi a3, a3, 16
2110 ; RV32-NEXT:    vs8r.v v8, (a3) # Unknown-size Folded Spill
2111 ; RV32-NEXT:    vand.vv v8, v16, v8, v0.t
2112 ; RV32-NEXT:    csrr a3, vlenb
2113 ; RV32-NEXT:    li a4, 40
2114 ; RV32-NEXT:    mul a3, a3, a4
2115 ; RV32-NEXT:    add a3, sp, a3
2116 ; RV32-NEXT:    addi a3, a3, 16
2117 ; RV32-NEXT:    vl8r.v v16, (a3) # Unknown-size Folded Reload
2118 ; RV32-NEXT:    vsub.vv v8, v16, v8, v0.t
2119 ; RV32-NEXT:    csrr a3, vlenb
2120 ; RV32-NEXT:    slli a3, a3, 5
2121 ; RV32-NEXT:    add a3, sp, a3
2122 ; RV32-NEXT:    addi a3, a3, 16
2123 ; RV32-NEXT:    vs8r.v v8, (a3) # Unknown-size Folded Spill
2124 ; RV32-NEXT:    lui a3, 209715
2125 ; RV32-NEXT:    addi a3, a3, 819
2126 ; RV32-NEXT:    vsetvli a4, zero, e32, m8, ta, ma
2127 ; RV32-NEXT:    vmv.v.x v8, a3
2128 ; RV32-NEXT:    vsetvli zero, a2, e64, m8, ta, ma
2129 ; RV32-NEXT:    csrr a3, vlenb
2130 ; RV32-NEXT:    slli a3, a3, 5
2131 ; RV32-NEXT:    add a3, sp, a3
2132 ; RV32-NEXT:    addi a3, a3, 16
2133 ; RV32-NEXT:    vl8r.v v16, (a3) # Unknown-size Folded Reload
2134 ; RV32-NEXT:    vand.vv v16, v16, v8, v0.t
2135 ; RV32-NEXT:    csrr a3, vlenb
2136 ; RV32-NEXT:    slli a3, a3, 4
2137 ; RV32-NEXT:    add a3, sp, a3
2138 ; RV32-NEXT:    addi a3, a3, 16
2139 ; RV32-NEXT:    vs8r.v v16, (a3) # Unknown-size Folded Spill
2140 ; RV32-NEXT:    csrr a3, vlenb
2141 ; RV32-NEXT:    slli a3, a3, 5
2142 ; RV32-NEXT:    add a3, sp, a3
2143 ; RV32-NEXT:    addi a3, a3, 16
2144 ; RV32-NEXT:    vl8r.v v16, (a3) # Unknown-size Folded Reload
2145 ; RV32-NEXT:    vsrl.vi v16, v16, 2, v0.t
2146 ; RV32-NEXT:    csrr a3, vlenb
2147 ; RV32-NEXT:    li a4, 40
2148 ; RV32-NEXT:    mul a3, a3, a4
2149 ; RV32-NEXT:    add a3, sp, a3
2150 ; RV32-NEXT:    addi a3, a3, 16
2151 ; RV32-NEXT:    vs8r.v v8, (a3) # Unknown-size Folded Spill
2152 ; RV32-NEXT:    vand.vv v16, v16, v8, v0.t
2153 ; RV32-NEXT:    csrr a3, vlenb
2154 ; RV32-NEXT:    slli a3, a3, 4
2155 ; RV32-NEXT:    add a3, sp, a3
2156 ; RV32-NEXT:    addi a3, a3, 16
2157 ; RV32-NEXT:    vl8r.v v8, (a3) # Unknown-size Folded Reload
2158 ; RV32-NEXT:    vadd.vv v8, v8, v16, v0.t
2159 ; RV32-NEXT:    vsrl.vi v16, v8, 4, v0.t
2160 ; RV32-NEXT:    vadd.vv v16, v8, v16, v0.t
2161 ; RV32-NEXT:    lui a3, 61681
2162 ; RV32-NEXT:    addi a3, a3, -241
2163 ; RV32-NEXT:    vsetvli a4, zero, e32, m8, ta, ma
2164 ; RV32-NEXT:    vmv.v.x v8, a3
2165 ; RV32-NEXT:    vsetvli zero, a2, e64, m8, ta, ma
2166 ; RV32-NEXT:    csrr a3, vlenb
2167 ; RV32-NEXT:    slli a3, a3, 5
2168 ; RV32-NEXT:    add a3, sp, a3
2169 ; RV32-NEXT:    addi a3, a3, 16
2170 ; RV32-NEXT:    vs8r.v v8, (a3) # Unknown-size Folded Spill
2171 ; RV32-NEXT:    vand.vv v16, v16, v8, v0.t
2172 ; RV32-NEXT:    lui a3, 4112
2173 ; RV32-NEXT:    addi a3, a3, 257
2174 ; RV32-NEXT:    vsetvli a4, zero, e32, m8, ta, ma
2175 ; RV32-NEXT:    vmv.v.x v8, a3
2176 ; RV32-NEXT:    vsetvli zero, a2, e64, m8, ta, ma
2177 ; RV32-NEXT:    csrr a2, vlenb
2178 ; RV32-NEXT:    slli a2, a2, 4
2179 ; RV32-NEXT:    add a2, sp, a2
2180 ; RV32-NEXT:    addi a2, a2, 16
2181 ; RV32-NEXT:    vs8r.v v8, (a2) # Unknown-size Folded Spill
2182 ; RV32-NEXT:    vmul.vv v8, v16, v8, v0.t
2183 ; RV32-NEXT:    li a2, 56
2184 ; RV32-NEXT:    vsrl.vx v8, v8, a2, v0.t
2185 ; RV32-NEXT:    csrr a3, vlenb
2186 ; RV32-NEXT:    slli a3, a3, 3
2187 ; RV32-NEXT:    add a3, sp, a3
2188 ; RV32-NEXT:    addi a3, a3, 16
2189 ; RV32-NEXT:    vs8r.v v8, (a3) # Unknown-size Folded Spill
2190 ; RV32-NEXT:    bltu a0, a1, .LBB46_2
2191 ; RV32-NEXT:  # %bb.1:
2192 ; RV32-NEXT:    mv a0, a1
2193 ; RV32-NEXT:  .LBB46_2:
2194 ; RV32-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
2195 ; RV32-NEXT:    vmv1r.v v0, v24
2196 ; RV32-NEXT:    csrr a0, vlenb
2197 ; RV32-NEXT:    li a1, 48
2198 ; RV32-NEXT:    mul a0, a0, a1
2199 ; RV32-NEXT:    add a0, sp, a0
2200 ; RV32-NEXT:    addi a0, a0, 16
2201 ; RV32-NEXT:    vl8r.v v8, (a0) # Unknown-size Folded Reload
2202 ; RV32-NEXT:    vsrl.vi v8, v8, 1, v0.t
2203 ; RV32-NEXT:    addi a0, sp, 16
2204 ; RV32-NEXT:    vs8r.v v8, (a0) # Unknown-size Folded Spill
2205 ; RV32-NEXT:    csrr a0, vlenb
2206 ; RV32-NEXT:    li a1, 24
2207 ; RV32-NEXT:    mul a0, a0, a1
2208 ; RV32-NEXT:    add a0, sp, a0
2209 ; RV32-NEXT:    addi a0, a0, 16
2210 ; RV32-NEXT:    vl8r.v v8, (a0) # Unknown-size Folded Reload
2211 ; RV32-NEXT:    addi a0, sp, 16
2212 ; RV32-NEXT:    vl8r.v v16, (a0) # Unknown-size Folded Reload
2213 ; RV32-NEXT:    vand.vv v8, v16, v8, v0.t
2214 ; RV32-NEXT:    csrr a0, vlenb
2215 ; RV32-NEXT:    li a1, 48
2216 ; RV32-NEXT:    mul a0, a0, a1
2217 ; RV32-NEXT:    add a0, sp, a0
2218 ; RV32-NEXT:    addi a0, a0, 16
2219 ; RV32-NEXT:    vl8r.v v16, (a0) # Unknown-size Folded Reload
2220 ; RV32-NEXT:    vsub.vv v8, v16, v8, v0.t
2221 ; RV32-NEXT:    csrr a0, vlenb
2222 ; RV32-NEXT:    li a1, 48
2223 ; RV32-NEXT:    mul a0, a0, a1
2224 ; RV32-NEXT:    add a0, sp, a0
2225 ; RV32-NEXT:    addi a0, a0, 16
2226 ; RV32-NEXT:    vs8r.v v8, (a0) # Unknown-size Folded Spill
2227 ; RV32-NEXT:    csrr a0, vlenb
2228 ; RV32-NEXT:    li a1, 40
2229 ; RV32-NEXT:    mul a0, a0, a1
2230 ; RV32-NEXT:    add a0, sp, a0
2231 ; RV32-NEXT:    addi a0, a0, 16
2232 ; RV32-NEXT:    vl8r.v v8, (a0) # Unknown-size Folded Reload
2233 ; RV32-NEXT:    csrr a0, vlenb
2234 ; RV32-NEXT:    li a1, 48
2235 ; RV32-NEXT:    mul a0, a0, a1
2236 ; RV32-NEXT:    add a0, sp, a0
2237 ; RV32-NEXT:    addi a0, a0, 16
2238 ; RV32-NEXT:    vl8r.v v16, (a0) # Unknown-size Folded Reload
2239 ; RV32-NEXT:    vand.vv v16, v16, v8, v0.t
2240 ; RV32-NEXT:    csrr a0, vlenb
2241 ; RV32-NEXT:    li a1, 24
2242 ; RV32-NEXT:    mul a0, a0, a1
2243 ; RV32-NEXT:    add a0, sp, a0
2244 ; RV32-NEXT:    addi a0, a0, 16
2245 ; RV32-NEXT:    vs8r.v v16, (a0) # Unknown-size Folded Spill
2246 ; RV32-NEXT:    csrr a0, vlenb
2247 ; RV32-NEXT:    li a1, 48
2248 ; RV32-NEXT:    mul a0, a0, a1
2249 ; RV32-NEXT:    add a0, sp, a0
2250 ; RV32-NEXT:    addi a0, a0, 16
2251 ; RV32-NEXT:    vl8r.v v8, (a0) # Unknown-size Folded Reload
2252 ; RV32-NEXT:    vsrl.vi v8, v8, 2, v0.t
2253 ; RV32-NEXT:    csrr a0, vlenb
2254 ; RV32-NEXT:    li a1, 40
2255 ; RV32-NEXT:    mul a0, a0, a1
2256 ; RV32-NEXT:    add a0, sp, a0
2257 ; RV32-NEXT:    addi a0, a0, 16
2258 ; RV32-NEXT:    vl8r.v v16, (a0) # Unknown-size Folded Reload
2259 ; RV32-NEXT:    vand.vv v8, v8, v16, v0.t
2260 ; RV32-NEXT:    csrr a0, vlenb
2261 ; RV32-NEXT:    li a1, 24
2262 ; RV32-NEXT:    mul a0, a0, a1
2263 ; RV32-NEXT:    add a0, sp, a0
2264 ; RV32-NEXT:    addi a0, a0, 16
2265 ; RV32-NEXT:    vl8r.v v16, (a0) # Unknown-size Folded Reload
2266 ; RV32-NEXT:    vadd.vv v8, v16, v8, v0.t
2267 ; RV32-NEXT:    vsrl.vi v16, v8, 4, v0.t
2268 ; RV32-NEXT:    vadd.vv v8, v8, v16, v0.t
2269 ; RV32-NEXT:    csrr a0, vlenb
2270 ; RV32-NEXT:    slli a0, a0, 5
2271 ; RV32-NEXT:    add a0, sp, a0
2272 ; RV32-NEXT:    addi a0, a0, 16
2273 ; RV32-NEXT:    vl8r.v v16, (a0) # Unknown-size Folded Reload
2274 ; RV32-NEXT:    vand.vv v8, v8, v16, v0.t
2275 ; RV32-NEXT:    csrr a0, vlenb
2276 ; RV32-NEXT:    slli a0, a0, 4
2277 ; RV32-NEXT:    add a0, sp, a0
2278 ; RV32-NEXT:    addi a0, a0, 16
2279 ; RV32-NEXT:    vl8r.v v16, (a0) # Unknown-size Folded Reload
2280 ; RV32-NEXT:    vmul.vv v8, v8, v16, v0.t
2281 ; RV32-NEXT:    vsrl.vx v8, v8, a2, v0.t
2282 ; RV32-NEXT:    csrr a0, vlenb
2283 ; RV32-NEXT:    slli a0, a0, 3
2284 ; RV32-NEXT:    add a0, sp, a0
2285 ; RV32-NEXT:    addi a0, a0, 16
2286 ; RV32-NEXT:    vl8r.v v16, (a0) # Unknown-size Folded Reload
2287 ; RV32-NEXT:    csrr a0, vlenb
2288 ; RV32-NEXT:    li a1, 56
2289 ; RV32-NEXT:    mul a0, a0, a1
2290 ; RV32-NEXT:    add sp, sp, a0
2291 ; RV32-NEXT:    addi sp, sp, 16
2292 ; RV32-NEXT:    ret
2294 ; RV64-LABEL: vp_ctpop_nxv16i64:
2295 ; RV64:       # %bb.0:
2296 ; RV64-NEXT:    addi sp, sp, -16
2297 ; RV64-NEXT:    .cfi_def_cfa_offset 16
2298 ; RV64-NEXT:    csrr a1, vlenb
2299 ; RV64-NEXT:    slli a1, a1, 4
2300 ; RV64-NEXT:    sub sp, sp, a1
2301 ; RV64-NEXT:    .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x10, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 16 * vlenb
2302 ; RV64-NEXT:    csrr a1, vlenb
2303 ; RV64-NEXT:    slli a1, a1, 3
2304 ; RV64-NEXT:    add a1, sp, a1
2305 ; RV64-NEXT:    addi a1, a1, 16
2306 ; RV64-NEXT:    vs8r.v v16, (a1) # Unknown-size Folded Spill
2307 ; RV64-NEXT:    csrr a1, vlenb
2308 ; RV64-NEXT:    srli a2, a1, 3
2309 ; RV64-NEXT:    vsetvli a3, zero, e8, mf4, ta, ma
2310 ; RV64-NEXT:    vslidedown.vx v24, v0, a2
2311 ; RV64-NEXT:    mv a2, a0
2312 ; RV64-NEXT:    bltu a0, a1, .LBB46_2
2313 ; RV64-NEXT:  # %bb.1:
2314 ; RV64-NEXT:    mv a2, a1
2315 ; RV64-NEXT:  .LBB46_2:
2316 ; RV64-NEXT:    vsetvli zero, a2, e64, m8, ta, ma
2317 ; RV64-NEXT:    vsrl.vi v16, v8, 1, v0.t
2318 ; RV64-NEXT:    lui a2, 349525
2319 ; RV64-NEXT:    addiw a2, a2, 1365
2320 ; RV64-NEXT:    slli a3, a2, 32
2321 ; RV64-NEXT:    add a2, a2, a3
2322 ; RV64-NEXT:    vand.vx v16, v16, a2, v0.t
2323 ; RV64-NEXT:    vsub.vv v8, v8, v16, v0.t
2324 ; RV64-NEXT:    lui a3, 209715
2325 ; RV64-NEXT:    addiw a3, a3, 819
2326 ; RV64-NEXT:    slli a4, a3, 32
2327 ; RV64-NEXT:    add a3, a3, a4
2328 ; RV64-NEXT:    vand.vx v16, v8, a3, v0.t
2329 ; RV64-NEXT:    vsrl.vi v8, v8, 2, v0.t
2330 ; RV64-NEXT:    vand.vx v8, v8, a3, v0.t
2331 ; RV64-NEXT:    vadd.vv v8, v16, v8, v0.t
2332 ; RV64-NEXT:    vsrl.vi v16, v8, 4, v0.t
2333 ; RV64-NEXT:    vadd.vv v8, v8, v16, v0.t
2334 ; RV64-NEXT:    lui a4, 61681
2335 ; RV64-NEXT:    addiw a4, a4, -241
2336 ; RV64-NEXT:    slli a5, a4, 32
2337 ; RV64-NEXT:    add a4, a4, a5
2338 ; RV64-NEXT:    vand.vx v8, v8, a4, v0.t
2339 ; RV64-NEXT:    lui a5, 4112
2340 ; RV64-NEXT:    addiw a5, a5, 257
2341 ; RV64-NEXT:    slli a6, a5, 32
2342 ; RV64-NEXT:    add a5, a5, a6
2343 ; RV64-NEXT:    vmul.vx v8, v8, a5, v0.t
2344 ; RV64-NEXT:    li a6, 56
2345 ; RV64-NEXT:    vsrl.vx v8, v8, a6, v0.t
2346 ; RV64-NEXT:    addi a7, sp, 16
2347 ; RV64-NEXT:    vs8r.v v8, (a7) # Unknown-size Folded Spill
2348 ; RV64-NEXT:    sub a1, a0, a1
2349 ; RV64-NEXT:    sltu a0, a0, a1
2350 ; RV64-NEXT:    addi a0, a0, -1
2351 ; RV64-NEXT:    and a0, a0, a1
2352 ; RV64-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
2353 ; RV64-NEXT:    vmv1r.v v0, v24
2354 ; RV64-NEXT:    csrr a0, vlenb
2355 ; RV64-NEXT:    slli a0, a0, 3
2356 ; RV64-NEXT:    add a0, sp, a0
2357 ; RV64-NEXT:    addi a0, a0, 16
2358 ; RV64-NEXT:    vl8r.v v8, (a0) # Unknown-size Folded Reload
2359 ; RV64-NEXT:    vsrl.vi v16, v8, 1, v0.t
2360 ; RV64-NEXT:    vand.vx v16, v16, a2, v0.t
2361 ; RV64-NEXT:    vsub.vv v16, v8, v16, v0.t
2362 ; RV64-NEXT:    vand.vx v8, v16, a3, v0.t
2363 ; RV64-NEXT:    vsrl.vi v16, v16, 2, v0.t
2364 ; RV64-NEXT:    vand.vx v16, v16, a3, v0.t
2365 ; RV64-NEXT:    vadd.vv v8, v8, v16, v0.t
2366 ; RV64-NEXT:    vsrl.vi v16, v8, 4, v0.t
2367 ; RV64-NEXT:    vadd.vv v8, v8, v16, v0.t
2368 ; RV64-NEXT:    vand.vx v8, v8, a4, v0.t
2369 ; RV64-NEXT:    vmul.vx v8, v8, a5, v0.t
2370 ; RV64-NEXT:    vsrl.vx v16, v8, a6, v0.t
2371 ; RV64-NEXT:    addi a0, sp, 16
2372 ; RV64-NEXT:    vl8r.v v8, (a0) # Unknown-size Folded Reload
2373 ; RV64-NEXT:    csrr a0, vlenb
2374 ; RV64-NEXT:    slli a0, a0, 4
2375 ; RV64-NEXT:    add sp, sp, a0
2376 ; RV64-NEXT:    addi sp, sp, 16
2377 ; RV64-NEXT:    ret
2379 ; CHECK-ZVBB-LABEL: vp_ctpop_nxv16i64:
2380 ; CHECK-ZVBB:       # %bb.0:
2381 ; CHECK-ZVBB-NEXT:    vmv1r.v v24, v0
2382 ; CHECK-ZVBB-NEXT:    csrr a1, vlenb
2383 ; CHECK-ZVBB-NEXT:    srli a2, a1, 3
2384 ; CHECK-ZVBB-NEXT:    vsetvli a3, zero, e8, mf4, ta, ma
2385 ; CHECK-ZVBB-NEXT:    vslidedown.vx v0, v0, a2
2386 ; CHECK-ZVBB-NEXT:    sub a2, a0, a1
2387 ; CHECK-ZVBB-NEXT:    sltu a3, a0, a2
2388 ; CHECK-ZVBB-NEXT:    addi a3, a3, -1
2389 ; CHECK-ZVBB-NEXT:    and a2, a3, a2
2390 ; CHECK-ZVBB-NEXT:    vsetvli zero, a2, e64, m8, ta, ma
2391 ; CHECK-ZVBB-NEXT:    vcpop.v v16, v16, v0.t
2392 ; CHECK-ZVBB-NEXT:    bltu a0, a1, .LBB46_2
2393 ; CHECK-ZVBB-NEXT:  # %bb.1:
2394 ; CHECK-ZVBB-NEXT:    mv a0, a1
2395 ; CHECK-ZVBB-NEXT:  .LBB46_2:
2396 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
2397 ; CHECK-ZVBB-NEXT:    vmv1r.v v0, v24
2398 ; CHECK-ZVBB-NEXT:    vcpop.v v8, v8, v0.t
2399 ; CHECK-ZVBB-NEXT:    ret
2400   %v = call <vscale x 16 x i64> @llvm.vp.ctpop.nxv16i64(<vscale x 16 x i64> %va, <vscale x 16 x i1> %m, i32 %evl)
2401   ret <vscale x 16 x i64> %v
2404 define <vscale x 16 x i64> @vp_ctpop_nxv16i64_unmasked(<vscale x 16 x i64> %va, i32 zeroext %evl) {
2405 ; RV32-LABEL: vp_ctpop_nxv16i64_unmasked:
2406 ; RV32:       # %bb.0:
2407 ; RV32-NEXT:    addi sp, sp, -16
2408 ; RV32-NEXT:    .cfi_def_cfa_offset 16
2409 ; RV32-NEXT:    csrr a1, vlenb
2410 ; RV32-NEXT:    slli a1, a1, 5
2411 ; RV32-NEXT:    sub sp, sp, a1
2412 ; RV32-NEXT:    .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x20, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 32 * vlenb
2413 ; RV32-NEXT:    csrr a1, vlenb
2414 ; RV32-NEXT:    sub a2, a0, a1
2415 ; RV32-NEXT:    sltu a3, a0, a2
2416 ; RV32-NEXT:    addi a3, a3, -1
2417 ; RV32-NEXT:    and a2, a3, a2
2418 ; RV32-NEXT:    vsetvli zero, a2, e64, m8, ta, ma
2419 ; RV32-NEXT:    vsrl.vi v24, v16, 1
2420 ; RV32-NEXT:    lui a3, 349525
2421 ; RV32-NEXT:    addi a3, a3, 1365
2422 ; RV32-NEXT:    vsetvli a4, zero, e32, m8, ta, ma
2423 ; RV32-NEXT:    vmv.v.x v0, a3
2424 ; RV32-NEXT:    vsetvli zero, a2, e64, m8, ta, ma
2425 ; RV32-NEXT:    csrr a3, vlenb
2426 ; RV32-NEXT:    li a4, 24
2427 ; RV32-NEXT:    mul a3, a3, a4
2428 ; RV32-NEXT:    add a3, sp, a3
2429 ; RV32-NEXT:    addi a3, a3, 16
2430 ; RV32-NEXT:    vs8r.v v0, (a3) # Unknown-size Folded Spill
2431 ; RV32-NEXT:    vand.vv v24, v24, v0
2432 ; RV32-NEXT:    vsub.vv v24, v16, v24
2433 ; RV32-NEXT:    lui a3, 209715
2434 ; RV32-NEXT:    addi a3, a3, 819
2435 ; RV32-NEXT:    vsetvli a4, zero, e32, m8, ta, ma
2436 ; RV32-NEXT:    vmv.v.x v0, a3
2437 ; RV32-NEXT:    vsetvli zero, a2, e64, m8, ta, ma
2438 ; RV32-NEXT:    vand.vv v16, v24, v0
2439 ; RV32-NEXT:    vsrl.vi v24, v24, 2
2440 ; RV32-NEXT:    csrr a3, vlenb
2441 ; RV32-NEXT:    slli a3, a3, 4
2442 ; RV32-NEXT:    add a3, sp, a3
2443 ; RV32-NEXT:    addi a3, a3, 16
2444 ; RV32-NEXT:    vs8r.v v0, (a3) # Unknown-size Folded Spill
2445 ; RV32-NEXT:    vand.vv v24, v24, v0
2446 ; RV32-NEXT:    vadd.vv v24, v16, v24
2447 ; RV32-NEXT:    vsrl.vi v16, v24, 4
2448 ; RV32-NEXT:    vadd.vv v16, v24, v16
2449 ; RV32-NEXT:    lui a3, 61681
2450 ; RV32-NEXT:    addi a3, a3, -241
2451 ; RV32-NEXT:    vsetvli a4, zero, e32, m8, ta, ma
2452 ; RV32-NEXT:    vmv.v.x v24, a3
2453 ; RV32-NEXT:    vsetvli zero, a2, e64, m8, ta, ma
2454 ; RV32-NEXT:    csrr a3, vlenb
2455 ; RV32-NEXT:    slli a3, a3, 3
2456 ; RV32-NEXT:    add a3, sp, a3
2457 ; RV32-NEXT:    addi a3, a3, 16
2458 ; RV32-NEXT:    vs8r.v v24, (a3) # Unknown-size Folded Spill
2459 ; RV32-NEXT:    vand.vv v16, v16, v24
2460 ; RV32-NEXT:    lui a3, 4112
2461 ; RV32-NEXT:    addi a3, a3, 257
2462 ; RV32-NEXT:    vsetvli a4, zero, e32, m8, ta, ma
2463 ; RV32-NEXT:    vmv.v.x v24, a3
2464 ; RV32-NEXT:    vsetvli zero, a2, e64, m8, ta, ma
2465 ; RV32-NEXT:    addi a2, sp, 16
2466 ; RV32-NEXT:    vs8r.v v24, (a2) # Unknown-size Folded Spill
2467 ; RV32-NEXT:    vmul.vv v16, v16, v24
2468 ; RV32-NEXT:    li a2, 56
2469 ; RV32-NEXT:    vsrl.vx v16, v16, a2
2470 ; RV32-NEXT:    bltu a0, a1, .LBB47_2
2471 ; RV32-NEXT:  # %bb.1:
2472 ; RV32-NEXT:    mv a0, a1
2473 ; RV32-NEXT:  .LBB47_2:
2474 ; RV32-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
2475 ; RV32-NEXT:    vsrl.vi v24, v8, 1
2476 ; RV32-NEXT:    csrr a0, vlenb
2477 ; RV32-NEXT:    li a1, 24
2478 ; RV32-NEXT:    mul a0, a0, a1
2479 ; RV32-NEXT:    add a0, sp, a0
2480 ; RV32-NEXT:    addi a0, a0, 16
2481 ; RV32-NEXT:    vl8r.v v0, (a0) # Unknown-size Folded Reload
2482 ; RV32-NEXT:    vand.vv v24, v24, v0
2483 ; RV32-NEXT:    vsub.vv v24, v8, v24
2484 ; RV32-NEXT:    csrr a0, vlenb
2485 ; RV32-NEXT:    slli a0, a0, 4
2486 ; RV32-NEXT:    add a0, sp, a0
2487 ; RV32-NEXT:    addi a0, a0, 16
2488 ; RV32-NEXT:    vl8r.v v0, (a0) # Unknown-size Folded Reload
2489 ; RV32-NEXT:    vand.vv v8, v24, v0
2490 ; RV32-NEXT:    vsrl.vi v24, v24, 2
2491 ; RV32-NEXT:    vand.vv v24, v24, v0
2492 ; RV32-NEXT:    vadd.vv v8, v8, v24
2493 ; RV32-NEXT:    vsrl.vi v24, v8, 4
2494 ; RV32-NEXT:    vadd.vv v8, v8, v24
2495 ; RV32-NEXT:    csrr a0, vlenb
2496 ; RV32-NEXT:    slli a0, a0, 3
2497 ; RV32-NEXT:    add a0, sp, a0
2498 ; RV32-NEXT:    addi a0, a0, 16
2499 ; RV32-NEXT:    vl8r.v v24, (a0) # Unknown-size Folded Reload
2500 ; RV32-NEXT:    vand.vv v8, v8, v24
2501 ; RV32-NEXT:    addi a0, sp, 16
2502 ; RV32-NEXT:    vl8r.v v24, (a0) # Unknown-size Folded Reload
2503 ; RV32-NEXT:    vmul.vv v8, v8, v24
2504 ; RV32-NEXT:    vsrl.vx v8, v8, a2
2505 ; RV32-NEXT:    csrr a0, vlenb
2506 ; RV32-NEXT:    slli a0, a0, 5
2507 ; RV32-NEXT:    add sp, sp, a0
2508 ; RV32-NEXT:    addi sp, sp, 16
2509 ; RV32-NEXT:    ret
2511 ; RV64-LABEL: vp_ctpop_nxv16i64_unmasked:
2512 ; RV64:       # %bb.0:
2513 ; RV64-NEXT:    csrr a1, vlenb
2514 ; RV64-NEXT:    mv a2, a0
2515 ; RV64-NEXT:    bltu a0, a1, .LBB47_2
2516 ; RV64-NEXT:  # %bb.1:
2517 ; RV64-NEXT:    mv a2, a1
2518 ; RV64-NEXT:  .LBB47_2:
2519 ; RV64-NEXT:    vsetvli zero, a2, e64, m8, ta, ma
2520 ; RV64-NEXT:    vsrl.vi v24, v8, 1
2521 ; RV64-NEXT:    lui a2, 349525
2522 ; RV64-NEXT:    addiw a2, a2, 1365
2523 ; RV64-NEXT:    slli a3, a2, 32
2524 ; RV64-NEXT:    add a2, a2, a3
2525 ; RV64-NEXT:    vand.vx v24, v24, a2
2526 ; RV64-NEXT:    vsub.vv v8, v8, v24
2527 ; RV64-NEXT:    lui a3, 209715
2528 ; RV64-NEXT:    addiw a3, a3, 819
2529 ; RV64-NEXT:    slli a4, a3, 32
2530 ; RV64-NEXT:    add a3, a3, a4
2531 ; RV64-NEXT:    vand.vx v24, v8, a3
2532 ; RV64-NEXT:    vsrl.vi v8, v8, 2
2533 ; RV64-NEXT:    vand.vx v8, v8, a3
2534 ; RV64-NEXT:    vadd.vv v8, v24, v8
2535 ; RV64-NEXT:    vsrl.vi v24, v8, 4
2536 ; RV64-NEXT:    vadd.vv v8, v8, v24
2537 ; RV64-NEXT:    lui a4, 61681
2538 ; RV64-NEXT:    addiw a4, a4, -241
2539 ; RV64-NEXT:    slli a5, a4, 32
2540 ; RV64-NEXT:    add a4, a4, a5
2541 ; RV64-NEXT:    vand.vx v8, v8, a4
2542 ; RV64-NEXT:    lui a5, 4112
2543 ; RV64-NEXT:    addiw a5, a5, 257
2544 ; RV64-NEXT:    slli a6, a5, 32
2545 ; RV64-NEXT:    add a5, a5, a6
2546 ; RV64-NEXT:    vmul.vx v8, v8, a5
2547 ; RV64-NEXT:    li a6, 56
2548 ; RV64-NEXT:    vsrl.vx v8, v8, a6
2549 ; RV64-NEXT:    sub a1, a0, a1
2550 ; RV64-NEXT:    sltu a0, a0, a1
2551 ; RV64-NEXT:    addi a0, a0, -1
2552 ; RV64-NEXT:    and a0, a0, a1
2553 ; RV64-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
2554 ; RV64-NEXT:    vsrl.vi v24, v16, 1
2555 ; RV64-NEXT:    vand.vx v24, v24, a2
2556 ; RV64-NEXT:    vsub.vv v16, v16, v24
2557 ; RV64-NEXT:    vand.vx v24, v16, a3
2558 ; RV64-NEXT:    vsrl.vi v16, v16, 2
2559 ; RV64-NEXT:    vand.vx v16, v16, a3
2560 ; RV64-NEXT:    vadd.vv v16, v24, v16
2561 ; RV64-NEXT:    vsrl.vi v24, v16, 4
2562 ; RV64-NEXT:    vadd.vv v16, v16, v24
2563 ; RV64-NEXT:    vand.vx v16, v16, a4
2564 ; RV64-NEXT:    vmul.vx v16, v16, a5
2565 ; RV64-NEXT:    vsrl.vx v16, v16, a6
2566 ; RV64-NEXT:    ret
2568 ; CHECK-ZVBB-LABEL: vp_ctpop_nxv16i64_unmasked:
2569 ; CHECK-ZVBB:       # %bb.0:
2570 ; CHECK-ZVBB-NEXT:    csrr a1, vlenb
2571 ; CHECK-ZVBB-NEXT:    sub a2, a0, a1
2572 ; CHECK-ZVBB-NEXT:    sltu a3, a0, a2
2573 ; CHECK-ZVBB-NEXT:    addi a3, a3, -1
2574 ; CHECK-ZVBB-NEXT:    and a2, a3, a2
2575 ; CHECK-ZVBB-NEXT:    vsetvli zero, a2, e64, m8, ta, ma
2576 ; CHECK-ZVBB-NEXT:    vcpop.v v16, v16
2577 ; CHECK-ZVBB-NEXT:    bltu a0, a1, .LBB47_2
2578 ; CHECK-ZVBB-NEXT:  # %bb.1:
2579 ; CHECK-ZVBB-NEXT:    mv a0, a1
2580 ; CHECK-ZVBB-NEXT:  .LBB47_2:
2581 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
2582 ; CHECK-ZVBB-NEXT:    vcpop.v v8, v8
2583 ; CHECK-ZVBB-NEXT:    ret
2584   %head = insertelement <vscale x 16 x i1> poison, i1 true, i32 0
2585   %m = shufflevector <vscale x 16 x i1> %head, <vscale x 16 x i1> poison, <vscale x 16 x i32> zeroinitializer
2586   %v = call <vscale x 16 x i64> @llvm.vp.ctpop.nxv16i64(<vscale x 16 x i64> %va, <vscale x 16 x i1> %m, i32 %evl)
2587   ret <vscale x 16 x i64> %v
2590 ; Test promotion.
2591 declare <vscale x 1 x i9> @llvm.vp.ctpop.nxv1i9(<vscale x 1 x i9>, <vscale x 1 x i1>, i32)
2593 define <vscale x 1 x i9> @vp_ctpop_nxv1i9(<vscale x 1 x i9> %va, <vscale x 1 x i1> %m, i32 zeroext %evl) {
2594 ; CHECK-LABEL: vp_ctpop_nxv1i9:
2595 ; CHECK:       # %bb.0:
2596 ; CHECK-NEXT:    li a1, 511
2597 ; CHECK-NEXT:    vsetvli a2, zero, e16, mf4, ta, ma
2598 ; CHECK-NEXT:    vand.vx v8, v8, a1
2599 ; CHECK-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
2600 ; CHECK-NEXT:    vsrl.vi v9, v8, 1, v0.t
2601 ; CHECK-NEXT:    lui a0, 5
2602 ; CHECK-NEXT:    addi a0, a0, 1365
2603 ; CHECK-NEXT:    vand.vx v9, v9, a0, v0.t
2604 ; CHECK-NEXT:    vsub.vv v8, v8, v9, v0.t
2605 ; CHECK-NEXT:    lui a0, 3
2606 ; CHECK-NEXT:    addi a0, a0, 819
2607 ; CHECK-NEXT:    vand.vx v9, v8, a0, v0.t
2608 ; CHECK-NEXT:    vsrl.vi v8, v8, 2, v0.t
2609 ; CHECK-NEXT:    vand.vx v8, v8, a0, v0.t
2610 ; CHECK-NEXT:    vadd.vv v8, v9, v8, v0.t
2611 ; CHECK-NEXT:    vsrl.vi v9, v8, 4, v0.t
2612 ; CHECK-NEXT:    vadd.vv v8, v8, v9, v0.t
2613 ; CHECK-NEXT:    lui a0, 1
2614 ; CHECK-NEXT:    addi a0, a0, -241
2615 ; CHECK-NEXT:    vand.vx v8, v8, a0, v0.t
2616 ; CHECK-NEXT:    li a0, 257
2617 ; CHECK-NEXT:    vmul.vx v8, v8, a0, v0.t
2618 ; CHECK-NEXT:    vsrl.vi v8, v8, 8, v0.t
2619 ; CHECK-NEXT:    ret
2621 ; CHECK-ZVBB-LABEL: vp_ctpop_nxv1i9:
2622 ; CHECK-ZVBB:       # %bb.0:
2623 ; CHECK-ZVBB-NEXT:    li a1, 511
2624 ; CHECK-ZVBB-NEXT:    vsetvli a2, zero, e16, mf4, ta, ma
2625 ; CHECK-ZVBB-NEXT:    vand.vx v8, v8, a1
2626 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
2627 ; CHECK-ZVBB-NEXT:    vcpop.v v8, v8, v0.t
2628 ; CHECK-ZVBB-NEXT:    ret
2629   %v = call <vscale x 1 x i9> @llvm.vp.ctpop.nxv1i9(<vscale x 1 x i9> %va, <vscale x 1 x i1> %m, i32 %evl)
2630   ret <vscale x 1 x i9> %v