1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv32 -mattr=+d,+zfh,+experimental-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,+experimental-zvfh,+v,+m -target-abi=lp64d \
5 ; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV64
7 declare <vscale x 1 x i8> @llvm.vp.cttz.nxv1i8(<vscale x 1 x i8>, i1 immarg, <vscale x 1 x i1>, i32)
9 define <vscale x 1 x i8> @vp_cttz_nxv1i8(<vscale x 1 x i8> %va, <vscale x 1 x i1> %m, i32 zeroext %evl) {
10 ; CHECK-LABEL: vp_cttz_nxv1i8:
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 <vscale x 1 x i8> @llvm.vp.cttz.nxv1i8(<vscale x 1 x i8> %va, i1 false, <vscale x 1 x i1> %m, i32 %evl)
31 ret <vscale x 1 x i8> %v
34 define <vscale x 1 x i8> @vp_cttz_nxv1i8_unmasked(<vscale x 1 x i8> %va, i32 zeroext %evl) {
35 ; CHECK-LABEL: vp_cttz_nxv1i8_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 %head = insertelement <vscale x 1 x i1> poison, i1 true, i32 0
56 %m = shufflevector <vscale x 1 x i1> %head, <vscale x 1 x i1> poison, <vscale x 1 x i32> zeroinitializer
57 %v = call <vscale x 1 x i8> @llvm.vp.cttz.nxv1i8(<vscale x 1 x i8> %va, i1 false, <vscale x 1 x i1> %m, i32 %evl)
58 ret <vscale x 1 x i8> %v
61 declare <vscale x 2 x i8> @llvm.vp.cttz.nxv2i8(<vscale x 2 x i8>, i1 immarg, <vscale x 2 x i1>, i32)
63 define <vscale x 2 x i8> @vp_cttz_nxv2i8(<vscale x 2 x i8> %va, <vscale x 2 x i1> %m, i32 zeroext %evl) {
64 ; CHECK-LABEL: vp_cttz_nxv2i8:
66 ; CHECK-NEXT: li a1, 1
67 ; CHECK-NEXT: vsetvli zero, a0, e8, mf4, ta, ma
68 ; CHECK-NEXT: vsub.vx v9, v8, a1, v0.t
69 ; CHECK-NEXT: vnot.v v8, v8, v0.t
70 ; CHECK-NEXT: vand.vv v8, v8, v9, v0.t
71 ; CHECK-NEXT: vsrl.vi v9, v8, 1, v0.t
72 ; CHECK-NEXT: li a0, 85
73 ; CHECK-NEXT: vand.vx v9, v9, a0, v0.t
74 ; CHECK-NEXT: vsub.vv v8, v8, v9, v0.t
75 ; CHECK-NEXT: li a0, 51
76 ; CHECK-NEXT: vand.vx v9, v8, a0, v0.t
77 ; CHECK-NEXT: vsrl.vi v8, v8, 2, v0.t
78 ; CHECK-NEXT: vand.vx v8, v8, a0, v0.t
79 ; CHECK-NEXT: vadd.vv v8, v9, v8, v0.t
80 ; CHECK-NEXT: vsrl.vi v9, v8, 4, v0.t
81 ; CHECK-NEXT: vadd.vv v8, v8, v9, v0.t
82 ; CHECK-NEXT: vand.vi v8, v8, 15, v0.t
84 %v = call <vscale x 2 x i8> @llvm.vp.cttz.nxv2i8(<vscale x 2 x i8> %va, i1 false, <vscale x 2 x i1> %m, i32 %evl)
85 ret <vscale x 2 x i8> %v
88 define <vscale x 2 x i8> @vp_cttz_nxv2i8_unmasked(<vscale x 2 x i8> %va, i32 zeroext %evl) {
89 ; CHECK-LABEL: vp_cttz_nxv2i8_unmasked:
91 ; CHECK-NEXT: li a1, 1
92 ; CHECK-NEXT: vsetvli zero, a0, e8, mf4, ta, ma
93 ; CHECK-NEXT: vsub.vx v9, v8, a1
94 ; CHECK-NEXT: vnot.v v8, v8
95 ; CHECK-NEXT: vand.vv v8, v8, v9
96 ; CHECK-NEXT: vsrl.vi v9, v8, 1
97 ; CHECK-NEXT: li a0, 85
98 ; CHECK-NEXT: vand.vx v9, v9, a0
99 ; CHECK-NEXT: vsub.vv v8, v8, v9
100 ; CHECK-NEXT: li a0, 51
101 ; CHECK-NEXT: vand.vx v9, v8, a0
102 ; CHECK-NEXT: vsrl.vi v8, v8, 2
103 ; CHECK-NEXT: vand.vx v8, v8, a0
104 ; CHECK-NEXT: vadd.vv v8, v9, v8
105 ; CHECK-NEXT: vsrl.vi v9, v8, 4
106 ; CHECK-NEXT: vadd.vv v8, v8, v9
107 ; CHECK-NEXT: vand.vi v8, v8, 15
109 %head = insertelement <vscale x 2 x i1> poison, i1 true, i32 0
110 %m = shufflevector <vscale x 2 x i1> %head, <vscale x 2 x i1> poison, <vscale x 2 x i32> zeroinitializer
111 %v = call <vscale x 2 x i8> @llvm.vp.cttz.nxv2i8(<vscale x 2 x i8> %va, i1 false, <vscale x 2 x i1> %m, i32 %evl)
112 ret <vscale x 2 x i8> %v
115 declare <vscale x 4 x i8> @llvm.vp.cttz.nxv4i8(<vscale x 4 x i8>, i1 immarg, <vscale x 4 x i1>, i32)
117 define <vscale x 4 x i8> @vp_cttz_nxv4i8(<vscale x 4 x i8> %va, <vscale x 4 x i1> %m, i32 zeroext %evl) {
118 ; CHECK-LABEL: vp_cttz_nxv4i8:
120 ; CHECK-NEXT: li a1, 1
121 ; CHECK-NEXT: vsetvli zero, a0, e8, mf2, ta, ma
122 ; CHECK-NEXT: vsub.vx v9, v8, a1, v0.t
123 ; CHECK-NEXT: vnot.v v8, v8, v0.t
124 ; CHECK-NEXT: vand.vv v8, v8, v9, v0.t
125 ; CHECK-NEXT: vsrl.vi v9, v8, 1, v0.t
126 ; CHECK-NEXT: li a0, 85
127 ; CHECK-NEXT: vand.vx v9, v9, a0, v0.t
128 ; CHECK-NEXT: vsub.vv v8, v8, v9, v0.t
129 ; CHECK-NEXT: li a0, 51
130 ; CHECK-NEXT: vand.vx v9, v8, a0, v0.t
131 ; CHECK-NEXT: vsrl.vi v8, v8, 2, v0.t
132 ; CHECK-NEXT: vand.vx v8, v8, a0, v0.t
133 ; CHECK-NEXT: vadd.vv v8, v9, v8, v0.t
134 ; CHECK-NEXT: vsrl.vi v9, v8, 4, v0.t
135 ; CHECK-NEXT: vadd.vv v8, v8, v9, v0.t
136 ; CHECK-NEXT: vand.vi v8, v8, 15, v0.t
138 %v = call <vscale x 4 x i8> @llvm.vp.cttz.nxv4i8(<vscale x 4 x i8> %va, i1 false, <vscale x 4 x i1> %m, i32 %evl)
139 ret <vscale x 4 x i8> %v
142 define <vscale x 4 x i8> @vp_cttz_nxv4i8_unmasked(<vscale x 4 x i8> %va, i32 zeroext %evl) {
143 ; CHECK-LABEL: vp_cttz_nxv4i8_unmasked:
145 ; CHECK-NEXT: li a1, 1
146 ; CHECK-NEXT: vsetvli zero, a0, e8, mf2, ta, ma
147 ; CHECK-NEXT: vsub.vx v9, v8, a1
148 ; CHECK-NEXT: vnot.v v8, v8
149 ; CHECK-NEXT: vand.vv v8, v8, v9
150 ; CHECK-NEXT: vsrl.vi v9, v8, 1
151 ; CHECK-NEXT: li a0, 85
152 ; CHECK-NEXT: vand.vx v9, v9, a0
153 ; CHECK-NEXT: vsub.vv v8, v8, v9
154 ; CHECK-NEXT: li a0, 51
155 ; CHECK-NEXT: vand.vx v9, v8, a0
156 ; CHECK-NEXT: vsrl.vi v8, v8, 2
157 ; CHECK-NEXT: vand.vx v8, v8, a0
158 ; CHECK-NEXT: vadd.vv v8, v9, v8
159 ; CHECK-NEXT: vsrl.vi v9, v8, 4
160 ; CHECK-NEXT: vadd.vv v8, v8, v9
161 ; CHECK-NEXT: vand.vi v8, v8, 15
163 %head = insertelement <vscale x 4 x i1> poison, i1 true, i32 0
164 %m = shufflevector <vscale x 4 x i1> %head, <vscale x 4 x i1> poison, <vscale x 4 x i32> zeroinitializer
165 %v = call <vscale x 4 x i8> @llvm.vp.cttz.nxv4i8(<vscale x 4 x i8> %va, i1 false, <vscale x 4 x i1> %m, i32 %evl)
166 ret <vscale x 4 x i8> %v
169 declare <vscale x 8 x i8> @llvm.vp.cttz.nxv8i8(<vscale x 8 x i8>, i1 immarg, <vscale x 8 x i1>, i32)
171 define <vscale x 8 x i8> @vp_cttz_nxv8i8(<vscale x 8 x i8> %va, <vscale x 8 x i1> %m, i32 zeroext %evl) {
172 ; CHECK-LABEL: vp_cttz_nxv8i8:
174 ; CHECK-NEXT: li a1, 1
175 ; CHECK-NEXT: vsetvli zero, a0, e8, m1, ta, ma
176 ; CHECK-NEXT: vsub.vx v9, v8, a1, v0.t
177 ; CHECK-NEXT: vnot.v v8, v8, v0.t
178 ; CHECK-NEXT: vand.vv v8, v8, v9, v0.t
179 ; CHECK-NEXT: vsrl.vi v9, v8, 1, v0.t
180 ; CHECK-NEXT: li a0, 85
181 ; CHECK-NEXT: vand.vx v9, v9, a0, v0.t
182 ; CHECK-NEXT: vsub.vv v8, v8, v9, v0.t
183 ; CHECK-NEXT: li a0, 51
184 ; CHECK-NEXT: vand.vx v9, v8, a0, v0.t
185 ; CHECK-NEXT: vsrl.vi v8, v8, 2, v0.t
186 ; CHECK-NEXT: vand.vx v8, v8, a0, v0.t
187 ; CHECK-NEXT: vadd.vv v8, v9, v8, v0.t
188 ; CHECK-NEXT: vsrl.vi v9, v8, 4, v0.t
189 ; CHECK-NEXT: vadd.vv v8, v8, v9, v0.t
190 ; CHECK-NEXT: vand.vi v8, v8, 15, v0.t
192 %v = call <vscale x 8 x i8> @llvm.vp.cttz.nxv8i8(<vscale x 8 x i8> %va, i1 false, <vscale x 8 x i1> %m, i32 %evl)
193 ret <vscale x 8 x i8> %v
196 define <vscale x 8 x i8> @vp_cttz_nxv8i8_unmasked(<vscale x 8 x i8> %va, i32 zeroext %evl) {
197 ; CHECK-LABEL: vp_cttz_nxv8i8_unmasked:
199 ; CHECK-NEXT: li a1, 1
200 ; CHECK-NEXT: vsetvli zero, a0, e8, m1, ta, ma
201 ; CHECK-NEXT: vsub.vx v9, v8, a1
202 ; CHECK-NEXT: vnot.v v8, v8
203 ; CHECK-NEXT: vand.vv v8, v8, v9
204 ; CHECK-NEXT: vsrl.vi v9, v8, 1
205 ; CHECK-NEXT: li a0, 85
206 ; CHECK-NEXT: vand.vx v9, v9, a0
207 ; CHECK-NEXT: vsub.vv v8, v8, v9
208 ; CHECK-NEXT: li a0, 51
209 ; CHECK-NEXT: vand.vx v9, v8, a0
210 ; CHECK-NEXT: vsrl.vi v8, v8, 2
211 ; CHECK-NEXT: vand.vx v8, v8, a0
212 ; CHECK-NEXT: vadd.vv v8, v9, v8
213 ; CHECK-NEXT: vsrl.vi v9, v8, 4
214 ; CHECK-NEXT: vadd.vv v8, v8, v9
215 ; CHECK-NEXT: vand.vi v8, v8, 15
217 %head = insertelement <vscale x 8 x i1> poison, i1 true, i32 0
218 %m = shufflevector <vscale x 8 x i1> %head, <vscale x 8 x i1> poison, <vscale x 8 x i32> zeroinitializer
219 %v = call <vscale x 8 x i8> @llvm.vp.cttz.nxv8i8(<vscale x 8 x i8> %va, i1 false, <vscale x 8 x i1> %m, i32 %evl)
220 ret <vscale x 8 x i8> %v
223 declare <vscale x 16 x i8> @llvm.vp.cttz.nxv16i8(<vscale x 16 x i8>, i1 immarg, <vscale x 16 x i1>, i32)
225 define <vscale x 16 x i8> @vp_cttz_nxv16i8(<vscale x 16 x i8> %va, <vscale x 16 x i1> %m, i32 zeroext %evl) {
226 ; CHECK-LABEL: vp_cttz_nxv16i8:
228 ; CHECK-NEXT: li a1, 1
229 ; CHECK-NEXT: vsetvli zero, a0, e8, m2, ta, ma
230 ; CHECK-NEXT: vsub.vx v10, v8, a1, v0.t
231 ; CHECK-NEXT: vnot.v v8, v8, v0.t
232 ; CHECK-NEXT: vand.vv v8, v8, v10, v0.t
233 ; CHECK-NEXT: vsrl.vi v10, v8, 1, v0.t
234 ; CHECK-NEXT: li a0, 85
235 ; CHECK-NEXT: vand.vx v10, v10, a0, v0.t
236 ; CHECK-NEXT: vsub.vv v8, v8, v10, v0.t
237 ; CHECK-NEXT: li a0, 51
238 ; CHECK-NEXT: vand.vx v10, v8, a0, v0.t
239 ; CHECK-NEXT: vsrl.vi v8, v8, 2, v0.t
240 ; CHECK-NEXT: vand.vx v8, v8, a0, v0.t
241 ; CHECK-NEXT: vadd.vv v8, v10, v8, v0.t
242 ; CHECK-NEXT: vsrl.vi v10, v8, 4, v0.t
243 ; CHECK-NEXT: vadd.vv v8, v8, v10, v0.t
244 ; CHECK-NEXT: vand.vi v8, v8, 15, v0.t
246 %v = call <vscale x 16 x i8> @llvm.vp.cttz.nxv16i8(<vscale x 16 x i8> %va, i1 false, <vscale x 16 x i1> %m, i32 %evl)
247 ret <vscale x 16 x i8> %v
250 define <vscale x 16 x i8> @vp_cttz_nxv16i8_unmasked(<vscale x 16 x i8> %va, i32 zeroext %evl) {
251 ; CHECK-LABEL: vp_cttz_nxv16i8_unmasked:
253 ; CHECK-NEXT: li a1, 1
254 ; CHECK-NEXT: vsetvli zero, a0, e8, m2, ta, ma
255 ; CHECK-NEXT: vsub.vx v10, v8, a1
256 ; CHECK-NEXT: vnot.v v8, v8
257 ; CHECK-NEXT: vand.vv v8, v8, v10
258 ; CHECK-NEXT: vsrl.vi v10, v8, 1
259 ; CHECK-NEXT: li a0, 85
260 ; CHECK-NEXT: vand.vx v10, v10, a0
261 ; CHECK-NEXT: vsub.vv v8, v8, v10
262 ; CHECK-NEXT: li a0, 51
263 ; CHECK-NEXT: vand.vx v10, v8, a0
264 ; CHECK-NEXT: vsrl.vi v8, v8, 2
265 ; CHECK-NEXT: vand.vx v8, v8, a0
266 ; CHECK-NEXT: vadd.vv v8, v10, v8
267 ; CHECK-NEXT: vsrl.vi v10, v8, 4
268 ; CHECK-NEXT: vadd.vv v8, v8, v10
269 ; CHECK-NEXT: vand.vi v8, v8, 15
271 %head = insertelement <vscale x 16 x i1> poison, i1 true, i32 0
272 %m = shufflevector <vscale x 16 x i1> %head, <vscale x 16 x i1> poison, <vscale x 16 x i32> zeroinitializer
273 %v = call <vscale x 16 x i8> @llvm.vp.cttz.nxv16i8(<vscale x 16 x i8> %va, i1 false, <vscale x 16 x i1> %m, i32 %evl)
274 ret <vscale x 16 x i8> %v
277 declare <vscale x 32 x i8> @llvm.vp.cttz.nxv32i8(<vscale x 32 x i8>, i1 immarg, <vscale x 32 x i1>, i32)
279 define <vscale x 32 x i8> @vp_cttz_nxv32i8(<vscale x 32 x i8> %va, <vscale x 32 x i1> %m, i32 zeroext %evl) {
280 ; CHECK-LABEL: vp_cttz_nxv32i8:
282 ; CHECK-NEXT: li a1, 1
283 ; CHECK-NEXT: vsetvli zero, a0, e8, m4, ta, ma
284 ; CHECK-NEXT: vsub.vx v12, v8, a1, v0.t
285 ; CHECK-NEXT: vnot.v v8, v8, v0.t
286 ; CHECK-NEXT: vand.vv v8, v8, v12, v0.t
287 ; CHECK-NEXT: vsrl.vi v12, v8, 1, v0.t
288 ; CHECK-NEXT: li a0, 85
289 ; CHECK-NEXT: vand.vx v12, v12, a0, v0.t
290 ; CHECK-NEXT: vsub.vv v8, v8, v12, v0.t
291 ; CHECK-NEXT: li a0, 51
292 ; CHECK-NEXT: vand.vx v12, v8, a0, v0.t
293 ; CHECK-NEXT: vsrl.vi v8, v8, 2, v0.t
294 ; CHECK-NEXT: vand.vx v8, v8, a0, v0.t
295 ; CHECK-NEXT: vadd.vv v8, v12, v8, v0.t
296 ; CHECK-NEXT: vsrl.vi v12, v8, 4, v0.t
297 ; CHECK-NEXT: vadd.vv v8, v8, v12, v0.t
298 ; CHECK-NEXT: vand.vi v8, v8, 15, v0.t
300 %v = call <vscale x 32 x i8> @llvm.vp.cttz.nxv32i8(<vscale x 32 x i8> %va, i1 false, <vscale x 32 x i1> %m, i32 %evl)
301 ret <vscale x 32 x i8> %v
304 define <vscale x 32 x i8> @vp_cttz_nxv32i8_unmasked(<vscale x 32 x i8> %va, i32 zeroext %evl) {
305 ; CHECK-LABEL: vp_cttz_nxv32i8_unmasked:
307 ; CHECK-NEXT: li a1, 1
308 ; CHECK-NEXT: vsetvli zero, a0, e8, m4, ta, ma
309 ; CHECK-NEXT: vsub.vx v12, v8, a1
310 ; CHECK-NEXT: vnot.v v8, v8
311 ; CHECK-NEXT: vand.vv v8, v8, v12
312 ; CHECK-NEXT: vsrl.vi v12, v8, 1
313 ; CHECK-NEXT: li a0, 85
314 ; CHECK-NEXT: vand.vx v12, v12, a0
315 ; CHECK-NEXT: vsub.vv v8, v8, v12
316 ; CHECK-NEXT: li a0, 51
317 ; CHECK-NEXT: vand.vx v12, v8, a0
318 ; CHECK-NEXT: vsrl.vi v8, v8, 2
319 ; CHECK-NEXT: vand.vx v8, v8, a0
320 ; CHECK-NEXT: vadd.vv v8, v12, v8
321 ; CHECK-NEXT: vsrl.vi v12, v8, 4
322 ; CHECK-NEXT: vadd.vv v8, v8, v12
323 ; CHECK-NEXT: vand.vi v8, v8, 15
325 %head = insertelement <vscale x 32 x i1> poison, i1 true, i32 0
326 %m = shufflevector <vscale x 32 x i1> %head, <vscale x 32 x i1> poison, <vscale x 32 x i32> zeroinitializer
327 %v = call <vscale x 32 x i8> @llvm.vp.cttz.nxv32i8(<vscale x 32 x i8> %va, i1 false, <vscale x 32 x i1> %m, i32 %evl)
328 ret <vscale x 32 x i8> %v
331 declare <vscale x 64 x i8> @llvm.vp.cttz.nxv64i8(<vscale x 64 x i8>, i1 immarg, <vscale x 64 x i1>, i32)
333 define <vscale x 64 x i8> @vp_cttz_nxv64i8(<vscale x 64 x i8> %va, <vscale x 64 x i1> %m, i32 zeroext %evl) {
334 ; CHECK-LABEL: vp_cttz_nxv64i8:
336 ; CHECK-NEXT: li a1, 1
337 ; CHECK-NEXT: vsetvli zero, a0, e8, m8, ta, ma
338 ; CHECK-NEXT: vsub.vx v16, v8, a1, v0.t
339 ; CHECK-NEXT: vnot.v v8, v8, v0.t
340 ; CHECK-NEXT: vand.vv v8, v8, v16, v0.t
341 ; CHECK-NEXT: vsrl.vi v16, v8, 1, v0.t
342 ; CHECK-NEXT: li a0, 85
343 ; CHECK-NEXT: vand.vx v16, v16, a0, v0.t
344 ; CHECK-NEXT: vsub.vv v8, v8, v16, v0.t
345 ; CHECK-NEXT: li a0, 51
346 ; CHECK-NEXT: vand.vx v16, v8, a0, v0.t
347 ; CHECK-NEXT: vsrl.vi v8, v8, 2, v0.t
348 ; CHECK-NEXT: vand.vx v8, v8, a0, v0.t
349 ; CHECK-NEXT: vadd.vv v8, v16, v8, v0.t
350 ; CHECK-NEXT: vsrl.vi v16, v8, 4, v0.t
351 ; CHECK-NEXT: vadd.vv v8, v8, v16, v0.t
352 ; CHECK-NEXT: vand.vi v8, v8, 15, v0.t
354 %v = call <vscale x 64 x i8> @llvm.vp.cttz.nxv64i8(<vscale x 64 x i8> %va, i1 false, <vscale x 64 x i1> %m, i32 %evl)
355 ret <vscale x 64 x i8> %v
358 define <vscale x 64 x i8> @vp_cttz_nxv64i8_unmasked(<vscale x 64 x i8> %va, i32 zeroext %evl) {
359 ; CHECK-LABEL: vp_cttz_nxv64i8_unmasked:
361 ; CHECK-NEXT: li a1, 1
362 ; CHECK-NEXT: vsetvli zero, a0, e8, m8, ta, ma
363 ; CHECK-NEXT: vsub.vx v16, v8, a1
364 ; CHECK-NEXT: vnot.v v8, v8
365 ; CHECK-NEXT: vand.vv v8, v8, v16
366 ; CHECK-NEXT: vsrl.vi v16, v8, 1
367 ; CHECK-NEXT: li a0, 85
368 ; CHECK-NEXT: vand.vx v16, v16, a0
369 ; CHECK-NEXT: vsub.vv v8, v8, v16
370 ; CHECK-NEXT: li a0, 51
371 ; CHECK-NEXT: vand.vx v16, v8, a0
372 ; CHECK-NEXT: vsrl.vi v8, v8, 2
373 ; CHECK-NEXT: vand.vx v8, v8, a0
374 ; CHECK-NEXT: vadd.vv v8, v16, v8
375 ; CHECK-NEXT: vsrl.vi v16, v8, 4
376 ; CHECK-NEXT: vadd.vv v8, v8, v16
377 ; CHECK-NEXT: vand.vi v8, v8, 15
379 %head = insertelement <vscale x 64 x i1> poison, i1 true, i32 0
380 %m = shufflevector <vscale x 64 x i1> %head, <vscale x 64 x i1> poison, <vscale x 64 x i32> zeroinitializer
381 %v = call <vscale x 64 x i8> @llvm.vp.cttz.nxv64i8(<vscale x 64 x i8> %va, i1 false, <vscale x 64 x i1> %m, i32 %evl)
382 ret <vscale x 64 x i8> %v
385 declare <vscale x 1 x i16> @llvm.vp.cttz.nxv1i16(<vscale x 1 x i16>, i1 immarg, <vscale x 1 x i1>, i32)
387 define <vscale x 1 x i16> @vp_cttz_nxv1i16(<vscale x 1 x i16> %va, <vscale x 1 x i1> %m, i32 zeroext %evl) {
388 ; RV32-LABEL: vp_cttz_nxv1i16:
390 ; RV32-NEXT: li a1, 1
391 ; RV32-NEXT: vsetvli zero, a0, e16, mf4, ta, ma
392 ; RV32-NEXT: vsub.vx v9, v8, a1, v0.t
393 ; RV32-NEXT: vnot.v v8, v8, v0.t
394 ; RV32-NEXT: vand.vv v8, v8, v9, v0.t
395 ; RV32-NEXT: vsrl.vi v9, v8, 1, v0.t
396 ; RV32-NEXT: lui a0, 5
397 ; RV32-NEXT: addi a0, a0, 1365
398 ; RV32-NEXT: vand.vx v9, v9, a0, v0.t
399 ; RV32-NEXT: vsub.vv v8, v8, v9, v0.t
400 ; RV32-NEXT: lui a0, 3
401 ; RV32-NEXT: addi a0, a0, 819
402 ; RV32-NEXT: vand.vx v9, v8, a0, v0.t
403 ; RV32-NEXT: vsrl.vi v8, v8, 2, v0.t
404 ; RV32-NEXT: vand.vx v8, v8, a0, v0.t
405 ; RV32-NEXT: vadd.vv v8, v9, v8, v0.t
406 ; RV32-NEXT: vsrl.vi v9, v8, 4, v0.t
407 ; RV32-NEXT: vadd.vv v8, v8, v9, v0.t
408 ; RV32-NEXT: lui a0, 1
409 ; RV32-NEXT: addi a0, a0, -241
410 ; RV32-NEXT: vand.vx v8, v8, a0, v0.t
411 ; RV32-NEXT: li a0, 257
412 ; RV32-NEXT: vmul.vx v8, v8, a0, v0.t
413 ; RV32-NEXT: vsrl.vi v8, v8, 8, v0.t
416 ; RV64-LABEL: vp_cttz_nxv1i16:
418 ; RV64-NEXT: li a1, 1
419 ; RV64-NEXT: vsetvli zero, a0, e16, mf4, ta, ma
420 ; RV64-NEXT: vsub.vx v9, v8, a1, v0.t
421 ; RV64-NEXT: vnot.v v8, v8, v0.t
422 ; RV64-NEXT: vand.vv v8, v8, v9, v0.t
423 ; RV64-NEXT: vsrl.vi v9, v8, 1, v0.t
424 ; RV64-NEXT: lui a0, 5
425 ; RV64-NEXT: addiw a0, a0, 1365
426 ; RV64-NEXT: vand.vx v9, v9, a0, v0.t
427 ; RV64-NEXT: vsub.vv v8, v8, v9, v0.t
428 ; RV64-NEXT: lui a0, 3
429 ; RV64-NEXT: addiw a0, a0, 819
430 ; RV64-NEXT: vand.vx v9, v8, a0, v0.t
431 ; RV64-NEXT: vsrl.vi v8, v8, 2, v0.t
432 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
433 ; RV64-NEXT: vadd.vv v8, v9, v8, v0.t
434 ; RV64-NEXT: vsrl.vi v9, v8, 4, v0.t
435 ; RV64-NEXT: vadd.vv v8, v8, v9, v0.t
436 ; RV64-NEXT: lui a0, 1
437 ; RV64-NEXT: addiw a0, a0, -241
438 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
439 ; RV64-NEXT: li a0, 257
440 ; RV64-NEXT: vmul.vx v8, v8, a0, v0.t
441 ; RV64-NEXT: vsrl.vi v8, v8, 8, v0.t
443 %v = call <vscale x 1 x i16> @llvm.vp.cttz.nxv1i16(<vscale x 1 x i16> %va, i1 false, <vscale x 1 x i1> %m, i32 %evl)
444 ret <vscale x 1 x i16> %v
447 define <vscale x 1 x i16> @vp_cttz_nxv1i16_unmasked(<vscale x 1 x i16> %va, i32 zeroext %evl) {
448 ; RV32-LABEL: vp_cttz_nxv1i16_unmasked:
450 ; RV32-NEXT: li a1, 1
451 ; RV32-NEXT: vsetvli zero, a0, e16, mf4, ta, ma
452 ; RV32-NEXT: vsub.vx v9, v8, a1
453 ; RV32-NEXT: vnot.v v8, v8
454 ; RV32-NEXT: vand.vv v8, v8, v9
455 ; RV32-NEXT: vsrl.vi v9, v8, 1
456 ; RV32-NEXT: lui a0, 5
457 ; RV32-NEXT: addi a0, a0, 1365
458 ; RV32-NEXT: vand.vx v9, v9, a0
459 ; RV32-NEXT: vsub.vv v8, v8, v9
460 ; RV32-NEXT: lui a0, 3
461 ; RV32-NEXT: addi a0, a0, 819
462 ; RV32-NEXT: vand.vx v9, v8, a0
463 ; RV32-NEXT: vsrl.vi v8, v8, 2
464 ; RV32-NEXT: vand.vx v8, v8, a0
465 ; RV32-NEXT: vadd.vv v8, v9, v8
466 ; RV32-NEXT: vsrl.vi v9, v8, 4
467 ; RV32-NEXT: vadd.vv v8, v8, v9
468 ; RV32-NEXT: lui a0, 1
469 ; RV32-NEXT: addi a0, a0, -241
470 ; RV32-NEXT: vand.vx v8, v8, a0
471 ; RV32-NEXT: li a0, 257
472 ; RV32-NEXT: vmul.vx v8, v8, a0
473 ; RV32-NEXT: vsrl.vi v8, v8, 8
476 ; RV64-LABEL: vp_cttz_nxv1i16_unmasked:
478 ; RV64-NEXT: li a1, 1
479 ; RV64-NEXT: vsetvli zero, a0, e16, mf4, ta, ma
480 ; RV64-NEXT: vsub.vx v9, v8, a1
481 ; RV64-NEXT: vnot.v v8, v8
482 ; RV64-NEXT: vand.vv v8, v8, v9
483 ; RV64-NEXT: vsrl.vi v9, v8, 1
484 ; RV64-NEXT: lui a0, 5
485 ; RV64-NEXT: addiw a0, a0, 1365
486 ; RV64-NEXT: vand.vx v9, v9, a0
487 ; RV64-NEXT: vsub.vv v8, v8, v9
488 ; RV64-NEXT: lui a0, 3
489 ; RV64-NEXT: addiw a0, a0, 819
490 ; RV64-NEXT: vand.vx v9, v8, a0
491 ; RV64-NEXT: vsrl.vi v8, v8, 2
492 ; RV64-NEXT: vand.vx v8, v8, a0
493 ; RV64-NEXT: vadd.vv v8, v9, v8
494 ; RV64-NEXT: vsrl.vi v9, v8, 4
495 ; RV64-NEXT: vadd.vv v8, v8, v9
496 ; RV64-NEXT: lui a0, 1
497 ; RV64-NEXT: addiw a0, a0, -241
498 ; RV64-NEXT: vand.vx v8, v8, a0
499 ; RV64-NEXT: li a0, 257
500 ; RV64-NEXT: vmul.vx v8, v8, a0
501 ; RV64-NEXT: vsrl.vi v8, v8, 8
503 %head = insertelement <vscale x 1 x i1> poison, i1 true, i32 0
504 %m = shufflevector <vscale x 1 x i1> %head, <vscale x 1 x i1> poison, <vscale x 1 x i32> zeroinitializer
505 %v = call <vscale x 1 x i16> @llvm.vp.cttz.nxv1i16(<vscale x 1 x i16> %va, i1 false, <vscale x 1 x i1> %m, i32 %evl)
506 ret <vscale x 1 x i16> %v
509 declare <vscale x 2 x i16> @llvm.vp.cttz.nxv2i16(<vscale x 2 x i16>, i1 immarg, <vscale x 2 x i1>, i32)
511 define <vscale x 2 x i16> @vp_cttz_nxv2i16(<vscale x 2 x i16> %va, <vscale x 2 x i1> %m, i32 zeroext %evl) {
512 ; RV32-LABEL: vp_cttz_nxv2i16:
514 ; RV32-NEXT: li a1, 1
515 ; RV32-NEXT: vsetvli zero, a0, e16, mf2, ta, ma
516 ; RV32-NEXT: vsub.vx v9, v8, a1, v0.t
517 ; RV32-NEXT: vnot.v v8, v8, v0.t
518 ; RV32-NEXT: vand.vv v8, v8, v9, v0.t
519 ; RV32-NEXT: vsrl.vi v9, v8, 1, v0.t
520 ; RV32-NEXT: lui a0, 5
521 ; RV32-NEXT: addi a0, a0, 1365
522 ; RV32-NEXT: vand.vx v9, v9, a0, v0.t
523 ; RV32-NEXT: vsub.vv v8, v8, v9, v0.t
524 ; RV32-NEXT: lui a0, 3
525 ; RV32-NEXT: addi a0, a0, 819
526 ; RV32-NEXT: vand.vx v9, v8, a0, v0.t
527 ; RV32-NEXT: vsrl.vi v8, v8, 2, v0.t
528 ; RV32-NEXT: vand.vx v8, v8, a0, v0.t
529 ; RV32-NEXT: vadd.vv v8, v9, v8, v0.t
530 ; RV32-NEXT: vsrl.vi v9, v8, 4, v0.t
531 ; RV32-NEXT: vadd.vv v8, v8, v9, v0.t
532 ; RV32-NEXT: lui a0, 1
533 ; RV32-NEXT: addi a0, a0, -241
534 ; RV32-NEXT: vand.vx v8, v8, a0, v0.t
535 ; RV32-NEXT: li a0, 257
536 ; RV32-NEXT: vmul.vx v8, v8, a0, v0.t
537 ; RV32-NEXT: vsrl.vi v8, v8, 8, v0.t
540 ; RV64-LABEL: vp_cttz_nxv2i16:
542 ; RV64-NEXT: li a1, 1
543 ; RV64-NEXT: vsetvli zero, a0, e16, mf2, ta, ma
544 ; RV64-NEXT: vsub.vx v9, v8, a1, v0.t
545 ; RV64-NEXT: vnot.v v8, v8, v0.t
546 ; RV64-NEXT: vand.vv v8, v8, v9, v0.t
547 ; RV64-NEXT: vsrl.vi v9, v8, 1, v0.t
548 ; RV64-NEXT: lui a0, 5
549 ; RV64-NEXT: addiw a0, a0, 1365
550 ; RV64-NEXT: vand.vx v9, v9, a0, v0.t
551 ; RV64-NEXT: vsub.vv v8, v8, v9, v0.t
552 ; RV64-NEXT: lui a0, 3
553 ; RV64-NEXT: addiw a0, a0, 819
554 ; RV64-NEXT: vand.vx v9, v8, a0, v0.t
555 ; RV64-NEXT: vsrl.vi v8, v8, 2, v0.t
556 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
557 ; RV64-NEXT: vadd.vv v8, v9, v8, v0.t
558 ; RV64-NEXT: vsrl.vi v9, v8, 4, v0.t
559 ; RV64-NEXT: vadd.vv v8, v8, v9, v0.t
560 ; RV64-NEXT: lui a0, 1
561 ; RV64-NEXT: addiw a0, a0, -241
562 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
563 ; RV64-NEXT: li a0, 257
564 ; RV64-NEXT: vmul.vx v8, v8, a0, v0.t
565 ; RV64-NEXT: vsrl.vi v8, v8, 8, v0.t
567 %v = call <vscale x 2 x i16> @llvm.vp.cttz.nxv2i16(<vscale x 2 x i16> %va, i1 false, <vscale x 2 x i1> %m, i32 %evl)
568 ret <vscale x 2 x i16> %v
571 define <vscale x 2 x i16> @vp_cttz_nxv2i16_unmasked(<vscale x 2 x i16> %va, i32 zeroext %evl) {
572 ; RV32-LABEL: vp_cttz_nxv2i16_unmasked:
574 ; RV32-NEXT: li a1, 1
575 ; RV32-NEXT: vsetvli zero, a0, e16, mf2, ta, ma
576 ; RV32-NEXT: vsub.vx v9, v8, a1
577 ; RV32-NEXT: vnot.v v8, v8
578 ; RV32-NEXT: vand.vv v8, v8, v9
579 ; RV32-NEXT: vsrl.vi v9, v8, 1
580 ; RV32-NEXT: lui a0, 5
581 ; RV32-NEXT: addi a0, a0, 1365
582 ; RV32-NEXT: vand.vx v9, v9, a0
583 ; RV32-NEXT: vsub.vv v8, v8, v9
584 ; RV32-NEXT: lui a0, 3
585 ; RV32-NEXT: addi a0, a0, 819
586 ; RV32-NEXT: vand.vx v9, v8, a0
587 ; RV32-NEXT: vsrl.vi v8, v8, 2
588 ; RV32-NEXT: vand.vx v8, v8, a0
589 ; RV32-NEXT: vadd.vv v8, v9, v8
590 ; RV32-NEXT: vsrl.vi v9, v8, 4
591 ; RV32-NEXT: vadd.vv v8, v8, v9
592 ; RV32-NEXT: lui a0, 1
593 ; RV32-NEXT: addi a0, a0, -241
594 ; RV32-NEXT: vand.vx v8, v8, a0
595 ; RV32-NEXT: li a0, 257
596 ; RV32-NEXT: vmul.vx v8, v8, a0
597 ; RV32-NEXT: vsrl.vi v8, v8, 8
600 ; RV64-LABEL: vp_cttz_nxv2i16_unmasked:
602 ; RV64-NEXT: li a1, 1
603 ; RV64-NEXT: vsetvli zero, a0, e16, mf2, ta, ma
604 ; RV64-NEXT: vsub.vx v9, v8, a1
605 ; RV64-NEXT: vnot.v v8, v8
606 ; RV64-NEXT: vand.vv v8, v8, v9
607 ; RV64-NEXT: vsrl.vi v9, v8, 1
608 ; RV64-NEXT: lui a0, 5
609 ; RV64-NEXT: addiw a0, a0, 1365
610 ; RV64-NEXT: vand.vx v9, v9, a0
611 ; RV64-NEXT: vsub.vv v8, v8, v9
612 ; RV64-NEXT: lui a0, 3
613 ; RV64-NEXT: addiw a0, a0, 819
614 ; RV64-NEXT: vand.vx v9, v8, a0
615 ; RV64-NEXT: vsrl.vi v8, v8, 2
616 ; RV64-NEXT: vand.vx v8, v8, a0
617 ; RV64-NEXT: vadd.vv v8, v9, v8
618 ; RV64-NEXT: vsrl.vi v9, v8, 4
619 ; RV64-NEXT: vadd.vv v8, v8, v9
620 ; RV64-NEXT: lui a0, 1
621 ; RV64-NEXT: addiw a0, a0, -241
622 ; RV64-NEXT: vand.vx v8, v8, a0
623 ; RV64-NEXT: li a0, 257
624 ; RV64-NEXT: vmul.vx v8, v8, a0
625 ; RV64-NEXT: vsrl.vi v8, v8, 8
627 %head = insertelement <vscale x 2 x i1> poison, i1 true, i32 0
628 %m = shufflevector <vscale x 2 x i1> %head, <vscale x 2 x i1> poison, <vscale x 2 x i32> zeroinitializer
629 %v = call <vscale x 2 x i16> @llvm.vp.cttz.nxv2i16(<vscale x 2 x i16> %va, i1 false, <vscale x 2 x i1> %m, i32 %evl)
630 ret <vscale x 2 x i16> %v
633 declare <vscale x 4 x i16> @llvm.vp.cttz.nxv4i16(<vscale x 4 x i16>, i1 immarg, <vscale x 4 x i1>, i32)
635 define <vscale x 4 x i16> @vp_cttz_nxv4i16(<vscale x 4 x i16> %va, <vscale x 4 x i1> %m, i32 zeroext %evl) {
636 ; RV32-LABEL: vp_cttz_nxv4i16:
638 ; RV32-NEXT: li a1, 1
639 ; RV32-NEXT: vsetvli zero, a0, e16, m1, ta, ma
640 ; RV32-NEXT: vsub.vx v9, v8, a1, v0.t
641 ; RV32-NEXT: vnot.v v8, v8, v0.t
642 ; RV32-NEXT: vand.vv v8, v8, v9, v0.t
643 ; RV32-NEXT: vsrl.vi v9, v8, 1, v0.t
644 ; RV32-NEXT: lui a0, 5
645 ; RV32-NEXT: addi a0, a0, 1365
646 ; RV32-NEXT: vand.vx v9, v9, a0, v0.t
647 ; RV32-NEXT: vsub.vv v8, v8, v9, v0.t
648 ; RV32-NEXT: lui a0, 3
649 ; RV32-NEXT: addi a0, a0, 819
650 ; RV32-NEXT: vand.vx v9, v8, a0, v0.t
651 ; RV32-NEXT: vsrl.vi v8, v8, 2, v0.t
652 ; RV32-NEXT: vand.vx v8, v8, a0, v0.t
653 ; RV32-NEXT: vadd.vv v8, v9, v8, v0.t
654 ; RV32-NEXT: vsrl.vi v9, v8, 4, v0.t
655 ; RV32-NEXT: vadd.vv v8, v8, v9, v0.t
656 ; RV32-NEXT: lui a0, 1
657 ; RV32-NEXT: addi a0, a0, -241
658 ; RV32-NEXT: vand.vx v8, v8, a0, v0.t
659 ; RV32-NEXT: li a0, 257
660 ; RV32-NEXT: vmul.vx v8, v8, a0, v0.t
661 ; RV32-NEXT: vsrl.vi v8, v8, 8, v0.t
664 ; RV64-LABEL: vp_cttz_nxv4i16:
666 ; RV64-NEXT: li a1, 1
667 ; RV64-NEXT: vsetvli zero, a0, e16, m1, ta, ma
668 ; RV64-NEXT: vsub.vx v9, v8, a1, v0.t
669 ; RV64-NEXT: vnot.v v8, v8, v0.t
670 ; RV64-NEXT: vand.vv v8, v8, v9, v0.t
671 ; RV64-NEXT: vsrl.vi v9, v8, 1, v0.t
672 ; RV64-NEXT: lui a0, 5
673 ; RV64-NEXT: addiw a0, a0, 1365
674 ; RV64-NEXT: vand.vx v9, v9, a0, v0.t
675 ; RV64-NEXT: vsub.vv v8, v8, v9, v0.t
676 ; RV64-NEXT: lui a0, 3
677 ; RV64-NEXT: addiw a0, a0, 819
678 ; RV64-NEXT: vand.vx v9, v8, a0, v0.t
679 ; RV64-NEXT: vsrl.vi v8, v8, 2, v0.t
680 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
681 ; RV64-NEXT: vadd.vv v8, v9, v8, v0.t
682 ; RV64-NEXT: vsrl.vi v9, v8, 4, v0.t
683 ; RV64-NEXT: vadd.vv v8, v8, v9, v0.t
684 ; RV64-NEXT: lui a0, 1
685 ; RV64-NEXT: addiw a0, a0, -241
686 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
687 ; RV64-NEXT: li a0, 257
688 ; RV64-NEXT: vmul.vx v8, v8, a0, v0.t
689 ; RV64-NEXT: vsrl.vi v8, v8, 8, v0.t
691 %v = call <vscale x 4 x i16> @llvm.vp.cttz.nxv4i16(<vscale x 4 x i16> %va, i1 false, <vscale x 4 x i1> %m, i32 %evl)
692 ret <vscale x 4 x i16> %v
695 define <vscale x 4 x i16> @vp_cttz_nxv4i16_unmasked(<vscale x 4 x i16> %va, i32 zeroext %evl) {
696 ; RV32-LABEL: vp_cttz_nxv4i16_unmasked:
698 ; RV32-NEXT: li a1, 1
699 ; RV32-NEXT: vsetvli zero, a0, e16, m1, ta, ma
700 ; RV32-NEXT: vsub.vx v9, v8, a1
701 ; RV32-NEXT: vnot.v v8, v8
702 ; RV32-NEXT: vand.vv v8, v8, v9
703 ; RV32-NEXT: vsrl.vi v9, v8, 1
704 ; RV32-NEXT: lui a0, 5
705 ; RV32-NEXT: addi a0, a0, 1365
706 ; RV32-NEXT: vand.vx v9, v9, a0
707 ; RV32-NEXT: vsub.vv v8, v8, v9
708 ; RV32-NEXT: lui a0, 3
709 ; RV32-NEXT: addi a0, a0, 819
710 ; RV32-NEXT: vand.vx v9, v8, a0
711 ; RV32-NEXT: vsrl.vi v8, v8, 2
712 ; RV32-NEXT: vand.vx v8, v8, a0
713 ; RV32-NEXT: vadd.vv v8, v9, v8
714 ; RV32-NEXT: vsrl.vi v9, v8, 4
715 ; RV32-NEXT: vadd.vv v8, v8, v9
716 ; RV32-NEXT: lui a0, 1
717 ; RV32-NEXT: addi a0, a0, -241
718 ; RV32-NEXT: vand.vx v8, v8, a0
719 ; RV32-NEXT: li a0, 257
720 ; RV32-NEXT: vmul.vx v8, v8, a0
721 ; RV32-NEXT: vsrl.vi v8, v8, 8
724 ; RV64-LABEL: vp_cttz_nxv4i16_unmasked:
726 ; RV64-NEXT: li a1, 1
727 ; RV64-NEXT: vsetvli zero, a0, e16, m1, ta, ma
728 ; RV64-NEXT: vsub.vx v9, v8, a1
729 ; RV64-NEXT: vnot.v v8, v8
730 ; RV64-NEXT: vand.vv v8, v8, v9
731 ; RV64-NEXT: vsrl.vi v9, v8, 1
732 ; RV64-NEXT: lui a0, 5
733 ; RV64-NEXT: addiw a0, a0, 1365
734 ; RV64-NEXT: vand.vx v9, v9, a0
735 ; RV64-NEXT: vsub.vv v8, v8, v9
736 ; RV64-NEXT: lui a0, 3
737 ; RV64-NEXT: addiw a0, a0, 819
738 ; RV64-NEXT: vand.vx v9, v8, a0
739 ; RV64-NEXT: vsrl.vi v8, v8, 2
740 ; RV64-NEXT: vand.vx v8, v8, a0
741 ; RV64-NEXT: vadd.vv v8, v9, v8
742 ; RV64-NEXT: vsrl.vi v9, v8, 4
743 ; RV64-NEXT: vadd.vv v8, v8, v9
744 ; RV64-NEXT: lui a0, 1
745 ; RV64-NEXT: addiw a0, a0, -241
746 ; RV64-NEXT: vand.vx v8, v8, a0
747 ; RV64-NEXT: li a0, 257
748 ; RV64-NEXT: vmul.vx v8, v8, a0
749 ; RV64-NEXT: vsrl.vi v8, v8, 8
751 %head = insertelement <vscale x 4 x i1> poison, i1 true, i32 0
752 %m = shufflevector <vscale x 4 x i1> %head, <vscale x 4 x i1> poison, <vscale x 4 x i32> zeroinitializer
753 %v = call <vscale x 4 x i16> @llvm.vp.cttz.nxv4i16(<vscale x 4 x i16> %va, i1 false, <vscale x 4 x i1> %m, i32 %evl)
754 ret <vscale x 4 x i16> %v
757 declare <vscale x 8 x i16> @llvm.vp.cttz.nxv8i16(<vscale x 8 x i16>, i1 immarg, <vscale x 8 x i1>, i32)
759 define <vscale x 8 x i16> @vp_cttz_nxv8i16(<vscale x 8 x i16> %va, <vscale x 8 x i1> %m, i32 zeroext %evl) {
760 ; RV32-LABEL: vp_cttz_nxv8i16:
762 ; RV32-NEXT: li a1, 1
763 ; RV32-NEXT: vsetvli zero, a0, e16, m2, ta, ma
764 ; RV32-NEXT: vsub.vx v10, v8, a1, v0.t
765 ; RV32-NEXT: vnot.v v8, v8, v0.t
766 ; RV32-NEXT: vand.vv v8, v8, v10, v0.t
767 ; RV32-NEXT: vsrl.vi v10, v8, 1, v0.t
768 ; RV32-NEXT: lui a0, 5
769 ; RV32-NEXT: addi a0, a0, 1365
770 ; RV32-NEXT: vand.vx v10, v10, a0, v0.t
771 ; RV32-NEXT: vsub.vv v8, v8, v10, v0.t
772 ; RV32-NEXT: lui a0, 3
773 ; RV32-NEXT: addi a0, a0, 819
774 ; RV32-NEXT: vand.vx v10, v8, a0, v0.t
775 ; RV32-NEXT: vsrl.vi v8, v8, 2, v0.t
776 ; RV32-NEXT: vand.vx v8, v8, a0, v0.t
777 ; RV32-NEXT: vadd.vv v8, v10, v8, v0.t
778 ; RV32-NEXT: vsrl.vi v10, v8, 4, v0.t
779 ; RV32-NEXT: vadd.vv v8, v8, v10, v0.t
780 ; RV32-NEXT: lui a0, 1
781 ; RV32-NEXT: addi a0, a0, -241
782 ; RV32-NEXT: vand.vx v8, v8, a0, v0.t
783 ; RV32-NEXT: li a0, 257
784 ; RV32-NEXT: vmul.vx v8, v8, a0, v0.t
785 ; RV32-NEXT: vsrl.vi v8, v8, 8, v0.t
788 ; RV64-LABEL: vp_cttz_nxv8i16:
790 ; RV64-NEXT: li a1, 1
791 ; RV64-NEXT: vsetvli zero, a0, e16, m2, ta, ma
792 ; RV64-NEXT: vsub.vx v10, v8, a1, v0.t
793 ; RV64-NEXT: vnot.v v8, v8, v0.t
794 ; RV64-NEXT: vand.vv v8, v8, v10, v0.t
795 ; RV64-NEXT: vsrl.vi v10, v8, 1, v0.t
796 ; RV64-NEXT: lui a0, 5
797 ; RV64-NEXT: addiw a0, a0, 1365
798 ; RV64-NEXT: vand.vx v10, v10, a0, v0.t
799 ; RV64-NEXT: vsub.vv v8, v8, v10, v0.t
800 ; RV64-NEXT: lui a0, 3
801 ; RV64-NEXT: addiw a0, a0, 819
802 ; RV64-NEXT: vand.vx v10, v8, a0, v0.t
803 ; RV64-NEXT: vsrl.vi v8, v8, 2, v0.t
804 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
805 ; RV64-NEXT: vadd.vv v8, v10, v8, v0.t
806 ; RV64-NEXT: vsrl.vi v10, v8, 4, v0.t
807 ; RV64-NEXT: vadd.vv v8, v8, v10, v0.t
808 ; RV64-NEXT: lui a0, 1
809 ; RV64-NEXT: addiw a0, a0, -241
810 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
811 ; RV64-NEXT: li a0, 257
812 ; RV64-NEXT: vmul.vx v8, v8, a0, v0.t
813 ; RV64-NEXT: vsrl.vi v8, v8, 8, v0.t
815 %v = call <vscale x 8 x i16> @llvm.vp.cttz.nxv8i16(<vscale x 8 x i16> %va, i1 false, <vscale x 8 x i1> %m, i32 %evl)
816 ret <vscale x 8 x i16> %v
819 define <vscale x 8 x i16> @vp_cttz_nxv8i16_unmasked(<vscale x 8 x i16> %va, i32 zeroext %evl) {
820 ; RV32-LABEL: vp_cttz_nxv8i16_unmasked:
822 ; RV32-NEXT: li a1, 1
823 ; RV32-NEXT: vsetvli zero, a0, e16, m2, ta, ma
824 ; RV32-NEXT: vsub.vx v10, v8, a1
825 ; RV32-NEXT: vnot.v v8, v8
826 ; RV32-NEXT: vand.vv v8, v8, v10
827 ; RV32-NEXT: vsrl.vi v10, v8, 1
828 ; RV32-NEXT: lui a0, 5
829 ; RV32-NEXT: addi a0, a0, 1365
830 ; RV32-NEXT: vand.vx v10, v10, a0
831 ; RV32-NEXT: vsub.vv v8, v8, v10
832 ; RV32-NEXT: lui a0, 3
833 ; RV32-NEXT: addi a0, a0, 819
834 ; RV32-NEXT: vand.vx v10, v8, a0
835 ; RV32-NEXT: vsrl.vi v8, v8, 2
836 ; RV32-NEXT: vand.vx v8, v8, a0
837 ; RV32-NEXT: vadd.vv v8, v10, v8
838 ; RV32-NEXT: vsrl.vi v10, v8, 4
839 ; RV32-NEXT: vadd.vv v8, v8, v10
840 ; RV32-NEXT: lui a0, 1
841 ; RV32-NEXT: addi a0, a0, -241
842 ; RV32-NEXT: vand.vx v8, v8, a0
843 ; RV32-NEXT: li a0, 257
844 ; RV32-NEXT: vmul.vx v8, v8, a0
845 ; RV32-NEXT: vsrl.vi v8, v8, 8
848 ; RV64-LABEL: vp_cttz_nxv8i16_unmasked:
850 ; RV64-NEXT: li a1, 1
851 ; RV64-NEXT: vsetvli zero, a0, e16, m2, ta, ma
852 ; RV64-NEXT: vsub.vx v10, v8, a1
853 ; RV64-NEXT: vnot.v v8, v8
854 ; RV64-NEXT: vand.vv v8, v8, v10
855 ; RV64-NEXT: vsrl.vi v10, v8, 1
856 ; RV64-NEXT: lui a0, 5
857 ; RV64-NEXT: addiw a0, a0, 1365
858 ; RV64-NEXT: vand.vx v10, v10, a0
859 ; RV64-NEXT: vsub.vv v8, v8, v10
860 ; RV64-NEXT: lui a0, 3
861 ; RV64-NEXT: addiw a0, a0, 819
862 ; RV64-NEXT: vand.vx v10, v8, a0
863 ; RV64-NEXT: vsrl.vi v8, v8, 2
864 ; RV64-NEXT: vand.vx v8, v8, a0
865 ; RV64-NEXT: vadd.vv v8, v10, v8
866 ; RV64-NEXT: vsrl.vi v10, v8, 4
867 ; RV64-NEXT: vadd.vv v8, v8, v10
868 ; RV64-NEXT: lui a0, 1
869 ; RV64-NEXT: addiw a0, a0, -241
870 ; RV64-NEXT: vand.vx v8, v8, a0
871 ; RV64-NEXT: li a0, 257
872 ; RV64-NEXT: vmul.vx v8, v8, a0
873 ; RV64-NEXT: vsrl.vi v8, v8, 8
875 %head = insertelement <vscale x 8 x i1> poison, i1 true, i32 0
876 %m = shufflevector <vscale x 8 x i1> %head, <vscale x 8 x i1> poison, <vscale x 8 x i32> zeroinitializer
877 %v = call <vscale x 8 x i16> @llvm.vp.cttz.nxv8i16(<vscale x 8 x i16> %va, i1 false, <vscale x 8 x i1> %m, i32 %evl)
878 ret <vscale x 8 x i16> %v
881 declare <vscale x 16 x i16> @llvm.vp.cttz.nxv16i16(<vscale x 16 x i16>, i1 immarg, <vscale x 16 x i1>, i32)
883 define <vscale x 16 x i16> @vp_cttz_nxv16i16(<vscale x 16 x i16> %va, <vscale x 16 x i1> %m, i32 zeroext %evl) {
884 ; RV32-LABEL: vp_cttz_nxv16i16:
886 ; RV32-NEXT: li a1, 1
887 ; RV32-NEXT: vsetvli zero, a0, e16, m4, ta, ma
888 ; RV32-NEXT: vsub.vx v12, v8, a1, v0.t
889 ; RV32-NEXT: vnot.v v8, v8, v0.t
890 ; RV32-NEXT: vand.vv v8, v8, v12, v0.t
891 ; RV32-NEXT: vsrl.vi v12, v8, 1, v0.t
892 ; RV32-NEXT: lui a0, 5
893 ; RV32-NEXT: addi a0, a0, 1365
894 ; RV32-NEXT: vand.vx v12, v12, a0, v0.t
895 ; RV32-NEXT: vsub.vv v8, v8, v12, v0.t
896 ; RV32-NEXT: lui a0, 3
897 ; RV32-NEXT: addi a0, a0, 819
898 ; RV32-NEXT: vand.vx v12, v8, a0, v0.t
899 ; RV32-NEXT: vsrl.vi v8, v8, 2, v0.t
900 ; RV32-NEXT: vand.vx v8, v8, a0, v0.t
901 ; RV32-NEXT: vadd.vv v8, v12, v8, v0.t
902 ; RV32-NEXT: vsrl.vi v12, v8, 4, v0.t
903 ; RV32-NEXT: vadd.vv v8, v8, v12, v0.t
904 ; RV32-NEXT: lui a0, 1
905 ; RV32-NEXT: addi a0, a0, -241
906 ; RV32-NEXT: vand.vx v8, v8, a0, v0.t
907 ; RV32-NEXT: li a0, 257
908 ; RV32-NEXT: vmul.vx v8, v8, a0, v0.t
909 ; RV32-NEXT: vsrl.vi v8, v8, 8, v0.t
912 ; RV64-LABEL: vp_cttz_nxv16i16:
914 ; RV64-NEXT: li a1, 1
915 ; RV64-NEXT: vsetvli zero, a0, e16, m4, ta, ma
916 ; RV64-NEXT: vsub.vx v12, v8, a1, v0.t
917 ; RV64-NEXT: vnot.v v8, v8, v0.t
918 ; RV64-NEXT: vand.vv v8, v8, v12, v0.t
919 ; RV64-NEXT: vsrl.vi v12, v8, 1, v0.t
920 ; RV64-NEXT: lui a0, 5
921 ; RV64-NEXT: addiw a0, a0, 1365
922 ; RV64-NEXT: vand.vx v12, v12, a0, v0.t
923 ; RV64-NEXT: vsub.vv v8, v8, v12, v0.t
924 ; RV64-NEXT: lui a0, 3
925 ; RV64-NEXT: addiw a0, a0, 819
926 ; RV64-NEXT: vand.vx v12, v8, a0, v0.t
927 ; RV64-NEXT: vsrl.vi v8, v8, 2, v0.t
928 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
929 ; RV64-NEXT: vadd.vv v8, v12, v8, v0.t
930 ; RV64-NEXT: vsrl.vi v12, v8, 4, v0.t
931 ; RV64-NEXT: vadd.vv v8, v8, v12, v0.t
932 ; RV64-NEXT: lui a0, 1
933 ; RV64-NEXT: addiw a0, a0, -241
934 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
935 ; RV64-NEXT: li a0, 257
936 ; RV64-NEXT: vmul.vx v8, v8, a0, v0.t
937 ; RV64-NEXT: vsrl.vi v8, v8, 8, v0.t
939 %v = call <vscale x 16 x i16> @llvm.vp.cttz.nxv16i16(<vscale x 16 x i16> %va, i1 false, <vscale x 16 x i1> %m, i32 %evl)
940 ret <vscale x 16 x i16> %v
943 define <vscale x 16 x i16> @vp_cttz_nxv16i16_unmasked(<vscale x 16 x i16> %va, i32 zeroext %evl) {
944 ; RV32-LABEL: vp_cttz_nxv16i16_unmasked:
946 ; RV32-NEXT: li a1, 1
947 ; RV32-NEXT: vsetvli zero, a0, e16, m4, ta, ma
948 ; RV32-NEXT: vsub.vx v12, v8, a1
949 ; RV32-NEXT: vnot.v v8, v8
950 ; RV32-NEXT: vand.vv v8, v8, v12
951 ; RV32-NEXT: vsrl.vi v12, v8, 1
952 ; RV32-NEXT: lui a0, 5
953 ; RV32-NEXT: addi a0, a0, 1365
954 ; RV32-NEXT: vand.vx v12, v12, a0
955 ; RV32-NEXT: vsub.vv v8, v8, v12
956 ; RV32-NEXT: lui a0, 3
957 ; RV32-NEXT: addi a0, a0, 819
958 ; RV32-NEXT: vand.vx v12, v8, a0
959 ; RV32-NEXT: vsrl.vi v8, v8, 2
960 ; RV32-NEXT: vand.vx v8, v8, a0
961 ; RV32-NEXT: vadd.vv v8, v12, v8
962 ; RV32-NEXT: vsrl.vi v12, v8, 4
963 ; RV32-NEXT: vadd.vv v8, v8, v12
964 ; RV32-NEXT: lui a0, 1
965 ; RV32-NEXT: addi a0, a0, -241
966 ; RV32-NEXT: vand.vx v8, v8, a0
967 ; RV32-NEXT: li a0, 257
968 ; RV32-NEXT: vmul.vx v8, v8, a0
969 ; RV32-NEXT: vsrl.vi v8, v8, 8
972 ; RV64-LABEL: vp_cttz_nxv16i16_unmasked:
974 ; RV64-NEXT: li a1, 1
975 ; RV64-NEXT: vsetvli zero, a0, e16, m4, ta, ma
976 ; RV64-NEXT: vsub.vx v12, v8, a1
977 ; RV64-NEXT: vnot.v v8, v8
978 ; RV64-NEXT: vand.vv v8, v8, v12
979 ; RV64-NEXT: vsrl.vi v12, v8, 1
980 ; RV64-NEXT: lui a0, 5
981 ; RV64-NEXT: addiw a0, a0, 1365
982 ; RV64-NEXT: vand.vx v12, v12, a0
983 ; RV64-NEXT: vsub.vv v8, v8, v12
984 ; RV64-NEXT: lui a0, 3
985 ; RV64-NEXT: addiw a0, a0, 819
986 ; RV64-NEXT: vand.vx v12, v8, a0
987 ; RV64-NEXT: vsrl.vi v8, v8, 2
988 ; RV64-NEXT: vand.vx v8, v8, a0
989 ; RV64-NEXT: vadd.vv v8, v12, v8
990 ; RV64-NEXT: vsrl.vi v12, v8, 4
991 ; RV64-NEXT: vadd.vv v8, v8, v12
992 ; RV64-NEXT: lui a0, 1
993 ; RV64-NEXT: addiw a0, a0, -241
994 ; RV64-NEXT: vand.vx v8, v8, a0
995 ; RV64-NEXT: li a0, 257
996 ; RV64-NEXT: vmul.vx v8, v8, a0
997 ; RV64-NEXT: vsrl.vi v8, v8, 8
999 %head = insertelement <vscale x 16 x i1> poison, i1 true, i32 0
1000 %m = shufflevector <vscale x 16 x i1> %head, <vscale x 16 x i1> poison, <vscale x 16 x i32> zeroinitializer
1001 %v = call <vscale x 16 x i16> @llvm.vp.cttz.nxv16i16(<vscale x 16 x i16> %va, i1 false, <vscale x 16 x i1> %m, i32 %evl)
1002 ret <vscale x 16 x i16> %v
1005 declare <vscale x 32 x i16> @llvm.vp.cttz.nxv32i16(<vscale x 32 x i16>, i1 immarg, <vscale x 32 x i1>, i32)
1007 define <vscale x 32 x i16> @vp_cttz_nxv32i16(<vscale x 32 x i16> %va, <vscale x 32 x i1> %m, i32 zeroext %evl) {
1008 ; RV32-LABEL: vp_cttz_nxv32i16:
1010 ; RV32-NEXT: li a1, 1
1011 ; RV32-NEXT: vsetvli zero, a0, e16, m8, ta, ma
1012 ; RV32-NEXT: vsub.vx v16, v8, a1, v0.t
1013 ; RV32-NEXT: vnot.v v8, v8, v0.t
1014 ; RV32-NEXT: vand.vv v8, v8, v16, v0.t
1015 ; RV32-NEXT: vsrl.vi v16, v8, 1, v0.t
1016 ; RV32-NEXT: lui a0, 5
1017 ; RV32-NEXT: addi a0, a0, 1365
1018 ; RV32-NEXT: vand.vx v16, v16, a0, v0.t
1019 ; RV32-NEXT: vsub.vv v8, v8, v16, v0.t
1020 ; RV32-NEXT: lui a0, 3
1021 ; RV32-NEXT: addi a0, a0, 819
1022 ; RV32-NEXT: vand.vx v16, v8, a0, v0.t
1023 ; RV32-NEXT: vsrl.vi v8, v8, 2, v0.t
1024 ; RV32-NEXT: vand.vx v8, v8, a0, v0.t
1025 ; RV32-NEXT: vadd.vv v8, v16, v8, v0.t
1026 ; RV32-NEXT: vsrl.vi v16, v8, 4, v0.t
1027 ; RV32-NEXT: vadd.vv v8, v8, v16, v0.t
1028 ; RV32-NEXT: lui a0, 1
1029 ; RV32-NEXT: addi a0, a0, -241
1030 ; RV32-NEXT: vand.vx v8, v8, a0, v0.t
1031 ; RV32-NEXT: li a0, 257
1032 ; RV32-NEXT: vmul.vx v8, v8, a0, v0.t
1033 ; RV32-NEXT: vsrl.vi v8, v8, 8, v0.t
1036 ; RV64-LABEL: vp_cttz_nxv32i16:
1038 ; RV64-NEXT: li a1, 1
1039 ; RV64-NEXT: vsetvli zero, a0, e16, m8, ta, ma
1040 ; RV64-NEXT: vsub.vx v16, v8, a1, v0.t
1041 ; RV64-NEXT: vnot.v v8, v8, v0.t
1042 ; RV64-NEXT: vand.vv v8, v8, v16, v0.t
1043 ; RV64-NEXT: vsrl.vi v16, v8, 1, v0.t
1044 ; RV64-NEXT: lui a0, 5
1045 ; RV64-NEXT: addiw a0, a0, 1365
1046 ; RV64-NEXT: vand.vx v16, v16, a0, v0.t
1047 ; RV64-NEXT: vsub.vv v8, v8, v16, v0.t
1048 ; RV64-NEXT: lui a0, 3
1049 ; RV64-NEXT: addiw a0, a0, 819
1050 ; RV64-NEXT: vand.vx v16, v8, a0, v0.t
1051 ; RV64-NEXT: vsrl.vi v8, v8, 2, v0.t
1052 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
1053 ; RV64-NEXT: vadd.vv v8, v16, v8, v0.t
1054 ; RV64-NEXT: vsrl.vi v16, v8, 4, v0.t
1055 ; RV64-NEXT: vadd.vv v8, v8, v16, v0.t
1056 ; RV64-NEXT: lui a0, 1
1057 ; RV64-NEXT: addiw a0, a0, -241
1058 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
1059 ; RV64-NEXT: li a0, 257
1060 ; RV64-NEXT: vmul.vx v8, v8, a0, v0.t
1061 ; RV64-NEXT: vsrl.vi v8, v8, 8, v0.t
1063 %v = call <vscale x 32 x i16> @llvm.vp.cttz.nxv32i16(<vscale x 32 x i16> %va, i1 false, <vscale x 32 x i1> %m, i32 %evl)
1064 ret <vscale x 32 x i16> %v
1067 define <vscale x 32 x i16> @vp_cttz_nxv32i16_unmasked(<vscale x 32 x i16> %va, i32 zeroext %evl) {
1068 ; RV32-LABEL: vp_cttz_nxv32i16_unmasked:
1070 ; RV32-NEXT: li a1, 1
1071 ; RV32-NEXT: vsetvli zero, a0, e16, m8, ta, ma
1072 ; RV32-NEXT: vsub.vx v16, v8, a1
1073 ; RV32-NEXT: vnot.v v8, v8
1074 ; RV32-NEXT: vand.vv v8, v8, v16
1075 ; RV32-NEXT: vsrl.vi v16, v8, 1
1076 ; RV32-NEXT: lui a0, 5
1077 ; RV32-NEXT: addi a0, a0, 1365
1078 ; RV32-NEXT: vand.vx v16, v16, a0
1079 ; RV32-NEXT: vsub.vv v8, v8, v16
1080 ; RV32-NEXT: lui a0, 3
1081 ; RV32-NEXT: addi a0, a0, 819
1082 ; RV32-NEXT: vand.vx v16, v8, a0
1083 ; RV32-NEXT: vsrl.vi v8, v8, 2
1084 ; RV32-NEXT: vand.vx v8, v8, a0
1085 ; RV32-NEXT: vadd.vv v8, v16, v8
1086 ; RV32-NEXT: vsrl.vi v16, v8, 4
1087 ; RV32-NEXT: vadd.vv v8, v8, v16
1088 ; RV32-NEXT: lui a0, 1
1089 ; RV32-NEXT: addi a0, a0, -241
1090 ; RV32-NEXT: vand.vx v8, v8, a0
1091 ; RV32-NEXT: li a0, 257
1092 ; RV32-NEXT: vmul.vx v8, v8, a0
1093 ; RV32-NEXT: vsrl.vi v8, v8, 8
1096 ; RV64-LABEL: vp_cttz_nxv32i16_unmasked:
1098 ; RV64-NEXT: li a1, 1
1099 ; RV64-NEXT: vsetvli zero, a0, e16, m8, ta, ma
1100 ; RV64-NEXT: vsub.vx v16, v8, a1
1101 ; RV64-NEXT: vnot.v v8, v8
1102 ; RV64-NEXT: vand.vv v8, v8, v16
1103 ; RV64-NEXT: vsrl.vi v16, v8, 1
1104 ; RV64-NEXT: lui a0, 5
1105 ; RV64-NEXT: addiw a0, a0, 1365
1106 ; RV64-NEXT: vand.vx v16, v16, a0
1107 ; RV64-NEXT: vsub.vv v8, v8, v16
1108 ; RV64-NEXT: lui a0, 3
1109 ; RV64-NEXT: addiw a0, a0, 819
1110 ; RV64-NEXT: vand.vx v16, v8, a0
1111 ; RV64-NEXT: vsrl.vi v8, v8, 2
1112 ; RV64-NEXT: vand.vx v8, v8, a0
1113 ; RV64-NEXT: vadd.vv v8, v16, v8
1114 ; RV64-NEXT: vsrl.vi v16, v8, 4
1115 ; RV64-NEXT: vadd.vv v8, v8, v16
1116 ; RV64-NEXT: lui a0, 1
1117 ; RV64-NEXT: addiw a0, a0, -241
1118 ; RV64-NEXT: vand.vx v8, v8, a0
1119 ; RV64-NEXT: li a0, 257
1120 ; RV64-NEXT: vmul.vx v8, v8, a0
1121 ; RV64-NEXT: vsrl.vi v8, v8, 8
1123 %head = insertelement <vscale x 32 x i1> poison, i1 true, i32 0
1124 %m = shufflevector <vscale x 32 x i1> %head, <vscale x 32 x i1> poison, <vscale x 32 x i32> zeroinitializer
1125 %v = call <vscale x 32 x i16> @llvm.vp.cttz.nxv32i16(<vscale x 32 x i16> %va, i1 false, <vscale x 32 x i1> %m, i32 %evl)
1126 ret <vscale x 32 x i16> %v
1129 declare <vscale x 1 x i32> @llvm.vp.cttz.nxv1i32(<vscale x 1 x i32>, i1 immarg, <vscale x 1 x i1>, i32)
1131 define <vscale x 1 x i32> @vp_cttz_nxv1i32(<vscale x 1 x i32> %va, <vscale x 1 x i1> %m, i32 zeroext %evl) {
1132 ; RV32-LABEL: vp_cttz_nxv1i32:
1134 ; RV32-NEXT: li a1, 1
1135 ; RV32-NEXT: vsetvli zero, a0, e32, mf2, ta, ma
1136 ; RV32-NEXT: vsub.vx v9, v8, a1, v0.t
1137 ; RV32-NEXT: vnot.v v8, v8, v0.t
1138 ; RV32-NEXT: vand.vv v8, v8, v9, v0.t
1139 ; RV32-NEXT: vsrl.vi v9, v8, 1, v0.t
1140 ; RV32-NEXT: lui a0, 349525
1141 ; RV32-NEXT: addi a0, a0, 1365
1142 ; RV32-NEXT: vand.vx v9, v9, a0, v0.t
1143 ; RV32-NEXT: vsub.vv v8, v8, v9, v0.t
1144 ; RV32-NEXT: lui a0, 209715
1145 ; RV32-NEXT: addi a0, a0, 819
1146 ; RV32-NEXT: vand.vx v9, v8, a0, v0.t
1147 ; RV32-NEXT: vsrl.vi v8, v8, 2, v0.t
1148 ; RV32-NEXT: vand.vx v8, v8, a0, v0.t
1149 ; RV32-NEXT: vadd.vv v8, v9, v8, v0.t
1150 ; RV32-NEXT: vsrl.vi v9, v8, 4, v0.t
1151 ; RV32-NEXT: vadd.vv v8, v8, v9, v0.t
1152 ; RV32-NEXT: lui a0, 61681
1153 ; RV32-NEXT: addi a0, a0, -241
1154 ; RV32-NEXT: vand.vx v8, v8, a0, v0.t
1155 ; RV32-NEXT: lui a0, 4112
1156 ; RV32-NEXT: addi a0, a0, 257
1157 ; RV32-NEXT: vmul.vx v8, v8, a0, v0.t
1158 ; RV32-NEXT: vsrl.vi v8, v8, 24, v0.t
1161 ; RV64-LABEL: vp_cttz_nxv1i32:
1163 ; RV64-NEXT: li a1, 1
1164 ; RV64-NEXT: vsetvli zero, a0, e32, mf2, ta, ma
1165 ; RV64-NEXT: vsub.vx v9, v8, a1, v0.t
1166 ; RV64-NEXT: vnot.v v8, v8, v0.t
1167 ; RV64-NEXT: vand.vv v8, v8, v9, v0.t
1168 ; RV64-NEXT: vsrl.vi v9, v8, 1, v0.t
1169 ; RV64-NEXT: lui a0, 349525
1170 ; RV64-NEXT: addiw a0, a0, 1365
1171 ; RV64-NEXT: vand.vx v9, v9, a0, v0.t
1172 ; RV64-NEXT: vsub.vv v8, v8, v9, v0.t
1173 ; RV64-NEXT: lui a0, 209715
1174 ; RV64-NEXT: addiw a0, a0, 819
1175 ; RV64-NEXT: vand.vx v9, v8, a0, v0.t
1176 ; RV64-NEXT: vsrl.vi v8, v8, 2, v0.t
1177 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
1178 ; RV64-NEXT: vadd.vv v8, v9, v8, v0.t
1179 ; RV64-NEXT: vsrl.vi v9, v8, 4, v0.t
1180 ; RV64-NEXT: vadd.vv v8, v8, v9, v0.t
1181 ; RV64-NEXT: lui a0, 61681
1182 ; RV64-NEXT: addiw a0, a0, -241
1183 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
1184 ; RV64-NEXT: lui a0, 4112
1185 ; RV64-NEXT: addiw a0, a0, 257
1186 ; RV64-NEXT: vmul.vx v8, v8, a0, v0.t
1187 ; RV64-NEXT: vsrl.vi v8, v8, 24, v0.t
1189 %v = call <vscale x 1 x i32> @llvm.vp.cttz.nxv1i32(<vscale x 1 x i32> %va, i1 false, <vscale x 1 x i1> %m, i32 %evl)
1190 ret <vscale x 1 x i32> %v
1193 define <vscale x 1 x i32> @vp_cttz_nxv1i32_unmasked(<vscale x 1 x i32> %va, i32 zeroext %evl) {
1194 ; RV32-LABEL: vp_cttz_nxv1i32_unmasked:
1196 ; RV32-NEXT: li a1, 1
1197 ; RV32-NEXT: vsetvli zero, a0, e32, mf2, ta, ma
1198 ; RV32-NEXT: vsub.vx v9, v8, a1
1199 ; RV32-NEXT: vnot.v v8, v8
1200 ; RV32-NEXT: vand.vv v8, v8, v9
1201 ; RV32-NEXT: vsrl.vi v9, v8, 1
1202 ; RV32-NEXT: lui a0, 349525
1203 ; RV32-NEXT: addi a0, a0, 1365
1204 ; RV32-NEXT: vand.vx v9, v9, a0
1205 ; RV32-NEXT: vsub.vv v8, v8, v9
1206 ; RV32-NEXT: lui a0, 209715
1207 ; RV32-NEXT: addi a0, a0, 819
1208 ; RV32-NEXT: vand.vx v9, v8, a0
1209 ; RV32-NEXT: vsrl.vi v8, v8, 2
1210 ; RV32-NEXT: vand.vx v8, v8, a0
1211 ; RV32-NEXT: vadd.vv v8, v9, v8
1212 ; RV32-NEXT: vsrl.vi v9, v8, 4
1213 ; RV32-NEXT: vadd.vv v8, v8, v9
1214 ; RV32-NEXT: lui a0, 61681
1215 ; RV32-NEXT: addi a0, a0, -241
1216 ; RV32-NEXT: vand.vx v8, v8, a0
1217 ; RV32-NEXT: lui a0, 4112
1218 ; RV32-NEXT: addi a0, a0, 257
1219 ; RV32-NEXT: vmul.vx v8, v8, a0
1220 ; RV32-NEXT: vsrl.vi v8, v8, 24
1223 ; RV64-LABEL: vp_cttz_nxv1i32_unmasked:
1225 ; RV64-NEXT: li a1, 1
1226 ; RV64-NEXT: vsetvli zero, a0, e32, mf2, ta, ma
1227 ; RV64-NEXT: vsub.vx v9, v8, a1
1228 ; RV64-NEXT: vnot.v v8, v8
1229 ; RV64-NEXT: vand.vv v8, v8, v9
1230 ; RV64-NEXT: vsrl.vi v9, v8, 1
1231 ; RV64-NEXT: lui a0, 349525
1232 ; RV64-NEXT: addiw a0, a0, 1365
1233 ; RV64-NEXT: vand.vx v9, v9, a0
1234 ; RV64-NEXT: vsub.vv v8, v8, v9
1235 ; RV64-NEXT: lui a0, 209715
1236 ; RV64-NEXT: addiw a0, a0, 819
1237 ; RV64-NEXT: vand.vx v9, v8, a0
1238 ; RV64-NEXT: vsrl.vi v8, v8, 2
1239 ; RV64-NEXT: vand.vx v8, v8, a0
1240 ; RV64-NEXT: vadd.vv v8, v9, v8
1241 ; RV64-NEXT: vsrl.vi v9, v8, 4
1242 ; RV64-NEXT: vadd.vv v8, v8, v9
1243 ; RV64-NEXT: lui a0, 61681
1244 ; RV64-NEXT: addiw a0, a0, -241
1245 ; RV64-NEXT: vand.vx v8, v8, a0
1246 ; RV64-NEXT: lui a0, 4112
1247 ; RV64-NEXT: addiw a0, a0, 257
1248 ; RV64-NEXT: vmul.vx v8, v8, a0
1249 ; RV64-NEXT: vsrl.vi v8, v8, 24
1251 %head = insertelement <vscale x 1 x i1> poison, i1 true, i32 0
1252 %m = shufflevector <vscale x 1 x i1> %head, <vscale x 1 x i1> poison, <vscale x 1 x i32> zeroinitializer
1253 %v = call <vscale x 1 x i32> @llvm.vp.cttz.nxv1i32(<vscale x 1 x i32> %va, i1 false, <vscale x 1 x i1> %m, i32 %evl)
1254 ret <vscale x 1 x i32> %v
1257 declare <vscale x 2 x i32> @llvm.vp.cttz.nxv2i32(<vscale x 2 x i32>, i1 immarg, <vscale x 2 x i1>, i32)
1259 define <vscale x 2 x i32> @vp_cttz_nxv2i32(<vscale x 2 x i32> %va, <vscale x 2 x i1> %m, i32 zeroext %evl) {
1260 ; RV32-LABEL: vp_cttz_nxv2i32:
1262 ; RV32-NEXT: li a1, 1
1263 ; RV32-NEXT: vsetvli zero, a0, e32, m1, ta, ma
1264 ; RV32-NEXT: vsub.vx v9, v8, a1, v0.t
1265 ; RV32-NEXT: vnot.v v8, v8, v0.t
1266 ; RV32-NEXT: vand.vv v8, v8, v9, v0.t
1267 ; RV32-NEXT: vsrl.vi v9, v8, 1, v0.t
1268 ; RV32-NEXT: lui a0, 349525
1269 ; RV32-NEXT: addi a0, a0, 1365
1270 ; RV32-NEXT: vand.vx v9, v9, a0, v0.t
1271 ; RV32-NEXT: vsub.vv v8, v8, v9, v0.t
1272 ; RV32-NEXT: lui a0, 209715
1273 ; RV32-NEXT: addi a0, a0, 819
1274 ; RV32-NEXT: vand.vx v9, v8, a0, v0.t
1275 ; RV32-NEXT: vsrl.vi v8, v8, 2, v0.t
1276 ; RV32-NEXT: vand.vx v8, v8, a0, v0.t
1277 ; RV32-NEXT: vadd.vv v8, v9, v8, v0.t
1278 ; RV32-NEXT: vsrl.vi v9, v8, 4, v0.t
1279 ; RV32-NEXT: vadd.vv v8, v8, v9, v0.t
1280 ; RV32-NEXT: lui a0, 61681
1281 ; RV32-NEXT: addi a0, a0, -241
1282 ; RV32-NEXT: vand.vx v8, v8, a0, v0.t
1283 ; RV32-NEXT: lui a0, 4112
1284 ; RV32-NEXT: addi a0, a0, 257
1285 ; RV32-NEXT: vmul.vx v8, v8, a0, v0.t
1286 ; RV32-NEXT: vsrl.vi v8, v8, 24, v0.t
1289 ; RV64-LABEL: vp_cttz_nxv2i32:
1291 ; RV64-NEXT: li a1, 1
1292 ; RV64-NEXT: vsetvli zero, a0, e32, m1, ta, ma
1293 ; RV64-NEXT: vsub.vx v9, v8, a1, v0.t
1294 ; RV64-NEXT: vnot.v v8, v8, v0.t
1295 ; RV64-NEXT: vand.vv v8, v8, v9, v0.t
1296 ; RV64-NEXT: vsrl.vi v9, v8, 1, v0.t
1297 ; RV64-NEXT: lui a0, 349525
1298 ; RV64-NEXT: addiw a0, a0, 1365
1299 ; RV64-NEXT: vand.vx v9, v9, a0, v0.t
1300 ; RV64-NEXT: vsub.vv v8, v8, v9, v0.t
1301 ; RV64-NEXT: lui a0, 209715
1302 ; RV64-NEXT: addiw a0, a0, 819
1303 ; RV64-NEXT: vand.vx v9, v8, a0, v0.t
1304 ; RV64-NEXT: vsrl.vi v8, v8, 2, v0.t
1305 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
1306 ; RV64-NEXT: vadd.vv v8, v9, v8, v0.t
1307 ; RV64-NEXT: vsrl.vi v9, v8, 4, v0.t
1308 ; RV64-NEXT: vadd.vv v8, v8, v9, v0.t
1309 ; RV64-NEXT: lui a0, 61681
1310 ; RV64-NEXT: addiw a0, a0, -241
1311 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
1312 ; RV64-NEXT: lui a0, 4112
1313 ; RV64-NEXT: addiw a0, a0, 257
1314 ; RV64-NEXT: vmul.vx v8, v8, a0, v0.t
1315 ; RV64-NEXT: vsrl.vi v8, v8, 24, v0.t
1317 %v = call <vscale x 2 x i32> @llvm.vp.cttz.nxv2i32(<vscale x 2 x i32> %va, i1 false, <vscale x 2 x i1> %m, i32 %evl)
1318 ret <vscale x 2 x i32> %v
1321 define <vscale x 2 x i32> @vp_cttz_nxv2i32_unmasked(<vscale x 2 x i32> %va, i32 zeroext %evl) {
1322 ; RV32-LABEL: vp_cttz_nxv2i32_unmasked:
1324 ; RV32-NEXT: li a1, 1
1325 ; RV32-NEXT: vsetvli zero, a0, e32, m1, ta, ma
1326 ; RV32-NEXT: vsub.vx v9, v8, a1
1327 ; RV32-NEXT: vnot.v v8, v8
1328 ; RV32-NEXT: vand.vv v8, v8, v9
1329 ; RV32-NEXT: vsrl.vi v9, v8, 1
1330 ; RV32-NEXT: lui a0, 349525
1331 ; RV32-NEXT: addi a0, a0, 1365
1332 ; RV32-NEXT: vand.vx v9, v9, a0
1333 ; RV32-NEXT: vsub.vv v8, v8, v9
1334 ; RV32-NEXT: lui a0, 209715
1335 ; RV32-NEXT: addi a0, a0, 819
1336 ; RV32-NEXT: vand.vx v9, v8, a0
1337 ; RV32-NEXT: vsrl.vi v8, v8, 2
1338 ; RV32-NEXT: vand.vx v8, v8, a0
1339 ; RV32-NEXT: vadd.vv v8, v9, v8
1340 ; RV32-NEXT: vsrl.vi v9, v8, 4
1341 ; RV32-NEXT: vadd.vv v8, v8, v9
1342 ; RV32-NEXT: lui a0, 61681
1343 ; RV32-NEXT: addi a0, a0, -241
1344 ; RV32-NEXT: vand.vx v8, v8, a0
1345 ; RV32-NEXT: lui a0, 4112
1346 ; RV32-NEXT: addi a0, a0, 257
1347 ; RV32-NEXT: vmul.vx v8, v8, a0
1348 ; RV32-NEXT: vsrl.vi v8, v8, 24
1351 ; RV64-LABEL: vp_cttz_nxv2i32_unmasked:
1353 ; RV64-NEXT: li a1, 1
1354 ; RV64-NEXT: vsetvli zero, a0, e32, m1, ta, ma
1355 ; RV64-NEXT: vsub.vx v9, v8, a1
1356 ; RV64-NEXT: vnot.v v8, v8
1357 ; RV64-NEXT: vand.vv v8, v8, v9
1358 ; RV64-NEXT: vsrl.vi v9, v8, 1
1359 ; RV64-NEXT: lui a0, 349525
1360 ; RV64-NEXT: addiw a0, a0, 1365
1361 ; RV64-NEXT: vand.vx v9, v9, a0
1362 ; RV64-NEXT: vsub.vv v8, v8, v9
1363 ; RV64-NEXT: lui a0, 209715
1364 ; RV64-NEXT: addiw a0, a0, 819
1365 ; RV64-NEXT: vand.vx v9, v8, a0
1366 ; RV64-NEXT: vsrl.vi v8, v8, 2
1367 ; RV64-NEXT: vand.vx v8, v8, a0
1368 ; RV64-NEXT: vadd.vv v8, v9, v8
1369 ; RV64-NEXT: vsrl.vi v9, v8, 4
1370 ; RV64-NEXT: vadd.vv v8, v8, v9
1371 ; RV64-NEXT: lui a0, 61681
1372 ; RV64-NEXT: addiw a0, a0, -241
1373 ; RV64-NEXT: vand.vx v8, v8, a0
1374 ; RV64-NEXT: lui a0, 4112
1375 ; RV64-NEXT: addiw a0, a0, 257
1376 ; RV64-NEXT: vmul.vx v8, v8, a0
1377 ; RV64-NEXT: vsrl.vi v8, v8, 24
1379 %head = insertelement <vscale x 2 x i1> poison, i1 true, i32 0
1380 %m = shufflevector <vscale x 2 x i1> %head, <vscale x 2 x i1> poison, <vscale x 2 x i32> zeroinitializer
1381 %v = call <vscale x 2 x i32> @llvm.vp.cttz.nxv2i32(<vscale x 2 x i32> %va, i1 false, <vscale x 2 x i1> %m, i32 %evl)
1382 ret <vscale x 2 x i32> %v
1385 declare <vscale x 4 x i32> @llvm.vp.cttz.nxv4i32(<vscale x 4 x i32>, i1 immarg, <vscale x 4 x i1>, i32)
1387 define <vscale x 4 x i32> @vp_cttz_nxv4i32(<vscale x 4 x i32> %va, <vscale x 4 x i1> %m, i32 zeroext %evl) {
1388 ; RV32-LABEL: vp_cttz_nxv4i32:
1390 ; RV32-NEXT: li a1, 1
1391 ; RV32-NEXT: vsetvli zero, a0, e32, m2, ta, ma
1392 ; RV32-NEXT: vsub.vx v10, v8, a1, v0.t
1393 ; RV32-NEXT: vnot.v v8, v8, v0.t
1394 ; RV32-NEXT: vand.vv v8, v8, v10, v0.t
1395 ; RV32-NEXT: vsrl.vi v10, v8, 1, v0.t
1396 ; RV32-NEXT: lui a0, 349525
1397 ; RV32-NEXT: addi a0, a0, 1365
1398 ; RV32-NEXT: vand.vx v10, v10, a0, v0.t
1399 ; RV32-NEXT: vsub.vv v8, v8, v10, v0.t
1400 ; RV32-NEXT: lui a0, 209715
1401 ; RV32-NEXT: addi a0, a0, 819
1402 ; RV32-NEXT: vand.vx v10, v8, a0, v0.t
1403 ; RV32-NEXT: vsrl.vi v8, v8, 2, v0.t
1404 ; RV32-NEXT: vand.vx v8, v8, a0, v0.t
1405 ; RV32-NEXT: vadd.vv v8, v10, v8, v0.t
1406 ; RV32-NEXT: vsrl.vi v10, v8, 4, v0.t
1407 ; RV32-NEXT: vadd.vv v8, v8, v10, v0.t
1408 ; RV32-NEXT: lui a0, 61681
1409 ; RV32-NEXT: addi a0, a0, -241
1410 ; RV32-NEXT: vand.vx v8, v8, a0, v0.t
1411 ; RV32-NEXT: lui a0, 4112
1412 ; RV32-NEXT: addi a0, a0, 257
1413 ; RV32-NEXT: vmul.vx v8, v8, a0, v0.t
1414 ; RV32-NEXT: vsrl.vi v8, v8, 24, v0.t
1417 ; RV64-LABEL: vp_cttz_nxv4i32:
1419 ; RV64-NEXT: li a1, 1
1420 ; RV64-NEXT: vsetvli zero, a0, e32, m2, ta, ma
1421 ; RV64-NEXT: vsub.vx v10, v8, a1, v0.t
1422 ; RV64-NEXT: vnot.v v8, v8, v0.t
1423 ; RV64-NEXT: vand.vv v8, v8, v10, v0.t
1424 ; RV64-NEXT: vsrl.vi v10, v8, 1, v0.t
1425 ; RV64-NEXT: lui a0, 349525
1426 ; RV64-NEXT: addiw a0, a0, 1365
1427 ; RV64-NEXT: vand.vx v10, v10, a0, v0.t
1428 ; RV64-NEXT: vsub.vv v8, v8, v10, v0.t
1429 ; RV64-NEXT: lui a0, 209715
1430 ; RV64-NEXT: addiw a0, a0, 819
1431 ; RV64-NEXT: vand.vx v10, v8, a0, v0.t
1432 ; RV64-NEXT: vsrl.vi v8, v8, 2, v0.t
1433 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
1434 ; RV64-NEXT: vadd.vv v8, v10, v8, v0.t
1435 ; RV64-NEXT: vsrl.vi v10, v8, 4, v0.t
1436 ; RV64-NEXT: vadd.vv v8, v8, v10, v0.t
1437 ; RV64-NEXT: lui a0, 61681
1438 ; RV64-NEXT: addiw a0, a0, -241
1439 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
1440 ; RV64-NEXT: lui a0, 4112
1441 ; RV64-NEXT: addiw a0, a0, 257
1442 ; RV64-NEXT: vmul.vx v8, v8, a0, v0.t
1443 ; RV64-NEXT: vsrl.vi v8, v8, 24, v0.t
1445 %v = call <vscale x 4 x i32> @llvm.vp.cttz.nxv4i32(<vscale x 4 x i32> %va, i1 false, <vscale x 4 x i1> %m, i32 %evl)
1446 ret <vscale x 4 x i32> %v
1449 define <vscale x 4 x i32> @vp_cttz_nxv4i32_unmasked(<vscale x 4 x i32> %va, i32 zeroext %evl) {
1450 ; RV32-LABEL: vp_cttz_nxv4i32_unmasked:
1452 ; RV32-NEXT: li a1, 1
1453 ; RV32-NEXT: vsetvli zero, a0, e32, m2, ta, ma
1454 ; RV32-NEXT: vsub.vx v10, v8, a1
1455 ; RV32-NEXT: vnot.v v8, v8
1456 ; RV32-NEXT: vand.vv v8, v8, v10
1457 ; RV32-NEXT: vsrl.vi v10, v8, 1
1458 ; RV32-NEXT: lui a0, 349525
1459 ; RV32-NEXT: addi a0, a0, 1365
1460 ; RV32-NEXT: vand.vx v10, v10, a0
1461 ; RV32-NEXT: vsub.vv v8, v8, v10
1462 ; RV32-NEXT: lui a0, 209715
1463 ; RV32-NEXT: addi a0, a0, 819
1464 ; RV32-NEXT: vand.vx v10, v8, a0
1465 ; RV32-NEXT: vsrl.vi v8, v8, 2
1466 ; RV32-NEXT: vand.vx v8, v8, a0
1467 ; RV32-NEXT: vadd.vv v8, v10, v8
1468 ; RV32-NEXT: vsrl.vi v10, v8, 4
1469 ; RV32-NEXT: vadd.vv v8, v8, v10
1470 ; RV32-NEXT: lui a0, 61681
1471 ; RV32-NEXT: addi a0, a0, -241
1472 ; RV32-NEXT: vand.vx v8, v8, a0
1473 ; RV32-NEXT: lui a0, 4112
1474 ; RV32-NEXT: addi a0, a0, 257
1475 ; RV32-NEXT: vmul.vx v8, v8, a0
1476 ; RV32-NEXT: vsrl.vi v8, v8, 24
1479 ; RV64-LABEL: vp_cttz_nxv4i32_unmasked:
1481 ; RV64-NEXT: li a1, 1
1482 ; RV64-NEXT: vsetvli zero, a0, e32, m2, ta, ma
1483 ; RV64-NEXT: vsub.vx v10, v8, a1
1484 ; RV64-NEXT: vnot.v v8, v8
1485 ; RV64-NEXT: vand.vv v8, v8, v10
1486 ; RV64-NEXT: vsrl.vi v10, v8, 1
1487 ; RV64-NEXT: lui a0, 349525
1488 ; RV64-NEXT: addiw a0, a0, 1365
1489 ; RV64-NEXT: vand.vx v10, v10, a0
1490 ; RV64-NEXT: vsub.vv v8, v8, v10
1491 ; RV64-NEXT: lui a0, 209715
1492 ; RV64-NEXT: addiw a0, a0, 819
1493 ; RV64-NEXT: vand.vx v10, v8, a0
1494 ; RV64-NEXT: vsrl.vi v8, v8, 2
1495 ; RV64-NEXT: vand.vx v8, v8, a0
1496 ; RV64-NEXT: vadd.vv v8, v10, v8
1497 ; RV64-NEXT: vsrl.vi v10, v8, 4
1498 ; RV64-NEXT: vadd.vv v8, v8, v10
1499 ; RV64-NEXT: lui a0, 61681
1500 ; RV64-NEXT: addiw a0, a0, -241
1501 ; RV64-NEXT: vand.vx v8, v8, a0
1502 ; RV64-NEXT: lui a0, 4112
1503 ; RV64-NEXT: addiw a0, a0, 257
1504 ; RV64-NEXT: vmul.vx v8, v8, a0
1505 ; RV64-NEXT: vsrl.vi v8, v8, 24
1507 %head = insertelement <vscale x 4 x i1> poison, i1 true, i32 0
1508 %m = shufflevector <vscale x 4 x i1> %head, <vscale x 4 x i1> poison, <vscale x 4 x i32> zeroinitializer
1509 %v = call <vscale x 4 x i32> @llvm.vp.cttz.nxv4i32(<vscale x 4 x i32> %va, i1 false, <vscale x 4 x i1> %m, i32 %evl)
1510 ret <vscale x 4 x i32> %v
1513 declare <vscale x 8 x i32> @llvm.vp.cttz.nxv8i32(<vscale x 8 x i32>, i1 immarg, <vscale x 8 x i1>, i32)
1515 define <vscale x 8 x i32> @vp_cttz_nxv8i32(<vscale x 8 x i32> %va, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1516 ; RV32-LABEL: vp_cttz_nxv8i32:
1518 ; RV32-NEXT: li a1, 1
1519 ; RV32-NEXT: vsetvli zero, a0, e32, m4, ta, ma
1520 ; RV32-NEXT: vsub.vx v12, v8, a1, v0.t
1521 ; RV32-NEXT: vnot.v v8, v8, v0.t
1522 ; RV32-NEXT: vand.vv v8, v8, v12, v0.t
1523 ; RV32-NEXT: vsrl.vi v12, v8, 1, v0.t
1524 ; RV32-NEXT: lui a0, 349525
1525 ; RV32-NEXT: addi a0, a0, 1365
1526 ; RV32-NEXT: vand.vx v12, v12, a0, v0.t
1527 ; RV32-NEXT: vsub.vv v8, v8, v12, v0.t
1528 ; RV32-NEXT: lui a0, 209715
1529 ; RV32-NEXT: addi a0, a0, 819
1530 ; RV32-NEXT: vand.vx v12, v8, a0, v0.t
1531 ; RV32-NEXT: vsrl.vi v8, v8, 2, v0.t
1532 ; RV32-NEXT: vand.vx v8, v8, a0, v0.t
1533 ; RV32-NEXT: vadd.vv v8, v12, v8, v0.t
1534 ; RV32-NEXT: vsrl.vi v12, v8, 4, v0.t
1535 ; RV32-NEXT: vadd.vv v8, v8, v12, v0.t
1536 ; RV32-NEXT: lui a0, 61681
1537 ; RV32-NEXT: addi a0, a0, -241
1538 ; RV32-NEXT: vand.vx v8, v8, a0, v0.t
1539 ; RV32-NEXT: lui a0, 4112
1540 ; RV32-NEXT: addi a0, a0, 257
1541 ; RV32-NEXT: vmul.vx v8, v8, a0, v0.t
1542 ; RV32-NEXT: vsrl.vi v8, v8, 24, v0.t
1545 ; RV64-LABEL: vp_cttz_nxv8i32:
1547 ; RV64-NEXT: li a1, 1
1548 ; RV64-NEXT: vsetvli zero, a0, e32, m4, ta, ma
1549 ; RV64-NEXT: vsub.vx v12, v8, a1, v0.t
1550 ; RV64-NEXT: vnot.v v8, v8, v0.t
1551 ; RV64-NEXT: vand.vv v8, v8, v12, v0.t
1552 ; RV64-NEXT: vsrl.vi v12, v8, 1, v0.t
1553 ; RV64-NEXT: lui a0, 349525
1554 ; RV64-NEXT: addiw a0, a0, 1365
1555 ; RV64-NEXT: vand.vx v12, v12, a0, v0.t
1556 ; RV64-NEXT: vsub.vv v8, v8, v12, v0.t
1557 ; RV64-NEXT: lui a0, 209715
1558 ; RV64-NEXT: addiw a0, a0, 819
1559 ; RV64-NEXT: vand.vx v12, v8, a0, v0.t
1560 ; RV64-NEXT: vsrl.vi v8, v8, 2, v0.t
1561 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
1562 ; RV64-NEXT: vadd.vv v8, v12, v8, v0.t
1563 ; RV64-NEXT: vsrl.vi v12, v8, 4, v0.t
1564 ; RV64-NEXT: vadd.vv v8, v8, v12, v0.t
1565 ; RV64-NEXT: lui a0, 61681
1566 ; RV64-NEXT: addiw a0, a0, -241
1567 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
1568 ; RV64-NEXT: lui a0, 4112
1569 ; RV64-NEXT: addiw a0, a0, 257
1570 ; RV64-NEXT: vmul.vx v8, v8, a0, v0.t
1571 ; RV64-NEXT: vsrl.vi v8, v8, 24, v0.t
1573 %v = call <vscale x 8 x i32> @llvm.vp.cttz.nxv8i32(<vscale x 8 x i32> %va, i1 false, <vscale x 8 x i1> %m, i32 %evl)
1574 ret <vscale x 8 x i32> %v
1577 define <vscale x 8 x i32> @vp_cttz_nxv8i32_unmasked(<vscale x 8 x i32> %va, i32 zeroext %evl) {
1578 ; RV32-LABEL: vp_cttz_nxv8i32_unmasked:
1580 ; RV32-NEXT: li a1, 1
1581 ; RV32-NEXT: vsetvli zero, a0, e32, m4, ta, ma
1582 ; RV32-NEXT: vsub.vx v12, v8, a1
1583 ; RV32-NEXT: vnot.v v8, v8
1584 ; RV32-NEXT: vand.vv v8, v8, v12
1585 ; RV32-NEXT: vsrl.vi v12, v8, 1
1586 ; RV32-NEXT: lui a0, 349525
1587 ; RV32-NEXT: addi a0, a0, 1365
1588 ; RV32-NEXT: vand.vx v12, v12, a0
1589 ; RV32-NEXT: vsub.vv v8, v8, v12
1590 ; RV32-NEXT: lui a0, 209715
1591 ; RV32-NEXT: addi a0, a0, 819
1592 ; RV32-NEXT: vand.vx v12, v8, a0
1593 ; RV32-NEXT: vsrl.vi v8, v8, 2
1594 ; RV32-NEXT: vand.vx v8, v8, a0
1595 ; RV32-NEXT: vadd.vv v8, v12, v8
1596 ; RV32-NEXT: vsrl.vi v12, v8, 4
1597 ; RV32-NEXT: vadd.vv v8, v8, v12
1598 ; RV32-NEXT: lui a0, 61681
1599 ; RV32-NEXT: addi a0, a0, -241
1600 ; RV32-NEXT: vand.vx v8, v8, a0
1601 ; RV32-NEXT: lui a0, 4112
1602 ; RV32-NEXT: addi a0, a0, 257
1603 ; RV32-NEXT: vmul.vx v8, v8, a0
1604 ; RV32-NEXT: vsrl.vi v8, v8, 24
1607 ; RV64-LABEL: vp_cttz_nxv8i32_unmasked:
1609 ; RV64-NEXT: li a1, 1
1610 ; RV64-NEXT: vsetvli zero, a0, e32, m4, ta, ma
1611 ; RV64-NEXT: vsub.vx v12, v8, a1
1612 ; RV64-NEXT: vnot.v v8, v8
1613 ; RV64-NEXT: vand.vv v8, v8, v12
1614 ; RV64-NEXT: vsrl.vi v12, v8, 1
1615 ; RV64-NEXT: lui a0, 349525
1616 ; RV64-NEXT: addiw a0, a0, 1365
1617 ; RV64-NEXT: vand.vx v12, v12, a0
1618 ; RV64-NEXT: vsub.vv v8, v8, v12
1619 ; RV64-NEXT: lui a0, 209715
1620 ; RV64-NEXT: addiw a0, a0, 819
1621 ; RV64-NEXT: vand.vx v12, v8, a0
1622 ; RV64-NEXT: vsrl.vi v8, v8, 2
1623 ; RV64-NEXT: vand.vx v8, v8, a0
1624 ; RV64-NEXT: vadd.vv v8, v12, v8
1625 ; RV64-NEXT: vsrl.vi v12, v8, 4
1626 ; RV64-NEXT: vadd.vv v8, v8, v12
1627 ; RV64-NEXT: lui a0, 61681
1628 ; RV64-NEXT: addiw a0, a0, -241
1629 ; RV64-NEXT: vand.vx v8, v8, a0
1630 ; RV64-NEXT: lui a0, 4112
1631 ; RV64-NEXT: addiw a0, a0, 257
1632 ; RV64-NEXT: vmul.vx v8, v8, a0
1633 ; RV64-NEXT: vsrl.vi v8, v8, 24
1635 %head = insertelement <vscale x 8 x i1> poison, i1 true, i32 0
1636 %m = shufflevector <vscale x 8 x i1> %head, <vscale x 8 x i1> poison, <vscale x 8 x i32> zeroinitializer
1637 %v = call <vscale x 8 x i32> @llvm.vp.cttz.nxv8i32(<vscale x 8 x i32> %va, i1 false, <vscale x 8 x i1> %m, i32 %evl)
1638 ret <vscale x 8 x i32> %v
1641 declare <vscale x 16 x i32> @llvm.vp.cttz.nxv16i32(<vscale x 16 x i32>, i1 immarg, <vscale x 16 x i1>, i32)
1643 define <vscale x 16 x i32> @vp_cttz_nxv16i32(<vscale x 16 x i32> %va, <vscale x 16 x i1> %m, i32 zeroext %evl) {
1644 ; RV32-LABEL: vp_cttz_nxv16i32:
1646 ; RV32-NEXT: li a1, 1
1647 ; RV32-NEXT: vsetvli zero, a0, e32, m8, ta, ma
1648 ; RV32-NEXT: vsub.vx v16, v8, a1, v0.t
1649 ; RV32-NEXT: vnot.v v8, v8, v0.t
1650 ; RV32-NEXT: vand.vv v8, v8, v16, v0.t
1651 ; RV32-NEXT: vsrl.vi v16, v8, 1, v0.t
1652 ; RV32-NEXT: lui a0, 349525
1653 ; RV32-NEXT: addi a0, a0, 1365
1654 ; RV32-NEXT: vand.vx v16, v16, a0, v0.t
1655 ; RV32-NEXT: vsub.vv v8, v8, v16, v0.t
1656 ; RV32-NEXT: lui a0, 209715
1657 ; RV32-NEXT: addi a0, a0, 819
1658 ; RV32-NEXT: vand.vx v16, v8, a0, v0.t
1659 ; RV32-NEXT: vsrl.vi v8, v8, 2, v0.t
1660 ; RV32-NEXT: vand.vx v8, v8, a0, v0.t
1661 ; RV32-NEXT: vadd.vv v8, v16, v8, v0.t
1662 ; RV32-NEXT: vsrl.vi v16, v8, 4, v0.t
1663 ; RV32-NEXT: vadd.vv v8, v8, v16, v0.t
1664 ; RV32-NEXT: lui a0, 61681
1665 ; RV32-NEXT: addi a0, a0, -241
1666 ; RV32-NEXT: vand.vx v8, v8, a0, v0.t
1667 ; RV32-NEXT: lui a0, 4112
1668 ; RV32-NEXT: addi a0, a0, 257
1669 ; RV32-NEXT: vmul.vx v8, v8, a0, v0.t
1670 ; RV32-NEXT: vsrl.vi v8, v8, 24, v0.t
1673 ; RV64-LABEL: vp_cttz_nxv16i32:
1675 ; RV64-NEXT: li a1, 1
1676 ; RV64-NEXT: vsetvli zero, a0, e32, m8, ta, ma
1677 ; RV64-NEXT: vsub.vx v16, v8, a1, v0.t
1678 ; RV64-NEXT: vnot.v v8, v8, v0.t
1679 ; RV64-NEXT: vand.vv v8, v8, v16, v0.t
1680 ; RV64-NEXT: vsrl.vi v16, v8, 1, v0.t
1681 ; RV64-NEXT: lui a0, 349525
1682 ; RV64-NEXT: addiw a0, a0, 1365
1683 ; RV64-NEXT: vand.vx v16, v16, a0, v0.t
1684 ; RV64-NEXT: vsub.vv v8, v8, v16, v0.t
1685 ; RV64-NEXT: lui a0, 209715
1686 ; RV64-NEXT: addiw a0, a0, 819
1687 ; RV64-NEXT: vand.vx v16, v8, a0, v0.t
1688 ; RV64-NEXT: vsrl.vi v8, v8, 2, v0.t
1689 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
1690 ; RV64-NEXT: vadd.vv v8, v16, v8, v0.t
1691 ; RV64-NEXT: vsrl.vi v16, v8, 4, v0.t
1692 ; RV64-NEXT: vadd.vv v8, v8, v16, v0.t
1693 ; RV64-NEXT: lui a0, 61681
1694 ; RV64-NEXT: addiw a0, a0, -241
1695 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
1696 ; RV64-NEXT: lui a0, 4112
1697 ; RV64-NEXT: addiw a0, a0, 257
1698 ; RV64-NEXT: vmul.vx v8, v8, a0, v0.t
1699 ; RV64-NEXT: vsrl.vi v8, v8, 24, v0.t
1701 %v = call <vscale x 16 x i32> @llvm.vp.cttz.nxv16i32(<vscale x 16 x i32> %va, i1 false, <vscale x 16 x i1> %m, i32 %evl)
1702 ret <vscale x 16 x i32> %v
1705 define <vscale x 16 x i32> @vp_cttz_nxv16i32_unmasked(<vscale x 16 x i32> %va, i32 zeroext %evl) {
1706 ; RV32-LABEL: vp_cttz_nxv16i32_unmasked:
1708 ; RV32-NEXT: li a1, 1
1709 ; RV32-NEXT: vsetvli zero, a0, e32, m8, ta, ma
1710 ; RV32-NEXT: vsub.vx v16, v8, a1
1711 ; RV32-NEXT: vnot.v v8, v8
1712 ; RV32-NEXT: vand.vv v8, v8, v16
1713 ; RV32-NEXT: vsrl.vi v16, v8, 1
1714 ; RV32-NEXT: lui a0, 349525
1715 ; RV32-NEXT: addi a0, a0, 1365
1716 ; RV32-NEXT: vand.vx v16, v16, a0
1717 ; RV32-NEXT: vsub.vv v8, v8, v16
1718 ; RV32-NEXT: lui a0, 209715
1719 ; RV32-NEXT: addi a0, a0, 819
1720 ; RV32-NEXT: vand.vx v16, v8, a0
1721 ; RV32-NEXT: vsrl.vi v8, v8, 2
1722 ; RV32-NEXT: vand.vx v8, v8, a0
1723 ; RV32-NEXT: vadd.vv v8, v16, v8
1724 ; RV32-NEXT: vsrl.vi v16, v8, 4
1725 ; RV32-NEXT: vadd.vv v8, v8, v16
1726 ; RV32-NEXT: lui a0, 61681
1727 ; RV32-NEXT: addi a0, a0, -241
1728 ; RV32-NEXT: vand.vx v8, v8, a0
1729 ; RV32-NEXT: lui a0, 4112
1730 ; RV32-NEXT: addi a0, a0, 257
1731 ; RV32-NEXT: vmul.vx v8, v8, a0
1732 ; RV32-NEXT: vsrl.vi v8, v8, 24
1735 ; RV64-LABEL: vp_cttz_nxv16i32_unmasked:
1737 ; RV64-NEXT: li a1, 1
1738 ; RV64-NEXT: vsetvli zero, a0, e32, m8, ta, ma
1739 ; RV64-NEXT: vsub.vx v16, v8, a1
1740 ; RV64-NEXT: vnot.v v8, v8
1741 ; RV64-NEXT: vand.vv v8, v8, v16
1742 ; RV64-NEXT: vsrl.vi v16, v8, 1
1743 ; RV64-NEXT: lui a0, 349525
1744 ; RV64-NEXT: addiw a0, a0, 1365
1745 ; RV64-NEXT: vand.vx v16, v16, a0
1746 ; RV64-NEXT: vsub.vv v8, v8, v16
1747 ; RV64-NEXT: lui a0, 209715
1748 ; RV64-NEXT: addiw a0, a0, 819
1749 ; RV64-NEXT: vand.vx v16, v8, a0
1750 ; RV64-NEXT: vsrl.vi v8, v8, 2
1751 ; RV64-NEXT: vand.vx v8, v8, a0
1752 ; RV64-NEXT: vadd.vv v8, v16, v8
1753 ; RV64-NEXT: vsrl.vi v16, v8, 4
1754 ; RV64-NEXT: vadd.vv v8, v8, v16
1755 ; RV64-NEXT: lui a0, 61681
1756 ; RV64-NEXT: addiw a0, a0, -241
1757 ; RV64-NEXT: vand.vx v8, v8, a0
1758 ; RV64-NEXT: lui a0, 4112
1759 ; RV64-NEXT: addiw a0, a0, 257
1760 ; RV64-NEXT: vmul.vx v8, v8, a0
1761 ; RV64-NEXT: vsrl.vi v8, v8, 24
1763 %head = insertelement <vscale x 16 x i1> poison, i1 true, i32 0
1764 %m = shufflevector <vscale x 16 x i1> %head, <vscale x 16 x i1> poison, <vscale x 16 x i32> zeroinitializer
1765 %v = call <vscale x 16 x i32> @llvm.vp.cttz.nxv16i32(<vscale x 16 x i32> %va, i1 false, <vscale x 16 x i1> %m, i32 %evl)
1766 ret <vscale x 16 x i32> %v
1769 declare <vscale x 1 x i64> @llvm.vp.cttz.nxv1i64(<vscale x 1 x i64>, i1 immarg, <vscale x 1 x i1>, i32)
1771 define <vscale x 1 x i64> @vp_cttz_nxv1i64(<vscale x 1 x i64> %va, <vscale x 1 x i1> %m, i32 zeroext %evl) {
1772 ; RV32-LABEL: vp_cttz_nxv1i64:
1774 ; RV32-NEXT: addi sp, sp, -16
1775 ; RV32-NEXT: .cfi_def_cfa_offset 16
1776 ; RV32-NEXT: lui a1, 349525
1777 ; RV32-NEXT: addi a1, a1, 1365
1778 ; RV32-NEXT: sw a1, 12(sp)
1779 ; RV32-NEXT: sw a1, 8(sp)
1780 ; RV32-NEXT: lui a1, 209715
1781 ; RV32-NEXT: addi a1, a1, 819
1782 ; RV32-NEXT: sw a1, 12(sp)
1783 ; RV32-NEXT: sw a1, 8(sp)
1784 ; RV32-NEXT: lui a1, 61681
1785 ; RV32-NEXT: addi a1, a1, -241
1786 ; RV32-NEXT: sw a1, 12(sp)
1787 ; RV32-NEXT: sw a1, 8(sp)
1788 ; RV32-NEXT: lui a1, 4112
1789 ; RV32-NEXT: addi a1, a1, 257
1790 ; RV32-NEXT: sw a1, 12(sp)
1791 ; RV32-NEXT: sw a1, 8(sp)
1792 ; RV32-NEXT: li a1, 1
1793 ; RV32-NEXT: vsetvli zero, a0, e64, m1, ta, ma
1794 ; RV32-NEXT: vsub.vx v9, v8, a1, v0.t
1795 ; RV32-NEXT: vnot.v v8, v8, v0.t
1796 ; RV32-NEXT: vand.vv v8, v8, v9, v0.t
1797 ; RV32-NEXT: vsrl.vi v9, v8, 1, v0.t
1798 ; RV32-NEXT: addi a1, sp, 8
1799 ; RV32-NEXT: vsetvli a2, zero, e64, m1, ta, ma
1800 ; RV32-NEXT: vlse64.v v10, (a1), zero
1801 ; RV32-NEXT: vsetvli zero, a0, e64, m1, ta, ma
1802 ; RV32-NEXT: vand.vv v9, v9, v10, v0.t
1803 ; RV32-NEXT: vsub.vv v8, v8, v9, v0.t
1804 ; RV32-NEXT: vsetvli a2, zero, e64, m1, ta, ma
1805 ; RV32-NEXT: vlse64.v v9, (a1), zero
1806 ; RV32-NEXT: vsetvli zero, a0, e64, m1, ta, ma
1807 ; RV32-NEXT: vand.vv v10, v8, v9, v0.t
1808 ; RV32-NEXT: vsrl.vi v8, v8, 2, v0.t
1809 ; RV32-NEXT: vand.vv v8, v8, v9, v0.t
1810 ; RV32-NEXT: vadd.vv v8, v10, v8, v0.t
1811 ; RV32-NEXT: vsrl.vi v9, v8, 4, v0.t
1812 ; RV32-NEXT: vadd.vv v8, v8, v9, v0.t
1813 ; RV32-NEXT: vsetvli a2, zero, e64, m1, ta, ma
1814 ; RV32-NEXT: vlse64.v v9, (a1), zero
1815 ; RV32-NEXT: vsetvli zero, a0, e64, m1, ta, ma
1816 ; RV32-NEXT: vand.vv v8, v8, v9, v0.t
1817 ; RV32-NEXT: vsetvli a2, zero, e64, m1, ta, ma
1818 ; RV32-NEXT: vlse64.v v9, (a1), zero
1819 ; RV32-NEXT: vsetvli zero, a0, e64, m1, ta, ma
1820 ; RV32-NEXT: vmul.vv v8, v8, v9, v0.t
1821 ; RV32-NEXT: li a0, 56
1822 ; RV32-NEXT: vsrl.vx v8, v8, a0, v0.t
1823 ; RV32-NEXT: addi sp, sp, 16
1826 ; RV64-LABEL: vp_cttz_nxv1i64:
1828 ; RV64-NEXT: li a1, 1
1829 ; RV64-NEXT: vsetvli zero, a0, e64, m1, ta, ma
1830 ; RV64-NEXT: vsub.vx v9, v8, a1, v0.t
1831 ; RV64-NEXT: vnot.v v8, v8, v0.t
1832 ; RV64-NEXT: vand.vv v8, v8, v9, v0.t
1833 ; RV64-NEXT: lui a0, %hi(.LCPI36_0)
1834 ; RV64-NEXT: ld a0, %lo(.LCPI36_0)(a0)
1835 ; RV64-NEXT: lui a1, %hi(.LCPI36_1)
1836 ; RV64-NEXT: ld a1, %lo(.LCPI36_1)(a1)
1837 ; RV64-NEXT: vsrl.vi v9, v8, 1, v0.t
1838 ; RV64-NEXT: vand.vx v9, v9, a0, v0.t
1839 ; RV64-NEXT: vsub.vv v8, v8, v9, v0.t
1840 ; RV64-NEXT: vand.vx v9, v8, a1, v0.t
1841 ; RV64-NEXT: vsrl.vi v8, v8, 2, v0.t
1842 ; RV64-NEXT: vand.vx v8, v8, a1, v0.t
1843 ; RV64-NEXT: vadd.vv v8, v9, v8, v0.t
1844 ; RV64-NEXT: lui a0, %hi(.LCPI36_2)
1845 ; RV64-NEXT: ld a0, %lo(.LCPI36_2)(a0)
1846 ; RV64-NEXT: lui a1, %hi(.LCPI36_3)
1847 ; RV64-NEXT: ld a1, %lo(.LCPI36_3)(a1)
1848 ; RV64-NEXT: vsrl.vi v9, v8, 4, v0.t
1849 ; RV64-NEXT: vadd.vv v8, v8, v9, v0.t
1850 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
1851 ; RV64-NEXT: vmul.vx v8, v8, a1, v0.t
1852 ; RV64-NEXT: li a0, 56
1853 ; RV64-NEXT: vsrl.vx v8, v8, a0, v0.t
1855 %v = call <vscale x 1 x i64> @llvm.vp.cttz.nxv1i64(<vscale x 1 x i64> %va, i1 false, <vscale x 1 x i1> %m, i32 %evl)
1856 ret <vscale x 1 x i64> %v
1859 define <vscale x 1 x i64> @vp_cttz_nxv1i64_unmasked(<vscale x 1 x i64> %va, i32 zeroext %evl) {
1860 ; RV32-LABEL: vp_cttz_nxv1i64_unmasked:
1862 ; RV32-NEXT: addi sp, sp, -16
1863 ; RV32-NEXT: .cfi_def_cfa_offset 16
1864 ; RV32-NEXT: lui a1, 349525
1865 ; RV32-NEXT: addi a1, a1, 1365
1866 ; RV32-NEXT: sw a1, 12(sp)
1867 ; RV32-NEXT: sw a1, 8(sp)
1868 ; RV32-NEXT: lui a1, 209715
1869 ; RV32-NEXT: addi a1, a1, 819
1870 ; RV32-NEXT: sw a1, 12(sp)
1871 ; RV32-NEXT: sw a1, 8(sp)
1872 ; RV32-NEXT: lui a1, 61681
1873 ; RV32-NEXT: addi a1, a1, -241
1874 ; RV32-NEXT: sw a1, 12(sp)
1875 ; RV32-NEXT: sw a1, 8(sp)
1876 ; RV32-NEXT: lui a1, 4112
1877 ; RV32-NEXT: addi a1, a1, 257
1878 ; RV32-NEXT: sw a1, 12(sp)
1879 ; RV32-NEXT: sw a1, 8(sp)
1880 ; RV32-NEXT: li a1, 1
1881 ; RV32-NEXT: vsetvli zero, a0, e64, m1, ta, ma
1882 ; RV32-NEXT: vsub.vx v9, v8, a1
1883 ; RV32-NEXT: vnot.v v8, v8
1884 ; RV32-NEXT: vand.vv v8, v8, v9
1885 ; RV32-NEXT: vsrl.vi v9, v8, 1
1886 ; RV32-NEXT: addi a1, sp, 8
1887 ; RV32-NEXT: vsetvli a2, zero, e64, m1, ta, ma
1888 ; RV32-NEXT: vlse64.v v10, (a1), zero
1889 ; RV32-NEXT: vsetvli zero, a0, e64, m1, ta, ma
1890 ; RV32-NEXT: vand.vv v9, v9, v10
1891 ; RV32-NEXT: vsub.vv v8, v8, v9
1892 ; RV32-NEXT: vsetvli a2, zero, e64, m1, ta, ma
1893 ; RV32-NEXT: vlse64.v v9, (a1), zero
1894 ; RV32-NEXT: vsetvli zero, a0, e64, m1, ta, ma
1895 ; RV32-NEXT: vand.vv v10, v8, v9
1896 ; RV32-NEXT: vsrl.vi v8, v8, 2
1897 ; RV32-NEXT: vand.vv v8, v8, v9
1898 ; RV32-NEXT: vadd.vv v8, v10, v8
1899 ; RV32-NEXT: vsrl.vi v9, v8, 4
1900 ; RV32-NEXT: vadd.vv v8, v8, v9
1901 ; RV32-NEXT: vsetvli a2, zero, e64, m1, ta, ma
1902 ; RV32-NEXT: vlse64.v v9, (a1), zero
1903 ; RV32-NEXT: vsetvli zero, a0, e64, m1, ta, ma
1904 ; RV32-NEXT: vand.vv v8, v8, v9
1905 ; RV32-NEXT: vsetvli a2, zero, e64, m1, ta, ma
1906 ; RV32-NEXT: vlse64.v v9, (a1), zero
1907 ; RV32-NEXT: vsetvli zero, a0, e64, m1, ta, ma
1908 ; RV32-NEXT: vmul.vv v8, v8, v9
1909 ; RV32-NEXT: li a0, 56
1910 ; RV32-NEXT: vsrl.vx v8, v8, a0
1911 ; RV32-NEXT: addi sp, sp, 16
1914 ; RV64-LABEL: vp_cttz_nxv1i64_unmasked:
1916 ; RV64-NEXT: li a1, 1
1917 ; RV64-NEXT: vsetvli zero, a0, e64, m1, ta, ma
1918 ; RV64-NEXT: vsub.vx v9, v8, a1
1919 ; RV64-NEXT: vnot.v v8, v8
1920 ; RV64-NEXT: vand.vv v8, v8, v9
1921 ; RV64-NEXT: lui a0, %hi(.LCPI37_0)
1922 ; RV64-NEXT: ld a0, %lo(.LCPI37_0)(a0)
1923 ; RV64-NEXT: lui a1, %hi(.LCPI37_1)
1924 ; RV64-NEXT: ld a1, %lo(.LCPI37_1)(a1)
1925 ; RV64-NEXT: vsrl.vi v9, v8, 1
1926 ; RV64-NEXT: vand.vx v9, v9, a0
1927 ; RV64-NEXT: vsub.vv v8, v8, v9
1928 ; RV64-NEXT: vand.vx v9, v8, a1
1929 ; RV64-NEXT: vsrl.vi v8, v8, 2
1930 ; RV64-NEXT: vand.vx v8, v8, a1
1931 ; RV64-NEXT: vadd.vv v8, v9, v8
1932 ; RV64-NEXT: lui a0, %hi(.LCPI37_2)
1933 ; RV64-NEXT: ld a0, %lo(.LCPI37_2)(a0)
1934 ; RV64-NEXT: lui a1, %hi(.LCPI37_3)
1935 ; RV64-NEXT: ld a1, %lo(.LCPI37_3)(a1)
1936 ; RV64-NEXT: vsrl.vi v9, v8, 4
1937 ; RV64-NEXT: vadd.vv v8, v8, v9
1938 ; RV64-NEXT: vand.vx v8, v8, a0
1939 ; RV64-NEXT: vmul.vx v8, v8, a1
1940 ; RV64-NEXT: li a0, 56
1941 ; RV64-NEXT: vsrl.vx v8, v8, a0
1943 %head = insertelement <vscale x 1 x i1> poison, i1 true, i32 0
1944 %m = shufflevector <vscale x 1 x i1> %head, <vscale x 1 x i1> poison, <vscale x 1 x i32> zeroinitializer
1945 %v = call <vscale x 1 x i64> @llvm.vp.cttz.nxv1i64(<vscale x 1 x i64> %va, i1 false, <vscale x 1 x i1> %m, i32 %evl)
1946 ret <vscale x 1 x i64> %v
1949 declare <vscale x 2 x i64> @llvm.vp.cttz.nxv2i64(<vscale x 2 x i64>, i1 immarg, <vscale x 2 x i1>, i32)
1951 define <vscale x 2 x i64> @vp_cttz_nxv2i64(<vscale x 2 x i64> %va, <vscale x 2 x i1> %m, i32 zeroext %evl) {
1952 ; RV32-LABEL: vp_cttz_nxv2i64:
1954 ; RV32-NEXT: addi sp, sp, -16
1955 ; RV32-NEXT: .cfi_def_cfa_offset 16
1956 ; RV32-NEXT: lui a1, 349525
1957 ; RV32-NEXT: addi a1, a1, 1365
1958 ; RV32-NEXT: sw a1, 12(sp)
1959 ; RV32-NEXT: sw a1, 8(sp)
1960 ; RV32-NEXT: lui a1, 209715
1961 ; RV32-NEXT: addi a1, a1, 819
1962 ; RV32-NEXT: sw a1, 12(sp)
1963 ; RV32-NEXT: sw a1, 8(sp)
1964 ; RV32-NEXT: lui a1, 61681
1965 ; RV32-NEXT: addi a1, a1, -241
1966 ; RV32-NEXT: sw a1, 12(sp)
1967 ; RV32-NEXT: sw a1, 8(sp)
1968 ; RV32-NEXT: lui a1, 4112
1969 ; RV32-NEXT: addi a1, a1, 257
1970 ; RV32-NEXT: sw a1, 12(sp)
1971 ; RV32-NEXT: sw a1, 8(sp)
1972 ; RV32-NEXT: li a1, 1
1973 ; RV32-NEXT: vsetvli zero, a0, e64, m2, ta, ma
1974 ; RV32-NEXT: vsub.vx v10, v8, a1, v0.t
1975 ; RV32-NEXT: vnot.v v8, v8, v0.t
1976 ; RV32-NEXT: vand.vv v8, v8, v10, v0.t
1977 ; RV32-NEXT: vsrl.vi v10, v8, 1, v0.t
1978 ; RV32-NEXT: addi a1, sp, 8
1979 ; RV32-NEXT: vsetvli a2, zero, e64, m2, ta, ma
1980 ; RV32-NEXT: vlse64.v v12, (a1), zero
1981 ; RV32-NEXT: vsetvli zero, a0, e64, m2, ta, ma
1982 ; RV32-NEXT: vand.vv v10, v10, v12, v0.t
1983 ; RV32-NEXT: vsub.vv v8, v8, v10, v0.t
1984 ; RV32-NEXT: vsetvli a2, zero, e64, m2, ta, ma
1985 ; RV32-NEXT: vlse64.v v10, (a1), zero
1986 ; RV32-NEXT: vsetvli zero, a0, e64, m2, ta, ma
1987 ; RV32-NEXT: vand.vv v12, v8, v10, v0.t
1988 ; RV32-NEXT: vsrl.vi v8, v8, 2, v0.t
1989 ; RV32-NEXT: vand.vv v8, v8, v10, v0.t
1990 ; RV32-NEXT: vadd.vv v8, v12, v8, v0.t
1991 ; RV32-NEXT: vsrl.vi v10, v8, 4, v0.t
1992 ; RV32-NEXT: vadd.vv v8, v8, v10, v0.t
1993 ; RV32-NEXT: vsetvli a2, zero, e64, m2, ta, ma
1994 ; RV32-NEXT: vlse64.v v10, (a1), zero
1995 ; RV32-NEXT: vsetvli zero, a0, e64, m2, ta, ma
1996 ; RV32-NEXT: vand.vv v8, v8, v10, v0.t
1997 ; RV32-NEXT: vsetvli a2, zero, e64, m2, ta, ma
1998 ; RV32-NEXT: vlse64.v v10, (a1), zero
1999 ; RV32-NEXT: vsetvli zero, a0, e64, m2, ta, ma
2000 ; RV32-NEXT: vmul.vv v8, v8, v10, v0.t
2001 ; RV32-NEXT: li a0, 56
2002 ; RV32-NEXT: vsrl.vx v8, v8, a0, v0.t
2003 ; RV32-NEXT: addi sp, sp, 16
2006 ; RV64-LABEL: vp_cttz_nxv2i64:
2008 ; RV64-NEXT: li a1, 1
2009 ; RV64-NEXT: vsetvli zero, a0, e64, m2, ta, ma
2010 ; RV64-NEXT: vsub.vx v10, v8, a1, v0.t
2011 ; RV64-NEXT: vnot.v v8, v8, v0.t
2012 ; RV64-NEXT: vand.vv v8, v8, v10, v0.t
2013 ; RV64-NEXT: lui a0, %hi(.LCPI38_0)
2014 ; RV64-NEXT: ld a0, %lo(.LCPI38_0)(a0)
2015 ; RV64-NEXT: lui a1, %hi(.LCPI38_1)
2016 ; RV64-NEXT: ld a1, %lo(.LCPI38_1)(a1)
2017 ; RV64-NEXT: vsrl.vi v10, v8, 1, v0.t
2018 ; RV64-NEXT: vand.vx v10, v10, a0, v0.t
2019 ; RV64-NEXT: vsub.vv v8, v8, v10, v0.t
2020 ; RV64-NEXT: vand.vx v10, v8, a1, v0.t
2021 ; RV64-NEXT: vsrl.vi v8, v8, 2, v0.t
2022 ; RV64-NEXT: vand.vx v8, v8, a1, v0.t
2023 ; RV64-NEXT: vadd.vv v8, v10, v8, v0.t
2024 ; RV64-NEXT: lui a0, %hi(.LCPI38_2)
2025 ; RV64-NEXT: ld a0, %lo(.LCPI38_2)(a0)
2026 ; RV64-NEXT: lui a1, %hi(.LCPI38_3)
2027 ; RV64-NEXT: ld a1, %lo(.LCPI38_3)(a1)
2028 ; RV64-NEXT: vsrl.vi v10, v8, 4, v0.t
2029 ; RV64-NEXT: vadd.vv v8, v8, v10, v0.t
2030 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
2031 ; RV64-NEXT: vmul.vx v8, v8, a1, v0.t
2032 ; RV64-NEXT: li a0, 56
2033 ; RV64-NEXT: vsrl.vx v8, v8, a0, v0.t
2035 %v = call <vscale x 2 x i64> @llvm.vp.cttz.nxv2i64(<vscale x 2 x i64> %va, i1 false, <vscale x 2 x i1> %m, i32 %evl)
2036 ret <vscale x 2 x i64> %v
2039 define <vscale x 2 x i64> @vp_cttz_nxv2i64_unmasked(<vscale x 2 x i64> %va, i32 zeroext %evl) {
2040 ; RV32-LABEL: vp_cttz_nxv2i64_unmasked:
2042 ; RV32-NEXT: addi sp, sp, -16
2043 ; RV32-NEXT: .cfi_def_cfa_offset 16
2044 ; RV32-NEXT: lui a1, 349525
2045 ; RV32-NEXT: addi a1, a1, 1365
2046 ; RV32-NEXT: sw a1, 12(sp)
2047 ; RV32-NEXT: sw a1, 8(sp)
2048 ; RV32-NEXT: lui a1, 209715
2049 ; RV32-NEXT: addi a1, a1, 819
2050 ; RV32-NEXT: sw a1, 12(sp)
2051 ; RV32-NEXT: sw a1, 8(sp)
2052 ; RV32-NEXT: lui a1, 61681
2053 ; RV32-NEXT: addi a1, a1, -241
2054 ; RV32-NEXT: sw a1, 12(sp)
2055 ; RV32-NEXT: sw a1, 8(sp)
2056 ; RV32-NEXT: lui a1, 4112
2057 ; RV32-NEXT: addi a1, a1, 257
2058 ; RV32-NEXT: sw a1, 12(sp)
2059 ; RV32-NEXT: sw a1, 8(sp)
2060 ; RV32-NEXT: li a1, 1
2061 ; RV32-NEXT: vsetvli zero, a0, e64, m2, ta, ma
2062 ; RV32-NEXT: vsub.vx v10, v8, a1
2063 ; RV32-NEXT: vnot.v v8, v8
2064 ; RV32-NEXT: vand.vv v8, v8, v10
2065 ; RV32-NEXT: vsrl.vi v10, v8, 1
2066 ; RV32-NEXT: addi a1, sp, 8
2067 ; RV32-NEXT: vsetvli a2, zero, e64, m2, ta, ma
2068 ; RV32-NEXT: vlse64.v v12, (a1), zero
2069 ; RV32-NEXT: vsetvli zero, a0, e64, m2, ta, ma
2070 ; RV32-NEXT: vand.vv v10, v10, v12
2071 ; RV32-NEXT: vsub.vv v8, v8, v10
2072 ; RV32-NEXT: vsetvli a2, zero, e64, m2, ta, ma
2073 ; RV32-NEXT: vlse64.v v10, (a1), zero
2074 ; RV32-NEXT: vsetvli zero, a0, e64, m2, ta, ma
2075 ; RV32-NEXT: vand.vv v12, v8, v10
2076 ; RV32-NEXT: vsrl.vi v8, v8, 2
2077 ; RV32-NEXT: vand.vv v8, v8, v10
2078 ; RV32-NEXT: vadd.vv v8, v12, v8
2079 ; RV32-NEXT: vsrl.vi v10, v8, 4
2080 ; RV32-NEXT: vadd.vv v8, v8, v10
2081 ; RV32-NEXT: vsetvli a2, zero, e64, m2, ta, ma
2082 ; RV32-NEXT: vlse64.v v10, (a1), zero
2083 ; RV32-NEXT: vsetvli zero, a0, e64, m2, ta, ma
2084 ; RV32-NEXT: vand.vv v8, v8, v10
2085 ; RV32-NEXT: vsetvli a2, zero, e64, m2, ta, ma
2086 ; RV32-NEXT: vlse64.v v10, (a1), zero
2087 ; RV32-NEXT: vsetvli zero, a0, e64, m2, ta, ma
2088 ; RV32-NEXT: vmul.vv v8, v8, v10
2089 ; RV32-NEXT: li a0, 56
2090 ; RV32-NEXT: vsrl.vx v8, v8, a0
2091 ; RV32-NEXT: addi sp, sp, 16
2094 ; RV64-LABEL: vp_cttz_nxv2i64_unmasked:
2096 ; RV64-NEXT: li a1, 1
2097 ; RV64-NEXT: vsetvli zero, a0, e64, m2, ta, ma
2098 ; RV64-NEXT: vsub.vx v10, v8, a1
2099 ; RV64-NEXT: vnot.v v8, v8
2100 ; RV64-NEXT: vand.vv v8, v8, v10
2101 ; RV64-NEXT: lui a0, %hi(.LCPI39_0)
2102 ; RV64-NEXT: ld a0, %lo(.LCPI39_0)(a0)
2103 ; RV64-NEXT: lui a1, %hi(.LCPI39_1)
2104 ; RV64-NEXT: ld a1, %lo(.LCPI39_1)(a1)
2105 ; RV64-NEXT: vsrl.vi v10, v8, 1
2106 ; RV64-NEXT: vand.vx v10, v10, a0
2107 ; RV64-NEXT: vsub.vv v8, v8, v10
2108 ; RV64-NEXT: vand.vx v10, v8, a1
2109 ; RV64-NEXT: vsrl.vi v8, v8, 2
2110 ; RV64-NEXT: vand.vx v8, v8, a1
2111 ; RV64-NEXT: vadd.vv v8, v10, v8
2112 ; RV64-NEXT: lui a0, %hi(.LCPI39_2)
2113 ; RV64-NEXT: ld a0, %lo(.LCPI39_2)(a0)
2114 ; RV64-NEXT: lui a1, %hi(.LCPI39_3)
2115 ; RV64-NEXT: ld a1, %lo(.LCPI39_3)(a1)
2116 ; RV64-NEXT: vsrl.vi v10, v8, 4
2117 ; RV64-NEXT: vadd.vv v8, v8, v10
2118 ; RV64-NEXT: vand.vx v8, v8, a0
2119 ; RV64-NEXT: vmul.vx v8, v8, a1
2120 ; RV64-NEXT: li a0, 56
2121 ; RV64-NEXT: vsrl.vx v8, v8, a0
2123 %head = insertelement <vscale x 2 x i1> poison, i1 true, i32 0
2124 %m = shufflevector <vscale x 2 x i1> %head, <vscale x 2 x i1> poison, <vscale x 2 x i32> zeroinitializer
2125 %v = call <vscale x 2 x i64> @llvm.vp.cttz.nxv2i64(<vscale x 2 x i64> %va, i1 false, <vscale x 2 x i1> %m, i32 %evl)
2126 ret <vscale x 2 x i64> %v
2129 declare <vscale x 4 x i64> @llvm.vp.cttz.nxv4i64(<vscale x 4 x i64>, i1 immarg, <vscale x 4 x i1>, i32)
2131 define <vscale x 4 x i64> @vp_cttz_nxv4i64(<vscale x 4 x i64> %va, <vscale x 4 x i1> %m, i32 zeroext %evl) {
2132 ; RV32-LABEL: vp_cttz_nxv4i64:
2134 ; RV32-NEXT: addi sp, sp, -16
2135 ; RV32-NEXT: .cfi_def_cfa_offset 16
2136 ; RV32-NEXT: lui a1, 349525
2137 ; RV32-NEXT: addi a1, a1, 1365
2138 ; RV32-NEXT: sw a1, 12(sp)
2139 ; RV32-NEXT: sw a1, 8(sp)
2140 ; RV32-NEXT: lui a1, 209715
2141 ; RV32-NEXT: addi a1, a1, 819
2142 ; RV32-NEXT: sw a1, 12(sp)
2143 ; RV32-NEXT: sw a1, 8(sp)
2144 ; RV32-NEXT: lui a1, 61681
2145 ; RV32-NEXT: addi a1, a1, -241
2146 ; RV32-NEXT: sw a1, 12(sp)
2147 ; RV32-NEXT: sw a1, 8(sp)
2148 ; RV32-NEXT: lui a1, 4112
2149 ; RV32-NEXT: addi a1, a1, 257
2150 ; RV32-NEXT: sw a1, 12(sp)
2151 ; RV32-NEXT: sw a1, 8(sp)
2152 ; RV32-NEXT: li a1, 1
2153 ; RV32-NEXT: vsetvli zero, a0, e64, m4, ta, ma
2154 ; RV32-NEXT: vsub.vx v12, v8, a1, v0.t
2155 ; RV32-NEXT: vnot.v v8, v8, v0.t
2156 ; RV32-NEXT: vand.vv v8, v8, v12, v0.t
2157 ; RV32-NEXT: vsrl.vi v12, v8, 1, v0.t
2158 ; RV32-NEXT: addi a1, sp, 8
2159 ; RV32-NEXT: vsetvli a2, zero, e64, m4, ta, ma
2160 ; RV32-NEXT: vlse64.v v16, (a1), zero
2161 ; RV32-NEXT: vsetvli zero, a0, e64, m4, ta, ma
2162 ; RV32-NEXT: vand.vv v12, v12, v16, v0.t
2163 ; RV32-NEXT: vsub.vv v8, v8, v12, v0.t
2164 ; RV32-NEXT: vsetvli a2, zero, e64, m4, ta, ma
2165 ; RV32-NEXT: vlse64.v v12, (a1), zero
2166 ; RV32-NEXT: vsetvli zero, a0, e64, m4, ta, ma
2167 ; RV32-NEXT: vand.vv v16, v8, v12, v0.t
2168 ; RV32-NEXT: vsrl.vi v8, v8, 2, v0.t
2169 ; RV32-NEXT: vand.vv v8, v8, v12, v0.t
2170 ; RV32-NEXT: vadd.vv v8, v16, v8, v0.t
2171 ; RV32-NEXT: vsrl.vi v12, v8, 4, v0.t
2172 ; RV32-NEXT: vadd.vv v8, v8, v12, v0.t
2173 ; RV32-NEXT: vsetvli a2, zero, e64, m4, ta, ma
2174 ; RV32-NEXT: vlse64.v v12, (a1), zero
2175 ; RV32-NEXT: vsetvli zero, a0, e64, m4, ta, ma
2176 ; RV32-NEXT: vand.vv v8, v8, v12, v0.t
2177 ; RV32-NEXT: vsetvli a2, zero, e64, m4, ta, ma
2178 ; RV32-NEXT: vlse64.v v12, (a1), zero
2179 ; RV32-NEXT: vsetvli zero, a0, e64, m4, ta, ma
2180 ; RV32-NEXT: vmul.vv v8, v8, v12, v0.t
2181 ; RV32-NEXT: li a0, 56
2182 ; RV32-NEXT: vsrl.vx v8, v8, a0, v0.t
2183 ; RV32-NEXT: addi sp, sp, 16
2186 ; RV64-LABEL: vp_cttz_nxv4i64:
2188 ; RV64-NEXT: li a1, 1
2189 ; RV64-NEXT: vsetvli zero, a0, e64, m4, ta, ma
2190 ; RV64-NEXT: vsub.vx v12, v8, a1, v0.t
2191 ; RV64-NEXT: vnot.v v8, v8, v0.t
2192 ; RV64-NEXT: vand.vv v8, v8, v12, v0.t
2193 ; RV64-NEXT: lui a0, %hi(.LCPI40_0)
2194 ; RV64-NEXT: ld a0, %lo(.LCPI40_0)(a0)
2195 ; RV64-NEXT: lui a1, %hi(.LCPI40_1)
2196 ; RV64-NEXT: ld a1, %lo(.LCPI40_1)(a1)
2197 ; RV64-NEXT: vsrl.vi v12, v8, 1, v0.t
2198 ; RV64-NEXT: vand.vx v12, v12, a0, v0.t
2199 ; RV64-NEXT: vsub.vv v8, v8, v12, v0.t
2200 ; RV64-NEXT: vand.vx v12, v8, a1, v0.t
2201 ; RV64-NEXT: vsrl.vi v8, v8, 2, v0.t
2202 ; RV64-NEXT: vand.vx v8, v8, a1, v0.t
2203 ; RV64-NEXT: vadd.vv v8, v12, v8, v0.t
2204 ; RV64-NEXT: lui a0, %hi(.LCPI40_2)
2205 ; RV64-NEXT: ld a0, %lo(.LCPI40_2)(a0)
2206 ; RV64-NEXT: lui a1, %hi(.LCPI40_3)
2207 ; RV64-NEXT: ld a1, %lo(.LCPI40_3)(a1)
2208 ; RV64-NEXT: vsrl.vi v12, v8, 4, v0.t
2209 ; RV64-NEXT: vadd.vv v8, v8, v12, v0.t
2210 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
2211 ; RV64-NEXT: vmul.vx v8, v8, a1, v0.t
2212 ; RV64-NEXT: li a0, 56
2213 ; RV64-NEXT: vsrl.vx v8, v8, a0, v0.t
2215 %v = call <vscale x 4 x i64> @llvm.vp.cttz.nxv4i64(<vscale x 4 x i64> %va, i1 false, <vscale x 4 x i1> %m, i32 %evl)
2216 ret <vscale x 4 x i64> %v
2219 define <vscale x 4 x i64> @vp_cttz_nxv4i64_unmasked(<vscale x 4 x i64> %va, i32 zeroext %evl) {
2220 ; RV32-LABEL: vp_cttz_nxv4i64_unmasked:
2222 ; RV32-NEXT: addi sp, sp, -16
2223 ; RV32-NEXT: .cfi_def_cfa_offset 16
2224 ; RV32-NEXT: lui a1, 349525
2225 ; RV32-NEXT: addi a1, a1, 1365
2226 ; RV32-NEXT: sw a1, 12(sp)
2227 ; RV32-NEXT: sw a1, 8(sp)
2228 ; RV32-NEXT: lui a1, 209715
2229 ; RV32-NEXT: addi a1, a1, 819
2230 ; RV32-NEXT: sw a1, 12(sp)
2231 ; RV32-NEXT: sw a1, 8(sp)
2232 ; RV32-NEXT: lui a1, 61681
2233 ; RV32-NEXT: addi a1, a1, -241
2234 ; RV32-NEXT: sw a1, 12(sp)
2235 ; RV32-NEXT: sw a1, 8(sp)
2236 ; RV32-NEXT: lui a1, 4112
2237 ; RV32-NEXT: addi a1, a1, 257
2238 ; RV32-NEXT: sw a1, 12(sp)
2239 ; RV32-NEXT: sw a1, 8(sp)
2240 ; RV32-NEXT: li a1, 1
2241 ; RV32-NEXT: vsetvli zero, a0, e64, m4, ta, ma
2242 ; RV32-NEXT: vsub.vx v12, v8, a1
2243 ; RV32-NEXT: vnot.v v8, v8
2244 ; RV32-NEXT: vand.vv v8, v8, v12
2245 ; RV32-NEXT: vsrl.vi v12, v8, 1
2246 ; RV32-NEXT: addi a1, sp, 8
2247 ; RV32-NEXT: vsetvli a2, zero, e64, m4, ta, ma
2248 ; RV32-NEXT: vlse64.v v16, (a1), zero
2249 ; RV32-NEXT: vsetvli zero, a0, e64, m4, ta, ma
2250 ; RV32-NEXT: vand.vv v12, v12, v16
2251 ; RV32-NEXT: vsub.vv v8, v8, v12
2252 ; RV32-NEXT: vsetvli a2, zero, e64, m4, ta, ma
2253 ; RV32-NEXT: vlse64.v v12, (a1), zero
2254 ; RV32-NEXT: vsetvli zero, a0, e64, m4, ta, ma
2255 ; RV32-NEXT: vand.vv v16, v8, v12
2256 ; RV32-NEXT: vsrl.vi v8, v8, 2
2257 ; RV32-NEXT: vand.vv v8, v8, v12
2258 ; RV32-NEXT: vadd.vv v8, v16, v8
2259 ; RV32-NEXT: vsrl.vi v12, v8, 4
2260 ; RV32-NEXT: vadd.vv v8, v8, v12
2261 ; RV32-NEXT: vsetvli a2, zero, e64, m4, ta, ma
2262 ; RV32-NEXT: vlse64.v v12, (a1), zero
2263 ; RV32-NEXT: vsetvli zero, a0, e64, m4, ta, ma
2264 ; RV32-NEXT: vand.vv v8, v8, v12
2265 ; RV32-NEXT: vsetvli a2, zero, e64, m4, ta, ma
2266 ; RV32-NEXT: vlse64.v v12, (a1), zero
2267 ; RV32-NEXT: vsetvli zero, a0, e64, m4, ta, ma
2268 ; RV32-NEXT: vmul.vv v8, v8, v12
2269 ; RV32-NEXT: li a0, 56
2270 ; RV32-NEXT: vsrl.vx v8, v8, a0
2271 ; RV32-NEXT: addi sp, sp, 16
2274 ; RV64-LABEL: vp_cttz_nxv4i64_unmasked:
2276 ; RV64-NEXT: li a1, 1
2277 ; RV64-NEXT: vsetvli zero, a0, e64, m4, ta, ma
2278 ; RV64-NEXT: vsub.vx v12, v8, a1
2279 ; RV64-NEXT: vnot.v v8, v8
2280 ; RV64-NEXT: vand.vv v8, v8, v12
2281 ; RV64-NEXT: lui a0, %hi(.LCPI41_0)
2282 ; RV64-NEXT: ld a0, %lo(.LCPI41_0)(a0)
2283 ; RV64-NEXT: lui a1, %hi(.LCPI41_1)
2284 ; RV64-NEXT: ld a1, %lo(.LCPI41_1)(a1)
2285 ; RV64-NEXT: vsrl.vi v12, v8, 1
2286 ; RV64-NEXT: vand.vx v12, v12, a0
2287 ; RV64-NEXT: vsub.vv v8, v8, v12
2288 ; RV64-NEXT: vand.vx v12, v8, a1
2289 ; RV64-NEXT: vsrl.vi v8, v8, 2
2290 ; RV64-NEXT: vand.vx v8, v8, a1
2291 ; RV64-NEXT: vadd.vv v8, v12, v8
2292 ; RV64-NEXT: lui a0, %hi(.LCPI41_2)
2293 ; RV64-NEXT: ld a0, %lo(.LCPI41_2)(a0)
2294 ; RV64-NEXT: lui a1, %hi(.LCPI41_3)
2295 ; RV64-NEXT: ld a1, %lo(.LCPI41_3)(a1)
2296 ; RV64-NEXT: vsrl.vi v12, v8, 4
2297 ; RV64-NEXT: vadd.vv v8, v8, v12
2298 ; RV64-NEXT: vand.vx v8, v8, a0
2299 ; RV64-NEXT: vmul.vx v8, v8, a1
2300 ; RV64-NEXT: li a0, 56
2301 ; RV64-NEXT: vsrl.vx v8, v8, a0
2303 %head = insertelement <vscale x 4 x i1> poison, i1 true, i32 0
2304 %m = shufflevector <vscale x 4 x i1> %head, <vscale x 4 x i1> poison, <vscale x 4 x i32> zeroinitializer
2305 %v = call <vscale x 4 x i64> @llvm.vp.cttz.nxv4i64(<vscale x 4 x i64> %va, i1 false, <vscale x 4 x i1> %m, i32 %evl)
2306 ret <vscale x 4 x i64> %v
2309 declare <vscale x 7 x i64> @llvm.vp.cttz.nxv7i64(<vscale x 7 x i64>, i1 immarg, <vscale x 7 x i1>, i32)
2311 define <vscale x 7 x i64> @vp_cttz_nxv7i64(<vscale x 7 x i64> %va, <vscale x 7 x i1> %m, i32 zeroext %evl) {
2312 ; RV32-LABEL: vp_cttz_nxv7i64:
2314 ; RV32-NEXT: addi sp, sp, -16
2315 ; RV32-NEXT: .cfi_def_cfa_offset 16
2316 ; RV32-NEXT: lui a1, 349525
2317 ; RV32-NEXT: addi a1, a1, 1365
2318 ; RV32-NEXT: sw a1, 12(sp)
2319 ; RV32-NEXT: sw a1, 8(sp)
2320 ; RV32-NEXT: lui a1, 209715
2321 ; RV32-NEXT: addi a1, a1, 819
2322 ; RV32-NEXT: sw a1, 12(sp)
2323 ; RV32-NEXT: sw a1, 8(sp)
2324 ; RV32-NEXT: lui a1, 61681
2325 ; RV32-NEXT: addi a1, a1, -241
2326 ; RV32-NEXT: sw a1, 12(sp)
2327 ; RV32-NEXT: sw a1, 8(sp)
2328 ; RV32-NEXT: lui a1, 4112
2329 ; RV32-NEXT: addi a1, a1, 257
2330 ; RV32-NEXT: sw a1, 12(sp)
2331 ; RV32-NEXT: sw a1, 8(sp)
2332 ; RV32-NEXT: li a1, 1
2333 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
2334 ; RV32-NEXT: vsub.vx v16, v8, a1, v0.t
2335 ; RV32-NEXT: vnot.v v8, v8, v0.t
2336 ; RV32-NEXT: vand.vv v8, v8, v16, v0.t
2337 ; RV32-NEXT: vsrl.vi v16, v8, 1, v0.t
2338 ; RV32-NEXT: addi a1, sp, 8
2339 ; RV32-NEXT: vsetvli a2, zero, e64, m8, ta, ma
2340 ; RV32-NEXT: vlse64.v v24, (a1), zero
2341 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
2342 ; RV32-NEXT: vand.vv v16, v16, v24, v0.t
2343 ; RV32-NEXT: vsub.vv v8, v8, v16, v0.t
2344 ; RV32-NEXT: vsetvli a2, zero, e64, m8, ta, ma
2345 ; RV32-NEXT: vlse64.v v16, (a1), zero
2346 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
2347 ; RV32-NEXT: vand.vv v24, v8, v16, v0.t
2348 ; RV32-NEXT: vsrl.vi v8, v8, 2, v0.t
2349 ; RV32-NEXT: vand.vv v8, v8, v16, v0.t
2350 ; RV32-NEXT: vadd.vv v8, v24, v8, v0.t
2351 ; RV32-NEXT: vsrl.vi v16, v8, 4, v0.t
2352 ; RV32-NEXT: vadd.vv v8, v8, v16, v0.t
2353 ; RV32-NEXT: vsetvli a2, zero, e64, m8, ta, ma
2354 ; RV32-NEXT: vlse64.v v16, (a1), zero
2355 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
2356 ; RV32-NEXT: vand.vv v8, v8, v16, v0.t
2357 ; RV32-NEXT: vsetvli a2, zero, e64, m8, ta, ma
2358 ; RV32-NEXT: vlse64.v v16, (a1), zero
2359 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
2360 ; RV32-NEXT: vmul.vv v8, v8, v16, v0.t
2361 ; RV32-NEXT: li a0, 56
2362 ; RV32-NEXT: vsrl.vx v8, v8, a0, v0.t
2363 ; RV32-NEXT: addi sp, sp, 16
2366 ; RV64-LABEL: vp_cttz_nxv7i64:
2368 ; RV64-NEXT: li a1, 1
2369 ; RV64-NEXT: vsetvli zero, a0, e64, m8, ta, ma
2370 ; RV64-NEXT: vsub.vx v16, v8, a1, v0.t
2371 ; RV64-NEXT: vnot.v v8, v8, v0.t
2372 ; RV64-NEXT: vand.vv v8, v8, v16, v0.t
2373 ; RV64-NEXT: lui a0, %hi(.LCPI42_0)
2374 ; RV64-NEXT: ld a0, %lo(.LCPI42_0)(a0)
2375 ; RV64-NEXT: lui a1, %hi(.LCPI42_1)
2376 ; RV64-NEXT: ld a1, %lo(.LCPI42_1)(a1)
2377 ; RV64-NEXT: vsrl.vi v16, v8, 1, v0.t
2378 ; RV64-NEXT: vand.vx v16, v16, a0, v0.t
2379 ; RV64-NEXT: vsub.vv v8, v8, v16, v0.t
2380 ; RV64-NEXT: vand.vx v16, v8, a1, v0.t
2381 ; RV64-NEXT: vsrl.vi v8, v8, 2, v0.t
2382 ; RV64-NEXT: vand.vx v8, v8, a1, v0.t
2383 ; RV64-NEXT: vadd.vv v8, v16, v8, v0.t
2384 ; RV64-NEXT: lui a0, %hi(.LCPI42_2)
2385 ; RV64-NEXT: ld a0, %lo(.LCPI42_2)(a0)
2386 ; RV64-NEXT: lui a1, %hi(.LCPI42_3)
2387 ; RV64-NEXT: ld a1, %lo(.LCPI42_3)(a1)
2388 ; RV64-NEXT: vsrl.vi v16, v8, 4, v0.t
2389 ; RV64-NEXT: vadd.vv v8, v8, v16, v0.t
2390 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
2391 ; RV64-NEXT: vmul.vx v8, v8, a1, v0.t
2392 ; RV64-NEXT: li a0, 56
2393 ; RV64-NEXT: vsrl.vx v8, v8, a0, v0.t
2395 %v = call <vscale x 7 x i64> @llvm.vp.cttz.nxv7i64(<vscale x 7 x i64> %va, i1 false, <vscale x 7 x i1> %m, i32 %evl)
2396 ret <vscale x 7 x i64> %v
2399 define <vscale x 7 x i64> @vp_cttz_nxv7i64_unmasked(<vscale x 7 x i64> %va, i32 zeroext %evl) {
2400 ; RV32-LABEL: vp_cttz_nxv7i64_unmasked:
2402 ; RV32-NEXT: addi sp, sp, -16
2403 ; RV32-NEXT: .cfi_def_cfa_offset 16
2404 ; RV32-NEXT: lui a1, 349525
2405 ; RV32-NEXT: addi a1, a1, 1365
2406 ; RV32-NEXT: sw a1, 12(sp)
2407 ; RV32-NEXT: sw a1, 8(sp)
2408 ; RV32-NEXT: lui a1, 209715
2409 ; RV32-NEXT: addi a1, a1, 819
2410 ; RV32-NEXT: sw a1, 12(sp)
2411 ; RV32-NEXT: sw a1, 8(sp)
2412 ; RV32-NEXT: lui a1, 61681
2413 ; RV32-NEXT: addi a1, a1, -241
2414 ; RV32-NEXT: sw a1, 12(sp)
2415 ; RV32-NEXT: sw a1, 8(sp)
2416 ; RV32-NEXT: lui a1, 4112
2417 ; RV32-NEXT: addi a1, a1, 257
2418 ; RV32-NEXT: sw a1, 12(sp)
2419 ; RV32-NEXT: sw a1, 8(sp)
2420 ; RV32-NEXT: li a1, 1
2421 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
2422 ; RV32-NEXT: vsub.vx v16, v8, a1
2423 ; RV32-NEXT: vnot.v v8, v8
2424 ; RV32-NEXT: vand.vv v8, v8, v16
2425 ; RV32-NEXT: vsrl.vi v16, v8, 1
2426 ; RV32-NEXT: addi a1, sp, 8
2427 ; RV32-NEXT: vsetvli a2, zero, e64, m8, ta, ma
2428 ; RV32-NEXT: vlse64.v v24, (a1), zero
2429 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
2430 ; RV32-NEXT: vand.vv v16, v16, v24
2431 ; RV32-NEXT: vsub.vv v8, v8, v16
2432 ; RV32-NEXT: vsetvli a2, zero, e64, m8, ta, ma
2433 ; RV32-NEXT: vlse64.v v16, (a1), zero
2434 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
2435 ; RV32-NEXT: vand.vv v24, v8, v16
2436 ; RV32-NEXT: vsrl.vi v8, v8, 2
2437 ; RV32-NEXT: vand.vv v8, v8, v16
2438 ; RV32-NEXT: vadd.vv v8, v24, v8
2439 ; RV32-NEXT: vsrl.vi v16, v8, 4
2440 ; RV32-NEXT: vadd.vv v8, v8, v16
2441 ; RV32-NEXT: vsetvli a2, zero, e64, m8, ta, ma
2442 ; RV32-NEXT: vlse64.v v16, (a1), zero
2443 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
2444 ; RV32-NEXT: vand.vv v8, v8, v16
2445 ; RV32-NEXT: vsetvli a2, zero, e64, m8, ta, ma
2446 ; RV32-NEXT: vlse64.v v16, (a1), zero
2447 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
2448 ; RV32-NEXT: vmul.vv v8, v8, v16
2449 ; RV32-NEXT: li a0, 56
2450 ; RV32-NEXT: vsrl.vx v8, v8, a0
2451 ; RV32-NEXT: addi sp, sp, 16
2454 ; RV64-LABEL: vp_cttz_nxv7i64_unmasked:
2456 ; RV64-NEXT: li a1, 1
2457 ; RV64-NEXT: vsetvli zero, a0, e64, m8, ta, ma
2458 ; RV64-NEXT: vsub.vx v16, v8, a1
2459 ; RV64-NEXT: vnot.v v8, v8
2460 ; RV64-NEXT: vand.vv v8, v8, v16
2461 ; RV64-NEXT: lui a0, %hi(.LCPI43_0)
2462 ; RV64-NEXT: ld a0, %lo(.LCPI43_0)(a0)
2463 ; RV64-NEXT: lui a1, %hi(.LCPI43_1)
2464 ; RV64-NEXT: ld a1, %lo(.LCPI43_1)(a1)
2465 ; RV64-NEXT: vsrl.vi v16, v8, 1
2466 ; RV64-NEXT: vand.vx v16, v16, a0
2467 ; RV64-NEXT: vsub.vv v8, v8, v16
2468 ; RV64-NEXT: vand.vx v16, v8, a1
2469 ; RV64-NEXT: vsrl.vi v8, v8, 2
2470 ; RV64-NEXT: vand.vx v8, v8, a1
2471 ; RV64-NEXT: vadd.vv v8, v16, v8
2472 ; RV64-NEXT: lui a0, %hi(.LCPI43_2)
2473 ; RV64-NEXT: ld a0, %lo(.LCPI43_2)(a0)
2474 ; RV64-NEXT: lui a1, %hi(.LCPI43_3)
2475 ; RV64-NEXT: ld a1, %lo(.LCPI43_3)(a1)
2476 ; RV64-NEXT: vsrl.vi v16, v8, 4
2477 ; RV64-NEXT: vadd.vv v8, v8, v16
2478 ; RV64-NEXT: vand.vx v8, v8, a0
2479 ; RV64-NEXT: vmul.vx v8, v8, a1
2480 ; RV64-NEXT: li a0, 56
2481 ; RV64-NEXT: vsrl.vx v8, v8, a0
2483 %head = insertelement <vscale x 7 x i1> poison, i1 true, i32 0
2484 %m = shufflevector <vscale x 7 x i1> %head, <vscale x 7 x i1> poison, <vscale x 7 x i32> zeroinitializer
2485 %v = call <vscale x 7 x i64> @llvm.vp.cttz.nxv7i64(<vscale x 7 x i64> %va, i1 false, <vscale x 7 x i1> %m, i32 %evl)
2486 ret <vscale x 7 x i64> %v
2489 declare <vscale x 8 x i64> @llvm.vp.cttz.nxv8i64(<vscale x 8 x i64>, i1 immarg, <vscale x 8 x i1>, i32)
2491 define <vscale x 8 x i64> @vp_cttz_nxv8i64(<vscale x 8 x i64> %va, <vscale x 8 x i1> %m, i32 zeroext %evl) {
2492 ; RV32-LABEL: vp_cttz_nxv8i64:
2494 ; RV32-NEXT: addi sp, sp, -16
2495 ; RV32-NEXT: .cfi_def_cfa_offset 16
2496 ; RV32-NEXT: lui a1, 349525
2497 ; RV32-NEXT: addi a1, a1, 1365
2498 ; RV32-NEXT: sw a1, 12(sp)
2499 ; RV32-NEXT: sw a1, 8(sp)
2500 ; RV32-NEXT: lui a1, 209715
2501 ; RV32-NEXT: addi a1, a1, 819
2502 ; RV32-NEXT: sw a1, 12(sp)
2503 ; RV32-NEXT: sw a1, 8(sp)
2504 ; RV32-NEXT: lui a1, 61681
2505 ; RV32-NEXT: addi a1, a1, -241
2506 ; RV32-NEXT: sw a1, 12(sp)
2507 ; RV32-NEXT: sw a1, 8(sp)
2508 ; RV32-NEXT: lui a1, 4112
2509 ; RV32-NEXT: addi a1, a1, 257
2510 ; RV32-NEXT: sw a1, 12(sp)
2511 ; RV32-NEXT: sw a1, 8(sp)
2512 ; RV32-NEXT: li a1, 1
2513 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
2514 ; RV32-NEXT: vsub.vx v16, v8, a1, v0.t
2515 ; RV32-NEXT: vnot.v v8, v8, v0.t
2516 ; RV32-NEXT: vand.vv v8, v8, v16, v0.t
2517 ; RV32-NEXT: vsrl.vi v16, v8, 1, v0.t
2518 ; RV32-NEXT: addi a1, sp, 8
2519 ; RV32-NEXT: vsetvli a2, zero, e64, m8, ta, ma
2520 ; RV32-NEXT: vlse64.v v24, (a1), zero
2521 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
2522 ; RV32-NEXT: vand.vv v16, v16, v24, v0.t
2523 ; RV32-NEXT: vsub.vv v8, v8, v16, v0.t
2524 ; RV32-NEXT: vsetvli a2, zero, e64, m8, ta, ma
2525 ; RV32-NEXT: vlse64.v v16, (a1), zero
2526 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
2527 ; RV32-NEXT: vand.vv v24, v8, v16, v0.t
2528 ; RV32-NEXT: vsrl.vi v8, v8, 2, v0.t
2529 ; RV32-NEXT: vand.vv v8, v8, v16, v0.t
2530 ; RV32-NEXT: vadd.vv v8, v24, v8, v0.t
2531 ; RV32-NEXT: vsrl.vi v16, v8, 4, v0.t
2532 ; RV32-NEXT: vadd.vv v8, v8, v16, v0.t
2533 ; RV32-NEXT: vsetvli a2, zero, e64, m8, ta, ma
2534 ; RV32-NEXT: vlse64.v v16, (a1), zero
2535 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
2536 ; RV32-NEXT: vand.vv v8, v8, v16, v0.t
2537 ; RV32-NEXT: vsetvli a2, zero, e64, m8, ta, ma
2538 ; RV32-NEXT: vlse64.v v16, (a1), zero
2539 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
2540 ; RV32-NEXT: vmul.vv v8, v8, v16, v0.t
2541 ; RV32-NEXT: li a0, 56
2542 ; RV32-NEXT: vsrl.vx v8, v8, a0, v0.t
2543 ; RV32-NEXT: addi sp, sp, 16
2546 ; RV64-LABEL: vp_cttz_nxv8i64:
2548 ; RV64-NEXT: li a1, 1
2549 ; RV64-NEXT: vsetvli zero, a0, e64, m8, ta, ma
2550 ; RV64-NEXT: vsub.vx v16, v8, a1, v0.t
2551 ; RV64-NEXT: vnot.v v8, v8, v0.t
2552 ; RV64-NEXT: vand.vv v8, v8, v16, v0.t
2553 ; RV64-NEXT: lui a0, %hi(.LCPI44_0)
2554 ; RV64-NEXT: ld a0, %lo(.LCPI44_0)(a0)
2555 ; RV64-NEXT: lui a1, %hi(.LCPI44_1)
2556 ; RV64-NEXT: ld a1, %lo(.LCPI44_1)(a1)
2557 ; RV64-NEXT: vsrl.vi v16, v8, 1, v0.t
2558 ; RV64-NEXT: vand.vx v16, v16, a0, v0.t
2559 ; RV64-NEXT: vsub.vv v8, v8, v16, v0.t
2560 ; RV64-NEXT: vand.vx v16, v8, a1, v0.t
2561 ; RV64-NEXT: vsrl.vi v8, v8, 2, v0.t
2562 ; RV64-NEXT: vand.vx v8, v8, a1, v0.t
2563 ; RV64-NEXT: vadd.vv v8, v16, v8, v0.t
2564 ; RV64-NEXT: lui a0, %hi(.LCPI44_2)
2565 ; RV64-NEXT: ld a0, %lo(.LCPI44_2)(a0)
2566 ; RV64-NEXT: lui a1, %hi(.LCPI44_3)
2567 ; RV64-NEXT: ld a1, %lo(.LCPI44_3)(a1)
2568 ; RV64-NEXT: vsrl.vi v16, v8, 4, v0.t
2569 ; RV64-NEXT: vadd.vv v8, v8, v16, v0.t
2570 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
2571 ; RV64-NEXT: vmul.vx v8, v8, a1, v0.t
2572 ; RV64-NEXT: li a0, 56
2573 ; RV64-NEXT: vsrl.vx v8, v8, a0, v0.t
2575 %v = call <vscale x 8 x i64> @llvm.vp.cttz.nxv8i64(<vscale x 8 x i64> %va, i1 false, <vscale x 8 x i1> %m, i32 %evl)
2576 ret <vscale x 8 x i64> %v
2579 define <vscale x 8 x i64> @vp_cttz_nxv8i64_unmasked(<vscale x 8 x i64> %va, i32 zeroext %evl) {
2580 ; RV32-LABEL: vp_cttz_nxv8i64_unmasked:
2582 ; RV32-NEXT: addi sp, sp, -16
2583 ; RV32-NEXT: .cfi_def_cfa_offset 16
2584 ; RV32-NEXT: lui a1, 349525
2585 ; RV32-NEXT: addi a1, a1, 1365
2586 ; RV32-NEXT: sw a1, 12(sp)
2587 ; RV32-NEXT: sw a1, 8(sp)
2588 ; RV32-NEXT: lui a1, 209715
2589 ; RV32-NEXT: addi a1, a1, 819
2590 ; RV32-NEXT: sw a1, 12(sp)
2591 ; RV32-NEXT: sw a1, 8(sp)
2592 ; RV32-NEXT: lui a1, 61681
2593 ; RV32-NEXT: addi a1, a1, -241
2594 ; RV32-NEXT: sw a1, 12(sp)
2595 ; RV32-NEXT: sw a1, 8(sp)
2596 ; RV32-NEXT: lui a1, 4112
2597 ; RV32-NEXT: addi a1, a1, 257
2598 ; RV32-NEXT: sw a1, 12(sp)
2599 ; RV32-NEXT: sw a1, 8(sp)
2600 ; RV32-NEXT: li a1, 1
2601 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
2602 ; RV32-NEXT: vsub.vx v16, v8, a1
2603 ; RV32-NEXT: vnot.v v8, v8
2604 ; RV32-NEXT: vand.vv v8, v8, v16
2605 ; RV32-NEXT: vsrl.vi v16, v8, 1
2606 ; RV32-NEXT: addi a1, sp, 8
2607 ; RV32-NEXT: vsetvli a2, zero, e64, m8, ta, ma
2608 ; RV32-NEXT: vlse64.v v24, (a1), zero
2609 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
2610 ; RV32-NEXT: vand.vv v16, v16, v24
2611 ; RV32-NEXT: vsub.vv v8, v8, v16
2612 ; RV32-NEXT: vsetvli a2, zero, e64, m8, ta, ma
2613 ; RV32-NEXT: vlse64.v v16, (a1), zero
2614 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
2615 ; RV32-NEXT: vand.vv v24, v8, v16
2616 ; RV32-NEXT: vsrl.vi v8, v8, 2
2617 ; RV32-NEXT: vand.vv v8, v8, v16
2618 ; RV32-NEXT: vadd.vv v8, v24, v8
2619 ; RV32-NEXT: vsrl.vi v16, v8, 4
2620 ; RV32-NEXT: vadd.vv v8, v8, v16
2621 ; RV32-NEXT: vsetvli a2, zero, e64, m8, ta, ma
2622 ; RV32-NEXT: vlse64.v v16, (a1), zero
2623 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
2624 ; RV32-NEXT: vand.vv v8, v8, v16
2625 ; RV32-NEXT: vsetvli a2, zero, e64, m8, ta, ma
2626 ; RV32-NEXT: vlse64.v v16, (a1), zero
2627 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
2628 ; RV32-NEXT: vmul.vv v8, v8, v16
2629 ; RV32-NEXT: li a0, 56
2630 ; RV32-NEXT: vsrl.vx v8, v8, a0
2631 ; RV32-NEXT: addi sp, sp, 16
2634 ; RV64-LABEL: vp_cttz_nxv8i64_unmasked:
2636 ; RV64-NEXT: li a1, 1
2637 ; RV64-NEXT: vsetvli zero, a0, e64, m8, ta, ma
2638 ; RV64-NEXT: vsub.vx v16, v8, a1
2639 ; RV64-NEXT: vnot.v v8, v8
2640 ; RV64-NEXT: vand.vv v8, v8, v16
2641 ; RV64-NEXT: lui a0, %hi(.LCPI45_0)
2642 ; RV64-NEXT: ld a0, %lo(.LCPI45_0)(a0)
2643 ; RV64-NEXT: lui a1, %hi(.LCPI45_1)
2644 ; RV64-NEXT: ld a1, %lo(.LCPI45_1)(a1)
2645 ; RV64-NEXT: vsrl.vi v16, v8, 1
2646 ; RV64-NEXT: vand.vx v16, v16, a0
2647 ; RV64-NEXT: vsub.vv v8, v8, v16
2648 ; RV64-NEXT: vand.vx v16, v8, a1
2649 ; RV64-NEXT: vsrl.vi v8, v8, 2
2650 ; RV64-NEXT: vand.vx v8, v8, a1
2651 ; RV64-NEXT: vadd.vv v8, v16, v8
2652 ; RV64-NEXT: lui a0, %hi(.LCPI45_2)
2653 ; RV64-NEXT: ld a0, %lo(.LCPI45_2)(a0)
2654 ; RV64-NEXT: lui a1, %hi(.LCPI45_3)
2655 ; RV64-NEXT: ld a1, %lo(.LCPI45_3)(a1)
2656 ; RV64-NEXT: vsrl.vi v16, v8, 4
2657 ; RV64-NEXT: vadd.vv v8, v8, v16
2658 ; RV64-NEXT: vand.vx v8, v8, a0
2659 ; RV64-NEXT: vmul.vx v8, v8, a1
2660 ; RV64-NEXT: li a0, 56
2661 ; RV64-NEXT: vsrl.vx v8, v8, a0
2663 %head = insertelement <vscale x 8 x i1> poison, i1 true, i32 0
2664 %m = shufflevector <vscale x 8 x i1> %head, <vscale x 8 x i1> poison, <vscale x 8 x i32> zeroinitializer
2665 %v = call <vscale x 8 x i64> @llvm.vp.cttz.nxv8i64(<vscale x 8 x i64> %va, i1 false, <vscale x 8 x i1> %m, i32 %evl)
2666 ret <vscale x 8 x i64> %v
2669 declare <vscale x 16 x i64> @llvm.vp.cttz.nxv16i64(<vscale x 16 x i64>, i1 immarg, <vscale x 16 x i1>, i32)
2671 define <vscale x 16 x i64> @vp_cttz_nxv16i64(<vscale x 16 x i64> %va, <vscale x 16 x i1> %m, i32 zeroext %evl) {
2672 ; RV32-LABEL: vp_cttz_nxv16i64:
2674 ; RV32-NEXT: addi sp, sp, -16
2675 ; RV32-NEXT: .cfi_def_cfa_offset 16
2676 ; RV32-NEXT: csrr a1, vlenb
2677 ; RV32-NEXT: li a2, 40
2678 ; RV32-NEXT: mul a1, a1, a2
2679 ; RV32-NEXT: sub sp, sp, a1
2680 ; RV32-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x28, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 40 * vlenb
2681 ; RV32-NEXT: vmv1r.v v1, v0
2682 ; RV32-NEXT: csrr a1, vlenb
2683 ; RV32-NEXT: srli a2, a1, 3
2684 ; RV32-NEXT: vsetvli a3, zero, e8, mf4, ta, ma
2685 ; RV32-NEXT: vslidedown.vx v0, v0, a2
2686 ; RV32-NEXT: lui a2, 349525
2687 ; RV32-NEXT: addi a2, a2, 1365
2688 ; RV32-NEXT: sw a2, 12(sp)
2689 ; RV32-NEXT: sw a2, 8(sp)
2690 ; RV32-NEXT: lui a2, 209715
2691 ; RV32-NEXT: addi a2, a2, 819
2692 ; RV32-NEXT: sw a2, 12(sp)
2693 ; RV32-NEXT: sw a2, 8(sp)
2694 ; RV32-NEXT: lui a2, 61681
2695 ; RV32-NEXT: addi a2, a2, -241
2696 ; RV32-NEXT: sw a2, 12(sp)
2697 ; RV32-NEXT: sw a2, 8(sp)
2698 ; RV32-NEXT: lui a2, 4112
2699 ; RV32-NEXT: addi a2, a2, 257
2700 ; RV32-NEXT: sw a2, 12(sp)
2701 ; RV32-NEXT: sw a2, 8(sp)
2702 ; RV32-NEXT: sub a2, a0, a1
2703 ; RV32-NEXT: sltu a3, a0, a2
2704 ; RV32-NEXT: addi a3, a3, -1
2705 ; RV32-NEXT: and a3, a3, a2
2706 ; RV32-NEXT: li a2, 1
2707 ; RV32-NEXT: vsetvli zero, a3, e64, m8, ta, ma
2708 ; RV32-NEXT: vsub.vx v24, v16, a2, v0.t
2709 ; RV32-NEXT: vnot.v v16, v16, v0.t
2710 ; RV32-NEXT: vand.vv v16, v16, v24, v0.t
2711 ; RV32-NEXT: csrr a4, vlenb
2712 ; RV32-NEXT: slli a4, a4, 5
2713 ; RV32-NEXT: add a4, sp, a4
2714 ; RV32-NEXT: addi a4, a4, 16
2715 ; RV32-NEXT: vs8r.v v16, (a4) # Unknown-size Folded Spill
2716 ; RV32-NEXT: vsrl.vi v24, v16, 1, v0.t
2717 ; RV32-NEXT: addi a4, sp, 8
2718 ; RV32-NEXT: vsetvli a5, zero, e64, m8, ta, ma
2719 ; RV32-NEXT: vlse64.v v16, (a4), zero
2720 ; RV32-NEXT: vsetvli zero, a3, e64, m8, ta, ma
2721 ; RV32-NEXT: csrr a5, vlenb
2722 ; RV32-NEXT: slli a5, a5, 4
2723 ; RV32-NEXT: add a5, sp, a5
2724 ; RV32-NEXT: addi a5, a5, 16
2725 ; RV32-NEXT: vs8r.v v16, (a5) # Unknown-size Folded Spill
2726 ; RV32-NEXT: vand.vv v24, v24, v16, v0.t
2727 ; RV32-NEXT: csrr a5, vlenb
2728 ; RV32-NEXT: slli a5, a5, 5
2729 ; RV32-NEXT: add a5, sp, a5
2730 ; RV32-NEXT: addi a5, a5, 16
2731 ; RV32-NEXT: vl8r.v v16, (a5) # Unknown-size Folded Reload
2732 ; RV32-NEXT: vsub.vv v16, v16, v24, v0.t
2733 ; RV32-NEXT: csrr a5, vlenb
2734 ; RV32-NEXT: li a6, 24
2735 ; RV32-NEXT: mul a5, a5, a6
2736 ; RV32-NEXT: add a5, sp, a5
2737 ; RV32-NEXT: addi a5, a5, 16
2738 ; RV32-NEXT: vs8r.v v16, (a5) # Unknown-size Folded Spill
2739 ; RV32-NEXT: vsetvli a5, zero, e64, m8, ta, ma
2740 ; RV32-NEXT: vlse64.v v16, (a4), zero
2741 ; RV32-NEXT: csrr a5, vlenb
2742 ; RV32-NEXT: slli a5, a5, 5
2743 ; RV32-NEXT: add a5, sp, a5
2744 ; RV32-NEXT: addi a5, a5, 16
2745 ; RV32-NEXT: vs8r.v v16, (a5) # Unknown-size Folded Spill
2746 ; RV32-NEXT: vsetvli zero, a3, e64, m8, ta, ma
2747 ; RV32-NEXT: csrr a5, vlenb
2748 ; RV32-NEXT: li a6, 24
2749 ; RV32-NEXT: mul a5, a5, a6
2750 ; RV32-NEXT: add a5, sp, a5
2751 ; RV32-NEXT: addi a5, a5, 16
2752 ; RV32-NEXT: vl8r.v v16, (a5) # Unknown-size Folded Reload
2753 ; RV32-NEXT: csrr a5, vlenb
2754 ; RV32-NEXT: slli a5, a5, 5
2755 ; RV32-NEXT: add a5, sp, a5
2756 ; RV32-NEXT: addi a5, a5, 16
2757 ; RV32-NEXT: vl8r.v v24, (a5) # Unknown-size Folded Reload
2758 ; RV32-NEXT: vand.vv v16, v16, v24, v0.t
2759 ; RV32-NEXT: csrr a5, vlenb
2760 ; RV32-NEXT: slli a5, a5, 3
2761 ; RV32-NEXT: add a5, sp, a5
2762 ; RV32-NEXT: addi a5, a5, 16
2763 ; RV32-NEXT: vs8r.v v16, (a5) # Unknown-size Folded Spill
2764 ; RV32-NEXT: csrr a5, vlenb
2765 ; RV32-NEXT: li a6, 24
2766 ; RV32-NEXT: mul a5, a5, a6
2767 ; RV32-NEXT: add a5, sp, a5
2768 ; RV32-NEXT: addi a5, a5, 16
2769 ; RV32-NEXT: vl8r.v v16, (a5) # Unknown-size Folded Reload
2770 ; RV32-NEXT: vsrl.vi v16, v16, 2, v0.t
2771 ; RV32-NEXT: csrr a5, vlenb
2772 ; RV32-NEXT: li a6, 24
2773 ; RV32-NEXT: mul a5, a5, a6
2774 ; RV32-NEXT: add a5, sp, a5
2775 ; RV32-NEXT: addi a5, a5, 16
2776 ; RV32-NEXT: vs8r.v v16, (a5) # Unknown-size Folded Spill
2777 ; RV32-NEXT: csrr a5, vlenb
2778 ; RV32-NEXT: slli a5, a5, 5
2779 ; RV32-NEXT: add a5, sp, a5
2780 ; RV32-NEXT: addi a5, a5, 16
2781 ; RV32-NEXT: vl8r.v v16, (a5) # Unknown-size Folded Reload
2782 ; RV32-NEXT: csrr a5, vlenb
2783 ; RV32-NEXT: li a6, 24
2784 ; RV32-NEXT: mul a5, a5, a6
2785 ; RV32-NEXT: add a5, sp, a5
2786 ; RV32-NEXT: addi a5, a5, 16
2787 ; RV32-NEXT: vl8r.v v24, (a5) # Unknown-size Folded Reload
2788 ; RV32-NEXT: vand.vv v16, v24, v16, v0.t
2789 ; RV32-NEXT: csrr a5, vlenb
2790 ; RV32-NEXT: slli a5, a5, 3
2791 ; RV32-NEXT: add a5, sp, a5
2792 ; RV32-NEXT: addi a5, a5, 16
2793 ; RV32-NEXT: vl8r.v v24, (a5) # Unknown-size Folded Reload
2794 ; RV32-NEXT: vadd.vv v16, v24, v16, v0.t
2795 ; RV32-NEXT: vsrl.vi v24, v16, 4, v0.t
2796 ; RV32-NEXT: vadd.vv v24, v16, v24, v0.t
2797 ; RV32-NEXT: vsetvli a5, zero, e64, m8, ta, ma
2798 ; RV32-NEXT: vlse64.v v16, (a4), zero
2799 ; RV32-NEXT: vsetvli zero, a3, e64, m8, ta, ma
2800 ; RV32-NEXT: csrr a5, vlenb
2801 ; RV32-NEXT: li a6, 24
2802 ; RV32-NEXT: mul a5, a5, a6
2803 ; RV32-NEXT: add a5, sp, a5
2804 ; RV32-NEXT: addi a5, a5, 16
2805 ; RV32-NEXT: vs8r.v v16, (a5) # Unknown-size Folded Spill
2806 ; RV32-NEXT: vand.vv v24, v24, v16, v0.t
2807 ; RV32-NEXT: vsetvli a5, zero, e64, m8, ta, ma
2808 ; RV32-NEXT: vlse64.v v16, (a4), zero
2809 ; RV32-NEXT: vsetvli zero, a3, e64, m8, ta, ma
2810 ; RV32-NEXT: csrr a3, vlenb
2811 ; RV32-NEXT: slli a3, a3, 3
2812 ; RV32-NEXT: add a3, sp, a3
2813 ; RV32-NEXT: addi a3, a3, 16
2814 ; RV32-NEXT: vs8r.v v16, (a3) # Unknown-size Folded Spill
2815 ; RV32-NEXT: vmul.vv v16, v24, v16, v0.t
2816 ; RV32-NEXT: li a3, 56
2817 ; RV32-NEXT: vsrl.vx v16, v16, a3, v0.t
2818 ; RV32-NEXT: addi a4, sp, 16
2819 ; RV32-NEXT: vs8r.v v16, (a4) # Unknown-size Folded Spill
2820 ; RV32-NEXT: bltu a0, a1, .LBB46_2
2821 ; RV32-NEXT: # %bb.1:
2822 ; RV32-NEXT: mv a0, a1
2823 ; RV32-NEXT: .LBB46_2:
2824 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
2825 ; RV32-NEXT: vmv1r.v v0, v1
2826 ; RV32-NEXT: vsub.vx v16, v8, a2, v0.t
2827 ; RV32-NEXT: vnot.v v8, v8, v0.t
2828 ; RV32-NEXT: vand.vv v8, v8, v16, v0.t
2829 ; RV32-NEXT: vsrl.vi v24, v8, 1, v0.t
2830 ; RV32-NEXT: csrr a0, vlenb
2831 ; RV32-NEXT: slli a0, a0, 4
2832 ; RV32-NEXT: add a0, sp, a0
2833 ; RV32-NEXT: addi a0, a0, 16
2834 ; RV32-NEXT: vl8r.v v16, (a0) # Unknown-size Folded Reload
2835 ; RV32-NEXT: vand.vv v16, v24, v16, v0.t
2836 ; RV32-NEXT: vsub.vv v8, v8, v16, v0.t
2837 ; RV32-NEXT: csrr a0, vlenb
2838 ; RV32-NEXT: slli a0, a0, 5
2839 ; RV32-NEXT: add a0, sp, a0
2840 ; RV32-NEXT: addi a0, a0, 16
2841 ; RV32-NEXT: vl8r.v v16, (a0) # Unknown-size Folded Reload
2842 ; RV32-NEXT: vand.vv v24, v8, v16, v0.t
2843 ; RV32-NEXT: vsrl.vi v8, v8, 2, v0.t
2844 ; RV32-NEXT: vand.vv v8, v8, v16, v0.t
2845 ; RV32-NEXT: vadd.vv v8, v24, v8, v0.t
2846 ; RV32-NEXT: vsrl.vi v16, v8, 4, v0.t
2847 ; RV32-NEXT: vadd.vv v8, v8, v16, v0.t
2848 ; RV32-NEXT: csrr a0, vlenb
2849 ; RV32-NEXT: li a1, 24
2850 ; RV32-NEXT: mul a0, a0, a1
2851 ; RV32-NEXT: add a0, sp, a0
2852 ; RV32-NEXT: addi a0, a0, 16
2853 ; RV32-NEXT: vl8r.v v16, (a0) # Unknown-size Folded Reload
2854 ; RV32-NEXT: vand.vv v8, v8, v16, v0.t
2855 ; RV32-NEXT: csrr a0, vlenb
2856 ; RV32-NEXT: slli a0, a0, 3
2857 ; RV32-NEXT: add a0, sp, a0
2858 ; RV32-NEXT: addi a0, a0, 16
2859 ; RV32-NEXT: vl8r.v v16, (a0) # Unknown-size Folded Reload
2860 ; RV32-NEXT: vmul.vv v8, v8, v16, v0.t
2861 ; RV32-NEXT: vsrl.vx v8, v8, a3, v0.t
2862 ; RV32-NEXT: addi a0, sp, 16
2863 ; RV32-NEXT: vl8r.v v16, (a0) # Unknown-size Folded Reload
2864 ; RV32-NEXT: csrr a0, vlenb
2865 ; RV32-NEXT: li a1, 40
2866 ; RV32-NEXT: mul a0, a0, a1
2867 ; RV32-NEXT: add sp, sp, a0
2868 ; RV32-NEXT: addi sp, sp, 16
2871 ; RV64-LABEL: vp_cttz_nxv16i64:
2873 ; RV64-NEXT: addi sp, sp, -16
2874 ; RV64-NEXT: .cfi_def_cfa_offset 16
2875 ; RV64-NEXT: csrr a1, vlenb
2876 ; RV64-NEXT: slli a1, a1, 4
2877 ; RV64-NEXT: sub sp, sp, a1
2878 ; RV64-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x10, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 16 * vlenb
2879 ; RV64-NEXT: vmv1r.v v24, v0
2880 ; RV64-NEXT: csrr a1, vlenb
2881 ; RV64-NEXT: slli a1, a1, 3
2882 ; RV64-NEXT: add a1, sp, a1
2883 ; RV64-NEXT: addi a1, a1, 16
2884 ; RV64-NEXT: vs8r.v v8, (a1) # Unknown-size Folded Spill
2885 ; RV64-NEXT: csrr a1, vlenb
2886 ; RV64-NEXT: srli a2, a1, 3
2887 ; RV64-NEXT: vsetvli a3, zero, e8, mf4, ta, ma
2888 ; RV64-NEXT: vslidedown.vx v0, v0, a2
2889 ; RV64-NEXT: sub a2, a0, a1
2890 ; RV64-NEXT: sltu a3, a0, a2
2891 ; RV64-NEXT: addi a3, a3, -1
2892 ; RV64-NEXT: and a3, a3, a2
2893 ; RV64-NEXT: li a2, 1
2894 ; RV64-NEXT: vsetvli zero, a3, e64, m8, ta, ma
2895 ; RV64-NEXT: vsub.vx v8, v16, a2, v0.t
2896 ; RV64-NEXT: vnot.v v16, v16, v0.t
2897 ; RV64-NEXT: vand.vv v16, v16, v8, v0.t
2898 ; RV64-NEXT: lui a3, %hi(.LCPI46_0)
2899 ; RV64-NEXT: ld a4, %lo(.LCPI46_0)(a3)
2900 ; RV64-NEXT: lui a3, %hi(.LCPI46_1)
2901 ; RV64-NEXT: ld a3, %lo(.LCPI46_1)(a3)
2902 ; RV64-NEXT: vsrl.vi v8, v16, 1, v0.t
2903 ; RV64-NEXT: vand.vx v8, v8, a4, v0.t
2904 ; RV64-NEXT: vsub.vv v8, v16, v8, v0.t
2905 ; RV64-NEXT: vand.vx v16, v8, a3, v0.t
2906 ; RV64-NEXT: vsrl.vi v8, v8, 2, v0.t
2907 ; RV64-NEXT: vand.vx v8, v8, a3, v0.t
2908 ; RV64-NEXT: vadd.vv v16, v16, v8, v0.t
2909 ; RV64-NEXT: lui a5, %hi(.LCPI46_2)
2910 ; RV64-NEXT: ld a5, %lo(.LCPI46_2)(a5)
2911 ; RV64-NEXT: lui a6, %hi(.LCPI46_3)
2912 ; RV64-NEXT: ld a6, %lo(.LCPI46_3)(a6)
2913 ; RV64-NEXT: vsrl.vi v8, v16, 4, v0.t
2914 ; RV64-NEXT: vadd.vv v8, v16, v8, v0.t
2915 ; RV64-NEXT: vand.vx v8, v8, a5, v0.t
2916 ; RV64-NEXT: vmul.vx v8, v8, a6, v0.t
2917 ; RV64-NEXT: li a7, 56
2918 ; RV64-NEXT: vsrl.vx v8, v8, a7, v0.t
2919 ; RV64-NEXT: addi t0, sp, 16
2920 ; RV64-NEXT: vs8r.v v8, (t0) # Unknown-size Folded Spill
2921 ; RV64-NEXT: bltu a0, a1, .LBB46_2
2922 ; RV64-NEXT: # %bb.1:
2923 ; RV64-NEXT: mv a0, a1
2924 ; RV64-NEXT: .LBB46_2:
2925 ; RV64-NEXT: vsetvli zero, a0, e64, m8, ta, ma
2926 ; RV64-NEXT: vmv1r.v v0, v24
2927 ; RV64-NEXT: csrr a0, vlenb
2928 ; RV64-NEXT: slli a0, a0, 3
2929 ; RV64-NEXT: add a0, sp, a0
2930 ; RV64-NEXT: addi a0, a0, 16
2931 ; RV64-NEXT: vl8r.v v8, (a0) # Unknown-size Folded Reload
2932 ; RV64-NEXT: vsub.vx v16, v8, a2, v0.t
2933 ; RV64-NEXT: vnot.v v8, v8, v0.t
2934 ; RV64-NEXT: vand.vv v8, v8, v16, v0.t
2935 ; RV64-NEXT: vsrl.vi v16, v8, 1, v0.t
2936 ; RV64-NEXT: vand.vx v16, v16, a4, v0.t
2937 ; RV64-NEXT: vsub.vv v8, v8, v16, v0.t
2938 ; RV64-NEXT: vand.vx v16, v8, a3, v0.t
2939 ; RV64-NEXT: vsrl.vi v8, v8, 2, v0.t
2940 ; RV64-NEXT: vand.vx v8, v8, a3, v0.t
2941 ; RV64-NEXT: vadd.vv v8, v16, v8, v0.t
2942 ; RV64-NEXT: vsrl.vi v16, v8, 4, v0.t
2943 ; RV64-NEXT: vadd.vv v8, v8, v16, v0.t
2944 ; RV64-NEXT: vand.vx v8, v8, a5, v0.t
2945 ; RV64-NEXT: vmul.vx v8, v8, a6, v0.t
2946 ; RV64-NEXT: vsrl.vx v8, v8, a7, v0.t
2947 ; RV64-NEXT: addi a0, sp, 16
2948 ; RV64-NEXT: vl8r.v v16, (a0) # Unknown-size Folded Reload
2949 ; RV64-NEXT: csrr a0, vlenb
2950 ; RV64-NEXT: slli a0, a0, 4
2951 ; RV64-NEXT: add sp, sp, a0
2952 ; RV64-NEXT: addi sp, sp, 16
2954 %v = call <vscale x 16 x i64> @llvm.vp.cttz.nxv16i64(<vscale x 16 x i64> %va, i1 false, <vscale x 16 x i1> %m, i32 %evl)
2955 ret <vscale x 16 x i64> %v
2958 define <vscale x 16 x i64> @vp_cttz_nxv16i64_unmasked(<vscale x 16 x i64> %va, i32 zeroext %evl) {
2959 ; RV32-LABEL: vp_cttz_nxv16i64_unmasked:
2961 ; RV32-NEXT: addi sp, sp, -16
2962 ; RV32-NEXT: .cfi_def_cfa_offset 16
2963 ; RV32-NEXT: csrr a1, vlenb
2964 ; RV32-NEXT: slli a1, a1, 5
2965 ; RV32-NEXT: sub sp, sp, a1
2966 ; RV32-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x20, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 32 * vlenb
2967 ; RV32-NEXT: lui a1, 349525
2968 ; RV32-NEXT: addi a1, a1, 1365
2969 ; RV32-NEXT: sw a1, 12(sp)
2970 ; RV32-NEXT: sw a1, 8(sp)
2971 ; RV32-NEXT: lui a1, 209715
2972 ; RV32-NEXT: addi a1, a1, 819
2973 ; RV32-NEXT: sw a1, 12(sp)
2974 ; RV32-NEXT: sw a1, 8(sp)
2975 ; RV32-NEXT: lui a1, 61681
2976 ; RV32-NEXT: addi a1, a1, -241
2977 ; RV32-NEXT: sw a1, 12(sp)
2978 ; RV32-NEXT: sw a1, 8(sp)
2979 ; RV32-NEXT: lui a1, 4112
2980 ; RV32-NEXT: addi a1, a1, 257
2981 ; RV32-NEXT: sw a1, 12(sp)
2982 ; RV32-NEXT: sw a1, 8(sp)
2983 ; RV32-NEXT: csrr a1, vlenb
2984 ; RV32-NEXT: sub a2, a0, a1
2985 ; RV32-NEXT: sltu a3, a0, a2
2986 ; RV32-NEXT: addi a3, a3, -1
2987 ; RV32-NEXT: and a3, a3, a2
2988 ; RV32-NEXT: li a2, 1
2989 ; RV32-NEXT: vsetvli zero, a3, e64, m8, ta, ma
2990 ; RV32-NEXT: vsub.vx v24, v16, a2
2991 ; RV32-NEXT: vnot.v v16, v16
2992 ; RV32-NEXT: vand.vv v16, v16, v24
2993 ; RV32-NEXT: vsrl.vi v24, v16, 1
2994 ; RV32-NEXT: addi a4, sp, 8
2995 ; RV32-NEXT: vsetvli a5, zero, e64, m8, ta, ma
2996 ; RV32-NEXT: vlse64.v v0, (a4), zero
2997 ; RV32-NEXT: vsetvli zero, a3, e64, m8, ta, ma
2998 ; RV32-NEXT: csrr a5, vlenb
2999 ; RV32-NEXT: li a6, 24
3000 ; RV32-NEXT: mul a5, a5, a6
3001 ; RV32-NEXT: add a5, sp, a5
3002 ; RV32-NEXT: addi a5, a5, 16
3003 ; RV32-NEXT: vs8r.v v0, (a5) # Unknown-size Folded Spill
3004 ; RV32-NEXT: vand.vv v24, v24, v0
3005 ; RV32-NEXT: vsub.vv v16, v16, v24
3006 ; RV32-NEXT: vsetvli a5, zero, e64, m8, ta, ma
3007 ; RV32-NEXT: vlse64.v v0, (a4), zero
3008 ; RV32-NEXT: vsetvli zero, a3, e64, m8, ta, ma
3009 ; RV32-NEXT: vand.vv v24, v16, v0
3010 ; RV32-NEXT: vsrl.vi v16, v16, 2
3011 ; RV32-NEXT: vand.vv v16, v16, v0
3012 ; RV32-NEXT: vadd.vv v16, v24, v16
3013 ; RV32-NEXT: vsrl.vi v24, v16, 4
3014 ; RV32-NEXT: vadd.vv v16, v16, v24
3015 ; RV32-NEXT: vsetvli a5, zero, e64, m8, ta, ma
3016 ; RV32-NEXT: vlse64.v v24, (a4), zero
3017 ; RV32-NEXT: vsetvli zero, a3, e64, m8, ta, ma
3018 ; RV32-NEXT: csrr a5, vlenb
3019 ; RV32-NEXT: slli a5, a5, 4
3020 ; RV32-NEXT: add a5, sp, a5
3021 ; RV32-NEXT: addi a5, a5, 16
3022 ; RV32-NEXT: vs8r.v v24, (a5) # Unknown-size Folded Spill
3023 ; RV32-NEXT: vand.vv v24, v16, v24
3024 ; RV32-NEXT: vsetvli a5, zero, e64, m8, ta, ma
3025 ; RV32-NEXT: vlse64.v v16, (a4), zero
3026 ; RV32-NEXT: vsetvli zero, a3, e64, m8, ta, ma
3027 ; RV32-NEXT: csrr a3, vlenb
3028 ; RV32-NEXT: slli a3, a3, 3
3029 ; RV32-NEXT: add a3, sp, a3
3030 ; RV32-NEXT: addi a3, a3, 16
3031 ; RV32-NEXT: vs8r.v v16, (a3) # Unknown-size Folded Spill
3032 ; RV32-NEXT: vmul.vv v24, v24, v16
3033 ; RV32-NEXT: li a3, 56
3034 ; RV32-NEXT: vsrl.vx v16, v24, a3
3035 ; RV32-NEXT: addi a4, sp, 16
3036 ; RV32-NEXT: vs8r.v v16, (a4) # Unknown-size Folded Spill
3037 ; RV32-NEXT: bltu a0, a1, .LBB47_2
3038 ; RV32-NEXT: # %bb.1:
3039 ; RV32-NEXT: mv a0, a1
3040 ; RV32-NEXT: .LBB47_2:
3041 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
3042 ; RV32-NEXT: vsub.vx v24, v8, a2
3043 ; RV32-NEXT: vnot.v v8, v8
3044 ; RV32-NEXT: vand.vv v8, v8, v24
3045 ; RV32-NEXT: vsrl.vi v24, v8, 1
3046 ; RV32-NEXT: csrr a0, vlenb
3047 ; RV32-NEXT: li a1, 24
3048 ; RV32-NEXT: mul a0, a0, a1
3049 ; RV32-NEXT: add a0, sp, a0
3050 ; RV32-NEXT: addi a0, a0, 16
3051 ; RV32-NEXT: vl8r.v v16, (a0) # Unknown-size Folded Reload
3052 ; RV32-NEXT: vand.vv v24, v24, v16
3053 ; RV32-NEXT: vsub.vv v8, v8, v24
3054 ; RV32-NEXT: vand.vv v24, v8, v0
3055 ; RV32-NEXT: vsrl.vi v8, v8, 2
3056 ; RV32-NEXT: vand.vv v8, v8, v0
3057 ; RV32-NEXT: vadd.vv v8, v24, v8
3058 ; RV32-NEXT: vsrl.vi v24, v8, 4
3059 ; RV32-NEXT: vadd.vv v8, v8, v24
3060 ; RV32-NEXT: csrr a0, vlenb
3061 ; RV32-NEXT: slli a0, a0, 4
3062 ; RV32-NEXT: add a0, sp, a0
3063 ; RV32-NEXT: addi a0, a0, 16
3064 ; RV32-NEXT: vl8r.v v16, (a0) # Unknown-size Folded Reload
3065 ; RV32-NEXT: vand.vv v8, v8, v16
3066 ; RV32-NEXT: csrr a0, vlenb
3067 ; RV32-NEXT: slli a0, a0, 3
3068 ; RV32-NEXT: add a0, sp, a0
3069 ; RV32-NEXT: addi a0, a0, 16
3070 ; RV32-NEXT: vl8r.v v16, (a0) # Unknown-size Folded Reload
3071 ; RV32-NEXT: vmul.vv v8, v8, v16
3072 ; RV32-NEXT: vsrl.vx v8, v8, a3
3073 ; RV32-NEXT: addi a0, sp, 16
3074 ; RV32-NEXT: vl8r.v v16, (a0) # Unknown-size Folded Reload
3075 ; RV32-NEXT: csrr a0, vlenb
3076 ; RV32-NEXT: slli a0, a0, 5
3077 ; RV32-NEXT: add sp, sp, a0
3078 ; RV32-NEXT: addi sp, sp, 16
3081 ; RV64-LABEL: vp_cttz_nxv16i64_unmasked:
3083 ; RV64-NEXT: csrr a1, vlenb
3084 ; RV64-NEXT: sub a2, a0, a1
3085 ; RV64-NEXT: sltu a3, a0, a2
3086 ; RV64-NEXT: addi a3, a3, -1
3087 ; RV64-NEXT: and a3, a3, a2
3088 ; RV64-NEXT: li a2, 1
3089 ; RV64-NEXT: vsetvli zero, a3, e64, m8, ta, ma
3090 ; RV64-NEXT: vsub.vx v24, v16, a2
3091 ; RV64-NEXT: vnot.v v16, v16
3092 ; RV64-NEXT: vand.vv v16, v16, v24
3093 ; RV64-NEXT: lui a3, %hi(.LCPI47_0)
3094 ; RV64-NEXT: ld a3, %lo(.LCPI47_0)(a3)
3095 ; RV64-NEXT: lui a4, %hi(.LCPI47_1)
3096 ; RV64-NEXT: ld a4, %lo(.LCPI47_1)(a4)
3097 ; RV64-NEXT: vsrl.vi v24, v16, 1
3098 ; RV64-NEXT: vand.vx v24, v24, a3
3099 ; RV64-NEXT: vsub.vv v16, v16, v24
3100 ; RV64-NEXT: vand.vx v24, v16, a4
3101 ; RV64-NEXT: vsrl.vi v16, v16, 2
3102 ; RV64-NEXT: vand.vx v16, v16, a4
3103 ; RV64-NEXT: vadd.vv v16, v24, v16
3104 ; RV64-NEXT: lui a5, %hi(.LCPI47_2)
3105 ; RV64-NEXT: ld a5, %lo(.LCPI47_2)(a5)
3106 ; RV64-NEXT: lui a6, %hi(.LCPI47_3)
3107 ; RV64-NEXT: ld a6, %lo(.LCPI47_3)(a6)
3108 ; RV64-NEXT: vsrl.vi v24, v16, 4
3109 ; RV64-NEXT: vadd.vv v16, v16, v24
3110 ; RV64-NEXT: vand.vx v16, v16, a5
3111 ; RV64-NEXT: vmul.vx v16, v16, a6
3112 ; RV64-NEXT: li a7, 56
3113 ; RV64-NEXT: vsrl.vx v16, v16, a7
3114 ; RV64-NEXT: bltu a0, a1, .LBB47_2
3115 ; RV64-NEXT: # %bb.1:
3116 ; RV64-NEXT: mv a0, a1
3117 ; RV64-NEXT: .LBB47_2:
3118 ; RV64-NEXT: vsetvli zero, a0, e64, m8, ta, ma
3119 ; RV64-NEXT: vsub.vx v24, v8, a2
3120 ; RV64-NEXT: vnot.v v8, v8
3121 ; RV64-NEXT: vand.vv v8, v8, v24
3122 ; RV64-NEXT: vsrl.vi v24, v8, 1
3123 ; RV64-NEXT: vand.vx v24, v24, a3
3124 ; RV64-NEXT: vsub.vv v8, v8, v24
3125 ; RV64-NEXT: vand.vx v24, v8, a4
3126 ; RV64-NEXT: vsrl.vi v8, v8, 2
3127 ; RV64-NEXT: vand.vx v8, v8, a4
3128 ; RV64-NEXT: vadd.vv v8, v24, v8
3129 ; RV64-NEXT: vsrl.vi v24, v8, 4
3130 ; RV64-NEXT: vadd.vv v8, v8, v24
3131 ; RV64-NEXT: vand.vx v8, v8, a5
3132 ; RV64-NEXT: vmul.vx v8, v8, a6
3133 ; RV64-NEXT: vsrl.vx v8, v8, a7
3135 %head = insertelement <vscale x 16 x i1> poison, i1 true, i32 0
3136 %m = shufflevector <vscale x 16 x i1> %head, <vscale x 16 x i1> poison, <vscale x 16 x i32> zeroinitializer
3137 %v = call <vscale x 16 x i64> @llvm.vp.cttz.nxv16i64(<vscale x 16 x i64> %va, i1 false, <vscale x 16 x i1> %m, i32 %evl)
3138 ret <vscale x 16 x i64> %v
3141 define <vscale x 1 x i8> @vp_cttz_zero_undef_nxv1i8(<vscale x 1 x i8> %va, <vscale x 1 x i1> %m, i32 zeroext %evl) {
3142 ; CHECK-LABEL: vp_cttz_zero_undef_nxv1i8:
3144 ; CHECK-NEXT: li a1, 1
3145 ; CHECK-NEXT: vsetvli zero, a0, e8, mf8, ta, ma
3146 ; CHECK-NEXT: vsub.vx v9, v8, a1, v0.t
3147 ; CHECK-NEXT: vnot.v v8, v8, v0.t
3148 ; CHECK-NEXT: vand.vv v8, v8, v9, v0.t
3149 ; CHECK-NEXT: vsrl.vi v9, v8, 1, v0.t
3150 ; CHECK-NEXT: li a0, 85
3151 ; CHECK-NEXT: vand.vx v9, v9, a0, v0.t
3152 ; CHECK-NEXT: vsub.vv v8, v8, v9, v0.t
3153 ; CHECK-NEXT: li a0, 51
3154 ; CHECK-NEXT: vand.vx v9, v8, a0, v0.t
3155 ; CHECK-NEXT: vsrl.vi v8, v8, 2, v0.t
3156 ; CHECK-NEXT: vand.vx v8, v8, a0, v0.t
3157 ; CHECK-NEXT: vadd.vv v8, v9, v8, v0.t
3158 ; CHECK-NEXT: vsrl.vi v9, v8, 4, v0.t
3159 ; CHECK-NEXT: vadd.vv v8, v8, v9, v0.t
3160 ; CHECK-NEXT: vand.vi v8, v8, 15, v0.t
3162 %v = call <vscale x 1 x i8> @llvm.vp.cttz.nxv1i8(<vscale x 1 x i8> %va, i1 true, <vscale x 1 x i1> %m, i32 %evl)
3163 ret <vscale x 1 x i8> %v
3166 define <vscale x 1 x i8> @vp_cttz_zero_undef_nxv1i8_unmasked(<vscale x 1 x i8> %va, i32 zeroext %evl) {
3167 ; CHECK-LABEL: vp_cttz_zero_undef_nxv1i8_unmasked:
3169 ; CHECK-NEXT: li a1, 1
3170 ; CHECK-NEXT: vsetvli zero, a0, e8, mf8, ta, ma
3171 ; CHECK-NEXT: vsub.vx v9, v8, a1
3172 ; CHECK-NEXT: vnot.v v8, v8
3173 ; CHECK-NEXT: vand.vv v8, v8, v9
3174 ; CHECK-NEXT: vsrl.vi v9, v8, 1
3175 ; CHECK-NEXT: li a0, 85
3176 ; CHECK-NEXT: vand.vx v9, v9, a0
3177 ; CHECK-NEXT: vsub.vv v8, v8, v9
3178 ; CHECK-NEXT: li a0, 51
3179 ; CHECK-NEXT: vand.vx v9, v8, a0
3180 ; CHECK-NEXT: vsrl.vi v8, v8, 2
3181 ; CHECK-NEXT: vand.vx v8, v8, a0
3182 ; CHECK-NEXT: vadd.vv v8, v9, v8
3183 ; CHECK-NEXT: vsrl.vi v9, v8, 4
3184 ; CHECK-NEXT: vadd.vv v8, v8, v9
3185 ; CHECK-NEXT: vand.vi v8, v8, 15
3187 %head = insertelement <vscale x 1 x i1> poison, i1 true, i32 0
3188 %m = shufflevector <vscale x 1 x i1> %head, <vscale x 1 x i1> poison, <vscale x 1 x i32> zeroinitializer
3189 %v = call <vscale x 1 x i8> @llvm.vp.cttz.nxv1i8(<vscale x 1 x i8> %va, i1 true, <vscale x 1 x i1> %m, i32 %evl)
3190 ret <vscale x 1 x i8> %v
3194 define <vscale x 2 x i8> @vp_cttz_zero_undef_nxv2i8(<vscale x 2 x i8> %va, <vscale x 2 x i1> %m, i32 zeroext %evl) {
3195 ; CHECK-LABEL: vp_cttz_zero_undef_nxv2i8:
3197 ; CHECK-NEXT: li a1, 1
3198 ; CHECK-NEXT: vsetvli zero, a0, e8, mf4, ta, ma
3199 ; CHECK-NEXT: vsub.vx v9, v8, a1, v0.t
3200 ; CHECK-NEXT: vnot.v v8, v8, v0.t
3201 ; CHECK-NEXT: vand.vv v8, v8, v9, v0.t
3202 ; CHECK-NEXT: vsrl.vi v9, v8, 1, v0.t
3203 ; CHECK-NEXT: li a0, 85
3204 ; CHECK-NEXT: vand.vx v9, v9, a0, v0.t
3205 ; CHECK-NEXT: vsub.vv v8, v8, v9, v0.t
3206 ; CHECK-NEXT: li a0, 51
3207 ; CHECK-NEXT: vand.vx v9, v8, a0, v0.t
3208 ; CHECK-NEXT: vsrl.vi v8, v8, 2, v0.t
3209 ; CHECK-NEXT: vand.vx v8, v8, a0, v0.t
3210 ; CHECK-NEXT: vadd.vv v8, v9, v8, v0.t
3211 ; CHECK-NEXT: vsrl.vi v9, v8, 4, v0.t
3212 ; CHECK-NEXT: vadd.vv v8, v8, v9, v0.t
3213 ; CHECK-NEXT: vand.vi v8, v8, 15, v0.t
3215 %v = call <vscale x 2 x i8> @llvm.vp.cttz.nxv2i8(<vscale x 2 x i8> %va, i1 true, <vscale x 2 x i1> %m, i32 %evl)
3216 ret <vscale x 2 x i8> %v
3219 define <vscale x 2 x i8> @vp_cttz_zero_undef_nxv2i8_unmasked(<vscale x 2 x i8> %va, i32 zeroext %evl) {
3220 ; CHECK-LABEL: vp_cttz_zero_undef_nxv2i8_unmasked:
3222 ; CHECK-NEXT: li a1, 1
3223 ; CHECK-NEXT: vsetvli zero, a0, e8, mf4, ta, ma
3224 ; CHECK-NEXT: vsub.vx v9, v8, a1
3225 ; CHECK-NEXT: vnot.v v8, v8
3226 ; CHECK-NEXT: vand.vv v8, v8, v9
3227 ; CHECK-NEXT: vsrl.vi v9, v8, 1
3228 ; CHECK-NEXT: li a0, 85
3229 ; CHECK-NEXT: vand.vx v9, v9, a0
3230 ; CHECK-NEXT: vsub.vv v8, v8, v9
3231 ; CHECK-NEXT: li a0, 51
3232 ; CHECK-NEXT: vand.vx v9, v8, a0
3233 ; CHECK-NEXT: vsrl.vi v8, v8, 2
3234 ; CHECK-NEXT: vand.vx v8, v8, a0
3235 ; CHECK-NEXT: vadd.vv v8, v9, v8
3236 ; CHECK-NEXT: vsrl.vi v9, v8, 4
3237 ; CHECK-NEXT: vadd.vv v8, v8, v9
3238 ; CHECK-NEXT: vand.vi v8, v8, 15
3240 %head = insertelement <vscale x 2 x i1> poison, i1 true, i32 0
3241 %m = shufflevector <vscale x 2 x i1> %head, <vscale x 2 x i1> poison, <vscale x 2 x i32> zeroinitializer
3242 %v = call <vscale x 2 x i8> @llvm.vp.cttz.nxv2i8(<vscale x 2 x i8> %va, i1 true, <vscale x 2 x i1> %m, i32 %evl)
3243 ret <vscale x 2 x i8> %v
3247 define <vscale x 4 x i8> @vp_cttz_zero_undef_nxv4i8(<vscale x 4 x i8> %va, <vscale x 4 x i1> %m, i32 zeroext %evl) {
3248 ; CHECK-LABEL: vp_cttz_zero_undef_nxv4i8:
3250 ; CHECK-NEXT: li a1, 1
3251 ; CHECK-NEXT: vsetvli zero, a0, e8, mf2, ta, ma
3252 ; CHECK-NEXT: vsub.vx v9, v8, a1, v0.t
3253 ; CHECK-NEXT: vnot.v v8, v8, v0.t
3254 ; CHECK-NEXT: vand.vv v8, v8, v9, v0.t
3255 ; CHECK-NEXT: vsrl.vi v9, v8, 1, v0.t
3256 ; CHECK-NEXT: li a0, 85
3257 ; CHECK-NEXT: vand.vx v9, v9, a0, v0.t
3258 ; CHECK-NEXT: vsub.vv v8, v8, v9, v0.t
3259 ; CHECK-NEXT: li a0, 51
3260 ; CHECK-NEXT: vand.vx v9, v8, a0, v0.t
3261 ; CHECK-NEXT: vsrl.vi v8, v8, 2, v0.t
3262 ; CHECK-NEXT: vand.vx v8, v8, a0, v0.t
3263 ; CHECK-NEXT: vadd.vv v8, v9, v8, v0.t
3264 ; CHECK-NEXT: vsrl.vi v9, v8, 4, v0.t
3265 ; CHECK-NEXT: vadd.vv v8, v8, v9, v0.t
3266 ; CHECK-NEXT: vand.vi v8, v8, 15, v0.t
3268 %v = call <vscale x 4 x i8> @llvm.vp.cttz.nxv4i8(<vscale x 4 x i8> %va, i1 true, <vscale x 4 x i1> %m, i32 %evl)
3269 ret <vscale x 4 x i8> %v
3272 define <vscale x 4 x i8> @vp_cttz_zero_undef_nxv4i8_unmasked(<vscale x 4 x i8> %va, i32 zeroext %evl) {
3273 ; CHECK-LABEL: vp_cttz_zero_undef_nxv4i8_unmasked:
3275 ; CHECK-NEXT: li a1, 1
3276 ; CHECK-NEXT: vsetvli zero, a0, e8, mf2, ta, ma
3277 ; CHECK-NEXT: vsub.vx v9, v8, a1
3278 ; CHECK-NEXT: vnot.v v8, v8
3279 ; CHECK-NEXT: vand.vv v8, v8, v9
3280 ; CHECK-NEXT: vsrl.vi v9, v8, 1
3281 ; CHECK-NEXT: li a0, 85
3282 ; CHECK-NEXT: vand.vx v9, v9, a0
3283 ; CHECK-NEXT: vsub.vv v8, v8, v9
3284 ; CHECK-NEXT: li a0, 51
3285 ; CHECK-NEXT: vand.vx v9, v8, a0
3286 ; CHECK-NEXT: vsrl.vi v8, v8, 2
3287 ; CHECK-NEXT: vand.vx v8, v8, a0
3288 ; CHECK-NEXT: vadd.vv v8, v9, v8
3289 ; CHECK-NEXT: vsrl.vi v9, v8, 4
3290 ; CHECK-NEXT: vadd.vv v8, v8, v9
3291 ; CHECK-NEXT: vand.vi v8, v8, 15
3293 %head = insertelement <vscale x 4 x i1> poison, i1 true, i32 0
3294 %m = shufflevector <vscale x 4 x i1> %head, <vscale x 4 x i1> poison, <vscale x 4 x i32> zeroinitializer
3295 %v = call <vscale x 4 x i8> @llvm.vp.cttz.nxv4i8(<vscale x 4 x i8> %va, i1 true, <vscale x 4 x i1> %m, i32 %evl)
3296 ret <vscale x 4 x i8> %v
3300 define <vscale x 8 x i8> @vp_cttz_zero_undef_nxv8i8(<vscale x 8 x i8> %va, <vscale x 8 x i1> %m, i32 zeroext %evl) {
3301 ; CHECK-LABEL: vp_cttz_zero_undef_nxv8i8:
3303 ; CHECK-NEXT: li a1, 1
3304 ; CHECK-NEXT: vsetvli zero, a0, e8, m1, ta, ma
3305 ; CHECK-NEXT: vsub.vx v9, v8, a1, v0.t
3306 ; CHECK-NEXT: vnot.v v8, v8, v0.t
3307 ; CHECK-NEXT: vand.vv v8, v8, v9, v0.t
3308 ; CHECK-NEXT: vsrl.vi v9, v8, 1, v0.t
3309 ; CHECK-NEXT: li a0, 85
3310 ; CHECK-NEXT: vand.vx v9, v9, a0, v0.t
3311 ; CHECK-NEXT: vsub.vv v8, v8, v9, v0.t
3312 ; CHECK-NEXT: li a0, 51
3313 ; CHECK-NEXT: vand.vx v9, v8, a0, v0.t
3314 ; CHECK-NEXT: vsrl.vi v8, v8, 2, v0.t
3315 ; CHECK-NEXT: vand.vx v8, v8, a0, v0.t
3316 ; CHECK-NEXT: vadd.vv v8, v9, v8, v0.t
3317 ; CHECK-NEXT: vsrl.vi v9, v8, 4, v0.t
3318 ; CHECK-NEXT: vadd.vv v8, v8, v9, v0.t
3319 ; CHECK-NEXT: vand.vi v8, v8, 15, v0.t
3321 %v = call <vscale x 8 x i8> @llvm.vp.cttz.nxv8i8(<vscale x 8 x i8> %va, i1 true, <vscale x 8 x i1> %m, i32 %evl)
3322 ret <vscale x 8 x i8> %v
3325 define <vscale x 8 x i8> @vp_cttz_zero_undef_nxv8i8_unmasked(<vscale x 8 x i8> %va, i32 zeroext %evl) {
3326 ; CHECK-LABEL: vp_cttz_zero_undef_nxv8i8_unmasked:
3328 ; CHECK-NEXT: li a1, 1
3329 ; CHECK-NEXT: vsetvli zero, a0, e8, m1, ta, ma
3330 ; CHECK-NEXT: vsub.vx v9, v8, a1
3331 ; CHECK-NEXT: vnot.v v8, v8
3332 ; CHECK-NEXT: vand.vv v8, v8, v9
3333 ; CHECK-NEXT: vsrl.vi v9, v8, 1
3334 ; CHECK-NEXT: li a0, 85
3335 ; CHECK-NEXT: vand.vx v9, v9, a0
3336 ; CHECK-NEXT: vsub.vv v8, v8, v9
3337 ; CHECK-NEXT: li a0, 51
3338 ; CHECK-NEXT: vand.vx v9, v8, a0
3339 ; CHECK-NEXT: vsrl.vi v8, v8, 2
3340 ; CHECK-NEXT: vand.vx v8, v8, a0
3341 ; CHECK-NEXT: vadd.vv v8, v9, v8
3342 ; CHECK-NEXT: vsrl.vi v9, v8, 4
3343 ; CHECK-NEXT: vadd.vv v8, v8, v9
3344 ; CHECK-NEXT: vand.vi v8, v8, 15
3346 %head = insertelement <vscale x 8 x i1> poison, i1 true, i32 0
3347 %m = shufflevector <vscale x 8 x i1> %head, <vscale x 8 x i1> poison, <vscale x 8 x i32> zeroinitializer
3348 %v = call <vscale x 8 x i8> @llvm.vp.cttz.nxv8i8(<vscale x 8 x i8> %va, i1 true, <vscale x 8 x i1> %m, i32 %evl)
3349 ret <vscale x 8 x i8> %v
3353 define <vscale x 16 x i8> @vp_cttz_zero_undef_nxv16i8(<vscale x 16 x i8> %va, <vscale x 16 x i1> %m, i32 zeroext %evl) {
3354 ; CHECK-LABEL: vp_cttz_zero_undef_nxv16i8:
3356 ; CHECK-NEXT: li a1, 1
3357 ; CHECK-NEXT: vsetvli zero, a0, e8, m2, ta, ma
3358 ; CHECK-NEXT: vsub.vx v10, v8, a1, v0.t
3359 ; CHECK-NEXT: vnot.v v8, v8, v0.t
3360 ; CHECK-NEXT: vand.vv v8, v8, v10, v0.t
3361 ; CHECK-NEXT: vsrl.vi v10, v8, 1, v0.t
3362 ; CHECK-NEXT: li a0, 85
3363 ; CHECK-NEXT: vand.vx v10, v10, a0, v0.t
3364 ; CHECK-NEXT: vsub.vv v8, v8, v10, v0.t
3365 ; CHECK-NEXT: li a0, 51
3366 ; CHECK-NEXT: vand.vx v10, v8, a0, v0.t
3367 ; CHECK-NEXT: vsrl.vi v8, v8, 2, v0.t
3368 ; CHECK-NEXT: vand.vx v8, v8, a0, v0.t
3369 ; CHECK-NEXT: vadd.vv v8, v10, v8, v0.t
3370 ; CHECK-NEXT: vsrl.vi v10, v8, 4, v0.t
3371 ; CHECK-NEXT: vadd.vv v8, v8, v10, v0.t
3372 ; CHECK-NEXT: vand.vi v8, v8, 15, v0.t
3374 %v = call <vscale x 16 x i8> @llvm.vp.cttz.nxv16i8(<vscale x 16 x i8> %va, i1 true, <vscale x 16 x i1> %m, i32 %evl)
3375 ret <vscale x 16 x i8> %v
3378 define <vscale x 16 x i8> @vp_cttz_zero_undef_nxv16i8_unmasked(<vscale x 16 x i8> %va, i32 zeroext %evl) {
3379 ; CHECK-LABEL: vp_cttz_zero_undef_nxv16i8_unmasked:
3381 ; CHECK-NEXT: li a1, 1
3382 ; CHECK-NEXT: vsetvli zero, a0, e8, m2, ta, ma
3383 ; CHECK-NEXT: vsub.vx v10, v8, a1
3384 ; CHECK-NEXT: vnot.v v8, v8
3385 ; CHECK-NEXT: vand.vv v8, v8, v10
3386 ; CHECK-NEXT: vsrl.vi v10, v8, 1
3387 ; CHECK-NEXT: li a0, 85
3388 ; CHECK-NEXT: vand.vx v10, v10, a0
3389 ; CHECK-NEXT: vsub.vv v8, v8, v10
3390 ; CHECK-NEXT: li a0, 51
3391 ; CHECK-NEXT: vand.vx v10, v8, a0
3392 ; CHECK-NEXT: vsrl.vi v8, v8, 2
3393 ; CHECK-NEXT: vand.vx v8, v8, a0
3394 ; CHECK-NEXT: vadd.vv v8, v10, v8
3395 ; CHECK-NEXT: vsrl.vi v10, v8, 4
3396 ; CHECK-NEXT: vadd.vv v8, v8, v10
3397 ; CHECK-NEXT: vand.vi v8, v8, 15
3399 %head = insertelement <vscale x 16 x i1> poison, i1 true, i32 0
3400 %m = shufflevector <vscale x 16 x i1> %head, <vscale x 16 x i1> poison, <vscale x 16 x i32> zeroinitializer
3401 %v = call <vscale x 16 x i8> @llvm.vp.cttz.nxv16i8(<vscale x 16 x i8> %va, i1 true, <vscale x 16 x i1> %m, i32 %evl)
3402 ret <vscale x 16 x i8> %v
3406 define <vscale x 32 x i8> @vp_cttz_zero_undef_nxv32i8(<vscale x 32 x i8> %va, <vscale x 32 x i1> %m, i32 zeroext %evl) {
3407 ; CHECK-LABEL: vp_cttz_zero_undef_nxv32i8:
3409 ; CHECK-NEXT: li a1, 1
3410 ; CHECK-NEXT: vsetvli zero, a0, e8, m4, ta, ma
3411 ; CHECK-NEXT: vsub.vx v12, v8, a1, v0.t
3412 ; CHECK-NEXT: vnot.v v8, v8, v0.t
3413 ; CHECK-NEXT: vand.vv v8, v8, v12, v0.t
3414 ; CHECK-NEXT: vsrl.vi v12, v8, 1, v0.t
3415 ; CHECK-NEXT: li a0, 85
3416 ; CHECK-NEXT: vand.vx v12, v12, a0, v0.t
3417 ; CHECK-NEXT: vsub.vv v8, v8, v12, v0.t
3418 ; CHECK-NEXT: li a0, 51
3419 ; CHECK-NEXT: vand.vx v12, v8, a0, v0.t
3420 ; CHECK-NEXT: vsrl.vi v8, v8, 2, v0.t
3421 ; CHECK-NEXT: vand.vx v8, v8, a0, v0.t
3422 ; CHECK-NEXT: vadd.vv v8, v12, v8, v0.t
3423 ; CHECK-NEXT: vsrl.vi v12, v8, 4, v0.t
3424 ; CHECK-NEXT: vadd.vv v8, v8, v12, v0.t
3425 ; CHECK-NEXT: vand.vi v8, v8, 15, v0.t
3427 %v = call <vscale x 32 x i8> @llvm.vp.cttz.nxv32i8(<vscale x 32 x i8> %va, i1 true, <vscale x 32 x i1> %m, i32 %evl)
3428 ret <vscale x 32 x i8> %v
3431 define <vscale x 32 x i8> @vp_cttz_zero_undef_nxv32i8_unmasked(<vscale x 32 x i8> %va, i32 zeroext %evl) {
3432 ; CHECK-LABEL: vp_cttz_zero_undef_nxv32i8_unmasked:
3434 ; CHECK-NEXT: li a1, 1
3435 ; CHECK-NEXT: vsetvli zero, a0, e8, m4, ta, ma
3436 ; CHECK-NEXT: vsub.vx v12, v8, a1
3437 ; CHECK-NEXT: vnot.v v8, v8
3438 ; CHECK-NEXT: vand.vv v8, v8, v12
3439 ; CHECK-NEXT: vsrl.vi v12, v8, 1
3440 ; CHECK-NEXT: li a0, 85
3441 ; CHECK-NEXT: vand.vx v12, v12, a0
3442 ; CHECK-NEXT: vsub.vv v8, v8, v12
3443 ; CHECK-NEXT: li a0, 51
3444 ; CHECK-NEXT: vand.vx v12, v8, a0
3445 ; CHECK-NEXT: vsrl.vi v8, v8, 2
3446 ; CHECK-NEXT: vand.vx v8, v8, a0
3447 ; CHECK-NEXT: vadd.vv v8, v12, v8
3448 ; CHECK-NEXT: vsrl.vi v12, v8, 4
3449 ; CHECK-NEXT: vadd.vv v8, v8, v12
3450 ; CHECK-NEXT: vand.vi v8, v8, 15
3452 %head = insertelement <vscale x 32 x i1> poison, i1 true, i32 0
3453 %m = shufflevector <vscale x 32 x i1> %head, <vscale x 32 x i1> poison, <vscale x 32 x i32> zeroinitializer
3454 %v = call <vscale x 32 x i8> @llvm.vp.cttz.nxv32i8(<vscale x 32 x i8> %va, i1 true, <vscale x 32 x i1> %m, i32 %evl)
3455 ret <vscale x 32 x i8> %v
3459 define <vscale x 64 x i8> @vp_cttz_zero_undef_nxv64i8(<vscale x 64 x i8> %va, <vscale x 64 x i1> %m, i32 zeroext %evl) {
3460 ; CHECK-LABEL: vp_cttz_zero_undef_nxv64i8:
3462 ; CHECK-NEXT: li a1, 1
3463 ; CHECK-NEXT: vsetvli zero, a0, e8, m8, ta, ma
3464 ; CHECK-NEXT: vsub.vx v16, v8, a1, v0.t
3465 ; CHECK-NEXT: vnot.v v8, v8, v0.t
3466 ; CHECK-NEXT: vand.vv v8, v8, v16, v0.t
3467 ; CHECK-NEXT: vsrl.vi v16, v8, 1, v0.t
3468 ; CHECK-NEXT: li a0, 85
3469 ; CHECK-NEXT: vand.vx v16, v16, a0, v0.t
3470 ; CHECK-NEXT: vsub.vv v8, v8, v16, v0.t
3471 ; CHECK-NEXT: li a0, 51
3472 ; CHECK-NEXT: vand.vx v16, v8, a0, v0.t
3473 ; CHECK-NEXT: vsrl.vi v8, v8, 2, v0.t
3474 ; CHECK-NEXT: vand.vx v8, v8, a0, v0.t
3475 ; CHECK-NEXT: vadd.vv v8, v16, v8, v0.t
3476 ; CHECK-NEXT: vsrl.vi v16, v8, 4, v0.t
3477 ; CHECK-NEXT: vadd.vv v8, v8, v16, v0.t
3478 ; CHECK-NEXT: vand.vi v8, v8, 15, v0.t
3480 %v = call <vscale x 64 x i8> @llvm.vp.cttz.nxv64i8(<vscale x 64 x i8> %va, i1 true, <vscale x 64 x i1> %m, i32 %evl)
3481 ret <vscale x 64 x i8> %v
3484 define <vscale x 64 x i8> @vp_cttz_zero_undef_nxv64i8_unmasked(<vscale x 64 x i8> %va, i32 zeroext %evl) {
3485 ; CHECK-LABEL: vp_cttz_zero_undef_nxv64i8_unmasked:
3487 ; CHECK-NEXT: li a1, 1
3488 ; CHECK-NEXT: vsetvli zero, a0, e8, m8, ta, ma
3489 ; CHECK-NEXT: vsub.vx v16, v8, a1
3490 ; CHECK-NEXT: vnot.v v8, v8
3491 ; CHECK-NEXT: vand.vv v8, v8, v16
3492 ; CHECK-NEXT: vsrl.vi v16, v8, 1
3493 ; CHECK-NEXT: li a0, 85
3494 ; CHECK-NEXT: vand.vx v16, v16, a0
3495 ; CHECK-NEXT: vsub.vv v8, v8, v16
3496 ; CHECK-NEXT: li a0, 51
3497 ; CHECK-NEXT: vand.vx v16, v8, a0
3498 ; CHECK-NEXT: vsrl.vi v8, v8, 2
3499 ; CHECK-NEXT: vand.vx v8, v8, a0
3500 ; CHECK-NEXT: vadd.vv v8, v16, v8
3501 ; CHECK-NEXT: vsrl.vi v16, v8, 4
3502 ; CHECK-NEXT: vadd.vv v8, v8, v16
3503 ; CHECK-NEXT: vand.vi v8, v8, 15
3505 %head = insertelement <vscale x 64 x i1> poison, i1 true, i32 0
3506 %m = shufflevector <vscale x 64 x i1> %head, <vscale x 64 x i1> poison, <vscale x 64 x i32> zeroinitializer
3507 %v = call <vscale x 64 x i8> @llvm.vp.cttz.nxv64i8(<vscale x 64 x i8> %va, i1 true, <vscale x 64 x i1> %m, i32 %evl)
3508 ret <vscale x 64 x i8> %v
3512 define <vscale x 1 x i16> @vp_cttz_zero_undef_nxv1i16(<vscale x 1 x i16> %va, <vscale x 1 x i1> %m, i32 zeroext %evl) {
3513 ; RV32-LABEL: vp_cttz_zero_undef_nxv1i16:
3515 ; RV32-NEXT: li a1, 1
3516 ; RV32-NEXT: vsetvli zero, a0, e16, mf4, ta, ma
3517 ; RV32-NEXT: vsub.vx v9, v8, a1, v0.t
3518 ; RV32-NEXT: vnot.v v8, v8, v0.t
3519 ; RV32-NEXT: vand.vv v8, v8, v9, v0.t
3520 ; RV32-NEXT: vsrl.vi v9, v8, 1, v0.t
3521 ; RV32-NEXT: lui a0, 5
3522 ; RV32-NEXT: addi a0, a0, 1365
3523 ; RV32-NEXT: vand.vx v9, v9, a0, v0.t
3524 ; RV32-NEXT: vsub.vv v8, v8, v9, v0.t
3525 ; RV32-NEXT: lui a0, 3
3526 ; RV32-NEXT: addi a0, a0, 819
3527 ; RV32-NEXT: vand.vx v9, v8, a0, v0.t
3528 ; RV32-NEXT: vsrl.vi v8, v8, 2, v0.t
3529 ; RV32-NEXT: vand.vx v8, v8, a0, v0.t
3530 ; RV32-NEXT: vadd.vv v8, v9, v8, v0.t
3531 ; RV32-NEXT: vsrl.vi v9, v8, 4, v0.t
3532 ; RV32-NEXT: vadd.vv v8, v8, v9, v0.t
3533 ; RV32-NEXT: lui a0, 1
3534 ; RV32-NEXT: addi a0, a0, -241
3535 ; RV32-NEXT: vand.vx v8, v8, a0, v0.t
3536 ; RV32-NEXT: li a0, 257
3537 ; RV32-NEXT: vmul.vx v8, v8, a0, v0.t
3538 ; RV32-NEXT: vsrl.vi v8, v8, 8, v0.t
3541 ; RV64-LABEL: vp_cttz_zero_undef_nxv1i16:
3543 ; RV64-NEXT: li a1, 1
3544 ; RV64-NEXT: vsetvli zero, a0, e16, mf4, ta, ma
3545 ; RV64-NEXT: vsub.vx v9, v8, a1, v0.t
3546 ; RV64-NEXT: vnot.v v8, v8, v0.t
3547 ; RV64-NEXT: vand.vv v8, v8, v9, v0.t
3548 ; RV64-NEXT: vsrl.vi v9, v8, 1, v0.t
3549 ; RV64-NEXT: lui a0, 5
3550 ; RV64-NEXT: addiw a0, a0, 1365
3551 ; RV64-NEXT: vand.vx v9, v9, a0, v0.t
3552 ; RV64-NEXT: vsub.vv v8, v8, v9, v0.t
3553 ; RV64-NEXT: lui a0, 3
3554 ; RV64-NEXT: addiw a0, a0, 819
3555 ; RV64-NEXT: vand.vx v9, v8, a0, v0.t
3556 ; RV64-NEXT: vsrl.vi v8, v8, 2, v0.t
3557 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
3558 ; RV64-NEXT: vadd.vv v8, v9, v8, v0.t
3559 ; RV64-NEXT: vsrl.vi v9, v8, 4, v0.t
3560 ; RV64-NEXT: vadd.vv v8, v8, v9, v0.t
3561 ; RV64-NEXT: lui a0, 1
3562 ; RV64-NEXT: addiw a0, a0, -241
3563 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
3564 ; RV64-NEXT: li a0, 257
3565 ; RV64-NEXT: vmul.vx v8, v8, a0, v0.t
3566 ; RV64-NEXT: vsrl.vi v8, v8, 8, v0.t
3568 %v = call <vscale x 1 x i16> @llvm.vp.cttz.nxv1i16(<vscale x 1 x i16> %va, i1 true, <vscale x 1 x i1> %m, i32 %evl)
3569 ret <vscale x 1 x i16> %v
3572 define <vscale x 1 x i16> @vp_cttz_zero_undef_nxv1i16_unmasked(<vscale x 1 x i16> %va, i32 zeroext %evl) {
3573 ; RV32-LABEL: vp_cttz_zero_undef_nxv1i16_unmasked:
3575 ; RV32-NEXT: li a1, 1
3576 ; RV32-NEXT: vsetvli zero, a0, e16, mf4, ta, ma
3577 ; RV32-NEXT: vsub.vx v9, v8, a1
3578 ; RV32-NEXT: vnot.v v8, v8
3579 ; RV32-NEXT: vand.vv v8, v8, v9
3580 ; RV32-NEXT: vsrl.vi v9, v8, 1
3581 ; RV32-NEXT: lui a0, 5
3582 ; RV32-NEXT: addi a0, a0, 1365
3583 ; RV32-NEXT: vand.vx v9, v9, a0
3584 ; RV32-NEXT: vsub.vv v8, v8, v9
3585 ; RV32-NEXT: lui a0, 3
3586 ; RV32-NEXT: addi a0, a0, 819
3587 ; RV32-NEXT: vand.vx v9, v8, a0
3588 ; RV32-NEXT: vsrl.vi v8, v8, 2
3589 ; RV32-NEXT: vand.vx v8, v8, a0
3590 ; RV32-NEXT: vadd.vv v8, v9, v8
3591 ; RV32-NEXT: vsrl.vi v9, v8, 4
3592 ; RV32-NEXT: vadd.vv v8, v8, v9
3593 ; RV32-NEXT: lui a0, 1
3594 ; RV32-NEXT: addi a0, a0, -241
3595 ; RV32-NEXT: vand.vx v8, v8, a0
3596 ; RV32-NEXT: li a0, 257
3597 ; RV32-NEXT: vmul.vx v8, v8, a0
3598 ; RV32-NEXT: vsrl.vi v8, v8, 8
3601 ; RV64-LABEL: vp_cttz_zero_undef_nxv1i16_unmasked:
3603 ; RV64-NEXT: li a1, 1
3604 ; RV64-NEXT: vsetvli zero, a0, e16, mf4, ta, ma
3605 ; RV64-NEXT: vsub.vx v9, v8, a1
3606 ; RV64-NEXT: vnot.v v8, v8
3607 ; RV64-NEXT: vand.vv v8, v8, v9
3608 ; RV64-NEXT: vsrl.vi v9, v8, 1
3609 ; RV64-NEXT: lui a0, 5
3610 ; RV64-NEXT: addiw a0, a0, 1365
3611 ; RV64-NEXT: vand.vx v9, v9, a0
3612 ; RV64-NEXT: vsub.vv v8, v8, v9
3613 ; RV64-NEXT: lui a0, 3
3614 ; RV64-NEXT: addiw a0, a0, 819
3615 ; RV64-NEXT: vand.vx v9, v8, a0
3616 ; RV64-NEXT: vsrl.vi v8, v8, 2
3617 ; RV64-NEXT: vand.vx v8, v8, a0
3618 ; RV64-NEXT: vadd.vv v8, v9, v8
3619 ; RV64-NEXT: vsrl.vi v9, v8, 4
3620 ; RV64-NEXT: vadd.vv v8, v8, v9
3621 ; RV64-NEXT: lui a0, 1
3622 ; RV64-NEXT: addiw a0, a0, -241
3623 ; RV64-NEXT: vand.vx v8, v8, a0
3624 ; RV64-NEXT: li a0, 257
3625 ; RV64-NEXT: vmul.vx v8, v8, a0
3626 ; RV64-NEXT: vsrl.vi v8, v8, 8
3628 %head = insertelement <vscale x 1 x i1> poison, i1 true, i32 0
3629 %m = shufflevector <vscale x 1 x i1> %head, <vscale x 1 x i1> poison, <vscale x 1 x i32> zeroinitializer
3630 %v = call <vscale x 1 x i16> @llvm.vp.cttz.nxv1i16(<vscale x 1 x i16> %va, i1 true, <vscale x 1 x i1> %m, i32 %evl)
3631 ret <vscale x 1 x i16> %v
3635 define <vscale x 2 x i16> @vp_cttz_zero_undef_nxv2i16(<vscale x 2 x i16> %va, <vscale x 2 x i1> %m, i32 zeroext %evl) {
3636 ; RV32-LABEL: vp_cttz_zero_undef_nxv2i16:
3638 ; RV32-NEXT: li a1, 1
3639 ; RV32-NEXT: vsetvli zero, a0, e16, mf2, ta, ma
3640 ; RV32-NEXT: vsub.vx v9, v8, a1, v0.t
3641 ; RV32-NEXT: vnot.v v8, v8, v0.t
3642 ; RV32-NEXT: vand.vv v8, v8, v9, v0.t
3643 ; RV32-NEXT: vsrl.vi v9, v8, 1, v0.t
3644 ; RV32-NEXT: lui a0, 5
3645 ; RV32-NEXT: addi a0, a0, 1365
3646 ; RV32-NEXT: vand.vx v9, v9, a0, v0.t
3647 ; RV32-NEXT: vsub.vv v8, v8, v9, v0.t
3648 ; RV32-NEXT: lui a0, 3
3649 ; RV32-NEXT: addi a0, a0, 819
3650 ; RV32-NEXT: vand.vx v9, v8, a0, v0.t
3651 ; RV32-NEXT: vsrl.vi v8, v8, 2, v0.t
3652 ; RV32-NEXT: vand.vx v8, v8, a0, v0.t
3653 ; RV32-NEXT: vadd.vv v8, v9, v8, v0.t
3654 ; RV32-NEXT: vsrl.vi v9, v8, 4, v0.t
3655 ; RV32-NEXT: vadd.vv v8, v8, v9, v0.t
3656 ; RV32-NEXT: lui a0, 1
3657 ; RV32-NEXT: addi a0, a0, -241
3658 ; RV32-NEXT: vand.vx v8, v8, a0, v0.t
3659 ; RV32-NEXT: li a0, 257
3660 ; RV32-NEXT: vmul.vx v8, v8, a0, v0.t
3661 ; RV32-NEXT: vsrl.vi v8, v8, 8, v0.t
3664 ; RV64-LABEL: vp_cttz_zero_undef_nxv2i16:
3666 ; RV64-NEXT: li a1, 1
3667 ; RV64-NEXT: vsetvli zero, a0, e16, mf2, ta, ma
3668 ; RV64-NEXT: vsub.vx v9, v8, a1, v0.t
3669 ; RV64-NEXT: vnot.v v8, v8, v0.t
3670 ; RV64-NEXT: vand.vv v8, v8, v9, v0.t
3671 ; RV64-NEXT: vsrl.vi v9, v8, 1, v0.t
3672 ; RV64-NEXT: lui a0, 5
3673 ; RV64-NEXT: addiw a0, a0, 1365
3674 ; RV64-NEXT: vand.vx v9, v9, a0, v0.t
3675 ; RV64-NEXT: vsub.vv v8, v8, v9, v0.t
3676 ; RV64-NEXT: lui a0, 3
3677 ; RV64-NEXT: addiw a0, a0, 819
3678 ; RV64-NEXT: vand.vx v9, v8, a0, v0.t
3679 ; RV64-NEXT: vsrl.vi v8, v8, 2, v0.t
3680 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
3681 ; RV64-NEXT: vadd.vv v8, v9, v8, v0.t
3682 ; RV64-NEXT: vsrl.vi v9, v8, 4, v0.t
3683 ; RV64-NEXT: vadd.vv v8, v8, v9, v0.t
3684 ; RV64-NEXT: lui a0, 1
3685 ; RV64-NEXT: addiw a0, a0, -241
3686 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
3687 ; RV64-NEXT: li a0, 257
3688 ; RV64-NEXT: vmul.vx v8, v8, a0, v0.t
3689 ; RV64-NEXT: vsrl.vi v8, v8, 8, v0.t
3691 %v = call <vscale x 2 x i16> @llvm.vp.cttz.nxv2i16(<vscale x 2 x i16> %va, i1 true, <vscale x 2 x i1> %m, i32 %evl)
3692 ret <vscale x 2 x i16> %v
3695 define <vscale x 2 x i16> @vp_cttz_zero_undef_nxv2i16_unmasked(<vscale x 2 x i16> %va, i32 zeroext %evl) {
3696 ; RV32-LABEL: vp_cttz_zero_undef_nxv2i16_unmasked:
3698 ; RV32-NEXT: li a1, 1
3699 ; RV32-NEXT: vsetvli zero, a0, e16, mf2, ta, ma
3700 ; RV32-NEXT: vsub.vx v9, v8, a1
3701 ; RV32-NEXT: vnot.v v8, v8
3702 ; RV32-NEXT: vand.vv v8, v8, v9
3703 ; RV32-NEXT: vsrl.vi v9, v8, 1
3704 ; RV32-NEXT: lui a0, 5
3705 ; RV32-NEXT: addi a0, a0, 1365
3706 ; RV32-NEXT: vand.vx v9, v9, a0
3707 ; RV32-NEXT: vsub.vv v8, v8, v9
3708 ; RV32-NEXT: lui a0, 3
3709 ; RV32-NEXT: addi a0, a0, 819
3710 ; RV32-NEXT: vand.vx v9, v8, a0
3711 ; RV32-NEXT: vsrl.vi v8, v8, 2
3712 ; RV32-NEXT: vand.vx v8, v8, a0
3713 ; RV32-NEXT: vadd.vv v8, v9, v8
3714 ; RV32-NEXT: vsrl.vi v9, v8, 4
3715 ; RV32-NEXT: vadd.vv v8, v8, v9
3716 ; RV32-NEXT: lui a0, 1
3717 ; RV32-NEXT: addi a0, a0, -241
3718 ; RV32-NEXT: vand.vx v8, v8, a0
3719 ; RV32-NEXT: li a0, 257
3720 ; RV32-NEXT: vmul.vx v8, v8, a0
3721 ; RV32-NEXT: vsrl.vi v8, v8, 8
3724 ; RV64-LABEL: vp_cttz_zero_undef_nxv2i16_unmasked:
3726 ; RV64-NEXT: li a1, 1
3727 ; RV64-NEXT: vsetvli zero, a0, e16, mf2, ta, ma
3728 ; RV64-NEXT: vsub.vx v9, v8, a1
3729 ; RV64-NEXT: vnot.v v8, v8
3730 ; RV64-NEXT: vand.vv v8, v8, v9
3731 ; RV64-NEXT: vsrl.vi v9, v8, 1
3732 ; RV64-NEXT: lui a0, 5
3733 ; RV64-NEXT: addiw a0, a0, 1365
3734 ; RV64-NEXT: vand.vx v9, v9, a0
3735 ; RV64-NEXT: vsub.vv v8, v8, v9
3736 ; RV64-NEXT: lui a0, 3
3737 ; RV64-NEXT: addiw a0, a0, 819
3738 ; RV64-NEXT: vand.vx v9, v8, a0
3739 ; RV64-NEXT: vsrl.vi v8, v8, 2
3740 ; RV64-NEXT: vand.vx v8, v8, a0
3741 ; RV64-NEXT: vadd.vv v8, v9, v8
3742 ; RV64-NEXT: vsrl.vi v9, v8, 4
3743 ; RV64-NEXT: vadd.vv v8, v8, v9
3744 ; RV64-NEXT: lui a0, 1
3745 ; RV64-NEXT: addiw a0, a0, -241
3746 ; RV64-NEXT: vand.vx v8, v8, a0
3747 ; RV64-NEXT: li a0, 257
3748 ; RV64-NEXT: vmul.vx v8, v8, a0
3749 ; RV64-NEXT: vsrl.vi v8, v8, 8
3751 %head = insertelement <vscale x 2 x i1> poison, i1 true, i32 0
3752 %m = shufflevector <vscale x 2 x i1> %head, <vscale x 2 x i1> poison, <vscale x 2 x i32> zeroinitializer
3753 %v = call <vscale x 2 x i16> @llvm.vp.cttz.nxv2i16(<vscale x 2 x i16> %va, i1 true, <vscale x 2 x i1> %m, i32 %evl)
3754 ret <vscale x 2 x i16> %v
3758 define <vscale x 4 x i16> @vp_cttz_zero_undef_nxv4i16(<vscale x 4 x i16> %va, <vscale x 4 x i1> %m, i32 zeroext %evl) {
3759 ; RV32-LABEL: vp_cttz_zero_undef_nxv4i16:
3761 ; RV32-NEXT: li a1, 1
3762 ; RV32-NEXT: vsetvli zero, a0, e16, m1, ta, ma
3763 ; RV32-NEXT: vsub.vx v9, v8, a1, v0.t
3764 ; RV32-NEXT: vnot.v v8, v8, v0.t
3765 ; RV32-NEXT: vand.vv v8, v8, v9, v0.t
3766 ; RV32-NEXT: vsrl.vi v9, v8, 1, v0.t
3767 ; RV32-NEXT: lui a0, 5
3768 ; RV32-NEXT: addi a0, a0, 1365
3769 ; RV32-NEXT: vand.vx v9, v9, a0, v0.t
3770 ; RV32-NEXT: vsub.vv v8, v8, v9, v0.t
3771 ; RV32-NEXT: lui a0, 3
3772 ; RV32-NEXT: addi a0, a0, 819
3773 ; RV32-NEXT: vand.vx v9, v8, a0, v0.t
3774 ; RV32-NEXT: vsrl.vi v8, v8, 2, v0.t
3775 ; RV32-NEXT: vand.vx v8, v8, a0, v0.t
3776 ; RV32-NEXT: vadd.vv v8, v9, v8, v0.t
3777 ; RV32-NEXT: vsrl.vi v9, v8, 4, v0.t
3778 ; RV32-NEXT: vadd.vv v8, v8, v9, v0.t
3779 ; RV32-NEXT: lui a0, 1
3780 ; RV32-NEXT: addi a0, a0, -241
3781 ; RV32-NEXT: vand.vx v8, v8, a0, v0.t
3782 ; RV32-NEXT: li a0, 257
3783 ; RV32-NEXT: vmul.vx v8, v8, a0, v0.t
3784 ; RV32-NEXT: vsrl.vi v8, v8, 8, v0.t
3787 ; RV64-LABEL: vp_cttz_zero_undef_nxv4i16:
3789 ; RV64-NEXT: li a1, 1
3790 ; RV64-NEXT: vsetvli zero, a0, e16, m1, ta, ma
3791 ; RV64-NEXT: vsub.vx v9, v8, a1, v0.t
3792 ; RV64-NEXT: vnot.v v8, v8, v0.t
3793 ; RV64-NEXT: vand.vv v8, v8, v9, v0.t
3794 ; RV64-NEXT: vsrl.vi v9, v8, 1, v0.t
3795 ; RV64-NEXT: lui a0, 5
3796 ; RV64-NEXT: addiw a0, a0, 1365
3797 ; RV64-NEXT: vand.vx v9, v9, a0, v0.t
3798 ; RV64-NEXT: vsub.vv v8, v8, v9, v0.t
3799 ; RV64-NEXT: lui a0, 3
3800 ; RV64-NEXT: addiw a0, a0, 819
3801 ; RV64-NEXT: vand.vx v9, v8, a0, v0.t
3802 ; RV64-NEXT: vsrl.vi v8, v8, 2, v0.t
3803 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
3804 ; RV64-NEXT: vadd.vv v8, v9, v8, v0.t
3805 ; RV64-NEXT: vsrl.vi v9, v8, 4, v0.t
3806 ; RV64-NEXT: vadd.vv v8, v8, v9, v0.t
3807 ; RV64-NEXT: lui a0, 1
3808 ; RV64-NEXT: addiw a0, a0, -241
3809 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
3810 ; RV64-NEXT: li a0, 257
3811 ; RV64-NEXT: vmul.vx v8, v8, a0, v0.t
3812 ; RV64-NEXT: vsrl.vi v8, v8, 8, v0.t
3814 %v = call <vscale x 4 x i16> @llvm.vp.cttz.nxv4i16(<vscale x 4 x i16> %va, i1 true, <vscale x 4 x i1> %m, i32 %evl)
3815 ret <vscale x 4 x i16> %v
3818 define <vscale x 4 x i16> @vp_cttz_zero_undef_nxv4i16_unmasked(<vscale x 4 x i16> %va, i32 zeroext %evl) {
3819 ; RV32-LABEL: vp_cttz_zero_undef_nxv4i16_unmasked:
3821 ; RV32-NEXT: li a1, 1
3822 ; RV32-NEXT: vsetvli zero, a0, e16, m1, ta, ma
3823 ; RV32-NEXT: vsub.vx v9, v8, a1
3824 ; RV32-NEXT: vnot.v v8, v8
3825 ; RV32-NEXT: vand.vv v8, v8, v9
3826 ; RV32-NEXT: vsrl.vi v9, v8, 1
3827 ; RV32-NEXT: lui a0, 5
3828 ; RV32-NEXT: addi a0, a0, 1365
3829 ; RV32-NEXT: vand.vx v9, v9, a0
3830 ; RV32-NEXT: vsub.vv v8, v8, v9
3831 ; RV32-NEXT: lui a0, 3
3832 ; RV32-NEXT: addi a0, a0, 819
3833 ; RV32-NEXT: vand.vx v9, v8, a0
3834 ; RV32-NEXT: vsrl.vi v8, v8, 2
3835 ; RV32-NEXT: vand.vx v8, v8, a0
3836 ; RV32-NEXT: vadd.vv v8, v9, v8
3837 ; RV32-NEXT: vsrl.vi v9, v8, 4
3838 ; RV32-NEXT: vadd.vv v8, v8, v9
3839 ; RV32-NEXT: lui a0, 1
3840 ; RV32-NEXT: addi a0, a0, -241
3841 ; RV32-NEXT: vand.vx v8, v8, a0
3842 ; RV32-NEXT: li a0, 257
3843 ; RV32-NEXT: vmul.vx v8, v8, a0
3844 ; RV32-NEXT: vsrl.vi v8, v8, 8
3847 ; RV64-LABEL: vp_cttz_zero_undef_nxv4i16_unmasked:
3849 ; RV64-NEXT: li a1, 1
3850 ; RV64-NEXT: vsetvli zero, a0, e16, m1, ta, ma
3851 ; RV64-NEXT: vsub.vx v9, v8, a1
3852 ; RV64-NEXT: vnot.v v8, v8
3853 ; RV64-NEXT: vand.vv v8, v8, v9
3854 ; RV64-NEXT: vsrl.vi v9, v8, 1
3855 ; RV64-NEXT: lui a0, 5
3856 ; RV64-NEXT: addiw a0, a0, 1365
3857 ; RV64-NEXT: vand.vx v9, v9, a0
3858 ; RV64-NEXT: vsub.vv v8, v8, v9
3859 ; RV64-NEXT: lui a0, 3
3860 ; RV64-NEXT: addiw a0, a0, 819
3861 ; RV64-NEXT: vand.vx v9, v8, a0
3862 ; RV64-NEXT: vsrl.vi v8, v8, 2
3863 ; RV64-NEXT: vand.vx v8, v8, a0
3864 ; RV64-NEXT: vadd.vv v8, v9, v8
3865 ; RV64-NEXT: vsrl.vi v9, v8, 4
3866 ; RV64-NEXT: vadd.vv v8, v8, v9
3867 ; RV64-NEXT: lui a0, 1
3868 ; RV64-NEXT: addiw a0, a0, -241
3869 ; RV64-NEXT: vand.vx v8, v8, a0
3870 ; RV64-NEXT: li a0, 257
3871 ; RV64-NEXT: vmul.vx v8, v8, a0
3872 ; RV64-NEXT: vsrl.vi v8, v8, 8
3874 %head = insertelement <vscale x 4 x i1> poison, i1 true, i32 0
3875 %m = shufflevector <vscale x 4 x i1> %head, <vscale x 4 x i1> poison, <vscale x 4 x i32> zeroinitializer
3876 %v = call <vscale x 4 x i16> @llvm.vp.cttz.nxv4i16(<vscale x 4 x i16> %va, i1 true, <vscale x 4 x i1> %m, i32 %evl)
3877 ret <vscale x 4 x i16> %v
3881 define <vscale x 8 x i16> @vp_cttz_zero_undef_nxv8i16(<vscale x 8 x i16> %va, <vscale x 8 x i1> %m, i32 zeroext %evl) {
3882 ; RV32-LABEL: vp_cttz_zero_undef_nxv8i16:
3884 ; RV32-NEXT: li a1, 1
3885 ; RV32-NEXT: vsetvli zero, a0, e16, m2, ta, ma
3886 ; RV32-NEXT: vsub.vx v10, v8, a1, v0.t
3887 ; RV32-NEXT: vnot.v v8, v8, v0.t
3888 ; RV32-NEXT: vand.vv v8, v8, v10, v0.t
3889 ; RV32-NEXT: vsrl.vi v10, v8, 1, v0.t
3890 ; RV32-NEXT: lui a0, 5
3891 ; RV32-NEXT: addi a0, a0, 1365
3892 ; RV32-NEXT: vand.vx v10, v10, a0, v0.t
3893 ; RV32-NEXT: vsub.vv v8, v8, v10, v0.t
3894 ; RV32-NEXT: lui a0, 3
3895 ; RV32-NEXT: addi a0, a0, 819
3896 ; RV32-NEXT: vand.vx v10, v8, a0, v0.t
3897 ; RV32-NEXT: vsrl.vi v8, v8, 2, v0.t
3898 ; RV32-NEXT: vand.vx v8, v8, a0, v0.t
3899 ; RV32-NEXT: vadd.vv v8, v10, v8, v0.t
3900 ; RV32-NEXT: vsrl.vi v10, v8, 4, v0.t
3901 ; RV32-NEXT: vadd.vv v8, v8, v10, v0.t
3902 ; RV32-NEXT: lui a0, 1
3903 ; RV32-NEXT: addi a0, a0, -241
3904 ; RV32-NEXT: vand.vx v8, v8, a0, v0.t
3905 ; RV32-NEXT: li a0, 257
3906 ; RV32-NEXT: vmul.vx v8, v8, a0, v0.t
3907 ; RV32-NEXT: vsrl.vi v8, v8, 8, v0.t
3910 ; RV64-LABEL: vp_cttz_zero_undef_nxv8i16:
3912 ; RV64-NEXT: li a1, 1
3913 ; RV64-NEXT: vsetvli zero, a0, e16, m2, ta, ma
3914 ; RV64-NEXT: vsub.vx v10, v8, a1, v0.t
3915 ; RV64-NEXT: vnot.v v8, v8, v0.t
3916 ; RV64-NEXT: vand.vv v8, v8, v10, v0.t
3917 ; RV64-NEXT: vsrl.vi v10, v8, 1, v0.t
3918 ; RV64-NEXT: lui a0, 5
3919 ; RV64-NEXT: addiw a0, a0, 1365
3920 ; RV64-NEXT: vand.vx v10, v10, a0, v0.t
3921 ; RV64-NEXT: vsub.vv v8, v8, v10, v0.t
3922 ; RV64-NEXT: lui a0, 3
3923 ; RV64-NEXT: addiw a0, a0, 819
3924 ; RV64-NEXT: vand.vx v10, v8, a0, v0.t
3925 ; RV64-NEXT: vsrl.vi v8, v8, 2, v0.t
3926 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
3927 ; RV64-NEXT: vadd.vv v8, v10, v8, v0.t
3928 ; RV64-NEXT: vsrl.vi v10, v8, 4, v0.t
3929 ; RV64-NEXT: vadd.vv v8, v8, v10, v0.t
3930 ; RV64-NEXT: lui a0, 1
3931 ; RV64-NEXT: addiw a0, a0, -241
3932 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
3933 ; RV64-NEXT: li a0, 257
3934 ; RV64-NEXT: vmul.vx v8, v8, a0, v0.t
3935 ; RV64-NEXT: vsrl.vi v8, v8, 8, v0.t
3937 %v = call <vscale x 8 x i16> @llvm.vp.cttz.nxv8i16(<vscale x 8 x i16> %va, i1 true, <vscale x 8 x i1> %m, i32 %evl)
3938 ret <vscale x 8 x i16> %v
3941 define <vscale x 8 x i16> @vp_cttz_zero_undef_nxv8i16_unmasked(<vscale x 8 x i16> %va, i32 zeroext %evl) {
3942 ; RV32-LABEL: vp_cttz_zero_undef_nxv8i16_unmasked:
3944 ; RV32-NEXT: li a1, 1
3945 ; RV32-NEXT: vsetvli zero, a0, e16, m2, ta, ma
3946 ; RV32-NEXT: vsub.vx v10, v8, a1
3947 ; RV32-NEXT: vnot.v v8, v8
3948 ; RV32-NEXT: vand.vv v8, v8, v10
3949 ; RV32-NEXT: vsrl.vi v10, v8, 1
3950 ; RV32-NEXT: lui a0, 5
3951 ; RV32-NEXT: addi a0, a0, 1365
3952 ; RV32-NEXT: vand.vx v10, v10, a0
3953 ; RV32-NEXT: vsub.vv v8, v8, v10
3954 ; RV32-NEXT: lui a0, 3
3955 ; RV32-NEXT: addi a0, a0, 819
3956 ; RV32-NEXT: vand.vx v10, v8, a0
3957 ; RV32-NEXT: vsrl.vi v8, v8, 2
3958 ; RV32-NEXT: vand.vx v8, v8, a0
3959 ; RV32-NEXT: vadd.vv v8, v10, v8
3960 ; RV32-NEXT: vsrl.vi v10, v8, 4
3961 ; RV32-NEXT: vadd.vv v8, v8, v10
3962 ; RV32-NEXT: lui a0, 1
3963 ; RV32-NEXT: addi a0, a0, -241
3964 ; RV32-NEXT: vand.vx v8, v8, a0
3965 ; RV32-NEXT: li a0, 257
3966 ; RV32-NEXT: vmul.vx v8, v8, a0
3967 ; RV32-NEXT: vsrl.vi v8, v8, 8
3970 ; RV64-LABEL: vp_cttz_zero_undef_nxv8i16_unmasked:
3972 ; RV64-NEXT: li a1, 1
3973 ; RV64-NEXT: vsetvli zero, a0, e16, m2, ta, ma
3974 ; RV64-NEXT: vsub.vx v10, v8, a1
3975 ; RV64-NEXT: vnot.v v8, v8
3976 ; RV64-NEXT: vand.vv v8, v8, v10
3977 ; RV64-NEXT: vsrl.vi v10, v8, 1
3978 ; RV64-NEXT: lui a0, 5
3979 ; RV64-NEXT: addiw a0, a0, 1365
3980 ; RV64-NEXT: vand.vx v10, v10, a0
3981 ; RV64-NEXT: vsub.vv v8, v8, v10
3982 ; RV64-NEXT: lui a0, 3
3983 ; RV64-NEXT: addiw a0, a0, 819
3984 ; RV64-NEXT: vand.vx v10, v8, a0
3985 ; RV64-NEXT: vsrl.vi v8, v8, 2
3986 ; RV64-NEXT: vand.vx v8, v8, a0
3987 ; RV64-NEXT: vadd.vv v8, v10, v8
3988 ; RV64-NEXT: vsrl.vi v10, v8, 4
3989 ; RV64-NEXT: vadd.vv v8, v8, v10
3990 ; RV64-NEXT: lui a0, 1
3991 ; RV64-NEXT: addiw a0, a0, -241
3992 ; RV64-NEXT: vand.vx v8, v8, a0
3993 ; RV64-NEXT: li a0, 257
3994 ; RV64-NEXT: vmul.vx v8, v8, a0
3995 ; RV64-NEXT: vsrl.vi v8, v8, 8
3997 %head = insertelement <vscale x 8 x i1> poison, i1 true, i32 0
3998 %m = shufflevector <vscale x 8 x i1> %head, <vscale x 8 x i1> poison, <vscale x 8 x i32> zeroinitializer
3999 %v = call <vscale x 8 x i16> @llvm.vp.cttz.nxv8i16(<vscale x 8 x i16> %va, i1 true, <vscale x 8 x i1> %m, i32 %evl)
4000 ret <vscale x 8 x i16> %v
4004 define <vscale x 16 x i16> @vp_cttz_zero_undef_nxv16i16(<vscale x 16 x i16> %va, <vscale x 16 x i1> %m, i32 zeroext %evl) {
4005 ; RV32-LABEL: vp_cttz_zero_undef_nxv16i16:
4007 ; RV32-NEXT: li a1, 1
4008 ; RV32-NEXT: vsetvli zero, a0, e16, m4, ta, ma
4009 ; RV32-NEXT: vsub.vx v12, v8, a1, v0.t
4010 ; RV32-NEXT: vnot.v v8, v8, v0.t
4011 ; RV32-NEXT: vand.vv v8, v8, v12, v0.t
4012 ; RV32-NEXT: vsrl.vi v12, v8, 1, v0.t
4013 ; RV32-NEXT: lui a0, 5
4014 ; RV32-NEXT: addi a0, a0, 1365
4015 ; RV32-NEXT: vand.vx v12, v12, a0, v0.t
4016 ; RV32-NEXT: vsub.vv v8, v8, v12, v0.t
4017 ; RV32-NEXT: lui a0, 3
4018 ; RV32-NEXT: addi a0, a0, 819
4019 ; RV32-NEXT: vand.vx v12, v8, a0, v0.t
4020 ; RV32-NEXT: vsrl.vi v8, v8, 2, v0.t
4021 ; RV32-NEXT: vand.vx v8, v8, a0, v0.t
4022 ; RV32-NEXT: vadd.vv v8, v12, v8, v0.t
4023 ; RV32-NEXT: vsrl.vi v12, v8, 4, v0.t
4024 ; RV32-NEXT: vadd.vv v8, v8, v12, v0.t
4025 ; RV32-NEXT: lui a0, 1
4026 ; RV32-NEXT: addi a0, a0, -241
4027 ; RV32-NEXT: vand.vx v8, v8, a0, v0.t
4028 ; RV32-NEXT: li a0, 257
4029 ; RV32-NEXT: vmul.vx v8, v8, a0, v0.t
4030 ; RV32-NEXT: vsrl.vi v8, v8, 8, v0.t
4033 ; RV64-LABEL: vp_cttz_zero_undef_nxv16i16:
4035 ; RV64-NEXT: li a1, 1
4036 ; RV64-NEXT: vsetvli zero, a0, e16, m4, ta, ma
4037 ; RV64-NEXT: vsub.vx v12, v8, a1, v0.t
4038 ; RV64-NEXT: vnot.v v8, v8, v0.t
4039 ; RV64-NEXT: vand.vv v8, v8, v12, v0.t
4040 ; RV64-NEXT: vsrl.vi v12, v8, 1, v0.t
4041 ; RV64-NEXT: lui a0, 5
4042 ; RV64-NEXT: addiw a0, a0, 1365
4043 ; RV64-NEXT: vand.vx v12, v12, a0, v0.t
4044 ; RV64-NEXT: vsub.vv v8, v8, v12, v0.t
4045 ; RV64-NEXT: lui a0, 3
4046 ; RV64-NEXT: addiw a0, a0, 819
4047 ; RV64-NEXT: vand.vx v12, v8, a0, v0.t
4048 ; RV64-NEXT: vsrl.vi v8, v8, 2, v0.t
4049 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
4050 ; RV64-NEXT: vadd.vv v8, v12, v8, v0.t
4051 ; RV64-NEXT: vsrl.vi v12, v8, 4, v0.t
4052 ; RV64-NEXT: vadd.vv v8, v8, v12, v0.t
4053 ; RV64-NEXT: lui a0, 1
4054 ; RV64-NEXT: addiw a0, a0, -241
4055 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
4056 ; RV64-NEXT: li a0, 257
4057 ; RV64-NEXT: vmul.vx v8, v8, a0, v0.t
4058 ; RV64-NEXT: vsrl.vi v8, v8, 8, v0.t
4060 %v = call <vscale x 16 x i16> @llvm.vp.cttz.nxv16i16(<vscale x 16 x i16> %va, i1 true, <vscale x 16 x i1> %m, i32 %evl)
4061 ret <vscale x 16 x i16> %v
4064 define <vscale x 16 x i16> @vp_cttz_zero_undef_nxv16i16_unmasked(<vscale x 16 x i16> %va, i32 zeroext %evl) {
4065 ; RV32-LABEL: vp_cttz_zero_undef_nxv16i16_unmasked:
4067 ; RV32-NEXT: li a1, 1
4068 ; RV32-NEXT: vsetvli zero, a0, e16, m4, ta, ma
4069 ; RV32-NEXT: vsub.vx v12, v8, a1
4070 ; RV32-NEXT: vnot.v v8, v8
4071 ; RV32-NEXT: vand.vv v8, v8, v12
4072 ; RV32-NEXT: vsrl.vi v12, v8, 1
4073 ; RV32-NEXT: lui a0, 5
4074 ; RV32-NEXT: addi a0, a0, 1365
4075 ; RV32-NEXT: vand.vx v12, v12, a0
4076 ; RV32-NEXT: vsub.vv v8, v8, v12
4077 ; RV32-NEXT: lui a0, 3
4078 ; RV32-NEXT: addi a0, a0, 819
4079 ; RV32-NEXT: vand.vx v12, v8, a0
4080 ; RV32-NEXT: vsrl.vi v8, v8, 2
4081 ; RV32-NEXT: vand.vx v8, v8, a0
4082 ; RV32-NEXT: vadd.vv v8, v12, v8
4083 ; RV32-NEXT: vsrl.vi v12, v8, 4
4084 ; RV32-NEXT: vadd.vv v8, v8, v12
4085 ; RV32-NEXT: lui a0, 1
4086 ; RV32-NEXT: addi a0, a0, -241
4087 ; RV32-NEXT: vand.vx v8, v8, a0
4088 ; RV32-NEXT: li a0, 257
4089 ; RV32-NEXT: vmul.vx v8, v8, a0
4090 ; RV32-NEXT: vsrl.vi v8, v8, 8
4093 ; RV64-LABEL: vp_cttz_zero_undef_nxv16i16_unmasked:
4095 ; RV64-NEXT: li a1, 1
4096 ; RV64-NEXT: vsetvli zero, a0, e16, m4, ta, ma
4097 ; RV64-NEXT: vsub.vx v12, v8, a1
4098 ; RV64-NEXT: vnot.v v8, v8
4099 ; RV64-NEXT: vand.vv v8, v8, v12
4100 ; RV64-NEXT: vsrl.vi v12, v8, 1
4101 ; RV64-NEXT: lui a0, 5
4102 ; RV64-NEXT: addiw a0, a0, 1365
4103 ; RV64-NEXT: vand.vx v12, v12, a0
4104 ; RV64-NEXT: vsub.vv v8, v8, v12
4105 ; RV64-NEXT: lui a0, 3
4106 ; RV64-NEXT: addiw a0, a0, 819
4107 ; RV64-NEXT: vand.vx v12, v8, a0
4108 ; RV64-NEXT: vsrl.vi v8, v8, 2
4109 ; RV64-NEXT: vand.vx v8, v8, a0
4110 ; RV64-NEXT: vadd.vv v8, v12, v8
4111 ; RV64-NEXT: vsrl.vi v12, v8, 4
4112 ; RV64-NEXT: vadd.vv v8, v8, v12
4113 ; RV64-NEXT: lui a0, 1
4114 ; RV64-NEXT: addiw a0, a0, -241
4115 ; RV64-NEXT: vand.vx v8, v8, a0
4116 ; RV64-NEXT: li a0, 257
4117 ; RV64-NEXT: vmul.vx v8, v8, a0
4118 ; RV64-NEXT: vsrl.vi v8, v8, 8
4120 %head = insertelement <vscale x 16 x i1> poison, i1 true, i32 0
4121 %m = shufflevector <vscale x 16 x i1> %head, <vscale x 16 x i1> poison, <vscale x 16 x i32> zeroinitializer
4122 %v = call <vscale x 16 x i16> @llvm.vp.cttz.nxv16i16(<vscale x 16 x i16> %va, i1 true, <vscale x 16 x i1> %m, i32 %evl)
4123 ret <vscale x 16 x i16> %v
4127 define <vscale x 32 x i16> @vp_cttz_zero_undef_nxv32i16(<vscale x 32 x i16> %va, <vscale x 32 x i1> %m, i32 zeroext %evl) {
4128 ; RV32-LABEL: vp_cttz_zero_undef_nxv32i16:
4130 ; RV32-NEXT: li a1, 1
4131 ; RV32-NEXT: vsetvli zero, a0, e16, m8, ta, ma
4132 ; RV32-NEXT: vsub.vx v16, v8, a1, v0.t
4133 ; RV32-NEXT: vnot.v v8, v8, v0.t
4134 ; RV32-NEXT: vand.vv v8, v8, v16, v0.t
4135 ; RV32-NEXT: vsrl.vi v16, v8, 1, v0.t
4136 ; RV32-NEXT: lui a0, 5
4137 ; RV32-NEXT: addi a0, a0, 1365
4138 ; RV32-NEXT: vand.vx v16, v16, a0, v0.t
4139 ; RV32-NEXT: vsub.vv v8, v8, v16, v0.t
4140 ; RV32-NEXT: lui a0, 3
4141 ; RV32-NEXT: addi a0, a0, 819
4142 ; RV32-NEXT: vand.vx v16, v8, a0, v0.t
4143 ; RV32-NEXT: vsrl.vi v8, v8, 2, v0.t
4144 ; RV32-NEXT: vand.vx v8, v8, a0, v0.t
4145 ; RV32-NEXT: vadd.vv v8, v16, v8, v0.t
4146 ; RV32-NEXT: vsrl.vi v16, v8, 4, v0.t
4147 ; RV32-NEXT: vadd.vv v8, v8, v16, v0.t
4148 ; RV32-NEXT: lui a0, 1
4149 ; RV32-NEXT: addi a0, a0, -241
4150 ; RV32-NEXT: vand.vx v8, v8, a0, v0.t
4151 ; RV32-NEXT: li a0, 257
4152 ; RV32-NEXT: vmul.vx v8, v8, a0, v0.t
4153 ; RV32-NEXT: vsrl.vi v8, v8, 8, v0.t
4156 ; RV64-LABEL: vp_cttz_zero_undef_nxv32i16:
4158 ; RV64-NEXT: li a1, 1
4159 ; RV64-NEXT: vsetvli zero, a0, e16, m8, ta, ma
4160 ; RV64-NEXT: vsub.vx v16, v8, a1, v0.t
4161 ; RV64-NEXT: vnot.v v8, v8, v0.t
4162 ; RV64-NEXT: vand.vv v8, v8, v16, v0.t
4163 ; RV64-NEXT: vsrl.vi v16, v8, 1, v0.t
4164 ; RV64-NEXT: lui a0, 5
4165 ; RV64-NEXT: addiw a0, a0, 1365
4166 ; RV64-NEXT: vand.vx v16, v16, a0, v0.t
4167 ; RV64-NEXT: vsub.vv v8, v8, v16, v0.t
4168 ; RV64-NEXT: lui a0, 3
4169 ; RV64-NEXT: addiw a0, a0, 819
4170 ; RV64-NEXT: vand.vx v16, v8, a0, v0.t
4171 ; RV64-NEXT: vsrl.vi v8, v8, 2, v0.t
4172 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
4173 ; RV64-NEXT: vadd.vv v8, v16, v8, v0.t
4174 ; RV64-NEXT: vsrl.vi v16, v8, 4, v0.t
4175 ; RV64-NEXT: vadd.vv v8, v8, v16, v0.t
4176 ; RV64-NEXT: lui a0, 1
4177 ; RV64-NEXT: addiw a0, a0, -241
4178 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
4179 ; RV64-NEXT: li a0, 257
4180 ; RV64-NEXT: vmul.vx v8, v8, a0, v0.t
4181 ; RV64-NEXT: vsrl.vi v8, v8, 8, v0.t
4183 %v = call <vscale x 32 x i16> @llvm.vp.cttz.nxv32i16(<vscale x 32 x i16> %va, i1 true, <vscale x 32 x i1> %m, i32 %evl)
4184 ret <vscale x 32 x i16> %v
4187 define <vscale x 32 x i16> @vp_cttz_zero_undef_nxv32i16_unmasked(<vscale x 32 x i16> %va, i32 zeroext %evl) {
4188 ; RV32-LABEL: vp_cttz_zero_undef_nxv32i16_unmasked:
4190 ; RV32-NEXT: li a1, 1
4191 ; RV32-NEXT: vsetvli zero, a0, e16, m8, ta, ma
4192 ; RV32-NEXT: vsub.vx v16, v8, a1
4193 ; RV32-NEXT: vnot.v v8, v8
4194 ; RV32-NEXT: vand.vv v8, v8, v16
4195 ; RV32-NEXT: vsrl.vi v16, v8, 1
4196 ; RV32-NEXT: lui a0, 5
4197 ; RV32-NEXT: addi a0, a0, 1365
4198 ; RV32-NEXT: vand.vx v16, v16, a0
4199 ; RV32-NEXT: vsub.vv v8, v8, v16
4200 ; RV32-NEXT: lui a0, 3
4201 ; RV32-NEXT: addi a0, a0, 819
4202 ; RV32-NEXT: vand.vx v16, v8, a0
4203 ; RV32-NEXT: vsrl.vi v8, v8, 2
4204 ; RV32-NEXT: vand.vx v8, v8, a0
4205 ; RV32-NEXT: vadd.vv v8, v16, v8
4206 ; RV32-NEXT: vsrl.vi v16, v8, 4
4207 ; RV32-NEXT: vadd.vv v8, v8, v16
4208 ; RV32-NEXT: lui a0, 1
4209 ; RV32-NEXT: addi a0, a0, -241
4210 ; RV32-NEXT: vand.vx v8, v8, a0
4211 ; RV32-NEXT: li a0, 257
4212 ; RV32-NEXT: vmul.vx v8, v8, a0
4213 ; RV32-NEXT: vsrl.vi v8, v8, 8
4216 ; RV64-LABEL: vp_cttz_zero_undef_nxv32i16_unmasked:
4218 ; RV64-NEXT: li a1, 1
4219 ; RV64-NEXT: vsetvli zero, a0, e16, m8, ta, ma
4220 ; RV64-NEXT: vsub.vx v16, v8, a1
4221 ; RV64-NEXT: vnot.v v8, v8
4222 ; RV64-NEXT: vand.vv v8, v8, v16
4223 ; RV64-NEXT: vsrl.vi v16, v8, 1
4224 ; RV64-NEXT: lui a0, 5
4225 ; RV64-NEXT: addiw a0, a0, 1365
4226 ; RV64-NEXT: vand.vx v16, v16, a0
4227 ; RV64-NEXT: vsub.vv v8, v8, v16
4228 ; RV64-NEXT: lui a0, 3
4229 ; RV64-NEXT: addiw a0, a0, 819
4230 ; RV64-NEXT: vand.vx v16, v8, a0
4231 ; RV64-NEXT: vsrl.vi v8, v8, 2
4232 ; RV64-NEXT: vand.vx v8, v8, a0
4233 ; RV64-NEXT: vadd.vv v8, v16, v8
4234 ; RV64-NEXT: vsrl.vi v16, v8, 4
4235 ; RV64-NEXT: vadd.vv v8, v8, v16
4236 ; RV64-NEXT: lui a0, 1
4237 ; RV64-NEXT: addiw a0, a0, -241
4238 ; RV64-NEXT: vand.vx v8, v8, a0
4239 ; RV64-NEXT: li a0, 257
4240 ; RV64-NEXT: vmul.vx v8, v8, a0
4241 ; RV64-NEXT: vsrl.vi v8, v8, 8
4243 %head = insertelement <vscale x 32 x i1> poison, i1 true, i32 0
4244 %m = shufflevector <vscale x 32 x i1> %head, <vscale x 32 x i1> poison, <vscale x 32 x i32> zeroinitializer
4245 %v = call <vscale x 32 x i16> @llvm.vp.cttz.nxv32i16(<vscale x 32 x i16> %va, i1 true, <vscale x 32 x i1> %m, i32 %evl)
4246 ret <vscale x 32 x i16> %v
4250 define <vscale x 1 x i32> @vp_cttz_zero_undef_nxv1i32(<vscale x 1 x i32> %va, <vscale x 1 x i1> %m, i32 zeroext %evl) {
4251 ; RV32-LABEL: vp_cttz_zero_undef_nxv1i32:
4253 ; RV32-NEXT: li a1, 1
4254 ; RV32-NEXT: vsetvli zero, a0, e32, mf2, ta, ma
4255 ; RV32-NEXT: vsub.vx v9, v8, a1, v0.t
4256 ; RV32-NEXT: vnot.v v8, v8, v0.t
4257 ; RV32-NEXT: vand.vv v8, v8, v9, v0.t
4258 ; RV32-NEXT: vsrl.vi v9, v8, 1, v0.t
4259 ; RV32-NEXT: lui a0, 349525
4260 ; RV32-NEXT: addi a0, a0, 1365
4261 ; RV32-NEXT: vand.vx v9, v9, a0, v0.t
4262 ; RV32-NEXT: vsub.vv v8, v8, v9, v0.t
4263 ; RV32-NEXT: lui a0, 209715
4264 ; RV32-NEXT: addi a0, a0, 819
4265 ; RV32-NEXT: vand.vx v9, v8, a0, v0.t
4266 ; RV32-NEXT: vsrl.vi v8, v8, 2, v0.t
4267 ; RV32-NEXT: vand.vx v8, v8, a0, v0.t
4268 ; RV32-NEXT: vadd.vv v8, v9, v8, v0.t
4269 ; RV32-NEXT: vsrl.vi v9, v8, 4, v0.t
4270 ; RV32-NEXT: vadd.vv v8, v8, v9, v0.t
4271 ; RV32-NEXT: lui a0, 61681
4272 ; RV32-NEXT: addi a0, a0, -241
4273 ; RV32-NEXT: vand.vx v8, v8, a0, v0.t
4274 ; RV32-NEXT: lui a0, 4112
4275 ; RV32-NEXT: addi a0, a0, 257
4276 ; RV32-NEXT: vmul.vx v8, v8, a0, v0.t
4277 ; RV32-NEXT: vsrl.vi v8, v8, 24, v0.t
4280 ; RV64-LABEL: vp_cttz_zero_undef_nxv1i32:
4282 ; RV64-NEXT: li a1, 1
4283 ; RV64-NEXT: vsetvli zero, a0, e32, mf2, ta, ma
4284 ; RV64-NEXT: vsub.vx v9, v8, a1, v0.t
4285 ; RV64-NEXT: vnot.v v8, v8, v0.t
4286 ; RV64-NEXT: vand.vv v8, v8, v9, v0.t
4287 ; RV64-NEXT: vsrl.vi v9, v8, 1, v0.t
4288 ; RV64-NEXT: lui a0, 349525
4289 ; RV64-NEXT: addiw a0, a0, 1365
4290 ; RV64-NEXT: vand.vx v9, v9, a0, v0.t
4291 ; RV64-NEXT: vsub.vv v8, v8, v9, v0.t
4292 ; RV64-NEXT: lui a0, 209715
4293 ; RV64-NEXT: addiw a0, a0, 819
4294 ; RV64-NEXT: vand.vx v9, v8, a0, v0.t
4295 ; RV64-NEXT: vsrl.vi v8, v8, 2, v0.t
4296 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
4297 ; RV64-NEXT: vadd.vv v8, v9, v8, v0.t
4298 ; RV64-NEXT: vsrl.vi v9, v8, 4, v0.t
4299 ; RV64-NEXT: vadd.vv v8, v8, v9, v0.t
4300 ; RV64-NEXT: lui a0, 61681
4301 ; RV64-NEXT: addiw a0, a0, -241
4302 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
4303 ; RV64-NEXT: lui a0, 4112
4304 ; RV64-NEXT: addiw a0, a0, 257
4305 ; RV64-NEXT: vmul.vx v8, v8, a0, v0.t
4306 ; RV64-NEXT: vsrl.vi v8, v8, 24, v0.t
4308 %v = call <vscale x 1 x i32> @llvm.vp.cttz.nxv1i32(<vscale x 1 x i32> %va, i1 true, <vscale x 1 x i1> %m, i32 %evl)
4309 ret <vscale x 1 x i32> %v
4312 define <vscale x 1 x i32> @vp_cttz_zero_undef_nxv1i32_unmasked(<vscale x 1 x i32> %va, i32 zeroext %evl) {
4313 ; RV32-LABEL: vp_cttz_zero_undef_nxv1i32_unmasked:
4315 ; RV32-NEXT: li a1, 1
4316 ; RV32-NEXT: vsetvli zero, a0, e32, mf2, ta, ma
4317 ; RV32-NEXT: vsub.vx v9, v8, a1
4318 ; RV32-NEXT: vnot.v v8, v8
4319 ; RV32-NEXT: vand.vv v8, v8, v9
4320 ; RV32-NEXT: vsrl.vi v9, v8, 1
4321 ; RV32-NEXT: lui a0, 349525
4322 ; RV32-NEXT: addi a0, a0, 1365
4323 ; RV32-NEXT: vand.vx v9, v9, a0
4324 ; RV32-NEXT: vsub.vv v8, v8, v9
4325 ; RV32-NEXT: lui a0, 209715
4326 ; RV32-NEXT: addi a0, a0, 819
4327 ; RV32-NEXT: vand.vx v9, v8, a0
4328 ; RV32-NEXT: vsrl.vi v8, v8, 2
4329 ; RV32-NEXT: vand.vx v8, v8, a0
4330 ; RV32-NEXT: vadd.vv v8, v9, v8
4331 ; RV32-NEXT: vsrl.vi v9, v8, 4
4332 ; RV32-NEXT: vadd.vv v8, v8, v9
4333 ; RV32-NEXT: lui a0, 61681
4334 ; RV32-NEXT: addi a0, a0, -241
4335 ; RV32-NEXT: vand.vx v8, v8, a0
4336 ; RV32-NEXT: lui a0, 4112
4337 ; RV32-NEXT: addi a0, a0, 257
4338 ; RV32-NEXT: vmul.vx v8, v8, a0
4339 ; RV32-NEXT: vsrl.vi v8, v8, 24
4342 ; RV64-LABEL: vp_cttz_zero_undef_nxv1i32_unmasked:
4344 ; RV64-NEXT: li a1, 1
4345 ; RV64-NEXT: vsetvli zero, a0, e32, mf2, ta, ma
4346 ; RV64-NEXT: vsub.vx v9, v8, a1
4347 ; RV64-NEXT: vnot.v v8, v8
4348 ; RV64-NEXT: vand.vv v8, v8, v9
4349 ; RV64-NEXT: vsrl.vi v9, v8, 1
4350 ; RV64-NEXT: lui a0, 349525
4351 ; RV64-NEXT: addiw a0, a0, 1365
4352 ; RV64-NEXT: vand.vx v9, v9, a0
4353 ; RV64-NEXT: vsub.vv v8, v8, v9
4354 ; RV64-NEXT: lui a0, 209715
4355 ; RV64-NEXT: addiw a0, a0, 819
4356 ; RV64-NEXT: vand.vx v9, v8, a0
4357 ; RV64-NEXT: vsrl.vi v8, v8, 2
4358 ; RV64-NEXT: vand.vx v8, v8, a0
4359 ; RV64-NEXT: vadd.vv v8, v9, v8
4360 ; RV64-NEXT: vsrl.vi v9, v8, 4
4361 ; RV64-NEXT: vadd.vv v8, v8, v9
4362 ; RV64-NEXT: lui a0, 61681
4363 ; RV64-NEXT: addiw a0, a0, -241
4364 ; RV64-NEXT: vand.vx v8, v8, a0
4365 ; RV64-NEXT: lui a0, 4112
4366 ; RV64-NEXT: addiw a0, a0, 257
4367 ; RV64-NEXT: vmul.vx v8, v8, a0
4368 ; RV64-NEXT: vsrl.vi v8, v8, 24
4370 %head = insertelement <vscale x 1 x i1> poison, i1 true, i32 0
4371 %m = shufflevector <vscale x 1 x i1> %head, <vscale x 1 x i1> poison, <vscale x 1 x i32> zeroinitializer
4372 %v = call <vscale x 1 x i32> @llvm.vp.cttz.nxv1i32(<vscale x 1 x i32> %va, i1 true, <vscale x 1 x i1> %m, i32 %evl)
4373 ret <vscale x 1 x i32> %v
4377 define <vscale x 2 x i32> @vp_cttz_zero_undef_nxv2i32(<vscale x 2 x i32> %va, <vscale x 2 x i1> %m, i32 zeroext %evl) {
4378 ; RV32-LABEL: vp_cttz_zero_undef_nxv2i32:
4380 ; RV32-NEXT: li a1, 1
4381 ; RV32-NEXT: vsetvli zero, a0, e32, m1, ta, ma
4382 ; RV32-NEXT: vsub.vx v9, v8, a1, v0.t
4383 ; RV32-NEXT: vnot.v v8, v8, v0.t
4384 ; RV32-NEXT: vand.vv v8, v8, v9, v0.t
4385 ; RV32-NEXT: vsrl.vi v9, v8, 1, v0.t
4386 ; RV32-NEXT: lui a0, 349525
4387 ; RV32-NEXT: addi a0, a0, 1365
4388 ; RV32-NEXT: vand.vx v9, v9, a0, v0.t
4389 ; RV32-NEXT: vsub.vv v8, v8, v9, v0.t
4390 ; RV32-NEXT: lui a0, 209715
4391 ; RV32-NEXT: addi a0, a0, 819
4392 ; RV32-NEXT: vand.vx v9, v8, a0, v0.t
4393 ; RV32-NEXT: vsrl.vi v8, v8, 2, v0.t
4394 ; RV32-NEXT: vand.vx v8, v8, a0, v0.t
4395 ; RV32-NEXT: vadd.vv v8, v9, v8, v0.t
4396 ; RV32-NEXT: vsrl.vi v9, v8, 4, v0.t
4397 ; RV32-NEXT: vadd.vv v8, v8, v9, v0.t
4398 ; RV32-NEXT: lui a0, 61681
4399 ; RV32-NEXT: addi a0, a0, -241
4400 ; RV32-NEXT: vand.vx v8, v8, a0, v0.t
4401 ; RV32-NEXT: lui a0, 4112
4402 ; RV32-NEXT: addi a0, a0, 257
4403 ; RV32-NEXT: vmul.vx v8, v8, a0, v0.t
4404 ; RV32-NEXT: vsrl.vi v8, v8, 24, v0.t
4407 ; RV64-LABEL: vp_cttz_zero_undef_nxv2i32:
4409 ; RV64-NEXT: li a1, 1
4410 ; RV64-NEXT: vsetvli zero, a0, e32, m1, ta, ma
4411 ; RV64-NEXT: vsub.vx v9, v8, a1, v0.t
4412 ; RV64-NEXT: vnot.v v8, v8, v0.t
4413 ; RV64-NEXT: vand.vv v8, v8, v9, v0.t
4414 ; RV64-NEXT: vsrl.vi v9, v8, 1, v0.t
4415 ; RV64-NEXT: lui a0, 349525
4416 ; RV64-NEXT: addiw a0, a0, 1365
4417 ; RV64-NEXT: vand.vx v9, v9, a0, v0.t
4418 ; RV64-NEXT: vsub.vv v8, v8, v9, v0.t
4419 ; RV64-NEXT: lui a0, 209715
4420 ; RV64-NEXT: addiw a0, a0, 819
4421 ; RV64-NEXT: vand.vx v9, v8, a0, v0.t
4422 ; RV64-NEXT: vsrl.vi v8, v8, 2, v0.t
4423 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
4424 ; RV64-NEXT: vadd.vv v8, v9, v8, v0.t
4425 ; RV64-NEXT: vsrl.vi v9, v8, 4, v0.t
4426 ; RV64-NEXT: vadd.vv v8, v8, v9, v0.t
4427 ; RV64-NEXT: lui a0, 61681
4428 ; RV64-NEXT: addiw a0, a0, -241
4429 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
4430 ; RV64-NEXT: lui a0, 4112
4431 ; RV64-NEXT: addiw a0, a0, 257
4432 ; RV64-NEXT: vmul.vx v8, v8, a0, v0.t
4433 ; RV64-NEXT: vsrl.vi v8, v8, 24, v0.t
4435 %v = call <vscale x 2 x i32> @llvm.vp.cttz.nxv2i32(<vscale x 2 x i32> %va, i1 true, <vscale x 2 x i1> %m, i32 %evl)
4436 ret <vscale x 2 x i32> %v
4439 define <vscale x 2 x i32> @vp_cttz_zero_undef_nxv2i32_unmasked(<vscale x 2 x i32> %va, i32 zeroext %evl) {
4440 ; RV32-LABEL: vp_cttz_zero_undef_nxv2i32_unmasked:
4442 ; RV32-NEXT: li a1, 1
4443 ; RV32-NEXT: vsetvli zero, a0, e32, m1, ta, ma
4444 ; RV32-NEXT: vsub.vx v9, v8, a1
4445 ; RV32-NEXT: vnot.v v8, v8
4446 ; RV32-NEXT: vand.vv v8, v8, v9
4447 ; RV32-NEXT: vsrl.vi v9, v8, 1
4448 ; RV32-NEXT: lui a0, 349525
4449 ; RV32-NEXT: addi a0, a0, 1365
4450 ; RV32-NEXT: vand.vx v9, v9, a0
4451 ; RV32-NEXT: vsub.vv v8, v8, v9
4452 ; RV32-NEXT: lui a0, 209715
4453 ; RV32-NEXT: addi a0, a0, 819
4454 ; RV32-NEXT: vand.vx v9, v8, a0
4455 ; RV32-NEXT: vsrl.vi v8, v8, 2
4456 ; RV32-NEXT: vand.vx v8, v8, a0
4457 ; RV32-NEXT: vadd.vv v8, v9, v8
4458 ; RV32-NEXT: vsrl.vi v9, v8, 4
4459 ; RV32-NEXT: vadd.vv v8, v8, v9
4460 ; RV32-NEXT: lui a0, 61681
4461 ; RV32-NEXT: addi a0, a0, -241
4462 ; RV32-NEXT: vand.vx v8, v8, a0
4463 ; RV32-NEXT: lui a0, 4112
4464 ; RV32-NEXT: addi a0, a0, 257
4465 ; RV32-NEXT: vmul.vx v8, v8, a0
4466 ; RV32-NEXT: vsrl.vi v8, v8, 24
4469 ; RV64-LABEL: vp_cttz_zero_undef_nxv2i32_unmasked:
4471 ; RV64-NEXT: li a1, 1
4472 ; RV64-NEXT: vsetvli zero, a0, e32, m1, ta, ma
4473 ; RV64-NEXT: vsub.vx v9, v8, a1
4474 ; RV64-NEXT: vnot.v v8, v8
4475 ; RV64-NEXT: vand.vv v8, v8, v9
4476 ; RV64-NEXT: vsrl.vi v9, v8, 1
4477 ; RV64-NEXT: lui a0, 349525
4478 ; RV64-NEXT: addiw a0, a0, 1365
4479 ; RV64-NEXT: vand.vx v9, v9, a0
4480 ; RV64-NEXT: vsub.vv v8, v8, v9
4481 ; RV64-NEXT: lui a0, 209715
4482 ; RV64-NEXT: addiw a0, a0, 819
4483 ; RV64-NEXT: vand.vx v9, v8, a0
4484 ; RV64-NEXT: vsrl.vi v8, v8, 2
4485 ; RV64-NEXT: vand.vx v8, v8, a0
4486 ; RV64-NEXT: vadd.vv v8, v9, v8
4487 ; RV64-NEXT: vsrl.vi v9, v8, 4
4488 ; RV64-NEXT: vadd.vv v8, v8, v9
4489 ; RV64-NEXT: lui a0, 61681
4490 ; RV64-NEXT: addiw a0, a0, -241
4491 ; RV64-NEXT: vand.vx v8, v8, a0
4492 ; RV64-NEXT: lui a0, 4112
4493 ; RV64-NEXT: addiw a0, a0, 257
4494 ; RV64-NEXT: vmul.vx v8, v8, a0
4495 ; RV64-NEXT: vsrl.vi v8, v8, 24
4497 %head = insertelement <vscale x 2 x i1> poison, i1 true, i32 0
4498 %m = shufflevector <vscale x 2 x i1> %head, <vscale x 2 x i1> poison, <vscale x 2 x i32> zeroinitializer
4499 %v = call <vscale x 2 x i32> @llvm.vp.cttz.nxv2i32(<vscale x 2 x i32> %va, i1 true, <vscale x 2 x i1> %m, i32 %evl)
4500 ret <vscale x 2 x i32> %v
4504 define <vscale x 4 x i32> @vp_cttz_zero_undef_nxv4i32(<vscale x 4 x i32> %va, <vscale x 4 x i1> %m, i32 zeroext %evl) {
4505 ; RV32-LABEL: vp_cttz_zero_undef_nxv4i32:
4507 ; RV32-NEXT: li a1, 1
4508 ; RV32-NEXT: vsetvli zero, a0, e32, m2, ta, ma
4509 ; RV32-NEXT: vsub.vx v10, v8, a1, v0.t
4510 ; RV32-NEXT: vnot.v v8, v8, v0.t
4511 ; RV32-NEXT: vand.vv v8, v8, v10, v0.t
4512 ; RV32-NEXT: vsrl.vi v10, v8, 1, v0.t
4513 ; RV32-NEXT: lui a0, 349525
4514 ; RV32-NEXT: addi a0, a0, 1365
4515 ; RV32-NEXT: vand.vx v10, v10, a0, v0.t
4516 ; RV32-NEXT: vsub.vv v8, v8, v10, v0.t
4517 ; RV32-NEXT: lui a0, 209715
4518 ; RV32-NEXT: addi a0, a0, 819
4519 ; RV32-NEXT: vand.vx v10, v8, a0, v0.t
4520 ; RV32-NEXT: vsrl.vi v8, v8, 2, v0.t
4521 ; RV32-NEXT: vand.vx v8, v8, a0, v0.t
4522 ; RV32-NEXT: vadd.vv v8, v10, v8, v0.t
4523 ; RV32-NEXT: vsrl.vi v10, v8, 4, v0.t
4524 ; RV32-NEXT: vadd.vv v8, v8, v10, v0.t
4525 ; RV32-NEXT: lui a0, 61681
4526 ; RV32-NEXT: addi a0, a0, -241
4527 ; RV32-NEXT: vand.vx v8, v8, a0, v0.t
4528 ; RV32-NEXT: lui a0, 4112
4529 ; RV32-NEXT: addi a0, a0, 257
4530 ; RV32-NEXT: vmul.vx v8, v8, a0, v0.t
4531 ; RV32-NEXT: vsrl.vi v8, v8, 24, v0.t
4534 ; RV64-LABEL: vp_cttz_zero_undef_nxv4i32:
4536 ; RV64-NEXT: li a1, 1
4537 ; RV64-NEXT: vsetvli zero, a0, e32, m2, ta, ma
4538 ; RV64-NEXT: vsub.vx v10, v8, a1, v0.t
4539 ; RV64-NEXT: vnot.v v8, v8, v0.t
4540 ; RV64-NEXT: vand.vv v8, v8, v10, v0.t
4541 ; RV64-NEXT: vsrl.vi v10, v8, 1, v0.t
4542 ; RV64-NEXT: lui a0, 349525
4543 ; RV64-NEXT: addiw a0, a0, 1365
4544 ; RV64-NEXT: vand.vx v10, v10, a0, v0.t
4545 ; RV64-NEXT: vsub.vv v8, v8, v10, v0.t
4546 ; RV64-NEXT: lui a0, 209715
4547 ; RV64-NEXT: addiw a0, a0, 819
4548 ; RV64-NEXT: vand.vx v10, v8, a0, v0.t
4549 ; RV64-NEXT: vsrl.vi v8, v8, 2, v0.t
4550 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
4551 ; RV64-NEXT: vadd.vv v8, v10, v8, v0.t
4552 ; RV64-NEXT: vsrl.vi v10, v8, 4, v0.t
4553 ; RV64-NEXT: vadd.vv v8, v8, v10, v0.t
4554 ; RV64-NEXT: lui a0, 61681
4555 ; RV64-NEXT: addiw a0, a0, -241
4556 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
4557 ; RV64-NEXT: lui a0, 4112
4558 ; RV64-NEXT: addiw a0, a0, 257
4559 ; RV64-NEXT: vmul.vx v8, v8, a0, v0.t
4560 ; RV64-NEXT: vsrl.vi v8, v8, 24, v0.t
4562 %v = call <vscale x 4 x i32> @llvm.vp.cttz.nxv4i32(<vscale x 4 x i32> %va, i1 true, <vscale x 4 x i1> %m, i32 %evl)
4563 ret <vscale x 4 x i32> %v
4566 define <vscale x 4 x i32> @vp_cttz_zero_undef_nxv4i32_unmasked(<vscale x 4 x i32> %va, i32 zeroext %evl) {
4567 ; RV32-LABEL: vp_cttz_zero_undef_nxv4i32_unmasked:
4569 ; RV32-NEXT: li a1, 1
4570 ; RV32-NEXT: vsetvli zero, a0, e32, m2, ta, ma
4571 ; RV32-NEXT: vsub.vx v10, v8, a1
4572 ; RV32-NEXT: vnot.v v8, v8
4573 ; RV32-NEXT: vand.vv v8, v8, v10
4574 ; RV32-NEXT: vsrl.vi v10, v8, 1
4575 ; RV32-NEXT: lui a0, 349525
4576 ; RV32-NEXT: addi a0, a0, 1365
4577 ; RV32-NEXT: vand.vx v10, v10, a0
4578 ; RV32-NEXT: vsub.vv v8, v8, v10
4579 ; RV32-NEXT: lui a0, 209715
4580 ; RV32-NEXT: addi a0, a0, 819
4581 ; RV32-NEXT: vand.vx v10, v8, a0
4582 ; RV32-NEXT: vsrl.vi v8, v8, 2
4583 ; RV32-NEXT: vand.vx v8, v8, a0
4584 ; RV32-NEXT: vadd.vv v8, v10, v8
4585 ; RV32-NEXT: vsrl.vi v10, v8, 4
4586 ; RV32-NEXT: vadd.vv v8, v8, v10
4587 ; RV32-NEXT: lui a0, 61681
4588 ; RV32-NEXT: addi a0, a0, -241
4589 ; RV32-NEXT: vand.vx v8, v8, a0
4590 ; RV32-NEXT: lui a0, 4112
4591 ; RV32-NEXT: addi a0, a0, 257
4592 ; RV32-NEXT: vmul.vx v8, v8, a0
4593 ; RV32-NEXT: vsrl.vi v8, v8, 24
4596 ; RV64-LABEL: vp_cttz_zero_undef_nxv4i32_unmasked:
4598 ; RV64-NEXT: li a1, 1
4599 ; RV64-NEXT: vsetvli zero, a0, e32, m2, ta, ma
4600 ; RV64-NEXT: vsub.vx v10, v8, a1
4601 ; RV64-NEXT: vnot.v v8, v8
4602 ; RV64-NEXT: vand.vv v8, v8, v10
4603 ; RV64-NEXT: vsrl.vi v10, v8, 1
4604 ; RV64-NEXT: lui a0, 349525
4605 ; RV64-NEXT: addiw a0, a0, 1365
4606 ; RV64-NEXT: vand.vx v10, v10, a0
4607 ; RV64-NEXT: vsub.vv v8, v8, v10
4608 ; RV64-NEXT: lui a0, 209715
4609 ; RV64-NEXT: addiw a0, a0, 819
4610 ; RV64-NEXT: vand.vx v10, v8, a0
4611 ; RV64-NEXT: vsrl.vi v8, v8, 2
4612 ; RV64-NEXT: vand.vx v8, v8, a0
4613 ; RV64-NEXT: vadd.vv v8, v10, v8
4614 ; RV64-NEXT: vsrl.vi v10, v8, 4
4615 ; RV64-NEXT: vadd.vv v8, v8, v10
4616 ; RV64-NEXT: lui a0, 61681
4617 ; RV64-NEXT: addiw a0, a0, -241
4618 ; RV64-NEXT: vand.vx v8, v8, a0
4619 ; RV64-NEXT: lui a0, 4112
4620 ; RV64-NEXT: addiw a0, a0, 257
4621 ; RV64-NEXT: vmul.vx v8, v8, a0
4622 ; RV64-NEXT: vsrl.vi v8, v8, 24
4624 %head = insertelement <vscale x 4 x i1> poison, i1 true, i32 0
4625 %m = shufflevector <vscale x 4 x i1> %head, <vscale x 4 x i1> poison, <vscale x 4 x i32> zeroinitializer
4626 %v = call <vscale x 4 x i32> @llvm.vp.cttz.nxv4i32(<vscale x 4 x i32> %va, i1 true, <vscale x 4 x i1> %m, i32 %evl)
4627 ret <vscale x 4 x i32> %v
4631 define <vscale x 8 x i32> @vp_cttz_zero_undef_nxv8i32(<vscale x 8 x i32> %va, <vscale x 8 x i1> %m, i32 zeroext %evl) {
4632 ; RV32-LABEL: vp_cttz_zero_undef_nxv8i32:
4634 ; RV32-NEXT: li a1, 1
4635 ; RV32-NEXT: vsetvli zero, a0, e32, m4, ta, ma
4636 ; RV32-NEXT: vsub.vx v12, v8, a1, v0.t
4637 ; RV32-NEXT: vnot.v v8, v8, v0.t
4638 ; RV32-NEXT: vand.vv v8, v8, v12, v0.t
4639 ; RV32-NEXT: vsrl.vi v12, v8, 1, v0.t
4640 ; RV32-NEXT: lui a0, 349525
4641 ; RV32-NEXT: addi a0, a0, 1365
4642 ; RV32-NEXT: vand.vx v12, v12, a0, v0.t
4643 ; RV32-NEXT: vsub.vv v8, v8, v12, v0.t
4644 ; RV32-NEXT: lui a0, 209715
4645 ; RV32-NEXT: addi a0, a0, 819
4646 ; RV32-NEXT: vand.vx v12, v8, a0, v0.t
4647 ; RV32-NEXT: vsrl.vi v8, v8, 2, v0.t
4648 ; RV32-NEXT: vand.vx v8, v8, a0, v0.t
4649 ; RV32-NEXT: vadd.vv v8, v12, v8, v0.t
4650 ; RV32-NEXT: vsrl.vi v12, v8, 4, v0.t
4651 ; RV32-NEXT: vadd.vv v8, v8, v12, v0.t
4652 ; RV32-NEXT: lui a0, 61681
4653 ; RV32-NEXT: addi a0, a0, -241
4654 ; RV32-NEXT: vand.vx v8, v8, a0, v0.t
4655 ; RV32-NEXT: lui a0, 4112
4656 ; RV32-NEXT: addi a0, a0, 257
4657 ; RV32-NEXT: vmul.vx v8, v8, a0, v0.t
4658 ; RV32-NEXT: vsrl.vi v8, v8, 24, v0.t
4661 ; RV64-LABEL: vp_cttz_zero_undef_nxv8i32:
4663 ; RV64-NEXT: li a1, 1
4664 ; RV64-NEXT: vsetvli zero, a0, e32, m4, ta, ma
4665 ; RV64-NEXT: vsub.vx v12, v8, a1, v0.t
4666 ; RV64-NEXT: vnot.v v8, v8, v0.t
4667 ; RV64-NEXT: vand.vv v8, v8, v12, v0.t
4668 ; RV64-NEXT: vsrl.vi v12, v8, 1, v0.t
4669 ; RV64-NEXT: lui a0, 349525
4670 ; RV64-NEXT: addiw a0, a0, 1365
4671 ; RV64-NEXT: vand.vx v12, v12, a0, v0.t
4672 ; RV64-NEXT: vsub.vv v8, v8, v12, v0.t
4673 ; RV64-NEXT: lui a0, 209715
4674 ; RV64-NEXT: addiw a0, a0, 819
4675 ; RV64-NEXT: vand.vx v12, v8, a0, v0.t
4676 ; RV64-NEXT: vsrl.vi v8, v8, 2, v0.t
4677 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
4678 ; RV64-NEXT: vadd.vv v8, v12, v8, v0.t
4679 ; RV64-NEXT: vsrl.vi v12, v8, 4, v0.t
4680 ; RV64-NEXT: vadd.vv v8, v8, v12, v0.t
4681 ; RV64-NEXT: lui a0, 61681
4682 ; RV64-NEXT: addiw a0, a0, -241
4683 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
4684 ; RV64-NEXT: lui a0, 4112
4685 ; RV64-NEXT: addiw a0, a0, 257
4686 ; RV64-NEXT: vmul.vx v8, v8, a0, v0.t
4687 ; RV64-NEXT: vsrl.vi v8, v8, 24, v0.t
4689 %v = call <vscale x 8 x i32> @llvm.vp.cttz.nxv8i32(<vscale x 8 x i32> %va, i1 true, <vscale x 8 x i1> %m, i32 %evl)
4690 ret <vscale x 8 x i32> %v
4693 define <vscale x 8 x i32> @vp_cttz_zero_undef_nxv8i32_unmasked(<vscale x 8 x i32> %va, i32 zeroext %evl) {
4694 ; RV32-LABEL: vp_cttz_zero_undef_nxv8i32_unmasked:
4696 ; RV32-NEXT: li a1, 1
4697 ; RV32-NEXT: vsetvli zero, a0, e32, m4, ta, ma
4698 ; RV32-NEXT: vsub.vx v12, v8, a1
4699 ; RV32-NEXT: vnot.v v8, v8
4700 ; RV32-NEXT: vand.vv v8, v8, v12
4701 ; RV32-NEXT: vsrl.vi v12, v8, 1
4702 ; RV32-NEXT: lui a0, 349525
4703 ; RV32-NEXT: addi a0, a0, 1365
4704 ; RV32-NEXT: vand.vx v12, v12, a0
4705 ; RV32-NEXT: vsub.vv v8, v8, v12
4706 ; RV32-NEXT: lui a0, 209715
4707 ; RV32-NEXT: addi a0, a0, 819
4708 ; RV32-NEXT: vand.vx v12, v8, a0
4709 ; RV32-NEXT: vsrl.vi v8, v8, 2
4710 ; RV32-NEXT: vand.vx v8, v8, a0
4711 ; RV32-NEXT: vadd.vv v8, v12, v8
4712 ; RV32-NEXT: vsrl.vi v12, v8, 4
4713 ; RV32-NEXT: vadd.vv v8, v8, v12
4714 ; RV32-NEXT: lui a0, 61681
4715 ; RV32-NEXT: addi a0, a0, -241
4716 ; RV32-NEXT: vand.vx v8, v8, a0
4717 ; RV32-NEXT: lui a0, 4112
4718 ; RV32-NEXT: addi a0, a0, 257
4719 ; RV32-NEXT: vmul.vx v8, v8, a0
4720 ; RV32-NEXT: vsrl.vi v8, v8, 24
4723 ; RV64-LABEL: vp_cttz_zero_undef_nxv8i32_unmasked:
4725 ; RV64-NEXT: li a1, 1
4726 ; RV64-NEXT: vsetvli zero, a0, e32, m4, ta, ma
4727 ; RV64-NEXT: vsub.vx v12, v8, a1
4728 ; RV64-NEXT: vnot.v v8, v8
4729 ; RV64-NEXT: vand.vv v8, v8, v12
4730 ; RV64-NEXT: vsrl.vi v12, v8, 1
4731 ; RV64-NEXT: lui a0, 349525
4732 ; RV64-NEXT: addiw a0, a0, 1365
4733 ; RV64-NEXT: vand.vx v12, v12, a0
4734 ; RV64-NEXT: vsub.vv v8, v8, v12
4735 ; RV64-NEXT: lui a0, 209715
4736 ; RV64-NEXT: addiw a0, a0, 819
4737 ; RV64-NEXT: vand.vx v12, v8, a0
4738 ; RV64-NEXT: vsrl.vi v8, v8, 2
4739 ; RV64-NEXT: vand.vx v8, v8, a0
4740 ; RV64-NEXT: vadd.vv v8, v12, v8
4741 ; RV64-NEXT: vsrl.vi v12, v8, 4
4742 ; RV64-NEXT: vadd.vv v8, v8, v12
4743 ; RV64-NEXT: lui a0, 61681
4744 ; RV64-NEXT: addiw a0, a0, -241
4745 ; RV64-NEXT: vand.vx v8, v8, a0
4746 ; RV64-NEXT: lui a0, 4112
4747 ; RV64-NEXT: addiw a0, a0, 257
4748 ; RV64-NEXT: vmul.vx v8, v8, a0
4749 ; RV64-NEXT: vsrl.vi v8, v8, 24
4751 %head = insertelement <vscale x 8 x i1> poison, i1 true, i32 0
4752 %m = shufflevector <vscale x 8 x i1> %head, <vscale x 8 x i1> poison, <vscale x 8 x i32> zeroinitializer
4753 %v = call <vscale x 8 x i32> @llvm.vp.cttz.nxv8i32(<vscale x 8 x i32> %va, i1 true, <vscale x 8 x i1> %m, i32 %evl)
4754 ret <vscale x 8 x i32> %v
4758 define <vscale x 16 x i32> @vp_cttz_zero_undef_nxv16i32(<vscale x 16 x i32> %va, <vscale x 16 x i1> %m, i32 zeroext %evl) {
4759 ; RV32-LABEL: vp_cttz_zero_undef_nxv16i32:
4761 ; RV32-NEXT: li a1, 1
4762 ; RV32-NEXT: vsetvli zero, a0, e32, m8, ta, ma
4763 ; RV32-NEXT: vsub.vx v16, v8, a1, v0.t
4764 ; RV32-NEXT: vnot.v v8, v8, v0.t
4765 ; RV32-NEXT: vand.vv v8, v8, v16, v0.t
4766 ; RV32-NEXT: vsrl.vi v16, v8, 1, v0.t
4767 ; RV32-NEXT: lui a0, 349525
4768 ; RV32-NEXT: addi a0, a0, 1365
4769 ; RV32-NEXT: vand.vx v16, v16, a0, v0.t
4770 ; RV32-NEXT: vsub.vv v8, v8, v16, v0.t
4771 ; RV32-NEXT: lui a0, 209715
4772 ; RV32-NEXT: addi a0, a0, 819
4773 ; RV32-NEXT: vand.vx v16, v8, a0, v0.t
4774 ; RV32-NEXT: vsrl.vi v8, v8, 2, v0.t
4775 ; RV32-NEXT: vand.vx v8, v8, a0, v0.t
4776 ; RV32-NEXT: vadd.vv v8, v16, v8, v0.t
4777 ; RV32-NEXT: vsrl.vi v16, v8, 4, v0.t
4778 ; RV32-NEXT: vadd.vv v8, v8, v16, v0.t
4779 ; RV32-NEXT: lui a0, 61681
4780 ; RV32-NEXT: addi a0, a0, -241
4781 ; RV32-NEXT: vand.vx v8, v8, a0, v0.t
4782 ; RV32-NEXT: lui a0, 4112
4783 ; RV32-NEXT: addi a0, a0, 257
4784 ; RV32-NEXT: vmul.vx v8, v8, a0, v0.t
4785 ; RV32-NEXT: vsrl.vi v8, v8, 24, v0.t
4788 ; RV64-LABEL: vp_cttz_zero_undef_nxv16i32:
4790 ; RV64-NEXT: li a1, 1
4791 ; RV64-NEXT: vsetvli zero, a0, e32, m8, ta, ma
4792 ; RV64-NEXT: vsub.vx v16, v8, a1, v0.t
4793 ; RV64-NEXT: vnot.v v8, v8, v0.t
4794 ; RV64-NEXT: vand.vv v8, v8, v16, v0.t
4795 ; RV64-NEXT: vsrl.vi v16, v8, 1, v0.t
4796 ; RV64-NEXT: lui a0, 349525
4797 ; RV64-NEXT: addiw a0, a0, 1365
4798 ; RV64-NEXT: vand.vx v16, v16, a0, v0.t
4799 ; RV64-NEXT: vsub.vv v8, v8, v16, v0.t
4800 ; RV64-NEXT: lui a0, 209715
4801 ; RV64-NEXT: addiw a0, a0, 819
4802 ; RV64-NEXT: vand.vx v16, v8, a0, v0.t
4803 ; RV64-NEXT: vsrl.vi v8, v8, 2, v0.t
4804 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
4805 ; RV64-NEXT: vadd.vv v8, v16, v8, v0.t
4806 ; RV64-NEXT: vsrl.vi v16, v8, 4, v0.t
4807 ; RV64-NEXT: vadd.vv v8, v8, v16, v0.t
4808 ; RV64-NEXT: lui a0, 61681
4809 ; RV64-NEXT: addiw a0, a0, -241
4810 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
4811 ; RV64-NEXT: lui a0, 4112
4812 ; RV64-NEXT: addiw a0, a0, 257
4813 ; RV64-NEXT: vmul.vx v8, v8, a0, v0.t
4814 ; RV64-NEXT: vsrl.vi v8, v8, 24, v0.t
4816 %v = call <vscale x 16 x i32> @llvm.vp.cttz.nxv16i32(<vscale x 16 x i32> %va, i1 true, <vscale x 16 x i1> %m, i32 %evl)
4817 ret <vscale x 16 x i32> %v
4820 define <vscale x 16 x i32> @vp_cttz_zero_undef_nxv16i32_unmasked(<vscale x 16 x i32> %va, i32 zeroext %evl) {
4821 ; RV32-LABEL: vp_cttz_zero_undef_nxv16i32_unmasked:
4823 ; RV32-NEXT: li a1, 1
4824 ; RV32-NEXT: vsetvli zero, a0, e32, m8, ta, ma
4825 ; RV32-NEXT: vsub.vx v16, v8, a1
4826 ; RV32-NEXT: vnot.v v8, v8
4827 ; RV32-NEXT: vand.vv v8, v8, v16
4828 ; RV32-NEXT: vsrl.vi v16, v8, 1
4829 ; RV32-NEXT: lui a0, 349525
4830 ; RV32-NEXT: addi a0, a0, 1365
4831 ; RV32-NEXT: vand.vx v16, v16, a0
4832 ; RV32-NEXT: vsub.vv v8, v8, v16
4833 ; RV32-NEXT: lui a0, 209715
4834 ; RV32-NEXT: addi a0, a0, 819
4835 ; RV32-NEXT: vand.vx v16, v8, a0
4836 ; RV32-NEXT: vsrl.vi v8, v8, 2
4837 ; RV32-NEXT: vand.vx v8, v8, a0
4838 ; RV32-NEXT: vadd.vv v8, v16, v8
4839 ; RV32-NEXT: vsrl.vi v16, v8, 4
4840 ; RV32-NEXT: vadd.vv v8, v8, v16
4841 ; RV32-NEXT: lui a0, 61681
4842 ; RV32-NEXT: addi a0, a0, -241
4843 ; RV32-NEXT: vand.vx v8, v8, a0
4844 ; RV32-NEXT: lui a0, 4112
4845 ; RV32-NEXT: addi a0, a0, 257
4846 ; RV32-NEXT: vmul.vx v8, v8, a0
4847 ; RV32-NEXT: vsrl.vi v8, v8, 24
4850 ; RV64-LABEL: vp_cttz_zero_undef_nxv16i32_unmasked:
4852 ; RV64-NEXT: li a1, 1
4853 ; RV64-NEXT: vsetvli zero, a0, e32, m8, ta, ma
4854 ; RV64-NEXT: vsub.vx v16, v8, a1
4855 ; RV64-NEXT: vnot.v v8, v8
4856 ; RV64-NEXT: vand.vv v8, v8, v16
4857 ; RV64-NEXT: vsrl.vi v16, v8, 1
4858 ; RV64-NEXT: lui a0, 349525
4859 ; RV64-NEXT: addiw a0, a0, 1365
4860 ; RV64-NEXT: vand.vx v16, v16, a0
4861 ; RV64-NEXT: vsub.vv v8, v8, v16
4862 ; RV64-NEXT: lui a0, 209715
4863 ; RV64-NEXT: addiw a0, a0, 819
4864 ; RV64-NEXT: vand.vx v16, v8, a0
4865 ; RV64-NEXT: vsrl.vi v8, v8, 2
4866 ; RV64-NEXT: vand.vx v8, v8, a0
4867 ; RV64-NEXT: vadd.vv v8, v16, v8
4868 ; RV64-NEXT: vsrl.vi v16, v8, 4
4869 ; RV64-NEXT: vadd.vv v8, v8, v16
4870 ; RV64-NEXT: lui a0, 61681
4871 ; RV64-NEXT: addiw a0, a0, -241
4872 ; RV64-NEXT: vand.vx v8, v8, a0
4873 ; RV64-NEXT: lui a0, 4112
4874 ; RV64-NEXT: addiw a0, a0, 257
4875 ; RV64-NEXT: vmul.vx v8, v8, a0
4876 ; RV64-NEXT: vsrl.vi v8, v8, 24
4878 %head = insertelement <vscale x 16 x i1> poison, i1 true, i32 0
4879 %m = shufflevector <vscale x 16 x i1> %head, <vscale x 16 x i1> poison, <vscale x 16 x i32> zeroinitializer
4880 %v = call <vscale x 16 x i32> @llvm.vp.cttz.nxv16i32(<vscale x 16 x i32> %va, i1 true, <vscale x 16 x i1> %m, i32 %evl)
4881 ret <vscale x 16 x i32> %v
4885 define <vscale x 1 x i64> @vp_cttz_zero_undef_nxv1i64(<vscale x 1 x i64> %va, <vscale x 1 x i1> %m, i32 zeroext %evl) {
4886 ; RV32-LABEL: vp_cttz_zero_undef_nxv1i64:
4888 ; RV32-NEXT: addi sp, sp, -16
4889 ; RV32-NEXT: .cfi_def_cfa_offset 16
4890 ; RV32-NEXT: lui a1, 349525
4891 ; RV32-NEXT: addi a1, a1, 1365
4892 ; RV32-NEXT: sw a1, 12(sp)
4893 ; RV32-NEXT: sw a1, 8(sp)
4894 ; RV32-NEXT: lui a1, 209715
4895 ; RV32-NEXT: addi a1, a1, 819
4896 ; RV32-NEXT: sw a1, 12(sp)
4897 ; RV32-NEXT: sw a1, 8(sp)
4898 ; RV32-NEXT: lui a1, 61681
4899 ; RV32-NEXT: addi a1, a1, -241
4900 ; RV32-NEXT: sw a1, 12(sp)
4901 ; RV32-NEXT: sw a1, 8(sp)
4902 ; RV32-NEXT: lui a1, 4112
4903 ; RV32-NEXT: addi a1, a1, 257
4904 ; RV32-NEXT: sw a1, 12(sp)
4905 ; RV32-NEXT: sw a1, 8(sp)
4906 ; RV32-NEXT: li a1, 1
4907 ; RV32-NEXT: vsetvli zero, a0, e64, m1, ta, ma
4908 ; RV32-NEXT: vsub.vx v9, v8, a1, v0.t
4909 ; RV32-NEXT: vnot.v v8, v8, v0.t
4910 ; RV32-NEXT: vand.vv v8, v8, v9, v0.t
4911 ; RV32-NEXT: vsrl.vi v9, v8, 1, v0.t
4912 ; RV32-NEXT: addi a1, sp, 8
4913 ; RV32-NEXT: vsetvli a2, zero, e64, m1, ta, ma
4914 ; RV32-NEXT: vlse64.v v10, (a1), zero
4915 ; RV32-NEXT: vsetvli zero, a0, e64, m1, ta, ma
4916 ; RV32-NEXT: vand.vv v9, v9, v10, v0.t
4917 ; RV32-NEXT: vsub.vv v8, v8, v9, v0.t
4918 ; RV32-NEXT: vsetvli a2, zero, e64, m1, ta, ma
4919 ; RV32-NEXT: vlse64.v v9, (a1), zero
4920 ; RV32-NEXT: vsetvli zero, a0, e64, m1, ta, ma
4921 ; RV32-NEXT: vand.vv v10, v8, v9, v0.t
4922 ; RV32-NEXT: vsrl.vi v8, v8, 2, v0.t
4923 ; RV32-NEXT: vand.vv v8, v8, v9, v0.t
4924 ; RV32-NEXT: vadd.vv v8, v10, v8, v0.t
4925 ; RV32-NEXT: vsrl.vi v9, v8, 4, v0.t
4926 ; RV32-NEXT: vadd.vv v8, v8, v9, v0.t
4927 ; RV32-NEXT: vsetvli a2, zero, e64, m1, ta, ma
4928 ; RV32-NEXT: vlse64.v v9, (a1), zero
4929 ; RV32-NEXT: vsetvli zero, a0, e64, m1, ta, ma
4930 ; RV32-NEXT: vand.vv v8, v8, v9, v0.t
4931 ; RV32-NEXT: vsetvli a2, zero, e64, m1, ta, ma
4932 ; RV32-NEXT: vlse64.v v9, (a1), zero
4933 ; RV32-NEXT: vsetvli zero, a0, e64, m1, ta, ma
4934 ; RV32-NEXT: vmul.vv v8, v8, v9, v0.t
4935 ; RV32-NEXT: li a0, 56
4936 ; RV32-NEXT: vsrl.vx v8, v8, a0, v0.t
4937 ; RV32-NEXT: addi sp, sp, 16
4940 ; RV64-LABEL: vp_cttz_zero_undef_nxv1i64:
4942 ; RV64-NEXT: li a1, 1
4943 ; RV64-NEXT: vsetvli zero, a0, e64, m1, ta, ma
4944 ; RV64-NEXT: vsub.vx v9, v8, a1, v0.t
4945 ; RV64-NEXT: vnot.v v8, v8, v0.t
4946 ; RV64-NEXT: vand.vv v8, v8, v9, v0.t
4947 ; RV64-NEXT: lui a0, %hi(.LCPI84_0)
4948 ; RV64-NEXT: ld a0, %lo(.LCPI84_0)(a0)
4949 ; RV64-NEXT: lui a1, %hi(.LCPI84_1)
4950 ; RV64-NEXT: ld a1, %lo(.LCPI84_1)(a1)
4951 ; RV64-NEXT: vsrl.vi v9, v8, 1, v0.t
4952 ; RV64-NEXT: vand.vx v9, v9, a0, v0.t
4953 ; RV64-NEXT: vsub.vv v8, v8, v9, v0.t
4954 ; RV64-NEXT: vand.vx v9, v8, a1, v0.t
4955 ; RV64-NEXT: vsrl.vi v8, v8, 2, v0.t
4956 ; RV64-NEXT: vand.vx v8, v8, a1, v0.t
4957 ; RV64-NEXT: vadd.vv v8, v9, v8, v0.t
4958 ; RV64-NEXT: lui a0, %hi(.LCPI84_2)
4959 ; RV64-NEXT: ld a0, %lo(.LCPI84_2)(a0)
4960 ; RV64-NEXT: lui a1, %hi(.LCPI84_3)
4961 ; RV64-NEXT: ld a1, %lo(.LCPI84_3)(a1)
4962 ; RV64-NEXT: vsrl.vi v9, v8, 4, v0.t
4963 ; RV64-NEXT: vadd.vv v8, v8, v9, v0.t
4964 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
4965 ; RV64-NEXT: vmul.vx v8, v8, a1, v0.t
4966 ; RV64-NEXT: li a0, 56
4967 ; RV64-NEXT: vsrl.vx v8, v8, a0, v0.t
4969 %v = call <vscale x 1 x i64> @llvm.vp.cttz.nxv1i64(<vscale x 1 x i64> %va, i1 true, <vscale x 1 x i1> %m, i32 %evl)
4970 ret <vscale x 1 x i64> %v
4973 define <vscale x 1 x i64> @vp_cttz_zero_undef_nxv1i64_unmasked(<vscale x 1 x i64> %va, i32 zeroext %evl) {
4974 ; RV32-LABEL: vp_cttz_zero_undef_nxv1i64_unmasked:
4976 ; RV32-NEXT: addi sp, sp, -16
4977 ; RV32-NEXT: .cfi_def_cfa_offset 16
4978 ; RV32-NEXT: lui a1, 349525
4979 ; RV32-NEXT: addi a1, a1, 1365
4980 ; RV32-NEXT: sw a1, 12(sp)
4981 ; RV32-NEXT: sw a1, 8(sp)
4982 ; RV32-NEXT: lui a1, 209715
4983 ; RV32-NEXT: addi a1, a1, 819
4984 ; RV32-NEXT: sw a1, 12(sp)
4985 ; RV32-NEXT: sw a1, 8(sp)
4986 ; RV32-NEXT: lui a1, 61681
4987 ; RV32-NEXT: addi a1, a1, -241
4988 ; RV32-NEXT: sw a1, 12(sp)
4989 ; RV32-NEXT: sw a1, 8(sp)
4990 ; RV32-NEXT: lui a1, 4112
4991 ; RV32-NEXT: addi a1, a1, 257
4992 ; RV32-NEXT: sw a1, 12(sp)
4993 ; RV32-NEXT: sw a1, 8(sp)
4994 ; RV32-NEXT: li a1, 1
4995 ; RV32-NEXT: vsetvli zero, a0, e64, m1, ta, ma
4996 ; RV32-NEXT: vsub.vx v9, v8, a1
4997 ; RV32-NEXT: vnot.v v8, v8
4998 ; RV32-NEXT: vand.vv v8, v8, v9
4999 ; RV32-NEXT: vsrl.vi v9, v8, 1
5000 ; RV32-NEXT: addi a1, sp, 8
5001 ; RV32-NEXT: vsetvli a2, zero, e64, m1, ta, ma
5002 ; RV32-NEXT: vlse64.v v10, (a1), zero
5003 ; RV32-NEXT: vsetvli zero, a0, e64, m1, ta, ma
5004 ; RV32-NEXT: vand.vv v9, v9, v10
5005 ; RV32-NEXT: vsub.vv v8, v8, v9
5006 ; RV32-NEXT: vsetvli a2, zero, e64, m1, ta, ma
5007 ; RV32-NEXT: vlse64.v v9, (a1), zero
5008 ; RV32-NEXT: vsetvli zero, a0, e64, m1, ta, ma
5009 ; RV32-NEXT: vand.vv v10, v8, v9
5010 ; RV32-NEXT: vsrl.vi v8, v8, 2
5011 ; RV32-NEXT: vand.vv v8, v8, v9
5012 ; RV32-NEXT: vadd.vv v8, v10, v8
5013 ; RV32-NEXT: vsrl.vi v9, v8, 4
5014 ; RV32-NEXT: vadd.vv v8, v8, v9
5015 ; RV32-NEXT: vsetvli a2, zero, e64, m1, ta, ma
5016 ; RV32-NEXT: vlse64.v v9, (a1), zero
5017 ; RV32-NEXT: vsetvli zero, a0, e64, m1, ta, ma
5018 ; RV32-NEXT: vand.vv v8, v8, v9
5019 ; RV32-NEXT: vsetvli a2, zero, e64, m1, ta, ma
5020 ; RV32-NEXT: vlse64.v v9, (a1), zero
5021 ; RV32-NEXT: vsetvli zero, a0, e64, m1, ta, ma
5022 ; RV32-NEXT: vmul.vv v8, v8, v9
5023 ; RV32-NEXT: li a0, 56
5024 ; RV32-NEXT: vsrl.vx v8, v8, a0
5025 ; RV32-NEXT: addi sp, sp, 16
5028 ; RV64-LABEL: vp_cttz_zero_undef_nxv1i64_unmasked:
5030 ; RV64-NEXT: li a1, 1
5031 ; RV64-NEXT: vsetvli zero, a0, e64, m1, ta, ma
5032 ; RV64-NEXT: vsub.vx v9, v8, a1
5033 ; RV64-NEXT: vnot.v v8, v8
5034 ; RV64-NEXT: vand.vv v8, v8, v9
5035 ; RV64-NEXT: lui a0, %hi(.LCPI85_0)
5036 ; RV64-NEXT: ld a0, %lo(.LCPI85_0)(a0)
5037 ; RV64-NEXT: lui a1, %hi(.LCPI85_1)
5038 ; RV64-NEXT: ld a1, %lo(.LCPI85_1)(a1)
5039 ; RV64-NEXT: vsrl.vi v9, v8, 1
5040 ; RV64-NEXT: vand.vx v9, v9, a0
5041 ; RV64-NEXT: vsub.vv v8, v8, v9
5042 ; RV64-NEXT: vand.vx v9, v8, a1
5043 ; RV64-NEXT: vsrl.vi v8, v8, 2
5044 ; RV64-NEXT: vand.vx v8, v8, a1
5045 ; RV64-NEXT: vadd.vv v8, v9, v8
5046 ; RV64-NEXT: lui a0, %hi(.LCPI85_2)
5047 ; RV64-NEXT: ld a0, %lo(.LCPI85_2)(a0)
5048 ; RV64-NEXT: lui a1, %hi(.LCPI85_3)
5049 ; RV64-NEXT: ld a1, %lo(.LCPI85_3)(a1)
5050 ; RV64-NEXT: vsrl.vi v9, v8, 4
5051 ; RV64-NEXT: vadd.vv v8, v8, v9
5052 ; RV64-NEXT: vand.vx v8, v8, a0
5053 ; RV64-NEXT: vmul.vx v8, v8, a1
5054 ; RV64-NEXT: li a0, 56
5055 ; RV64-NEXT: vsrl.vx v8, v8, a0
5057 %head = insertelement <vscale x 1 x i1> poison, i1 true, i32 0
5058 %m = shufflevector <vscale x 1 x i1> %head, <vscale x 1 x i1> poison, <vscale x 1 x i32> zeroinitializer
5059 %v = call <vscale x 1 x i64> @llvm.vp.cttz.nxv1i64(<vscale x 1 x i64> %va, i1 true, <vscale x 1 x i1> %m, i32 %evl)
5060 ret <vscale x 1 x i64> %v
5064 define <vscale x 2 x i64> @vp_cttz_zero_undef_nxv2i64(<vscale x 2 x i64> %va, <vscale x 2 x i1> %m, i32 zeroext %evl) {
5065 ; RV32-LABEL: vp_cttz_zero_undef_nxv2i64:
5067 ; RV32-NEXT: addi sp, sp, -16
5068 ; RV32-NEXT: .cfi_def_cfa_offset 16
5069 ; RV32-NEXT: lui a1, 349525
5070 ; RV32-NEXT: addi a1, a1, 1365
5071 ; RV32-NEXT: sw a1, 12(sp)
5072 ; RV32-NEXT: sw a1, 8(sp)
5073 ; RV32-NEXT: lui a1, 209715
5074 ; RV32-NEXT: addi a1, a1, 819
5075 ; RV32-NEXT: sw a1, 12(sp)
5076 ; RV32-NEXT: sw a1, 8(sp)
5077 ; RV32-NEXT: lui a1, 61681
5078 ; RV32-NEXT: addi a1, a1, -241
5079 ; RV32-NEXT: sw a1, 12(sp)
5080 ; RV32-NEXT: sw a1, 8(sp)
5081 ; RV32-NEXT: lui a1, 4112
5082 ; RV32-NEXT: addi a1, a1, 257
5083 ; RV32-NEXT: sw a1, 12(sp)
5084 ; RV32-NEXT: sw a1, 8(sp)
5085 ; RV32-NEXT: li a1, 1
5086 ; RV32-NEXT: vsetvli zero, a0, e64, m2, ta, ma
5087 ; RV32-NEXT: vsub.vx v10, v8, a1, v0.t
5088 ; RV32-NEXT: vnot.v v8, v8, v0.t
5089 ; RV32-NEXT: vand.vv v8, v8, v10, v0.t
5090 ; RV32-NEXT: vsrl.vi v10, v8, 1, v0.t
5091 ; RV32-NEXT: addi a1, sp, 8
5092 ; RV32-NEXT: vsetvli a2, zero, e64, m2, ta, ma
5093 ; RV32-NEXT: vlse64.v v12, (a1), zero
5094 ; RV32-NEXT: vsetvli zero, a0, e64, m2, ta, ma
5095 ; RV32-NEXT: vand.vv v10, v10, v12, v0.t
5096 ; RV32-NEXT: vsub.vv v8, v8, v10, v0.t
5097 ; RV32-NEXT: vsetvli a2, zero, e64, m2, ta, ma
5098 ; RV32-NEXT: vlse64.v v10, (a1), zero
5099 ; RV32-NEXT: vsetvli zero, a0, e64, m2, ta, ma
5100 ; RV32-NEXT: vand.vv v12, v8, v10, v0.t
5101 ; RV32-NEXT: vsrl.vi v8, v8, 2, v0.t
5102 ; RV32-NEXT: vand.vv v8, v8, v10, v0.t
5103 ; RV32-NEXT: vadd.vv v8, v12, v8, v0.t
5104 ; RV32-NEXT: vsrl.vi v10, v8, 4, v0.t
5105 ; RV32-NEXT: vadd.vv v8, v8, v10, v0.t
5106 ; RV32-NEXT: vsetvli a2, zero, e64, m2, ta, ma
5107 ; RV32-NEXT: vlse64.v v10, (a1), zero
5108 ; RV32-NEXT: vsetvli zero, a0, e64, m2, ta, ma
5109 ; RV32-NEXT: vand.vv v8, v8, v10, v0.t
5110 ; RV32-NEXT: vsetvli a2, zero, e64, m2, ta, ma
5111 ; RV32-NEXT: vlse64.v v10, (a1), zero
5112 ; RV32-NEXT: vsetvli zero, a0, e64, m2, ta, ma
5113 ; RV32-NEXT: vmul.vv v8, v8, v10, v0.t
5114 ; RV32-NEXT: li a0, 56
5115 ; RV32-NEXT: vsrl.vx v8, v8, a0, v0.t
5116 ; RV32-NEXT: addi sp, sp, 16
5119 ; RV64-LABEL: vp_cttz_zero_undef_nxv2i64:
5121 ; RV64-NEXT: li a1, 1
5122 ; RV64-NEXT: vsetvli zero, a0, e64, m2, ta, ma
5123 ; RV64-NEXT: vsub.vx v10, v8, a1, v0.t
5124 ; RV64-NEXT: vnot.v v8, v8, v0.t
5125 ; RV64-NEXT: vand.vv v8, v8, v10, v0.t
5126 ; RV64-NEXT: lui a0, %hi(.LCPI86_0)
5127 ; RV64-NEXT: ld a0, %lo(.LCPI86_0)(a0)
5128 ; RV64-NEXT: lui a1, %hi(.LCPI86_1)
5129 ; RV64-NEXT: ld a1, %lo(.LCPI86_1)(a1)
5130 ; RV64-NEXT: vsrl.vi v10, v8, 1, v0.t
5131 ; RV64-NEXT: vand.vx v10, v10, a0, v0.t
5132 ; RV64-NEXT: vsub.vv v8, v8, v10, v0.t
5133 ; RV64-NEXT: vand.vx v10, v8, a1, v0.t
5134 ; RV64-NEXT: vsrl.vi v8, v8, 2, v0.t
5135 ; RV64-NEXT: vand.vx v8, v8, a1, v0.t
5136 ; RV64-NEXT: vadd.vv v8, v10, v8, v0.t
5137 ; RV64-NEXT: lui a0, %hi(.LCPI86_2)
5138 ; RV64-NEXT: ld a0, %lo(.LCPI86_2)(a0)
5139 ; RV64-NEXT: lui a1, %hi(.LCPI86_3)
5140 ; RV64-NEXT: ld a1, %lo(.LCPI86_3)(a1)
5141 ; RV64-NEXT: vsrl.vi v10, v8, 4, v0.t
5142 ; RV64-NEXT: vadd.vv v8, v8, v10, v0.t
5143 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
5144 ; RV64-NEXT: vmul.vx v8, v8, a1, v0.t
5145 ; RV64-NEXT: li a0, 56
5146 ; RV64-NEXT: vsrl.vx v8, v8, a0, v0.t
5148 %v = call <vscale x 2 x i64> @llvm.vp.cttz.nxv2i64(<vscale x 2 x i64> %va, i1 true, <vscale x 2 x i1> %m, i32 %evl)
5149 ret <vscale x 2 x i64> %v
5152 define <vscale x 2 x i64> @vp_cttz_zero_undef_nxv2i64_unmasked(<vscale x 2 x i64> %va, i32 zeroext %evl) {
5153 ; RV32-LABEL: vp_cttz_zero_undef_nxv2i64_unmasked:
5155 ; RV32-NEXT: addi sp, sp, -16
5156 ; RV32-NEXT: .cfi_def_cfa_offset 16
5157 ; RV32-NEXT: lui a1, 349525
5158 ; RV32-NEXT: addi a1, a1, 1365
5159 ; RV32-NEXT: sw a1, 12(sp)
5160 ; RV32-NEXT: sw a1, 8(sp)
5161 ; RV32-NEXT: lui a1, 209715
5162 ; RV32-NEXT: addi a1, a1, 819
5163 ; RV32-NEXT: sw a1, 12(sp)
5164 ; RV32-NEXT: sw a1, 8(sp)
5165 ; RV32-NEXT: lui a1, 61681
5166 ; RV32-NEXT: addi a1, a1, -241
5167 ; RV32-NEXT: sw a1, 12(sp)
5168 ; RV32-NEXT: sw a1, 8(sp)
5169 ; RV32-NEXT: lui a1, 4112
5170 ; RV32-NEXT: addi a1, a1, 257
5171 ; RV32-NEXT: sw a1, 12(sp)
5172 ; RV32-NEXT: sw a1, 8(sp)
5173 ; RV32-NEXT: li a1, 1
5174 ; RV32-NEXT: vsetvli zero, a0, e64, m2, ta, ma
5175 ; RV32-NEXT: vsub.vx v10, v8, a1
5176 ; RV32-NEXT: vnot.v v8, v8
5177 ; RV32-NEXT: vand.vv v8, v8, v10
5178 ; RV32-NEXT: vsrl.vi v10, v8, 1
5179 ; RV32-NEXT: addi a1, sp, 8
5180 ; RV32-NEXT: vsetvli a2, zero, e64, m2, ta, ma
5181 ; RV32-NEXT: vlse64.v v12, (a1), zero
5182 ; RV32-NEXT: vsetvli zero, a0, e64, m2, ta, ma
5183 ; RV32-NEXT: vand.vv v10, v10, v12
5184 ; RV32-NEXT: vsub.vv v8, v8, v10
5185 ; RV32-NEXT: vsetvli a2, zero, e64, m2, ta, ma
5186 ; RV32-NEXT: vlse64.v v10, (a1), zero
5187 ; RV32-NEXT: vsetvli zero, a0, e64, m2, ta, ma
5188 ; RV32-NEXT: vand.vv v12, v8, v10
5189 ; RV32-NEXT: vsrl.vi v8, v8, 2
5190 ; RV32-NEXT: vand.vv v8, v8, v10
5191 ; RV32-NEXT: vadd.vv v8, v12, v8
5192 ; RV32-NEXT: vsrl.vi v10, v8, 4
5193 ; RV32-NEXT: vadd.vv v8, v8, v10
5194 ; RV32-NEXT: vsetvli a2, zero, e64, m2, ta, ma
5195 ; RV32-NEXT: vlse64.v v10, (a1), zero
5196 ; RV32-NEXT: vsetvli zero, a0, e64, m2, ta, ma
5197 ; RV32-NEXT: vand.vv v8, v8, v10
5198 ; RV32-NEXT: vsetvli a2, zero, e64, m2, ta, ma
5199 ; RV32-NEXT: vlse64.v v10, (a1), zero
5200 ; RV32-NEXT: vsetvli zero, a0, e64, m2, ta, ma
5201 ; RV32-NEXT: vmul.vv v8, v8, v10
5202 ; RV32-NEXT: li a0, 56
5203 ; RV32-NEXT: vsrl.vx v8, v8, a0
5204 ; RV32-NEXT: addi sp, sp, 16
5207 ; RV64-LABEL: vp_cttz_zero_undef_nxv2i64_unmasked:
5209 ; RV64-NEXT: li a1, 1
5210 ; RV64-NEXT: vsetvli zero, a0, e64, m2, ta, ma
5211 ; RV64-NEXT: vsub.vx v10, v8, a1
5212 ; RV64-NEXT: vnot.v v8, v8
5213 ; RV64-NEXT: vand.vv v8, v8, v10
5214 ; RV64-NEXT: lui a0, %hi(.LCPI87_0)
5215 ; RV64-NEXT: ld a0, %lo(.LCPI87_0)(a0)
5216 ; RV64-NEXT: lui a1, %hi(.LCPI87_1)
5217 ; RV64-NEXT: ld a1, %lo(.LCPI87_1)(a1)
5218 ; RV64-NEXT: vsrl.vi v10, v8, 1
5219 ; RV64-NEXT: vand.vx v10, v10, a0
5220 ; RV64-NEXT: vsub.vv v8, v8, v10
5221 ; RV64-NEXT: vand.vx v10, v8, a1
5222 ; RV64-NEXT: vsrl.vi v8, v8, 2
5223 ; RV64-NEXT: vand.vx v8, v8, a1
5224 ; RV64-NEXT: vadd.vv v8, v10, v8
5225 ; RV64-NEXT: lui a0, %hi(.LCPI87_2)
5226 ; RV64-NEXT: ld a0, %lo(.LCPI87_2)(a0)
5227 ; RV64-NEXT: lui a1, %hi(.LCPI87_3)
5228 ; RV64-NEXT: ld a1, %lo(.LCPI87_3)(a1)
5229 ; RV64-NEXT: vsrl.vi v10, v8, 4
5230 ; RV64-NEXT: vadd.vv v8, v8, v10
5231 ; RV64-NEXT: vand.vx v8, v8, a0
5232 ; RV64-NEXT: vmul.vx v8, v8, a1
5233 ; RV64-NEXT: li a0, 56
5234 ; RV64-NEXT: vsrl.vx v8, v8, a0
5236 %head = insertelement <vscale x 2 x i1> poison, i1 true, i32 0
5237 %m = shufflevector <vscale x 2 x i1> %head, <vscale x 2 x i1> poison, <vscale x 2 x i32> zeroinitializer
5238 %v = call <vscale x 2 x i64> @llvm.vp.cttz.nxv2i64(<vscale x 2 x i64> %va, i1 true, <vscale x 2 x i1> %m, i32 %evl)
5239 ret <vscale x 2 x i64> %v
5243 define <vscale x 4 x i64> @vp_cttz_zero_undef_nxv4i64(<vscale x 4 x i64> %va, <vscale x 4 x i1> %m, i32 zeroext %evl) {
5244 ; RV32-LABEL: vp_cttz_zero_undef_nxv4i64:
5246 ; RV32-NEXT: addi sp, sp, -16
5247 ; RV32-NEXT: .cfi_def_cfa_offset 16
5248 ; RV32-NEXT: lui a1, 349525
5249 ; RV32-NEXT: addi a1, a1, 1365
5250 ; RV32-NEXT: sw a1, 12(sp)
5251 ; RV32-NEXT: sw a1, 8(sp)
5252 ; RV32-NEXT: lui a1, 209715
5253 ; RV32-NEXT: addi a1, a1, 819
5254 ; RV32-NEXT: sw a1, 12(sp)
5255 ; RV32-NEXT: sw a1, 8(sp)
5256 ; RV32-NEXT: lui a1, 61681
5257 ; RV32-NEXT: addi a1, a1, -241
5258 ; RV32-NEXT: sw a1, 12(sp)
5259 ; RV32-NEXT: sw a1, 8(sp)
5260 ; RV32-NEXT: lui a1, 4112
5261 ; RV32-NEXT: addi a1, a1, 257
5262 ; RV32-NEXT: sw a1, 12(sp)
5263 ; RV32-NEXT: sw a1, 8(sp)
5264 ; RV32-NEXT: li a1, 1
5265 ; RV32-NEXT: vsetvli zero, a0, e64, m4, ta, ma
5266 ; RV32-NEXT: vsub.vx v12, v8, a1, v0.t
5267 ; RV32-NEXT: vnot.v v8, v8, v0.t
5268 ; RV32-NEXT: vand.vv v8, v8, v12, v0.t
5269 ; RV32-NEXT: vsrl.vi v12, v8, 1, v0.t
5270 ; RV32-NEXT: addi a1, sp, 8
5271 ; RV32-NEXT: vsetvli a2, zero, e64, m4, ta, ma
5272 ; RV32-NEXT: vlse64.v v16, (a1), zero
5273 ; RV32-NEXT: vsetvli zero, a0, e64, m4, ta, ma
5274 ; RV32-NEXT: vand.vv v12, v12, v16, v0.t
5275 ; RV32-NEXT: vsub.vv v8, v8, v12, v0.t
5276 ; RV32-NEXT: vsetvli a2, zero, e64, m4, ta, ma
5277 ; RV32-NEXT: vlse64.v v12, (a1), zero
5278 ; RV32-NEXT: vsetvli zero, a0, e64, m4, ta, ma
5279 ; RV32-NEXT: vand.vv v16, v8, v12, v0.t
5280 ; RV32-NEXT: vsrl.vi v8, v8, 2, v0.t
5281 ; RV32-NEXT: vand.vv v8, v8, v12, v0.t
5282 ; RV32-NEXT: vadd.vv v8, v16, v8, v0.t
5283 ; RV32-NEXT: vsrl.vi v12, v8, 4, v0.t
5284 ; RV32-NEXT: vadd.vv v8, v8, v12, v0.t
5285 ; RV32-NEXT: vsetvli a2, zero, e64, m4, ta, ma
5286 ; RV32-NEXT: vlse64.v v12, (a1), zero
5287 ; RV32-NEXT: vsetvli zero, a0, e64, m4, ta, ma
5288 ; RV32-NEXT: vand.vv v8, v8, v12, v0.t
5289 ; RV32-NEXT: vsetvli a2, zero, e64, m4, ta, ma
5290 ; RV32-NEXT: vlse64.v v12, (a1), zero
5291 ; RV32-NEXT: vsetvli zero, a0, e64, m4, ta, ma
5292 ; RV32-NEXT: vmul.vv v8, v8, v12, v0.t
5293 ; RV32-NEXT: li a0, 56
5294 ; RV32-NEXT: vsrl.vx v8, v8, a0, v0.t
5295 ; RV32-NEXT: addi sp, sp, 16
5298 ; RV64-LABEL: vp_cttz_zero_undef_nxv4i64:
5300 ; RV64-NEXT: li a1, 1
5301 ; RV64-NEXT: vsetvli zero, a0, e64, m4, ta, ma
5302 ; RV64-NEXT: vsub.vx v12, v8, a1, v0.t
5303 ; RV64-NEXT: vnot.v v8, v8, v0.t
5304 ; RV64-NEXT: vand.vv v8, v8, v12, v0.t
5305 ; RV64-NEXT: lui a0, %hi(.LCPI88_0)
5306 ; RV64-NEXT: ld a0, %lo(.LCPI88_0)(a0)
5307 ; RV64-NEXT: lui a1, %hi(.LCPI88_1)
5308 ; RV64-NEXT: ld a1, %lo(.LCPI88_1)(a1)
5309 ; RV64-NEXT: vsrl.vi v12, v8, 1, v0.t
5310 ; RV64-NEXT: vand.vx v12, v12, a0, v0.t
5311 ; RV64-NEXT: vsub.vv v8, v8, v12, v0.t
5312 ; RV64-NEXT: vand.vx v12, v8, a1, v0.t
5313 ; RV64-NEXT: vsrl.vi v8, v8, 2, v0.t
5314 ; RV64-NEXT: vand.vx v8, v8, a1, v0.t
5315 ; RV64-NEXT: vadd.vv v8, v12, v8, v0.t
5316 ; RV64-NEXT: lui a0, %hi(.LCPI88_2)
5317 ; RV64-NEXT: ld a0, %lo(.LCPI88_2)(a0)
5318 ; RV64-NEXT: lui a1, %hi(.LCPI88_3)
5319 ; RV64-NEXT: ld a1, %lo(.LCPI88_3)(a1)
5320 ; RV64-NEXT: vsrl.vi v12, v8, 4, v0.t
5321 ; RV64-NEXT: vadd.vv v8, v8, v12, v0.t
5322 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
5323 ; RV64-NEXT: vmul.vx v8, v8, a1, v0.t
5324 ; RV64-NEXT: li a0, 56
5325 ; RV64-NEXT: vsrl.vx v8, v8, a0, v0.t
5327 %v = call <vscale x 4 x i64> @llvm.vp.cttz.nxv4i64(<vscale x 4 x i64> %va, i1 true, <vscale x 4 x i1> %m, i32 %evl)
5328 ret <vscale x 4 x i64> %v
5331 define <vscale x 4 x i64> @vp_cttz_zero_undef_nxv4i64_unmasked(<vscale x 4 x i64> %va, i32 zeroext %evl) {
5332 ; RV32-LABEL: vp_cttz_zero_undef_nxv4i64_unmasked:
5334 ; RV32-NEXT: addi sp, sp, -16
5335 ; RV32-NEXT: .cfi_def_cfa_offset 16
5336 ; RV32-NEXT: lui a1, 349525
5337 ; RV32-NEXT: addi a1, a1, 1365
5338 ; RV32-NEXT: sw a1, 12(sp)
5339 ; RV32-NEXT: sw a1, 8(sp)
5340 ; RV32-NEXT: lui a1, 209715
5341 ; RV32-NEXT: addi a1, a1, 819
5342 ; RV32-NEXT: sw a1, 12(sp)
5343 ; RV32-NEXT: sw a1, 8(sp)
5344 ; RV32-NEXT: lui a1, 61681
5345 ; RV32-NEXT: addi a1, a1, -241
5346 ; RV32-NEXT: sw a1, 12(sp)
5347 ; RV32-NEXT: sw a1, 8(sp)
5348 ; RV32-NEXT: lui a1, 4112
5349 ; RV32-NEXT: addi a1, a1, 257
5350 ; RV32-NEXT: sw a1, 12(sp)
5351 ; RV32-NEXT: sw a1, 8(sp)
5352 ; RV32-NEXT: li a1, 1
5353 ; RV32-NEXT: vsetvli zero, a0, e64, m4, ta, ma
5354 ; RV32-NEXT: vsub.vx v12, v8, a1
5355 ; RV32-NEXT: vnot.v v8, v8
5356 ; RV32-NEXT: vand.vv v8, v8, v12
5357 ; RV32-NEXT: vsrl.vi v12, v8, 1
5358 ; RV32-NEXT: addi a1, sp, 8
5359 ; RV32-NEXT: vsetvli a2, zero, e64, m4, ta, ma
5360 ; RV32-NEXT: vlse64.v v16, (a1), zero
5361 ; RV32-NEXT: vsetvli zero, a0, e64, m4, ta, ma
5362 ; RV32-NEXT: vand.vv v12, v12, v16
5363 ; RV32-NEXT: vsub.vv v8, v8, v12
5364 ; RV32-NEXT: vsetvli a2, zero, e64, m4, ta, ma
5365 ; RV32-NEXT: vlse64.v v12, (a1), zero
5366 ; RV32-NEXT: vsetvli zero, a0, e64, m4, ta, ma
5367 ; RV32-NEXT: vand.vv v16, v8, v12
5368 ; RV32-NEXT: vsrl.vi v8, v8, 2
5369 ; RV32-NEXT: vand.vv v8, v8, v12
5370 ; RV32-NEXT: vadd.vv v8, v16, v8
5371 ; RV32-NEXT: vsrl.vi v12, v8, 4
5372 ; RV32-NEXT: vadd.vv v8, v8, v12
5373 ; RV32-NEXT: vsetvli a2, zero, e64, m4, ta, ma
5374 ; RV32-NEXT: vlse64.v v12, (a1), zero
5375 ; RV32-NEXT: vsetvli zero, a0, e64, m4, ta, ma
5376 ; RV32-NEXT: vand.vv v8, v8, v12
5377 ; RV32-NEXT: vsetvli a2, zero, e64, m4, ta, ma
5378 ; RV32-NEXT: vlse64.v v12, (a1), zero
5379 ; RV32-NEXT: vsetvli zero, a0, e64, m4, ta, ma
5380 ; RV32-NEXT: vmul.vv v8, v8, v12
5381 ; RV32-NEXT: li a0, 56
5382 ; RV32-NEXT: vsrl.vx v8, v8, a0
5383 ; RV32-NEXT: addi sp, sp, 16
5386 ; RV64-LABEL: vp_cttz_zero_undef_nxv4i64_unmasked:
5388 ; RV64-NEXT: li a1, 1
5389 ; RV64-NEXT: vsetvli zero, a0, e64, m4, ta, ma
5390 ; RV64-NEXT: vsub.vx v12, v8, a1
5391 ; RV64-NEXT: vnot.v v8, v8
5392 ; RV64-NEXT: vand.vv v8, v8, v12
5393 ; RV64-NEXT: lui a0, %hi(.LCPI89_0)
5394 ; RV64-NEXT: ld a0, %lo(.LCPI89_0)(a0)
5395 ; RV64-NEXT: lui a1, %hi(.LCPI89_1)
5396 ; RV64-NEXT: ld a1, %lo(.LCPI89_1)(a1)
5397 ; RV64-NEXT: vsrl.vi v12, v8, 1
5398 ; RV64-NEXT: vand.vx v12, v12, a0
5399 ; RV64-NEXT: vsub.vv v8, v8, v12
5400 ; RV64-NEXT: vand.vx v12, v8, a1
5401 ; RV64-NEXT: vsrl.vi v8, v8, 2
5402 ; RV64-NEXT: vand.vx v8, v8, a1
5403 ; RV64-NEXT: vadd.vv v8, v12, v8
5404 ; RV64-NEXT: lui a0, %hi(.LCPI89_2)
5405 ; RV64-NEXT: ld a0, %lo(.LCPI89_2)(a0)
5406 ; RV64-NEXT: lui a1, %hi(.LCPI89_3)
5407 ; RV64-NEXT: ld a1, %lo(.LCPI89_3)(a1)
5408 ; RV64-NEXT: vsrl.vi v12, v8, 4
5409 ; RV64-NEXT: vadd.vv v8, v8, v12
5410 ; RV64-NEXT: vand.vx v8, v8, a0
5411 ; RV64-NEXT: vmul.vx v8, v8, a1
5412 ; RV64-NEXT: li a0, 56
5413 ; RV64-NEXT: vsrl.vx v8, v8, a0
5415 %head = insertelement <vscale x 4 x i1> poison, i1 true, i32 0
5416 %m = shufflevector <vscale x 4 x i1> %head, <vscale x 4 x i1> poison, <vscale x 4 x i32> zeroinitializer
5417 %v = call <vscale x 4 x i64> @llvm.vp.cttz.nxv4i64(<vscale x 4 x i64> %va, i1 true, <vscale x 4 x i1> %m, i32 %evl)
5418 ret <vscale x 4 x i64> %v
5422 define <vscale x 7 x i64> @vp_cttz_zero_undef_nxv7i64(<vscale x 7 x i64> %va, <vscale x 7 x i1> %m, i32 zeroext %evl) {
5423 ; RV32-LABEL: vp_cttz_zero_undef_nxv7i64:
5425 ; RV32-NEXT: addi sp, sp, -16
5426 ; RV32-NEXT: .cfi_def_cfa_offset 16
5427 ; RV32-NEXT: lui a1, 349525
5428 ; RV32-NEXT: addi a1, a1, 1365
5429 ; RV32-NEXT: sw a1, 12(sp)
5430 ; RV32-NEXT: sw a1, 8(sp)
5431 ; RV32-NEXT: lui a1, 209715
5432 ; RV32-NEXT: addi a1, a1, 819
5433 ; RV32-NEXT: sw a1, 12(sp)
5434 ; RV32-NEXT: sw a1, 8(sp)
5435 ; RV32-NEXT: lui a1, 61681
5436 ; RV32-NEXT: addi a1, a1, -241
5437 ; RV32-NEXT: sw a1, 12(sp)
5438 ; RV32-NEXT: sw a1, 8(sp)
5439 ; RV32-NEXT: lui a1, 4112
5440 ; RV32-NEXT: addi a1, a1, 257
5441 ; RV32-NEXT: sw a1, 12(sp)
5442 ; RV32-NEXT: sw a1, 8(sp)
5443 ; RV32-NEXT: li a1, 1
5444 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
5445 ; RV32-NEXT: vsub.vx v16, v8, a1, v0.t
5446 ; RV32-NEXT: vnot.v v8, v8, v0.t
5447 ; RV32-NEXT: vand.vv v8, v8, v16, v0.t
5448 ; RV32-NEXT: vsrl.vi v16, v8, 1, v0.t
5449 ; RV32-NEXT: addi a1, sp, 8
5450 ; RV32-NEXT: vsetvli a2, zero, e64, m8, ta, ma
5451 ; RV32-NEXT: vlse64.v v24, (a1), zero
5452 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
5453 ; RV32-NEXT: vand.vv v16, v16, v24, v0.t
5454 ; RV32-NEXT: vsub.vv v8, v8, v16, v0.t
5455 ; RV32-NEXT: vsetvli a2, zero, e64, m8, ta, ma
5456 ; RV32-NEXT: vlse64.v v16, (a1), zero
5457 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
5458 ; RV32-NEXT: vand.vv v24, v8, v16, v0.t
5459 ; RV32-NEXT: vsrl.vi v8, v8, 2, v0.t
5460 ; RV32-NEXT: vand.vv v8, v8, v16, v0.t
5461 ; RV32-NEXT: vadd.vv v8, v24, v8, v0.t
5462 ; RV32-NEXT: vsrl.vi v16, v8, 4, v0.t
5463 ; RV32-NEXT: vadd.vv v8, v8, v16, v0.t
5464 ; RV32-NEXT: vsetvli a2, zero, e64, m8, ta, ma
5465 ; RV32-NEXT: vlse64.v v16, (a1), zero
5466 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
5467 ; RV32-NEXT: vand.vv v8, v8, v16, v0.t
5468 ; RV32-NEXT: vsetvli a2, zero, e64, m8, ta, ma
5469 ; RV32-NEXT: vlse64.v v16, (a1), zero
5470 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
5471 ; RV32-NEXT: vmul.vv v8, v8, v16, v0.t
5472 ; RV32-NEXT: li a0, 56
5473 ; RV32-NEXT: vsrl.vx v8, v8, a0, v0.t
5474 ; RV32-NEXT: addi sp, sp, 16
5477 ; RV64-LABEL: vp_cttz_zero_undef_nxv7i64:
5479 ; RV64-NEXT: li a1, 1
5480 ; RV64-NEXT: vsetvli zero, a0, e64, m8, ta, ma
5481 ; RV64-NEXT: vsub.vx v16, v8, a1, v0.t
5482 ; RV64-NEXT: vnot.v v8, v8, v0.t
5483 ; RV64-NEXT: vand.vv v8, v8, v16, v0.t
5484 ; RV64-NEXT: lui a0, %hi(.LCPI90_0)
5485 ; RV64-NEXT: ld a0, %lo(.LCPI90_0)(a0)
5486 ; RV64-NEXT: lui a1, %hi(.LCPI90_1)
5487 ; RV64-NEXT: ld a1, %lo(.LCPI90_1)(a1)
5488 ; RV64-NEXT: vsrl.vi v16, v8, 1, v0.t
5489 ; RV64-NEXT: vand.vx v16, v16, a0, v0.t
5490 ; RV64-NEXT: vsub.vv v8, v8, v16, v0.t
5491 ; RV64-NEXT: vand.vx v16, v8, a1, v0.t
5492 ; RV64-NEXT: vsrl.vi v8, v8, 2, v0.t
5493 ; RV64-NEXT: vand.vx v8, v8, a1, v0.t
5494 ; RV64-NEXT: vadd.vv v8, v16, v8, v0.t
5495 ; RV64-NEXT: lui a0, %hi(.LCPI90_2)
5496 ; RV64-NEXT: ld a0, %lo(.LCPI90_2)(a0)
5497 ; RV64-NEXT: lui a1, %hi(.LCPI90_3)
5498 ; RV64-NEXT: ld a1, %lo(.LCPI90_3)(a1)
5499 ; RV64-NEXT: vsrl.vi v16, v8, 4, v0.t
5500 ; RV64-NEXT: vadd.vv v8, v8, v16, v0.t
5501 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
5502 ; RV64-NEXT: vmul.vx v8, v8, a1, v0.t
5503 ; RV64-NEXT: li a0, 56
5504 ; RV64-NEXT: vsrl.vx v8, v8, a0, v0.t
5506 %v = call <vscale x 7 x i64> @llvm.vp.cttz.nxv7i64(<vscale x 7 x i64> %va, i1 true, <vscale x 7 x i1> %m, i32 %evl)
5507 ret <vscale x 7 x i64> %v
5510 define <vscale x 7 x i64> @vp_cttz_zero_undef_nxv7i64_unmasked(<vscale x 7 x i64> %va, i32 zeroext %evl) {
5511 ; RV32-LABEL: vp_cttz_zero_undef_nxv7i64_unmasked:
5513 ; RV32-NEXT: addi sp, sp, -16
5514 ; RV32-NEXT: .cfi_def_cfa_offset 16
5515 ; RV32-NEXT: lui a1, 349525
5516 ; RV32-NEXT: addi a1, a1, 1365
5517 ; RV32-NEXT: sw a1, 12(sp)
5518 ; RV32-NEXT: sw a1, 8(sp)
5519 ; RV32-NEXT: lui a1, 209715
5520 ; RV32-NEXT: addi a1, a1, 819
5521 ; RV32-NEXT: sw a1, 12(sp)
5522 ; RV32-NEXT: sw a1, 8(sp)
5523 ; RV32-NEXT: lui a1, 61681
5524 ; RV32-NEXT: addi a1, a1, -241
5525 ; RV32-NEXT: sw a1, 12(sp)
5526 ; RV32-NEXT: sw a1, 8(sp)
5527 ; RV32-NEXT: lui a1, 4112
5528 ; RV32-NEXT: addi a1, a1, 257
5529 ; RV32-NEXT: sw a1, 12(sp)
5530 ; RV32-NEXT: sw a1, 8(sp)
5531 ; RV32-NEXT: li a1, 1
5532 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
5533 ; RV32-NEXT: vsub.vx v16, v8, a1
5534 ; RV32-NEXT: vnot.v v8, v8
5535 ; RV32-NEXT: vand.vv v8, v8, v16
5536 ; RV32-NEXT: vsrl.vi v16, v8, 1
5537 ; RV32-NEXT: addi a1, sp, 8
5538 ; RV32-NEXT: vsetvli a2, zero, e64, m8, ta, ma
5539 ; RV32-NEXT: vlse64.v v24, (a1), zero
5540 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
5541 ; RV32-NEXT: vand.vv v16, v16, v24
5542 ; RV32-NEXT: vsub.vv v8, v8, v16
5543 ; RV32-NEXT: vsetvli a2, zero, e64, m8, ta, ma
5544 ; RV32-NEXT: vlse64.v v16, (a1), zero
5545 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
5546 ; RV32-NEXT: vand.vv v24, v8, v16
5547 ; RV32-NEXT: vsrl.vi v8, v8, 2
5548 ; RV32-NEXT: vand.vv v8, v8, v16
5549 ; RV32-NEXT: vadd.vv v8, v24, v8
5550 ; RV32-NEXT: vsrl.vi v16, v8, 4
5551 ; RV32-NEXT: vadd.vv v8, v8, v16
5552 ; RV32-NEXT: vsetvli a2, zero, e64, m8, ta, ma
5553 ; RV32-NEXT: vlse64.v v16, (a1), zero
5554 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
5555 ; RV32-NEXT: vand.vv v8, v8, v16
5556 ; RV32-NEXT: vsetvli a2, zero, e64, m8, ta, ma
5557 ; RV32-NEXT: vlse64.v v16, (a1), zero
5558 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
5559 ; RV32-NEXT: vmul.vv v8, v8, v16
5560 ; RV32-NEXT: li a0, 56
5561 ; RV32-NEXT: vsrl.vx v8, v8, a0
5562 ; RV32-NEXT: addi sp, sp, 16
5565 ; RV64-LABEL: vp_cttz_zero_undef_nxv7i64_unmasked:
5567 ; RV64-NEXT: li a1, 1
5568 ; RV64-NEXT: vsetvli zero, a0, e64, m8, ta, ma
5569 ; RV64-NEXT: vsub.vx v16, v8, a1
5570 ; RV64-NEXT: vnot.v v8, v8
5571 ; RV64-NEXT: vand.vv v8, v8, v16
5572 ; RV64-NEXT: lui a0, %hi(.LCPI91_0)
5573 ; RV64-NEXT: ld a0, %lo(.LCPI91_0)(a0)
5574 ; RV64-NEXT: lui a1, %hi(.LCPI91_1)
5575 ; RV64-NEXT: ld a1, %lo(.LCPI91_1)(a1)
5576 ; RV64-NEXT: vsrl.vi v16, v8, 1
5577 ; RV64-NEXT: vand.vx v16, v16, a0
5578 ; RV64-NEXT: vsub.vv v8, v8, v16
5579 ; RV64-NEXT: vand.vx v16, v8, a1
5580 ; RV64-NEXT: vsrl.vi v8, v8, 2
5581 ; RV64-NEXT: vand.vx v8, v8, a1
5582 ; RV64-NEXT: vadd.vv v8, v16, v8
5583 ; RV64-NEXT: lui a0, %hi(.LCPI91_2)
5584 ; RV64-NEXT: ld a0, %lo(.LCPI91_2)(a0)
5585 ; RV64-NEXT: lui a1, %hi(.LCPI91_3)
5586 ; RV64-NEXT: ld a1, %lo(.LCPI91_3)(a1)
5587 ; RV64-NEXT: vsrl.vi v16, v8, 4
5588 ; RV64-NEXT: vadd.vv v8, v8, v16
5589 ; RV64-NEXT: vand.vx v8, v8, a0
5590 ; RV64-NEXT: vmul.vx v8, v8, a1
5591 ; RV64-NEXT: li a0, 56
5592 ; RV64-NEXT: vsrl.vx v8, v8, a0
5594 %head = insertelement <vscale x 7 x i1> poison, i1 true, i32 0
5595 %m = shufflevector <vscale x 7 x i1> %head, <vscale x 7 x i1> poison, <vscale x 7 x i32> zeroinitializer
5596 %v = call <vscale x 7 x i64> @llvm.vp.cttz.nxv7i64(<vscale x 7 x i64> %va, i1 true, <vscale x 7 x i1> %m, i32 %evl)
5597 ret <vscale x 7 x i64> %v
5601 define <vscale x 8 x i64> @vp_cttz_zero_undef_nxv8i64(<vscale x 8 x i64> %va, <vscale x 8 x i1> %m, i32 zeroext %evl) {
5602 ; RV32-LABEL: vp_cttz_zero_undef_nxv8i64:
5604 ; RV32-NEXT: addi sp, sp, -16
5605 ; RV32-NEXT: .cfi_def_cfa_offset 16
5606 ; RV32-NEXT: lui a1, 349525
5607 ; RV32-NEXT: addi a1, a1, 1365
5608 ; RV32-NEXT: sw a1, 12(sp)
5609 ; RV32-NEXT: sw a1, 8(sp)
5610 ; RV32-NEXT: lui a1, 209715
5611 ; RV32-NEXT: addi a1, a1, 819
5612 ; RV32-NEXT: sw a1, 12(sp)
5613 ; RV32-NEXT: sw a1, 8(sp)
5614 ; RV32-NEXT: lui a1, 61681
5615 ; RV32-NEXT: addi a1, a1, -241
5616 ; RV32-NEXT: sw a1, 12(sp)
5617 ; RV32-NEXT: sw a1, 8(sp)
5618 ; RV32-NEXT: lui a1, 4112
5619 ; RV32-NEXT: addi a1, a1, 257
5620 ; RV32-NEXT: sw a1, 12(sp)
5621 ; RV32-NEXT: sw a1, 8(sp)
5622 ; RV32-NEXT: li a1, 1
5623 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
5624 ; RV32-NEXT: vsub.vx v16, v8, a1, v0.t
5625 ; RV32-NEXT: vnot.v v8, v8, v0.t
5626 ; RV32-NEXT: vand.vv v8, v8, v16, v0.t
5627 ; RV32-NEXT: vsrl.vi v16, v8, 1, v0.t
5628 ; RV32-NEXT: addi a1, sp, 8
5629 ; RV32-NEXT: vsetvli a2, zero, e64, m8, ta, ma
5630 ; RV32-NEXT: vlse64.v v24, (a1), zero
5631 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
5632 ; RV32-NEXT: vand.vv v16, v16, v24, v0.t
5633 ; RV32-NEXT: vsub.vv v8, v8, v16, v0.t
5634 ; RV32-NEXT: vsetvli a2, zero, e64, m8, ta, ma
5635 ; RV32-NEXT: vlse64.v v16, (a1), zero
5636 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
5637 ; RV32-NEXT: vand.vv v24, v8, v16, v0.t
5638 ; RV32-NEXT: vsrl.vi v8, v8, 2, v0.t
5639 ; RV32-NEXT: vand.vv v8, v8, v16, v0.t
5640 ; RV32-NEXT: vadd.vv v8, v24, v8, v0.t
5641 ; RV32-NEXT: vsrl.vi v16, v8, 4, v0.t
5642 ; RV32-NEXT: vadd.vv v8, v8, v16, v0.t
5643 ; RV32-NEXT: vsetvli a2, zero, e64, m8, ta, ma
5644 ; RV32-NEXT: vlse64.v v16, (a1), zero
5645 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
5646 ; RV32-NEXT: vand.vv v8, v8, v16, v0.t
5647 ; RV32-NEXT: vsetvli a2, zero, e64, m8, ta, ma
5648 ; RV32-NEXT: vlse64.v v16, (a1), zero
5649 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
5650 ; RV32-NEXT: vmul.vv v8, v8, v16, v0.t
5651 ; RV32-NEXT: li a0, 56
5652 ; RV32-NEXT: vsrl.vx v8, v8, a0, v0.t
5653 ; RV32-NEXT: addi sp, sp, 16
5656 ; RV64-LABEL: vp_cttz_zero_undef_nxv8i64:
5658 ; RV64-NEXT: li a1, 1
5659 ; RV64-NEXT: vsetvli zero, a0, e64, m8, ta, ma
5660 ; RV64-NEXT: vsub.vx v16, v8, a1, v0.t
5661 ; RV64-NEXT: vnot.v v8, v8, v0.t
5662 ; RV64-NEXT: vand.vv v8, v8, v16, v0.t
5663 ; RV64-NEXT: lui a0, %hi(.LCPI92_0)
5664 ; RV64-NEXT: ld a0, %lo(.LCPI92_0)(a0)
5665 ; RV64-NEXT: lui a1, %hi(.LCPI92_1)
5666 ; RV64-NEXT: ld a1, %lo(.LCPI92_1)(a1)
5667 ; RV64-NEXT: vsrl.vi v16, v8, 1, v0.t
5668 ; RV64-NEXT: vand.vx v16, v16, a0, v0.t
5669 ; RV64-NEXT: vsub.vv v8, v8, v16, v0.t
5670 ; RV64-NEXT: vand.vx v16, v8, a1, v0.t
5671 ; RV64-NEXT: vsrl.vi v8, v8, 2, v0.t
5672 ; RV64-NEXT: vand.vx v8, v8, a1, v0.t
5673 ; RV64-NEXT: vadd.vv v8, v16, v8, v0.t
5674 ; RV64-NEXT: lui a0, %hi(.LCPI92_2)
5675 ; RV64-NEXT: ld a0, %lo(.LCPI92_2)(a0)
5676 ; RV64-NEXT: lui a1, %hi(.LCPI92_3)
5677 ; RV64-NEXT: ld a1, %lo(.LCPI92_3)(a1)
5678 ; RV64-NEXT: vsrl.vi v16, v8, 4, v0.t
5679 ; RV64-NEXT: vadd.vv v8, v8, v16, v0.t
5680 ; RV64-NEXT: vand.vx v8, v8, a0, v0.t
5681 ; RV64-NEXT: vmul.vx v8, v8, a1, v0.t
5682 ; RV64-NEXT: li a0, 56
5683 ; RV64-NEXT: vsrl.vx v8, v8, a0, v0.t
5685 %v = call <vscale x 8 x i64> @llvm.vp.cttz.nxv8i64(<vscale x 8 x i64> %va, i1 true, <vscale x 8 x i1> %m, i32 %evl)
5686 ret <vscale x 8 x i64> %v
5689 define <vscale x 8 x i64> @vp_cttz_zero_undef_nxv8i64_unmasked(<vscale x 8 x i64> %va, i32 zeroext %evl) {
5690 ; RV32-LABEL: vp_cttz_zero_undef_nxv8i64_unmasked:
5692 ; RV32-NEXT: addi sp, sp, -16
5693 ; RV32-NEXT: .cfi_def_cfa_offset 16
5694 ; RV32-NEXT: lui a1, 349525
5695 ; RV32-NEXT: addi a1, a1, 1365
5696 ; RV32-NEXT: sw a1, 12(sp)
5697 ; RV32-NEXT: sw a1, 8(sp)
5698 ; RV32-NEXT: lui a1, 209715
5699 ; RV32-NEXT: addi a1, a1, 819
5700 ; RV32-NEXT: sw a1, 12(sp)
5701 ; RV32-NEXT: sw a1, 8(sp)
5702 ; RV32-NEXT: lui a1, 61681
5703 ; RV32-NEXT: addi a1, a1, -241
5704 ; RV32-NEXT: sw a1, 12(sp)
5705 ; RV32-NEXT: sw a1, 8(sp)
5706 ; RV32-NEXT: lui a1, 4112
5707 ; RV32-NEXT: addi a1, a1, 257
5708 ; RV32-NEXT: sw a1, 12(sp)
5709 ; RV32-NEXT: sw a1, 8(sp)
5710 ; RV32-NEXT: li a1, 1
5711 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
5712 ; RV32-NEXT: vsub.vx v16, v8, a1
5713 ; RV32-NEXT: vnot.v v8, v8
5714 ; RV32-NEXT: vand.vv v8, v8, v16
5715 ; RV32-NEXT: vsrl.vi v16, v8, 1
5716 ; RV32-NEXT: addi a1, sp, 8
5717 ; RV32-NEXT: vsetvli a2, zero, e64, m8, ta, ma
5718 ; RV32-NEXT: vlse64.v v24, (a1), zero
5719 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
5720 ; RV32-NEXT: vand.vv v16, v16, v24
5721 ; RV32-NEXT: vsub.vv v8, v8, v16
5722 ; RV32-NEXT: vsetvli a2, zero, e64, m8, ta, ma
5723 ; RV32-NEXT: vlse64.v v16, (a1), zero
5724 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
5725 ; RV32-NEXT: vand.vv v24, v8, v16
5726 ; RV32-NEXT: vsrl.vi v8, v8, 2
5727 ; RV32-NEXT: vand.vv v8, v8, v16
5728 ; RV32-NEXT: vadd.vv v8, v24, v8
5729 ; RV32-NEXT: vsrl.vi v16, v8, 4
5730 ; RV32-NEXT: vadd.vv v8, v8, v16
5731 ; RV32-NEXT: vsetvli a2, zero, e64, m8, ta, ma
5732 ; RV32-NEXT: vlse64.v v16, (a1), zero
5733 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
5734 ; RV32-NEXT: vand.vv v8, v8, v16
5735 ; RV32-NEXT: vsetvli a2, zero, e64, m8, ta, ma
5736 ; RV32-NEXT: vlse64.v v16, (a1), zero
5737 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
5738 ; RV32-NEXT: vmul.vv v8, v8, v16
5739 ; RV32-NEXT: li a0, 56
5740 ; RV32-NEXT: vsrl.vx v8, v8, a0
5741 ; RV32-NEXT: addi sp, sp, 16
5744 ; RV64-LABEL: vp_cttz_zero_undef_nxv8i64_unmasked:
5746 ; RV64-NEXT: li a1, 1
5747 ; RV64-NEXT: vsetvli zero, a0, e64, m8, ta, ma
5748 ; RV64-NEXT: vsub.vx v16, v8, a1
5749 ; RV64-NEXT: vnot.v v8, v8
5750 ; RV64-NEXT: vand.vv v8, v8, v16
5751 ; RV64-NEXT: lui a0, %hi(.LCPI93_0)
5752 ; RV64-NEXT: ld a0, %lo(.LCPI93_0)(a0)
5753 ; RV64-NEXT: lui a1, %hi(.LCPI93_1)
5754 ; RV64-NEXT: ld a1, %lo(.LCPI93_1)(a1)
5755 ; RV64-NEXT: vsrl.vi v16, v8, 1
5756 ; RV64-NEXT: vand.vx v16, v16, a0
5757 ; RV64-NEXT: vsub.vv v8, v8, v16
5758 ; RV64-NEXT: vand.vx v16, v8, a1
5759 ; RV64-NEXT: vsrl.vi v8, v8, 2
5760 ; RV64-NEXT: vand.vx v8, v8, a1
5761 ; RV64-NEXT: vadd.vv v8, v16, v8
5762 ; RV64-NEXT: lui a0, %hi(.LCPI93_2)
5763 ; RV64-NEXT: ld a0, %lo(.LCPI93_2)(a0)
5764 ; RV64-NEXT: lui a1, %hi(.LCPI93_3)
5765 ; RV64-NEXT: ld a1, %lo(.LCPI93_3)(a1)
5766 ; RV64-NEXT: vsrl.vi v16, v8, 4
5767 ; RV64-NEXT: vadd.vv v8, v8, v16
5768 ; RV64-NEXT: vand.vx v8, v8, a0
5769 ; RV64-NEXT: vmul.vx v8, v8, a1
5770 ; RV64-NEXT: li a0, 56
5771 ; RV64-NEXT: vsrl.vx v8, v8, a0
5773 %head = insertelement <vscale x 8 x i1> poison, i1 true, i32 0
5774 %m = shufflevector <vscale x 8 x i1> %head, <vscale x 8 x i1> poison, <vscale x 8 x i32> zeroinitializer
5775 %v = call <vscale x 8 x i64> @llvm.vp.cttz.nxv8i64(<vscale x 8 x i64> %va, i1 true, <vscale x 8 x i1> %m, i32 %evl)
5776 ret <vscale x 8 x i64> %v
5779 define <vscale x 16 x i64> @vp_cttz_zero_undef_nxv16i64(<vscale x 16 x i64> %va, <vscale x 16 x i1> %m, i32 zeroext %evl) {
5780 ; RV32-LABEL: vp_cttz_zero_undef_nxv16i64:
5782 ; RV32-NEXT: addi sp, sp, -16
5783 ; RV32-NEXT: .cfi_def_cfa_offset 16
5784 ; RV32-NEXT: csrr a1, vlenb
5785 ; RV32-NEXT: li a2, 40
5786 ; RV32-NEXT: mul a1, a1, a2
5787 ; RV32-NEXT: sub sp, sp, a1
5788 ; RV32-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x28, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 40 * vlenb
5789 ; RV32-NEXT: vmv1r.v v1, v0
5790 ; RV32-NEXT: csrr a1, vlenb
5791 ; RV32-NEXT: srli a2, a1, 3
5792 ; RV32-NEXT: vsetvli a3, zero, e8, mf4, ta, ma
5793 ; RV32-NEXT: vslidedown.vx v0, v0, a2
5794 ; RV32-NEXT: lui a2, 349525
5795 ; RV32-NEXT: addi a2, a2, 1365
5796 ; RV32-NEXT: sw a2, 12(sp)
5797 ; RV32-NEXT: sw a2, 8(sp)
5798 ; RV32-NEXT: lui a2, 209715
5799 ; RV32-NEXT: addi a2, a2, 819
5800 ; RV32-NEXT: sw a2, 12(sp)
5801 ; RV32-NEXT: sw a2, 8(sp)
5802 ; RV32-NEXT: lui a2, 61681
5803 ; RV32-NEXT: addi a2, a2, -241
5804 ; RV32-NEXT: sw a2, 12(sp)
5805 ; RV32-NEXT: sw a2, 8(sp)
5806 ; RV32-NEXT: lui a2, 4112
5807 ; RV32-NEXT: addi a2, a2, 257
5808 ; RV32-NEXT: sw a2, 12(sp)
5809 ; RV32-NEXT: sw a2, 8(sp)
5810 ; RV32-NEXT: sub a2, a0, a1
5811 ; RV32-NEXT: sltu a3, a0, a2
5812 ; RV32-NEXT: addi a3, a3, -1
5813 ; RV32-NEXT: and a3, a3, a2
5814 ; RV32-NEXT: li a2, 1
5815 ; RV32-NEXT: vsetvli zero, a3, e64, m8, ta, ma
5816 ; RV32-NEXT: vsub.vx v24, v16, a2, v0.t
5817 ; RV32-NEXT: vnot.v v16, v16, v0.t
5818 ; RV32-NEXT: vand.vv v16, v16, v24, v0.t
5819 ; RV32-NEXT: csrr a4, vlenb
5820 ; RV32-NEXT: slli a4, a4, 5
5821 ; RV32-NEXT: add a4, sp, a4
5822 ; RV32-NEXT: addi a4, a4, 16
5823 ; RV32-NEXT: vs8r.v v16, (a4) # Unknown-size Folded Spill
5824 ; RV32-NEXT: vsrl.vi v24, v16, 1, v0.t
5825 ; RV32-NEXT: addi a4, sp, 8
5826 ; RV32-NEXT: vsetvli a5, zero, e64, m8, ta, ma
5827 ; RV32-NEXT: vlse64.v v16, (a4), zero
5828 ; RV32-NEXT: vsetvli zero, a3, e64, m8, ta, ma
5829 ; RV32-NEXT: csrr a5, vlenb
5830 ; RV32-NEXT: slli a5, a5, 4
5831 ; RV32-NEXT: add a5, sp, a5
5832 ; RV32-NEXT: addi a5, a5, 16
5833 ; RV32-NEXT: vs8r.v v16, (a5) # Unknown-size Folded Spill
5834 ; RV32-NEXT: vand.vv v24, v24, v16, v0.t
5835 ; RV32-NEXT: csrr a5, vlenb
5836 ; RV32-NEXT: slli a5, a5, 5
5837 ; RV32-NEXT: add a5, sp, a5
5838 ; RV32-NEXT: addi a5, a5, 16
5839 ; RV32-NEXT: vl8r.v v16, (a5) # Unknown-size Folded Reload
5840 ; RV32-NEXT: vsub.vv v16, v16, v24, v0.t
5841 ; RV32-NEXT: csrr a5, vlenb
5842 ; RV32-NEXT: li a6, 24
5843 ; RV32-NEXT: mul a5, a5, a6
5844 ; RV32-NEXT: add a5, sp, a5
5845 ; RV32-NEXT: addi a5, a5, 16
5846 ; RV32-NEXT: vs8r.v v16, (a5) # Unknown-size Folded Spill
5847 ; RV32-NEXT: vsetvli a5, zero, e64, m8, ta, ma
5848 ; RV32-NEXT: vlse64.v v16, (a4), zero
5849 ; RV32-NEXT: csrr a5, vlenb
5850 ; RV32-NEXT: slli a5, a5, 5
5851 ; RV32-NEXT: add a5, sp, a5
5852 ; RV32-NEXT: addi a5, a5, 16
5853 ; RV32-NEXT: vs8r.v v16, (a5) # Unknown-size Folded Spill
5854 ; RV32-NEXT: vsetvli zero, a3, e64, m8, ta, ma
5855 ; RV32-NEXT: csrr a5, vlenb
5856 ; RV32-NEXT: li a6, 24
5857 ; RV32-NEXT: mul a5, a5, a6
5858 ; RV32-NEXT: add a5, sp, a5
5859 ; RV32-NEXT: addi a5, a5, 16
5860 ; RV32-NEXT: vl8r.v v16, (a5) # Unknown-size Folded Reload
5861 ; RV32-NEXT: csrr a5, vlenb
5862 ; RV32-NEXT: slli a5, a5, 5
5863 ; RV32-NEXT: add a5, sp, a5
5864 ; RV32-NEXT: addi a5, a5, 16
5865 ; RV32-NEXT: vl8r.v v24, (a5) # Unknown-size Folded Reload
5866 ; RV32-NEXT: vand.vv v16, v16, v24, v0.t
5867 ; RV32-NEXT: csrr a5, vlenb
5868 ; RV32-NEXT: slli a5, a5, 3
5869 ; RV32-NEXT: add a5, sp, a5
5870 ; RV32-NEXT: addi a5, a5, 16
5871 ; RV32-NEXT: vs8r.v v16, (a5) # Unknown-size Folded Spill
5872 ; RV32-NEXT: csrr a5, vlenb
5873 ; RV32-NEXT: li a6, 24
5874 ; RV32-NEXT: mul a5, a5, a6
5875 ; RV32-NEXT: add a5, sp, a5
5876 ; RV32-NEXT: addi a5, a5, 16
5877 ; RV32-NEXT: vl8r.v v16, (a5) # Unknown-size Folded Reload
5878 ; RV32-NEXT: vsrl.vi v16, v16, 2, v0.t
5879 ; RV32-NEXT: csrr a5, vlenb
5880 ; RV32-NEXT: li a6, 24
5881 ; RV32-NEXT: mul a5, a5, a6
5882 ; RV32-NEXT: add a5, sp, a5
5883 ; RV32-NEXT: addi a5, a5, 16
5884 ; RV32-NEXT: vs8r.v v16, (a5) # Unknown-size Folded Spill
5885 ; RV32-NEXT: csrr a5, vlenb
5886 ; RV32-NEXT: slli a5, a5, 5
5887 ; RV32-NEXT: add a5, sp, a5
5888 ; RV32-NEXT: addi a5, a5, 16
5889 ; RV32-NEXT: vl8r.v v16, (a5) # Unknown-size Folded Reload
5890 ; RV32-NEXT: csrr a5, vlenb
5891 ; RV32-NEXT: li a6, 24
5892 ; RV32-NEXT: mul a5, a5, a6
5893 ; RV32-NEXT: add a5, sp, a5
5894 ; RV32-NEXT: addi a5, a5, 16
5895 ; RV32-NEXT: vl8r.v v24, (a5) # Unknown-size Folded Reload
5896 ; RV32-NEXT: vand.vv v16, v24, v16, v0.t
5897 ; RV32-NEXT: csrr a5, vlenb
5898 ; RV32-NEXT: slli a5, a5, 3
5899 ; RV32-NEXT: add a5, sp, a5
5900 ; RV32-NEXT: addi a5, a5, 16
5901 ; RV32-NEXT: vl8r.v v24, (a5) # Unknown-size Folded Reload
5902 ; RV32-NEXT: vadd.vv v16, v24, v16, v0.t
5903 ; RV32-NEXT: vsrl.vi v24, v16, 4, v0.t
5904 ; RV32-NEXT: vadd.vv v24, v16, v24, v0.t
5905 ; RV32-NEXT: vsetvli a5, zero, e64, m8, ta, ma
5906 ; RV32-NEXT: vlse64.v v16, (a4), zero
5907 ; RV32-NEXT: vsetvli zero, a3, e64, m8, ta, ma
5908 ; RV32-NEXT: csrr a5, vlenb
5909 ; RV32-NEXT: li a6, 24
5910 ; RV32-NEXT: mul a5, a5, a6
5911 ; RV32-NEXT: add a5, sp, a5
5912 ; RV32-NEXT: addi a5, a5, 16
5913 ; RV32-NEXT: vs8r.v v16, (a5) # Unknown-size Folded Spill
5914 ; RV32-NEXT: vand.vv v24, v24, v16, v0.t
5915 ; RV32-NEXT: vsetvli a5, zero, e64, m8, ta, ma
5916 ; RV32-NEXT: vlse64.v v16, (a4), zero
5917 ; RV32-NEXT: vsetvli zero, a3, e64, m8, ta, ma
5918 ; RV32-NEXT: csrr a3, vlenb
5919 ; RV32-NEXT: slli a3, a3, 3
5920 ; RV32-NEXT: add a3, sp, a3
5921 ; RV32-NEXT: addi a3, a3, 16
5922 ; RV32-NEXT: vs8r.v v16, (a3) # Unknown-size Folded Spill
5923 ; RV32-NEXT: vmul.vv v16, v24, v16, v0.t
5924 ; RV32-NEXT: li a3, 56
5925 ; RV32-NEXT: vsrl.vx v16, v16, a3, v0.t
5926 ; RV32-NEXT: addi a4, sp, 16
5927 ; RV32-NEXT: vs8r.v v16, (a4) # Unknown-size Folded Spill
5928 ; RV32-NEXT: bltu a0, a1, .LBB94_2
5929 ; RV32-NEXT: # %bb.1:
5930 ; RV32-NEXT: mv a0, a1
5931 ; RV32-NEXT: .LBB94_2:
5932 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
5933 ; RV32-NEXT: vmv1r.v v0, v1
5934 ; RV32-NEXT: vsub.vx v16, v8, a2, v0.t
5935 ; RV32-NEXT: vnot.v v8, v8, v0.t
5936 ; RV32-NEXT: vand.vv v8, v8, v16, v0.t
5937 ; RV32-NEXT: vsrl.vi v24, v8, 1, v0.t
5938 ; RV32-NEXT: csrr a0, vlenb
5939 ; RV32-NEXT: slli a0, a0, 4
5940 ; RV32-NEXT: add a0, sp, a0
5941 ; RV32-NEXT: addi a0, a0, 16
5942 ; RV32-NEXT: vl8r.v v16, (a0) # Unknown-size Folded Reload
5943 ; RV32-NEXT: vand.vv v16, v24, v16, v0.t
5944 ; RV32-NEXT: vsub.vv v8, v8, v16, v0.t
5945 ; RV32-NEXT: csrr a0, vlenb
5946 ; RV32-NEXT: slli a0, a0, 5
5947 ; RV32-NEXT: add a0, sp, a0
5948 ; RV32-NEXT: addi a0, a0, 16
5949 ; RV32-NEXT: vl8r.v v16, (a0) # Unknown-size Folded Reload
5950 ; RV32-NEXT: vand.vv v24, v8, v16, v0.t
5951 ; RV32-NEXT: vsrl.vi v8, v8, 2, v0.t
5952 ; RV32-NEXT: vand.vv v8, v8, v16, v0.t
5953 ; RV32-NEXT: vadd.vv v8, v24, v8, v0.t
5954 ; RV32-NEXT: vsrl.vi v16, v8, 4, v0.t
5955 ; RV32-NEXT: vadd.vv v8, v8, v16, v0.t
5956 ; RV32-NEXT: csrr a0, vlenb
5957 ; RV32-NEXT: li a1, 24
5958 ; RV32-NEXT: mul a0, a0, a1
5959 ; RV32-NEXT: add a0, sp, a0
5960 ; RV32-NEXT: addi a0, a0, 16
5961 ; RV32-NEXT: vl8r.v v16, (a0) # Unknown-size Folded Reload
5962 ; RV32-NEXT: vand.vv v8, v8, v16, v0.t
5963 ; RV32-NEXT: csrr a0, vlenb
5964 ; RV32-NEXT: slli a0, a0, 3
5965 ; RV32-NEXT: add a0, sp, a0
5966 ; RV32-NEXT: addi a0, a0, 16
5967 ; RV32-NEXT: vl8r.v v16, (a0) # Unknown-size Folded Reload
5968 ; RV32-NEXT: vmul.vv v8, v8, v16, v0.t
5969 ; RV32-NEXT: vsrl.vx v8, v8, a3, v0.t
5970 ; RV32-NEXT: addi a0, sp, 16
5971 ; RV32-NEXT: vl8r.v v16, (a0) # Unknown-size Folded Reload
5972 ; RV32-NEXT: csrr a0, vlenb
5973 ; RV32-NEXT: li a1, 40
5974 ; RV32-NEXT: mul a0, a0, a1
5975 ; RV32-NEXT: add sp, sp, a0
5976 ; RV32-NEXT: addi sp, sp, 16
5979 ; RV64-LABEL: vp_cttz_zero_undef_nxv16i64:
5981 ; RV64-NEXT: addi sp, sp, -16
5982 ; RV64-NEXT: .cfi_def_cfa_offset 16
5983 ; RV64-NEXT: csrr a1, vlenb
5984 ; RV64-NEXT: slli a1, a1, 4
5985 ; RV64-NEXT: sub sp, sp, a1
5986 ; RV64-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x10, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 16 * vlenb
5987 ; RV64-NEXT: vmv1r.v v24, v0
5988 ; RV64-NEXT: csrr a1, vlenb
5989 ; RV64-NEXT: slli a1, a1, 3
5990 ; RV64-NEXT: add a1, sp, a1
5991 ; RV64-NEXT: addi a1, a1, 16
5992 ; RV64-NEXT: vs8r.v v8, (a1) # Unknown-size Folded Spill
5993 ; RV64-NEXT: csrr a1, vlenb
5994 ; RV64-NEXT: srli a2, a1, 3
5995 ; RV64-NEXT: vsetvli a3, zero, e8, mf4, ta, ma
5996 ; RV64-NEXT: vslidedown.vx v0, v0, a2
5997 ; RV64-NEXT: sub a2, a0, a1
5998 ; RV64-NEXT: sltu a3, a0, a2
5999 ; RV64-NEXT: addi a3, a3, -1
6000 ; RV64-NEXT: and a3, a3, a2
6001 ; RV64-NEXT: li a2, 1
6002 ; RV64-NEXT: vsetvli zero, a3, e64, m8, ta, ma
6003 ; RV64-NEXT: vsub.vx v8, v16, a2, v0.t
6004 ; RV64-NEXT: vnot.v v16, v16, v0.t
6005 ; RV64-NEXT: vand.vv v16, v16, v8, v0.t
6006 ; RV64-NEXT: lui a3, %hi(.LCPI94_0)
6007 ; RV64-NEXT: ld a4, %lo(.LCPI94_0)(a3)
6008 ; RV64-NEXT: lui a3, %hi(.LCPI94_1)
6009 ; RV64-NEXT: ld a3, %lo(.LCPI94_1)(a3)
6010 ; RV64-NEXT: vsrl.vi v8, v16, 1, v0.t
6011 ; RV64-NEXT: vand.vx v8, v8, a4, v0.t
6012 ; RV64-NEXT: vsub.vv v8, v16, v8, v0.t
6013 ; RV64-NEXT: vand.vx v16, v8, a3, v0.t
6014 ; RV64-NEXT: vsrl.vi v8, v8, 2, v0.t
6015 ; RV64-NEXT: vand.vx v8, v8, a3, v0.t
6016 ; RV64-NEXT: vadd.vv v16, v16, v8, v0.t
6017 ; RV64-NEXT: lui a5, %hi(.LCPI94_2)
6018 ; RV64-NEXT: ld a5, %lo(.LCPI94_2)(a5)
6019 ; RV64-NEXT: lui a6, %hi(.LCPI94_3)
6020 ; RV64-NEXT: ld a6, %lo(.LCPI94_3)(a6)
6021 ; RV64-NEXT: vsrl.vi v8, v16, 4, v0.t
6022 ; RV64-NEXT: vadd.vv v8, v16, v8, v0.t
6023 ; RV64-NEXT: vand.vx v8, v8, a5, v0.t
6024 ; RV64-NEXT: vmul.vx v8, v8, a6, v0.t
6025 ; RV64-NEXT: li a7, 56
6026 ; RV64-NEXT: vsrl.vx v8, v8, a7, v0.t
6027 ; RV64-NEXT: addi t0, sp, 16
6028 ; RV64-NEXT: vs8r.v v8, (t0) # Unknown-size Folded Spill
6029 ; RV64-NEXT: bltu a0, a1, .LBB94_2
6030 ; RV64-NEXT: # %bb.1:
6031 ; RV64-NEXT: mv a0, a1
6032 ; RV64-NEXT: .LBB94_2:
6033 ; RV64-NEXT: vsetvli zero, a0, e64, m8, ta, ma
6034 ; RV64-NEXT: vmv1r.v v0, v24
6035 ; RV64-NEXT: csrr a0, vlenb
6036 ; RV64-NEXT: slli a0, a0, 3
6037 ; RV64-NEXT: add a0, sp, a0
6038 ; RV64-NEXT: addi a0, a0, 16
6039 ; RV64-NEXT: vl8r.v v8, (a0) # Unknown-size Folded Reload
6040 ; RV64-NEXT: vsub.vx v16, v8, a2, v0.t
6041 ; RV64-NEXT: vnot.v v8, v8, v0.t
6042 ; RV64-NEXT: vand.vv v8, v8, v16, v0.t
6043 ; RV64-NEXT: vsrl.vi v16, v8, 1, v0.t
6044 ; RV64-NEXT: vand.vx v16, v16, a4, v0.t
6045 ; RV64-NEXT: vsub.vv v8, v8, v16, v0.t
6046 ; RV64-NEXT: vand.vx v16, v8, a3, v0.t
6047 ; RV64-NEXT: vsrl.vi v8, v8, 2, v0.t
6048 ; RV64-NEXT: vand.vx v8, v8, a3, v0.t
6049 ; RV64-NEXT: vadd.vv v8, v16, v8, v0.t
6050 ; RV64-NEXT: vsrl.vi v16, v8, 4, v0.t
6051 ; RV64-NEXT: vadd.vv v8, v8, v16, v0.t
6052 ; RV64-NEXT: vand.vx v8, v8, a5, v0.t
6053 ; RV64-NEXT: vmul.vx v8, v8, a6, v0.t
6054 ; RV64-NEXT: vsrl.vx v8, v8, a7, v0.t
6055 ; RV64-NEXT: addi a0, sp, 16
6056 ; RV64-NEXT: vl8r.v v16, (a0) # Unknown-size Folded Reload
6057 ; RV64-NEXT: csrr a0, vlenb
6058 ; RV64-NEXT: slli a0, a0, 4
6059 ; RV64-NEXT: add sp, sp, a0
6060 ; RV64-NEXT: addi sp, sp, 16
6062 %v = call <vscale x 16 x i64> @llvm.vp.cttz.nxv16i64(<vscale x 16 x i64> %va, i1 true, <vscale x 16 x i1> %m, i32 %evl)
6063 ret <vscale x 16 x i64> %v
6066 define <vscale x 16 x i64> @vp_cttz_zero_undef_nxv16i64_unmasked(<vscale x 16 x i64> %va, i32 zeroext %evl) {
6067 ; RV32-LABEL: vp_cttz_zero_undef_nxv16i64_unmasked:
6069 ; RV32-NEXT: addi sp, sp, -16
6070 ; RV32-NEXT: .cfi_def_cfa_offset 16
6071 ; RV32-NEXT: csrr a1, vlenb
6072 ; RV32-NEXT: slli a1, a1, 5
6073 ; RV32-NEXT: sub sp, sp, a1
6074 ; RV32-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x20, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 32 * vlenb
6075 ; RV32-NEXT: lui a1, 349525
6076 ; RV32-NEXT: addi a1, a1, 1365
6077 ; RV32-NEXT: sw a1, 12(sp)
6078 ; RV32-NEXT: sw a1, 8(sp)
6079 ; RV32-NEXT: lui a1, 209715
6080 ; RV32-NEXT: addi a1, a1, 819
6081 ; RV32-NEXT: sw a1, 12(sp)
6082 ; RV32-NEXT: sw a1, 8(sp)
6083 ; RV32-NEXT: lui a1, 61681
6084 ; RV32-NEXT: addi a1, a1, -241
6085 ; RV32-NEXT: sw a1, 12(sp)
6086 ; RV32-NEXT: sw a1, 8(sp)
6087 ; RV32-NEXT: lui a1, 4112
6088 ; RV32-NEXT: addi a1, a1, 257
6089 ; RV32-NEXT: sw a1, 12(sp)
6090 ; RV32-NEXT: sw a1, 8(sp)
6091 ; RV32-NEXT: csrr a1, vlenb
6092 ; RV32-NEXT: sub a2, a0, a1
6093 ; RV32-NEXT: sltu a3, a0, a2
6094 ; RV32-NEXT: addi a3, a3, -1
6095 ; RV32-NEXT: and a3, a3, a2
6096 ; RV32-NEXT: li a2, 1
6097 ; RV32-NEXT: vsetvli zero, a3, e64, m8, ta, ma
6098 ; RV32-NEXT: vsub.vx v24, v16, a2
6099 ; RV32-NEXT: vnot.v v16, v16
6100 ; RV32-NEXT: vand.vv v16, v16, v24
6101 ; RV32-NEXT: vsrl.vi v24, v16, 1
6102 ; RV32-NEXT: addi a4, sp, 8
6103 ; RV32-NEXT: vsetvli a5, zero, e64, m8, ta, ma
6104 ; RV32-NEXT: vlse64.v v0, (a4), zero
6105 ; RV32-NEXT: vsetvli zero, a3, e64, m8, ta, ma
6106 ; RV32-NEXT: csrr a5, vlenb
6107 ; RV32-NEXT: li a6, 24
6108 ; RV32-NEXT: mul a5, a5, a6
6109 ; RV32-NEXT: add a5, sp, a5
6110 ; RV32-NEXT: addi a5, a5, 16
6111 ; RV32-NEXT: vs8r.v v0, (a5) # Unknown-size Folded Spill
6112 ; RV32-NEXT: vand.vv v24, v24, v0
6113 ; RV32-NEXT: vsub.vv v16, v16, v24
6114 ; RV32-NEXT: vsetvli a5, zero, e64, m8, ta, ma
6115 ; RV32-NEXT: vlse64.v v0, (a4), zero
6116 ; RV32-NEXT: vsetvli zero, a3, e64, m8, ta, ma
6117 ; RV32-NEXT: vand.vv v24, v16, v0
6118 ; RV32-NEXT: vsrl.vi v16, v16, 2
6119 ; RV32-NEXT: vand.vv v16, v16, v0
6120 ; RV32-NEXT: vadd.vv v16, v24, v16
6121 ; RV32-NEXT: vsrl.vi v24, v16, 4
6122 ; RV32-NEXT: vadd.vv v16, v16, v24
6123 ; RV32-NEXT: vsetvli a5, zero, e64, m8, ta, ma
6124 ; RV32-NEXT: vlse64.v v24, (a4), zero
6125 ; RV32-NEXT: vsetvli zero, a3, e64, m8, ta, ma
6126 ; RV32-NEXT: csrr a5, vlenb
6127 ; RV32-NEXT: slli a5, a5, 4
6128 ; RV32-NEXT: add a5, sp, a5
6129 ; RV32-NEXT: addi a5, a5, 16
6130 ; RV32-NEXT: vs8r.v v24, (a5) # Unknown-size Folded Spill
6131 ; RV32-NEXT: vand.vv v24, v16, v24
6132 ; RV32-NEXT: vsetvli a5, zero, e64, m8, ta, ma
6133 ; RV32-NEXT: vlse64.v v16, (a4), zero
6134 ; RV32-NEXT: vsetvli zero, a3, e64, m8, ta, ma
6135 ; RV32-NEXT: csrr a3, vlenb
6136 ; RV32-NEXT: slli a3, a3, 3
6137 ; RV32-NEXT: add a3, sp, a3
6138 ; RV32-NEXT: addi a3, a3, 16
6139 ; RV32-NEXT: vs8r.v v16, (a3) # Unknown-size Folded Spill
6140 ; RV32-NEXT: vmul.vv v24, v24, v16
6141 ; RV32-NEXT: li a3, 56
6142 ; RV32-NEXT: vsrl.vx v16, v24, a3
6143 ; RV32-NEXT: addi a4, sp, 16
6144 ; RV32-NEXT: vs8r.v v16, (a4) # Unknown-size Folded Spill
6145 ; RV32-NEXT: bltu a0, a1, .LBB95_2
6146 ; RV32-NEXT: # %bb.1:
6147 ; RV32-NEXT: mv a0, a1
6148 ; RV32-NEXT: .LBB95_2:
6149 ; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, ma
6150 ; RV32-NEXT: vsub.vx v24, v8, a2
6151 ; RV32-NEXT: vnot.v v8, v8
6152 ; RV32-NEXT: vand.vv v8, v8, v24
6153 ; RV32-NEXT: vsrl.vi v24, v8, 1
6154 ; RV32-NEXT: csrr a0, vlenb
6155 ; RV32-NEXT: li a1, 24
6156 ; RV32-NEXT: mul a0, a0, a1
6157 ; RV32-NEXT: add a0, sp, a0
6158 ; RV32-NEXT: addi a0, a0, 16
6159 ; RV32-NEXT: vl8r.v v16, (a0) # Unknown-size Folded Reload
6160 ; RV32-NEXT: vand.vv v24, v24, v16
6161 ; RV32-NEXT: vsub.vv v8, v8, v24
6162 ; RV32-NEXT: vand.vv v24, v8, v0
6163 ; RV32-NEXT: vsrl.vi v8, v8, 2
6164 ; RV32-NEXT: vand.vv v8, v8, v0
6165 ; RV32-NEXT: vadd.vv v8, v24, v8
6166 ; RV32-NEXT: vsrl.vi v24, v8, 4
6167 ; RV32-NEXT: vadd.vv v8, v8, v24
6168 ; RV32-NEXT: csrr a0, vlenb
6169 ; RV32-NEXT: slli a0, a0, 4
6170 ; RV32-NEXT: add a0, sp, a0
6171 ; RV32-NEXT: addi a0, a0, 16
6172 ; RV32-NEXT: vl8r.v v16, (a0) # Unknown-size Folded Reload
6173 ; RV32-NEXT: vand.vv v8, v8, v16
6174 ; RV32-NEXT: csrr a0, vlenb
6175 ; RV32-NEXT: slli a0, a0, 3
6176 ; RV32-NEXT: add a0, sp, a0
6177 ; RV32-NEXT: addi a0, a0, 16
6178 ; RV32-NEXT: vl8r.v v16, (a0) # Unknown-size Folded Reload
6179 ; RV32-NEXT: vmul.vv v8, v8, v16
6180 ; RV32-NEXT: vsrl.vx v8, v8, a3
6181 ; RV32-NEXT: addi a0, sp, 16
6182 ; RV32-NEXT: vl8r.v v16, (a0) # Unknown-size Folded Reload
6183 ; RV32-NEXT: csrr a0, vlenb
6184 ; RV32-NEXT: slli a0, a0, 5
6185 ; RV32-NEXT: add sp, sp, a0
6186 ; RV32-NEXT: addi sp, sp, 16
6189 ; RV64-LABEL: vp_cttz_zero_undef_nxv16i64_unmasked:
6191 ; RV64-NEXT: csrr a1, vlenb
6192 ; RV64-NEXT: sub a2, a0, a1
6193 ; RV64-NEXT: sltu a3, a0, a2
6194 ; RV64-NEXT: addi a3, a3, -1
6195 ; RV64-NEXT: and a3, a3, a2
6196 ; RV64-NEXT: li a2, 1
6197 ; RV64-NEXT: vsetvli zero, a3, e64, m8, ta, ma
6198 ; RV64-NEXT: vsub.vx v24, v16, a2
6199 ; RV64-NEXT: vnot.v v16, v16
6200 ; RV64-NEXT: vand.vv v16, v16, v24
6201 ; RV64-NEXT: lui a3, %hi(.LCPI95_0)
6202 ; RV64-NEXT: ld a3, %lo(.LCPI95_0)(a3)
6203 ; RV64-NEXT: lui a4, %hi(.LCPI95_1)
6204 ; RV64-NEXT: ld a4, %lo(.LCPI95_1)(a4)
6205 ; RV64-NEXT: vsrl.vi v24, v16, 1
6206 ; RV64-NEXT: vand.vx v24, v24, a3
6207 ; RV64-NEXT: vsub.vv v16, v16, v24
6208 ; RV64-NEXT: vand.vx v24, v16, a4
6209 ; RV64-NEXT: vsrl.vi v16, v16, 2
6210 ; RV64-NEXT: vand.vx v16, v16, a4
6211 ; RV64-NEXT: vadd.vv v16, v24, v16
6212 ; RV64-NEXT: lui a5, %hi(.LCPI95_2)
6213 ; RV64-NEXT: ld a5, %lo(.LCPI95_2)(a5)
6214 ; RV64-NEXT: lui a6, %hi(.LCPI95_3)
6215 ; RV64-NEXT: ld a6, %lo(.LCPI95_3)(a6)
6216 ; RV64-NEXT: vsrl.vi v24, v16, 4
6217 ; RV64-NEXT: vadd.vv v16, v16, v24
6218 ; RV64-NEXT: vand.vx v16, v16, a5
6219 ; RV64-NEXT: vmul.vx v16, v16, a6
6220 ; RV64-NEXT: li a7, 56
6221 ; RV64-NEXT: vsrl.vx v16, v16, a7
6222 ; RV64-NEXT: bltu a0, a1, .LBB95_2
6223 ; RV64-NEXT: # %bb.1:
6224 ; RV64-NEXT: mv a0, a1
6225 ; RV64-NEXT: .LBB95_2:
6226 ; RV64-NEXT: vsetvli zero, a0, e64, m8, ta, ma
6227 ; RV64-NEXT: vsub.vx v24, v8, a2
6228 ; RV64-NEXT: vnot.v v8, v8
6229 ; RV64-NEXT: vand.vv v8, v8, v24
6230 ; RV64-NEXT: vsrl.vi v24, v8, 1
6231 ; RV64-NEXT: vand.vx v24, v24, a3
6232 ; RV64-NEXT: vsub.vv v8, v8, v24
6233 ; RV64-NEXT: vand.vx v24, v8, a4
6234 ; RV64-NEXT: vsrl.vi v8, v8, 2
6235 ; RV64-NEXT: vand.vx v8, v8, a4
6236 ; RV64-NEXT: vadd.vv v8, v24, v8
6237 ; RV64-NEXT: vsrl.vi v24, v8, 4
6238 ; RV64-NEXT: vadd.vv v8, v8, v24
6239 ; RV64-NEXT: vand.vx v8, v8, a5
6240 ; RV64-NEXT: vmul.vx v8, v8, a6
6241 ; RV64-NEXT: vsrl.vx v8, v8, a7
6243 %head = insertelement <vscale x 16 x i1> poison, i1 true, i32 0
6244 %m = shufflevector <vscale x 16 x i1> %head, <vscale x 16 x i1> poison, <vscale x 16 x i32> zeroinitializer
6245 %v = call <vscale x 16 x i64> @llvm.vp.cttz.nxv16i64(<vscale x 16 x i64> %va, i1 true, <vscale x 16 x i1> %m, i32 %evl)
6246 ret <vscale x 16 x i64> %v