Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / CodeGen / RISCV / rvv / ctlz-sdnode.ll
blobd51f5eacd7d91a90dd26aa125bfba866d7ff9eff
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv32 -mattr=+zve64x -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,CHECK-ZVE64X,RV32,RV32I
3 ; RUN: llc -mtriple=riscv64 -mattr=+zve64x -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,CHECK-ZVE64X,RV64,RV64I
4 ; RUN: llc -mtriple=riscv32 -mattr=+zve64f,+f -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,CHECK-F,RV32F
5 ; RUN: llc -mtriple=riscv64 -mattr=+zve64f,+f -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,CHECK-F,RV64F
6 ; RUN: llc -mtriple=riscv32 -mattr=+v,+d -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,CHECK-D,RV32
7 ; RUN: llc -mtriple=riscv64 -mattr=+v,+d -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,CHECK-D,RV64
8 ; RUN: llc -mtriple=riscv32 -mattr=+v,+zvbb -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK-ZVBB
9 ; RUN: llc -mtriple=riscv64 -mattr=+v,+zvbb -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK-ZVBB
11 define <vscale x 1 x i8> @ctlz_nxv1i8(<vscale x 1 x i8> %va) {
12 ; CHECK-ZVE64X-LABEL: ctlz_nxv1i8:
13 ; CHECK-ZVE64X:       # %bb.0:
14 ; CHECK-ZVE64X-NEXT:    vsetvli a0, zero, e8, mf8, ta, ma
15 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 1
16 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
17 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 2
18 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
19 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 4
20 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
21 ; CHECK-ZVE64X-NEXT:    vnot.v v8, v8
22 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 1
23 ; CHECK-ZVE64X-NEXT:    li a0, 85
24 ; CHECK-ZVE64X-NEXT:    vand.vx v9, v9, a0
25 ; CHECK-ZVE64X-NEXT:    vsub.vv v8, v8, v9
26 ; CHECK-ZVE64X-NEXT:    li a0, 51
27 ; CHECK-ZVE64X-NEXT:    vand.vx v9, v8, a0
28 ; CHECK-ZVE64X-NEXT:    vsrl.vi v8, v8, 2
29 ; CHECK-ZVE64X-NEXT:    vand.vx v8, v8, a0
30 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v9, v8
31 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 4
32 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v8, v9
33 ; CHECK-ZVE64X-NEXT:    vand.vi v8, v8, 15
34 ; CHECK-ZVE64X-NEXT:    ret
36 ; CHECK-F-LABEL: ctlz_nxv1i8:
37 ; CHECK-F:       # %bb.0:
38 ; CHECK-F-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
39 ; CHECK-F-NEXT:    vzext.vf2 v9, v8
40 ; CHECK-F-NEXT:    vfwcvt.f.xu.v v8, v9
41 ; CHECK-F-NEXT:    vnsrl.wi v8, v8, 23
42 ; CHECK-F-NEXT:    vsetvli zero, zero, e8, mf8, ta, ma
43 ; CHECK-F-NEXT:    vnsrl.wi v8, v8, 0
44 ; CHECK-F-NEXT:    li a0, 134
45 ; CHECK-F-NEXT:    vrsub.vx v8, v8, a0
46 ; CHECK-F-NEXT:    li a0, 8
47 ; CHECK-F-NEXT:    vminu.vx v8, v8, a0
48 ; CHECK-F-NEXT:    ret
50 ; CHECK-D-LABEL: ctlz_nxv1i8:
51 ; CHECK-D:       # %bb.0:
52 ; CHECK-D-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
53 ; CHECK-D-NEXT:    vzext.vf2 v9, v8
54 ; CHECK-D-NEXT:    vfwcvt.f.xu.v v8, v9
55 ; CHECK-D-NEXT:    vnsrl.wi v8, v8, 23
56 ; CHECK-D-NEXT:    vsetvli zero, zero, e8, mf8, ta, ma
57 ; CHECK-D-NEXT:    vnsrl.wi v8, v8, 0
58 ; CHECK-D-NEXT:    li a0, 134
59 ; CHECK-D-NEXT:    vrsub.vx v8, v8, a0
60 ; CHECK-D-NEXT:    li a0, 8
61 ; CHECK-D-NEXT:    vminu.vx v8, v8, a0
62 ; CHECK-D-NEXT:    ret
64 ; CHECK-ZVBB-LABEL: ctlz_nxv1i8:
65 ; CHECK-ZVBB:       # %bb.0:
66 ; CHECK-ZVBB-NEXT:    vsetvli a0, zero, e8, mf8, ta, ma
67 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
68 ; CHECK-ZVBB-NEXT:    ret
69   %a = call <vscale x 1 x i8> @llvm.ctlz.nxv1i8(<vscale x 1 x i8> %va, i1 false)
70   ret <vscale x 1 x i8> %a
72 declare <vscale x 1 x i8> @llvm.ctlz.nxv1i8(<vscale x 1 x i8>, i1)
74 define <vscale x 2 x i8> @ctlz_nxv2i8(<vscale x 2 x i8> %va) {
75 ; CHECK-ZVE64X-LABEL: ctlz_nxv2i8:
76 ; CHECK-ZVE64X:       # %bb.0:
77 ; CHECK-ZVE64X-NEXT:    vsetvli a0, zero, e8, mf4, ta, ma
78 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 1
79 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
80 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 2
81 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
82 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 4
83 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
84 ; CHECK-ZVE64X-NEXT:    vnot.v v8, v8
85 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 1
86 ; CHECK-ZVE64X-NEXT:    li a0, 85
87 ; CHECK-ZVE64X-NEXT:    vand.vx v9, v9, a0
88 ; CHECK-ZVE64X-NEXT:    vsub.vv v8, v8, v9
89 ; CHECK-ZVE64X-NEXT:    li a0, 51
90 ; CHECK-ZVE64X-NEXT:    vand.vx v9, v8, a0
91 ; CHECK-ZVE64X-NEXT:    vsrl.vi v8, v8, 2
92 ; CHECK-ZVE64X-NEXT:    vand.vx v8, v8, a0
93 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v9, v8
94 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 4
95 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v8, v9
96 ; CHECK-ZVE64X-NEXT:    vand.vi v8, v8, 15
97 ; CHECK-ZVE64X-NEXT:    ret
99 ; CHECK-F-LABEL: ctlz_nxv2i8:
100 ; CHECK-F:       # %bb.0:
101 ; CHECK-F-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
102 ; CHECK-F-NEXT:    vzext.vf2 v9, v8
103 ; CHECK-F-NEXT:    vfwcvt.f.xu.v v8, v9
104 ; CHECK-F-NEXT:    vnsrl.wi v8, v8, 23
105 ; CHECK-F-NEXT:    vsetvli zero, zero, e8, mf4, ta, ma
106 ; CHECK-F-NEXT:    vnsrl.wi v8, v8, 0
107 ; CHECK-F-NEXT:    li a0, 134
108 ; CHECK-F-NEXT:    vrsub.vx v8, v8, a0
109 ; CHECK-F-NEXT:    li a0, 8
110 ; CHECK-F-NEXT:    vminu.vx v8, v8, a0
111 ; CHECK-F-NEXT:    ret
113 ; CHECK-D-LABEL: ctlz_nxv2i8:
114 ; CHECK-D:       # %bb.0:
115 ; CHECK-D-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
116 ; CHECK-D-NEXT:    vzext.vf2 v9, v8
117 ; CHECK-D-NEXT:    vfwcvt.f.xu.v v8, v9
118 ; CHECK-D-NEXT:    vnsrl.wi v8, v8, 23
119 ; CHECK-D-NEXT:    vsetvli zero, zero, e8, mf4, ta, ma
120 ; CHECK-D-NEXT:    vnsrl.wi v8, v8, 0
121 ; CHECK-D-NEXT:    li a0, 134
122 ; CHECK-D-NEXT:    vrsub.vx v8, v8, a0
123 ; CHECK-D-NEXT:    li a0, 8
124 ; CHECK-D-NEXT:    vminu.vx v8, v8, a0
125 ; CHECK-D-NEXT:    ret
127 ; CHECK-ZVBB-LABEL: ctlz_nxv2i8:
128 ; CHECK-ZVBB:       # %bb.0:
129 ; CHECK-ZVBB-NEXT:    vsetvli a0, zero, e8, mf4, ta, ma
130 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
131 ; CHECK-ZVBB-NEXT:    ret
132   %a = call <vscale x 2 x i8> @llvm.ctlz.nxv2i8(<vscale x 2 x i8> %va, i1 false)
133   ret <vscale x 2 x i8> %a
135 declare <vscale x 2 x i8> @llvm.ctlz.nxv2i8(<vscale x 2 x i8>, i1)
137 define <vscale x 4 x i8> @ctlz_nxv4i8(<vscale x 4 x i8> %va) {
138 ; CHECK-ZVE64X-LABEL: ctlz_nxv4i8:
139 ; CHECK-ZVE64X:       # %bb.0:
140 ; CHECK-ZVE64X-NEXT:    vsetvli a0, zero, e8, mf2, ta, ma
141 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 1
142 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
143 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 2
144 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
145 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 4
146 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
147 ; CHECK-ZVE64X-NEXT:    vnot.v v8, v8
148 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 1
149 ; CHECK-ZVE64X-NEXT:    li a0, 85
150 ; CHECK-ZVE64X-NEXT:    vand.vx v9, v9, a0
151 ; CHECK-ZVE64X-NEXT:    vsub.vv v8, v8, v9
152 ; CHECK-ZVE64X-NEXT:    li a0, 51
153 ; CHECK-ZVE64X-NEXT:    vand.vx v9, v8, a0
154 ; CHECK-ZVE64X-NEXT:    vsrl.vi v8, v8, 2
155 ; CHECK-ZVE64X-NEXT:    vand.vx v8, v8, a0
156 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v9, v8
157 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 4
158 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v8, v9
159 ; CHECK-ZVE64X-NEXT:    vand.vi v8, v8, 15
160 ; CHECK-ZVE64X-NEXT:    ret
162 ; CHECK-F-LABEL: ctlz_nxv4i8:
163 ; CHECK-F:       # %bb.0:
164 ; CHECK-F-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
165 ; CHECK-F-NEXT:    vzext.vf2 v9, v8
166 ; CHECK-F-NEXT:    vfwcvt.f.xu.v v10, v9
167 ; CHECK-F-NEXT:    vnsrl.wi v8, v10, 23
168 ; CHECK-F-NEXT:    vsetvli zero, zero, e8, mf2, ta, ma
169 ; CHECK-F-NEXT:    vnsrl.wi v8, v8, 0
170 ; CHECK-F-NEXT:    li a0, 134
171 ; CHECK-F-NEXT:    vrsub.vx v8, v8, a0
172 ; CHECK-F-NEXT:    li a0, 8
173 ; CHECK-F-NEXT:    vminu.vx v8, v8, a0
174 ; CHECK-F-NEXT:    ret
176 ; CHECK-D-LABEL: ctlz_nxv4i8:
177 ; CHECK-D:       # %bb.0:
178 ; CHECK-D-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
179 ; CHECK-D-NEXT:    vzext.vf2 v9, v8
180 ; CHECK-D-NEXT:    vfwcvt.f.xu.v v10, v9
181 ; CHECK-D-NEXT:    vnsrl.wi v8, v10, 23
182 ; CHECK-D-NEXT:    vsetvli zero, zero, e8, mf2, ta, ma
183 ; CHECK-D-NEXT:    vnsrl.wi v8, v8, 0
184 ; CHECK-D-NEXT:    li a0, 134
185 ; CHECK-D-NEXT:    vrsub.vx v8, v8, a0
186 ; CHECK-D-NEXT:    li a0, 8
187 ; CHECK-D-NEXT:    vminu.vx v8, v8, a0
188 ; CHECK-D-NEXT:    ret
190 ; CHECK-ZVBB-LABEL: ctlz_nxv4i8:
191 ; CHECK-ZVBB:       # %bb.0:
192 ; CHECK-ZVBB-NEXT:    vsetvli a0, zero, e8, mf2, ta, ma
193 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
194 ; CHECK-ZVBB-NEXT:    ret
195   %a = call <vscale x 4 x i8> @llvm.ctlz.nxv4i8(<vscale x 4 x i8> %va, i1 false)
196   ret <vscale x 4 x i8> %a
198 declare <vscale x 4 x i8> @llvm.ctlz.nxv4i8(<vscale x 4 x i8>, i1)
200 define <vscale x 8 x i8> @ctlz_nxv8i8(<vscale x 8 x i8> %va) {
201 ; CHECK-ZVE64X-LABEL: ctlz_nxv8i8:
202 ; CHECK-ZVE64X:       # %bb.0:
203 ; CHECK-ZVE64X-NEXT:    vsetvli a0, zero, e8, m1, ta, ma
204 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 1
205 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
206 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 2
207 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
208 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 4
209 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
210 ; CHECK-ZVE64X-NEXT:    vnot.v v8, v8
211 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 1
212 ; CHECK-ZVE64X-NEXT:    li a0, 85
213 ; CHECK-ZVE64X-NEXT:    vand.vx v9, v9, a0
214 ; CHECK-ZVE64X-NEXT:    vsub.vv v8, v8, v9
215 ; CHECK-ZVE64X-NEXT:    li a0, 51
216 ; CHECK-ZVE64X-NEXT:    vand.vx v9, v8, a0
217 ; CHECK-ZVE64X-NEXT:    vsrl.vi v8, v8, 2
218 ; CHECK-ZVE64X-NEXT:    vand.vx v8, v8, a0
219 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v9, v8
220 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 4
221 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v8, v9
222 ; CHECK-ZVE64X-NEXT:    vand.vi v8, v8, 15
223 ; CHECK-ZVE64X-NEXT:    ret
225 ; CHECK-F-LABEL: ctlz_nxv8i8:
226 ; CHECK-F:       # %bb.0:
227 ; CHECK-F-NEXT:    vsetvli a0, zero, e16, m2, ta, ma
228 ; CHECK-F-NEXT:    vzext.vf2 v10, v8
229 ; CHECK-F-NEXT:    vfwcvt.f.xu.v v12, v10
230 ; CHECK-F-NEXT:    vnsrl.wi v8, v12, 23
231 ; CHECK-F-NEXT:    vsetvli zero, zero, e8, m1, ta, ma
232 ; CHECK-F-NEXT:    vnsrl.wi v10, v8, 0
233 ; CHECK-F-NEXT:    li a0, 134
234 ; CHECK-F-NEXT:    vrsub.vx v8, v10, a0
235 ; CHECK-F-NEXT:    li a0, 8
236 ; CHECK-F-NEXT:    vminu.vx v8, v8, a0
237 ; CHECK-F-NEXT:    ret
239 ; CHECK-D-LABEL: ctlz_nxv8i8:
240 ; CHECK-D:       # %bb.0:
241 ; CHECK-D-NEXT:    vsetvli a0, zero, e16, m2, ta, ma
242 ; CHECK-D-NEXT:    vzext.vf2 v10, v8
243 ; CHECK-D-NEXT:    vfwcvt.f.xu.v v12, v10
244 ; CHECK-D-NEXT:    vnsrl.wi v8, v12, 23
245 ; CHECK-D-NEXT:    vsetvli zero, zero, e8, m1, ta, ma
246 ; CHECK-D-NEXT:    vnsrl.wi v10, v8, 0
247 ; CHECK-D-NEXT:    li a0, 134
248 ; CHECK-D-NEXT:    vrsub.vx v8, v10, a0
249 ; CHECK-D-NEXT:    li a0, 8
250 ; CHECK-D-NEXT:    vminu.vx v8, v8, a0
251 ; CHECK-D-NEXT:    ret
253 ; CHECK-ZVBB-LABEL: ctlz_nxv8i8:
254 ; CHECK-ZVBB:       # %bb.0:
255 ; CHECK-ZVBB-NEXT:    vsetvli a0, zero, e8, m1, ta, ma
256 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
257 ; CHECK-ZVBB-NEXT:    ret
258   %a = call <vscale x 8 x i8> @llvm.ctlz.nxv8i8(<vscale x 8 x i8> %va, i1 false)
259   ret <vscale x 8 x i8> %a
261 declare <vscale x 8 x i8> @llvm.ctlz.nxv8i8(<vscale x 8 x i8>, i1)
263 define <vscale x 16 x i8> @ctlz_nxv16i8(<vscale x 16 x i8> %va) {
264 ; CHECK-ZVE64X-LABEL: ctlz_nxv16i8:
265 ; CHECK-ZVE64X:       # %bb.0:
266 ; CHECK-ZVE64X-NEXT:    vsetvli a0, zero, e8, m2, ta, ma
267 ; CHECK-ZVE64X-NEXT:    vsrl.vi v10, v8, 1
268 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v10
269 ; CHECK-ZVE64X-NEXT:    vsrl.vi v10, v8, 2
270 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v10
271 ; CHECK-ZVE64X-NEXT:    vsrl.vi v10, v8, 4
272 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v10
273 ; CHECK-ZVE64X-NEXT:    vnot.v v8, v8
274 ; CHECK-ZVE64X-NEXT:    vsrl.vi v10, v8, 1
275 ; CHECK-ZVE64X-NEXT:    li a0, 85
276 ; CHECK-ZVE64X-NEXT:    vand.vx v10, v10, a0
277 ; CHECK-ZVE64X-NEXT:    vsub.vv v8, v8, v10
278 ; CHECK-ZVE64X-NEXT:    li a0, 51
279 ; CHECK-ZVE64X-NEXT:    vand.vx v10, v8, a0
280 ; CHECK-ZVE64X-NEXT:    vsrl.vi v8, v8, 2
281 ; CHECK-ZVE64X-NEXT:    vand.vx v8, v8, a0
282 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v10, v8
283 ; CHECK-ZVE64X-NEXT:    vsrl.vi v10, v8, 4
284 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v8, v10
285 ; CHECK-ZVE64X-NEXT:    vand.vi v8, v8, 15
286 ; CHECK-ZVE64X-NEXT:    ret
288 ; CHECK-F-LABEL: ctlz_nxv16i8:
289 ; CHECK-F:       # %bb.0:
290 ; CHECK-F-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
291 ; CHECK-F-NEXT:    vzext.vf2 v12, v8
292 ; CHECK-F-NEXT:    vfwcvt.f.xu.v v16, v12
293 ; CHECK-F-NEXT:    vnsrl.wi v8, v16, 23
294 ; CHECK-F-NEXT:    vsetvli zero, zero, e8, m2, ta, ma
295 ; CHECK-F-NEXT:    vnsrl.wi v12, v8, 0
296 ; CHECK-F-NEXT:    li a0, 134
297 ; CHECK-F-NEXT:    vrsub.vx v8, v12, a0
298 ; CHECK-F-NEXT:    li a0, 8
299 ; CHECK-F-NEXT:    vminu.vx v8, v8, a0
300 ; CHECK-F-NEXT:    ret
302 ; CHECK-D-LABEL: ctlz_nxv16i8:
303 ; CHECK-D:       # %bb.0:
304 ; CHECK-D-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
305 ; CHECK-D-NEXT:    vzext.vf2 v12, v8
306 ; CHECK-D-NEXT:    vfwcvt.f.xu.v v16, v12
307 ; CHECK-D-NEXT:    vnsrl.wi v8, v16, 23
308 ; CHECK-D-NEXT:    vsetvli zero, zero, e8, m2, ta, ma
309 ; CHECK-D-NEXT:    vnsrl.wi v12, v8, 0
310 ; CHECK-D-NEXT:    li a0, 134
311 ; CHECK-D-NEXT:    vrsub.vx v8, v12, a0
312 ; CHECK-D-NEXT:    li a0, 8
313 ; CHECK-D-NEXT:    vminu.vx v8, v8, a0
314 ; CHECK-D-NEXT:    ret
316 ; CHECK-ZVBB-LABEL: ctlz_nxv16i8:
317 ; CHECK-ZVBB:       # %bb.0:
318 ; CHECK-ZVBB-NEXT:    vsetvli a0, zero, e8, m2, ta, ma
319 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
320 ; CHECK-ZVBB-NEXT:    ret
321   %a = call <vscale x 16 x i8> @llvm.ctlz.nxv16i8(<vscale x 16 x i8> %va, i1 false)
322   ret <vscale x 16 x i8> %a
324 declare <vscale x 16 x i8> @llvm.ctlz.nxv16i8(<vscale x 16 x i8>, i1)
326 define <vscale x 32 x i8> @ctlz_nxv32i8(<vscale x 32 x i8> %va) {
327 ; CHECK-LABEL: ctlz_nxv32i8:
328 ; CHECK:       # %bb.0:
329 ; CHECK-NEXT:    vsetvli a0, zero, e8, m4, ta, ma
330 ; CHECK-NEXT:    vsrl.vi v12, v8, 1
331 ; CHECK-NEXT:    vor.vv v8, v8, v12
332 ; CHECK-NEXT:    vsrl.vi v12, v8, 2
333 ; CHECK-NEXT:    vor.vv v8, v8, v12
334 ; CHECK-NEXT:    vsrl.vi v12, v8, 4
335 ; CHECK-NEXT:    vor.vv v8, v8, v12
336 ; CHECK-NEXT:    vnot.v v8, v8
337 ; CHECK-NEXT:    vsrl.vi v12, v8, 1
338 ; CHECK-NEXT:    li a0, 85
339 ; CHECK-NEXT:    vand.vx v12, v12, a0
340 ; CHECK-NEXT:    vsub.vv v8, v8, v12
341 ; CHECK-NEXT:    li a0, 51
342 ; CHECK-NEXT:    vand.vx v12, v8, a0
343 ; CHECK-NEXT:    vsrl.vi v8, v8, 2
344 ; CHECK-NEXT:    vand.vx v8, v8, a0
345 ; CHECK-NEXT:    vadd.vv v8, v12, v8
346 ; CHECK-NEXT:    vsrl.vi v12, v8, 4
347 ; CHECK-NEXT:    vadd.vv v8, v8, v12
348 ; CHECK-NEXT:    vand.vi v8, v8, 15
349 ; CHECK-NEXT:    ret
351 ; CHECK-ZVBB-LABEL: ctlz_nxv32i8:
352 ; CHECK-ZVBB:       # %bb.0:
353 ; CHECK-ZVBB-NEXT:    vsetvli a0, zero, e8, m4, ta, ma
354 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
355 ; CHECK-ZVBB-NEXT:    ret
356   %a = call <vscale x 32 x i8> @llvm.ctlz.nxv32i8(<vscale x 32 x i8> %va, i1 false)
357   ret <vscale x 32 x i8> %a
359 declare <vscale x 32 x i8> @llvm.ctlz.nxv32i8(<vscale x 32 x i8>, i1)
361 define <vscale x 64 x i8> @ctlz_nxv64i8(<vscale x 64 x i8> %va) {
362 ; CHECK-LABEL: ctlz_nxv64i8:
363 ; CHECK:       # %bb.0:
364 ; CHECK-NEXT:    vsetvli a0, zero, e8, m8, ta, ma
365 ; CHECK-NEXT:    vsrl.vi v16, v8, 1
366 ; CHECK-NEXT:    vor.vv v8, v8, v16
367 ; CHECK-NEXT:    vsrl.vi v16, v8, 2
368 ; CHECK-NEXT:    vor.vv v8, v8, v16
369 ; CHECK-NEXT:    vsrl.vi v16, v8, 4
370 ; CHECK-NEXT:    vor.vv v8, v8, v16
371 ; CHECK-NEXT:    vnot.v v8, v8
372 ; CHECK-NEXT:    vsrl.vi v16, v8, 1
373 ; CHECK-NEXT:    li a0, 85
374 ; CHECK-NEXT:    vand.vx v16, v16, a0
375 ; CHECK-NEXT:    vsub.vv v8, v8, v16
376 ; CHECK-NEXT:    li a0, 51
377 ; CHECK-NEXT:    vand.vx v16, v8, a0
378 ; CHECK-NEXT:    vsrl.vi v8, v8, 2
379 ; CHECK-NEXT:    vand.vx v8, v8, a0
380 ; CHECK-NEXT:    vadd.vv v8, v16, v8
381 ; CHECK-NEXT:    vsrl.vi v16, v8, 4
382 ; CHECK-NEXT:    vadd.vv v8, v8, v16
383 ; CHECK-NEXT:    vand.vi v8, v8, 15
384 ; CHECK-NEXT:    ret
386 ; CHECK-ZVBB-LABEL: ctlz_nxv64i8:
387 ; CHECK-ZVBB:       # %bb.0:
388 ; CHECK-ZVBB-NEXT:    vsetvli a0, zero, e8, m8, ta, ma
389 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
390 ; CHECK-ZVBB-NEXT:    ret
391   %a = call <vscale x 64 x i8> @llvm.ctlz.nxv64i8(<vscale x 64 x i8> %va, i1 false)
392   ret <vscale x 64 x i8> %a
394 declare <vscale x 64 x i8> @llvm.ctlz.nxv64i8(<vscale x 64 x i8>, i1)
396 define <vscale x 1 x i16> @ctlz_nxv1i16(<vscale x 1 x i16> %va) {
397 ; CHECK-ZVE64X-LABEL: ctlz_nxv1i16:
398 ; CHECK-ZVE64X:       # %bb.0:
399 ; CHECK-ZVE64X-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
400 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 1
401 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
402 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 2
403 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
404 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 4
405 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
406 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 8
407 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
408 ; CHECK-ZVE64X-NEXT:    vnot.v v8, v8
409 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 1
410 ; CHECK-ZVE64X-NEXT:    lui a0, 5
411 ; CHECK-ZVE64X-NEXT:    addi a0, a0, 1365
412 ; CHECK-ZVE64X-NEXT:    vand.vx v9, v9, a0
413 ; CHECK-ZVE64X-NEXT:    vsub.vv v8, v8, v9
414 ; CHECK-ZVE64X-NEXT:    lui a0, 3
415 ; CHECK-ZVE64X-NEXT:    addi a0, a0, 819
416 ; CHECK-ZVE64X-NEXT:    vand.vx v9, v8, a0
417 ; CHECK-ZVE64X-NEXT:    vsrl.vi v8, v8, 2
418 ; CHECK-ZVE64X-NEXT:    vand.vx v8, v8, a0
419 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v9, v8
420 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 4
421 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v8, v9
422 ; CHECK-ZVE64X-NEXT:    lui a0, 1
423 ; CHECK-ZVE64X-NEXT:    addi a0, a0, -241
424 ; CHECK-ZVE64X-NEXT:    vand.vx v8, v8, a0
425 ; CHECK-ZVE64X-NEXT:    li a0, 257
426 ; CHECK-ZVE64X-NEXT:    vmul.vx v8, v8, a0
427 ; CHECK-ZVE64X-NEXT:    vsrl.vi v8, v8, 8
428 ; CHECK-ZVE64X-NEXT:    ret
430 ; CHECK-F-LABEL: ctlz_nxv1i16:
431 ; CHECK-F:       # %bb.0:
432 ; CHECK-F-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
433 ; CHECK-F-NEXT:    vfwcvt.f.xu.v v9, v8
434 ; CHECK-F-NEXT:    vnsrl.wi v8, v9, 23
435 ; CHECK-F-NEXT:    li a0, 142
436 ; CHECK-F-NEXT:    vrsub.vx v8, v8, a0
437 ; CHECK-F-NEXT:    li a0, 16
438 ; CHECK-F-NEXT:    vminu.vx v8, v8, a0
439 ; CHECK-F-NEXT:    ret
441 ; CHECK-D-LABEL: ctlz_nxv1i16:
442 ; CHECK-D:       # %bb.0:
443 ; CHECK-D-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
444 ; CHECK-D-NEXT:    vfwcvt.f.xu.v v9, v8
445 ; CHECK-D-NEXT:    vnsrl.wi v8, v9, 23
446 ; CHECK-D-NEXT:    li a0, 142
447 ; CHECK-D-NEXT:    vrsub.vx v8, v8, a0
448 ; CHECK-D-NEXT:    li a0, 16
449 ; CHECK-D-NEXT:    vminu.vx v8, v8, a0
450 ; CHECK-D-NEXT:    ret
452 ; CHECK-ZVBB-LABEL: ctlz_nxv1i16:
453 ; CHECK-ZVBB:       # %bb.0:
454 ; CHECK-ZVBB-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
455 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
456 ; CHECK-ZVBB-NEXT:    ret
457   %a = call <vscale x 1 x i16> @llvm.ctlz.nxv1i16(<vscale x 1 x i16> %va, i1 false)
458   ret <vscale x 1 x i16> %a
460 declare <vscale x 1 x i16> @llvm.ctlz.nxv1i16(<vscale x 1 x i16>, i1)
462 define <vscale x 2 x i16> @ctlz_nxv2i16(<vscale x 2 x i16> %va) {
463 ; CHECK-ZVE64X-LABEL: ctlz_nxv2i16:
464 ; CHECK-ZVE64X:       # %bb.0:
465 ; CHECK-ZVE64X-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
466 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 1
467 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
468 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 2
469 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
470 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 4
471 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
472 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 8
473 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
474 ; CHECK-ZVE64X-NEXT:    vnot.v v8, v8
475 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 1
476 ; CHECK-ZVE64X-NEXT:    lui a0, 5
477 ; CHECK-ZVE64X-NEXT:    addi a0, a0, 1365
478 ; CHECK-ZVE64X-NEXT:    vand.vx v9, v9, a0
479 ; CHECK-ZVE64X-NEXT:    vsub.vv v8, v8, v9
480 ; CHECK-ZVE64X-NEXT:    lui a0, 3
481 ; CHECK-ZVE64X-NEXT:    addi a0, a0, 819
482 ; CHECK-ZVE64X-NEXT:    vand.vx v9, v8, a0
483 ; CHECK-ZVE64X-NEXT:    vsrl.vi v8, v8, 2
484 ; CHECK-ZVE64X-NEXT:    vand.vx v8, v8, a0
485 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v9, v8
486 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 4
487 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v8, v9
488 ; CHECK-ZVE64X-NEXT:    lui a0, 1
489 ; CHECK-ZVE64X-NEXT:    addi a0, a0, -241
490 ; CHECK-ZVE64X-NEXT:    vand.vx v8, v8, a0
491 ; CHECK-ZVE64X-NEXT:    li a0, 257
492 ; CHECK-ZVE64X-NEXT:    vmul.vx v8, v8, a0
493 ; CHECK-ZVE64X-NEXT:    vsrl.vi v8, v8, 8
494 ; CHECK-ZVE64X-NEXT:    ret
496 ; CHECK-F-LABEL: ctlz_nxv2i16:
497 ; CHECK-F:       # %bb.0:
498 ; CHECK-F-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
499 ; CHECK-F-NEXT:    vfwcvt.f.xu.v v9, v8
500 ; CHECK-F-NEXT:    vnsrl.wi v8, v9, 23
501 ; CHECK-F-NEXT:    li a0, 142
502 ; CHECK-F-NEXT:    vrsub.vx v8, v8, a0
503 ; CHECK-F-NEXT:    li a0, 16
504 ; CHECK-F-NEXT:    vminu.vx v8, v8, a0
505 ; CHECK-F-NEXT:    ret
507 ; CHECK-D-LABEL: ctlz_nxv2i16:
508 ; CHECK-D:       # %bb.0:
509 ; CHECK-D-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
510 ; CHECK-D-NEXT:    vfwcvt.f.xu.v v9, v8
511 ; CHECK-D-NEXT:    vnsrl.wi v8, v9, 23
512 ; CHECK-D-NEXT:    li a0, 142
513 ; CHECK-D-NEXT:    vrsub.vx v8, v8, a0
514 ; CHECK-D-NEXT:    li a0, 16
515 ; CHECK-D-NEXT:    vminu.vx v8, v8, a0
516 ; CHECK-D-NEXT:    ret
518 ; CHECK-ZVBB-LABEL: ctlz_nxv2i16:
519 ; CHECK-ZVBB:       # %bb.0:
520 ; CHECK-ZVBB-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
521 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
522 ; CHECK-ZVBB-NEXT:    ret
523   %a = call <vscale x 2 x i16> @llvm.ctlz.nxv2i16(<vscale x 2 x i16> %va, i1 false)
524   ret <vscale x 2 x i16> %a
526 declare <vscale x 2 x i16> @llvm.ctlz.nxv2i16(<vscale x 2 x i16>, i1)
528 define <vscale x 4 x i16> @ctlz_nxv4i16(<vscale x 4 x i16> %va) {
529 ; CHECK-ZVE64X-LABEL: ctlz_nxv4i16:
530 ; CHECK-ZVE64X:       # %bb.0:
531 ; CHECK-ZVE64X-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
532 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 1
533 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
534 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 2
535 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
536 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 4
537 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
538 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 8
539 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
540 ; CHECK-ZVE64X-NEXT:    vnot.v v8, v8
541 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 1
542 ; CHECK-ZVE64X-NEXT:    lui a0, 5
543 ; CHECK-ZVE64X-NEXT:    addi a0, a0, 1365
544 ; CHECK-ZVE64X-NEXT:    vand.vx v9, v9, a0
545 ; CHECK-ZVE64X-NEXT:    vsub.vv v8, v8, v9
546 ; CHECK-ZVE64X-NEXT:    lui a0, 3
547 ; CHECK-ZVE64X-NEXT:    addi a0, a0, 819
548 ; CHECK-ZVE64X-NEXT:    vand.vx v9, v8, a0
549 ; CHECK-ZVE64X-NEXT:    vsrl.vi v8, v8, 2
550 ; CHECK-ZVE64X-NEXT:    vand.vx v8, v8, a0
551 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v9, v8
552 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 4
553 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v8, v9
554 ; CHECK-ZVE64X-NEXT:    lui a0, 1
555 ; CHECK-ZVE64X-NEXT:    addi a0, a0, -241
556 ; CHECK-ZVE64X-NEXT:    vand.vx v8, v8, a0
557 ; CHECK-ZVE64X-NEXT:    li a0, 257
558 ; CHECK-ZVE64X-NEXT:    vmul.vx v8, v8, a0
559 ; CHECK-ZVE64X-NEXT:    vsrl.vi v8, v8, 8
560 ; CHECK-ZVE64X-NEXT:    ret
562 ; CHECK-F-LABEL: ctlz_nxv4i16:
563 ; CHECK-F:       # %bb.0:
564 ; CHECK-F-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
565 ; CHECK-F-NEXT:    vfwcvt.f.xu.v v10, v8
566 ; CHECK-F-NEXT:    vnsrl.wi v8, v10, 23
567 ; CHECK-F-NEXT:    li a0, 142
568 ; CHECK-F-NEXT:    vrsub.vx v8, v8, a0
569 ; CHECK-F-NEXT:    li a0, 16
570 ; CHECK-F-NEXT:    vminu.vx v8, v8, a0
571 ; CHECK-F-NEXT:    ret
573 ; CHECK-D-LABEL: ctlz_nxv4i16:
574 ; CHECK-D:       # %bb.0:
575 ; CHECK-D-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
576 ; CHECK-D-NEXT:    vfwcvt.f.xu.v v10, v8
577 ; CHECK-D-NEXT:    vnsrl.wi v8, v10, 23
578 ; CHECK-D-NEXT:    li a0, 142
579 ; CHECK-D-NEXT:    vrsub.vx v8, v8, a0
580 ; CHECK-D-NEXT:    li a0, 16
581 ; CHECK-D-NEXT:    vminu.vx v8, v8, a0
582 ; CHECK-D-NEXT:    ret
584 ; CHECK-ZVBB-LABEL: ctlz_nxv4i16:
585 ; CHECK-ZVBB:       # %bb.0:
586 ; CHECK-ZVBB-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
587 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
588 ; CHECK-ZVBB-NEXT:    ret
589   %a = call <vscale x 4 x i16> @llvm.ctlz.nxv4i16(<vscale x 4 x i16> %va, i1 false)
590   ret <vscale x 4 x i16> %a
592 declare <vscale x 4 x i16> @llvm.ctlz.nxv4i16(<vscale x 4 x i16>, i1)
594 define <vscale x 8 x i16> @ctlz_nxv8i16(<vscale x 8 x i16> %va) {
595 ; CHECK-ZVE64X-LABEL: ctlz_nxv8i16:
596 ; CHECK-ZVE64X:       # %bb.0:
597 ; CHECK-ZVE64X-NEXT:    vsetvli a0, zero, e16, m2, ta, ma
598 ; CHECK-ZVE64X-NEXT:    vsrl.vi v10, v8, 1
599 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v10
600 ; CHECK-ZVE64X-NEXT:    vsrl.vi v10, v8, 2
601 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v10
602 ; CHECK-ZVE64X-NEXT:    vsrl.vi v10, v8, 4
603 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v10
604 ; CHECK-ZVE64X-NEXT:    vsrl.vi v10, v8, 8
605 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v10
606 ; CHECK-ZVE64X-NEXT:    vnot.v v8, v8
607 ; CHECK-ZVE64X-NEXT:    vsrl.vi v10, v8, 1
608 ; CHECK-ZVE64X-NEXT:    lui a0, 5
609 ; CHECK-ZVE64X-NEXT:    addi a0, a0, 1365
610 ; CHECK-ZVE64X-NEXT:    vand.vx v10, v10, a0
611 ; CHECK-ZVE64X-NEXT:    vsub.vv v8, v8, v10
612 ; CHECK-ZVE64X-NEXT:    lui a0, 3
613 ; CHECK-ZVE64X-NEXT:    addi a0, a0, 819
614 ; CHECK-ZVE64X-NEXT:    vand.vx v10, v8, a0
615 ; CHECK-ZVE64X-NEXT:    vsrl.vi v8, v8, 2
616 ; CHECK-ZVE64X-NEXT:    vand.vx v8, v8, a0
617 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v10, v8
618 ; CHECK-ZVE64X-NEXT:    vsrl.vi v10, v8, 4
619 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v8, v10
620 ; CHECK-ZVE64X-NEXT:    lui a0, 1
621 ; CHECK-ZVE64X-NEXT:    addi a0, a0, -241
622 ; CHECK-ZVE64X-NEXT:    vand.vx v8, v8, a0
623 ; CHECK-ZVE64X-NEXT:    li a0, 257
624 ; CHECK-ZVE64X-NEXT:    vmul.vx v8, v8, a0
625 ; CHECK-ZVE64X-NEXT:    vsrl.vi v8, v8, 8
626 ; CHECK-ZVE64X-NEXT:    ret
628 ; CHECK-F-LABEL: ctlz_nxv8i16:
629 ; CHECK-F:       # %bb.0:
630 ; CHECK-F-NEXT:    vsetvli a0, zero, e16, m2, ta, ma
631 ; CHECK-F-NEXT:    vfwcvt.f.xu.v v12, v8
632 ; CHECK-F-NEXT:    vnsrl.wi v8, v12, 23
633 ; CHECK-F-NEXT:    li a0, 142
634 ; CHECK-F-NEXT:    vrsub.vx v8, v8, a0
635 ; CHECK-F-NEXT:    li a0, 16
636 ; CHECK-F-NEXT:    vminu.vx v8, v8, a0
637 ; CHECK-F-NEXT:    ret
639 ; CHECK-D-LABEL: ctlz_nxv8i16:
640 ; CHECK-D:       # %bb.0:
641 ; CHECK-D-NEXT:    vsetvli a0, zero, e16, m2, ta, ma
642 ; CHECK-D-NEXT:    vfwcvt.f.xu.v v12, v8
643 ; CHECK-D-NEXT:    vnsrl.wi v8, v12, 23
644 ; CHECK-D-NEXT:    li a0, 142
645 ; CHECK-D-NEXT:    vrsub.vx v8, v8, a0
646 ; CHECK-D-NEXT:    li a0, 16
647 ; CHECK-D-NEXT:    vminu.vx v8, v8, a0
648 ; CHECK-D-NEXT:    ret
650 ; CHECK-ZVBB-LABEL: ctlz_nxv8i16:
651 ; CHECK-ZVBB:       # %bb.0:
652 ; CHECK-ZVBB-NEXT:    vsetvli a0, zero, e16, m2, ta, ma
653 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
654 ; CHECK-ZVBB-NEXT:    ret
655   %a = call <vscale x 8 x i16> @llvm.ctlz.nxv8i16(<vscale x 8 x i16> %va, i1 false)
656   ret <vscale x 8 x i16> %a
658 declare <vscale x 8 x i16> @llvm.ctlz.nxv8i16(<vscale x 8 x i16>, i1)
660 define <vscale x 16 x i16> @ctlz_nxv16i16(<vscale x 16 x i16> %va) {
661 ; CHECK-ZVE64X-LABEL: ctlz_nxv16i16:
662 ; CHECK-ZVE64X:       # %bb.0:
663 ; CHECK-ZVE64X-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
664 ; CHECK-ZVE64X-NEXT:    vsrl.vi v12, v8, 1
665 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v12
666 ; CHECK-ZVE64X-NEXT:    vsrl.vi v12, v8, 2
667 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v12
668 ; CHECK-ZVE64X-NEXT:    vsrl.vi v12, v8, 4
669 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v12
670 ; CHECK-ZVE64X-NEXT:    vsrl.vi v12, v8, 8
671 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v12
672 ; CHECK-ZVE64X-NEXT:    vnot.v v8, v8
673 ; CHECK-ZVE64X-NEXT:    vsrl.vi v12, v8, 1
674 ; CHECK-ZVE64X-NEXT:    lui a0, 5
675 ; CHECK-ZVE64X-NEXT:    addi a0, a0, 1365
676 ; CHECK-ZVE64X-NEXT:    vand.vx v12, v12, a0
677 ; CHECK-ZVE64X-NEXT:    vsub.vv v8, v8, v12
678 ; CHECK-ZVE64X-NEXT:    lui a0, 3
679 ; CHECK-ZVE64X-NEXT:    addi a0, a0, 819
680 ; CHECK-ZVE64X-NEXT:    vand.vx v12, v8, a0
681 ; CHECK-ZVE64X-NEXT:    vsrl.vi v8, v8, 2
682 ; CHECK-ZVE64X-NEXT:    vand.vx v8, v8, a0
683 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v12, v8
684 ; CHECK-ZVE64X-NEXT:    vsrl.vi v12, v8, 4
685 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v8, v12
686 ; CHECK-ZVE64X-NEXT:    lui a0, 1
687 ; CHECK-ZVE64X-NEXT:    addi a0, a0, -241
688 ; CHECK-ZVE64X-NEXT:    vand.vx v8, v8, a0
689 ; CHECK-ZVE64X-NEXT:    li a0, 257
690 ; CHECK-ZVE64X-NEXT:    vmul.vx v8, v8, a0
691 ; CHECK-ZVE64X-NEXT:    vsrl.vi v8, v8, 8
692 ; CHECK-ZVE64X-NEXT:    ret
694 ; CHECK-F-LABEL: ctlz_nxv16i16:
695 ; CHECK-F:       # %bb.0:
696 ; CHECK-F-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
697 ; CHECK-F-NEXT:    vfwcvt.f.xu.v v16, v8
698 ; CHECK-F-NEXT:    vnsrl.wi v8, v16, 23
699 ; CHECK-F-NEXT:    li a0, 142
700 ; CHECK-F-NEXT:    vrsub.vx v8, v8, a0
701 ; CHECK-F-NEXT:    li a0, 16
702 ; CHECK-F-NEXT:    vminu.vx v8, v8, a0
703 ; CHECK-F-NEXT:    ret
705 ; CHECK-D-LABEL: ctlz_nxv16i16:
706 ; CHECK-D:       # %bb.0:
707 ; CHECK-D-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
708 ; CHECK-D-NEXT:    vfwcvt.f.xu.v v16, v8
709 ; CHECK-D-NEXT:    vnsrl.wi v8, v16, 23
710 ; CHECK-D-NEXT:    li a0, 142
711 ; CHECK-D-NEXT:    vrsub.vx v8, v8, a0
712 ; CHECK-D-NEXT:    li a0, 16
713 ; CHECK-D-NEXT:    vminu.vx v8, v8, a0
714 ; CHECK-D-NEXT:    ret
716 ; CHECK-ZVBB-LABEL: ctlz_nxv16i16:
717 ; CHECK-ZVBB:       # %bb.0:
718 ; CHECK-ZVBB-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
719 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
720 ; CHECK-ZVBB-NEXT:    ret
721   %a = call <vscale x 16 x i16> @llvm.ctlz.nxv16i16(<vscale x 16 x i16> %va, i1 false)
722   ret <vscale x 16 x i16> %a
724 declare <vscale x 16 x i16> @llvm.ctlz.nxv16i16(<vscale x 16 x i16>, i1)
726 define <vscale x 32 x i16> @ctlz_nxv32i16(<vscale x 32 x i16> %va) {
727 ; CHECK-LABEL: ctlz_nxv32i16:
728 ; CHECK:       # %bb.0:
729 ; CHECK-NEXT:    vsetvli a0, zero, e16, m8, ta, ma
730 ; CHECK-NEXT:    vsrl.vi v16, v8, 1
731 ; CHECK-NEXT:    vor.vv v8, v8, v16
732 ; CHECK-NEXT:    vsrl.vi v16, v8, 2
733 ; CHECK-NEXT:    vor.vv v8, v8, v16
734 ; CHECK-NEXT:    vsrl.vi v16, v8, 4
735 ; CHECK-NEXT:    vor.vv v8, v8, v16
736 ; CHECK-NEXT:    vsrl.vi v16, v8, 8
737 ; CHECK-NEXT:    vor.vv v8, v8, v16
738 ; CHECK-NEXT:    vnot.v v8, v8
739 ; CHECK-NEXT:    vsrl.vi v16, v8, 1
740 ; CHECK-NEXT:    lui a0, 5
741 ; CHECK-NEXT:    addi a0, a0, 1365
742 ; CHECK-NEXT:    vand.vx v16, v16, a0
743 ; CHECK-NEXT:    vsub.vv v8, v8, v16
744 ; CHECK-NEXT:    lui a0, 3
745 ; CHECK-NEXT:    addi a0, a0, 819
746 ; CHECK-NEXT:    vand.vx v16, v8, a0
747 ; CHECK-NEXT:    vsrl.vi v8, v8, 2
748 ; CHECK-NEXT:    vand.vx v8, v8, a0
749 ; CHECK-NEXT:    vadd.vv v8, v16, v8
750 ; CHECK-NEXT:    vsrl.vi v16, v8, 4
751 ; CHECK-NEXT:    vadd.vv v8, v8, v16
752 ; CHECK-NEXT:    lui a0, 1
753 ; CHECK-NEXT:    addi a0, a0, -241
754 ; CHECK-NEXT:    vand.vx v8, v8, a0
755 ; CHECK-NEXT:    li a0, 257
756 ; CHECK-NEXT:    vmul.vx v8, v8, a0
757 ; CHECK-NEXT:    vsrl.vi v8, v8, 8
758 ; CHECK-NEXT:    ret
760 ; CHECK-ZVBB-LABEL: ctlz_nxv32i16:
761 ; CHECK-ZVBB:       # %bb.0:
762 ; CHECK-ZVBB-NEXT:    vsetvli a0, zero, e16, m8, ta, ma
763 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
764 ; CHECK-ZVBB-NEXT:    ret
765   %a = call <vscale x 32 x i16> @llvm.ctlz.nxv32i16(<vscale x 32 x i16> %va, i1 false)
766   ret <vscale x 32 x i16> %a
768 declare <vscale x 32 x i16> @llvm.ctlz.nxv32i16(<vscale x 32 x i16>, i1)
770 define <vscale x 1 x i32> @ctlz_nxv1i32(<vscale x 1 x i32> %va) {
771 ; CHECK-ZVE64X-LABEL: ctlz_nxv1i32:
772 ; CHECK-ZVE64X:       # %bb.0:
773 ; CHECK-ZVE64X-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
774 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 1
775 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
776 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 2
777 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
778 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 4
779 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
780 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 8
781 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
782 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 16
783 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
784 ; CHECK-ZVE64X-NEXT:    vnot.v v8, v8
785 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 1
786 ; CHECK-ZVE64X-NEXT:    lui a0, 349525
787 ; CHECK-ZVE64X-NEXT:    addi a0, a0, 1365
788 ; CHECK-ZVE64X-NEXT:    vand.vx v9, v9, a0
789 ; CHECK-ZVE64X-NEXT:    vsub.vv v8, v8, v9
790 ; CHECK-ZVE64X-NEXT:    lui a0, 209715
791 ; CHECK-ZVE64X-NEXT:    addi a0, a0, 819
792 ; CHECK-ZVE64X-NEXT:    vand.vx v9, v8, a0
793 ; CHECK-ZVE64X-NEXT:    vsrl.vi v8, v8, 2
794 ; CHECK-ZVE64X-NEXT:    vand.vx v8, v8, a0
795 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v9, v8
796 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 4
797 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v8, v9
798 ; CHECK-ZVE64X-NEXT:    lui a0, 61681
799 ; CHECK-ZVE64X-NEXT:    addi a0, a0, -241
800 ; CHECK-ZVE64X-NEXT:    vand.vx v8, v8, a0
801 ; CHECK-ZVE64X-NEXT:    lui a0, 4112
802 ; CHECK-ZVE64X-NEXT:    addi a0, a0, 257
803 ; CHECK-ZVE64X-NEXT:    vmul.vx v8, v8, a0
804 ; CHECK-ZVE64X-NEXT:    vsrl.vi v8, v8, 24
805 ; CHECK-ZVE64X-NEXT:    ret
807 ; CHECK-F-LABEL: ctlz_nxv1i32:
808 ; CHECK-F:       # %bb.0:
809 ; CHECK-F-NEXT:    fsrmi a0, 1
810 ; CHECK-F-NEXT:    vsetvli a1, zero, e32, mf2, ta, ma
811 ; CHECK-F-NEXT:    vfcvt.f.xu.v v8, v8
812 ; CHECK-F-NEXT:    vsrl.vi v8, v8, 23
813 ; CHECK-F-NEXT:    li a1, 158
814 ; CHECK-F-NEXT:    vrsub.vx v8, v8, a1
815 ; CHECK-F-NEXT:    li a1, 32
816 ; CHECK-F-NEXT:    vminu.vx v8, v8, a1
817 ; CHECK-F-NEXT:    fsrm a0
818 ; CHECK-F-NEXT:    ret
820 ; CHECK-D-LABEL: ctlz_nxv1i32:
821 ; CHECK-D:       # %bb.0:
822 ; CHECK-D-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
823 ; CHECK-D-NEXT:    vfwcvt.f.xu.v v9, v8
824 ; CHECK-D-NEXT:    li a0, 52
825 ; CHECK-D-NEXT:    vnsrl.wx v8, v9, a0
826 ; CHECK-D-NEXT:    li a0, 1054
827 ; CHECK-D-NEXT:    vrsub.vx v8, v8, a0
828 ; CHECK-D-NEXT:    li a0, 32
829 ; CHECK-D-NEXT:    vminu.vx v8, v8, a0
830 ; CHECK-D-NEXT:    ret
832 ; CHECK-ZVBB-LABEL: ctlz_nxv1i32:
833 ; CHECK-ZVBB:       # %bb.0:
834 ; CHECK-ZVBB-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
835 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
836 ; CHECK-ZVBB-NEXT:    ret
837   %a = call <vscale x 1 x i32> @llvm.ctlz.nxv1i32(<vscale x 1 x i32> %va, i1 false)
838   ret <vscale x 1 x i32> %a
840 declare <vscale x 1 x i32> @llvm.ctlz.nxv1i32(<vscale x 1 x i32>, i1)
842 define <vscale x 2 x i32> @ctlz_nxv2i32(<vscale x 2 x i32> %va) {
843 ; CHECK-ZVE64X-LABEL: ctlz_nxv2i32:
844 ; CHECK-ZVE64X:       # %bb.0:
845 ; CHECK-ZVE64X-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
846 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 1
847 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
848 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 2
849 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
850 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 4
851 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
852 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 8
853 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
854 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 16
855 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
856 ; CHECK-ZVE64X-NEXT:    vnot.v v8, v8
857 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 1
858 ; CHECK-ZVE64X-NEXT:    lui a0, 349525
859 ; CHECK-ZVE64X-NEXT:    addi a0, a0, 1365
860 ; CHECK-ZVE64X-NEXT:    vand.vx v9, v9, a0
861 ; CHECK-ZVE64X-NEXT:    vsub.vv v8, v8, v9
862 ; CHECK-ZVE64X-NEXT:    lui a0, 209715
863 ; CHECK-ZVE64X-NEXT:    addi a0, a0, 819
864 ; CHECK-ZVE64X-NEXT:    vand.vx v9, v8, a0
865 ; CHECK-ZVE64X-NEXT:    vsrl.vi v8, v8, 2
866 ; CHECK-ZVE64X-NEXT:    vand.vx v8, v8, a0
867 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v9, v8
868 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 4
869 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v8, v9
870 ; CHECK-ZVE64X-NEXT:    lui a0, 61681
871 ; CHECK-ZVE64X-NEXT:    addi a0, a0, -241
872 ; CHECK-ZVE64X-NEXT:    vand.vx v8, v8, a0
873 ; CHECK-ZVE64X-NEXT:    lui a0, 4112
874 ; CHECK-ZVE64X-NEXT:    addi a0, a0, 257
875 ; CHECK-ZVE64X-NEXT:    vmul.vx v8, v8, a0
876 ; CHECK-ZVE64X-NEXT:    vsrl.vi v8, v8, 24
877 ; CHECK-ZVE64X-NEXT:    ret
879 ; CHECK-F-LABEL: ctlz_nxv2i32:
880 ; CHECK-F:       # %bb.0:
881 ; CHECK-F-NEXT:    fsrmi a0, 1
882 ; CHECK-F-NEXT:    vsetvli a1, zero, e32, m1, ta, ma
883 ; CHECK-F-NEXT:    vfcvt.f.xu.v v8, v8
884 ; CHECK-F-NEXT:    vsrl.vi v8, v8, 23
885 ; CHECK-F-NEXT:    li a1, 158
886 ; CHECK-F-NEXT:    vrsub.vx v8, v8, a1
887 ; CHECK-F-NEXT:    li a1, 32
888 ; CHECK-F-NEXT:    vminu.vx v8, v8, a1
889 ; CHECK-F-NEXT:    fsrm a0
890 ; CHECK-F-NEXT:    ret
892 ; CHECK-D-LABEL: ctlz_nxv2i32:
893 ; CHECK-D:       # %bb.0:
894 ; CHECK-D-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
895 ; CHECK-D-NEXT:    vfwcvt.f.xu.v v10, v8
896 ; CHECK-D-NEXT:    li a0, 52
897 ; CHECK-D-NEXT:    vnsrl.wx v8, v10, a0
898 ; CHECK-D-NEXT:    li a0, 1054
899 ; CHECK-D-NEXT:    vrsub.vx v8, v8, a0
900 ; CHECK-D-NEXT:    li a0, 32
901 ; CHECK-D-NEXT:    vminu.vx v8, v8, a0
902 ; CHECK-D-NEXT:    ret
904 ; CHECK-ZVBB-LABEL: ctlz_nxv2i32:
905 ; CHECK-ZVBB:       # %bb.0:
906 ; CHECK-ZVBB-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
907 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
908 ; CHECK-ZVBB-NEXT:    ret
909   %a = call <vscale x 2 x i32> @llvm.ctlz.nxv2i32(<vscale x 2 x i32> %va, i1 false)
910   ret <vscale x 2 x i32> %a
912 declare <vscale x 2 x i32> @llvm.ctlz.nxv2i32(<vscale x 2 x i32>, i1)
914 define <vscale x 4 x i32> @ctlz_nxv4i32(<vscale x 4 x i32> %va) {
915 ; CHECK-ZVE64X-LABEL: ctlz_nxv4i32:
916 ; CHECK-ZVE64X:       # %bb.0:
917 ; CHECK-ZVE64X-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
918 ; CHECK-ZVE64X-NEXT:    vsrl.vi v10, v8, 1
919 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v10
920 ; CHECK-ZVE64X-NEXT:    vsrl.vi v10, v8, 2
921 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v10
922 ; CHECK-ZVE64X-NEXT:    vsrl.vi v10, v8, 4
923 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v10
924 ; CHECK-ZVE64X-NEXT:    vsrl.vi v10, v8, 8
925 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v10
926 ; CHECK-ZVE64X-NEXT:    vsrl.vi v10, v8, 16
927 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v10
928 ; CHECK-ZVE64X-NEXT:    vnot.v v8, v8
929 ; CHECK-ZVE64X-NEXT:    vsrl.vi v10, v8, 1
930 ; CHECK-ZVE64X-NEXT:    lui a0, 349525
931 ; CHECK-ZVE64X-NEXT:    addi a0, a0, 1365
932 ; CHECK-ZVE64X-NEXT:    vand.vx v10, v10, a0
933 ; CHECK-ZVE64X-NEXT:    vsub.vv v8, v8, v10
934 ; CHECK-ZVE64X-NEXT:    lui a0, 209715
935 ; CHECK-ZVE64X-NEXT:    addi a0, a0, 819
936 ; CHECK-ZVE64X-NEXT:    vand.vx v10, v8, a0
937 ; CHECK-ZVE64X-NEXT:    vsrl.vi v8, v8, 2
938 ; CHECK-ZVE64X-NEXT:    vand.vx v8, v8, a0
939 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v10, v8
940 ; CHECK-ZVE64X-NEXT:    vsrl.vi v10, v8, 4
941 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v8, v10
942 ; CHECK-ZVE64X-NEXT:    lui a0, 61681
943 ; CHECK-ZVE64X-NEXT:    addi a0, a0, -241
944 ; CHECK-ZVE64X-NEXT:    vand.vx v8, v8, a0
945 ; CHECK-ZVE64X-NEXT:    lui a0, 4112
946 ; CHECK-ZVE64X-NEXT:    addi a0, a0, 257
947 ; CHECK-ZVE64X-NEXT:    vmul.vx v8, v8, a0
948 ; CHECK-ZVE64X-NEXT:    vsrl.vi v8, v8, 24
949 ; CHECK-ZVE64X-NEXT:    ret
951 ; CHECK-F-LABEL: ctlz_nxv4i32:
952 ; CHECK-F:       # %bb.0:
953 ; CHECK-F-NEXT:    fsrmi a0, 1
954 ; CHECK-F-NEXT:    vsetvli a1, zero, e32, m2, ta, ma
955 ; CHECK-F-NEXT:    vfcvt.f.xu.v v8, v8
956 ; CHECK-F-NEXT:    vsrl.vi v8, v8, 23
957 ; CHECK-F-NEXT:    li a1, 158
958 ; CHECK-F-NEXT:    vrsub.vx v8, v8, a1
959 ; CHECK-F-NEXT:    li a1, 32
960 ; CHECK-F-NEXT:    vminu.vx v8, v8, a1
961 ; CHECK-F-NEXT:    fsrm a0
962 ; CHECK-F-NEXT:    ret
964 ; CHECK-D-LABEL: ctlz_nxv4i32:
965 ; CHECK-D:       # %bb.0:
966 ; CHECK-D-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
967 ; CHECK-D-NEXT:    vfwcvt.f.xu.v v12, v8
968 ; CHECK-D-NEXT:    li a0, 52
969 ; CHECK-D-NEXT:    vnsrl.wx v8, v12, a0
970 ; CHECK-D-NEXT:    li a0, 1054
971 ; CHECK-D-NEXT:    vrsub.vx v8, v8, a0
972 ; CHECK-D-NEXT:    li a0, 32
973 ; CHECK-D-NEXT:    vminu.vx v8, v8, a0
974 ; CHECK-D-NEXT:    ret
976 ; CHECK-ZVBB-LABEL: ctlz_nxv4i32:
977 ; CHECK-ZVBB:       # %bb.0:
978 ; CHECK-ZVBB-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
979 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
980 ; CHECK-ZVBB-NEXT:    ret
981   %a = call <vscale x 4 x i32> @llvm.ctlz.nxv4i32(<vscale x 4 x i32> %va, i1 false)
982   ret <vscale x 4 x i32> %a
984 declare <vscale x 4 x i32> @llvm.ctlz.nxv4i32(<vscale x 4 x i32>, i1)
986 define <vscale x 8 x i32> @ctlz_nxv8i32(<vscale x 8 x i32> %va) {
987 ; CHECK-ZVE64X-LABEL: ctlz_nxv8i32:
988 ; CHECK-ZVE64X:       # %bb.0:
989 ; CHECK-ZVE64X-NEXT:    vsetvli a0, zero, e32, m4, ta, ma
990 ; CHECK-ZVE64X-NEXT:    vsrl.vi v12, v8, 1
991 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v12
992 ; CHECK-ZVE64X-NEXT:    vsrl.vi v12, v8, 2
993 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v12
994 ; CHECK-ZVE64X-NEXT:    vsrl.vi v12, v8, 4
995 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v12
996 ; CHECK-ZVE64X-NEXT:    vsrl.vi v12, v8, 8
997 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v12
998 ; CHECK-ZVE64X-NEXT:    vsrl.vi v12, v8, 16
999 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v12
1000 ; CHECK-ZVE64X-NEXT:    vnot.v v8, v8
1001 ; CHECK-ZVE64X-NEXT:    vsrl.vi v12, v8, 1
1002 ; CHECK-ZVE64X-NEXT:    lui a0, 349525
1003 ; CHECK-ZVE64X-NEXT:    addi a0, a0, 1365
1004 ; CHECK-ZVE64X-NEXT:    vand.vx v12, v12, a0
1005 ; CHECK-ZVE64X-NEXT:    vsub.vv v8, v8, v12
1006 ; CHECK-ZVE64X-NEXT:    lui a0, 209715
1007 ; CHECK-ZVE64X-NEXT:    addi a0, a0, 819
1008 ; CHECK-ZVE64X-NEXT:    vand.vx v12, v8, a0
1009 ; CHECK-ZVE64X-NEXT:    vsrl.vi v8, v8, 2
1010 ; CHECK-ZVE64X-NEXT:    vand.vx v8, v8, a0
1011 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v12, v8
1012 ; CHECK-ZVE64X-NEXT:    vsrl.vi v12, v8, 4
1013 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v8, v12
1014 ; CHECK-ZVE64X-NEXT:    lui a0, 61681
1015 ; CHECK-ZVE64X-NEXT:    addi a0, a0, -241
1016 ; CHECK-ZVE64X-NEXT:    vand.vx v8, v8, a0
1017 ; CHECK-ZVE64X-NEXT:    lui a0, 4112
1018 ; CHECK-ZVE64X-NEXT:    addi a0, a0, 257
1019 ; CHECK-ZVE64X-NEXT:    vmul.vx v8, v8, a0
1020 ; CHECK-ZVE64X-NEXT:    vsrl.vi v8, v8, 24
1021 ; CHECK-ZVE64X-NEXT:    ret
1023 ; CHECK-F-LABEL: ctlz_nxv8i32:
1024 ; CHECK-F:       # %bb.0:
1025 ; CHECK-F-NEXT:    fsrmi a0, 1
1026 ; CHECK-F-NEXT:    vsetvli a1, zero, e32, m4, ta, ma
1027 ; CHECK-F-NEXT:    vfcvt.f.xu.v v8, v8
1028 ; CHECK-F-NEXT:    vsrl.vi v8, v8, 23
1029 ; CHECK-F-NEXT:    li a1, 158
1030 ; CHECK-F-NEXT:    vrsub.vx v8, v8, a1
1031 ; CHECK-F-NEXT:    li a1, 32
1032 ; CHECK-F-NEXT:    vminu.vx v8, v8, a1
1033 ; CHECK-F-NEXT:    fsrm a0
1034 ; CHECK-F-NEXT:    ret
1036 ; CHECK-D-LABEL: ctlz_nxv8i32:
1037 ; CHECK-D:       # %bb.0:
1038 ; CHECK-D-NEXT:    vsetvli a0, zero, e32, m4, ta, ma
1039 ; CHECK-D-NEXT:    vfwcvt.f.xu.v v16, v8
1040 ; CHECK-D-NEXT:    li a0, 52
1041 ; CHECK-D-NEXT:    vnsrl.wx v8, v16, a0
1042 ; CHECK-D-NEXT:    li a0, 1054
1043 ; CHECK-D-NEXT:    vrsub.vx v8, v8, a0
1044 ; CHECK-D-NEXT:    li a0, 32
1045 ; CHECK-D-NEXT:    vminu.vx v8, v8, a0
1046 ; CHECK-D-NEXT:    ret
1048 ; CHECK-ZVBB-LABEL: ctlz_nxv8i32:
1049 ; CHECK-ZVBB:       # %bb.0:
1050 ; CHECK-ZVBB-NEXT:    vsetvli a0, zero, e32, m4, ta, ma
1051 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
1052 ; CHECK-ZVBB-NEXT:    ret
1053   %a = call <vscale x 8 x i32> @llvm.ctlz.nxv8i32(<vscale x 8 x i32> %va, i1 false)
1054   ret <vscale x 8 x i32> %a
1056 declare <vscale x 8 x i32> @llvm.ctlz.nxv8i32(<vscale x 8 x i32>, i1)
1058 define <vscale x 16 x i32> @ctlz_nxv16i32(<vscale x 16 x i32> %va) {
1059 ; CHECK-ZVE64X-LABEL: ctlz_nxv16i32:
1060 ; CHECK-ZVE64X:       # %bb.0:
1061 ; CHECK-ZVE64X-NEXT:    vsetvli a0, zero, e32, m8, ta, ma
1062 ; CHECK-ZVE64X-NEXT:    vsrl.vi v16, v8, 1
1063 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v16
1064 ; CHECK-ZVE64X-NEXT:    vsrl.vi v16, v8, 2
1065 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v16
1066 ; CHECK-ZVE64X-NEXT:    vsrl.vi v16, v8, 4
1067 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v16
1068 ; CHECK-ZVE64X-NEXT:    vsrl.vi v16, v8, 8
1069 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v16
1070 ; CHECK-ZVE64X-NEXT:    vsrl.vi v16, v8, 16
1071 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v16
1072 ; CHECK-ZVE64X-NEXT:    vnot.v v8, v8
1073 ; CHECK-ZVE64X-NEXT:    vsrl.vi v16, v8, 1
1074 ; CHECK-ZVE64X-NEXT:    lui a0, 349525
1075 ; CHECK-ZVE64X-NEXT:    addi a0, a0, 1365
1076 ; CHECK-ZVE64X-NEXT:    vand.vx v16, v16, a0
1077 ; CHECK-ZVE64X-NEXT:    vsub.vv v8, v8, v16
1078 ; CHECK-ZVE64X-NEXT:    lui a0, 209715
1079 ; CHECK-ZVE64X-NEXT:    addi a0, a0, 819
1080 ; CHECK-ZVE64X-NEXT:    vand.vx v16, v8, a0
1081 ; CHECK-ZVE64X-NEXT:    vsrl.vi v8, v8, 2
1082 ; CHECK-ZVE64X-NEXT:    vand.vx v8, v8, a0
1083 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v16, v8
1084 ; CHECK-ZVE64X-NEXT:    vsrl.vi v16, v8, 4
1085 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v8, v16
1086 ; CHECK-ZVE64X-NEXT:    lui a0, 61681
1087 ; CHECK-ZVE64X-NEXT:    addi a0, a0, -241
1088 ; CHECK-ZVE64X-NEXT:    vand.vx v8, v8, a0
1089 ; CHECK-ZVE64X-NEXT:    lui a0, 4112
1090 ; CHECK-ZVE64X-NEXT:    addi a0, a0, 257
1091 ; CHECK-ZVE64X-NEXT:    vmul.vx v8, v8, a0
1092 ; CHECK-ZVE64X-NEXT:    vsrl.vi v8, v8, 24
1093 ; CHECK-ZVE64X-NEXT:    ret
1095 ; CHECK-F-LABEL: ctlz_nxv16i32:
1096 ; CHECK-F:       # %bb.0:
1097 ; CHECK-F-NEXT:    fsrmi a0, 1
1098 ; CHECK-F-NEXT:    vsetvli a1, zero, e32, m8, ta, ma
1099 ; CHECK-F-NEXT:    vfcvt.f.xu.v v8, v8
1100 ; CHECK-F-NEXT:    vsrl.vi v8, v8, 23
1101 ; CHECK-F-NEXT:    li a1, 158
1102 ; CHECK-F-NEXT:    vrsub.vx v8, v8, a1
1103 ; CHECK-F-NEXT:    li a1, 32
1104 ; CHECK-F-NEXT:    vminu.vx v8, v8, a1
1105 ; CHECK-F-NEXT:    fsrm a0
1106 ; CHECK-F-NEXT:    ret
1108 ; CHECK-D-LABEL: ctlz_nxv16i32:
1109 ; CHECK-D:       # %bb.0:
1110 ; CHECK-D-NEXT:    fsrmi a0, 1
1111 ; CHECK-D-NEXT:    vsetvli a1, zero, e32, m8, ta, ma
1112 ; CHECK-D-NEXT:    vfcvt.f.xu.v v8, v8
1113 ; CHECK-D-NEXT:    vsrl.vi v8, v8, 23
1114 ; CHECK-D-NEXT:    li a1, 158
1115 ; CHECK-D-NEXT:    vrsub.vx v8, v8, a1
1116 ; CHECK-D-NEXT:    li a1, 32
1117 ; CHECK-D-NEXT:    vminu.vx v8, v8, a1
1118 ; CHECK-D-NEXT:    fsrm a0
1119 ; CHECK-D-NEXT:    ret
1121 ; CHECK-ZVBB-LABEL: ctlz_nxv16i32:
1122 ; CHECK-ZVBB:       # %bb.0:
1123 ; CHECK-ZVBB-NEXT:    vsetvli a0, zero, e32, m8, ta, ma
1124 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
1125 ; CHECK-ZVBB-NEXT:    ret
1126   %a = call <vscale x 16 x i32> @llvm.ctlz.nxv16i32(<vscale x 16 x i32> %va, i1 false)
1127   ret <vscale x 16 x i32> %a
1129 declare <vscale x 16 x i32> @llvm.ctlz.nxv16i32(<vscale x 16 x i32>, i1)
1131 define <vscale x 1 x i64> @ctlz_nxv1i64(<vscale x 1 x i64> %va) {
1132 ; RV32I-LABEL: ctlz_nxv1i64:
1133 ; RV32I:       # %bb.0:
1134 ; RV32I-NEXT:    vsetvli a0, zero, e64, m1, ta, ma
1135 ; RV32I-NEXT:    vsrl.vi v9, v8, 1
1136 ; RV32I-NEXT:    vor.vv v8, v8, v9
1137 ; RV32I-NEXT:    vsrl.vi v9, v8, 2
1138 ; RV32I-NEXT:    vor.vv v8, v8, v9
1139 ; RV32I-NEXT:    vsrl.vi v9, v8, 4
1140 ; RV32I-NEXT:    vor.vv v8, v8, v9
1141 ; RV32I-NEXT:    vsrl.vi v9, v8, 8
1142 ; RV32I-NEXT:    vor.vv v8, v8, v9
1143 ; RV32I-NEXT:    vsrl.vi v9, v8, 16
1144 ; RV32I-NEXT:    vor.vv v8, v8, v9
1145 ; RV32I-NEXT:    li a0, 32
1146 ; RV32I-NEXT:    vsrl.vx v9, v8, a0
1147 ; RV32I-NEXT:    vor.vv v8, v8, v9
1148 ; RV32I-NEXT:    vnot.v v8, v8
1149 ; RV32I-NEXT:    vsrl.vi v9, v8, 1
1150 ; RV32I-NEXT:    lui a0, 349525
1151 ; RV32I-NEXT:    addi a0, a0, 1365
1152 ; RV32I-NEXT:    vsetvli a1, zero, e32, m1, ta, ma
1153 ; RV32I-NEXT:    vmv.v.x v10, a0
1154 ; RV32I-NEXT:    vsetvli a0, zero, e64, m1, ta, ma
1155 ; RV32I-NEXT:    vand.vv v9, v9, v10
1156 ; RV32I-NEXT:    vsub.vv v8, v8, v9
1157 ; RV32I-NEXT:    lui a0, 209715
1158 ; RV32I-NEXT:    addi a0, a0, 819
1159 ; RV32I-NEXT:    vsetvli a1, zero, e32, m1, ta, ma
1160 ; RV32I-NEXT:    vmv.v.x v9, a0
1161 ; RV32I-NEXT:    vsetvli a0, zero, e64, m1, ta, ma
1162 ; RV32I-NEXT:    vand.vv v10, v8, v9
1163 ; RV32I-NEXT:    vsrl.vi v8, v8, 2
1164 ; RV32I-NEXT:    vand.vv v8, v8, v9
1165 ; RV32I-NEXT:    vadd.vv v8, v10, v8
1166 ; RV32I-NEXT:    vsrl.vi v9, v8, 4
1167 ; RV32I-NEXT:    vadd.vv v8, v8, v9
1168 ; RV32I-NEXT:    lui a0, 61681
1169 ; RV32I-NEXT:    addi a0, a0, -241
1170 ; RV32I-NEXT:    vsetvli a1, zero, e32, m1, ta, ma
1171 ; RV32I-NEXT:    vmv.v.x v9, a0
1172 ; RV32I-NEXT:    vsetvli a0, zero, e64, m1, ta, ma
1173 ; RV32I-NEXT:    vand.vv v8, v8, v9
1174 ; RV32I-NEXT:    lui a0, 4112
1175 ; RV32I-NEXT:    addi a0, a0, 257
1176 ; RV32I-NEXT:    vsetvli a1, zero, e32, m1, ta, ma
1177 ; RV32I-NEXT:    vmv.v.x v9, a0
1178 ; RV32I-NEXT:    vsetvli a0, zero, e64, m1, ta, ma
1179 ; RV32I-NEXT:    vmul.vv v8, v8, v9
1180 ; RV32I-NEXT:    li a0, 56
1181 ; RV32I-NEXT:    vsrl.vx v8, v8, a0
1182 ; RV32I-NEXT:    ret
1184 ; RV64I-LABEL: ctlz_nxv1i64:
1185 ; RV64I:       # %bb.0:
1186 ; RV64I-NEXT:    vsetvli a0, zero, e64, m1, ta, ma
1187 ; RV64I-NEXT:    vsrl.vi v9, v8, 1
1188 ; RV64I-NEXT:    vor.vv v8, v8, v9
1189 ; RV64I-NEXT:    vsrl.vi v9, v8, 2
1190 ; RV64I-NEXT:    vor.vv v8, v8, v9
1191 ; RV64I-NEXT:    vsrl.vi v9, v8, 4
1192 ; RV64I-NEXT:    vor.vv v8, v8, v9
1193 ; RV64I-NEXT:    vsrl.vi v9, v8, 8
1194 ; RV64I-NEXT:    vor.vv v8, v8, v9
1195 ; RV64I-NEXT:    vsrl.vi v9, v8, 16
1196 ; RV64I-NEXT:    vor.vv v8, v8, v9
1197 ; RV64I-NEXT:    li a0, 32
1198 ; RV64I-NEXT:    vsrl.vx v9, v8, a0
1199 ; RV64I-NEXT:    vor.vv v8, v8, v9
1200 ; RV64I-NEXT:    vnot.v v8, v8
1201 ; RV64I-NEXT:    vsrl.vi v9, v8, 1
1202 ; RV64I-NEXT:    lui a0, 349525
1203 ; RV64I-NEXT:    addiw a0, a0, 1365
1204 ; RV64I-NEXT:    slli a1, a0, 32
1205 ; RV64I-NEXT:    add a0, a0, a1
1206 ; RV64I-NEXT:    vand.vx v9, v9, a0
1207 ; RV64I-NEXT:    vsub.vv v8, v8, v9
1208 ; RV64I-NEXT:    lui a0, 209715
1209 ; RV64I-NEXT:    addiw a0, a0, 819
1210 ; RV64I-NEXT:    slli a1, a0, 32
1211 ; RV64I-NEXT:    add a0, a0, a1
1212 ; RV64I-NEXT:    vand.vx v9, v8, a0
1213 ; RV64I-NEXT:    vsrl.vi v8, v8, 2
1214 ; RV64I-NEXT:    vand.vx v8, v8, a0
1215 ; RV64I-NEXT:    vadd.vv v8, v9, v8
1216 ; RV64I-NEXT:    vsrl.vi v9, v8, 4
1217 ; RV64I-NEXT:    vadd.vv v8, v8, v9
1218 ; RV64I-NEXT:    lui a0, 61681
1219 ; RV64I-NEXT:    addiw a0, a0, -241
1220 ; RV64I-NEXT:    slli a1, a0, 32
1221 ; RV64I-NEXT:    add a0, a0, a1
1222 ; RV64I-NEXT:    vand.vx v8, v8, a0
1223 ; RV64I-NEXT:    lui a0, 4112
1224 ; RV64I-NEXT:    addiw a0, a0, 257
1225 ; RV64I-NEXT:    slli a1, a0, 32
1226 ; RV64I-NEXT:    add a0, a0, a1
1227 ; RV64I-NEXT:    vmul.vx v8, v8, a0
1228 ; RV64I-NEXT:    li a0, 56
1229 ; RV64I-NEXT:    vsrl.vx v8, v8, a0
1230 ; RV64I-NEXT:    ret
1232 ; CHECK-F-LABEL: ctlz_nxv1i64:
1233 ; CHECK-F:       # %bb.0:
1234 ; CHECK-F-NEXT:    li a0, 190
1235 ; CHECK-F-NEXT:    vsetvli a1, zero, e32, mf2, ta, ma
1236 ; CHECK-F-NEXT:    vmv.v.x v9, a0
1237 ; CHECK-F-NEXT:    fsrmi a0, 1
1238 ; CHECK-F-NEXT:    vfncvt.f.xu.w v10, v8
1239 ; CHECK-F-NEXT:    vsrl.vi v8, v10, 23
1240 ; CHECK-F-NEXT:    vwsubu.vv v10, v9, v8
1241 ; CHECK-F-NEXT:    li a1, 64
1242 ; CHECK-F-NEXT:    vsetvli zero, zero, e64, m1, ta, ma
1243 ; CHECK-F-NEXT:    vminu.vx v8, v10, a1
1244 ; CHECK-F-NEXT:    fsrm a0
1245 ; CHECK-F-NEXT:    ret
1247 ; CHECK-D-LABEL: ctlz_nxv1i64:
1248 ; CHECK-D:       # %bb.0:
1249 ; CHECK-D-NEXT:    fsrmi a0, 1
1250 ; CHECK-D-NEXT:    vsetvli a1, zero, e64, m1, ta, ma
1251 ; CHECK-D-NEXT:    vfcvt.f.xu.v v8, v8
1252 ; CHECK-D-NEXT:    li a1, 52
1253 ; CHECK-D-NEXT:    vsrl.vx v8, v8, a1
1254 ; CHECK-D-NEXT:    li a1, 1086
1255 ; CHECK-D-NEXT:    vrsub.vx v8, v8, a1
1256 ; CHECK-D-NEXT:    li a1, 64
1257 ; CHECK-D-NEXT:    vminu.vx v8, v8, a1
1258 ; CHECK-D-NEXT:    fsrm a0
1259 ; CHECK-D-NEXT:    ret
1261 ; CHECK-ZVBB-LABEL: ctlz_nxv1i64:
1262 ; CHECK-ZVBB:       # %bb.0:
1263 ; CHECK-ZVBB-NEXT:    vsetvli a0, zero, e64, m1, ta, ma
1264 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
1265 ; CHECK-ZVBB-NEXT:    ret
1266   %a = call <vscale x 1 x i64> @llvm.ctlz.nxv1i64(<vscale x 1 x i64> %va, i1 false)
1267   ret <vscale x 1 x i64> %a
1269 declare <vscale x 1 x i64> @llvm.ctlz.nxv1i64(<vscale x 1 x i64>, i1)
1271 define <vscale x 2 x i64> @ctlz_nxv2i64(<vscale x 2 x i64> %va) {
1272 ; RV32I-LABEL: ctlz_nxv2i64:
1273 ; RV32I:       # %bb.0:
1274 ; RV32I-NEXT:    vsetvli a0, zero, e64, m2, ta, ma
1275 ; RV32I-NEXT:    vsrl.vi v10, v8, 1
1276 ; RV32I-NEXT:    vor.vv v8, v8, v10
1277 ; RV32I-NEXT:    vsrl.vi v10, v8, 2
1278 ; RV32I-NEXT:    vor.vv v8, v8, v10
1279 ; RV32I-NEXT:    vsrl.vi v10, v8, 4
1280 ; RV32I-NEXT:    vor.vv v8, v8, v10
1281 ; RV32I-NEXT:    vsrl.vi v10, v8, 8
1282 ; RV32I-NEXT:    vor.vv v8, v8, v10
1283 ; RV32I-NEXT:    vsrl.vi v10, v8, 16
1284 ; RV32I-NEXT:    vor.vv v8, v8, v10
1285 ; RV32I-NEXT:    li a0, 32
1286 ; RV32I-NEXT:    vsrl.vx v10, v8, a0
1287 ; RV32I-NEXT:    vor.vv v8, v8, v10
1288 ; RV32I-NEXT:    vnot.v v8, v8
1289 ; RV32I-NEXT:    vsrl.vi v10, v8, 1
1290 ; RV32I-NEXT:    lui a0, 349525
1291 ; RV32I-NEXT:    addi a0, a0, 1365
1292 ; RV32I-NEXT:    vsetvli a1, zero, e32, m2, ta, ma
1293 ; RV32I-NEXT:    vmv.v.x v12, a0
1294 ; RV32I-NEXT:    vsetvli a0, zero, e64, m2, ta, ma
1295 ; RV32I-NEXT:    vand.vv v10, v10, v12
1296 ; RV32I-NEXT:    vsub.vv v8, v8, v10
1297 ; RV32I-NEXT:    lui a0, 209715
1298 ; RV32I-NEXT:    addi a0, a0, 819
1299 ; RV32I-NEXT:    vsetvli a1, zero, e32, m2, ta, ma
1300 ; RV32I-NEXT:    vmv.v.x v10, a0
1301 ; RV32I-NEXT:    vsetvli a0, zero, e64, m2, ta, ma
1302 ; RV32I-NEXT:    vand.vv v12, v8, v10
1303 ; RV32I-NEXT:    vsrl.vi v8, v8, 2
1304 ; RV32I-NEXT:    vand.vv v8, v8, v10
1305 ; RV32I-NEXT:    vadd.vv v8, v12, v8
1306 ; RV32I-NEXT:    vsrl.vi v10, v8, 4
1307 ; RV32I-NEXT:    vadd.vv v8, v8, v10
1308 ; RV32I-NEXT:    lui a0, 61681
1309 ; RV32I-NEXT:    addi a0, a0, -241
1310 ; RV32I-NEXT:    vsetvli a1, zero, e32, m2, ta, ma
1311 ; RV32I-NEXT:    vmv.v.x v10, a0
1312 ; RV32I-NEXT:    vsetvli a0, zero, e64, m2, ta, ma
1313 ; RV32I-NEXT:    vand.vv v8, v8, v10
1314 ; RV32I-NEXT:    lui a0, 4112
1315 ; RV32I-NEXT:    addi a0, a0, 257
1316 ; RV32I-NEXT:    vsetvli a1, zero, e32, m2, ta, ma
1317 ; RV32I-NEXT:    vmv.v.x v10, a0
1318 ; RV32I-NEXT:    vsetvli a0, zero, e64, m2, ta, ma
1319 ; RV32I-NEXT:    vmul.vv v8, v8, v10
1320 ; RV32I-NEXT:    li a0, 56
1321 ; RV32I-NEXT:    vsrl.vx v8, v8, a0
1322 ; RV32I-NEXT:    ret
1324 ; RV64I-LABEL: ctlz_nxv2i64:
1325 ; RV64I:       # %bb.0:
1326 ; RV64I-NEXT:    vsetvli a0, zero, e64, m2, ta, ma
1327 ; RV64I-NEXT:    vsrl.vi v10, v8, 1
1328 ; RV64I-NEXT:    vor.vv v8, v8, v10
1329 ; RV64I-NEXT:    vsrl.vi v10, v8, 2
1330 ; RV64I-NEXT:    vor.vv v8, v8, v10
1331 ; RV64I-NEXT:    vsrl.vi v10, v8, 4
1332 ; RV64I-NEXT:    vor.vv v8, v8, v10
1333 ; RV64I-NEXT:    vsrl.vi v10, v8, 8
1334 ; RV64I-NEXT:    vor.vv v8, v8, v10
1335 ; RV64I-NEXT:    vsrl.vi v10, v8, 16
1336 ; RV64I-NEXT:    vor.vv v8, v8, v10
1337 ; RV64I-NEXT:    li a0, 32
1338 ; RV64I-NEXT:    vsrl.vx v10, v8, a0
1339 ; RV64I-NEXT:    vor.vv v8, v8, v10
1340 ; RV64I-NEXT:    vnot.v v8, v8
1341 ; RV64I-NEXT:    vsrl.vi v10, v8, 1
1342 ; RV64I-NEXT:    lui a0, 349525
1343 ; RV64I-NEXT:    addiw a0, a0, 1365
1344 ; RV64I-NEXT:    slli a1, a0, 32
1345 ; RV64I-NEXT:    add a0, a0, a1
1346 ; RV64I-NEXT:    vand.vx v10, v10, a0
1347 ; RV64I-NEXT:    vsub.vv v8, v8, v10
1348 ; RV64I-NEXT:    lui a0, 209715
1349 ; RV64I-NEXT:    addiw a0, a0, 819
1350 ; RV64I-NEXT:    slli a1, a0, 32
1351 ; RV64I-NEXT:    add a0, a0, a1
1352 ; RV64I-NEXT:    vand.vx v10, v8, a0
1353 ; RV64I-NEXT:    vsrl.vi v8, v8, 2
1354 ; RV64I-NEXT:    vand.vx v8, v8, a0
1355 ; RV64I-NEXT:    vadd.vv v8, v10, v8
1356 ; RV64I-NEXT:    vsrl.vi v10, v8, 4
1357 ; RV64I-NEXT:    vadd.vv v8, v8, v10
1358 ; RV64I-NEXT:    lui a0, 61681
1359 ; RV64I-NEXT:    addiw a0, a0, -241
1360 ; RV64I-NEXT:    slli a1, a0, 32
1361 ; RV64I-NEXT:    add a0, a0, a1
1362 ; RV64I-NEXT:    vand.vx v8, v8, a0
1363 ; RV64I-NEXT:    lui a0, 4112
1364 ; RV64I-NEXT:    addiw a0, a0, 257
1365 ; RV64I-NEXT:    slli a1, a0, 32
1366 ; RV64I-NEXT:    add a0, a0, a1
1367 ; RV64I-NEXT:    vmul.vx v8, v8, a0
1368 ; RV64I-NEXT:    li a0, 56
1369 ; RV64I-NEXT:    vsrl.vx v8, v8, a0
1370 ; RV64I-NEXT:    ret
1372 ; CHECK-F-LABEL: ctlz_nxv2i64:
1373 ; CHECK-F:       # %bb.0:
1374 ; CHECK-F-NEXT:    li a0, 190
1375 ; CHECK-F-NEXT:    vsetvli a1, zero, e32, m1, ta, ma
1376 ; CHECK-F-NEXT:    vmv.v.x v10, a0
1377 ; CHECK-F-NEXT:    fsrmi a0, 1
1378 ; CHECK-F-NEXT:    vfncvt.f.xu.w v11, v8
1379 ; CHECK-F-NEXT:    vsrl.vi v8, v11, 23
1380 ; CHECK-F-NEXT:    vwsubu.vv v12, v10, v8
1381 ; CHECK-F-NEXT:    li a1, 64
1382 ; CHECK-F-NEXT:    vsetvli zero, zero, e64, m2, ta, ma
1383 ; CHECK-F-NEXT:    vminu.vx v8, v12, a1
1384 ; CHECK-F-NEXT:    fsrm a0
1385 ; CHECK-F-NEXT:    ret
1387 ; CHECK-D-LABEL: ctlz_nxv2i64:
1388 ; CHECK-D:       # %bb.0:
1389 ; CHECK-D-NEXT:    fsrmi a0, 1
1390 ; CHECK-D-NEXT:    vsetvli a1, zero, e64, m2, ta, ma
1391 ; CHECK-D-NEXT:    vfcvt.f.xu.v v8, v8
1392 ; CHECK-D-NEXT:    li a1, 52
1393 ; CHECK-D-NEXT:    vsrl.vx v8, v8, a1
1394 ; CHECK-D-NEXT:    li a1, 1086
1395 ; CHECK-D-NEXT:    vrsub.vx v8, v8, a1
1396 ; CHECK-D-NEXT:    li a1, 64
1397 ; CHECK-D-NEXT:    vminu.vx v8, v8, a1
1398 ; CHECK-D-NEXT:    fsrm a0
1399 ; CHECK-D-NEXT:    ret
1401 ; CHECK-ZVBB-LABEL: ctlz_nxv2i64:
1402 ; CHECK-ZVBB:       # %bb.0:
1403 ; CHECK-ZVBB-NEXT:    vsetvli a0, zero, e64, m2, ta, ma
1404 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
1405 ; CHECK-ZVBB-NEXT:    ret
1406   %a = call <vscale x 2 x i64> @llvm.ctlz.nxv2i64(<vscale x 2 x i64> %va, i1 false)
1407   ret <vscale x 2 x i64> %a
1409 declare <vscale x 2 x i64> @llvm.ctlz.nxv2i64(<vscale x 2 x i64>, i1)
1411 define <vscale x 4 x i64> @ctlz_nxv4i64(<vscale x 4 x i64> %va) {
1412 ; RV32I-LABEL: ctlz_nxv4i64:
1413 ; RV32I:       # %bb.0:
1414 ; RV32I-NEXT:    vsetvli a0, zero, e64, m4, ta, ma
1415 ; RV32I-NEXT:    vsrl.vi v12, v8, 1
1416 ; RV32I-NEXT:    vor.vv v8, v8, v12
1417 ; RV32I-NEXT:    vsrl.vi v12, v8, 2
1418 ; RV32I-NEXT:    vor.vv v8, v8, v12
1419 ; RV32I-NEXT:    vsrl.vi v12, v8, 4
1420 ; RV32I-NEXT:    vor.vv v8, v8, v12
1421 ; RV32I-NEXT:    vsrl.vi v12, v8, 8
1422 ; RV32I-NEXT:    vor.vv v8, v8, v12
1423 ; RV32I-NEXT:    vsrl.vi v12, v8, 16
1424 ; RV32I-NEXT:    vor.vv v8, v8, v12
1425 ; RV32I-NEXT:    li a0, 32
1426 ; RV32I-NEXT:    vsrl.vx v12, v8, a0
1427 ; RV32I-NEXT:    vor.vv v8, v8, v12
1428 ; RV32I-NEXT:    vnot.v v8, v8
1429 ; RV32I-NEXT:    vsrl.vi v12, v8, 1
1430 ; RV32I-NEXT:    lui a0, 349525
1431 ; RV32I-NEXT:    addi a0, a0, 1365
1432 ; RV32I-NEXT:    vsetvli a1, zero, e32, m4, ta, ma
1433 ; RV32I-NEXT:    vmv.v.x v16, a0
1434 ; RV32I-NEXT:    vsetvli a0, zero, e64, m4, ta, ma
1435 ; RV32I-NEXT:    vand.vv v12, v12, v16
1436 ; RV32I-NEXT:    vsub.vv v8, v8, v12
1437 ; RV32I-NEXT:    lui a0, 209715
1438 ; RV32I-NEXT:    addi a0, a0, 819
1439 ; RV32I-NEXT:    vsetvli a1, zero, e32, m4, ta, ma
1440 ; RV32I-NEXT:    vmv.v.x v12, a0
1441 ; RV32I-NEXT:    vsetvli a0, zero, e64, m4, ta, ma
1442 ; RV32I-NEXT:    vand.vv v16, v8, v12
1443 ; RV32I-NEXT:    vsrl.vi v8, v8, 2
1444 ; RV32I-NEXT:    vand.vv v8, v8, v12
1445 ; RV32I-NEXT:    vadd.vv v8, v16, v8
1446 ; RV32I-NEXT:    vsrl.vi v12, v8, 4
1447 ; RV32I-NEXT:    vadd.vv v8, v8, v12
1448 ; RV32I-NEXT:    lui a0, 61681
1449 ; RV32I-NEXT:    addi a0, a0, -241
1450 ; RV32I-NEXT:    vsetvli a1, zero, e32, m4, ta, ma
1451 ; RV32I-NEXT:    vmv.v.x v12, a0
1452 ; RV32I-NEXT:    vsetvli a0, zero, e64, m4, ta, ma
1453 ; RV32I-NEXT:    vand.vv v8, v8, v12
1454 ; RV32I-NEXT:    lui a0, 4112
1455 ; RV32I-NEXT:    addi a0, a0, 257
1456 ; RV32I-NEXT:    vsetvli a1, zero, e32, m4, ta, ma
1457 ; RV32I-NEXT:    vmv.v.x v12, a0
1458 ; RV32I-NEXT:    vsetvli a0, zero, e64, m4, ta, ma
1459 ; RV32I-NEXT:    vmul.vv v8, v8, v12
1460 ; RV32I-NEXT:    li a0, 56
1461 ; RV32I-NEXT:    vsrl.vx v8, v8, a0
1462 ; RV32I-NEXT:    ret
1464 ; RV64I-LABEL: ctlz_nxv4i64:
1465 ; RV64I:       # %bb.0:
1466 ; RV64I-NEXT:    vsetvli a0, zero, e64, m4, ta, ma
1467 ; RV64I-NEXT:    vsrl.vi v12, v8, 1
1468 ; RV64I-NEXT:    vor.vv v8, v8, v12
1469 ; RV64I-NEXT:    vsrl.vi v12, v8, 2
1470 ; RV64I-NEXT:    vor.vv v8, v8, v12
1471 ; RV64I-NEXT:    vsrl.vi v12, v8, 4
1472 ; RV64I-NEXT:    vor.vv v8, v8, v12
1473 ; RV64I-NEXT:    vsrl.vi v12, v8, 8
1474 ; RV64I-NEXT:    vor.vv v8, v8, v12
1475 ; RV64I-NEXT:    vsrl.vi v12, v8, 16
1476 ; RV64I-NEXT:    vor.vv v8, v8, v12
1477 ; RV64I-NEXT:    li a0, 32
1478 ; RV64I-NEXT:    vsrl.vx v12, v8, a0
1479 ; RV64I-NEXT:    vor.vv v8, v8, v12
1480 ; RV64I-NEXT:    vnot.v v8, v8
1481 ; RV64I-NEXT:    vsrl.vi v12, v8, 1
1482 ; RV64I-NEXT:    lui a0, 349525
1483 ; RV64I-NEXT:    addiw a0, a0, 1365
1484 ; RV64I-NEXT:    slli a1, a0, 32
1485 ; RV64I-NEXT:    add a0, a0, a1
1486 ; RV64I-NEXT:    vand.vx v12, v12, a0
1487 ; RV64I-NEXT:    vsub.vv v8, v8, v12
1488 ; RV64I-NEXT:    lui a0, 209715
1489 ; RV64I-NEXT:    addiw a0, a0, 819
1490 ; RV64I-NEXT:    slli a1, a0, 32
1491 ; RV64I-NEXT:    add a0, a0, a1
1492 ; RV64I-NEXT:    vand.vx v12, v8, a0
1493 ; RV64I-NEXT:    vsrl.vi v8, v8, 2
1494 ; RV64I-NEXT:    vand.vx v8, v8, a0
1495 ; RV64I-NEXT:    vadd.vv v8, v12, v8
1496 ; RV64I-NEXT:    vsrl.vi v12, v8, 4
1497 ; RV64I-NEXT:    vadd.vv v8, v8, v12
1498 ; RV64I-NEXT:    lui a0, 61681
1499 ; RV64I-NEXT:    addiw a0, a0, -241
1500 ; RV64I-NEXT:    slli a1, a0, 32
1501 ; RV64I-NEXT:    add a0, a0, a1
1502 ; RV64I-NEXT:    vand.vx v8, v8, a0
1503 ; RV64I-NEXT:    lui a0, 4112
1504 ; RV64I-NEXT:    addiw a0, a0, 257
1505 ; RV64I-NEXT:    slli a1, a0, 32
1506 ; RV64I-NEXT:    add a0, a0, a1
1507 ; RV64I-NEXT:    vmul.vx v8, v8, a0
1508 ; RV64I-NEXT:    li a0, 56
1509 ; RV64I-NEXT:    vsrl.vx v8, v8, a0
1510 ; RV64I-NEXT:    ret
1512 ; CHECK-F-LABEL: ctlz_nxv4i64:
1513 ; CHECK-F:       # %bb.0:
1514 ; CHECK-F-NEXT:    li a0, 190
1515 ; CHECK-F-NEXT:    vsetvli a1, zero, e32, m2, ta, ma
1516 ; CHECK-F-NEXT:    vmv.v.x v12, a0
1517 ; CHECK-F-NEXT:    fsrmi a0, 1
1518 ; CHECK-F-NEXT:    vfncvt.f.xu.w v14, v8
1519 ; CHECK-F-NEXT:    vsrl.vi v8, v14, 23
1520 ; CHECK-F-NEXT:    vwsubu.vv v16, v12, v8
1521 ; CHECK-F-NEXT:    li a1, 64
1522 ; CHECK-F-NEXT:    vsetvli zero, zero, e64, m4, ta, ma
1523 ; CHECK-F-NEXT:    vminu.vx v8, v16, a1
1524 ; CHECK-F-NEXT:    fsrm a0
1525 ; CHECK-F-NEXT:    ret
1527 ; CHECK-D-LABEL: ctlz_nxv4i64:
1528 ; CHECK-D:       # %bb.0:
1529 ; CHECK-D-NEXT:    fsrmi a0, 1
1530 ; CHECK-D-NEXT:    vsetvli a1, zero, e64, m4, ta, ma
1531 ; CHECK-D-NEXT:    vfcvt.f.xu.v v8, v8
1532 ; CHECK-D-NEXT:    li a1, 52
1533 ; CHECK-D-NEXT:    vsrl.vx v8, v8, a1
1534 ; CHECK-D-NEXT:    li a1, 1086
1535 ; CHECK-D-NEXT:    vrsub.vx v8, v8, a1
1536 ; CHECK-D-NEXT:    li a1, 64
1537 ; CHECK-D-NEXT:    vminu.vx v8, v8, a1
1538 ; CHECK-D-NEXT:    fsrm a0
1539 ; CHECK-D-NEXT:    ret
1541 ; CHECK-ZVBB-LABEL: ctlz_nxv4i64:
1542 ; CHECK-ZVBB:       # %bb.0:
1543 ; CHECK-ZVBB-NEXT:    vsetvli a0, zero, e64, m4, ta, ma
1544 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
1545 ; CHECK-ZVBB-NEXT:    ret
1546   %a = call <vscale x 4 x i64> @llvm.ctlz.nxv4i64(<vscale x 4 x i64> %va, i1 false)
1547   ret <vscale x 4 x i64> %a
1549 declare <vscale x 4 x i64> @llvm.ctlz.nxv4i64(<vscale x 4 x i64>, i1)
1551 define <vscale x 8 x i64> @ctlz_nxv8i64(<vscale x 8 x i64> %va) {
1552 ; RV32I-LABEL: ctlz_nxv8i64:
1553 ; RV32I:       # %bb.0:
1554 ; RV32I-NEXT:    vsetvli a0, zero, e64, m8, ta, ma
1555 ; RV32I-NEXT:    vsrl.vi v16, v8, 1
1556 ; RV32I-NEXT:    vor.vv v8, v8, v16
1557 ; RV32I-NEXT:    vsrl.vi v16, v8, 2
1558 ; RV32I-NEXT:    vor.vv v8, v8, v16
1559 ; RV32I-NEXT:    vsrl.vi v16, v8, 4
1560 ; RV32I-NEXT:    vor.vv v8, v8, v16
1561 ; RV32I-NEXT:    vsrl.vi v16, v8, 8
1562 ; RV32I-NEXT:    vor.vv v8, v8, v16
1563 ; RV32I-NEXT:    vsrl.vi v16, v8, 16
1564 ; RV32I-NEXT:    vor.vv v8, v8, v16
1565 ; RV32I-NEXT:    li a0, 32
1566 ; RV32I-NEXT:    vsrl.vx v16, v8, a0
1567 ; RV32I-NEXT:    vor.vv v8, v8, v16
1568 ; RV32I-NEXT:    vnot.v v8, v8
1569 ; RV32I-NEXT:    vsrl.vi v16, v8, 1
1570 ; RV32I-NEXT:    lui a0, 349525
1571 ; RV32I-NEXT:    addi a0, a0, 1365
1572 ; RV32I-NEXT:    vsetvli a1, zero, e32, m8, ta, ma
1573 ; RV32I-NEXT:    vmv.v.x v24, a0
1574 ; RV32I-NEXT:    vsetvli a0, zero, e64, m8, ta, ma
1575 ; RV32I-NEXT:    vand.vv v16, v16, v24
1576 ; RV32I-NEXT:    vsub.vv v8, v8, v16
1577 ; RV32I-NEXT:    lui a0, 209715
1578 ; RV32I-NEXT:    addi a0, a0, 819
1579 ; RV32I-NEXT:    vsetvli a1, zero, e32, m8, ta, ma
1580 ; RV32I-NEXT:    vmv.v.x v16, a0
1581 ; RV32I-NEXT:    vsetvli a0, zero, e64, m8, ta, ma
1582 ; RV32I-NEXT:    vand.vv v24, v8, v16
1583 ; RV32I-NEXT:    vsrl.vi v8, v8, 2
1584 ; RV32I-NEXT:    vand.vv v8, v8, v16
1585 ; RV32I-NEXT:    vadd.vv v8, v24, v8
1586 ; RV32I-NEXT:    vsrl.vi v16, v8, 4
1587 ; RV32I-NEXT:    vadd.vv v8, v8, v16
1588 ; RV32I-NEXT:    lui a0, 61681
1589 ; RV32I-NEXT:    addi a0, a0, -241
1590 ; RV32I-NEXT:    vsetvli a1, zero, e32, m8, ta, ma
1591 ; RV32I-NEXT:    vmv.v.x v16, a0
1592 ; RV32I-NEXT:    vsetvli a0, zero, e64, m8, ta, ma
1593 ; RV32I-NEXT:    vand.vv v8, v8, v16
1594 ; RV32I-NEXT:    lui a0, 4112
1595 ; RV32I-NEXT:    addi a0, a0, 257
1596 ; RV32I-NEXT:    vsetvli a1, zero, e32, m8, ta, ma
1597 ; RV32I-NEXT:    vmv.v.x v16, a0
1598 ; RV32I-NEXT:    vsetvli a0, zero, e64, m8, ta, ma
1599 ; RV32I-NEXT:    vmul.vv v8, v8, v16
1600 ; RV32I-NEXT:    li a0, 56
1601 ; RV32I-NEXT:    vsrl.vx v8, v8, a0
1602 ; RV32I-NEXT:    ret
1604 ; RV64I-LABEL: ctlz_nxv8i64:
1605 ; RV64I:       # %bb.0:
1606 ; RV64I-NEXT:    vsetvli a0, zero, e64, m8, ta, ma
1607 ; RV64I-NEXT:    vsrl.vi v16, v8, 1
1608 ; RV64I-NEXT:    vor.vv v8, v8, v16
1609 ; RV64I-NEXT:    vsrl.vi v16, v8, 2
1610 ; RV64I-NEXT:    vor.vv v8, v8, v16
1611 ; RV64I-NEXT:    vsrl.vi v16, v8, 4
1612 ; RV64I-NEXT:    vor.vv v8, v8, v16
1613 ; RV64I-NEXT:    vsrl.vi v16, v8, 8
1614 ; RV64I-NEXT:    vor.vv v8, v8, v16
1615 ; RV64I-NEXT:    vsrl.vi v16, v8, 16
1616 ; RV64I-NEXT:    vor.vv v8, v8, v16
1617 ; RV64I-NEXT:    li a0, 32
1618 ; RV64I-NEXT:    vsrl.vx v16, v8, a0
1619 ; RV64I-NEXT:    vor.vv v8, v8, v16
1620 ; RV64I-NEXT:    vnot.v v8, v8
1621 ; RV64I-NEXT:    vsrl.vi v16, v8, 1
1622 ; RV64I-NEXT:    lui a0, 349525
1623 ; RV64I-NEXT:    addiw a0, a0, 1365
1624 ; RV64I-NEXT:    slli a1, a0, 32
1625 ; RV64I-NEXT:    add a0, a0, a1
1626 ; RV64I-NEXT:    vand.vx v16, v16, a0
1627 ; RV64I-NEXT:    vsub.vv v8, v8, v16
1628 ; RV64I-NEXT:    lui a0, 209715
1629 ; RV64I-NEXT:    addiw a0, a0, 819
1630 ; RV64I-NEXT:    slli a1, a0, 32
1631 ; RV64I-NEXT:    add a0, a0, a1
1632 ; RV64I-NEXT:    vand.vx v16, v8, a0
1633 ; RV64I-NEXT:    vsrl.vi v8, v8, 2
1634 ; RV64I-NEXT:    vand.vx v8, v8, a0
1635 ; RV64I-NEXT:    vadd.vv v8, v16, v8
1636 ; RV64I-NEXT:    vsrl.vi v16, v8, 4
1637 ; RV64I-NEXT:    vadd.vv v8, v8, v16
1638 ; RV64I-NEXT:    lui a0, 61681
1639 ; RV64I-NEXT:    addiw a0, a0, -241
1640 ; RV64I-NEXT:    slli a1, a0, 32
1641 ; RV64I-NEXT:    add a0, a0, a1
1642 ; RV64I-NEXT:    vand.vx v8, v8, a0
1643 ; RV64I-NEXT:    lui a0, 4112
1644 ; RV64I-NEXT:    addiw a0, a0, 257
1645 ; RV64I-NEXT:    slli a1, a0, 32
1646 ; RV64I-NEXT:    add a0, a0, a1
1647 ; RV64I-NEXT:    vmul.vx v8, v8, a0
1648 ; RV64I-NEXT:    li a0, 56
1649 ; RV64I-NEXT:    vsrl.vx v8, v8, a0
1650 ; RV64I-NEXT:    ret
1652 ; CHECK-F-LABEL: ctlz_nxv8i64:
1653 ; CHECK-F:       # %bb.0:
1654 ; CHECK-F-NEXT:    li a0, 190
1655 ; CHECK-F-NEXT:    vsetvli a1, zero, e32, m4, ta, ma
1656 ; CHECK-F-NEXT:    vmv.v.x v16, a0
1657 ; CHECK-F-NEXT:    fsrmi a0, 1
1658 ; CHECK-F-NEXT:    vfncvt.f.xu.w v20, v8
1659 ; CHECK-F-NEXT:    vsrl.vi v8, v20, 23
1660 ; CHECK-F-NEXT:    vwsubu.vv v24, v16, v8
1661 ; CHECK-F-NEXT:    li a1, 64
1662 ; CHECK-F-NEXT:    vsetvli zero, zero, e64, m8, ta, ma
1663 ; CHECK-F-NEXT:    vminu.vx v8, v24, a1
1664 ; CHECK-F-NEXT:    fsrm a0
1665 ; CHECK-F-NEXT:    ret
1667 ; CHECK-D-LABEL: ctlz_nxv8i64:
1668 ; CHECK-D:       # %bb.0:
1669 ; CHECK-D-NEXT:    fsrmi a0, 1
1670 ; CHECK-D-NEXT:    vsetvli a1, zero, e64, m8, ta, ma
1671 ; CHECK-D-NEXT:    vfcvt.f.xu.v v8, v8
1672 ; CHECK-D-NEXT:    li a1, 52
1673 ; CHECK-D-NEXT:    vsrl.vx v8, v8, a1
1674 ; CHECK-D-NEXT:    li a1, 1086
1675 ; CHECK-D-NEXT:    vrsub.vx v8, v8, a1
1676 ; CHECK-D-NEXT:    li a1, 64
1677 ; CHECK-D-NEXT:    vminu.vx v8, v8, a1
1678 ; CHECK-D-NEXT:    fsrm a0
1679 ; CHECK-D-NEXT:    ret
1681 ; CHECK-ZVBB-LABEL: ctlz_nxv8i64:
1682 ; CHECK-ZVBB:       # %bb.0:
1683 ; CHECK-ZVBB-NEXT:    vsetvli a0, zero, e64, m8, ta, ma
1684 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
1685 ; CHECK-ZVBB-NEXT:    ret
1686   %a = call <vscale x 8 x i64> @llvm.ctlz.nxv8i64(<vscale x 8 x i64> %va, i1 false)
1687   ret <vscale x 8 x i64> %a
1689 declare <vscale x 8 x i64> @llvm.ctlz.nxv8i64(<vscale x 8 x i64>, i1)
1691 define <vscale x 1 x i8> @ctlz_zero_undef_nxv1i8(<vscale x 1 x i8> %va) {
1692 ; CHECK-ZVE64X-LABEL: ctlz_zero_undef_nxv1i8:
1693 ; CHECK-ZVE64X:       # %bb.0:
1694 ; CHECK-ZVE64X-NEXT:    vsetvli a0, zero, e8, mf8, ta, ma
1695 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 1
1696 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
1697 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 2
1698 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
1699 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 4
1700 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
1701 ; CHECK-ZVE64X-NEXT:    vnot.v v8, v8
1702 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 1
1703 ; CHECK-ZVE64X-NEXT:    li a0, 85
1704 ; CHECK-ZVE64X-NEXT:    vand.vx v9, v9, a0
1705 ; CHECK-ZVE64X-NEXT:    vsub.vv v8, v8, v9
1706 ; CHECK-ZVE64X-NEXT:    li a0, 51
1707 ; CHECK-ZVE64X-NEXT:    vand.vx v9, v8, a0
1708 ; CHECK-ZVE64X-NEXT:    vsrl.vi v8, v8, 2
1709 ; CHECK-ZVE64X-NEXT:    vand.vx v8, v8, a0
1710 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v9, v8
1711 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 4
1712 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v8, v9
1713 ; CHECK-ZVE64X-NEXT:    vand.vi v8, v8, 15
1714 ; CHECK-ZVE64X-NEXT:    ret
1716 ; CHECK-F-LABEL: ctlz_zero_undef_nxv1i8:
1717 ; CHECK-F:       # %bb.0:
1718 ; CHECK-F-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
1719 ; CHECK-F-NEXT:    vzext.vf2 v9, v8
1720 ; CHECK-F-NEXT:    vfwcvt.f.xu.v v8, v9
1721 ; CHECK-F-NEXT:    vnsrl.wi v8, v8, 23
1722 ; CHECK-F-NEXT:    vsetvli zero, zero, e8, mf8, ta, ma
1723 ; CHECK-F-NEXT:    vnsrl.wi v8, v8, 0
1724 ; CHECK-F-NEXT:    li a0, 134
1725 ; CHECK-F-NEXT:    vrsub.vx v8, v8, a0
1726 ; CHECK-F-NEXT:    ret
1728 ; CHECK-D-LABEL: ctlz_zero_undef_nxv1i8:
1729 ; CHECK-D:       # %bb.0:
1730 ; CHECK-D-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
1731 ; CHECK-D-NEXT:    vzext.vf2 v9, v8
1732 ; CHECK-D-NEXT:    vfwcvt.f.xu.v v8, v9
1733 ; CHECK-D-NEXT:    vnsrl.wi v8, v8, 23
1734 ; CHECK-D-NEXT:    vsetvli zero, zero, e8, mf8, ta, ma
1735 ; CHECK-D-NEXT:    vnsrl.wi v8, v8, 0
1736 ; CHECK-D-NEXT:    li a0, 134
1737 ; CHECK-D-NEXT:    vrsub.vx v8, v8, a0
1738 ; CHECK-D-NEXT:    ret
1740 ; CHECK-ZVBB-LABEL: ctlz_zero_undef_nxv1i8:
1741 ; CHECK-ZVBB:       # %bb.0:
1742 ; CHECK-ZVBB-NEXT:    vsetvli a0, zero, e8, mf8, ta, ma
1743 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
1744 ; CHECK-ZVBB-NEXT:    ret
1745   %a = call <vscale x 1 x i8> @llvm.ctlz.nxv1i8(<vscale x 1 x i8> %va, i1 true)
1746   ret <vscale x 1 x i8> %a
1749 define <vscale x 2 x i8> @ctlz_zero_undef_nxv2i8(<vscale x 2 x i8> %va) {
1750 ; CHECK-ZVE64X-LABEL: ctlz_zero_undef_nxv2i8:
1751 ; CHECK-ZVE64X:       # %bb.0:
1752 ; CHECK-ZVE64X-NEXT:    vsetvli a0, zero, e8, mf4, ta, ma
1753 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 1
1754 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
1755 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 2
1756 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
1757 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 4
1758 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
1759 ; CHECK-ZVE64X-NEXT:    vnot.v v8, v8
1760 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 1
1761 ; CHECK-ZVE64X-NEXT:    li a0, 85
1762 ; CHECK-ZVE64X-NEXT:    vand.vx v9, v9, a0
1763 ; CHECK-ZVE64X-NEXT:    vsub.vv v8, v8, v9
1764 ; CHECK-ZVE64X-NEXT:    li a0, 51
1765 ; CHECK-ZVE64X-NEXT:    vand.vx v9, v8, a0
1766 ; CHECK-ZVE64X-NEXT:    vsrl.vi v8, v8, 2
1767 ; CHECK-ZVE64X-NEXT:    vand.vx v8, v8, a0
1768 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v9, v8
1769 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 4
1770 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v8, v9
1771 ; CHECK-ZVE64X-NEXT:    vand.vi v8, v8, 15
1772 ; CHECK-ZVE64X-NEXT:    ret
1774 ; CHECK-F-LABEL: ctlz_zero_undef_nxv2i8:
1775 ; CHECK-F:       # %bb.0:
1776 ; CHECK-F-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
1777 ; CHECK-F-NEXT:    vzext.vf2 v9, v8
1778 ; CHECK-F-NEXT:    vfwcvt.f.xu.v v8, v9
1779 ; CHECK-F-NEXT:    vnsrl.wi v8, v8, 23
1780 ; CHECK-F-NEXT:    vsetvli zero, zero, e8, mf4, ta, ma
1781 ; CHECK-F-NEXT:    vnsrl.wi v8, v8, 0
1782 ; CHECK-F-NEXT:    li a0, 134
1783 ; CHECK-F-NEXT:    vrsub.vx v8, v8, a0
1784 ; CHECK-F-NEXT:    ret
1786 ; CHECK-D-LABEL: ctlz_zero_undef_nxv2i8:
1787 ; CHECK-D:       # %bb.0:
1788 ; CHECK-D-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
1789 ; CHECK-D-NEXT:    vzext.vf2 v9, v8
1790 ; CHECK-D-NEXT:    vfwcvt.f.xu.v v8, v9
1791 ; CHECK-D-NEXT:    vnsrl.wi v8, v8, 23
1792 ; CHECK-D-NEXT:    vsetvli zero, zero, e8, mf4, ta, ma
1793 ; CHECK-D-NEXT:    vnsrl.wi v8, v8, 0
1794 ; CHECK-D-NEXT:    li a0, 134
1795 ; CHECK-D-NEXT:    vrsub.vx v8, v8, a0
1796 ; CHECK-D-NEXT:    ret
1798 ; CHECK-ZVBB-LABEL: ctlz_zero_undef_nxv2i8:
1799 ; CHECK-ZVBB:       # %bb.0:
1800 ; CHECK-ZVBB-NEXT:    vsetvli a0, zero, e8, mf4, ta, ma
1801 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
1802 ; CHECK-ZVBB-NEXT:    ret
1803   %a = call <vscale x 2 x i8> @llvm.ctlz.nxv2i8(<vscale x 2 x i8> %va, i1 true)
1804   ret <vscale x 2 x i8> %a
1807 define <vscale x 4 x i8> @ctlz_zero_undef_nxv4i8(<vscale x 4 x i8> %va) {
1808 ; CHECK-ZVE64X-LABEL: ctlz_zero_undef_nxv4i8:
1809 ; CHECK-ZVE64X:       # %bb.0:
1810 ; CHECK-ZVE64X-NEXT:    vsetvli a0, zero, e8, mf2, ta, ma
1811 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 1
1812 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
1813 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 2
1814 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
1815 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 4
1816 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
1817 ; CHECK-ZVE64X-NEXT:    vnot.v v8, v8
1818 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 1
1819 ; CHECK-ZVE64X-NEXT:    li a0, 85
1820 ; CHECK-ZVE64X-NEXT:    vand.vx v9, v9, a0
1821 ; CHECK-ZVE64X-NEXT:    vsub.vv v8, v8, v9
1822 ; CHECK-ZVE64X-NEXT:    li a0, 51
1823 ; CHECK-ZVE64X-NEXT:    vand.vx v9, v8, a0
1824 ; CHECK-ZVE64X-NEXT:    vsrl.vi v8, v8, 2
1825 ; CHECK-ZVE64X-NEXT:    vand.vx v8, v8, a0
1826 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v9, v8
1827 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 4
1828 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v8, v9
1829 ; CHECK-ZVE64X-NEXT:    vand.vi v8, v8, 15
1830 ; CHECK-ZVE64X-NEXT:    ret
1832 ; CHECK-F-LABEL: ctlz_zero_undef_nxv4i8:
1833 ; CHECK-F:       # %bb.0:
1834 ; CHECK-F-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
1835 ; CHECK-F-NEXT:    vzext.vf2 v9, v8
1836 ; CHECK-F-NEXT:    vfwcvt.f.xu.v v10, v9
1837 ; CHECK-F-NEXT:    vnsrl.wi v8, v10, 23
1838 ; CHECK-F-NEXT:    vsetvli zero, zero, e8, mf2, ta, ma
1839 ; CHECK-F-NEXT:    vnsrl.wi v8, v8, 0
1840 ; CHECK-F-NEXT:    li a0, 134
1841 ; CHECK-F-NEXT:    vrsub.vx v8, v8, a0
1842 ; CHECK-F-NEXT:    ret
1844 ; CHECK-D-LABEL: ctlz_zero_undef_nxv4i8:
1845 ; CHECK-D:       # %bb.0:
1846 ; CHECK-D-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
1847 ; CHECK-D-NEXT:    vzext.vf2 v9, v8
1848 ; CHECK-D-NEXT:    vfwcvt.f.xu.v v10, v9
1849 ; CHECK-D-NEXT:    vnsrl.wi v8, v10, 23
1850 ; CHECK-D-NEXT:    vsetvli zero, zero, e8, mf2, ta, ma
1851 ; CHECK-D-NEXT:    vnsrl.wi v8, v8, 0
1852 ; CHECK-D-NEXT:    li a0, 134
1853 ; CHECK-D-NEXT:    vrsub.vx v8, v8, a0
1854 ; CHECK-D-NEXT:    ret
1856 ; CHECK-ZVBB-LABEL: ctlz_zero_undef_nxv4i8:
1857 ; CHECK-ZVBB:       # %bb.0:
1858 ; CHECK-ZVBB-NEXT:    vsetvli a0, zero, e8, mf2, ta, ma
1859 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
1860 ; CHECK-ZVBB-NEXT:    ret
1861   %a = call <vscale x 4 x i8> @llvm.ctlz.nxv4i8(<vscale x 4 x i8> %va, i1 true)
1862   ret <vscale x 4 x i8> %a
1865 define <vscale x 8 x i8> @ctlz_zero_undef_nxv8i8(<vscale x 8 x i8> %va) {
1866 ; CHECK-ZVE64X-LABEL: ctlz_zero_undef_nxv8i8:
1867 ; CHECK-ZVE64X:       # %bb.0:
1868 ; CHECK-ZVE64X-NEXT:    vsetvli a0, zero, e8, m1, ta, ma
1869 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 1
1870 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
1871 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 2
1872 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
1873 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 4
1874 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
1875 ; CHECK-ZVE64X-NEXT:    vnot.v v8, v8
1876 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 1
1877 ; CHECK-ZVE64X-NEXT:    li a0, 85
1878 ; CHECK-ZVE64X-NEXT:    vand.vx v9, v9, a0
1879 ; CHECK-ZVE64X-NEXT:    vsub.vv v8, v8, v9
1880 ; CHECK-ZVE64X-NEXT:    li a0, 51
1881 ; CHECK-ZVE64X-NEXT:    vand.vx v9, v8, a0
1882 ; CHECK-ZVE64X-NEXT:    vsrl.vi v8, v8, 2
1883 ; CHECK-ZVE64X-NEXT:    vand.vx v8, v8, a0
1884 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v9, v8
1885 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 4
1886 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v8, v9
1887 ; CHECK-ZVE64X-NEXT:    vand.vi v8, v8, 15
1888 ; CHECK-ZVE64X-NEXT:    ret
1890 ; CHECK-F-LABEL: ctlz_zero_undef_nxv8i8:
1891 ; CHECK-F:       # %bb.0:
1892 ; CHECK-F-NEXT:    vsetvli a0, zero, e16, m2, ta, ma
1893 ; CHECK-F-NEXT:    vzext.vf2 v10, v8
1894 ; CHECK-F-NEXT:    vfwcvt.f.xu.v v12, v10
1895 ; CHECK-F-NEXT:    vnsrl.wi v8, v12, 23
1896 ; CHECK-F-NEXT:    vsetvli zero, zero, e8, m1, ta, ma
1897 ; CHECK-F-NEXT:    vnsrl.wi v10, v8, 0
1898 ; CHECK-F-NEXT:    li a0, 134
1899 ; CHECK-F-NEXT:    vrsub.vx v8, v10, a0
1900 ; CHECK-F-NEXT:    ret
1902 ; CHECK-D-LABEL: ctlz_zero_undef_nxv8i8:
1903 ; CHECK-D:       # %bb.0:
1904 ; CHECK-D-NEXT:    vsetvli a0, zero, e16, m2, ta, ma
1905 ; CHECK-D-NEXT:    vzext.vf2 v10, v8
1906 ; CHECK-D-NEXT:    vfwcvt.f.xu.v v12, v10
1907 ; CHECK-D-NEXT:    vnsrl.wi v8, v12, 23
1908 ; CHECK-D-NEXT:    vsetvli zero, zero, e8, m1, ta, ma
1909 ; CHECK-D-NEXT:    vnsrl.wi v10, v8, 0
1910 ; CHECK-D-NEXT:    li a0, 134
1911 ; CHECK-D-NEXT:    vrsub.vx v8, v10, a0
1912 ; CHECK-D-NEXT:    ret
1914 ; CHECK-ZVBB-LABEL: ctlz_zero_undef_nxv8i8:
1915 ; CHECK-ZVBB:       # %bb.0:
1916 ; CHECK-ZVBB-NEXT:    vsetvli a0, zero, e8, m1, ta, ma
1917 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
1918 ; CHECK-ZVBB-NEXT:    ret
1919   %a = call <vscale x 8 x i8> @llvm.ctlz.nxv8i8(<vscale x 8 x i8> %va, i1 true)
1920   ret <vscale x 8 x i8> %a
1923 define <vscale x 16 x i8> @ctlz_zero_undef_nxv16i8(<vscale x 16 x i8> %va) {
1924 ; CHECK-ZVE64X-LABEL: ctlz_zero_undef_nxv16i8:
1925 ; CHECK-ZVE64X:       # %bb.0:
1926 ; CHECK-ZVE64X-NEXT:    vsetvli a0, zero, e8, m2, ta, ma
1927 ; CHECK-ZVE64X-NEXT:    vsrl.vi v10, v8, 1
1928 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v10
1929 ; CHECK-ZVE64X-NEXT:    vsrl.vi v10, v8, 2
1930 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v10
1931 ; CHECK-ZVE64X-NEXT:    vsrl.vi v10, v8, 4
1932 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v10
1933 ; CHECK-ZVE64X-NEXT:    vnot.v v8, v8
1934 ; CHECK-ZVE64X-NEXT:    vsrl.vi v10, v8, 1
1935 ; CHECK-ZVE64X-NEXT:    li a0, 85
1936 ; CHECK-ZVE64X-NEXT:    vand.vx v10, v10, a0
1937 ; CHECK-ZVE64X-NEXT:    vsub.vv v8, v8, v10
1938 ; CHECK-ZVE64X-NEXT:    li a0, 51
1939 ; CHECK-ZVE64X-NEXT:    vand.vx v10, v8, a0
1940 ; CHECK-ZVE64X-NEXT:    vsrl.vi v8, v8, 2
1941 ; CHECK-ZVE64X-NEXT:    vand.vx v8, v8, a0
1942 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v10, v8
1943 ; CHECK-ZVE64X-NEXT:    vsrl.vi v10, v8, 4
1944 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v8, v10
1945 ; CHECK-ZVE64X-NEXT:    vand.vi v8, v8, 15
1946 ; CHECK-ZVE64X-NEXT:    ret
1948 ; CHECK-F-LABEL: ctlz_zero_undef_nxv16i8:
1949 ; CHECK-F:       # %bb.0:
1950 ; CHECK-F-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
1951 ; CHECK-F-NEXT:    vzext.vf2 v12, v8
1952 ; CHECK-F-NEXT:    vfwcvt.f.xu.v v16, v12
1953 ; CHECK-F-NEXT:    vnsrl.wi v8, v16, 23
1954 ; CHECK-F-NEXT:    vsetvli zero, zero, e8, m2, ta, ma
1955 ; CHECK-F-NEXT:    vnsrl.wi v12, v8, 0
1956 ; CHECK-F-NEXT:    li a0, 134
1957 ; CHECK-F-NEXT:    vrsub.vx v8, v12, a0
1958 ; CHECK-F-NEXT:    ret
1960 ; CHECK-D-LABEL: ctlz_zero_undef_nxv16i8:
1961 ; CHECK-D:       # %bb.0:
1962 ; CHECK-D-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
1963 ; CHECK-D-NEXT:    vzext.vf2 v12, v8
1964 ; CHECK-D-NEXT:    vfwcvt.f.xu.v v16, v12
1965 ; CHECK-D-NEXT:    vnsrl.wi v8, v16, 23
1966 ; CHECK-D-NEXT:    vsetvli zero, zero, e8, m2, ta, ma
1967 ; CHECK-D-NEXT:    vnsrl.wi v12, v8, 0
1968 ; CHECK-D-NEXT:    li a0, 134
1969 ; CHECK-D-NEXT:    vrsub.vx v8, v12, a0
1970 ; CHECK-D-NEXT:    ret
1972 ; CHECK-ZVBB-LABEL: ctlz_zero_undef_nxv16i8:
1973 ; CHECK-ZVBB:       # %bb.0:
1974 ; CHECK-ZVBB-NEXT:    vsetvli a0, zero, e8, m2, ta, ma
1975 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
1976 ; CHECK-ZVBB-NEXT:    ret
1977   %a = call <vscale x 16 x i8> @llvm.ctlz.nxv16i8(<vscale x 16 x i8> %va, i1 true)
1978   ret <vscale x 16 x i8> %a
1981 define <vscale x 32 x i8> @ctlz_zero_undef_nxv32i8(<vscale x 32 x i8> %va) {
1982 ; CHECK-LABEL: ctlz_zero_undef_nxv32i8:
1983 ; CHECK:       # %bb.0:
1984 ; CHECK-NEXT:    vsetvli a0, zero, e8, m4, ta, ma
1985 ; CHECK-NEXT:    vsrl.vi v12, v8, 1
1986 ; CHECK-NEXT:    vor.vv v8, v8, v12
1987 ; CHECK-NEXT:    vsrl.vi v12, v8, 2
1988 ; CHECK-NEXT:    vor.vv v8, v8, v12
1989 ; CHECK-NEXT:    vsrl.vi v12, v8, 4
1990 ; CHECK-NEXT:    vor.vv v8, v8, v12
1991 ; CHECK-NEXT:    vnot.v v8, v8
1992 ; CHECK-NEXT:    vsrl.vi v12, v8, 1
1993 ; CHECK-NEXT:    li a0, 85
1994 ; CHECK-NEXT:    vand.vx v12, v12, a0
1995 ; CHECK-NEXT:    vsub.vv v8, v8, v12
1996 ; CHECK-NEXT:    li a0, 51
1997 ; CHECK-NEXT:    vand.vx v12, v8, a0
1998 ; CHECK-NEXT:    vsrl.vi v8, v8, 2
1999 ; CHECK-NEXT:    vand.vx v8, v8, a0
2000 ; CHECK-NEXT:    vadd.vv v8, v12, v8
2001 ; CHECK-NEXT:    vsrl.vi v12, v8, 4
2002 ; CHECK-NEXT:    vadd.vv v8, v8, v12
2003 ; CHECK-NEXT:    vand.vi v8, v8, 15
2004 ; CHECK-NEXT:    ret
2006 ; CHECK-ZVBB-LABEL: ctlz_zero_undef_nxv32i8:
2007 ; CHECK-ZVBB:       # %bb.0:
2008 ; CHECK-ZVBB-NEXT:    vsetvli a0, zero, e8, m4, ta, ma
2009 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
2010 ; CHECK-ZVBB-NEXT:    ret
2011   %a = call <vscale x 32 x i8> @llvm.ctlz.nxv32i8(<vscale x 32 x i8> %va, i1 true)
2012   ret <vscale x 32 x i8> %a
2015 define <vscale x 64 x i8> @ctlz_zero_undef_nxv64i8(<vscale x 64 x i8> %va) {
2016 ; CHECK-LABEL: ctlz_zero_undef_nxv64i8:
2017 ; CHECK:       # %bb.0:
2018 ; CHECK-NEXT:    vsetvli a0, zero, e8, m8, ta, ma
2019 ; CHECK-NEXT:    vsrl.vi v16, v8, 1
2020 ; CHECK-NEXT:    vor.vv v8, v8, v16
2021 ; CHECK-NEXT:    vsrl.vi v16, v8, 2
2022 ; CHECK-NEXT:    vor.vv v8, v8, v16
2023 ; CHECK-NEXT:    vsrl.vi v16, v8, 4
2024 ; CHECK-NEXT:    vor.vv v8, v8, v16
2025 ; CHECK-NEXT:    vnot.v v8, v8
2026 ; CHECK-NEXT:    vsrl.vi v16, v8, 1
2027 ; CHECK-NEXT:    li a0, 85
2028 ; CHECK-NEXT:    vand.vx v16, v16, a0
2029 ; CHECK-NEXT:    vsub.vv v8, v8, v16
2030 ; CHECK-NEXT:    li a0, 51
2031 ; CHECK-NEXT:    vand.vx v16, v8, a0
2032 ; CHECK-NEXT:    vsrl.vi v8, v8, 2
2033 ; CHECK-NEXT:    vand.vx v8, v8, a0
2034 ; CHECK-NEXT:    vadd.vv v8, v16, v8
2035 ; CHECK-NEXT:    vsrl.vi v16, v8, 4
2036 ; CHECK-NEXT:    vadd.vv v8, v8, v16
2037 ; CHECK-NEXT:    vand.vi v8, v8, 15
2038 ; CHECK-NEXT:    ret
2040 ; CHECK-ZVBB-LABEL: ctlz_zero_undef_nxv64i8:
2041 ; CHECK-ZVBB:       # %bb.0:
2042 ; CHECK-ZVBB-NEXT:    vsetvli a0, zero, e8, m8, ta, ma
2043 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
2044 ; CHECK-ZVBB-NEXT:    ret
2045   %a = call <vscale x 64 x i8> @llvm.ctlz.nxv64i8(<vscale x 64 x i8> %va, i1 true)
2046   ret <vscale x 64 x i8> %a
2049 define <vscale x 1 x i16> @ctlz_zero_undef_nxv1i16(<vscale x 1 x i16> %va) {
2050 ; CHECK-ZVE64X-LABEL: ctlz_zero_undef_nxv1i16:
2051 ; CHECK-ZVE64X:       # %bb.0:
2052 ; CHECK-ZVE64X-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
2053 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 1
2054 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
2055 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 2
2056 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
2057 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 4
2058 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
2059 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 8
2060 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
2061 ; CHECK-ZVE64X-NEXT:    vnot.v v8, v8
2062 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 1
2063 ; CHECK-ZVE64X-NEXT:    lui a0, 5
2064 ; CHECK-ZVE64X-NEXT:    addi a0, a0, 1365
2065 ; CHECK-ZVE64X-NEXT:    vand.vx v9, v9, a0
2066 ; CHECK-ZVE64X-NEXT:    vsub.vv v8, v8, v9
2067 ; CHECK-ZVE64X-NEXT:    lui a0, 3
2068 ; CHECK-ZVE64X-NEXT:    addi a0, a0, 819
2069 ; CHECK-ZVE64X-NEXT:    vand.vx v9, v8, a0
2070 ; CHECK-ZVE64X-NEXT:    vsrl.vi v8, v8, 2
2071 ; CHECK-ZVE64X-NEXT:    vand.vx v8, v8, a0
2072 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v9, v8
2073 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 4
2074 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v8, v9
2075 ; CHECK-ZVE64X-NEXT:    lui a0, 1
2076 ; CHECK-ZVE64X-NEXT:    addi a0, a0, -241
2077 ; CHECK-ZVE64X-NEXT:    vand.vx v8, v8, a0
2078 ; CHECK-ZVE64X-NEXT:    li a0, 257
2079 ; CHECK-ZVE64X-NEXT:    vmul.vx v8, v8, a0
2080 ; CHECK-ZVE64X-NEXT:    vsrl.vi v8, v8, 8
2081 ; CHECK-ZVE64X-NEXT:    ret
2083 ; CHECK-F-LABEL: ctlz_zero_undef_nxv1i16:
2084 ; CHECK-F:       # %bb.0:
2085 ; CHECK-F-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
2086 ; CHECK-F-NEXT:    vfwcvt.f.xu.v v9, v8
2087 ; CHECK-F-NEXT:    vnsrl.wi v8, v9, 23
2088 ; CHECK-F-NEXT:    li a0, 142
2089 ; CHECK-F-NEXT:    vrsub.vx v8, v8, a0
2090 ; CHECK-F-NEXT:    ret
2092 ; CHECK-D-LABEL: ctlz_zero_undef_nxv1i16:
2093 ; CHECK-D:       # %bb.0:
2094 ; CHECK-D-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
2095 ; CHECK-D-NEXT:    vfwcvt.f.xu.v v9, v8
2096 ; CHECK-D-NEXT:    vnsrl.wi v8, v9, 23
2097 ; CHECK-D-NEXT:    li a0, 142
2098 ; CHECK-D-NEXT:    vrsub.vx v8, v8, a0
2099 ; CHECK-D-NEXT:    ret
2101 ; CHECK-ZVBB-LABEL: ctlz_zero_undef_nxv1i16:
2102 ; CHECK-ZVBB:       # %bb.0:
2103 ; CHECK-ZVBB-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
2104 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
2105 ; CHECK-ZVBB-NEXT:    ret
2106   %a = call <vscale x 1 x i16> @llvm.ctlz.nxv1i16(<vscale x 1 x i16> %va, i1 true)
2107   ret <vscale x 1 x i16> %a
2110 define <vscale x 2 x i16> @ctlz_zero_undef_nxv2i16(<vscale x 2 x i16> %va) {
2111 ; CHECK-ZVE64X-LABEL: ctlz_zero_undef_nxv2i16:
2112 ; CHECK-ZVE64X:       # %bb.0:
2113 ; CHECK-ZVE64X-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
2114 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 1
2115 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
2116 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 2
2117 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
2118 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 4
2119 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
2120 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 8
2121 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
2122 ; CHECK-ZVE64X-NEXT:    vnot.v v8, v8
2123 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 1
2124 ; CHECK-ZVE64X-NEXT:    lui a0, 5
2125 ; CHECK-ZVE64X-NEXT:    addi a0, a0, 1365
2126 ; CHECK-ZVE64X-NEXT:    vand.vx v9, v9, a0
2127 ; CHECK-ZVE64X-NEXT:    vsub.vv v8, v8, v9
2128 ; CHECK-ZVE64X-NEXT:    lui a0, 3
2129 ; CHECK-ZVE64X-NEXT:    addi a0, a0, 819
2130 ; CHECK-ZVE64X-NEXT:    vand.vx v9, v8, a0
2131 ; CHECK-ZVE64X-NEXT:    vsrl.vi v8, v8, 2
2132 ; CHECK-ZVE64X-NEXT:    vand.vx v8, v8, a0
2133 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v9, v8
2134 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 4
2135 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v8, v9
2136 ; CHECK-ZVE64X-NEXT:    lui a0, 1
2137 ; CHECK-ZVE64X-NEXT:    addi a0, a0, -241
2138 ; CHECK-ZVE64X-NEXT:    vand.vx v8, v8, a0
2139 ; CHECK-ZVE64X-NEXT:    li a0, 257
2140 ; CHECK-ZVE64X-NEXT:    vmul.vx v8, v8, a0
2141 ; CHECK-ZVE64X-NEXT:    vsrl.vi v8, v8, 8
2142 ; CHECK-ZVE64X-NEXT:    ret
2144 ; CHECK-F-LABEL: ctlz_zero_undef_nxv2i16:
2145 ; CHECK-F:       # %bb.0:
2146 ; CHECK-F-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
2147 ; CHECK-F-NEXT:    vfwcvt.f.xu.v v9, v8
2148 ; CHECK-F-NEXT:    vnsrl.wi v8, v9, 23
2149 ; CHECK-F-NEXT:    li a0, 142
2150 ; CHECK-F-NEXT:    vrsub.vx v8, v8, a0
2151 ; CHECK-F-NEXT:    ret
2153 ; CHECK-D-LABEL: ctlz_zero_undef_nxv2i16:
2154 ; CHECK-D:       # %bb.0:
2155 ; CHECK-D-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
2156 ; CHECK-D-NEXT:    vfwcvt.f.xu.v v9, v8
2157 ; CHECK-D-NEXT:    vnsrl.wi v8, v9, 23
2158 ; CHECK-D-NEXT:    li a0, 142
2159 ; CHECK-D-NEXT:    vrsub.vx v8, v8, a0
2160 ; CHECK-D-NEXT:    ret
2162 ; CHECK-ZVBB-LABEL: ctlz_zero_undef_nxv2i16:
2163 ; CHECK-ZVBB:       # %bb.0:
2164 ; CHECK-ZVBB-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
2165 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
2166 ; CHECK-ZVBB-NEXT:    ret
2167   %a = call <vscale x 2 x i16> @llvm.ctlz.nxv2i16(<vscale x 2 x i16> %va, i1 true)
2168   ret <vscale x 2 x i16> %a
2171 define <vscale x 4 x i16> @ctlz_zero_undef_nxv4i16(<vscale x 4 x i16> %va) {
2172 ; CHECK-ZVE64X-LABEL: ctlz_zero_undef_nxv4i16:
2173 ; CHECK-ZVE64X:       # %bb.0:
2174 ; CHECK-ZVE64X-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
2175 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 1
2176 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
2177 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 2
2178 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
2179 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 4
2180 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
2181 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 8
2182 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
2183 ; CHECK-ZVE64X-NEXT:    vnot.v v8, v8
2184 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 1
2185 ; CHECK-ZVE64X-NEXT:    lui a0, 5
2186 ; CHECK-ZVE64X-NEXT:    addi a0, a0, 1365
2187 ; CHECK-ZVE64X-NEXT:    vand.vx v9, v9, a0
2188 ; CHECK-ZVE64X-NEXT:    vsub.vv v8, v8, v9
2189 ; CHECK-ZVE64X-NEXT:    lui a0, 3
2190 ; CHECK-ZVE64X-NEXT:    addi a0, a0, 819
2191 ; CHECK-ZVE64X-NEXT:    vand.vx v9, v8, a0
2192 ; CHECK-ZVE64X-NEXT:    vsrl.vi v8, v8, 2
2193 ; CHECK-ZVE64X-NEXT:    vand.vx v8, v8, a0
2194 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v9, v8
2195 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 4
2196 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v8, v9
2197 ; CHECK-ZVE64X-NEXT:    lui a0, 1
2198 ; CHECK-ZVE64X-NEXT:    addi a0, a0, -241
2199 ; CHECK-ZVE64X-NEXT:    vand.vx v8, v8, a0
2200 ; CHECK-ZVE64X-NEXT:    li a0, 257
2201 ; CHECK-ZVE64X-NEXT:    vmul.vx v8, v8, a0
2202 ; CHECK-ZVE64X-NEXT:    vsrl.vi v8, v8, 8
2203 ; CHECK-ZVE64X-NEXT:    ret
2205 ; CHECK-F-LABEL: ctlz_zero_undef_nxv4i16:
2206 ; CHECK-F:       # %bb.0:
2207 ; CHECK-F-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
2208 ; CHECK-F-NEXT:    vfwcvt.f.xu.v v10, v8
2209 ; CHECK-F-NEXT:    vnsrl.wi v8, v10, 23
2210 ; CHECK-F-NEXT:    li a0, 142
2211 ; CHECK-F-NEXT:    vrsub.vx v8, v8, a0
2212 ; CHECK-F-NEXT:    ret
2214 ; CHECK-D-LABEL: ctlz_zero_undef_nxv4i16:
2215 ; CHECK-D:       # %bb.0:
2216 ; CHECK-D-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
2217 ; CHECK-D-NEXT:    vfwcvt.f.xu.v v10, v8
2218 ; CHECK-D-NEXT:    vnsrl.wi v8, v10, 23
2219 ; CHECK-D-NEXT:    li a0, 142
2220 ; CHECK-D-NEXT:    vrsub.vx v8, v8, a0
2221 ; CHECK-D-NEXT:    ret
2223 ; CHECK-ZVBB-LABEL: ctlz_zero_undef_nxv4i16:
2224 ; CHECK-ZVBB:       # %bb.0:
2225 ; CHECK-ZVBB-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
2226 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
2227 ; CHECK-ZVBB-NEXT:    ret
2228   %a = call <vscale x 4 x i16> @llvm.ctlz.nxv4i16(<vscale x 4 x i16> %va, i1 true)
2229   ret <vscale x 4 x i16> %a
2232 define <vscale x 8 x i16> @ctlz_zero_undef_nxv8i16(<vscale x 8 x i16> %va) {
2233 ; CHECK-ZVE64X-LABEL: ctlz_zero_undef_nxv8i16:
2234 ; CHECK-ZVE64X:       # %bb.0:
2235 ; CHECK-ZVE64X-NEXT:    vsetvli a0, zero, e16, m2, ta, ma
2236 ; CHECK-ZVE64X-NEXT:    vsrl.vi v10, v8, 1
2237 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v10
2238 ; CHECK-ZVE64X-NEXT:    vsrl.vi v10, v8, 2
2239 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v10
2240 ; CHECK-ZVE64X-NEXT:    vsrl.vi v10, v8, 4
2241 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v10
2242 ; CHECK-ZVE64X-NEXT:    vsrl.vi v10, v8, 8
2243 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v10
2244 ; CHECK-ZVE64X-NEXT:    vnot.v v8, v8
2245 ; CHECK-ZVE64X-NEXT:    vsrl.vi v10, v8, 1
2246 ; CHECK-ZVE64X-NEXT:    lui a0, 5
2247 ; CHECK-ZVE64X-NEXT:    addi a0, a0, 1365
2248 ; CHECK-ZVE64X-NEXT:    vand.vx v10, v10, a0
2249 ; CHECK-ZVE64X-NEXT:    vsub.vv v8, v8, v10
2250 ; CHECK-ZVE64X-NEXT:    lui a0, 3
2251 ; CHECK-ZVE64X-NEXT:    addi a0, a0, 819
2252 ; CHECK-ZVE64X-NEXT:    vand.vx v10, v8, a0
2253 ; CHECK-ZVE64X-NEXT:    vsrl.vi v8, v8, 2
2254 ; CHECK-ZVE64X-NEXT:    vand.vx v8, v8, a0
2255 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v10, v8
2256 ; CHECK-ZVE64X-NEXT:    vsrl.vi v10, v8, 4
2257 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v8, v10
2258 ; CHECK-ZVE64X-NEXT:    lui a0, 1
2259 ; CHECK-ZVE64X-NEXT:    addi a0, a0, -241
2260 ; CHECK-ZVE64X-NEXT:    vand.vx v8, v8, a0
2261 ; CHECK-ZVE64X-NEXT:    li a0, 257
2262 ; CHECK-ZVE64X-NEXT:    vmul.vx v8, v8, a0
2263 ; CHECK-ZVE64X-NEXT:    vsrl.vi v8, v8, 8
2264 ; CHECK-ZVE64X-NEXT:    ret
2266 ; CHECK-F-LABEL: ctlz_zero_undef_nxv8i16:
2267 ; CHECK-F:       # %bb.0:
2268 ; CHECK-F-NEXT:    vsetvli a0, zero, e16, m2, ta, ma
2269 ; CHECK-F-NEXT:    vfwcvt.f.xu.v v12, v8
2270 ; CHECK-F-NEXT:    vnsrl.wi v8, v12, 23
2271 ; CHECK-F-NEXT:    li a0, 142
2272 ; CHECK-F-NEXT:    vrsub.vx v8, v8, a0
2273 ; CHECK-F-NEXT:    ret
2275 ; CHECK-D-LABEL: ctlz_zero_undef_nxv8i16:
2276 ; CHECK-D:       # %bb.0:
2277 ; CHECK-D-NEXT:    vsetvli a0, zero, e16, m2, ta, ma
2278 ; CHECK-D-NEXT:    vfwcvt.f.xu.v v12, v8
2279 ; CHECK-D-NEXT:    vnsrl.wi v8, v12, 23
2280 ; CHECK-D-NEXT:    li a0, 142
2281 ; CHECK-D-NEXT:    vrsub.vx v8, v8, a0
2282 ; CHECK-D-NEXT:    ret
2284 ; CHECK-ZVBB-LABEL: ctlz_zero_undef_nxv8i16:
2285 ; CHECK-ZVBB:       # %bb.0:
2286 ; CHECK-ZVBB-NEXT:    vsetvli a0, zero, e16, m2, ta, ma
2287 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
2288 ; CHECK-ZVBB-NEXT:    ret
2289   %a = call <vscale x 8 x i16> @llvm.ctlz.nxv8i16(<vscale x 8 x i16> %va, i1 true)
2290   ret <vscale x 8 x i16> %a
2293 define <vscale x 16 x i16> @ctlz_zero_undef_nxv16i16(<vscale x 16 x i16> %va) {
2294 ; CHECK-ZVE64X-LABEL: ctlz_zero_undef_nxv16i16:
2295 ; CHECK-ZVE64X:       # %bb.0:
2296 ; CHECK-ZVE64X-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
2297 ; CHECK-ZVE64X-NEXT:    vsrl.vi v12, v8, 1
2298 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v12
2299 ; CHECK-ZVE64X-NEXT:    vsrl.vi v12, v8, 2
2300 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v12
2301 ; CHECK-ZVE64X-NEXT:    vsrl.vi v12, v8, 4
2302 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v12
2303 ; CHECK-ZVE64X-NEXT:    vsrl.vi v12, v8, 8
2304 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v12
2305 ; CHECK-ZVE64X-NEXT:    vnot.v v8, v8
2306 ; CHECK-ZVE64X-NEXT:    vsrl.vi v12, v8, 1
2307 ; CHECK-ZVE64X-NEXT:    lui a0, 5
2308 ; CHECK-ZVE64X-NEXT:    addi a0, a0, 1365
2309 ; CHECK-ZVE64X-NEXT:    vand.vx v12, v12, a0
2310 ; CHECK-ZVE64X-NEXT:    vsub.vv v8, v8, v12
2311 ; CHECK-ZVE64X-NEXT:    lui a0, 3
2312 ; CHECK-ZVE64X-NEXT:    addi a0, a0, 819
2313 ; CHECK-ZVE64X-NEXT:    vand.vx v12, v8, a0
2314 ; CHECK-ZVE64X-NEXT:    vsrl.vi v8, v8, 2
2315 ; CHECK-ZVE64X-NEXT:    vand.vx v8, v8, a0
2316 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v12, v8
2317 ; CHECK-ZVE64X-NEXT:    vsrl.vi v12, v8, 4
2318 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v8, v12
2319 ; CHECK-ZVE64X-NEXT:    lui a0, 1
2320 ; CHECK-ZVE64X-NEXT:    addi a0, a0, -241
2321 ; CHECK-ZVE64X-NEXT:    vand.vx v8, v8, a0
2322 ; CHECK-ZVE64X-NEXT:    li a0, 257
2323 ; CHECK-ZVE64X-NEXT:    vmul.vx v8, v8, a0
2324 ; CHECK-ZVE64X-NEXT:    vsrl.vi v8, v8, 8
2325 ; CHECK-ZVE64X-NEXT:    ret
2327 ; CHECK-F-LABEL: ctlz_zero_undef_nxv16i16:
2328 ; CHECK-F:       # %bb.0:
2329 ; CHECK-F-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
2330 ; CHECK-F-NEXT:    vfwcvt.f.xu.v v16, v8
2331 ; CHECK-F-NEXT:    vnsrl.wi v8, v16, 23
2332 ; CHECK-F-NEXT:    li a0, 142
2333 ; CHECK-F-NEXT:    vrsub.vx v8, v8, a0
2334 ; CHECK-F-NEXT:    ret
2336 ; CHECK-D-LABEL: ctlz_zero_undef_nxv16i16:
2337 ; CHECK-D:       # %bb.0:
2338 ; CHECK-D-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
2339 ; CHECK-D-NEXT:    vfwcvt.f.xu.v v16, v8
2340 ; CHECK-D-NEXT:    vnsrl.wi v8, v16, 23
2341 ; CHECK-D-NEXT:    li a0, 142
2342 ; CHECK-D-NEXT:    vrsub.vx v8, v8, a0
2343 ; CHECK-D-NEXT:    ret
2345 ; CHECK-ZVBB-LABEL: ctlz_zero_undef_nxv16i16:
2346 ; CHECK-ZVBB:       # %bb.0:
2347 ; CHECK-ZVBB-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
2348 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
2349 ; CHECK-ZVBB-NEXT:    ret
2350   %a = call <vscale x 16 x i16> @llvm.ctlz.nxv16i16(<vscale x 16 x i16> %va, i1 true)
2351   ret <vscale x 16 x i16> %a
2354 define <vscale x 32 x i16> @ctlz_zero_undef_nxv32i16(<vscale x 32 x i16> %va) {
2355 ; CHECK-LABEL: ctlz_zero_undef_nxv32i16:
2356 ; CHECK:       # %bb.0:
2357 ; CHECK-NEXT:    vsetvli a0, zero, e16, m8, ta, ma
2358 ; CHECK-NEXT:    vsrl.vi v16, v8, 1
2359 ; CHECK-NEXT:    vor.vv v8, v8, v16
2360 ; CHECK-NEXT:    vsrl.vi v16, v8, 2
2361 ; CHECK-NEXT:    vor.vv v8, v8, v16
2362 ; CHECK-NEXT:    vsrl.vi v16, v8, 4
2363 ; CHECK-NEXT:    vor.vv v8, v8, v16
2364 ; CHECK-NEXT:    vsrl.vi v16, v8, 8
2365 ; CHECK-NEXT:    vor.vv v8, v8, v16
2366 ; CHECK-NEXT:    vnot.v v8, v8
2367 ; CHECK-NEXT:    vsrl.vi v16, v8, 1
2368 ; CHECK-NEXT:    lui a0, 5
2369 ; CHECK-NEXT:    addi a0, a0, 1365
2370 ; CHECK-NEXT:    vand.vx v16, v16, a0
2371 ; CHECK-NEXT:    vsub.vv v8, v8, v16
2372 ; CHECK-NEXT:    lui a0, 3
2373 ; CHECK-NEXT:    addi a0, a0, 819
2374 ; CHECK-NEXT:    vand.vx v16, v8, a0
2375 ; CHECK-NEXT:    vsrl.vi v8, v8, 2
2376 ; CHECK-NEXT:    vand.vx v8, v8, a0
2377 ; CHECK-NEXT:    vadd.vv v8, v16, v8
2378 ; CHECK-NEXT:    vsrl.vi v16, v8, 4
2379 ; CHECK-NEXT:    vadd.vv v8, v8, v16
2380 ; CHECK-NEXT:    lui a0, 1
2381 ; CHECK-NEXT:    addi a0, a0, -241
2382 ; CHECK-NEXT:    vand.vx v8, v8, a0
2383 ; CHECK-NEXT:    li a0, 257
2384 ; CHECK-NEXT:    vmul.vx v8, v8, a0
2385 ; CHECK-NEXT:    vsrl.vi v8, v8, 8
2386 ; CHECK-NEXT:    ret
2388 ; CHECK-ZVBB-LABEL: ctlz_zero_undef_nxv32i16:
2389 ; CHECK-ZVBB:       # %bb.0:
2390 ; CHECK-ZVBB-NEXT:    vsetvli a0, zero, e16, m8, ta, ma
2391 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
2392 ; CHECK-ZVBB-NEXT:    ret
2393   %a = call <vscale x 32 x i16> @llvm.ctlz.nxv32i16(<vscale x 32 x i16> %va, i1 true)
2394   ret <vscale x 32 x i16> %a
2397 define <vscale x 1 x i32> @ctlz_zero_undef_nxv1i32(<vscale x 1 x i32> %va) {
2398 ; CHECK-ZVE64X-LABEL: ctlz_zero_undef_nxv1i32:
2399 ; CHECK-ZVE64X:       # %bb.0:
2400 ; CHECK-ZVE64X-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
2401 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 1
2402 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
2403 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 2
2404 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
2405 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 4
2406 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
2407 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 8
2408 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
2409 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 16
2410 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
2411 ; CHECK-ZVE64X-NEXT:    vnot.v v8, v8
2412 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 1
2413 ; CHECK-ZVE64X-NEXT:    lui a0, 349525
2414 ; CHECK-ZVE64X-NEXT:    addi a0, a0, 1365
2415 ; CHECK-ZVE64X-NEXT:    vand.vx v9, v9, a0
2416 ; CHECK-ZVE64X-NEXT:    vsub.vv v8, v8, v9
2417 ; CHECK-ZVE64X-NEXT:    lui a0, 209715
2418 ; CHECK-ZVE64X-NEXT:    addi a0, a0, 819
2419 ; CHECK-ZVE64X-NEXT:    vand.vx v9, v8, a0
2420 ; CHECK-ZVE64X-NEXT:    vsrl.vi v8, v8, 2
2421 ; CHECK-ZVE64X-NEXT:    vand.vx v8, v8, a0
2422 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v9, v8
2423 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 4
2424 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v8, v9
2425 ; CHECK-ZVE64X-NEXT:    lui a0, 61681
2426 ; CHECK-ZVE64X-NEXT:    addi a0, a0, -241
2427 ; CHECK-ZVE64X-NEXT:    vand.vx v8, v8, a0
2428 ; CHECK-ZVE64X-NEXT:    lui a0, 4112
2429 ; CHECK-ZVE64X-NEXT:    addi a0, a0, 257
2430 ; CHECK-ZVE64X-NEXT:    vmul.vx v8, v8, a0
2431 ; CHECK-ZVE64X-NEXT:    vsrl.vi v8, v8, 24
2432 ; CHECK-ZVE64X-NEXT:    ret
2434 ; CHECK-F-LABEL: ctlz_zero_undef_nxv1i32:
2435 ; CHECK-F:       # %bb.0:
2436 ; CHECK-F-NEXT:    fsrmi a0, 1
2437 ; CHECK-F-NEXT:    vsetvli a1, zero, e32, mf2, ta, ma
2438 ; CHECK-F-NEXT:    vfcvt.f.xu.v v8, v8
2439 ; CHECK-F-NEXT:    vsrl.vi v8, v8, 23
2440 ; CHECK-F-NEXT:    li a1, 158
2441 ; CHECK-F-NEXT:    vrsub.vx v8, v8, a1
2442 ; CHECK-F-NEXT:    fsrm a0
2443 ; CHECK-F-NEXT:    ret
2445 ; CHECK-D-LABEL: ctlz_zero_undef_nxv1i32:
2446 ; CHECK-D:       # %bb.0:
2447 ; CHECK-D-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
2448 ; CHECK-D-NEXT:    vfwcvt.f.xu.v v9, v8
2449 ; CHECK-D-NEXT:    li a0, 52
2450 ; CHECK-D-NEXT:    vnsrl.wx v8, v9, a0
2451 ; CHECK-D-NEXT:    li a0, 1054
2452 ; CHECK-D-NEXT:    vrsub.vx v8, v8, a0
2453 ; CHECK-D-NEXT:    ret
2455 ; CHECK-ZVBB-LABEL: ctlz_zero_undef_nxv1i32:
2456 ; CHECK-ZVBB:       # %bb.0:
2457 ; CHECK-ZVBB-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
2458 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
2459 ; CHECK-ZVBB-NEXT:    ret
2460   %a = call <vscale x 1 x i32> @llvm.ctlz.nxv1i32(<vscale x 1 x i32> %va, i1 true)
2461   ret <vscale x 1 x i32> %a
2464 define <vscale x 2 x i32> @ctlz_zero_undef_nxv2i32(<vscale x 2 x i32> %va) {
2465 ; CHECK-ZVE64X-LABEL: ctlz_zero_undef_nxv2i32:
2466 ; CHECK-ZVE64X:       # %bb.0:
2467 ; CHECK-ZVE64X-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
2468 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 1
2469 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
2470 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 2
2471 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
2472 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 4
2473 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
2474 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 8
2475 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
2476 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 16
2477 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v9
2478 ; CHECK-ZVE64X-NEXT:    vnot.v v8, v8
2479 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 1
2480 ; CHECK-ZVE64X-NEXT:    lui a0, 349525
2481 ; CHECK-ZVE64X-NEXT:    addi a0, a0, 1365
2482 ; CHECK-ZVE64X-NEXT:    vand.vx v9, v9, a0
2483 ; CHECK-ZVE64X-NEXT:    vsub.vv v8, v8, v9
2484 ; CHECK-ZVE64X-NEXT:    lui a0, 209715
2485 ; CHECK-ZVE64X-NEXT:    addi a0, a0, 819
2486 ; CHECK-ZVE64X-NEXT:    vand.vx v9, v8, a0
2487 ; CHECK-ZVE64X-NEXT:    vsrl.vi v8, v8, 2
2488 ; CHECK-ZVE64X-NEXT:    vand.vx v8, v8, a0
2489 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v9, v8
2490 ; CHECK-ZVE64X-NEXT:    vsrl.vi v9, v8, 4
2491 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v8, v9
2492 ; CHECK-ZVE64X-NEXT:    lui a0, 61681
2493 ; CHECK-ZVE64X-NEXT:    addi a0, a0, -241
2494 ; CHECK-ZVE64X-NEXT:    vand.vx v8, v8, a0
2495 ; CHECK-ZVE64X-NEXT:    lui a0, 4112
2496 ; CHECK-ZVE64X-NEXT:    addi a0, a0, 257
2497 ; CHECK-ZVE64X-NEXT:    vmul.vx v8, v8, a0
2498 ; CHECK-ZVE64X-NEXT:    vsrl.vi v8, v8, 24
2499 ; CHECK-ZVE64X-NEXT:    ret
2501 ; CHECK-F-LABEL: ctlz_zero_undef_nxv2i32:
2502 ; CHECK-F:       # %bb.0:
2503 ; CHECK-F-NEXT:    fsrmi a0, 1
2504 ; CHECK-F-NEXT:    vsetvli a1, zero, e32, m1, ta, ma
2505 ; CHECK-F-NEXT:    vfcvt.f.xu.v v8, v8
2506 ; CHECK-F-NEXT:    vsrl.vi v8, v8, 23
2507 ; CHECK-F-NEXT:    li a1, 158
2508 ; CHECK-F-NEXT:    vrsub.vx v8, v8, a1
2509 ; CHECK-F-NEXT:    fsrm a0
2510 ; CHECK-F-NEXT:    ret
2512 ; CHECK-D-LABEL: ctlz_zero_undef_nxv2i32:
2513 ; CHECK-D:       # %bb.0:
2514 ; CHECK-D-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
2515 ; CHECK-D-NEXT:    vfwcvt.f.xu.v v10, v8
2516 ; CHECK-D-NEXT:    li a0, 52
2517 ; CHECK-D-NEXT:    vnsrl.wx v8, v10, a0
2518 ; CHECK-D-NEXT:    li a0, 1054
2519 ; CHECK-D-NEXT:    vrsub.vx v8, v8, a0
2520 ; CHECK-D-NEXT:    ret
2522 ; CHECK-ZVBB-LABEL: ctlz_zero_undef_nxv2i32:
2523 ; CHECK-ZVBB:       # %bb.0:
2524 ; CHECK-ZVBB-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
2525 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
2526 ; CHECK-ZVBB-NEXT:    ret
2527   %a = call <vscale x 2 x i32> @llvm.ctlz.nxv2i32(<vscale x 2 x i32> %va, i1 true)
2528   ret <vscale x 2 x i32> %a
2531 define <vscale x 4 x i32> @ctlz_zero_undef_nxv4i32(<vscale x 4 x i32> %va) {
2532 ; CHECK-ZVE64X-LABEL: ctlz_zero_undef_nxv4i32:
2533 ; CHECK-ZVE64X:       # %bb.0:
2534 ; CHECK-ZVE64X-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
2535 ; CHECK-ZVE64X-NEXT:    vsrl.vi v10, v8, 1
2536 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v10
2537 ; CHECK-ZVE64X-NEXT:    vsrl.vi v10, v8, 2
2538 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v10
2539 ; CHECK-ZVE64X-NEXT:    vsrl.vi v10, v8, 4
2540 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v10
2541 ; CHECK-ZVE64X-NEXT:    vsrl.vi v10, v8, 8
2542 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v10
2543 ; CHECK-ZVE64X-NEXT:    vsrl.vi v10, v8, 16
2544 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v10
2545 ; CHECK-ZVE64X-NEXT:    vnot.v v8, v8
2546 ; CHECK-ZVE64X-NEXT:    vsrl.vi v10, v8, 1
2547 ; CHECK-ZVE64X-NEXT:    lui a0, 349525
2548 ; CHECK-ZVE64X-NEXT:    addi a0, a0, 1365
2549 ; CHECK-ZVE64X-NEXT:    vand.vx v10, v10, a0
2550 ; CHECK-ZVE64X-NEXT:    vsub.vv v8, v8, v10
2551 ; CHECK-ZVE64X-NEXT:    lui a0, 209715
2552 ; CHECK-ZVE64X-NEXT:    addi a0, a0, 819
2553 ; CHECK-ZVE64X-NEXT:    vand.vx v10, v8, a0
2554 ; CHECK-ZVE64X-NEXT:    vsrl.vi v8, v8, 2
2555 ; CHECK-ZVE64X-NEXT:    vand.vx v8, v8, a0
2556 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v10, v8
2557 ; CHECK-ZVE64X-NEXT:    vsrl.vi v10, v8, 4
2558 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v8, v10
2559 ; CHECK-ZVE64X-NEXT:    lui a0, 61681
2560 ; CHECK-ZVE64X-NEXT:    addi a0, a0, -241
2561 ; CHECK-ZVE64X-NEXT:    vand.vx v8, v8, a0
2562 ; CHECK-ZVE64X-NEXT:    lui a0, 4112
2563 ; CHECK-ZVE64X-NEXT:    addi a0, a0, 257
2564 ; CHECK-ZVE64X-NEXT:    vmul.vx v8, v8, a0
2565 ; CHECK-ZVE64X-NEXT:    vsrl.vi v8, v8, 24
2566 ; CHECK-ZVE64X-NEXT:    ret
2568 ; CHECK-F-LABEL: ctlz_zero_undef_nxv4i32:
2569 ; CHECK-F:       # %bb.0:
2570 ; CHECK-F-NEXT:    fsrmi a0, 1
2571 ; CHECK-F-NEXT:    vsetvli a1, zero, e32, m2, ta, ma
2572 ; CHECK-F-NEXT:    vfcvt.f.xu.v v8, v8
2573 ; CHECK-F-NEXT:    vsrl.vi v8, v8, 23
2574 ; CHECK-F-NEXT:    li a1, 158
2575 ; CHECK-F-NEXT:    vrsub.vx v8, v8, a1
2576 ; CHECK-F-NEXT:    fsrm a0
2577 ; CHECK-F-NEXT:    ret
2579 ; CHECK-D-LABEL: ctlz_zero_undef_nxv4i32:
2580 ; CHECK-D:       # %bb.0:
2581 ; CHECK-D-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
2582 ; CHECK-D-NEXT:    vfwcvt.f.xu.v v12, v8
2583 ; CHECK-D-NEXT:    li a0, 52
2584 ; CHECK-D-NEXT:    vnsrl.wx v8, v12, a0
2585 ; CHECK-D-NEXT:    li a0, 1054
2586 ; CHECK-D-NEXT:    vrsub.vx v8, v8, a0
2587 ; CHECK-D-NEXT:    ret
2589 ; CHECK-ZVBB-LABEL: ctlz_zero_undef_nxv4i32:
2590 ; CHECK-ZVBB:       # %bb.0:
2591 ; CHECK-ZVBB-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
2592 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
2593 ; CHECK-ZVBB-NEXT:    ret
2594   %a = call <vscale x 4 x i32> @llvm.ctlz.nxv4i32(<vscale x 4 x i32> %va, i1 true)
2595   ret <vscale x 4 x i32> %a
2598 define <vscale x 8 x i32> @ctlz_zero_undef_nxv8i32(<vscale x 8 x i32> %va) {
2599 ; CHECK-ZVE64X-LABEL: ctlz_zero_undef_nxv8i32:
2600 ; CHECK-ZVE64X:       # %bb.0:
2601 ; CHECK-ZVE64X-NEXT:    vsetvli a0, zero, e32, m4, ta, ma
2602 ; CHECK-ZVE64X-NEXT:    vsrl.vi v12, v8, 1
2603 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v12
2604 ; CHECK-ZVE64X-NEXT:    vsrl.vi v12, v8, 2
2605 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v12
2606 ; CHECK-ZVE64X-NEXT:    vsrl.vi v12, v8, 4
2607 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v12
2608 ; CHECK-ZVE64X-NEXT:    vsrl.vi v12, v8, 8
2609 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v12
2610 ; CHECK-ZVE64X-NEXT:    vsrl.vi v12, v8, 16
2611 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v12
2612 ; CHECK-ZVE64X-NEXT:    vnot.v v8, v8
2613 ; CHECK-ZVE64X-NEXT:    vsrl.vi v12, v8, 1
2614 ; CHECK-ZVE64X-NEXT:    lui a0, 349525
2615 ; CHECK-ZVE64X-NEXT:    addi a0, a0, 1365
2616 ; CHECK-ZVE64X-NEXT:    vand.vx v12, v12, a0
2617 ; CHECK-ZVE64X-NEXT:    vsub.vv v8, v8, v12
2618 ; CHECK-ZVE64X-NEXT:    lui a0, 209715
2619 ; CHECK-ZVE64X-NEXT:    addi a0, a0, 819
2620 ; CHECK-ZVE64X-NEXT:    vand.vx v12, v8, a0
2621 ; CHECK-ZVE64X-NEXT:    vsrl.vi v8, v8, 2
2622 ; CHECK-ZVE64X-NEXT:    vand.vx v8, v8, a0
2623 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v12, v8
2624 ; CHECK-ZVE64X-NEXT:    vsrl.vi v12, v8, 4
2625 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v8, v12
2626 ; CHECK-ZVE64X-NEXT:    lui a0, 61681
2627 ; CHECK-ZVE64X-NEXT:    addi a0, a0, -241
2628 ; CHECK-ZVE64X-NEXT:    vand.vx v8, v8, a0
2629 ; CHECK-ZVE64X-NEXT:    lui a0, 4112
2630 ; CHECK-ZVE64X-NEXT:    addi a0, a0, 257
2631 ; CHECK-ZVE64X-NEXT:    vmul.vx v8, v8, a0
2632 ; CHECK-ZVE64X-NEXT:    vsrl.vi v8, v8, 24
2633 ; CHECK-ZVE64X-NEXT:    ret
2635 ; CHECK-F-LABEL: ctlz_zero_undef_nxv8i32:
2636 ; CHECK-F:       # %bb.0:
2637 ; CHECK-F-NEXT:    fsrmi a0, 1
2638 ; CHECK-F-NEXT:    vsetvli a1, zero, e32, m4, ta, ma
2639 ; CHECK-F-NEXT:    vfcvt.f.xu.v v8, v8
2640 ; CHECK-F-NEXT:    vsrl.vi v8, v8, 23
2641 ; CHECK-F-NEXT:    li a1, 158
2642 ; CHECK-F-NEXT:    vrsub.vx v8, v8, a1
2643 ; CHECK-F-NEXT:    fsrm a0
2644 ; CHECK-F-NEXT:    ret
2646 ; CHECK-D-LABEL: ctlz_zero_undef_nxv8i32:
2647 ; CHECK-D:       # %bb.0:
2648 ; CHECK-D-NEXT:    vsetvli a0, zero, e32, m4, ta, ma
2649 ; CHECK-D-NEXT:    vfwcvt.f.xu.v v16, v8
2650 ; CHECK-D-NEXT:    li a0, 52
2651 ; CHECK-D-NEXT:    vnsrl.wx v8, v16, a0
2652 ; CHECK-D-NEXT:    li a0, 1054
2653 ; CHECK-D-NEXT:    vrsub.vx v8, v8, a0
2654 ; CHECK-D-NEXT:    ret
2656 ; CHECK-ZVBB-LABEL: ctlz_zero_undef_nxv8i32:
2657 ; CHECK-ZVBB:       # %bb.0:
2658 ; CHECK-ZVBB-NEXT:    vsetvli a0, zero, e32, m4, ta, ma
2659 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
2660 ; CHECK-ZVBB-NEXT:    ret
2661   %a = call <vscale x 8 x i32> @llvm.ctlz.nxv8i32(<vscale x 8 x i32> %va, i1 true)
2662   ret <vscale x 8 x i32> %a
2665 define <vscale x 16 x i32> @ctlz_zero_undef_nxv16i32(<vscale x 16 x i32> %va) {
2666 ; CHECK-ZVE64X-LABEL: ctlz_zero_undef_nxv16i32:
2667 ; CHECK-ZVE64X:       # %bb.0:
2668 ; CHECK-ZVE64X-NEXT:    vsetvli a0, zero, e32, m8, ta, ma
2669 ; CHECK-ZVE64X-NEXT:    vsrl.vi v16, v8, 1
2670 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v16
2671 ; CHECK-ZVE64X-NEXT:    vsrl.vi v16, v8, 2
2672 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v16
2673 ; CHECK-ZVE64X-NEXT:    vsrl.vi v16, v8, 4
2674 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v16
2675 ; CHECK-ZVE64X-NEXT:    vsrl.vi v16, v8, 8
2676 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v16
2677 ; CHECK-ZVE64X-NEXT:    vsrl.vi v16, v8, 16
2678 ; CHECK-ZVE64X-NEXT:    vor.vv v8, v8, v16
2679 ; CHECK-ZVE64X-NEXT:    vnot.v v8, v8
2680 ; CHECK-ZVE64X-NEXT:    vsrl.vi v16, v8, 1
2681 ; CHECK-ZVE64X-NEXT:    lui a0, 349525
2682 ; CHECK-ZVE64X-NEXT:    addi a0, a0, 1365
2683 ; CHECK-ZVE64X-NEXT:    vand.vx v16, v16, a0
2684 ; CHECK-ZVE64X-NEXT:    vsub.vv v8, v8, v16
2685 ; CHECK-ZVE64X-NEXT:    lui a0, 209715
2686 ; CHECK-ZVE64X-NEXT:    addi a0, a0, 819
2687 ; CHECK-ZVE64X-NEXT:    vand.vx v16, v8, a0
2688 ; CHECK-ZVE64X-NEXT:    vsrl.vi v8, v8, 2
2689 ; CHECK-ZVE64X-NEXT:    vand.vx v8, v8, a0
2690 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v16, v8
2691 ; CHECK-ZVE64X-NEXT:    vsrl.vi v16, v8, 4
2692 ; CHECK-ZVE64X-NEXT:    vadd.vv v8, v8, v16
2693 ; CHECK-ZVE64X-NEXT:    lui a0, 61681
2694 ; CHECK-ZVE64X-NEXT:    addi a0, a0, -241
2695 ; CHECK-ZVE64X-NEXT:    vand.vx v8, v8, a0
2696 ; CHECK-ZVE64X-NEXT:    lui a0, 4112
2697 ; CHECK-ZVE64X-NEXT:    addi a0, a0, 257
2698 ; CHECK-ZVE64X-NEXT:    vmul.vx v8, v8, a0
2699 ; CHECK-ZVE64X-NEXT:    vsrl.vi v8, v8, 24
2700 ; CHECK-ZVE64X-NEXT:    ret
2702 ; CHECK-F-LABEL: ctlz_zero_undef_nxv16i32:
2703 ; CHECK-F:       # %bb.0:
2704 ; CHECK-F-NEXT:    fsrmi a0, 1
2705 ; CHECK-F-NEXT:    vsetvli a1, zero, e32, m8, ta, ma
2706 ; CHECK-F-NEXT:    vfcvt.f.xu.v v8, v8
2707 ; CHECK-F-NEXT:    vsrl.vi v8, v8, 23
2708 ; CHECK-F-NEXT:    li a1, 158
2709 ; CHECK-F-NEXT:    vrsub.vx v8, v8, a1
2710 ; CHECK-F-NEXT:    fsrm a0
2711 ; CHECK-F-NEXT:    ret
2713 ; CHECK-D-LABEL: ctlz_zero_undef_nxv16i32:
2714 ; CHECK-D:       # %bb.0:
2715 ; CHECK-D-NEXT:    fsrmi a0, 1
2716 ; CHECK-D-NEXT:    vsetvli a1, zero, e32, m8, ta, ma
2717 ; CHECK-D-NEXT:    vfcvt.f.xu.v v8, v8
2718 ; CHECK-D-NEXT:    vsrl.vi v8, v8, 23
2719 ; CHECK-D-NEXT:    li a1, 158
2720 ; CHECK-D-NEXT:    vrsub.vx v8, v8, a1
2721 ; CHECK-D-NEXT:    fsrm a0
2722 ; CHECK-D-NEXT:    ret
2724 ; CHECK-ZVBB-LABEL: ctlz_zero_undef_nxv16i32:
2725 ; CHECK-ZVBB:       # %bb.0:
2726 ; CHECK-ZVBB-NEXT:    vsetvli a0, zero, e32, m8, ta, ma
2727 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
2728 ; CHECK-ZVBB-NEXT:    ret
2729   %a = call <vscale x 16 x i32> @llvm.ctlz.nxv16i32(<vscale x 16 x i32> %va, i1 true)
2730   ret <vscale x 16 x i32> %a
2733 define <vscale x 1 x i64> @ctlz_zero_undef_nxv1i64(<vscale x 1 x i64> %va) {
2734 ; RV32I-LABEL: ctlz_zero_undef_nxv1i64:
2735 ; RV32I:       # %bb.0:
2736 ; RV32I-NEXT:    vsetvli a0, zero, e64, m1, ta, ma
2737 ; RV32I-NEXT:    vsrl.vi v9, v8, 1
2738 ; RV32I-NEXT:    vor.vv v8, v8, v9
2739 ; RV32I-NEXT:    vsrl.vi v9, v8, 2
2740 ; RV32I-NEXT:    vor.vv v8, v8, v9
2741 ; RV32I-NEXT:    vsrl.vi v9, v8, 4
2742 ; RV32I-NEXT:    vor.vv v8, v8, v9
2743 ; RV32I-NEXT:    vsrl.vi v9, v8, 8
2744 ; RV32I-NEXT:    vor.vv v8, v8, v9
2745 ; RV32I-NEXT:    vsrl.vi v9, v8, 16
2746 ; RV32I-NEXT:    vor.vv v8, v8, v9
2747 ; RV32I-NEXT:    li a0, 32
2748 ; RV32I-NEXT:    vsrl.vx v9, v8, a0
2749 ; RV32I-NEXT:    vor.vv v8, v8, v9
2750 ; RV32I-NEXT:    vnot.v v8, v8
2751 ; RV32I-NEXT:    vsrl.vi v9, v8, 1
2752 ; RV32I-NEXT:    lui a0, 349525
2753 ; RV32I-NEXT:    addi a0, a0, 1365
2754 ; RV32I-NEXT:    vsetvli a1, zero, e32, m1, ta, ma
2755 ; RV32I-NEXT:    vmv.v.x v10, a0
2756 ; RV32I-NEXT:    vsetvli a0, zero, e64, m1, ta, ma
2757 ; RV32I-NEXT:    vand.vv v9, v9, v10
2758 ; RV32I-NEXT:    vsub.vv v8, v8, v9
2759 ; RV32I-NEXT:    lui a0, 209715
2760 ; RV32I-NEXT:    addi a0, a0, 819
2761 ; RV32I-NEXT:    vsetvli a1, zero, e32, m1, ta, ma
2762 ; RV32I-NEXT:    vmv.v.x v9, a0
2763 ; RV32I-NEXT:    vsetvli a0, zero, e64, m1, ta, ma
2764 ; RV32I-NEXT:    vand.vv v10, v8, v9
2765 ; RV32I-NEXT:    vsrl.vi v8, v8, 2
2766 ; RV32I-NEXT:    vand.vv v8, v8, v9
2767 ; RV32I-NEXT:    vadd.vv v8, v10, v8
2768 ; RV32I-NEXT:    vsrl.vi v9, v8, 4
2769 ; RV32I-NEXT:    vadd.vv v8, v8, v9
2770 ; RV32I-NEXT:    lui a0, 61681
2771 ; RV32I-NEXT:    addi a0, a0, -241
2772 ; RV32I-NEXT:    vsetvli a1, zero, e32, m1, ta, ma
2773 ; RV32I-NEXT:    vmv.v.x v9, a0
2774 ; RV32I-NEXT:    vsetvli a0, zero, e64, m1, ta, ma
2775 ; RV32I-NEXT:    vand.vv v8, v8, v9
2776 ; RV32I-NEXT:    lui a0, 4112
2777 ; RV32I-NEXT:    addi a0, a0, 257
2778 ; RV32I-NEXT:    vsetvli a1, zero, e32, m1, ta, ma
2779 ; RV32I-NEXT:    vmv.v.x v9, a0
2780 ; RV32I-NEXT:    vsetvli a0, zero, e64, m1, ta, ma
2781 ; RV32I-NEXT:    vmul.vv v8, v8, v9
2782 ; RV32I-NEXT:    li a0, 56
2783 ; RV32I-NEXT:    vsrl.vx v8, v8, a0
2784 ; RV32I-NEXT:    ret
2786 ; RV64I-LABEL: ctlz_zero_undef_nxv1i64:
2787 ; RV64I:       # %bb.0:
2788 ; RV64I-NEXT:    vsetvli a0, zero, e64, m1, ta, ma
2789 ; RV64I-NEXT:    vsrl.vi v9, v8, 1
2790 ; RV64I-NEXT:    vor.vv v8, v8, v9
2791 ; RV64I-NEXT:    vsrl.vi v9, v8, 2
2792 ; RV64I-NEXT:    vor.vv v8, v8, v9
2793 ; RV64I-NEXT:    vsrl.vi v9, v8, 4
2794 ; RV64I-NEXT:    vor.vv v8, v8, v9
2795 ; RV64I-NEXT:    vsrl.vi v9, v8, 8
2796 ; RV64I-NEXT:    vor.vv v8, v8, v9
2797 ; RV64I-NEXT:    vsrl.vi v9, v8, 16
2798 ; RV64I-NEXT:    vor.vv v8, v8, v9
2799 ; RV64I-NEXT:    li a0, 32
2800 ; RV64I-NEXT:    vsrl.vx v9, v8, a0
2801 ; RV64I-NEXT:    vor.vv v8, v8, v9
2802 ; RV64I-NEXT:    vnot.v v8, v8
2803 ; RV64I-NEXT:    vsrl.vi v9, v8, 1
2804 ; RV64I-NEXT:    lui a0, 349525
2805 ; RV64I-NEXT:    addiw a0, a0, 1365
2806 ; RV64I-NEXT:    slli a1, a0, 32
2807 ; RV64I-NEXT:    add a0, a0, a1
2808 ; RV64I-NEXT:    vand.vx v9, v9, a0
2809 ; RV64I-NEXT:    vsub.vv v8, v8, v9
2810 ; RV64I-NEXT:    lui a0, 209715
2811 ; RV64I-NEXT:    addiw a0, a0, 819
2812 ; RV64I-NEXT:    slli a1, a0, 32
2813 ; RV64I-NEXT:    add a0, a0, a1
2814 ; RV64I-NEXT:    vand.vx v9, v8, a0
2815 ; RV64I-NEXT:    vsrl.vi v8, v8, 2
2816 ; RV64I-NEXT:    vand.vx v8, v8, a0
2817 ; RV64I-NEXT:    vadd.vv v8, v9, v8
2818 ; RV64I-NEXT:    vsrl.vi v9, v8, 4
2819 ; RV64I-NEXT:    vadd.vv v8, v8, v9
2820 ; RV64I-NEXT:    lui a0, 61681
2821 ; RV64I-NEXT:    addiw a0, a0, -241
2822 ; RV64I-NEXT:    slli a1, a0, 32
2823 ; RV64I-NEXT:    add a0, a0, a1
2824 ; RV64I-NEXT:    vand.vx v8, v8, a0
2825 ; RV64I-NEXT:    lui a0, 4112
2826 ; RV64I-NEXT:    addiw a0, a0, 257
2827 ; RV64I-NEXT:    slli a1, a0, 32
2828 ; RV64I-NEXT:    add a0, a0, a1
2829 ; RV64I-NEXT:    vmul.vx v8, v8, a0
2830 ; RV64I-NEXT:    li a0, 56
2831 ; RV64I-NEXT:    vsrl.vx v8, v8, a0
2832 ; RV64I-NEXT:    ret
2834 ; CHECK-F-LABEL: ctlz_zero_undef_nxv1i64:
2835 ; CHECK-F:       # %bb.0:
2836 ; CHECK-F-NEXT:    li a0, 190
2837 ; CHECK-F-NEXT:    vsetvli a1, zero, e32, mf2, ta, ma
2838 ; CHECK-F-NEXT:    vmv.v.x v9, a0
2839 ; CHECK-F-NEXT:    fsrmi a0, 1
2840 ; CHECK-F-NEXT:    vfncvt.f.xu.w v10, v8
2841 ; CHECK-F-NEXT:    vsrl.vi v10, v10, 23
2842 ; CHECK-F-NEXT:    vwsubu.vv v8, v9, v10
2843 ; CHECK-F-NEXT:    fsrm a0
2844 ; CHECK-F-NEXT:    ret
2846 ; CHECK-D-LABEL: ctlz_zero_undef_nxv1i64:
2847 ; CHECK-D:       # %bb.0:
2848 ; CHECK-D-NEXT:    fsrmi a0, 1
2849 ; CHECK-D-NEXT:    vsetvli a1, zero, e64, m1, ta, ma
2850 ; CHECK-D-NEXT:    vfcvt.f.xu.v v8, v8
2851 ; CHECK-D-NEXT:    li a1, 52
2852 ; CHECK-D-NEXT:    vsrl.vx v8, v8, a1
2853 ; CHECK-D-NEXT:    li a1, 1086
2854 ; CHECK-D-NEXT:    vrsub.vx v8, v8, a1
2855 ; CHECK-D-NEXT:    fsrm a0
2856 ; CHECK-D-NEXT:    ret
2858 ; CHECK-ZVBB-LABEL: ctlz_zero_undef_nxv1i64:
2859 ; CHECK-ZVBB:       # %bb.0:
2860 ; CHECK-ZVBB-NEXT:    vsetvli a0, zero, e64, m1, ta, ma
2861 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
2862 ; CHECK-ZVBB-NEXT:    ret
2863   %a = call <vscale x 1 x i64> @llvm.ctlz.nxv1i64(<vscale x 1 x i64> %va, i1 true)
2864   ret <vscale x 1 x i64> %a
2867 define <vscale x 2 x i64> @ctlz_zero_undef_nxv2i64(<vscale x 2 x i64> %va) {
2868 ; RV32I-LABEL: ctlz_zero_undef_nxv2i64:
2869 ; RV32I:       # %bb.0:
2870 ; RV32I-NEXT:    vsetvli a0, zero, e64, m2, ta, ma
2871 ; RV32I-NEXT:    vsrl.vi v10, v8, 1
2872 ; RV32I-NEXT:    vor.vv v8, v8, v10
2873 ; RV32I-NEXT:    vsrl.vi v10, v8, 2
2874 ; RV32I-NEXT:    vor.vv v8, v8, v10
2875 ; RV32I-NEXT:    vsrl.vi v10, v8, 4
2876 ; RV32I-NEXT:    vor.vv v8, v8, v10
2877 ; RV32I-NEXT:    vsrl.vi v10, v8, 8
2878 ; RV32I-NEXT:    vor.vv v8, v8, v10
2879 ; RV32I-NEXT:    vsrl.vi v10, v8, 16
2880 ; RV32I-NEXT:    vor.vv v8, v8, v10
2881 ; RV32I-NEXT:    li a0, 32
2882 ; RV32I-NEXT:    vsrl.vx v10, v8, a0
2883 ; RV32I-NEXT:    vor.vv v8, v8, v10
2884 ; RV32I-NEXT:    vnot.v v8, v8
2885 ; RV32I-NEXT:    vsrl.vi v10, v8, 1
2886 ; RV32I-NEXT:    lui a0, 349525
2887 ; RV32I-NEXT:    addi a0, a0, 1365
2888 ; RV32I-NEXT:    vsetvli a1, zero, e32, m2, ta, ma
2889 ; RV32I-NEXT:    vmv.v.x v12, a0
2890 ; RV32I-NEXT:    vsetvli a0, zero, e64, m2, ta, ma
2891 ; RV32I-NEXT:    vand.vv v10, v10, v12
2892 ; RV32I-NEXT:    vsub.vv v8, v8, v10
2893 ; RV32I-NEXT:    lui a0, 209715
2894 ; RV32I-NEXT:    addi a0, a0, 819
2895 ; RV32I-NEXT:    vsetvli a1, zero, e32, m2, ta, ma
2896 ; RV32I-NEXT:    vmv.v.x v10, a0
2897 ; RV32I-NEXT:    vsetvli a0, zero, e64, m2, ta, ma
2898 ; RV32I-NEXT:    vand.vv v12, v8, v10
2899 ; RV32I-NEXT:    vsrl.vi v8, v8, 2
2900 ; RV32I-NEXT:    vand.vv v8, v8, v10
2901 ; RV32I-NEXT:    vadd.vv v8, v12, v8
2902 ; RV32I-NEXT:    vsrl.vi v10, v8, 4
2903 ; RV32I-NEXT:    vadd.vv v8, v8, v10
2904 ; RV32I-NEXT:    lui a0, 61681
2905 ; RV32I-NEXT:    addi a0, a0, -241
2906 ; RV32I-NEXT:    vsetvli a1, zero, e32, m2, ta, ma
2907 ; RV32I-NEXT:    vmv.v.x v10, a0
2908 ; RV32I-NEXT:    vsetvli a0, zero, e64, m2, ta, ma
2909 ; RV32I-NEXT:    vand.vv v8, v8, v10
2910 ; RV32I-NEXT:    lui a0, 4112
2911 ; RV32I-NEXT:    addi a0, a0, 257
2912 ; RV32I-NEXT:    vsetvli a1, zero, e32, m2, ta, ma
2913 ; RV32I-NEXT:    vmv.v.x v10, a0
2914 ; RV32I-NEXT:    vsetvli a0, zero, e64, m2, ta, ma
2915 ; RV32I-NEXT:    vmul.vv v8, v8, v10
2916 ; RV32I-NEXT:    li a0, 56
2917 ; RV32I-NEXT:    vsrl.vx v8, v8, a0
2918 ; RV32I-NEXT:    ret
2920 ; RV64I-LABEL: ctlz_zero_undef_nxv2i64:
2921 ; RV64I:       # %bb.0:
2922 ; RV64I-NEXT:    vsetvli a0, zero, e64, m2, ta, ma
2923 ; RV64I-NEXT:    vsrl.vi v10, v8, 1
2924 ; RV64I-NEXT:    vor.vv v8, v8, v10
2925 ; RV64I-NEXT:    vsrl.vi v10, v8, 2
2926 ; RV64I-NEXT:    vor.vv v8, v8, v10
2927 ; RV64I-NEXT:    vsrl.vi v10, v8, 4
2928 ; RV64I-NEXT:    vor.vv v8, v8, v10
2929 ; RV64I-NEXT:    vsrl.vi v10, v8, 8
2930 ; RV64I-NEXT:    vor.vv v8, v8, v10
2931 ; RV64I-NEXT:    vsrl.vi v10, v8, 16
2932 ; RV64I-NEXT:    vor.vv v8, v8, v10
2933 ; RV64I-NEXT:    li a0, 32
2934 ; RV64I-NEXT:    vsrl.vx v10, v8, a0
2935 ; RV64I-NEXT:    vor.vv v8, v8, v10
2936 ; RV64I-NEXT:    vnot.v v8, v8
2937 ; RV64I-NEXT:    vsrl.vi v10, v8, 1
2938 ; RV64I-NEXT:    lui a0, 349525
2939 ; RV64I-NEXT:    addiw a0, a0, 1365
2940 ; RV64I-NEXT:    slli a1, a0, 32
2941 ; RV64I-NEXT:    add a0, a0, a1
2942 ; RV64I-NEXT:    vand.vx v10, v10, a0
2943 ; RV64I-NEXT:    vsub.vv v8, v8, v10
2944 ; RV64I-NEXT:    lui a0, 209715
2945 ; RV64I-NEXT:    addiw a0, a0, 819
2946 ; RV64I-NEXT:    slli a1, a0, 32
2947 ; RV64I-NEXT:    add a0, a0, a1
2948 ; RV64I-NEXT:    vand.vx v10, v8, a0
2949 ; RV64I-NEXT:    vsrl.vi v8, v8, 2
2950 ; RV64I-NEXT:    vand.vx v8, v8, a0
2951 ; RV64I-NEXT:    vadd.vv v8, v10, v8
2952 ; RV64I-NEXT:    vsrl.vi v10, v8, 4
2953 ; RV64I-NEXT:    vadd.vv v8, v8, v10
2954 ; RV64I-NEXT:    lui a0, 61681
2955 ; RV64I-NEXT:    addiw a0, a0, -241
2956 ; RV64I-NEXT:    slli a1, a0, 32
2957 ; RV64I-NEXT:    add a0, a0, a1
2958 ; RV64I-NEXT:    vand.vx v8, v8, a0
2959 ; RV64I-NEXT:    lui a0, 4112
2960 ; RV64I-NEXT:    addiw a0, a0, 257
2961 ; RV64I-NEXT:    slli a1, a0, 32
2962 ; RV64I-NEXT:    add a0, a0, a1
2963 ; RV64I-NEXT:    vmul.vx v8, v8, a0
2964 ; RV64I-NEXT:    li a0, 56
2965 ; RV64I-NEXT:    vsrl.vx v8, v8, a0
2966 ; RV64I-NEXT:    ret
2968 ; CHECK-F-LABEL: ctlz_zero_undef_nxv2i64:
2969 ; CHECK-F:       # %bb.0:
2970 ; CHECK-F-NEXT:    li a0, 190
2971 ; CHECK-F-NEXT:    vsetvli a1, zero, e32, m1, ta, ma
2972 ; CHECK-F-NEXT:    vmv.v.x v10, a0
2973 ; CHECK-F-NEXT:    fsrmi a0, 1
2974 ; CHECK-F-NEXT:    vfncvt.f.xu.w v11, v8
2975 ; CHECK-F-NEXT:    vsrl.vi v11, v11, 23
2976 ; CHECK-F-NEXT:    vwsubu.vv v8, v10, v11
2977 ; CHECK-F-NEXT:    fsrm a0
2978 ; CHECK-F-NEXT:    ret
2980 ; CHECK-D-LABEL: ctlz_zero_undef_nxv2i64:
2981 ; CHECK-D:       # %bb.0:
2982 ; CHECK-D-NEXT:    fsrmi a0, 1
2983 ; CHECK-D-NEXT:    vsetvli a1, zero, e64, m2, ta, ma
2984 ; CHECK-D-NEXT:    vfcvt.f.xu.v v8, v8
2985 ; CHECK-D-NEXT:    li a1, 52
2986 ; CHECK-D-NEXT:    vsrl.vx v8, v8, a1
2987 ; CHECK-D-NEXT:    li a1, 1086
2988 ; CHECK-D-NEXT:    vrsub.vx v8, v8, a1
2989 ; CHECK-D-NEXT:    fsrm a0
2990 ; CHECK-D-NEXT:    ret
2992 ; CHECK-ZVBB-LABEL: ctlz_zero_undef_nxv2i64:
2993 ; CHECK-ZVBB:       # %bb.0:
2994 ; CHECK-ZVBB-NEXT:    vsetvli a0, zero, e64, m2, ta, ma
2995 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
2996 ; CHECK-ZVBB-NEXT:    ret
2997   %a = call <vscale x 2 x i64> @llvm.ctlz.nxv2i64(<vscale x 2 x i64> %va, i1 true)
2998   ret <vscale x 2 x i64> %a
3001 define <vscale x 4 x i64> @ctlz_zero_undef_nxv4i64(<vscale x 4 x i64> %va) {
3002 ; RV32I-LABEL: ctlz_zero_undef_nxv4i64:
3003 ; RV32I:       # %bb.0:
3004 ; RV32I-NEXT:    vsetvli a0, zero, e64, m4, ta, ma
3005 ; RV32I-NEXT:    vsrl.vi v12, v8, 1
3006 ; RV32I-NEXT:    vor.vv v8, v8, v12
3007 ; RV32I-NEXT:    vsrl.vi v12, v8, 2
3008 ; RV32I-NEXT:    vor.vv v8, v8, v12
3009 ; RV32I-NEXT:    vsrl.vi v12, v8, 4
3010 ; RV32I-NEXT:    vor.vv v8, v8, v12
3011 ; RV32I-NEXT:    vsrl.vi v12, v8, 8
3012 ; RV32I-NEXT:    vor.vv v8, v8, v12
3013 ; RV32I-NEXT:    vsrl.vi v12, v8, 16
3014 ; RV32I-NEXT:    vor.vv v8, v8, v12
3015 ; RV32I-NEXT:    li a0, 32
3016 ; RV32I-NEXT:    vsrl.vx v12, v8, a0
3017 ; RV32I-NEXT:    vor.vv v8, v8, v12
3018 ; RV32I-NEXT:    vnot.v v8, v8
3019 ; RV32I-NEXT:    vsrl.vi v12, v8, 1
3020 ; RV32I-NEXT:    lui a0, 349525
3021 ; RV32I-NEXT:    addi a0, a0, 1365
3022 ; RV32I-NEXT:    vsetvli a1, zero, e32, m4, ta, ma
3023 ; RV32I-NEXT:    vmv.v.x v16, a0
3024 ; RV32I-NEXT:    vsetvli a0, zero, e64, m4, ta, ma
3025 ; RV32I-NEXT:    vand.vv v12, v12, v16
3026 ; RV32I-NEXT:    vsub.vv v8, v8, v12
3027 ; RV32I-NEXT:    lui a0, 209715
3028 ; RV32I-NEXT:    addi a0, a0, 819
3029 ; RV32I-NEXT:    vsetvli a1, zero, e32, m4, ta, ma
3030 ; RV32I-NEXT:    vmv.v.x v12, a0
3031 ; RV32I-NEXT:    vsetvli a0, zero, e64, m4, ta, ma
3032 ; RV32I-NEXT:    vand.vv v16, v8, v12
3033 ; RV32I-NEXT:    vsrl.vi v8, v8, 2
3034 ; RV32I-NEXT:    vand.vv v8, v8, v12
3035 ; RV32I-NEXT:    vadd.vv v8, v16, v8
3036 ; RV32I-NEXT:    vsrl.vi v12, v8, 4
3037 ; RV32I-NEXT:    vadd.vv v8, v8, v12
3038 ; RV32I-NEXT:    lui a0, 61681
3039 ; RV32I-NEXT:    addi a0, a0, -241
3040 ; RV32I-NEXT:    vsetvli a1, zero, e32, m4, ta, ma
3041 ; RV32I-NEXT:    vmv.v.x v12, a0
3042 ; RV32I-NEXT:    vsetvli a0, zero, e64, m4, ta, ma
3043 ; RV32I-NEXT:    vand.vv v8, v8, v12
3044 ; RV32I-NEXT:    lui a0, 4112
3045 ; RV32I-NEXT:    addi a0, a0, 257
3046 ; RV32I-NEXT:    vsetvli a1, zero, e32, m4, ta, ma
3047 ; RV32I-NEXT:    vmv.v.x v12, a0
3048 ; RV32I-NEXT:    vsetvli a0, zero, e64, m4, ta, ma
3049 ; RV32I-NEXT:    vmul.vv v8, v8, v12
3050 ; RV32I-NEXT:    li a0, 56
3051 ; RV32I-NEXT:    vsrl.vx v8, v8, a0
3052 ; RV32I-NEXT:    ret
3054 ; RV64I-LABEL: ctlz_zero_undef_nxv4i64:
3055 ; RV64I:       # %bb.0:
3056 ; RV64I-NEXT:    vsetvli a0, zero, e64, m4, ta, ma
3057 ; RV64I-NEXT:    vsrl.vi v12, v8, 1
3058 ; RV64I-NEXT:    vor.vv v8, v8, v12
3059 ; RV64I-NEXT:    vsrl.vi v12, v8, 2
3060 ; RV64I-NEXT:    vor.vv v8, v8, v12
3061 ; RV64I-NEXT:    vsrl.vi v12, v8, 4
3062 ; RV64I-NEXT:    vor.vv v8, v8, v12
3063 ; RV64I-NEXT:    vsrl.vi v12, v8, 8
3064 ; RV64I-NEXT:    vor.vv v8, v8, v12
3065 ; RV64I-NEXT:    vsrl.vi v12, v8, 16
3066 ; RV64I-NEXT:    vor.vv v8, v8, v12
3067 ; RV64I-NEXT:    li a0, 32
3068 ; RV64I-NEXT:    vsrl.vx v12, v8, a0
3069 ; RV64I-NEXT:    vor.vv v8, v8, v12
3070 ; RV64I-NEXT:    vnot.v v8, v8
3071 ; RV64I-NEXT:    vsrl.vi v12, v8, 1
3072 ; RV64I-NEXT:    lui a0, 349525
3073 ; RV64I-NEXT:    addiw a0, a0, 1365
3074 ; RV64I-NEXT:    slli a1, a0, 32
3075 ; RV64I-NEXT:    add a0, a0, a1
3076 ; RV64I-NEXT:    vand.vx v12, v12, a0
3077 ; RV64I-NEXT:    vsub.vv v8, v8, v12
3078 ; RV64I-NEXT:    lui a0, 209715
3079 ; RV64I-NEXT:    addiw a0, a0, 819
3080 ; RV64I-NEXT:    slli a1, a0, 32
3081 ; RV64I-NEXT:    add a0, a0, a1
3082 ; RV64I-NEXT:    vand.vx v12, v8, a0
3083 ; RV64I-NEXT:    vsrl.vi v8, v8, 2
3084 ; RV64I-NEXT:    vand.vx v8, v8, a0
3085 ; RV64I-NEXT:    vadd.vv v8, v12, v8
3086 ; RV64I-NEXT:    vsrl.vi v12, v8, 4
3087 ; RV64I-NEXT:    vadd.vv v8, v8, v12
3088 ; RV64I-NEXT:    lui a0, 61681
3089 ; RV64I-NEXT:    addiw a0, a0, -241
3090 ; RV64I-NEXT:    slli a1, a0, 32
3091 ; RV64I-NEXT:    add a0, a0, a1
3092 ; RV64I-NEXT:    vand.vx v8, v8, a0
3093 ; RV64I-NEXT:    lui a0, 4112
3094 ; RV64I-NEXT:    addiw a0, a0, 257
3095 ; RV64I-NEXT:    slli a1, a0, 32
3096 ; RV64I-NEXT:    add a0, a0, a1
3097 ; RV64I-NEXT:    vmul.vx v8, v8, a0
3098 ; RV64I-NEXT:    li a0, 56
3099 ; RV64I-NEXT:    vsrl.vx v8, v8, a0
3100 ; RV64I-NEXT:    ret
3102 ; CHECK-F-LABEL: ctlz_zero_undef_nxv4i64:
3103 ; CHECK-F:       # %bb.0:
3104 ; CHECK-F-NEXT:    li a0, 190
3105 ; CHECK-F-NEXT:    vsetvli a1, zero, e32, m2, ta, ma
3106 ; CHECK-F-NEXT:    vmv.v.x v12, a0
3107 ; CHECK-F-NEXT:    fsrmi a0, 1
3108 ; CHECK-F-NEXT:    vfncvt.f.xu.w v14, v8
3109 ; CHECK-F-NEXT:    vsrl.vi v14, v14, 23
3110 ; CHECK-F-NEXT:    vwsubu.vv v8, v12, v14
3111 ; CHECK-F-NEXT:    fsrm a0
3112 ; CHECK-F-NEXT:    ret
3114 ; CHECK-D-LABEL: ctlz_zero_undef_nxv4i64:
3115 ; CHECK-D:       # %bb.0:
3116 ; CHECK-D-NEXT:    fsrmi a0, 1
3117 ; CHECK-D-NEXT:    vsetvli a1, zero, e64, m4, ta, ma
3118 ; CHECK-D-NEXT:    vfcvt.f.xu.v v8, v8
3119 ; CHECK-D-NEXT:    li a1, 52
3120 ; CHECK-D-NEXT:    vsrl.vx v8, v8, a1
3121 ; CHECK-D-NEXT:    li a1, 1086
3122 ; CHECK-D-NEXT:    vrsub.vx v8, v8, a1
3123 ; CHECK-D-NEXT:    fsrm a0
3124 ; CHECK-D-NEXT:    ret
3126 ; CHECK-ZVBB-LABEL: ctlz_zero_undef_nxv4i64:
3127 ; CHECK-ZVBB:       # %bb.0:
3128 ; CHECK-ZVBB-NEXT:    vsetvli a0, zero, e64, m4, ta, ma
3129 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
3130 ; CHECK-ZVBB-NEXT:    ret
3131   %a = call <vscale x 4 x i64> @llvm.ctlz.nxv4i64(<vscale x 4 x i64> %va, i1 true)
3132   ret <vscale x 4 x i64> %a
3135 define <vscale x 8 x i64> @ctlz_zero_undef_nxv8i64(<vscale x 8 x i64> %va) {
3136 ; RV32I-LABEL: ctlz_zero_undef_nxv8i64:
3137 ; RV32I:       # %bb.0:
3138 ; RV32I-NEXT:    vsetvli a0, zero, e64, m8, ta, ma
3139 ; RV32I-NEXT:    vsrl.vi v16, v8, 1
3140 ; RV32I-NEXT:    vor.vv v8, v8, v16
3141 ; RV32I-NEXT:    vsrl.vi v16, v8, 2
3142 ; RV32I-NEXT:    vor.vv v8, v8, v16
3143 ; RV32I-NEXT:    vsrl.vi v16, v8, 4
3144 ; RV32I-NEXT:    vor.vv v8, v8, v16
3145 ; RV32I-NEXT:    vsrl.vi v16, v8, 8
3146 ; RV32I-NEXT:    vor.vv v8, v8, v16
3147 ; RV32I-NEXT:    vsrl.vi v16, v8, 16
3148 ; RV32I-NEXT:    vor.vv v8, v8, v16
3149 ; RV32I-NEXT:    li a0, 32
3150 ; RV32I-NEXT:    vsrl.vx v16, v8, a0
3151 ; RV32I-NEXT:    vor.vv v8, v8, v16
3152 ; RV32I-NEXT:    vnot.v v8, v8
3153 ; RV32I-NEXT:    vsrl.vi v16, v8, 1
3154 ; RV32I-NEXT:    lui a0, 349525
3155 ; RV32I-NEXT:    addi a0, a0, 1365
3156 ; RV32I-NEXT:    vsetvli a1, zero, e32, m8, ta, ma
3157 ; RV32I-NEXT:    vmv.v.x v24, a0
3158 ; RV32I-NEXT:    vsetvli a0, zero, e64, m8, ta, ma
3159 ; RV32I-NEXT:    vand.vv v16, v16, v24
3160 ; RV32I-NEXT:    vsub.vv v8, v8, v16
3161 ; RV32I-NEXT:    lui a0, 209715
3162 ; RV32I-NEXT:    addi a0, a0, 819
3163 ; RV32I-NEXT:    vsetvli a1, zero, e32, m8, ta, ma
3164 ; RV32I-NEXT:    vmv.v.x v16, a0
3165 ; RV32I-NEXT:    vsetvli a0, zero, e64, m8, ta, ma
3166 ; RV32I-NEXT:    vand.vv v24, v8, v16
3167 ; RV32I-NEXT:    vsrl.vi v8, v8, 2
3168 ; RV32I-NEXT:    vand.vv v8, v8, v16
3169 ; RV32I-NEXT:    vadd.vv v8, v24, v8
3170 ; RV32I-NEXT:    vsrl.vi v16, v8, 4
3171 ; RV32I-NEXT:    vadd.vv v8, v8, v16
3172 ; RV32I-NEXT:    lui a0, 61681
3173 ; RV32I-NEXT:    addi a0, a0, -241
3174 ; RV32I-NEXT:    vsetvli a1, zero, e32, m8, ta, ma
3175 ; RV32I-NEXT:    vmv.v.x v16, a0
3176 ; RV32I-NEXT:    vsetvli a0, zero, e64, m8, ta, ma
3177 ; RV32I-NEXT:    vand.vv v8, v8, v16
3178 ; RV32I-NEXT:    lui a0, 4112
3179 ; RV32I-NEXT:    addi a0, a0, 257
3180 ; RV32I-NEXT:    vsetvli a1, zero, e32, m8, ta, ma
3181 ; RV32I-NEXT:    vmv.v.x v16, a0
3182 ; RV32I-NEXT:    vsetvli a0, zero, e64, m8, ta, ma
3183 ; RV32I-NEXT:    vmul.vv v8, v8, v16
3184 ; RV32I-NEXT:    li a0, 56
3185 ; RV32I-NEXT:    vsrl.vx v8, v8, a0
3186 ; RV32I-NEXT:    ret
3188 ; RV64I-LABEL: ctlz_zero_undef_nxv8i64:
3189 ; RV64I:       # %bb.0:
3190 ; RV64I-NEXT:    vsetvli a0, zero, e64, m8, ta, ma
3191 ; RV64I-NEXT:    vsrl.vi v16, v8, 1
3192 ; RV64I-NEXT:    vor.vv v8, v8, v16
3193 ; RV64I-NEXT:    vsrl.vi v16, v8, 2
3194 ; RV64I-NEXT:    vor.vv v8, v8, v16
3195 ; RV64I-NEXT:    vsrl.vi v16, v8, 4
3196 ; RV64I-NEXT:    vor.vv v8, v8, v16
3197 ; RV64I-NEXT:    vsrl.vi v16, v8, 8
3198 ; RV64I-NEXT:    vor.vv v8, v8, v16
3199 ; RV64I-NEXT:    vsrl.vi v16, v8, 16
3200 ; RV64I-NEXT:    vor.vv v8, v8, v16
3201 ; RV64I-NEXT:    li a0, 32
3202 ; RV64I-NEXT:    vsrl.vx v16, v8, a0
3203 ; RV64I-NEXT:    vor.vv v8, v8, v16
3204 ; RV64I-NEXT:    vnot.v v8, v8
3205 ; RV64I-NEXT:    vsrl.vi v16, v8, 1
3206 ; RV64I-NEXT:    lui a0, 349525
3207 ; RV64I-NEXT:    addiw a0, a0, 1365
3208 ; RV64I-NEXT:    slli a1, a0, 32
3209 ; RV64I-NEXT:    add a0, a0, a1
3210 ; RV64I-NEXT:    vand.vx v16, v16, a0
3211 ; RV64I-NEXT:    vsub.vv v8, v8, v16
3212 ; RV64I-NEXT:    lui a0, 209715
3213 ; RV64I-NEXT:    addiw a0, a0, 819
3214 ; RV64I-NEXT:    slli a1, a0, 32
3215 ; RV64I-NEXT:    add a0, a0, a1
3216 ; RV64I-NEXT:    vand.vx v16, v8, a0
3217 ; RV64I-NEXT:    vsrl.vi v8, v8, 2
3218 ; RV64I-NEXT:    vand.vx v8, v8, a0
3219 ; RV64I-NEXT:    vadd.vv v8, v16, v8
3220 ; RV64I-NEXT:    vsrl.vi v16, v8, 4
3221 ; RV64I-NEXT:    vadd.vv v8, v8, v16
3222 ; RV64I-NEXT:    lui a0, 61681
3223 ; RV64I-NEXT:    addiw a0, a0, -241
3224 ; RV64I-NEXT:    slli a1, a0, 32
3225 ; RV64I-NEXT:    add a0, a0, a1
3226 ; RV64I-NEXT:    vand.vx v8, v8, a0
3227 ; RV64I-NEXT:    lui a0, 4112
3228 ; RV64I-NEXT:    addiw a0, a0, 257
3229 ; RV64I-NEXT:    slli a1, a0, 32
3230 ; RV64I-NEXT:    add a0, a0, a1
3231 ; RV64I-NEXT:    vmul.vx v8, v8, a0
3232 ; RV64I-NEXT:    li a0, 56
3233 ; RV64I-NEXT:    vsrl.vx v8, v8, a0
3234 ; RV64I-NEXT:    ret
3236 ; CHECK-F-LABEL: ctlz_zero_undef_nxv8i64:
3237 ; CHECK-F:       # %bb.0:
3238 ; CHECK-F-NEXT:    li a0, 190
3239 ; CHECK-F-NEXT:    vsetvli a1, zero, e32, m4, ta, ma
3240 ; CHECK-F-NEXT:    vmv.v.x v16, a0
3241 ; CHECK-F-NEXT:    fsrmi a0, 1
3242 ; CHECK-F-NEXT:    vfncvt.f.xu.w v20, v8
3243 ; CHECK-F-NEXT:    vsrl.vi v20, v20, 23
3244 ; CHECK-F-NEXT:    vwsubu.vv v8, v16, v20
3245 ; CHECK-F-NEXT:    fsrm a0
3246 ; CHECK-F-NEXT:    ret
3248 ; CHECK-D-LABEL: ctlz_zero_undef_nxv8i64:
3249 ; CHECK-D:       # %bb.0:
3250 ; CHECK-D-NEXT:    fsrmi a0, 1
3251 ; CHECK-D-NEXT:    vsetvli a1, zero, e64, m8, ta, ma
3252 ; CHECK-D-NEXT:    vfcvt.f.xu.v v8, v8
3253 ; CHECK-D-NEXT:    li a1, 52
3254 ; CHECK-D-NEXT:    vsrl.vx v8, v8, a1
3255 ; CHECK-D-NEXT:    li a1, 1086
3256 ; CHECK-D-NEXT:    vrsub.vx v8, v8, a1
3257 ; CHECK-D-NEXT:    fsrm a0
3258 ; CHECK-D-NEXT:    ret
3260 ; CHECK-ZVBB-LABEL: ctlz_zero_undef_nxv8i64:
3261 ; CHECK-ZVBB:       # %bb.0:
3262 ; CHECK-ZVBB-NEXT:    vsetvli a0, zero, e64, m8, ta, ma
3263 ; CHECK-ZVBB-NEXT:    vclz.v v8, v8
3264 ; CHECK-ZVBB-NEXT:    ret
3265   %a = call <vscale x 8 x i64> @llvm.ctlz.nxv8i64(<vscale x 8 x i64> %va, i1 true)
3266   ret <vscale x 8 x i64> %a
3268 ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
3269 ; RV32: {{.*}}
3270 ; RV32F: {{.*}}
3271 ; RV64: {{.*}}
3272 ; RV64F: {{.*}}