1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv32 -mattr=+m,+zve64x,+zvl128b -verify-machineinstrs < %s | FileCheck %s --check-prefixes=RVI,RV32I
3 ; RUN: llc -mtriple=riscv64 -mattr=+m,+zve64x,+zvl128b -verify-machineinstrs < %s | FileCheck %s --check-prefixes=RVI,RV64I
4 ; RUN: llc -mtriple=riscv32 -mattr=+m,+zve64f,+zvl128b,+f -verify-machineinstrs < %s | FileCheck %s --check-prefixes=RVF,RV32F
5 ; RUN: llc -mtriple=riscv64 -mattr=+m,+zve64f,+zvl128b,+f -verify-machineinstrs < %s | FileCheck %s --check-prefixes=RVF,RV64F
6 ; RUN: llc -mtriple=riscv32 -mattr=+m,+v,+d -verify-machineinstrs < %s | FileCheck %s --check-prefixes=RVD,RV32D
7 ; RUN: llc -mtriple=riscv64 -mattr=+m,+v,+d -verify-machineinstrs < %s | FileCheck %s --check-prefixes=RVD,RV64D
8 ; RUN: llc -mtriple=riscv32 -mattr=+v,+zvbb -verify-machineinstrs < %s | FileCheck %s --check-prefixes=ZVBB
9 ; RUN: llc -mtriple=riscv64 -mattr=+v,+zvbb -verify-machineinstrs < %s | FileCheck %s --check-prefixes=ZVBB
11 define void @ctlz_v16i8(ptr %x, ptr %y) nounwind {
12 ; RVI-LABEL: ctlz_v16i8:
14 ; RVI-NEXT: vsetivli zero, 16, e8, m1, ta, ma
15 ; RVI-NEXT: vle8.v v8, (a0)
16 ; RVI-NEXT: vsrl.vi v9, v8, 1
17 ; RVI-NEXT: vor.vv v8, v8, v9
18 ; RVI-NEXT: vsrl.vi v9, v8, 2
19 ; RVI-NEXT: vor.vv v8, v8, v9
20 ; RVI-NEXT: vsrl.vi v9, v8, 4
21 ; RVI-NEXT: vor.vv v8, v8, v9
22 ; RVI-NEXT: vnot.v v8, v8
23 ; RVI-NEXT: vsrl.vi v9, v8, 1
25 ; RVI-NEXT: vand.vx v9, v9, a1
26 ; RVI-NEXT: vsub.vv v8, v8, v9
28 ; RVI-NEXT: vand.vx v9, v8, a1
29 ; RVI-NEXT: vsrl.vi v8, v8, 2
30 ; RVI-NEXT: vand.vx v8, v8, a1
31 ; RVI-NEXT: vadd.vv v8, v9, v8
32 ; RVI-NEXT: vsrl.vi v9, v8, 4
33 ; RVI-NEXT: vadd.vv v8, v8, v9
34 ; RVI-NEXT: vand.vi v8, v8, 15
35 ; RVI-NEXT: vse8.v v8, (a0)
38 ; RVF-LABEL: ctlz_v16i8:
40 ; RVF-NEXT: vsetivli zero, 16, e16, m2, ta, ma
41 ; RVF-NEXT: vle8.v v8, (a0)
42 ; RVF-NEXT: vzext.vf2 v10, v8
43 ; RVF-NEXT: vfwcvt.f.xu.v v12, v10
44 ; RVF-NEXT: vnsrl.wi v8, v12, 23
45 ; RVF-NEXT: vsetvli zero, zero, e8, m1, ta, ma
46 ; RVF-NEXT: vnsrl.wi v10, v8, 0
47 ; RVF-NEXT: li a1, 134
48 ; RVF-NEXT: vrsub.vx v8, v10, a1
50 ; RVF-NEXT: vminu.vx v8, v8, a1
51 ; RVF-NEXT: vse8.v v8, (a0)
54 ; RVD-LABEL: ctlz_v16i8:
56 ; RVD-NEXT: vsetivli zero, 16, e16, m2, ta, ma
57 ; RVD-NEXT: vle8.v v8, (a0)
58 ; RVD-NEXT: vzext.vf2 v10, v8
59 ; RVD-NEXT: vfwcvt.f.xu.v v12, v10
60 ; RVD-NEXT: vnsrl.wi v8, v12, 23
61 ; RVD-NEXT: vsetvli zero, zero, e8, m1, ta, ma
62 ; RVD-NEXT: vnsrl.wi v10, v8, 0
63 ; RVD-NEXT: li a1, 134
64 ; RVD-NEXT: vrsub.vx v8, v10, a1
66 ; RVD-NEXT: vminu.vx v8, v8, a1
67 ; RVD-NEXT: vse8.v v8, (a0)
70 ; ZVBB-LABEL: ctlz_v16i8:
72 ; ZVBB-NEXT: vsetivli zero, 16, e8, m1, ta, ma
73 ; ZVBB-NEXT: vle8.v v8, (a0)
74 ; ZVBB-NEXT: vclz.v v8, v8
75 ; ZVBB-NEXT: vse8.v v8, (a0)
77 %a = load <16 x i8>, ptr %x
78 %b = load <16 x i8>, ptr %y
79 %c = call <16 x i8> @llvm.ctlz.v16i8(<16 x i8> %a, i1 false)
80 store <16 x i8> %c, ptr %x
83 declare <16 x i8> @llvm.ctlz.v16i8(<16 x i8>, i1)
85 define void @ctlz_v8i16(ptr %x, ptr %y) nounwind {
86 ; RVI-LABEL: ctlz_v8i16:
88 ; RVI-NEXT: vsetivli zero, 8, e16, m1, ta, ma
89 ; RVI-NEXT: vle16.v v8, (a0)
90 ; RVI-NEXT: vsrl.vi v9, v8, 1
91 ; RVI-NEXT: vor.vv v8, v8, v9
92 ; RVI-NEXT: vsrl.vi v9, v8, 2
93 ; RVI-NEXT: vor.vv v8, v8, v9
94 ; RVI-NEXT: vsrl.vi v9, v8, 4
95 ; RVI-NEXT: vor.vv v8, v8, v9
96 ; RVI-NEXT: vsrl.vi v9, v8, 8
97 ; RVI-NEXT: vor.vv v8, v8, v9
98 ; RVI-NEXT: vnot.v v8, v8
99 ; RVI-NEXT: vsrl.vi v9, v8, 1
100 ; RVI-NEXT: lui a1, 5
101 ; RVI-NEXT: addi a1, a1, 1365
102 ; RVI-NEXT: vand.vx v9, v9, a1
103 ; RVI-NEXT: vsub.vv v8, v8, v9
104 ; RVI-NEXT: lui a1, 3
105 ; RVI-NEXT: addi a1, a1, 819
106 ; RVI-NEXT: vand.vx v9, v8, a1
107 ; RVI-NEXT: vsrl.vi v8, v8, 2
108 ; RVI-NEXT: vand.vx v8, v8, a1
109 ; RVI-NEXT: vadd.vv v8, v9, v8
110 ; RVI-NEXT: vsrl.vi v9, v8, 4
111 ; RVI-NEXT: vadd.vv v8, v8, v9
112 ; RVI-NEXT: lui a1, 1
113 ; RVI-NEXT: addi a1, a1, -241
114 ; RVI-NEXT: vand.vx v8, v8, a1
115 ; RVI-NEXT: li a1, 257
116 ; RVI-NEXT: vmul.vx v8, v8, a1
117 ; RVI-NEXT: vsrl.vi v8, v8, 8
118 ; RVI-NEXT: vse16.v v8, (a0)
121 ; RVF-LABEL: ctlz_v8i16:
123 ; RVF-NEXT: vsetivli zero, 8, e16, m1, ta, ma
124 ; RVF-NEXT: vle16.v v8, (a0)
125 ; RVF-NEXT: vfwcvt.f.xu.v v10, v8
126 ; RVF-NEXT: vnsrl.wi v8, v10, 23
127 ; RVF-NEXT: li a1, 142
128 ; RVF-NEXT: vrsub.vx v8, v8, a1
129 ; RVF-NEXT: li a1, 16
130 ; RVF-NEXT: vminu.vx v8, v8, a1
131 ; RVF-NEXT: vse16.v v8, (a0)
134 ; RVD-LABEL: ctlz_v8i16:
136 ; RVD-NEXT: vsetivli zero, 8, e16, m1, ta, ma
137 ; RVD-NEXT: vle16.v v8, (a0)
138 ; RVD-NEXT: vfwcvt.f.xu.v v10, v8
139 ; RVD-NEXT: vnsrl.wi v8, v10, 23
140 ; RVD-NEXT: li a1, 142
141 ; RVD-NEXT: vrsub.vx v8, v8, a1
142 ; RVD-NEXT: li a1, 16
143 ; RVD-NEXT: vminu.vx v8, v8, a1
144 ; RVD-NEXT: vse16.v v8, (a0)
147 ; ZVBB-LABEL: ctlz_v8i16:
149 ; ZVBB-NEXT: vsetivli zero, 8, e16, m1, ta, ma
150 ; ZVBB-NEXT: vle16.v v8, (a0)
151 ; ZVBB-NEXT: vclz.v v8, v8
152 ; ZVBB-NEXT: vse16.v v8, (a0)
154 %a = load <8 x i16>, ptr %x
155 %b = load <8 x i16>, ptr %y
156 %c = call <8 x i16> @llvm.ctlz.v8i16(<8 x i16> %a, i1 false)
157 store <8 x i16> %c, ptr %x
160 declare <8 x i16> @llvm.ctlz.v8i16(<8 x i16>, i1)
162 define void @ctlz_v4i32(ptr %x, ptr %y) nounwind {
163 ; RVI-LABEL: ctlz_v4i32:
165 ; RVI-NEXT: vsetivli zero, 4, e32, m1, ta, ma
166 ; RVI-NEXT: vle32.v v8, (a0)
167 ; RVI-NEXT: vsrl.vi v9, v8, 1
168 ; RVI-NEXT: vor.vv v8, v8, v9
169 ; RVI-NEXT: vsrl.vi v9, v8, 2
170 ; RVI-NEXT: vor.vv v8, v8, v9
171 ; RVI-NEXT: vsrl.vi v9, v8, 4
172 ; RVI-NEXT: vor.vv v8, v8, v9
173 ; RVI-NEXT: vsrl.vi v9, v8, 8
174 ; RVI-NEXT: vor.vv v8, v8, v9
175 ; RVI-NEXT: vsrl.vi v9, v8, 16
176 ; RVI-NEXT: vor.vv v8, v8, v9
177 ; RVI-NEXT: vnot.v v8, v8
178 ; RVI-NEXT: vsrl.vi v9, v8, 1
179 ; RVI-NEXT: lui a1, 349525
180 ; RVI-NEXT: addi a1, a1, 1365
181 ; RVI-NEXT: vand.vx v9, v9, a1
182 ; RVI-NEXT: vsub.vv v8, v8, v9
183 ; RVI-NEXT: lui a1, 209715
184 ; RVI-NEXT: addi a1, a1, 819
185 ; RVI-NEXT: vand.vx v9, v8, a1
186 ; RVI-NEXT: vsrl.vi v8, v8, 2
187 ; RVI-NEXT: vand.vx v8, v8, a1
188 ; RVI-NEXT: vadd.vv v8, v9, v8
189 ; RVI-NEXT: vsrl.vi v9, v8, 4
190 ; RVI-NEXT: vadd.vv v8, v8, v9
191 ; RVI-NEXT: lui a1, 61681
192 ; RVI-NEXT: addi a1, a1, -241
193 ; RVI-NEXT: vand.vx v8, v8, a1
194 ; RVI-NEXT: lui a1, 4112
195 ; RVI-NEXT: addi a1, a1, 257
196 ; RVI-NEXT: vmul.vx v8, v8, a1
197 ; RVI-NEXT: vsrl.vi v8, v8, 24
198 ; RVI-NEXT: vse32.v v8, (a0)
201 ; RVF-LABEL: ctlz_v4i32:
203 ; RVF-NEXT: vsetivli zero, 4, e32, m1, ta, ma
204 ; RVF-NEXT: vle32.v v8, (a0)
205 ; RVF-NEXT: fsrmi a1, 1
206 ; RVF-NEXT: vfcvt.f.xu.v v8, v8
208 ; RVF-NEXT: vsrl.vi v8, v8, 23
209 ; RVF-NEXT: li a1, 158
210 ; RVF-NEXT: vrsub.vx v8, v8, a1
211 ; RVF-NEXT: li a1, 32
212 ; RVF-NEXT: vminu.vx v8, v8, a1
213 ; RVF-NEXT: vse32.v v8, (a0)
216 ; RVD-LABEL: ctlz_v4i32:
218 ; RVD-NEXT: vsetivli zero, 4, e32, m1, ta, ma
219 ; RVD-NEXT: vle32.v v8, (a0)
220 ; RVD-NEXT: vfwcvt.f.xu.v v10, v8
221 ; RVD-NEXT: li a1, 52
222 ; RVD-NEXT: vnsrl.wx v8, v10, a1
223 ; RVD-NEXT: li a1, 1054
224 ; RVD-NEXT: vrsub.vx v8, v8, a1
225 ; RVD-NEXT: li a1, 32
226 ; RVD-NEXT: vminu.vx v8, v8, a1
227 ; RVD-NEXT: vse32.v v8, (a0)
230 ; ZVBB-LABEL: ctlz_v4i32:
232 ; ZVBB-NEXT: vsetivli zero, 4, e32, m1, ta, ma
233 ; ZVBB-NEXT: vle32.v v8, (a0)
234 ; ZVBB-NEXT: vclz.v v8, v8
235 ; ZVBB-NEXT: vse32.v v8, (a0)
237 %a = load <4 x i32>, ptr %x
238 %b = load <4 x i32>, ptr %y
239 %c = call <4 x i32> @llvm.ctlz.v4i32(<4 x i32> %a, i1 false)
240 store <4 x i32> %c, ptr %x
243 declare <4 x i32> @llvm.ctlz.v4i32(<4 x i32>, i1)
245 define void @ctlz_v2i64(ptr %x, ptr %y) nounwind {
246 ; RV32I-LABEL: ctlz_v2i64:
248 ; RV32I-NEXT: vsetivli zero, 2, e64, m1, ta, ma
249 ; RV32I-NEXT: vle64.v v8, (a0)
250 ; RV32I-NEXT: vsrl.vi v9, v8, 1
251 ; RV32I-NEXT: vor.vv v8, v8, v9
252 ; RV32I-NEXT: vsrl.vi v9, v8, 2
253 ; RV32I-NEXT: vor.vv v8, v8, v9
254 ; RV32I-NEXT: vsrl.vi v9, v8, 4
255 ; RV32I-NEXT: vor.vv v8, v8, v9
256 ; RV32I-NEXT: vsrl.vi v9, v8, 8
257 ; RV32I-NEXT: vor.vv v8, v8, v9
258 ; RV32I-NEXT: vsrl.vi v9, v8, 16
259 ; RV32I-NEXT: vor.vv v8, v8, v9
260 ; RV32I-NEXT: li a1, 32
261 ; RV32I-NEXT: vsrl.vx v9, v8, a1
262 ; RV32I-NEXT: vor.vv v8, v8, v9
263 ; RV32I-NEXT: vnot.v v8, v8
264 ; RV32I-NEXT: vsrl.vi v9, v8, 1
265 ; RV32I-NEXT: lui a1, 349525
266 ; RV32I-NEXT: addi a1, a1, 1365
267 ; RV32I-NEXT: vsetivli zero, 4, e32, m1, ta, ma
268 ; RV32I-NEXT: vmv.v.x v10, a1
269 ; RV32I-NEXT: vsetivli zero, 2, e64, m1, ta, ma
270 ; RV32I-NEXT: vand.vv v9, v9, v10
271 ; RV32I-NEXT: vsub.vv v8, v8, v9
272 ; RV32I-NEXT: lui a1, 209715
273 ; RV32I-NEXT: addi a1, a1, 819
274 ; RV32I-NEXT: vsetivli zero, 4, e32, m1, ta, ma
275 ; RV32I-NEXT: vmv.v.x v9, a1
276 ; RV32I-NEXT: vsetivli zero, 2, e64, m1, ta, ma
277 ; RV32I-NEXT: vand.vv v10, v8, v9
278 ; RV32I-NEXT: vsrl.vi v8, v8, 2
279 ; RV32I-NEXT: vand.vv v8, v8, v9
280 ; RV32I-NEXT: vadd.vv v8, v10, v8
281 ; RV32I-NEXT: vsrl.vi v9, v8, 4
282 ; RV32I-NEXT: vadd.vv v8, v8, v9
283 ; RV32I-NEXT: lui a1, 61681
284 ; RV32I-NEXT: addi a1, a1, -241
285 ; RV32I-NEXT: vsetivli zero, 4, e32, m1, ta, ma
286 ; RV32I-NEXT: vmv.v.x v9, a1
287 ; RV32I-NEXT: vsetivli zero, 2, e64, m1, ta, ma
288 ; RV32I-NEXT: vand.vv v8, v8, v9
289 ; RV32I-NEXT: lui a1, 4112
290 ; RV32I-NEXT: addi a1, a1, 257
291 ; RV32I-NEXT: vsetivli zero, 4, e32, m1, ta, ma
292 ; RV32I-NEXT: vmv.v.x v9, a1
293 ; RV32I-NEXT: vsetivli zero, 2, e64, m1, ta, ma
294 ; RV32I-NEXT: vmul.vv v8, v8, v9
295 ; RV32I-NEXT: li a1, 56
296 ; RV32I-NEXT: vsrl.vx v8, v8, a1
297 ; RV32I-NEXT: vse64.v v8, (a0)
300 ; RV64I-LABEL: ctlz_v2i64:
302 ; RV64I-NEXT: vsetivli zero, 2, e64, m1, ta, ma
303 ; RV64I-NEXT: vle64.v v8, (a0)
304 ; RV64I-NEXT: vsrl.vi v9, v8, 1
305 ; RV64I-NEXT: vor.vv v8, v8, v9
306 ; RV64I-NEXT: vsrl.vi v9, v8, 2
307 ; RV64I-NEXT: vor.vv v8, v8, v9
308 ; RV64I-NEXT: vsrl.vi v9, v8, 4
309 ; RV64I-NEXT: vor.vv v8, v8, v9
310 ; RV64I-NEXT: vsrl.vi v9, v8, 8
311 ; RV64I-NEXT: vor.vv v8, v8, v9
312 ; RV64I-NEXT: vsrl.vi v9, v8, 16
313 ; RV64I-NEXT: vor.vv v8, v8, v9
314 ; RV64I-NEXT: li a1, 32
315 ; RV64I-NEXT: vsrl.vx v9, v8, a1
316 ; RV64I-NEXT: vor.vv v8, v8, v9
317 ; RV64I-NEXT: vnot.v v8, v8
318 ; RV64I-NEXT: vsrl.vi v9, v8, 1
319 ; RV64I-NEXT: lui a1, 349525
320 ; RV64I-NEXT: addiw a1, a1, 1365
321 ; RV64I-NEXT: slli a2, a1, 32
322 ; RV64I-NEXT: add a1, a1, a2
323 ; RV64I-NEXT: vand.vx v9, v9, a1
324 ; RV64I-NEXT: vsub.vv v8, v8, v9
325 ; RV64I-NEXT: lui a1, 209715
326 ; RV64I-NEXT: addiw a1, a1, 819
327 ; RV64I-NEXT: slli a2, a1, 32
328 ; RV64I-NEXT: add a1, a1, a2
329 ; RV64I-NEXT: vand.vx v9, v8, a1
330 ; RV64I-NEXT: vsrl.vi v8, v8, 2
331 ; RV64I-NEXT: vand.vx v8, v8, a1
332 ; RV64I-NEXT: vadd.vv v8, v9, v8
333 ; RV64I-NEXT: vsrl.vi v9, v8, 4
334 ; RV64I-NEXT: vadd.vv v8, v8, v9
335 ; RV64I-NEXT: lui a1, 61681
336 ; RV64I-NEXT: addiw a1, a1, -241
337 ; RV64I-NEXT: slli a2, a1, 32
338 ; RV64I-NEXT: add a1, a1, a2
339 ; RV64I-NEXT: vand.vx v8, v8, a1
340 ; RV64I-NEXT: lui a1, 4112
341 ; RV64I-NEXT: addiw a1, a1, 257
342 ; RV64I-NEXT: slli a2, a1, 32
343 ; RV64I-NEXT: add a1, a1, a2
344 ; RV64I-NEXT: vmul.vx v8, v8, a1
345 ; RV64I-NEXT: li a1, 56
346 ; RV64I-NEXT: vsrl.vx v8, v8, a1
347 ; RV64I-NEXT: vse64.v v8, (a0)
350 ; RVF-LABEL: ctlz_v2i64:
352 ; RVF-NEXT: vsetivli zero, 2, e32, mf2, ta, ma
353 ; RVF-NEXT: vle64.v v8, (a0)
354 ; RVF-NEXT: li a1, 190
355 ; RVF-NEXT: vmv.v.x v9, a1
356 ; RVF-NEXT: fsrmi a1, 1
357 ; RVF-NEXT: vfncvt.f.xu.w v10, v8
359 ; RVF-NEXT: vsrl.vi v8, v10, 23
360 ; RVF-NEXT: vwsubu.vv v10, v9, v8
361 ; RVF-NEXT: li a1, 64
362 ; RVF-NEXT: vsetvli zero, zero, e64, m1, ta, ma
363 ; RVF-NEXT: vminu.vx v8, v10, a1
364 ; RVF-NEXT: vse64.v v8, (a0)
367 ; RVD-LABEL: ctlz_v2i64:
369 ; RVD-NEXT: vsetivli zero, 2, e64, m1, ta, ma
370 ; RVD-NEXT: vle64.v v8, (a0)
371 ; RVD-NEXT: fsrmi a1, 1
372 ; RVD-NEXT: vfcvt.f.xu.v v8, v8
374 ; RVD-NEXT: li a1, 52
375 ; RVD-NEXT: vsrl.vx v8, v8, a1
376 ; RVD-NEXT: li a1, 1086
377 ; RVD-NEXT: vrsub.vx v8, v8, a1
378 ; RVD-NEXT: li a1, 64
379 ; RVD-NEXT: vminu.vx v8, v8, a1
380 ; RVD-NEXT: vse64.v v8, (a0)
383 ; ZVBB-LABEL: ctlz_v2i64:
385 ; ZVBB-NEXT: vsetivli zero, 2, e64, m1, ta, ma
386 ; ZVBB-NEXT: vle64.v v8, (a0)
387 ; ZVBB-NEXT: vclz.v v8, v8
388 ; ZVBB-NEXT: vse64.v v8, (a0)
390 %a = load <2 x i64>, ptr %x
391 %b = load <2 x i64>, ptr %y
392 %c = call <2 x i64> @llvm.ctlz.v2i64(<2 x i64> %a, i1 false)
393 store <2 x i64> %c, ptr %x
396 declare <2 x i64> @llvm.ctlz.v2i64(<2 x i64>, i1)
398 define void @ctlz_v32i8(ptr %x, ptr %y) nounwind {
399 ; RVI-LABEL: ctlz_v32i8:
401 ; RVI-NEXT: li a1, 32
402 ; RVI-NEXT: vsetvli zero, a1, e8, m2, ta, ma
403 ; RVI-NEXT: vle8.v v8, (a0)
404 ; RVI-NEXT: vsrl.vi v10, v8, 1
405 ; RVI-NEXT: vor.vv v8, v8, v10
406 ; RVI-NEXT: vsrl.vi v10, v8, 2
407 ; RVI-NEXT: vor.vv v8, v8, v10
408 ; RVI-NEXT: vsrl.vi v10, v8, 4
409 ; RVI-NEXT: vor.vv v8, v8, v10
410 ; RVI-NEXT: vnot.v v8, v8
411 ; RVI-NEXT: vsrl.vi v10, v8, 1
412 ; RVI-NEXT: li a1, 85
413 ; RVI-NEXT: vand.vx v10, v10, a1
414 ; RVI-NEXT: vsub.vv v8, v8, v10
415 ; RVI-NEXT: li a1, 51
416 ; RVI-NEXT: vand.vx v10, v8, a1
417 ; RVI-NEXT: vsrl.vi v8, v8, 2
418 ; RVI-NEXT: vand.vx v8, v8, a1
419 ; RVI-NEXT: vadd.vv v8, v10, v8
420 ; RVI-NEXT: vsrl.vi v10, v8, 4
421 ; RVI-NEXT: vadd.vv v8, v8, v10
422 ; RVI-NEXT: vand.vi v8, v8, 15
423 ; RVI-NEXT: vse8.v v8, (a0)
426 ; RVF-LABEL: ctlz_v32i8:
428 ; RVF-NEXT: li a1, 32
429 ; RVF-NEXT: vsetvli zero, a1, e16, m4, ta, ma
430 ; RVF-NEXT: vle8.v v8, (a0)
431 ; RVF-NEXT: vzext.vf2 v12, v8
432 ; RVF-NEXT: vfwcvt.f.xu.v v16, v12
433 ; RVF-NEXT: vnsrl.wi v8, v16, 23
434 ; RVF-NEXT: vsetvli zero, zero, e8, m2, ta, ma
435 ; RVF-NEXT: vnsrl.wi v12, v8, 0
436 ; RVF-NEXT: li a1, 134
437 ; RVF-NEXT: vrsub.vx v8, v12, a1
439 ; RVF-NEXT: vminu.vx v8, v8, a1
440 ; RVF-NEXT: vse8.v v8, (a0)
443 ; RVD-LABEL: ctlz_v32i8:
445 ; RVD-NEXT: li a1, 32
446 ; RVD-NEXT: vsetvli zero, a1, e16, m4, ta, ma
447 ; RVD-NEXT: vle8.v v8, (a0)
448 ; RVD-NEXT: vzext.vf2 v12, v8
449 ; RVD-NEXT: vfwcvt.f.xu.v v16, v12
450 ; RVD-NEXT: vnsrl.wi v8, v16, 23
451 ; RVD-NEXT: vsetvli zero, zero, e8, m2, ta, ma
452 ; RVD-NEXT: vnsrl.wi v12, v8, 0
453 ; RVD-NEXT: li a1, 134
454 ; RVD-NEXT: vrsub.vx v8, v12, a1
456 ; RVD-NEXT: vminu.vx v8, v8, a1
457 ; RVD-NEXT: vse8.v v8, (a0)
460 ; ZVBB-LABEL: ctlz_v32i8:
462 ; ZVBB-NEXT: li a1, 32
463 ; ZVBB-NEXT: vsetvli zero, a1, e8, m2, ta, ma
464 ; ZVBB-NEXT: vle8.v v8, (a0)
465 ; ZVBB-NEXT: vclz.v v8, v8
466 ; ZVBB-NEXT: vse8.v v8, (a0)
468 %a = load <32 x i8>, ptr %x
469 %b = load <32 x i8>, ptr %y
470 %c = call <32 x i8> @llvm.ctlz.v32i8(<32 x i8> %a, i1 false)
471 store <32 x i8> %c, ptr %x
474 declare <32 x i8> @llvm.ctlz.v32i8(<32 x i8>, i1)
476 define void @ctlz_v16i16(ptr %x, ptr %y) nounwind {
477 ; RVI-LABEL: ctlz_v16i16:
479 ; RVI-NEXT: vsetivli zero, 16, e16, m2, ta, ma
480 ; RVI-NEXT: vle16.v v8, (a0)
481 ; RVI-NEXT: vsrl.vi v10, v8, 1
482 ; RVI-NEXT: vor.vv v8, v8, v10
483 ; RVI-NEXT: vsrl.vi v10, v8, 2
484 ; RVI-NEXT: vor.vv v8, v8, v10
485 ; RVI-NEXT: vsrl.vi v10, v8, 4
486 ; RVI-NEXT: vor.vv v8, v8, v10
487 ; RVI-NEXT: vsrl.vi v10, v8, 8
488 ; RVI-NEXT: vor.vv v8, v8, v10
489 ; RVI-NEXT: vnot.v v8, v8
490 ; RVI-NEXT: vsrl.vi v10, v8, 1
491 ; RVI-NEXT: lui a1, 5
492 ; RVI-NEXT: addi a1, a1, 1365
493 ; RVI-NEXT: vand.vx v10, v10, a1
494 ; RVI-NEXT: vsub.vv v8, v8, v10
495 ; RVI-NEXT: lui a1, 3
496 ; RVI-NEXT: addi a1, a1, 819
497 ; RVI-NEXT: vand.vx v10, v8, a1
498 ; RVI-NEXT: vsrl.vi v8, v8, 2
499 ; RVI-NEXT: vand.vx v8, v8, a1
500 ; RVI-NEXT: vadd.vv v8, v10, v8
501 ; RVI-NEXT: vsrl.vi v10, v8, 4
502 ; RVI-NEXT: vadd.vv v8, v8, v10
503 ; RVI-NEXT: lui a1, 1
504 ; RVI-NEXT: addi a1, a1, -241
505 ; RVI-NEXT: vand.vx v8, v8, a1
506 ; RVI-NEXT: li a1, 257
507 ; RVI-NEXT: vmul.vx v8, v8, a1
508 ; RVI-NEXT: vsrl.vi v8, v8, 8
509 ; RVI-NEXT: vse16.v v8, (a0)
512 ; RVF-LABEL: ctlz_v16i16:
514 ; RVF-NEXT: vsetivli zero, 16, e16, m2, ta, ma
515 ; RVF-NEXT: vle16.v v8, (a0)
516 ; RVF-NEXT: vfwcvt.f.xu.v v12, v8
517 ; RVF-NEXT: vnsrl.wi v8, v12, 23
518 ; RVF-NEXT: li a1, 142
519 ; RVF-NEXT: vrsub.vx v8, v8, a1
520 ; RVF-NEXT: li a1, 16
521 ; RVF-NEXT: vminu.vx v8, v8, a1
522 ; RVF-NEXT: vse16.v v8, (a0)
525 ; RVD-LABEL: ctlz_v16i16:
527 ; RVD-NEXT: vsetivli zero, 16, e16, m2, ta, ma
528 ; RVD-NEXT: vle16.v v8, (a0)
529 ; RVD-NEXT: vfwcvt.f.xu.v v12, v8
530 ; RVD-NEXT: vnsrl.wi v8, v12, 23
531 ; RVD-NEXT: li a1, 142
532 ; RVD-NEXT: vrsub.vx v8, v8, a1
533 ; RVD-NEXT: li a1, 16
534 ; RVD-NEXT: vminu.vx v8, v8, a1
535 ; RVD-NEXT: vse16.v v8, (a0)
538 ; ZVBB-LABEL: ctlz_v16i16:
540 ; ZVBB-NEXT: vsetivli zero, 16, e16, m2, ta, ma
541 ; ZVBB-NEXT: vle16.v v8, (a0)
542 ; ZVBB-NEXT: vclz.v v8, v8
543 ; ZVBB-NEXT: vse16.v v8, (a0)
545 %a = load <16 x i16>, ptr %x
546 %b = load <16 x i16>, ptr %y
547 %c = call <16 x i16> @llvm.ctlz.v16i16(<16 x i16> %a, i1 false)
548 store <16 x i16> %c, ptr %x
551 declare <16 x i16> @llvm.ctlz.v16i16(<16 x i16>, i1)
553 define void @ctlz_v8i32(ptr %x, ptr %y) nounwind {
554 ; RVI-LABEL: ctlz_v8i32:
556 ; RVI-NEXT: vsetivli zero, 8, e32, m2, ta, ma
557 ; RVI-NEXT: vle32.v v8, (a0)
558 ; RVI-NEXT: vsrl.vi v10, v8, 1
559 ; RVI-NEXT: vor.vv v8, v8, v10
560 ; RVI-NEXT: vsrl.vi v10, v8, 2
561 ; RVI-NEXT: vor.vv v8, v8, v10
562 ; RVI-NEXT: vsrl.vi v10, v8, 4
563 ; RVI-NEXT: vor.vv v8, v8, v10
564 ; RVI-NEXT: vsrl.vi v10, v8, 8
565 ; RVI-NEXT: vor.vv v8, v8, v10
566 ; RVI-NEXT: vsrl.vi v10, v8, 16
567 ; RVI-NEXT: vor.vv v8, v8, v10
568 ; RVI-NEXT: vnot.v v8, v8
569 ; RVI-NEXT: vsrl.vi v10, v8, 1
570 ; RVI-NEXT: lui a1, 349525
571 ; RVI-NEXT: addi a1, a1, 1365
572 ; RVI-NEXT: vand.vx v10, v10, a1
573 ; RVI-NEXT: vsub.vv v8, v8, v10
574 ; RVI-NEXT: lui a1, 209715
575 ; RVI-NEXT: addi a1, a1, 819
576 ; RVI-NEXT: vand.vx v10, v8, a1
577 ; RVI-NEXT: vsrl.vi v8, v8, 2
578 ; RVI-NEXT: vand.vx v8, v8, a1
579 ; RVI-NEXT: vadd.vv v8, v10, v8
580 ; RVI-NEXT: vsrl.vi v10, v8, 4
581 ; RVI-NEXT: vadd.vv v8, v8, v10
582 ; RVI-NEXT: lui a1, 61681
583 ; RVI-NEXT: addi a1, a1, -241
584 ; RVI-NEXT: vand.vx v8, v8, a1
585 ; RVI-NEXT: lui a1, 4112
586 ; RVI-NEXT: addi a1, a1, 257
587 ; RVI-NEXT: vmul.vx v8, v8, a1
588 ; RVI-NEXT: vsrl.vi v8, v8, 24
589 ; RVI-NEXT: vse32.v v8, (a0)
592 ; RVF-LABEL: ctlz_v8i32:
594 ; RVF-NEXT: vsetivli zero, 8, e32, m2, ta, ma
595 ; RVF-NEXT: vle32.v v8, (a0)
596 ; RVF-NEXT: fsrmi a1, 1
597 ; RVF-NEXT: vfcvt.f.xu.v v8, v8
599 ; RVF-NEXT: vsrl.vi v8, v8, 23
600 ; RVF-NEXT: li a1, 158
601 ; RVF-NEXT: vrsub.vx v8, v8, a1
602 ; RVF-NEXT: li a1, 32
603 ; RVF-NEXT: vminu.vx v8, v8, a1
604 ; RVF-NEXT: vse32.v v8, (a0)
607 ; RVD-LABEL: ctlz_v8i32:
609 ; RVD-NEXT: vsetivli zero, 8, e32, m2, ta, ma
610 ; RVD-NEXT: vle32.v v8, (a0)
611 ; RVD-NEXT: vfwcvt.f.xu.v v12, v8
612 ; RVD-NEXT: li a1, 52
613 ; RVD-NEXT: vnsrl.wx v8, v12, a1
614 ; RVD-NEXT: li a1, 1054
615 ; RVD-NEXT: vrsub.vx v8, v8, a1
616 ; RVD-NEXT: li a1, 32
617 ; RVD-NEXT: vminu.vx v8, v8, a1
618 ; RVD-NEXT: vse32.v v8, (a0)
621 ; ZVBB-LABEL: ctlz_v8i32:
623 ; ZVBB-NEXT: vsetivli zero, 8, e32, m2, ta, ma
624 ; ZVBB-NEXT: vle32.v v8, (a0)
625 ; ZVBB-NEXT: vclz.v v8, v8
626 ; ZVBB-NEXT: vse32.v v8, (a0)
628 %a = load <8 x i32>, ptr %x
629 %b = load <8 x i32>, ptr %y
630 %c = call <8 x i32> @llvm.ctlz.v8i32(<8 x i32> %a, i1 false)
631 store <8 x i32> %c, ptr %x
634 declare <8 x i32> @llvm.ctlz.v8i32(<8 x i32>, i1)
636 define void @ctlz_v4i64(ptr %x, ptr %y) nounwind {
637 ; RV32I-LABEL: ctlz_v4i64:
639 ; RV32I-NEXT: vsetivli zero, 4, e64, m2, ta, ma
640 ; RV32I-NEXT: vle64.v v8, (a0)
641 ; RV32I-NEXT: vsrl.vi v10, v8, 1
642 ; RV32I-NEXT: vor.vv v8, v8, v10
643 ; RV32I-NEXT: vsrl.vi v10, v8, 2
644 ; RV32I-NEXT: vor.vv v8, v8, v10
645 ; RV32I-NEXT: vsrl.vi v10, v8, 4
646 ; RV32I-NEXT: vor.vv v8, v8, v10
647 ; RV32I-NEXT: vsrl.vi v10, v8, 8
648 ; RV32I-NEXT: vor.vv v8, v8, v10
649 ; RV32I-NEXT: vsrl.vi v10, v8, 16
650 ; RV32I-NEXT: vor.vv v8, v8, v10
651 ; RV32I-NEXT: li a1, 32
652 ; RV32I-NEXT: vsrl.vx v10, v8, a1
653 ; RV32I-NEXT: vor.vv v8, v8, v10
654 ; RV32I-NEXT: vnot.v v8, v8
655 ; RV32I-NEXT: vsrl.vi v10, v8, 1
656 ; RV32I-NEXT: lui a1, 349525
657 ; RV32I-NEXT: addi a1, a1, 1365
658 ; RV32I-NEXT: vsetivli zero, 8, e32, m2, ta, ma
659 ; RV32I-NEXT: vmv.v.x v12, a1
660 ; RV32I-NEXT: vsetivli zero, 4, e64, m2, ta, ma
661 ; RV32I-NEXT: vand.vv v10, v10, v12
662 ; RV32I-NEXT: vsub.vv v8, v8, v10
663 ; RV32I-NEXT: lui a1, 209715
664 ; RV32I-NEXT: addi a1, a1, 819
665 ; RV32I-NEXT: vsetivli zero, 8, e32, m2, ta, ma
666 ; RV32I-NEXT: vmv.v.x v10, a1
667 ; RV32I-NEXT: vsetivli zero, 4, e64, m2, ta, ma
668 ; RV32I-NEXT: vand.vv v12, v8, v10
669 ; RV32I-NEXT: vsrl.vi v8, v8, 2
670 ; RV32I-NEXT: vand.vv v8, v8, v10
671 ; RV32I-NEXT: vadd.vv v8, v12, v8
672 ; RV32I-NEXT: vsrl.vi v10, v8, 4
673 ; RV32I-NEXT: vadd.vv v8, v8, v10
674 ; RV32I-NEXT: lui a1, 61681
675 ; RV32I-NEXT: addi a1, a1, -241
676 ; RV32I-NEXT: vsetivli zero, 8, e32, m2, ta, ma
677 ; RV32I-NEXT: vmv.v.x v10, a1
678 ; RV32I-NEXT: vsetivli zero, 4, e64, m2, ta, ma
679 ; RV32I-NEXT: vand.vv v8, v8, v10
680 ; RV32I-NEXT: lui a1, 4112
681 ; RV32I-NEXT: addi a1, a1, 257
682 ; RV32I-NEXT: vsetivli zero, 8, e32, m2, ta, ma
683 ; RV32I-NEXT: vmv.v.x v10, a1
684 ; RV32I-NEXT: vsetivli zero, 4, e64, m2, ta, ma
685 ; RV32I-NEXT: vmul.vv v8, v8, v10
686 ; RV32I-NEXT: li a1, 56
687 ; RV32I-NEXT: vsrl.vx v8, v8, a1
688 ; RV32I-NEXT: vse64.v v8, (a0)
691 ; RV64I-LABEL: ctlz_v4i64:
693 ; RV64I-NEXT: vsetivli zero, 4, e64, m2, ta, ma
694 ; RV64I-NEXT: vle64.v v8, (a0)
695 ; RV64I-NEXT: vsrl.vi v10, v8, 1
696 ; RV64I-NEXT: vor.vv v8, v8, v10
697 ; RV64I-NEXT: vsrl.vi v10, v8, 2
698 ; RV64I-NEXT: vor.vv v8, v8, v10
699 ; RV64I-NEXT: vsrl.vi v10, v8, 4
700 ; RV64I-NEXT: vor.vv v8, v8, v10
701 ; RV64I-NEXT: vsrl.vi v10, v8, 8
702 ; RV64I-NEXT: vor.vv v8, v8, v10
703 ; RV64I-NEXT: vsrl.vi v10, v8, 16
704 ; RV64I-NEXT: vor.vv v8, v8, v10
705 ; RV64I-NEXT: li a1, 32
706 ; RV64I-NEXT: vsrl.vx v10, v8, a1
707 ; RV64I-NEXT: vor.vv v8, v8, v10
708 ; RV64I-NEXT: vnot.v v8, v8
709 ; RV64I-NEXT: vsrl.vi v10, v8, 1
710 ; RV64I-NEXT: lui a1, 349525
711 ; RV64I-NEXT: addiw a1, a1, 1365
712 ; RV64I-NEXT: slli a2, a1, 32
713 ; RV64I-NEXT: add a1, a1, a2
714 ; RV64I-NEXT: vand.vx v10, v10, a1
715 ; RV64I-NEXT: vsub.vv v8, v8, v10
716 ; RV64I-NEXT: lui a1, 209715
717 ; RV64I-NEXT: addiw a1, a1, 819
718 ; RV64I-NEXT: slli a2, a1, 32
719 ; RV64I-NEXT: add a1, a1, a2
720 ; RV64I-NEXT: vand.vx v10, v8, a1
721 ; RV64I-NEXT: vsrl.vi v8, v8, 2
722 ; RV64I-NEXT: vand.vx v8, v8, a1
723 ; RV64I-NEXT: vadd.vv v8, v10, v8
724 ; RV64I-NEXT: vsrl.vi v10, v8, 4
725 ; RV64I-NEXT: vadd.vv v8, v8, v10
726 ; RV64I-NEXT: lui a1, 61681
727 ; RV64I-NEXT: addiw a1, a1, -241
728 ; RV64I-NEXT: slli a2, a1, 32
729 ; RV64I-NEXT: add a1, a1, a2
730 ; RV64I-NEXT: vand.vx v8, v8, a1
731 ; RV64I-NEXT: lui a1, 4112
732 ; RV64I-NEXT: addiw a1, a1, 257
733 ; RV64I-NEXT: slli a2, a1, 32
734 ; RV64I-NEXT: add a1, a1, a2
735 ; RV64I-NEXT: vmul.vx v8, v8, a1
736 ; RV64I-NEXT: li a1, 56
737 ; RV64I-NEXT: vsrl.vx v8, v8, a1
738 ; RV64I-NEXT: vse64.v v8, (a0)
741 ; RVF-LABEL: ctlz_v4i64:
743 ; RVF-NEXT: vsetivli zero, 4, e32, m1, ta, ma
744 ; RVF-NEXT: vle64.v v8, (a0)
745 ; RVF-NEXT: li a1, 190
746 ; RVF-NEXT: vmv.v.x v10, a1
747 ; RVF-NEXT: fsrmi a1, 1
748 ; RVF-NEXT: vfncvt.f.xu.w v11, v8
750 ; RVF-NEXT: vsrl.vi v8, v11, 23
751 ; RVF-NEXT: vwsubu.vv v12, v10, v8
752 ; RVF-NEXT: li a1, 64
753 ; RVF-NEXT: vsetvli zero, zero, e64, m2, ta, ma
754 ; RVF-NEXT: vminu.vx v8, v12, a1
755 ; RVF-NEXT: vse64.v v8, (a0)
758 ; RVD-LABEL: ctlz_v4i64:
760 ; RVD-NEXT: vsetivli zero, 4, e64, m2, ta, ma
761 ; RVD-NEXT: vle64.v v8, (a0)
762 ; RVD-NEXT: fsrmi a1, 1
763 ; RVD-NEXT: vfcvt.f.xu.v v8, v8
765 ; RVD-NEXT: li a1, 52
766 ; RVD-NEXT: vsrl.vx v8, v8, a1
767 ; RVD-NEXT: li a1, 1086
768 ; RVD-NEXT: vrsub.vx v8, v8, a1
769 ; RVD-NEXT: li a1, 64
770 ; RVD-NEXT: vminu.vx v8, v8, a1
771 ; RVD-NEXT: vse64.v v8, (a0)
774 ; ZVBB-LABEL: ctlz_v4i64:
776 ; ZVBB-NEXT: vsetivli zero, 4, e64, m2, ta, ma
777 ; ZVBB-NEXT: vle64.v v8, (a0)
778 ; ZVBB-NEXT: vclz.v v8, v8
779 ; ZVBB-NEXT: vse64.v v8, (a0)
781 %a = load <4 x i64>, ptr %x
782 %b = load <4 x i64>, ptr %y
783 %c = call <4 x i64> @llvm.ctlz.v4i64(<4 x i64> %a, i1 false)
784 store <4 x i64> %c, ptr %x
787 declare <4 x i64> @llvm.ctlz.v4i64(<4 x i64>, i1)
789 define void @ctlz_zero_undef_v16i8(ptr %x, ptr %y) nounwind {
790 ; RVI-LABEL: ctlz_zero_undef_v16i8:
792 ; RVI-NEXT: vsetivli zero, 16, e8, m1, ta, ma
793 ; RVI-NEXT: vle8.v v8, (a0)
794 ; RVI-NEXT: vsrl.vi v9, v8, 1
795 ; RVI-NEXT: vor.vv v8, v8, v9
796 ; RVI-NEXT: vsrl.vi v9, v8, 2
797 ; RVI-NEXT: vor.vv v8, v8, v9
798 ; RVI-NEXT: vsrl.vi v9, v8, 4
799 ; RVI-NEXT: vor.vv v8, v8, v9
800 ; RVI-NEXT: vnot.v v8, v8
801 ; RVI-NEXT: vsrl.vi v9, v8, 1
802 ; RVI-NEXT: li a1, 85
803 ; RVI-NEXT: vand.vx v9, v9, a1
804 ; RVI-NEXT: vsub.vv v8, v8, v9
805 ; RVI-NEXT: li a1, 51
806 ; RVI-NEXT: vand.vx v9, v8, a1
807 ; RVI-NEXT: vsrl.vi v8, v8, 2
808 ; RVI-NEXT: vand.vx v8, v8, a1
809 ; RVI-NEXT: vadd.vv v8, v9, v8
810 ; RVI-NEXT: vsrl.vi v9, v8, 4
811 ; RVI-NEXT: vadd.vv v8, v8, v9
812 ; RVI-NEXT: vand.vi v8, v8, 15
813 ; RVI-NEXT: vse8.v v8, (a0)
816 ; RVF-LABEL: ctlz_zero_undef_v16i8:
818 ; RVF-NEXT: vsetivli zero, 16, e16, m2, ta, ma
819 ; RVF-NEXT: vle8.v v8, (a0)
820 ; RVF-NEXT: vzext.vf2 v10, v8
821 ; RVF-NEXT: vfwcvt.f.xu.v v12, v10
822 ; RVF-NEXT: vnsrl.wi v8, v12, 23
823 ; RVF-NEXT: vsetvli zero, zero, e8, m1, ta, ma
824 ; RVF-NEXT: vnsrl.wi v10, v8, 0
825 ; RVF-NEXT: li a1, 134
826 ; RVF-NEXT: vrsub.vx v8, v10, a1
827 ; RVF-NEXT: vse8.v v8, (a0)
830 ; RVD-LABEL: ctlz_zero_undef_v16i8:
832 ; RVD-NEXT: vsetivli zero, 16, e16, m2, ta, ma
833 ; RVD-NEXT: vle8.v v8, (a0)
834 ; RVD-NEXT: vzext.vf2 v10, v8
835 ; RVD-NEXT: vfwcvt.f.xu.v v12, v10
836 ; RVD-NEXT: vnsrl.wi v8, v12, 23
837 ; RVD-NEXT: vsetvli zero, zero, e8, m1, ta, ma
838 ; RVD-NEXT: vnsrl.wi v10, v8, 0
839 ; RVD-NEXT: li a1, 134
840 ; RVD-NEXT: vrsub.vx v8, v10, a1
841 ; RVD-NEXT: vse8.v v8, (a0)
844 ; ZVBB-LABEL: ctlz_zero_undef_v16i8:
846 ; ZVBB-NEXT: vsetivli zero, 16, e8, m1, ta, ma
847 ; ZVBB-NEXT: vle8.v v8, (a0)
848 ; ZVBB-NEXT: vclz.v v8, v8
849 ; ZVBB-NEXT: vse8.v v8, (a0)
851 %a = load <16 x i8>, ptr %x
852 %b = load <16 x i8>, ptr %y
853 %c = call <16 x i8> @llvm.ctlz.v16i8(<16 x i8> %a, i1 true)
854 store <16 x i8> %c, ptr %x
858 define void @ctlz_zero_undef_v8i16(ptr %x, ptr %y) nounwind {
859 ; RVI-LABEL: ctlz_zero_undef_v8i16:
861 ; RVI-NEXT: vsetivli zero, 8, e16, m1, ta, ma
862 ; RVI-NEXT: vle16.v v8, (a0)
863 ; RVI-NEXT: vsrl.vi v9, v8, 1
864 ; RVI-NEXT: vor.vv v8, v8, v9
865 ; RVI-NEXT: vsrl.vi v9, v8, 2
866 ; RVI-NEXT: vor.vv v8, v8, v9
867 ; RVI-NEXT: vsrl.vi v9, v8, 4
868 ; RVI-NEXT: vor.vv v8, v8, v9
869 ; RVI-NEXT: vsrl.vi v9, v8, 8
870 ; RVI-NEXT: vor.vv v8, v8, v9
871 ; RVI-NEXT: vnot.v v8, v8
872 ; RVI-NEXT: vsrl.vi v9, v8, 1
873 ; RVI-NEXT: lui a1, 5
874 ; RVI-NEXT: addi a1, a1, 1365
875 ; RVI-NEXT: vand.vx v9, v9, a1
876 ; RVI-NEXT: vsub.vv v8, v8, v9
877 ; RVI-NEXT: lui a1, 3
878 ; RVI-NEXT: addi a1, a1, 819
879 ; RVI-NEXT: vand.vx v9, v8, a1
880 ; RVI-NEXT: vsrl.vi v8, v8, 2
881 ; RVI-NEXT: vand.vx v8, v8, a1
882 ; RVI-NEXT: vadd.vv v8, v9, v8
883 ; RVI-NEXT: vsrl.vi v9, v8, 4
884 ; RVI-NEXT: vadd.vv v8, v8, v9
885 ; RVI-NEXT: lui a1, 1
886 ; RVI-NEXT: addi a1, a1, -241
887 ; RVI-NEXT: vand.vx v8, v8, a1
888 ; RVI-NEXT: li a1, 257
889 ; RVI-NEXT: vmul.vx v8, v8, a1
890 ; RVI-NEXT: vsrl.vi v8, v8, 8
891 ; RVI-NEXT: vse16.v v8, (a0)
894 ; RVF-LABEL: ctlz_zero_undef_v8i16:
896 ; RVF-NEXT: vsetivli zero, 8, e16, m1, ta, ma
897 ; RVF-NEXT: vle16.v v8, (a0)
898 ; RVF-NEXT: vfwcvt.f.xu.v v10, v8
899 ; RVF-NEXT: vnsrl.wi v8, v10, 23
900 ; RVF-NEXT: li a1, 142
901 ; RVF-NEXT: vrsub.vx v8, v8, a1
902 ; RVF-NEXT: vse16.v v8, (a0)
905 ; RVD-LABEL: ctlz_zero_undef_v8i16:
907 ; RVD-NEXT: vsetivli zero, 8, e16, m1, ta, ma
908 ; RVD-NEXT: vle16.v v8, (a0)
909 ; RVD-NEXT: vfwcvt.f.xu.v v10, v8
910 ; RVD-NEXT: vnsrl.wi v8, v10, 23
911 ; RVD-NEXT: li a1, 142
912 ; RVD-NEXT: vrsub.vx v8, v8, a1
913 ; RVD-NEXT: vse16.v v8, (a0)
916 ; ZVBB-LABEL: ctlz_zero_undef_v8i16:
918 ; ZVBB-NEXT: vsetivli zero, 8, e16, m1, ta, ma
919 ; ZVBB-NEXT: vle16.v v8, (a0)
920 ; ZVBB-NEXT: vclz.v v8, v8
921 ; ZVBB-NEXT: vse16.v v8, (a0)
923 %a = load <8 x i16>, ptr %x
924 %b = load <8 x i16>, ptr %y
925 %c = call <8 x i16> @llvm.ctlz.v8i16(<8 x i16> %a, i1 true)
926 store <8 x i16> %c, ptr %x
930 define void @ctlz_zero_undef_v4i32(ptr %x, ptr %y) nounwind {
931 ; RVI-LABEL: ctlz_zero_undef_v4i32:
933 ; RVI-NEXT: vsetivli zero, 4, e32, m1, ta, ma
934 ; RVI-NEXT: vle32.v v8, (a0)
935 ; RVI-NEXT: vsrl.vi v9, v8, 1
936 ; RVI-NEXT: vor.vv v8, v8, v9
937 ; RVI-NEXT: vsrl.vi v9, v8, 2
938 ; RVI-NEXT: vor.vv v8, v8, v9
939 ; RVI-NEXT: vsrl.vi v9, v8, 4
940 ; RVI-NEXT: vor.vv v8, v8, v9
941 ; RVI-NEXT: vsrl.vi v9, v8, 8
942 ; RVI-NEXT: vor.vv v8, v8, v9
943 ; RVI-NEXT: vsrl.vi v9, v8, 16
944 ; RVI-NEXT: vor.vv v8, v8, v9
945 ; RVI-NEXT: vnot.v v8, v8
946 ; RVI-NEXT: vsrl.vi v9, v8, 1
947 ; RVI-NEXT: lui a1, 349525
948 ; RVI-NEXT: addi a1, a1, 1365
949 ; RVI-NEXT: vand.vx v9, v9, a1
950 ; RVI-NEXT: vsub.vv v8, v8, v9
951 ; RVI-NEXT: lui a1, 209715
952 ; RVI-NEXT: addi a1, a1, 819
953 ; RVI-NEXT: vand.vx v9, v8, a1
954 ; RVI-NEXT: vsrl.vi v8, v8, 2
955 ; RVI-NEXT: vand.vx v8, v8, a1
956 ; RVI-NEXT: vadd.vv v8, v9, v8
957 ; RVI-NEXT: vsrl.vi v9, v8, 4
958 ; RVI-NEXT: vadd.vv v8, v8, v9
959 ; RVI-NEXT: lui a1, 61681
960 ; RVI-NEXT: addi a1, a1, -241
961 ; RVI-NEXT: vand.vx v8, v8, a1
962 ; RVI-NEXT: lui a1, 4112
963 ; RVI-NEXT: addi a1, a1, 257
964 ; RVI-NEXT: vmul.vx v8, v8, a1
965 ; RVI-NEXT: vsrl.vi v8, v8, 24
966 ; RVI-NEXT: vse32.v v8, (a0)
969 ; RVF-LABEL: ctlz_zero_undef_v4i32:
971 ; RVF-NEXT: vsetivli zero, 4, e32, m1, ta, ma
972 ; RVF-NEXT: vle32.v v8, (a0)
973 ; RVF-NEXT: fsrmi a1, 1
974 ; RVF-NEXT: vfcvt.f.xu.v v8, v8
976 ; RVF-NEXT: vsrl.vi v8, v8, 23
977 ; RVF-NEXT: li a1, 158
978 ; RVF-NEXT: vrsub.vx v8, v8, a1
979 ; RVF-NEXT: vse32.v v8, (a0)
982 ; RVD-LABEL: ctlz_zero_undef_v4i32:
984 ; RVD-NEXT: vsetivli zero, 4, e32, m1, ta, ma
985 ; RVD-NEXT: vle32.v v8, (a0)
986 ; RVD-NEXT: vfwcvt.f.xu.v v10, v8
987 ; RVD-NEXT: li a1, 52
988 ; RVD-NEXT: vnsrl.wx v8, v10, a1
989 ; RVD-NEXT: li a1, 1054
990 ; RVD-NEXT: vrsub.vx v8, v8, a1
991 ; RVD-NEXT: vse32.v v8, (a0)
994 ; ZVBB-LABEL: ctlz_zero_undef_v4i32:
996 ; ZVBB-NEXT: vsetivli zero, 4, e32, m1, ta, ma
997 ; ZVBB-NEXT: vle32.v v8, (a0)
998 ; ZVBB-NEXT: vclz.v v8, v8
999 ; ZVBB-NEXT: vse32.v v8, (a0)
1001 %a = load <4 x i32>, ptr %x
1002 %b = load <4 x i32>, ptr %y
1003 %c = call <4 x i32> @llvm.ctlz.v4i32(<4 x i32> %a, i1 true)
1004 store <4 x i32> %c, ptr %x
1008 define void @ctlz_zero_undef_v2i64(ptr %x, ptr %y) nounwind {
1009 ; RV32I-LABEL: ctlz_zero_undef_v2i64:
1011 ; RV32I-NEXT: vsetivli zero, 2, e64, m1, ta, ma
1012 ; RV32I-NEXT: vle64.v v8, (a0)
1013 ; RV32I-NEXT: vsrl.vi v9, v8, 1
1014 ; RV32I-NEXT: vor.vv v8, v8, v9
1015 ; RV32I-NEXT: vsrl.vi v9, v8, 2
1016 ; RV32I-NEXT: vor.vv v8, v8, v9
1017 ; RV32I-NEXT: vsrl.vi v9, v8, 4
1018 ; RV32I-NEXT: vor.vv v8, v8, v9
1019 ; RV32I-NEXT: vsrl.vi v9, v8, 8
1020 ; RV32I-NEXT: vor.vv v8, v8, v9
1021 ; RV32I-NEXT: vsrl.vi v9, v8, 16
1022 ; RV32I-NEXT: vor.vv v8, v8, v9
1023 ; RV32I-NEXT: li a1, 32
1024 ; RV32I-NEXT: vsrl.vx v9, v8, a1
1025 ; RV32I-NEXT: vor.vv v8, v8, v9
1026 ; RV32I-NEXT: vnot.v v8, v8
1027 ; RV32I-NEXT: vsrl.vi v9, v8, 1
1028 ; RV32I-NEXT: lui a1, 349525
1029 ; RV32I-NEXT: addi a1, a1, 1365
1030 ; RV32I-NEXT: vsetivli zero, 4, e32, m1, ta, ma
1031 ; RV32I-NEXT: vmv.v.x v10, a1
1032 ; RV32I-NEXT: vsetivli zero, 2, e64, m1, ta, ma
1033 ; RV32I-NEXT: vand.vv v9, v9, v10
1034 ; RV32I-NEXT: vsub.vv v8, v8, v9
1035 ; RV32I-NEXT: lui a1, 209715
1036 ; RV32I-NEXT: addi a1, a1, 819
1037 ; RV32I-NEXT: vsetivli zero, 4, e32, m1, ta, ma
1038 ; RV32I-NEXT: vmv.v.x v9, a1
1039 ; RV32I-NEXT: vsetivli zero, 2, e64, m1, ta, ma
1040 ; RV32I-NEXT: vand.vv v10, v8, v9
1041 ; RV32I-NEXT: vsrl.vi v8, v8, 2
1042 ; RV32I-NEXT: vand.vv v8, v8, v9
1043 ; RV32I-NEXT: vadd.vv v8, v10, v8
1044 ; RV32I-NEXT: vsrl.vi v9, v8, 4
1045 ; RV32I-NEXT: vadd.vv v8, v8, v9
1046 ; RV32I-NEXT: lui a1, 61681
1047 ; RV32I-NEXT: addi a1, a1, -241
1048 ; RV32I-NEXT: vsetivli zero, 4, e32, m1, ta, ma
1049 ; RV32I-NEXT: vmv.v.x v9, a1
1050 ; RV32I-NEXT: vsetivli zero, 2, e64, m1, ta, ma
1051 ; RV32I-NEXT: vand.vv v8, v8, v9
1052 ; RV32I-NEXT: lui a1, 4112
1053 ; RV32I-NEXT: addi a1, a1, 257
1054 ; RV32I-NEXT: vsetivli zero, 4, e32, m1, ta, ma
1055 ; RV32I-NEXT: vmv.v.x v9, a1
1056 ; RV32I-NEXT: vsetivli zero, 2, e64, m1, ta, ma
1057 ; RV32I-NEXT: vmul.vv v8, v8, v9
1058 ; RV32I-NEXT: li a1, 56
1059 ; RV32I-NEXT: vsrl.vx v8, v8, a1
1060 ; RV32I-NEXT: vse64.v v8, (a0)
1063 ; RV64I-LABEL: ctlz_zero_undef_v2i64:
1065 ; RV64I-NEXT: vsetivli zero, 2, e64, m1, ta, ma
1066 ; RV64I-NEXT: vle64.v v8, (a0)
1067 ; RV64I-NEXT: vsrl.vi v9, v8, 1
1068 ; RV64I-NEXT: vor.vv v8, v8, v9
1069 ; RV64I-NEXT: vsrl.vi v9, v8, 2
1070 ; RV64I-NEXT: vor.vv v8, v8, v9
1071 ; RV64I-NEXT: vsrl.vi v9, v8, 4
1072 ; RV64I-NEXT: vor.vv v8, v8, v9
1073 ; RV64I-NEXT: vsrl.vi v9, v8, 8
1074 ; RV64I-NEXT: vor.vv v8, v8, v9
1075 ; RV64I-NEXT: vsrl.vi v9, v8, 16
1076 ; RV64I-NEXT: vor.vv v8, v8, v9
1077 ; RV64I-NEXT: li a1, 32
1078 ; RV64I-NEXT: vsrl.vx v9, v8, a1
1079 ; RV64I-NEXT: vor.vv v8, v8, v9
1080 ; RV64I-NEXT: vnot.v v8, v8
1081 ; RV64I-NEXT: vsrl.vi v9, v8, 1
1082 ; RV64I-NEXT: lui a1, 349525
1083 ; RV64I-NEXT: addiw a1, a1, 1365
1084 ; RV64I-NEXT: slli a2, a1, 32
1085 ; RV64I-NEXT: add a1, a1, a2
1086 ; RV64I-NEXT: vand.vx v9, v9, a1
1087 ; RV64I-NEXT: vsub.vv v8, v8, v9
1088 ; RV64I-NEXT: lui a1, 209715
1089 ; RV64I-NEXT: addiw a1, a1, 819
1090 ; RV64I-NEXT: slli a2, a1, 32
1091 ; RV64I-NEXT: add a1, a1, a2
1092 ; RV64I-NEXT: vand.vx v9, v8, a1
1093 ; RV64I-NEXT: vsrl.vi v8, v8, 2
1094 ; RV64I-NEXT: vand.vx v8, v8, a1
1095 ; RV64I-NEXT: vadd.vv v8, v9, v8
1096 ; RV64I-NEXT: vsrl.vi v9, v8, 4
1097 ; RV64I-NEXT: vadd.vv v8, v8, v9
1098 ; RV64I-NEXT: lui a1, 61681
1099 ; RV64I-NEXT: addiw a1, a1, -241
1100 ; RV64I-NEXT: slli a2, a1, 32
1101 ; RV64I-NEXT: add a1, a1, a2
1102 ; RV64I-NEXT: vand.vx v8, v8, a1
1103 ; RV64I-NEXT: lui a1, 4112
1104 ; RV64I-NEXT: addiw a1, a1, 257
1105 ; RV64I-NEXT: slli a2, a1, 32
1106 ; RV64I-NEXT: add a1, a1, a2
1107 ; RV64I-NEXT: vmul.vx v8, v8, a1
1108 ; RV64I-NEXT: li a1, 56
1109 ; RV64I-NEXT: vsrl.vx v8, v8, a1
1110 ; RV64I-NEXT: vse64.v v8, (a0)
1113 ; RVF-LABEL: ctlz_zero_undef_v2i64:
1115 ; RVF-NEXT: vsetivli zero, 2, e32, mf2, ta, ma
1116 ; RVF-NEXT: vle64.v v8, (a0)
1117 ; RVF-NEXT: li a1, 190
1118 ; RVF-NEXT: vmv.v.x v9, a1
1119 ; RVF-NEXT: fsrmi a1, 1
1120 ; RVF-NEXT: vfncvt.f.xu.w v10, v8
1122 ; RVF-NEXT: vsrl.vi v8, v10, 23
1123 ; RVF-NEXT: vwsubu.vv v10, v9, v8
1124 ; RVF-NEXT: vse64.v v10, (a0)
1127 ; RVD-LABEL: ctlz_zero_undef_v2i64:
1129 ; RVD-NEXT: vsetivli zero, 2, e64, m1, ta, ma
1130 ; RVD-NEXT: vle64.v v8, (a0)
1131 ; RVD-NEXT: fsrmi a1, 1
1132 ; RVD-NEXT: vfcvt.f.xu.v v8, v8
1134 ; RVD-NEXT: li a1, 52
1135 ; RVD-NEXT: vsrl.vx v8, v8, a1
1136 ; RVD-NEXT: li a1, 1086
1137 ; RVD-NEXT: vrsub.vx v8, v8, a1
1138 ; RVD-NEXT: vse64.v v8, (a0)
1141 ; ZVBB-LABEL: ctlz_zero_undef_v2i64:
1143 ; ZVBB-NEXT: vsetivli zero, 2, e64, m1, ta, ma
1144 ; ZVBB-NEXT: vle64.v v8, (a0)
1145 ; ZVBB-NEXT: vclz.v v8, v8
1146 ; ZVBB-NEXT: vse64.v v8, (a0)
1148 %a = load <2 x i64>, ptr %x
1149 %b = load <2 x i64>, ptr %y
1150 %c = call <2 x i64> @llvm.ctlz.v2i64(<2 x i64> %a, i1 true)
1151 store <2 x i64> %c, ptr %x
1155 define void @ctlz_zero_undef_v32i8(ptr %x, ptr %y) nounwind {
1156 ; RVI-LABEL: ctlz_zero_undef_v32i8:
1158 ; RVI-NEXT: li a1, 32
1159 ; RVI-NEXT: vsetvli zero, a1, e8, m2, ta, ma
1160 ; RVI-NEXT: vle8.v v8, (a0)
1161 ; RVI-NEXT: vsrl.vi v10, v8, 1
1162 ; RVI-NEXT: vor.vv v8, v8, v10
1163 ; RVI-NEXT: vsrl.vi v10, v8, 2
1164 ; RVI-NEXT: vor.vv v8, v8, v10
1165 ; RVI-NEXT: vsrl.vi v10, v8, 4
1166 ; RVI-NEXT: vor.vv v8, v8, v10
1167 ; RVI-NEXT: vnot.v v8, v8
1168 ; RVI-NEXT: vsrl.vi v10, v8, 1
1169 ; RVI-NEXT: li a1, 85
1170 ; RVI-NEXT: vand.vx v10, v10, a1
1171 ; RVI-NEXT: vsub.vv v8, v8, v10
1172 ; RVI-NEXT: li a1, 51
1173 ; RVI-NEXT: vand.vx v10, v8, a1
1174 ; RVI-NEXT: vsrl.vi v8, v8, 2
1175 ; RVI-NEXT: vand.vx v8, v8, a1
1176 ; RVI-NEXT: vadd.vv v8, v10, v8
1177 ; RVI-NEXT: vsrl.vi v10, v8, 4
1178 ; RVI-NEXT: vadd.vv v8, v8, v10
1179 ; RVI-NEXT: vand.vi v8, v8, 15
1180 ; RVI-NEXT: vse8.v v8, (a0)
1183 ; RVF-LABEL: ctlz_zero_undef_v32i8:
1185 ; RVF-NEXT: li a1, 32
1186 ; RVF-NEXT: vsetvli zero, a1, e16, m4, ta, ma
1187 ; RVF-NEXT: vle8.v v8, (a0)
1188 ; RVF-NEXT: vzext.vf2 v12, v8
1189 ; RVF-NEXT: vfwcvt.f.xu.v v16, v12
1190 ; RVF-NEXT: vnsrl.wi v8, v16, 23
1191 ; RVF-NEXT: vsetvli zero, zero, e8, m2, ta, ma
1192 ; RVF-NEXT: vnsrl.wi v12, v8, 0
1193 ; RVF-NEXT: li a1, 134
1194 ; RVF-NEXT: vrsub.vx v8, v12, a1
1195 ; RVF-NEXT: vse8.v v8, (a0)
1198 ; RVD-LABEL: ctlz_zero_undef_v32i8:
1200 ; RVD-NEXT: li a1, 32
1201 ; RVD-NEXT: vsetvli zero, a1, e16, m4, ta, ma
1202 ; RVD-NEXT: vle8.v v8, (a0)
1203 ; RVD-NEXT: vzext.vf2 v12, v8
1204 ; RVD-NEXT: vfwcvt.f.xu.v v16, v12
1205 ; RVD-NEXT: vnsrl.wi v8, v16, 23
1206 ; RVD-NEXT: vsetvli zero, zero, e8, m2, ta, ma
1207 ; RVD-NEXT: vnsrl.wi v12, v8, 0
1208 ; RVD-NEXT: li a1, 134
1209 ; RVD-NEXT: vrsub.vx v8, v12, a1
1210 ; RVD-NEXT: vse8.v v8, (a0)
1213 ; ZVBB-LABEL: ctlz_zero_undef_v32i8:
1215 ; ZVBB-NEXT: li a1, 32
1216 ; ZVBB-NEXT: vsetvli zero, a1, e8, m2, ta, ma
1217 ; ZVBB-NEXT: vle8.v v8, (a0)
1218 ; ZVBB-NEXT: vclz.v v8, v8
1219 ; ZVBB-NEXT: vse8.v v8, (a0)
1221 %a = load <32 x i8>, ptr %x
1222 %b = load <32 x i8>, ptr %y
1223 %c = call <32 x i8> @llvm.ctlz.v32i8(<32 x i8> %a, i1 true)
1224 store <32 x i8> %c, ptr %x
1228 define void @ctlz_zero_undef_v16i16(ptr %x, ptr %y) nounwind {
1229 ; RVI-LABEL: ctlz_zero_undef_v16i16:
1231 ; RVI-NEXT: vsetivli zero, 16, e16, m2, ta, ma
1232 ; RVI-NEXT: vle16.v v8, (a0)
1233 ; RVI-NEXT: vsrl.vi v10, v8, 1
1234 ; RVI-NEXT: vor.vv v8, v8, v10
1235 ; RVI-NEXT: vsrl.vi v10, v8, 2
1236 ; RVI-NEXT: vor.vv v8, v8, v10
1237 ; RVI-NEXT: vsrl.vi v10, v8, 4
1238 ; RVI-NEXT: vor.vv v8, v8, v10
1239 ; RVI-NEXT: vsrl.vi v10, v8, 8
1240 ; RVI-NEXT: vor.vv v8, v8, v10
1241 ; RVI-NEXT: vnot.v v8, v8
1242 ; RVI-NEXT: vsrl.vi v10, v8, 1
1243 ; RVI-NEXT: lui a1, 5
1244 ; RVI-NEXT: addi a1, a1, 1365
1245 ; RVI-NEXT: vand.vx v10, v10, a1
1246 ; RVI-NEXT: vsub.vv v8, v8, v10
1247 ; RVI-NEXT: lui a1, 3
1248 ; RVI-NEXT: addi a1, a1, 819
1249 ; RVI-NEXT: vand.vx v10, v8, a1
1250 ; RVI-NEXT: vsrl.vi v8, v8, 2
1251 ; RVI-NEXT: vand.vx v8, v8, a1
1252 ; RVI-NEXT: vadd.vv v8, v10, v8
1253 ; RVI-NEXT: vsrl.vi v10, v8, 4
1254 ; RVI-NEXT: vadd.vv v8, v8, v10
1255 ; RVI-NEXT: lui a1, 1
1256 ; RVI-NEXT: addi a1, a1, -241
1257 ; RVI-NEXT: vand.vx v8, v8, a1
1258 ; RVI-NEXT: li a1, 257
1259 ; RVI-NEXT: vmul.vx v8, v8, a1
1260 ; RVI-NEXT: vsrl.vi v8, v8, 8
1261 ; RVI-NEXT: vse16.v v8, (a0)
1264 ; RVF-LABEL: ctlz_zero_undef_v16i16:
1266 ; RVF-NEXT: vsetivli zero, 16, e16, m2, ta, ma
1267 ; RVF-NEXT: vle16.v v8, (a0)
1268 ; RVF-NEXT: vfwcvt.f.xu.v v12, v8
1269 ; RVF-NEXT: vnsrl.wi v8, v12, 23
1270 ; RVF-NEXT: li a1, 142
1271 ; RVF-NEXT: vrsub.vx v8, v8, a1
1272 ; RVF-NEXT: vse16.v v8, (a0)
1275 ; RVD-LABEL: ctlz_zero_undef_v16i16:
1277 ; RVD-NEXT: vsetivli zero, 16, e16, m2, ta, ma
1278 ; RVD-NEXT: vle16.v v8, (a0)
1279 ; RVD-NEXT: vfwcvt.f.xu.v v12, v8
1280 ; RVD-NEXT: vnsrl.wi v8, v12, 23
1281 ; RVD-NEXT: li a1, 142
1282 ; RVD-NEXT: vrsub.vx v8, v8, a1
1283 ; RVD-NEXT: vse16.v v8, (a0)
1286 ; ZVBB-LABEL: ctlz_zero_undef_v16i16:
1288 ; ZVBB-NEXT: vsetivli zero, 16, e16, m2, ta, ma
1289 ; ZVBB-NEXT: vle16.v v8, (a0)
1290 ; ZVBB-NEXT: vclz.v v8, v8
1291 ; ZVBB-NEXT: vse16.v v8, (a0)
1293 %a = load <16 x i16>, ptr %x
1294 %b = load <16 x i16>, ptr %y
1295 %c = call <16 x i16> @llvm.ctlz.v16i16(<16 x i16> %a, i1 true)
1296 store <16 x i16> %c, ptr %x
1300 define void @ctlz_zero_undef_v8i32(ptr %x, ptr %y) nounwind {
1301 ; RVI-LABEL: ctlz_zero_undef_v8i32:
1303 ; RVI-NEXT: vsetivli zero, 8, e32, m2, ta, ma
1304 ; RVI-NEXT: vle32.v v8, (a0)
1305 ; RVI-NEXT: vsrl.vi v10, v8, 1
1306 ; RVI-NEXT: vor.vv v8, v8, v10
1307 ; RVI-NEXT: vsrl.vi v10, v8, 2
1308 ; RVI-NEXT: vor.vv v8, v8, v10
1309 ; RVI-NEXT: vsrl.vi v10, v8, 4
1310 ; RVI-NEXT: vor.vv v8, v8, v10
1311 ; RVI-NEXT: vsrl.vi v10, v8, 8
1312 ; RVI-NEXT: vor.vv v8, v8, v10
1313 ; RVI-NEXT: vsrl.vi v10, v8, 16
1314 ; RVI-NEXT: vor.vv v8, v8, v10
1315 ; RVI-NEXT: vnot.v v8, v8
1316 ; RVI-NEXT: vsrl.vi v10, v8, 1
1317 ; RVI-NEXT: lui a1, 349525
1318 ; RVI-NEXT: addi a1, a1, 1365
1319 ; RVI-NEXT: vand.vx v10, v10, a1
1320 ; RVI-NEXT: vsub.vv v8, v8, v10
1321 ; RVI-NEXT: lui a1, 209715
1322 ; RVI-NEXT: addi a1, a1, 819
1323 ; RVI-NEXT: vand.vx v10, v8, a1
1324 ; RVI-NEXT: vsrl.vi v8, v8, 2
1325 ; RVI-NEXT: vand.vx v8, v8, a1
1326 ; RVI-NEXT: vadd.vv v8, v10, v8
1327 ; RVI-NEXT: vsrl.vi v10, v8, 4
1328 ; RVI-NEXT: vadd.vv v8, v8, v10
1329 ; RVI-NEXT: lui a1, 61681
1330 ; RVI-NEXT: addi a1, a1, -241
1331 ; RVI-NEXT: vand.vx v8, v8, a1
1332 ; RVI-NEXT: lui a1, 4112
1333 ; RVI-NEXT: addi a1, a1, 257
1334 ; RVI-NEXT: vmul.vx v8, v8, a1
1335 ; RVI-NEXT: vsrl.vi v8, v8, 24
1336 ; RVI-NEXT: vse32.v v8, (a0)
1339 ; RVF-LABEL: ctlz_zero_undef_v8i32:
1341 ; RVF-NEXT: vsetivli zero, 8, e32, m2, ta, ma
1342 ; RVF-NEXT: vle32.v v8, (a0)
1343 ; RVF-NEXT: fsrmi a1, 1
1344 ; RVF-NEXT: vfcvt.f.xu.v v8, v8
1346 ; RVF-NEXT: vsrl.vi v8, v8, 23
1347 ; RVF-NEXT: li a1, 158
1348 ; RVF-NEXT: vrsub.vx v8, v8, a1
1349 ; RVF-NEXT: vse32.v v8, (a0)
1352 ; RVD-LABEL: ctlz_zero_undef_v8i32:
1354 ; RVD-NEXT: vsetivli zero, 8, e32, m2, ta, ma
1355 ; RVD-NEXT: vle32.v v8, (a0)
1356 ; RVD-NEXT: vfwcvt.f.xu.v v12, v8
1357 ; RVD-NEXT: li a1, 52
1358 ; RVD-NEXT: vnsrl.wx v8, v12, a1
1359 ; RVD-NEXT: li a1, 1054
1360 ; RVD-NEXT: vrsub.vx v8, v8, a1
1361 ; RVD-NEXT: vse32.v v8, (a0)
1364 ; ZVBB-LABEL: ctlz_zero_undef_v8i32:
1366 ; ZVBB-NEXT: vsetivli zero, 8, e32, m2, ta, ma
1367 ; ZVBB-NEXT: vle32.v v8, (a0)
1368 ; ZVBB-NEXT: vclz.v v8, v8
1369 ; ZVBB-NEXT: vse32.v v8, (a0)
1371 %a = load <8 x i32>, ptr %x
1372 %b = load <8 x i32>, ptr %y
1373 %c = call <8 x i32> @llvm.ctlz.v8i32(<8 x i32> %a, i1 true)
1374 store <8 x i32> %c, ptr %x
1378 define void @ctlz_zero_undef_v4i64(ptr %x, ptr %y) nounwind {
1379 ; RV32I-LABEL: ctlz_zero_undef_v4i64:
1381 ; RV32I-NEXT: vsetivli zero, 4, e64, m2, ta, ma
1382 ; RV32I-NEXT: vle64.v v8, (a0)
1383 ; RV32I-NEXT: vsrl.vi v10, v8, 1
1384 ; RV32I-NEXT: vor.vv v8, v8, v10
1385 ; RV32I-NEXT: vsrl.vi v10, v8, 2
1386 ; RV32I-NEXT: vor.vv v8, v8, v10
1387 ; RV32I-NEXT: vsrl.vi v10, v8, 4
1388 ; RV32I-NEXT: vor.vv v8, v8, v10
1389 ; RV32I-NEXT: vsrl.vi v10, v8, 8
1390 ; RV32I-NEXT: vor.vv v8, v8, v10
1391 ; RV32I-NEXT: vsrl.vi v10, v8, 16
1392 ; RV32I-NEXT: vor.vv v8, v8, v10
1393 ; RV32I-NEXT: li a1, 32
1394 ; RV32I-NEXT: vsrl.vx v10, v8, a1
1395 ; RV32I-NEXT: vor.vv v8, v8, v10
1396 ; RV32I-NEXT: vnot.v v8, v8
1397 ; RV32I-NEXT: vsrl.vi v10, v8, 1
1398 ; RV32I-NEXT: lui a1, 349525
1399 ; RV32I-NEXT: addi a1, a1, 1365
1400 ; RV32I-NEXT: vsetivli zero, 8, e32, m2, ta, ma
1401 ; RV32I-NEXT: vmv.v.x v12, a1
1402 ; RV32I-NEXT: vsetivli zero, 4, e64, m2, ta, ma
1403 ; RV32I-NEXT: vand.vv v10, v10, v12
1404 ; RV32I-NEXT: vsub.vv v8, v8, v10
1405 ; RV32I-NEXT: lui a1, 209715
1406 ; RV32I-NEXT: addi a1, a1, 819
1407 ; RV32I-NEXT: vsetivli zero, 8, e32, m2, ta, ma
1408 ; RV32I-NEXT: vmv.v.x v10, a1
1409 ; RV32I-NEXT: vsetivli zero, 4, e64, m2, ta, ma
1410 ; RV32I-NEXT: vand.vv v12, v8, v10
1411 ; RV32I-NEXT: vsrl.vi v8, v8, 2
1412 ; RV32I-NEXT: vand.vv v8, v8, v10
1413 ; RV32I-NEXT: vadd.vv v8, v12, v8
1414 ; RV32I-NEXT: vsrl.vi v10, v8, 4
1415 ; RV32I-NEXT: vadd.vv v8, v8, v10
1416 ; RV32I-NEXT: lui a1, 61681
1417 ; RV32I-NEXT: addi a1, a1, -241
1418 ; RV32I-NEXT: vsetivli zero, 8, e32, m2, ta, ma
1419 ; RV32I-NEXT: vmv.v.x v10, a1
1420 ; RV32I-NEXT: vsetivli zero, 4, e64, m2, ta, ma
1421 ; RV32I-NEXT: vand.vv v8, v8, v10
1422 ; RV32I-NEXT: lui a1, 4112
1423 ; RV32I-NEXT: addi a1, a1, 257
1424 ; RV32I-NEXT: vsetivli zero, 8, e32, m2, ta, ma
1425 ; RV32I-NEXT: vmv.v.x v10, a1
1426 ; RV32I-NEXT: vsetivli zero, 4, e64, m2, ta, ma
1427 ; RV32I-NEXT: vmul.vv v8, v8, v10
1428 ; RV32I-NEXT: li a1, 56
1429 ; RV32I-NEXT: vsrl.vx v8, v8, a1
1430 ; RV32I-NEXT: vse64.v v8, (a0)
1433 ; RV64I-LABEL: ctlz_zero_undef_v4i64:
1435 ; RV64I-NEXT: vsetivli zero, 4, e64, m2, ta, ma
1436 ; RV64I-NEXT: vle64.v v8, (a0)
1437 ; RV64I-NEXT: vsrl.vi v10, v8, 1
1438 ; RV64I-NEXT: vor.vv v8, v8, v10
1439 ; RV64I-NEXT: vsrl.vi v10, v8, 2
1440 ; RV64I-NEXT: vor.vv v8, v8, v10
1441 ; RV64I-NEXT: vsrl.vi v10, v8, 4
1442 ; RV64I-NEXT: vor.vv v8, v8, v10
1443 ; RV64I-NEXT: vsrl.vi v10, v8, 8
1444 ; RV64I-NEXT: vor.vv v8, v8, v10
1445 ; RV64I-NEXT: vsrl.vi v10, v8, 16
1446 ; RV64I-NEXT: vor.vv v8, v8, v10
1447 ; RV64I-NEXT: li a1, 32
1448 ; RV64I-NEXT: vsrl.vx v10, v8, a1
1449 ; RV64I-NEXT: vor.vv v8, v8, v10
1450 ; RV64I-NEXT: vnot.v v8, v8
1451 ; RV64I-NEXT: vsrl.vi v10, v8, 1
1452 ; RV64I-NEXT: lui a1, 349525
1453 ; RV64I-NEXT: addiw a1, a1, 1365
1454 ; RV64I-NEXT: slli a2, a1, 32
1455 ; RV64I-NEXT: add a1, a1, a2
1456 ; RV64I-NEXT: vand.vx v10, v10, a1
1457 ; RV64I-NEXT: vsub.vv v8, v8, v10
1458 ; RV64I-NEXT: lui a1, 209715
1459 ; RV64I-NEXT: addiw a1, a1, 819
1460 ; RV64I-NEXT: slli a2, a1, 32
1461 ; RV64I-NEXT: add a1, a1, a2
1462 ; RV64I-NEXT: vand.vx v10, v8, a1
1463 ; RV64I-NEXT: vsrl.vi v8, v8, 2
1464 ; RV64I-NEXT: vand.vx v8, v8, a1
1465 ; RV64I-NEXT: vadd.vv v8, v10, v8
1466 ; RV64I-NEXT: vsrl.vi v10, v8, 4
1467 ; RV64I-NEXT: vadd.vv v8, v8, v10
1468 ; RV64I-NEXT: lui a1, 61681
1469 ; RV64I-NEXT: addiw a1, a1, -241
1470 ; RV64I-NEXT: slli a2, a1, 32
1471 ; RV64I-NEXT: add a1, a1, a2
1472 ; RV64I-NEXT: vand.vx v8, v8, a1
1473 ; RV64I-NEXT: lui a1, 4112
1474 ; RV64I-NEXT: addiw a1, a1, 257
1475 ; RV64I-NEXT: slli a2, a1, 32
1476 ; RV64I-NEXT: add a1, a1, a2
1477 ; RV64I-NEXT: vmul.vx v8, v8, a1
1478 ; RV64I-NEXT: li a1, 56
1479 ; RV64I-NEXT: vsrl.vx v8, v8, a1
1480 ; RV64I-NEXT: vse64.v v8, (a0)
1483 ; RVF-LABEL: ctlz_zero_undef_v4i64:
1485 ; RVF-NEXT: vsetivli zero, 4, e32, m1, ta, ma
1486 ; RVF-NEXT: vle64.v v8, (a0)
1487 ; RVF-NEXT: li a1, 190
1488 ; RVF-NEXT: vmv.v.x v10, a1
1489 ; RVF-NEXT: fsrmi a1, 1
1490 ; RVF-NEXT: vfncvt.f.xu.w v11, v8
1492 ; RVF-NEXT: vsrl.vi v8, v11, 23
1493 ; RVF-NEXT: vwsubu.vv v12, v10, v8
1494 ; RVF-NEXT: vse64.v v12, (a0)
1497 ; RVD-LABEL: ctlz_zero_undef_v4i64:
1499 ; RVD-NEXT: vsetivli zero, 4, e64, m2, ta, ma
1500 ; RVD-NEXT: vle64.v v8, (a0)
1501 ; RVD-NEXT: fsrmi a1, 1
1502 ; RVD-NEXT: vfcvt.f.xu.v v8, v8
1504 ; RVD-NEXT: li a1, 52
1505 ; RVD-NEXT: vsrl.vx v8, v8, a1
1506 ; RVD-NEXT: li a1, 1086
1507 ; RVD-NEXT: vrsub.vx v8, v8, a1
1508 ; RVD-NEXT: vse64.v v8, (a0)
1511 ; ZVBB-LABEL: ctlz_zero_undef_v4i64:
1513 ; ZVBB-NEXT: vsetivli zero, 4, e64, m2, ta, ma
1514 ; ZVBB-NEXT: vle64.v v8, (a0)
1515 ; ZVBB-NEXT: vclz.v v8, v8
1516 ; ZVBB-NEXT: vse64.v v8, (a0)
1518 %a = load <4 x i64>, ptr %x
1519 %b = load <4 x i64>, ptr %y
1520 %c = call <4 x i64> @llvm.ctlz.v4i64(<4 x i64> %a, i1 true)
1521 store <4 x i64> %c, ptr %x
1524 ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: