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
7 declare <2 x i8> @llvm.vp.cttz.v2i8(<2 x i8>, i1 immarg, <2 x i1>, i32)
9 define <2 x i8> @vp_cttz_v2i8(<2 x i8> %va, <2 x i1> %m, i32 zeroext %evl) {
10 ; CHECK-LABEL: vp_cttz_v2i8:
12 ; CHECK-NEXT: li a1, 1
13 ; CHECK-NEXT: vsetvli zero, a0, e8, mf8, ta, ma
14 ; CHECK-NEXT: vsub.vx v9, v8, a1, v0.t
15 ; CHECK-NEXT: vnot.v v8, v8, v0.t
16 ; CHECK-NEXT: vand.vv v8, v8, v9, v0.t
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
30 %v = call <2 x i8> @llvm.vp.cttz.v2i8(<2 x i8> %va, i1 false, <2 x i1> %m, i32 %evl)
34 define <2 x i8> @vp_cttz_v2i8_unmasked(<2 x i8> %va, i32 zeroext %evl) {
35 ; CHECK-LABEL: vp_cttz_v2i8_unmasked:
37 ; CHECK-NEXT: li a1, 1
38 ; CHECK-NEXT: vsetvli zero, a0, e8, mf8, ta, ma
39 ; CHECK-NEXT: vsub.vx v9, v8, a1
40 ; CHECK-NEXT: vnot.v v8, v8
41 ; CHECK-NEXT: vand.vv v8, v8, v9
42 ; CHECK-NEXT: vsrl.vi v9, v8, 1
43 ; CHECK-NEXT: li a0, 85
44 ; CHECK-NEXT: vand.vx v9, v9, a0
45 ; CHECK-NEXT: vsub.vv v8, v8, v9
46 ; CHECK-NEXT: li a0, 51
47 ; CHECK-NEXT: vand.vx v9, v8, a0
48 ; CHECK-NEXT: vsrl.vi v8, v8, 2
49 ; CHECK-NEXT: vand.vx v8, v8, a0
50 ; CHECK-NEXT: vadd.vv v8, v9, v8
51 ; CHECK-NEXT: vsrl.vi v9, v8, 4
52 ; CHECK-NEXT: vadd.vv v8, v8, v9
53 ; CHECK-NEXT: vand.vi v8, v8, 15
55 %v = call <2 x i8> @llvm.vp.cttz.v2i8(<2 x i8> %va, i1 false, <2 x i1> splat (i1 true), i32 %evl)
59 declare <4 x i8> @llvm.vp.cttz.v4i8(<4 x i8>, i1 immarg, <4 x i1>, i32)
61 define <4 x i8> @vp_cttz_v4i8(<4 x i8> %va, <4 x i1> %m, i32 zeroext %evl) {
62 ; CHECK-LABEL: vp_cttz_v4i8:
64 ; CHECK-NEXT: li a1, 1
65 ; CHECK-NEXT: vsetvli zero, a0, e8, mf4, ta, ma
66 ; CHECK-NEXT: vsub.vx v9, v8, a1, v0.t
67 ; CHECK-NEXT: vnot.v v8, v8, v0.t
68 ; CHECK-NEXT: vand.vv v8, v8, v9, v0.t
69 ; CHECK-NEXT: vsrl.vi v9, v8, 1, v0.t
70 ; CHECK-NEXT: li a0, 85
71 ; CHECK-NEXT: vand.vx v9, v9, a0, v0.t
72 ; CHECK-NEXT: vsub.vv v8, v8, v9, v0.t
73 ; CHECK-NEXT: li a0, 51
74 ; CHECK-NEXT: vand.vx v9, v8, a0, v0.t
75 ; CHECK-NEXT: vsrl.vi v8, v8, 2, v0.t
76 ; CHECK-NEXT: vand.vx v8, v8, a0, v0.t
77 ; CHECK-NEXT: vadd.vv v8, v9, v8, v0.t
78 ; CHECK-NEXT: vsrl.vi v9, v8, 4, v0.t
79 ; CHECK-NEXT: vadd.vv v8, v8, v9, v0.t
80 ; CHECK-NEXT: vand.vi v8, v8, 15, v0.t
82 %v = call <4 x i8> @llvm.vp.cttz.v4i8(<4 x i8> %va, i1 false, <4 x i1> %m, i32 %evl)
86 define <4 x i8> @vp_cttz_v4i8_unmasked(<4 x i8> %va, i32 zeroext %evl) {
87 ; CHECK-LABEL: vp_cttz_v4i8_unmasked:
89 ; CHECK-NEXT: li a1, 1
90 ; CHECK-NEXT: vsetvli zero, a0, e8, mf4, ta, ma
91 ; CHECK-NEXT: vsub.vx v9, v8, a1
92 ; CHECK-NEXT: vnot.v v8, v8
93 ; CHECK-NEXT: vand.vv v8, v8, v9
94 ; CHECK-NEXT: vsrl.vi v9, v8, 1
95 ; CHECK-NEXT: li a0, 85
96 ; CHECK-NEXT: vand.vx v9, v9, a0
97 ; CHECK-NEXT: vsub.vv v8, v8, v9
98 ; CHECK-NEXT: li a0, 51
99 ; CHECK-NEXT: vand.vx v9, v8, a0
100 ; CHECK-NEXT: vsrl.vi v8, v8, 2
101 ; CHECK-NEXT: vand.vx v8, v8, a0
102 ; CHECK-NEXT: vadd.vv v8, v9, v8
103 ; CHECK-NEXT: vsrl.vi v9, v8, 4
104 ; CHECK-NEXT: vadd.vv v8, v8, v9
105 ; CHECK-NEXT: vand.vi v8, v8, 15
107 %v = call <4 x i8> @llvm.vp.cttz.v4i8(<4 x i8> %va, i1 false, <4 x i1> splat (i1 true), i32 %evl)
111 declare <8 x i8> @llvm.vp.cttz.v8i8(<8 x i8>, i1 immarg, <8 x i1>, i32)
113 define <8 x i8> @vp_cttz_v8i8(<8 x i8> %va, <8 x i1> %m, i32 zeroext %evl) {
114 ; CHECK-LABEL: vp_cttz_v8i8:
116 ; CHECK-NEXT: li a1, 1
117 ; CHECK-NEXT: vsetvli zero, a0, e8, mf2, ta, ma
118 ; CHECK-NEXT: vsub.vx v9, v8, a1, v0.t
119 ; CHECK-NEXT: vnot.v v8, v8, v0.t
120 ; CHECK-NEXT: vand.vv v8, v8, v9, v0.t
121 ; CHECK-NEXT: vsrl.vi v9, v8, 1, v0.t
122 ; CHECK-NEXT: li a0, 85
123 ; CHECK-NEXT: vand.vx v9, v9, a0, v0.t
124 ; CHECK-NEXT: vsub.vv v8, v8, v9, v0.t
125 ; CHECK-NEXT: li a0, 51
126 ; CHECK-NEXT: vand.vx v9, v8, a0, v0.t
127 ; CHECK-NEXT: vsrl.vi v8, v8, 2, v0.t
128 ; CHECK-NEXT: vand.vx v8, v8, a0, v0.t
129 ; CHECK-NEXT: vadd.vv v8, v9, v8, v0.t
130 ; CHECK-NEXT: vsrl.vi v9, v8, 4, v0.t
131 ; CHECK-NEXT: vadd.vv v8, v8, v9, v0.t
132 ; CHECK-NEXT: vand.vi v8, v8, 15, v0.t
134 %v = call <8 x i8> @llvm.vp.cttz.v8i8(<8 x i8> %va, i1 false, <8 x i1> %m, i32 %evl)
138 define <8 x i8> @vp_cttz_v8i8_unmasked(<8 x i8> %va, i32 zeroext %evl) {
139 ; CHECK-LABEL: vp_cttz_v8i8_unmasked:
141 ; CHECK-NEXT: li a1, 1
142 ; CHECK-NEXT: vsetvli zero, a0, e8, mf2, ta, ma
143 ; CHECK-NEXT: vsub.vx v9, v8, a1
144 ; CHECK-NEXT: vnot.v v8, v8
145 ; CHECK-NEXT: vand.vv v8, v8, v9
146 ; CHECK-NEXT: vsrl.vi v9, v8, 1
147 ; CHECK-NEXT: li a0, 85
148 ; CHECK-NEXT: vand.vx v9, v9, a0
149 ; CHECK-NEXT: vsub.vv v8, v8, v9
150 ; CHECK-NEXT: li a0, 51
151 ; CHECK-NEXT: vand.vx v9, v8, a0
152 ; CHECK-NEXT: vsrl.vi v8, v8, 2
153 ; CHECK-NEXT: vand.vx v8, v8, a0
154 ; CHECK-NEXT: vadd.vv v8, v9, v8
155 ; CHECK-NEXT: vsrl.vi v9, v8, 4
156 ; CHECK-NEXT: vadd.vv v8, v8, v9
157 ; CHECK-NEXT: vand.vi v8, v8, 15
159 %v = call <8 x i8> @llvm.vp.cttz.v8i8(<8 x i8> %va, i1 false, <8 x i1> splat (i1 true), i32 %evl)
163 declare <16 x i8> @llvm.vp.cttz.v16i8(<16 x i8>, i1 immarg, <16 x i1>, i32)
165 define <16 x i8> @vp_cttz_v16i8(<16 x i8> %va, <16 x i1> %m, i32 zeroext %evl) {
166 ; CHECK-LABEL: vp_cttz_v16i8:
168 ; CHECK-NEXT: li a1, 1
169 ; CHECK-NEXT: vsetvli zero, a0, e8, m1, ta, ma
170 ; CHECK-NEXT: vsub.vx v9, v8, a1, v0.t
171 ; CHECK-NEXT: vnot.v v8, v8, v0.t
172 ; CHECK-NEXT: vand.vv v8, v8, v9, v0.t
173 ; CHECK-NEXT: vsrl.vi v9, v8, 1, v0.t
174 ; CHECK-NEXT: li a0, 85
175 ; CHECK-NEXT: vand.vx v9, v9, a0, v0.t
176 ; CHECK-NEXT: vsub.vv v8, v8, v9, v0.t
177 ; CHECK-NEXT: li a0, 51
178 ; CHECK-NEXT: vand.vx v9, v8, a0, v0.t
179 ; CHECK-NEXT: vsrl.vi v8, v8, 2, v0.t
180 ; CHECK-NEXT: vand.vx v8, v8, a0, v0.t
181 ; CHECK-NEXT: vadd.vv v8, v9, v8, v0.t
182 ; CHECK-NEXT: vsrl.vi v9, v8, 4, v0.t
183 ; CHECK-NEXT: vadd.vv v8, v8, v9, v0.t
184 ; CHECK-NEXT: vand.vi v8, v8, 15, v0.t
186 %v = call <16 x i8> @llvm.vp.cttz.v16i8(<16 x i8> %va, i1 false, <16 x i1> %m, i32 %evl)
190 define <16 x i8> @vp_cttz_v16i8_unmasked(<16 x i8> %va, i32 zeroext %evl) {
191 ; CHECK-LABEL: vp_cttz_v16i8_unmasked:
193 ; CHECK-NEXT: li a1, 1
194 ; CHECK-NEXT: vsetvli zero, a0, e8, m1, ta, ma
195 ; CHECK-NEXT: vsub.vx v9, v8, a1
196 ; CHECK-NEXT: vnot.v v8, v8
197 ; CHECK-NEXT: vand.vv v8, v8, v9
198 ; CHECK-NEXT: vsrl.vi v9, v8, 1
199 ; CHECK-NEXT: li a0, 85
200 ; CHECK-NEXT: vand.vx v9, v9, a0
201 ; CHECK-NEXT: vsub.vv v8, v8, v9
202 ; CHECK-NEXT: li a0, 51
203 ; CHECK-NEXT: vand.vx v9, v8, a0
204 ; CHECK-NEXT: vsrl.vi v8, v8, 2
205 ; CHECK-NEXT: vand.vx v8, v8, a0
206 ; CHECK-NEXT: vadd.vv v8, v9, v8
207 ; CHECK-NEXT: vsrl.vi v9, v8, 4
208 ; CHECK-NEXT: vadd.vv v8, v8, v9
209 ; CHECK-NEXT: vand.vi v8, v8, 15
211 %v = call <16 x i8> @llvm.vp.cttz.v16i8(<16 x i8> %va, i1 false, <16 x i1> splat (i1 true), i32 %evl)
215 declare <2 x i16> @llvm.vp.cttz.v2i16(<2 x i16>, i1 immarg, <2 x i1>, i32)
217 define <2 x i16> @vp_cttz_v2i16(<2 x i16> %va, <2 x i1> %m, i32 zeroext %evl) {
218 ; CHECK-LABEL: vp_cttz_v2i16:
220 ; CHECK-NEXT: li a1, 1
221 ; CHECK-NEXT: vsetvli zero, a0, e16, mf4, ta, ma
222 ; CHECK-NEXT: vsub.vx v9, v8, a1, v0.t
223 ; CHECK-NEXT: vnot.v v8, v8, v0.t
224 ; CHECK-NEXT: vand.vv v8, v8, v9, v0.t
225 ; CHECK-NEXT: vsrl.vi v9, v8, 1, v0.t
226 ; CHECK-NEXT: lui a0, 5
227 ; CHECK-NEXT: addi a0, a0, 1365
228 ; CHECK-NEXT: vand.vx v9, v9, a0, v0.t
229 ; CHECK-NEXT: vsub.vv v8, v8, v9, v0.t
230 ; CHECK-NEXT: lui a0, 3
231 ; CHECK-NEXT: addi a0, a0, 819
232 ; CHECK-NEXT: vand.vx v9, v8, a0, v0.t
233 ; CHECK-NEXT: vsrl.vi v8, v8, 2, v0.t
234 ; CHECK-NEXT: vand.vx v8, v8, a0, v0.t
235 ; CHECK-NEXT: vadd.vv v8, v9, v8, v0.t
236 ; CHECK-NEXT: vsrl.vi v9, v8, 4, v0.t
237 ; CHECK-NEXT: vadd.vv v8, v8, v9, v0.t
238 ; CHECK-NEXT: lui a0, 1
239 ; CHECK-NEXT: addi a0, a0, -241
240 ; CHECK-NEXT: vand.vx v8, v8, a0, v0.t
241 ; CHECK-NEXT: li a0, 257
242 ; CHECK-NEXT: vmul.vx v8, v8, a0, v0.t
243 ; CHECK-NEXT: vsrl.vi v8, v8, 8, v0.t
245 %v = call <2 x i16> @llvm.vp.cttz.v2i16(<2 x i16> %va, i1 false, <2 x i1> %m, i32 %evl)
249 define <2 x i16> @vp_cttz_v2i16_unmasked(<2 x i16> %va, i32 zeroext %evl) {
250 ; CHECK-LABEL: vp_cttz_v2i16_unmasked:
252 ; CHECK-NEXT: li a1, 1
253 ; CHECK-NEXT: vsetvli zero, a0, e16, mf4, ta, ma
254 ; CHECK-NEXT: vsub.vx v9, v8, a1
255 ; CHECK-NEXT: vnot.v v8, v8
256 ; CHECK-NEXT: vand.vv v8, v8, v9
257 ; CHECK-NEXT: vsrl.vi v9, v8, 1
258 ; CHECK-NEXT: lui a0, 5
259 ; CHECK-NEXT: addi a0, a0, 1365
260 ; CHECK-NEXT: vand.vx v9, v9, a0
261 ; CHECK-NEXT: vsub.vv v8, v8, v9
262 ; CHECK-NEXT: lui a0, 3
263 ; CHECK-NEXT: addi a0, a0, 819
264 ; CHECK-NEXT: vand.vx v9, v8, a0
265 ; CHECK-NEXT: vsrl.vi v8, v8, 2
266 ; CHECK-NEXT: vand.vx v8, v8, a0
267 ; CHECK-NEXT: vadd.vv v8, v9, v8
268 ; CHECK-NEXT: vsrl.vi v9, v8, 4
269 ; CHECK-NEXT: vadd.vv v8, v8, v9
270 ; CHECK-NEXT: lui a0, 1
271 ; CHECK-NEXT: addi a0, a0, -241
272 ; CHECK-NEXT: vand.vx v8, v8, a0
273 ; CHECK-NEXT: li a0, 257
274 ; CHECK-NEXT: vmul.vx v8, v8, a0
275 ; CHECK-NEXT: vsrl.vi v8, v8, 8
277 %v = call <2 x i16> @llvm.vp.cttz.v2i16(<2 x i16> %va, i1 false, <2 x i1> splat (i1 true), i32 %evl)
281 declare <4 x i16> @llvm.vp.cttz.v4i16(<4 x i16>, i1 immarg, <4 x i1>, i32)
283 define <4 x i16> @vp_cttz_v4i16(<4 x i16> %va, <4 x i1> %m, i32 zeroext %evl) {
284 ; CHECK-LABEL: vp_cttz_v4i16:
286 ; CHECK-NEXT: li a1, 1
287 ; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, ma
288 ; CHECK-NEXT: vsub.vx v9, v8, a1, v0.t
289 ; CHECK-NEXT: vnot.v v8, v8, v0.t
290 ; CHECK-NEXT: vand.vv v8, v8, v9, v0.t
291 ; CHECK-NEXT: vsrl.vi v9, v8, 1, v0.t
292 ; CHECK-NEXT: lui a0, 5
293 ; CHECK-NEXT: addi a0, a0, 1365
294 ; CHECK-NEXT: vand.vx v9, v9, a0, v0.t
295 ; CHECK-NEXT: vsub.vv v8, v8, v9, v0.t
296 ; CHECK-NEXT: lui a0, 3
297 ; CHECK-NEXT: addi a0, a0, 819
298 ; CHECK-NEXT: vand.vx v9, v8, a0, v0.t
299 ; CHECK-NEXT: vsrl.vi v8, v8, 2, v0.t
300 ; CHECK-NEXT: vand.vx v8, v8, a0, v0.t
301 ; CHECK-NEXT: vadd.vv v8, v9, v8, v0.t
302 ; CHECK-NEXT: vsrl.vi v9, v8, 4, v0.t
303 ; CHECK-NEXT: vadd.vv v8, v8, v9, v0.t
304 ; CHECK-NEXT: lui a0, 1
305 ; CHECK-NEXT: addi a0, a0, -241
306 ; CHECK-NEXT: vand.vx v8, v8, a0, v0.t
307 ; CHECK-NEXT: li a0, 257
308 ; CHECK-NEXT: vmul.vx v8, v8, a0, v0.t
309 ; CHECK-NEXT: vsrl.vi v8, v8, 8, v0.t
311 %v = call <4 x i16> @llvm.vp.cttz.v4i16(<4 x i16> %va, i1 false, <4 x i1> %m, i32 %evl)
315 define <4 x i16> @vp_cttz_v4i16_unmasked(<4 x i16> %va, i32 zeroext %evl) {
316 ; CHECK-LABEL: vp_cttz_v4i16_unmasked:
318 ; CHECK-NEXT: li a1, 1
319 ; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, ma
320 ; CHECK-NEXT: vsub.vx v9, v8, a1
321 ; CHECK-NEXT: vnot.v v8, v8
322 ; CHECK-NEXT: vand.vv v8, v8, v9
323 ; CHECK-NEXT: vsrl.vi v9, v8, 1
324 ; CHECK-NEXT: lui a0, 5
325 ; CHECK-NEXT: addi a0, a0, 1365
326 ; CHECK-NEXT: vand.vx v9, v9, a0
327 ; CHECK-NEXT: vsub.vv v8, v8, v9
328 ; CHECK-NEXT: lui a0, 3
329 ; CHECK-NEXT: addi a0, a0, 819
330 ; CHECK-NEXT: vand.vx v9, v8, a0
331 ; CHECK-NEXT: vsrl.vi v8, v8, 2
332 ; CHECK-NEXT: vand.vx v8, v8, a0
333 ; CHECK-NEXT: vadd.vv v8, v9, v8
334 ; CHECK-NEXT: vsrl.vi v9, v8, 4
335 ; CHECK-NEXT: vadd.vv v8, v8, v9
336 ; CHECK-NEXT: lui a0, 1
337 ; CHECK-NEXT: addi a0, a0, -241
338 ; CHECK-NEXT: vand.vx v8, v8, a0
339 ; CHECK-NEXT: li a0, 257
340 ; CHECK-NEXT: vmul.vx v8, v8, a0
341 ; CHECK-NEXT: vsrl.vi v8, v8, 8
343 %v = call <4 x i16> @llvm.vp.cttz.v4i16(<4 x i16> %va, i1 false, <4 x i1> splat (i1 true), i32 %evl)
347 declare <8 x i16> @llvm.vp.cttz.v8i16(<8 x i16>, i1 immarg, <8 x i1>, i32)
349 define <8 x i16> @vp_cttz_v8i16(<8 x i16> %va, <8 x i1> %m, i32 zeroext %evl) {
350 ; CHECK-LABEL: vp_cttz_v8i16:
352 ; CHECK-NEXT: li a1, 1
353 ; CHECK-NEXT: vsetvli zero, a0, e16, m1, ta, ma
354 ; CHECK-NEXT: vsub.vx v9, v8, a1, v0.t
355 ; CHECK-NEXT: vnot.v v8, v8, v0.t
356 ; CHECK-NEXT: vand.vv v8, v8, v9, v0.t
357 ; CHECK-NEXT: vsrl.vi v9, v8, 1, v0.t
358 ; CHECK-NEXT: lui a0, 5
359 ; CHECK-NEXT: addi a0, a0, 1365
360 ; CHECK-NEXT: vand.vx v9, v9, a0, v0.t
361 ; CHECK-NEXT: vsub.vv v8, v8, v9, v0.t
362 ; CHECK-NEXT: lui a0, 3
363 ; CHECK-NEXT: addi a0, a0, 819
364 ; CHECK-NEXT: vand.vx v9, v8, a0, v0.t
365 ; CHECK-NEXT: vsrl.vi v8, v8, 2, v0.t
366 ; CHECK-NEXT: vand.vx v8, v8, a0, v0.t
367 ; CHECK-NEXT: vadd.vv v8, v9, v8, v0.t
368 ; CHECK-NEXT: vsrl.vi v9, v8, 4, v0.t
369 ; CHECK-NEXT: vadd.vv v8, v8, v9, v0.t
370 ; CHECK-NEXT: lui a0, 1
371 ; CHECK-NEXT: addi a0, a0, -241
372 ; CHECK-NEXT: vand.vx v8, v8, a0, v0.t
373 ; CHECK-NEXT: li a0, 257
374 ; CHECK-NEXT: vmul.vx v8, v8, a0, v0.t
375 ; CHECK-NEXT: vsrl.vi v8, v8, 8, v0.t
377 %v = call <8 x i16> @llvm.vp.cttz.v8i16(<8 x i16> %va, i1 false, <8 x i1> %m, i32 %evl)
381 define <8 x i16> @vp_cttz_v8i16_unmasked(<8 x i16> %va, i32 zeroext %evl) {
382 ; CHECK-LABEL: vp_cttz_v8i16_unmasked:
384 ; CHECK-NEXT: li a1, 1
385 ; CHECK-NEXT: vsetvli zero, a0, e16, m1, ta, ma
386 ; CHECK-NEXT: vsub.vx v9, v8, a1
387 ; CHECK-NEXT: vnot.v v8, v8
388 ; CHECK-NEXT: vand.vv v8, v8, v9
389 ; CHECK-NEXT: vsrl.vi v9, v8, 1
390 ; CHECK-NEXT: lui a0, 5
391 ; CHECK-NEXT: addi a0, a0, 1365
392 ; CHECK-NEXT: vand.vx v9, v9, a0
393 ; CHECK-NEXT: vsub.vv v8, v8, v9
394 ; CHECK-NEXT: lui a0, 3
395 ; CHECK-NEXT: addi a0, a0, 819
396 ; CHECK-NEXT: vand.vx v9, v8, a0
397 ; CHECK-NEXT: vsrl.vi v8, v8, 2
398 ; CHECK-NEXT: vand.vx v8, v8, a0
399 ; CHECK-NEXT: vadd.vv v8, v9, v8
400 ; CHECK-NEXT: vsrl.vi v9, v8, 4
401 ; CHECK-NEXT: vadd.vv v8, v8, v9
402 ; CHECK-NEXT: lui a0, 1
403 ; CHECK-NEXT: addi a0, a0, -241
404 ; CHECK-NEXT: vand.vx v8, v8, a0
405 ; CHECK-NEXT: li a0, 257
406 ; CHECK-NEXT: vmul.vx v8, v8, a0
407 ; CHECK-NEXT: vsrl.vi v8, v8, 8
409 %v = call <8 x i16> @llvm.vp.cttz.v8i16(<8 x i16> %va, i1 false, <8 x i1> splat (i1 true), i32 %evl)
413 declare <16 x i16> @llvm.vp.cttz.v16i16(<16 x i16>, i1 immarg, <16 x i1>, i32)
415 define <16 x i16> @vp_cttz_v16i16(<16 x i16> %va, <16 x i1> %m, i32 zeroext %evl) {
416 ; CHECK-LABEL: vp_cttz_v16i16:
418 ; CHECK-NEXT: li a1, 1
419 ; CHECK-NEXT: vsetvli zero, a0, e16, m2, ta, ma
420 ; CHECK-NEXT: vsub.vx v10, v8, a1, v0.t
421 ; CHECK-NEXT: vnot.v v8, v8, v0.t
422 ; CHECK-NEXT: vand.vv v8, v8, v10, v0.t
423 ; CHECK-NEXT: vsrl.vi v10, v8, 1, v0.t
424 ; CHECK-NEXT: lui a0, 5
425 ; CHECK-NEXT: addi a0, a0, 1365
426 ; CHECK-NEXT: vand.vx v10, v10, a0, v0.t
427 ; CHECK-NEXT: vsub.vv v8, v8, v10, v0.t
428 ; CHECK-NEXT: lui a0, 3
429 ; CHECK-NEXT: addi a0, a0, 819
430 ; CHECK-NEXT: vand.vx v10, 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, v10, v8, v0.t
434 ; CHECK-NEXT: vsrl.vi v10, v8, 4, v0.t
435 ; CHECK-NEXT: vadd.vv v8, v8, v10, 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
443 %v = call <16 x i16> @llvm.vp.cttz.v16i16(<16 x i16> %va, i1 false, <16 x i1> %m, i32 %evl)
447 define <16 x i16> @vp_cttz_v16i16_unmasked(<16 x i16> %va, i32 zeroext %evl) {
448 ; CHECK-LABEL: vp_cttz_v16i16_unmasked:
450 ; CHECK-NEXT: li a1, 1
451 ; CHECK-NEXT: vsetvli zero, a0, e16, m2, ta, ma
452 ; CHECK-NEXT: vsub.vx v10, v8, a1
453 ; CHECK-NEXT: vnot.v v8, v8
454 ; CHECK-NEXT: vand.vv v8, v8, v10
455 ; CHECK-NEXT: vsrl.vi v10, v8, 1
456 ; CHECK-NEXT: lui a0, 5
457 ; CHECK-NEXT: addi a0, a0, 1365
458 ; CHECK-NEXT: vand.vx v10, v10, a0
459 ; CHECK-NEXT: vsub.vv v8, v8, v10
460 ; CHECK-NEXT: lui a0, 3
461 ; CHECK-NEXT: addi a0, a0, 819
462 ; CHECK-NEXT: vand.vx v10, v8, a0
463 ; CHECK-NEXT: vsrl.vi v8, v8, 2
464 ; CHECK-NEXT: vand.vx v8, v8, a0
465 ; CHECK-NEXT: vadd.vv v8, v10, v8
466 ; CHECK-NEXT: vsrl.vi v10, v8, 4
467 ; CHECK-NEXT: vadd.vv v8, v8, v10
468 ; CHECK-NEXT: lui a0, 1
469 ; CHECK-NEXT: addi a0, a0, -241
470 ; CHECK-NEXT: vand.vx v8, v8, a0
471 ; CHECK-NEXT: li a0, 257
472 ; CHECK-NEXT: vmul.vx v8, v8, a0
473 ; CHECK-NEXT: vsrl.vi v8, v8, 8
475 %v = call <16 x i16> @llvm.vp.cttz.v16i16(<16 x i16> %va, i1 false, <16 x i1> splat (i1 true), i32 %evl)
479 declare <2 x i32> @llvm.vp.cttz.v2i32(<2 x i32>, i1 immarg, <2 x i1>, i32)
481 define <2 x i32> @vp_cttz_v2i32(<2 x i32> %va, <2 x i1> %m, i32 zeroext %evl) {
482 ; CHECK-LABEL: vp_cttz_v2i32:
484 ; CHECK-NEXT: li a1, 1
485 ; CHECK-NEXT: vsetvli zero, a0, e32, mf2, ta, ma
486 ; CHECK-NEXT: vsub.vx v9, v8, a1, v0.t
487 ; CHECK-NEXT: vnot.v v8, v8, v0.t
488 ; CHECK-NEXT: vand.vv v8, v8, v9, v0.t
489 ; CHECK-NEXT: vsrl.vi v9, v8, 1, v0.t
490 ; CHECK-NEXT: lui a0, 349525
491 ; CHECK-NEXT: addi a0, a0, 1365
492 ; CHECK-NEXT: vand.vx v9, v9, a0, v0.t
493 ; CHECK-NEXT: vsub.vv v8, v8, v9, v0.t
494 ; CHECK-NEXT: lui a0, 209715
495 ; CHECK-NEXT: addi a0, a0, 819
496 ; CHECK-NEXT: vand.vx v9, v8, a0, v0.t
497 ; CHECK-NEXT: vsrl.vi v8, v8, 2, v0.t
498 ; CHECK-NEXT: vand.vx v8, v8, a0, v0.t
499 ; CHECK-NEXT: vadd.vv v8, v9, v8, v0.t
500 ; CHECK-NEXT: vsrl.vi v9, v8, 4, v0.t
501 ; CHECK-NEXT: vadd.vv v8, v8, v9, v0.t
502 ; CHECK-NEXT: lui a0, 61681
503 ; CHECK-NEXT: addi a0, a0, -241
504 ; CHECK-NEXT: vand.vx v8, v8, a0, v0.t
505 ; CHECK-NEXT: lui a0, 4112
506 ; CHECK-NEXT: addi a0, a0, 257
507 ; CHECK-NEXT: vmul.vx v8, v8, a0, v0.t
508 ; CHECK-NEXT: vsrl.vi v8, v8, 24, v0.t
510 %v = call <2 x i32> @llvm.vp.cttz.v2i32(<2 x i32> %va, i1 false, <2 x i1> %m, i32 %evl)
514 define <2 x i32> @vp_cttz_v2i32_unmasked(<2 x i32> %va, i32 zeroext %evl) {
515 ; CHECK-LABEL: vp_cttz_v2i32_unmasked:
517 ; CHECK-NEXT: li a1, 1
518 ; CHECK-NEXT: vsetvli zero, a0, e32, mf2, ta, ma
519 ; CHECK-NEXT: vsub.vx v9, v8, a1
520 ; CHECK-NEXT: vnot.v v8, v8
521 ; CHECK-NEXT: vand.vv v8, v8, v9
522 ; CHECK-NEXT: vsrl.vi v9, v8, 1
523 ; CHECK-NEXT: lui a0, 349525
524 ; CHECK-NEXT: addi a0, a0, 1365
525 ; CHECK-NEXT: vand.vx v9, v9, a0
526 ; CHECK-NEXT: vsub.vv v8, v8, v9
527 ; CHECK-NEXT: lui a0, 209715
528 ; CHECK-NEXT: addi a0, a0, 819
529 ; CHECK-NEXT: vand.vx v9, v8, a0
530 ; CHECK-NEXT: vsrl.vi v8, v8, 2
531 ; CHECK-NEXT: vand.vx v8, v8, a0
532 ; CHECK-NEXT: vadd.vv v8, v9, v8
533 ; CHECK-NEXT: vsrl.vi v9, v8, 4
534 ; CHECK-NEXT: vadd.vv v8, v8, v9
535 ; CHECK-NEXT: lui a0, 61681
536 ; CHECK-NEXT: addi a0, a0, -241
537 ; CHECK-NEXT: vand.vx v8, v8, a0
538 ; CHECK-NEXT: lui a0, 4112
539 ; CHECK-NEXT: addi a0, a0, 257
540 ; CHECK-NEXT: vmul.vx v8, v8, a0
541 ; CHECK-NEXT: vsrl.vi v8, v8, 24
543 %v = call <2 x i32> @llvm.vp.cttz.v2i32(<2 x i32> %va, i1 false, <2 x i1> splat (i1 true), i32 %evl)
547 declare <4 x i32> @llvm.vp.cttz.v4i32(<4 x i32>, i1 immarg, <4 x i1>, i32)
549 define <4 x i32> @vp_cttz_v4i32(<4 x i32> %va, <4 x i1> %m, i32 zeroext %evl) {
550 ; CHECK-LABEL: vp_cttz_v4i32:
552 ; CHECK-NEXT: li a1, 1
553 ; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma
554 ; CHECK-NEXT: vsub.vx v9, v8, a1, v0.t
555 ; CHECK-NEXT: vnot.v v8, v8, v0.t
556 ; CHECK-NEXT: vand.vv v8, v8, v9, v0.t
557 ; CHECK-NEXT: vsrl.vi v9, v8, 1, v0.t
558 ; CHECK-NEXT: lui a0, 349525
559 ; CHECK-NEXT: addi a0, a0, 1365
560 ; CHECK-NEXT: vand.vx v9, v9, a0, v0.t
561 ; CHECK-NEXT: vsub.vv v8, v8, v9, v0.t
562 ; CHECK-NEXT: lui a0, 209715
563 ; CHECK-NEXT: addi a0, a0, 819
564 ; CHECK-NEXT: vand.vx v9, v8, a0, v0.t
565 ; CHECK-NEXT: vsrl.vi v8, v8, 2, v0.t
566 ; CHECK-NEXT: vand.vx v8, v8, a0, v0.t
567 ; CHECK-NEXT: vadd.vv v8, v9, v8, v0.t
568 ; CHECK-NEXT: vsrl.vi v9, v8, 4, v0.t
569 ; CHECK-NEXT: vadd.vv v8, v8, v9, v0.t
570 ; CHECK-NEXT: lui a0, 61681
571 ; CHECK-NEXT: addi a0, a0, -241
572 ; CHECK-NEXT: vand.vx v8, v8, a0, v0.t
573 ; CHECK-NEXT: lui a0, 4112
574 ; CHECK-NEXT: addi a0, a0, 257
575 ; CHECK-NEXT: vmul.vx v8, v8, a0, v0.t
576 ; CHECK-NEXT: vsrl.vi v8, v8, 24, v0.t
578 %v = call <4 x i32> @llvm.vp.cttz.v4i32(<4 x i32> %va, i1 false, <4 x i1> %m, i32 %evl)
582 define <4 x i32> @vp_cttz_v4i32_unmasked(<4 x i32> %va, i32 zeroext %evl) {
583 ; CHECK-LABEL: vp_cttz_v4i32_unmasked:
585 ; CHECK-NEXT: li a1, 1
586 ; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma
587 ; CHECK-NEXT: vsub.vx v9, v8, a1
588 ; CHECK-NEXT: vnot.v v8, v8
589 ; CHECK-NEXT: vand.vv v8, v8, v9
590 ; CHECK-NEXT: vsrl.vi v9, v8, 1
591 ; CHECK-NEXT: lui a0, 349525
592 ; CHECK-NEXT: addi a0, a0, 1365
593 ; CHECK-NEXT: vand.vx v9, v9, a0
594 ; CHECK-NEXT: vsub.vv v8, v8, v9
595 ; CHECK-NEXT: lui a0, 209715
596 ; CHECK-NEXT: addi a0, a0, 819
597 ; CHECK-NEXT: vand.vx v9, v8, a0
598 ; CHECK-NEXT: vsrl.vi v8, v8, 2
599 ; CHECK-NEXT: vand.vx v8, v8, a0
600 ; CHECK-NEXT: vadd.vv v8, v9, v8
601 ; CHECK-NEXT: vsrl.vi v9, v8, 4
602 ; CHECK-NEXT: vadd.vv v8, v8, v9
603 ; CHECK-NEXT: lui a0, 61681
604 ; CHECK-NEXT: addi a0, a0, -241
605 ; CHECK-NEXT: vand.vx v8, v8, a0
606 ; CHECK-NEXT: lui a0, 4112
607 ; CHECK-NEXT: addi a0, a0, 257
608 ; CHECK-NEXT: vmul.vx v8, v8, a0
609 ; CHECK-NEXT: vsrl.vi v8, v8, 24
611 %v = call <4 x i32> @llvm.vp.cttz.v4i32(<4 x i32> %va, i1 false, <4 x i1> splat (i1 true), i32 %evl)
615 declare <8 x i32> @llvm.vp.cttz.v8i32(<8 x i32>, i1 immarg, <8 x i1>, i32)
617 define <8 x i32> @vp_cttz_v8i32(<8 x i32> %va, <8 x i1> %m, i32 zeroext %evl) {
618 ; CHECK-LABEL: vp_cttz_v8i32:
620 ; CHECK-NEXT: li a1, 1
621 ; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, ma
622 ; CHECK-NEXT: vsub.vx v10, v8, a1, v0.t
623 ; CHECK-NEXT: vnot.v v8, v8, v0.t
624 ; CHECK-NEXT: vand.vv v8, v8, v10, v0.t
625 ; CHECK-NEXT: vsrl.vi v10, v8, 1, v0.t
626 ; CHECK-NEXT: lui a0, 349525
627 ; CHECK-NEXT: addi a0, a0, 1365
628 ; CHECK-NEXT: vand.vx v10, v10, a0, v0.t
629 ; CHECK-NEXT: vsub.vv v8, v8, v10, v0.t
630 ; CHECK-NEXT: lui a0, 209715
631 ; CHECK-NEXT: addi a0, a0, 819
632 ; CHECK-NEXT: vand.vx v10, v8, a0, v0.t
633 ; CHECK-NEXT: vsrl.vi v8, v8, 2, v0.t
634 ; CHECK-NEXT: vand.vx v8, v8, a0, v0.t
635 ; CHECK-NEXT: vadd.vv v8, v10, v8, v0.t
636 ; CHECK-NEXT: vsrl.vi v10, v8, 4, v0.t
637 ; CHECK-NEXT: vadd.vv v8, v8, v10, v0.t
638 ; CHECK-NEXT: lui a0, 61681
639 ; CHECK-NEXT: addi a0, a0, -241
640 ; CHECK-NEXT: vand.vx v8, v8, a0, v0.t
641 ; CHECK-NEXT: lui a0, 4112
642 ; CHECK-NEXT: addi a0, a0, 257
643 ; CHECK-NEXT: vmul.vx v8, v8, a0, v0.t
644 ; CHECK-NEXT: vsrl.vi v8, v8, 24, v0.t
646 %v = call <8 x i32> @llvm.vp.cttz.v8i32(<8 x i32> %va, i1 false, <8 x i1> %m, i32 %evl)
650 define <8 x i32> @vp_cttz_v8i32_unmasked(<8 x i32> %va, i32 zeroext %evl) {
651 ; CHECK-LABEL: vp_cttz_v8i32_unmasked:
653 ; CHECK-NEXT: li a1, 1
654 ; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, ma
655 ; CHECK-NEXT: vsub.vx v10, v8, a1
656 ; CHECK-NEXT: vnot.v v8, v8
657 ; CHECK-NEXT: vand.vv v8, v8, v10
658 ; CHECK-NEXT: vsrl.vi v10, v8, 1
659 ; CHECK-NEXT: lui a0, 349525
660 ; CHECK-NEXT: addi a0, a0, 1365
661 ; CHECK-NEXT: vand.vx v10, v10, a0
662 ; CHECK-NEXT: vsub.vv v8, v8, v10
663 ; CHECK-NEXT: lui a0, 209715
664 ; CHECK-NEXT: addi a0, a0, 819
665 ; CHECK-NEXT: vand.vx v10, v8, a0
666 ; CHECK-NEXT: vsrl.vi v8, v8, 2
667 ; CHECK-NEXT: vand.vx v8, v8, a0
668 ; CHECK-NEXT: vadd.vv v8, v10, v8
669 ; CHECK-NEXT: vsrl.vi v10, v8, 4
670 ; CHECK-NEXT: vadd.vv v8, v8, v10
671 ; CHECK-NEXT: lui a0, 61681
672 ; CHECK-NEXT: addi a0, a0, -241
673 ; CHECK-NEXT: vand.vx v8, v8, a0
674 ; CHECK-NEXT: lui a0, 4112
675 ; CHECK-NEXT: addi a0, a0, 257
676 ; CHECK-NEXT: vmul.vx v8, v8, a0
677 ; CHECK-NEXT: vsrl.vi v8, v8, 24
679 %v = call <8 x i32> @llvm.vp.cttz.v8i32(<8 x i32> %va, i1 false, <8 x i1> splat (i1 true), i32 %evl)
683 declare <16 x i32> @llvm.vp.cttz.v16i32(<16 x i32>, i1 immarg, <16 x i1>, i32)
685 define <16 x i32> @vp_cttz_v16i32(<16 x i32> %va, <16 x i1> %m, i32 zeroext %evl) {
686 ; CHECK-LABEL: vp_cttz_v16i32:
688 ; CHECK-NEXT: li a1, 1
689 ; CHECK-NEXT: vsetvli zero, a0, e32, m4, ta, ma
690 ; CHECK-NEXT: vsub.vx v12, v8, a1, v0.t
691 ; CHECK-NEXT: vnot.v v8, v8, v0.t
692 ; CHECK-NEXT: vand.vv v8, v8, v12, v0.t
693 ; CHECK-NEXT: vsrl.vi v12, v8, 1, v0.t
694 ; CHECK-NEXT: lui a0, 349525
695 ; CHECK-NEXT: addi a0, a0, 1365
696 ; CHECK-NEXT: vand.vx v12, v12, a0, v0.t
697 ; CHECK-NEXT: vsub.vv v8, v8, v12, v0.t
698 ; CHECK-NEXT: lui a0, 209715
699 ; CHECK-NEXT: addi a0, a0, 819
700 ; CHECK-NEXT: vand.vx v12, v8, a0, v0.t
701 ; CHECK-NEXT: vsrl.vi v8, v8, 2, v0.t
702 ; CHECK-NEXT: vand.vx v8, v8, a0, v0.t
703 ; CHECK-NEXT: vadd.vv v8, v12, v8, v0.t
704 ; CHECK-NEXT: vsrl.vi v12, v8, 4, v0.t
705 ; CHECK-NEXT: vadd.vv v8, v8, v12, v0.t
706 ; CHECK-NEXT: lui a0, 61681
707 ; CHECK-NEXT: addi a0, a0, -241
708 ; CHECK-NEXT: vand.vx v8, v8, a0, v0.t
709 ; CHECK-NEXT: lui a0, 4112
710 ; CHECK-NEXT: addi a0, a0, 257
711 ; CHECK-NEXT: vmul.vx v8, v8, a0, v0.t
712 ; CHECK-NEXT: vsrl.vi v8, v8, 24, v0.t
714 %v = call <16 x i32> @llvm.vp.cttz.v16i32(<16 x i32> %va, i1 false, <16 x i1> %m, i32 %evl)
718 define <16 x i32> @vp_cttz_v16i32_unmasked(<16 x i32> %va, i32 zeroext %evl) {
719 ; CHECK-LABEL: vp_cttz_v16i32_unmasked:
721 ; CHECK-NEXT: li a1, 1
722 ; CHECK-NEXT: vsetvli zero, a0, e32, m4, ta, ma
723 ; CHECK-NEXT: vsub.vx v12, v8, a1
724 ; CHECK-NEXT: vnot.v v8, v8
725 ; CHECK-NEXT: vand.vv v8, v8, v12
726 ; CHECK-NEXT: vsrl.vi v12, v8, 1
727 ; CHECK-NEXT: lui a0, 349525
728 ; CHECK-NEXT: addi a0, a0, 1365
729 ; CHECK-NEXT: vand.vx v12, v12, a0
730 ; CHECK-NEXT: vsub.vv v8, v8, v12
731 ; CHECK-NEXT: lui a0, 209715
732 ; CHECK-NEXT: addi a0, a0, 819
733 ; CHECK-NEXT: vand.vx v12, v8, a0
734 ; CHECK-NEXT: vsrl.vi v8, v8, 2
735 ; CHECK-NEXT: vand.vx v8, v8, a0
736 ; CHECK-NEXT: vadd.vv v8, v12, v8
737 ; CHECK-NEXT: vsrl.vi v12, v8, 4
738 ; CHECK-NEXT: vadd.vv v8, v8, v12
739 ; CHECK-NEXT: lui a0, 61681
740 ; CHECK-NEXT: addi a0, a0, -241
741 ; CHECK-NEXT: vand.vx v8, v8, a0
742 ; CHECK-NEXT: lui a0, 4112
743 ; CHECK-NEXT: addi a0, a0, 257
744 ; CHECK-NEXT: vmul.vx v8, v8, a0
745 ; CHECK-NEXT: vsrl.vi v8, v8, 24
747 %v = call <16 x i32> @llvm.vp.cttz.v16i32(<16 x i32> %va, i1 false, <16 x i1> splat (i1 true), i32 %evl)
751 declare <2 x i64> @llvm.vp.cttz.v2i64(<2 x i64>, i1 immarg, <2 x i1>, i32)
753 define <2 x i64> @vp_cttz_v2i64(<2 x i64> %va, <2 x i1> %m, i32 zeroext %evl) {
754 ; RV32-LABEL: vp_cttz_v2i64:
756 ; RV32-NEXT: li a1, 1
757 ; RV32-NEXT: vsetvli zero, a0, e64, m1, ta, ma
758 ; RV32-NEXT: vsub.vx v9, v8, a1, v0.t
759 ; RV32-NEXT: vnot.v v8, v8, v0.t
760 ; RV32-NEXT: vand.vv v8, v8, v9, v0.t
761 ; RV32-NEXT: vsrl.vi v9, v8, 1, v0.t
762 ; RV32-NEXT: lui a1, 349525
763 ; RV32-NEXT: addi a1, a1, 1365
764 ; RV32-NEXT: vsetivli zero, 4, e32, m1, ta, ma
765 ; RV32-NEXT: vmv.v.x v10, a1
766 ; RV32-NEXT: vsetvli zero, a0, e64, m1, ta, ma
767 ; RV32-NEXT: vand.vv v9, v9, v10, v0.t
768 ; RV32-NEXT: vsub.vv v8, v8, v9, v0.t
769 ; RV32-NEXT: lui a1, 209715
770 ; RV32-NEXT: addi a1, a1, 819
771 ; RV32-NEXT: vsetivli zero, 4, e32, m1, ta, ma
772 ; RV32-NEXT: vmv.v.x v9, a1
773 ; RV32-NEXT: vsetvli zero, a0, e64, m1, ta, ma
774 ; RV32-NEXT: vand.vv v10, v8, v9, v0.t
775 ; RV32-NEXT: vsrl.vi v8, v8, 2, v0.t
776 ; RV32-NEXT: vand.vv v8, v8, v9, v0.t
777 ; RV32-NEXT: vadd.vv v8, v10, v8, v0.t
778 ; RV32-NEXT: vsrl.vi v9, v8, 4, v0.t
779 ; RV32-NEXT: vadd.vv v8, v8, v9, v0.t
780 ; RV32-NEXT: lui a1, 61681
781 ; RV32-NEXT: addi a1, a1, -241
782 ; RV32-NEXT: vsetivli zero, 4, e32, m1, ta, ma
783 ; RV32-NEXT: vmv.v.x v9, a1
784 ; RV32-NEXT: vsetvli zero, a0, e64, m1, ta, ma
785 ; RV32-NEXT: vand.vv v8, v8, v9, v0.t
786 ; RV32-NEXT: lui a1, 4112
787 ; RV32-NEXT: addi a1, a1, 257
788 ; RV32-NEXT: vsetivli zero, 4, e32, m1, ta, ma
789 ; RV32-NEXT: vmv.v.x v9, a1
790 ; RV32-NEXT: vsetvli zero, a0, e64, m1, ta, ma
791 ; RV32-NEXT: vmul.vv v8, v8, v9, v0.t
792 ; RV32-NEXT: li a0, 56
793 ; RV32-NEXT: vsrl.vx v8, v8, a0, v0.t
796 ; RV64-LABEL: vp_cttz_v2i64:
798 ; RV64-NEXT: li a1, 1
799 ; RV64-NEXT: vsetvli zero, a0, e64, m1, ta, ma
800 ; RV64-NEXT: vsub.vx v9, v8, a1, v0.t
801 ; RV64-NEXT: vnot.v v8, v8, v0.t
802 ; RV64-NEXT: vand.vv v8, v8, v9, v0.t
803 ; RV64-NEXT: vsrl.vi v9, v8, 1, v0.t
804 ; RV64-NEXT: lui a0, 349525
805 ; RV64-NEXT: addiw a0, a0, 1365
806 ; RV64-NEXT: slli a1, a0, 32
807 ; RV64-NEXT: add a0, a0, a1
808 ; RV64-NEXT: vand.vx v9, v9, a0, v0.t
809 ; RV64-NEXT: vsub.vv v8, v8, v9, v0.t
810 ; RV64-NEXT: lui a0, 209715
811 ; RV64-NEXT: addiw a0, a0, 819
812 ; RV64-NEXT: slli a1, a0, 32
813 ; RV64-NEXT: add a0, a0, a1
814 ; RV64-NEXT: vand.vx v9, v8, a0, v0.t
815 ; RV64-NEXT: vsrl.vi v8, v8, 2, v0.t
816 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
817 ; RV64-NEXT: vadd.vv v8, v9, v8, v0.t
818 ; RV64-NEXT: vsrl.vi v9, v8, 4, v0.t
819 ; RV64-NEXT: vadd.vv v8, v8, v9, v0.t
820 ; RV64-NEXT: lui a0, 61681
821 ; RV64-NEXT: addiw a0, a0, -241
822 ; RV64-NEXT: slli a1, a0, 32
823 ; RV64-NEXT: add a0, a0, a1
824 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
825 ; RV64-NEXT: lui a0, 4112
826 ; RV64-NEXT: addiw a0, a0, 257
827 ; RV64-NEXT: slli a1, a0, 32
828 ; RV64-NEXT: add a0, a0, a1
829 ; RV64-NEXT: vmul.vx v8, v8, a0, v0.t
830 ; RV64-NEXT: li a0, 56
831 ; RV64-NEXT: vsrl.vx v8, v8, a0, v0.t
833 %v = call <2 x i64> @llvm.vp.cttz.v2i64(<2 x i64> %va, i1 false, <2 x i1> %m, i32 %evl)
837 define <2 x i64> @vp_cttz_v2i64_unmasked(<2 x i64> %va, i32 zeroext %evl) {
838 ; RV32-LABEL: vp_cttz_v2i64_unmasked:
840 ; RV32-NEXT: li a1, 1
841 ; RV32-NEXT: vsetvli zero, a0, e64, m1, ta, ma
842 ; RV32-NEXT: vsub.vx v9, v8, a1
843 ; RV32-NEXT: vnot.v v8, v8
844 ; RV32-NEXT: vand.vv v8, v8, v9
845 ; RV32-NEXT: vsrl.vi v9, v8, 1
846 ; RV32-NEXT: lui a1, 349525
847 ; RV32-NEXT: addi a1, a1, 1365
848 ; RV32-NEXT: vsetivli zero, 4, e32, m1, ta, ma
849 ; RV32-NEXT: vmv.v.x v10, a1
850 ; RV32-NEXT: vsetvli zero, a0, e64, m1, ta, ma
851 ; RV32-NEXT: vand.vv v9, v9, v10
852 ; RV32-NEXT: vsub.vv v8, v8, v9
853 ; RV32-NEXT: lui a1, 209715
854 ; RV32-NEXT: addi a1, a1, 819
855 ; RV32-NEXT: vsetivli zero, 4, e32, m1, ta, ma
856 ; RV32-NEXT: vmv.v.x v9, a1
857 ; RV32-NEXT: vsetvli zero, a0, e64, m1, ta, ma
858 ; RV32-NEXT: vand.vv v10, v8, v9
859 ; RV32-NEXT: vsrl.vi v8, v8, 2
860 ; RV32-NEXT: vand.vv v8, v8, v9
861 ; RV32-NEXT: vadd.vv v8, v10, v8
862 ; RV32-NEXT: vsrl.vi v9, v8, 4
863 ; RV32-NEXT: vadd.vv v8, v8, v9
864 ; RV32-NEXT: lui a1, 61681
865 ; RV32-NEXT: addi a1, a1, -241
866 ; RV32-NEXT: vsetivli zero, 4, e32, m1, ta, ma
867 ; RV32-NEXT: vmv.v.x v9, a1
868 ; RV32-NEXT: vsetvli zero, a0, e64, m1, ta, ma
869 ; RV32-NEXT: vand.vv v8, v8, v9
870 ; RV32-NEXT: lui a1, 4112
871 ; RV32-NEXT: addi a1, a1, 257
872 ; RV32-NEXT: vsetivli zero, 4, e32, m1, ta, ma
873 ; RV32-NEXT: vmv.v.x v9, a1
874 ; RV32-NEXT: vsetvli zero, a0, e64, m1, ta, ma
875 ; RV32-NEXT: vmul.vv v8, v8, v9
876 ; RV32-NEXT: li a0, 56
877 ; RV32-NEXT: vsrl.vx v8, v8, a0
880 ; RV64-LABEL: vp_cttz_v2i64_unmasked:
882 ; RV64-NEXT: li a1, 1
883 ; RV64-NEXT: vsetvli zero, a0, e64, m1, ta, ma
884 ; RV64-NEXT: vsub.vx v9, v8, a1
885 ; RV64-NEXT: vnot.v v8, v8
886 ; RV64-NEXT: vand.vv v8, v8, v9
887 ; RV64-NEXT: vsrl.vi v9, v8, 1
888 ; RV64-NEXT: lui a0, 349525
889 ; RV64-NEXT: addiw a0, a0, 1365
890 ; RV64-NEXT: slli a1, a0, 32
891 ; RV64-NEXT: add a0, a0, a1
892 ; RV64-NEXT: vand.vx v9, v9, a0
893 ; RV64-NEXT: vsub.vv v8, v8, v9
894 ; RV64-NEXT: lui a0, 209715
895 ; RV64-NEXT: addiw a0, a0, 819
896 ; RV64-NEXT: slli a1, a0, 32
897 ; RV64-NEXT: add a0, a0, a1
898 ; RV64-NEXT: vand.vx v9, v8, a0
899 ; RV64-NEXT: vsrl.vi v8, v8, 2
900 ; RV64-NEXT: vand.vx v8, v8, a0
901 ; RV64-NEXT: vadd.vv v8, v9, v8
902 ; RV64-NEXT: vsrl.vi v9, v8, 4
903 ; RV64-NEXT: vadd.vv v8, v8, v9
904 ; RV64-NEXT: lui a0, 61681
905 ; RV64-NEXT: addiw a0, a0, -241
906 ; RV64-NEXT: slli a1, a0, 32
907 ; RV64-NEXT: add a0, a0, a1
908 ; RV64-NEXT: vand.vx v8, v8, a0
909 ; RV64-NEXT: lui a0, 4112
910 ; RV64-NEXT: addiw a0, a0, 257
911 ; RV64-NEXT: slli a1, a0, 32
912 ; RV64-NEXT: add a0, a0, a1
913 ; RV64-NEXT: vmul.vx v8, v8, a0
914 ; RV64-NEXT: li a0, 56
915 ; RV64-NEXT: vsrl.vx v8, v8, a0
917 %v = call <2 x i64> @llvm.vp.cttz.v2i64(<2 x i64> %va, i1 false, <2 x i1> splat (i1 true), i32 %evl)
921 declare <4 x i64> @llvm.vp.cttz.v4i64(<4 x i64>, i1 immarg, <4 x i1>, i32)
923 define <4 x i64> @vp_cttz_v4i64(<4 x i64> %va, <4 x i1> %m, i32 zeroext %evl) {
924 ; RV32-LABEL: vp_cttz_v4i64:
926 ; RV32-NEXT: li a1, 1
927 ; RV32-NEXT: vsetvli zero, a0, e64, m2, ta, ma
928 ; RV32-NEXT: vsub.vx v10, v8, a1, v0.t
929 ; RV32-NEXT: vnot.v v8, v8, v0.t
930 ; RV32-NEXT: vand.vv v8, v8, v10, v0.t
931 ; RV32-NEXT: vsrl.vi v10, v8, 1, v0.t
932 ; RV32-NEXT: lui a1, 349525
933 ; RV32-NEXT: addi a1, a1, 1365
934 ; RV32-NEXT: vsetivli zero, 8, e32, m2, ta, ma
935 ; RV32-NEXT: vmv.v.x v12, a1
936 ; RV32-NEXT: vsetvli zero, a0, e64, m2, ta, ma
937 ; RV32-NEXT: vand.vv v10, v10, v12, v0.t
938 ; RV32-NEXT: vsub.vv v8, v8, v10, v0.t
939 ; RV32-NEXT: lui a1, 209715
940 ; RV32-NEXT: addi a1, a1, 819
941 ; RV32-NEXT: vsetivli zero, 8, e32, m2, ta, ma
942 ; RV32-NEXT: vmv.v.x v10, a1
943 ; RV32-NEXT: vsetvli zero, a0, e64, m2, ta, ma
944 ; RV32-NEXT: vand.vv v12, v8, v10, v0.t
945 ; RV32-NEXT: vsrl.vi v8, v8, 2, v0.t
946 ; RV32-NEXT: vand.vv v8, v8, v10, v0.t
947 ; RV32-NEXT: vadd.vv v8, v12, v8, v0.t
948 ; RV32-NEXT: vsrl.vi v10, v8, 4, v0.t
949 ; RV32-NEXT: vadd.vv v8, v8, v10, v0.t
950 ; RV32-NEXT: lui a1, 61681
951 ; RV32-NEXT: addi a1, a1, -241
952 ; RV32-NEXT: vsetivli zero, 8, e32, m2, ta, ma
953 ; RV32-NEXT: vmv.v.x v10, a1
954 ; RV32-NEXT: vsetvli zero, a0, e64, m2, ta, ma
955 ; RV32-NEXT: vand.vv v8, v8, v10, v0.t
956 ; RV32-NEXT: lui a1, 4112
957 ; RV32-NEXT: addi a1, a1, 257
958 ; RV32-NEXT: vsetivli zero, 8, e32, m2, ta, ma
959 ; RV32-NEXT: vmv.v.x v10, a1
960 ; RV32-NEXT: vsetvli zero, a0, e64, m2, ta, ma
961 ; RV32-NEXT: vmul.vv v8, v8, v10, v0.t
962 ; RV32-NEXT: li a0, 56
963 ; RV32-NEXT: vsrl.vx v8, v8, a0, v0.t
966 ; RV64-LABEL: vp_cttz_v4i64:
968 ; RV64-NEXT: li a1, 1
969 ; RV64-NEXT: vsetvli zero, a0, e64, m2, ta, ma
970 ; RV64-NEXT: vsub.vx v10, v8, a1, v0.t
971 ; RV64-NEXT: vnot.v v8, v8, v0.t
972 ; RV64-NEXT: vand.vv v8, v8, v10, v0.t
973 ; RV64-NEXT: vsrl.vi v10, v8, 1, v0.t
974 ; RV64-NEXT: lui a0, 349525
975 ; RV64-NEXT: addiw a0, a0, 1365
976 ; RV64-NEXT: slli a1, a0, 32
977 ; RV64-NEXT: add a0, a0, a1
978 ; RV64-NEXT: vand.vx v10, v10, a0, v0.t
979 ; RV64-NEXT: vsub.vv v8, v8, v10, v0.t
980 ; RV64-NEXT: lui a0, 209715
981 ; RV64-NEXT: addiw a0, a0, 819
982 ; RV64-NEXT: slli a1, a0, 32
983 ; RV64-NEXT: add a0, a0, a1
984 ; RV64-NEXT: vand.vx v10, v8, a0, v0.t
985 ; RV64-NEXT: vsrl.vi v8, v8, 2, v0.t
986 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
987 ; RV64-NEXT: vadd.vv v8, v10, v8, v0.t
988 ; RV64-NEXT: vsrl.vi v10, v8, 4, v0.t
989 ; RV64-NEXT: vadd.vv v8, v8, v10, v0.t
990 ; RV64-NEXT: lui a0, 61681
991 ; RV64-NEXT: addiw a0, a0, -241
992 ; RV64-NEXT: slli a1, a0, 32
993 ; RV64-NEXT: add a0, a0, a1
994 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
995 ; RV64-NEXT: lui a0, 4112
996 ; RV64-NEXT: addiw a0, a0, 257
997 ; RV64-NEXT: slli a1, a0, 32
998 ; RV64-NEXT: add a0, a0, a1
999 ; RV64-NEXT: vmul.vx v8, v8, a0, v0.t
1000 ; RV64-NEXT: li a0, 56
1001 ; RV64-NEXT: vsrl.vx v8, v8, a0, v0.t
1003 %v = call <4 x i64> @llvm.vp.cttz.v4i64(<4 x i64> %va, i1 false, <4 x i1> %m, i32 %evl)
1007 define <4 x i64> @vp_cttz_v4i64_unmasked(<4 x i64> %va, i32 zeroext %evl) {
1008 ; RV32-LABEL: vp_cttz_v4i64_unmasked:
1010 ; RV32-NEXT: li a1, 1
1011 ; RV32-NEXT: vsetvli zero, a0, e64, m2, ta, ma
1012 ; RV32-NEXT: vsub.vx v10, v8, a1
1013 ; RV32-NEXT: vnot.v v8, v8
1014 ; RV32-NEXT: vand.vv v8, v8, v10
1015 ; RV32-NEXT: vsrl.vi v10, v8, 1
1016 ; RV32-NEXT: lui a1, 349525
1017 ; RV32-NEXT: addi a1, a1, 1365
1018 ; RV32-NEXT: vsetivli zero, 8, e32, m2, ta, ma
1019 ; RV32-NEXT: vmv.v.x v12, a1
1020 ; RV32-NEXT: vsetvli zero, a0, e64, m2, ta, ma
1021 ; RV32-NEXT: vand.vv v10, v10, v12
1022 ; RV32-NEXT: vsub.vv v8, v8, v10
1023 ; RV32-NEXT: lui a1, 209715
1024 ; RV32-NEXT: addi a1, a1, 819
1025 ; RV32-NEXT: vsetivli zero, 8, e32, m2, ta, ma
1026 ; RV32-NEXT: vmv.v.x v10, a1
1027 ; RV32-NEXT: vsetvli zero, a0, e64, m2, ta, ma
1028 ; RV32-NEXT: vand.vv v12, v8, v10
1029 ; RV32-NEXT: vsrl.vi v8, v8, 2
1030 ; RV32-NEXT: vand.vv v8, v8, v10
1031 ; RV32-NEXT: vadd.vv v8, v12, v8
1032 ; RV32-NEXT: vsrl.vi v10, v8, 4
1033 ; RV32-NEXT: vadd.vv v8, v8, v10
1034 ; RV32-NEXT: lui a1, 61681
1035 ; RV32-NEXT: addi a1, a1, -241
1036 ; RV32-NEXT: vsetivli zero, 8, e32, m2, ta, ma
1037 ; RV32-NEXT: vmv.v.x v10, a1
1038 ; RV32-NEXT: vsetvli zero, a0, e64, m2, ta, ma
1039 ; RV32-NEXT: vand.vv v8, v8, v10
1040 ; RV32-NEXT: lui a1, 4112
1041 ; RV32-NEXT: addi a1, a1, 257
1042 ; RV32-NEXT: vsetivli zero, 8, e32, m2, ta, ma
1043 ; RV32-NEXT: vmv.v.x v10, a1
1044 ; RV32-NEXT: vsetvli zero, a0, e64, m2, ta, ma
1045 ; RV32-NEXT: vmul.vv v8, v8, v10
1046 ; RV32-NEXT: li a0, 56
1047 ; RV32-NEXT: vsrl.vx v8, v8, a0
1050 ; RV64-LABEL: vp_cttz_v4i64_unmasked:
1052 ; RV64-NEXT: li a1, 1
1053 ; RV64-NEXT: vsetvli zero, a0, e64, m2, ta, ma
1054 ; RV64-NEXT: vsub.vx v10, v8, a1
1055 ; RV64-NEXT: vnot.v v8, v8
1056 ; RV64-NEXT: vand.vv v8, v8, v10
1057 ; RV64-NEXT: vsrl.vi v10, v8, 1
1058 ; RV64-NEXT: lui a0, 349525
1059 ; RV64-NEXT: addiw a0, a0, 1365
1060 ; RV64-NEXT: slli a1, a0, 32
1061 ; RV64-NEXT: add a0, a0, a1
1062 ; RV64-NEXT: vand.vx v10, v10, a0
1063 ; RV64-NEXT: vsub.vv v8, v8, v10
1064 ; RV64-NEXT: lui a0, 209715
1065 ; RV64-NEXT: addiw a0, a0, 819
1066 ; RV64-NEXT: slli a1, a0, 32
1067 ; RV64-NEXT: add a0, a0, a1
1068 ; RV64-NEXT: vand.vx v10, v8, a0
1069 ; RV64-NEXT: vsrl.vi v8, v8, 2
1070 ; RV64-NEXT: vand.vx v8, v8, a0
1071 ; RV64-NEXT: vadd.vv v8, v10, v8
1072 ; RV64-NEXT: vsrl.vi v10, v8, 4
1073 ; RV64-NEXT: vadd.vv v8, v8, v10
1074 ; RV64-NEXT: lui a0, 61681
1075 ; RV64-NEXT: addiw a0, a0, -241
1076 ; RV64-NEXT: slli a1, a0, 32
1077 ; RV64-NEXT: add a0, a0, a1
1078 ; RV64-NEXT: vand.vx v8, v8, a0
1079 ; RV64-NEXT: lui a0, 4112
1080 ; RV64-NEXT: addiw a0, a0, 257
1081 ; RV64-NEXT: slli a1, a0, 32
1082 ; RV64-NEXT: add a0, a0, a1
1083 ; RV64-NEXT: vmul.vx v8, v8, a0
1084 ; RV64-NEXT: li a0, 56
1085 ; RV64-NEXT: vsrl.vx v8, v8, a0
1087 %v = call <4 x i64> @llvm.vp.cttz.v4i64(<4 x i64> %va, i1 false, <4 x i1> splat (i1 true), i32 %evl)
1091 declare <8 x i64> @llvm.vp.cttz.v8i64(<8 x i64>, i1 immarg, <8 x i1>, i32)
1093 define <8 x i64> @vp_cttz_v8i64(<8 x i64> %va, <8 x i1> %m, i32 zeroext %evl) {
1094 ; RV32-LABEL: vp_cttz_v8i64:
1096 ; RV32-NEXT: li a1, 1
1097 ; RV32-NEXT: vsetvli zero, a0, e64, m4, ta, ma
1098 ; RV32-NEXT: vsub.vx v12, v8, a1, v0.t
1099 ; RV32-NEXT: vnot.v v8, v8, v0.t
1100 ; RV32-NEXT: vand.vv v8, v8, v12, v0.t
1101 ; RV32-NEXT: vsrl.vi v12, v8, 1, v0.t
1102 ; RV32-NEXT: lui a1, 349525
1103 ; RV32-NEXT: addi a1, a1, 1365
1104 ; RV32-NEXT: vsetivli zero, 16, e32, m4, ta, ma
1105 ; RV32-NEXT: vmv.v.x v16, a1
1106 ; RV32-NEXT: vsetvli zero, a0, e64, m4, ta, ma
1107 ; RV32-NEXT: vand.vv v12, v12, v16, v0.t
1108 ; RV32-NEXT: vsub.vv v8, v8, v12, v0.t
1109 ; RV32-NEXT: lui a1, 209715
1110 ; RV32-NEXT: addi a1, a1, 819
1111 ; RV32-NEXT: vsetivli zero, 16, e32, m4, ta, ma
1112 ; RV32-NEXT: vmv.v.x v12, a1
1113 ; RV32-NEXT: vsetvli zero, a0, e64, m4, ta, ma
1114 ; RV32-NEXT: vand.vv v16, v8, v12, v0.t
1115 ; RV32-NEXT: vsrl.vi v8, v8, 2, v0.t
1116 ; RV32-NEXT: vand.vv v8, v8, v12, v0.t
1117 ; RV32-NEXT: vadd.vv v8, v16, v8, v0.t
1118 ; RV32-NEXT: vsrl.vi v12, v8, 4, v0.t
1119 ; RV32-NEXT: vadd.vv v8, v8, v12, v0.t
1120 ; RV32-NEXT: lui a1, 61681
1121 ; RV32-NEXT: addi a1, a1, -241
1122 ; RV32-NEXT: vsetivli zero, 16, e32, m4, ta, ma
1123 ; RV32-NEXT: vmv.v.x v12, a1
1124 ; RV32-NEXT: vsetvli zero, a0, e64, m4, ta, ma
1125 ; RV32-NEXT: vand.vv v8, v8, v12, v0.t
1126 ; RV32-NEXT: lui a1, 4112
1127 ; RV32-NEXT: addi a1, a1, 257
1128 ; RV32-NEXT: vsetivli zero, 16, e32, m4, ta, ma
1129 ; RV32-NEXT: vmv.v.x v12, a1
1130 ; RV32-NEXT: vsetvli zero, a0, e64, m4, ta, ma
1131 ; RV32-NEXT: vmul.vv v8, v8, v12, v0.t
1132 ; RV32-NEXT: li a0, 56
1133 ; RV32-NEXT: vsrl.vx v8, v8, a0, v0.t
1136 ; RV64-LABEL: vp_cttz_v8i64:
1138 ; RV64-NEXT: li a1, 1
1139 ; RV64-NEXT: vsetvli zero, a0, e64, m4, ta, ma
1140 ; RV64-NEXT: vsub.vx v12, v8, a1, v0.t
1141 ; RV64-NEXT: vnot.v v8, v8, v0.t
1142 ; RV64-NEXT: vand.vv v8, v8, v12, v0.t
1143 ; RV64-NEXT: vsrl.vi v12, v8, 1, v0.t
1144 ; RV64-NEXT: lui a0, 349525
1145 ; RV64-NEXT: addiw a0, a0, 1365
1146 ; RV64-NEXT: slli a1, a0, 32
1147 ; RV64-NEXT: add a0, a0, a1
1148 ; RV64-NEXT: vand.vx v12, v12, a0, v0.t
1149 ; RV64-NEXT: vsub.vv v8, v8, v12, v0.t
1150 ; RV64-NEXT: lui a0, 209715
1151 ; RV64-NEXT: addiw a0, a0, 819
1152 ; RV64-NEXT: slli a1, a0, 32
1153 ; RV64-NEXT: add a0, a0, a1
1154 ; RV64-NEXT: vand.vx v12, v8, a0, v0.t
1155 ; RV64-NEXT: vsrl.vi v8, v8, 2, v0.t
1156 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
1157 ; RV64-NEXT: vadd.vv v8, v12, v8, v0.t
1158 ; RV64-NEXT: vsrl.vi v12, v8, 4, v0.t
1159 ; RV64-NEXT: vadd.vv v8, v8, v12, v0.t
1160 ; RV64-NEXT: lui a0, 61681
1161 ; RV64-NEXT: addiw a0, a0, -241
1162 ; RV64-NEXT: slli a1, a0, 32
1163 ; RV64-NEXT: add a0, a0, a1
1164 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
1165 ; RV64-NEXT: lui a0, 4112
1166 ; RV64-NEXT: addiw a0, a0, 257
1167 ; RV64-NEXT: slli a1, a0, 32
1168 ; RV64-NEXT: add a0, a0, a1
1169 ; RV64-NEXT: vmul.vx v8, v8, a0, v0.t
1170 ; RV64-NEXT: li a0, 56
1171 ; RV64-NEXT: vsrl.vx v8, v8, a0, v0.t
1173 %v = call <8 x i64> @llvm.vp.cttz.v8i64(<8 x i64> %va, i1 false, <8 x i1> %m, i32 %evl)
1177 define <8 x i64> @vp_cttz_v8i64_unmasked(<8 x i64> %va, i32 zeroext %evl) {
1178 ; RV32-LABEL: vp_cttz_v8i64_unmasked:
1180 ; RV32-NEXT: li a1, 1
1181 ; RV32-NEXT: vsetvli zero, a0, e64, m4, ta, ma
1182 ; RV32-NEXT: vsub.vx v12, v8, a1
1183 ; RV32-NEXT: vnot.v v8, v8
1184 ; RV32-NEXT: vand.vv v8, v8, v12
1185 ; RV32-NEXT: vsrl.vi v12, v8, 1
1186 ; RV32-NEXT: lui a1, 349525
1187 ; RV32-NEXT: addi a1, a1, 1365
1188 ; RV32-NEXT: vsetivli zero, 16, e32, m4, ta, ma
1189 ; RV32-NEXT: vmv.v.x v16, a1
1190 ; RV32-NEXT: vsetvli zero, a0, e64, m4, ta, ma
1191 ; RV32-NEXT: vand.vv v12, v12, v16
1192 ; RV32-NEXT: vsub.vv v8, v8, v12
1193 ; RV32-NEXT: lui a1, 209715
1194 ; RV32-NEXT: addi a1, a1, 819
1195 ; RV32-NEXT: vsetivli zero, 16, e32, m4, ta, ma
1196 ; RV32-NEXT: vmv.v.x v12, a1
1197 ; RV32-NEXT: vsetvli zero, a0, e64, m4, ta, ma
1198 ; RV32-NEXT: vand.vv v16, v8, v12
1199 ; RV32-NEXT: vsrl.vi v8, v8, 2
1200 ; RV32-NEXT: vand.vv v8, v8, v12
1201 ; RV32-NEXT: vadd.vv v8, v16, v8
1202 ; RV32-NEXT: vsrl.vi v12, v8, 4
1203 ; RV32-NEXT: vadd.vv v8, v8, v12
1204 ; RV32-NEXT: lui a1, 61681
1205 ; RV32-NEXT: addi a1, a1, -241
1206 ; RV32-NEXT: vsetivli zero, 16, e32, m4, ta, ma
1207 ; RV32-NEXT: vmv.v.x v12, a1
1208 ; RV32-NEXT: vsetvli zero, a0, e64, m4, ta, ma
1209 ; RV32-NEXT: vand.vv v8, v8, v12
1210 ; RV32-NEXT: lui a1, 4112
1211 ; RV32-NEXT: addi a1, a1, 257
1212 ; RV32-NEXT: vsetivli zero, 16, e32, m4, ta, ma
1213 ; RV32-NEXT: vmv.v.x v12, a1
1214 ; RV32-NEXT: vsetvli zero, a0, e64, m4, ta, ma
1215 ; RV32-NEXT: vmul.vv v8, v8, v12
1216 ; RV32-NEXT: li a0, 56
1217 ; RV32-NEXT: vsrl.vx v8, v8, a0
1220 ; RV64-LABEL: vp_cttz_v8i64_unmasked:
1222 ; RV64-NEXT: li a1, 1
1223 ; RV64-NEXT: vsetvli zero, a0, e64, m4, ta, ma
1224 ; RV64-NEXT: vsub.vx v12, v8, a1
1225 ; RV64-NEXT: vnot.v v8, v8
1226 ; RV64-NEXT: vand.vv v8, v8, v12
1227 ; RV64-NEXT: vsrl.vi v12, v8, 1
1228 ; RV64-NEXT: lui a0, 349525
1229 ; RV64-NEXT: addiw a0, a0, 1365
1230 ; RV64-NEXT: slli a1, a0, 32
1231 ; RV64-NEXT: add a0, a0, a1
1232 ; RV64-NEXT: vand.vx v12, v12, a0
1233 ; RV64-NEXT: vsub.vv v8, v8, v12
1234 ; RV64-NEXT: lui a0, 209715
1235 ; RV64-NEXT: addiw a0, a0, 819
1236 ; RV64-NEXT: slli a1, a0, 32
1237 ; RV64-NEXT: add a0, a0, a1
1238 ; RV64-NEXT: vand.vx v12, v8, a0
1239 ; RV64-NEXT: vsrl.vi v8, v8, 2
1240 ; RV64-NEXT: vand.vx v8, v8, a0
1241 ; RV64-NEXT: vadd.vv v8, v12, v8
1242 ; RV64-NEXT: vsrl.vi v12, v8, 4
1243 ; RV64-NEXT: vadd.vv v8, v8, v12
1244 ; RV64-NEXT: lui a0, 61681
1245 ; RV64-NEXT: addiw a0, a0, -241
1246 ; RV64-NEXT: slli a1, a0, 32
1247 ; RV64-NEXT: add a0, a0, a1
1248 ; RV64-NEXT: vand.vx v8, v8, a0
1249 ; RV64-NEXT: lui a0, 4112
1250 ; RV64-NEXT: addiw a0, a0, 257
1251 ; RV64-NEXT: slli a1, a0, 32
1252 ; RV64-NEXT: add a0, a0, a1
1253 ; RV64-NEXT: vmul.vx v8, v8, a0
1254 ; RV64-NEXT: li a0, 56
1255 ; RV64-NEXT: vsrl.vx v8, v8, a0
1257 %v = call <8 x i64> @llvm.vp.cttz.v8i64(<8 x i64> %va, i1 false, <8 x i1> splat (i1 true), i32 %evl)
1261 declare <15 x i64> @llvm.vp.cttz.v15i64(<15 x i64>, i1 immarg, <15 x i1>, i32)
1263 define <15 x i64> @vp_cttz_v15i64(<15 x i64> %va, <15 x i1> %m, i32 zeroext %evl) {
1264 ; RV32-LABEL: vp_cttz_v15i64:
1266 ; RV32-NEXT: addi sp, sp, -48
1267 ; RV32-NEXT: .cfi_def_cfa_offset 48
1268 ; RV32-NEXT: csrr a1, vlenb
1269 ; RV32-NEXT: slli a1, a1, 4
1270 ; RV32-NEXT: sub sp, sp, a1
1271 ; RV32-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x30, 0x22, 0x11, 0x10, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 48 + 16 * vlenb
1272 ; RV32-NEXT: lui a1, 349525
1273 ; RV32-NEXT: addi a1, a1, 1365
1274 ; RV32-NEXT: sw a1, 44(sp)
1275 ; RV32-NEXT: sw a1, 40(sp)
1276 ; RV32-NEXT: lui a1, 209715
1277 ; RV32-NEXT: addi a1, a1, 819
1278 ; RV32-NEXT: sw a1, 36(sp)
1279 ; RV32-NEXT: sw a1, 32(sp)
1280 ; RV32-NEXT: lui a1, 61681
1281 ; RV32-NEXT: addi a1, a1, -241
1282 ; RV32-NEXT: sw a1, 28(sp)
1283 ; RV32-NEXT: sw a1, 24(sp)
1284 ; RV32-NEXT: lui a1, 4112
1285 ; RV32-NEXT: addi a1, a1, 257
1286 ; RV32-NEXT: sw a1, 20(sp)
1287 ; RV32-NEXT: sw a1, 16(sp)
1288 ; RV32-NEXT: li a1, 1
1289 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
1290 ; RV32-NEXT: vsub.vx v16, v8, a1, v0.t
1291 ; RV32-NEXT: vnot.v v8, v8, v0.t
1292 ; RV32-NEXT: vand.vv v24, v8, v16, v0.t
1293 ; RV32-NEXT: addi a1, sp, 48
1294 ; RV32-NEXT: vs8r.v v24, (a1) # Unknown-size Folded Spill
1295 ; RV32-NEXT: addi a1, sp, 40
1296 ; RV32-NEXT: vsetivli zero, 16, e64, m8, ta, ma
1297 ; RV32-NEXT: vlse64.v v8, (a1), zero
1298 ; RV32-NEXT: csrr a1, vlenb
1299 ; RV32-NEXT: slli a1, a1, 3
1300 ; RV32-NEXT: add a1, sp, a1
1301 ; RV32-NEXT: addi a1, a1, 48
1302 ; RV32-NEXT: vs8r.v v8, (a1) # Unknown-size Folded Spill
1303 ; RV32-NEXT: addi a1, sp, 32
1304 ; RV32-NEXT: vlse64.v v16, (a1), zero
1305 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
1306 ; RV32-NEXT: vsrl.vi v8, v24, 1, v0.t
1307 ; RV32-NEXT: csrr a1, vlenb
1308 ; RV32-NEXT: slli a1, a1, 3
1309 ; RV32-NEXT: add a1, sp, a1
1310 ; RV32-NEXT: addi a1, a1, 48
1311 ; RV32-NEXT: vl8r.v v24, (a1) # Unknown-size Folded Reload
1312 ; RV32-NEXT: vand.vv v8, v8, v24, v0.t
1313 ; RV32-NEXT: addi a1, sp, 48
1314 ; RV32-NEXT: vl8r.v v24, (a1) # Unknown-size Folded Reload
1315 ; RV32-NEXT: vsub.vv v8, v24, v8, v0.t
1316 ; RV32-NEXT: vand.vv v24, v8, v16, v0.t
1317 ; RV32-NEXT: vsrl.vi v8, v8, 2, v0.t
1318 ; RV32-NEXT: vand.vv v8, v8, v16, v0.t
1319 ; RV32-NEXT: vadd.vv v8, v24, v8, v0.t
1320 ; RV32-NEXT: addi a1, sp, 24
1321 ; RV32-NEXT: vsetivli zero, 16, e64, m8, ta, ma
1322 ; RV32-NEXT: vlse64.v v16, (a1), zero
1323 ; RV32-NEXT: csrr a1, vlenb
1324 ; RV32-NEXT: slli a1, a1, 3
1325 ; RV32-NEXT: add a1, sp, a1
1326 ; RV32-NEXT: addi a1, a1, 48
1327 ; RV32-NEXT: vs8r.v v16, (a1) # Unknown-size Folded Spill
1328 ; RV32-NEXT: addi a1, sp, 16
1329 ; RV32-NEXT: vlse64.v v24, (a1), zero
1330 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
1331 ; RV32-NEXT: vsrl.vi v16, v8, 4, v0.t
1332 ; RV32-NEXT: vadd.vv v8, v8, v16, v0.t
1333 ; RV32-NEXT: csrr a0, vlenb
1334 ; RV32-NEXT: slli a0, a0, 3
1335 ; RV32-NEXT: add a0, sp, a0
1336 ; RV32-NEXT: addi a0, a0, 48
1337 ; RV32-NEXT: vl8r.v v16, (a0) # Unknown-size Folded Reload
1338 ; RV32-NEXT: vand.vv v8, v8, v16, v0.t
1339 ; RV32-NEXT: vmul.vv v8, v8, v24, v0.t
1340 ; RV32-NEXT: li a0, 56
1341 ; RV32-NEXT: vsrl.vx v8, v8, a0, v0.t
1342 ; RV32-NEXT: csrr a0, vlenb
1343 ; RV32-NEXT: slli a0, a0, 4
1344 ; RV32-NEXT: add sp, sp, a0
1345 ; RV32-NEXT: addi sp, sp, 48
1348 ; RV64-LABEL: vp_cttz_v15i64:
1350 ; RV64-NEXT: li a1, 1
1351 ; RV64-NEXT: vsetvli zero, a0, e64, m8, ta, ma
1352 ; RV64-NEXT: vsub.vx v16, v8, a1, v0.t
1353 ; RV64-NEXT: vnot.v v8, v8, v0.t
1354 ; RV64-NEXT: vand.vv v8, v8, v16, v0.t
1355 ; RV64-NEXT: vsrl.vi v16, v8, 1, v0.t
1356 ; RV64-NEXT: lui a0, 349525
1357 ; RV64-NEXT: addiw a0, a0, 1365
1358 ; RV64-NEXT: slli a1, a0, 32
1359 ; RV64-NEXT: add a0, a0, a1
1360 ; RV64-NEXT: vand.vx v16, v16, a0, v0.t
1361 ; RV64-NEXT: vsub.vv v8, v8, v16, v0.t
1362 ; RV64-NEXT: lui a0, 209715
1363 ; RV64-NEXT: addiw a0, a0, 819
1364 ; RV64-NEXT: slli a1, a0, 32
1365 ; RV64-NEXT: add a0, a0, a1
1366 ; RV64-NEXT: vand.vx v16, v8, a0, v0.t
1367 ; RV64-NEXT: vsrl.vi v8, v8, 2, v0.t
1368 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
1369 ; RV64-NEXT: vadd.vv v8, v16, v8, v0.t
1370 ; RV64-NEXT: vsrl.vi v16, v8, 4, v0.t
1371 ; RV64-NEXT: vadd.vv v8, v8, v16, v0.t
1372 ; RV64-NEXT: lui a0, 61681
1373 ; RV64-NEXT: addiw a0, a0, -241
1374 ; RV64-NEXT: slli a1, a0, 32
1375 ; RV64-NEXT: add a0, a0, a1
1376 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
1377 ; RV64-NEXT: lui a0, 4112
1378 ; RV64-NEXT: addiw a0, a0, 257
1379 ; RV64-NEXT: slli a1, a0, 32
1380 ; RV64-NEXT: add a0, a0, a1
1381 ; RV64-NEXT: vmul.vx v8, v8, a0, v0.t
1382 ; RV64-NEXT: li a0, 56
1383 ; RV64-NEXT: vsrl.vx v8, v8, a0, v0.t
1385 %v = call <15 x i64> @llvm.vp.cttz.v15i64(<15 x i64> %va, i1 false, <15 x i1> %m, i32 %evl)
1389 define <15 x i64> @vp_cttz_v15i64_unmasked(<15 x i64> %va, i32 zeroext %evl) {
1390 ; RV32-LABEL: vp_cttz_v15i64_unmasked:
1392 ; RV32-NEXT: addi sp, sp, -32
1393 ; RV32-NEXT: .cfi_def_cfa_offset 32
1394 ; RV32-NEXT: lui a1, 349525
1395 ; RV32-NEXT: addi a1, a1, 1365
1396 ; RV32-NEXT: sw a1, 28(sp)
1397 ; RV32-NEXT: sw a1, 24(sp)
1398 ; RV32-NEXT: lui a1, 209715
1399 ; RV32-NEXT: addi a1, a1, 819
1400 ; RV32-NEXT: sw a1, 20(sp)
1401 ; RV32-NEXT: sw a1, 16(sp)
1402 ; RV32-NEXT: lui a1, 61681
1403 ; RV32-NEXT: addi a1, a1, -241
1404 ; RV32-NEXT: sw a1, 12(sp)
1405 ; RV32-NEXT: sw a1, 8(sp)
1406 ; RV32-NEXT: lui a1, 4112
1407 ; RV32-NEXT: addi a1, a1, 257
1408 ; RV32-NEXT: sw a1, 4(sp)
1409 ; RV32-NEXT: sw a1, 0(sp)
1410 ; RV32-NEXT: li a1, 1
1411 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
1412 ; RV32-NEXT: vsub.vx v16, v8, a1
1413 ; RV32-NEXT: vnot.v v8, v8
1414 ; RV32-NEXT: vand.vv v8, v8, v16
1415 ; RV32-NEXT: addi a1, sp, 24
1416 ; RV32-NEXT: vsetivli zero, 16, e64, m8, ta, ma
1417 ; RV32-NEXT: vlse64.v v16, (a1), zero
1418 ; RV32-NEXT: addi a1, sp, 16
1419 ; RV32-NEXT: vlse64.v v24, (a1), zero
1420 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
1421 ; RV32-NEXT: vsrl.vi v0, v8, 1
1422 ; RV32-NEXT: vand.vv v16, v0, v16
1423 ; RV32-NEXT: vsub.vv v8, v8, v16
1424 ; RV32-NEXT: vand.vv v16, v8, v24
1425 ; RV32-NEXT: vsrl.vi v8, v8, 2
1426 ; RV32-NEXT: vand.vv v8, v8, v24
1427 ; RV32-NEXT: vadd.vv v8, v16, v8
1428 ; RV32-NEXT: addi a1, sp, 8
1429 ; RV32-NEXT: vsetivli zero, 16, e64, m8, ta, ma
1430 ; RV32-NEXT: vlse64.v v16, (a1), zero
1431 ; RV32-NEXT: mv a1, sp
1432 ; RV32-NEXT: vlse64.v v24, (a1), zero
1433 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
1434 ; RV32-NEXT: vsrl.vi v0, v8, 4
1435 ; RV32-NEXT: vadd.vv v8, v8, v0
1436 ; RV32-NEXT: vand.vv v8, v8, v16
1437 ; RV32-NEXT: vmul.vv v8, v8, v24
1438 ; RV32-NEXT: li a0, 56
1439 ; RV32-NEXT: vsrl.vx v8, v8, a0
1440 ; RV32-NEXT: addi sp, sp, 32
1443 ; RV64-LABEL: vp_cttz_v15i64_unmasked:
1445 ; RV64-NEXT: li a1, 1
1446 ; RV64-NEXT: vsetvli zero, a0, e64, m8, ta, ma
1447 ; RV64-NEXT: vsub.vx v16, v8, a1
1448 ; RV64-NEXT: vnot.v v8, v8
1449 ; RV64-NEXT: vand.vv v8, v8, v16
1450 ; RV64-NEXT: vsrl.vi v16, v8, 1
1451 ; RV64-NEXT: lui a0, 349525
1452 ; RV64-NEXT: addiw a0, a0, 1365
1453 ; RV64-NEXT: slli a1, a0, 32
1454 ; RV64-NEXT: add a0, a0, a1
1455 ; RV64-NEXT: vand.vx v16, v16, a0
1456 ; RV64-NEXT: vsub.vv v8, v8, v16
1457 ; RV64-NEXT: lui a0, 209715
1458 ; RV64-NEXT: addiw a0, a0, 819
1459 ; RV64-NEXT: slli a1, a0, 32
1460 ; RV64-NEXT: add a0, a0, a1
1461 ; RV64-NEXT: vand.vx v16, v8, a0
1462 ; RV64-NEXT: vsrl.vi v8, v8, 2
1463 ; RV64-NEXT: vand.vx v8, v8, a0
1464 ; RV64-NEXT: vadd.vv v8, v16, v8
1465 ; RV64-NEXT: vsrl.vi v16, v8, 4
1466 ; RV64-NEXT: vadd.vv v8, v8, v16
1467 ; RV64-NEXT: lui a0, 61681
1468 ; RV64-NEXT: addiw a0, a0, -241
1469 ; RV64-NEXT: slli a1, a0, 32
1470 ; RV64-NEXT: add a0, a0, a1
1471 ; RV64-NEXT: vand.vx v8, v8, a0
1472 ; RV64-NEXT: lui a0, 4112
1473 ; RV64-NEXT: addiw a0, a0, 257
1474 ; RV64-NEXT: slli a1, a0, 32
1475 ; RV64-NEXT: add a0, a0, a1
1476 ; RV64-NEXT: vmul.vx v8, v8, a0
1477 ; RV64-NEXT: li a0, 56
1478 ; RV64-NEXT: vsrl.vx v8, v8, a0
1480 %v = call <15 x i64> @llvm.vp.cttz.v15i64(<15 x i64> %va, i1 false, <15 x i1> splat (i1 true), i32 %evl)
1484 declare <16 x i64> @llvm.vp.cttz.v16i64(<16 x i64>, i1 immarg, <16 x i1>, i32)
1486 define <16 x i64> @vp_cttz_v16i64(<16 x i64> %va, <16 x i1> %m, i32 zeroext %evl) {
1487 ; RV32-LABEL: vp_cttz_v16i64:
1489 ; RV32-NEXT: addi sp, sp, -48
1490 ; RV32-NEXT: .cfi_def_cfa_offset 48
1491 ; RV32-NEXT: csrr a1, vlenb
1492 ; RV32-NEXT: slli a1, a1, 4
1493 ; RV32-NEXT: sub sp, sp, a1
1494 ; RV32-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x30, 0x22, 0x11, 0x10, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 48 + 16 * vlenb
1495 ; RV32-NEXT: lui a1, 349525
1496 ; RV32-NEXT: addi a1, a1, 1365
1497 ; RV32-NEXT: sw a1, 44(sp)
1498 ; RV32-NEXT: sw a1, 40(sp)
1499 ; RV32-NEXT: lui a1, 209715
1500 ; RV32-NEXT: addi a1, a1, 819
1501 ; RV32-NEXT: sw a1, 36(sp)
1502 ; RV32-NEXT: sw a1, 32(sp)
1503 ; RV32-NEXT: lui a1, 61681
1504 ; RV32-NEXT: addi a1, a1, -241
1505 ; RV32-NEXT: sw a1, 28(sp)
1506 ; RV32-NEXT: sw a1, 24(sp)
1507 ; RV32-NEXT: lui a1, 4112
1508 ; RV32-NEXT: addi a1, a1, 257
1509 ; RV32-NEXT: sw a1, 20(sp)
1510 ; RV32-NEXT: sw a1, 16(sp)
1511 ; RV32-NEXT: li a1, 1
1512 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
1513 ; RV32-NEXT: vsub.vx v16, v8, a1, v0.t
1514 ; RV32-NEXT: vnot.v v8, v8, v0.t
1515 ; RV32-NEXT: vand.vv v24, v8, v16, v0.t
1516 ; RV32-NEXT: addi a1, sp, 48
1517 ; RV32-NEXT: vs8r.v v24, (a1) # Unknown-size Folded Spill
1518 ; RV32-NEXT: addi a1, sp, 40
1519 ; RV32-NEXT: vsetivli zero, 16, e64, m8, ta, ma
1520 ; RV32-NEXT: vlse64.v v8, (a1), zero
1521 ; RV32-NEXT: csrr a1, vlenb
1522 ; RV32-NEXT: slli a1, a1, 3
1523 ; RV32-NEXT: add a1, sp, a1
1524 ; RV32-NEXT: addi a1, a1, 48
1525 ; RV32-NEXT: vs8r.v v8, (a1) # Unknown-size Folded Spill
1526 ; RV32-NEXT: addi a1, sp, 32
1527 ; RV32-NEXT: vlse64.v v16, (a1), zero
1528 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
1529 ; RV32-NEXT: vsrl.vi v8, v24, 1, v0.t
1530 ; RV32-NEXT: csrr a1, vlenb
1531 ; RV32-NEXT: slli a1, a1, 3
1532 ; RV32-NEXT: add a1, sp, a1
1533 ; RV32-NEXT: addi a1, a1, 48
1534 ; RV32-NEXT: vl8r.v v24, (a1) # Unknown-size Folded Reload
1535 ; RV32-NEXT: vand.vv v8, v8, v24, v0.t
1536 ; RV32-NEXT: addi a1, sp, 48
1537 ; RV32-NEXT: vl8r.v v24, (a1) # Unknown-size Folded Reload
1538 ; RV32-NEXT: vsub.vv v8, v24, v8, v0.t
1539 ; RV32-NEXT: vand.vv v24, v8, v16, v0.t
1540 ; RV32-NEXT: vsrl.vi v8, v8, 2, v0.t
1541 ; RV32-NEXT: vand.vv v8, v8, v16, v0.t
1542 ; RV32-NEXT: vadd.vv v8, v24, v8, v0.t
1543 ; RV32-NEXT: addi a1, sp, 24
1544 ; RV32-NEXT: vsetivli zero, 16, e64, m8, ta, ma
1545 ; RV32-NEXT: vlse64.v v16, (a1), zero
1546 ; RV32-NEXT: csrr a1, vlenb
1547 ; RV32-NEXT: slli a1, a1, 3
1548 ; RV32-NEXT: add a1, sp, a1
1549 ; RV32-NEXT: addi a1, a1, 48
1550 ; RV32-NEXT: vs8r.v v16, (a1) # Unknown-size Folded Spill
1551 ; RV32-NEXT: addi a1, sp, 16
1552 ; RV32-NEXT: vlse64.v v24, (a1), zero
1553 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
1554 ; RV32-NEXT: vsrl.vi v16, v8, 4, v0.t
1555 ; RV32-NEXT: vadd.vv v8, v8, v16, v0.t
1556 ; RV32-NEXT: csrr a0, vlenb
1557 ; RV32-NEXT: slli a0, a0, 3
1558 ; RV32-NEXT: add a0, sp, a0
1559 ; RV32-NEXT: addi a0, a0, 48
1560 ; RV32-NEXT: vl8r.v v16, (a0) # Unknown-size Folded Reload
1561 ; RV32-NEXT: vand.vv v8, v8, v16, v0.t
1562 ; RV32-NEXT: vmul.vv v8, v8, v24, v0.t
1563 ; RV32-NEXT: li a0, 56
1564 ; RV32-NEXT: vsrl.vx v8, v8, a0, v0.t
1565 ; RV32-NEXT: csrr a0, vlenb
1566 ; RV32-NEXT: slli a0, a0, 4
1567 ; RV32-NEXT: add sp, sp, a0
1568 ; RV32-NEXT: addi sp, sp, 48
1571 ; RV64-LABEL: vp_cttz_v16i64:
1573 ; RV64-NEXT: li a1, 1
1574 ; RV64-NEXT: vsetvli zero, a0, e64, m8, ta, ma
1575 ; RV64-NEXT: vsub.vx v16, v8, a1, v0.t
1576 ; RV64-NEXT: vnot.v v8, v8, v0.t
1577 ; RV64-NEXT: vand.vv v8, v8, v16, v0.t
1578 ; RV64-NEXT: vsrl.vi v16, v8, 1, v0.t
1579 ; RV64-NEXT: lui a0, 349525
1580 ; RV64-NEXT: addiw a0, a0, 1365
1581 ; RV64-NEXT: slli a1, a0, 32
1582 ; RV64-NEXT: add a0, a0, a1
1583 ; RV64-NEXT: vand.vx v16, v16, a0, v0.t
1584 ; RV64-NEXT: vsub.vv v8, v8, v16, v0.t
1585 ; RV64-NEXT: lui a0, 209715
1586 ; RV64-NEXT: addiw a0, a0, 819
1587 ; RV64-NEXT: slli a1, a0, 32
1588 ; RV64-NEXT: add a0, a0, a1
1589 ; RV64-NEXT: vand.vx v16, v8, a0, v0.t
1590 ; RV64-NEXT: vsrl.vi v8, v8, 2, v0.t
1591 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
1592 ; RV64-NEXT: vadd.vv v8, v16, v8, v0.t
1593 ; RV64-NEXT: vsrl.vi v16, v8, 4, v0.t
1594 ; RV64-NEXT: vadd.vv v8, v8, v16, v0.t
1595 ; RV64-NEXT: lui a0, 61681
1596 ; RV64-NEXT: addiw a0, a0, -241
1597 ; RV64-NEXT: slli a1, a0, 32
1598 ; RV64-NEXT: add a0, a0, a1
1599 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
1600 ; RV64-NEXT: lui a0, 4112
1601 ; RV64-NEXT: addiw a0, a0, 257
1602 ; RV64-NEXT: slli a1, a0, 32
1603 ; RV64-NEXT: add a0, a0, a1
1604 ; RV64-NEXT: vmul.vx v8, v8, a0, v0.t
1605 ; RV64-NEXT: li a0, 56
1606 ; RV64-NEXT: vsrl.vx v8, v8, a0, v0.t
1608 %v = call <16 x i64> @llvm.vp.cttz.v16i64(<16 x i64> %va, i1 false, <16 x i1> %m, i32 %evl)
1612 define <16 x i64> @vp_cttz_v16i64_unmasked(<16 x i64> %va, i32 zeroext %evl) {
1613 ; RV32-LABEL: vp_cttz_v16i64_unmasked:
1615 ; RV32-NEXT: addi sp, sp, -32
1616 ; RV32-NEXT: .cfi_def_cfa_offset 32
1617 ; RV32-NEXT: lui a1, 349525
1618 ; RV32-NEXT: addi a1, a1, 1365
1619 ; RV32-NEXT: sw a1, 28(sp)
1620 ; RV32-NEXT: sw a1, 24(sp)
1621 ; RV32-NEXT: lui a1, 209715
1622 ; RV32-NEXT: addi a1, a1, 819
1623 ; RV32-NEXT: sw a1, 20(sp)
1624 ; RV32-NEXT: sw a1, 16(sp)
1625 ; RV32-NEXT: lui a1, 61681
1626 ; RV32-NEXT: addi a1, a1, -241
1627 ; RV32-NEXT: sw a1, 12(sp)
1628 ; RV32-NEXT: sw a1, 8(sp)
1629 ; RV32-NEXT: lui a1, 4112
1630 ; RV32-NEXT: addi a1, a1, 257
1631 ; RV32-NEXT: sw a1, 4(sp)
1632 ; RV32-NEXT: sw a1, 0(sp)
1633 ; RV32-NEXT: li a1, 1
1634 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
1635 ; RV32-NEXT: vsub.vx v16, v8, a1
1636 ; RV32-NEXT: vnot.v v8, v8
1637 ; RV32-NEXT: vand.vv v8, v8, v16
1638 ; RV32-NEXT: addi a1, sp, 24
1639 ; RV32-NEXT: vsetivli zero, 16, e64, m8, ta, ma
1640 ; RV32-NEXT: vlse64.v v16, (a1), zero
1641 ; RV32-NEXT: addi a1, sp, 16
1642 ; RV32-NEXT: vlse64.v v24, (a1), zero
1643 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
1644 ; RV32-NEXT: vsrl.vi v0, v8, 1
1645 ; RV32-NEXT: vand.vv v16, v0, v16
1646 ; RV32-NEXT: vsub.vv v8, v8, v16
1647 ; RV32-NEXT: vand.vv v16, v8, v24
1648 ; RV32-NEXT: vsrl.vi v8, v8, 2
1649 ; RV32-NEXT: vand.vv v8, v8, v24
1650 ; RV32-NEXT: vadd.vv v8, v16, v8
1651 ; RV32-NEXT: addi a1, sp, 8
1652 ; RV32-NEXT: vsetivli zero, 16, e64, m8, ta, ma
1653 ; RV32-NEXT: vlse64.v v16, (a1), zero
1654 ; RV32-NEXT: mv a1, sp
1655 ; RV32-NEXT: vlse64.v v24, (a1), zero
1656 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
1657 ; RV32-NEXT: vsrl.vi v0, v8, 4
1658 ; RV32-NEXT: vadd.vv v8, v8, v0
1659 ; RV32-NEXT: vand.vv v8, v8, v16
1660 ; RV32-NEXT: vmul.vv v8, v8, v24
1661 ; RV32-NEXT: li a0, 56
1662 ; RV32-NEXT: vsrl.vx v8, v8, a0
1663 ; RV32-NEXT: addi sp, sp, 32
1666 ; RV64-LABEL: vp_cttz_v16i64_unmasked:
1668 ; RV64-NEXT: li a1, 1
1669 ; RV64-NEXT: vsetvli zero, a0, e64, m8, ta, ma
1670 ; RV64-NEXT: vsub.vx v16, v8, a1
1671 ; RV64-NEXT: vnot.v v8, v8
1672 ; RV64-NEXT: vand.vv v8, v8, v16
1673 ; RV64-NEXT: vsrl.vi v16, v8, 1
1674 ; RV64-NEXT: lui a0, 349525
1675 ; RV64-NEXT: addiw a0, a0, 1365
1676 ; RV64-NEXT: slli a1, a0, 32
1677 ; RV64-NEXT: add a0, a0, a1
1678 ; RV64-NEXT: vand.vx v16, v16, a0
1679 ; RV64-NEXT: vsub.vv v8, v8, v16
1680 ; RV64-NEXT: lui a0, 209715
1681 ; RV64-NEXT: addiw a0, a0, 819
1682 ; RV64-NEXT: slli a1, a0, 32
1683 ; RV64-NEXT: add a0, a0, a1
1684 ; RV64-NEXT: vand.vx v16, v8, a0
1685 ; RV64-NEXT: vsrl.vi v8, v8, 2
1686 ; RV64-NEXT: vand.vx v8, v8, a0
1687 ; RV64-NEXT: vadd.vv v8, v16, v8
1688 ; RV64-NEXT: vsrl.vi v16, v8, 4
1689 ; RV64-NEXT: vadd.vv v8, v8, v16
1690 ; RV64-NEXT: lui a0, 61681
1691 ; RV64-NEXT: addiw a0, a0, -241
1692 ; RV64-NEXT: slli a1, a0, 32
1693 ; RV64-NEXT: add a0, a0, a1
1694 ; RV64-NEXT: vand.vx v8, v8, a0
1695 ; RV64-NEXT: lui a0, 4112
1696 ; RV64-NEXT: addiw a0, a0, 257
1697 ; RV64-NEXT: slli a1, a0, 32
1698 ; RV64-NEXT: add a0, a0, a1
1699 ; RV64-NEXT: vmul.vx v8, v8, a0
1700 ; RV64-NEXT: li a0, 56
1701 ; RV64-NEXT: vsrl.vx v8, v8, a0
1703 %v = call <16 x i64> @llvm.vp.cttz.v16i64(<16 x i64> %va, i1 false, <16 x i1> splat (i1 true), i32 %evl)
1707 declare <32 x i64> @llvm.vp.cttz.v32i64(<32 x i64>, i1 immarg, <32 x i1>, i32)
1709 define <32 x i64> @vp_cttz_v32i64(<32 x i64> %va, <32 x i1> %m, i32 zeroext %evl) {
1710 ; RV32-LABEL: vp_cttz_v32i64:
1712 ; RV32-NEXT: addi sp, sp, -48
1713 ; RV32-NEXT: .cfi_def_cfa_offset 48
1714 ; RV32-NEXT: csrr a1, vlenb
1715 ; RV32-NEXT: li a2, 56
1716 ; RV32-NEXT: mul a1, a1, a2
1717 ; RV32-NEXT: sub sp, sp, a1
1718 ; RV32-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x30, 0x22, 0x11, 0x38, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 48 + 56 * vlenb
1719 ; RV32-NEXT: csrr a1, vlenb
1720 ; RV32-NEXT: slli a1, a1, 4
1721 ; RV32-NEXT: add a1, sp, a1
1722 ; RV32-NEXT: addi a1, a1, 48
1723 ; RV32-NEXT: vs8r.v v16, (a1) # Unknown-size Folded Spill
1724 ; RV32-NEXT: vsetivli zero, 2, e8, mf4, ta, ma
1725 ; RV32-NEXT: vslidedown.vi v24, v0, 2
1726 ; RV32-NEXT: lui a1, 349525
1727 ; RV32-NEXT: addi a1, a1, 1365
1728 ; RV32-NEXT: sw a1, 44(sp)
1729 ; RV32-NEXT: sw a1, 40(sp)
1730 ; RV32-NEXT: lui a1, 209715
1731 ; RV32-NEXT: addi a1, a1, 819
1732 ; RV32-NEXT: sw a1, 36(sp)
1733 ; RV32-NEXT: sw a1, 32(sp)
1734 ; RV32-NEXT: lui a1, 61681
1735 ; RV32-NEXT: addi a1, a1, -241
1736 ; RV32-NEXT: sw a1, 28(sp)
1737 ; RV32-NEXT: sw a1, 24(sp)
1738 ; RV32-NEXT: lui a1, 4112
1739 ; RV32-NEXT: addi a1, a1, 257
1740 ; RV32-NEXT: sw a1, 20(sp)
1741 ; RV32-NEXT: li a3, 16
1742 ; RV32-NEXT: sw a1, 16(sp)
1743 ; RV32-NEXT: mv a2, a0
1744 ; RV32-NEXT: bltu a0, a3, .LBB34_2
1745 ; RV32-NEXT: # %bb.1:
1746 ; RV32-NEXT: li a2, 16
1747 ; RV32-NEXT: .LBB34_2:
1748 ; RV32-NEXT: li a1, 1
1749 ; RV32-NEXT: vsetvli zero, a2, e64, m8, ta, ma
1750 ; RV32-NEXT: vsub.vx v16, v8, a1, v0.t
1751 ; RV32-NEXT: vnot.v v8, v8, v0.t
1752 ; RV32-NEXT: vand.vv v8, v8, v16, v0.t
1753 ; RV32-NEXT: csrr a3, vlenb
1754 ; RV32-NEXT: slli a3, a3, 5
1755 ; RV32-NEXT: add a3, sp, a3
1756 ; RV32-NEXT: addi a3, a3, 48
1757 ; RV32-NEXT: vs8r.v v8, (a3) # Unknown-size Folded Spill
1758 ; RV32-NEXT: addi a3, sp, 40
1759 ; RV32-NEXT: vsetivli zero, 16, e64, m8, ta, ma
1760 ; RV32-NEXT: vlse64.v v8, (a3), zero
1761 ; RV32-NEXT: csrr a3, vlenb
1762 ; RV32-NEXT: li a4, 40
1763 ; RV32-NEXT: mul a3, a3, a4
1764 ; RV32-NEXT: add a3, sp, a3
1765 ; RV32-NEXT: addi a3, a3, 48
1766 ; RV32-NEXT: vs8r.v v8, (a3) # Unknown-size Folded Spill
1767 ; RV32-NEXT: addi a3, sp, 32
1768 ; RV32-NEXT: vlse64.v v8, (a3), zero
1769 ; RV32-NEXT: csrr a3, vlenb
1770 ; RV32-NEXT: li a4, 48
1771 ; RV32-NEXT: mul a3, a3, a4
1772 ; RV32-NEXT: add a3, sp, a3
1773 ; RV32-NEXT: addi a3, a3, 48
1774 ; RV32-NEXT: vs8r.v v8, (a3) # Unknown-size Folded Spill
1775 ; RV32-NEXT: csrr a3, vlenb
1776 ; RV32-NEXT: slli a3, a3, 5
1777 ; RV32-NEXT: add a3, sp, a3
1778 ; RV32-NEXT: addi a3, a3, 48
1779 ; RV32-NEXT: vl8r.v v16, (a3) # Unknown-size Folded Reload
1780 ; RV32-NEXT: vsetvli zero, a2, e64, m8, ta, ma
1781 ; RV32-NEXT: vsrl.vi v8, v16, 1, v0.t
1782 ; RV32-NEXT: csrr a3, vlenb
1783 ; RV32-NEXT: li a4, 24
1784 ; RV32-NEXT: mul a3, a3, a4
1785 ; RV32-NEXT: add a3, sp, a3
1786 ; RV32-NEXT: addi a3, a3, 48
1787 ; RV32-NEXT: vs8r.v v8, (a3) # Unknown-size Folded Spill
1788 ; RV32-NEXT: csrr a3, vlenb
1789 ; RV32-NEXT: li a4, 40
1790 ; RV32-NEXT: mul a3, a3, a4
1791 ; RV32-NEXT: add a3, sp, a3
1792 ; RV32-NEXT: addi a3, a3, 48
1793 ; RV32-NEXT: vl8r.v v16, (a3) # Unknown-size Folded Reload
1794 ; RV32-NEXT: csrr a3, vlenb
1795 ; RV32-NEXT: li a4, 24
1796 ; RV32-NEXT: mul a3, a3, a4
1797 ; RV32-NEXT: add a3, sp, a3
1798 ; RV32-NEXT: addi a3, a3, 48
1799 ; RV32-NEXT: vl8r.v v8, (a3) # Unknown-size Folded Reload
1800 ; RV32-NEXT: vand.vv v8, v8, v16, v0.t
1801 ; RV32-NEXT: csrr a3, vlenb
1802 ; RV32-NEXT: slli a3, a3, 5
1803 ; RV32-NEXT: add a3, sp, a3
1804 ; RV32-NEXT: addi a3, a3, 48
1805 ; RV32-NEXT: vl8r.v v16, (a3) # Unknown-size Folded Reload
1806 ; RV32-NEXT: vsub.vv v16, v16, v8, v0.t
1807 ; RV32-NEXT: csrr a3, vlenb
1808 ; RV32-NEXT: slli a3, a3, 5
1809 ; RV32-NEXT: add a3, sp, a3
1810 ; RV32-NEXT: addi a3, a3, 48
1811 ; RV32-NEXT: vs8r.v v16, (a3) # Unknown-size Folded Spill
1812 ; RV32-NEXT: csrr a3, vlenb
1813 ; RV32-NEXT: slli a3, a3, 5
1814 ; RV32-NEXT: add a3, sp, a3
1815 ; RV32-NEXT: addi a3, a3, 48
1816 ; RV32-NEXT: vl8r.v v16, (a3) # Unknown-size Folded Reload
1817 ; RV32-NEXT: csrr a3, vlenb
1818 ; RV32-NEXT: li a4, 48
1819 ; RV32-NEXT: mul a3, a3, a4
1820 ; RV32-NEXT: add a3, sp, a3
1821 ; RV32-NEXT: addi a3, a3, 48
1822 ; RV32-NEXT: vl8r.v v8, (a3) # Unknown-size Folded Reload
1823 ; RV32-NEXT: vand.vv v16, v16, v8, v0.t
1824 ; RV32-NEXT: csrr a3, vlenb
1825 ; RV32-NEXT: li a4, 24
1826 ; RV32-NEXT: mul a3, a3, a4
1827 ; RV32-NEXT: add a3, sp, a3
1828 ; RV32-NEXT: addi a3, a3, 48
1829 ; RV32-NEXT: vs8r.v v16, (a3) # Unknown-size Folded Spill
1830 ; RV32-NEXT: csrr a3, vlenb
1831 ; RV32-NEXT: slli a3, a3, 5
1832 ; RV32-NEXT: add a3, sp, a3
1833 ; RV32-NEXT: addi a3, a3, 48
1834 ; RV32-NEXT: vl8r.v v16, (a3) # Unknown-size Folded Reload
1835 ; RV32-NEXT: vsrl.vi v16, v16, 2, v0.t
1836 ; RV32-NEXT: vand.vv v16, v16, v8, v0.t
1837 ; RV32-NEXT: csrr a3, vlenb
1838 ; RV32-NEXT: li a4, 24
1839 ; RV32-NEXT: mul a3, a3, a4
1840 ; RV32-NEXT: add a3, sp, a3
1841 ; RV32-NEXT: addi a3, a3, 48
1842 ; RV32-NEXT: vl8r.v v8, (a3) # Unknown-size Folded Reload
1843 ; RV32-NEXT: vadd.vv v8, v8, v16, v0.t
1844 ; RV32-NEXT: csrr a3, vlenb
1845 ; RV32-NEXT: slli a3, a3, 3
1846 ; RV32-NEXT: add a3, sp, a3
1847 ; RV32-NEXT: addi a3, a3, 48
1848 ; RV32-NEXT: vs8r.v v8, (a3) # Unknown-size Folded Spill
1849 ; RV32-NEXT: addi a3, sp, 24
1850 ; RV32-NEXT: addi a4, sp, 16
1851 ; RV32-NEXT: vsetivli zero, 16, e64, m8, ta, ma
1852 ; RV32-NEXT: vlse64.v v8, (a3), zero
1853 ; RV32-NEXT: csrr a3, vlenb
1854 ; RV32-NEXT: li a5, 24
1855 ; RV32-NEXT: mul a3, a3, a5
1856 ; RV32-NEXT: add a3, sp, a3
1857 ; RV32-NEXT: addi a3, a3, 48
1858 ; RV32-NEXT: vs8r.v v8, (a3) # Unknown-size Folded Spill
1859 ; RV32-NEXT: vlse64.v v8, (a4), zero
1860 ; RV32-NEXT: csrr a3, vlenb
1861 ; RV32-NEXT: slli a3, a3, 5
1862 ; RV32-NEXT: add a3, sp, a3
1863 ; RV32-NEXT: addi a3, a3, 48
1864 ; RV32-NEXT: vs8r.v v8, (a3) # Unknown-size Folded Spill
1865 ; RV32-NEXT: csrr a3, vlenb
1866 ; RV32-NEXT: slli a3, a3, 3
1867 ; RV32-NEXT: add a3, sp, a3
1868 ; RV32-NEXT: addi a3, a3, 48
1869 ; RV32-NEXT: vl8r.v v8, (a3) # Unknown-size Folded Reload
1870 ; RV32-NEXT: vsetvli zero, a2, e64, m8, ta, ma
1871 ; RV32-NEXT: vsrl.vi v16, v8, 4, v0.t
1872 ; RV32-NEXT: addi a2, sp, 48
1873 ; RV32-NEXT: vs8r.v v16, (a2) # Unknown-size Folded Spill
1874 ; RV32-NEXT: vl8r.v v16, (a2) # Unknown-size Folded Reload
1875 ; RV32-NEXT: vadd.vv v16, v8, v16, v0.t
1876 ; RV32-NEXT: csrr a2, vlenb
1877 ; RV32-NEXT: li a3, 24
1878 ; RV32-NEXT: mul a2, a2, a3
1879 ; RV32-NEXT: add a2, sp, a2
1880 ; RV32-NEXT: addi a2, a2, 48
1881 ; RV32-NEXT: vl8r.v v8, (a2) # Unknown-size Folded Reload
1882 ; RV32-NEXT: vand.vv v16, v16, v8, v0.t
1883 ; RV32-NEXT: csrr a2, vlenb
1884 ; RV32-NEXT: slli a2, a2, 5
1885 ; RV32-NEXT: add a2, sp, a2
1886 ; RV32-NEXT: addi a2, a2, 48
1887 ; RV32-NEXT: vl8r.v v8, (a2) # Unknown-size Folded Reload
1888 ; RV32-NEXT: vmul.vv v8, v16, v8, v0.t
1889 ; RV32-NEXT: li a2, 56
1890 ; RV32-NEXT: vsrl.vx v8, v8, a2, v0.t
1891 ; RV32-NEXT: csrr a3, vlenb
1892 ; RV32-NEXT: slli a3, a3, 3
1893 ; RV32-NEXT: add a3, sp, a3
1894 ; RV32-NEXT: addi a3, a3, 48
1895 ; RV32-NEXT: vs8r.v v8, (a3) # Unknown-size Folded Spill
1896 ; RV32-NEXT: addi a3, a0, -16
1897 ; RV32-NEXT: sltu a0, a0, a3
1898 ; RV32-NEXT: addi a0, a0, -1
1899 ; RV32-NEXT: and a0, a0, a3
1900 ; RV32-NEXT: vmv1r.v v0, v24
1901 ; RV32-NEXT: csrr a3, vlenb
1902 ; RV32-NEXT: slli a3, a3, 4
1903 ; RV32-NEXT: add a3, sp, a3
1904 ; RV32-NEXT: addi a3, a3, 48
1905 ; RV32-NEXT: vl8r.v v16, (a3) # Unknown-size Folded Reload
1906 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
1907 ; RV32-NEXT: vsub.vx v8, v16, a1, v0.t
1908 ; RV32-NEXT: vnot.v v16, v16, v0.t
1909 ; RV32-NEXT: vand.vv v8, v16, v8, v0.t
1910 ; RV32-NEXT: addi a0, sp, 48
1911 ; RV32-NEXT: vs8r.v v8, (a0) # Unknown-size Folded Spill
1912 ; RV32-NEXT: vsrl.vi v8, v8, 1, v0.t
1913 ; RV32-NEXT: csrr a0, vlenb
1914 ; RV32-NEXT: slli a0, a0, 4
1915 ; RV32-NEXT: add a0, sp, a0
1916 ; RV32-NEXT: addi a0, a0, 48
1917 ; RV32-NEXT: vs8r.v v8, (a0) # Unknown-size Folded Spill
1918 ; RV32-NEXT: csrr a0, vlenb
1919 ; RV32-NEXT: li a1, 40
1920 ; RV32-NEXT: mul a0, a0, a1
1921 ; RV32-NEXT: add a0, sp, a0
1922 ; RV32-NEXT: addi a0, a0, 48
1923 ; RV32-NEXT: vl8r.v v16, (a0) # Unknown-size Folded Reload
1924 ; RV32-NEXT: csrr a0, vlenb
1925 ; RV32-NEXT: slli a0, a0, 4
1926 ; RV32-NEXT: add a0, sp, a0
1927 ; RV32-NEXT: addi a0, a0, 48
1928 ; RV32-NEXT: vl8r.v v8, (a0) # Unknown-size Folded Reload
1929 ; RV32-NEXT: vand.vv v16, v8, v16, v0.t
1930 ; RV32-NEXT: addi a0, sp, 48
1931 ; RV32-NEXT: vl8r.v v8, (a0) # Unknown-size Folded Reload
1932 ; RV32-NEXT: vsub.vv v8, v8, v16, v0.t
1933 ; RV32-NEXT: csrr a0, vlenb
1934 ; RV32-NEXT: li a1, 40
1935 ; RV32-NEXT: mul a0, a0, a1
1936 ; RV32-NEXT: add a0, sp, a0
1937 ; RV32-NEXT: addi a0, a0, 48
1938 ; RV32-NEXT: vs8r.v v8, (a0) # Unknown-size Folded Spill
1939 ; RV32-NEXT: csrr a0, vlenb
1940 ; RV32-NEXT: li a1, 48
1941 ; RV32-NEXT: mul a0, a0, a1
1942 ; RV32-NEXT: add a0, sp, a0
1943 ; RV32-NEXT: addi a0, a0, 48
1944 ; RV32-NEXT: vl8r.v v8, (a0) # Unknown-size Folded Reload
1945 ; RV32-NEXT: csrr a0, vlenb
1946 ; RV32-NEXT: li a1, 40
1947 ; RV32-NEXT: mul a0, a0, a1
1948 ; RV32-NEXT: add a0, sp, a0
1949 ; RV32-NEXT: addi a0, a0, 48
1950 ; RV32-NEXT: vl8r.v v16, (a0) # Unknown-size Folded Reload
1951 ; RV32-NEXT: vand.vv v16, v16, v8, v0.t
1952 ; RV32-NEXT: csrr a0, vlenb
1953 ; RV32-NEXT: slli a0, a0, 4
1954 ; RV32-NEXT: add a0, sp, a0
1955 ; RV32-NEXT: addi a0, a0, 48
1956 ; RV32-NEXT: vs8r.v v16, (a0) # Unknown-size Folded Spill
1957 ; RV32-NEXT: csrr a0, vlenb
1958 ; RV32-NEXT: li a1, 40
1959 ; RV32-NEXT: mul a0, a0, a1
1960 ; RV32-NEXT: add a0, sp, a0
1961 ; RV32-NEXT: addi a0, a0, 48
1962 ; RV32-NEXT: vl8r.v v8, (a0) # Unknown-size Folded Reload
1963 ; RV32-NEXT: vsrl.vi v8, v8, 2, v0.t
1964 ; RV32-NEXT: csrr a0, vlenb
1965 ; RV32-NEXT: li a1, 48
1966 ; RV32-NEXT: mul a0, a0, a1
1967 ; RV32-NEXT: add a0, sp, a0
1968 ; RV32-NEXT: addi a0, a0, 48
1969 ; RV32-NEXT: vl8r.v v16, (a0) # Unknown-size Folded Reload
1970 ; RV32-NEXT: vand.vv v8, v8, v16, v0.t
1971 ; RV32-NEXT: csrr a0, vlenb
1972 ; RV32-NEXT: slli a0, a0, 4
1973 ; RV32-NEXT: add a0, sp, a0
1974 ; RV32-NEXT: addi a0, a0, 48
1975 ; RV32-NEXT: vl8r.v v16, (a0) # Unknown-size Folded Reload
1976 ; RV32-NEXT: vadd.vv v8, v16, v8, v0.t
1977 ; RV32-NEXT: vsrl.vi v16, v8, 4, v0.t
1978 ; RV32-NEXT: vadd.vv v8, v8, v16, v0.t
1979 ; RV32-NEXT: csrr a0, vlenb
1980 ; RV32-NEXT: li a1, 24
1981 ; RV32-NEXT: mul a0, a0, a1
1982 ; RV32-NEXT: add a0, sp, a0
1983 ; RV32-NEXT: addi a0, a0, 48
1984 ; RV32-NEXT: vl8r.v v16, (a0) # Unknown-size Folded Reload
1985 ; RV32-NEXT: vand.vv v8, v8, v16, v0.t
1986 ; RV32-NEXT: csrr a0, vlenb
1987 ; RV32-NEXT: slli a0, a0, 5
1988 ; RV32-NEXT: add a0, sp, a0
1989 ; RV32-NEXT: addi a0, a0, 48
1990 ; RV32-NEXT: vl8r.v v16, (a0) # Unknown-size Folded Reload
1991 ; RV32-NEXT: vmul.vv v8, v8, v16, v0.t
1992 ; RV32-NEXT: vsrl.vx v16, v8, a2, v0.t
1993 ; RV32-NEXT: csrr a0, vlenb
1994 ; RV32-NEXT: slli a0, a0, 3
1995 ; RV32-NEXT: add a0, sp, a0
1996 ; RV32-NEXT: addi a0, a0, 48
1997 ; RV32-NEXT: vl8r.v v8, (a0) # Unknown-size Folded Reload
1998 ; RV32-NEXT: csrr a0, vlenb
1999 ; RV32-NEXT: li a1, 56
2000 ; RV32-NEXT: mul a0, a0, a1
2001 ; RV32-NEXT: add sp, sp, a0
2002 ; RV32-NEXT: addi sp, sp, 48
2005 ; RV64-LABEL: vp_cttz_v32i64:
2007 ; RV64-NEXT: addi sp, sp, -16
2008 ; RV64-NEXT: .cfi_def_cfa_offset 16
2009 ; RV64-NEXT: csrr a1, vlenb
2010 ; RV64-NEXT: slli a1, a1, 4
2011 ; RV64-NEXT: sub sp, sp, a1
2012 ; RV64-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x10, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 16 * vlenb
2013 ; RV64-NEXT: csrr a1, vlenb
2014 ; RV64-NEXT: slli a1, a1, 3
2015 ; RV64-NEXT: add a1, sp, a1
2016 ; RV64-NEXT: addi a1, a1, 16
2017 ; RV64-NEXT: vs8r.v v16, (a1) # Unknown-size Folded Spill
2018 ; RV64-NEXT: li a1, 16
2019 ; RV64-NEXT: vsetivli zero, 2, e8, mf4, ta, ma
2020 ; RV64-NEXT: vslidedown.vi v24, v0, 2
2021 ; RV64-NEXT: mv a2, a0
2022 ; RV64-NEXT: bltu a0, a1, .LBB34_2
2023 ; RV64-NEXT: # %bb.1:
2024 ; RV64-NEXT: li a2, 16
2025 ; RV64-NEXT: .LBB34_2:
2026 ; RV64-NEXT: li a1, 1
2027 ; RV64-NEXT: vsetvli zero, a2, e64, m8, ta, ma
2028 ; RV64-NEXT: vsub.vx v16, v8, a1, v0.t
2029 ; RV64-NEXT: vnot.v v8, v8, v0.t
2030 ; RV64-NEXT: vand.vv v8, v8, v16, v0.t
2031 ; RV64-NEXT: vsrl.vi v16, v8, 1, v0.t
2032 ; RV64-NEXT: lui a2, 349525
2033 ; RV64-NEXT: addiw a2, a2, 1365
2034 ; RV64-NEXT: slli a3, a2, 32
2035 ; RV64-NEXT: add a2, a2, a3
2036 ; RV64-NEXT: vand.vx v16, v16, a2, v0.t
2037 ; RV64-NEXT: vsub.vv v8, v8, v16, v0.t
2038 ; RV64-NEXT: lui a3, 209715
2039 ; RV64-NEXT: addiw a3, a3, 819
2040 ; RV64-NEXT: slli a4, a3, 32
2041 ; RV64-NEXT: add a3, a3, a4
2042 ; RV64-NEXT: vand.vx v16, v8, a3, v0.t
2043 ; RV64-NEXT: vsrl.vi v8, v8, 2, v0.t
2044 ; RV64-NEXT: vand.vx v8, v8, a3, v0.t
2045 ; RV64-NEXT: vadd.vv v8, v16, v8, v0.t
2046 ; RV64-NEXT: vsrl.vi v16, v8, 4, v0.t
2047 ; RV64-NEXT: vadd.vv v8, v8, v16, v0.t
2048 ; RV64-NEXT: lui a4, 61681
2049 ; RV64-NEXT: addiw a4, a4, -241
2050 ; RV64-NEXT: slli a5, a4, 32
2051 ; RV64-NEXT: add a4, a4, a5
2052 ; RV64-NEXT: vand.vx v8, v8, a4, v0.t
2053 ; RV64-NEXT: lui a5, 4112
2054 ; RV64-NEXT: addiw a5, a5, 257
2055 ; RV64-NEXT: slli a6, a5, 32
2056 ; RV64-NEXT: add a5, a5, a6
2057 ; RV64-NEXT: vmul.vx v8, v8, a5, v0.t
2058 ; RV64-NEXT: li a6, 56
2059 ; RV64-NEXT: vsrl.vx v8, v8, a6, v0.t
2060 ; RV64-NEXT: addi a7, sp, 16
2061 ; RV64-NEXT: vs8r.v v8, (a7) # Unknown-size Folded Spill
2062 ; RV64-NEXT: addi a7, a0, -16
2063 ; RV64-NEXT: sltu a0, a0, a7
2064 ; RV64-NEXT: addi a0, a0, -1
2065 ; RV64-NEXT: and a0, a0, a7
2066 ; RV64-NEXT: vmv1r.v v0, v24
2067 ; RV64-NEXT: csrr a7, vlenb
2068 ; RV64-NEXT: slli a7, a7, 3
2069 ; RV64-NEXT: add a7, sp, a7
2070 ; RV64-NEXT: addi a7, a7, 16
2071 ; RV64-NEXT: vl8r.v v8, (a7) # Unknown-size Folded Reload
2072 ; RV64-NEXT: vsetvli zero, a0, e64, m8, ta, ma
2073 ; RV64-NEXT: vsub.vx v16, v8, a1, v0.t
2074 ; RV64-NEXT: vnot.v v8, v8, v0.t
2075 ; RV64-NEXT: vand.vv v8, v8, v16, v0.t
2076 ; RV64-NEXT: vsrl.vi v16, v8, 1, v0.t
2077 ; RV64-NEXT: vand.vx v16, v16, a2, v0.t
2078 ; RV64-NEXT: vsub.vv v8, v8, v16, v0.t
2079 ; RV64-NEXT: vand.vx v16, v8, a3, v0.t
2080 ; RV64-NEXT: vsrl.vi v8, v8, 2, v0.t
2081 ; RV64-NEXT: vand.vx v8, v8, a3, v0.t
2082 ; RV64-NEXT: vadd.vv v8, v16, v8, v0.t
2083 ; RV64-NEXT: vsrl.vi v16, v8, 4, v0.t
2084 ; RV64-NEXT: vadd.vv v8, v8, v16, v0.t
2085 ; RV64-NEXT: vand.vx v8, v8, a4, v0.t
2086 ; RV64-NEXT: vmul.vx v8, v8, a5, v0.t
2087 ; RV64-NEXT: vsrl.vx v16, v8, a6, v0.t
2088 ; RV64-NEXT: addi a0, sp, 16
2089 ; RV64-NEXT: vl8r.v v8, (a0) # Unknown-size Folded Reload
2090 ; RV64-NEXT: csrr a0, vlenb
2091 ; RV64-NEXT: slli a0, a0, 4
2092 ; RV64-NEXT: add sp, sp, a0
2093 ; RV64-NEXT: addi sp, sp, 16
2095 %v = call <32 x i64> @llvm.vp.cttz.v32i64(<32 x i64> %va, i1 false, <32 x i1> %m, i32 %evl)
2099 define <32 x i64> @vp_cttz_v32i64_unmasked(<32 x i64> %va, i32 zeroext %evl) {
2100 ; RV32-LABEL: vp_cttz_v32i64_unmasked:
2102 ; RV32-NEXT: addi sp, sp, -48
2103 ; RV32-NEXT: .cfi_def_cfa_offset 48
2104 ; RV32-NEXT: csrr a1, vlenb
2105 ; RV32-NEXT: slli a1, a1, 4
2106 ; RV32-NEXT: sub sp, sp, a1
2107 ; RV32-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x30, 0x22, 0x11, 0x10, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 48 + 16 * vlenb
2108 ; RV32-NEXT: csrr a1, vlenb
2109 ; RV32-NEXT: slli a1, a1, 3
2110 ; RV32-NEXT: add a1, sp, a1
2111 ; RV32-NEXT: addi a1, a1, 48
2112 ; RV32-NEXT: vs8r.v v16, (a1) # Unknown-size Folded Spill
2113 ; RV32-NEXT: lui a1, 349525
2114 ; RV32-NEXT: addi a1, a1, 1365
2115 ; RV32-NEXT: sw a1, 44(sp)
2116 ; RV32-NEXT: sw a1, 40(sp)
2117 ; RV32-NEXT: lui a1, 209715
2118 ; RV32-NEXT: addi a1, a1, 819
2119 ; RV32-NEXT: sw a1, 36(sp)
2120 ; RV32-NEXT: sw a1, 32(sp)
2121 ; RV32-NEXT: lui a1, 61681
2122 ; RV32-NEXT: addi a1, a1, -241
2123 ; RV32-NEXT: sw a1, 28(sp)
2124 ; RV32-NEXT: sw a1, 24(sp)
2125 ; RV32-NEXT: lui a1, 4112
2126 ; RV32-NEXT: addi a1, a1, 257
2127 ; RV32-NEXT: sw a1, 20(sp)
2128 ; RV32-NEXT: li a2, 16
2129 ; RV32-NEXT: sw a1, 16(sp)
2130 ; RV32-NEXT: mv a1, a0
2131 ; RV32-NEXT: bltu a0, a2, .LBB35_2
2132 ; RV32-NEXT: # %bb.1:
2133 ; RV32-NEXT: li a1, 16
2134 ; RV32-NEXT: .LBB35_2:
2135 ; RV32-NEXT: li a2, 1
2136 ; RV32-NEXT: vsetvli zero, a1, e64, m8, ta, ma
2137 ; RV32-NEXT: vsub.vx v24, v8, a2
2138 ; RV32-NEXT: vnot.v v8, v8
2139 ; RV32-NEXT: vand.vv v0, v8, v24
2140 ; RV32-NEXT: addi a3, sp, 40
2141 ; RV32-NEXT: vsetivli zero, 16, e64, m8, ta, ma
2142 ; RV32-NEXT: vlse64.v v16, (a3), zero
2143 ; RV32-NEXT: addi a3, sp, 32
2144 ; RV32-NEXT: vlse64.v v8, (a3), zero
2145 ; RV32-NEXT: vsetvli zero, a1, e64, m8, ta, ma
2146 ; RV32-NEXT: vsrl.vi v24, v0, 1
2147 ; RV32-NEXT: vand.vv v24, v24, v16
2148 ; RV32-NEXT: vsub.vv v24, v0, v24
2149 ; RV32-NEXT: vand.vv v0, v24, v8
2150 ; RV32-NEXT: vsrl.vi v24, v24, 2
2151 ; RV32-NEXT: vand.vv v24, v24, v8
2152 ; RV32-NEXT: vadd.vv v24, v0, v24
2153 ; RV32-NEXT: vsrl.vi v0, v24, 4
2154 ; RV32-NEXT: vadd.vv v24, v24, v0
2155 ; RV32-NEXT: addi a3, sp, 48
2156 ; RV32-NEXT: vs8r.v v24, (a3) # Unknown-size Folded Spill
2157 ; RV32-NEXT: addi a3, a0, -16
2158 ; RV32-NEXT: sltu a0, a0, a3
2159 ; RV32-NEXT: addi a0, a0, -1
2160 ; RV32-NEXT: and a0, a0, a3
2161 ; RV32-NEXT: csrr a3, vlenb
2162 ; RV32-NEXT: slli a3, a3, 3
2163 ; RV32-NEXT: add a3, sp, a3
2164 ; RV32-NEXT: addi a3, a3, 48
2165 ; RV32-NEXT: vl8r.v v0, (a3) # Unknown-size Folded Reload
2166 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
2167 ; RV32-NEXT: vsub.vx v24, v0, a2
2168 ; RV32-NEXT: vnot.v v0, v0
2169 ; RV32-NEXT: vand.vv v24, v0, v24
2170 ; RV32-NEXT: vsrl.vi v0, v24, 1
2171 ; RV32-NEXT: vand.vv v16, v0, v16
2172 ; RV32-NEXT: addi a2, sp, 24
2173 ; RV32-NEXT: vsub.vv v16, v24, v16
2174 ; RV32-NEXT: vand.vv v24, v16, v8
2175 ; RV32-NEXT: vsrl.vi v16, v16, 2
2176 ; RV32-NEXT: vand.vv v8, v16, v8
2177 ; RV32-NEXT: vsetivli zero, 16, e64, m8, ta, ma
2178 ; RV32-NEXT: vlse64.v v16, (a2), zero
2179 ; RV32-NEXT: addi a2, sp, 16
2180 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
2181 ; RV32-NEXT: vadd.vv v8, v24, v8
2182 ; RV32-NEXT: vsetivli zero, 16, e64, m8, ta, ma
2183 ; RV32-NEXT: vlse64.v v24, (a2), zero
2184 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
2185 ; RV32-NEXT: vsrl.vi v0, v8, 4
2186 ; RV32-NEXT: vadd.vv v8, v8, v0
2187 ; RV32-NEXT: addi a2, sp, 48
2188 ; RV32-NEXT: vl8r.v v0, (a2) # Unknown-size Folded Reload
2189 ; RV32-NEXT: vsetvli zero, a1, e64, m8, ta, ma
2190 ; RV32-NEXT: vand.vv v0, v0, v16
2191 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
2192 ; RV32-NEXT: vand.vv v8, v8, v16
2193 ; RV32-NEXT: vsetvli zero, a1, e64, m8, ta, ma
2194 ; RV32-NEXT: vmul.vv v16, v0, v24
2195 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
2196 ; RV32-NEXT: vmul.vv v24, v8, v24
2197 ; RV32-NEXT: li a2, 56
2198 ; RV32-NEXT: vsetvli zero, a1, e64, m8, ta, ma
2199 ; RV32-NEXT: vsrl.vx v8, v16, a2
2200 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
2201 ; RV32-NEXT: vsrl.vx v16, v24, a2
2202 ; RV32-NEXT: csrr a0, vlenb
2203 ; RV32-NEXT: slli a0, a0, 4
2204 ; RV32-NEXT: add sp, sp, a0
2205 ; RV32-NEXT: addi sp, sp, 48
2208 ; RV64-LABEL: vp_cttz_v32i64_unmasked:
2210 ; RV64-NEXT: li a2, 16
2211 ; RV64-NEXT: mv a1, a0
2212 ; RV64-NEXT: bltu a0, a2, .LBB35_2
2213 ; RV64-NEXT: # %bb.1:
2214 ; RV64-NEXT: li a1, 16
2215 ; RV64-NEXT: .LBB35_2:
2216 ; RV64-NEXT: li a2, 1
2217 ; RV64-NEXT: vsetvli zero, a1, e64, m8, ta, ma
2218 ; RV64-NEXT: vsub.vx v24, v8, a2
2219 ; RV64-NEXT: vnot.v v8, v8
2220 ; RV64-NEXT: vand.vv v8, v8, v24
2221 ; RV64-NEXT: vsrl.vi v24, v8, 1
2222 ; RV64-NEXT: lui a1, 349525
2223 ; RV64-NEXT: addiw a1, a1, 1365
2224 ; RV64-NEXT: slli a3, a1, 32
2225 ; RV64-NEXT: add a1, a1, a3
2226 ; RV64-NEXT: vand.vx v24, v24, a1
2227 ; RV64-NEXT: vsub.vv v8, v8, v24
2228 ; RV64-NEXT: lui a3, 209715
2229 ; RV64-NEXT: addiw a3, a3, 819
2230 ; RV64-NEXT: slli a4, a3, 32
2231 ; RV64-NEXT: add a3, a3, a4
2232 ; RV64-NEXT: vand.vx v24, v8, a3
2233 ; RV64-NEXT: vsrl.vi v8, v8, 2
2234 ; RV64-NEXT: vand.vx v8, v8, a3
2235 ; RV64-NEXT: vadd.vv v8, v24, v8
2236 ; RV64-NEXT: vsrl.vi v24, v8, 4
2237 ; RV64-NEXT: vadd.vv v8, v8, v24
2238 ; RV64-NEXT: lui a4, 61681
2239 ; RV64-NEXT: addiw a4, a4, -241
2240 ; RV64-NEXT: slli a5, a4, 32
2241 ; RV64-NEXT: add a4, a4, a5
2242 ; RV64-NEXT: vand.vx v8, v8, a4
2243 ; RV64-NEXT: lui a5, 4112
2244 ; RV64-NEXT: addiw a5, a5, 257
2245 ; RV64-NEXT: slli a6, a5, 32
2246 ; RV64-NEXT: add a5, a5, a6
2247 ; RV64-NEXT: vmul.vx v8, v8, a5
2248 ; RV64-NEXT: li a6, 56
2249 ; RV64-NEXT: vsrl.vx v8, v8, a6
2250 ; RV64-NEXT: addi a7, a0, -16
2251 ; RV64-NEXT: sltu a0, a0, a7
2252 ; RV64-NEXT: addi a0, a0, -1
2253 ; RV64-NEXT: and a0, a0, a7
2254 ; RV64-NEXT: vsetvli zero, a0, e64, m8, ta, ma
2255 ; RV64-NEXT: vsub.vx v24, v16, a2
2256 ; RV64-NEXT: vnot.v v16, v16
2257 ; RV64-NEXT: vand.vv v16, v16, v24
2258 ; RV64-NEXT: vsrl.vi v24, v16, 1
2259 ; RV64-NEXT: vand.vx v24, v24, a1
2260 ; RV64-NEXT: vsub.vv v16, v16, v24
2261 ; RV64-NEXT: vand.vx v24, v16, a3
2262 ; RV64-NEXT: vsrl.vi v16, v16, 2
2263 ; RV64-NEXT: vand.vx v16, v16, a3
2264 ; RV64-NEXT: vadd.vv v16, v24, v16
2265 ; RV64-NEXT: vsrl.vi v24, v16, 4
2266 ; RV64-NEXT: vadd.vv v16, v16, v24
2267 ; RV64-NEXT: vand.vx v16, v16, a4
2268 ; RV64-NEXT: vmul.vx v16, v16, a5
2269 ; RV64-NEXT: vsrl.vx v16, v16, a6
2271 %v = call <32 x i64> @llvm.vp.cttz.v32i64(<32 x i64> %va, i1 false, <32 x i1> splat (i1 true), i32 %evl)
2275 define <2 x i8> @vp_cttz_zero_undef_v2i8(<2 x i8> %va, <2 x i1> %m, i32 zeroext %evl) {
2276 ; CHECK-LABEL: vp_cttz_zero_undef_v2i8:
2278 ; CHECK-NEXT: li a1, 1
2279 ; CHECK-NEXT: vsetvli zero, a0, e8, mf8, ta, ma
2280 ; CHECK-NEXT: vsub.vx v9, v8, a1, v0.t
2281 ; CHECK-NEXT: vnot.v v8, v8, v0.t
2282 ; CHECK-NEXT: vand.vv v8, v8, v9, v0.t
2283 ; CHECK-NEXT: vsrl.vi v9, v8, 1, v0.t
2284 ; CHECK-NEXT: li a0, 85
2285 ; CHECK-NEXT: vand.vx v9, v9, a0, v0.t
2286 ; CHECK-NEXT: vsub.vv v8, v8, v9, v0.t
2287 ; CHECK-NEXT: li a0, 51
2288 ; CHECK-NEXT: vand.vx v9, v8, a0, v0.t
2289 ; CHECK-NEXT: vsrl.vi v8, v8, 2, v0.t
2290 ; CHECK-NEXT: vand.vx v8, v8, a0, v0.t
2291 ; CHECK-NEXT: vadd.vv v8, v9, v8, v0.t
2292 ; CHECK-NEXT: vsrl.vi v9, v8, 4, v0.t
2293 ; CHECK-NEXT: vadd.vv v8, v8, v9, v0.t
2294 ; CHECK-NEXT: vand.vi v8, v8, 15, v0.t
2296 %v = call <2 x i8> @llvm.vp.cttz.v2i8(<2 x i8> %va, i1 true, <2 x i1> %m, i32 %evl)
2300 define <2 x i8> @vp_cttz_zero_undef_v2i8_unmasked(<2 x i8> %va, i32 zeroext %evl) {
2301 ; CHECK-LABEL: vp_cttz_zero_undef_v2i8_unmasked:
2303 ; CHECK-NEXT: li a1, 1
2304 ; CHECK-NEXT: vsetvli zero, a0, e8, mf8, ta, ma
2305 ; CHECK-NEXT: vsub.vx v9, v8, a1
2306 ; CHECK-NEXT: vnot.v v8, v8
2307 ; CHECK-NEXT: vand.vv v8, v8, v9
2308 ; CHECK-NEXT: vsrl.vi v9, v8, 1
2309 ; CHECK-NEXT: li a0, 85
2310 ; CHECK-NEXT: vand.vx v9, v9, a0
2311 ; CHECK-NEXT: vsub.vv v8, v8, v9
2312 ; CHECK-NEXT: li a0, 51
2313 ; CHECK-NEXT: vand.vx v9, v8, a0
2314 ; CHECK-NEXT: vsrl.vi v8, v8, 2
2315 ; CHECK-NEXT: vand.vx v8, v8, a0
2316 ; CHECK-NEXT: vadd.vv v8, v9, v8
2317 ; CHECK-NEXT: vsrl.vi v9, v8, 4
2318 ; CHECK-NEXT: vadd.vv v8, v8, v9
2319 ; CHECK-NEXT: vand.vi v8, v8, 15
2321 %v = call <2 x i8> @llvm.vp.cttz.v2i8(<2 x i8> %va, i1 true, <2 x i1> splat (i1 true), i32 %evl)
2325 define <4 x i8> @vp_cttz_zero_undef_v4i8(<4 x i8> %va, <4 x i1> %m, i32 zeroext %evl) {
2326 ; CHECK-LABEL: vp_cttz_zero_undef_v4i8:
2328 ; CHECK-NEXT: li a1, 1
2329 ; CHECK-NEXT: vsetvli zero, a0, e8, mf4, ta, ma
2330 ; CHECK-NEXT: vsub.vx v9, v8, a1, v0.t
2331 ; CHECK-NEXT: vnot.v v8, v8, v0.t
2332 ; CHECK-NEXT: vand.vv v8, v8, v9, v0.t
2333 ; CHECK-NEXT: vsrl.vi v9, v8, 1, v0.t
2334 ; CHECK-NEXT: li a0, 85
2335 ; CHECK-NEXT: vand.vx v9, v9, a0, v0.t
2336 ; CHECK-NEXT: vsub.vv v8, v8, v9, v0.t
2337 ; CHECK-NEXT: li a0, 51
2338 ; CHECK-NEXT: vand.vx v9, v8, a0, v0.t
2339 ; CHECK-NEXT: vsrl.vi v8, v8, 2, v0.t
2340 ; CHECK-NEXT: vand.vx v8, v8, a0, v0.t
2341 ; CHECK-NEXT: vadd.vv v8, v9, v8, v0.t
2342 ; CHECK-NEXT: vsrl.vi v9, v8, 4, v0.t
2343 ; CHECK-NEXT: vadd.vv v8, v8, v9, v0.t
2344 ; CHECK-NEXT: vand.vi v8, v8, 15, v0.t
2346 %v = call <4 x i8> @llvm.vp.cttz.v4i8(<4 x i8> %va, i1 true, <4 x i1> %m, i32 %evl)
2350 define <4 x i8> @vp_cttz_zero_undef_v4i8_unmasked(<4 x i8> %va, i32 zeroext %evl) {
2351 ; CHECK-LABEL: vp_cttz_zero_undef_v4i8_unmasked:
2353 ; CHECK-NEXT: li a1, 1
2354 ; CHECK-NEXT: vsetvli zero, a0, e8, mf4, ta, ma
2355 ; CHECK-NEXT: vsub.vx v9, v8, a1
2356 ; CHECK-NEXT: vnot.v v8, v8
2357 ; CHECK-NEXT: vand.vv v8, v8, v9
2358 ; CHECK-NEXT: vsrl.vi v9, v8, 1
2359 ; CHECK-NEXT: li a0, 85
2360 ; CHECK-NEXT: vand.vx v9, v9, a0
2361 ; CHECK-NEXT: vsub.vv v8, v8, v9
2362 ; CHECK-NEXT: li a0, 51
2363 ; CHECK-NEXT: vand.vx v9, v8, a0
2364 ; CHECK-NEXT: vsrl.vi v8, v8, 2
2365 ; CHECK-NEXT: vand.vx v8, v8, a0
2366 ; CHECK-NEXT: vadd.vv v8, v9, v8
2367 ; CHECK-NEXT: vsrl.vi v9, v8, 4
2368 ; CHECK-NEXT: vadd.vv v8, v8, v9
2369 ; CHECK-NEXT: vand.vi v8, v8, 15
2371 %v = call <4 x i8> @llvm.vp.cttz.v4i8(<4 x i8> %va, i1 true, <4 x i1> splat (i1 true), i32 %evl)
2375 define <8 x i8> @vp_cttz_zero_undef_v8i8(<8 x i8> %va, <8 x i1> %m, i32 zeroext %evl) {
2376 ; CHECK-LABEL: vp_cttz_zero_undef_v8i8:
2378 ; CHECK-NEXT: li a1, 1
2379 ; CHECK-NEXT: vsetvli zero, a0, e8, mf2, ta, ma
2380 ; CHECK-NEXT: vsub.vx v9, v8, a1, v0.t
2381 ; CHECK-NEXT: vnot.v v8, v8, v0.t
2382 ; CHECK-NEXT: vand.vv v8, v8, v9, v0.t
2383 ; CHECK-NEXT: vsrl.vi v9, v8, 1, v0.t
2384 ; CHECK-NEXT: li a0, 85
2385 ; CHECK-NEXT: vand.vx v9, v9, a0, v0.t
2386 ; CHECK-NEXT: vsub.vv v8, v8, v9, v0.t
2387 ; CHECK-NEXT: li a0, 51
2388 ; CHECK-NEXT: vand.vx v9, v8, a0, v0.t
2389 ; CHECK-NEXT: vsrl.vi v8, v8, 2, v0.t
2390 ; CHECK-NEXT: vand.vx v8, v8, a0, v0.t
2391 ; CHECK-NEXT: vadd.vv v8, v9, v8, v0.t
2392 ; CHECK-NEXT: vsrl.vi v9, v8, 4, v0.t
2393 ; CHECK-NEXT: vadd.vv v8, v8, v9, v0.t
2394 ; CHECK-NEXT: vand.vi v8, v8, 15, v0.t
2396 %v = call <8 x i8> @llvm.vp.cttz.v8i8(<8 x i8> %va, i1 true, <8 x i1> %m, i32 %evl)
2400 define <8 x i8> @vp_cttz_zero_undef_v8i8_unmasked(<8 x i8> %va, i32 zeroext %evl) {
2401 ; CHECK-LABEL: vp_cttz_zero_undef_v8i8_unmasked:
2403 ; CHECK-NEXT: li a1, 1
2404 ; CHECK-NEXT: vsetvli zero, a0, e8, mf2, ta, ma
2405 ; CHECK-NEXT: vsub.vx v9, v8, a1
2406 ; CHECK-NEXT: vnot.v v8, v8
2407 ; CHECK-NEXT: vand.vv v8, v8, v9
2408 ; CHECK-NEXT: vsrl.vi v9, v8, 1
2409 ; CHECK-NEXT: li a0, 85
2410 ; CHECK-NEXT: vand.vx v9, v9, a0
2411 ; CHECK-NEXT: vsub.vv v8, v8, v9
2412 ; CHECK-NEXT: li a0, 51
2413 ; CHECK-NEXT: vand.vx v9, v8, a0
2414 ; CHECK-NEXT: vsrl.vi v8, v8, 2
2415 ; CHECK-NEXT: vand.vx v8, v8, a0
2416 ; CHECK-NEXT: vadd.vv v8, v9, v8
2417 ; CHECK-NEXT: vsrl.vi v9, v8, 4
2418 ; CHECK-NEXT: vadd.vv v8, v8, v9
2419 ; CHECK-NEXT: vand.vi v8, v8, 15
2421 %v = call <8 x i8> @llvm.vp.cttz.v8i8(<8 x i8> %va, i1 true, <8 x i1> splat (i1 true), i32 %evl)
2425 define <16 x i8> @vp_cttz_zero_undef_v16i8(<16 x i8> %va, <16 x i1> %m, i32 zeroext %evl) {
2426 ; CHECK-LABEL: vp_cttz_zero_undef_v16i8:
2428 ; CHECK-NEXT: li a1, 1
2429 ; CHECK-NEXT: vsetvli zero, a0, e8, m1, ta, ma
2430 ; CHECK-NEXT: vsub.vx v9, v8, a1, v0.t
2431 ; CHECK-NEXT: vnot.v v8, v8, v0.t
2432 ; CHECK-NEXT: vand.vv v8, v8, v9, v0.t
2433 ; CHECK-NEXT: vsrl.vi v9, v8, 1, v0.t
2434 ; CHECK-NEXT: li a0, 85
2435 ; CHECK-NEXT: vand.vx v9, v9, a0, v0.t
2436 ; CHECK-NEXT: vsub.vv v8, v8, v9, v0.t
2437 ; CHECK-NEXT: li a0, 51
2438 ; CHECK-NEXT: vand.vx v9, v8, a0, v0.t
2439 ; CHECK-NEXT: vsrl.vi v8, v8, 2, v0.t
2440 ; CHECK-NEXT: vand.vx v8, v8, a0, v0.t
2441 ; CHECK-NEXT: vadd.vv v8, v9, v8, v0.t
2442 ; CHECK-NEXT: vsrl.vi v9, v8, 4, v0.t
2443 ; CHECK-NEXT: vadd.vv v8, v8, v9, v0.t
2444 ; CHECK-NEXT: vand.vi v8, v8, 15, v0.t
2446 %v = call <16 x i8> @llvm.vp.cttz.v16i8(<16 x i8> %va, i1 true, <16 x i1> %m, i32 %evl)
2450 define <16 x i8> @vp_cttz_zero_undef_v16i8_unmasked(<16 x i8> %va, i32 zeroext %evl) {
2451 ; CHECK-LABEL: vp_cttz_zero_undef_v16i8_unmasked:
2453 ; CHECK-NEXT: li a1, 1
2454 ; CHECK-NEXT: vsetvli zero, a0, e8, m1, ta, ma
2455 ; CHECK-NEXT: vsub.vx v9, v8, a1
2456 ; CHECK-NEXT: vnot.v v8, v8
2457 ; CHECK-NEXT: vand.vv v8, v8, v9
2458 ; CHECK-NEXT: vsrl.vi v9, v8, 1
2459 ; CHECK-NEXT: li a0, 85
2460 ; CHECK-NEXT: vand.vx v9, v9, a0
2461 ; CHECK-NEXT: vsub.vv v8, v8, v9
2462 ; CHECK-NEXT: li a0, 51
2463 ; CHECK-NEXT: vand.vx v9, v8, a0
2464 ; CHECK-NEXT: vsrl.vi v8, v8, 2
2465 ; CHECK-NEXT: vand.vx v8, v8, a0
2466 ; CHECK-NEXT: vadd.vv v8, v9, v8
2467 ; CHECK-NEXT: vsrl.vi v9, v8, 4
2468 ; CHECK-NEXT: vadd.vv v8, v8, v9
2469 ; CHECK-NEXT: vand.vi v8, v8, 15
2471 %v = call <16 x i8> @llvm.vp.cttz.v16i8(<16 x i8> %va, i1 true, <16 x i1> splat (i1 true), i32 %evl)
2475 define <2 x i16> @vp_cttz_zero_undef_v2i16(<2 x i16> %va, <2 x i1> %m, i32 zeroext %evl) {
2476 ; CHECK-LABEL: vp_cttz_zero_undef_v2i16:
2478 ; CHECK-NEXT: li a1, 1
2479 ; CHECK-NEXT: vsetvli zero, a0, e16, mf4, ta, ma
2480 ; CHECK-NEXT: vsub.vx v9, v8, a1, v0.t
2481 ; CHECK-NEXT: vnot.v v8, v8, v0.t
2482 ; CHECK-NEXT: vand.vv v8, v8, v9, v0.t
2483 ; CHECK-NEXT: vsrl.vi v9, v8, 1, v0.t
2484 ; CHECK-NEXT: lui a0, 5
2485 ; CHECK-NEXT: addi a0, a0, 1365
2486 ; CHECK-NEXT: vand.vx v9, v9, a0, v0.t
2487 ; CHECK-NEXT: vsub.vv v8, v8, v9, v0.t
2488 ; CHECK-NEXT: lui a0, 3
2489 ; CHECK-NEXT: addi a0, a0, 819
2490 ; CHECK-NEXT: vand.vx v9, v8, a0, v0.t
2491 ; CHECK-NEXT: vsrl.vi v8, v8, 2, v0.t
2492 ; CHECK-NEXT: vand.vx v8, v8, a0, v0.t
2493 ; CHECK-NEXT: vadd.vv v8, v9, v8, v0.t
2494 ; CHECK-NEXT: vsrl.vi v9, v8, 4, v0.t
2495 ; CHECK-NEXT: vadd.vv v8, v8, v9, v0.t
2496 ; CHECK-NEXT: lui a0, 1
2497 ; CHECK-NEXT: addi a0, a0, -241
2498 ; CHECK-NEXT: vand.vx v8, v8, a0, v0.t
2499 ; CHECK-NEXT: li a0, 257
2500 ; CHECK-NEXT: vmul.vx v8, v8, a0, v0.t
2501 ; CHECK-NEXT: vsrl.vi v8, v8, 8, v0.t
2503 %v = call <2 x i16> @llvm.vp.cttz.v2i16(<2 x i16> %va, i1 true, <2 x i1> %m, i32 %evl)
2507 define <2 x i16> @vp_cttz_zero_undef_v2i16_unmasked(<2 x i16> %va, i32 zeroext %evl) {
2508 ; CHECK-LABEL: vp_cttz_zero_undef_v2i16_unmasked:
2510 ; CHECK-NEXT: li a1, 1
2511 ; CHECK-NEXT: vsetvli zero, a0, e16, mf4, ta, ma
2512 ; CHECK-NEXT: vsub.vx v9, v8, a1
2513 ; CHECK-NEXT: vnot.v v8, v8
2514 ; CHECK-NEXT: vand.vv v8, v8, v9
2515 ; CHECK-NEXT: vsrl.vi v9, v8, 1
2516 ; CHECK-NEXT: lui a0, 5
2517 ; CHECK-NEXT: addi a0, a0, 1365
2518 ; CHECK-NEXT: vand.vx v9, v9, a0
2519 ; CHECK-NEXT: vsub.vv v8, v8, v9
2520 ; CHECK-NEXT: lui a0, 3
2521 ; CHECK-NEXT: addi a0, a0, 819
2522 ; CHECK-NEXT: vand.vx v9, v8, a0
2523 ; CHECK-NEXT: vsrl.vi v8, v8, 2
2524 ; CHECK-NEXT: vand.vx v8, v8, a0
2525 ; CHECK-NEXT: vadd.vv v8, v9, v8
2526 ; CHECK-NEXT: vsrl.vi v9, v8, 4
2527 ; CHECK-NEXT: vadd.vv v8, v8, v9
2528 ; CHECK-NEXT: lui a0, 1
2529 ; CHECK-NEXT: addi a0, a0, -241
2530 ; CHECK-NEXT: vand.vx v8, v8, a0
2531 ; CHECK-NEXT: li a0, 257
2532 ; CHECK-NEXT: vmul.vx v8, v8, a0
2533 ; CHECK-NEXT: vsrl.vi v8, v8, 8
2535 %v = call <2 x i16> @llvm.vp.cttz.v2i16(<2 x i16> %va, i1 true, <2 x i1> splat (i1 true), i32 %evl)
2539 define <4 x i16> @vp_cttz_zero_undef_v4i16(<4 x i16> %va, <4 x i1> %m, i32 zeroext %evl) {
2540 ; CHECK-LABEL: vp_cttz_zero_undef_v4i16:
2542 ; CHECK-NEXT: li a1, 1
2543 ; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, ma
2544 ; CHECK-NEXT: vsub.vx v9, v8, a1, v0.t
2545 ; CHECK-NEXT: vnot.v v8, v8, v0.t
2546 ; CHECK-NEXT: vand.vv v8, v8, v9, v0.t
2547 ; CHECK-NEXT: vsrl.vi v9, v8, 1, v0.t
2548 ; CHECK-NEXT: lui a0, 5
2549 ; CHECK-NEXT: addi a0, a0, 1365
2550 ; CHECK-NEXT: vand.vx v9, v9, a0, v0.t
2551 ; CHECK-NEXT: vsub.vv v8, v8, v9, v0.t
2552 ; CHECK-NEXT: lui a0, 3
2553 ; CHECK-NEXT: addi a0, a0, 819
2554 ; CHECK-NEXT: vand.vx v9, v8, a0, v0.t
2555 ; CHECK-NEXT: vsrl.vi v8, v8, 2, v0.t
2556 ; CHECK-NEXT: vand.vx v8, v8, a0, v0.t
2557 ; CHECK-NEXT: vadd.vv v8, v9, v8, v0.t
2558 ; CHECK-NEXT: vsrl.vi v9, v8, 4, v0.t
2559 ; CHECK-NEXT: vadd.vv v8, v8, v9, v0.t
2560 ; CHECK-NEXT: lui a0, 1
2561 ; CHECK-NEXT: addi a0, a0, -241
2562 ; CHECK-NEXT: vand.vx v8, v8, a0, v0.t
2563 ; CHECK-NEXT: li a0, 257
2564 ; CHECK-NEXT: vmul.vx v8, v8, a0, v0.t
2565 ; CHECK-NEXT: vsrl.vi v8, v8, 8, v0.t
2567 %v = call <4 x i16> @llvm.vp.cttz.v4i16(<4 x i16> %va, i1 true, <4 x i1> %m, i32 %evl)
2571 define <4 x i16> @vp_cttz_zero_undef_v4i16_unmasked(<4 x i16> %va, i32 zeroext %evl) {
2572 ; CHECK-LABEL: vp_cttz_zero_undef_v4i16_unmasked:
2574 ; CHECK-NEXT: li a1, 1
2575 ; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, ma
2576 ; CHECK-NEXT: vsub.vx v9, v8, a1
2577 ; CHECK-NEXT: vnot.v v8, v8
2578 ; CHECK-NEXT: vand.vv v8, v8, v9
2579 ; CHECK-NEXT: vsrl.vi v9, v8, 1
2580 ; CHECK-NEXT: lui a0, 5
2581 ; CHECK-NEXT: addi a0, a0, 1365
2582 ; CHECK-NEXT: vand.vx v9, v9, a0
2583 ; CHECK-NEXT: vsub.vv v8, v8, v9
2584 ; CHECK-NEXT: lui a0, 3
2585 ; CHECK-NEXT: addi a0, a0, 819
2586 ; CHECK-NEXT: vand.vx v9, v8, a0
2587 ; CHECK-NEXT: vsrl.vi v8, v8, 2
2588 ; CHECK-NEXT: vand.vx v8, v8, a0
2589 ; CHECK-NEXT: vadd.vv v8, v9, v8
2590 ; CHECK-NEXT: vsrl.vi v9, v8, 4
2591 ; CHECK-NEXT: vadd.vv v8, v8, v9
2592 ; CHECK-NEXT: lui a0, 1
2593 ; CHECK-NEXT: addi a0, a0, -241
2594 ; CHECK-NEXT: vand.vx v8, v8, a0
2595 ; CHECK-NEXT: li a0, 257
2596 ; CHECK-NEXT: vmul.vx v8, v8, a0
2597 ; CHECK-NEXT: vsrl.vi v8, v8, 8
2599 %v = call <4 x i16> @llvm.vp.cttz.v4i16(<4 x i16> %va, i1 true, <4 x i1> splat (i1 true), i32 %evl)
2603 define <8 x i16> @vp_cttz_zero_undef_v8i16(<8 x i16> %va, <8 x i1> %m, i32 zeroext %evl) {
2604 ; CHECK-LABEL: vp_cttz_zero_undef_v8i16:
2606 ; CHECK-NEXT: li a1, 1
2607 ; CHECK-NEXT: vsetvli zero, a0, e16, m1, ta, ma
2608 ; CHECK-NEXT: vsub.vx v9, v8, a1, v0.t
2609 ; CHECK-NEXT: vnot.v v8, v8, v0.t
2610 ; CHECK-NEXT: vand.vv v8, v8, v9, v0.t
2611 ; CHECK-NEXT: vsrl.vi v9, v8, 1, v0.t
2612 ; CHECK-NEXT: lui a0, 5
2613 ; CHECK-NEXT: addi a0, a0, 1365
2614 ; CHECK-NEXT: vand.vx v9, v9, a0, v0.t
2615 ; CHECK-NEXT: vsub.vv v8, v8, v9, v0.t
2616 ; CHECK-NEXT: lui a0, 3
2617 ; CHECK-NEXT: addi a0, a0, 819
2618 ; CHECK-NEXT: vand.vx v9, v8, a0, v0.t
2619 ; CHECK-NEXT: vsrl.vi v8, v8, 2, v0.t
2620 ; CHECK-NEXT: vand.vx v8, v8, a0, v0.t
2621 ; CHECK-NEXT: vadd.vv v8, v9, v8, v0.t
2622 ; CHECK-NEXT: vsrl.vi v9, v8, 4, v0.t
2623 ; CHECK-NEXT: vadd.vv v8, v8, v9, v0.t
2624 ; CHECK-NEXT: lui a0, 1
2625 ; CHECK-NEXT: addi a0, a0, -241
2626 ; CHECK-NEXT: vand.vx v8, v8, a0, v0.t
2627 ; CHECK-NEXT: li a0, 257
2628 ; CHECK-NEXT: vmul.vx v8, v8, a0, v0.t
2629 ; CHECK-NEXT: vsrl.vi v8, v8, 8, v0.t
2631 %v = call <8 x i16> @llvm.vp.cttz.v8i16(<8 x i16> %va, i1 true, <8 x i1> %m, i32 %evl)
2635 define <8 x i16> @vp_cttz_zero_undef_v8i16_unmasked(<8 x i16> %va, i32 zeroext %evl) {
2636 ; CHECK-LABEL: vp_cttz_zero_undef_v8i16_unmasked:
2638 ; CHECK-NEXT: li a1, 1
2639 ; CHECK-NEXT: vsetvli zero, a0, e16, m1, ta, ma
2640 ; CHECK-NEXT: vsub.vx v9, v8, a1
2641 ; CHECK-NEXT: vnot.v v8, v8
2642 ; CHECK-NEXT: vand.vv v8, v8, v9
2643 ; CHECK-NEXT: vsrl.vi v9, v8, 1
2644 ; CHECK-NEXT: lui a0, 5
2645 ; CHECK-NEXT: addi a0, a0, 1365
2646 ; CHECK-NEXT: vand.vx v9, v9, a0
2647 ; CHECK-NEXT: vsub.vv v8, v8, v9
2648 ; CHECK-NEXT: lui a0, 3
2649 ; CHECK-NEXT: addi a0, a0, 819
2650 ; CHECK-NEXT: vand.vx v9, v8, a0
2651 ; CHECK-NEXT: vsrl.vi v8, v8, 2
2652 ; CHECK-NEXT: vand.vx v8, v8, a0
2653 ; CHECK-NEXT: vadd.vv v8, v9, v8
2654 ; CHECK-NEXT: vsrl.vi v9, v8, 4
2655 ; CHECK-NEXT: vadd.vv v8, v8, v9
2656 ; CHECK-NEXT: lui a0, 1
2657 ; CHECK-NEXT: addi a0, a0, -241
2658 ; CHECK-NEXT: vand.vx v8, v8, a0
2659 ; CHECK-NEXT: li a0, 257
2660 ; CHECK-NEXT: vmul.vx v8, v8, a0
2661 ; CHECK-NEXT: vsrl.vi v8, v8, 8
2663 %v = call <8 x i16> @llvm.vp.cttz.v8i16(<8 x i16> %va, i1 true, <8 x i1> splat (i1 true), i32 %evl)
2667 define <16 x i16> @vp_cttz_zero_undef_v16i16(<16 x i16> %va, <16 x i1> %m, i32 zeroext %evl) {
2668 ; CHECK-LABEL: vp_cttz_zero_undef_v16i16:
2670 ; CHECK-NEXT: li a1, 1
2671 ; CHECK-NEXT: vsetvli zero, a0, e16, m2, ta, ma
2672 ; CHECK-NEXT: vsub.vx v10, v8, a1, v0.t
2673 ; CHECK-NEXT: vnot.v v8, v8, v0.t
2674 ; CHECK-NEXT: vand.vv v8, v8, v10, v0.t
2675 ; CHECK-NEXT: vsrl.vi v10, v8, 1, v0.t
2676 ; CHECK-NEXT: lui a0, 5
2677 ; CHECK-NEXT: addi a0, a0, 1365
2678 ; CHECK-NEXT: vand.vx v10, v10, a0, v0.t
2679 ; CHECK-NEXT: vsub.vv v8, v8, v10, v0.t
2680 ; CHECK-NEXT: lui a0, 3
2681 ; CHECK-NEXT: addi a0, a0, 819
2682 ; CHECK-NEXT: vand.vx v10, v8, a0, v0.t
2683 ; CHECK-NEXT: vsrl.vi v8, v8, 2, v0.t
2684 ; CHECK-NEXT: vand.vx v8, v8, a0, v0.t
2685 ; CHECK-NEXT: vadd.vv v8, v10, v8, v0.t
2686 ; CHECK-NEXT: vsrl.vi v10, v8, 4, v0.t
2687 ; CHECK-NEXT: vadd.vv v8, v8, v10, v0.t
2688 ; CHECK-NEXT: lui a0, 1
2689 ; CHECK-NEXT: addi a0, a0, -241
2690 ; CHECK-NEXT: vand.vx v8, v8, a0, v0.t
2691 ; CHECK-NEXT: li a0, 257
2692 ; CHECK-NEXT: vmul.vx v8, v8, a0, v0.t
2693 ; CHECK-NEXT: vsrl.vi v8, v8, 8, v0.t
2695 %v = call <16 x i16> @llvm.vp.cttz.v16i16(<16 x i16> %va, i1 true, <16 x i1> %m, i32 %evl)
2699 define <16 x i16> @vp_cttz_zero_undef_v16i16_unmasked(<16 x i16> %va, i32 zeroext %evl) {
2700 ; CHECK-LABEL: vp_cttz_zero_undef_v16i16_unmasked:
2702 ; CHECK-NEXT: li a1, 1
2703 ; CHECK-NEXT: vsetvli zero, a0, e16, m2, ta, ma
2704 ; CHECK-NEXT: vsub.vx v10, v8, a1
2705 ; CHECK-NEXT: vnot.v v8, v8
2706 ; CHECK-NEXT: vand.vv v8, v8, v10
2707 ; CHECK-NEXT: vsrl.vi v10, v8, 1
2708 ; CHECK-NEXT: lui a0, 5
2709 ; CHECK-NEXT: addi a0, a0, 1365
2710 ; CHECK-NEXT: vand.vx v10, v10, a0
2711 ; CHECK-NEXT: vsub.vv v8, v8, v10
2712 ; CHECK-NEXT: lui a0, 3
2713 ; CHECK-NEXT: addi a0, a0, 819
2714 ; CHECK-NEXT: vand.vx v10, v8, a0
2715 ; CHECK-NEXT: vsrl.vi v8, v8, 2
2716 ; CHECK-NEXT: vand.vx v8, v8, a0
2717 ; CHECK-NEXT: vadd.vv v8, v10, v8
2718 ; CHECK-NEXT: vsrl.vi v10, v8, 4
2719 ; CHECK-NEXT: vadd.vv v8, v8, v10
2720 ; CHECK-NEXT: lui a0, 1
2721 ; CHECK-NEXT: addi a0, a0, -241
2722 ; CHECK-NEXT: vand.vx v8, v8, a0
2723 ; CHECK-NEXT: li a0, 257
2724 ; CHECK-NEXT: vmul.vx v8, v8, a0
2725 ; CHECK-NEXT: vsrl.vi v8, v8, 8
2727 %v = call <16 x i16> @llvm.vp.cttz.v16i16(<16 x i16> %va, i1 true, <16 x i1> splat (i1 true), i32 %evl)
2731 define <2 x i32> @vp_cttz_zero_undef_v2i32(<2 x i32> %va, <2 x i1> %m, i32 zeroext %evl) {
2732 ; CHECK-LABEL: vp_cttz_zero_undef_v2i32:
2734 ; CHECK-NEXT: li a1, 1
2735 ; CHECK-NEXT: vsetvli zero, a0, e32, mf2, ta, ma
2736 ; CHECK-NEXT: vsub.vx v9, v8, a1, v0.t
2737 ; CHECK-NEXT: vnot.v v8, v8, v0.t
2738 ; CHECK-NEXT: vand.vv v8, v8, v9, v0.t
2739 ; CHECK-NEXT: vsrl.vi v9, v8, 1, v0.t
2740 ; CHECK-NEXT: lui a0, 349525
2741 ; CHECK-NEXT: addi a0, a0, 1365
2742 ; CHECK-NEXT: vand.vx v9, v9, a0, v0.t
2743 ; CHECK-NEXT: vsub.vv v8, v8, v9, v0.t
2744 ; CHECK-NEXT: lui a0, 209715
2745 ; CHECK-NEXT: addi a0, a0, 819
2746 ; CHECK-NEXT: vand.vx v9, v8, a0, v0.t
2747 ; CHECK-NEXT: vsrl.vi v8, v8, 2, v0.t
2748 ; CHECK-NEXT: vand.vx v8, v8, a0, v0.t
2749 ; CHECK-NEXT: vadd.vv v8, v9, v8, v0.t
2750 ; CHECK-NEXT: vsrl.vi v9, v8, 4, v0.t
2751 ; CHECK-NEXT: vadd.vv v8, v8, v9, v0.t
2752 ; CHECK-NEXT: lui a0, 61681
2753 ; CHECK-NEXT: addi a0, a0, -241
2754 ; CHECK-NEXT: vand.vx v8, v8, a0, v0.t
2755 ; CHECK-NEXT: lui a0, 4112
2756 ; CHECK-NEXT: addi a0, a0, 257
2757 ; CHECK-NEXT: vmul.vx v8, v8, a0, v0.t
2758 ; CHECK-NEXT: vsrl.vi v8, v8, 24, v0.t
2760 %v = call <2 x i32> @llvm.vp.cttz.v2i32(<2 x i32> %va, i1 true, <2 x i1> %m, i32 %evl)
2764 define <2 x i32> @vp_cttz_zero_undef_v2i32_unmasked(<2 x i32> %va, i32 zeroext %evl) {
2765 ; CHECK-LABEL: vp_cttz_zero_undef_v2i32_unmasked:
2767 ; CHECK-NEXT: li a1, 1
2768 ; CHECK-NEXT: vsetvli zero, a0, e32, mf2, ta, ma
2769 ; CHECK-NEXT: vsub.vx v9, v8, a1
2770 ; CHECK-NEXT: vnot.v v8, v8
2771 ; CHECK-NEXT: vand.vv v8, v8, v9
2772 ; CHECK-NEXT: vsrl.vi v9, v8, 1
2773 ; CHECK-NEXT: lui a0, 349525
2774 ; CHECK-NEXT: addi a0, a0, 1365
2775 ; CHECK-NEXT: vand.vx v9, v9, a0
2776 ; CHECK-NEXT: vsub.vv v8, v8, v9
2777 ; CHECK-NEXT: lui a0, 209715
2778 ; CHECK-NEXT: addi a0, a0, 819
2779 ; CHECK-NEXT: vand.vx v9, v8, a0
2780 ; CHECK-NEXT: vsrl.vi v8, v8, 2
2781 ; CHECK-NEXT: vand.vx v8, v8, a0
2782 ; CHECK-NEXT: vadd.vv v8, v9, v8
2783 ; CHECK-NEXT: vsrl.vi v9, v8, 4
2784 ; CHECK-NEXT: vadd.vv v8, v8, v9
2785 ; CHECK-NEXT: lui a0, 61681
2786 ; CHECK-NEXT: addi a0, a0, -241
2787 ; CHECK-NEXT: vand.vx v8, v8, a0
2788 ; CHECK-NEXT: lui a0, 4112
2789 ; CHECK-NEXT: addi a0, a0, 257
2790 ; CHECK-NEXT: vmul.vx v8, v8, a0
2791 ; CHECK-NEXT: vsrl.vi v8, v8, 24
2793 %v = call <2 x i32> @llvm.vp.cttz.v2i32(<2 x i32> %va, i1 true, <2 x i1> splat (i1 true), i32 %evl)
2797 define <4 x i32> @vp_cttz_zero_undef_v4i32(<4 x i32> %va, <4 x i1> %m, i32 zeroext %evl) {
2798 ; CHECK-LABEL: vp_cttz_zero_undef_v4i32:
2800 ; CHECK-NEXT: li a1, 1
2801 ; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma
2802 ; CHECK-NEXT: vsub.vx v9, v8, a1, v0.t
2803 ; CHECK-NEXT: vnot.v v8, v8, v0.t
2804 ; CHECK-NEXT: vand.vv v8, v8, v9, v0.t
2805 ; CHECK-NEXT: vsrl.vi v9, v8, 1, v0.t
2806 ; CHECK-NEXT: lui a0, 349525
2807 ; CHECK-NEXT: addi a0, a0, 1365
2808 ; CHECK-NEXT: vand.vx v9, v9, a0, v0.t
2809 ; CHECK-NEXT: vsub.vv v8, v8, v9, v0.t
2810 ; CHECK-NEXT: lui a0, 209715
2811 ; CHECK-NEXT: addi a0, a0, 819
2812 ; CHECK-NEXT: vand.vx v9, v8, a0, v0.t
2813 ; CHECK-NEXT: vsrl.vi v8, v8, 2, v0.t
2814 ; CHECK-NEXT: vand.vx v8, v8, a0, v0.t
2815 ; CHECK-NEXT: vadd.vv v8, v9, v8, v0.t
2816 ; CHECK-NEXT: vsrl.vi v9, v8, 4, v0.t
2817 ; CHECK-NEXT: vadd.vv v8, v8, v9, v0.t
2818 ; CHECK-NEXT: lui a0, 61681
2819 ; CHECK-NEXT: addi a0, a0, -241
2820 ; CHECK-NEXT: vand.vx v8, v8, a0, v0.t
2821 ; CHECK-NEXT: lui a0, 4112
2822 ; CHECK-NEXT: addi a0, a0, 257
2823 ; CHECK-NEXT: vmul.vx v8, v8, a0, v0.t
2824 ; CHECK-NEXT: vsrl.vi v8, v8, 24, v0.t
2826 %v = call <4 x i32> @llvm.vp.cttz.v4i32(<4 x i32> %va, i1 true, <4 x i1> %m, i32 %evl)
2830 define <4 x i32> @vp_cttz_zero_undef_v4i32_unmasked(<4 x i32> %va, i32 zeroext %evl) {
2831 ; CHECK-LABEL: vp_cttz_zero_undef_v4i32_unmasked:
2833 ; CHECK-NEXT: li a1, 1
2834 ; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma
2835 ; CHECK-NEXT: vsub.vx v9, v8, a1
2836 ; CHECK-NEXT: vnot.v v8, v8
2837 ; CHECK-NEXT: vand.vv v8, v8, v9
2838 ; CHECK-NEXT: vsrl.vi v9, v8, 1
2839 ; CHECK-NEXT: lui a0, 349525
2840 ; CHECK-NEXT: addi a0, a0, 1365
2841 ; CHECK-NEXT: vand.vx v9, v9, a0
2842 ; CHECK-NEXT: vsub.vv v8, v8, v9
2843 ; CHECK-NEXT: lui a0, 209715
2844 ; CHECK-NEXT: addi a0, a0, 819
2845 ; CHECK-NEXT: vand.vx v9, v8, a0
2846 ; CHECK-NEXT: vsrl.vi v8, v8, 2
2847 ; CHECK-NEXT: vand.vx v8, v8, a0
2848 ; CHECK-NEXT: vadd.vv v8, v9, v8
2849 ; CHECK-NEXT: vsrl.vi v9, v8, 4
2850 ; CHECK-NEXT: vadd.vv v8, v8, v9
2851 ; CHECK-NEXT: lui a0, 61681
2852 ; CHECK-NEXT: addi a0, a0, -241
2853 ; CHECK-NEXT: vand.vx v8, v8, a0
2854 ; CHECK-NEXT: lui a0, 4112
2855 ; CHECK-NEXT: addi a0, a0, 257
2856 ; CHECK-NEXT: vmul.vx v8, v8, a0
2857 ; CHECK-NEXT: vsrl.vi v8, v8, 24
2859 %v = call <4 x i32> @llvm.vp.cttz.v4i32(<4 x i32> %va, i1 true, <4 x i1> splat (i1 true), i32 %evl)
2863 define <8 x i32> @vp_cttz_zero_undef_v8i32(<8 x i32> %va, <8 x i1> %m, i32 zeroext %evl) {
2864 ; CHECK-LABEL: vp_cttz_zero_undef_v8i32:
2866 ; CHECK-NEXT: li a1, 1
2867 ; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, ma
2868 ; CHECK-NEXT: vsub.vx v10, v8, a1, v0.t
2869 ; CHECK-NEXT: vnot.v v8, v8, v0.t
2870 ; CHECK-NEXT: vand.vv v8, v8, v10, v0.t
2871 ; CHECK-NEXT: vsrl.vi v10, v8, 1, v0.t
2872 ; CHECK-NEXT: lui a0, 349525
2873 ; CHECK-NEXT: addi a0, a0, 1365
2874 ; CHECK-NEXT: vand.vx v10, v10, a0, v0.t
2875 ; CHECK-NEXT: vsub.vv v8, v8, v10, v0.t
2876 ; CHECK-NEXT: lui a0, 209715
2877 ; CHECK-NEXT: addi a0, a0, 819
2878 ; CHECK-NEXT: vand.vx v10, v8, a0, v0.t
2879 ; CHECK-NEXT: vsrl.vi v8, v8, 2, v0.t
2880 ; CHECK-NEXT: vand.vx v8, v8, a0, v0.t
2881 ; CHECK-NEXT: vadd.vv v8, v10, v8, v0.t
2882 ; CHECK-NEXT: vsrl.vi v10, v8, 4, v0.t
2883 ; CHECK-NEXT: vadd.vv v8, v8, v10, v0.t
2884 ; CHECK-NEXT: lui a0, 61681
2885 ; CHECK-NEXT: addi a0, a0, -241
2886 ; CHECK-NEXT: vand.vx v8, v8, a0, v0.t
2887 ; CHECK-NEXT: lui a0, 4112
2888 ; CHECK-NEXT: addi a0, a0, 257
2889 ; CHECK-NEXT: vmul.vx v8, v8, a0, v0.t
2890 ; CHECK-NEXT: vsrl.vi v8, v8, 24, v0.t
2892 %v = call <8 x i32> @llvm.vp.cttz.v8i32(<8 x i32> %va, i1 true, <8 x i1> %m, i32 %evl)
2896 define <8 x i32> @vp_cttz_zero_undef_v8i32_unmasked(<8 x i32> %va, i32 zeroext %evl) {
2897 ; CHECK-LABEL: vp_cttz_zero_undef_v8i32_unmasked:
2899 ; CHECK-NEXT: li a1, 1
2900 ; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, ma
2901 ; CHECK-NEXT: vsub.vx v10, v8, a1
2902 ; CHECK-NEXT: vnot.v v8, v8
2903 ; CHECK-NEXT: vand.vv v8, v8, v10
2904 ; CHECK-NEXT: vsrl.vi v10, v8, 1
2905 ; CHECK-NEXT: lui a0, 349525
2906 ; CHECK-NEXT: addi a0, a0, 1365
2907 ; CHECK-NEXT: vand.vx v10, v10, a0
2908 ; CHECK-NEXT: vsub.vv v8, v8, v10
2909 ; CHECK-NEXT: lui a0, 209715
2910 ; CHECK-NEXT: addi a0, a0, 819
2911 ; CHECK-NEXT: vand.vx v10, v8, a0
2912 ; CHECK-NEXT: vsrl.vi v8, v8, 2
2913 ; CHECK-NEXT: vand.vx v8, v8, a0
2914 ; CHECK-NEXT: vadd.vv v8, v10, v8
2915 ; CHECK-NEXT: vsrl.vi v10, v8, 4
2916 ; CHECK-NEXT: vadd.vv v8, v8, v10
2917 ; CHECK-NEXT: lui a0, 61681
2918 ; CHECK-NEXT: addi a0, a0, -241
2919 ; CHECK-NEXT: vand.vx v8, v8, a0
2920 ; CHECK-NEXT: lui a0, 4112
2921 ; CHECK-NEXT: addi a0, a0, 257
2922 ; CHECK-NEXT: vmul.vx v8, v8, a0
2923 ; CHECK-NEXT: vsrl.vi v8, v8, 24
2925 %v = call <8 x i32> @llvm.vp.cttz.v8i32(<8 x i32> %va, i1 true, <8 x i1> splat (i1 true), i32 %evl)
2929 define <16 x i32> @vp_cttz_zero_undef_v16i32(<16 x i32> %va, <16 x i1> %m, i32 zeroext %evl) {
2930 ; CHECK-LABEL: vp_cttz_zero_undef_v16i32:
2932 ; CHECK-NEXT: li a1, 1
2933 ; CHECK-NEXT: vsetvli zero, a0, e32, m4, ta, ma
2934 ; CHECK-NEXT: vsub.vx v12, v8, a1, v0.t
2935 ; CHECK-NEXT: vnot.v v8, v8, v0.t
2936 ; CHECK-NEXT: vand.vv v8, v8, v12, v0.t
2937 ; CHECK-NEXT: vsrl.vi v12, v8, 1, v0.t
2938 ; CHECK-NEXT: lui a0, 349525
2939 ; CHECK-NEXT: addi a0, a0, 1365
2940 ; CHECK-NEXT: vand.vx v12, v12, a0, v0.t
2941 ; CHECK-NEXT: vsub.vv v8, v8, v12, v0.t
2942 ; CHECK-NEXT: lui a0, 209715
2943 ; CHECK-NEXT: addi a0, a0, 819
2944 ; CHECK-NEXT: vand.vx v12, v8, a0, v0.t
2945 ; CHECK-NEXT: vsrl.vi v8, v8, 2, v0.t
2946 ; CHECK-NEXT: vand.vx v8, v8, a0, v0.t
2947 ; CHECK-NEXT: vadd.vv v8, v12, v8, v0.t
2948 ; CHECK-NEXT: vsrl.vi v12, v8, 4, v0.t
2949 ; CHECK-NEXT: vadd.vv v8, v8, v12, v0.t
2950 ; CHECK-NEXT: lui a0, 61681
2951 ; CHECK-NEXT: addi a0, a0, -241
2952 ; CHECK-NEXT: vand.vx v8, v8, a0, v0.t
2953 ; CHECK-NEXT: lui a0, 4112
2954 ; CHECK-NEXT: addi a0, a0, 257
2955 ; CHECK-NEXT: vmul.vx v8, v8, a0, v0.t
2956 ; CHECK-NEXT: vsrl.vi v8, v8, 24, v0.t
2958 %v = call <16 x i32> @llvm.vp.cttz.v16i32(<16 x i32> %va, i1 true, <16 x i1> %m, i32 %evl)
2962 define <16 x i32> @vp_cttz_zero_undef_v16i32_unmasked(<16 x i32> %va, i32 zeroext %evl) {
2963 ; CHECK-LABEL: vp_cttz_zero_undef_v16i32_unmasked:
2965 ; CHECK-NEXT: li a1, 1
2966 ; CHECK-NEXT: vsetvli zero, a0, e32, m4, ta, ma
2967 ; CHECK-NEXT: vsub.vx v12, v8, a1
2968 ; CHECK-NEXT: vnot.v v8, v8
2969 ; CHECK-NEXT: vand.vv v8, v8, v12
2970 ; CHECK-NEXT: vsrl.vi v12, v8, 1
2971 ; CHECK-NEXT: lui a0, 349525
2972 ; CHECK-NEXT: addi a0, a0, 1365
2973 ; CHECK-NEXT: vand.vx v12, v12, a0
2974 ; CHECK-NEXT: vsub.vv v8, v8, v12
2975 ; CHECK-NEXT: lui a0, 209715
2976 ; CHECK-NEXT: addi a0, a0, 819
2977 ; CHECK-NEXT: vand.vx v12, v8, a0
2978 ; CHECK-NEXT: vsrl.vi v8, v8, 2
2979 ; CHECK-NEXT: vand.vx v8, v8, a0
2980 ; CHECK-NEXT: vadd.vv v8, v12, v8
2981 ; CHECK-NEXT: vsrl.vi v12, v8, 4
2982 ; CHECK-NEXT: vadd.vv v8, v8, v12
2983 ; CHECK-NEXT: lui a0, 61681
2984 ; CHECK-NEXT: addi a0, a0, -241
2985 ; CHECK-NEXT: vand.vx v8, v8, a0
2986 ; CHECK-NEXT: lui a0, 4112
2987 ; CHECK-NEXT: addi a0, a0, 257
2988 ; CHECK-NEXT: vmul.vx v8, v8, a0
2989 ; CHECK-NEXT: vsrl.vi v8, v8, 24
2991 %v = call <16 x i32> @llvm.vp.cttz.v16i32(<16 x i32> %va, i1 true, <16 x i1> splat (i1 true), i32 %evl)
2995 define <2 x i64> @vp_cttz_zero_undef_v2i64(<2 x i64> %va, <2 x i1> %m, i32 zeroext %evl) {
2996 ; RV32-LABEL: vp_cttz_zero_undef_v2i64:
2998 ; RV32-NEXT: li a1, 1
2999 ; RV32-NEXT: vsetvli zero, a0, e64, m1, ta, ma
3000 ; RV32-NEXT: vsub.vx v9, v8, a1, v0.t
3001 ; RV32-NEXT: vnot.v v8, v8, v0.t
3002 ; RV32-NEXT: vand.vv v8, v8, v9, v0.t
3003 ; RV32-NEXT: vsrl.vi v9, v8, 1, v0.t
3004 ; RV32-NEXT: lui a1, 349525
3005 ; RV32-NEXT: addi a1, a1, 1365
3006 ; RV32-NEXT: vsetivli zero, 4, e32, m1, ta, ma
3007 ; RV32-NEXT: vmv.v.x v10, a1
3008 ; RV32-NEXT: vsetvli zero, a0, e64, m1, ta, ma
3009 ; RV32-NEXT: vand.vv v9, v9, v10, v0.t
3010 ; RV32-NEXT: vsub.vv v8, v8, v9, v0.t
3011 ; RV32-NEXT: lui a1, 209715
3012 ; RV32-NEXT: addi a1, a1, 819
3013 ; RV32-NEXT: vsetivli zero, 4, e32, m1, ta, ma
3014 ; RV32-NEXT: vmv.v.x v9, a1
3015 ; RV32-NEXT: vsetvli zero, a0, e64, m1, ta, ma
3016 ; RV32-NEXT: vand.vv v10, v8, v9, v0.t
3017 ; RV32-NEXT: vsrl.vi v8, v8, 2, v0.t
3018 ; RV32-NEXT: vand.vv v8, v8, v9, v0.t
3019 ; RV32-NEXT: vadd.vv v8, v10, v8, v0.t
3020 ; RV32-NEXT: vsrl.vi v9, v8, 4, v0.t
3021 ; RV32-NEXT: vadd.vv v8, v8, v9, v0.t
3022 ; RV32-NEXT: lui a1, 61681
3023 ; RV32-NEXT: addi a1, a1, -241
3024 ; RV32-NEXT: vsetivli zero, 4, e32, m1, ta, ma
3025 ; RV32-NEXT: vmv.v.x v9, a1
3026 ; RV32-NEXT: vsetvli zero, a0, e64, m1, ta, ma
3027 ; RV32-NEXT: vand.vv v8, v8, v9, v0.t
3028 ; RV32-NEXT: lui a1, 4112
3029 ; RV32-NEXT: addi a1, a1, 257
3030 ; RV32-NEXT: vsetivli zero, 4, e32, m1, ta, ma
3031 ; RV32-NEXT: vmv.v.x v9, a1
3032 ; RV32-NEXT: vsetvli zero, a0, e64, m1, ta, ma
3033 ; RV32-NEXT: vmul.vv v8, v8, v9, v0.t
3034 ; RV32-NEXT: li a0, 56
3035 ; RV32-NEXT: vsrl.vx v8, v8, a0, v0.t
3038 ; RV64-LABEL: vp_cttz_zero_undef_v2i64:
3040 ; RV64-NEXT: li a1, 1
3041 ; RV64-NEXT: vsetvli zero, a0, e64, m1, ta, ma
3042 ; RV64-NEXT: vsub.vx v9, v8, a1, v0.t
3043 ; RV64-NEXT: vnot.v v8, v8, v0.t
3044 ; RV64-NEXT: vand.vv v8, v8, v9, v0.t
3045 ; RV64-NEXT: vsrl.vi v9, v8, 1, v0.t
3046 ; RV64-NEXT: lui a0, 349525
3047 ; RV64-NEXT: addiw a0, a0, 1365
3048 ; RV64-NEXT: slli a1, a0, 32
3049 ; RV64-NEXT: add a0, a0, a1
3050 ; RV64-NEXT: vand.vx v9, v9, a0, v0.t
3051 ; RV64-NEXT: vsub.vv v8, v8, v9, v0.t
3052 ; RV64-NEXT: lui a0, 209715
3053 ; RV64-NEXT: addiw a0, a0, 819
3054 ; RV64-NEXT: slli a1, a0, 32
3055 ; RV64-NEXT: add a0, a0, a1
3056 ; RV64-NEXT: vand.vx v9, v8, a0, v0.t
3057 ; RV64-NEXT: vsrl.vi v8, v8, 2, v0.t
3058 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
3059 ; RV64-NEXT: vadd.vv v8, v9, v8, v0.t
3060 ; RV64-NEXT: vsrl.vi v9, v8, 4, v0.t
3061 ; RV64-NEXT: vadd.vv v8, v8, v9, v0.t
3062 ; RV64-NEXT: lui a0, 61681
3063 ; RV64-NEXT: addiw a0, a0, -241
3064 ; RV64-NEXT: slli a1, a0, 32
3065 ; RV64-NEXT: add a0, a0, a1
3066 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
3067 ; RV64-NEXT: lui a0, 4112
3068 ; RV64-NEXT: addiw a0, a0, 257
3069 ; RV64-NEXT: slli a1, a0, 32
3070 ; RV64-NEXT: add a0, a0, a1
3071 ; RV64-NEXT: vmul.vx v8, v8, a0, v0.t
3072 ; RV64-NEXT: li a0, 56
3073 ; RV64-NEXT: vsrl.vx v8, v8, a0, v0.t
3075 %v = call <2 x i64> @llvm.vp.cttz.v2i64(<2 x i64> %va, i1 true, <2 x i1> %m, i32 %evl)
3079 define <2 x i64> @vp_cttz_zero_undef_v2i64_unmasked(<2 x i64> %va, i32 zeroext %evl) {
3080 ; RV32-LABEL: vp_cttz_zero_undef_v2i64_unmasked:
3082 ; RV32-NEXT: li a1, 1
3083 ; RV32-NEXT: vsetvli zero, a0, e64, m1, ta, ma
3084 ; RV32-NEXT: vsub.vx v9, v8, a1
3085 ; RV32-NEXT: vnot.v v8, v8
3086 ; RV32-NEXT: vand.vv v8, v8, v9
3087 ; RV32-NEXT: vsrl.vi v9, v8, 1
3088 ; RV32-NEXT: lui a1, 349525
3089 ; RV32-NEXT: addi a1, a1, 1365
3090 ; RV32-NEXT: vsetivli zero, 4, e32, m1, ta, ma
3091 ; RV32-NEXT: vmv.v.x v10, a1
3092 ; RV32-NEXT: vsetvli zero, a0, e64, m1, ta, ma
3093 ; RV32-NEXT: vand.vv v9, v9, v10
3094 ; RV32-NEXT: vsub.vv v8, v8, v9
3095 ; RV32-NEXT: lui a1, 209715
3096 ; RV32-NEXT: addi a1, a1, 819
3097 ; RV32-NEXT: vsetivli zero, 4, e32, m1, ta, ma
3098 ; RV32-NEXT: vmv.v.x v9, a1
3099 ; RV32-NEXT: vsetvli zero, a0, e64, m1, ta, ma
3100 ; RV32-NEXT: vand.vv v10, v8, v9
3101 ; RV32-NEXT: vsrl.vi v8, v8, 2
3102 ; RV32-NEXT: vand.vv v8, v8, v9
3103 ; RV32-NEXT: vadd.vv v8, v10, v8
3104 ; RV32-NEXT: vsrl.vi v9, v8, 4
3105 ; RV32-NEXT: vadd.vv v8, v8, v9
3106 ; RV32-NEXT: lui a1, 61681
3107 ; RV32-NEXT: addi a1, a1, -241
3108 ; RV32-NEXT: vsetivli zero, 4, e32, m1, ta, ma
3109 ; RV32-NEXT: vmv.v.x v9, a1
3110 ; RV32-NEXT: vsetvli zero, a0, e64, m1, ta, ma
3111 ; RV32-NEXT: vand.vv v8, v8, v9
3112 ; RV32-NEXT: lui a1, 4112
3113 ; RV32-NEXT: addi a1, a1, 257
3114 ; RV32-NEXT: vsetivli zero, 4, e32, m1, ta, ma
3115 ; RV32-NEXT: vmv.v.x v9, a1
3116 ; RV32-NEXT: vsetvli zero, a0, e64, m1, ta, ma
3117 ; RV32-NEXT: vmul.vv v8, v8, v9
3118 ; RV32-NEXT: li a0, 56
3119 ; RV32-NEXT: vsrl.vx v8, v8, a0
3122 ; RV64-LABEL: vp_cttz_zero_undef_v2i64_unmasked:
3124 ; RV64-NEXT: li a1, 1
3125 ; RV64-NEXT: vsetvli zero, a0, e64, m1, ta, ma
3126 ; RV64-NEXT: vsub.vx v9, v8, a1
3127 ; RV64-NEXT: vnot.v v8, v8
3128 ; RV64-NEXT: vand.vv v8, v8, v9
3129 ; RV64-NEXT: vsrl.vi v9, v8, 1
3130 ; RV64-NEXT: lui a0, 349525
3131 ; RV64-NEXT: addiw a0, a0, 1365
3132 ; RV64-NEXT: slli a1, a0, 32
3133 ; RV64-NEXT: add a0, a0, a1
3134 ; RV64-NEXT: vand.vx v9, v9, a0
3135 ; RV64-NEXT: vsub.vv v8, v8, v9
3136 ; RV64-NEXT: lui a0, 209715
3137 ; RV64-NEXT: addiw a0, a0, 819
3138 ; RV64-NEXT: slli a1, a0, 32
3139 ; RV64-NEXT: add a0, a0, a1
3140 ; RV64-NEXT: vand.vx v9, v8, a0
3141 ; RV64-NEXT: vsrl.vi v8, v8, 2
3142 ; RV64-NEXT: vand.vx v8, v8, a0
3143 ; RV64-NEXT: vadd.vv v8, v9, v8
3144 ; RV64-NEXT: vsrl.vi v9, v8, 4
3145 ; RV64-NEXT: vadd.vv v8, v8, v9
3146 ; RV64-NEXT: lui a0, 61681
3147 ; RV64-NEXT: addiw a0, a0, -241
3148 ; RV64-NEXT: slli a1, a0, 32
3149 ; RV64-NEXT: add a0, a0, a1
3150 ; RV64-NEXT: vand.vx v8, v8, a0
3151 ; RV64-NEXT: lui a0, 4112
3152 ; RV64-NEXT: addiw a0, a0, 257
3153 ; RV64-NEXT: slli a1, a0, 32
3154 ; RV64-NEXT: add a0, a0, a1
3155 ; RV64-NEXT: vmul.vx v8, v8, a0
3156 ; RV64-NEXT: li a0, 56
3157 ; RV64-NEXT: vsrl.vx v8, v8, a0
3159 %v = call <2 x i64> @llvm.vp.cttz.v2i64(<2 x i64> %va, i1 true, <2 x i1> splat (i1 true), i32 %evl)
3163 define <4 x i64> @vp_cttz_zero_undef_v4i64(<4 x i64> %va, <4 x i1> %m, i32 zeroext %evl) {
3164 ; RV32-LABEL: vp_cttz_zero_undef_v4i64:
3166 ; RV32-NEXT: li a1, 1
3167 ; RV32-NEXT: vsetvli zero, a0, e64, m2, ta, ma
3168 ; RV32-NEXT: vsub.vx v10, v8, a1, v0.t
3169 ; RV32-NEXT: vnot.v v8, v8, v0.t
3170 ; RV32-NEXT: vand.vv v8, v8, v10, v0.t
3171 ; RV32-NEXT: vsrl.vi v10, v8, 1, v0.t
3172 ; RV32-NEXT: lui a1, 349525
3173 ; RV32-NEXT: addi a1, a1, 1365
3174 ; RV32-NEXT: vsetivli zero, 8, e32, m2, ta, ma
3175 ; RV32-NEXT: vmv.v.x v12, a1
3176 ; RV32-NEXT: vsetvli zero, a0, e64, m2, ta, ma
3177 ; RV32-NEXT: vand.vv v10, v10, v12, v0.t
3178 ; RV32-NEXT: vsub.vv v8, v8, v10, v0.t
3179 ; RV32-NEXT: lui a1, 209715
3180 ; RV32-NEXT: addi a1, a1, 819
3181 ; RV32-NEXT: vsetivli zero, 8, e32, m2, ta, ma
3182 ; RV32-NEXT: vmv.v.x v10, a1
3183 ; RV32-NEXT: vsetvli zero, a0, e64, m2, ta, ma
3184 ; RV32-NEXT: vand.vv v12, v8, v10, v0.t
3185 ; RV32-NEXT: vsrl.vi v8, v8, 2, v0.t
3186 ; RV32-NEXT: vand.vv v8, v8, v10, v0.t
3187 ; RV32-NEXT: vadd.vv v8, v12, v8, v0.t
3188 ; RV32-NEXT: vsrl.vi v10, v8, 4, v0.t
3189 ; RV32-NEXT: vadd.vv v8, v8, v10, v0.t
3190 ; RV32-NEXT: lui a1, 61681
3191 ; RV32-NEXT: addi a1, a1, -241
3192 ; RV32-NEXT: vsetivli zero, 8, e32, m2, ta, ma
3193 ; RV32-NEXT: vmv.v.x v10, a1
3194 ; RV32-NEXT: vsetvli zero, a0, e64, m2, ta, ma
3195 ; RV32-NEXT: vand.vv v8, v8, v10, v0.t
3196 ; RV32-NEXT: lui a1, 4112
3197 ; RV32-NEXT: addi a1, a1, 257
3198 ; RV32-NEXT: vsetivli zero, 8, e32, m2, ta, ma
3199 ; RV32-NEXT: vmv.v.x v10, a1
3200 ; RV32-NEXT: vsetvli zero, a0, e64, m2, ta, ma
3201 ; RV32-NEXT: vmul.vv v8, v8, v10, v0.t
3202 ; RV32-NEXT: li a0, 56
3203 ; RV32-NEXT: vsrl.vx v8, v8, a0, v0.t
3206 ; RV64-LABEL: vp_cttz_zero_undef_v4i64:
3208 ; RV64-NEXT: li a1, 1
3209 ; RV64-NEXT: vsetvli zero, a0, e64, m2, ta, ma
3210 ; RV64-NEXT: vsub.vx v10, v8, a1, v0.t
3211 ; RV64-NEXT: vnot.v v8, v8, v0.t
3212 ; RV64-NEXT: vand.vv v8, v8, v10, v0.t
3213 ; RV64-NEXT: vsrl.vi v10, v8, 1, v0.t
3214 ; RV64-NEXT: lui a0, 349525
3215 ; RV64-NEXT: addiw a0, a0, 1365
3216 ; RV64-NEXT: slli a1, a0, 32
3217 ; RV64-NEXT: add a0, a0, a1
3218 ; RV64-NEXT: vand.vx v10, v10, a0, v0.t
3219 ; RV64-NEXT: vsub.vv v8, v8, v10, v0.t
3220 ; RV64-NEXT: lui a0, 209715
3221 ; RV64-NEXT: addiw a0, a0, 819
3222 ; RV64-NEXT: slli a1, a0, 32
3223 ; RV64-NEXT: add a0, a0, a1
3224 ; RV64-NEXT: vand.vx v10, v8, a0, v0.t
3225 ; RV64-NEXT: vsrl.vi v8, v8, 2, v0.t
3226 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
3227 ; RV64-NEXT: vadd.vv v8, v10, v8, v0.t
3228 ; RV64-NEXT: vsrl.vi v10, v8, 4, v0.t
3229 ; RV64-NEXT: vadd.vv v8, v8, v10, v0.t
3230 ; RV64-NEXT: lui a0, 61681
3231 ; RV64-NEXT: addiw a0, a0, -241
3232 ; RV64-NEXT: slli a1, a0, 32
3233 ; RV64-NEXT: add a0, a0, a1
3234 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
3235 ; RV64-NEXT: lui a0, 4112
3236 ; RV64-NEXT: addiw a0, a0, 257
3237 ; RV64-NEXT: slli a1, a0, 32
3238 ; RV64-NEXT: add a0, a0, a1
3239 ; RV64-NEXT: vmul.vx v8, v8, a0, v0.t
3240 ; RV64-NEXT: li a0, 56
3241 ; RV64-NEXT: vsrl.vx v8, v8, a0, v0.t
3243 %v = call <4 x i64> @llvm.vp.cttz.v4i64(<4 x i64> %va, i1 true, <4 x i1> %m, i32 %evl)
3247 define <4 x i64> @vp_cttz_zero_undef_v4i64_unmasked(<4 x i64> %va, i32 zeroext %evl) {
3248 ; RV32-LABEL: vp_cttz_zero_undef_v4i64_unmasked:
3250 ; RV32-NEXT: li a1, 1
3251 ; RV32-NEXT: vsetvli zero, a0, e64, m2, ta, ma
3252 ; RV32-NEXT: vsub.vx v10, v8, a1
3253 ; RV32-NEXT: vnot.v v8, v8
3254 ; RV32-NEXT: vand.vv v8, v8, v10
3255 ; RV32-NEXT: vsrl.vi v10, v8, 1
3256 ; RV32-NEXT: lui a1, 349525
3257 ; RV32-NEXT: addi a1, a1, 1365
3258 ; RV32-NEXT: vsetivli zero, 8, e32, m2, ta, ma
3259 ; RV32-NEXT: vmv.v.x v12, a1
3260 ; RV32-NEXT: vsetvli zero, a0, e64, m2, ta, ma
3261 ; RV32-NEXT: vand.vv v10, v10, v12
3262 ; RV32-NEXT: vsub.vv v8, v8, v10
3263 ; RV32-NEXT: lui a1, 209715
3264 ; RV32-NEXT: addi a1, a1, 819
3265 ; RV32-NEXT: vsetivli zero, 8, e32, m2, ta, ma
3266 ; RV32-NEXT: vmv.v.x v10, a1
3267 ; RV32-NEXT: vsetvli zero, a0, e64, m2, ta, ma
3268 ; RV32-NEXT: vand.vv v12, v8, v10
3269 ; RV32-NEXT: vsrl.vi v8, v8, 2
3270 ; RV32-NEXT: vand.vv v8, v8, v10
3271 ; RV32-NEXT: vadd.vv v8, v12, v8
3272 ; RV32-NEXT: vsrl.vi v10, v8, 4
3273 ; RV32-NEXT: vadd.vv v8, v8, v10
3274 ; RV32-NEXT: lui a1, 61681
3275 ; RV32-NEXT: addi a1, a1, -241
3276 ; RV32-NEXT: vsetivli zero, 8, e32, m2, ta, ma
3277 ; RV32-NEXT: vmv.v.x v10, a1
3278 ; RV32-NEXT: vsetvli zero, a0, e64, m2, ta, ma
3279 ; RV32-NEXT: vand.vv v8, v8, v10
3280 ; RV32-NEXT: lui a1, 4112
3281 ; RV32-NEXT: addi a1, a1, 257
3282 ; RV32-NEXT: vsetivli zero, 8, e32, m2, ta, ma
3283 ; RV32-NEXT: vmv.v.x v10, a1
3284 ; RV32-NEXT: vsetvli zero, a0, e64, m2, ta, ma
3285 ; RV32-NEXT: vmul.vv v8, v8, v10
3286 ; RV32-NEXT: li a0, 56
3287 ; RV32-NEXT: vsrl.vx v8, v8, a0
3290 ; RV64-LABEL: vp_cttz_zero_undef_v4i64_unmasked:
3292 ; RV64-NEXT: li a1, 1
3293 ; RV64-NEXT: vsetvli zero, a0, e64, m2, ta, ma
3294 ; RV64-NEXT: vsub.vx v10, v8, a1
3295 ; RV64-NEXT: vnot.v v8, v8
3296 ; RV64-NEXT: vand.vv v8, v8, v10
3297 ; RV64-NEXT: vsrl.vi v10, v8, 1
3298 ; RV64-NEXT: lui a0, 349525
3299 ; RV64-NEXT: addiw a0, a0, 1365
3300 ; RV64-NEXT: slli a1, a0, 32
3301 ; RV64-NEXT: add a0, a0, a1
3302 ; RV64-NEXT: vand.vx v10, v10, a0
3303 ; RV64-NEXT: vsub.vv v8, v8, v10
3304 ; RV64-NEXT: lui a0, 209715
3305 ; RV64-NEXT: addiw a0, a0, 819
3306 ; RV64-NEXT: slli a1, a0, 32
3307 ; RV64-NEXT: add a0, a0, a1
3308 ; RV64-NEXT: vand.vx v10, v8, a0
3309 ; RV64-NEXT: vsrl.vi v8, v8, 2
3310 ; RV64-NEXT: vand.vx v8, v8, a0
3311 ; RV64-NEXT: vadd.vv v8, v10, v8
3312 ; RV64-NEXT: vsrl.vi v10, v8, 4
3313 ; RV64-NEXT: vadd.vv v8, v8, v10
3314 ; RV64-NEXT: lui a0, 61681
3315 ; RV64-NEXT: addiw a0, a0, -241
3316 ; RV64-NEXT: slli a1, a0, 32
3317 ; RV64-NEXT: add a0, a0, a1
3318 ; RV64-NEXT: vand.vx v8, v8, a0
3319 ; RV64-NEXT: lui a0, 4112
3320 ; RV64-NEXT: addiw a0, a0, 257
3321 ; RV64-NEXT: slli a1, a0, 32
3322 ; RV64-NEXT: add a0, a0, a1
3323 ; RV64-NEXT: vmul.vx v8, v8, a0
3324 ; RV64-NEXT: li a0, 56
3325 ; RV64-NEXT: vsrl.vx v8, v8, a0
3327 %v = call <4 x i64> @llvm.vp.cttz.v4i64(<4 x i64> %va, i1 true, <4 x i1> splat (i1 true), i32 %evl)
3331 define <8 x i64> @vp_cttz_zero_undef_v8i64(<8 x i64> %va, <8 x i1> %m, i32 zeroext %evl) {
3332 ; RV32-LABEL: vp_cttz_zero_undef_v8i64:
3334 ; RV32-NEXT: li a1, 1
3335 ; RV32-NEXT: vsetvli zero, a0, e64, m4, ta, ma
3336 ; RV32-NEXT: vsub.vx v12, v8, a1, v0.t
3337 ; RV32-NEXT: vnot.v v8, v8, v0.t
3338 ; RV32-NEXT: vand.vv v8, v8, v12, v0.t
3339 ; RV32-NEXT: vsrl.vi v12, v8, 1, v0.t
3340 ; RV32-NEXT: lui a1, 349525
3341 ; RV32-NEXT: addi a1, a1, 1365
3342 ; RV32-NEXT: vsetivli zero, 16, e32, m4, ta, ma
3343 ; RV32-NEXT: vmv.v.x v16, a1
3344 ; RV32-NEXT: vsetvli zero, a0, e64, m4, ta, ma
3345 ; RV32-NEXT: vand.vv v12, v12, v16, v0.t
3346 ; RV32-NEXT: vsub.vv v8, v8, v12, v0.t
3347 ; RV32-NEXT: lui a1, 209715
3348 ; RV32-NEXT: addi a1, a1, 819
3349 ; RV32-NEXT: vsetivli zero, 16, e32, m4, ta, ma
3350 ; RV32-NEXT: vmv.v.x v12, a1
3351 ; RV32-NEXT: vsetvli zero, a0, e64, m4, ta, ma
3352 ; RV32-NEXT: vand.vv v16, v8, v12, v0.t
3353 ; RV32-NEXT: vsrl.vi v8, v8, 2, v0.t
3354 ; RV32-NEXT: vand.vv v8, v8, v12, v0.t
3355 ; RV32-NEXT: vadd.vv v8, v16, v8, v0.t
3356 ; RV32-NEXT: vsrl.vi v12, v8, 4, v0.t
3357 ; RV32-NEXT: vadd.vv v8, v8, v12, v0.t
3358 ; RV32-NEXT: lui a1, 61681
3359 ; RV32-NEXT: addi a1, a1, -241
3360 ; RV32-NEXT: vsetivli zero, 16, e32, m4, ta, ma
3361 ; RV32-NEXT: vmv.v.x v12, a1
3362 ; RV32-NEXT: vsetvli zero, a0, e64, m4, ta, ma
3363 ; RV32-NEXT: vand.vv v8, v8, v12, v0.t
3364 ; RV32-NEXT: lui a1, 4112
3365 ; RV32-NEXT: addi a1, a1, 257
3366 ; RV32-NEXT: vsetivli zero, 16, e32, m4, ta, ma
3367 ; RV32-NEXT: vmv.v.x v12, a1
3368 ; RV32-NEXT: vsetvli zero, a0, e64, m4, ta, ma
3369 ; RV32-NEXT: vmul.vv v8, v8, v12, v0.t
3370 ; RV32-NEXT: li a0, 56
3371 ; RV32-NEXT: vsrl.vx v8, v8, a0, v0.t
3374 ; RV64-LABEL: vp_cttz_zero_undef_v8i64:
3376 ; RV64-NEXT: li a1, 1
3377 ; RV64-NEXT: vsetvli zero, a0, e64, m4, ta, ma
3378 ; RV64-NEXT: vsub.vx v12, v8, a1, v0.t
3379 ; RV64-NEXT: vnot.v v8, v8, v0.t
3380 ; RV64-NEXT: vand.vv v8, v8, v12, v0.t
3381 ; RV64-NEXT: vsrl.vi v12, v8, 1, v0.t
3382 ; RV64-NEXT: lui a0, 349525
3383 ; RV64-NEXT: addiw a0, a0, 1365
3384 ; RV64-NEXT: slli a1, a0, 32
3385 ; RV64-NEXT: add a0, a0, a1
3386 ; RV64-NEXT: vand.vx v12, v12, a0, v0.t
3387 ; RV64-NEXT: vsub.vv v8, v8, v12, v0.t
3388 ; RV64-NEXT: lui a0, 209715
3389 ; RV64-NEXT: addiw a0, a0, 819
3390 ; RV64-NEXT: slli a1, a0, 32
3391 ; RV64-NEXT: add a0, a0, a1
3392 ; RV64-NEXT: vand.vx v12, v8, a0, v0.t
3393 ; RV64-NEXT: vsrl.vi v8, v8, 2, v0.t
3394 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
3395 ; RV64-NEXT: vadd.vv v8, v12, v8, v0.t
3396 ; RV64-NEXT: vsrl.vi v12, v8, 4, v0.t
3397 ; RV64-NEXT: vadd.vv v8, v8, v12, v0.t
3398 ; RV64-NEXT: lui a0, 61681
3399 ; RV64-NEXT: addiw a0, a0, -241
3400 ; RV64-NEXT: slli a1, a0, 32
3401 ; RV64-NEXT: add a0, a0, a1
3402 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
3403 ; RV64-NEXT: lui a0, 4112
3404 ; RV64-NEXT: addiw a0, a0, 257
3405 ; RV64-NEXT: slli a1, a0, 32
3406 ; RV64-NEXT: add a0, a0, a1
3407 ; RV64-NEXT: vmul.vx v8, v8, a0, v0.t
3408 ; RV64-NEXT: li a0, 56
3409 ; RV64-NEXT: vsrl.vx v8, v8, a0, v0.t
3411 %v = call <8 x i64> @llvm.vp.cttz.v8i64(<8 x i64> %va, i1 true, <8 x i1> %m, i32 %evl)
3415 define <8 x i64> @vp_cttz_zero_undef_v8i64_unmasked(<8 x i64> %va, i32 zeroext %evl) {
3416 ; RV32-LABEL: vp_cttz_zero_undef_v8i64_unmasked:
3418 ; RV32-NEXT: li a1, 1
3419 ; RV32-NEXT: vsetvli zero, a0, e64, m4, ta, ma
3420 ; RV32-NEXT: vsub.vx v12, v8, a1
3421 ; RV32-NEXT: vnot.v v8, v8
3422 ; RV32-NEXT: vand.vv v8, v8, v12
3423 ; RV32-NEXT: vsrl.vi v12, v8, 1
3424 ; RV32-NEXT: lui a1, 349525
3425 ; RV32-NEXT: addi a1, a1, 1365
3426 ; RV32-NEXT: vsetivli zero, 16, e32, m4, ta, ma
3427 ; RV32-NEXT: vmv.v.x v16, a1
3428 ; RV32-NEXT: vsetvli zero, a0, e64, m4, ta, ma
3429 ; RV32-NEXT: vand.vv v12, v12, v16
3430 ; RV32-NEXT: vsub.vv v8, v8, v12
3431 ; RV32-NEXT: lui a1, 209715
3432 ; RV32-NEXT: addi a1, a1, 819
3433 ; RV32-NEXT: vsetivli zero, 16, e32, m4, ta, ma
3434 ; RV32-NEXT: vmv.v.x v12, a1
3435 ; RV32-NEXT: vsetvli zero, a0, e64, m4, ta, ma
3436 ; RV32-NEXT: vand.vv v16, v8, v12
3437 ; RV32-NEXT: vsrl.vi v8, v8, 2
3438 ; RV32-NEXT: vand.vv v8, v8, v12
3439 ; RV32-NEXT: vadd.vv v8, v16, v8
3440 ; RV32-NEXT: vsrl.vi v12, v8, 4
3441 ; RV32-NEXT: vadd.vv v8, v8, v12
3442 ; RV32-NEXT: lui a1, 61681
3443 ; RV32-NEXT: addi a1, a1, -241
3444 ; RV32-NEXT: vsetivli zero, 16, e32, m4, ta, ma
3445 ; RV32-NEXT: vmv.v.x v12, a1
3446 ; RV32-NEXT: vsetvli zero, a0, e64, m4, ta, ma
3447 ; RV32-NEXT: vand.vv v8, v8, v12
3448 ; RV32-NEXT: lui a1, 4112
3449 ; RV32-NEXT: addi a1, a1, 257
3450 ; RV32-NEXT: vsetivli zero, 16, e32, m4, ta, ma
3451 ; RV32-NEXT: vmv.v.x v12, a1
3452 ; RV32-NEXT: vsetvli zero, a0, e64, m4, ta, ma
3453 ; RV32-NEXT: vmul.vv v8, v8, v12
3454 ; RV32-NEXT: li a0, 56
3455 ; RV32-NEXT: vsrl.vx v8, v8, a0
3458 ; RV64-LABEL: vp_cttz_zero_undef_v8i64_unmasked:
3460 ; RV64-NEXT: li a1, 1
3461 ; RV64-NEXT: vsetvli zero, a0, e64, m4, ta, ma
3462 ; RV64-NEXT: vsub.vx v12, v8, a1
3463 ; RV64-NEXT: vnot.v v8, v8
3464 ; RV64-NEXT: vand.vv v8, v8, v12
3465 ; RV64-NEXT: vsrl.vi v12, v8, 1
3466 ; RV64-NEXT: lui a0, 349525
3467 ; RV64-NEXT: addiw a0, a0, 1365
3468 ; RV64-NEXT: slli a1, a0, 32
3469 ; RV64-NEXT: add a0, a0, a1
3470 ; RV64-NEXT: vand.vx v12, v12, a0
3471 ; RV64-NEXT: vsub.vv v8, v8, v12
3472 ; RV64-NEXT: lui a0, 209715
3473 ; RV64-NEXT: addiw a0, a0, 819
3474 ; RV64-NEXT: slli a1, a0, 32
3475 ; RV64-NEXT: add a0, a0, a1
3476 ; RV64-NEXT: vand.vx v12, v8, a0
3477 ; RV64-NEXT: vsrl.vi v8, v8, 2
3478 ; RV64-NEXT: vand.vx v8, v8, a0
3479 ; RV64-NEXT: vadd.vv v8, v12, v8
3480 ; RV64-NEXT: vsrl.vi v12, v8, 4
3481 ; RV64-NEXT: vadd.vv v8, v8, v12
3482 ; RV64-NEXT: lui a0, 61681
3483 ; RV64-NEXT: addiw a0, a0, -241
3484 ; RV64-NEXT: slli a1, a0, 32
3485 ; RV64-NEXT: add a0, a0, a1
3486 ; RV64-NEXT: vand.vx v8, v8, a0
3487 ; RV64-NEXT: lui a0, 4112
3488 ; RV64-NEXT: addiw a0, a0, 257
3489 ; RV64-NEXT: slli a1, a0, 32
3490 ; RV64-NEXT: add a0, a0, a1
3491 ; RV64-NEXT: vmul.vx v8, v8, a0
3492 ; RV64-NEXT: li a0, 56
3493 ; RV64-NEXT: vsrl.vx v8, v8, a0
3495 %v = call <8 x i64> @llvm.vp.cttz.v8i64(<8 x i64> %va, i1 true, <8 x i1> splat (i1 true), i32 %evl)
3499 define <15 x i64> @vp_cttz_zero_undef_v15i64(<15 x i64> %va, <15 x i1> %m, i32 zeroext %evl) {
3500 ; RV32-LABEL: vp_cttz_zero_undef_v15i64:
3502 ; RV32-NEXT: addi sp, sp, -48
3503 ; RV32-NEXT: .cfi_def_cfa_offset 48
3504 ; RV32-NEXT: csrr a1, vlenb
3505 ; RV32-NEXT: slli a1, a1, 4
3506 ; RV32-NEXT: sub sp, sp, a1
3507 ; RV32-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x30, 0x22, 0x11, 0x10, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 48 + 16 * vlenb
3508 ; RV32-NEXT: lui a1, 349525
3509 ; RV32-NEXT: addi a1, a1, 1365
3510 ; RV32-NEXT: sw a1, 44(sp)
3511 ; RV32-NEXT: sw a1, 40(sp)
3512 ; RV32-NEXT: lui a1, 209715
3513 ; RV32-NEXT: addi a1, a1, 819
3514 ; RV32-NEXT: sw a1, 36(sp)
3515 ; RV32-NEXT: sw a1, 32(sp)
3516 ; RV32-NEXT: lui a1, 61681
3517 ; RV32-NEXT: addi a1, a1, -241
3518 ; RV32-NEXT: sw a1, 28(sp)
3519 ; RV32-NEXT: sw a1, 24(sp)
3520 ; RV32-NEXT: lui a1, 4112
3521 ; RV32-NEXT: addi a1, a1, 257
3522 ; RV32-NEXT: sw a1, 20(sp)
3523 ; RV32-NEXT: sw a1, 16(sp)
3524 ; RV32-NEXT: li a1, 1
3525 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
3526 ; RV32-NEXT: vsub.vx v16, v8, a1, v0.t
3527 ; RV32-NEXT: vnot.v v8, v8, v0.t
3528 ; RV32-NEXT: vand.vv v24, v8, v16, v0.t
3529 ; RV32-NEXT: addi a1, sp, 48
3530 ; RV32-NEXT: vs8r.v v24, (a1) # Unknown-size Folded Spill
3531 ; RV32-NEXT: addi a1, sp, 40
3532 ; RV32-NEXT: vsetivli zero, 16, e64, m8, ta, ma
3533 ; RV32-NEXT: vlse64.v v8, (a1), zero
3534 ; RV32-NEXT: csrr a1, vlenb
3535 ; RV32-NEXT: slli a1, a1, 3
3536 ; RV32-NEXT: add a1, sp, a1
3537 ; RV32-NEXT: addi a1, a1, 48
3538 ; RV32-NEXT: vs8r.v v8, (a1) # Unknown-size Folded Spill
3539 ; RV32-NEXT: addi a1, sp, 32
3540 ; RV32-NEXT: vlse64.v v16, (a1), zero
3541 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
3542 ; RV32-NEXT: vsrl.vi v8, v24, 1, v0.t
3543 ; RV32-NEXT: csrr a1, vlenb
3544 ; RV32-NEXT: slli a1, a1, 3
3545 ; RV32-NEXT: add a1, sp, a1
3546 ; RV32-NEXT: addi a1, a1, 48
3547 ; RV32-NEXT: vl8r.v v24, (a1) # Unknown-size Folded Reload
3548 ; RV32-NEXT: vand.vv v8, v8, v24, v0.t
3549 ; RV32-NEXT: addi a1, sp, 48
3550 ; RV32-NEXT: vl8r.v v24, (a1) # Unknown-size Folded Reload
3551 ; RV32-NEXT: vsub.vv v8, v24, v8, v0.t
3552 ; RV32-NEXT: vand.vv v24, v8, v16, v0.t
3553 ; RV32-NEXT: vsrl.vi v8, v8, 2, v0.t
3554 ; RV32-NEXT: vand.vv v8, v8, v16, v0.t
3555 ; RV32-NEXT: vadd.vv v8, v24, v8, v0.t
3556 ; RV32-NEXT: addi a1, sp, 24
3557 ; RV32-NEXT: vsetivli zero, 16, e64, m8, ta, ma
3558 ; RV32-NEXT: vlse64.v v16, (a1), zero
3559 ; RV32-NEXT: csrr a1, vlenb
3560 ; RV32-NEXT: slli a1, a1, 3
3561 ; RV32-NEXT: add a1, sp, a1
3562 ; RV32-NEXT: addi a1, a1, 48
3563 ; RV32-NEXT: vs8r.v v16, (a1) # Unknown-size Folded Spill
3564 ; RV32-NEXT: addi a1, sp, 16
3565 ; RV32-NEXT: vlse64.v v24, (a1), zero
3566 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
3567 ; RV32-NEXT: vsrl.vi v16, v8, 4, v0.t
3568 ; RV32-NEXT: vadd.vv v8, v8, v16, v0.t
3569 ; RV32-NEXT: csrr a0, vlenb
3570 ; RV32-NEXT: slli a0, a0, 3
3571 ; RV32-NEXT: add a0, sp, a0
3572 ; RV32-NEXT: addi a0, a0, 48
3573 ; RV32-NEXT: vl8r.v v16, (a0) # Unknown-size Folded Reload
3574 ; RV32-NEXT: vand.vv v8, v8, v16, v0.t
3575 ; RV32-NEXT: vmul.vv v8, v8, v24, v0.t
3576 ; RV32-NEXT: li a0, 56
3577 ; RV32-NEXT: vsrl.vx v8, v8, a0, v0.t
3578 ; RV32-NEXT: csrr a0, vlenb
3579 ; RV32-NEXT: slli a0, a0, 4
3580 ; RV32-NEXT: add sp, sp, a0
3581 ; RV32-NEXT: addi sp, sp, 48
3584 ; RV64-LABEL: vp_cttz_zero_undef_v15i64:
3586 ; RV64-NEXT: li a1, 1
3587 ; RV64-NEXT: vsetvli zero, a0, e64, m8, ta, ma
3588 ; RV64-NEXT: vsub.vx v16, v8, a1, v0.t
3589 ; RV64-NEXT: vnot.v v8, v8, v0.t
3590 ; RV64-NEXT: vand.vv v8, v8, v16, v0.t
3591 ; RV64-NEXT: vsrl.vi v16, v8, 1, v0.t
3592 ; RV64-NEXT: lui a0, 349525
3593 ; RV64-NEXT: addiw a0, a0, 1365
3594 ; RV64-NEXT: slli a1, a0, 32
3595 ; RV64-NEXT: add a0, a0, a1
3596 ; RV64-NEXT: vand.vx v16, v16, a0, v0.t
3597 ; RV64-NEXT: vsub.vv v8, v8, v16, v0.t
3598 ; RV64-NEXT: lui a0, 209715
3599 ; RV64-NEXT: addiw a0, a0, 819
3600 ; RV64-NEXT: slli a1, a0, 32
3601 ; RV64-NEXT: add a0, a0, a1
3602 ; RV64-NEXT: vand.vx v16, v8, a0, v0.t
3603 ; RV64-NEXT: vsrl.vi v8, v8, 2, v0.t
3604 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
3605 ; RV64-NEXT: vadd.vv v8, v16, v8, v0.t
3606 ; RV64-NEXT: vsrl.vi v16, v8, 4, v0.t
3607 ; RV64-NEXT: vadd.vv v8, v8, v16, v0.t
3608 ; RV64-NEXT: lui a0, 61681
3609 ; RV64-NEXT: addiw a0, a0, -241
3610 ; RV64-NEXT: slli a1, a0, 32
3611 ; RV64-NEXT: add a0, a0, a1
3612 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
3613 ; RV64-NEXT: lui a0, 4112
3614 ; RV64-NEXT: addiw a0, a0, 257
3615 ; RV64-NEXT: slli a1, a0, 32
3616 ; RV64-NEXT: add a0, a0, a1
3617 ; RV64-NEXT: vmul.vx v8, v8, a0, v0.t
3618 ; RV64-NEXT: li a0, 56
3619 ; RV64-NEXT: vsrl.vx v8, v8, a0, v0.t
3621 %v = call <15 x i64> @llvm.vp.cttz.v15i64(<15 x i64> %va, i1 true, <15 x i1> %m, i32 %evl)
3625 define <15 x i64> @vp_cttz_zero_undef_v15i64_unmasked(<15 x i64> %va, i32 zeroext %evl) {
3626 ; RV32-LABEL: vp_cttz_zero_undef_v15i64_unmasked:
3628 ; RV32-NEXT: addi sp, sp, -32
3629 ; RV32-NEXT: .cfi_def_cfa_offset 32
3630 ; RV32-NEXT: lui a1, 349525
3631 ; RV32-NEXT: addi a1, a1, 1365
3632 ; RV32-NEXT: sw a1, 28(sp)
3633 ; RV32-NEXT: sw a1, 24(sp)
3634 ; RV32-NEXT: lui a1, 209715
3635 ; RV32-NEXT: addi a1, a1, 819
3636 ; RV32-NEXT: sw a1, 20(sp)
3637 ; RV32-NEXT: sw a1, 16(sp)
3638 ; RV32-NEXT: lui a1, 61681
3639 ; RV32-NEXT: addi a1, a1, -241
3640 ; RV32-NEXT: sw a1, 12(sp)
3641 ; RV32-NEXT: sw a1, 8(sp)
3642 ; RV32-NEXT: lui a1, 4112
3643 ; RV32-NEXT: addi a1, a1, 257
3644 ; RV32-NEXT: sw a1, 4(sp)
3645 ; RV32-NEXT: sw a1, 0(sp)
3646 ; RV32-NEXT: li a1, 1
3647 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
3648 ; RV32-NEXT: vsub.vx v16, v8, a1
3649 ; RV32-NEXT: vnot.v v8, v8
3650 ; RV32-NEXT: vand.vv v8, v8, v16
3651 ; RV32-NEXT: addi a1, sp, 24
3652 ; RV32-NEXT: vsetivli zero, 16, e64, m8, ta, ma
3653 ; RV32-NEXT: vlse64.v v16, (a1), zero
3654 ; RV32-NEXT: addi a1, sp, 16
3655 ; RV32-NEXT: vlse64.v v24, (a1), zero
3656 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
3657 ; RV32-NEXT: vsrl.vi v0, v8, 1
3658 ; RV32-NEXT: vand.vv v16, v0, v16
3659 ; RV32-NEXT: vsub.vv v8, v8, v16
3660 ; RV32-NEXT: vand.vv v16, v8, v24
3661 ; RV32-NEXT: vsrl.vi v8, v8, 2
3662 ; RV32-NEXT: vand.vv v8, v8, v24
3663 ; RV32-NEXT: vadd.vv v8, v16, v8
3664 ; RV32-NEXT: addi a1, sp, 8
3665 ; RV32-NEXT: vsetivli zero, 16, e64, m8, ta, ma
3666 ; RV32-NEXT: vlse64.v v16, (a1), zero
3667 ; RV32-NEXT: mv a1, sp
3668 ; RV32-NEXT: vlse64.v v24, (a1), zero
3669 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
3670 ; RV32-NEXT: vsrl.vi v0, v8, 4
3671 ; RV32-NEXT: vadd.vv v8, v8, v0
3672 ; RV32-NEXT: vand.vv v8, v8, v16
3673 ; RV32-NEXT: vmul.vv v8, v8, v24
3674 ; RV32-NEXT: li a0, 56
3675 ; RV32-NEXT: vsrl.vx v8, v8, a0
3676 ; RV32-NEXT: addi sp, sp, 32
3679 ; RV64-LABEL: vp_cttz_zero_undef_v15i64_unmasked:
3681 ; RV64-NEXT: li a1, 1
3682 ; RV64-NEXT: vsetvli zero, a0, e64, m8, ta, ma
3683 ; RV64-NEXT: vsub.vx v16, v8, a1
3684 ; RV64-NEXT: vnot.v v8, v8
3685 ; RV64-NEXT: vand.vv v8, v8, v16
3686 ; RV64-NEXT: vsrl.vi v16, v8, 1
3687 ; RV64-NEXT: lui a0, 349525
3688 ; RV64-NEXT: addiw a0, a0, 1365
3689 ; RV64-NEXT: slli a1, a0, 32
3690 ; RV64-NEXT: add a0, a0, a1
3691 ; RV64-NEXT: vand.vx v16, v16, a0
3692 ; RV64-NEXT: vsub.vv v8, v8, v16
3693 ; RV64-NEXT: lui a0, 209715
3694 ; RV64-NEXT: addiw a0, a0, 819
3695 ; RV64-NEXT: slli a1, a0, 32
3696 ; RV64-NEXT: add a0, a0, a1
3697 ; RV64-NEXT: vand.vx v16, v8, a0
3698 ; RV64-NEXT: vsrl.vi v8, v8, 2
3699 ; RV64-NEXT: vand.vx v8, v8, a0
3700 ; RV64-NEXT: vadd.vv v8, v16, v8
3701 ; RV64-NEXT: vsrl.vi v16, v8, 4
3702 ; RV64-NEXT: vadd.vv v8, v8, v16
3703 ; RV64-NEXT: lui a0, 61681
3704 ; RV64-NEXT: addiw a0, a0, -241
3705 ; RV64-NEXT: slli a1, a0, 32
3706 ; RV64-NEXT: add a0, a0, a1
3707 ; RV64-NEXT: vand.vx v8, v8, a0
3708 ; RV64-NEXT: lui a0, 4112
3709 ; RV64-NEXT: addiw a0, a0, 257
3710 ; RV64-NEXT: slli a1, a0, 32
3711 ; RV64-NEXT: add a0, a0, a1
3712 ; RV64-NEXT: vmul.vx v8, v8, a0
3713 ; RV64-NEXT: li a0, 56
3714 ; RV64-NEXT: vsrl.vx v8, v8, a0
3716 %v = call <15 x i64> @llvm.vp.cttz.v15i64(<15 x i64> %va, i1 true, <15 x i1> splat (i1 true), i32 %evl)
3720 define <16 x i64> @vp_cttz_zero_undef_v16i64(<16 x i64> %va, <16 x i1> %m, i32 zeroext %evl) {
3721 ; RV32-LABEL: vp_cttz_zero_undef_v16i64:
3723 ; RV32-NEXT: addi sp, sp, -48
3724 ; RV32-NEXT: .cfi_def_cfa_offset 48
3725 ; RV32-NEXT: csrr a1, vlenb
3726 ; RV32-NEXT: slli a1, a1, 4
3727 ; RV32-NEXT: sub sp, sp, a1
3728 ; RV32-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x30, 0x22, 0x11, 0x10, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 48 + 16 * vlenb
3729 ; RV32-NEXT: lui a1, 349525
3730 ; RV32-NEXT: addi a1, a1, 1365
3731 ; RV32-NEXT: sw a1, 44(sp)
3732 ; RV32-NEXT: sw a1, 40(sp)
3733 ; RV32-NEXT: lui a1, 209715
3734 ; RV32-NEXT: addi a1, a1, 819
3735 ; RV32-NEXT: sw a1, 36(sp)
3736 ; RV32-NEXT: sw a1, 32(sp)
3737 ; RV32-NEXT: lui a1, 61681
3738 ; RV32-NEXT: addi a1, a1, -241
3739 ; RV32-NEXT: sw a1, 28(sp)
3740 ; RV32-NEXT: sw a1, 24(sp)
3741 ; RV32-NEXT: lui a1, 4112
3742 ; RV32-NEXT: addi a1, a1, 257
3743 ; RV32-NEXT: sw a1, 20(sp)
3744 ; RV32-NEXT: sw a1, 16(sp)
3745 ; RV32-NEXT: li a1, 1
3746 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
3747 ; RV32-NEXT: vsub.vx v16, v8, a1, v0.t
3748 ; RV32-NEXT: vnot.v v8, v8, v0.t
3749 ; RV32-NEXT: vand.vv v24, v8, v16, v0.t
3750 ; RV32-NEXT: addi a1, sp, 48
3751 ; RV32-NEXT: vs8r.v v24, (a1) # Unknown-size Folded Spill
3752 ; RV32-NEXT: addi a1, sp, 40
3753 ; RV32-NEXT: vsetivli zero, 16, e64, m8, ta, ma
3754 ; RV32-NEXT: vlse64.v v8, (a1), zero
3755 ; RV32-NEXT: csrr a1, vlenb
3756 ; RV32-NEXT: slli a1, a1, 3
3757 ; RV32-NEXT: add a1, sp, a1
3758 ; RV32-NEXT: addi a1, a1, 48
3759 ; RV32-NEXT: vs8r.v v8, (a1) # Unknown-size Folded Spill
3760 ; RV32-NEXT: addi a1, sp, 32
3761 ; RV32-NEXT: vlse64.v v16, (a1), zero
3762 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
3763 ; RV32-NEXT: vsrl.vi v8, v24, 1, v0.t
3764 ; RV32-NEXT: csrr a1, vlenb
3765 ; RV32-NEXT: slli a1, a1, 3
3766 ; RV32-NEXT: add a1, sp, a1
3767 ; RV32-NEXT: addi a1, a1, 48
3768 ; RV32-NEXT: vl8r.v v24, (a1) # Unknown-size Folded Reload
3769 ; RV32-NEXT: vand.vv v8, v8, v24, v0.t
3770 ; RV32-NEXT: addi a1, sp, 48
3771 ; RV32-NEXT: vl8r.v v24, (a1) # Unknown-size Folded Reload
3772 ; RV32-NEXT: vsub.vv v8, v24, v8, v0.t
3773 ; RV32-NEXT: vand.vv v24, v8, v16, v0.t
3774 ; RV32-NEXT: vsrl.vi v8, v8, 2, v0.t
3775 ; RV32-NEXT: vand.vv v8, v8, v16, v0.t
3776 ; RV32-NEXT: vadd.vv v8, v24, v8, v0.t
3777 ; RV32-NEXT: addi a1, sp, 24
3778 ; RV32-NEXT: vsetivli zero, 16, e64, m8, ta, ma
3779 ; RV32-NEXT: vlse64.v v16, (a1), zero
3780 ; RV32-NEXT: csrr a1, vlenb
3781 ; RV32-NEXT: slli a1, a1, 3
3782 ; RV32-NEXT: add a1, sp, a1
3783 ; RV32-NEXT: addi a1, a1, 48
3784 ; RV32-NEXT: vs8r.v v16, (a1) # Unknown-size Folded Spill
3785 ; RV32-NEXT: addi a1, sp, 16
3786 ; RV32-NEXT: vlse64.v v24, (a1), zero
3787 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
3788 ; RV32-NEXT: vsrl.vi v16, v8, 4, v0.t
3789 ; RV32-NEXT: vadd.vv v8, v8, v16, v0.t
3790 ; RV32-NEXT: csrr a0, vlenb
3791 ; RV32-NEXT: slli a0, a0, 3
3792 ; RV32-NEXT: add a0, sp, a0
3793 ; RV32-NEXT: addi a0, a0, 48
3794 ; RV32-NEXT: vl8r.v v16, (a0) # Unknown-size Folded Reload
3795 ; RV32-NEXT: vand.vv v8, v8, v16, v0.t
3796 ; RV32-NEXT: vmul.vv v8, v8, v24, v0.t
3797 ; RV32-NEXT: li a0, 56
3798 ; RV32-NEXT: vsrl.vx v8, v8, a0, v0.t
3799 ; RV32-NEXT: csrr a0, vlenb
3800 ; RV32-NEXT: slli a0, a0, 4
3801 ; RV32-NEXT: add sp, sp, a0
3802 ; RV32-NEXT: addi sp, sp, 48
3805 ; RV64-LABEL: vp_cttz_zero_undef_v16i64:
3807 ; RV64-NEXT: li a1, 1
3808 ; RV64-NEXT: vsetvli zero, a0, e64, m8, ta, ma
3809 ; RV64-NEXT: vsub.vx v16, v8, a1, v0.t
3810 ; RV64-NEXT: vnot.v v8, v8, v0.t
3811 ; RV64-NEXT: vand.vv v8, v8, v16, v0.t
3812 ; RV64-NEXT: vsrl.vi v16, v8, 1, v0.t
3813 ; RV64-NEXT: lui a0, 349525
3814 ; RV64-NEXT: addiw a0, a0, 1365
3815 ; RV64-NEXT: slli a1, a0, 32
3816 ; RV64-NEXT: add a0, a0, a1
3817 ; RV64-NEXT: vand.vx v16, v16, a0, v0.t
3818 ; RV64-NEXT: vsub.vv v8, v8, v16, v0.t
3819 ; RV64-NEXT: lui a0, 209715
3820 ; RV64-NEXT: addiw a0, a0, 819
3821 ; RV64-NEXT: slli a1, a0, 32
3822 ; RV64-NEXT: add a0, a0, a1
3823 ; RV64-NEXT: vand.vx v16, v8, a0, v0.t
3824 ; RV64-NEXT: vsrl.vi v8, v8, 2, v0.t
3825 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
3826 ; RV64-NEXT: vadd.vv v8, v16, v8, v0.t
3827 ; RV64-NEXT: vsrl.vi v16, v8, 4, v0.t
3828 ; RV64-NEXT: vadd.vv v8, v8, v16, v0.t
3829 ; RV64-NEXT: lui a0, 61681
3830 ; RV64-NEXT: addiw a0, a0, -241
3831 ; RV64-NEXT: slli a1, a0, 32
3832 ; RV64-NEXT: add a0, a0, a1
3833 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
3834 ; RV64-NEXT: lui a0, 4112
3835 ; RV64-NEXT: addiw a0, a0, 257
3836 ; RV64-NEXT: slli a1, a0, 32
3837 ; RV64-NEXT: add a0, a0, a1
3838 ; RV64-NEXT: vmul.vx v8, v8, a0, v0.t
3839 ; RV64-NEXT: li a0, 56
3840 ; RV64-NEXT: vsrl.vx v8, v8, a0, v0.t
3842 %v = call <16 x i64> @llvm.vp.cttz.v16i64(<16 x i64> %va, i1 true, <16 x i1> %m, i32 %evl)
3846 define <16 x i64> @vp_cttz_zero_undef_v16i64_unmasked(<16 x i64> %va, i32 zeroext %evl) {
3847 ; RV32-LABEL: vp_cttz_zero_undef_v16i64_unmasked:
3849 ; RV32-NEXT: addi sp, sp, -32
3850 ; RV32-NEXT: .cfi_def_cfa_offset 32
3851 ; RV32-NEXT: lui a1, 349525
3852 ; RV32-NEXT: addi a1, a1, 1365
3853 ; RV32-NEXT: sw a1, 28(sp)
3854 ; RV32-NEXT: sw a1, 24(sp)
3855 ; RV32-NEXT: lui a1, 209715
3856 ; RV32-NEXT: addi a1, a1, 819
3857 ; RV32-NEXT: sw a1, 20(sp)
3858 ; RV32-NEXT: sw a1, 16(sp)
3859 ; RV32-NEXT: lui a1, 61681
3860 ; RV32-NEXT: addi a1, a1, -241
3861 ; RV32-NEXT: sw a1, 12(sp)
3862 ; RV32-NEXT: sw a1, 8(sp)
3863 ; RV32-NEXT: lui a1, 4112
3864 ; RV32-NEXT: addi a1, a1, 257
3865 ; RV32-NEXT: sw a1, 4(sp)
3866 ; RV32-NEXT: sw a1, 0(sp)
3867 ; RV32-NEXT: li a1, 1
3868 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
3869 ; RV32-NEXT: vsub.vx v16, v8, a1
3870 ; RV32-NEXT: vnot.v v8, v8
3871 ; RV32-NEXT: vand.vv v8, v8, v16
3872 ; RV32-NEXT: addi a1, sp, 24
3873 ; RV32-NEXT: vsetivli zero, 16, e64, m8, ta, ma
3874 ; RV32-NEXT: vlse64.v v16, (a1), zero
3875 ; RV32-NEXT: addi a1, sp, 16
3876 ; RV32-NEXT: vlse64.v v24, (a1), zero
3877 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
3878 ; RV32-NEXT: vsrl.vi v0, v8, 1
3879 ; RV32-NEXT: vand.vv v16, v0, v16
3880 ; RV32-NEXT: vsub.vv v8, v8, v16
3881 ; RV32-NEXT: vand.vv v16, v8, v24
3882 ; RV32-NEXT: vsrl.vi v8, v8, 2
3883 ; RV32-NEXT: vand.vv v8, v8, v24
3884 ; RV32-NEXT: vadd.vv v8, v16, v8
3885 ; RV32-NEXT: addi a1, sp, 8
3886 ; RV32-NEXT: vsetivli zero, 16, e64, m8, ta, ma
3887 ; RV32-NEXT: vlse64.v v16, (a1), zero
3888 ; RV32-NEXT: mv a1, sp
3889 ; RV32-NEXT: vlse64.v v24, (a1), zero
3890 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
3891 ; RV32-NEXT: vsrl.vi v0, v8, 4
3892 ; RV32-NEXT: vadd.vv v8, v8, v0
3893 ; RV32-NEXT: vand.vv v8, v8, v16
3894 ; RV32-NEXT: vmul.vv v8, v8, v24
3895 ; RV32-NEXT: li a0, 56
3896 ; RV32-NEXT: vsrl.vx v8, v8, a0
3897 ; RV32-NEXT: addi sp, sp, 32
3900 ; RV64-LABEL: vp_cttz_zero_undef_v16i64_unmasked:
3902 ; RV64-NEXT: li a1, 1
3903 ; RV64-NEXT: vsetvli zero, a0, e64, m8, ta, ma
3904 ; RV64-NEXT: vsub.vx v16, v8, a1
3905 ; RV64-NEXT: vnot.v v8, v8
3906 ; RV64-NEXT: vand.vv v8, v8, v16
3907 ; RV64-NEXT: vsrl.vi v16, v8, 1
3908 ; RV64-NEXT: lui a0, 349525
3909 ; RV64-NEXT: addiw a0, a0, 1365
3910 ; RV64-NEXT: slli a1, a0, 32
3911 ; RV64-NEXT: add a0, a0, a1
3912 ; RV64-NEXT: vand.vx v16, v16, a0
3913 ; RV64-NEXT: vsub.vv v8, v8, v16
3914 ; RV64-NEXT: lui a0, 209715
3915 ; RV64-NEXT: addiw a0, a0, 819
3916 ; RV64-NEXT: slli a1, a0, 32
3917 ; RV64-NEXT: add a0, a0, a1
3918 ; RV64-NEXT: vand.vx v16, v8, a0
3919 ; RV64-NEXT: vsrl.vi v8, v8, 2
3920 ; RV64-NEXT: vand.vx v8, v8, a0
3921 ; RV64-NEXT: vadd.vv v8, v16, v8
3922 ; RV64-NEXT: vsrl.vi v16, v8, 4
3923 ; RV64-NEXT: vadd.vv v8, v8, v16
3924 ; RV64-NEXT: lui a0, 61681
3925 ; RV64-NEXT: addiw a0, a0, -241
3926 ; RV64-NEXT: slli a1, a0, 32
3927 ; RV64-NEXT: add a0, a0, a1
3928 ; RV64-NEXT: vand.vx v8, v8, a0
3929 ; RV64-NEXT: lui a0, 4112
3930 ; RV64-NEXT: addiw a0, a0, 257
3931 ; RV64-NEXT: slli a1, a0, 32
3932 ; RV64-NEXT: add a0, a0, a1
3933 ; RV64-NEXT: vmul.vx v8, v8, a0
3934 ; RV64-NEXT: li a0, 56
3935 ; RV64-NEXT: vsrl.vx v8, v8, a0
3937 %v = call <16 x i64> @llvm.vp.cttz.v16i64(<16 x i64> %va, i1 true, <16 x i1> splat (i1 true), i32 %evl)
3941 define <32 x i64> @vp_cttz_zero_undef_v32i64(<32 x i64> %va, <32 x i1> %m, i32 zeroext %evl) {
3942 ; RV32-LABEL: vp_cttz_zero_undef_v32i64:
3944 ; RV32-NEXT: addi sp, sp, -48
3945 ; RV32-NEXT: .cfi_def_cfa_offset 48
3946 ; RV32-NEXT: csrr a1, vlenb
3947 ; RV32-NEXT: li a2, 56
3948 ; RV32-NEXT: mul a1, a1, a2
3949 ; RV32-NEXT: sub sp, sp, a1
3950 ; RV32-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x30, 0x22, 0x11, 0x38, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 48 + 56 * vlenb
3951 ; RV32-NEXT: csrr a1, vlenb
3952 ; RV32-NEXT: slli a1, a1, 4
3953 ; RV32-NEXT: add a1, sp, a1
3954 ; RV32-NEXT: addi a1, a1, 48
3955 ; RV32-NEXT: vs8r.v v16, (a1) # Unknown-size Folded Spill
3956 ; RV32-NEXT: vsetivli zero, 2, e8, mf4, ta, ma
3957 ; RV32-NEXT: vslidedown.vi v24, v0, 2
3958 ; RV32-NEXT: lui a1, 349525
3959 ; RV32-NEXT: addi a1, a1, 1365
3960 ; RV32-NEXT: sw a1, 44(sp)
3961 ; RV32-NEXT: sw a1, 40(sp)
3962 ; RV32-NEXT: lui a1, 209715
3963 ; RV32-NEXT: addi a1, a1, 819
3964 ; RV32-NEXT: sw a1, 36(sp)
3965 ; RV32-NEXT: sw a1, 32(sp)
3966 ; RV32-NEXT: lui a1, 61681
3967 ; RV32-NEXT: addi a1, a1, -241
3968 ; RV32-NEXT: sw a1, 28(sp)
3969 ; RV32-NEXT: sw a1, 24(sp)
3970 ; RV32-NEXT: lui a1, 4112
3971 ; RV32-NEXT: addi a1, a1, 257
3972 ; RV32-NEXT: sw a1, 20(sp)
3973 ; RV32-NEXT: li a3, 16
3974 ; RV32-NEXT: sw a1, 16(sp)
3975 ; RV32-NEXT: mv a2, a0
3976 ; RV32-NEXT: bltu a0, a3, .LBB70_2
3977 ; RV32-NEXT: # %bb.1:
3978 ; RV32-NEXT: li a2, 16
3979 ; RV32-NEXT: .LBB70_2:
3980 ; RV32-NEXT: li a1, 1
3981 ; RV32-NEXT: vsetvli zero, a2, e64, m8, ta, ma
3982 ; RV32-NEXT: vsub.vx v16, v8, a1, v0.t
3983 ; RV32-NEXT: vnot.v v8, v8, v0.t
3984 ; RV32-NEXT: vand.vv v8, v8, v16, v0.t
3985 ; RV32-NEXT: csrr a3, vlenb
3986 ; RV32-NEXT: slli a3, a3, 5
3987 ; RV32-NEXT: add a3, sp, a3
3988 ; RV32-NEXT: addi a3, a3, 48
3989 ; RV32-NEXT: vs8r.v v8, (a3) # Unknown-size Folded Spill
3990 ; RV32-NEXT: addi a3, sp, 40
3991 ; RV32-NEXT: vsetivli zero, 16, e64, m8, ta, ma
3992 ; RV32-NEXT: vlse64.v v8, (a3), zero
3993 ; RV32-NEXT: csrr a3, vlenb
3994 ; RV32-NEXT: li a4, 40
3995 ; RV32-NEXT: mul a3, a3, a4
3996 ; RV32-NEXT: add a3, sp, a3
3997 ; RV32-NEXT: addi a3, a3, 48
3998 ; RV32-NEXT: vs8r.v v8, (a3) # Unknown-size Folded Spill
3999 ; RV32-NEXT: addi a3, sp, 32
4000 ; RV32-NEXT: vlse64.v v8, (a3), zero
4001 ; RV32-NEXT: csrr a3, vlenb
4002 ; RV32-NEXT: li a4, 48
4003 ; RV32-NEXT: mul a3, a3, a4
4004 ; RV32-NEXT: add a3, sp, a3
4005 ; RV32-NEXT: addi a3, a3, 48
4006 ; RV32-NEXT: vs8r.v v8, (a3) # Unknown-size Folded Spill
4007 ; RV32-NEXT: csrr a3, vlenb
4008 ; RV32-NEXT: slli a3, a3, 5
4009 ; RV32-NEXT: add a3, sp, a3
4010 ; RV32-NEXT: addi a3, a3, 48
4011 ; RV32-NEXT: vl8r.v v16, (a3) # Unknown-size Folded Reload
4012 ; RV32-NEXT: vsetvli zero, a2, e64, m8, ta, ma
4013 ; RV32-NEXT: vsrl.vi v8, v16, 1, v0.t
4014 ; RV32-NEXT: csrr a3, vlenb
4015 ; RV32-NEXT: li a4, 24
4016 ; RV32-NEXT: mul a3, a3, a4
4017 ; RV32-NEXT: add a3, sp, a3
4018 ; RV32-NEXT: addi a3, a3, 48
4019 ; RV32-NEXT: vs8r.v v8, (a3) # Unknown-size Folded Spill
4020 ; RV32-NEXT: csrr a3, vlenb
4021 ; RV32-NEXT: li a4, 40
4022 ; RV32-NEXT: mul a3, a3, a4
4023 ; RV32-NEXT: add a3, sp, a3
4024 ; RV32-NEXT: addi a3, a3, 48
4025 ; RV32-NEXT: vl8r.v v16, (a3) # Unknown-size Folded Reload
4026 ; RV32-NEXT: csrr a3, vlenb
4027 ; RV32-NEXT: li a4, 24
4028 ; RV32-NEXT: mul a3, a3, a4
4029 ; RV32-NEXT: add a3, sp, a3
4030 ; RV32-NEXT: addi a3, a3, 48
4031 ; RV32-NEXT: vl8r.v v8, (a3) # Unknown-size Folded Reload
4032 ; RV32-NEXT: vand.vv v8, v8, v16, v0.t
4033 ; RV32-NEXT: csrr a3, vlenb
4034 ; RV32-NEXT: slli a3, a3, 5
4035 ; RV32-NEXT: add a3, sp, a3
4036 ; RV32-NEXT: addi a3, a3, 48
4037 ; RV32-NEXT: vl8r.v v16, (a3) # Unknown-size Folded Reload
4038 ; RV32-NEXT: vsub.vv v16, v16, v8, v0.t
4039 ; RV32-NEXT: csrr a3, vlenb
4040 ; RV32-NEXT: slli a3, a3, 5
4041 ; RV32-NEXT: add a3, sp, a3
4042 ; RV32-NEXT: addi a3, a3, 48
4043 ; RV32-NEXT: vs8r.v v16, (a3) # Unknown-size Folded Spill
4044 ; RV32-NEXT: csrr a3, vlenb
4045 ; RV32-NEXT: slli a3, a3, 5
4046 ; RV32-NEXT: add a3, sp, a3
4047 ; RV32-NEXT: addi a3, a3, 48
4048 ; RV32-NEXT: vl8r.v v16, (a3) # Unknown-size Folded Reload
4049 ; RV32-NEXT: csrr a3, vlenb
4050 ; RV32-NEXT: li a4, 48
4051 ; RV32-NEXT: mul a3, a3, a4
4052 ; RV32-NEXT: add a3, sp, a3
4053 ; RV32-NEXT: addi a3, a3, 48
4054 ; RV32-NEXT: vl8r.v v8, (a3) # Unknown-size Folded Reload
4055 ; RV32-NEXT: vand.vv v16, v16, v8, v0.t
4056 ; RV32-NEXT: csrr a3, vlenb
4057 ; RV32-NEXT: li a4, 24
4058 ; RV32-NEXT: mul a3, a3, a4
4059 ; RV32-NEXT: add a3, sp, a3
4060 ; RV32-NEXT: addi a3, a3, 48
4061 ; RV32-NEXT: vs8r.v v16, (a3) # Unknown-size Folded Spill
4062 ; RV32-NEXT: csrr a3, vlenb
4063 ; RV32-NEXT: slli a3, a3, 5
4064 ; RV32-NEXT: add a3, sp, a3
4065 ; RV32-NEXT: addi a3, a3, 48
4066 ; RV32-NEXT: vl8r.v v16, (a3) # Unknown-size Folded Reload
4067 ; RV32-NEXT: vsrl.vi v16, v16, 2, v0.t
4068 ; RV32-NEXT: vand.vv v16, v16, v8, v0.t
4069 ; RV32-NEXT: csrr a3, vlenb
4070 ; RV32-NEXT: li a4, 24
4071 ; RV32-NEXT: mul a3, a3, a4
4072 ; RV32-NEXT: add a3, sp, a3
4073 ; RV32-NEXT: addi a3, a3, 48
4074 ; RV32-NEXT: vl8r.v v8, (a3) # Unknown-size Folded Reload
4075 ; RV32-NEXT: vadd.vv v8, v8, v16, v0.t
4076 ; RV32-NEXT: csrr a3, vlenb
4077 ; RV32-NEXT: slli a3, a3, 3
4078 ; RV32-NEXT: add a3, sp, a3
4079 ; RV32-NEXT: addi a3, a3, 48
4080 ; RV32-NEXT: vs8r.v v8, (a3) # Unknown-size Folded Spill
4081 ; RV32-NEXT: addi a3, sp, 24
4082 ; RV32-NEXT: addi a4, sp, 16
4083 ; RV32-NEXT: vsetivli zero, 16, e64, m8, ta, ma
4084 ; RV32-NEXT: vlse64.v v8, (a3), zero
4085 ; RV32-NEXT: csrr a3, vlenb
4086 ; RV32-NEXT: li a5, 24
4087 ; RV32-NEXT: mul a3, a3, a5
4088 ; RV32-NEXT: add a3, sp, a3
4089 ; RV32-NEXT: addi a3, a3, 48
4090 ; RV32-NEXT: vs8r.v v8, (a3) # Unknown-size Folded Spill
4091 ; RV32-NEXT: vlse64.v v8, (a4), zero
4092 ; RV32-NEXT: csrr a3, vlenb
4093 ; RV32-NEXT: slli a3, a3, 5
4094 ; RV32-NEXT: add a3, sp, a3
4095 ; RV32-NEXT: addi a3, a3, 48
4096 ; RV32-NEXT: vs8r.v v8, (a3) # Unknown-size Folded Spill
4097 ; RV32-NEXT: csrr a3, vlenb
4098 ; RV32-NEXT: slli a3, a3, 3
4099 ; RV32-NEXT: add a3, sp, a3
4100 ; RV32-NEXT: addi a3, a3, 48
4101 ; RV32-NEXT: vl8r.v v8, (a3) # Unknown-size Folded Reload
4102 ; RV32-NEXT: vsetvli zero, a2, e64, m8, ta, ma
4103 ; RV32-NEXT: vsrl.vi v16, v8, 4, v0.t
4104 ; RV32-NEXT: addi a2, sp, 48
4105 ; RV32-NEXT: vs8r.v v16, (a2) # Unknown-size Folded Spill
4106 ; RV32-NEXT: vl8r.v v16, (a2) # Unknown-size Folded Reload
4107 ; RV32-NEXT: vadd.vv v16, v8, v16, v0.t
4108 ; RV32-NEXT: csrr a2, vlenb
4109 ; RV32-NEXT: li a3, 24
4110 ; RV32-NEXT: mul a2, a2, a3
4111 ; RV32-NEXT: add a2, sp, a2
4112 ; RV32-NEXT: addi a2, a2, 48
4113 ; RV32-NEXT: vl8r.v v8, (a2) # Unknown-size Folded Reload
4114 ; RV32-NEXT: vand.vv v16, v16, v8, v0.t
4115 ; RV32-NEXT: csrr a2, vlenb
4116 ; RV32-NEXT: slli a2, a2, 5
4117 ; RV32-NEXT: add a2, sp, a2
4118 ; RV32-NEXT: addi a2, a2, 48
4119 ; RV32-NEXT: vl8r.v v8, (a2) # Unknown-size Folded Reload
4120 ; RV32-NEXT: vmul.vv v8, v16, v8, v0.t
4121 ; RV32-NEXT: li a2, 56
4122 ; RV32-NEXT: vsrl.vx v8, v8, a2, v0.t
4123 ; RV32-NEXT: csrr a3, vlenb
4124 ; RV32-NEXT: slli a3, a3, 3
4125 ; RV32-NEXT: add a3, sp, a3
4126 ; RV32-NEXT: addi a3, a3, 48
4127 ; RV32-NEXT: vs8r.v v8, (a3) # Unknown-size Folded Spill
4128 ; RV32-NEXT: addi a3, a0, -16
4129 ; RV32-NEXT: sltu a0, a0, a3
4130 ; RV32-NEXT: addi a0, a0, -1
4131 ; RV32-NEXT: and a0, a0, a3
4132 ; RV32-NEXT: vmv1r.v v0, v24
4133 ; RV32-NEXT: csrr a3, vlenb
4134 ; RV32-NEXT: slli a3, a3, 4
4135 ; RV32-NEXT: add a3, sp, a3
4136 ; RV32-NEXT: addi a3, a3, 48
4137 ; RV32-NEXT: vl8r.v v16, (a3) # Unknown-size Folded Reload
4138 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
4139 ; RV32-NEXT: vsub.vx v8, v16, a1, v0.t
4140 ; RV32-NEXT: vnot.v v16, v16, v0.t
4141 ; RV32-NEXT: vand.vv v8, v16, v8, v0.t
4142 ; RV32-NEXT: addi a0, sp, 48
4143 ; RV32-NEXT: vs8r.v v8, (a0) # Unknown-size Folded Spill
4144 ; RV32-NEXT: vsrl.vi v8, v8, 1, v0.t
4145 ; RV32-NEXT: csrr a0, vlenb
4146 ; RV32-NEXT: slli a0, a0, 4
4147 ; RV32-NEXT: add a0, sp, a0
4148 ; RV32-NEXT: addi a0, a0, 48
4149 ; RV32-NEXT: vs8r.v v8, (a0) # Unknown-size Folded Spill
4150 ; RV32-NEXT: csrr a0, vlenb
4151 ; RV32-NEXT: li a1, 40
4152 ; RV32-NEXT: mul a0, a0, a1
4153 ; RV32-NEXT: add a0, sp, a0
4154 ; RV32-NEXT: addi a0, a0, 48
4155 ; RV32-NEXT: vl8r.v v16, (a0) # Unknown-size Folded Reload
4156 ; RV32-NEXT: csrr a0, vlenb
4157 ; RV32-NEXT: slli a0, a0, 4
4158 ; RV32-NEXT: add a0, sp, a0
4159 ; RV32-NEXT: addi a0, a0, 48
4160 ; RV32-NEXT: vl8r.v v8, (a0) # Unknown-size Folded Reload
4161 ; RV32-NEXT: vand.vv v16, v8, v16, v0.t
4162 ; RV32-NEXT: addi a0, sp, 48
4163 ; RV32-NEXT: vl8r.v v8, (a0) # Unknown-size Folded Reload
4164 ; RV32-NEXT: vsub.vv v8, v8, v16, v0.t
4165 ; RV32-NEXT: csrr a0, vlenb
4166 ; RV32-NEXT: li a1, 40
4167 ; RV32-NEXT: mul a0, a0, a1
4168 ; RV32-NEXT: add a0, sp, a0
4169 ; RV32-NEXT: addi a0, a0, 48
4170 ; RV32-NEXT: vs8r.v v8, (a0) # Unknown-size Folded Spill
4171 ; RV32-NEXT: csrr a0, vlenb
4172 ; RV32-NEXT: li a1, 48
4173 ; RV32-NEXT: mul a0, a0, a1
4174 ; RV32-NEXT: add a0, sp, a0
4175 ; RV32-NEXT: addi a0, a0, 48
4176 ; RV32-NEXT: vl8r.v v8, (a0) # Unknown-size Folded Reload
4177 ; RV32-NEXT: csrr a0, vlenb
4178 ; RV32-NEXT: li a1, 40
4179 ; RV32-NEXT: mul a0, a0, a1
4180 ; RV32-NEXT: add a0, sp, a0
4181 ; RV32-NEXT: addi a0, a0, 48
4182 ; RV32-NEXT: vl8r.v v16, (a0) # Unknown-size Folded Reload
4183 ; RV32-NEXT: vand.vv v16, v16, v8, v0.t
4184 ; RV32-NEXT: csrr a0, vlenb
4185 ; RV32-NEXT: slli a0, a0, 4
4186 ; RV32-NEXT: add a0, sp, a0
4187 ; RV32-NEXT: addi a0, a0, 48
4188 ; RV32-NEXT: vs8r.v v16, (a0) # Unknown-size Folded Spill
4189 ; RV32-NEXT: csrr a0, vlenb
4190 ; RV32-NEXT: li a1, 40
4191 ; RV32-NEXT: mul a0, a0, a1
4192 ; RV32-NEXT: add a0, sp, a0
4193 ; RV32-NEXT: addi a0, a0, 48
4194 ; RV32-NEXT: vl8r.v v8, (a0) # Unknown-size Folded Reload
4195 ; RV32-NEXT: vsrl.vi v8, v8, 2, v0.t
4196 ; RV32-NEXT: csrr a0, vlenb
4197 ; RV32-NEXT: li a1, 48
4198 ; RV32-NEXT: mul a0, a0, a1
4199 ; RV32-NEXT: add a0, sp, a0
4200 ; RV32-NEXT: addi a0, a0, 48
4201 ; RV32-NEXT: vl8r.v v16, (a0) # Unknown-size Folded Reload
4202 ; RV32-NEXT: vand.vv v8, v8, v16, v0.t
4203 ; RV32-NEXT: csrr a0, vlenb
4204 ; RV32-NEXT: slli a0, a0, 4
4205 ; RV32-NEXT: add a0, sp, a0
4206 ; RV32-NEXT: addi a0, a0, 48
4207 ; RV32-NEXT: vl8r.v v16, (a0) # Unknown-size Folded Reload
4208 ; RV32-NEXT: vadd.vv v8, v16, v8, v0.t
4209 ; RV32-NEXT: vsrl.vi v16, v8, 4, v0.t
4210 ; RV32-NEXT: vadd.vv v8, v8, v16, v0.t
4211 ; RV32-NEXT: csrr a0, vlenb
4212 ; RV32-NEXT: li a1, 24
4213 ; RV32-NEXT: mul a0, a0, a1
4214 ; RV32-NEXT: add a0, sp, a0
4215 ; RV32-NEXT: addi a0, a0, 48
4216 ; RV32-NEXT: vl8r.v v16, (a0) # Unknown-size Folded Reload
4217 ; RV32-NEXT: vand.vv v8, v8, v16, v0.t
4218 ; RV32-NEXT: csrr a0, vlenb
4219 ; RV32-NEXT: slli a0, a0, 5
4220 ; RV32-NEXT: add a0, sp, a0
4221 ; RV32-NEXT: addi a0, a0, 48
4222 ; RV32-NEXT: vl8r.v v16, (a0) # Unknown-size Folded Reload
4223 ; RV32-NEXT: vmul.vv v8, v8, v16, v0.t
4224 ; RV32-NEXT: vsrl.vx v16, v8, a2, v0.t
4225 ; RV32-NEXT: csrr a0, vlenb
4226 ; RV32-NEXT: slli a0, a0, 3
4227 ; RV32-NEXT: add a0, sp, a0
4228 ; RV32-NEXT: addi a0, a0, 48
4229 ; RV32-NEXT: vl8r.v v8, (a0) # Unknown-size Folded Reload
4230 ; RV32-NEXT: csrr a0, vlenb
4231 ; RV32-NEXT: li a1, 56
4232 ; RV32-NEXT: mul a0, a0, a1
4233 ; RV32-NEXT: add sp, sp, a0
4234 ; RV32-NEXT: addi sp, sp, 48
4237 ; RV64-LABEL: vp_cttz_zero_undef_v32i64:
4239 ; RV64-NEXT: addi sp, sp, -16
4240 ; RV64-NEXT: .cfi_def_cfa_offset 16
4241 ; RV64-NEXT: csrr a1, vlenb
4242 ; RV64-NEXT: slli a1, a1, 4
4243 ; RV64-NEXT: sub sp, sp, a1
4244 ; RV64-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x10, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 16 * vlenb
4245 ; RV64-NEXT: csrr a1, vlenb
4246 ; RV64-NEXT: slli a1, a1, 3
4247 ; RV64-NEXT: add a1, sp, a1
4248 ; RV64-NEXT: addi a1, a1, 16
4249 ; RV64-NEXT: vs8r.v v16, (a1) # Unknown-size Folded Spill
4250 ; RV64-NEXT: li a1, 16
4251 ; RV64-NEXT: vsetivli zero, 2, e8, mf4, ta, ma
4252 ; RV64-NEXT: vslidedown.vi v24, v0, 2
4253 ; RV64-NEXT: mv a2, a0
4254 ; RV64-NEXT: bltu a0, a1, .LBB70_2
4255 ; RV64-NEXT: # %bb.1:
4256 ; RV64-NEXT: li a2, 16
4257 ; RV64-NEXT: .LBB70_2:
4258 ; RV64-NEXT: li a1, 1
4259 ; RV64-NEXT: vsetvli zero, a2, e64, m8, ta, ma
4260 ; RV64-NEXT: vsub.vx v16, v8, a1, v0.t
4261 ; RV64-NEXT: vnot.v v8, v8, v0.t
4262 ; RV64-NEXT: vand.vv v8, v8, v16, v0.t
4263 ; RV64-NEXT: vsrl.vi v16, v8, 1, v0.t
4264 ; RV64-NEXT: lui a2, 349525
4265 ; RV64-NEXT: addiw a2, a2, 1365
4266 ; RV64-NEXT: slli a3, a2, 32
4267 ; RV64-NEXT: add a2, a2, a3
4268 ; RV64-NEXT: vand.vx v16, v16, a2, v0.t
4269 ; RV64-NEXT: vsub.vv v8, v8, v16, v0.t
4270 ; RV64-NEXT: lui a3, 209715
4271 ; RV64-NEXT: addiw a3, a3, 819
4272 ; RV64-NEXT: slli a4, a3, 32
4273 ; RV64-NEXT: add a3, a3, a4
4274 ; RV64-NEXT: vand.vx v16, v8, a3, v0.t
4275 ; RV64-NEXT: vsrl.vi v8, v8, 2, v0.t
4276 ; RV64-NEXT: vand.vx v8, v8, a3, v0.t
4277 ; RV64-NEXT: vadd.vv v8, v16, v8, v0.t
4278 ; RV64-NEXT: vsrl.vi v16, v8, 4, v0.t
4279 ; RV64-NEXT: vadd.vv v8, v8, v16, v0.t
4280 ; RV64-NEXT: lui a4, 61681
4281 ; RV64-NEXT: addiw a4, a4, -241
4282 ; RV64-NEXT: slli a5, a4, 32
4283 ; RV64-NEXT: add a4, a4, a5
4284 ; RV64-NEXT: vand.vx v8, v8, a4, v0.t
4285 ; RV64-NEXT: lui a5, 4112
4286 ; RV64-NEXT: addiw a5, a5, 257
4287 ; RV64-NEXT: slli a6, a5, 32
4288 ; RV64-NEXT: add a5, a5, a6
4289 ; RV64-NEXT: vmul.vx v8, v8, a5, v0.t
4290 ; RV64-NEXT: li a6, 56
4291 ; RV64-NEXT: vsrl.vx v8, v8, a6, v0.t
4292 ; RV64-NEXT: addi a7, sp, 16
4293 ; RV64-NEXT: vs8r.v v8, (a7) # Unknown-size Folded Spill
4294 ; RV64-NEXT: addi a7, a0, -16
4295 ; RV64-NEXT: sltu a0, a0, a7
4296 ; RV64-NEXT: addi a0, a0, -1
4297 ; RV64-NEXT: and a0, a0, a7
4298 ; RV64-NEXT: vmv1r.v v0, v24
4299 ; RV64-NEXT: csrr a7, vlenb
4300 ; RV64-NEXT: slli a7, a7, 3
4301 ; RV64-NEXT: add a7, sp, a7
4302 ; RV64-NEXT: addi a7, a7, 16
4303 ; RV64-NEXT: vl8r.v v8, (a7) # Unknown-size Folded Reload
4304 ; RV64-NEXT: vsetvli zero, a0, e64, m8, ta, ma
4305 ; RV64-NEXT: vsub.vx v16, v8, a1, v0.t
4306 ; RV64-NEXT: vnot.v v8, v8, v0.t
4307 ; RV64-NEXT: vand.vv v8, v8, v16, v0.t
4308 ; RV64-NEXT: vsrl.vi v16, v8, 1, v0.t
4309 ; RV64-NEXT: vand.vx v16, v16, a2, v0.t
4310 ; RV64-NEXT: vsub.vv v8, v8, v16, v0.t
4311 ; RV64-NEXT: vand.vx v16, v8, a3, v0.t
4312 ; RV64-NEXT: vsrl.vi v8, v8, 2, v0.t
4313 ; RV64-NEXT: vand.vx v8, v8, a3, v0.t
4314 ; RV64-NEXT: vadd.vv v8, v16, v8, v0.t
4315 ; RV64-NEXT: vsrl.vi v16, v8, 4, v0.t
4316 ; RV64-NEXT: vadd.vv v8, v8, v16, v0.t
4317 ; RV64-NEXT: vand.vx v8, v8, a4, v0.t
4318 ; RV64-NEXT: vmul.vx v8, v8, a5, v0.t
4319 ; RV64-NEXT: vsrl.vx v16, v8, a6, v0.t
4320 ; RV64-NEXT: addi a0, sp, 16
4321 ; RV64-NEXT: vl8r.v v8, (a0) # Unknown-size Folded Reload
4322 ; RV64-NEXT: csrr a0, vlenb
4323 ; RV64-NEXT: slli a0, a0, 4
4324 ; RV64-NEXT: add sp, sp, a0
4325 ; RV64-NEXT: addi sp, sp, 16
4327 %v = call <32 x i64> @llvm.vp.cttz.v32i64(<32 x i64> %va, i1 true, <32 x i1> %m, i32 %evl)
4331 define <32 x i64> @vp_cttz_zero_undef_v32i64_unmasked(<32 x i64> %va, i32 zeroext %evl) {
4332 ; RV32-LABEL: vp_cttz_zero_undef_v32i64_unmasked:
4334 ; RV32-NEXT: addi sp, sp, -48
4335 ; RV32-NEXT: .cfi_def_cfa_offset 48
4336 ; RV32-NEXT: csrr a1, vlenb
4337 ; RV32-NEXT: slli a1, a1, 4
4338 ; RV32-NEXT: sub sp, sp, a1
4339 ; RV32-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x30, 0x22, 0x11, 0x10, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 48 + 16 * vlenb
4340 ; RV32-NEXT: csrr a1, vlenb
4341 ; RV32-NEXT: slli a1, a1, 3
4342 ; RV32-NEXT: add a1, sp, a1
4343 ; RV32-NEXT: addi a1, a1, 48
4344 ; RV32-NEXT: vs8r.v v16, (a1) # Unknown-size Folded Spill
4345 ; RV32-NEXT: lui a1, 349525
4346 ; RV32-NEXT: addi a1, a1, 1365
4347 ; RV32-NEXT: sw a1, 44(sp)
4348 ; RV32-NEXT: sw a1, 40(sp)
4349 ; RV32-NEXT: lui a1, 209715
4350 ; RV32-NEXT: addi a1, a1, 819
4351 ; RV32-NEXT: sw a1, 36(sp)
4352 ; RV32-NEXT: sw a1, 32(sp)
4353 ; RV32-NEXT: lui a1, 61681
4354 ; RV32-NEXT: addi a1, a1, -241
4355 ; RV32-NEXT: sw a1, 28(sp)
4356 ; RV32-NEXT: sw a1, 24(sp)
4357 ; RV32-NEXT: lui a1, 4112
4358 ; RV32-NEXT: addi a1, a1, 257
4359 ; RV32-NEXT: sw a1, 20(sp)
4360 ; RV32-NEXT: li a2, 16
4361 ; RV32-NEXT: sw a1, 16(sp)
4362 ; RV32-NEXT: mv a1, a0
4363 ; RV32-NEXT: bltu a0, a2, .LBB71_2
4364 ; RV32-NEXT: # %bb.1:
4365 ; RV32-NEXT: li a1, 16
4366 ; RV32-NEXT: .LBB71_2:
4367 ; RV32-NEXT: li a2, 1
4368 ; RV32-NEXT: vsetvli zero, a1, e64, m8, ta, ma
4369 ; RV32-NEXT: vsub.vx v24, v8, a2
4370 ; RV32-NEXT: vnot.v v8, v8
4371 ; RV32-NEXT: vand.vv v0, v8, v24
4372 ; RV32-NEXT: addi a3, sp, 40
4373 ; RV32-NEXT: vsetivli zero, 16, e64, m8, ta, ma
4374 ; RV32-NEXT: vlse64.v v16, (a3), zero
4375 ; RV32-NEXT: addi a3, sp, 32
4376 ; RV32-NEXT: vlse64.v v8, (a3), zero
4377 ; RV32-NEXT: vsetvli zero, a1, e64, m8, ta, ma
4378 ; RV32-NEXT: vsrl.vi v24, v0, 1
4379 ; RV32-NEXT: vand.vv v24, v24, v16
4380 ; RV32-NEXT: vsub.vv v24, v0, v24
4381 ; RV32-NEXT: vand.vv v0, v24, v8
4382 ; RV32-NEXT: vsrl.vi v24, v24, 2
4383 ; RV32-NEXT: vand.vv v24, v24, v8
4384 ; RV32-NEXT: vadd.vv v24, v0, v24
4385 ; RV32-NEXT: vsrl.vi v0, v24, 4
4386 ; RV32-NEXT: vadd.vv v24, v24, v0
4387 ; RV32-NEXT: addi a3, sp, 48
4388 ; RV32-NEXT: vs8r.v v24, (a3) # Unknown-size Folded Spill
4389 ; RV32-NEXT: addi a3, a0, -16
4390 ; RV32-NEXT: sltu a0, a0, a3
4391 ; RV32-NEXT: addi a0, a0, -1
4392 ; RV32-NEXT: and a0, a0, a3
4393 ; RV32-NEXT: csrr a3, vlenb
4394 ; RV32-NEXT: slli a3, a3, 3
4395 ; RV32-NEXT: add a3, sp, a3
4396 ; RV32-NEXT: addi a3, a3, 48
4397 ; RV32-NEXT: vl8r.v v0, (a3) # Unknown-size Folded Reload
4398 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
4399 ; RV32-NEXT: vsub.vx v24, v0, a2
4400 ; RV32-NEXT: vnot.v v0, v0
4401 ; RV32-NEXT: vand.vv v24, v0, v24
4402 ; RV32-NEXT: vsrl.vi v0, v24, 1
4403 ; RV32-NEXT: vand.vv v16, v0, v16
4404 ; RV32-NEXT: addi a2, sp, 24
4405 ; RV32-NEXT: vsub.vv v16, v24, v16
4406 ; RV32-NEXT: vand.vv v24, v16, v8
4407 ; RV32-NEXT: vsrl.vi v16, v16, 2
4408 ; RV32-NEXT: vand.vv v8, v16, v8
4409 ; RV32-NEXT: vsetivli zero, 16, e64, m8, ta, ma
4410 ; RV32-NEXT: vlse64.v v16, (a2), zero
4411 ; RV32-NEXT: addi a2, sp, 16
4412 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
4413 ; RV32-NEXT: vadd.vv v8, v24, v8
4414 ; RV32-NEXT: vsetivli zero, 16, e64, m8, ta, ma
4415 ; RV32-NEXT: vlse64.v v24, (a2), zero
4416 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
4417 ; RV32-NEXT: vsrl.vi v0, v8, 4
4418 ; RV32-NEXT: vadd.vv v8, v8, v0
4419 ; RV32-NEXT: addi a2, sp, 48
4420 ; RV32-NEXT: vl8r.v v0, (a2) # Unknown-size Folded Reload
4421 ; RV32-NEXT: vsetvli zero, a1, e64, m8, ta, ma
4422 ; RV32-NEXT: vand.vv v0, v0, v16
4423 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
4424 ; RV32-NEXT: vand.vv v8, v8, v16
4425 ; RV32-NEXT: vsetvli zero, a1, e64, m8, ta, ma
4426 ; RV32-NEXT: vmul.vv v16, v0, v24
4427 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
4428 ; RV32-NEXT: vmul.vv v24, v8, v24
4429 ; RV32-NEXT: li a2, 56
4430 ; RV32-NEXT: vsetvli zero, a1, e64, m8, ta, ma
4431 ; RV32-NEXT: vsrl.vx v8, v16, a2
4432 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
4433 ; RV32-NEXT: vsrl.vx v16, v24, a2
4434 ; RV32-NEXT: csrr a0, vlenb
4435 ; RV32-NEXT: slli a0, a0, 4
4436 ; RV32-NEXT: add sp, sp, a0
4437 ; RV32-NEXT: addi sp, sp, 48
4440 ; RV64-LABEL: vp_cttz_zero_undef_v32i64_unmasked:
4442 ; RV64-NEXT: li a2, 16
4443 ; RV64-NEXT: mv a1, a0
4444 ; RV64-NEXT: bltu a0, a2, .LBB71_2
4445 ; RV64-NEXT: # %bb.1:
4446 ; RV64-NEXT: li a1, 16
4447 ; RV64-NEXT: .LBB71_2:
4448 ; RV64-NEXT: li a2, 1
4449 ; RV64-NEXT: vsetvli zero, a1, e64, m8, ta, ma
4450 ; RV64-NEXT: vsub.vx v24, v8, a2
4451 ; RV64-NEXT: vnot.v v8, v8
4452 ; RV64-NEXT: vand.vv v8, v8, v24
4453 ; RV64-NEXT: vsrl.vi v24, v8, 1
4454 ; RV64-NEXT: lui a1, 349525
4455 ; RV64-NEXT: addiw a1, a1, 1365
4456 ; RV64-NEXT: slli a3, a1, 32
4457 ; RV64-NEXT: add a1, a1, a3
4458 ; RV64-NEXT: vand.vx v24, v24, a1
4459 ; RV64-NEXT: vsub.vv v8, v8, v24
4460 ; RV64-NEXT: lui a3, 209715
4461 ; RV64-NEXT: addiw a3, a3, 819
4462 ; RV64-NEXT: slli a4, a3, 32
4463 ; RV64-NEXT: add a3, a3, a4
4464 ; RV64-NEXT: vand.vx v24, v8, a3
4465 ; RV64-NEXT: vsrl.vi v8, v8, 2
4466 ; RV64-NEXT: vand.vx v8, v8, a3
4467 ; RV64-NEXT: vadd.vv v8, v24, v8
4468 ; RV64-NEXT: vsrl.vi v24, v8, 4
4469 ; RV64-NEXT: vadd.vv v8, v8, v24
4470 ; RV64-NEXT: lui a4, 61681
4471 ; RV64-NEXT: addiw a4, a4, -241
4472 ; RV64-NEXT: slli a5, a4, 32
4473 ; RV64-NEXT: add a4, a4, a5
4474 ; RV64-NEXT: vand.vx v8, v8, a4
4475 ; RV64-NEXT: lui a5, 4112
4476 ; RV64-NEXT: addiw a5, a5, 257
4477 ; RV64-NEXT: slli a6, a5, 32
4478 ; RV64-NEXT: add a5, a5, a6
4479 ; RV64-NEXT: vmul.vx v8, v8, a5
4480 ; RV64-NEXT: li a6, 56
4481 ; RV64-NEXT: vsrl.vx v8, v8, a6
4482 ; RV64-NEXT: addi a7, a0, -16
4483 ; RV64-NEXT: sltu a0, a0, a7
4484 ; RV64-NEXT: addi a0, a0, -1
4485 ; RV64-NEXT: and a0, a0, a7
4486 ; RV64-NEXT: vsetvli zero, a0, e64, m8, ta, ma
4487 ; RV64-NEXT: vsub.vx v24, v16, a2
4488 ; RV64-NEXT: vnot.v v16, v16
4489 ; RV64-NEXT: vand.vv v16, v16, v24
4490 ; RV64-NEXT: vsrl.vi v24, v16, 1
4491 ; RV64-NEXT: vand.vx v24, v24, a1
4492 ; RV64-NEXT: vsub.vv v16, v16, v24
4493 ; RV64-NEXT: vand.vx v24, v16, a3
4494 ; RV64-NEXT: vsrl.vi v16, v16, 2
4495 ; RV64-NEXT: vand.vx v16, v16, a3
4496 ; RV64-NEXT: vadd.vv v16, v24, v16
4497 ; RV64-NEXT: vsrl.vi v24, v16, 4
4498 ; RV64-NEXT: vadd.vv v16, v16, v24
4499 ; RV64-NEXT: vand.vx v16, v16, a4
4500 ; RV64-NEXT: vmul.vx v16, v16, a5
4501 ; RV64-NEXT: vsrl.vx v16, v16, a6
4503 %v = call <32 x i64> @llvm.vp.cttz.v32i64(<32 x i64> %va, i1 true, <32 x i1> splat (i1 true), i32 %evl)