[RISCV] Support postRA vsetvl insertion pass (#70549)
[llvm-project.git] / llvm / test / CodeGen / RISCV / rvv / fixed-vectors-ctlz.ll
blob49e5a1c79c43b9e2b879348b226bacfad24e7b42
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:
13 ; RVI:       # %bb.0:
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
24 ; RVI-NEXT:    li a1, 85
25 ; RVI-NEXT:    vand.vx v9, v9, a1
26 ; RVI-NEXT:    vsub.vv v8, v8, v9
27 ; RVI-NEXT:    li a1, 51
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)
36 ; RVI-NEXT:    ret
38 ; RVF-LABEL: ctlz_v16i8:
39 ; RVF:       # %bb.0:
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
49 ; RVF-NEXT:    li a1, 8
50 ; RVF-NEXT:    vminu.vx v8, v8, a1
51 ; RVF-NEXT:    vse8.v v8, (a0)
52 ; RVF-NEXT:    ret
54 ; RVD-LABEL: ctlz_v16i8:
55 ; RVD:       # %bb.0:
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
65 ; RVD-NEXT:    li a1, 8
66 ; RVD-NEXT:    vminu.vx v8, v8, a1
67 ; RVD-NEXT:    vse8.v v8, (a0)
68 ; RVD-NEXT:    ret
70 ; ZVBB-LABEL: ctlz_v16i8:
71 ; ZVBB:       # %bb.0:
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)
76 ; ZVBB-NEXT:    ret
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
81   ret void
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:
87 ; RVI:       # %bb.0:
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)
119 ; RVI-NEXT:    ret
121 ; RVF-LABEL: ctlz_v8i16:
122 ; RVF:       # %bb.0:
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)
132 ; RVF-NEXT:    ret
134 ; RVD-LABEL: ctlz_v8i16:
135 ; RVD:       # %bb.0:
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)
145 ; RVD-NEXT:    ret
147 ; ZVBB-LABEL: ctlz_v8i16:
148 ; ZVBB:       # %bb.0:
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)
153 ; ZVBB-NEXT:    ret
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
158   ret void
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:
164 ; RVI:       # %bb.0:
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)
199 ; RVI-NEXT:    ret
201 ; RVF-LABEL: ctlz_v4i32:
202 ; RVF:       # %bb.0:
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
207 ; RVF-NEXT:    fsrm a1
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)
214 ; RVF-NEXT:    ret
216 ; RVD-LABEL: ctlz_v4i32:
217 ; RVD:       # %bb.0:
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)
228 ; RVD-NEXT:    ret
230 ; ZVBB-LABEL: ctlz_v4i32:
231 ; ZVBB:       # %bb.0:
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)
236 ; ZVBB-NEXT:    ret
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
241   ret void
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:
247 ; RV32I:       # %bb.0:
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)
298 ; RV32I-NEXT:    ret
300 ; RV64I-LABEL: ctlz_v2i64:
301 ; RV64I:       # %bb.0:
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)
348 ; RV64I-NEXT:    ret
350 ; RV32F-LABEL: ctlz_v2i64:
351 ; RV32F:       # %bb.0:
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)
366 ; RV32F-NEXT:    ret
368 ; RV64F-LABEL: ctlz_v2i64:
369 ; RV64F:       # %bb.0:
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)
383 ; RV64F-NEXT:    ret
385 ; RVD-LABEL: ctlz_v2i64:
386 ; RVD:       # %bb.0:
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
391 ; RVD-NEXT:    fsrm a1
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)
399 ; RVD-NEXT:    ret
401 ; ZVBB-LABEL: ctlz_v2i64:
402 ; ZVBB:       # %bb.0:
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)
407 ; ZVBB-NEXT:    ret
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
412   ret void
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:
418 ; RVI:       # %bb.0:
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)
442 ; RVI-NEXT:    ret
444 ; RVF-LABEL: ctlz_v32i8:
445 ; RVF:       # %bb.0:
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
456 ; RVF-NEXT:    li a1, 8
457 ; RVF-NEXT:    vminu.vx v8, v8, a1
458 ; RVF-NEXT:    vse8.v v8, (a0)
459 ; RVF-NEXT:    ret
461 ; RVD-LABEL: ctlz_v32i8:
462 ; RVD:       # %bb.0:
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
473 ; RVD-NEXT:    li a1, 8
474 ; RVD-NEXT:    vminu.vx v8, v8, a1
475 ; RVD-NEXT:    vse8.v v8, (a0)
476 ; RVD-NEXT:    ret
478 ; ZVBB-LABEL: ctlz_v32i8:
479 ; ZVBB:       # %bb.0:
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)
485 ; ZVBB-NEXT:    ret
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
490   ret void
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:
496 ; RVI:       # %bb.0:
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)
528 ; RVI-NEXT:    ret
530 ; RVF-LABEL: ctlz_v16i16:
531 ; RVF:       # %bb.0:
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)
541 ; RVF-NEXT:    ret
543 ; RVD-LABEL: ctlz_v16i16:
544 ; RVD:       # %bb.0:
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)
554 ; RVD-NEXT:    ret
556 ; ZVBB-LABEL: ctlz_v16i16:
557 ; ZVBB:       # %bb.0:
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)
562 ; ZVBB-NEXT:    ret
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
567   ret void
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:
573 ; RVI:       # %bb.0:
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)
608 ; RVI-NEXT:    ret
610 ; RVF-LABEL: ctlz_v8i32:
611 ; RVF:       # %bb.0:
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
616 ; RVF-NEXT:    fsrm a1
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)
623 ; RVF-NEXT:    ret
625 ; RVD-LABEL: ctlz_v8i32:
626 ; RVD:       # %bb.0:
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)
637 ; RVD-NEXT:    ret
639 ; ZVBB-LABEL: ctlz_v8i32:
640 ; ZVBB:       # %bb.0:
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)
645 ; ZVBB-NEXT:    ret
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
650   ret void
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:
656 ; RV32I:       # %bb.0:
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)
707 ; RV32I-NEXT:    ret
709 ; RV64I-LABEL: ctlz_v4i64:
710 ; RV64I:       # %bb.0:
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)
757 ; RV64I-NEXT:    ret
759 ; RV32F-LABEL: ctlz_v4i64:
760 ; RV32F:       # %bb.0:
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)
775 ; RV32F-NEXT:    ret
777 ; RV64F-LABEL: ctlz_v4i64:
778 ; RV64F:       # %bb.0:
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)
792 ; RV64F-NEXT:    ret
794 ; RVD-LABEL: ctlz_v4i64:
795 ; RVD:       # %bb.0:
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
800 ; RVD-NEXT:    fsrm a1
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)
808 ; RVD-NEXT:    ret
810 ; ZVBB-LABEL: ctlz_v4i64:
811 ; ZVBB:       # %bb.0:
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)
816 ; ZVBB-NEXT:    ret
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
821   ret void
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:
827 ; RVI:       # %bb.0:
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)
850 ; RVI-NEXT:    ret
852 ; RVF-LABEL: ctlz_zero_undef_v16i8:
853 ; RVF:       # %bb.0:
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)
864 ; RVF-NEXT:    ret
866 ; RVD-LABEL: ctlz_zero_undef_v16i8:
867 ; RVD:       # %bb.0:
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)
878 ; RVD-NEXT:    ret
880 ; ZVBB-LABEL: ctlz_zero_undef_v16i8:
881 ; ZVBB:       # %bb.0:
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)
886 ; ZVBB-NEXT:    ret
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
891   ret void
894 define void @ctlz_zero_undef_v8i16(ptr %x, ptr %y) nounwind {
895 ; RVI-LABEL: ctlz_zero_undef_v8i16:
896 ; RVI:       # %bb.0:
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)
928 ; RVI-NEXT:    ret
930 ; RVF-LABEL: ctlz_zero_undef_v8i16:
931 ; RVF:       # %bb.0:
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)
939 ; RVF-NEXT:    ret
941 ; RVD-LABEL: ctlz_zero_undef_v8i16:
942 ; RVD:       # %bb.0:
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)
950 ; RVD-NEXT:    ret
952 ; ZVBB-LABEL: ctlz_zero_undef_v8i16:
953 ; ZVBB:       # %bb.0:
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)
958 ; ZVBB-NEXT:    ret
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
963   ret void
966 define void @ctlz_zero_undef_v4i32(ptr %x, ptr %y) nounwind {
967 ; RVI-LABEL: ctlz_zero_undef_v4i32:
968 ; RVI:       # %bb.0:
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)
1003 ; RVI-NEXT:    ret
1005 ; RVF-LABEL: ctlz_zero_undef_v4i32:
1006 ; RVF:       # %bb.0:
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
1011 ; RVF-NEXT:    fsrm a1
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)
1016 ; RVF-NEXT:    ret
1018 ; RVD-LABEL: ctlz_zero_undef_v4i32:
1019 ; RVD:       # %bb.0:
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)
1028 ; RVD-NEXT:    ret
1030 ; ZVBB-LABEL: ctlz_zero_undef_v4i32:
1031 ; ZVBB:       # %bb.0:
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)
1036 ; ZVBB-NEXT:    ret
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
1041   ret void
1044 define void @ctlz_zero_undef_v2i64(ptr %x, ptr %y) nounwind {
1045 ; RV32I-LABEL: ctlz_zero_undef_v2i64:
1046 ; RV32I:       # %bb.0:
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)
1097 ; RV32I-NEXT:    ret
1099 ; RV64I-LABEL: ctlz_zero_undef_v2i64:
1100 ; RV64I:       # %bb.0:
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)
1147 ; RV64I-NEXT:    ret
1149 ; RV32F-LABEL: ctlz_zero_undef_v2i64:
1150 ; RV32F:       # %bb.0:
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)
1162 ; RV32F-NEXT:    ret
1164 ; RV64F-LABEL: ctlz_zero_undef_v2i64:
1165 ; RV64F:       # %bb.0:
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)
1176 ; RV64F-NEXT:    ret
1178 ; RVD-LABEL: ctlz_zero_undef_v2i64:
1179 ; RVD:       # %bb.0:
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
1184 ; RVD-NEXT:    fsrm a1
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)
1190 ; RVD-NEXT:    ret
1192 ; ZVBB-LABEL: ctlz_zero_undef_v2i64:
1193 ; ZVBB:       # %bb.0:
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)
1198 ; ZVBB-NEXT:    ret
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
1203   ret void
1206 define void @ctlz_zero_undef_v32i8(ptr %x, ptr %y) nounwind {
1207 ; RVI-LABEL: ctlz_zero_undef_v32i8:
1208 ; RVI:       # %bb.0:
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)
1232 ; RVI-NEXT:    ret
1234 ; RVF-LABEL: ctlz_zero_undef_v32i8:
1235 ; RVF:       # %bb.0:
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)
1247 ; RVF-NEXT:    ret
1249 ; RVD-LABEL: ctlz_zero_undef_v32i8:
1250 ; RVD:       # %bb.0:
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)
1262 ; RVD-NEXT:    ret
1264 ; ZVBB-LABEL: ctlz_zero_undef_v32i8:
1265 ; ZVBB:       # %bb.0:
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)
1271 ; ZVBB-NEXT:    ret
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
1276   ret void
1279 define void @ctlz_zero_undef_v16i16(ptr %x, ptr %y) nounwind {
1280 ; RVI-LABEL: ctlz_zero_undef_v16i16:
1281 ; RVI:       # %bb.0:
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)
1313 ; RVI-NEXT:    ret
1315 ; RVF-LABEL: ctlz_zero_undef_v16i16:
1316 ; RVF:       # %bb.0:
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)
1324 ; RVF-NEXT:    ret
1326 ; RVD-LABEL: ctlz_zero_undef_v16i16:
1327 ; RVD:       # %bb.0:
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)
1335 ; RVD-NEXT:    ret
1337 ; ZVBB-LABEL: ctlz_zero_undef_v16i16:
1338 ; ZVBB:       # %bb.0:
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)
1343 ; ZVBB-NEXT:    ret
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
1348   ret void
1351 define void @ctlz_zero_undef_v8i32(ptr %x, ptr %y) nounwind {
1352 ; RVI-LABEL: ctlz_zero_undef_v8i32:
1353 ; RVI:       # %bb.0:
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)
1388 ; RVI-NEXT:    ret
1390 ; RVF-LABEL: ctlz_zero_undef_v8i32:
1391 ; RVF:       # %bb.0:
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
1396 ; RVF-NEXT:    fsrm a1
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)
1401 ; RVF-NEXT:    ret
1403 ; RVD-LABEL: ctlz_zero_undef_v8i32:
1404 ; RVD:       # %bb.0:
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)
1413 ; RVD-NEXT:    ret
1415 ; ZVBB-LABEL: ctlz_zero_undef_v8i32:
1416 ; ZVBB:       # %bb.0:
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)
1421 ; ZVBB-NEXT:    ret
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
1426   ret void
1429 define void @ctlz_zero_undef_v4i64(ptr %x, ptr %y) nounwind {
1430 ; RV32I-LABEL: ctlz_zero_undef_v4i64:
1431 ; RV32I:       # %bb.0:
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)
1482 ; RV32I-NEXT:    ret
1484 ; RV64I-LABEL: ctlz_zero_undef_v4i64:
1485 ; RV64I:       # %bb.0:
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)
1532 ; RV64I-NEXT:    ret
1534 ; RV32F-LABEL: ctlz_zero_undef_v4i64:
1535 ; RV32F:       # %bb.0:
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)
1547 ; RV32F-NEXT:    ret
1549 ; RV64F-LABEL: ctlz_zero_undef_v4i64:
1550 ; RV64F:       # %bb.0:
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)
1561 ; RV64F-NEXT:    ret
1563 ; RVD-LABEL: ctlz_zero_undef_v4i64:
1564 ; RVD:       # %bb.0:
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
1569 ; RVD-NEXT:    fsrm a1
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)
1575 ; RVD-NEXT:    ret
1577 ; ZVBB-LABEL: ctlz_zero_undef_v4i64:
1578 ; ZVBB:       # %bb.0:
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)
1583 ; ZVBB-NEXT:    ret
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
1588   ret void
1590 ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
1591 ; RV32D: {{.*}}
1592 ; RV64D: {{.*}}