Re-land [openmp] Fix warnings when building on Windows with latest MSVC or Clang...
[llvm-project.git] / llvm / test / CodeGen / RISCV / rvv / ctlz-vp.ll
blobe4f030a642f7d1239ddf458b49100245c3397235
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv32 -mattr=+d,+zfh,+zvfh,+v,+m -target-abi=ilp32d \
3 ; RUN:     -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV32
4 ; RUN: llc -mtriple=riscv64 -mattr=+d,+zfh,+zvfh,+v,+m -target-abi=lp64d \
5 ; RUN:     -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV64
6 ; RUN: llc -mtriple=riscv32 -mattr=+v,+zvbb,+m -target-abi=ilp32d \
7 ; RUN:     -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK-ZVBB
8 ; RUN: llc -mtriple=riscv64 -mattr=+v,+zvbb,+m -target-abi=lp64d \
9 ; RUN:     -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK-ZVBB
11 declare <vscale x 1 x i8> @llvm.vp.ctlz.nxv1i8(<vscale x 1 x i8>, i1 immarg, <vscale x 1 x i1>, i32)
13 define <vscale x 1 x i8> @vp_ctlz_nxv1i8(<vscale x 1 x i8> %va, <vscale x 1 x i1> %m, i32 zeroext %evl) {
14 ; CHECK-LABEL: vp_ctlz_nxv1i8:
15 ; CHECK:       # %bb.0:
16 ; CHECK-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
17 ; CHECK-NEXT:    vzext.vf2 v9, v8, v0.t
18 ; CHECK-NEXT:    vfwcvt.f.xu.v v8, v9, v0.t
19 ; CHECK-NEXT:    vsetvli zero, zero, e32, mf2, ta, ma
20 ; CHECK-NEXT:    vsrl.vi v8, v8, 23, v0.t
21 ; CHECK-NEXT:    vsetvli zero, zero, e16, mf4, ta, ma
22 ; CHECK-NEXT:    vnsrl.wi v8, v8, 0, v0.t
23 ; CHECK-NEXT:    vsetvli zero, zero, e8, mf8, ta, ma
24 ; CHECK-NEXT:    vnsrl.wi v8, v8, 0, v0.t
25 ; CHECK-NEXT:    li a0, 134
26 ; CHECK-NEXT:    vrsub.vx v8, v8, a0, v0.t
27 ; CHECK-NEXT:    li a0, 8
28 ; CHECK-NEXT:    vminu.vx v8, v8, a0, v0.t
29 ; CHECK-NEXT:    ret
31 ; CHECK-ZVBB-LABEL: vp_ctlz_nxv1i8:
32 ; CHECK-ZVBB:       # %bb.0:
33 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e8, mf8, ta, ma
34 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8, v0.t
35 ; CHECK-ZVBB-NEXT:    ret
36   %v = call <vscale x 1 x i8> @llvm.vp.ctlz.nxv1i8(<vscale x 1 x i8> %va, i1 false, <vscale x 1 x i1> %m, i32 %evl)
37   ret <vscale x 1 x i8> %v
40 define <vscale x 1 x i8> @vp_ctlz_nxv1i8_unmasked(<vscale x 1 x i8> %va, i32 zeroext %evl) {
41 ; CHECK-LABEL: vp_ctlz_nxv1i8_unmasked:
42 ; CHECK:       # %bb.0:
43 ; CHECK-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
44 ; CHECK-NEXT:    vzext.vf2 v9, v8
45 ; CHECK-NEXT:    vfwcvt.f.xu.v v8, v9
46 ; CHECK-NEXT:    vnsrl.wi v8, v8, 23
47 ; CHECK-NEXT:    vsetvli zero, zero, e8, mf8, ta, ma
48 ; CHECK-NEXT:    vnsrl.wi v8, v8, 0
49 ; CHECK-NEXT:    li a0, 134
50 ; CHECK-NEXT:    vrsub.vx v8, v8, a0
51 ; CHECK-NEXT:    li a0, 8
52 ; CHECK-NEXT:    vminu.vx v8, v8, a0
53 ; CHECK-NEXT:    ret
55 ; CHECK-ZVBB-LABEL: vp_ctlz_nxv1i8_unmasked:
56 ; CHECK-ZVBB:       # %bb.0:
57 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e8, mf8, ta, ma
58 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
59 ; CHECK-ZVBB-NEXT:    ret
60   %head = insertelement <vscale x 1 x i1> poison, i1 true, i32 0
61   %m = shufflevector <vscale x 1 x i1> %head, <vscale x 1 x i1> poison, <vscale x 1 x i32> zeroinitializer
62   %v = call <vscale x 1 x i8> @llvm.vp.ctlz.nxv1i8(<vscale x 1 x i8> %va, i1 false, <vscale x 1 x i1> %m, i32 %evl)
63   ret <vscale x 1 x i8> %v
66 declare <vscale x 2 x i8> @llvm.vp.ctlz.nxv2i8(<vscale x 2 x i8>, i1 immarg, <vscale x 2 x i1>, i32)
68 define <vscale x 2 x i8> @vp_ctlz_nxv2i8(<vscale x 2 x i8> %va, <vscale x 2 x i1> %m, i32 zeroext %evl) {
69 ; CHECK-LABEL: vp_ctlz_nxv2i8:
70 ; CHECK:       # %bb.0:
71 ; CHECK-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
72 ; CHECK-NEXT:    vzext.vf2 v9, v8, v0.t
73 ; CHECK-NEXT:    vfwcvt.f.xu.v v8, v9, v0.t
74 ; CHECK-NEXT:    vsetvli zero, zero, e32, m1, ta, ma
75 ; CHECK-NEXT:    vsrl.vi v8, v8, 23, v0.t
76 ; CHECK-NEXT:    vsetvli zero, zero, e16, mf2, ta, ma
77 ; CHECK-NEXT:    vnsrl.wi v8, v8, 0, v0.t
78 ; CHECK-NEXT:    vsetvli zero, zero, e8, mf4, ta, ma
79 ; CHECK-NEXT:    vnsrl.wi v8, v8, 0, v0.t
80 ; CHECK-NEXT:    li a0, 134
81 ; CHECK-NEXT:    vrsub.vx v8, v8, a0, v0.t
82 ; CHECK-NEXT:    li a0, 8
83 ; CHECK-NEXT:    vminu.vx v8, v8, a0, v0.t
84 ; CHECK-NEXT:    ret
86 ; CHECK-ZVBB-LABEL: vp_ctlz_nxv2i8:
87 ; CHECK-ZVBB:       # %bb.0:
88 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e8, mf4, ta, ma
89 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8, v0.t
90 ; CHECK-ZVBB-NEXT:    ret
91   %v = call <vscale x 2 x i8> @llvm.vp.ctlz.nxv2i8(<vscale x 2 x i8> %va, i1 false, <vscale x 2 x i1> %m, i32 %evl)
92   ret <vscale x 2 x i8> %v
95 define <vscale x 2 x i8> @vp_ctlz_nxv2i8_unmasked(<vscale x 2 x i8> %va, i32 zeroext %evl) {
96 ; CHECK-LABEL: vp_ctlz_nxv2i8_unmasked:
97 ; CHECK:       # %bb.0:
98 ; CHECK-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
99 ; CHECK-NEXT:    vzext.vf2 v9, v8
100 ; CHECK-NEXT:    vfwcvt.f.xu.v v8, v9
101 ; CHECK-NEXT:    vnsrl.wi v8, v8, 23
102 ; CHECK-NEXT:    vsetvli zero, zero, e8, mf4, ta, ma
103 ; CHECK-NEXT:    vnsrl.wi v8, v8, 0
104 ; CHECK-NEXT:    li a0, 134
105 ; CHECK-NEXT:    vrsub.vx v8, v8, a0
106 ; CHECK-NEXT:    li a0, 8
107 ; CHECK-NEXT:    vminu.vx v8, v8, a0
108 ; CHECK-NEXT:    ret
110 ; CHECK-ZVBB-LABEL: vp_ctlz_nxv2i8_unmasked:
111 ; CHECK-ZVBB:       # %bb.0:
112 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e8, mf4, ta, ma
113 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
114 ; CHECK-ZVBB-NEXT:    ret
115   %head = insertelement <vscale x 2 x i1> poison, i1 true, i32 0
116   %m = shufflevector <vscale x 2 x i1> %head, <vscale x 2 x i1> poison, <vscale x 2 x i32> zeroinitializer
117   %v = call <vscale x 2 x i8> @llvm.vp.ctlz.nxv2i8(<vscale x 2 x i8> %va, i1 false, <vscale x 2 x i1> %m, i32 %evl)
118   ret <vscale x 2 x i8> %v
121 declare <vscale x 4 x i8> @llvm.vp.ctlz.nxv4i8(<vscale x 4 x i8>, i1 immarg, <vscale x 4 x i1>, i32)
123 define <vscale x 4 x i8> @vp_ctlz_nxv4i8(<vscale x 4 x i8> %va, <vscale x 4 x i1> %m, i32 zeroext %evl) {
124 ; CHECK-LABEL: vp_ctlz_nxv4i8:
125 ; CHECK:       # %bb.0:
126 ; CHECK-NEXT:    vsetvli zero, a0, e16, m1, ta, ma
127 ; CHECK-NEXT:    vzext.vf2 v9, v8, v0.t
128 ; CHECK-NEXT:    vfwcvt.f.xu.v v10, v9, v0.t
129 ; CHECK-NEXT:    vsetvli zero, zero, e32, m2, ta, ma
130 ; CHECK-NEXT:    vsrl.vi v8, v10, 23, v0.t
131 ; CHECK-NEXT:    vsetvli zero, zero, e16, m1, ta, ma
132 ; CHECK-NEXT:    vnsrl.wi v10, v8, 0, v0.t
133 ; CHECK-NEXT:    vsetvli zero, zero, e8, mf2, ta, ma
134 ; CHECK-NEXT:    vnsrl.wi v8, v10, 0, v0.t
135 ; CHECK-NEXT:    li a0, 134
136 ; CHECK-NEXT:    vrsub.vx v8, v8, a0, v0.t
137 ; CHECK-NEXT:    li a0, 8
138 ; CHECK-NEXT:    vminu.vx v8, v8, a0, v0.t
139 ; CHECK-NEXT:    ret
141 ; CHECK-ZVBB-LABEL: vp_ctlz_nxv4i8:
142 ; CHECK-ZVBB:       # %bb.0:
143 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e8, mf2, ta, ma
144 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8, v0.t
145 ; CHECK-ZVBB-NEXT:    ret
146   %v = call <vscale x 4 x i8> @llvm.vp.ctlz.nxv4i8(<vscale x 4 x i8> %va, i1 false, <vscale x 4 x i1> %m, i32 %evl)
147   ret <vscale x 4 x i8> %v
150 define <vscale x 4 x i8> @vp_ctlz_nxv4i8_unmasked(<vscale x 4 x i8> %va, i32 zeroext %evl) {
151 ; CHECK-LABEL: vp_ctlz_nxv4i8_unmasked:
152 ; CHECK:       # %bb.0:
153 ; CHECK-NEXT:    vsetvli zero, a0, e16, m1, ta, ma
154 ; CHECK-NEXT:    vzext.vf2 v9, v8
155 ; CHECK-NEXT:    vfwcvt.f.xu.v v10, v9
156 ; CHECK-NEXT:    vnsrl.wi v8, v10, 23
157 ; CHECK-NEXT:    vsetvli zero, zero, e8, mf2, ta, ma
158 ; CHECK-NEXT:    vnsrl.wi v8, v8, 0
159 ; CHECK-NEXT:    li a0, 134
160 ; CHECK-NEXT:    vrsub.vx v8, v8, a0
161 ; CHECK-NEXT:    li a0, 8
162 ; CHECK-NEXT:    vminu.vx v8, v8, a0
163 ; CHECK-NEXT:    ret
165 ; CHECK-ZVBB-LABEL: vp_ctlz_nxv4i8_unmasked:
166 ; CHECK-ZVBB:       # %bb.0:
167 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e8, mf2, ta, ma
168 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
169 ; CHECK-ZVBB-NEXT:    ret
170   %head = insertelement <vscale x 4 x i1> poison, i1 true, i32 0
171   %m = shufflevector <vscale x 4 x i1> %head, <vscale x 4 x i1> poison, <vscale x 4 x i32> zeroinitializer
172   %v = call <vscale x 4 x i8> @llvm.vp.ctlz.nxv4i8(<vscale x 4 x i8> %va, i1 false, <vscale x 4 x i1> %m, i32 %evl)
173   ret <vscale x 4 x i8> %v
176 declare <vscale x 8 x i8> @llvm.vp.ctlz.nxv8i8(<vscale x 8 x i8>, i1 immarg, <vscale x 8 x i1>, i32)
178 define <vscale x 8 x i8> @vp_ctlz_nxv8i8(<vscale x 8 x i8> %va, <vscale x 8 x i1> %m, i32 zeroext %evl) {
179 ; CHECK-LABEL: vp_ctlz_nxv8i8:
180 ; CHECK:       # %bb.0:
181 ; CHECK-NEXT:    vsetvli zero, a0, e16, m2, ta, ma
182 ; CHECK-NEXT:    vzext.vf2 v10, v8, v0.t
183 ; CHECK-NEXT:    vfwcvt.f.xu.v v12, v10, v0.t
184 ; CHECK-NEXT:    vsetvli zero, zero, e32, m4, ta, ma
185 ; CHECK-NEXT:    vsrl.vi v8, v12, 23, v0.t
186 ; CHECK-NEXT:    vsetvli zero, zero, e16, m2, ta, ma
187 ; CHECK-NEXT:    vnsrl.wi v12, v8, 0, v0.t
188 ; CHECK-NEXT:    vsetvli zero, zero, e8, m1, ta, ma
189 ; CHECK-NEXT:    vnsrl.wi v8, v12, 0, v0.t
190 ; CHECK-NEXT:    li a0, 134
191 ; CHECK-NEXT:    vrsub.vx v8, v8, a0, v0.t
192 ; CHECK-NEXT:    li a0, 8
193 ; CHECK-NEXT:    vminu.vx v8, v8, a0, v0.t
194 ; CHECK-NEXT:    ret
196 ; CHECK-ZVBB-LABEL: vp_ctlz_nxv8i8:
197 ; CHECK-ZVBB:       # %bb.0:
198 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e8, m1, ta, ma
199 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8, v0.t
200 ; CHECK-ZVBB-NEXT:    ret
201   %v = call <vscale x 8 x i8> @llvm.vp.ctlz.nxv8i8(<vscale x 8 x i8> %va, i1 false, <vscale x 8 x i1> %m, i32 %evl)
202   ret <vscale x 8 x i8> %v
205 define <vscale x 8 x i8> @vp_ctlz_nxv8i8_unmasked(<vscale x 8 x i8> %va, i32 zeroext %evl) {
206 ; CHECK-LABEL: vp_ctlz_nxv8i8_unmasked:
207 ; CHECK:       # %bb.0:
208 ; CHECK-NEXT:    vsetvli zero, a0, e16, m2, ta, ma
209 ; CHECK-NEXT:    vzext.vf2 v10, v8
210 ; CHECK-NEXT:    vfwcvt.f.xu.v v12, v10
211 ; CHECK-NEXT:    vnsrl.wi v8, v12, 23
212 ; CHECK-NEXT:    vsetvli zero, zero, e8, m1, ta, ma
213 ; CHECK-NEXT:    vnsrl.wi v10, v8, 0
214 ; CHECK-NEXT:    li a0, 134
215 ; CHECK-NEXT:    vrsub.vx v8, v10, a0
216 ; CHECK-NEXT:    li a0, 8
217 ; CHECK-NEXT:    vminu.vx v8, v8, a0
218 ; CHECK-NEXT:    ret
220 ; CHECK-ZVBB-LABEL: vp_ctlz_nxv8i8_unmasked:
221 ; CHECK-ZVBB:       # %bb.0:
222 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e8, m1, ta, ma
223 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
224 ; CHECK-ZVBB-NEXT:    ret
225   %head = insertelement <vscale x 8 x i1> poison, i1 true, i32 0
226   %m = shufflevector <vscale x 8 x i1> %head, <vscale x 8 x i1> poison, <vscale x 8 x i32> zeroinitializer
227   %v = call <vscale x 8 x i8> @llvm.vp.ctlz.nxv8i8(<vscale x 8 x i8> %va, i1 false, <vscale x 8 x i1> %m, i32 %evl)
228   ret <vscale x 8 x i8> %v
231 declare <vscale x 16 x i8> @llvm.vp.ctlz.nxv16i8(<vscale x 16 x i8>, i1 immarg, <vscale x 16 x i1>, i32)
233 define <vscale x 16 x i8> @vp_ctlz_nxv16i8(<vscale x 16 x i8> %va, <vscale x 16 x i1> %m, i32 zeroext %evl) {
234 ; CHECK-LABEL: vp_ctlz_nxv16i8:
235 ; CHECK:       # %bb.0:
236 ; CHECK-NEXT:    vsetvli zero, a0, e16, m4, ta, ma
237 ; CHECK-NEXT:    vzext.vf2 v12, v8, v0.t
238 ; CHECK-NEXT:    vfwcvt.f.xu.v v16, v12, v0.t
239 ; CHECK-NEXT:    vsetvli zero, zero, e32, m8, ta, ma
240 ; CHECK-NEXT:    vsrl.vi v8, v16, 23, v0.t
241 ; CHECK-NEXT:    vsetvli zero, zero, e16, m4, ta, ma
242 ; CHECK-NEXT:    vnsrl.wi v16, v8, 0, v0.t
243 ; CHECK-NEXT:    vsetvli zero, zero, e8, m2, ta, ma
244 ; CHECK-NEXT:    vnsrl.wi v8, v16, 0, v0.t
245 ; CHECK-NEXT:    li a0, 134
246 ; CHECK-NEXT:    vrsub.vx v8, v8, a0, v0.t
247 ; CHECK-NEXT:    li a0, 8
248 ; CHECK-NEXT:    vminu.vx v8, v8, a0, v0.t
249 ; CHECK-NEXT:    ret
251 ; CHECK-ZVBB-LABEL: vp_ctlz_nxv16i8:
252 ; CHECK-ZVBB:       # %bb.0:
253 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e8, m2, ta, ma
254 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8, v0.t
255 ; CHECK-ZVBB-NEXT:    ret
256   %v = call <vscale x 16 x i8> @llvm.vp.ctlz.nxv16i8(<vscale x 16 x i8> %va, i1 false, <vscale x 16 x i1> %m, i32 %evl)
257   ret <vscale x 16 x i8> %v
260 define <vscale x 16 x i8> @vp_ctlz_nxv16i8_unmasked(<vscale x 16 x i8> %va, i32 zeroext %evl) {
261 ; CHECK-LABEL: vp_ctlz_nxv16i8_unmasked:
262 ; CHECK:       # %bb.0:
263 ; CHECK-NEXT:    vsetvli zero, a0, e16, m4, ta, ma
264 ; CHECK-NEXT:    vzext.vf2 v12, v8
265 ; CHECK-NEXT:    vfwcvt.f.xu.v v16, v12
266 ; CHECK-NEXT:    vnsrl.wi v8, v16, 23
267 ; CHECK-NEXT:    vsetvli zero, zero, e8, m2, ta, ma
268 ; CHECK-NEXT:    vnsrl.wi v12, v8, 0
269 ; CHECK-NEXT:    li a0, 134
270 ; CHECK-NEXT:    vrsub.vx v8, v12, a0
271 ; CHECK-NEXT:    li a0, 8
272 ; CHECK-NEXT:    vminu.vx v8, v8, a0
273 ; CHECK-NEXT:    ret
275 ; CHECK-ZVBB-LABEL: vp_ctlz_nxv16i8_unmasked:
276 ; CHECK-ZVBB:       # %bb.0:
277 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e8, m2, ta, ma
278 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
279 ; CHECK-ZVBB-NEXT:    ret
280   %head = insertelement <vscale x 16 x i1> poison, i1 true, i32 0
281   %m = shufflevector <vscale x 16 x i1> %head, <vscale x 16 x i1> poison, <vscale x 16 x i32> zeroinitializer
282   %v = call <vscale x 16 x i8> @llvm.vp.ctlz.nxv16i8(<vscale x 16 x i8> %va, i1 false, <vscale x 16 x i1> %m, i32 %evl)
283   ret <vscale x 16 x i8> %v
286 declare <vscale x 32 x i8> @llvm.vp.ctlz.nxv32i8(<vscale x 32 x i8>, i1 immarg, <vscale x 32 x i1>, i32)
288 define <vscale x 32 x i8> @vp_ctlz_nxv32i8(<vscale x 32 x i8> %va, <vscale x 32 x i1> %m, i32 zeroext %evl) {
289 ; CHECK-LABEL: vp_ctlz_nxv32i8:
290 ; CHECK:       # %bb.0:
291 ; CHECK-NEXT:    vsetvli zero, a0, e8, m4, ta, ma
292 ; CHECK-NEXT:    vsrl.vi v12, v8, 1, v0.t
293 ; CHECK-NEXT:    vor.vv v8, v8, v12, v0.t
294 ; CHECK-NEXT:    vsrl.vi v12, v8, 2, v0.t
295 ; CHECK-NEXT:    vor.vv v8, v8, v12, v0.t
296 ; CHECK-NEXT:    vsrl.vi v12, v8, 4, v0.t
297 ; CHECK-NEXT:    vor.vv v8, v8, v12, v0.t
298 ; CHECK-NEXT:    vnot.v v8, v8, v0.t
299 ; CHECK-NEXT:    vsrl.vi v12, v8, 1, v0.t
300 ; CHECK-NEXT:    li a0, 85
301 ; CHECK-NEXT:    vand.vx v12, v12, a0, v0.t
302 ; CHECK-NEXT:    vsub.vv v8, v8, v12, v0.t
303 ; CHECK-NEXT:    li a0, 51
304 ; CHECK-NEXT:    vand.vx v12, v8, a0, v0.t
305 ; CHECK-NEXT:    vsrl.vi v8, v8, 2, v0.t
306 ; CHECK-NEXT:    vand.vx v8, v8, a0, v0.t
307 ; CHECK-NEXT:    vadd.vv v8, v12, v8, v0.t
308 ; CHECK-NEXT:    vsrl.vi v12, v8, 4, v0.t
309 ; CHECK-NEXT:    vadd.vv v8, v8, v12, v0.t
310 ; CHECK-NEXT:    vand.vi v8, v8, 15, v0.t
311 ; CHECK-NEXT:    ret
313 ; CHECK-ZVBB-LABEL: vp_ctlz_nxv32i8:
314 ; CHECK-ZVBB:       # %bb.0:
315 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e8, m4, ta, ma
316 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8, v0.t
317 ; CHECK-ZVBB-NEXT:    ret
318   %v = call <vscale x 32 x i8> @llvm.vp.ctlz.nxv32i8(<vscale x 32 x i8> %va, i1 false, <vscale x 32 x i1> %m, i32 %evl)
319   ret <vscale x 32 x i8> %v
322 define <vscale x 32 x i8> @vp_ctlz_nxv32i8_unmasked(<vscale x 32 x i8> %va, i32 zeroext %evl) {
323 ; CHECK-LABEL: vp_ctlz_nxv32i8_unmasked:
324 ; CHECK:       # %bb.0:
325 ; CHECK-NEXT:    vsetvli zero, a0, e8, m4, ta, ma
326 ; CHECK-NEXT:    vsrl.vi v12, v8, 1
327 ; CHECK-NEXT:    vor.vv v8, v8, v12
328 ; CHECK-NEXT:    vsrl.vi v12, v8, 2
329 ; CHECK-NEXT:    vor.vv v8, v8, v12
330 ; CHECK-NEXT:    vsrl.vi v12, v8, 4
331 ; CHECK-NEXT:    vor.vv v8, v8, v12
332 ; CHECK-NEXT:    vnot.v v8, v8
333 ; CHECK-NEXT:    vsrl.vi v12, v8, 1
334 ; CHECK-NEXT:    li a0, 85
335 ; CHECK-NEXT:    vand.vx v12, v12, a0
336 ; CHECK-NEXT:    vsub.vv v8, v8, v12
337 ; CHECK-NEXT:    li a0, 51
338 ; CHECK-NEXT:    vand.vx v12, v8, a0
339 ; CHECK-NEXT:    vsrl.vi v8, v8, 2
340 ; CHECK-NEXT:    vand.vx v8, v8, a0
341 ; CHECK-NEXT:    vadd.vv v8, v12, v8
342 ; CHECK-NEXT:    vsrl.vi v12, v8, 4
343 ; CHECK-NEXT:    vadd.vv v8, v8, v12
344 ; CHECK-NEXT:    vand.vi v8, v8, 15
345 ; CHECK-NEXT:    ret
347 ; CHECK-ZVBB-LABEL: vp_ctlz_nxv32i8_unmasked:
348 ; CHECK-ZVBB:       # %bb.0:
349 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e8, m4, ta, ma
350 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
351 ; CHECK-ZVBB-NEXT:    ret
352   %head = insertelement <vscale x 32 x i1> poison, i1 true, i32 0
353   %m = shufflevector <vscale x 32 x i1> %head, <vscale x 32 x i1> poison, <vscale x 32 x i32> zeroinitializer
354   %v = call <vscale x 32 x i8> @llvm.vp.ctlz.nxv32i8(<vscale x 32 x i8> %va, i1 false, <vscale x 32 x i1> %m, i32 %evl)
355   ret <vscale x 32 x i8> %v
358 declare <vscale x 64 x i8> @llvm.vp.ctlz.nxv64i8(<vscale x 64 x i8>, i1 immarg, <vscale x 64 x i1>, i32)
360 define <vscale x 64 x i8> @vp_ctlz_nxv64i8(<vscale x 64 x i8> %va, <vscale x 64 x i1> %m, i32 zeroext %evl) {
361 ; CHECK-LABEL: vp_ctlz_nxv64i8:
362 ; CHECK:       # %bb.0:
363 ; CHECK-NEXT:    vsetvli zero, a0, e8, m8, ta, ma
364 ; CHECK-NEXT:    vsrl.vi v16, v8, 1, v0.t
365 ; CHECK-NEXT:    vor.vv v8, v8, v16, v0.t
366 ; CHECK-NEXT:    vsrl.vi v16, v8, 2, v0.t
367 ; CHECK-NEXT:    vor.vv v8, v8, v16, v0.t
368 ; CHECK-NEXT:    vsrl.vi v16, v8, 4, v0.t
369 ; CHECK-NEXT:    vor.vv v8, v8, v16, v0.t
370 ; CHECK-NEXT:    vnot.v v8, v8, v0.t
371 ; CHECK-NEXT:    vsrl.vi v16, v8, 1, v0.t
372 ; CHECK-NEXT:    li a0, 85
373 ; CHECK-NEXT:    vand.vx v16, v16, a0, v0.t
374 ; CHECK-NEXT:    vsub.vv v8, v8, v16, v0.t
375 ; CHECK-NEXT:    li a0, 51
376 ; CHECK-NEXT:    vand.vx v16, v8, a0, v0.t
377 ; CHECK-NEXT:    vsrl.vi v8, v8, 2, v0.t
378 ; CHECK-NEXT:    vand.vx v8, v8, a0, v0.t
379 ; CHECK-NEXT:    vadd.vv v8, v16, v8, v0.t
380 ; CHECK-NEXT:    vsrl.vi v16, v8, 4, v0.t
381 ; CHECK-NEXT:    vadd.vv v8, v8, v16, v0.t
382 ; CHECK-NEXT:    vand.vi v8, v8, 15, v0.t
383 ; CHECK-NEXT:    ret
385 ; CHECK-ZVBB-LABEL: vp_ctlz_nxv64i8:
386 ; CHECK-ZVBB:       # %bb.0:
387 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e8, m8, ta, ma
388 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8, v0.t
389 ; CHECK-ZVBB-NEXT:    ret
390   %v = call <vscale x 64 x i8> @llvm.vp.ctlz.nxv64i8(<vscale x 64 x i8> %va, i1 false, <vscale x 64 x i1> %m, i32 %evl)
391   ret <vscale x 64 x i8> %v
394 define <vscale x 64 x i8> @vp_ctlz_nxv64i8_unmasked(<vscale x 64 x i8> %va, i32 zeroext %evl) {
395 ; CHECK-LABEL: vp_ctlz_nxv64i8_unmasked:
396 ; CHECK:       # %bb.0:
397 ; CHECK-NEXT:    vsetvli zero, a0, e8, m8, ta, ma
398 ; CHECK-NEXT:    vsrl.vi v16, v8, 1
399 ; CHECK-NEXT:    vor.vv v8, v8, v16
400 ; CHECK-NEXT:    vsrl.vi v16, v8, 2
401 ; CHECK-NEXT:    vor.vv v8, v8, v16
402 ; CHECK-NEXT:    vsrl.vi v16, v8, 4
403 ; CHECK-NEXT:    vor.vv v8, v8, v16
404 ; CHECK-NEXT:    vnot.v v8, v8
405 ; CHECK-NEXT:    vsrl.vi v16, v8, 1
406 ; CHECK-NEXT:    li a0, 85
407 ; CHECK-NEXT:    vand.vx v16, v16, a0
408 ; CHECK-NEXT:    vsub.vv v8, v8, v16
409 ; CHECK-NEXT:    li a0, 51
410 ; CHECK-NEXT:    vand.vx v16, v8, a0
411 ; CHECK-NEXT:    vsrl.vi v8, v8, 2
412 ; CHECK-NEXT:    vand.vx v8, v8, a0
413 ; CHECK-NEXT:    vadd.vv v8, v16, v8
414 ; CHECK-NEXT:    vsrl.vi v16, v8, 4
415 ; CHECK-NEXT:    vadd.vv v8, v8, v16
416 ; CHECK-NEXT:    vand.vi v8, v8, 15
417 ; CHECK-NEXT:    ret
419 ; CHECK-ZVBB-LABEL: vp_ctlz_nxv64i8_unmasked:
420 ; CHECK-ZVBB:       # %bb.0:
421 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e8, m8, ta, ma
422 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
423 ; CHECK-ZVBB-NEXT:    ret
424   %head = insertelement <vscale x 64 x i1> poison, i1 true, i32 0
425   %m = shufflevector <vscale x 64 x i1> %head, <vscale x 64 x i1> poison, <vscale x 64 x i32> zeroinitializer
426   %v = call <vscale x 64 x i8> @llvm.vp.ctlz.nxv64i8(<vscale x 64 x i8> %va, i1 false, <vscale x 64 x i1> %m, i32 %evl)
427   ret <vscale x 64 x i8> %v
430 declare <vscale x 1 x i16> @llvm.vp.ctlz.nxv1i16(<vscale x 1 x i16>, i1 immarg, <vscale x 1 x i1>, i32)
432 define <vscale x 1 x i16> @vp_ctlz_nxv1i16(<vscale x 1 x i16> %va, <vscale x 1 x i1> %m, i32 zeroext %evl) {
433 ; CHECK-LABEL: vp_ctlz_nxv1i16:
434 ; CHECK:       # %bb.0:
435 ; CHECK-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
436 ; CHECK-NEXT:    vfwcvt.f.xu.v v9, v8, v0.t
437 ; CHECK-NEXT:    vsetvli zero, zero, e32, mf2, ta, ma
438 ; CHECK-NEXT:    vsrl.vi v8, v9, 23, v0.t
439 ; CHECK-NEXT:    vsetvli zero, zero, e16, mf4, ta, ma
440 ; CHECK-NEXT:    vnsrl.wi v8, v8, 0, v0.t
441 ; CHECK-NEXT:    li a0, 142
442 ; CHECK-NEXT:    vrsub.vx v8, v8, a0, v0.t
443 ; CHECK-NEXT:    li a0, 16
444 ; CHECK-NEXT:    vminu.vx v8, v8, a0, v0.t
445 ; CHECK-NEXT:    ret
447 ; CHECK-ZVBB-LABEL: vp_ctlz_nxv1i16:
448 ; CHECK-ZVBB:       # %bb.0:
449 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
450 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8, v0.t
451 ; CHECK-ZVBB-NEXT:    ret
452   %v = call <vscale x 1 x i16> @llvm.vp.ctlz.nxv1i16(<vscale x 1 x i16> %va, i1 false, <vscale x 1 x i1> %m, i32 %evl)
453   ret <vscale x 1 x i16> %v
456 define <vscale x 1 x i16> @vp_ctlz_nxv1i16_unmasked(<vscale x 1 x i16> %va, i32 zeroext %evl) {
457 ; CHECK-LABEL: vp_ctlz_nxv1i16_unmasked:
458 ; CHECK:       # %bb.0:
459 ; CHECK-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
460 ; CHECK-NEXT:    vfwcvt.f.xu.v v9, v8
461 ; CHECK-NEXT:    vnsrl.wi v8, v9, 23
462 ; CHECK-NEXT:    li a0, 142
463 ; CHECK-NEXT:    vrsub.vx v8, v8, a0
464 ; CHECK-NEXT:    li a0, 16
465 ; CHECK-NEXT:    vminu.vx v8, v8, a0
466 ; CHECK-NEXT:    ret
468 ; CHECK-ZVBB-LABEL: vp_ctlz_nxv1i16_unmasked:
469 ; CHECK-ZVBB:       # %bb.0:
470 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
471 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
472 ; CHECK-ZVBB-NEXT:    ret
473   %head = insertelement <vscale x 1 x i1> poison, i1 true, i32 0
474   %m = shufflevector <vscale x 1 x i1> %head, <vscale x 1 x i1> poison, <vscale x 1 x i32> zeroinitializer
475   %v = call <vscale x 1 x i16> @llvm.vp.ctlz.nxv1i16(<vscale x 1 x i16> %va, i1 false, <vscale x 1 x i1> %m, i32 %evl)
476   ret <vscale x 1 x i16> %v
479 declare <vscale x 2 x i16> @llvm.vp.ctlz.nxv2i16(<vscale x 2 x i16>, i1 immarg, <vscale x 2 x i1>, i32)
481 define <vscale x 2 x i16> @vp_ctlz_nxv2i16(<vscale x 2 x i16> %va, <vscale x 2 x i1> %m, i32 zeroext %evl) {
482 ; CHECK-LABEL: vp_ctlz_nxv2i16:
483 ; CHECK:       # %bb.0:
484 ; CHECK-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
485 ; CHECK-NEXT:    vfwcvt.f.xu.v v9, v8, v0.t
486 ; CHECK-NEXT:    vsetvli zero, zero, e32, m1, ta, ma
487 ; CHECK-NEXT:    vsrl.vi v8, v9, 23, v0.t
488 ; CHECK-NEXT:    vsetvli zero, zero, e16, mf2, ta, ma
489 ; CHECK-NEXT:    vnsrl.wi v8, v8, 0, v0.t
490 ; CHECK-NEXT:    li a0, 142
491 ; CHECK-NEXT:    vrsub.vx v8, v8, a0, v0.t
492 ; CHECK-NEXT:    li a0, 16
493 ; CHECK-NEXT:    vminu.vx v8, v8, a0, v0.t
494 ; CHECK-NEXT:    ret
496 ; CHECK-ZVBB-LABEL: vp_ctlz_nxv2i16:
497 ; CHECK-ZVBB:       # %bb.0:
498 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
499 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8, v0.t
500 ; CHECK-ZVBB-NEXT:    ret
501   %v = call <vscale x 2 x i16> @llvm.vp.ctlz.nxv2i16(<vscale x 2 x i16> %va, i1 false, <vscale x 2 x i1> %m, i32 %evl)
502   ret <vscale x 2 x i16> %v
505 define <vscale x 2 x i16> @vp_ctlz_nxv2i16_unmasked(<vscale x 2 x i16> %va, i32 zeroext %evl) {
506 ; CHECK-LABEL: vp_ctlz_nxv2i16_unmasked:
507 ; CHECK:       # %bb.0:
508 ; CHECK-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
509 ; CHECK-NEXT:    vfwcvt.f.xu.v v9, v8
510 ; CHECK-NEXT:    vnsrl.wi v8, v9, 23
511 ; CHECK-NEXT:    li a0, 142
512 ; CHECK-NEXT:    vrsub.vx v8, v8, a0
513 ; CHECK-NEXT:    li a0, 16
514 ; CHECK-NEXT:    vminu.vx v8, v8, a0
515 ; CHECK-NEXT:    ret
517 ; CHECK-ZVBB-LABEL: vp_ctlz_nxv2i16_unmasked:
518 ; CHECK-ZVBB:       # %bb.0:
519 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
520 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
521 ; CHECK-ZVBB-NEXT:    ret
522   %head = insertelement <vscale x 2 x i1> poison, i1 true, i32 0
523   %m = shufflevector <vscale x 2 x i1> %head, <vscale x 2 x i1> poison, <vscale x 2 x i32> zeroinitializer
524   %v = call <vscale x 2 x i16> @llvm.vp.ctlz.nxv2i16(<vscale x 2 x i16> %va, i1 false, <vscale x 2 x i1> %m, i32 %evl)
525   ret <vscale x 2 x i16> %v
528 declare <vscale x 4 x i16> @llvm.vp.ctlz.nxv4i16(<vscale x 4 x i16>, i1 immarg, <vscale x 4 x i1>, i32)
530 define <vscale x 4 x i16> @vp_ctlz_nxv4i16(<vscale x 4 x i16> %va, <vscale x 4 x i1> %m, i32 zeroext %evl) {
531 ; CHECK-LABEL: vp_ctlz_nxv4i16:
532 ; CHECK:       # %bb.0:
533 ; CHECK-NEXT:    vsetvli zero, a0, e16, m1, ta, ma
534 ; CHECK-NEXT:    vfwcvt.f.xu.v v10, v8, v0.t
535 ; CHECK-NEXT:    vsetvli zero, zero, e32, m2, ta, ma
536 ; CHECK-NEXT:    vsrl.vi v8, v10, 23, v0.t
537 ; CHECK-NEXT:    vsetvli zero, zero, e16, m1, ta, ma
538 ; CHECK-NEXT:    vnsrl.wi v10, v8, 0, v0.t
539 ; CHECK-NEXT:    li a0, 142
540 ; CHECK-NEXT:    vrsub.vx v8, v10, a0, v0.t
541 ; CHECK-NEXT:    li a0, 16
542 ; CHECK-NEXT:    vminu.vx v8, v8, a0, v0.t
543 ; CHECK-NEXT:    ret
545 ; CHECK-ZVBB-LABEL: vp_ctlz_nxv4i16:
546 ; CHECK-ZVBB:       # %bb.0:
547 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e16, m1, ta, ma
548 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8, v0.t
549 ; CHECK-ZVBB-NEXT:    ret
550   %v = call <vscale x 4 x i16> @llvm.vp.ctlz.nxv4i16(<vscale x 4 x i16> %va, i1 false, <vscale x 4 x i1> %m, i32 %evl)
551   ret <vscale x 4 x i16> %v
554 define <vscale x 4 x i16> @vp_ctlz_nxv4i16_unmasked(<vscale x 4 x i16> %va, i32 zeroext %evl) {
555 ; CHECK-LABEL: vp_ctlz_nxv4i16_unmasked:
556 ; CHECK:       # %bb.0:
557 ; CHECK-NEXT:    vsetvli zero, a0, e16, m1, ta, ma
558 ; CHECK-NEXT:    vfwcvt.f.xu.v v10, v8
559 ; CHECK-NEXT:    vnsrl.wi v8, v10, 23
560 ; CHECK-NEXT:    li a0, 142
561 ; CHECK-NEXT:    vrsub.vx v8, v8, a0
562 ; CHECK-NEXT:    li a0, 16
563 ; CHECK-NEXT:    vminu.vx v8, v8, a0
564 ; CHECK-NEXT:    ret
566 ; CHECK-ZVBB-LABEL: vp_ctlz_nxv4i16_unmasked:
567 ; CHECK-ZVBB:       # %bb.0:
568 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e16, m1, ta, ma
569 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
570 ; CHECK-ZVBB-NEXT:    ret
571   %head = insertelement <vscale x 4 x i1> poison, i1 true, i32 0
572   %m = shufflevector <vscale x 4 x i1> %head, <vscale x 4 x i1> poison, <vscale x 4 x i32> zeroinitializer
573   %v = call <vscale x 4 x i16> @llvm.vp.ctlz.nxv4i16(<vscale x 4 x i16> %va, i1 false, <vscale x 4 x i1> %m, i32 %evl)
574   ret <vscale x 4 x i16> %v
577 declare <vscale x 8 x i16> @llvm.vp.ctlz.nxv8i16(<vscale x 8 x i16>, i1 immarg, <vscale x 8 x i1>, i32)
579 define <vscale x 8 x i16> @vp_ctlz_nxv8i16(<vscale x 8 x i16> %va, <vscale x 8 x i1> %m, i32 zeroext %evl) {
580 ; CHECK-LABEL: vp_ctlz_nxv8i16:
581 ; CHECK:       # %bb.0:
582 ; CHECK-NEXT:    vsetvli zero, a0, e16, m2, ta, ma
583 ; CHECK-NEXT:    vfwcvt.f.xu.v v12, v8, v0.t
584 ; CHECK-NEXT:    vsetvli zero, zero, e32, m4, ta, ma
585 ; CHECK-NEXT:    vsrl.vi v8, v12, 23, v0.t
586 ; CHECK-NEXT:    vsetvli zero, zero, e16, m2, ta, ma
587 ; CHECK-NEXT:    vnsrl.wi v12, v8, 0, v0.t
588 ; CHECK-NEXT:    li a0, 142
589 ; CHECK-NEXT:    vrsub.vx v8, v12, a0, v0.t
590 ; CHECK-NEXT:    li a0, 16
591 ; CHECK-NEXT:    vminu.vx v8, v8, a0, v0.t
592 ; CHECK-NEXT:    ret
594 ; CHECK-ZVBB-LABEL: vp_ctlz_nxv8i16:
595 ; CHECK-ZVBB:       # %bb.0:
596 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e16, m2, ta, ma
597 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8, v0.t
598 ; CHECK-ZVBB-NEXT:    ret
599   %v = call <vscale x 8 x i16> @llvm.vp.ctlz.nxv8i16(<vscale x 8 x i16> %va, i1 false, <vscale x 8 x i1> %m, i32 %evl)
600   ret <vscale x 8 x i16> %v
603 define <vscale x 8 x i16> @vp_ctlz_nxv8i16_unmasked(<vscale x 8 x i16> %va, i32 zeroext %evl) {
604 ; CHECK-LABEL: vp_ctlz_nxv8i16_unmasked:
605 ; CHECK:       # %bb.0:
606 ; CHECK-NEXT:    vsetvli zero, a0, e16, m2, ta, ma
607 ; CHECK-NEXT:    vfwcvt.f.xu.v v12, v8
608 ; CHECK-NEXT:    vnsrl.wi v8, v12, 23
609 ; CHECK-NEXT:    li a0, 142
610 ; CHECK-NEXT:    vrsub.vx v8, v8, a0
611 ; CHECK-NEXT:    li a0, 16
612 ; CHECK-NEXT:    vminu.vx v8, v8, a0
613 ; CHECK-NEXT:    ret
615 ; CHECK-ZVBB-LABEL: vp_ctlz_nxv8i16_unmasked:
616 ; CHECK-ZVBB:       # %bb.0:
617 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e16, m2, ta, ma
618 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
619 ; CHECK-ZVBB-NEXT:    ret
620   %head = insertelement <vscale x 8 x i1> poison, i1 true, i32 0
621   %m = shufflevector <vscale x 8 x i1> %head, <vscale x 8 x i1> poison, <vscale x 8 x i32> zeroinitializer
622   %v = call <vscale x 8 x i16> @llvm.vp.ctlz.nxv8i16(<vscale x 8 x i16> %va, i1 false, <vscale x 8 x i1> %m, i32 %evl)
623   ret <vscale x 8 x i16> %v
626 declare <vscale x 16 x i16> @llvm.vp.ctlz.nxv16i16(<vscale x 16 x i16>, i1 immarg, <vscale x 16 x i1>, i32)
628 define <vscale x 16 x i16> @vp_ctlz_nxv16i16(<vscale x 16 x i16> %va, <vscale x 16 x i1> %m, i32 zeroext %evl) {
629 ; CHECK-LABEL: vp_ctlz_nxv16i16:
630 ; CHECK:       # %bb.0:
631 ; CHECK-NEXT:    vsetvli zero, a0, e16, m4, ta, ma
632 ; CHECK-NEXT:    vfwcvt.f.xu.v v16, v8, v0.t
633 ; CHECK-NEXT:    vsetvli zero, zero, e32, m8, ta, ma
634 ; CHECK-NEXT:    vsrl.vi v8, v16, 23, v0.t
635 ; CHECK-NEXT:    vsetvli zero, zero, e16, m4, ta, ma
636 ; CHECK-NEXT:    vnsrl.wi v16, v8, 0, v0.t
637 ; CHECK-NEXT:    li a0, 142
638 ; CHECK-NEXT:    vrsub.vx v8, v16, a0, v0.t
639 ; CHECK-NEXT:    li a0, 16
640 ; CHECK-NEXT:    vminu.vx v8, v8, a0, v0.t
641 ; CHECK-NEXT:    ret
643 ; CHECK-ZVBB-LABEL: vp_ctlz_nxv16i16:
644 ; CHECK-ZVBB:       # %bb.0:
645 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e16, m4, ta, ma
646 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8, v0.t
647 ; CHECK-ZVBB-NEXT:    ret
648   %v = call <vscale x 16 x i16> @llvm.vp.ctlz.nxv16i16(<vscale x 16 x i16> %va, i1 false, <vscale x 16 x i1> %m, i32 %evl)
649   ret <vscale x 16 x i16> %v
652 define <vscale x 16 x i16> @vp_ctlz_nxv16i16_unmasked(<vscale x 16 x i16> %va, i32 zeroext %evl) {
653 ; CHECK-LABEL: vp_ctlz_nxv16i16_unmasked:
654 ; CHECK:       # %bb.0:
655 ; CHECK-NEXT:    vsetvli zero, a0, e16, m4, ta, ma
656 ; CHECK-NEXT:    vfwcvt.f.xu.v v16, v8
657 ; CHECK-NEXT:    vnsrl.wi v8, v16, 23
658 ; CHECK-NEXT:    li a0, 142
659 ; CHECK-NEXT:    vrsub.vx v8, v8, a0
660 ; CHECK-NEXT:    li a0, 16
661 ; CHECK-NEXT:    vminu.vx v8, v8, a0
662 ; CHECK-NEXT:    ret
664 ; CHECK-ZVBB-LABEL: vp_ctlz_nxv16i16_unmasked:
665 ; CHECK-ZVBB:       # %bb.0:
666 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e16, m4, ta, ma
667 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
668 ; CHECK-ZVBB-NEXT:    ret
669   %head = insertelement <vscale x 16 x i1> poison, i1 true, i32 0
670   %m = shufflevector <vscale x 16 x i1> %head, <vscale x 16 x i1> poison, <vscale x 16 x i32> zeroinitializer
671   %v = call <vscale x 16 x i16> @llvm.vp.ctlz.nxv16i16(<vscale x 16 x i16> %va, i1 false, <vscale x 16 x i1> %m, i32 %evl)
672   ret <vscale x 16 x i16> %v
675 declare <vscale x 32 x i16> @llvm.vp.ctlz.nxv32i16(<vscale x 32 x i16>, i1 immarg, <vscale x 32 x i1>, i32)
677 define <vscale x 32 x i16> @vp_ctlz_nxv32i16(<vscale x 32 x i16> %va, <vscale x 32 x i1> %m, i32 zeroext %evl) {
678 ; CHECK-LABEL: vp_ctlz_nxv32i16:
679 ; CHECK:       # %bb.0:
680 ; CHECK-NEXT:    vsetvli zero, a0, e16, m8, ta, ma
681 ; CHECK-NEXT:    vsrl.vi v16, v8, 1, v0.t
682 ; CHECK-NEXT:    vor.vv v8, v8, v16, v0.t
683 ; CHECK-NEXT:    vsrl.vi v16, v8, 2, v0.t
684 ; CHECK-NEXT:    vor.vv v8, v8, v16, v0.t
685 ; CHECK-NEXT:    vsrl.vi v16, v8, 4, v0.t
686 ; CHECK-NEXT:    vor.vv v8, v8, v16, v0.t
687 ; CHECK-NEXT:    vsrl.vi v16, v8, 8, v0.t
688 ; CHECK-NEXT:    vor.vv v8, v8, v16, v0.t
689 ; CHECK-NEXT:    vnot.v v8, v8, v0.t
690 ; CHECK-NEXT:    vsrl.vi v16, v8, 1, v0.t
691 ; CHECK-NEXT:    lui a0, 5
692 ; CHECK-NEXT:    addi a0, a0, 1365
693 ; CHECK-NEXT:    vand.vx v16, v16, a0, v0.t
694 ; CHECK-NEXT:    vsub.vv v8, v8, v16, v0.t
695 ; CHECK-NEXT:    lui a0, 3
696 ; CHECK-NEXT:    addi a0, a0, 819
697 ; CHECK-NEXT:    vand.vx v16, v8, a0, v0.t
698 ; CHECK-NEXT:    vsrl.vi v8, v8, 2, v0.t
699 ; CHECK-NEXT:    vand.vx v8, v8, a0, v0.t
700 ; CHECK-NEXT:    vadd.vv v8, v16, v8, v0.t
701 ; CHECK-NEXT:    vsrl.vi v16, v8, 4, v0.t
702 ; CHECK-NEXT:    vadd.vv v8, v8, v16, v0.t
703 ; CHECK-NEXT:    lui a0, 1
704 ; CHECK-NEXT:    addi a0, a0, -241
705 ; CHECK-NEXT:    vand.vx v8, v8, a0, v0.t
706 ; CHECK-NEXT:    li a0, 257
707 ; CHECK-NEXT:    vmul.vx v8, v8, a0, v0.t
708 ; CHECK-NEXT:    vsrl.vi v8, v8, 8, v0.t
709 ; CHECK-NEXT:    ret
711 ; CHECK-ZVBB-LABEL: vp_ctlz_nxv32i16:
712 ; CHECK-ZVBB:       # %bb.0:
713 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e16, m8, ta, ma
714 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8, v0.t
715 ; CHECK-ZVBB-NEXT:    ret
716   %v = call <vscale x 32 x i16> @llvm.vp.ctlz.nxv32i16(<vscale x 32 x i16> %va, i1 false, <vscale x 32 x i1> %m, i32 %evl)
717   ret <vscale x 32 x i16> %v
720 define <vscale x 32 x i16> @vp_ctlz_nxv32i16_unmasked(<vscale x 32 x i16> %va, i32 zeroext %evl) {
721 ; CHECK-LABEL: vp_ctlz_nxv32i16_unmasked:
722 ; CHECK:       # %bb.0:
723 ; CHECK-NEXT:    vsetvli zero, a0, e16, m8, ta, ma
724 ; CHECK-NEXT:    vsrl.vi v16, v8, 1
725 ; CHECK-NEXT:    vor.vv v8, v8, v16
726 ; CHECK-NEXT:    vsrl.vi v16, v8, 2
727 ; CHECK-NEXT:    vor.vv v8, v8, v16
728 ; CHECK-NEXT:    vsrl.vi v16, v8, 4
729 ; CHECK-NEXT:    vor.vv v8, v8, v16
730 ; CHECK-NEXT:    vsrl.vi v16, v8, 8
731 ; CHECK-NEXT:    vor.vv v8, v8, v16
732 ; CHECK-NEXT:    vnot.v v8, v8
733 ; CHECK-NEXT:    vsrl.vi v16, v8, 1
734 ; CHECK-NEXT:    lui a0, 5
735 ; CHECK-NEXT:    addi a0, a0, 1365
736 ; CHECK-NEXT:    vand.vx v16, v16, a0
737 ; CHECK-NEXT:    vsub.vv v8, v8, v16
738 ; CHECK-NEXT:    lui a0, 3
739 ; CHECK-NEXT:    addi a0, a0, 819
740 ; CHECK-NEXT:    vand.vx v16, v8, a0
741 ; CHECK-NEXT:    vsrl.vi v8, v8, 2
742 ; CHECK-NEXT:    vand.vx v8, v8, a0
743 ; CHECK-NEXT:    vadd.vv v8, v16, v8
744 ; CHECK-NEXT:    vsrl.vi v16, v8, 4
745 ; CHECK-NEXT:    vadd.vv v8, v8, v16
746 ; CHECK-NEXT:    lui a0, 1
747 ; CHECK-NEXT:    addi a0, a0, -241
748 ; CHECK-NEXT:    vand.vx v8, v8, a0
749 ; CHECK-NEXT:    li a0, 257
750 ; CHECK-NEXT:    vmul.vx v8, v8, a0
751 ; CHECK-NEXT:    vsrl.vi v8, v8, 8
752 ; CHECK-NEXT:    ret
754 ; CHECK-ZVBB-LABEL: vp_ctlz_nxv32i16_unmasked:
755 ; CHECK-ZVBB:       # %bb.0:
756 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e16, m8, ta, ma
757 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
758 ; CHECK-ZVBB-NEXT:    ret
759   %head = insertelement <vscale x 32 x i1> poison, i1 true, i32 0
760   %m = shufflevector <vscale x 32 x i1> %head, <vscale x 32 x i1> poison, <vscale x 32 x i32> zeroinitializer
761   %v = call <vscale x 32 x i16> @llvm.vp.ctlz.nxv32i16(<vscale x 32 x i16> %va, i1 false, <vscale x 32 x i1> %m, i32 %evl)
762   ret <vscale x 32 x i16> %v
765 declare <vscale x 1 x i32> @llvm.vp.ctlz.nxv1i32(<vscale x 1 x i32>, i1 immarg, <vscale x 1 x i1>, i32)
767 define <vscale x 1 x i32> @vp_ctlz_nxv1i32(<vscale x 1 x i32> %va, <vscale x 1 x i1> %m, i32 zeroext %evl) {
768 ; CHECK-LABEL: vp_ctlz_nxv1i32:
769 ; CHECK:       # %bb.0:
770 ; CHECK-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
771 ; CHECK-NEXT:    vfwcvt.f.xu.v v9, v8, v0.t
772 ; CHECK-NEXT:    li a0, 52
773 ; CHECK-NEXT:    vsetvli zero, zero, e64, m1, ta, ma
774 ; CHECK-NEXT:    vsrl.vx v8, v9, a0, v0.t
775 ; CHECK-NEXT:    vsetvli zero, zero, e32, mf2, ta, ma
776 ; CHECK-NEXT:    vnsrl.wi v8, v8, 0, v0.t
777 ; CHECK-NEXT:    li a0, 1054
778 ; CHECK-NEXT:    vrsub.vx v8, v8, a0, v0.t
779 ; CHECK-NEXT:    li a0, 32
780 ; CHECK-NEXT:    vminu.vx v8, v8, a0, v0.t
781 ; CHECK-NEXT:    ret
783 ; CHECK-ZVBB-LABEL: vp_ctlz_nxv1i32:
784 ; CHECK-ZVBB:       # %bb.0:
785 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
786 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8, v0.t
787 ; CHECK-ZVBB-NEXT:    ret
788   %v = call <vscale x 1 x i32> @llvm.vp.ctlz.nxv1i32(<vscale x 1 x i32> %va, i1 false, <vscale x 1 x i1> %m, i32 %evl)
789   ret <vscale x 1 x i32> %v
792 define <vscale x 1 x i32> @vp_ctlz_nxv1i32_unmasked(<vscale x 1 x i32> %va, i32 zeroext %evl) {
793 ; CHECK-LABEL: vp_ctlz_nxv1i32_unmasked:
794 ; CHECK:       # %bb.0:
795 ; CHECK-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
796 ; CHECK-NEXT:    vfwcvt.f.xu.v v9, v8
797 ; CHECK-NEXT:    li a0, 52
798 ; CHECK-NEXT:    vnsrl.wx v8, v9, a0
799 ; CHECK-NEXT:    li a0, 1054
800 ; CHECK-NEXT:    vrsub.vx v8, v8, a0
801 ; CHECK-NEXT:    li a0, 32
802 ; CHECK-NEXT:    vminu.vx v8, v8, a0
803 ; CHECK-NEXT:    ret
805 ; CHECK-ZVBB-LABEL: vp_ctlz_nxv1i32_unmasked:
806 ; CHECK-ZVBB:       # %bb.0:
807 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
808 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
809 ; CHECK-ZVBB-NEXT:    ret
810   %head = insertelement <vscale x 1 x i1> poison, i1 true, i32 0
811   %m = shufflevector <vscale x 1 x i1> %head, <vscale x 1 x i1> poison, <vscale x 1 x i32> zeroinitializer
812   %v = call <vscale x 1 x i32> @llvm.vp.ctlz.nxv1i32(<vscale x 1 x i32> %va, i1 false, <vscale x 1 x i1> %m, i32 %evl)
813   ret <vscale x 1 x i32> %v
816 declare <vscale x 2 x i32> @llvm.vp.ctlz.nxv2i32(<vscale x 2 x i32>, i1 immarg, <vscale x 2 x i1>, i32)
818 define <vscale x 2 x i32> @vp_ctlz_nxv2i32(<vscale x 2 x i32> %va, <vscale x 2 x i1> %m, i32 zeroext %evl) {
819 ; CHECK-LABEL: vp_ctlz_nxv2i32:
820 ; CHECK:       # %bb.0:
821 ; CHECK-NEXT:    vsetvli zero, a0, e32, m1, ta, ma
822 ; CHECK-NEXT:    vfwcvt.f.xu.v v10, v8, v0.t
823 ; CHECK-NEXT:    li a0, 52
824 ; CHECK-NEXT:    vsetvli zero, zero, e64, m2, ta, ma
825 ; CHECK-NEXT:    vsrl.vx v8, v10, a0, v0.t
826 ; CHECK-NEXT:    vsetvli zero, zero, e32, m1, ta, ma
827 ; CHECK-NEXT:    vnsrl.wi v10, v8, 0, v0.t
828 ; CHECK-NEXT:    li a0, 1054
829 ; CHECK-NEXT:    vrsub.vx v8, v10, a0, v0.t
830 ; CHECK-NEXT:    li a0, 32
831 ; CHECK-NEXT:    vminu.vx v8, v8, a0, v0.t
832 ; CHECK-NEXT:    ret
834 ; CHECK-ZVBB-LABEL: vp_ctlz_nxv2i32:
835 ; CHECK-ZVBB:       # %bb.0:
836 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e32, m1, ta, ma
837 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8, v0.t
838 ; CHECK-ZVBB-NEXT:    ret
839   %v = call <vscale x 2 x i32> @llvm.vp.ctlz.nxv2i32(<vscale x 2 x i32> %va, i1 false, <vscale x 2 x i1> %m, i32 %evl)
840   ret <vscale x 2 x i32> %v
843 define <vscale x 2 x i32> @vp_ctlz_nxv2i32_unmasked(<vscale x 2 x i32> %va, i32 zeroext %evl) {
844 ; CHECK-LABEL: vp_ctlz_nxv2i32_unmasked:
845 ; CHECK:       # %bb.0:
846 ; CHECK-NEXT:    vsetvli zero, a0, e32, m1, ta, ma
847 ; CHECK-NEXT:    vfwcvt.f.xu.v v10, v8
848 ; CHECK-NEXT:    li a0, 52
849 ; CHECK-NEXT:    vnsrl.wx v8, v10, a0
850 ; CHECK-NEXT:    li a0, 1054
851 ; CHECK-NEXT:    vrsub.vx v8, v8, a0
852 ; CHECK-NEXT:    li a0, 32
853 ; CHECK-NEXT:    vminu.vx v8, v8, a0
854 ; CHECK-NEXT:    ret
856 ; CHECK-ZVBB-LABEL: vp_ctlz_nxv2i32_unmasked:
857 ; CHECK-ZVBB:       # %bb.0:
858 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e32, m1, ta, ma
859 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
860 ; CHECK-ZVBB-NEXT:    ret
861   %head = insertelement <vscale x 2 x i1> poison, i1 true, i32 0
862   %m = shufflevector <vscale x 2 x i1> %head, <vscale x 2 x i1> poison, <vscale x 2 x i32> zeroinitializer
863   %v = call <vscale x 2 x i32> @llvm.vp.ctlz.nxv2i32(<vscale x 2 x i32> %va, i1 false, <vscale x 2 x i1> %m, i32 %evl)
864   ret <vscale x 2 x i32> %v
867 declare <vscale x 4 x i32> @llvm.vp.ctlz.nxv4i32(<vscale x 4 x i32>, i1 immarg, <vscale x 4 x i1>, i32)
869 define <vscale x 4 x i32> @vp_ctlz_nxv4i32(<vscale x 4 x i32> %va, <vscale x 4 x i1> %m, i32 zeroext %evl) {
870 ; CHECK-LABEL: vp_ctlz_nxv4i32:
871 ; CHECK:       # %bb.0:
872 ; CHECK-NEXT:    vsetvli zero, a0, e32, m2, ta, ma
873 ; CHECK-NEXT:    vfwcvt.f.xu.v v12, v8, v0.t
874 ; CHECK-NEXT:    li a0, 52
875 ; CHECK-NEXT:    vsetvli zero, zero, e64, m4, ta, ma
876 ; CHECK-NEXT:    vsrl.vx v8, v12, a0, v0.t
877 ; CHECK-NEXT:    vsetvli zero, zero, e32, m2, ta, ma
878 ; CHECK-NEXT:    vnsrl.wi v12, v8, 0, v0.t
879 ; CHECK-NEXT:    li a0, 1054
880 ; CHECK-NEXT:    vrsub.vx v8, v12, a0, v0.t
881 ; CHECK-NEXT:    li a0, 32
882 ; CHECK-NEXT:    vminu.vx v8, v8, a0, v0.t
883 ; CHECK-NEXT:    ret
885 ; CHECK-ZVBB-LABEL: vp_ctlz_nxv4i32:
886 ; CHECK-ZVBB:       # %bb.0:
887 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e32, m2, ta, ma
888 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8, v0.t
889 ; CHECK-ZVBB-NEXT:    ret
890   %v = call <vscale x 4 x i32> @llvm.vp.ctlz.nxv4i32(<vscale x 4 x i32> %va, i1 false, <vscale x 4 x i1> %m, i32 %evl)
891   ret <vscale x 4 x i32> %v
894 define <vscale x 4 x i32> @vp_ctlz_nxv4i32_unmasked(<vscale x 4 x i32> %va, i32 zeroext %evl) {
895 ; CHECK-LABEL: vp_ctlz_nxv4i32_unmasked:
896 ; CHECK:       # %bb.0:
897 ; CHECK-NEXT:    vsetvli zero, a0, e32, m2, ta, ma
898 ; CHECK-NEXT:    vfwcvt.f.xu.v v12, v8
899 ; CHECK-NEXT:    li a0, 52
900 ; CHECK-NEXT:    vnsrl.wx v8, v12, a0
901 ; CHECK-NEXT:    li a0, 1054
902 ; CHECK-NEXT:    vrsub.vx v8, v8, a0
903 ; CHECK-NEXT:    li a0, 32
904 ; CHECK-NEXT:    vminu.vx v8, v8, a0
905 ; CHECK-NEXT:    ret
907 ; CHECK-ZVBB-LABEL: vp_ctlz_nxv4i32_unmasked:
908 ; CHECK-ZVBB:       # %bb.0:
909 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e32, m2, ta, ma
910 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
911 ; CHECK-ZVBB-NEXT:    ret
912   %head = insertelement <vscale x 4 x i1> poison, i1 true, i32 0
913   %m = shufflevector <vscale x 4 x i1> %head, <vscale x 4 x i1> poison, <vscale x 4 x i32> zeroinitializer
914   %v = call <vscale x 4 x i32> @llvm.vp.ctlz.nxv4i32(<vscale x 4 x i32> %va, i1 false, <vscale x 4 x i1> %m, i32 %evl)
915   ret <vscale x 4 x i32> %v
918 declare <vscale x 8 x i32> @llvm.vp.ctlz.nxv8i32(<vscale x 8 x i32>, i1 immarg, <vscale x 8 x i1>, i32)
920 define <vscale x 8 x i32> @vp_ctlz_nxv8i32(<vscale x 8 x i32> %va, <vscale x 8 x i1> %m, i32 zeroext %evl) {
921 ; CHECK-LABEL: vp_ctlz_nxv8i32:
922 ; CHECK:       # %bb.0:
923 ; CHECK-NEXT:    vsetvli zero, a0, e32, m4, ta, ma
924 ; CHECK-NEXT:    vfwcvt.f.xu.v v16, v8, v0.t
925 ; CHECK-NEXT:    li a0, 52
926 ; CHECK-NEXT:    vsetvli zero, zero, e64, m8, ta, ma
927 ; CHECK-NEXT:    vsrl.vx v8, v16, a0, v0.t
928 ; CHECK-NEXT:    vsetvli zero, zero, e32, m4, ta, ma
929 ; CHECK-NEXT:    vnsrl.wi v16, v8, 0, v0.t
930 ; CHECK-NEXT:    li a0, 1054
931 ; CHECK-NEXT:    vrsub.vx v8, v16, a0, v0.t
932 ; CHECK-NEXT:    li a0, 32
933 ; CHECK-NEXT:    vminu.vx v8, v8, a0, v0.t
934 ; CHECK-NEXT:    ret
936 ; CHECK-ZVBB-LABEL: vp_ctlz_nxv8i32:
937 ; CHECK-ZVBB:       # %bb.0:
938 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e32, m4, ta, ma
939 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8, v0.t
940 ; CHECK-ZVBB-NEXT:    ret
941   %v = call <vscale x 8 x i32> @llvm.vp.ctlz.nxv8i32(<vscale x 8 x i32> %va, i1 false, <vscale x 8 x i1> %m, i32 %evl)
942   ret <vscale x 8 x i32> %v
945 define <vscale x 8 x i32> @vp_ctlz_nxv8i32_unmasked(<vscale x 8 x i32> %va, i32 zeroext %evl) {
946 ; CHECK-LABEL: vp_ctlz_nxv8i32_unmasked:
947 ; CHECK:       # %bb.0:
948 ; CHECK-NEXT:    vsetvli zero, a0, e32, m4, ta, ma
949 ; CHECK-NEXT:    vfwcvt.f.xu.v v16, v8
950 ; CHECK-NEXT:    li a0, 52
951 ; CHECK-NEXT:    vnsrl.wx v8, v16, a0
952 ; CHECK-NEXT:    li a0, 1054
953 ; CHECK-NEXT:    vrsub.vx v8, v8, a0
954 ; CHECK-NEXT:    li a0, 32
955 ; CHECK-NEXT:    vminu.vx v8, v8, a0
956 ; CHECK-NEXT:    ret
958 ; CHECK-ZVBB-LABEL: vp_ctlz_nxv8i32_unmasked:
959 ; CHECK-ZVBB:       # %bb.0:
960 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e32, m4, ta, ma
961 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
962 ; CHECK-ZVBB-NEXT:    ret
963   %head = insertelement <vscale x 8 x i1> poison, i1 true, i32 0
964   %m = shufflevector <vscale x 8 x i1> %head, <vscale x 8 x i1> poison, <vscale x 8 x i32> zeroinitializer
965   %v = call <vscale x 8 x i32> @llvm.vp.ctlz.nxv8i32(<vscale x 8 x i32> %va, i1 false, <vscale x 8 x i1> %m, i32 %evl)
966   ret <vscale x 8 x i32> %v
969 declare <vscale x 16 x i32> @llvm.vp.ctlz.nxv16i32(<vscale x 16 x i32>, i1 immarg, <vscale x 16 x i1>, i32)
971 define <vscale x 16 x i32> @vp_ctlz_nxv16i32(<vscale x 16 x i32> %va, <vscale x 16 x i1> %m, i32 zeroext %evl) {
972 ; CHECK-LABEL: vp_ctlz_nxv16i32:
973 ; CHECK:       # %bb.0:
974 ; CHECK-NEXT:    vsetvli zero, a0, e32, m8, ta, ma
975 ; CHECK-NEXT:    fsrmi a0, 1
976 ; CHECK-NEXT:    vfcvt.f.xu.v v8, v8, v0.t
977 ; CHECK-NEXT:    vsrl.vi v8, v8, 23, v0.t
978 ; CHECK-NEXT:    li a1, 158
979 ; CHECK-NEXT:    vrsub.vx v8, v8, a1, v0.t
980 ; CHECK-NEXT:    li a1, 32
981 ; CHECK-NEXT:    vminu.vx v8, v8, a1, v0.t
982 ; CHECK-NEXT:    fsrm a0
983 ; CHECK-NEXT:    ret
985 ; CHECK-ZVBB-LABEL: vp_ctlz_nxv16i32:
986 ; CHECK-ZVBB:       # %bb.0:
987 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e32, m8, ta, ma
988 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8, v0.t
989 ; CHECK-ZVBB-NEXT:    ret
990   %v = call <vscale x 16 x i32> @llvm.vp.ctlz.nxv16i32(<vscale x 16 x i32> %va, i1 false, <vscale x 16 x i1> %m, i32 %evl)
991   ret <vscale x 16 x i32> %v
994 define <vscale x 16 x i32> @vp_ctlz_nxv16i32_unmasked(<vscale x 16 x i32> %va, i32 zeroext %evl) {
995 ; CHECK-LABEL: vp_ctlz_nxv16i32_unmasked:
996 ; CHECK:       # %bb.0:
997 ; CHECK-NEXT:    vsetvli zero, a0, e32, m8, ta, ma
998 ; CHECK-NEXT:    fsrmi a0, 1
999 ; CHECK-NEXT:    vfcvt.f.xu.v v8, v8
1000 ; CHECK-NEXT:    vsrl.vi v8, v8, 23
1001 ; CHECK-NEXT:    li a1, 158
1002 ; CHECK-NEXT:    vrsub.vx v8, v8, a1
1003 ; CHECK-NEXT:    li a1, 32
1004 ; CHECK-NEXT:    vminu.vx v8, v8, a1
1005 ; CHECK-NEXT:    fsrm a0
1006 ; CHECK-NEXT:    ret
1008 ; CHECK-ZVBB-LABEL: vp_ctlz_nxv16i32_unmasked:
1009 ; CHECK-ZVBB:       # %bb.0:
1010 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e32, m8, ta, ma
1011 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
1012 ; CHECK-ZVBB-NEXT:    ret
1013   %head = insertelement <vscale x 16 x i1> poison, i1 true, i32 0
1014   %m = shufflevector <vscale x 16 x i1> %head, <vscale x 16 x i1> poison, <vscale x 16 x i32> zeroinitializer
1015   %v = call <vscale x 16 x i32> @llvm.vp.ctlz.nxv16i32(<vscale x 16 x i32> %va, i1 false, <vscale x 16 x i1> %m, i32 %evl)
1016   ret <vscale x 16 x i32> %v
1019 declare <vscale x 1 x i64> @llvm.vp.ctlz.nxv1i64(<vscale x 1 x i64>, i1 immarg, <vscale x 1 x i1>, i32)
1021 define <vscale x 1 x i64> @vp_ctlz_nxv1i64(<vscale x 1 x i64> %va, <vscale x 1 x i1> %m, i32 zeroext %evl) {
1022 ; CHECK-LABEL: vp_ctlz_nxv1i64:
1023 ; CHECK:       # %bb.0:
1024 ; CHECK-NEXT:    vsetvli zero, a0, e64, m1, ta, ma
1025 ; CHECK-NEXT:    fsrmi a0, 1
1026 ; CHECK-NEXT:    vfcvt.f.xu.v v8, v8, v0.t
1027 ; CHECK-NEXT:    li a1, 52
1028 ; CHECK-NEXT:    vsrl.vx v8, v8, a1, v0.t
1029 ; CHECK-NEXT:    li a1, 1086
1030 ; CHECK-NEXT:    vrsub.vx v8, v8, a1, v0.t
1031 ; CHECK-NEXT:    li a1, 64
1032 ; CHECK-NEXT:    vminu.vx v8, v8, a1, v0.t
1033 ; CHECK-NEXT:    fsrm a0
1034 ; CHECK-NEXT:    ret
1036 ; CHECK-ZVBB-LABEL: vp_ctlz_nxv1i64:
1037 ; CHECK-ZVBB:       # %bb.0:
1038 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e64, m1, ta, ma
1039 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8, v0.t
1040 ; CHECK-ZVBB-NEXT:    ret
1041   %v = call <vscale x 1 x i64> @llvm.vp.ctlz.nxv1i64(<vscale x 1 x i64> %va, i1 false, <vscale x 1 x i1> %m, i32 %evl)
1042   ret <vscale x 1 x i64> %v
1045 define <vscale x 1 x i64> @vp_ctlz_nxv1i64_unmasked(<vscale x 1 x i64> %va, i32 zeroext %evl) {
1046 ; CHECK-LABEL: vp_ctlz_nxv1i64_unmasked:
1047 ; CHECK:       # %bb.0:
1048 ; CHECK-NEXT:    vsetvli zero, a0, e64, m1, ta, ma
1049 ; CHECK-NEXT:    fsrmi a0, 1
1050 ; CHECK-NEXT:    vfcvt.f.xu.v v8, v8
1051 ; CHECK-NEXT:    li a1, 52
1052 ; CHECK-NEXT:    vsrl.vx v8, v8, a1
1053 ; CHECK-NEXT:    li a1, 1086
1054 ; CHECK-NEXT:    vrsub.vx v8, v8, a1
1055 ; CHECK-NEXT:    li a1, 64
1056 ; CHECK-NEXT:    vminu.vx v8, v8, a1
1057 ; CHECK-NEXT:    fsrm a0
1058 ; CHECK-NEXT:    ret
1060 ; CHECK-ZVBB-LABEL: vp_ctlz_nxv1i64_unmasked:
1061 ; CHECK-ZVBB:       # %bb.0:
1062 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e64, m1, ta, ma
1063 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
1064 ; CHECK-ZVBB-NEXT:    ret
1065   %head = insertelement <vscale x 1 x i1> poison, i1 true, i32 0
1066   %m = shufflevector <vscale x 1 x i1> %head, <vscale x 1 x i1> poison, <vscale x 1 x i32> zeroinitializer
1067   %v = call <vscale x 1 x i64> @llvm.vp.ctlz.nxv1i64(<vscale x 1 x i64> %va, i1 false, <vscale x 1 x i1> %m, i32 %evl)
1068   ret <vscale x 1 x i64> %v
1071 declare <vscale x 2 x i64> @llvm.vp.ctlz.nxv2i64(<vscale x 2 x i64>, i1 immarg, <vscale x 2 x i1>, i32)
1073 define <vscale x 2 x i64> @vp_ctlz_nxv2i64(<vscale x 2 x i64> %va, <vscale x 2 x i1> %m, i32 zeroext %evl) {
1074 ; CHECK-LABEL: vp_ctlz_nxv2i64:
1075 ; CHECK:       # %bb.0:
1076 ; CHECK-NEXT:    vsetvli zero, a0, e64, m2, ta, ma
1077 ; CHECK-NEXT:    fsrmi a0, 1
1078 ; CHECK-NEXT:    vfcvt.f.xu.v v8, v8, v0.t
1079 ; CHECK-NEXT:    li a1, 52
1080 ; CHECK-NEXT:    vsrl.vx v8, v8, a1, v0.t
1081 ; CHECK-NEXT:    li a1, 1086
1082 ; CHECK-NEXT:    vrsub.vx v8, v8, a1, v0.t
1083 ; CHECK-NEXT:    li a1, 64
1084 ; CHECK-NEXT:    vminu.vx v8, v8, a1, v0.t
1085 ; CHECK-NEXT:    fsrm a0
1086 ; CHECK-NEXT:    ret
1088 ; CHECK-ZVBB-LABEL: vp_ctlz_nxv2i64:
1089 ; CHECK-ZVBB:       # %bb.0:
1090 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e64, m2, ta, ma
1091 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8, v0.t
1092 ; CHECK-ZVBB-NEXT:    ret
1093   %v = call <vscale x 2 x i64> @llvm.vp.ctlz.nxv2i64(<vscale x 2 x i64> %va, i1 false, <vscale x 2 x i1> %m, i32 %evl)
1094   ret <vscale x 2 x i64> %v
1097 define <vscale x 2 x i64> @vp_ctlz_nxv2i64_unmasked(<vscale x 2 x i64> %va, i32 zeroext %evl) {
1098 ; CHECK-LABEL: vp_ctlz_nxv2i64_unmasked:
1099 ; CHECK:       # %bb.0:
1100 ; CHECK-NEXT:    vsetvli zero, a0, e64, m2, ta, ma
1101 ; CHECK-NEXT:    fsrmi a0, 1
1102 ; CHECK-NEXT:    vfcvt.f.xu.v v8, v8
1103 ; CHECK-NEXT:    li a1, 52
1104 ; CHECK-NEXT:    vsrl.vx v8, v8, a1
1105 ; CHECK-NEXT:    li a1, 1086
1106 ; CHECK-NEXT:    vrsub.vx v8, v8, a1
1107 ; CHECK-NEXT:    li a1, 64
1108 ; CHECK-NEXT:    vminu.vx v8, v8, a1
1109 ; CHECK-NEXT:    fsrm a0
1110 ; CHECK-NEXT:    ret
1112 ; CHECK-ZVBB-LABEL: vp_ctlz_nxv2i64_unmasked:
1113 ; CHECK-ZVBB:       # %bb.0:
1114 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e64, m2, ta, ma
1115 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
1116 ; CHECK-ZVBB-NEXT:    ret
1117   %head = insertelement <vscale x 2 x i1> poison, i1 true, i32 0
1118   %m = shufflevector <vscale x 2 x i1> %head, <vscale x 2 x i1> poison, <vscale x 2 x i32> zeroinitializer
1119   %v = call <vscale x 2 x i64> @llvm.vp.ctlz.nxv2i64(<vscale x 2 x i64> %va, i1 false, <vscale x 2 x i1> %m, i32 %evl)
1120   ret <vscale x 2 x i64> %v
1123 declare <vscale x 4 x i64> @llvm.vp.ctlz.nxv4i64(<vscale x 4 x i64>, i1 immarg, <vscale x 4 x i1>, i32)
1125 define <vscale x 4 x i64> @vp_ctlz_nxv4i64(<vscale x 4 x i64> %va, <vscale x 4 x i1> %m, i32 zeroext %evl) {
1126 ; CHECK-LABEL: vp_ctlz_nxv4i64:
1127 ; CHECK:       # %bb.0:
1128 ; CHECK-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
1129 ; CHECK-NEXT:    fsrmi a0, 1
1130 ; CHECK-NEXT:    vfcvt.f.xu.v v8, v8, v0.t
1131 ; CHECK-NEXT:    li a1, 52
1132 ; CHECK-NEXT:    vsrl.vx v8, v8, a1, v0.t
1133 ; CHECK-NEXT:    li a1, 1086
1134 ; CHECK-NEXT:    vrsub.vx v8, v8, a1, v0.t
1135 ; CHECK-NEXT:    li a1, 64
1136 ; CHECK-NEXT:    vminu.vx v8, v8, a1, v0.t
1137 ; CHECK-NEXT:    fsrm a0
1138 ; CHECK-NEXT:    ret
1140 ; CHECK-ZVBB-LABEL: vp_ctlz_nxv4i64:
1141 ; CHECK-ZVBB:       # %bb.0:
1142 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
1143 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8, v0.t
1144 ; CHECK-ZVBB-NEXT:    ret
1145   %v = call <vscale x 4 x i64> @llvm.vp.ctlz.nxv4i64(<vscale x 4 x i64> %va, i1 false, <vscale x 4 x i1> %m, i32 %evl)
1146   ret <vscale x 4 x i64> %v
1149 define <vscale x 4 x i64> @vp_ctlz_nxv4i64_unmasked(<vscale x 4 x i64> %va, i32 zeroext %evl) {
1150 ; CHECK-LABEL: vp_ctlz_nxv4i64_unmasked:
1151 ; CHECK:       # %bb.0:
1152 ; CHECK-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
1153 ; CHECK-NEXT:    fsrmi a0, 1
1154 ; CHECK-NEXT:    vfcvt.f.xu.v v8, v8
1155 ; CHECK-NEXT:    li a1, 52
1156 ; CHECK-NEXT:    vsrl.vx v8, v8, a1
1157 ; CHECK-NEXT:    li a1, 1086
1158 ; CHECK-NEXT:    vrsub.vx v8, v8, a1
1159 ; CHECK-NEXT:    li a1, 64
1160 ; CHECK-NEXT:    vminu.vx v8, v8, a1
1161 ; CHECK-NEXT:    fsrm a0
1162 ; CHECK-NEXT:    ret
1164 ; CHECK-ZVBB-LABEL: vp_ctlz_nxv4i64_unmasked:
1165 ; CHECK-ZVBB:       # %bb.0:
1166 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
1167 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
1168 ; CHECK-ZVBB-NEXT:    ret
1169   %head = insertelement <vscale x 4 x i1> poison, i1 true, i32 0
1170   %m = shufflevector <vscale x 4 x i1> %head, <vscale x 4 x i1> poison, <vscale x 4 x i32> zeroinitializer
1171   %v = call <vscale x 4 x i64> @llvm.vp.ctlz.nxv4i64(<vscale x 4 x i64> %va, i1 false, <vscale x 4 x i1> %m, i32 %evl)
1172   ret <vscale x 4 x i64> %v
1175 declare <vscale x 7 x i64> @llvm.vp.ctlz.nxv7i64(<vscale x 7 x i64>, i1 immarg, <vscale x 7 x i1>, i32)
1177 define <vscale x 7 x i64> @vp_ctlz_nxv7i64(<vscale x 7 x i64> %va, <vscale x 7 x i1> %m, i32 zeroext %evl) {
1178 ; CHECK-LABEL: vp_ctlz_nxv7i64:
1179 ; CHECK:       # %bb.0:
1180 ; CHECK-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1181 ; CHECK-NEXT:    fsrmi a0, 1
1182 ; CHECK-NEXT:    vfcvt.f.xu.v v8, v8, v0.t
1183 ; CHECK-NEXT:    li a1, 52
1184 ; CHECK-NEXT:    vsrl.vx v8, v8, a1, v0.t
1185 ; CHECK-NEXT:    li a1, 1086
1186 ; CHECK-NEXT:    vrsub.vx v8, v8, a1, v0.t
1187 ; CHECK-NEXT:    li a1, 64
1188 ; CHECK-NEXT:    vminu.vx v8, v8, a1, v0.t
1189 ; CHECK-NEXT:    fsrm a0
1190 ; CHECK-NEXT:    ret
1192 ; CHECK-ZVBB-LABEL: vp_ctlz_nxv7i64:
1193 ; CHECK-ZVBB:       # %bb.0:
1194 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1195 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8, v0.t
1196 ; CHECK-ZVBB-NEXT:    ret
1197   %v = call <vscale x 7 x i64> @llvm.vp.ctlz.nxv7i64(<vscale x 7 x i64> %va, i1 false, <vscale x 7 x i1> %m, i32 %evl)
1198   ret <vscale x 7 x i64> %v
1201 define <vscale x 7 x i64> @vp_ctlz_nxv7i64_unmasked(<vscale x 7 x i64> %va, i32 zeroext %evl) {
1202 ; CHECK-LABEL: vp_ctlz_nxv7i64_unmasked:
1203 ; CHECK:       # %bb.0:
1204 ; CHECK-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1205 ; CHECK-NEXT:    fsrmi a0, 1
1206 ; CHECK-NEXT:    vfcvt.f.xu.v v8, v8
1207 ; CHECK-NEXT:    li a1, 52
1208 ; CHECK-NEXT:    vsrl.vx v8, v8, a1
1209 ; CHECK-NEXT:    li a1, 1086
1210 ; CHECK-NEXT:    vrsub.vx v8, v8, a1
1211 ; CHECK-NEXT:    li a1, 64
1212 ; CHECK-NEXT:    vminu.vx v8, v8, a1
1213 ; CHECK-NEXT:    fsrm a0
1214 ; CHECK-NEXT:    ret
1216 ; CHECK-ZVBB-LABEL: vp_ctlz_nxv7i64_unmasked:
1217 ; CHECK-ZVBB:       # %bb.0:
1218 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1219 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
1220 ; CHECK-ZVBB-NEXT:    ret
1221   %head = insertelement <vscale x 7 x i1> poison, i1 true, i32 0
1222   %m = shufflevector <vscale x 7 x i1> %head, <vscale x 7 x i1> poison, <vscale x 7 x i32> zeroinitializer
1223   %v = call <vscale x 7 x i64> @llvm.vp.ctlz.nxv7i64(<vscale x 7 x i64> %va, i1 false, <vscale x 7 x i1> %m, i32 %evl)
1224   ret <vscale x 7 x i64> %v
1227 declare <vscale x 8 x i64> @llvm.vp.ctlz.nxv8i64(<vscale x 8 x i64>, i1 immarg, <vscale x 8 x i1>, i32)
1229 define <vscale x 8 x i64> @vp_ctlz_nxv8i64(<vscale x 8 x i64> %va, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1230 ; CHECK-LABEL: vp_ctlz_nxv8i64:
1231 ; CHECK:       # %bb.0:
1232 ; CHECK-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1233 ; CHECK-NEXT:    fsrmi a0, 1
1234 ; CHECK-NEXT:    vfcvt.f.xu.v v8, v8, v0.t
1235 ; CHECK-NEXT:    li a1, 52
1236 ; CHECK-NEXT:    vsrl.vx v8, v8, a1, v0.t
1237 ; CHECK-NEXT:    li a1, 1086
1238 ; CHECK-NEXT:    vrsub.vx v8, v8, a1, v0.t
1239 ; CHECK-NEXT:    li a1, 64
1240 ; CHECK-NEXT:    vminu.vx v8, v8, a1, v0.t
1241 ; CHECK-NEXT:    fsrm a0
1242 ; CHECK-NEXT:    ret
1244 ; CHECK-ZVBB-LABEL: vp_ctlz_nxv8i64:
1245 ; CHECK-ZVBB:       # %bb.0:
1246 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1247 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8, v0.t
1248 ; CHECK-ZVBB-NEXT:    ret
1249   %v = call <vscale x 8 x i64> @llvm.vp.ctlz.nxv8i64(<vscale x 8 x i64> %va, i1 false, <vscale x 8 x i1> %m, i32 %evl)
1250   ret <vscale x 8 x i64> %v
1253 define <vscale x 8 x i64> @vp_ctlz_nxv8i64_unmasked(<vscale x 8 x i64> %va, i32 zeroext %evl) {
1254 ; CHECK-LABEL: vp_ctlz_nxv8i64_unmasked:
1255 ; CHECK:       # %bb.0:
1256 ; CHECK-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1257 ; CHECK-NEXT:    fsrmi a0, 1
1258 ; CHECK-NEXT:    vfcvt.f.xu.v v8, v8
1259 ; CHECK-NEXT:    li a1, 52
1260 ; CHECK-NEXT:    vsrl.vx v8, v8, a1
1261 ; CHECK-NEXT:    li a1, 1086
1262 ; CHECK-NEXT:    vrsub.vx v8, v8, a1
1263 ; CHECK-NEXT:    li a1, 64
1264 ; CHECK-NEXT:    vminu.vx v8, v8, a1
1265 ; CHECK-NEXT:    fsrm a0
1266 ; CHECK-NEXT:    ret
1268 ; CHECK-ZVBB-LABEL: vp_ctlz_nxv8i64_unmasked:
1269 ; CHECK-ZVBB:       # %bb.0:
1270 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1271 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
1272 ; CHECK-ZVBB-NEXT:    ret
1273   %head = insertelement <vscale x 8 x i1> poison, i1 true, i32 0
1274   %m = shufflevector <vscale x 8 x i1> %head, <vscale x 8 x i1> poison, <vscale x 8 x i32> zeroinitializer
1275   %v = call <vscale x 8 x i64> @llvm.vp.ctlz.nxv8i64(<vscale x 8 x i64> %va, i1 false, <vscale x 8 x i1> %m, i32 %evl)
1276   ret <vscale x 8 x i64> %v
1279 declare <vscale x 16 x i64> @llvm.vp.ctlz.nxv16i64(<vscale x 16 x i64>, i1 immarg, <vscale x 16 x i1>, i32)
1281 define <vscale x 16 x i64> @vp_ctlz_nxv16i64(<vscale x 16 x i64> %va, <vscale x 16 x i1> %m, i32 zeroext %evl) {
1282 ; CHECK-LABEL: vp_ctlz_nxv16i64:
1283 ; CHECK:       # %bb.0:
1284 ; CHECK-NEXT:    vmv1r.v v24, v0
1285 ; CHECK-NEXT:    csrr a1, vlenb
1286 ; CHECK-NEXT:    srli a2, a1, 3
1287 ; CHECK-NEXT:    vsetvli a3, zero, e8, mf4, ta, ma
1288 ; CHECK-NEXT:    vslidedown.vx v0, v0, a2
1289 ; CHECK-NEXT:    sub a2, a0, a1
1290 ; CHECK-NEXT:    sltu a3, a0, a2
1291 ; CHECK-NEXT:    addi a3, a3, -1
1292 ; CHECK-NEXT:    and a2, a3, a2
1293 ; CHECK-NEXT:    vsetvli zero, a2, e64, m8, ta, ma
1294 ; CHECK-NEXT:    fsrmi a2, 1
1295 ; CHECK-NEXT:    vfcvt.f.xu.v v16, v16, v0.t
1296 ; CHECK-NEXT:    fsrm a2
1297 ; CHECK-NEXT:    li a2, 52
1298 ; CHECK-NEXT:    vsrl.vx v16, v16, a2, v0.t
1299 ; CHECK-NEXT:    li a3, 1086
1300 ; CHECK-NEXT:    vrsub.vx v16, v16, a3, v0.t
1301 ; CHECK-NEXT:    li a4, 64
1302 ; CHECK-NEXT:    vminu.vx v16, v16, a4, v0.t
1303 ; CHECK-NEXT:    bltu a0, a1, .LBB46_2
1304 ; CHECK-NEXT:  # %bb.1:
1305 ; CHECK-NEXT:    mv a0, a1
1306 ; CHECK-NEXT:  .LBB46_2:
1307 ; CHECK-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1308 ; CHECK-NEXT:    fsrmi a0, 1
1309 ; CHECK-NEXT:    vmv1r.v v0, v24
1310 ; CHECK-NEXT:    vfcvt.f.xu.v v8, v8, v0.t
1311 ; CHECK-NEXT:    vsrl.vx v8, v8, a2, v0.t
1312 ; CHECK-NEXT:    vrsub.vx v8, v8, a3, v0.t
1313 ; CHECK-NEXT:    vminu.vx v8, v8, a4, v0.t
1314 ; CHECK-NEXT:    fsrm a0
1315 ; CHECK-NEXT:    ret
1317 ; CHECK-ZVBB-LABEL: vp_ctlz_nxv16i64:
1318 ; CHECK-ZVBB:       # %bb.0:
1319 ; CHECK-ZVBB-NEXT:    vmv1r.v v24, v0
1320 ; CHECK-ZVBB-NEXT:    csrr a1, vlenb
1321 ; CHECK-ZVBB-NEXT:    srli a2, a1, 3
1322 ; CHECK-ZVBB-NEXT:    vsetvli a3, zero, e8, mf4, ta, ma
1323 ; CHECK-ZVBB-NEXT:    vslidedown.vx v0, v0, a2
1324 ; CHECK-ZVBB-NEXT:    sub a2, a0, a1
1325 ; CHECK-ZVBB-NEXT:    sltu a3, a0, a2
1326 ; CHECK-ZVBB-NEXT:    addi a3, a3, -1
1327 ; CHECK-ZVBB-NEXT:    and a2, a3, a2
1328 ; CHECK-ZVBB-NEXT:    vsetvli zero, a2, e64, m8, ta, ma
1329 ; CHECK-ZVBB-NEXT:    vclz.v v16, v16, v0.t
1330 ; CHECK-ZVBB-NEXT:    bltu a0, a1, .LBB46_2
1331 ; CHECK-ZVBB-NEXT:  # %bb.1:
1332 ; CHECK-ZVBB-NEXT:    mv a0, a1
1333 ; CHECK-ZVBB-NEXT:  .LBB46_2:
1334 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1335 ; CHECK-ZVBB-NEXT:    vmv1r.v v0, v24
1336 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8, v0.t
1337 ; CHECK-ZVBB-NEXT:    ret
1338   %v = call <vscale x 16 x i64> @llvm.vp.ctlz.nxv16i64(<vscale x 16 x i64> %va, i1 false, <vscale x 16 x i1> %m, i32 %evl)
1339   ret <vscale x 16 x i64> %v
1342 define <vscale x 16 x i64> @vp_ctlz_nxv16i64_unmasked(<vscale x 16 x i64> %va, i32 zeroext %evl) {
1343 ; CHECK-LABEL: vp_ctlz_nxv16i64_unmasked:
1344 ; CHECK:       # %bb.0:
1345 ; CHECK-NEXT:    csrr a1, vlenb
1346 ; CHECK-NEXT:    sub a2, a0, a1
1347 ; CHECK-NEXT:    sltu a3, a0, a2
1348 ; CHECK-NEXT:    addi a3, a3, -1
1349 ; CHECK-NEXT:    and a2, a3, a2
1350 ; CHECK-NEXT:    vsetvli zero, a2, e64, m8, ta, ma
1351 ; CHECK-NEXT:    fsrmi a2, 1
1352 ; CHECK-NEXT:    vfcvt.f.xu.v v16, v16
1353 ; CHECK-NEXT:    fsrm a2
1354 ; CHECK-NEXT:    li a2, 52
1355 ; CHECK-NEXT:    vsrl.vx v16, v16, a2
1356 ; CHECK-NEXT:    li a3, 1086
1357 ; CHECK-NEXT:    vrsub.vx v16, v16, a3
1358 ; CHECK-NEXT:    li a4, 64
1359 ; CHECK-NEXT:    vminu.vx v16, v16, a4
1360 ; CHECK-NEXT:    bltu a0, a1, .LBB47_2
1361 ; CHECK-NEXT:  # %bb.1:
1362 ; CHECK-NEXT:    mv a0, a1
1363 ; CHECK-NEXT:  .LBB47_2:
1364 ; CHECK-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1365 ; CHECK-NEXT:    fsrmi a0, 1
1366 ; CHECK-NEXT:    vfcvt.f.xu.v v8, v8
1367 ; CHECK-NEXT:    vsrl.vx v8, v8, a2
1368 ; CHECK-NEXT:    vrsub.vx v8, v8, a3
1369 ; CHECK-NEXT:    vminu.vx v8, v8, a4
1370 ; CHECK-NEXT:    fsrm a0
1371 ; CHECK-NEXT:    ret
1373 ; CHECK-ZVBB-LABEL: vp_ctlz_nxv16i64_unmasked:
1374 ; CHECK-ZVBB:       # %bb.0:
1375 ; CHECK-ZVBB-NEXT:    csrr a1, vlenb
1376 ; CHECK-ZVBB-NEXT:    sub a2, a0, a1
1377 ; CHECK-ZVBB-NEXT:    sltu a3, a0, a2
1378 ; CHECK-ZVBB-NEXT:    addi a3, a3, -1
1379 ; CHECK-ZVBB-NEXT:    and a2, a3, a2
1380 ; CHECK-ZVBB-NEXT:    vsetvli zero, a2, e64, m8, ta, ma
1381 ; CHECK-ZVBB-NEXT:    vclz.v v16, v16
1382 ; CHECK-ZVBB-NEXT:    bltu a0, a1, .LBB47_2
1383 ; CHECK-ZVBB-NEXT:  # %bb.1:
1384 ; CHECK-ZVBB-NEXT:    mv a0, a1
1385 ; CHECK-ZVBB-NEXT:  .LBB47_2:
1386 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1387 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
1388 ; CHECK-ZVBB-NEXT:    ret
1389   %head = insertelement <vscale x 16 x i1> poison, i1 true, i32 0
1390   %m = shufflevector <vscale x 16 x i1> %head, <vscale x 16 x i1> poison, <vscale x 16 x i32> zeroinitializer
1391   %v = call <vscale x 16 x i64> @llvm.vp.ctlz.nxv16i64(<vscale x 16 x i64> %va, i1 false, <vscale x 16 x i1> %m, i32 %evl)
1392   ret <vscale x 16 x i64> %v
1395 define <vscale x 1 x i8> @vp_ctlz_zero_undef_nxv1i8(<vscale x 1 x i8> %va, <vscale x 1 x i1> %m, i32 zeroext %evl) {
1396 ; CHECK-LABEL: vp_ctlz_zero_undef_nxv1i8:
1397 ; CHECK:       # %bb.0:
1398 ; CHECK-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
1399 ; CHECK-NEXT:    vzext.vf2 v9, v8, v0.t
1400 ; CHECK-NEXT:    vfwcvt.f.xu.v v8, v9, v0.t
1401 ; CHECK-NEXT:    vsetvli zero, zero, e32, mf2, ta, ma
1402 ; CHECK-NEXT:    vsrl.vi v8, v8, 23, v0.t
1403 ; CHECK-NEXT:    vsetvli zero, zero, e16, mf4, ta, ma
1404 ; CHECK-NEXT:    vnsrl.wi v8, v8, 0, v0.t
1405 ; CHECK-NEXT:    vsetvli zero, zero, e8, mf8, ta, ma
1406 ; CHECK-NEXT:    vnsrl.wi v8, v8, 0, v0.t
1407 ; CHECK-NEXT:    li a0, 134
1408 ; CHECK-NEXT:    vrsub.vx v8, v8, a0, v0.t
1409 ; CHECK-NEXT:    ret
1411 ; CHECK-ZVBB-LABEL: vp_ctlz_zero_undef_nxv1i8:
1412 ; CHECK-ZVBB:       # %bb.0:
1413 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e8, mf8, ta, ma
1414 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8, v0.t
1415 ; CHECK-ZVBB-NEXT:    ret
1416   %v = call <vscale x 1 x i8> @llvm.vp.ctlz.nxv1i8(<vscale x 1 x i8> %va, i1 true, <vscale x 1 x i1> %m, i32 %evl)
1417   ret <vscale x 1 x i8> %v
1420 define <vscale x 1 x i8> @vp_ctlz_zero_undef_nxv1i8_unmasked(<vscale x 1 x i8> %va, i32 zeroext %evl) {
1421 ; CHECK-LABEL: vp_ctlz_zero_undef_nxv1i8_unmasked:
1422 ; CHECK:       # %bb.0:
1423 ; CHECK-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
1424 ; CHECK-NEXT:    vzext.vf2 v9, v8
1425 ; CHECK-NEXT:    vfwcvt.f.xu.v v8, v9
1426 ; CHECK-NEXT:    vnsrl.wi v8, v8, 23
1427 ; CHECK-NEXT:    vsetvli zero, zero, e8, mf8, ta, ma
1428 ; CHECK-NEXT:    vnsrl.wi v8, v8, 0
1429 ; CHECK-NEXT:    li a0, 134
1430 ; CHECK-NEXT:    vrsub.vx v8, v8, a0
1431 ; CHECK-NEXT:    ret
1433 ; CHECK-ZVBB-LABEL: vp_ctlz_zero_undef_nxv1i8_unmasked:
1434 ; CHECK-ZVBB:       # %bb.0:
1435 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e8, mf8, ta, ma
1436 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
1437 ; CHECK-ZVBB-NEXT:    ret
1438   %head = insertelement <vscale x 1 x i1> poison, i1 true, i32 0
1439   %m = shufflevector <vscale x 1 x i1> %head, <vscale x 1 x i1> poison, <vscale x 1 x i32> zeroinitializer
1440   %v = call <vscale x 1 x i8> @llvm.vp.ctlz.nxv1i8(<vscale x 1 x i8> %va, i1 true, <vscale x 1 x i1> %m, i32 %evl)
1441   ret <vscale x 1 x i8> %v
1445 define <vscale x 2 x i8> @vp_ctlz_zero_undef_nxv2i8(<vscale x 2 x i8> %va, <vscale x 2 x i1> %m, i32 zeroext %evl) {
1446 ; CHECK-LABEL: vp_ctlz_zero_undef_nxv2i8:
1447 ; CHECK:       # %bb.0:
1448 ; CHECK-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
1449 ; CHECK-NEXT:    vzext.vf2 v9, v8, v0.t
1450 ; CHECK-NEXT:    vfwcvt.f.xu.v v8, v9, v0.t
1451 ; CHECK-NEXT:    vsetvli zero, zero, e32, m1, ta, ma
1452 ; CHECK-NEXT:    vsrl.vi v8, v8, 23, v0.t
1453 ; CHECK-NEXT:    vsetvli zero, zero, e16, mf2, ta, ma
1454 ; CHECK-NEXT:    vnsrl.wi v8, v8, 0, v0.t
1455 ; CHECK-NEXT:    vsetvli zero, zero, e8, mf4, ta, ma
1456 ; CHECK-NEXT:    vnsrl.wi v8, v8, 0, v0.t
1457 ; CHECK-NEXT:    li a0, 134
1458 ; CHECK-NEXT:    vrsub.vx v8, v8, a0, v0.t
1459 ; CHECK-NEXT:    ret
1461 ; CHECK-ZVBB-LABEL: vp_ctlz_zero_undef_nxv2i8:
1462 ; CHECK-ZVBB:       # %bb.0:
1463 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e8, mf4, ta, ma
1464 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8, v0.t
1465 ; CHECK-ZVBB-NEXT:    ret
1466   %v = call <vscale x 2 x i8> @llvm.vp.ctlz.nxv2i8(<vscale x 2 x i8> %va, i1 true, <vscale x 2 x i1> %m, i32 %evl)
1467   ret <vscale x 2 x i8> %v
1470 define <vscale x 2 x i8> @vp_ctlz_zero_undef_nxv2i8_unmasked(<vscale x 2 x i8> %va, i32 zeroext %evl) {
1471 ; CHECK-LABEL: vp_ctlz_zero_undef_nxv2i8_unmasked:
1472 ; CHECK:       # %bb.0:
1473 ; CHECK-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
1474 ; CHECK-NEXT:    vzext.vf2 v9, v8
1475 ; CHECK-NEXT:    vfwcvt.f.xu.v v8, v9
1476 ; CHECK-NEXT:    vnsrl.wi v8, v8, 23
1477 ; CHECK-NEXT:    vsetvli zero, zero, e8, mf4, ta, ma
1478 ; CHECK-NEXT:    vnsrl.wi v8, v8, 0
1479 ; CHECK-NEXT:    li a0, 134
1480 ; CHECK-NEXT:    vrsub.vx v8, v8, a0
1481 ; CHECK-NEXT:    ret
1483 ; CHECK-ZVBB-LABEL: vp_ctlz_zero_undef_nxv2i8_unmasked:
1484 ; CHECK-ZVBB:       # %bb.0:
1485 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e8, mf4, ta, ma
1486 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
1487 ; CHECK-ZVBB-NEXT:    ret
1488   %head = insertelement <vscale x 2 x i1> poison, i1 true, i32 0
1489   %m = shufflevector <vscale x 2 x i1> %head, <vscale x 2 x i1> poison, <vscale x 2 x i32> zeroinitializer
1490   %v = call <vscale x 2 x i8> @llvm.vp.ctlz.nxv2i8(<vscale x 2 x i8> %va, i1 true, <vscale x 2 x i1> %m, i32 %evl)
1491   ret <vscale x 2 x i8> %v
1495 define <vscale x 4 x i8> @vp_ctlz_zero_undef_nxv4i8(<vscale x 4 x i8> %va, <vscale x 4 x i1> %m, i32 zeroext %evl) {
1496 ; CHECK-LABEL: vp_ctlz_zero_undef_nxv4i8:
1497 ; CHECK:       # %bb.0:
1498 ; CHECK-NEXT:    vsetvli zero, a0, e16, m1, ta, ma
1499 ; CHECK-NEXT:    vzext.vf2 v9, v8, v0.t
1500 ; CHECK-NEXT:    vfwcvt.f.xu.v v10, v9, v0.t
1501 ; CHECK-NEXT:    vsetvli zero, zero, e32, m2, ta, ma
1502 ; CHECK-NEXT:    vsrl.vi v8, v10, 23, v0.t
1503 ; CHECK-NEXT:    vsetvli zero, zero, e16, m1, ta, ma
1504 ; CHECK-NEXT:    vnsrl.wi v10, v8, 0, v0.t
1505 ; CHECK-NEXT:    vsetvli zero, zero, e8, mf2, ta, ma
1506 ; CHECK-NEXT:    vnsrl.wi v8, v10, 0, v0.t
1507 ; CHECK-NEXT:    li a0, 134
1508 ; CHECK-NEXT:    vrsub.vx v8, v8, a0, v0.t
1509 ; CHECK-NEXT:    ret
1511 ; CHECK-ZVBB-LABEL: vp_ctlz_zero_undef_nxv4i8:
1512 ; CHECK-ZVBB:       # %bb.0:
1513 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e8, mf2, ta, ma
1514 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8, v0.t
1515 ; CHECK-ZVBB-NEXT:    ret
1516   %v = call <vscale x 4 x i8> @llvm.vp.ctlz.nxv4i8(<vscale x 4 x i8> %va, i1 true, <vscale x 4 x i1> %m, i32 %evl)
1517   ret <vscale x 4 x i8> %v
1520 define <vscale x 4 x i8> @vp_ctlz_zero_undef_nxv4i8_unmasked(<vscale x 4 x i8> %va, i32 zeroext %evl) {
1521 ; CHECK-LABEL: vp_ctlz_zero_undef_nxv4i8_unmasked:
1522 ; CHECK:       # %bb.0:
1523 ; CHECK-NEXT:    vsetvli zero, a0, e16, m1, ta, ma
1524 ; CHECK-NEXT:    vzext.vf2 v9, v8
1525 ; CHECK-NEXT:    vfwcvt.f.xu.v v10, v9
1526 ; CHECK-NEXT:    vnsrl.wi v8, v10, 23
1527 ; CHECK-NEXT:    vsetvli zero, zero, e8, mf2, ta, ma
1528 ; CHECK-NEXT:    vnsrl.wi v8, v8, 0
1529 ; CHECK-NEXT:    li a0, 134
1530 ; CHECK-NEXT:    vrsub.vx v8, v8, a0
1531 ; CHECK-NEXT:    ret
1533 ; CHECK-ZVBB-LABEL: vp_ctlz_zero_undef_nxv4i8_unmasked:
1534 ; CHECK-ZVBB:       # %bb.0:
1535 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e8, mf2, ta, ma
1536 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
1537 ; CHECK-ZVBB-NEXT:    ret
1538   %head = insertelement <vscale x 4 x i1> poison, i1 true, i32 0
1539   %m = shufflevector <vscale x 4 x i1> %head, <vscale x 4 x i1> poison, <vscale x 4 x i32> zeroinitializer
1540   %v = call <vscale x 4 x i8> @llvm.vp.ctlz.nxv4i8(<vscale x 4 x i8> %va, i1 true, <vscale x 4 x i1> %m, i32 %evl)
1541   ret <vscale x 4 x i8> %v
1545 define <vscale x 8 x i8> @vp_ctlz_zero_undef_nxv8i8(<vscale x 8 x i8> %va, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1546 ; CHECK-LABEL: vp_ctlz_zero_undef_nxv8i8:
1547 ; CHECK:       # %bb.0:
1548 ; CHECK-NEXT:    vsetvli zero, a0, e16, m2, ta, ma
1549 ; CHECK-NEXT:    vzext.vf2 v10, v8, v0.t
1550 ; CHECK-NEXT:    vfwcvt.f.xu.v v12, v10, v0.t
1551 ; CHECK-NEXT:    vsetvli zero, zero, e32, m4, ta, ma
1552 ; CHECK-NEXT:    vsrl.vi v8, v12, 23, v0.t
1553 ; CHECK-NEXT:    vsetvli zero, zero, e16, m2, ta, ma
1554 ; CHECK-NEXT:    vnsrl.wi v12, v8, 0, v0.t
1555 ; CHECK-NEXT:    vsetvli zero, zero, e8, m1, ta, ma
1556 ; CHECK-NEXT:    vnsrl.wi v8, v12, 0, v0.t
1557 ; CHECK-NEXT:    li a0, 134
1558 ; CHECK-NEXT:    vrsub.vx v8, v8, a0, v0.t
1559 ; CHECK-NEXT:    ret
1561 ; CHECK-ZVBB-LABEL: vp_ctlz_zero_undef_nxv8i8:
1562 ; CHECK-ZVBB:       # %bb.0:
1563 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e8, m1, ta, ma
1564 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8, v0.t
1565 ; CHECK-ZVBB-NEXT:    ret
1566   %v = call <vscale x 8 x i8> @llvm.vp.ctlz.nxv8i8(<vscale x 8 x i8> %va, i1 true, <vscale x 8 x i1> %m, i32 %evl)
1567   ret <vscale x 8 x i8> %v
1570 define <vscale x 8 x i8> @vp_ctlz_zero_undef_nxv8i8_unmasked(<vscale x 8 x i8> %va, i32 zeroext %evl) {
1571 ; CHECK-LABEL: vp_ctlz_zero_undef_nxv8i8_unmasked:
1572 ; CHECK:       # %bb.0:
1573 ; CHECK-NEXT:    vsetvli zero, a0, e16, m2, ta, ma
1574 ; CHECK-NEXT:    vzext.vf2 v10, v8
1575 ; CHECK-NEXT:    vfwcvt.f.xu.v v12, v10
1576 ; CHECK-NEXT:    vnsrl.wi v8, v12, 23
1577 ; CHECK-NEXT:    vsetvli zero, zero, e8, m1, ta, ma
1578 ; CHECK-NEXT:    vnsrl.wi v10, v8, 0
1579 ; CHECK-NEXT:    li a0, 134
1580 ; CHECK-NEXT:    vrsub.vx v8, v10, a0
1581 ; CHECK-NEXT:    ret
1583 ; CHECK-ZVBB-LABEL: vp_ctlz_zero_undef_nxv8i8_unmasked:
1584 ; CHECK-ZVBB:       # %bb.0:
1585 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e8, m1, ta, ma
1586 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
1587 ; CHECK-ZVBB-NEXT:    ret
1588   %head = insertelement <vscale x 8 x i1> poison, i1 true, i32 0
1589   %m = shufflevector <vscale x 8 x i1> %head, <vscale x 8 x i1> poison, <vscale x 8 x i32> zeroinitializer
1590   %v = call <vscale x 8 x i8> @llvm.vp.ctlz.nxv8i8(<vscale x 8 x i8> %va, i1 true, <vscale x 8 x i1> %m, i32 %evl)
1591   ret <vscale x 8 x i8> %v
1595 define <vscale x 16 x i8> @vp_ctlz_zero_undef_nxv16i8(<vscale x 16 x i8> %va, <vscale x 16 x i1> %m, i32 zeroext %evl) {
1596 ; CHECK-LABEL: vp_ctlz_zero_undef_nxv16i8:
1597 ; CHECK:       # %bb.0:
1598 ; CHECK-NEXT:    vsetvli zero, a0, e16, m4, ta, ma
1599 ; CHECK-NEXT:    vzext.vf2 v12, v8, v0.t
1600 ; CHECK-NEXT:    vfwcvt.f.xu.v v16, v12, v0.t
1601 ; CHECK-NEXT:    vsetvli zero, zero, e32, m8, ta, ma
1602 ; CHECK-NEXT:    vsrl.vi v8, v16, 23, v0.t
1603 ; CHECK-NEXT:    vsetvli zero, zero, e16, m4, ta, ma
1604 ; CHECK-NEXT:    vnsrl.wi v16, v8, 0, v0.t
1605 ; CHECK-NEXT:    vsetvli zero, zero, e8, m2, ta, ma
1606 ; CHECK-NEXT:    vnsrl.wi v8, v16, 0, v0.t
1607 ; CHECK-NEXT:    li a0, 134
1608 ; CHECK-NEXT:    vrsub.vx v8, v8, a0, v0.t
1609 ; CHECK-NEXT:    ret
1611 ; CHECK-ZVBB-LABEL: vp_ctlz_zero_undef_nxv16i8:
1612 ; CHECK-ZVBB:       # %bb.0:
1613 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e8, m2, ta, ma
1614 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8, v0.t
1615 ; CHECK-ZVBB-NEXT:    ret
1616   %v = call <vscale x 16 x i8> @llvm.vp.ctlz.nxv16i8(<vscale x 16 x i8> %va, i1 true, <vscale x 16 x i1> %m, i32 %evl)
1617   ret <vscale x 16 x i8> %v
1620 define <vscale x 16 x i8> @vp_ctlz_zero_undef_nxv16i8_unmasked(<vscale x 16 x i8> %va, i32 zeroext %evl) {
1621 ; CHECK-LABEL: vp_ctlz_zero_undef_nxv16i8_unmasked:
1622 ; CHECK:       # %bb.0:
1623 ; CHECK-NEXT:    vsetvli zero, a0, e16, m4, ta, ma
1624 ; CHECK-NEXT:    vzext.vf2 v12, v8
1625 ; CHECK-NEXT:    vfwcvt.f.xu.v v16, v12
1626 ; CHECK-NEXT:    vnsrl.wi v8, v16, 23
1627 ; CHECK-NEXT:    vsetvli zero, zero, e8, m2, ta, ma
1628 ; CHECK-NEXT:    vnsrl.wi v12, v8, 0
1629 ; CHECK-NEXT:    li a0, 134
1630 ; CHECK-NEXT:    vrsub.vx v8, v12, a0
1631 ; CHECK-NEXT:    ret
1633 ; CHECK-ZVBB-LABEL: vp_ctlz_zero_undef_nxv16i8_unmasked:
1634 ; CHECK-ZVBB:       # %bb.0:
1635 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e8, m2, ta, ma
1636 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
1637 ; CHECK-ZVBB-NEXT:    ret
1638   %head = insertelement <vscale x 16 x i1> poison, i1 true, i32 0
1639   %m = shufflevector <vscale x 16 x i1> %head, <vscale x 16 x i1> poison, <vscale x 16 x i32> zeroinitializer
1640   %v = call <vscale x 16 x i8> @llvm.vp.ctlz.nxv16i8(<vscale x 16 x i8> %va, i1 true, <vscale x 16 x i1> %m, i32 %evl)
1641   ret <vscale x 16 x i8> %v
1645 define <vscale x 32 x i8> @vp_ctlz_zero_undef_nxv32i8(<vscale x 32 x i8> %va, <vscale x 32 x i1> %m, i32 zeroext %evl) {
1646 ; CHECK-LABEL: vp_ctlz_zero_undef_nxv32i8:
1647 ; CHECK:       # %bb.0:
1648 ; CHECK-NEXT:    vsetvli zero, a0, e8, m4, ta, ma
1649 ; CHECK-NEXT:    vsrl.vi v12, v8, 1, v0.t
1650 ; CHECK-NEXT:    vor.vv v8, v8, v12, v0.t
1651 ; CHECK-NEXT:    vsrl.vi v12, v8, 2, v0.t
1652 ; CHECK-NEXT:    vor.vv v8, v8, v12, v0.t
1653 ; CHECK-NEXT:    vsrl.vi v12, v8, 4, v0.t
1654 ; CHECK-NEXT:    vor.vv v8, v8, v12, v0.t
1655 ; CHECK-NEXT:    vnot.v v8, v8, v0.t
1656 ; CHECK-NEXT:    vsrl.vi v12, v8, 1, v0.t
1657 ; CHECK-NEXT:    li a0, 85
1658 ; CHECK-NEXT:    vand.vx v12, v12, a0, v0.t
1659 ; CHECK-NEXT:    vsub.vv v8, v8, v12, v0.t
1660 ; CHECK-NEXT:    li a0, 51
1661 ; CHECK-NEXT:    vand.vx v12, v8, a0, v0.t
1662 ; CHECK-NEXT:    vsrl.vi v8, v8, 2, v0.t
1663 ; CHECK-NEXT:    vand.vx v8, v8, a0, v0.t
1664 ; CHECK-NEXT:    vadd.vv v8, v12, v8, v0.t
1665 ; CHECK-NEXT:    vsrl.vi v12, v8, 4, v0.t
1666 ; CHECK-NEXT:    vadd.vv v8, v8, v12, v0.t
1667 ; CHECK-NEXT:    vand.vi v8, v8, 15, v0.t
1668 ; CHECK-NEXT:    ret
1670 ; CHECK-ZVBB-LABEL: vp_ctlz_zero_undef_nxv32i8:
1671 ; CHECK-ZVBB:       # %bb.0:
1672 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e8, m4, ta, ma
1673 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8, v0.t
1674 ; CHECK-ZVBB-NEXT:    ret
1675   %v = call <vscale x 32 x i8> @llvm.vp.ctlz.nxv32i8(<vscale x 32 x i8> %va, i1 true, <vscale x 32 x i1> %m, i32 %evl)
1676   ret <vscale x 32 x i8> %v
1679 define <vscale x 32 x i8> @vp_ctlz_zero_undef_nxv32i8_unmasked(<vscale x 32 x i8> %va, i32 zeroext %evl) {
1680 ; CHECK-LABEL: vp_ctlz_zero_undef_nxv32i8_unmasked:
1681 ; CHECK:       # %bb.0:
1682 ; CHECK-NEXT:    vsetvli zero, a0, e8, m4, ta, ma
1683 ; CHECK-NEXT:    vsrl.vi v12, v8, 1
1684 ; CHECK-NEXT:    vor.vv v8, v8, v12
1685 ; CHECK-NEXT:    vsrl.vi v12, v8, 2
1686 ; CHECK-NEXT:    vor.vv v8, v8, v12
1687 ; CHECK-NEXT:    vsrl.vi v12, v8, 4
1688 ; CHECK-NEXT:    vor.vv v8, v8, v12
1689 ; CHECK-NEXT:    vnot.v v8, v8
1690 ; CHECK-NEXT:    vsrl.vi v12, v8, 1
1691 ; CHECK-NEXT:    li a0, 85
1692 ; CHECK-NEXT:    vand.vx v12, v12, a0
1693 ; CHECK-NEXT:    vsub.vv v8, v8, v12
1694 ; CHECK-NEXT:    li a0, 51
1695 ; CHECK-NEXT:    vand.vx v12, v8, a0
1696 ; CHECK-NEXT:    vsrl.vi v8, v8, 2
1697 ; CHECK-NEXT:    vand.vx v8, v8, a0
1698 ; CHECK-NEXT:    vadd.vv v8, v12, v8
1699 ; CHECK-NEXT:    vsrl.vi v12, v8, 4
1700 ; CHECK-NEXT:    vadd.vv v8, v8, v12
1701 ; CHECK-NEXT:    vand.vi v8, v8, 15
1702 ; CHECK-NEXT:    ret
1704 ; CHECK-ZVBB-LABEL: vp_ctlz_zero_undef_nxv32i8_unmasked:
1705 ; CHECK-ZVBB:       # %bb.0:
1706 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e8, m4, ta, ma
1707 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
1708 ; CHECK-ZVBB-NEXT:    ret
1709   %head = insertelement <vscale x 32 x i1> poison, i1 true, i32 0
1710   %m = shufflevector <vscale x 32 x i1> %head, <vscale x 32 x i1> poison, <vscale x 32 x i32> zeroinitializer
1711   %v = call <vscale x 32 x i8> @llvm.vp.ctlz.nxv32i8(<vscale x 32 x i8> %va, i1 true, <vscale x 32 x i1> %m, i32 %evl)
1712   ret <vscale x 32 x i8> %v
1716 define <vscale x 64 x i8> @vp_ctlz_zero_undef_nxv64i8(<vscale x 64 x i8> %va, <vscale x 64 x i1> %m, i32 zeroext %evl) {
1717 ; CHECK-LABEL: vp_ctlz_zero_undef_nxv64i8:
1718 ; CHECK:       # %bb.0:
1719 ; CHECK-NEXT:    vsetvli zero, a0, e8, m8, ta, ma
1720 ; CHECK-NEXT:    vsrl.vi v16, v8, 1, v0.t
1721 ; CHECK-NEXT:    vor.vv v8, v8, v16, v0.t
1722 ; CHECK-NEXT:    vsrl.vi v16, v8, 2, v0.t
1723 ; CHECK-NEXT:    vor.vv v8, v8, v16, v0.t
1724 ; CHECK-NEXT:    vsrl.vi v16, v8, 4, v0.t
1725 ; CHECK-NEXT:    vor.vv v8, v8, v16, v0.t
1726 ; CHECK-NEXT:    vnot.v v8, v8, v0.t
1727 ; CHECK-NEXT:    vsrl.vi v16, v8, 1, v0.t
1728 ; CHECK-NEXT:    li a0, 85
1729 ; CHECK-NEXT:    vand.vx v16, v16, a0, v0.t
1730 ; CHECK-NEXT:    vsub.vv v8, v8, v16, v0.t
1731 ; CHECK-NEXT:    li a0, 51
1732 ; CHECK-NEXT:    vand.vx v16, v8, a0, v0.t
1733 ; CHECK-NEXT:    vsrl.vi v8, v8, 2, v0.t
1734 ; CHECK-NEXT:    vand.vx v8, v8, a0, v0.t
1735 ; CHECK-NEXT:    vadd.vv v8, v16, v8, v0.t
1736 ; CHECK-NEXT:    vsrl.vi v16, v8, 4, v0.t
1737 ; CHECK-NEXT:    vadd.vv v8, v8, v16, v0.t
1738 ; CHECK-NEXT:    vand.vi v8, v8, 15, v0.t
1739 ; CHECK-NEXT:    ret
1741 ; CHECK-ZVBB-LABEL: vp_ctlz_zero_undef_nxv64i8:
1742 ; CHECK-ZVBB:       # %bb.0:
1743 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e8, m8, ta, ma
1744 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8, v0.t
1745 ; CHECK-ZVBB-NEXT:    ret
1746   %v = call <vscale x 64 x i8> @llvm.vp.ctlz.nxv64i8(<vscale x 64 x i8> %va, i1 true, <vscale x 64 x i1> %m, i32 %evl)
1747   ret <vscale x 64 x i8> %v
1750 define <vscale x 64 x i8> @vp_ctlz_zero_undef_nxv64i8_unmasked(<vscale x 64 x i8> %va, i32 zeroext %evl) {
1751 ; CHECK-LABEL: vp_ctlz_zero_undef_nxv64i8_unmasked:
1752 ; CHECK:       # %bb.0:
1753 ; CHECK-NEXT:    vsetvli zero, a0, e8, m8, ta, ma
1754 ; CHECK-NEXT:    vsrl.vi v16, v8, 1
1755 ; CHECK-NEXT:    vor.vv v8, v8, v16
1756 ; CHECK-NEXT:    vsrl.vi v16, v8, 2
1757 ; CHECK-NEXT:    vor.vv v8, v8, v16
1758 ; CHECK-NEXT:    vsrl.vi v16, v8, 4
1759 ; CHECK-NEXT:    vor.vv v8, v8, v16
1760 ; CHECK-NEXT:    vnot.v v8, v8
1761 ; CHECK-NEXT:    vsrl.vi v16, v8, 1
1762 ; CHECK-NEXT:    li a0, 85
1763 ; CHECK-NEXT:    vand.vx v16, v16, a0
1764 ; CHECK-NEXT:    vsub.vv v8, v8, v16
1765 ; CHECK-NEXT:    li a0, 51
1766 ; CHECK-NEXT:    vand.vx v16, v8, a0
1767 ; CHECK-NEXT:    vsrl.vi v8, v8, 2
1768 ; CHECK-NEXT:    vand.vx v8, v8, a0
1769 ; CHECK-NEXT:    vadd.vv v8, v16, v8
1770 ; CHECK-NEXT:    vsrl.vi v16, v8, 4
1771 ; CHECK-NEXT:    vadd.vv v8, v8, v16
1772 ; CHECK-NEXT:    vand.vi v8, v8, 15
1773 ; CHECK-NEXT:    ret
1775 ; CHECK-ZVBB-LABEL: vp_ctlz_zero_undef_nxv64i8_unmasked:
1776 ; CHECK-ZVBB:       # %bb.0:
1777 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e8, m8, ta, ma
1778 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
1779 ; CHECK-ZVBB-NEXT:    ret
1780   %head = insertelement <vscale x 64 x i1> poison, i1 true, i32 0
1781   %m = shufflevector <vscale x 64 x i1> %head, <vscale x 64 x i1> poison, <vscale x 64 x i32> zeroinitializer
1782   %v = call <vscale x 64 x i8> @llvm.vp.ctlz.nxv64i8(<vscale x 64 x i8> %va, i1 true, <vscale x 64 x i1> %m, i32 %evl)
1783   ret <vscale x 64 x i8> %v
1787 define <vscale x 1 x i16> @vp_ctlz_zero_undef_nxv1i16(<vscale x 1 x i16> %va, <vscale x 1 x i1> %m, i32 zeroext %evl) {
1788 ; CHECK-LABEL: vp_ctlz_zero_undef_nxv1i16:
1789 ; CHECK:       # %bb.0:
1790 ; CHECK-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
1791 ; CHECK-NEXT:    vfwcvt.f.xu.v v9, v8, v0.t
1792 ; CHECK-NEXT:    vsetvli zero, zero, e32, mf2, ta, ma
1793 ; CHECK-NEXT:    vsrl.vi v8, v9, 23, v0.t
1794 ; CHECK-NEXT:    vsetvli zero, zero, e16, mf4, ta, ma
1795 ; CHECK-NEXT:    vnsrl.wi v8, v8, 0, v0.t
1796 ; CHECK-NEXT:    li a0, 142
1797 ; CHECK-NEXT:    vrsub.vx v8, v8, a0, v0.t
1798 ; CHECK-NEXT:    ret
1800 ; CHECK-ZVBB-LABEL: vp_ctlz_zero_undef_nxv1i16:
1801 ; CHECK-ZVBB:       # %bb.0:
1802 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
1803 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8, v0.t
1804 ; CHECK-ZVBB-NEXT:    ret
1805   %v = call <vscale x 1 x i16> @llvm.vp.ctlz.nxv1i16(<vscale x 1 x i16> %va, i1 true, <vscale x 1 x i1> %m, i32 %evl)
1806   ret <vscale x 1 x i16> %v
1809 define <vscale x 1 x i16> @vp_ctlz_zero_undef_nxv1i16_unmasked(<vscale x 1 x i16> %va, i32 zeroext %evl) {
1810 ; CHECK-LABEL: vp_ctlz_zero_undef_nxv1i16_unmasked:
1811 ; CHECK:       # %bb.0:
1812 ; CHECK-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
1813 ; CHECK-NEXT:    vfwcvt.f.xu.v v9, v8
1814 ; CHECK-NEXT:    vnsrl.wi v8, v9, 23
1815 ; CHECK-NEXT:    li a0, 142
1816 ; CHECK-NEXT:    vrsub.vx v8, v8, a0
1817 ; CHECK-NEXT:    ret
1819 ; CHECK-ZVBB-LABEL: vp_ctlz_zero_undef_nxv1i16_unmasked:
1820 ; CHECK-ZVBB:       # %bb.0:
1821 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
1822 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
1823 ; CHECK-ZVBB-NEXT:    ret
1824   %head = insertelement <vscale x 1 x i1> poison, i1 true, i32 0
1825   %m = shufflevector <vscale x 1 x i1> %head, <vscale x 1 x i1> poison, <vscale x 1 x i32> zeroinitializer
1826   %v = call <vscale x 1 x i16> @llvm.vp.ctlz.nxv1i16(<vscale x 1 x i16> %va, i1 true, <vscale x 1 x i1> %m, i32 %evl)
1827   ret <vscale x 1 x i16> %v
1831 define <vscale x 2 x i16> @vp_ctlz_zero_undef_nxv2i16(<vscale x 2 x i16> %va, <vscale x 2 x i1> %m, i32 zeroext %evl) {
1832 ; CHECK-LABEL: vp_ctlz_zero_undef_nxv2i16:
1833 ; CHECK:       # %bb.0:
1834 ; CHECK-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
1835 ; CHECK-NEXT:    vfwcvt.f.xu.v v9, v8, v0.t
1836 ; CHECK-NEXT:    vsetvli zero, zero, e32, m1, ta, ma
1837 ; CHECK-NEXT:    vsrl.vi v8, v9, 23, v0.t
1838 ; CHECK-NEXT:    vsetvli zero, zero, e16, mf2, ta, ma
1839 ; CHECK-NEXT:    vnsrl.wi v8, v8, 0, v0.t
1840 ; CHECK-NEXT:    li a0, 142
1841 ; CHECK-NEXT:    vrsub.vx v8, v8, a0, v0.t
1842 ; CHECK-NEXT:    ret
1844 ; CHECK-ZVBB-LABEL: vp_ctlz_zero_undef_nxv2i16:
1845 ; CHECK-ZVBB:       # %bb.0:
1846 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
1847 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8, v0.t
1848 ; CHECK-ZVBB-NEXT:    ret
1849   %v = call <vscale x 2 x i16> @llvm.vp.ctlz.nxv2i16(<vscale x 2 x i16> %va, i1 true, <vscale x 2 x i1> %m, i32 %evl)
1850   ret <vscale x 2 x i16> %v
1853 define <vscale x 2 x i16> @vp_ctlz_zero_undef_nxv2i16_unmasked(<vscale x 2 x i16> %va, i32 zeroext %evl) {
1854 ; CHECK-LABEL: vp_ctlz_zero_undef_nxv2i16_unmasked:
1855 ; CHECK:       # %bb.0:
1856 ; CHECK-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
1857 ; CHECK-NEXT:    vfwcvt.f.xu.v v9, v8
1858 ; CHECK-NEXT:    vnsrl.wi v8, v9, 23
1859 ; CHECK-NEXT:    li a0, 142
1860 ; CHECK-NEXT:    vrsub.vx v8, v8, a0
1861 ; CHECK-NEXT:    ret
1863 ; CHECK-ZVBB-LABEL: vp_ctlz_zero_undef_nxv2i16_unmasked:
1864 ; CHECK-ZVBB:       # %bb.0:
1865 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
1866 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
1867 ; CHECK-ZVBB-NEXT:    ret
1868   %head = insertelement <vscale x 2 x i1> poison, i1 true, i32 0
1869   %m = shufflevector <vscale x 2 x i1> %head, <vscale x 2 x i1> poison, <vscale x 2 x i32> zeroinitializer
1870   %v = call <vscale x 2 x i16> @llvm.vp.ctlz.nxv2i16(<vscale x 2 x i16> %va, i1 true, <vscale x 2 x i1> %m, i32 %evl)
1871   ret <vscale x 2 x i16> %v
1875 define <vscale x 4 x i16> @vp_ctlz_zero_undef_nxv4i16(<vscale x 4 x i16> %va, <vscale x 4 x i1> %m, i32 zeroext %evl) {
1876 ; CHECK-LABEL: vp_ctlz_zero_undef_nxv4i16:
1877 ; CHECK:       # %bb.0:
1878 ; CHECK-NEXT:    vsetvli zero, a0, e16, m1, ta, ma
1879 ; CHECK-NEXT:    vfwcvt.f.xu.v v10, v8, v0.t
1880 ; CHECK-NEXT:    vsetvli zero, zero, e32, m2, ta, ma
1881 ; CHECK-NEXT:    vsrl.vi v8, v10, 23, v0.t
1882 ; CHECK-NEXT:    vsetvli zero, zero, e16, m1, ta, ma
1883 ; CHECK-NEXT:    vnsrl.wi v10, v8, 0, v0.t
1884 ; CHECK-NEXT:    li a0, 142
1885 ; CHECK-NEXT:    vrsub.vx v8, v10, a0, v0.t
1886 ; CHECK-NEXT:    ret
1888 ; CHECK-ZVBB-LABEL: vp_ctlz_zero_undef_nxv4i16:
1889 ; CHECK-ZVBB:       # %bb.0:
1890 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e16, m1, ta, ma
1891 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8, v0.t
1892 ; CHECK-ZVBB-NEXT:    ret
1893   %v = call <vscale x 4 x i16> @llvm.vp.ctlz.nxv4i16(<vscale x 4 x i16> %va, i1 true, <vscale x 4 x i1> %m, i32 %evl)
1894   ret <vscale x 4 x i16> %v
1897 define <vscale x 4 x i16> @vp_ctlz_zero_undef_nxv4i16_unmasked(<vscale x 4 x i16> %va, i32 zeroext %evl) {
1898 ; CHECK-LABEL: vp_ctlz_zero_undef_nxv4i16_unmasked:
1899 ; CHECK:       # %bb.0:
1900 ; CHECK-NEXT:    vsetvli zero, a0, e16, m1, ta, ma
1901 ; CHECK-NEXT:    vfwcvt.f.xu.v v10, v8
1902 ; CHECK-NEXT:    vnsrl.wi v8, v10, 23
1903 ; CHECK-NEXT:    li a0, 142
1904 ; CHECK-NEXT:    vrsub.vx v8, v8, a0
1905 ; CHECK-NEXT:    ret
1907 ; CHECK-ZVBB-LABEL: vp_ctlz_zero_undef_nxv4i16_unmasked:
1908 ; CHECK-ZVBB:       # %bb.0:
1909 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e16, m1, ta, ma
1910 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
1911 ; CHECK-ZVBB-NEXT:    ret
1912   %head = insertelement <vscale x 4 x i1> poison, i1 true, i32 0
1913   %m = shufflevector <vscale x 4 x i1> %head, <vscale x 4 x i1> poison, <vscale x 4 x i32> zeroinitializer
1914   %v = call <vscale x 4 x i16> @llvm.vp.ctlz.nxv4i16(<vscale x 4 x i16> %va, i1 true, <vscale x 4 x i1> %m, i32 %evl)
1915   ret <vscale x 4 x i16> %v
1919 define <vscale x 8 x i16> @vp_ctlz_zero_undef_nxv8i16(<vscale x 8 x i16> %va, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1920 ; CHECK-LABEL: vp_ctlz_zero_undef_nxv8i16:
1921 ; CHECK:       # %bb.0:
1922 ; CHECK-NEXT:    vsetvli zero, a0, e16, m2, ta, ma
1923 ; CHECK-NEXT:    vfwcvt.f.xu.v v12, v8, v0.t
1924 ; CHECK-NEXT:    vsetvli zero, zero, e32, m4, ta, ma
1925 ; CHECK-NEXT:    vsrl.vi v8, v12, 23, v0.t
1926 ; CHECK-NEXT:    vsetvli zero, zero, e16, m2, ta, ma
1927 ; CHECK-NEXT:    vnsrl.wi v12, v8, 0, v0.t
1928 ; CHECK-NEXT:    li a0, 142
1929 ; CHECK-NEXT:    vrsub.vx v8, v12, a0, v0.t
1930 ; CHECK-NEXT:    ret
1932 ; CHECK-ZVBB-LABEL: vp_ctlz_zero_undef_nxv8i16:
1933 ; CHECK-ZVBB:       # %bb.0:
1934 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e16, m2, ta, ma
1935 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8, v0.t
1936 ; CHECK-ZVBB-NEXT:    ret
1937   %v = call <vscale x 8 x i16> @llvm.vp.ctlz.nxv8i16(<vscale x 8 x i16> %va, i1 true, <vscale x 8 x i1> %m, i32 %evl)
1938   ret <vscale x 8 x i16> %v
1941 define <vscale x 8 x i16> @vp_ctlz_zero_undef_nxv8i16_unmasked(<vscale x 8 x i16> %va, i32 zeroext %evl) {
1942 ; CHECK-LABEL: vp_ctlz_zero_undef_nxv8i16_unmasked:
1943 ; CHECK:       # %bb.0:
1944 ; CHECK-NEXT:    vsetvli zero, a0, e16, m2, ta, ma
1945 ; CHECK-NEXT:    vfwcvt.f.xu.v v12, v8
1946 ; CHECK-NEXT:    vnsrl.wi v8, v12, 23
1947 ; CHECK-NEXT:    li a0, 142
1948 ; CHECK-NEXT:    vrsub.vx v8, v8, a0
1949 ; CHECK-NEXT:    ret
1951 ; CHECK-ZVBB-LABEL: vp_ctlz_zero_undef_nxv8i16_unmasked:
1952 ; CHECK-ZVBB:       # %bb.0:
1953 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e16, m2, ta, ma
1954 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
1955 ; CHECK-ZVBB-NEXT:    ret
1956   %head = insertelement <vscale x 8 x i1> poison, i1 true, i32 0
1957   %m = shufflevector <vscale x 8 x i1> %head, <vscale x 8 x i1> poison, <vscale x 8 x i32> zeroinitializer
1958   %v = call <vscale x 8 x i16> @llvm.vp.ctlz.nxv8i16(<vscale x 8 x i16> %va, i1 true, <vscale x 8 x i1> %m, i32 %evl)
1959   ret <vscale x 8 x i16> %v
1963 define <vscale x 16 x i16> @vp_ctlz_zero_undef_nxv16i16(<vscale x 16 x i16> %va, <vscale x 16 x i1> %m, i32 zeroext %evl) {
1964 ; CHECK-LABEL: vp_ctlz_zero_undef_nxv16i16:
1965 ; CHECK:       # %bb.0:
1966 ; CHECK-NEXT:    vsetvli zero, a0, e16, m4, ta, ma
1967 ; CHECK-NEXT:    vfwcvt.f.xu.v v16, v8, v0.t
1968 ; CHECK-NEXT:    vsetvli zero, zero, e32, m8, ta, ma
1969 ; CHECK-NEXT:    vsrl.vi v8, v16, 23, v0.t
1970 ; CHECK-NEXT:    vsetvli zero, zero, e16, m4, ta, ma
1971 ; CHECK-NEXT:    vnsrl.wi v16, v8, 0, v0.t
1972 ; CHECK-NEXT:    li a0, 142
1973 ; CHECK-NEXT:    vrsub.vx v8, v16, a0, v0.t
1974 ; CHECK-NEXT:    ret
1976 ; CHECK-ZVBB-LABEL: vp_ctlz_zero_undef_nxv16i16:
1977 ; CHECK-ZVBB:       # %bb.0:
1978 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e16, m4, ta, ma
1979 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8, v0.t
1980 ; CHECK-ZVBB-NEXT:    ret
1981   %v = call <vscale x 16 x i16> @llvm.vp.ctlz.nxv16i16(<vscale x 16 x i16> %va, i1 true, <vscale x 16 x i1> %m, i32 %evl)
1982   ret <vscale x 16 x i16> %v
1985 define <vscale x 16 x i16> @vp_ctlz_zero_undef_nxv16i16_unmasked(<vscale x 16 x i16> %va, i32 zeroext %evl) {
1986 ; CHECK-LABEL: vp_ctlz_zero_undef_nxv16i16_unmasked:
1987 ; CHECK:       # %bb.0:
1988 ; CHECK-NEXT:    vsetvli zero, a0, e16, m4, ta, ma
1989 ; CHECK-NEXT:    vfwcvt.f.xu.v v16, v8
1990 ; CHECK-NEXT:    vnsrl.wi v8, v16, 23
1991 ; CHECK-NEXT:    li a0, 142
1992 ; CHECK-NEXT:    vrsub.vx v8, v8, a0
1993 ; CHECK-NEXT:    ret
1995 ; CHECK-ZVBB-LABEL: vp_ctlz_zero_undef_nxv16i16_unmasked:
1996 ; CHECK-ZVBB:       # %bb.0:
1997 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e16, m4, ta, ma
1998 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
1999 ; CHECK-ZVBB-NEXT:    ret
2000   %head = insertelement <vscale x 16 x i1> poison, i1 true, i32 0
2001   %m = shufflevector <vscale x 16 x i1> %head, <vscale x 16 x i1> poison, <vscale x 16 x i32> zeroinitializer
2002   %v = call <vscale x 16 x i16> @llvm.vp.ctlz.nxv16i16(<vscale x 16 x i16> %va, i1 true, <vscale x 16 x i1> %m, i32 %evl)
2003   ret <vscale x 16 x i16> %v
2007 define <vscale x 32 x i16> @vp_ctlz_zero_undef_nxv32i16(<vscale x 32 x i16> %va, <vscale x 32 x i1> %m, i32 zeroext %evl) {
2008 ; CHECK-LABEL: vp_ctlz_zero_undef_nxv32i16:
2009 ; CHECK:       # %bb.0:
2010 ; CHECK-NEXT:    vsetvli zero, a0, e16, m8, ta, ma
2011 ; CHECK-NEXT:    vsrl.vi v16, v8, 1, v0.t
2012 ; CHECK-NEXT:    vor.vv v8, v8, v16, v0.t
2013 ; CHECK-NEXT:    vsrl.vi v16, v8, 2, v0.t
2014 ; CHECK-NEXT:    vor.vv v8, v8, v16, v0.t
2015 ; CHECK-NEXT:    vsrl.vi v16, v8, 4, v0.t
2016 ; CHECK-NEXT:    vor.vv v8, v8, v16, v0.t
2017 ; CHECK-NEXT:    vsrl.vi v16, v8, 8, v0.t
2018 ; CHECK-NEXT:    vor.vv v8, v8, v16, v0.t
2019 ; CHECK-NEXT:    vnot.v v8, v8, v0.t
2020 ; CHECK-NEXT:    vsrl.vi v16, v8, 1, v0.t
2021 ; CHECK-NEXT:    lui a0, 5
2022 ; CHECK-NEXT:    addi a0, a0, 1365
2023 ; CHECK-NEXT:    vand.vx v16, v16, a0, v0.t
2024 ; CHECK-NEXT:    vsub.vv v8, v8, v16, v0.t
2025 ; CHECK-NEXT:    lui a0, 3
2026 ; CHECK-NEXT:    addi a0, a0, 819
2027 ; CHECK-NEXT:    vand.vx v16, v8, a0, v0.t
2028 ; CHECK-NEXT:    vsrl.vi v8, v8, 2, v0.t
2029 ; CHECK-NEXT:    vand.vx v8, v8, a0, v0.t
2030 ; CHECK-NEXT:    vadd.vv v8, v16, v8, v0.t
2031 ; CHECK-NEXT:    vsrl.vi v16, v8, 4, v0.t
2032 ; CHECK-NEXT:    vadd.vv v8, v8, v16, v0.t
2033 ; CHECK-NEXT:    lui a0, 1
2034 ; CHECK-NEXT:    addi a0, a0, -241
2035 ; CHECK-NEXT:    vand.vx v8, v8, a0, v0.t
2036 ; CHECK-NEXT:    li a0, 257
2037 ; CHECK-NEXT:    vmul.vx v8, v8, a0, v0.t
2038 ; CHECK-NEXT:    vsrl.vi v8, v8, 8, v0.t
2039 ; CHECK-NEXT:    ret
2041 ; CHECK-ZVBB-LABEL: vp_ctlz_zero_undef_nxv32i16:
2042 ; CHECK-ZVBB:       # %bb.0:
2043 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e16, m8, ta, ma
2044 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8, v0.t
2045 ; CHECK-ZVBB-NEXT:    ret
2046   %v = call <vscale x 32 x i16> @llvm.vp.ctlz.nxv32i16(<vscale x 32 x i16> %va, i1 true, <vscale x 32 x i1> %m, i32 %evl)
2047   ret <vscale x 32 x i16> %v
2050 define <vscale x 32 x i16> @vp_ctlz_zero_undef_nxv32i16_unmasked(<vscale x 32 x i16> %va, i32 zeroext %evl) {
2051 ; CHECK-LABEL: vp_ctlz_zero_undef_nxv32i16_unmasked:
2052 ; CHECK:       # %bb.0:
2053 ; CHECK-NEXT:    vsetvli zero, a0, e16, m8, ta, ma
2054 ; CHECK-NEXT:    vsrl.vi v16, v8, 1
2055 ; CHECK-NEXT:    vor.vv v8, v8, v16
2056 ; CHECK-NEXT:    vsrl.vi v16, v8, 2
2057 ; CHECK-NEXT:    vor.vv v8, v8, v16
2058 ; CHECK-NEXT:    vsrl.vi v16, v8, 4
2059 ; CHECK-NEXT:    vor.vv v8, v8, v16
2060 ; CHECK-NEXT:    vsrl.vi v16, v8, 8
2061 ; CHECK-NEXT:    vor.vv v8, v8, v16
2062 ; CHECK-NEXT:    vnot.v v8, v8
2063 ; CHECK-NEXT:    vsrl.vi v16, v8, 1
2064 ; CHECK-NEXT:    lui a0, 5
2065 ; CHECK-NEXT:    addi a0, a0, 1365
2066 ; CHECK-NEXT:    vand.vx v16, v16, a0
2067 ; CHECK-NEXT:    vsub.vv v8, v8, v16
2068 ; CHECK-NEXT:    lui a0, 3
2069 ; CHECK-NEXT:    addi a0, a0, 819
2070 ; CHECK-NEXT:    vand.vx v16, v8, a0
2071 ; CHECK-NEXT:    vsrl.vi v8, v8, 2
2072 ; CHECK-NEXT:    vand.vx v8, v8, a0
2073 ; CHECK-NEXT:    vadd.vv v8, v16, v8
2074 ; CHECK-NEXT:    vsrl.vi v16, v8, 4
2075 ; CHECK-NEXT:    vadd.vv v8, v8, v16
2076 ; CHECK-NEXT:    lui a0, 1
2077 ; CHECK-NEXT:    addi a0, a0, -241
2078 ; CHECK-NEXT:    vand.vx v8, v8, a0
2079 ; CHECK-NEXT:    li a0, 257
2080 ; CHECK-NEXT:    vmul.vx v8, v8, a0
2081 ; CHECK-NEXT:    vsrl.vi v8, v8, 8
2082 ; CHECK-NEXT:    ret
2084 ; CHECK-ZVBB-LABEL: vp_ctlz_zero_undef_nxv32i16_unmasked:
2085 ; CHECK-ZVBB:       # %bb.0:
2086 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e16, m8, ta, ma
2087 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
2088 ; CHECK-ZVBB-NEXT:    ret
2089   %head = insertelement <vscale x 32 x i1> poison, i1 true, i32 0
2090   %m = shufflevector <vscale x 32 x i1> %head, <vscale x 32 x i1> poison, <vscale x 32 x i32> zeroinitializer
2091   %v = call <vscale x 32 x i16> @llvm.vp.ctlz.nxv32i16(<vscale x 32 x i16> %va, i1 true, <vscale x 32 x i1> %m, i32 %evl)
2092   ret <vscale x 32 x i16> %v
2096 define <vscale x 1 x i32> @vp_ctlz_zero_undef_nxv1i32(<vscale x 1 x i32> %va, <vscale x 1 x i1> %m, i32 zeroext %evl) {
2097 ; CHECK-LABEL: vp_ctlz_zero_undef_nxv1i32:
2098 ; CHECK:       # %bb.0:
2099 ; CHECK-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
2100 ; CHECK-NEXT:    vfwcvt.f.xu.v v9, v8, v0.t
2101 ; CHECK-NEXT:    li a0, 52
2102 ; CHECK-NEXT:    vsetvli zero, zero, e64, m1, ta, ma
2103 ; CHECK-NEXT:    vsrl.vx v8, v9, a0, v0.t
2104 ; CHECK-NEXT:    vsetvli zero, zero, e32, mf2, ta, ma
2105 ; CHECK-NEXT:    vnsrl.wi v8, v8, 0, v0.t
2106 ; CHECK-NEXT:    li a0, 1054
2107 ; CHECK-NEXT:    vrsub.vx v8, v8, a0, v0.t
2108 ; CHECK-NEXT:    ret
2110 ; CHECK-ZVBB-LABEL: vp_ctlz_zero_undef_nxv1i32:
2111 ; CHECK-ZVBB:       # %bb.0:
2112 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
2113 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8, v0.t
2114 ; CHECK-ZVBB-NEXT:    ret
2115   %v = call <vscale x 1 x i32> @llvm.vp.ctlz.nxv1i32(<vscale x 1 x i32> %va, i1 true, <vscale x 1 x i1> %m, i32 %evl)
2116   ret <vscale x 1 x i32> %v
2119 define <vscale x 1 x i32> @vp_ctlz_zero_undef_nxv1i32_unmasked(<vscale x 1 x i32> %va, i32 zeroext %evl) {
2120 ; CHECK-LABEL: vp_ctlz_zero_undef_nxv1i32_unmasked:
2121 ; CHECK:       # %bb.0:
2122 ; CHECK-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
2123 ; CHECK-NEXT:    vfwcvt.f.xu.v v9, v8
2124 ; CHECK-NEXT:    li a0, 52
2125 ; CHECK-NEXT:    vnsrl.wx v8, v9, a0
2126 ; CHECK-NEXT:    li a0, 1054
2127 ; CHECK-NEXT:    vrsub.vx v8, v8, a0
2128 ; CHECK-NEXT:    ret
2130 ; CHECK-ZVBB-LABEL: vp_ctlz_zero_undef_nxv1i32_unmasked:
2131 ; CHECK-ZVBB:       # %bb.0:
2132 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
2133 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
2134 ; CHECK-ZVBB-NEXT:    ret
2135   %head = insertelement <vscale x 1 x i1> poison, i1 true, i32 0
2136   %m = shufflevector <vscale x 1 x i1> %head, <vscale x 1 x i1> poison, <vscale x 1 x i32> zeroinitializer
2137   %v = call <vscale x 1 x i32> @llvm.vp.ctlz.nxv1i32(<vscale x 1 x i32> %va, i1 true, <vscale x 1 x i1> %m, i32 %evl)
2138   ret <vscale x 1 x i32> %v
2142 define <vscale x 2 x i32> @vp_ctlz_zero_undef_nxv2i32(<vscale x 2 x i32> %va, <vscale x 2 x i1> %m, i32 zeroext %evl) {
2143 ; CHECK-LABEL: vp_ctlz_zero_undef_nxv2i32:
2144 ; CHECK:       # %bb.0:
2145 ; CHECK-NEXT:    vsetvli zero, a0, e32, m1, ta, ma
2146 ; CHECK-NEXT:    vfwcvt.f.xu.v v10, v8, v0.t
2147 ; CHECK-NEXT:    li a0, 52
2148 ; CHECK-NEXT:    vsetvli zero, zero, e64, m2, ta, ma
2149 ; CHECK-NEXT:    vsrl.vx v8, v10, a0, v0.t
2150 ; CHECK-NEXT:    vsetvli zero, zero, e32, m1, ta, ma
2151 ; CHECK-NEXT:    vnsrl.wi v10, v8, 0, v0.t
2152 ; CHECK-NEXT:    li a0, 1054
2153 ; CHECK-NEXT:    vrsub.vx v8, v10, a0, v0.t
2154 ; CHECK-NEXT:    ret
2156 ; CHECK-ZVBB-LABEL: vp_ctlz_zero_undef_nxv2i32:
2157 ; CHECK-ZVBB:       # %bb.0:
2158 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e32, m1, ta, ma
2159 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8, v0.t
2160 ; CHECK-ZVBB-NEXT:    ret
2161   %v = call <vscale x 2 x i32> @llvm.vp.ctlz.nxv2i32(<vscale x 2 x i32> %va, i1 true, <vscale x 2 x i1> %m, i32 %evl)
2162   ret <vscale x 2 x i32> %v
2165 define <vscale x 2 x i32> @vp_ctlz_zero_undef_nxv2i32_unmasked(<vscale x 2 x i32> %va, i32 zeroext %evl) {
2166 ; CHECK-LABEL: vp_ctlz_zero_undef_nxv2i32_unmasked:
2167 ; CHECK:       # %bb.0:
2168 ; CHECK-NEXT:    vsetvli zero, a0, e32, m1, ta, ma
2169 ; CHECK-NEXT:    vfwcvt.f.xu.v v10, v8
2170 ; CHECK-NEXT:    li a0, 52
2171 ; CHECK-NEXT:    vnsrl.wx v8, v10, a0
2172 ; CHECK-NEXT:    li a0, 1054
2173 ; CHECK-NEXT:    vrsub.vx v8, v8, a0
2174 ; CHECK-NEXT:    ret
2176 ; CHECK-ZVBB-LABEL: vp_ctlz_zero_undef_nxv2i32_unmasked:
2177 ; CHECK-ZVBB:       # %bb.0:
2178 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e32, m1, ta, ma
2179 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
2180 ; CHECK-ZVBB-NEXT:    ret
2181   %head = insertelement <vscale x 2 x i1> poison, i1 true, i32 0
2182   %m = shufflevector <vscale x 2 x i1> %head, <vscale x 2 x i1> poison, <vscale x 2 x i32> zeroinitializer
2183   %v = call <vscale x 2 x i32> @llvm.vp.ctlz.nxv2i32(<vscale x 2 x i32> %va, i1 true, <vscale x 2 x i1> %m, i32 %evl)
2184   ret <vscale x 2 x i32> %v
2188 define <vscale x 4 x i32> @vp_ctlz_zero_undef_nxv4i32(<vscale x 4 x i32> %va, <vscale x 4 x i1> %m, i32 zeroext %evl) {
2189 ; CHECK-LABEL: vp_ctlz_zero_undef_nxv4i32:
2190 ; CHECK:       # %bb.0:
2191 ; CHECK-NEXT:    vsetvli zero, a0, e32, m2, ta, ma
2192 ; CHECK-NEXT:    vfwcvt.f.xu.v v12, v8, v0.t
2193 ; CHECK-NEXT:    li a0, 52
2194 ; CHECK-NEXT:    vsetvli zero, zero, e64, m4, ta, ma
2195 ; CHECK-NEXT:    vsrl.vx v8, v12, a0, v0.t
2196 ; CHECK-NEXT:    vsetvli zero, zero, e32, m2, ta, ma
2197 ; CHECK-NEXT:    vnsrl.wi v12, v8, 0, v0.t
2198 ; CHECK-NEXT:    li a0, 1054
2199 ; CHECK-NEXT:    vrsub.vx v8, v12, a0, v0.t
2200 ; CHECK-NEXT:    ret
2202 ; CHECK-ZVBB-LABEL: vp_ctlz_zero_undef_nxv4i32:
2203 ; CHECK-ZVBB:       # %bb.0:
2204 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e32, m2, ta, ma
2205 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8, v0.t
2206 ; CHECK-ZVBB-NEXT:    ret
2207   %v = call <vscale x 4 x i32> @llvm.vp.ctlz.nxv4i32(<vscale x 4 x i32> %va, i1 true, <vscale x 4 x i1> %m, i32 %evl)
2208   ret <vscale x 4 x i32> %v
2211 define <vscale x 4 x i32> @vp_ctlz_zero_undef_nxv4i32_unmasked(<vscale x 4 x i32> %va, i32 zeroext %evl) {
2212 ; CHECK-LABEL: vp_ctlz_zero_undef_nxv4i32_unmasked:
2213 ; CHECK:       # %bb.0:
2214 ; CHECK-NEXT:    vsetvli zero, a0, e32, m2, ta, ma
2215 ; CHECK-NEXT:    vfwcvt.f.xu.v v12, v8
2216 ; CHECK-NEXT:    li a0, 52
2217 ; CHECK-NEXT:    vnsrl.wx v8, v12, a0
2218 ; CHECK-NEXT:    li a0, 1054
2219 ; CHECK-NEXT:    vrsub.vx v8, v8, a0
2220 ; CHECK-NEXT:    ret
2222 ; CHECK-ZVBB-LABEL: vp_ctlz_zero_undef_nxv4i32_unmasked:
2223 ; CHECK-ZVBB:       # %bb.0:
2224 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e32, m2, ta, ma
2225 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
2226 ; CHECK-ZVBB-NEXT:    ret
2227   %head = insertelement <vscale x 4 x i1> poison, i1 true, i32 0
2228   %m = shufflevector <vscale x 4 x i1> %head, <vscale x 4 x i1> poison, <vscale x 4 x i32> zeroinitializer
2229   %v = call <vscale x 4 x i32> @llvm.vp.ctlz.nxv4i32(<vscale x 4 x i32> %va, i1 true, <vscale x 4 x i1> %m, i32 %evl)
2230   ret <vscale x 4 x i32> %v
2234 define <vscale x 8 x i32> @vp_ctlz_zero_undef_nxv8i32(<vscale x 8 x i32> %va, <vscale x 8 x i1> %m, i32 zeroext %evl) {
2235 ; CHECK-LABEL: vp_ctlz_zero_undef_nxv8i32:
2236 ; CHECK:       # %bb.0:
2237 ; CHECK-NEXT:    vsetvli zero, a0, e32, m4, ta, ma
2238 ; CHECK-NEXT:    vfwcvt.f.xu.v v16, v8, v0.t
2239 ; CHECK-NEXT:    li a0, 52
2240 ; CHECK-NEXT:    vsetvli zero, zero, e64, m8, ta, ma
2241 ; CHECK-NEXT:    vsrl.vx v8, v16, a0, v0.t
2242 ; CHECK-NEXT:    vsetvli zero, zero, e32, m4, ta, ma
2243 ; CHECK-NEXT:    vnsrl.wi v16, v8, 0, v0.t
2244 ; CHECK-NEXT:    li a0, 1054
2245 ; CHECK-NEXT:    vrsub.vx v8, v16, a0, v0.t
2246 ; CHECK-NEXT:    ret
2248 ; CHECK-ZVBB-LABEL: vp_ctlz_zero_undef_nxv8i32:
2249 ; CHECK-ZVBB:       # %bb.0:
2250 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e32, m4, ta, ma
2251 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8, v0.t
2252 ; CHECK-ZVBB-NEXT:    ret
2253   %v = call <vscale x 8 x i32> @llvm.vp.ctlz.nxv8i32(<vscale x 8 x i32> %va, i1 true, <vscale x 8 x i1> %m, i32 %evl)
2254   ret <vscale x 8 x i32> %v
2257 define <vscale x 8 x i32> @vp_ctlz_zero_undef_nxv8i32_unmasked(<vscale x 8 x i32> %va, i32 zeroext %evl) {
2258 ; CHECK-LABEL: vp_ctlz_zero_undef_nxv8i32_unmasked:
2259 ; CHECK:       # %bb.0:
2260 ; CHECK-NEXT:    vsetvli zero, a0, e32, m4, ta, ma
2261 ; CHECK-NEXT:    vfwcvt.f.xu.v v16, v8
2262 ; CHECK-NEXT:    li a0, 52
2263 ; CHECK-NEXT:    vnsrl.wx v8, v16, a0
2264 ; CHECK-NEXT:    li a0, 1054
2265 ; CHECK-NEXT:    vrsub.vx v8, v8, a0
2266 ; CHECK-NEXT:    ret
2268 ; CHECK-ZVBB-LABEL: vp_ctlz_zero_undef_nxv8i32_unmasked:
2269 ; CHECK-ZVBB:       # %bb.0:
2270 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e32, m4, ta, ma
2271 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
2272 ; CHECK-ZVBB-NEXT:    ret
2273   %head = insertelement <vscale x 8 x i1> poison, i1 true, i32 0
2274   %m = shufflevector <vscale x 8 x i1> %head, <vscale x 8 x i1> poison, <vscale x 8 x i32> zeroinitializer
2275   %v = call <vscale x 8 x i32> @llvm.vp.ctlz.nxv8i32(<vscale x 8 x i32> %va, i1 true, <vscale x 8 x i1> %m, i32 %evl)
2276   ret <vscale x 8 x i32> %v
2280 define <vscale x 16 x i32> @vp_ctlz_zero_undef_nxv16i32(<vscale x 16 x i32> %va, <vscale x 16 x i1> %m, i32 zeroext %evl) {
2281 ; CHECK-LABEL: vp_ctlz_zero_undef_nxv16i32:
2282 ; CHECK:       # %bb.0:
2283 ; CHECK-NEXT:    vsetvli zero, a0, e32, m8, ta, ma
2284 ; CHECK-NEXT:    fsrmi a0, 1
2285 ; CHECK-NEXT:    vfcvt.f.xu.v v8, v8, v0.t
2286 ; CHECK-NEXT:    vsrl.vi v8, v8, 23, v0.t
2287 ; CHECK-NEXT:    li a1, 158
2288 ; CHECK-NEXT:    vrsub.vx v8, v8, a1, v0.t
2289 ; CHECK-NEXT:    fsrm a0
2290 ; CHECK-NEXT:    ret
2292 ; CHECK-ZVBB-LABEL: vp_ctlz_zero_undef_nxv16i32:
2293 ; CHECK-ZVBB:       # %bb.0:
2294 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e32, m8, ta, ma
2295 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8, v0.t
2296 ; CHECK-ZVBB-NEXT:    ret
2297   %v = call <vscale x 16 x i32> @llvm.vp.ctlz.nxv16i32(<vscale x 16 x i32> %va, i1 true, <vscale x 16 x i1> %m, i32 %evl)
2298   ret <vscale x 16 x i32> %v
2301 define <vscale x 16 x i32> @vp_ctlz_zero_undef_nxv16i32_unmasked(<vscale x 16 x i32> %va, i32 zeroext %evl) {
2302 ; CHECK-LABEL: vp_ctlz_zero_undef_nxv16i32_unmasked:
2303 ; CHECK:       # %bb.0:
2304 ; CHECK-NEXT:    vsetvli zero, a0, e32, m8, ta, ma
2305 ; CHECK-NEXT:    fsrmi a0, 1
2306 ; CHECK-NEXT:    vfcvt.f.xu.v v8, v8
2307 ; CHECK-NEXT:    vsrl.vi v8, v8, 23
2308 ; CHECK-NEXT:    li a1, 158
2309 ; CHECK-NEXT:    vrsub.vx v8, v8, a1
2310 ; CHECK-NEXT:    fsrm a0
2311 ; CHECK-NEXT:    ret
2313 ; CHECK-ZVBB-LABEL: vp_ctlz_zero_undef_nxv16i32_unmasked:
2314 ; CHECK-ZVBB:       # %bb.0:
2315 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e32, m8, ta, ma
2316 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
2317 ; CHECK-ZVBB-NEXT:    ret
2318   %head = insertelement <vscale x 16 x i1> poison, i1 true, i32 0
2319   %m = shufflevector <vscale x 16 x i1> %head, <vscale x 16 x i1> poison, <vscale x 16 x i32> zeroinitializer
2320   %v = call <vscale x 16 x i32> @llvm.vp.ctlz.nxv16i32(<vscale x 16 x i32> %va, i1 true, <vscale x 16 x i1> %m, i32 %evl)
2321   ret <vscale x 16 x i32> %v
2325 define <vscale x 1 x i64> @vp_ctlz_zero_undef_nxv1i64(<vscale x 1 x i64> %va, <vscale x 1 x i1> %m, i32 zeroext %evl) {
2326 ; CHECK-LABEL: vp_ctlz_zero_undef_nxv1i64:
2327 ; CHECK:       # %bb.0:
2328 ; CHECK-NEXT:    vsetvli zero, a0, e64, m1, ta, ma
2329 ; CHECK-NEXT:    fsrmi a0, 1
2330 ; CHECK-NEXT:    vfcvt.f.xu.v v8, v8, v0.t
2331 ; CHECK-NEXT:    li a1, 52
2332 ; CHECK-NEXT:    vsrl.vx v8, v8, a1, v0.t
2333 ; CHECK-NEXT:    li a1, 1086
2334 ; CHECK-NEXT:    vrsub.vx v8, v8, a1, v0.t
2335 ; CHECK-NEXT:    fsrm a0
2336 ; CHECK-NEXT:    ret
2338 ; CHECK-ZVBB-LABEL: vp_ctlz_zero_undef_nxv1i64:
2339 ; CHECK-ZVBB:       # %bb.0:
2340 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e64, m1, ta, ma
2341 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8, v0.t
2342 ; CHECK-ZVBB-NEXT:    ret
2343   %v = call <vscale x 1 x i64> @llvm.vp.ctlz.nxv1i64(<vscale x 1 x i64> %va, i1 true, <vscale x 1 x i1> %m, i32 %evl)
2344   ret <vscale x 1 x i64> %v
2347 define <vscale x 1 x i64> @vp_ctlz_zero_undef_nxv1i64_unmasked(<vscale x 1 x i64> %va, i32 zeroext %evl) {
2348 ; CHECK-LABEL: vp_ctlz_zero_undef_nxv1i64_unmasked:
2349 ; CHECK:       # %bb.0:
2350 ; CHECK-NEXT:    vsetvli zero, a0, e64, m1, ta, ma
2351 ; CHECK-NEXT:    fsrmi a0, 1
2352 ; CHECK-NEXT:    vfcvt.f.xu.v v8, v8
2353 ; CHECK-NEXT:    li a1, 52
2354 ; CHECK-NEXT:    vsrl.vx v8, v8, a1
2355 ; CHECK-NEXT:    li a1, 1086
2356 ; CHECK-NEXT:    vrsub.vx v8, v8, a1
2357 ; CHECK-NEXT:    fsrm a0
2358 ; CHECK-NEXT:    ret
2360 ; CHECK-ZVBB-LABEL: vp_ctlz_zero_undef_nxv1i64_unmasked:
2361 ; CHECK-ZVBB:       # %bb.0:
2362 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e64, m1, ta, ma
2363 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
2364 ; CHECK-ZVBB-NEXT:    ret
2365   %head = insertelement <vscale x 1 x i1> poison, i1 true, i32 0
2366   %m = shufflevector <vscale x 1 x i1> %head, <vscale x 1 x i1> poison, <vscale x 1 x i32> zeroinitializer
2367   %v = call <vscale x 1 x i64> @llvm.vp.ctlz.nxv1i64(<vscale x 1 x i64> %va, i1 true, <vscale x 1 x i1> %m, i32 %evl)
2368   ret <vscale x 1 x i64> %v
2372 define <vscale x 2 x i64> @vp_ctlz_zero_undef_nxv2i64(<vscale x 2 x i64> %va, <vscale x 2 x i1> %m, i32 zeroext %evl) {
2373 ; CHECK-LABEL: vp_ctlz_zero_undef_nxv2i64:
2374 ; CHECK:       # %bb.0:
2375 ; CHECK-NEXT:    vsetvli zero, a0, e64, m2, ta, ma
2376 ; CHECK-NEXT:    fsrmi a0, 1
2377 ; CHECK-NEXT:    vfcvt.f.xu.v v8, v8, v0.t
2378 ; CHECK-NEXT:    li a1, 52
2379 ; CHECK-NEXT:    vsrl.vx v8, v8, a1, v0.t
2380 ; CHECK-NEXT:    li a1, 1086
2381 ; CHECK-NEXT:    vrsub.vx v8, v8, a1, v0.t
2382 ; CHECK-NEXT:    fsrm a0
2383 ; CHECK-NEXT:    ret
2385 ; CHECK-ZVBB-LABEL: vp_ctlz_zero_undef_nxv2i64:
2386 ; CHECK-ZVBB:       # %bb.0:
2387 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e64, m2, ta, ma
2388 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8, v0.t
2389 ; CHECK-ZVBB-NEXT:    ret
2390   %v = call <vscale x 2 x i64> @llvm.vp.ctlz.nxv2i64(<vscale x 2 x i64> %va, i1 true, <vscale x 2 x i1> %m, i32 %evl)
2391   ret <vscale x 2 x i64> %v
2394 define <vscale x 2 x i64> @vp_ctlz_zero_undef_nxv2i64_unmasked(<vscale x 2 x i64> %va, i32 zeroext %evl) {
2395 ; CHECK-LABEL: vp_ctlz_zero_undef_nxv2i64_unmasked:
2396 ; CHECK:       # %bb.0:
2397 ; CHECK-NEXT:    vsetvli zero, a0, e64, m2, ta, ma
2398 ; CHECK-NEXT:    fsrmi a0, 1
2399 ; CHECK-NEXT:    vfcvt.f.xu.v v8, v8
2400 ; CHECK-NEXT:    li a1, 52
2401 ; CHECK-NEXT:    vsrl.vx v8, v8, a1
2402 ; CHECK-NEXT:    li a1, 1086
2403 ; CHECK-NEXT:    vrsub.vx v8, v8, a1
2404 ; CHECK-NEXT:    fsrm a0
2405 ; CHECK-NEXT:    ret
2407 ; CHECK-ZVBB-LABEL: vp_ctlz_zero_undef_nxv2i64_unmasked:
2408 ; CHECK-ZVBB:       # %bb.0:
2409 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e64, m2, ta, ma
2410 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
2411 ; CHECK-ZVBB-NEXT:    ret
2412   %head = insertelement <vscale x 2 x i1> poison, i1 true, i32 0
2413   %m = shufflevector <vscale x 2 x i1> %head, <vscale x 2 x i1> poison, <vscale x 2 x i32> zeroinitializer
2414   %v = call <vscale x 2 x i64> @llvm.vp.ctlz.nxv2i64(<vscale x 2 x i64> %va, i1 true, <vscale x 2 x i1> %m, i32 %evl)
2415   ret <vscale x 2 x i64> %v
2419 define <vscale x 4 x i64> @vp_ctlz_zero_undef_nxv4i64(<vscale x 4 x i64> %va, <vscale x 4 x i1> %m, i32 zeroext %evl) {
2420 ; CHECK-LABEL: vp_ctlz_zero_undef_nxv4i64:
2421 ; CHECK:       # %bb.0:
2422 ; CHECK-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
2423 ; CHECK-NEXT:    fsrmi a0, 1
2424 ; CHECK-NEXT:    vfcvt.f.xu.v v8, v8, v0.t
2425 ; CHECK-NEXT:    li a1, 52
2426 ; CHECK-NEXT:    vsrl.vx v8, v8, a1, v0.t
2427 ; CHECK-NEXT:    li a1, 1086
2428 ; CHECK-NEXT:    vrsub.vx v8, v8, a1, v0.t
2429 ; CHECK-NEXT:    fsrm a0
2430 ; CHECK-NEXT:    ret
2432 ; CHECK-ZVBB-LABEL: vp_ctlz_zero_undef_nxv4i64:
2433 ; CHECK-ZVBB:       # %bb.0:
2434 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
2435 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8, v0.t
2436 ; CHECK-ZVBB-NEXT:    ret
2437   %v = call <vscale x 4 x i64> @llvm.vp.ctlz.nxv4i64(<vscale x 4 x i64> %va, i1 true, <vscale x 4 x i1> %m, i32 %evl)
2438   ret <vscale x 4 x i64> %v
2441 define <vscale x 4 x i64> @vp_ctlz_zero_undef_nxv4i64_unmasked(<vscale x 4 x i64> %va, i32 zeroext %evl) {
2442 ; CHECK-LABEL: vp_ctlz_zero_undef_nxv4i64_unmasked:
2443 ; CHECK:       # %bb.0:
2444 ; CHECK-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
2445 ; CHECK-NEXT:    fsrmi a0, 1
2446 ; CHECK-NEXT:    vfcvt.f.xu.v v8, v8
2447 ; CHECK-NEXT:    li a1, 52
2448 ; CHECK-NEXT:    vsrl.vx v8, v8, a1
2449 ; CHECK-NEXT:    li a1, 1086
2450 ; CHECK-NEXT:    vrsub.vx v8, v8, a1
2451 ; CHECK-NEXT:    fsrm a0
2452 ; CHECK-NEXT:    ret
2454 ; CHECK-ZVBB-LABEL: vp_ctlz_zero_undef_nxv4i64_unmasked:
2455 ; CHECK-ZVBB:       # %bb.0:
2456 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
2457 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
2458 ; CHECK-ZVBB-NEXT:    ret
2459   %head = insertelement <vscale x 4 x i1> poison, i1 true, i32 0
2460   %m = shufflevector <vscale x 4 x i1> %head, <vscale x 4 x i1> poison, <vscale x 4 x i32> zeroinitializer
2461   %v = call <vscale x 4 x i64> @llvm.vp.ctlz.nxv4i64(<vscale x 4 x i64> %va, i1 true, <vscale x 4 x i1> %m, i32 %evl)
2462   ret <vscale x 4 x i64> %v
2466 define <vscale x 7 x i64> @vp_ctlz_zero_undef_nxv7i64(<vscale x 7 x i64> %va, <vscale x 7 x i1> %m, i32 zeroext %evl) {
2467 ; CHECK-LABEL: vp_ctlz_zero_undef_nxv7i64:
2468 ; CHECK:       # %bb.0:
2469 ; CHECK-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
2470 ; CHECK-NEXT:    fsrmi a0, 1
2471 ; CHECK-NEXT:    vfcvt.f.xu.v v8, v8, v0.t
2472 ; CHECK-NEXT:    li a1, 52
2473 ; CHECK-NEXT:    vsrl.vx v8, v8, a1, v0.t
2474 ; CHECK-NEXT:    li a1, 1086
2475 ; CHECK-NEXT:    vrsub.vx v8, v8, a1, v0.t
2476 ; CHECK-NEXT:    fsrm a0
2477 ; CHECK-NEXT:    ret
2479 ; CHECK-ZVBB-LABEL: vp_ctlz_zero_undef_nxv7i64:
2480 ; CHECK-ZVBB:       # %bb.0:
2481 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
2482 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8, v0.t
2483 ; CHECK-ZVBB-NEXT:    ret
2484   %v = call <vscale x 7 x i64> @llvm.vp.ctlz.nxv7i64(<vscale x 7 x i64> %va, i1 true, <vscale x 7 x i1> %m, i32 %evl)
2485   ret <vscale x 7 x i64> %v
2488 define <vscale x 7 x i64> @vp_ctlz_zero_undef_nxv7i64_unmasked(<vscale x 7 x i64> %va, i32 zeroext %evl) {
2489 ; CHECK-LABEL: vp_ctlz_zero_undef_nxv7i64_unmasked:
2490 ; CHECK:       # %bb.0:
2491 ; CHECK-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
2492 ; CHECK-NEXT:    fsrmi a0, 1
2493 ; CHECK-NEXT:    vfcvt.f.xu.v v8, v8
2494 ; CHECK-NEXT:    li a1, 52
2495 ; CHECK-NEXT:    vsrl.vx v8, v8, a1
2496 ; CHECK-NEXT:    li a1, 1086
2497 ; CHECK-NEXT:    vrsub.vx v8, v8, a1
2498 ; CHECK-NEXT:    fsrm a0
2499 ; CHECK-NEXT:    ret
2501 ; CHECK-ZVBB-LABEL: vp_ctlz_zero_undef_nxv7i64_unmasked:
2502 ; CHECK-ZVBB:       # %bb.0:
2503 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
2504 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
2505 ; CHECK-ZVBB-NEXT:    ret
2506   %head = insertelement <vscale x 7 x i1> poison, i1 true, i32 0
2507   %m = shufflevector <vscale x 7 x i1> %head, <vscale x 7 x i1> poison, <vscale x 7 x i32> zeroinitializer
2508   %v = call <vscale x 7 x i64> @llvm.vp.ctlz.nxv7i64(<vscale x 7 x i64> %va, i1 true, <vscale x 7 x i1> %m, i32 %evl)
2509   ret <vscale x 7 x i64> %v
2513 define <vscale x 8 x i64> @vp_ctlz_zero_undef_nxv8i64(<vscale x 8 x i64> %va, <vscale x 8 x i1> %m, i32 zeroext %evl) {
2514 ; CHECK-LABEL: vp_ctlz_zero_undef_nxv8i64:
2515 ; CHECK:       # %bb.0:
2516 ; CHECK-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
2517 ; CHECK-NEXT:    fsrmi a0, 1
2518 ; CHECK-NEXT:    vfcvt.f.xu.v v8, v8, v0.t
2519 ; CHECK-NEXT:    li a1, 52
2520 ; CHECK-NEXT:    vsrl.vx v8, v8, a1, v0.t
2521 ; CHECK-NEXT:    li a1, 1086
2522 ; CHECK-NEXT:    vrsub.vx v8, v8, a1, v0.t
2523 ; CHECK-NEXT:    fsrm a0
2524 ; CHECK-NEXT:    ret
2526 ; CHECK-ZVBB-LABEL: vp_ctlz_zero_undef_nxv8i64:
2527 ; CHECK-ZVBB:       # %bb.0:
2528 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
2529 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8, v0.t
2530 ; CHECK-ZVBB-NEXT:    ret
2531   %v = call <vscale x 8 x i64> @llvm.vp.ctlz.nxv8i64(<vscale x 8 x i64> %va, i1 true, <vscale x 8 x i1> %m, i32 %evl)
2532   ret <vscale x 8 x i64> %v
2535 define <vscale x 8 x i64> @vp_ctlz_zero_undef_nxv8i64_unmasked(<vscale x 8 x i64> %va, i32 zeroext %evl) {
2536 ; CHECK-LABEL: vp_ctlz_zero_undef_nxv8i64_unmasked:
2537 ; CHECK:       # %bb.0:
2538 ; CHECK-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
2539 ; CHECK-NEXT:    fsrmi a0, 1
2540 ; CHECK-NEXT:    vfcvt.f.xu.v v8, v8
2541 ; CHECK-NEXT:    li a1, 52
2542 ; CHECK-NEXT:    vsrl.vx v8, v8, a1
2543 ; CHECK-NEXT:    li a1, 1086
2544 ; CHECK-NEXT:    vrsub.vx v8, v8, a1
2545 ; CHECK-NEXT:    fsrm a0
2546 ; CHECK-NEXT:    ret
2548 ; CHECK-ZVBB-LABEL: vp_ctlz_zero_undef_nxv8i64_unmasked:
2549 ; CHECK-ZVBB:       # %bb.0:
2550 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
2551 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
2552 ; CHECK-ZVBB-NEXT:    ret
2553   %head = insertelement <vscale x 8 x i1> poison, i1 true, i32 0
2554   %m = shufflevector <vscale x 8 x i1> %head, <vscale x 8 x i1> poison, <vscale x 8 x i32> zeroinitializer
2555   %v = call <vscale x 8 x i64> @llvm.vp.ctlz.nxv8i64(<vscale x 8 x i64> %va, i1 true, <vscale x 8 x i1> %m, i32 %evl)
2556   ret <vscale x 8 x i64> %v
2559 define <vscale x 16 x i64> @vp_ctlz_zero_undef_nxv16i64(<vscale x 16 x i64> %va, <vscale x 16 x i1> %m, i32 zeroext %evl) {
2560 ; CHECK-LABEL: vp_ctlz_zero_undef_nxv16i64:
2561 ; CHECK:       # %bb.0:
2562 ; CHECK-NEXT:    vmv1r.v v24, v0
2563 ; CHECK-NEXT:    csrr a1, vlenb
2564 ; CHECK-NEXT:    srli a2, a1, 3
2565 ; CHECK-NEXT:    vsetvli a3, zero, e8, mf4, ta, ma
2566 ; CHECK-NEXT:    vslidedown.vx v0, v0, a2
2567 ; CHECK-NEXT:    sub a2, a0, a1
2568 ; CHECK-NEXT:    sltu a3, a0, a2
2569 ; CHECK-NEXT:    addi a3, a3, -1
2570 ; CHECK-NEXT:    and a2, a3, a2
2571 ; CHECK-NEXT:    vsetvli zero, a2, e64, m8, ta, ma
2572 ; CHECK-NEXT:    fsrmi a2, 1
2573 ; CHECK-NEXT:    vfcvt.f.xu.v v16, v16, v0.t
2574 ; CHECK-NEXT:    fsrm a2
2575 ; CHECK-NEXT:    li a2, 52
2576 ; CHECK-NEXT:    vsrl.vx v16, v16, a2, v0.t
2577 ; CHECK-NEXT:    li a3, 1086
2578 ; CHECK-NEXT:    vrsub.vx v16, v16, a3, v0.t
2579 ; CHECK-NEXT:    bltu a0, a1, .LBB94_2
2580 ; CHECK-NEXT:  # %bb.1:
2581 ; CHECK-NEXT:    mv a0, a1
2582 ; CHECK-NEXT:  .LBB94_2:
2583 ; CHECK-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
2584 ; CHECK-NEXT:    fsrmi a0, 1
2585 ; CHECK-NEXT:    vmv1r.v v0, v24
2586 ; CHECK-NEXT:    vfcvt.f.xu.v v8, v8, v0.t
2587 ; CHECK-NEXT:    vsrl.vx v8, v8, a2, v0.t
2588 ; CHECK-NEXT:    vrsub.vx v8, v8, a3, v0.t
2589 ; CHECK-NEXT:    fsrm a0
2590 ; CHECK-NEXT:    ret
2592 ; CHECK-ZVBB-LABEL: vp_ctlz_zero_undef_nxv16i64:
2593 ; CHECK-ZVBB:       # %bb.0:
2594 ; CHECK-ZVBB-NEXT:    vmv1r.v v24, v0
2595 ; CHECK-ZVBB-NEXT:    csrr a1, vlenb
2596 ; CHECK-ZVBB-NEXT:    srli a2, a1, 3
2597 ; CHECK-ZVBB-NEXT:    vsetvli a3, zero, e8, mf4, ta, ma
2598 ; CHECK-ZVBB-NEXT:    vslidedown.vx v0, v0, a2
2599 ; CHECK-ZVBB-NEXT:    sub a2, a0, a1
2600 ; CHECK-ZVBB-NEXT:    sltu a3, a0, a2
2601 ; CHECK-ZVBB-NEXT:    addi a3, a3, -1
2602 ; CHECK-ZVBB-NEXT:    and a2, a3, a2
2603 ; CHECK-ZVBB-NEXT:    vsetvli zero, a2, e64, m8, ta, ma
2604 ; CHECK-ZVBB-NEXT:    vclz.v v16, v16, v0.t
2605 ; CHECK-ZVBB-NEXT:    bltu a0, a1, .LBB94_2
2606 ; CHECK-ZVBB-NEXT:  # %bb.1:
2607 ; CHECK-ZVBB-NEXT:    mv a0, a1
2608 ; CHECK-ZVBB-NEXT:  .LBB94_2:
2609 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
2610 ; CHECK-ZVBB-NEXT:    vmv1r.v v0, v24
2611 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8, v0.t
2612 ; CHECK-ZVBB-NEXT:    ret
2613   %v = call <vscale x 16 x i64> @llvm.vp.ctlz.nxv16i64(<vscale x 16 x i64> %va, i1 true, <vscale x 16 x i1> %m, i32 %evl)
2614   ret <vscale x 16 x i64> %v
2617 define <vscale x 16 x i64> @vp_ctlz_zero_undef_nxv16i64_unmasked(<vscale x 16 x i64> %va, i32 zeroext %evl) {
2618 ; CHECK-LABEL: vp_ctlz_zero_undef_nxv16i64_unmasked:
2619 ; CHECK:       # %bb.0:
2620 ; CHECK-NEXT:    csrr a1, vlenb
2621 ; CHECK-NEXT:    sub a2, a0, a1
2622 ; CHECK-NEXT:    sltu a3, a0, a2
2623 ; CHECK-NEXT:    addi a3, a3, -1
2624 ; CHECK-NEXT:    and a2, a3, a2
2625 ; CHECK-NEXT:    vsetvli zero, a2, e64, m8, ta, ma
2626 ; CHECK-NEXT:    fsrmi a2, 1
2627 ; CHECK-NEXT:    vfcvt.f.xu.v v16, v16
2628 ; CHECK-NEXT:    fsrm a2
2629 ; CHECK-NEXT:    li a2, 52
2630 ; CHECK-NEXT:    vsrl.vx v16, v16, a2
2631 ; CHECK-NEXT:    li a3, 1086
2632 ; CHECK-NEXT:    vrsub.vx v16, v16, a3
2633 ; CHECK-NEXT:    bltu a0, a1, .LBB95_2
2634 ; CHECK-NEXT:  # %bb.1:
2635 ; CHECK-NEXT:    mv a0, a1
2636 ; CHECK-NEXT:  .LBB95_2:
2637 ; CHECK-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
2638 ; CHECK-NEXT:    fsrmi a0, 1
2639 ; CHECK-NEXT:    vfcvt.f.xu.v v8, v8
2640 ; CHECK-NEXT:    vsrl.vx v8, v8, a2
2641 ; CHECK-NEXT:    vrsub.vx v8, v8, a3
2642 ; CHECK-NEXT:    fsrm a0
2643 ; CHECK-NEXT:    ret
2645 ; CHECK-ZVBB-LABEL: vp_ctlz_zero_undef_nxv16i64_unmasked:
2646 ; CHECK-ZVBB:       # %bb.0:
2647 ; CHECK-ZVBB-NEXT:    csrr a1, vlenb
2648 ; CHECK-ZVBB-NEXT:    sub a2, a0, a1
2649 ; CHECK-ZVBB-NEXT:    sltu a3, a0, a2
2650 ; CHECK-ZVBB-NEXT:    addi a3, a3, -1
2651 ; CHECK-ZVBB-NEXT:    and a2, a3, a2
2652 ; CHECK-ZVBB-NEXT:    vsetvli zero, a2, e64, m8, ta, ma
2653 ; CHECK-ZVBB-NEXT:    vclz.v v16, v16
2654 ; CHECK-ZVBB-NEXT:    bltu a0, a1, .LBB95_2
2655 ; CHECK-ZVBB-NEXT:  # %bb.1:
2656 ; CHECK-ZVBB-NEXT:    mv a0, a1
2657 ; CHECK-ZVBB-NEXT:  .LBB95_2:
2658 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
2659 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
2660 ; CHECK-ZVBB-NEXT:    ret
2661   %head = insertelement <vscale x 16 x i1> poison, i1 true, i32 0
2662   %m = shufflevector <vscale x 16 x i1> %head, <vscale x 16 x i1> poison, <vscale x 16 x i32> zeroinitializer
2663   %v = call <vscale x 16 x i64> @llvm.vp.ctlz.nxv16i64(<vscale x 16 x i64> %va, i1 true, <vscale x 16 x i1> %m, i32 %evl)
2664   ret <vscale x 16 x i64> %v
2667 ; Test promotion.
2668 declare <vscale x 1 x i9> @llvm.vp.ctlz.nxv1i9(<vscale x 1 x i9>, i1 immarg, <vscale x 1 x i1>, i32)
2669 define <vscale x 1 x i9> @vp_ctlz_nxv1i9(<vscale x 1 x i9> %va, <vscale x 1 x i1> %m, i32 zeroext %evl) {
2670 ; CHECK-LABEL: vp_ctlz_nxv1i9:
2671 ; CHECK:       # %bb.0:
2672 ; CHECK-NEXT:    li a1, 511
2673 ; CHECK-NEXT:    vsetvli a2, zero, e16, mf4, ta, ma
2674 ; CHECK-NEXT:    vand.vx v8, v8, a1
2675 ; CHECK-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
2676 ; CHECK-NEXT:    vfwcvt.f.xu.v v9, v8, v0.t
2677 ; CHECK-NEXT:    vsetvli zero, zero, e32, mf2, ta, ma
2678 ; CHECK-NEXT:    vsrl.vi v8, v9, 23, v0.t
2679 ; CHECK-NEXT:    vsetvli zero, zero, e16, mf4, ta, ma
2680 ; CHECK-NEXT:    vnsrl.wi v8, v8, 0, v0.t
2681 ; CHECK-NEXT:    li a0, 142
2682 ; CHECK-NEXT:    vrsub.vx v8, v8, a0, v0.t
2683 ; CHECK-NEXT:    li a0, 16
2684 ; CHECK-NEXT:    vminu.vx v8, v8, a0, v0.t
2685 ; CHECK-NEXT:    li a0, 7
2686 ; CHECK-NEXT:    vsub.vx v8, v8, a0, v0.t
2687 ; CHECK-NEXT:    ret
2689 ; CHECK-ZVBB-LABEL: vp_ctlz_nxv1i9:
2690 ; CHECK-ZVBB:       # %bb.0:
2691 ; CHECK-ZVBB-NEXT:    li a1, 511
2692 ; CHECK-ZVBB-NEXT:    vsetvli a2, zero, e16, mf4, ta, ma
2693 ; CHECK-ZVBB-NEXT:    vand.vx v8, v8, a1
2694 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
2695 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8, v0.t
2696 ; CHECK-ZVBB-NEXT:    li a0, 7
2697 ; CHECK-ZVBB-NEXT:    vsub.vx v8, v8, a0, v0.t
2698 ; CHECK-ZVBB-NEXT:    ret
2699   %v = call <vscale x 1 x i9> @llvm.vp.ctlz.nxv1i9(<vscale x 1 x i9> %va, i1 false, <vscale x 1 x i1> %m, i32 %evl)
2700   ret <vscale x 1 x i9> %v
2702 define <vscale x 1 x i9> @vp_ctlz_zero_undef_nxv1i9(<vscale x 1 x i9> %va, <vscale x 1 x i1> %m, i32 zeroext %evl) {
2703 ; CHECK-LABEL: vp_ctlz_zero_undef_nxv1i9:
2704 ; CHECK:       # %bb.0:
2705 ; CHECK-NEXT:    li a1, 511
2706 ; CHECK-NEXT:    vsetvli a2, zero, e16, mf4, ta, ma
2707 ; CHECK-NEXT:    vand.vx v8, v8, a1
2708 ; CHECK-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
2709 ; CHECK-NEXT:    vfwcvt.f.xu.v v9, v8, v0.t
2710 ; CHECK-NEXT:    vsetvli zero, zero, e32, mf2, ta, ma
2711 ; CHECK-NEXT:    vsrl.vi v8, v9, 23, v0.t
2712 ; CHECK-NEXT:    vsetvli zero, zero, e16, mf4, ta, ma
2713 ; CHECK-NEXT:    vnsrl.wi v8, v8, 0, v0.t
2714 ; CHECK-NEXT:    li a0, 142
2715 ; CHECK-NEXT:    vrsub.vx v8, v8, a0, v0.t
2716 ; CHECK-NEXT:    li a0, 7
2717 ; CHECK-NEXT:    vsub.vx v8, v8, a0, v0.t
2718 ; CHECK-NEXT:    ret
2720 ; CHECK-ZVBB-LABEL: vp_ctlz_zero_undef_nxv1i9:
2721 ; CHECK-ZVBB:       # %bb.0:
2722 ; CHECK-ZVBB-NEXT:    li a1, 511
2723 ; CHECK-ZVBB-NEXT:    vsetvli a2, zero, e16, mf4, ta, ma
2724 ; CHECK-ZVBB-NEXT:    vand.vx v8, v8, a1
2725 ; CHECK-ZVBB-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
2726 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8, v0.t
2727 ; CHECK-ZVBB-NEXT:    li a0, 7
2728 ; CHECK-ZVBB-NEXT:    vsub.vx v8, v8, a0, v0.t
2729 ; CHECK-ZVBB-NEXT:    ret
2730   %v = call <vscale x 1 x i9> @llvm.vp.ctlz.nxv1i9(<vscale x 1 x i9> %va, i1 true, <vscale x 1 x i1> %m, i32 %evl)
2731   ret <vscale x 1 x i9> %v
2733 ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
2734 ; RV32: {{.*}}
2735 ; RV64: {{.*}}