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 ; RV32F-LABEL: ctlz_v2i64:
352 ; RV32F-NEXT: vsetivli zero, 2, e64, m1, ta, ma
353 ; RV32F-NEXT: vle64.v v8, (a0)
354 ; RV32F-NEXT: li a1, 190
355 ; RV32F-NEXT: vmv.v.x v9, a1
356 ; RV32F-NEXT: fsrmi a1, 1
357 ; RV32F-NEXT: vsetvli zero, zero, e32, mf2, ta, ma
358 ; RV32F-NEXT: vfncvt.f.xu.w v10, v8
359 ; RV32F-NEXT: fsrm a1
360 ; RV32F-NEXT: vsrl.vi v8, v10, 23
361 ; RV32F-NEXT: vwsubu.wv v9, v9, v8
362 ; RV32F-NEXT: li a1, 64
363 ; RV32F-NEXT: vsetvli zero, zero, e64, m1, ta, ma
364 ; RV32F-NEXT: vminu.vx v8, v9, a1
365 ; RV32F-NEXT: vse64.v v8, (a0)
368 ; RV64F-LABEL: ctlz_v2i64:
370 ; RV64F-NEXT: vsetivli zero, 2, e32, mf2, ta, ma
371 ; RV64F-NEXT: vle64.v v8, (a0)
372 ; RV64F-NEXT: li a1, 190
373 ; RV64F-NEXT: vmv.v.x v9, a1
374 ; RV64F-NEXT: fsrmi a1, 1
375 ; RV64F-NEXT: vfncvt.f.xu.w v10, v8
376 ; RV64F-NEXT: fsrm a1
377 ; RV64F-NEXT: vsrl.vi v8, v10, 23
378 ; RV64F-NEXT: vwsubu.vv v10, v9, v8
379 ; RV64F-NEXT: li a1, 64
380 ; RV64F-NEXT: vsetvli zero, zero, e64, m1, ta, ma
381 ; RV64F-NEXT: vminu.vx v8, v10, a1
382 ; RV64F-NEXT: vse64.v v8, (a0)
385 ; RVD-LABEL: ctlz_v2i64:
387 ; RVD-NEXT: vsetivli zero, 2, e64, m1, ta, ma
388 ; RVD-NEXT: vle64.v v8, (a0)
389 ; RVD-NEXT: fsrmi a1, 1
390 ; RVD-NEXT: vfcvt.f.xu.v v8, v8
392 ; RVD-NEXT: li a1, 52
393 ; RVD-NEXT: vsrl.vx v8, v8, a1
394 ; RVD-NEXT: li a1, 1086
395 ; RVD-NEXT: vrsub.vx v8, v8, a1
396 ; RVD-NEXT: li a1, 64
397 ; RVD-NEXT: vminu.vx v8, v8, a1
398 ; RVD-NEXT: vse64.v v8, (a0)
401 ; ZVBB-LABEL: ctlz_v2i64:
403 ; ZVBB-NEXT: vsetivli zero, 2, e64, m1, ta, ma
404 ; ZVBB-NEXT: vle64.v v8, (a0)
405 ; ZVBB-NEXT: vclz.v v8, v8
406 ; ZVBB-NEXT: vse64.v v8, (a0)
408 %a = load <2 x i64>, ptr %x
409 %b = load <2 x i64>, ptr %y
410 %c = call <2 x i64> @llvm.ctlz.v2i64(<2 x i64> %a, i1 false)
411 store <2 x i64> %c, ptr %x
414 declare <2 x i64> @llvm.ctlz.v2i64(<2 x i64>, i1)
416 define void @ctlz_v32i8(ptr %x, ptr %y) nounwind {
417 ; RVI-LABEL: ctlz_v32i8:
419 ; RVI-NEXT: li a1, 32
420 ; RVI-NEXT: vsetvli zero, a1, e8, m2, ta, ma
421 ; RVI-NEXT: vle8.v v8, (a0)
422 ; RVI-NEXT: vsrl.vi v10, v8, 1
423 ; RVI-NEXT: vor.vv v8, v8, v10
424 ; RVI-NEXT: vsrl.vi v10, v8, 2
425 ; RVI-NEXT: vor.vv v8, v8, v10
426 ; RVI-NEXT: vsrl.vi v10, v8, 4
427 ; RVI-NEXT: vor.vv v8, v8, v10
428 ; RVI-NEXT: vnot.v v8, v8
429 ; RVI-NEXT: vsrl.vi v10, v8, 1
430 ; RVI-NEXT: li a1, 85
431 ; RVI-NEXT: vand.vx v10, v10, a1
432 ; RVI-NEXT: vsub.vv v8, v8, v10
433 ; RVI-NEXT: li a1, 51
434 ; RVI-NEXT: vand.vx v10, v8, a1
435 ; RVI-NEXT: vsrl.vi v8, v8, 2
436 ; RVI-NEXT: vand.vx v8, v8, a1
437 ; RVI-NEXT: vadd.vv v8, v10, v8
438 ; RVI-NEXT: vsrl.vi v10, v8, 4
439 ; RVI-NEXT: vadd.vv v8, v8, v10
440 ; RVI-NEXT: vand.vi v8, v8, 15
441 ; RVI-NEXT: vse8.v v8, (a0)
444 ; RVF-LABEL: ctlz_v32i8:
446 ; RVF-NEXT: li a1, 32
447 ; RVF-NEXT: vsetvli zero, a1, e16, m4, ta, ma
448 ; RVF-NEXT: vle8.v v8, (a0)
449 ; RVF-NEXT: vzext.vf2 v12, v8
450 ; RVF-NEXT: vfwcvt.f.xu.v v16, v12
451 ; RVF-NEXT: vnsrl.wi v8, v16, 23
452 ; RVF-NEXT: vsetvli zero, zero, e8, m2, ta, ma
453 ; RVF-NEXT: vnsrl.wi v12, v8, 0
454 ; RVF-NEXT: li a1, 134
455 ; RVF-NEXT: vrsub.vx v8, v12, a1
457 ; RVF-NEXT: vminu.vx v8, v8, a1
458 ; RVF-NEXT: vse8.v v8, (a0)
461 ; RVD-LABEL: ctlz_v32i8:
463 ; RVD-NEXT: li a1, 32
464 ; RVD-NEXT: vsetvli zero, a1, e16, m4, ta, ma
465 ; RVD-NEXT: vle8.v v8, (a0)
466 ; RVD-NEXT: vzext.vf2 v12, v8
467 ; RVD-NEXT: vfwcvt.f.xu.v v16, v12
468 ; RVD-NEXT: vnsrl.wi v8, v16, 23
469 ; RVD-NEXT: vsetvli zero, zero, e8, m2, ta, ma
470 ; RVD-NEXT: vnsrl.wi v12, v8, 0
471 ; RVD-NEXT: li a1, 134
472 ; RVD-NEXT: vrsub.vx v8, v12, a1
474 ; RVD-NEXT: vminu.vx v8, v8, a1
475 ; RVD-NEXT: vse8.v v8, (a0)
478 ; ZVBB-LABEL: ctlz_v32i8:
480 ; ZVBB-NEXT: li a1, 32
481 ; ZVBB-NEXT: vsetvli zero, a1, e8, m2, ta, ma
482 ; ZVBB-NEXT: vle8.v v8, (a0)
483 ; ZVBB-NEXT: vclz.v v8, v8
484 ; ZVBB-NEXT: vse8.v v8, (a0)
486 %a = load <32 x i8>, ptr %x
487 %b = load <32 x i8>, ptr %y
488 %c = call <32 x i8> @llvm.ctlz.v32i8(<32 x i8> %a, i1 false)
489 store <32 x i8> %c, ptr %x
492 declare <32 x i8> @llvm.ctlz.v32i8(<32 x i8>, i1)
494 define void @ctlz_v16i16(ptr %x, ptr %y) nounwind {
495 ; RVI-LABEL: ctlz_v16i16:
497 ; RVI-NEXT: vsetivli zero, 16, e16, m2, ta, ma
498 ; RVI-NEXT: vle16.v v8, (a0)
499 ; RVI-NEXT: vsrl.vi v10, v8, 1
500 ; RVI-NEXT: vor.vv v8, v8, v10
501 ; RVI-NEXT: vsrl.vi v10, v8, 2
502 ; RVI-NEXT: vor.vv v8, v8, v10
503 ; RVI-NEXT: vsrl.vi v10, v8, 4
504 ; RVI-NEXT: vor.vv v8, v8, v10
505 ; RVI-NEXT: vsrl.vi v10, v8, 8
506 ; RVI-NEXT: vor.vv v8, v8, v10
507 ; RVI-NEXT: vnot.v v8, v8
508 ; RVI-NEXT: vsrl.vi v10, v8, 1
509 ; RVI-NEXT: lui a1, 5
510 ; RVI-NEXT: addi a1, a1, 1365
511 ; RVI-NEXT: vand.vx v10, v10, a1
512 ; RVI-NEXT: vsub.vv v8, v8, v10
513 ; RVI-NEXT: lui a1, 3
514 ; RVI-NEXT: addi a1, a1, 819
515 ; RVI-NEXT: vand.vx v10, v8, a1
516 ; RVI-NEXT: vsrl.vi v8, v8, 2
517 ; RVI-NEXT: vand.vx v8, v8, a1
518 ; RVI-NEXT: vadd.vv v8, v10, v8
519 ; RVI-NEXT: vsrl.vi v10, v8, 4
520 ; RVI-NEXT: vadd.vv v8, v8, v10
521 ; RVI-NEXT: lui a1, 1
522 ; RVI-NEXT: addi a1, a1, -241
523 ; RVI-NEXT: vand.vx v8, v8, a1
524 ; RVI-NEXT: li a1, 257
525 ; RVI-NEXT: vmul.vx v8, v8, a1
526 ; RVI-NEXT: vsrl.vi v8, v8, 8
527 ; RVI-NEXT: vse16.v v8, (a0)
530 ; RVF-LABEL: ctlz_v16i16:
532 ; RVF-NEXT: vsetivli zero, 16, e16, m2, ta, ma
533 ; RVF-NEXT: vle16.v v8, (a0)
534 ; RVF-NEXT: vfwcvt.f.xu.v v12, v8
535 ; RVF-NEXT: vnsrl.wi v8, v12, 23
536 ; RVF-NEXT: li a1, 142
537 ; RVF-NEXT: vrsub.vx v8, v8, a1
538 ; RVF-NEXT: li a1, 16
539 ; RVF-NEXT: vminu.vx v8, v8, a1
540 ; RVF-NEXT: vse16.v v8, (a0)
543 ; RVD-LABEL: ctlz_v16i16:
545 ; RVD-NEXT: vsetivli zero, 16, e16, m2, ta, ma
546 ; RVD-NEXT: vle16.v v8, (a0)
547 ; RVD-NEXT: vfwcvt.f.xu.v v12, v8
548 ; RVD-NEXT: vnsrl.wi v8, v12, 23
549 ; RVD-NEXT: li a1, 142
550 ; RVD-NEXT: vrsub.vx v8, v8, a1
551 ; RVD-NEXT: li a1, 16
552 ; RVD-NEXT: vminu.vx v8, v8, a1
553 ; RVD-NEXT: vse16.v v8, (a0)
556 ; ZVBB-LABEL: ctlz_v16i16:
558 ; ZVBB-NEXT: vsetivli zero, 16, e16, m2, ta, ma
559 ; ZVBB-NEXT: vle16.v v8, (a0)
560 ; ZVBB-NEXT: vclz.v v8, v8
561 ; ZVBB-NEXT: vse16.v v8, (a0)
563 %a = load <16 x i16>, ptr %x
564 %b = load <16 x i16>, ptr %y
565 %c = call <16 x i16> @llvm.ctlz.v16i16(<16 x i16> %a, i1 false)
566 store <16 x i16> %c, ptr %x
569 declare <16 x i16> @llvm.ctlz.v16i16(<16 x i16>, i1)
571 define void @ctlz_v8i32(ptr %x, ptr %y) nounwind {
572 ; RVI-LABEL: ctlz_v8i32:
574 ; RVI-NEXT: vsetivli zero, 8, e32, m2, ta, ma
575 ; RVI-NEXT: vle32.v v8, (a0)
576 ; RVI-NEXT: vsrl.vi v10, v8, 1
577 ; RVI-NEXT: vor.vv v8, v8, v10
578 ; RVI-NEXT: vsrl.vi v10, v8, 2
579 ; RVI-NEXT: vor.vv v8, v8, v10
580 ; RVI-NEXT: vsrl.vi v10, v8, 4
581 ; RVI-NEXT: vor.vv v8, v8, v10
582 ; RVI-NEXT: vsrl.vi v10, v8, 8
583 ; RVI-NEXT: vor.vv v8, v8, v10
584 ; RVI-NEXT: vsrl.vi v10, v8, 16
585 ; RVI-NEXT: vor.vv v8, v8, v10
586 ; RVI-NEXT: vnot.v v8, v8
587 ; RVI-NEXT: vsrl.vi v10, v8, 1
588 ; RVI-NEXT: lui a1, 349525
589 ; RVI-NEXT: addi a1, a1, 1365
590 ; RVI-NEXT: vand.vx v10, v10, a1
591 ; RVI-NEXT: vsub.vv v8, v8, v10
592 ; RVI-NEXT: lui a1, 209715
593 ; RVI-NEXT: addi a1, a1, 819
594 ; RVI-NEXT: vand.vx v10, v8, a1
595 ; RVI-NEXT: vsrl.vi v8, v8, 2
596 ; RVI-NEXT: vand.vx v8, v8, a1
597 ; RVI-NEXT: vadd.vv v8, v10, v8
598 ; RVI-NEXT: vsrl.vi v10, v8, 4
599 ; RVI-NEXT: vadd.vv v8, v8, v10
600 ; RVI-NEXT: lui a1, 61681
601 ; RVI-NEXT: addi a1, a1, -241
602 ; RVI-NEXT: vand.vx v8, v8, a1
603 ; RVI-NEXT: lui a1, 4112
604 ; RVI-NEXT: addi a1, a1, 257
605 ; RVI-NEXT: vmul.vx v8, v8, a1
606 ; RVI-NEXT: vsrl.vi v8, v8, 24
607 ; RVI-NEXT: vse32.v v8, (a0)
610 ; RVF-LABEL: ctlz_v8i32:
612 ; RVF-NEXT: vsetivli zero, 8, e32, m2, ta, ma
613 ; RVF-NEXT: vle32.v v8, (a0)
614 ; RVF-NEXT: fsrmi a1, 1
615 ; RVF-NEXT: vfcvt.f.xu.v v8, v8
617 ; RVF-NEXT: vsrl.vi v8, v8, 23
618 ; RVF-NEXT: li a1, 158
619 ; RVF-NEXT: vrsub.vx v8, v8, a1
620 ; RVF-NEXT: li a1, 32
621 ; RVF-NEXT: vminu.vx v8, v8, a1
622 ; RVF-NEXT: vse32.v v8, (a0)
625 ; RVD-LABEL: ctlz_v8i32:
627 ; RVD-NEXT: vsetivli zero, 8, e32, m2, ta, ma
628 ; RVD-NEXT: vle32.v v8, (a0)
629 ; RVD-NEXT: vfwcvt.f.xu.v v12, v8
630 ; RVD-NEXT: li a1, 52
631 ; RVD-NEXT: vnsrl.wx v8, v12, a1
632 ; RVD-NEXT: li a1, 1054
633 ; RVD-NEXT: vrsub.vx v8, v8, a1
634 ; RVD-NEXT: li a1, 32
635 ; RVD-NEXT: vminu.vx v8, v8, a1
636 ; RVD-NEXT: vse32.v v8, (a0)
639 ; ZVBB-LABEL: ctlz_v8i32:
641 ; ZVBB-NEXT: vsetivli zero, 8, e32, m2, ta, ma
642 ; ZVBB-NEXT: vle32.v v8, (a0)
643 ; ZVBB-NEXT: vclz.v v8, v8
644 ; ZVBB-NEXT: vse32.v v8, (a0)
646 %a = load <8 x i32>, ptr %x
647 %b = load <8 x i32>, ptr %y
648 %c = call <8 x i32> @llvm.ctlz.v8i32(<8 x i32> %a, i1 false)
649 store <8 x i32> %c, ptr %x
652 declare <8 x i32> @llvm.ctlz.v8i32(<8 x i32>, i1)
654 define void @ctlz_v4i64(ptr %x, ptr %y) nounwind {
655 ; RV32I-LABEL: ctlz_v4i64:
657 ; RV32I-NEXT: vsetivli zero, 4, e64, m2, ta, ma
658 ; RV32I-NEXT: vle64.v v8, (a0)
659 ; RV32I-NEXT: vsrl.vi v10, v8, 1
660 ; RV32I-NEXT: vor.vv v8, v8, v10
661 ; RV32I-NEXT: vsrl.vi v10, v8, 2
662 ; RV32I-NEXT: vor.vv v8, v8, v10
663 ; RV32I-NEXT: vsrl.vi v10, v8, 4
664 ; RV32I-NEXT: vor.vv v8, v8, v10
665 ; RV32I-NEXT: vsrl.vi v10, v8, 8
666 ; RV32I-NEXT: vor.vv v8, v8, v10
667 ; RV32I-NEXT: vsrl.vi v10, v8, 16
668 ; RV32I-NEXT: vor.vv v8, v8, v10
669 ; RV32I-NEXT: li a1, 32
670 ; RV32I-NEXT: vsrl.vx v10, v8, a1
671 ; RV32I-NEXT: vor.vv v8, v8, v10
672 ; RV32I-NEXT: vnot.v v8, v8
673 ; RV32I-NEXT: vsrl.vi v10, v8, 1
674 ; RV32I-NEXT: lui a1, 349525
675 ; RV32I-NEXT: addi a1, a1, 1365
676 ; RV32I-NEXT: vsetivli zero, 8, e32, m2, ta, ma
677 ; RV32I-NEXT: vmv.v.x v12, a1
678 ; RV32I-NEXT: vsetivli zero, 4, e64, m2, ta, ma
679 ; RV32I-NEXT: vand.vv v10, v10, v12
680 ; RV32I-NEXT: vsub.vv v8, v8, v10
681 ; RV32I-NEXT: lui a1, 209715
682 ; RV32I-NEXT: addi a1, a1, 819
683 ; RV32I-NEXT: vsetivli zero, 8, e32, m2, ta, ma
684 ; RV32I-NEXT: vmv.v.x v10, a1
685 ; RV32I-NEXT: vsetivli zero, 4, e64, m2, ta, ma
686 ; RV32I-NEXT: vand.vv v12, v8, v10
687 ; RV32I-NEXT: vsrl.vi v8, v8, 2
688 ; RV32I-NEXT: vand.vv v8, v8, v10
689 ; RV32I-NEXT: vadd.vv v8, v12, v8
690 ; RV32I-NEXT: vsrl.vi v10, v8, 4
691 ; RV32I-NEXT: vadd.vv v8, v8, v10
692 ; RV32I-NEXT: lui a1, 61681
693 ; RV32I-NEXT: addi a1, a1, -241
694 ; RV32I-NEXT: vsetivli zero, 8, e32, m2, ta, ma
695 ; RV32I-NEXT: vmv.v.x v10, a1
696 ; RV32I-NEXT: vsetivli zero, 4, e64, m2, ta, ma
697 ; RV32I-NEXT: vand.vv v8, v8, v10
698 ; RV32I-NEXT: lui a1, 4112
699 ; RV32I-NEXT: addi a1, a1, 257
700 ; RV32I-NEXT: vsetivli zero, 8, e32, m2, ta, ma
701 ; RV32I-NEXT: vmv.v.x v10, a1
702 ; RV32I-NEXT: vsetivli zero, 4, e64, m2, ta, ma
703 ; RV32I-NEXT: vmul.vv v8, v8, v10
704 ; RV32I-NEXT: li a1, 56
705 ; RV32I-NEXT: vsrl.vx v8, v8, a1
706 ; RV32I-NEXT: vse64.v v8, (a0)
709 ; RV64I-LABEL: ctlz_v4i64:
711 ; RV64I-NEXT: vsetivli zero, 4, e64, m2, ta, ma
712 ; RV64I-NEXT: vle64.v v8, (a0)
713 ; RV64I-NEXT: vsrl.vi v10, v8, 1
714 ; RV64I-NEXT: vor.vv v8, v8, v10
715 ; RV64I-NEXT: vsrl.vi v10, v8, 2
716 ; RV64I-NEXT: vor.vv v8, v8, v10
717 ; RV64I-NEXT: vsrl.vi v10, v8, 4
718 ; RV64I-NEXT: vor.vv v8, v8, v10
719 ; RV64I-NEXT: vsrl.vi v10, v8, 8
720 ; RV64I-NEXT: vor.vv v8, v8, v10
721 ; RV64I-NEXT: vsrl.vi v10, v8, 16
722 ; RV64I-NEXT: vor.vv v8, v8, v10
723 ; RV64I-NEXT: li a1, 32
724 ; RV64I-NEXT: vsrl.vx v10, v8, a1
725 ; RV64I-NEXT: vor.vv v8, v8, v10
726 ; RV64I-NEXT: vnot.v v8, v8
727 ; RV64I-NEXT: vsrl.vi v10, v8, 1
728 ; RV64I-NEXT: lui a1, 349525
729 ; RV64I-NEXT: addiw a1, a1, 1365
730 ; RV64I-NEXT: slli a2, a1, 32
731 ; RV64I-NEXT: add a1, a1, a2
732 ; RV64I-NEXT: vand.vx v10, v10, a1
733 ; RV64I-NEXT: vsub.vv v8, v8, v10
734 ; RV64I-NEXT: lui a1, 209715
735 ; RV64I-NEXT: addiw a1, a1, 819
736 ; RV64I-NEXT: slli a2, a1, 32
737 ; RV64I-NEXT: add a1, a1, a2
738 ; RV64I-NEXT: vand.vx v10, v8, a1
739 ; RV64I-NEXT: vsrl.vi v8, v8, 2
740 ; RV64I-NEXT: vand.vx v8, v8, a1
741 ; RV64I-NEXT: vadd.vv v8, v10, v8
742 ; RV64I-NEXT: vsrl.vi v10, v8, 4
743 ; RV64I-NEXT: vadd.vv v8, v8, v10
744 ; RV64I-NEXT: lui a1, 61681
745 ; RV64I-NEXT: addiw a1, a1, -241
746 ; RV64I-NEXT: slli a2, a1, 32
747 ; RV64I-NEXT: add a1, a1, a2
748 ; RV64I-NEXT: vand.vx v8, v8, a1
749 ; RV64I-NEXT: lui a1, 4112
750 ; RV64I-NEXT: addiw a1, a1, 257
751 ; RV64I-NEXT: slli a2, a1, 32
752 ; RV64I-NEXT: add a1, a1, a2
753 ; RV64I-NEXT: vmul.vx v8, v8, a1
754 ; RV64I-NEXT: li a1, 56
755 ; RV64I-NEXT: vsrl.vx v8, v8, a1
756 ; RV64I-NEXT: vse64.v v8, (a0)
759 ; RV32F-LABEL: ctlz_v4i64:
761 ; RV32F-NEXT: vsetivli zero, 4, e64, m2, ta, ma
762 ; RV32F-NEXT: vle64.v v8, (a0)
763 ; RV32F-NEXT: li a1, 190
764 ; RV32F-NEXT: vmv.v.x v10, a1
765 ; RV32F-NEXT: fsrmi a1, 1
766 ; RV32F-NEXT: vsetvli zero, zero, e32, m1, ta, ma
767 ; RV32F-NEXT: vfncvt.f.xu.w v12, v8
768 ; RV32F-NEXT: fsrm a1
769 ; RV32F-NEXT: vsrl.vi v8, v12, 23
770 ; RV32F-NEXT: vwsubu.wv v10, v10, v8
771 ; RV32F-NEXT: li a1, 64
772 ; RV32F-NEXT: vsetvli zero, zero, e64, m2, ta, ma
773 ; RV32F-NEXT: vminu.vx v8, v10, a1
774 ; RV32F-NEXT: vse64.v v8, (a0)
777 ; RV64F-LABEL: ctlz_v4i64:
779 ; RV64F-NEXT: vsetivli zero, 4, e32, m1, ta, ma
780 ; RV64F-NEXT: vle64.v v8, (a0)
781 ; RV64F-NEXT: li a1, 190
782 ; RV64F-NEXT: vmv.v.x v10, a1
783 ; RV64F-NEXT: fsrmi a1, 1
784 ; RV64F-NEXT: vfncvt.f.xu.w v11, v8
785 ; RV64F-NEXT: fsrm a1
786 ; RV64F-NEXT: vsrl.vi v8, v11, 23
787 ; RV64F-NEXT: vwsubu.vv v12, v10, v8
788 ; RV64F-NEXT: li a1, 64
789 ; RV64F-NEXT: vsetvli zero, zero, e64, m2, ta, ma
790 ; RV64F-NEXT: vminu.vx v8, v12, a1
791 ; RV64F-NEXT: vse64.v v8, (a0)
794 ; RVD-LABEL: ctlz_v4i64:
796 ; RVD-NEXT: vsetivli zero, 4, e64, m2, ta, ma
797 ; RVD-NEXT: vle64.v v8, (a0)
798 ; RVD-NEXT: fsrmi a1, 1
799 ; RVD-NEXT: vfcvt.f.xu.v v8, v8
801 ; RVD-NEXT: li a1, 52
802 ; RVD-NEXT: vsrl.vx v8, v8, a1
803 ; RVD-NEXT: li a1, 1086
804 ; RVD-NEXT: vrsub.vx v8, v8, a1
805 ; RVD-NEXT: li a1, 64
806 ; RVD-NEXT: vminu.vx v8, v8, a1
807 ; RVD-NEXT: vse64.v v8, (a0)
810 ; ZVBB-LABEL: ctlz_v4i64:
812 ; ZVBB-NEXT: vsetivli zero, 4, e64, m2, ta, ma
813 ; ZVBB-NEXT: vle64.v v8, (a0)
814 ; ZVBB-NEXT: vclz.v v8, v8
815 ; ZVBB-NEXT: vse64.v v8, (a0)
817 %a = load <4 x i64>, ptr %x
818 %b = load <4 x i64>, ptr %y
819 %c = call <4 x i64> @llvm.ctlz.v4i64(<4 x i64> %a, i1 false)
820 store <4 x i64> %c, ptr %x
823 declare <4 x i64> @llvm.ctlz.v4i64(<4 x i64>, i1)
825 define void @ctlz_zero_undef_v16i8(ptr %x, ptr %y) nounwind {
826 ; RVI-LABEL: ctlz_zero_undef_v16i8:
828 ; RVI-NEXT: vsetivli zero, 16, e8, m1, ta, ma
829 ; RVI-NEXT: vle8.v v8, (a0)
830 ; RVI-NEXT: vsrl.vi v9, v8, 1
831 ; RVI-NEXT: vor.vv v8, v8, v9
832 ; RVI-NEXT: vsrl.vi v9, v8, 2
833 ; RVI-NEXT: vor.vv v8, v8, v9
834 ; RVI-NEXT: vsrl.vi v9, v8, 4
835 ; RVI-NEXT: vor.vv v8, v8, v9
836 ; RVI-NEXT: vnot.v v8, v8
837 ; RVI-NEXT: vsrl.vi v9, v8, 1
838 ; RVI-NEXT: li a1, 85
839 ; RVI-NEXT: vand.vx v9, v9, a1
840 ; RVI-NEXT: vsub.vv v8, v8, v9
841 ; RVI-NEXT: li a1, 51
842 ; RVI-NEXT: vand.vx v9, v8, a1
843 ; RVI-NEXT: vsrl.vi v8, v8, 2
844 ; RVI-NEXT: vand.vx v8, v8, a1
845 ; RVI-NEXT: vadd.vv v8, v9, v8
846 ; RVI-NEXT: vsrl.vi v9, v8, 4
847 ; RVI-NEXT: vadd.vv v8, v8, v9
848 ; RVI-NEXT: vand.vi v8, v8, 15
849 ; RVI-NEXT: vse8.v v8, (a0)
852 ; RVF-LABEL: ctlz_zero_undef_v16i8:
854 ; RVF-NEXT: vsetivli zero, 16, e16, m2, ta, ma
855 ; RVF-NEXT: vle8.v v8, (a0)
856 ; RVF-NEXT: vzext.vf2 v10, v8
857 ; RVF-NEXT: vfwcvt.f.xu.v v12, v10
858 ; RVF-NEXT: vnsrl.wi v8, v12, 23
859 ; RVF-NEXT: vsetvli zero, zero, e8, m1, ta, ma
860 ; RVF-NEXT: vnsrl.wi v10, v8, 0
861 ; RVF-NEXT: li a1, 134
862 ; RVF-NEXT: vrsub.vx v8, v10, a1
863 ; RVF-NEXT: vse8.v v8, (a0)
866 ; RVD-LABEL: ctlz_zero_undef_v16i8:
868 ; RVD-NEXT: vsetivli zero, 16, e16, m2, ta, ma
869 ; RVD-NEXT: vle8.v v8, (a0)
870 ; RVD-NEXT: vzext.vf2 v10, v8
871 ; RVD-NEXT: vfwcvt.f.xu.v v12, v10
872 ; RVD-NEXT: vnsrl.wi v8, v12, 23
873 ; RVD-NEXT: vsetvli zero, zero, e8, m1, ta, ma
874 ; RVD-NEXT: vnsrl.wi v10, v8, 0
875 ; RVD-NEXT: li a1, 134
876 ; RVD-NEXT: vrsub.vx v8, v10, a1
877 ; RVD-NEXT: vse8.v v8, (a0)
880 ; ZVBB-LABEL: ctlz_zero_undef_v16i8:
882 ; ZVBB-NEXT: vsetivli zero, 16, e8, m1, ta, ma
883 ; ZVBB-NEXT: vle8.v v8, (a0)
884 ; ZVBB-NEXT: vclz.v v8, v8
885 ; ZVBB-NEXT: vse8.v v8, (a0)
887 %a = load <16 x i8>, ptr %x
888 %b = load <16 x i8>, ptr %y
889 %c = call <16 x i8> @llvm.ctlz.v16i8(<16 x i8> %a, i1 true)
890 store <16 x i8> %c, ptr %x
894 define void @ctlz_zero_undef_v8i16(ptr %x, ptr %y) nounwind {
895 ; RVI-LABEL: ctlz_zero_undef_v8i16:
897 ; RVI-NEXT: vsetivli zero, 8, e16, m1, ta, ma
898 ; RVI-NEXT: vle16.v v8, (a0)
899 ; RVI-NEXT: vsrl.vi v9, v8, 1
900 ; RVI-NEXT: vor.vv v8, v8, v9
901 ; RVI-NEXT: vsrl.vi v9, v8, 2
902 ; RVI-NEXT: vor.vv v8, v8, v9
903 ; RVI-NEXT: vsrl.vi v9, v8, 4
904 ; RVI-NEXT: vor.vv v8, v8, v9
905 ; RVI-NEXT: vsrl.vi v9, v8, 8
906 ; RVI-NEXT: vor.vv v8, v8, v9
907 ; RVI-NEXT: vnot.v v8, v8
908 ; RVI-NEXT: vsrl.vi v9, v8, 1
909 ; RVI-NEXT: lui a1, 5
910 ; RVI-NEXT: addi a1, a1, 1365
911 ; RVI-NEXT: vand.vx v9, v9, a1
912 ; RVI-NEXT: vsub.vv v8, v8, v9
913 ; RVI-NEXT: lui a1, 3
914 ; RVI-NEXT: addi a1, a1, 819
915 ; RVI-NEXT: vand.vx v9, v8, a1
916 ; RVI-NEXT: vsrl.vi v8, v8, 2
917 ; RVI-NEXT: vand.vx v8, v8, a1
918 ; RVI-NEXT: vadd.vv v8, v9, v8
919 ; RVI-NEXT: vsrl.vi v9, v8, 4
920 ; RVI-NEXT: vadd.vv v8, v8, v9
921 ; RVI-NEXT: lui a1, 1
922 ; RVI-NEXT: addi a1, a1, -241
923 ; RVI-NEXT: vand.vx v8, v8, a1
924 ; RVI-NEXT: li a1, 257
925 ; RVI-NEXT: vmul.vx v8, v8, a1
926 ; RVI-NEXT: vsrl.vi v8, v8, 8
927 ; RVI-NEXT: vse16.v v8, (a0)
930 ; RVF-LABEL: ctlz_zero_undef_v8i16:
932 ; RVF-NEXT: vsetivli zero, 8, e16, m1, ta, ma
933 ; RVF-NEXT: vle16.v v8, (a0)
934 ; RVF-NEXT: vfwcvt.f.xu.v v10, v8
935 ; RVF-NEXT: vnsrl.wi v8, v10, 23
936 ; RVF-NEXT: li a1, 142
937 ; RVF-NEXT: vrsub.vx v8, v8, a1
938 ; RVF-NEXT: vse16.v v8, (a0)
941 ; RVD-LABEL: ctlz_zero_undef_v8i16:
943 ; RVD-NEXT: vsetivli zero, 8, e16, m1, ta, ma
944 ; RVD-NEXT: vle16.v v8, (a0)
945 ; RVD-NEXT: vfwcvt.f.xu.v v10, v8
946 ; RVD-NEXT: vnsrl.wi v8, v10, 23
947 ; RVD-NEXT: li a1, 142
948 ; RVD-NEXT: vrsub.vx v8, v8, a1
949 ; RVD-NEXT: vse16.v v8, (a0)
952 ; ZVBB-LABEL: ctlz_zero_undef_v8i16:
954 ; ZVBB-NEXT: vsetivli zero, 8, e16, m1, ta, ma
955 ; ZVBB-NEXT: vle16.v v8, (a0)
956 ; ZVBB-NEXT: vclz.v v8, v8
957 ; ZVBB-NEXT: vse16.v v8, (a0)
959 %a = load <8 x i16>, ptr %x
960 %b = load <8 x i16>, ptr %y
961 %c = call <8 x i16> @llvm.ctlz.v8i16(<8 x i16> %a, i1 true)
962 store <8 x i16> %c, ptr %x
966 define void @ctlz_zero_undef_v4i32(ptr %x, ptr %y) nounwind {
967 ; RVI-LABEL: ctlz_zero_undef_v4i32:
969 ; RVI-NEXT: vsetivli zero, 4, e32, m1, ta, ma
970 ; RVI-NEXT: vle32.v v8, (a0)
971 ; RVI-NEXT: vsrl.vi v9, v8, 1
972 ; RVI-NEXT: vor.vv v8, v8, v9
973 ; RVI-NEXT: vsrl.vi v9, v8, 2
974 ; RVI-NEXT: vor.vv v8, v8, v9
975 ; RVI-NEXT: vsrl.vi v9, v8, 4
976 ; RVI-NEXT: vor.vv v8, v8, v9
977 ; RVI-NEXT: vsrl.vi v9, v8, 8
978 ; RVI-NEXT: vor.vv v8, v8, v9
979 ; RVI-NEXT: vsrl.vi v9, v8, 16
980 ; RVI-NEXT: vor.vv v8, v8, v9
981 ; RVI-NEXT: vnot.v v8, v8
982 ; RVI-NEXT: vsrl.vi v9, v8, 1
983 ; RVI-NEXT: lui a1, 349525
984 ; RVI-NEXT: addi a1, a1, 1365
985 ; RVI-NEXT: vand.vx v9, v9, a1
986 ; RVI-NEXT: vsub.vv v8, v8, v9
987 ; RVI-NEXT: lui a1, 209715
988 ; RVI-NEXT: addi a1, a1, 819
989 ; RVI-NEXT: vand.vx v9, v8, a1
990 ; RVI-NEXT: vsrl.vi v8, v8, 2
991 ; RVI-NEXT: vand.vx v8, v8, a1
992 ; RVI-NEXT: vadd.vv v8, v9, v8
993 ; RVI-NEXT: vsrl.vi v9, v8, 4
994 ; RVI-NEXT: vadd.vv v8, v8, v9
995 ; RVI-NEXT: lui a1, 61681
996 ; RVI-NEXT: addi a1, a1, -241
997 ; RVI-NEXT: vand.vx v8, v8, a1
998 ; RVI-NEXT: lui a1, 4112
999 ; RVI-NEXT: addi a1, a1, 257
1000 ; RVI-NEXT: vmul.vx v8, v8, a1
1001 ; RVI-NEXT: vsrl.vi v8, v8, 24
1002 ; RVI-NEXT: vse32.v v8, (a0)
1005 ; RVF-LABEL: ctlz_zero_undef_v4i32:
1007 ; RVF-NEXT: vsetivli zero, 4, e32, m1, ta, ma
1008 ; RVF-NEXT: vle32.v v8, (a0)
1009 ; RVF-NEXT: fsrmi a1, 1
1010 ; RVF-NEXT: vfcvt.f.xu.v v8, v8
1012 ; RVF-NEXT: vsrl.vi v8, v8, 23
1013 ; RVF-NEXT: li a1, 158
1014 ; RVF-NEXT: vrsub.vx v8, v8, a1
1015 ; RVF-NEXT: vse32.v v8, (a0)
1018 ; RVD-LABEL: ctlz_zero_undef_v4i32:
1020 ; RVD-NEXT: vsetivli zero, 4, e32, m1, ta, ma
1021 ; RVD-NEXT: vle32.v v8, (a0)
1022 ; RVD-NEXT: vfwcvt.f.xu.v v10, v8
1023 ; RVD-NEXT: li a1, 52
1024 ; RVD-NEXT: vnsrl.wx v8, v10, a1
1025 ; RVD-NEXT: li a1, 1054
1026 ; RVD-NEXT: vrsub.vx v8, v8, a1
1027 ; RVD-NEXT: vse32.v v8, (a0)
1030 ; ZVBB-LABEL: ctlz_zero_undef_v4i32:
1032 ; ZVBB-NEXT: vsetivli zero, 4, e32, m1, ta, ma
1033 ; ZVBB-NEXT: vle32.v v8, (a0)
1034 ; ZVBB-NEXT: vclz.v v8, v8
1035 ; ZVBB-NEXT: vse32.v v8, (a0)
1037 %a = load <4 x i32>, ptr %x
1038 %b = load <4 x i32>, ptr %y
1039 %c = call <4 x i32> @llvm.ctlz.v4i32(<4 x i32> %a, i1 true)
1040 store <4 x i32> %c, ptr %x
1044 define void @ctlz_zero_undef_v2i64(ptr %x, ptr %y) nounwind {
1045 ; RV32I-LABEL: ctlz_zero_undef_v2i64:
1047 ; RV32I-NEXT: vsetivli zero, 2, e64, m1, ta, ma
1048 ; RV32I-NEXT: vle64.v v8, (a0)
1049 ; RV32I-NEXT: vsrl.vi v9, v8, 1
1050 ; RV32I-NEXT: vor.vv v8, v8, v9
1051 ; RV32I-NEXT: vsrl.vi v9, v8, 2
1052 ; RV32I-NEXT: vor.vv v8, v8, v9
1053 ; RV32I-NEXT: vsrl.vi v9, v8, 4
1054 ; RV32I-NEXT: vor.vv v8, v8, v9
1055 ; RV32I-NEXT: vsrl.vi v9, v8, 8
1056 ; RV32I-NEXT: vor.vv v8, v8, v9
1057 ; RV32I-NEXT: vsrl.vi v9, v8, 16
1058 ; RV32I-NEXT: vor.vv v8, v8, v9
1059 ; RV32I-NEXT: li a1, 32
1060 ; RV32I-NEXT: vsrl.vx v9, v8, a1
1061 ; RV32I-NEXT: vor.vv v8, v8, v9
1062 ; RV32I-NEXT: vnot.v v8, v8
1063 ; RV32I-NEXT: vsrl.vi v9, v8, 1
1064 ; RV32I-NEXT: lui a1, 349525
1065 ; RV32I-NEXT: addi a1, a1, 1365
1066 ; RV32I-NEXT: vsetivli zero, 4, e32, m1, ta, ma
1067 ; RV32I-NEXT: vmv.v.x v10, a1
1068 ; RV32I-NEXT: vsetivli zero, 2, e64, m1, ta, ma
1069 ; RV32I-NEXT: vand.vv v9, v9, v10
1070 ; RV32I-NEXT: vsub.vv v8, v8, v9
1071 ; RV32I-NEXT: lui a1, 209715
1072 ; RV32I-NEXT: addi a1, a1, 819
1073 ; RV32I-NEXT: vsetivli zero, 4, e32, m1, ta, ma
1074 ; RV32I-NEXT: vmv.v.x v9, a1
1075 ; RV32I-NEXT: vsetivli zero, 2, e64, m1, ta, ma
1076 ; RV32I-NEXT: vand.vv v10, v8, v9
1077 ; RV32I-NEXT: vsrl.vi v8, v8, 2
1078 ; RV32I-NEXT: vand.vv v8, v8, v9
1079 ; RV32I-NEXT: vadd.vv v8, v10, v8
1080 ; RV32I-NEXT: vsrl.vi v9, v8, 4
1081 ; RV32I-NEXT: vadd.vv v8, v8, v9
1082 ; RV32I-NEXT: lui a1, 61681
1083 ; RV32I-NEXT: addi a1, a1, -241
1084 ; RV32I-NEXT: vsetivli zero, 4, e32, m1, ta, ma
1085 ; RV32I-NEXT: vmv.v.x v9, a1
1086 ; RV32I-NEXT: vsetivli zero, 2, e64, m1, ta, ma
1087 ; RV32I-NEXT: vand.vv v8, v8, v9
1088 ; RV32I-NEXT: lui a1, 4112
1089 ; RV32I-NEXT: addi a1, a1, 257
1090 ; RV32I-NEXT: vsetivli zero, 4, e32, m1, ta, ma
1091 ; RV32I-NEXT: vmv.v.x v9, a1
1092 ; RV32I-NEXT: vsetivli zero, 2, e64, m1, ta, ma
1093 ; RV32I-NEXT: vmul.vv v8, v8, v9
1094 ; RV32I-NEXT: li a1, 56
1095 ; RV32I-NEXT: vsrl.vx v8, v8, a1
1096 ; RV32I-NEXT: vse64.v v8, (a0)
1099 ; RV64I-LABEL: ctlz_zero_undef_v2i64:
1101 ; RV64I-NEXT: vsetivli zero, 2, e64, m1, ta, ma
1102 ; RV64I-NEXT: vle64.v v8, (a0)
1103 ; RV64I-NEXT: vsrl.vi v9, v8, 1
1104 ; RV64I-NEXT: vor.vv v8, v8, v9
1105 ; RV64I-NEXT: vsrl.vi v9, v8, 2
1106 ; RV64I-NEXT: vor.vv v8, v8, v9
1107 ; RV64I-NEXT: vsrl.vi v9, v8, 4
1108 ; RV64I-NEXT: vor.vv v8, v8, v9
1109 ; RV64I-NEXT: vsrl.vi v9, v8, 8
1110 ; RV64I-NEXT: vor.vv v8, v8, v9
1111 ; RV64I-NEXT: vsrl.vi v9, v8, 16
1112 ; RV64I-NEXT: vor.vv v8, v8, v9
1113 ; RV64I-NEXT: li a1, 32
1114 ; RV64I-NEXT: vsrl.vx v9, v8, a1
1115 ; RV64I-NEXT: vor.vv v8, v8, v9
1116 ; RV64I-NEXT: vnot.v v8, v8
1117 ; RV64I-NEXT: vsrl.vi v9, v8, 1
1118 ; RV64I-NEXT: lui a1, 349525
1119 ; RV64I-NEXT: addiw a1, a1, 1365
1120 ; RV64I-NEXT: slli a2, a1, 32
1121 ; RV64I-NEXT: add a1, a1, a2
1122 ; RV64I-NEXT: vand.vx v9, v9, a1
1123 ; RV64I-NEXT: vsub.vv v8, v8, v9
1124 ; RV64I-NEXT: lui a1, 209715
1125 ; RV64I-NEXT: addiw a1, a1, 819
1126 ; RV64I-NEXT: slli a2, a1, 32
1127 ; RV64I-NEXT: add a1, a1, a2
1128 ; RV64I-NEXT: vand.vx v9, v8, a1
1129 ; RV64I-NEXT: vsrl.vi v8, v8, 2
1130 ; RV64I-NEXT: vand.vx v8, v8, a1
1131 ; RV64I-NEXT: vadd.vv v8, v9, v8
1132 ; RV64I-NEXT: vsrl.vi v9, v8, 4
1133 ; RV64I-NEXT: vadd.vv v8, v8, v9
1134 ; RV64I-NEXT: lui a1, 61681
1135 ; RV64I-NEXT: addiw a1, a1, -241
1136 ; RV64I-NEXT: slli a2, a1, 32
1137 ; RV64I-NEXT: add a1, a1, a2
1138 ; RV64I-NEXT: vand.vx v8, v8, a1
1139 ; RV64I-NEXT: lui a1, 4112
1140 ; RV64I-NEXT: addiw a1, a1, 257
1141 ; RV64I-NEXT: slli a2, a1, 32
1142 ; RV64I-NEXT: add a1, a1, a2
1143 ; RV64I-NEXT: vmul.vx v8, v8, a1
1144 ; RV64I-NEXT: li a1, 56
1145 ; RV64I-NEXT: vsrl.vx v8, v8, a1
1146 ; RV64I-NEXT: vse64.v v8, (a0)
1149 ; RV32F-LABEL: ctlz_zero_undef_v2i64:
1151 ; RV32F-NEXT: vsetivli zero, 2, e64, m1, ta, ma
1152 ; RV32F-NEXT: vle64.v v8, (a0)
1153 ; RV32F-NEXT: li a1, 190
1154 ; RV32F-NEXT: vmv.v.x v9, a1
1155 ; RV32F-NEXT: fsrmi a1, 1
1156 ; RV32F-NEXT: vsetvli zero, zero, e32, mf2, ta, ma
1157 ; RV32F-NEXT: vfncvt.f.xu.w v10, v8
1158 ; RV32F-NEXT: fsrm a1
1159 ; RV32F-NEXT: vsrl.vi v8, v10, 23
1160 ; RV32F-NEXT: vwsubu.wv v9, v9, v8
1161 ; RV32F-NEXT: vse64.v v9, (a0)
1164 ; RV64F-LABEL: ctlz_zero_undef_v2i64:
1166 ; RV64F-NEXT: vsetivli zero, 2, e32, mf2, ta, ma
1167 ; RV64F-NEXT: vle64.v v8, (a0)
1168 ; RV64F-NEXT: li a1, 190
1169 ; RV64F-NEXT: vmv.v.x v9, a1
1170 ; RV64F-NEXT: fsrmi a1, 1
1171 ; RV64F-NEXT: vfncvt.f.xu.w v10, v8
1172 ; RV64F-NEXT: fsrm a1
1173 ; RV64F-NEXT: vsrl.vi v8, v10, 23
1174 ; RV64F-NEXT: vwsubu.vv v10, v9, v8
1175 ; RV64F-NEXT: vse64.v v10, (a0)
1178 ; RVD-LABEL: ctlz_zero_undef_v2i64:
1180 ; RVD-NEXT: vsetivli zero, 2, e64, m1, ta, ma
1181 ; RVD-NEXT: vle64.v v8, (a0)
1182 ; RVD-NEXT: fsrmi a1, 1
1183 ; RVD-NEXT: vfcvt.f.xu.v v8, v8
1185 ; RVD-NEXT: li a1, 52
1186 ; RVD-NEXT: vsrl.vx v8, v8, a1
1187 ; RVD-NEXT: li a1, 1086
1188 ; RVD-NEXT: vrsub.vx v8, v8, a1
1189 ; RVD-NEXT: vse64.v v8, (a0)
1192 ; ZVBB-LABEL: ctlz_zero_undef_v2i64:
1194 ; ZVBB-NEXT: vsetivli zero, 2, e64, m1, ta, ma
1195 ; ZVBB-NEXT: vle64.v v8, (a0)
1196 ; ZVBB-NEXT: vclz.v v8, v8
1197 ; ZVBB-NEXT: vse64.v v8, (a0)
1199 %a = load <2 x i64>, ptr %x
1200 %b = load <2 x i64>, ptr %y
1201 %c = call <2 x i64> @llvm.ctlz.v2i64(<2 x i64> %a, i1 true)
1202 store <2 x i64> %c, ptr %x
1206 define void @ctlz_zero_undef_v32i8(ptr %x, ptr %y) nounwind {
1207 ; RVI-LABEL: ctlz_zero_undef_v32i8:
1209 ; RVI-NEXT: li a1, 32
1210 ; RVI-NEXT: vsetvli zero, a1, e8, m2, ta, ma
1211 ; RVI-NEXT: vle8.v v8, (a0)
1212 ; RVI-NEXT: vsrl.vi v10, v8, 1
1213 ; RVI-NEXT: vor.vv v8, v8, v10
1214 ; RVI-NEXT: vsrl.vi v10, v8, 2
1215 ; RVI-NEXT: vor.vv v8, v8, v10
1216 ; RVI-NEXT: vsrl.vi v10, v8, 4
1217 ; RVI-NEXT: vor.vv v8, v8, v10
1218 ; RVI-NEXT: vnot.v v8, v8
1219 ; RVI-NEXT: vsrl.vi v10, v8, 1
1220 ; RVI-NEXT: li a1, 85
1221 ; RVI-NEXT: vand.vx v10, v10, a1
1222 ; RVI-NEXT: vsub.vv v8, v8, v10
1223 ; RVI-NEXT: li a1, 51
1224 ; RVI-NEXT: vand.vx v10, v8, a1
1225 ; RVI-NEXT: vsrl.vi v8, v8, 2
1226 ; RVI-NEXT: vand.vx v8, v8, a1
1227 ; RVI-NEXT: vadd.vv v8, v10, v8
1228 ; RVI-NEXT: vsrl.vi v10, v8, 4
1229 ; RVI-NEXT: vadd.vv v8, v8, v10
1230 ; RVI-NEXT: vand.vi v8, v8, 15
1231 ; RVI-NEXT: vse8.v v8, (a0)
1234 ; RVF-LABEL: ctlz_zero_undef_v32i8:
1236 ; RVF-NEXT: li a1, 32
1237 ; RVF-NEXT: vsetvli zero, a1, e16, m4, ta, ma
1238 ; RVF-NEXT: vle8.v v8, (a0)
1239 ; RVF-NEXT: vzext.vf2 v12, v8
1240 ; RVF-NEXT: vfwcvt.f.xu.v v16, v12
1241 ; RVF-NEXT: vnsrl.wi v8, v16, 23
1242 ; RVF-NEXT: vsetvli zero, zero, e8, m2, ta, ma
1243 ; RVF-NEXT: vnsrl.wi v12, v8, 0
1244 ; RVF-NEXT: li a1, 134
1245 ; RVF-NEXT: vrsub.vx v8, v12, a1
1246 ; RVF-NEXT: vse8.v v8, (a0)
1249 ; RVD-LABEL: ctlz_zero_undef_v32i8:
1251 ; RVD-NEXT: li a1, 32
1252 ; RVD-NEXT: vsetvli zero, a1, e16, m4, ta, ma
1253 ; RVD-NEXT: vle8.v v8, (a0)
1254 ; RVD-NEXT: vzext.vf2 v12, v8
1255 ; RVD-NEXT: vfwcvt.f.xu.v v16, v12
1256 ; RVD-NEXT: vnsrl.wi v8, v16, 23
1257 ; RVD-NEXT: vsetvli zero, zero, e8, m2, ta, ma
1258 ; RVD-NEXT: vnsrl.wi v12, v8, 0
1259 ; RVD-NEXT: li a1, 134
1260 ; RVD-NEXT: vrsub.vx v8, v12, a1
1261 ; RVD-NEXT: vse8.v v8, (a0)
1264 ; ZVBB-LABEL: ctlz_zero_undef_v32i8:
1266 ; ZVBB-NEXT: li a1, 32
1267 ; ZVBB-NEXT: vsetvli zero, a1, e8, m2, ta, ma
1268 ; ZVBB-NEXT: vle8.v v8, (a0)
1269 ; ZVBB-NEXT: vclz.v v8, v8
1270 ; ZVBB-NEXT: vse8.v v8, (a0)
1272 %a = load <32 x i8>, ptr %x
1273 %b = load <32 x i8>, ptr %y
1274 %c = call <32 x i8> @llvm.ctlz.v32i8(<32 x i8> %a, i1 true)
1275 store <32 x i8> %c, ptr %x
1279 define void @ctlz_zero_undef_v16i16(ptr %x, ptr %y) nounwind {
1280 ; RVI-LABEL: ctlz_zero_undef_v16i16:
1282 ; RVI-NEXT: vsetivli zero, 16, e16, m2, ta, ma
1283 ; RVI-NEXT: vle16.v v8, (a0)
1284 ; RVI-NEXT: vsrl.vi v10, v8, 1
1285 ; RVI-NEXT: vor.vv v8, v8, v10
1286 ; RVI-NEXT: vsrl.vi v10, v8, 2
1287 ; RVI-NEXT: vor.vv v8, v8, v10
1288 ; RVI-NEXT: vsrl.vi v10, v8, 4
1289 ; RVI-NEXT: vor.vv v8, v8, v10
1290 ; RVI-NEXT: vsrl.vi v10, v8, 8
1291 ; RVI-NEXT: vor.vv v8, v8, v10
1292 ; RVI-NEXT: vnot.v v8, v8
1293 ; RVI-NEXT: vsrl.vi v10, v8, 1
1294 ; RVI-NEXT: lui a1, 5
1295 ; RVI-NEXT: addi a1, a1, 1365
1296 ; RVI-NEXT: vand.vx v10, v10, a1
1297 ; RVI-NEXT: vsub.vv v8, v8, v10
1298 ; RVI-NEXT: lui a1, 3
1299 ; RVI-NEXT: addi a1, a1, 819
1300 ; RVI-NEXT: vand.vx v10, v8, a1
1301 ; RVI-NEXT: vsrl.vi v8, v8, 2
1302 ; RVI-NEXT: vand.vx v8, v8, a1
1303 ; RVI-NEXT: vadd.vv v8, v10, v8
1304 ; RVI-NEXT: vsrl.vi v10, v8, 4
1305 ; RVI-NEXT: vadd.vv v8, v8, v10
1306 ; RVI-NEXT: lui a1, 1
1307 ; RVI-NEXT: addi a1, a1, -241
1308 ; RVI-NEXT: vand.vx v8, v8, a1
1309 ; RVI-NEXT: li a1, 257
1310 ; RVI-NEXT: vmul.vx v8, v8, a1
1311 ; RVI-NEXT: vsrl.vi v8, v8, 8
1312 ; RVI-NEXT: vse16.v v8, (a0)
1315 ; RVF-LABEL: ctlz_zero_undef_v16i16:
1317 ; RVF-NEXT: vsetivli zero, 16, e16, m2, ta, ma
1318 ; RVF-NEXT: vle16.v v8, (a0)
1319 ; RVF-NEXT: vfwcvt.f.xu.v v12, v8
1320 ; RVF-NEXT: vnsrl.wi v8, v12, 23
1321 ; RVF-NEXT: li a1, 142
1322 ; RVF-NEXT: vrsub.vx v8, v8, a1
1323 ; RVF-NEXT: vse16.v v8, (a0)
1326 ; RVD-LABEL: ctlz_zero_undef_v16i16:
1328 ; RVD-NEXT: vsetivli zero, 16, e16, m2, ta, ma
1329 ; RVD-NEXT: vle16.v v8, (a0)
1330 ; RVD-NEXT: vfwcvt.f.xu.v v12, v8
1331 ; RVD-NEXT: vnsrl.wi v8, v12, 23
1332 ; RVD-NEXT: li a1, 142
1333 ; RVD-NEXT: vrsub.vx v8, v8, a1
1334 ; RVD-NEXT: vse16.v v8, (a0)
1337 ; ZVBB-LABEL: ctlz_zero_undef_v16i16:
1339 ; ZVBB-NEXT: vsetivli zero, 16, e16, m2, ta, ma
1340 ; ZVBB-NEXT: vle16.v v8, (a0)
1341 ; ZVBB-NEXT: vclz.v v8, v8
1342 ; ZVBB-NEXT: vse16.v v8, (a0)
1344 %a = load <16 x i16>, ptr %x
1345 %b = load <16 x i16>, ptr %y
1346 %c = call <16 x i16> @llvm.ctlz.v16i16(<16 x i16> %a, i1 true)
1347 store <16 x i16> %c, ptr %x
1351 define void @ctlz_zero_undef_v8i32(ptr %x, ptr %y) nounwind {
1352 ; RVI-LABEL: ctlz_zero_undef_v8i32:
1354 ; RVI-NEXT: vsetivli zero, 8, e32, m2, ta, ma
1355 ; RVI-NEXT: vle32.v v8, (a0)
1356 ; RVI-NEXT: vsrl.vi v10, v8, 1
1357 ; RVI-NEXT: vor.vv v8, v8, v10
1358 ; RVI-NEXT: vsrl.vi v10, v8, 2
1359 ; RVI-NEXT: vor.vv v8, v8, v10
1360 ; RVI-NEXT: vsrl.vi v10, v8, 4
1361 ; RVI-NEXT: vor.vv v8, v8, v10
1362 ; RVI-NEXT: vsrl.vi v10, v8, 8
1363 ; RVI-NEXT: vor.vv v8, v8, v10
1364 ; RVI-NEXT: vsrl.vi v10, v8, 16
1365 ; RVI-NEXT: vor.vv v8, v8, v10
1366 ; RVI-NEXT: vnot.v v8, v8
1367 ; RVI-NEXT: vsrl.vi v10, v8, 1
1368 ; RVI-NEXT: lui a1, 349525
1369 ; RVI-NEXT: addi a1, a1, 1365
1370 ; RVI-NEXT: vand.vx v10, v10, a1
1371 ; RVI-NEXT: vsub.vv v8, v8, v10
1372 ; RVI-NEXT: lui a1, 209715
1373 ; RVI-NEXT: addi a1, a1, 819
1374 ; RVI-NEXT: vand.vx v10, v8, a1
1375 ; RVI-NEXT: vsrl.vi v8, v8, 2
1376 ; RVI-NEXT: vand.vx v8, v8, a1
1377 ; RVI-NEXT: vadd.vv v8, v10, v8
1378 ; RVI-NEXT: vsrl.vi v10, v8, 4
1379 ; RVI-NEXT: vadd.vv v8, v8, v10
1380 ; RVI-NEXT: lui a1, 61681
1381 ; RVI-NEXT: addi a1, a1, -241
1382 ; RVI-NEXT: vand.vx v8, v8, a1
1383 ; RVI-NEXT: lui a1, 4112
1384 ; RVI-NEXT: addi a1, a1, 257
1385 ; RVI-NEXT: vmul.vx v8, v8, a1
1386 ; RVI-NEXT: vsrl.vi v8, v8, 24
1387 ; RVI-NEXT: vse32.v v8, (a0)
1390 ; RVF-LABEL: ctlz_zero_undef_v8i32:
1392 ; RVF-NEXT: vsetivli zero, 8, e32, m2, ta, ma
1393 ; RVF-NEXT: vle32.v v8, (a0)
1394 ; RVF-NEXT: fsrmi a1, 1
1395 ; RVF-NEXT: vfcvt.f.xu.v v8, v8
1397 ; RVF-NEXT: vsrl.vi v8, v8, 23
1398 ; RVF-NEXT: li a1, 158
1399 ; RVF-NEXT: vrsub.vx v8, v8, a1
1400 ; RVF-NEXT: vse32.v v8, (a0)
1403 ; RVD-LABEL: ctlz_zero_undef_v8i32:
1405 ; RVD-NEXT: vsetivli zero, 8, e32, m2, ta, ma
1406 ; RVD-NEXT: vle32.v v8, (a0)
1407 ; RVD-NEXT: vfwcvt.f.xu.v v12, v8
1408 ; RVD-NEXT: li a1, 52
1409 ; RVD-NEXT: vnsrl.wx v8, v12, a1
1410 ; RVD-NEXT: li a1, 1054
1411 ; RVD-NEXT: vrsub.vx v8, v8, a1
1412 ; RVD-NEXT: vse32.v v8, (a0)
1415 ; ZVBB-LABEL: ctlz_zero_undef_v8i32:
1417 ; ZVBB-NEXT: vsetivli zero, 8, e32, m2, ta, ma
1418 ; ZVBB-NEXT: vle32.v v8, (a0)
1419 ; ZVBB-NEXT: vclz.v v8, v8
1420 ; ZVBB-NEXT: vse32.v v8, (a0)
1422 %a = load <8 x i32>, ptr %x
1423 %b = load <8 x i32>, ptr %y
1424 %c = call <8 x i32> @llvm.ctlz.v8i32(<8 x i32> %a, i1 true)
1425 store <8 x i32> %c, ptr %x
1429 define void @ctlz_zero_undef_v4i64(ptr %x, ptr %y) nounwind {
1430 ; RV32I-LABEL: ctlz_zero_undef_v4i64:
1432 ; RV32I-NEXT: vsetivli zero, 4, e64, m2, ta, ma
1433 ; RV32I-NEXT: vle64.v v8, (a0)
1434 ; RV32I-NEXT: vsrl.vi v10, v8, 1
1435 ; RV32I-NEXT: vor.vv v8, v8, v10
1436 ; RV32I-NEXT: vsrl.vi v10, v8, 2
1437 ; RV32I-NEXT: vor.vv v8, v8, v10
1438 ; RV32I-NEXT: vsrl.vi v10, v8, 4
1439 ; RV32I-NEXT: vor.vv v8, v8, v10
1440 ; RV32I-NEXT: vsrl.vi v10, v8, 8
1441 ; RV32I-NEXT: vor.vv v8, v8, v10
1442 ; RV32I-NEXT: vsrl.vi v10, v8, 16
1443 ; RV32I-NEXT: vor.vv v8, v8, v10
1444 ; RV32I-NEXT: li a1, 32
1445 ; RV32I-NEXT: vsrl.vx v10, v8, a1
1446 ; RV32I-NEXT: vor.vv v8, v8, v10
1447 ; RV32I-NEXT: vnot.v v8, v8
1448 ; RV32I-NEXT: vsrl.vi v10, v8, 1
1449 ; RV32I-NEXT: lui a1, 349525
1450 ; RV32I-NEXT: addi a1, a1, 1365
1451 ; RV32I-NEXT: vsetivli zero, 8, e32, m2, ta, ma
1452 ; RV32I-NEXT: vmv.v.x v12, a1
1453 ; RV32I-NEXT: vsetivli zero, 4, e64, m2, ta, ma
1454 ; RV32I-NEXT: vand.vv v10, v10, v12
1455 ; RV32I-NEXT: vsub.vv v8, v8, v10
1456 ; RV32I-NEXT: lui a1, 209715
1457 ; RV32I-NEXT: addi a1, a1, 819
1458 ; RV32I-NEXT: vsetivli zero, 8, e32, m2, ta, ma
1459 ; RV32I-NEXT: vmv.v.x v10, a1
1460 ; RV32I-NEXT: vsetivli zero, 4, e64, m2, ta, ma
1461 ; RV32I-NEXT: vand.vv v12, v8, v10
1462 ; RV32I-NEXT: vsrl.vi v8, v8, 2
1463 ; RV32I-NEXT: vand.vv v8, v8, v10
1464 ; RV32I-NEXT: vadd.vv v8, v12, v8
1465 ; RV32I-NEXT: vsrl.vi v10, v8, 4
1466 ; RV32I-NEXT: vadd.vv v8, v8, v10
1467 ; RV32I-NEXT: lui a1, 61681
1468 ; RV32I-NEXT: addi a1, a1, -241
1469 ; RV32I-NEXT: vsetivli zero, 8, e32, m2, ta, ma
1470 ; RV32I-NEXT: vmv.v.x v10, a1
1471 ; RV32I-NEXT: vsetivli zero, 4, e64, m2, ta, ma
1472 ; RV32I-NEXT: vand.vv v8, v8, v10
1473 ; RV32I-NEXT: lui a1, 4112
1474 ; RV32I-NEXT: addi a1, a1, 257
1475 ; RV32I-NEXT: vsetivli zero, 8, e32, m2, ta, ma
1476 ; RV32I-NEXT: vmv.v.x v10, a1
1477 ; RV32I-NEXT: vsetivli zero, 4, e64, m2, ta, ma
1478 ; RV32I-NEXT: vmul.vv v8, v8, v10
1479 ; RV32I-NEXT: li a1, 56
1480 ; RV32I-NEXT: vsrl.vx v8, v8, a1
1481 ; RV32I-NEXT: vse64.v v8, (a0)
1484 ; RV64I-LABEL: ctlz_zero_undef_v4i64:
1486 ; RV64I-NEXT: vsetivli zero, 4, e64, m2, ta, ma
1487 ; RV64I-NEXT: vle64.v v8, (a0)
1488 ; RV64I-NEXT: vsrl.vi v10, v8, 1
1489 ; RV64I-NEXT: vor.vv v8, v8, v10
1490 ; RV64I-NEXT: vsrl.vi v10, v8, 2
1491 ; RV64I-NEXT: vor.vv v8, v8, v10
1492 ; RV64I-NEXT: vsrl.vi v10, v8, 4
1493 ; RV64I-NEXT: vor.vv v8, v8, v10
1494 ; RV64I-NEXT: vsrl.vi v10, v8, 8
1495 ; RV64I-NEXT: vor.vv v8, v8, v10
1496 ; RV64I-NEXT: vsrl.vi v10, v8, 16
1497 ; RV64I-NEXT: vor.vv v8, v8, v10
1498 ; RV64I-NEXT: li a1, 32
1499 ; RV64I-NEXT: vsrl.vx v10, v8, a1
1500 ; RV64I-NEXT: vor.vv v8, v8, v10
1501 ; RV64I-NEXT: vnot.v v8, v8
1502 ; RV64I-NEXT: vsrl.vi v10, v8, 1
1503 ; RV64I-NEXT: lui a1, 349525
1504 ; RV64I-NEXT: addiw a1, a1, 1365
1505 ; RV64I-NEXT: slli a2, a1, 32
1506 ; RV64I-NEXT: add a1, a1, a2
1507 ; RV64I-NEXT: vand.vx v10, v10, a1
1508 ; RV64I-NEXT: vsub.vv v8, v8, v10
1509 ; RV64I-NEXT: lui a1, 209715
1510 ; RV64I-NEXT: addiw a1, a1, 819
1511 ; RV64I-NEXT: slli a2, a1, 32
1512 ; RV64I-NEXT: add a1, a1, a2
1513 ; RV64I-NEXT: vand.vx v10, v8, a1
1514 ; RV64I-NEXT: vsrl.vi v8, v8, 2
1515 ; RV64I-NEXT: vand.vx v8, v8, a1
1516 ; RV64I-NEXT: vadd.vv v8, v10, v8
1517 ; RV64I-NEXT: vsrl.vi v10, v8, 4
1518 ; RV64I-NEXT: vadd.vv v8, v8, v10
1519 ; RV64I-NEXT: lui a1, 61681
1520 ; RV64I-NEXT: addiw a1, a1, -241
1521 ; RV64I-NEXT: slli a2, a1, 32
1522 ; RV64I-NEXT: add a1, a1, a2
1523 ; RV64I-NEXT: vand.vx v8, v8, a1
1524 ; RV64I-NEXT: lui a1, 4112
1525 ; RV64I-NEXT: addiw a1, a1, 257
1526 ; RV64I-NEXT: slli a2, a1, 32
1527 ; RV64I-NEXT: add a1, a1, a2
1528 ; RV64I-NEXT: vmul.vx v8, v8, a1
1529 ; RV64I-NEXT: li a1, 56
1530 ; RV64I-NEXT: vsrl.vx v8, v8, a1
1531 ; RV64I-NEXT: vse64.v v8, (a0)
1534 ; RV32F-LABEL: ctlz_zero_undef_v4i64:
1536 ; RV32F-NEXT: vsetivli zero, 4, e64, m2, ta, ma
1537 ; RV32F-NEXT: vle64.v v8, (a0)
1538 ; RV32F-NEXT: li a1, 190
1539 ; RV32F-NEXT: vmv.v.x v10, a1
1540 ; RV32F-NEXT: fsrmi a1, 1
1541 ; RV32F-NEXT: vsetvli zero, zero, e32, m1, ta, ma
1542 ; RV32F-NEXT: vfncvt.f.xu.w v12, v8
1543 ; RV32F-NEXT: fsrm a1
1544 ; RV32F-NEXT: vsrl.vi v8, v12, 23
1545 ; RV32F-NEXT: vwsubu.wv v10, v10, v8
1546 ; RV32F-NEXT: vse64.v v10, (a0)
1549 ; RV64F-LABEL: ctlz_zero_undef_v4i64:
1551 ; RV64F-NEXT: vsetivli zero, 4, e32, m1, ta, ma
1552 ; RV64F-NEXT: vle64.v v8, (a0)
1553 ; RV64F-NEXT: li a1, 190
1554 ; RV64F-NEXT: vmv.v.x v10, a1
1555 ; RV64F-NEXT: fsrmi a1, 1
1556 ; RV64F-NEXT: vfncvt.f.xu.w v11, v8
1557 ; RV64F-NEXT: fsrm a1
1558 ; RV64F-NEXT: vsrl.vi v8, v11, 23
1559 ; RV64F-NEXT: vwsubu.vv v12, v10, v8
1560 ; RV64F-NEXT: vse64.v v12, (a0)
1563 ; RVD-LABEL: ctlz_zero_undef_v4i64:
1565 ; RVD-NEXT: vsetivli zero, 4, e64, m2, ta, ma
1566 ; RVD-NEXT: vle64.v v8, (a0)
1567 ; RVD-NEXT: fsrmi a1, 1
1568 ; RVD-NEXT: vfcvt.f.xu.v v8, v8
1570 ; RVD-NEXT: li a1, 52
1571 ; RVD-NEXT: vsrl.vx v8, v8, a1
1572 ; RVD-NEXT: li a1, 1086
1573 ; RVD-NEXT: vrsub.vx v8, v8, a1
1574 ; RVD-NEXT: vse64.v v8, (a0)
1577 ; ZVBB-LABEL: ctlz_zero_undef_v4i64:
1579 ; ZVBB-NEXT: vsetivli zero, 4, e64, m2, ta, ma
1580 ; ZVBB-NEXT: vle64.v v8, (a0)
1581 ; ZVBB-NEXT: vclz.v v8, v8
1582 ; ZVBB-NEXT: vse64.v v8, (a0)
1584 %a = load <4 x i64>, ptr %x
1585 %b = load <4 x i64>, ptr %y
1586 %c = call <4 x i64> @llvm.ctlz.v4i64(<4 x i64> %a, i1 true)
1587 store <4 x i64> %c, ptr %x
1590 ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: