1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=riscv32 -mattr=+experimental-v -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV32,RV32I
3; RUN: llc -mtriple=riscv64 -mattr=+experimental-v -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV64,RV64I
4; RUN: llc -mtriple=riscv32 -mattr=+experimental-v,+d -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV32,RV32D
5; RUN: llc -mtriple=riscv64 -mattr=+experimental-v,+d -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV64,RV64D
6
7define <vscale x 1 x i8> @ctlz_nxv1i8(<vscale x 1 x i8> %va) {
8; RV32I-LABEL: ctlz_nxv1i8:
9; RV32I:       # %bb.0:
10; RV32I-NEXT:    vsetvli a0, zero, e8, mf8, ta, mu
11; RV32I-NEXT:    vsrl.vi v9, v8, 1
12; RV32I-NEXT:    vor.vv v8, v8, v9
13; RV32I-NEXT:    vsrl.vi v9, v8, 2
14; RV32I-NEXT:    vor.vv v8, v8, v9
15; RV32I-NEXT:    vsrl.vi v9, v8, 4
16; RV32I-NEXT:    vor.vv v8, v8, v9
17; RV32I-NEXT:    vxor.vi v8, v8, -1
18; RV32I-NEXT:    vsrl.vi v9, v8, 1
19; RV32I-NEXT:    li a0, 85
20; RV32I-NEXT:    vand.vx v9, v9, a0
21; RV32I-NEXT:    vsub.vv v8, v8, v9
22; RV32I-NEXT:    li a0, 51
23; RV32I-NEXT:    vand.vx v9, v8, a0
24; RV32I-NEXT:    vsrl.vi v8, v8, 2
25; RV32I-NEXT:    vand.vx v8, v8, a0
26; RV32I-NEXT:    vadd.vv v8, v9, v8
27; RV32I-NEXT:    vsrl.vi v9, v8, 4
28; RV32I-NEXT:    vadd.vv v8, v8, v9
29; RV32I-NEXT:    vand.vi v8, v8, 15
30; RV32I-NEXT:    ret
31;
32; RV64I-LABEL: ctlz_nxv1i8:
33; RV64I:       # %bb.0:
34; RV64I-NEXT:    vsetvli a0, zero, e8, mf8, ta, mu
35; RV64I-NEXT:    vsrl.vi v9, v8, 1
36; RV64I-NEXT:    vor.vv v8, v8, v9
37; RV64I-NEXT:    vsrl.vi v9, v8, 2
38; RV64I-NEXT:    vor.vv v8, v8, v9
39; RV64I-NEXT:    vsrl.vi v9, v8, 4
40; RV64I-NEXT:    vor.vv v8, v8, v9
41; RV64I-NEXT:    vxor.vi v8, v8, -1
42; RV64I-NEXT:    vsrl.vi v9, v8, 1
43; RV64I-NEXT:    li a0, 85
44; RV64I-NEXT:    vand.vx v9, v9, a0
45; RV64I-NEXT:    vsub.vv v8, v8, v9
46; RV64I-NEXT:    li a0, 51
47; RV64I-NEXT:    vand.vx v9, v8, a0
48; RV64I-NEXT:    vsrl.vi v8, v8, 2
49; RV64I-NEXT:    vand.vx v8, v8, a0
50; RV64I-NEXT:    vadd.vv v8, v9, v8
51; RV64I-NEXT:    vsrl.vi v9, v8, 4
52; RV64I-NEXT:    vadd.vv v8, v8, v9
53; RV64I-NEXT:    vand.vi v8, v8, 15
54; RV64I-NEXT:    ret
55;
56; RV32D-LABEL: ctlz_nxv1i8:
57; RV32D:       # %bb.0:
58; RV32D-NEXT:    vsetvli a0, zero, e32, mf2, ta, mu
59; RV32D-NEXT:    vzext.vf4 v9, v8
60; RV32D-NEXT:    vfcvt.f.xu.v v9, v9
61; RV32D-NEXT:    vsrl.vi v9, v9, 23
62; RV32D-NEXT:    vsetvli zero, zero, e16, mf4, ta, mu
63; RV32D-NEXT:    vnsrl.wi v9, v9, 0
64; RV32D-NEXT:    vsetvli zero, zero, e8, mf8, ta, mu
65; RV32D-NEXT:    vnsrl.wi v9, v9, 0
66; RV32D-NEXT:    li a0, 134
67; RV32D-NEXT:    vmseq.vi v0, v8, 0
68; RV32D-NEXT:    vrsub.vx v8, v9, a0
69; RV32D-NEXT:    vmerge.vim v8, v8, 8, v0
70; RV32D-NEXT:    ret
71;
72; RV64D-LABEL: ctlz_nxv1i8:
73; RV64D:       # %bb.0:
74; RV64D-NEXT:    vsetvli a0, zero, e32, mf2, ta, mu
75; RV64D-NEXT:    vzext.vf4 v9, v8
76; RV64D-NEXT:    vfcvt.f.xu.v v9, v9
77; RV64D-NEXT:    vsrl.vi v9, v9, 23
78; RV64D-NEXT:    vsetvli zero, zero, e16, mf4, ta, mu
79; RV64D-NEXT:    vnsrl.wi v9, v9, 0
80; RV64D-NEXT:    vsetvli zero, zero, e8, mf8, ta, mu
81; RV64D-NEXT:    vnsrl.wi v9, v9, 0
82; RV64D-NEXT:    li a0, 134
83; RV64D-NEXT:    vmseq.vi v0, v8, 0
84; RV64D-NEXT:    vrsub.vx v8, v9, a0
85; RV64D-NEXT:    vmerge.vim v8, v8, 8, v0
86; RV64D-NEXT:    ret
87  %a = call <vscale x 1 x i8> @llvm.ctlz.nxv1i8(<vscale x 1 x i8> %va, i1 false)
88  ret <vscale x 1 x i8> %a
89}
90declare <vscale x 1 x i8> @llvm.ctlz.nxv1i8(<vscale x 1 x i8>, i1)
91
92define <vscale x 2 x i8> @ctlz_nxv2i8(<vscale x 2 x i8> %va) {
93; RV32I-LABEL: ctlz_nxv2i8:
94; RV32I:       # %bb.0:
95; RV32I-NEXT:    vsetvli a0, zero, e8, mf4, ta, mu
96; RV32I-NEXT:    vsrl.vi v9, v8, 1
97; RV32I-NEXT:    vor.vv v8, v8, v9
98; RV32I-NEXT:    vsrl.vi v9, v8, 2
99; RV32I-NEXT:    vor.vv v8, v8, v9
100; RV32I-NEXT:    vsrl.vi v9, v8, 4
101; RV32I-NEXT:    vor.vv v8, v8, v9
102; RV32I-NEXT:    vxor.vi v8, v8, -1
103; RV32I-NEXT:    vsrl.vi v9, v8, 1
104; RV32I-NEXT:    li a0, 85
105; RV32I-NEXT:    vand.vx v9, v9, a0
106; RV32I-NEXT:    vsub.vv v8, v8, v9
107; RV32I-NEXT:    li a0, 51
108; RV32I-NEXT:    vand.vx v9, v8, a0
109; RV32I-NEXT:    vsrl.vi v8, v8, 2
110; RV32I-NEXT:    vand.vx v8, v8, a0
111; RV32I-NEXT:    vadd.vv v8, v9, v8
112; RV32I-NEXT:    vsrl.vi v9, v8, 4
113; RV32I-NEXT:    vadd.vv v8, v8, v9
114; RV32I-NEXT:    vand.vi v8, v8, 15
115; RV32I-NEXT:    ret
116;
117; RV64I-LABEL: ctlz_nxv2i8:
118; RV64I:       # %bb.0:
119; RV64I-NEXT:    vsetvli a0, zero, e8, mf4, ta, mu
120; RV64I-NEXT:    vsrl.vi v9, v8, 1
121; RV64I-NEXT:    vor.vv v8, v8, v9
122; RV64I-NEXT:    vsrl.vi v9, v8, 2
123; RV64I-NEXT:    vor.vv v8, v8, v9
124; RV64I-NEXT:    vsrl.vi v9, v8, 4
125; RV64I-NEXT:    vor.vv v8, v8, v9
126; RV64I-NEXT:    vxor.vi v8, v8, -1
127; RV64I-NEXT:    vsrl.vi v9, v8, 1
128; RV64I-NEXT:    li a0, 85
129; RV64I-NEXT:    vand.vx v9, v9, a0
130; RV64I-NEXT:    vsub.vv v8, v8, v9
131; RV64I-NEXT:    li a0, 51
132; RV64I-NEXT:    vand.vx v9, v8, a0
133; RV64I-NEXT:    vsrl.vi v8, v8, 2
134; RV64I-NEXT:    vand.vx v8, v8, a0
135; RV64I-NEXT:    vadd.vv v8, v9, v8
136; RV64I-NEXT:    vsrl.vi v9, v8, 4
137; RV64I-NEXT:    vadd.vv v8, v8, v9
138; RV64I-NEXT:    vand.vi v8, v8, 15
139; RV64I-NEXT:    ret
140;
141; RV32D-LABEL: ctlz_nxv2i8:
142; RV32D:       # %bb.0:
143; RV32D-NEXT:    vsetvli a0, zero, e32, m1, ta, mu
144; RV32D-NEXT:    vzext.vf4 v9, v8
145; RV32D-NEXT:    vfcvt.f.xu.v v9, v9
146; RV32D-NEXT:    vsrl.vi v9, v9, 23
147; RV32D-NEXT:    vsetvli zero, zero, e16, mf2, ta, mu
148; RV32D-NEXT:    vnsrl.wi v9, v9, 0
149; RV32D-NEXT:    vsetvli zero, zero, e8, mf4, ta, mu
150; RV32D-NEXT:    vnsrl.wi v9, v9, 0
151; RV32D-NEXT:    li a0, 134
152; RV32D-NEXT:    vmseq.vi v0, v8, 0
153; RV32D-NEXT:    vrsub.vx v8, v9, a0
154; RV32D-NEXT:    vmerge.vim v8, v8, 8, v0
155; RV32D-NEXT:    ret
156;
157; RV64D-LABEL: ctlz_nxv2i8:
158; RV64D:       # %bb.0:
159; RV64D-NEXT:    vsetvli a0, zero, e32, m1, ta, mu
160; RV64D-NEXT:    vzext.vf4 v9, v8
161; RV64D-NEXT:    vfcvt.f.xu.v v9, v9
162; RV64D-NEXT:    vsrl.vi v9, v9, 23
163; RV64D-NEXT:    vsetvli zero, zero, e16, mf2, ta, mu
164; RV64D-NEXT:    vnsrl.wi v9, v9, 0
165; RV64D-NEXT:    vsetvli zero, zero, e8, mf4, ta, mu
166; RV64D-NEXT:    vnsrl.wi v9, v9, 0
167; RV64D-NEXT:    li a0, 134
168; RV64D-NEXT:    vmseq.vi v0, v8, 0
169; RV64D-NEXT:    vrsub.vx v8, v9, a0
170; RV64D-NEXT:    vmerge.vim v8, v8, 8, v0
171; RV64D-NEXT:    ret
172  %a = call <vscale x 2 x i8> @llvm.ctlz.nxv2i8(<vscale x 2 x i8> %va, i1 false)
173  ret <vscale x 2 x i8> %a
174}
175declare <vscale x 2 x i8> @llvm.ctlz.nxv2i8(<vscale x 2 x i8>, i1)
176
177define <vscale x 4 x i8> @ctlz_nxv4i8(<vscale x 4 x i8> %va) {
178; RV32I-LABEL: ctlz_nxv4i8:
179; RV32I:       # %bb.0:
180; RV32I-NEXT:    vsetvli a0, zero, e8, mf2, ta, mu
181; RV32I-NEXT:    vsrl.vi v9, v8, 1
182; RV32I-NEXT:    vor.vv v8, v8, v9
183; RV32I-NEXT:    vsrl.vi v9, v8, 2
184; RV32I-NEXT:    vor.vv v8, v8, v9
185; RV32I-NEXT:    vsrl.vi v9, v8, 4
186; RV32I-NEXT:    vor.vv v8, v8, v9
187; RV32I-NEXT:    vxor.vi v8, v8, -1
188; RV32I-NEXT:    vsrl.vi v9, v8, 1
189; RV32I-NEXT:    li a0, 85
190; RV32I-NEXT:    vand.vx v9, v9, a0
191; RV32I-NEXT:    vsub.vv v8, v8, v9
192; RV32I-NEXT:    li a0, 51
193; RV32I-NEXT:    vand.vx v9, v8, a0
194; RV32I-NEXT:    vsrl.vi v8, v8, 2
195; RV32I-NEXT:    vand.vx v8, v8, a0
196; RV32I-NEXT:    vadd.vv v8, v9, v8
197; RV32I-NEXT:    vsrl.vi v9, v8, 4
198; RV32I-NEXT:    vadd.vv v8, v8, v9
199; RV32I-NEXT:    vand.vi v8, v8, 15
200; RV32I-NEXT:    ret
201;
202; RV64I-LABEL: ctlz_nxv4i8:
203; RV64I:       # %bb.0:
204; RV64I-NEXT:    vsetvli a0, zero, e8, mf2, ta, mu
205; RV64I-NEXT:    vsrl.vi v9, v8, 1
206; RV64I-NEXT:    vor.vv v8, v8, v9
207; RV64I-NEXT:    vsrl.vi v9, v8, 2
208; RV64I-NEXT:    vor.vv v8, v8, v9
209; RV64I-NEXT:    vsrl.vi v9, v8, 4
210; RV64I-NEXT:    vor.vv v8, v8, v9
211; RV64I-NEXT:    vxor.vi v8, v8, -1
212; RV64I-NEXT:    vsrl.vi v9, v8, 1
213; RV64I-NEXT:    li a0, 85
214; RV64I-NEXT:    vand.vx v9, v9, a0
215; RV64I-NEXT:    vsub.vv v8, v8, v9
216; RV64I-NEXT:    li a0, 51
217; RV64I-NEXT:    vand.vx v9, v8, a0
218; RV64I-NEXT:    vsrl.vi v8, v8, 2
219; RV64I-NEXT:    vand.vx v8, v8, a0
220; RV64I-NEXT:    vadd.vv v8, v9, v8
221; RV64I-NEXT:    vsrl.vi v9, v8, 4
222; RV64I-NEXT:    vadd.vv v8, v8, v9
223; RV64I-NEXT:    vand.vi v8, v8, 15
224; RV64I-NEXT:    ret
225;
226; RV32D-LABEL: ctlz_nxv4i8:
227; RV32D:       # %bb.0:
228; RV32D-NEXT:    vsetvli a0, zero, e32, m2, ta, mu
229; RV32D-NEXT:    vzext.vf4 v10, v8
230; RV32D-NEXT:    vfcvt.f.xu.v v10, v10
231; RV32D-NEXT:    vsrl.vi v10, v10, 23
232; RV32D-NEXT:    vsetvli zero, zero, e16, m1, ta, mu
233; RV32D-NEXT:    vnsrl.wi v9, v10, 0
234; RV32D-NEXT:    vsetvli zero, zero, e8, mf2, ta, mu
235; RV32D-NEXT:    vnsrl.wi v9, v9, 0
236; RV32D-NEXT:    li a0, 134
237; RV32D-NEXT:    vmseq.vi v0, v8, 0
238; RV32D-NEXT:    vrsub.vx v8, v9, a0
239; RV32D-NEXT:    vmerge.vim v8, v8, 8, v0
240; RV32D-NEXT:    ret
241;
242; RV64D-LABEL: ctlz_nxv4i8:
243; RV64D:       # %bb.0:
244; RV64D-NEXT:    vsetvli a0, zero, e32, m2, ta, mu
245; RV64D-NEXT:    vzext.vf4 v10, v8
246; RV64D-NEXT:    vfcvt.f.xu.v v10, v10
247; RV64D-NEXT:    vsrl.vi v10, v10, 23
248; RV64D-NEXT:    vsetvli zero, zero, e16, m1, ta, mu
249; RV64D-NEXT:    vnsrl.wi v9, v10, 0
250; RV64D-NEXT:    vsetvli zero, zero, e8, mf2, ta, mu
251; RV64D-NEXT:    vnsrl.wi v9, v9, 0
252; RV64D-NEXT:    li a0, 134
253; RV64D-NEXT:    vmseq.vi v0, v8, 0
254; RV64D-NEXT:    vrsub.vx v8, v9, a0
255; RV64D-NEXT:    vmerge.vim v8, v8, 8, v0
256; RV64D-NEXT:    ret
257  %a = call <vscale x 4 x i8> @llvm.ctlz.nxv4i8(<vscale x 4 x i8> %va, i1 false)
258  ret <vscale x 4 x i8> %a
259}
260declare <vscale x 4 x i8> @llvm.ctlz.nxv4i8(<vscale x 4 x i8>, i1)
261
262define <vscale x 8 x i8> @ctlz_nxv8i8(<vscale x 8 x i8> %va) {
263; RV32I-LABEL: ctlz_nxv8i8:
264; RV32I:       # %bb.0:
265; RV32I-NEXT:    vsetvli a0, zero, e8, m1, ta, mu
266; RV32I-NEXT:    vsrl.vi v9, v8, 1
267; RV32I-NEXT:    vor.vv v8, v8, v9
268; RV32I-NEXT:    vsrl.vi v9, v8, 2
269; RV32I-NEXT:    vor.vv v8, v8, v9
270; RV32I-NEXT:    vsrl.vi v9, v8, 4
271; RV32I-NEXT:    vor.vv v8, v8, v9
272; RV32I-NEXT:    vxor.vi v8, v8, -1
273; RV32I-NEXT:    vsrl.vi v9, v8, 1
274; RV32I-NEXT:    li a0, 85
275; RV32I-NEXT:    vand.vx v9, v9, a0
276; RV32I-NEXT:    vsub.vv v8, v8, v9
277; RV32I-NEXT:    li a0, 51
278; RV32I-NEXT:    vand.vx v9, v8, a0
279; RV32I-NEXT:    vsrl.vi v8, v8, 2
280; RV32I-NEXT:    vand.vx v8, v8, a0
281; RV32I-NEXT:    vadd.vv v8, v9, v8
282; RV32I-NEXT:    vsrl.vi v9, v8, 4
283; RV32I-NEXT:    vadd.vv v8, v8, v9
284; RV32I-NEXT:    vand.vi v8, v8, 15
285; RV32I-NEXT:    ret
286;
287; RV64I-LABEL: ctlz_nxv8i8:
288; RV64I:       # %bb.0:
289; RV64I-NEXT:    vsetvli a0, zero, e8, m1, ta, mu
290; RV64I-NEXT:    vsrl.vi v9, v8, 1
291; RV64I-NEXT:    vor.vv v8, v8, v9
292; RV64I-NEXT:    vsrl.vi v9, v8, 2
293; RV64I-NEXT:    vor.vv v8, v8, v9
294; RV64I-NEXT:    vsrl.vi v9, v8, 4
295; RV64I-NEXT:    vor.vv v8, v8, v9
296; RV64I-NEXT:    vxor.vi v8, v8, -1
297; RV64I-NEXT:    vsrl.vi v9, v8, 1
298; RV64I-NEXT:    li a0, 85
299; RV64I-NEXT:    vand.vx v9, v9, a0
300; RV64I-NEXT:    vsub.vv v8, v8, v9
301; RV64I-NEXT:    li a0, 51
302; RV64I-NEXT:    vand.vx v9, v8, a0
303; RV64I-NEXT:    vsrl.vi v8, v8, 2
304; RV64I-NEXT:    vand.vx v8, v8, a0
305; RV64I-NEXT:    vadd.vv v8, v9, v8
306; RV64I-NEXT:    vsrl.vi v9, v8, 4
307; RV64I-NEXT:    vadd.vv v8, v8, v9
308; RV64I-NEXT:    vand.vi v8, v8, 15
309; RV64I-NEXT:    ret
310;
311; RV32D-LABEL: ctlz_nxv8i8:
312; RV32D:       # %bb.0:
313; RV32D-NEXT:    vsetvli a0, zero, e32, m4, ta, mu
314; RV32D-NEXT:    vzext.vf4 v12, v8
315; RV32D-NEXT:    vfcvt.f.xu.v v12, v12
316; RV32D-NEXT:    vsrl.vi v12, v12, 23
317; RV32D-NEXT:    vsetvli zero, zero, e16, m2, ta, mu
318; RV32D-NEXT:    vnsrl.wi v10, v12, 0
319; RV32D-NEXT:    vsetvli zero, zero, e8, m1, ta, mu
320; RV32D-NEXT:    vnsrl.wi v9, v10, 0
321; RV32D-NEXT:    li a0, 134
322; RV32D-NEXT:    vmseq.vi v0, v8, 0
323; RV32D-NEXT:    vrsub.vx v8, v9, a0
324; RV32D-NEXT:    vmerge.vim v8, v8, 8, v0
325; RV32D-NEXT:    ret
326;
327; RV64D-LABEL: ctlz_nxv8i8:
328; RV64D:       # %bb.0:
329; RV64D-NEXT:    vsetvli a0, zero, e32, m4, ta, mu
330; RV64D-NEXT:    vzext.vf4 v12, v8
331; RV64D-NEXT:    vfcvt.f.xu.v v12, v12
332; RV64D-NEXT:    vsrl.vi v12, v12, 23
333; RV64D-NEXT:    vsetvli zero, zero, e16, m2, ta, mu
334; RV64D-NEXT:    vnsrl.wi v10, v12, 0
335; RV64D-NEXT:    vsetvli zero, zero, e8, m1, ta, mu
336; RV64D-NEXT:    vnsrl.wi v9, v10, 0
337; RV64D-NEXT:    li a0, 134
338; RV64D-NEXT:    vmseq.vi v0, v8, 0
339; RV64D-NEXT:    vrsub.vx v8, v9, a0
340; RV64D-NEXT:    vmerge.vim v8, v8, 8, v0
341; RV64D-NEXT:    ret
342  %a = call <vscale x 8 x i8> @llvm.ctlz.nxv8i8(<vscale x 8 x i8> %va, i1 false)
343  ret <vscale x 8 x i8> %a
344}
345declare <vscale x 8 x i8> @llvm.ctlz.nxv8i8(<vscale x 8 x i8>, i1)
346
347define <vscale x 16 x i8> @ctlz_nxv16i8(<vscale x 16 x i8> %va) {
348; RV32I-LABEL: ctlz_nxv16i8:
349; RV32I:       # %bb.0:
350; RV32I-NEXT:    vsetvli a0, zero, e8, m2, ta, mu
351; RV32I-NEXT:    vsrl.vi v10, v8, 1
352; RV32I-NEXT:    vor.vv v8, v8, v10
353; RV32I-NEXT:    vsrl.vi v10, v8, 2
354; RV32I-NEXT:    vor.vv v8, v8, v10
355; RV32I-NEXT:    vsrl.vi v10, v8, 4
356; RV32I-NEXT:    vor.vv v8, v8, v10
357; RV32I-NEXT:    vxor.vi v8, v8, -1
358; RV32I-NEXT:    vsrl.vi v10, v8, 1
359; RV32I-NEXT:    li a0, 85
360; RV32I-NEXT:    vand.vx v10, v10, a0
361; RV32I-NEXT:    vsub.vv v8, v8, v10
362; RV32I-NEXT:    li a0, 51
363; RV32I-NEXT:    vand.vx v10, v8, a0
364; RV32I-NEXT:    vsrl.vi v8, v8, 2
365; RV32I-NEXT:    vand.vx v8, v8, a0
366; RV32I-NEXT:    vadd.vv v8, v10, v8
367; RV32I-NEXT:    vsrl.vi v10, v8, 4
368; RV32I-NEXT:    vadd.vv v8, v8, v10
369; RV32I-NEXT:    vand.vi v8, v8, 15
370; RV32I-NEXT:    ret
371;
372; RV64I-LABEL: ctlz_nxv16i8:
373; RV64I:       # %bb.0:
374; RV64I-NEXT:    vsetvli a0, zero, e8, m2, ta, mu
375; RV64I-NEXT:    vsrl.vi v10, v8, 1
376; RV64I-NEXT:    vor.vv v8, v8, v10
377; RV64I-NEXT:    vsrl.vi v10, v8, 2
378; RV64I-NEXT:    vor.vv v8, v8, v10
379; RV64I-NEXT:    vsrl.vi v10, v8, 4
380; RV64I-NEXT:    vor.vv v8, v8, v10
381; RV64I-NEXT:    vxor.vi v8, v8, -1
382; RV64I-NEXT:    vsrl.vi v10, v8, 1
383; RV64I-NEXT:    li a0, 85
384; RV64I-NEXT:    vand.vx v10, v10, a0
385; RV64I-NEXT:    vsub.vv v8, v8, v10
386; RV64I-NEXT:    li a0, 51
387; RV64I-NEXT:    vand.vx v10, v8, a0
388; RV64I-NEXT:    vsrl.vi v8, v8, 2
389; RV64I-NEXT:    vand.vx v8, v8, a0
390; RV64I-NEXT:    vadd.vv v8, v10, v8
391; RV64I-NEXT:    vsrl.vi v10, v8, 4
392; RV64I-NEXT:    vadd.vv v8, v8, v10
393; RV64I-NEXT:    vand.vi v8, v8, 15
394; RV64I-NEXT:    ret
395;
396; RV32D-LABEL: ctlz_nxv16i8:
397; RV32D:       # %bb.0:
398; RV32D-NEXT:    vsetvli a0, zero, e32, m8, ta, mu
399; RV32D-NEXT:    vzext.vf4 v16, v8
400; RV32D-NEXT:    vfcvt.f.xu.v v16, v16
401; RV32D-NEXT:    vsrl.vi v16, v16, 23
402; RV32D-NEXT:    vsetvli zero, zero, e16, m4, ta, mu
403; RV32D-NEXT:    vnsrl.wi v12, v16, 0
404; RV32D-NEXT:    vsetvli zero, zero, e8, m2, ta, mu
405; RV32D-NEXT:    vnsrl.wi v10, v12, 0
406; RV32D-NEXT:    li a0, 134
407; RV32D-NEXT:    vmseq.vi v0, v8, 0
408; RV32D-NEXT:    vrsub.vx v8, v10, a0
409; RV32D-NEXT:    vmerge.vim v8, v8, 8, v0
410; RV32D-NEXT:    ret
411;
412; RV64D-LABEL: ctlz_nxv16i8:
413; RV64D:       # %bb.0:
414; RV64D-NEXT:    vsetvli a0, zero, e32, m8, ta, mu
415; RV64D-NEXT:    vzext.vf4 v16, v8
416; RV64D-NEXT:    vfcvt.f.xu.v v16, v16
417; RV64D-NEXT:    vsrl.vi v16, v16, 23
418; RV64D-NEXT:    vsetvli zero, zero, e16, m4, ta, mu
419; RV64D-NEXT:    vnsrl.wi v12, v16, 0
420; RV64D-NEXT:    vsetvli zero, zero, e8, m2, ta, mu
421; RV64D-NEXT:    vnsrl.wi v10, v12, 0
422; RV64D-NEXT:    li a0, 134
423; RV64D-NEXT:    vmseq.vi v0, v8, 0
424; RV64D-NEXT:    vrsub.vx v8, v10, a0
425; RV64D-NEXT:    vmerge.vim v8, v8, 8, v0
426; RV64D-NEXT:    ret
427  %a = call <vscale x 16 x i8> @llvm.ctlz.nxv16i8(<vscale x 16 x i8> %va, i1 false)
428  ret <vscale x 16 x i8> %a
429}
430declare <vscale x 16 x i8> @llvm.ctlz.nxv16i8(<vscale x 16 x i8>, i1)
431
432define <vscale x 32 x i8> @ctlz_nxv32i8(<vscale x 32 x i8> %va) {
433; CHECK-LABEL: ctlz_nxv32i8:
434; CHECK:       # %bb.0:
435; CHECK-NEXT:    vsetvli a0, zero, e8, m4, ta, mu
436; CHECK-NEXT:    vsrl.vi v12, v8, 1
437; CHECK-NEXT:    vor.vv v8, v8, v12
438; CHECK-NEXT:    vsrl.vi v12, v8, 2
439; CHECK-NEXT:    vor.vv v8, v8, v12
440; CHECK-NEXT:    vsrl.vi v12, v8, 4
441; CHECK-NEXT:    vor.vv v8, v8, v12
442; CHECK-NEXT:    vxor.vi v8, v8, -1
443; CHECK-NEXT:    vsrl.vi v12, v8, 1
444; CHECK-NEXT:    li a0, 85
445; CHECK-NEXT:    vand.vx v12, v12, a0
446; CHECK-NEXT:    vsub.vv v8, v8, v12
447; CHECK-NEXT:    li a0, 51
448; CHECK-NEXT:    vand.vx v12, v8, a0
449; CHECK-NEXT:    vsrl.vi v8, v8, 2
450; CHECK-NEXT:    vand.vx v8, v8, a0
451; CHECK-NEXT:    vadd.vv v8, v12, v8
452; CHECK-NEXT:    vsrl.vi v12, v8, 4
453; CHECK-NEXT:    vadd.vv v8, v8, v12
454; CHECK-NEXT:    vand.vi v8, v8, 15
455; CHECK-NEXT:    ret
456  %a = call <vscale x 32 x i8> @llvm.ctlz.nxv32i8(<vscale x 32 x i8> %va, i1 false)
457  ret <vscale x 32 x i8> %a
458}
459declare <vscale x 32 x i8> @llvm.ctlz.nxv32i8(<vscale x 32 x i8>, i1)
460
461define <vscale x 64 x i8> @ctlz_nxv64i8(<vscale x 64 x i8> %va) {
462; CHECK-LABEL: ctlz_nxv64i8:
463; CHECK:       # %bb.0:
464; CHECK-NEXT:    vsetvli a0, zero, e8, m8, ta, mu
465; CHECK-NEXT:    vsrl.vi v16, v8, 1
466; CHECK-NEXT:    vor.vv v8, v8, v16
467; CHECK-NEXT:    vsrl.vi v16, v8, 2
468; CHECK-NEXT:    vor.vv v8, v8, v16
469; CHECK-NEXT:    vsrl.vi v16, v8, 4
470; CHECK-NEXT:    vor.vv v8, v8, v16
471; CHECK-NEXT:    vxor.vi v8, v8, -1
472; CHECK-NEXT:    vsrl.vi v16, v8, 1
473; CHECK-NEXT:    li a0, 85
474; CHECK-NEXT:    vand.vx v16, v16, a0
475; CHECK-NEXT:    vsub.vv v8, v8, v16
476; CHECK-NEXT:    li a0, 51
477; CHECK-NEXT:    vand.vx v16, v8, a0
478; CHECK-NEXT:    vsrl.vi v8, v8, 2
479; CHECK-NEXT:    vand.vx v8, v8, a0
480; CHECK-NEXT:    vadd.vv v8, v16, v8
481; CHECK-NEXT:    vsrl.vi v16, v8, 4
482; CHECK-NEXT:    vadd.vv v8, v8, v16
483; CHECK-NEXT:    vand.vi v8, v8, 15
484; CHECK-NEXT:    ret
485  %a = call <vscale x 64 x i8> @llvm.ctlz.nxv64i8(<vscale x 64 x i8> %va, i1 false)
486  ret <vscale x 64 x i8> %a
487}
488declare <vscale x 64 x i8> @llvm.ctlz.nxv64i8(<vscale x 64 x i8>, i1)
489
490define <vscale x 1 x i16> @ctlz_nxv1i16(<vscale x 1 x i16> %va) {
491; RV32I-LABEL: ctlz_nxv1i16:
492; RV32I:       # %bb.0:
493; RV32I-NEXT:    vsetvli a0, zero, e16, mf4, ta, mu
494; RV32I-NEXT:    vsrl.vi v9, v8, 1
495; RV32I-NEXT:    vor.vv v8, v8, v9
496; RV32I-NEXT:    vsrl.vi v9, v8, 2
497; RV32I-NEXT:    vor.vv v8, v8, v9
498; RV32I-NEXT:    vsrl.vi v9, v8, 4
499; RV32I-NEXT:    vor.vv v8, v8, v9
500; RV32I-NEXT:    vsrl.vi v9, v8, 8
501; RV32I-NEXT:    vor.vv v8, v8, v9
502; RV32I-NEXT:    vxor.vi v8, v8, -1
503; RV32I-NEXT:    vsrl.vi v9, v8, 1
504; RV32I-NEXT:    lui a0, 5
505; RV32I-NEXT:    addi a0, a0, 1365
506; RV32I-NEXT:    vand.vx v9, v9, a0
507; RV32I-NEXT:    vsub.vv v8, v8, v9
508; RV32I-NEXT:    lui a0, 3
509; RV32I-NEXT:    addi a0, a0, 819
510; RV32I-NEXT:    vand.vx v9, v8, a0
511; RV32I-NEXT:    vsrl.vi v8, v8, 2
512; RV32I-NEXT:    vand.vx v8, v8, a0
513; RV32I-NEXT:    vadd.vv v8, v9, v8
514; RV32I-NEXT:    vsrl.vi v9, v8, 4
515; RV32I-NEXT:    vadd.vv v8, v8, v9
516; RV32I-NEXT:    lui a0, 1
517; RV32I-NEXT:    addi a0, a0, -241
518; RV32I-NEXT:    vand.vx v8, v8, a0
519; RV32I-NEXT:    li a0, 257
520; RV32I-NEXT:    vmul.vx v8, v8, a0
521; RV32I-NEXT:    vsrl.vi v8, v8, 8
522; RV32I-NEXT:    ret
523;
524; RV64I-LABEL: ctlz_nxv1i16:
525; RV64I:       # %bb.0:
526; RV64I-NEXT:    vsetvli a0, zero, e16, mf4, ta, mu
527; RV64I-NEXT:    vsrl.vi v9, v8, 1
528; RV64I-NEXT:    vor.vv v8, v8, v9
529; RV64I-NEXT:    vsrl.vi v9, v8, 2
530; RV64I-NEXT:    vor.vv v8, v8, v9
531; RV64I-NEXT:    vsrl.vi v9, v8, 4
532; RV64I-NEXT:    vor.vv v8, v8, v9
533; RV64I-NEXT:    vsrl.vi v9, v8, 8
534; RV64I-NEXT:    vor.vv v8, v8, v9
535; RV64I-NEXT:    vxor.vi v8, v8, -1
536; RV64I-NEXT:    vsrl.vi v9, v8, 1
537; RV64I-NEXT:    lui a0, 5
538; RV64I-NEXT:    addiw a0, a0, 1365
539; RV64I-NEXT:    vand.vx v9, v9, a0
540; RV64I-NEXT:    vsub.vv v8, v8, v9
541; RV64I-NEXT:    lui a0, 3
542; RV64I-NEXT:    addiw a0, a0, 819
543; RV64I-NEXT:    vand.vx v9, v8, a0
544; RV64I-NEXT:    vsrl.vi v8, v8, 2
545; RV64I-NEXT:    vand.vx v8, v8, a0
546; RV64I-NEXT:    vadd.vv v8, v9, v8
547; RV64I-NEXT:    vsrl.vi v9, v8, 4
548; RV64I-NEXT:    vadd.vv v8, v8, v9
549; RV64I-NEXT:    lui a0, 1
550; RV64I-NEXT:    addiw a0, a0, -241
551; RV64I-NEXT:    vand.vx v8, v8, a0
552; RV64I-NEXT:    li a0, 257
553; RV64I-NEXT:    vmul.vx v8, v8, a0
554; RV64I-NEXT:    vsrl.vi v8, v8, 8
555; RV64I-NEXT:    ret
556;
557; RV32D-LABEL: ctlz_nxv1i16:
558; RV32D:       # %bb.0:
559; RV32D-NEXT:    vsetvli a0, zero, e16, mf4, ta, mu
560; RV32D-NEXT:    vfwcvt.f.xu.v v9, v8
561; RV32D-NEXT:    vsetvli zero, zero, e32, mf2, ta, mu
562; RV32D-NEXT:    vsrl.vi v9, v9, 23
563; RV32D-NEXT:    vsetvli zero, zero, e16, mf4, ta, mu
564; RV32D-NEXT:    vnsrl.wi v9, v9, 0
565; RV32D-NEXT:    li a0, 142
566; RV32D-NEXT:    vrsub.vx v9, v9, a0
567; RV32D-NEXT:    vmseq.vi v0, v8, 0
568; RV32D-NEXT:    li a0, 16
569; RV32D-NEXT:    vmerge.vxm v8, v9, a0, v0
570; RV32D-NEXT:    ret
571;
572; RV64D-LABEL: ctlz_nxv1i16:
573; RV64D:       # %bb.0:
574; RV64D-NEXT:    vsetvli a0, zero, e16, mf4, ta, mu
575; RV64D-NEXT:    vfwcvt.f.xu.v v9, v8
576; RV64D-NEXT:    vsetvli zero, zero, e32, mf2, ta, mu
577; RV64D-NEXT:    vsrl.vi v9, v9, 23
578; RV64D-NEXT:    vsetvli zero, zero, e16, mf4, ta, mu
579; RV64D-NEXT:    vnsrl.wi v9, v9, 0
580; RV64D-NEXT:    li a0, 142
581; RV64D-NEXT:    vrsub.vx v9, v9, a0
582; RV64D-NEXT:    vmseq.vi v0, v8, 0
583; RV64D-NEXT:    li a0, 16
584; RV64D-NEXT:    vmerge.vxm v8, v9, a0, v0
585; RV64D-NEXT:    ret
586  %a = call <vscale x 1 x i16> @llvm.ctlz.nxv1i16(<vscale x 1 x i16> %va, i1 false)
587  ret <vscale x 1 x i16> %a
588}
589declare <vscale x 1 x i16> @llvm.ctlz.nxv1i16(<vscale x 1 x i16>, i1)
590
591define <vscale x 2 x i16> @ctlz_nxv2i16(<vscale x 2 x i16> %va) {
592; RV32I-LABEL: ctlz_nxv2i16:
593; RV32I:       # %bb.0:
594; RV32I-NEXT:    vsetvli a0, zero, e16, mf2, ta, mu
595; RV32I-NEXT:    vsrl.vi v9, v8, 1
596; RV32I-NEXT:    vor.vv v8, v8, v9
597; RV32I-NEXT:    vsrl.vi v9, v8, 2
598; RV32I-NEXT:    vor.vv v8, v8, v9
599; RV32I-NEXT:    vsrl.vi v9, v8, 4
600; RV32I-NEXT:    vor.vv v8, v8, v9
601; RV32I-NEXT:    vsrl.vi v9, v8, 8
602; RV32I-NEXT:    vor.vv v8, v8, v9
603; RV32I-NEXT:    vxor.vi v8, v8, -1
604; RV32I-NEXT:    vsrl.vi v9, v8, 1
605; RV32I-NEXT:    lui a0, 5
606; RV32I-NEXT:    addi a0, a0, 1365
607; RV32I-NEXT:    vand.vx v9, v9, a0
608; RV32I-NEXT:    vsub.vv v8, v8, v9
609; RV32I-NEXT:    lui a0, 3
610; RV32I-NEXT:    addi a0, a0, 819
611; RV32I-NEXT:    vand.vx v9, v8, a0
612; RV32I-NEXT:    vsrl.vi v8, v8, 2
613; RV32I-NEXT:    vand.vx v8, v8, a0
614; RV32I-NEXT:    vadd.vv v8, v9, v8
615; RV32I-NEXT:    vsrl.vi v9, v8, 4
616; RV32I-NEXT:    vadd.vv v8, v8, v9
617; RV32I-NEXT:    lui a0, 1
618; RV32I-NEXT:    addi a0, a0, -241
619; RV32I-NEXT:    vand.vx v8, v8, a0
620; RV32I-NEXT:    li a0, 257
621; RV32I-NEXT:    vmul.vx v8, v8, a0
622; RV32I-NEXT:    vsrl.vi v8, v8, 8
623; RV32I-NEXT:    ret
624;
625; RV64I-LABEL: ctlz_nxv2i16:
626; RV64I:       # %bb.0:
627; RV64I-NEXT:    vsetvli a0, zero, e16, mf2, ta, mu
628; RV64I-NEXT:    vsrl.vi v9, v8, 1
629; RV64I-NEXT:    vor.vv v8, v8, v9
630; RV64I-NEXT:    vsrl.vi v9, v8, 2
631; RV64I-NEXT:    vor.vv v8, v8, v9
632; RV64I-NEXT:    vsrl.vi v9, v8, 4
633; RV64I-NEXT:    vor.vv v8, v8, v9
634; RV64I-NEXT:    vsrl.vi v9, v8, 8
635; RV64I-NEXT:    vor.vv v8, v8, v9
636; RV64I-NEXT:    vxor.vi v8, v8, -1
637; RV64I-NEXT:    vsrl.vi v9, v8, 1
638; RV64I-NEXT:    lui a0, 5
639; RV64I-NEXT:    addiw a0, a0, 1365
640; RV64I-NEXT:    vand.vx v9, v9, a0
641; RV64I-NEXT:    vsub.vv v8, v8, v9
642; RV64I-NEXT:    lui a0, 3
643; RV64I-NEXT:    addiw a0, a0, 819
644; RV64I-NEXT:    vand.vx v9, v8, a0
645; RV64I-NEXT:    vsrl.vi v8, v8, 2
646; RV64I-NEXT:    vand.vx v8, v8, a0
647; RV64I-NEXT:    vadd.vv v8, v9, v8
648; RV64I-NEXT:    vsrl.vi v9, v8, 4
649; RV64I-NEXT:    vadd.vv v8, v8, v9
650; RV64I-NEXT:    lui a0, 1
651; RV64I-NEXT:    addiw a0, a0, -241
652; RV64I-NEXT:    vand.vx v8, v8, a0
653; RV64I-NEXT:    li a0, 257
654; RV64I-NEXT:    vmul.vx v8, v8, a0
655; RV64I-NEXT:    vsrl.vi v8, v8, 8
656; RV64I-NEXT:    ret
657;
658; RV32D-LABEL: ctlz_nxv2i16:
659; RV32D:       # %bb.0:
660; RV32D-NEXT:    vsetvli a0, zero, e16, mf2, ta, mu
661; RV32D-NEXT:    vfwcvt.f.xu.v v9, v8
662; RV32D-NEXT:    vsetvli zero, zero, e32, m1, ta, mu
663; RV32D-NEXT:    vsrl.vi v9, v9, 23
664; RV32D-NEXT:    vsetvli zero, zero, e16, mf2, ta, mu
665; RV32D-NEXT:    vnsrl.wi v9, v9, 0
666; RV32D-NEXT:    li a0, 142
667; RV32D-NEXT:    vrsub.vx v9, v9, a0
668; RV32D-NEXT:    vmseq.vi v0, v8, 0
669; RV32D-NEXT:    li a0, 16
670; RV32D-NEXT:    vmerge.vxm v8, v9, a0, v0
671; RV32D-NEXT:    ret
672;
673; RV64D-LABEL: ctlz_nxv2i16:
674; RV64D:       # %bb.0:
675; RV64D-NEXT:    vsetvli a0, zero, e16, mf2, ta, mu
676; RV64D-NEXT:    vfwcvt.f.xu.v v9, v8
677; RV64D-NEXT:    vsetvli zero, zero, e32, m1, ta, mu
678; RV64D-NEXT:    vsrl.vi v9, v9, 23
679; RV64D-NEXT:    vsetvli zero, zero, e16, mf2, ta, mu
680; RV64D-NEXT:    vnsrl.wi v9, v9, 0
681; RV64D-NEXT:    li a0, 142
682; RV64D-NEXT:    vrsub.vx v9, v9, a0
683; RV64D-NEXT:    vmseq.vi v0, v8, 0
684; RV64D-NEXT:    li a0, 16
685; RV64D-NEXT:    vmerge.vxm v8, v9, a0, v0
686; RV64D-NEXT:    ret
687  %a = call <vscale x 2 x i16> @llvm.ctlz.nxv2i16(<vscale x 2 x i16> %va, i1 false)
688  ret <vscale x 2 x i16> %a
689}
690declare <vscale x 2 x i16> @llvm.ctlz.nxv2i16(<vscale x 2 x i16>, i1)
691
692define <vscale x 4 x i16> @ctlz_nxv4i16(<vscale x 4 x i16> %va) {
693; RV32I-LABEL: ctlz_nxv4i16:
694; RV32I:       # %bb.0:
695; RV32I-NEXT:    vsetvli a0, zero, e16, m1, ta, mu
696; RV32I-NEXT:    vsrl.vi v9, v8, 1
697; RV32I-NEXT:    vor.vv v8, v8, v9
698; RV32I-NEXT:    vsrl.vi v9, v8, 2
699; RV32I-NEXT:    vor.vv v8, v8, v9
700; RV32I-NEXT:    vsrl.vi v9, v8, 4
701; RV32I-NEXT:    vor.vv v8, v8, v9
702; RV32I-NEXT:    vsrl.vi v9, v8, 8
703; RV32I-NEXT:    vor.vv v8, v8, v9
704; RV32I-NEXT:    vxor.vi v8, v8, -1
705; RV32I-NEXT:    vsrl.vi v9, v8, 1
706; RV32I-NEXT:    lui a0, 5
707; RV32I-NEXT:    addi a0, a0, 1365
708; RV32I-NEXT:    vand.vx v9, v9, a0
709; RV32I-NEXT:    vsub.vv v8, v8, v9
710; RV32I-NEXT:    lui a0, 3
711; RV32I-NEXT:    addi a0, a0, 819
712; RV32I-NEXT:    vand.vx v9, v8, a0
713; RV32I-NEXT:    vsrl.vi v8, v8, 2
714; RV32I-NEXT:    vand.vx v8, v8, a0
715; RV32I-NEXT:    vadd.vv v8, v9, v8
716; RV32I-NEXT:    vsrl.vi v9, v8, 4
717; RV32I-NEXT:    vadd.vv v8, v8, v9
718; RV32I-NEXT:    lui a0, 1
719; RV32I-NEXT:    addi a0, a0, -241
720; RV32I-NEXT:    vand.vx v8, v8, a0
721; RV32I-NEXT:    li a0, 257
722; RV32I-NEXT:    vmul.vx v8, v8, a0
723; RV32I-NEXT:    vsrl.vi v8, v8, 8
724; RV32I-NEXT:    ret
725;
726; RV64I-LABEL: ctlz_nxv4i16:
727; RV64I:       # %bb.0:
728; RV64I-NEXT:    vsetvli a0, zero, e16, m1, ta, mu
729; RV64I-NEXT:    vsrl.vi v9, v8, 1
730; RV64I-NEXT:    vor.vv v8, v8, v9
731; RV64I-NEXT:    vsrl.vi v9, v8, 2
732; RV64I-NEXT:    vor.vv v8, v8, v9
733; RV64I-NEXT:    vsrl.vi v9, v8, 4
734; RV64I-NEXT:    vor.vv v8, v8, v9
735; RV64I-NEXT:    vsrl.vi v9, v8, 8
736; RV64I-NEXT:    vor.vv v8, v8, v9
737; RV64I-NEXT:    vxor.vi v8, v8, -1
738; RV64I-NEXT:    vsrl.vi v9, v8, 1
739; RV64I-NEXT:    lui a0, 5
740; RV64I-NEXT:    addiw a0, a0, 1365
741; RV64I-NEXT:    vand.vx v9, v9, a0
742; RV64I-NEXT:    vsub.vv v8, v8, v9
743; RV64I-NEXT:    lui a0, 3
744; RV64I-NEXT:    addiw a0, a0, 819
745; RV64I-NEXT:    vand.vx v9, v8, a0
746; RV64I-NEXT:    vsrl.vi v8, v8, 2
747; RV64I-NEXT:    vand.vx v8, v8, a0
748; RV64I-NEXT:    vadd.vv v8, v9, v8
749; RV64I-NEXT:    vsrl.vi v9, v8, 4
750; RV64I-NEXT:    vadd.vv v8, v8, v9
751; RV64I-NEXT:    lui a0, 1
752; RV64I-NEXT:    addiw a0, a0, -241
753; RV64I-NEXT:    vand.vx v8, v8, a0
754; RV64I-NEXT:    li a0, 257
755; RV64I-NEXT:    vmul.vx v8, v8, a0
756; RV64I-NEXT:    vsrl.vi v8, v8, 8
757; RV64I-NEXT:    ret
758;
759; RV32D-LABEL: ctlz_nxv4i16:
760; RV32D:       # %bb.0:
761; RV32D-NEXT:    vsetvli a0, zero, e16, m1, ta, mu
762; RV32D-NEXT:    vfwcvt.f.xu.v v10, v8
763; RV32D-NEXT:    vsetvli zero, zero, e32, m2, ta, mu
764; RV32D-NEXT:    vsrl.vi v10, v10, 23
765; RV32D-NEXT:    vsetvli zero, zero, e16, m1, ta, mu
766; RV32D-NEXT:    vnsrl.wi v9, v10, 0
767; RV32D-NEXT:    li a0, 142
768; RV32D-NEXT:    vrsub.vx v9, v9, a0
769; RV32D-NEXT:    vmseq.vi v0, v8, 0
770; RV32D-NEXT:    li a0, 16
771; RV32D-NEXT:    vmerge.vxm v8, v9, a0, v0
772; RV32D-NEXT:    ret
773;
774; RV64D-LABEL: ctlz_nxv4i16:
775; RV64D:       # %bb.0:
776; RV64D-NEXT:    vsetvli a0, zero, e16, m1, ta, mu
777; RV64D-NEXT:    vfwcvt.f.xu.v v10, v8
778; RV64D-NEXT:    vsetvli zero, zero, e32, m2, ta, mu
779; RV64D-NEXT:    vsrl.vi v10, v10, 23
780; RV64D-NEXT:    vsetvli zero, zero, e16, m1, ta, mu
781; RV64D-NEXT:    vnsrl.wi v9, v10, 0
782; RV64D-NEXT:    li a0, 142
783; RV64D-NEXT:    vrsub.vx v9, v9, a0
784; RV64D-NEXT:    vmseq.vi v0, v8, 0
785; RV64D-NEXT:    li a0, 16
786; RV64D-NEXT:    vmerge.vxm v8, v9, a0, v0
787; RV64D-NEXT:    ret
788  %a = call <vscale x 4 x i16> @llvm.ctlz.nxv4i16(<vscale x 4 x i16> %va, i1 false)
789  ret <vscale x 4 x i16> %a
790}
791declare <vscale x 4 x i16> @llvm.ctlz.nxv4i16(<vscale x 4 x i16>, i1)
792
793define <vscale x 8 x i16> @ctlz_nxv8i16(<vscale x 8 x i16> %va) {
794; RV32I-LABEL: ctlz_nxv8i16:
795; RV32I:       # %bb.0:
796; RV32I-NEXT:    vsetvli a0, zero, e16, m2, ta, mu
797; RV32I-NEXT:    vsrl.vi v10, v8, 1
798; RV32I-NEXT:    vor.vv v8, v8, v10
799; RV32I-NEXT:    vsrl.vi v10, v8, 2
800; RV32I-NEXT:    vor.vv v8, v8, v10
801; RV32I-NEXT:    vsrl.vi v10, v8, 4
802; RV32I-NEXT:    vor.vv v8, v8, v10
803; RV32I-NEXT:    vsrl.vi v10, v8, 8
804; RV32I-NEXT:    vor.vv v8, v8, v10
805; RV32I-NEXT:    vxor.vi v8, v8, -1
806; RV32I-NEXT:    vsrl.vi v10, v8, 1
807; RV32I-NEXT:    lui a0, 5
808; RV32I-NEXT:    addi a0, a0, 1365
809; RV32I-NEXT:    vand.vx v10, v10, a0
810; RV32I-NEXT:    vsub.vv v8, v8, v10
811; RV32I-NEXT:    lui a0, 3
812; RV32I-NEXT:    addi a0, a0, 819
813; RV32I-NEXT:    vand.vx v10, v8, a0
814; RV32I-NEXT:    vsrl.vi v8, v8, 2
815; RV32I-NEXT:    vand.vx v8, v8, a0
816; RV32I-NEXT:    vadd.vv v8, v10, v8
817; RV32I-NEXT:    vsrl.vi v10, v8, 4
818; RV32I-NEXT:    vadd.vv v8, v8, v10
819; RV32I-NEXT:    lui a0, 1
820; RV32I-NEXT:    addi a0, a0, -241
821; RV32I-NEXT:    vand.vx v8, v8, a0
822; RV32I-NEXT:    li a0, 257
823; RV32I-NEXT:    vmul.vx v8, v8, a0
824; RV32I-NEXT:    vsrl.vi v8, v8, 8
825; RV32I-NEXT:    ret
826;
827; RV64I-LABEL: ctlz_nxv8i16:
828; RV64I:       # %bb.0:
829; RV64I-NEXT:    vsetvli a0, zero, e16, m2, ta, mu
830; RV64I-NEXT:    vsrl.vi v10, v8, 1
831; RV64I-NEXT:    vor.vv v8, v8, v10
832; RV64I-NEXT:    vsrl.vi v10, v8, 2
833; RV64I-NEXT:    vor.vv v8, v8, v10
834; RV64I-NEXT:    vsrl.vi v10, v8, 4
835; RV64I-NEXT:    vor.vv v8, v8, v10
836; RV64I-NEXT:    vsrl.vi v10, v8, 8
837; RV64I-NEXT:    vor.vv v8, v8, v10
838; RV64I-NEXT:    vxor.vi v8, v8, -1
839; RV64I-NEXT:    vsrl.vi v10, v8, 1
840; RV64I-NEXT:    lui a0, 5
841; RV64I-NEXT:    addiw a0, a0, 1365
842; RV64I-NEXT:    vand.vx v10, v10, a0
843; RV64I-NEXT:    vsub.vv v8, v8, v10
844; RV64I-NEXT:    lui a0, 3
845; RV64I-NEXT:    addiw a0, a0, 819
846; RV64I-NEXT:    vand.vx v10, v8, a0
847; RV64I-NEXT:    vsrl.vi v8, v8, 2
848; RV64I-NEXT:    vand.vx v8, v8, a0
849; RV64I-NEXT:    vadd.vv v8, v10, v8
850; RV64I-NEXT:    vsrl.vi v10, v8, 4
851; RV64I-NEXT:    vadd.vv v8, v8, v10
852; RV64I-NEXT:    lui a0, 1
853; RV64I-NEXT:    addiw a0, a0, -241
854; RV64I-NEXT:    vand.vx v8, v8, a0
855; RV64I-NEXT:    li a0, 257
856; RV64I-NEXT:    vmul.vx v8, v8, a0
857; RV64I-NEXT:    vsrl.vi v8, v8, 8
858; RV64I-NEXT:    ret
859;
860; RV32D-LABEL: ctlz_nxv8i16:
861; RV32D:       # %bb.0:
862; RV32D-NEXT:    vsetvli a0, zero, e16, m2, ta, mu
863; RV32D-NEXT:    vfwcvt.f.xu.v v12, v8
864; RV32D-NEXT:    vsetvli zero, zero, e32, m4, ta, mu
865; RV32D-NEXT:    vsrl.vi v12, v12, 23
866; RV32D-NEXT:    vsetvli zero, zero, e16, m2, ta, mu
867; RV32D-NEXT:    vnsrl.wi v10, v12, 0
868; RV32D-NEXT:    li a0, 142
869; RV32D-NEXT:    vrsub.vx v10, v10, a0
870; RV32D-NEXT:    vmseq.vi v0, v8, 0
871; RV32D-NEXT:    li a0, 16
872; RV32D-NEXT:    vmerge.vxm v8, v10, a0, v0
873; RV32D-NEXT:    ret
874;
875; RV64D-LABEL: ctlz_nxv8i16:
876; RV64D:       # %bb.0:
877; RV64D-NEXT:    vsetvli a0, zero, e16, m2, ta, mu
878; RV64D-NEXT:    vfwcvt.f.xu.v v12, v8
879; RV64D-NEXT:    vsetvli zero, zero, e32, m4, ta, mu
880; RV64D-NEXT:    vsrl.vi v12, v12, 23
881; RV64D-NEXT:    vsetvli zero, zero, e16, m2, ta, mu
882; RV64D-NEXT:    vnsrl.wi v10, v12, 0
883; RV64D-NEXT:    li a0, 142
884; RV64D-NEXT:    vrsub.vx v10, v10, a0
885; RV64D-NEXT:    vmseq.vi v0, v8, 0
886; RV64D-NEXT:    li a0, 16
887; RV64D-NEXT:    vmerge.vxm v8, v10, a0, v0
888; RV64D-NEXT:    ret
889  %a = call <vscale x 8 x i16> @llvm.ctlz.nxv8i16(<vscale x 8 x i16> %va, i1 false)
890  ret <vscale x 8 x i16> %a
891}
892declare <vscale x 8 x i16> @llvm.ctlz.nxv8i16(<vscale x 8 x i16>, i1)
893
894define <vscale x 16 x i16> @ctlz_nxv16i16(<vscale x 16 x i16> %va) {
895; RV32I-LABEL: ctlz_nxv16i16:
896; RV32I:       # %bb.0:
897; RV32I-NEXT:    vsetvli a0, zero, e16, m4, ta, mu
898; RV32I-NEXT:    vsrl.vi v12, v8, 1
899; RV32I-NEXT:    vor.vv v8, v8, v12
900; RV32I-NEXT:    vsrl.vi v12, v8, 2
901; RV32I-NEXT:    vor.vv v8, v8, v12
902; RV32I-NEXT:    vsrl.vi v12, v8, 4
903; RV32I-NEXT:    vor.vv v8, v8, v12
904; RV32I-NEXT:    vsrl.vi v12, v8, 8
905; RV32I-NEXT:    vor.vv v8, v8, v12
906; RV32I-NEXT:    vxor.vi v8, v8, -1
907; RV32I-NEXT:    vsrl.vi v12, v8, 1
908; RV32I-NEXT:    lui a0, 5
909; RV32I-NEXT:    addi a0, a0, 1365
910; RV32I-NEXT:    vand.vx v12, v12, a0
911; RV32I-NEXT:    vsub.vv v8, v8, v12
912; RV32I-NEXT:    lui a0, 3
913; RV32I-NEXT:    addi a0, a0, 819
914; RV32I-NEXT:    vand.vx v12, v8, a0
915; RV32I-NEXT:    vsrl.vi v8, v8, 2
916; RV32I-NEXT:    vand.vx v8, v8, a0
917; RV32I-NEXT:    vadd.vv v8, v12, v8
918; RV32I-NEXT:    vsrl.vi v12, v8, 4
919; RV32I-NEXT:    vadd.vv v8, v8, v12
920; RV32I-NEXT:    lui a0, 1
921; RV32I-NEXT:    addi a0, a0, -241
922; RV32I-NEXT:    vand.vx v8, v8, a0
923; RV32I-NEXT:    li a0, 257
924; RV32I-NEXT:    vmul.vx v8, v8, a0
925; RV32I-NEXT:    vsrl.vi v8, v8, 8
926; RV32I-NEXT:    ret
927;
928; RV64I-LABEL: ctlz_nxv16i16:
929; RV64I:       # %bb.0:
930; RV64I-NEXT:    vsetvli a0, zero, e16, m4, ta, mu
931; RV64I-NEXT:    vsrl.vi v12, v8, 1
932; RV64I-NEXT:    vor.vv v8, v8, v12
933; RV64I-NEXT:    vsrl.vi v12, v8, 2
934; RV64I-NEXT:    vor.vv v8, v8, v12
935; RV64I-NEXT:    vsrl.vi v12, v8, 4
936; RV64I-NEXT:    vor.vv v8, v8, v12
937; RV64I-NEXT:    vsrl.vi v12, v8, 8
938; RV64I-NEXT:    vor.vv v8, v8, v12
939; RV64I-NEXT:    vxor.vi v8, v8, -1
940; RV64I-NEXT:    vsrl.vi v12, v8, 1
941; RV64I-NEXT:    lui a0, 5
942; RV64I-NEXT:    addiw a0, a0, 1365
943; RV64I-NEXT:    vand.vx v12, v12, a0
944; RV64I-NEXT:    vsub.vv v8, v8, v12
945; RV64I-NEXT:    lui a0, 3
946; RV64I-NEXT:    addiw a0, a0, 819
947; RV64I-NEXT:    vand.vx v12, v8, a0
948; RV64I-NEXT:    vsrl.vi v8, v8, 2
949; RV64I-NEXT:    vand.vx v8, v8, a0
950; RV64I-NEXT:    vadd.vv v8, v12, v8
951; RV64I-NEXT:    vsrl.vi v12, v8, 4
952; RV64I-NEXT:    vadd.vv v8, v8, v12
953; RV64I-NEXT:    lui a0, 1
954; RV64I-NEXT:    addiw a0, a0, -241
955; RV64I-NEXT:    vand.vx v8, v8, a0
956; RV64I-NEXT:    li a0, 257
957; RV64I-NEXT:    vmul.vx v8, v8, a0
958; RV64I-NEXT:    vsrl.vi v8, v8, 8
959; RV64I-NEXT:    ret
960;
961; RV32D-LABEL: ctlz_nxv16i16:
962; RV32D:       # %bb.0:
963; RV32D-NEXT:    vsetvli a0, zero, e16, m4, ta, mu
964; RV32D-NEXT:    vfwcvt.f.xu.v v16, v8
965; RV32D-NEXT:    vsetvli zero, zero, e32, m8, ta, mu
966; RV32D-NEXT:    vsrl.vi v16, v16, 23
967; RV32D-NEXT:    vsetvli zero, zero, e16, m4, ta, mu
968; RV32D-NEXT:    vnsrl.wi v12, v16, 0
969; RV32D-NEXT:    li a0, 142
970; RV32D-NEXT:    vrsub.vx v12, v12, a0
971; RV32D-NEXT:    vmseq.vi v0, v8, 0
972; RV32D-NEXT:    li a0, 16
973; RV32D-NEXT:    vmerge.vxm v8, v12, a0, v0
974; RV32D-NEXT:    ret
975;
976; RV64D-LABEL: ctlz_nxv16i16:
977; RV64D:       # %bb.0:
978; RV64D-NEXT:    vsetvli a0, zero, e16, m4, ta, mu
979; RV64D-NEXT:    vfwcvt.f.xu.v v16, v8
980; RV64D-NEXT:    vsetvli zero, zero, e32, m8, ta, mu
981; RV64D-NEXT:    vsrl.vi v16, v16, 23
982; RV64D-NEXT:    vsetvli zero, zero, e16, m4, ta, mu
983; RV64D-NEXT:    vnsrl.wi v12, v16, 0
984; RV64D-NEXT:    li a0, 142
985; RV64D-NEXT:    vrsub.vx v12, v12, a0
986; RV64D-NEXT:    vmseq.vi v0, v8, 0
987; RV64D-NEXT:    li a0, 16
988; RV64D-NEXT:    vmerge.vxm v8, v12, a0, v0
989; RV64D-NEXT:    ret
990  %a = call <vscale x 16 x i16> @llvm.ctlz.nxv16i16(<vscale x 16 x i16> %va, i1 false)
991  ret <vscale x 16 x i16> %a
992}
993declare <vscale x 16 x i16> @llvm.ctlz.nxv16i16(<vscale x 16 x i16>, i1)
994
995define <vscale x 32 x i16> @ctlz_nxv32i16(<vscale x 32 x i16> %va) {
996; RV32-LABEL: ctlz_nxv32i16:
997; RV32:       # %bb.0:
998; RV32-NEXT:    vsetvli a0, zero, e16, m8, ta, mu
999; RV32-NEXT:    vsrl.vi v16, v8, 1
1000; RV32-NEXT:    vor.vv v8, v8, v16
1001; RV32-NEXT:    vsrl.vi v16, v8, 2
1002; RV32-NEXT:    vor.vv v8, v8, v16
1003; RV32-NEXT:    vsrl.vi v16, v8, 4
1004; RV32-NEXT:    vor.vv v8, v8, v16
1005; RV32-NEXT:    vsrl.vi v16, v8, 8
1006; RV32-NEXT:    vor.vv v8, v8, v16
1007; RV32-NEXT:    vxor.vi v8, v8, -1
1008; RV32-NEXT:    vsrl.vi v16, v8, 1
1009; RV32-NEXT:    lui a0, 5
1010; RV32-NEXT:    addi a0, a0, 1365
1011; RV32-NEXT:    vand.vx v16, v16, a0
1012; RV32-NEXT:    vsub.vv v8, v8, v16
1013; RV32-NEXT:    lui a0, 3
1014; RV32-NEXT:    addi a0, a0, 819
1015; RV32-NEXT:    vand.vx v16, v8, a0
1016; RV32-NEXT:    vsrl.vi v8, v8, 2
1017; RV32-NEXT:    vand.vx v8, v8, a0
1018; RV32-NEXT:    vadd.vv v8, v16, v8
1019; RV32-NEXT:    vsrl.vi v16, v8, 4
1020; RV32-NEXT:    vadd.vv v8, v8, v16
1021; RV32-NEXT:    lui a0, 1
1022; RV32-NEXT:    addi a0, a0, -241
1023; RV32-NEXT:    vand.vx v8, v8, a0
1024; RV32-NEXT:    li a0, 257
1025; RV32-NEXT:    vmul.vx v8, v8, a0
1026; RV32-NEXT:    vsrl.vi v8, v8, 8
1027; RV32-NEXT:    ret
1028;
1029; RV64-LABEL: ctlz_nxv32i16:
1030; RV64:       # %bb.0:
1031; RV64-NEXT:    vsetvli a0, zero, e16, m8, ta, mu
1032; RV64-NEXT:    vsrl.vi v16, v8, 1
1033; RV64-NEXT:    vor.vv v8, v8, v16
1034; RV64-NEXT:    vsrl.vi v16, v8, 2
1035; RV64-NEXT:    vor.vv v8, v8, v16
1036; RV64-NEXT:    vsrl.vi v16, v8, 4
1037; RV64-NEXT:    vor.vv v8, v8, v16
1038; RV64-NEXT:    vsrl.vi v16, v8, 8
1039; RV64-NEXT:    vor.vv v8, v8, v16
1040; RV64-NEXT:    vxor.vi v8, v8, -1
1041; RV64-NEXT:    vsrl.vi v16, v8, 1
1042; RV64-NEXT:    lui a0, 5
1043; RV64-NEXT:    addiw a0, a0, 1365
1044; RV64-NEXT:    vand.vx v16, v16, a0
1045; RV64-NEXT:    vsub.vv v8, v8, v16
1046; RV64-NEXT:    lui a0, 3
1047; RV64-NEXT:    addiw a0, a0, 819
1048; RV64-NEXT:    vand.vx v16, v8, a0
1049; RV64-NEXT:    vsrl.vi v8, v8, 2
1050; RV64-NEXT:    vand.vx v8, v8, a0
1051; RV64-NEXT:    vadd.vv v8, v16, v8
1052; RV64-NEXT:    vsrl.vi v16, v8, 4
1053; RV64-NEXT:    vadd.vv v8, v8, v16
1054; RV64-NEXT:    lui a0, 1
1055; RV64-NEXT:    addiw a0, a0, -241
1056; RV64-NEXT:    vand.vx v8, v8, a0
1057; RV64-NEXT:    li a0, 257
1058; RV64-NEXT:    vmul.vx v8, v8, a0
1059; RV64-NEXT:    vsrl.vi v8, v8, 8
1060; RV64-NEXT:    ret
1061  %a = call <vscale x 32 x i16> @llvm.ctlz.nxv32i16(<vscale x 32 x i16> %va, i1 false)
1062  ret <vscale x 32 x i16> %a
1063}
1064declare <vscale x 32 x i16> @llvm.ctlz.nxv32i16(<vscale x 32 x i16>, i1)
1065
1066define <vscale x 1 x i32> @ctlz_nxv1i32(<vscale x 1 x i32> %va) {
1067; RV32I-LABEL: ctlz_nxv1i32:
1068; RV32I:       # %bb.0:
1069; RV32I-NEXT:    vsetvli a0, zero, e32, mf2, ta, mu
1070; RV32I-NEXT:    vsrl.vi v9, v8, 1
1071; RV32I-NEXT:    vor.vv v8, v8, v9
1072; RV32I-NEXT:    vsrl.vi v9, v8, 2
1073; RV32I-NEXT:    vor.vv v8, v8, v9
1074; RV32I-NEXT:    vsrl.vi v9, v8, 4
1075; RV32I-NEXT:    vor.vv v8, v8, v9
1076; RV32I-NEXT:    vsrl.vi v9, v8, 8
1077; RV32I-NEXT:    vor.vv v8, v8, v9
1078; RV32I-NEXT:    vsrl.vi v9, v8, 16
1079; RV32I-NEXT:    vor.vv v8, v8, v9
1080; RV32I-NEXT:    vxor.vi v8, v8, -1
1081; RV32I-NEXT:    vsrl.vi v9, v8, 1
1082; RV32I-NEXT:    lui a0, 349525
1083; RV32I-NEXT:    addi a0, a0, 1365
1084; RV32I-NEXT:    vand.vx v9, v9, a0
1085; RV32I-NEXT:    vsub.vv v8, v8, v9
1086; RV32I-NEXT:    lui a0, 209715
1087; RV32I-NEXT:    addi a0, a0, 819
1088; RV32I-NEXT:    vand.vx v9, v8, a0
1089; RV32I-NEXT:    vsrl.vi v8, v8, 2
1090; RV32I-NEXT:    vand.vx v8, v8, a0
1091; RV32I-NEXT:    vadd.vv v8, v9, v8
1092; RV32I-NEXT:    vsrl.vi v9, v8, 4
1093; RV32I-NEXT:    vadd.vv v8, v8, v9
1094; RV32I-NEXT:    lui a0, 61681
1095; RV32I-NEXT:    addi a0, a0, -241
1096; RV32I-NEXT:    vand.vx v8, v8, a0
1097; RV32I-NEXT:    lui a0, 4112
1098; RV32I-NEXT:    addi a0, a0, 257
1099; RV32I-NEXT:    vmul.vx v8, v8, a0
1100; RV32I-NEXT:    vsrl.vi v8, v8, 24
1101; RV32I-NEXT:    ret
1102;
1103; RV64I-LABEL: ctlz_nxv1i32:
1104; RV64I:       # %bb.0:
1105; RV64I-NEXT:    vsetvli a0, zero, e32, mf2, ta, mu
1106; RV64I-NEXT:    vsrl.vi v9, v8, 1
1107; RV64I-NEXT:    vor.vv v8, v8, v9
1108; RV64I-NEXT:    vsrl.vi v9, v8, 2
1109; RV64I-NEXT:    vor.vv v8, v8, v9
1110; RV64I-NEXT:    vsrl.vi v9, v8, 4
1111; RV64I-NEXT:    vor.vv v8, v8, v9
1112; RV64I-NEXT:    vsrl.vi v9, v8, 8
1113; RV64I-NEXT:    vor.vv v8, v8, v9
1114; RV64I-NEXT:    vsrl.vi v9, v8, 16
1115; RV64I-NEXT:    vor.vv v8, v8, v9
1116; RV64I-NEXT:    vxor.vi v8, v8, -1
1117; RV64I-NEXT:    vsrl.vi v9, v8, 1
1118; RV64I-NEXT:    lui a0, 349525
1119; RV64I-NEXT:    addiw a0, a0, 1365
1120; RV64I-NEXT:    vand.vx v9, v9, a0
1121; RV64I-NEXT:    vsub.vv v8, v8, v9
1122; RV64I-NEXT:    lui a0, 209715
1123; RV64I-NEXT:    addiw a0, a0, 819
1124; RV64I-NEXT:    vand.vx v9, v8, a0
1125; RV64I-NEXT:    vsrl.vi v8, v8, 2
1126; RV64I-NEXT:    vand.vx v8, v8, a0
1127; RV64I-NEXT:    vadd.vv v8, v9, v8
1128; RV64I-NEXT:    vsrl.vi v9, v8, 4
1129; RV64I-NEXT:    vadd.vv v8, v8, v9
1130; RV64I-NEXT:    lui a0, 61681
1131; RV64I-NEXT:    addiw a0, a0, -241
1132; RV64I-NEXT:    vand.vx v8, v8, a0
1133; RV64I-NEXT:    lui a0, 4112
1134; RV64I-NEXT:    addiw a0, a0, 257
1135; RV64I-NEXT:    vmul.vx v8, v8, a0
1136; RV64I-NEXT:    vsrl.vi v8, v8, 24
1137; RV64I-NEXT:    ret
1138;
1139; RV32D-LABEL: ctlz_nxv1i32:
1140; RV32D:       # %bb.0:
1141; RV32D-NEXT:    vsetvli a0, zero, e32, mf2, ta, mu
1142; RV32D-NEXT:    vfwcvt.f.xu.v v9, v8
1143; RV32D-NEXT:    li a0, 52
1144; RV32D-NEXT:    vsetvli zero, zero, e64, m1, ta, mu
1145; RV32D-NEXT:    vsrl.vx v9, v9, a0
1146; RV32D-NEXT:    vsetvli zero, zero, e32, mf2, ta, mu
1147; RV32D-NEXT:    vnsrl.wi v9, v9, 0
1148; RV32D-NEXT:    li a0, 1054
1149; RV32D-NEXT:    vrsub.vx v9, v9, a0
1150; RV32D-NEXT:    vmseq.vi v0, v8, 0
1151; RV32D-NEXT:    li a0, 32
1152; RV32D-NEXT:    vmerge.vxm v8, v9, a0, v0
1153; RV32D-NEXT:    ret
1154;
1155; RV64D-LABEL: ctlz_nxv1i32:
1156; RV64D:       # %bb.0:
1157; RV64D-NEXT:    vsetvli a0, zero, e32, mf2, ta, mu
1158; RV64D-NEXT:    vfwcvt.f.xu.v v9, v8
1159; RV64D-NEXT:    li a0, 52
1160; RV64D-NEXT:    vsetvli zero, zero, e64, m1, ta, mu
1161; RV64D-NEXT:    vsrl.vx v9, v9, a0
1162; RV64D-NEXT:    vsetvli zero, zero, e32, mf2, ta, mu
1163; RV64D-NEXT:    vnsrl.wi v9, v9, 0
1164; RV64D-NEXT:    li a0, 1054
1165; RV64D-NEXT:    vrsub.vx v9, v9, a0
1166; RV64D-NEXT:    vmseq.vi v0, v8, 0
1167; RV64D-NEXT:    li a0, 32
1168; RV64D-NEXT:    vmerge.vxm v8, v9, a0, v0
1169; RV64D-NEXT:    ret
1170  %a = call <vscale x 1 x i32> @llvm.ctlz.nxv1i32(<vscale x 1 x i32> %va, i1 false)
1171  ret <vscale x 1 x i32> %a
1172}
1173declare <vscale x 1 x i32> @llvm.ctlz.nxv1i32(<vscale x 1 x i32>, i1)
1174
1175define <vscale x 2 x i32> @ctlz_nxv2i32(<vscale x 2 x i32> %va) {
1176; RV32I-LABEL: ctlz_nxv2i32:
1177; RV32I:       # %bb.0:
1178; RV32I-NEXT:    vsetvli a0, zero, e32, m1, ta, mu
1179; RV32I-NEXT:    vsrl.vi v9, v8, 1
1180; RV32I-NEXT:    vor.vv v8, v8, v9
1181; RV32I-NEXT:    vsrl.vi v9, v8, 2
1182; RV32I-NEXT:    vor.vv v8, v8, v9
1183; RV32I-NEXT:    vsrl.vi v9, v8, 4
1184; RV32I-NEXT:    vor.vv v8, v8, v9
1185; RV32I-NEXT:    vsrl.vi v9, v8, 8
1186; RV32I-NEXT:    vor.vv v8, v8, v9
1187; RV32I-NEXT:    vsrl.vi v9, v8, 16
1188; RV32I-NEXT:    vor.vv v8, v8, v9
1189; RV32I-NEXT:    vxor.vi v8, v8, -1
1190; RV32I-NEXT:    vsrl.vi v9, v8, 1
1191; RV32I-NEXT:    lui a0, 349525
1192; RV32I-NEXT:    addi a0, a0, 1365
1193; RV32I-NEXT:    vand.vx v9, v9, a0
1194; RV32I-NEXT:    vsub.vv v8, v8, v9
1195; RV32I-NEXT:    lui a0, 209715
1196; RV32I-NEXT:    addi a0, a0, 819
1197; RV32I-NEXT:    vand.vx v9, v8, a0
1198; RV32I-NEXT:    vsrl.vi v8, v8, 2
1199; RV32I-NEXT:    vand.vx v8, v8, a0
1200; RV32I-NEXT:    vadd.vv v8, v9, v8
1201; RV32I-NEXT:    vsrl.vi v9, v8, 4
1202; RV32I-NEXT:    vadd.vv v8, v8, v9
1203; RV32I-NEXT:    lui a0, 61681
1204; RV32I-NEXT:    addi a0, a0, -241
1205; RV32I-NEXT:    vand.vx v8, v8, a0
1206; RV32I-NEXT:    lui a0, 4112
1207; RV32I-NEXT:    addi a0, a0, 257
1208; RV32I-NEXT:    vmul.vx v8, v8, a0
1209; RV32I-NEXT:    vsrl.vi v8, v8, 24
1210; RV32I-NEXT:    ret
1211;
1212; RV64I-LABEL: ctlz_nxv2i32:
1213; RV64I:       # %bb.0:
1214; RV64I-NEXT:    vsetvli a0, zero, e32, m1, ta, mu
1215; RV64I-NEXT:    vsrl.vi v9, v8, 1
1216; RV64I-NEXT:    vor.vv v8, v8, v9
1217; RV64I-NEXT:    vsrl.vi v9, v8, 2
1218; RV64I-NEXT:    vor.vv v8, v8, v9
1219; RV64I-NEXT:    vsrl.vi v9, v8, 4
1220; RV64I-NEXT:    vor.vv v8, v8, v9
1221; RV64I-NEXT:    vsrl.vi v9, v8, 8
1222; RV64I-NEXT:    vor.vv v8, v8, v9
1223; RV64I-NEXT:    vsrl.vi v9, v8, 16
1224; RV64I-NEXT:    vor.vv v8, v8, v9
1225; RV64I-NEXT:    vxor.vi v8, v8, -1
1226; RV64I-NEXT:    vsrl.vi v9, v8, 1
1227; RV64I-NEXT:    lui a0, 349525
1228; RV64I-NEXT:    addiw a0, a0, 1365
1229; RV64I-NEXT:    vand.vx v9, v9, a0
1230; RV64I-NEXT:    vsub.vv v8, v8, v9
1231; RV64I-NEXT:    lui a0, 209715
1232; RV64I-NEXT:    addiw a0, a0, 819
1233; RV64I-NEXT:    vand.vx v9, v8, a0
1234; RV64I-NEXT:    vsrl.vi v8, v8, 2
1235; RV64I-NEXT:    vand.vx v8, v8, a0
1236; RV64I-NEXT:    vadd.vv v8, v9, v8
1237; RV64I-NEXT:    vsrl.vi v9, v8, 4
1238; RV64I-NEXT:    vadd.vv v8, v8, v9
1239; RV64I-NEXT:    lui a0, 61681
1240; RV64I-NEXT:    addiw a0, a0, -241
1241; RV64I-NEXT:    vand.vx v8, v8, a0
1242; RV64I-NEXT:    lui a0, 4112
1243; RV64I-NEXT:    addiw a0, a0, 257
1244; RV64I-NEXT:    vmul.vx v8, v8, a0
1245; RV64I-NEXT:    vsrl.vi v8, v8, 24
1246; RV64I-NEXT:    ret
1247;
1248; RV32D-LABEL: ctlz_nxv2i32:
1249; RV32D:       # %bb.0:
1250; RV32D-NEXT:    vsetvli a0, zero, e32, m1, ta, mu
1251; RV32D-NEXT:    vfwcvt.f.xu.v v10, v8
1252; RV32D-NEXT:    li a0, 52
1253; RV32D-NEXT:    vsetvli zero, zero, e64, m2, ta, mu
1254; RV32D-NEXT:    vsrl.vx v10, v10, a0
1255; RV32D-NEXT:    vsetvli zero, zero, e32, m1, ta, mu
1256; RV32D-NEXT:    vnsrl.wi v9, v10, 0
1257; RV32D-NEXT:    li a0, 1054
1258; RV32D-NEXT:    vrsub.vx v9, v9, a0
1259; RV32D-NEXT:    vmseq.vi v0, v8, 0
1260; RV32D-NEXT:    li a0, 32
1261; RV32D-NEXT:    vmerge.vxm v8, v9, a0, v0
1262; RV32D-NEXT:    ret
1263;
1264; RV64D-LABEL: ctlz_nxv2i32:
1265; RV64D:       # %bb.0:
1266; RV64D-NEXT:    vsetvli a0, zero, e32, m1, ta, mu
1267; RV64D-NEXT:    vfwcvt.f.xu.v v10, v8
1268; RV64D-NEXT:    li a0, 52
1269; RV64D-NEXT:    vsetvli zero, zero, e64, m2, ta, mu
1270; RV64D-NEXT:    vsrl.vx v10, v10, a0
1271; RV64D-NEXT:    vsetvli zero, zero, e32, m1, ta, mu
1272; RV64D-NEXT:    vnsrl.wi v9, v10, 0
1273; RV64D-NEXT:    li a0, 1054
1274; RV64D-NEXT:    vrsub.vx v9, v9, a0
1275; RV64D-NEXT:    vmseq.vi v0, v8, 0
1276; RV64D-NEXT:    li a0, 32
1277; RV64D-NEXT:    vmerge.vxm v8, v9, a0, v0
1278; RV64D-NEXT:    ret
1279  %a = call <vscale x 2 x i32> @llvm.ctlz.nxv2i32(<vscale x 2 x i32> %va, i1 false)
1280  ret <vscale x 2 x i32> %a
1281}
1282declare <vscale x 2 x i32> @llvm.ctlz.nxv2i32(<vscale x 2 x i32>, i1)
1283
1284define <vscale x 4 x i32> @ctlz_nxv4i32(<vscale x 4 x i32> %va) {
1285; RV32I-LABEL: ctlz_nxv4i32:
1286; RV32I:       # %bb.0:
1287; RV32I-NEXT:    vsetvli a0, zero, e32, m2, ta, mu
1288; RV32I-NEXT:    vsrl.vi v10, v8, 1
1289; RV32I-NEXT:    vor.vv v8, v8, v10
1290; RV32I-NEXT:    vsrl.vi v10, v8, 2
1291; RV32I-NEXT:    vor.vv v8, v8, v10
1292; RV32I-NEXT:    vsrl.vi v10, v8, 4
1293; RV32I-NEXT:    vor.vv v8, v8, v10
1294; RV32I-NEXT:    vsrl.vi v10, v8, 8
1295; RV32I-NEXT:    vor.vv v8, v8, v10
1296; RV32I-NEXT:    vsrl.vi v10, v8, 16
1297; RV32I-NEXT:    vor.vv v8, v8, v10
1298; RV32I-NEXT:    vxor.vi v8, v8, -1
1299; RV32I-NEXT:    vsrl.vi v10, v8, 1
1300; RV32I-NEXT:    lui a0, 349525
1301; RV32I-NEXT:    addi a0, a0, 1365
1302; RV32I-NEXT:    vand.vx v10, v10, a0
1303; RV32I-NEXT:    vsub.vv v8, v8, v10
1304; RV32I-NEXT:    lui a0, 209715
1305; RV32I-NEXT:    addi a0, a0, 819
1306; RV32I-NEXT:    vand.vx v10, v8, a0
1307; RV32I-NEXT:    vsrl.vi v8, v8, 2
1308; RV32I-NEXT:    vand.vx v8, v8, a0
1309; RV32I-NEXT:    vadd.vv v8, v10, v8
1310; RV32I-NEXT:    vsrl.vi v10, v8, 4
1311; RV32I-NEXT:    vadd.vv v8, v8, v10
1312; RV32I-NEXT:    lui a0, 61681
1313; RV32I-NEXT:    addi a0, a0, -241
1314; RV32I-NEXT:    vand.vx v8, v8, a0
1315; RV32I-NEXT:    lui a0, 4112
1316; RV32I-NEXT:    addi a0, a0, 257
1317; RV32I-NEXT:    vmul.vx v8, v8, a0
1318; RV32I-NEXT:    vsrl.vi v8, v8, 24
1319; RV32I-NEXT:    ret
1320;
1321; RV64I-LABEL: ctlz_nxv4i32:
1322; RV64I:       # %bb.0:
1323; RV64I-NEXT:    vsetvli a0, zero, e32, m2, ta, mu
1324; RV64I-NEXT:    vsrl.vi v10, v8, 1
1325; RV64I-NEXT:    vor.vv v8, v8, v10
1326; RV64I-NEXT:    vsrl.vi v10, v8, 2
1327; RV64I-NEXT:    vor.vv v8, v8, v10
1328; RV64I-NEXT:    vsrl.vi v10, v8, 4
1329; RV64I-NEXT:    vor.vv v8, v8, v10
1330; RV64I-NEXT:    vsrl.vi v10, v8, 8
1331; RV64I-NEXT:    vor.vv v8, v8, v10
1332; RV64I-NEXT:    vsrl.vi v10, v8, 16
1333; RV64I-NEXT:    vor.vv v8, v8, v10
1334; RV64I-NEXT:    vxor.vi v8, v8, -1
1335; RV64I-NEXT:    vsrl.vi v10, v8, 1
1336; RV64I-NEXT:    lui a0, 349525
1337; RV64I-NEXT:    addiw a0, a0, 1365
1338; RV64I-NEXT:    vand.vx v10, v10, a0
1339; RV64I-NEXT:    vsub.vv v8, v8, v10
1340; RV64I-NEXT:    lui a0, 209715
1341; RV64I-NEXT:    addiw a0, a0, 819
1342; RV64I-NEXT:    vand.vx v10, v8, a0
1343; RV64I-NEXT:    vsrl.vi v8, v8, 2
1344; RV64I-NEXT:    vand.vx v8, v8, a0
1345; RV64I-NEXT:    vadd.vv v8, v10, v8
1346; RV64I-NEXT:    vsrl.vi v10, v8, 4
1347; RV64I-NEXT:    vadd.vv v8, v8, v10
1348; RV64I-NEXT:    lui a0, 61681
1349; RV64I-NEXT:    addiw a0, a0, -241
1350; RV64I-NEXT:    vand.vx v8, v8, a0
1351; RV64I-NEXT:    lui a0, 4112
1352; RV64I-NEXT:    addiw a0, a0, 257
1353; RV64I-NEXT:    vmul.vx v8, v8, a0
1354; RV64I-NEXT:    vsrl.vi v8, v8, 24
1355; RV64I-NEXT:    ret
1356;
1357; RV32D-LABEL: ctlz_nxv4i32:
1358; RV32D:       # %bb.0:
1359; RV32D-NEXT:    vsetvli a0, zero, e32, m2, ta, mu
1360; RV32D-NEXT:    vfwcvt.f.xu.v v12, v8
1361; RV32D-NEXT:    li a0, 52
1362; RV32D-NEXT:    vsetvli zero, zero, e64, m4, ta, mu
1363; RV32D-NEXT:    vsrl.vx v12, v12, a0
1364; RV32D-NEXT:    vsetvli zero, zero, e32, m2, ta, mu
1365; RV32D-NEXT:    vnsrl.wi v10, v12, 0
1366; RV32D-NEXT:    li a0, 1054
1367; RV32D-NEXT:    vrsub.vx v10, v10, a0
1368; RV32D-NEXT:    vmseq.vi v0, v8, 0
1369; RV32D-NEXT:    li a0, 32
1370; RV32D-NEXT:    vmerge.vxm v8, v10, a0, v0
1371; RV32D-NEXT:    ret
1372;
1373; RV64D-LABEL: ctlz_nxv4i32:
1374; RV64D:       # %bb.0:
1375; RV64D-NEXT:    vsetvli a0, zero, e32, m2, ta, mu
1376; RV64D-NEXT:    vfwcvt.f.xu.v v12, v8
1377; RV64D-NEXT:    li a0, 52
1378; RV64D-NEXT:    vsetvli zero, zero, e64, m4, ta, mu
1379; RV64D-NEXT:    vsrl.vx v12, v12, a0
1380; RV64D-NEXT:    vsetvli zero, zero, e32, m2, ta, mu
1381; RV64D-NEXT:    vnsrl.wi v10, v12, 0
1382; RV64D-NEXT:    li a0, 1054
1383; RV64D-NEXT:    vrsub.vx v10, v10, a0
1384; RV64D-NEXT:    vmseq.vi v0, v8, 0
1385; RV64D-NEXT:    li a0, 32
1386; RV64D-NEXT:    vmerge.vxm v8, v10, a0, v0
1387; RV64D-NEXT:    ret
1388  %a = call <vscale x 4 x i32> @llvm.ctlz.nxv4i32(<vscale x 4 x i32> %va, i1 false)
1389  ret <vscale x 4 x i32> %a
1390}
1391declare <vscale x 4 x i32> @llvm.ctlz.nxv4i32(<vscale x 4 x i32>, i1)
1392
1393define <vscale x 8 x i32> @ctlz_nxv8i32(<vscale x 8 x i32> %va) {
1394; RV32I-LABEL: ctlz_nxv8i32:
1395; RV32I:       # %bb.0:
1396; RV32I-NEXT:    vsetvli a0, zero, e32, m4, ta, mu
1397; RV32I-NEXT:    vsrl.vi v12, v8, 1
1398; RV32I-NEXT:    vor.vv v8, v8, v12
1399; RV32I-NEXT:    vsrl.vi v12, v8, 2
1400; RV32I-NEXT:    vor.vv v8, v8, v12
1401; RV32I-NEXT:    vsrl.vi v12, v8, 4
1402; RV32I-NEXT:    vor.vv v8, v8, v12
1403; RV32I-NEXT:    vsrl.vi v12, v8, 8
1404; RV32I-NEXT:    vor.vv v8, v8, v12
1405; RV32I-NEXT:    vsrl.vi v12, v8, 16
1406; RV32I-NEXT:    vor.vv v8, v8, v12
1407; RV32I-NEXT:    vxor.vi v8, v8, -1
1408; RV32I-NEXT:    vsrl.vi v12, v8, 1
1409; RV32I-NEXT:    lui a0, 349525
1410; RV32I-NEXT:    addi a0, a0, 1365
1411; RV32I-NEXT:    vand.vx v12, v12, a0
1412; RV32I-NEXT:    vsub.vv v8, v8, v12
1413; RV32I-NEXT:    lui a0, 209715
1414; RV32I-NEXT:    addi a0, a0, 819
1415; RV32I-NEXT:    vand.vx v12, v8, a0
1416; RV32I-NEXT:    vsrl.vi v8, v8, 2
1417; RV32I-NEXT:    vand.vx v8, v8, a0
1418; RV32I-NEXT:    vadd.vv v8, v12, v8
1419; RV32I-NEXT:    vsrl.vi v12, v8, 4
1420; RV32I-NEXT:    vadd.vv v8, v8, v12
1421; RV32I-NEXT:    lui a0, 61681
1422; RV32I-NEXT:    addi a0, a0, -241
1423; RV32I-NEXT:    vand.vx v8, v8, a0
1424; RV32I-NEXT:    lui a0, 4112
1425; RV32I-NEXT:    addi a0, a0, 257
1426; RV32I-NEXT:    vmul.vx v8, v8, a0
1427; RV32I-NEXT:    vsrl.vi v8, v8, 24
1428; RV32I-NEXT:    ret
1429;
1430; RV64I-LABEL: ctlz_nxv8i32:
1431; RV64I:       # %bb.0:
1432; RV64I-NEXT:    vsetvli a0, zero, e32, m4, ta, mu
1433; RV64I-NEXT:    vsrl.vi v12, v8, 1
1434; RV64I-NEXT:    vor.vv v8, v8, v12
1435; RV64I-NEXT:    vsrl.vi v12, v8, 2
1436; RV64I-NEXT:    vor.vv v8, v8, v12
1437; RV64I-NEXT:    vsrl.vi v12, v8, 4
1438; RV64I-NEXT:    vor.vv v8, v8, v12
1439; RV64I-NEXT:    vsrl.vi v12, v8, 8
1440; RV64I-NEXT:    vor.vv v8, v8, v12
1441; RV64I-NEXT:    vsrl.vi v12, v8, 16
1442; RV64I-NEXT:    vor.vv v8, v8, v12
1443; RV64I-NEXT:    vxor.vi v8, v8, -1
1444; RV64I-NEXT:    vsrl.vi v12, v8, 1
1445; RV64I-NEXT:    lui a0, 349525
1446; RV64I-NEXT:    addiw a0, a0, 1365
1447; RV64I-NEXT:    vand.vx v12, v12, a0
1448; RV64I-NEXT:    vsub.vv v8, v8, v12
1449; RV64I-NEXT:    lui a0, 209715
1450; RV64I-NEXT:    addiw a0, a0, 819
1451; RV64I-NEXT:    vand.vx v12, v8, a0
1452; RV64I-NEXT:    vsrl.vi v8, v8, 2
1453; RV64I-NEXT:    vand.vx v8, v8, a0
1454; RV64I-NEXT:    vadd.vv v8, v12, v8
1455; RV64I-NEXT:    vsrl.vi v12, v8, 4
1456; RV64I-NEXT:    vadd.vv v8, v8, v12
1457; RV64I-NEXT:    lui a0, 61681
1458; RV64I-NEXT:    addiw a0, a0, -241
1459; RV64I-NEXT:    vand.vx v8, v8, a0
1460; RV64I-NEXT:    lui a0, 4112
1461; RV64I-NEXT:    addiw a0, a0, 257
1462; RV64I-NEXT:    vmul.vx v8, v8, a0
1463; RV64I-NEXT:    vsrl.vi v8, v8, 24
1464; RV64I-NEXT:    ret
1465;
1466; RV32D-LABEL: ctlz_nxv8i32:
1467; RV32D:       # %bb.0:
1468; RV32D-NEXT:    vsetvli a0, zero, e32, m4, ta, mu
1469; RV32D-NEXT:    vfwcvt.f.xu.v v16, v8
1470; RV32D-NEXT:    li a0, 52
1471; RV32D-NEXT:    vsetvli zero, zero, e64, m8, ta, mu
1472; RV32D-NEXT:    vsrl.vx v16, v16, a0
1473; RV32D-NEXT:    vsetvli zero, zero, e32, m4, ta, mu
1474; RV32D-NEXT:    vnsrl.wi v12, v16, 0
1475; RV32D-NEXT:    li a0, 1054
1476; RV32D-NEXT:    vrsub.vx v12, v12, a0
1477; RV32D-NEXT:    vmseq.vi v0, v8, 0
1478; RV32D-NEXT:    li a0, 32
1479; RV32D-NEXT:    vmerge.vxm v8, v12, a0, v0
1480; RV32D-NEXT:    ret
1481;
1482; RV64D-LABEL: ctlz_nxv8i32:
1483; RV64D:       # %bb.0:
1484; RV64D-NEXT:    vsetvli a0, zero, e32, m4, ta, mu
1485; RV64D-NEXT:    vfwcvt.f.xu.v v16, v8
1486; RV64D-NEXT:    li a0, 52
1487; RV64D-NEXT:    vsetvli zero, zero, e64, m8, ta, mu
1488; RV64D-NEXT:    vsrl.vx v16, v16, a0
1489; RV64D-NEXT:    vsetvli zero, zero, e32, m4, ta, mu
1490; RV64D-NEXT:    vnsrl.wi v12, v16, 0
1491; RV64D-NEXT:    li a0, 1054
1492; RV64D-NEXT:    vrsub.vx v12, v12, a0
1493; RV64D-NEXT:    vmseq.vi v0, v8, 0
1494; RV64D-NEXT:    li a0, 32
1495; RV64D-NEXT:    vmerge.vxm v8, v12, a0, v0
1496; RV64D-NEXT:    ret
1497  %a = call <vscale x 8 x i32> @llvm.ctlz.nxv8i32(<vscale x 8 x i32> %va, i1 false)
1498  ret <vscale x 8 x i32> %a
1499}
1500declare <vscale x 8 x i32> @llvm.ctlz.nxv8i32(<vscale x 8 x i32>, i1)
1501
1502define <vscale x 16 x i32> @ctlz_nxv16i32(<vscale x 16 x i32> %va) {
1503; RV32-LABEL: ctlz_nxv16i32:
1504; RV32:       # %bb.0:
1505; RV32-NEXT:    vsetvli a0, zero, e32, m8, ta, mu
1506; RV32-NEXT:    vsrl.vi v16, v8, 1
1507; RV32-NEXT:    vor.vv v8, v8, v16
1508; RV32-NEXT:    vsrl.vi v16, v8, 2
1509; RV32-NEXT:    vor.vv v8, v8, v16
1510; RV32-NEXT:    vsrl.vi v16, v8, 4
1511; RV32-NEXT:    vor.vv v8, v8, v16
1512; RV32-NEXT:    vsrl.vi v16, v8, 8
1513; RV32-NEXT:    vor.vv v8, v8, v16
1514; RV32-NEXT:    vsrl.vi v16, v8, 16
1515; RV32-NEXT:    vor.vv v8, v8, v16
1516; RV32-NEXT:    vxor.vi v8, v8, -1
1517; RV32-NEXT:    vsrl.vi v16, v8, 1
1518; RV32-NEXT:    lui a0, 349525
1519; RV32-NEXT:    addi a0, a0, 1365
1520; RV32-NEXT:    vand.vx v16, v16, a0
1521; RV32-NEXT:    vsub.vv v8, v8, v16
1522; RV32-NEXT:    lui a0, 209715
1523; RV32-NEXT:    addi a0, a0, 819
1524; RV32-NEXT:    vand.vx v16, v8, a0
1525; RV32-NEXT:    vsrl.vi v8, v8, 2
1526; RV32-NEXT:    vand.vx v8, v8, a0
1527; RV32-NEXT:    vadd.vv v8, v16, v8
1528; RV32-NEXT:    vsrl.vi v16, v8, 4
1529; RV32-NEXT:    vadd.vv v8, v8, v16
1530; RV32-NEXT:    lui a0, 61681
1531; RV32-NEXT:    addi a0, a0, -241
1532; RV32-NEXT:    vand.vx v8, v8, a0
1533; RV32-NEXT:    lui a0, 4112
1534; RV32-NEXT:    addi a0, a0, 257
1535; RV32-NEXT:    vmul.vx v8, v8, a0
1536; RV32-NEXT:    vsrl.vi v8, v8, 24
1537; RV32-NEXT:    ret
1538;
1539; RV64-LABEL: ctlz_nxv16i32:
1540; RV64:       # %bb.0:
1541; RV64-NEXT:    vsetvli a0, zero, e32, m8, ta, mu
1542; RV64-NEXT:    vsrl.vi v16, v8, 1
1543; RV64-NEXT:    vor.vv v8, v8, v16
1544; RV64-NEXT:    vsrl.vi v16, v8, 2
1545; RV64-NEXT:    vor.vv v8, v8, v16
1546; RV64-NEXT:    vsrl.vi v16, v8, 4
1547; RV64-NEXT:    vor.vv v8, v8, v16
1548; RV64-NEXT:    vsrl.vi v16, v8, 8
1549; RV64-NEXT:    vor.vv v8, v8, v16
1550; RV64-NEXT:    vsrl.vi v16, v8, 16
1551; RV64-NEXT:    vor.vv v8, v8, v16
1552; RV64-NEXT:    vxor.vi v8, v8, -1
1553; RV64-NEXT:    vsrl.vi v16, v8, 1
1554; RV64-NEXT:    lui a0, 349525
1555; RV64-NEXT:    addiw a0, a0, 1365
1556; RV64-NEXT:    vand.vx v16, v16, a0
1557; RV64-NEXT:    vsub.vv v8, v8, v16
1558; RV64-NEXT:    lui a0, 209715
1559; RV64-NEXT:    addiw a0, a0, 819
1560; RV64-NEXT:    vand.vx v16, v8, a0
1561; RV64-NEXT:    vsrl.vi v8, v8, 2
1562; RV64-NEXT:    vand.vx v8, v8, a0
1563; RV64-NEXT:    vadd.vv v8, v16, v8
1564; RV64-NEXT:    vsrl.vi v16, v8, 4
1565; RV64-NEXT:    vadd.vv v8, v8, v16
1566; RV64-NEXT:    lui a0, 61681
1567; RV64-NEXT:    addiw a0, a0, -241
1568; RV64-NEXT:    vand.vx v8, v8, a0
1569; RV64-NEXT:    lui a0, 4112
1570; RV64-NEXT:    addiw a0, a0, 257
1571; RV64-NEXT:    vmul.vx v8, v8, a0
1572; RV64-NEXT:    vsrl.vi v8, v8, 24
1573; RV64-NEXT:    ret
1574  %a = call <vscale x 16 x i32> @llvm.ctlz.nxv16i32(<vscale x 16 x i32> %va, i1 false)
1575  ret <vscale x 16 x i32> %a
1576}
1577declare <vscale x 16 x i32> @llvm.ctlz.nxv16i32(<vscale x 16 x i32>, i1)
1578
1579define <vscale x 1 x i64> @ctlz_nxv1i64(<vscale x 1 x i64> %va) {
1580; RV32-LABEL: ctlz_nxv1i64:
1581; RV32:       # %bb.0:
1582; RV32-NEXT:    addi sp, sp, -16
1583; RV32-NEXT:    .cfi_def_cfa_offset 16
1584; RV32-NEXT:    lui a0, 349525
1585; RV32-NEXT:    addi a0, a0, 1365
1586; RV32-NEXT:    sw a0, 12(sp)
1587; RV32-NEXT:    sw a0, 8(sp)
1588; RV32-NEXT:    lui a0, 209715
1589; RV32-NEXT:    addi a0, a0, 819
1590; RV32-NEXT:    sw a0, 12(sp)
1591; RV32-NEXT:    sw a0, 8(sp)
1592; RV32-NEXT:    lui a0, 61681
1593; RV32-NEXT:    addi a0, a0, -241
1594; RV32-NEXT:    sw a0, 12(sp)
1595; RV32-NEXT:    sw a0, 8(sp)
1596; RV32-NEXT:    lui a0, 4112
1597; RV32-NEXT:    addi a0, a0, 257
1598; RV32-NEXT:    sw a0, 12(sp)
1599; RV32-NEXT:    sw a0, 8(sp)
1600; RV32-NEXT:    vsetvli a0, zero, e64, m1, ta, mu
1601; RV32-NEXT:    vsrl.vi v9, v8, 1
1602; RV32-NEXT:    vor.vv v8, v8, v9
1603; RV32-NEXT:    vsrl.vi v9, v8, 2
1604; RV32-NEXT:    vor.vv v8, v8, v9
1605; RV32-NEXT:    vsrl.vi v9, v8, 4
1606; RV32-NEXT:    vor.vv v8, v8, v9
1607; RV32-NEXT:    vsrl.vi v9, v8, 8
1608; RV32-NEXT:    vor.vv v8, v8, v9
1609; RV32-NEXT:    vsrl.vi v9, v8, 16
1610; RV32-NEXT:    vor.vv v8, v8, v9
1611; RV32-NEXT:    li a0, 32
1612; RV32-NEXT:    vsrl.vx v9, v8, a0
1613; RV32-NEXT:    vor.vv v8, v8, v9
1614; RV32-NEXT:    addi a0, sp, 8
1615; RV32-NEXT:    vlse64.v v9, (a0), zero
1616; RV32-NEXT:    vxor.vi v8, v8, -1
1617; RV32-NEXT:    addi a0, sp, 8
1618; RV32-NEXT:    vlse64.v v10, (a0), zero
1619; RV32-NEXT:    vsrl.vi v11, v8, 1
1620; RV32-NEXT:    vand.vv v9, v11, v9
1621; RV32-NEXT:    vsub.vv v8, v8, v9
1622; RV32-NEXT:    vand.vv v9, v8, v10
1623; RV32-NEXT:    vsrl.vi v8, v8, 2
1624; RV32-NEXT:    vand.vv v8, v8, v10
1625; RV32-NEXT:    vadd.vv v8, v9, v8
1626; RV32-NEXT:    addi a0, sp, 8
1627; RV32-NEXT:    vlse64.v v9, (a0), zero
1628; RV32-NEXT:    addi a0, sp, 8
1629; RV32-NEXT:    vlse64.v v10, (a0), zero
1630; RV32-NEXT:    vsrl.vi v11, v8, 4
1631; RV32-NEXT:    vadd.vv v8, v8, v11
1632; RV32-NEXT:    vand.vv v8, v8, v9
1633; RV32-NEXT:    vmul.vv v8, v8, v10
1634; RV32-NEXT:    li a0, 56
1635; RV32-NEXT:    vsrl.vx v8, v8, a0
1636; RV32-NEXT:    addi sp, sp, 16
1637; RV32-NEXT:    ret
1638;
1639; RV64-LABEL: ctlz_nxv1i64:
1640; RV64:       # %bb.0:
1641; RV64-NEXT:    vsetvli a0, zero, e64, m1, ta, mu
1642; RV64-NEXT:    vsrl.vi v9, v8, 1
1643; RV64-NEXT:    vor.vv v8, v8, v9
1644; RV64-NEXT:    vsrl.vi v9, v8, 2
1645; RV64-NEXT:    vor.vv v8, v8, v9
1646; RV64-NEXT:    vsrl.vi v9, v8, 4
1647; RV64-NEXT:    vor.vv v8, v8, v9
1648; RV64-NEXT:    vsrl.vi v9, v8, 8
1649; RV64-NEXT:    vor.vv v8, v8, v9
1650; RV64-NEXT:    vsrl.vi v9, v8, 16
1651; RV64-NEXT:    vor.vv v8, v8, v9
1652; RV64-NEXT:    li a0, 32
1653; RV64-NEXT:    vsrl.vx v9, v8, a0
1654; RV64-NEXT:    vor.vv v8, v8, v9
1655; RV64-NEXT:    vxor.vi v8, v8, -1
1656; RV64-NEXT:    lui a0, %hi(.LCPI18_0)
1657; RV64-NEXT:    ld a0, %lo(.LCPI18_0)(a0)
1658; RV64-NEXT:    lui a1, %hi(.LCPI18_1)
1659; RV64-NEXT:    ld a1, %lo(.LCPI18_1)(a1)
1660; RV64-NEXT:    vsrl.vi v9, v8, 1
1661; RV64-NEXT:    vand.vx v9, v9, a0
1662; RV64-NEXT:    vsub.vv v8, v8, v9
1663; RV64-NEXT:    vand.vx v9, v8, a1
1664; RV64-NEXT:    vsrl.vi v8, v8, 2
1665; RV64-NEXT:    vand.vx v8, v8, a1
1666; RV64-NEXT:    vadd.vv v8, v9, v8
1667; RV64-NEXT:    lui a0, %hi(.LCPI18_2)
1668; RV64-NEXT:    ld a0, %lo(.LCPI18_2)(a0)
1669; RV64-NEXT:    lui a1, %hi(.LCPI18_3)
1670; RV64-NEXT:    ld a1, %lo(.LCPI18_3)(a1)
1671; RV64-NEXT:    vsrl.vi v9, v8, 4
1672; RV64-NEXT:    vadd.vv v8, v8, v9
1673; RV64-NEXT:    vand.vx v8, v8, a0
1674; RV64-NEXT:    vmul.vx v8, v8, a1
1675; RV64-NEXT:    li a0, 56
1676; RV64-NEXT:    vsrl.vx v8, v8, a0
1677; RV64-NEXT:    ret
1678  %a = call <vscale x 1 x i64> @llvm.ctlz.nxv1i64(<vscale x 1 x i64> %va, i1 false)
1679  ret <vscale x 1 x i64> %a
1680}
1681declare <vscale x 1 x i64> @llvm.ctlz.nxv1i64(<vscale x 1 x i64>, i1)
1682
1683define <vscale x 2 x i64> @ctlz_nxv2i64(<vscale x 2 x i64> %va) {
1684; RV32-LABEL: ctlz_nxv2i64:
1685; RV32:       # %bb.0:
1686; RV32-NEXT:    addi sp, sp, -16
1687; RV32-NEXT:    .cfi_def_cfa_offset 16
1688; RV32-NEXT:    lui a0, 349525
1689; RV32-NEXT:    addi a0, a0, 1365
1690; RV32-NEXT:    sw a0, 12(sp)
1691; RV32-NEXT:    sw a0, 8(sp)
1692; RV32-NEXT:    lui a0, 209715
1693; RV32-NEXT:    addi a0, a0, 819
1694; RV32-NEXT:    sw a0, 12(sp)
1695; RV32-NEXT:    sw a0, 8(sp)
1696; RV32-NEXT:    lui a0, 61681
1697; RV32-NEXT:    addi a0, a0, -241
1698; RV32-NEXT:    sw a0, 12(sp)
1699; RV32-NEXT:    sw a0, 8(sp)
1700; RV32-NEXT:    lui a0, 4112
1701; RV32-NEXT:    addi a0, a0, 257
1702; RV32-NEXT:    sw a0, 12(sp)
1703; RV32-NEXT:    sw a0, 8(sp)
1704; RV32-NEXT:    vsetvli a0, zero, e64, m2, ta, mu
1705; RV32-NEXT:    vsrl.vi v10, v8, 1
1706; RV32-NEXT:    vor.vv v8, v8, v10
1707; RV32-NEXT:    vsrl.vi v10, v8, 2
1708; RV32-NEXT:    vor.vv v8, v8, v10
1709; RV32-NEXT:    vsrl.vi v10, v8, 4
1710; RV32-NEXT:    vor.vv v8, v8, v10
1711; RV32-NEXT:    vsrl.vi v10, v8, 8
1712; RV32-NEXT:    vor.vv v8, v8, v10
1713; RV32-NEXT:    vsrl.vi v10, v8, 16
1714; RV32-NEXT:    vor.vv v8, v8, v10
1715; RV32-NEXT:    li a0, 32
1716; RV32-NEXT:    vsrl.vx v10, v8, a0
1717; RV32-NEXT:    vor.vv v8, v8, v10
1718; RV32-NEXT:    addi a0, sp, 8
1719; RV32-NEXT:    vlse64.v v10, (a0), zero
1720; RV32-NEXT:    vxor.vi v8, v8, -1
1721; RV32-NEXT:    addi a0, sp, 8
1722; RV32-NEXT:    vlse64.v v12, (a0), zero
1723; RV32-NEXT:    vsrl.vi v14, v8, 1
1724; RV32-NEXT:    vand.vv v10, v14, v10
1725; RV32-NEXT:    vsub.vv v8, v8, v10
1726; RV32-NEXT:    vand.vv v10, v8, v12
1727; RV32-NEXT:    vsrl.vi v8, v8, 2
1728; RV32-NEXT:    vand.vv v8, v8, v12
1729; RV32-NEXT:    vadd.vv v8, v10, v8
1730; RV32-NEXT:    addi a0, sp, 8
1731; RV32-NEXT:    vlse64.v v10, (a0), zero
1732; RV32-NEXT:    addi a0, sp, 8
1733; RV32-NEXT:    vlse64.v v12, (a0), zero
1734; RV32-NEXT:    vsrl.vi v14, v8, 4
1735; RV32-NEXT:    vadd.vv v8, v8, v14
1736; RV32-NEXT:    vand.vv v8, v8, v10
1737; RV32-NEXT:    vmul.vv v8, v8, v12
1738; RV32-NEXT:    li a0, 56
1739; RV32-NEXT:    vsrl.vx v8, v8, a0
1740; RV32-NEXT:    addi sp, sp, 16
1741; RV32-NEXT:    ret
1742;
1743; RV64-LABEL: ctlz_nxv2i64:
1744; RV64:       # %bb.0:
1745; RV64-NEXT:    vsetvli a0, zero, e64, m2, ta, mu
1746; RV64-NEXT:    vsrl.vi v10, v8, 1
1747; RV64-NEXT:    vor.vv v8, v8, v10
1748; RV64-NEXT:    vsrl.vi v10, v8, 2
1749; RV64-NEXT:    vor.vv v8, v8, v10
1750; RV64-NEXT:    vsrl.vi v10, v8, 4
1751; RV64-NEXT:    vor.vv v8, v8, v10
1752; RV64-NEXT:    vsrl.vi v10, v8, 8
1753; RV64-NEXT:    vor.vv v8, v8, v10
1754; RV64-NEXT:    vsrl.vi v10, v8, 16
1755; RV64-NEXT:    vor.vv v8, v8, v10
1756; RV64-NEXT:    li a0, 32
1757; RV64-NEXT:    vsrl.vx v10, v8, a0
1758; RV64-NEXT:    vor.vv v8, v8, v10
1759; RV64-NEXT:    vxor.vi v8, v8, -1
1760; RV64-NEXT:    lui a0, %hi(.LCPI19_0)
1761; RV64-NEXT:    ld a0, %lo(.LCPI19_0)(a0)
1762; RV64-NEXT:    lui a1, %hi(.LCPI19_1)
1763; RV64-NEXT:    ld a1, %lo(.LCPI19_1)(a1)
1764; RV64-NEXT:    vsrl.vi v10, v8, 1
1765; RV64-NEXT:    vand.vx v10, v10, a0
1766; RV64-NEXT:    vsub.vv v8, v8, v10
1767; RV64-NEXT:    vand.vx v10, v8, a1
1768; RV64-NEXT:    vsrl.vi v8, v8, 2
1769; RV64-NEXT:    vand.vx v8, v8, a1
1770; RV64-NEXT:    vadd.vv v8, v10, v8
1771; RV64-NEXT:    lui a0, %hi(.LCPI19_2)
1772; RV64-NEXT:    ld a0, %lo(.LCPI19_2)(a0)
1773; RV64-NEXT:    lui a1, %hi(.LCPI19_3)
1774; RV64-NEXT:    ld a1, %lo(.LCPI19_3)(a1)
1775; RV64-NEXT:    vsrl.vi v10, v8, 4
1776; RV64-NEXT:    vadd.vv v8, v8, v10
1777; RV64-NEXT:    vand.vx v8, v8, a0
1778; RV64-NEXT:    vmul.vx v8, v8, a1
1779; RV64-NEXT:    li a0, 56
1780; RV64-NEXT:    vsrl.vx v8, v8, a0
1781; RV64-NEXT:    ret
1782  %a = call <vscale x 2 x i64> @llvm.ctlz.nxv2i64(<vscale x 2 x i64> %va, i1 false)
1783  ret <vscale x 2 x i64> %a
1784}
1785declare <vscale x 2 x i64> @llvm.ctlz.nxv2i64(<vscale x 2 x i64>, i1)
1786
1787define <vscale x 4 x i64> @ctlz_nxv4i64(<vscale x 4 x i64> %va) {
1788; RV32-LABEL: ctlz_nxv4i64:
1789; RV32:       # %bb.0:
1790; RV32-NEXT:    addi sp, sp, -16
1791; RV32-NEXT:    .cfi_def_cfa_offset 16
1792; RV32-NEXT:    lui a0, 349525
1793; RV32-NEXT:    addi a0, a0, 1365
1794; RV32-NEXT:    sw a0, 12(sp)
1795; RV32-NEXT:    sw a0, 8(sp)
1796; RV32-NEXT:    lui a0, 209715
1797; RV32-NEXT:    addi a0, a0, 819
1798; RV32-NEXT:    sw a0, 12(sp)
1799; RV32-NEXT:    sw a0, 8(sp)
1800; RV32-NEXT:    lui a0, 61681
1801; RV32-NEXT:    addi a0, a0, -241
1802; RV32-NEXT:    sw a0, 12(sp)
1803; RV32-NEXT:    sw a0, 8(sp)
1804; RV32-NEXT:    lui a0, 4112
1805; RV32-NEXT:    addi a0, a0, 257
1806; RV32-NEXT:    sw a0, 12(sp)
1807; RV32-NEXT:    sw a0, 8(sp)
1808; RV32-NEXT:    vsetvli a0, zero, e64, m4, ta, mu
1809; RV32-NEXT:    vsrl.vi v12, v8, 1
1810; RV32-NEXT:    vor.vv v8, v8, v12
1811; RV32-NEXT:    vsrl.vi v12, v8, 2
1812; RV32-NEXT:    vor.vv v8, v8, v12
1813; RV32-NEXT:    vsrl.vi v12, v8, 4
1814; RV32-NEXT:    vor.vv v8, v8, v12
1815; RV32-NEXT:    vsrl.vi v12, v8, 8
1816; RV32-NEXT:    vor.vv v8, v8, v12
1817; RV32-NEXT:    vsrl.vi v12, v8, 16
1818; RV32-NEXT:    vor.vv v8, v8, v12
1819; RV32-NEXT:    li a0, 32
1820; RV32-NEXT:    vsrl.vx v12, v8, a0
1821; RV32-NEXT:    vor.vv v8, v8, v12
1822; RV32-NEXT:    addi a0, sp, 8
1823; RV32-NEXT:    vlse64.v v12, (a0), zero
1824; RV32-NEXT:    vxor.vi v8, v8, -1
1825; RV32-NEXT:    addi a0, sp, 8
1826; RV32-NEXT:    vlse64.v v16, (a0), zero
1827; RV32-NEXT:    vsrl.vi v20, v8, 1
1828; RV32-NEXT:    vand.vv v12, v20, v12
1829; RV32-NEXT:    vsub.vv v8, v8, v12
1830; RV32-NEXT:    vand.vv v12, v8, v16
1831; RV32-NEXT:    vsrl.vi v8, v8, 2
1832; RV32-NEXT:    vand.vv v8, v8, v16
1833; RV32-NEXT:    vadd.vv v8, v12, v8
1834; RV32-NEXT:    addi a0, sp, 8
1835; RV32-NEXT:    vlse64.v v12, (a0), zero
1836; RV32-NEXT:    addi a0, sp, 8
1837; RV32-NEXT:    vlse64.v v16, (a0), zero
1838; RV32-NEXT:    vsrl.vi v20, v8, 4
1839; RV32-NEXT:    vadd.vv v8, v8, v20
1840; RV32-NEXT:    vand.vv v8, v8, v12
1841; RV32-NEXT:    vmul.vv v8, v8, v16
1842; RV32-NEXT:    li a0, 56
1843; RV32-NEXT:    vsrl.vx v8, v8, a0
1844; RV32-NEXT:    addi sp, sp, 16
1845; RV32-NEXT:    ret
1846;
1847; RV64-LABEL: ctlz_nxv4i64:
1848; RV64:       # %bb.0:
1849; RV64-NEXT:    vsetvli a0, zero, e64, m4, ta, mu
1850; RV64-NEXT:    vsrl.vi v12, v8, 1
1851; RV64-NEXT:    vor.vv v8, v8, v12
1852; RV64-NEXT:    vsrl.vi v12, v8, 2
1853; RV64-NEXT:    vor.vv v8, v8, v12
1854; RV64-NEXT:    vsrl.vi v12, v8, 4
1855; RV64-NEXT:    vor.vv v8, v8, v12
1856; RV64-NEXT:    vsrl.vi v12, v8, 8
1857; RV64-NEXT:    vor.vv v8, v8, v12
1858; RV64-NEXT:    vsrl.vi v12, v8, 16
1859; RV64-NEXT:    vor.vv v8, v8, v12
1860; RV64-NEXT:    li a0, 32
1861; RV64-NEXT:    vsrl.vx v12, v8, a0
1862; RV64-NEXT:    vor.vv v8, v8, v12
1863; RV64-NEXT:    vxor.vi v8, v8, -1
1864; RV64-NEXT:    lui a0, %hi(.LCPI20_0)
1865; RV64-NEXT:    ld a0, %lo(.LCPI20_0)(a0)
1866; RV64-NEXT:    lui a1, %hi(.LCPI20_1)
1867; RV64-NEXT:    ld a1, %lo(.LCPI20_1)(a1)
1868; RV64-NEXT:    vsrl.vi v12, v8, 1
1869; RV64-NEXT:    vand.vx v12, v12, a0
1870; RV64-NEXT:    vsub.vv v8, v8, v12
1871; RV64-NEXT:    vand.vx v12, v8, a1
1872; RV64-NEXT:    vsrl.vi v8, v8, 2
1873; RV64-NEXT:    vand.vx v8, v8, a1
1874; RV64-NEXT:    vadd.vv v8, v12, v8
1875; RV64-NEXT:    lui a0, %hi(.LCPI20_2)
1876; RV64-NEXT:    ld a0, %lo(.LCPI20_2)(a0)
1877; RV64-NEXT:    lui a1, %hi(.LCPI20_3)
1878; RV64-NEXT:    ld a1, %lo(.LCPI20_3)(a1)
1879; RV64-NEXT:    vsrl.vi v12, v8, 4
1880; RV64-NEXT:    vadd.vv v8, v8, v12
1881; RV64-NEXT:    vand.vx v8, v8, a0
1882; RV64-NEXT:    vmul.vx v8, v8, a1
1883; RV64-NEXT:    li a0, 56
1884; RV64-NEXT:    vsrl.vx v8, v8, a0
1885; RV64-NEXT:    ret
1886  %a = call <vscale x 4 x i64> @llvm.ctlz.nxv4i64(<vscale x 4 x i64> %va, i1 false)
1887  ret <vscale x 4 x i64> %a
1888}
1889declare <vscale x 4 x i64> @llvm.ctlz.nxv4i64(<vscale x 4 x i64>, i1)
1890
1891define <vscale x 8 x i64> @ctlz_nxv8i64(<vscale x 8 x i64> %va) {
1892; RV32-LABEL: ctlz_nxv8i64:
1893; RV32:       # %bb.0:
1894; RV32-NEXT:    addi sp, sp, -16
1895; RV32-NEXT:    .cfi_def_cfa_offset 16
1896; RV32-NEXT:    lui a0, 349525
1897; RV32-NEXT:    addi a0, a0, 1365
1898; RV32-NEXT:    sw a0, 12(sp)
1899; RV32-NEXT:    sw a0, 8(sp)
1900; RV32-NEXT:    lui a0, 209715
1901; RV32-NEXT:    addi a0, a0, 819
1902; RV32-NEXT:    sw a0, 12(sp)
1903; RV32-NEXT:    sw a0, 8(sp)
1904; RV32-NEXT:    lui a0, 61681
1905; RV32-NEXT:    addi a0, a0, -241
1906; RV32-NEXT:    sw a0, 12(sp)
1907; RV32-NEXT:    sw a0, 8(sp)
1908; RV32-NEXT:    lui a0, 4112
1909; RV32-NEXT:    addi a0, a0, 257
1910; RV32-NEXT:    sw a0, 12(sp)
1911; RV32-NEXT:    sw a0, 8(sp)
1912; RV32-NEXT:    vsetvli a0, zero, e64, m8, ta, mu
1913; RV32-NEXT:    vsrl.vi v16, v8, 1
1914; RV32-NEXT:    vor.vv v8, v8, v16
1915; RV32-NEXT:    vsrl.vi v16, v8, 2
1916; RV32-NEXT:    vor.vv v8, v8, v16
1917; RV32-NEXT:    vsrl.vi v16, v8, 4
1918; RV32-NEXT:    vor.vv v8, v8, v16
1919; RV32-NEXT:    vsrl.vi v16, v8, 8
1920; RV32-NEXT:    vor.vv v8, v8, v16
1921; RV32-NEXT:    vsrl.vi v16, v8, 16
1922; RV32-NEXT:    vor.vv v8, v8, v16
1923; RV32-NEXT:    li a0, 32
1924; RV32-NEXT:    vsrl.vx v16, v8, a0
1925; RV32-NEXT:    vor.vv v8, v8, v16
1926; RV32-NEXT:    addi a0, sp, 8
1927; RV32-NEXT:    vlse64.v v16, (a0), zero
1928; RV32-NEXT:    vxor.vi v8, v8, -1
1929; RV32-NEXT:    addi a0, sp, 8
1930; RV32-NEXT:    vlse64.v v24, (a0), zero
1931; RV32-NEXT:    vsrl.vi v0, v8, 1
1932; RV32-NEXT:    vand.vv v16, v0, v16
1933; RV32-NEXT:    vsub.vv v8, v8, v16
1934; RV32-NEXT:    vand.vv v16, v8, v24
1935; RV32-NEXT:    vsrl.vi v8, v8, 2
1936; RV32-NEXT:    vand.vv v8, v8, v24
1937; RV32-NEXT:    vadd.vv v8, v16, v8
1938; RV32-NEXT:    addi a0, sp, 8
1939; RV32-NEXT:    vlse64.v v16, (a0), zero
1940; RV32-NEXT:    addi a0, sp, 8
1941; RV32-NEXT:    vlse64.v v24, (a0), zero
1942; RV32-NEXT:    vsrl.vi v0, v8, 4
1943; RV32-NEXT:    vadd.vv v8, v8, v0
1944; RV32-NEXT:    vand.vv v8, v8, v16
1945; RV32-NEXT:    vmul.vv v8, v8, v24
1946; RV32-NEXT:    li a0, 56
1947; RV32-NEXT:    vsrl.vx v8, v8, a0
1948; RV32-NEXT:    addi sp, sp, 16
1949; RV32-NEXT:    ret
1950;
1951; RV64-LABEL: ctlz_nxv8i64:
1952; RV64:       # %bb.0:
1953; RV64-NEXT:    vsetvli a0, zero, e64, m8, ta, mu
1954; RV64-NEXT:    vsrl.vi v16, v8, 1
1955; RV64-NEXT:    vor.vv v8, v8, v16
1956; RV64-NEXT:    vsrl.vi v16, v8, 2
1957; RV64-NEXT:    vor.vv v8, v8, v16
1958; RV64-NEXT:    vsrl.vi v16, v8, 4
1959; RV64-NEXT:    vor.vv v8, v8, v16
1960; RV64-NEXT:    vsrl.vi v16, v8, 8
1961; RV64-NEXT:    vor.vv v8, v8, v16
1962; RV64-NEXT:    vsrl.vi v16, v8, 16
1963; RV64-NEXT:    vor.vv v8, v8, v16
1964; RV64-NEXT:    li a0, 32
1965; RV64-NEXT:    vsrl.vx v16, v8, a0
1966; RV64-NEXT:    vor.vv v8, v8, v16
1967; RV64-NEXT:    vxor.vi v8, v8, -1
1968; RV64-NEXT:    lui a0, %hi(.LCPI21_0)
1969; RV64-NEXT:    ld a0, %lo(.LCPI21_0)(a0)
1970; RV64-NEXT:    lui a1, %hi(.LCPI21_1)
1971; RV64-NEXT:    ld a1, %lo(.LCPI21_1)(a1)
1972; RV64-NEXT:    vsrl.vi v16, v8, 1
1973; RV64-NEXT:    vand.vx v16, v16, a0
1974; RV64-NEXT:    vsub.vv v8, v8, v16
1975; RV64-NEXT:    vand.vx v16, v8, a1
1976; RV64-NEXT:    vsrl.vi v8, v8, 2
1977; RV64-NEXT:    vand.vx v8, v8, a1
1978; RV64-NEXT:    vadd.vv v8, v16, v8
1979; RV64-NEXT:    lui a0, %hi(.LCPI21_2)
1980; RV64-NEXT:    ld a0, %lo(.LCPI21_2)(a0)
1981; RV64-NEXT:    lui a1, %hi(.LCPI21_3)
1982; RV64-NEXT:    ld a1, %lo(.LCPI21_3)(a1)
1983; RV64-NEXT:    vsrl.vi v16, v8, 4
1984; RV64-NEXT:    vadd.vv v8, v8, v16
1985; RV64-NEXT:    vand.vx v8, v8, a0
1986; RV64-NEXT:    vmul.vx v8, v8, a1
1987; RV64-NEXT:    li a0, 56
1988; RV64-NEXT:    vsrl.vx v8, v8, a0
1989; RV64-NEXT:    ret
1990  %a = call <vscale x 8 x i64> @llvm.ctlz.nxv8i64(<vscale x 8 x i64> %va, i1 false)
1991  ret <vscale x 8 x i64> %a
1992}
1993declare <vscale x 8 x i64> @llvm.ctlz.nxv8i64(<vscale x 8 x i64>, i1)
1994
1995define <vscale x 1 x i8> @ctlz_zero_undef_nxv1i8(<vscale x 1 x i8> %va) {
1996; RV32I-LABEL: ctlz_zero_undef_nxv1i8:
1997; RV32I:       # %bb.0:
1998; RV32I-NEXT:    vsetvli a0, zero, e8, mf8, ta, mu
1999; RV32I-NEXT:    vsrl.vi v9, v8, 1
2000; RV32I-NEXT:    vor.vv v8, v8, v9
2001; RV32I-NEXT:    vsrl.vi v9, v8, 2
2002; RV32I-NEXT:    vor.vv v8, v8, v9
2003; RV32I-NEXT:    vsrl.vi v9, v8, 4
2004; RV32I-NEXT:    vor.vv v8, v8, v9
2005; RV32I-NEXT:    vxor.vi v8, v8, -1
2006; RV32I-NEXT:    vsrl.vi v9, v8, 1
2007; RV32I-NEXT:    li a0, 85
2008; RV32I-NEXT:    vand.vx v9, v9, a0
2009; RV32I-NEXT:    vsub.vv v8, v8, v9
2010; RV32I-NEXT:    li a0, 51
2011; RV32I-NEXT:    vand.vx v9, v8, a0
2012; RV32I-NEXT:    vsrl.vi v8, v8, 2
2013; RV32I-NEXT:    vand.vx v8, v8, a0
2014; RV32I-NEXT:    vadd.vv v8, v9, v8
2015; RV32I-NEXT:    vsrl.vi v9, v8, 4
2016; RV32I-NEXT:    vadd.vv v8, v8, v9
2017; RV32I-NEXT:    vand.vi v8, v8, 15
2018; RV32I-NEXT:    ret
2019;
2020; RV64I-LABEL: ctlz_zero_undef_nxv1i8:
2021; RV64I:       # %bb.0:
2022; RV64I-NEXT:    vsetvli a0, zero, e8, mf8, ta, mu
2023; RV64I-NEXT:    vsrl.vi v9, v8, 1
2024; RV64I-NEXT:    vor.vv v8, v8, v9
2025; RV64I-NEXT:    vsrl.vi v9, v8, 2
2026; RV64I-NEXT:    vor.vv v8, v8, v9
2027; RV64I-NEXT:    vsrl.vi v9, v8, 4
2028; RV64I-NEXT:    vor.vv v8, v8, v9
2029; RV64I-NEXT:    vxor.vi v8, v8, -1
2030; RV64I-NEXT:    vsrl.vi v9, v8, 1
2031; RV64I-NEXT:    li a0, 85
2032; RV64I-NEXT:    vand.vx v9, v9, a0
2033; RV64I-NEXT:    vsub.vv v8, v8, v9
2034; RV64I-NEXT:    li a0, 51
2035; RV64I-NEXT:    vand.vx v9, v8, a0
2036; RV64I-NEXT:    vsrl.vi v8, v8, 2
2037; RV64I-NEXT:    vand.vx v8, v8, a0
2038; RV64I-NEXT:    vadd.vv v8, v9, v8
2039; RV64I-NEXT:    vsrl.vi v9, v8, 4
2040; RV64I-NEXT:    vadd.vv v8, v8, v9
2041; RV64I-NEXT:    vand.vi v8, v8, 15
2042; RV64I-NEXT:    ret
2043;
2044; RV32D-LABEL: ctlz_zero_undef_nxv1i8:
2045; RV32D:       # %bb.0:
2046; RV32D-NEXT:    vsetvli a0, zero, e32, mf2, ta, mu
2047; RV32D-NEXT:    vzext.vf4 v9, v8
2048; RV32D-NEXT:    vfcvt.f.xu.v v8, v9
2049; RV32D-NEXT:    vsrl.vi v8, v8, 23
2050; RV32D-NEXT:    vsetvli zero, zero, e16, mf4, ta, mu
2051; RV32D-NEXT:    vnsrl.wi v8, v8, 0
2052; RV32D-NEXT:    vsetvli zero, zero, e8, mf8, ta, mu
2053; RV32D-NEXT:    vnsrl.wi v8, v8, 0
2054; RV32D-NEXT:    li a0, 134
2055; RV32D-NEXT:    vrsub.vx v8, v8, a0
2056; RV32D-NEXT:    ret
2057;
2058; RV64D-LABEL: ctlz_zero_undef_nxv1i8:
2059; RV64D:       # %bb.0:
2060; RV64D-NEXT:    vsetvli a0, zero, e32, mf2, ta, mu
2061; RV64D-NEXT:    vzext.vf4 v9, v8
2062; RV64D-NEXT:    vfcvt.f.xu.v v8, v9
2063; RV64D-NEXT:    vsrl.vi v8, v8, 23
2064; RV64D-NEXT:    vsetvli zero, zero, e16, mf4, ta, mu
2065; RV64D-NEXT:    vnsrl.wi v8, v8, 0
2066; RV64D-NEXT:    vsetvli zero, zero, e8, mf8, ta, mu
2067; RV64D-NEXT:    vnsrl.wi v8, v8, 0
2068; RV64D-NEXT:    li a0, 134
2069; RV64D-NEXT:    vrsub.vx v8, v8, a0
2070; RV64D-NEXT:    ret
2071  %a = call <vscale x 1 x i8> @llvm.ctlz.nxv1i8(<vscale x 1 x i8> %va, i1 true)
2072  ret <vscale x 1 x i8> %a
2073}
2074
2075define <vscale x 2 x i8> @ctlz_zero_undef_nxv2i8(<vscale x 2 x i8> %va) {
2076; RV32I-LABEL: ctlz_zero_undef_nxv2i8:
2077; RV32I:       # %bb.0:
2078; RV32I-NEXT:    vsetvli a0, zero, e8, mf4, ta, mu
2079; RV32I-NEXT:    vsrl.vi v9, v8, 1
2080; RV32I-NEXT:    vor.vv v8, v8, v9
2081; RV32I-NEXT:    vsrl.vi v9, v8, 2
2082; RV32I-NEXT:    vor.vv v8, v8, v9
2083; RV32I-NEXT:    vsrl.vi v9, v8, 4
2084; RV32I-NEXT:    vor.vv v8, v8, v9
2085; RV32I-NEXT:    vxor.vi v8, v8, -1
2086; RV32I-NEXT:    vsrl.vi v9, v8, 1
2087; RV32I-NEXT:    li a0, 85
2088; RV32I-NEXT:    vand.vx v9, v9, a0
2089; RV32I-NEXT:    vsub.vv v8, v8, v9
2090; RV32I-NEXT:    li a0, 51
2091; RV32I-NEXT:    vand.vx v9, v8, a0
2092; RV32I-NEXT:    vsrl.vi v8, v8, 2
2093; RV32I-NEXT:    vand.vx v8, v8, a0
2094; RV32I-NEXT:    vadd.vv v8, v9, v8
2095; RV32I-NEXT:    vsrl.vi v9, v8, 4
2096; RV32I-NEXT:    vadd.vv v8, v8, v9
2097; RV32I-NEXT:    vand.vi v8, v8, 15
2098; RV32I-NEXT:    ret
2099;
2100; RV64I-LABEL: ctlz_zero_undef_nxv2i8:
2101; RV64I:       # %bb.0:
2102; RV64I-NEXT:    vsetvli a0, zero, e8, mf4, ta, mu
2103; RV64I-NEXT:    vsrl.vi v9, v8, 1
2104; RV64I-NEXT:    vor.vv v8, v8, v9
2105; RV64I-NEXT:    vsrl.vi v9, v8, 2
2106; RV64I-NEXT:    vor.vv v8, v8, v9
2107; RV64I-NEXT:    vsrl.vi v9, v8, 4
2108; RV64I-NEXT:    vor.vv v8, v8, v9
2109; RV64I-NEXT:    vxor.vi v8, v8, -1
2110; RV64I-NEXT:    vsrl.vi v9, v8, 1
2111; RV64I-NEXT:    li a0, 85
2112; RV64I-NEXT:    vand.vx v9, v9, a0
2113; RV64I-NEXT:    vsub.vv v8, v8, v9
2114; RV64I-NEXT:    li a0, 51
2115; RV64I-NEXT:    vand.vx v9, v8, a0
2116; RV64I-NEXT:    vsrl.vi v8, v8, 2
2117; RV64I-NEXT:    vand.vx v8, v8, a0
2118; RV64I-NEXT:    vadd.vv v8, v9, v8
2119; RV64I-NEXT:    vsrl.vi v9, v8, 4
2120; RV64I-NEXT:    vadd.vv v8, v8, v9
2121; RV64I-NEXT:    vand.vi v8, v8, 15
2122; RV64I-NEXT:    ret
2123;
2124; RV32D-LABEL: ctlz_zero_undef_nxv2i8:
2125; RV32D:       # %bb.0:
2126; RV32D-NEXT:    vsetvli a0, zero, e32, m1, ta, mu
2127; RV32D-NEXT:    vzext.vf4 v9, v8
2128; RV32D-NEXT:    vfcvt.f.xu.v v8, v9
2129; RV32D-NEXT:    vsrl.vi v8, v8, 23
2130; RV32D-NEXT:    vsetvli zero, zero, e16, mf2, ta, mu
2131; RV32D-NEXT:    vnsrl.wi v8, v8, 0
2132; RV32D-NEXT:    vsetvli zero, zero, e8, mf4, ta, mu
2133; RV32D-NEXT:    vnsrl.wi v8, v8, 0
2134; RV32D-NEXT:    li a0, 134
2135; RV32D-NEXT:    vrsub.vx v8, v8, a0
2136; RV32D-NEXT:    ret
2137;
2138; RV64D-LABEL: ctlz_zero_undef_nxv2i8:
2139; RV64D:       # %bb.0:
2140; RV64D-NEXT:    vsetvli a0, zero, e32, m1, ta, mu
2141; RV64D-NEXT:    vzext.vf4 v9, v8
2142; RV64D-NEXT:    vfcvt.f.xu.v v8, v9
2143; RV64D-NEXT:    vsrl.vi v8, v8, 23
2144; RV64D-NEXT:    vsetvli zero, zero, e16, mf2, ta, mu
2145; RV64D-NEXT:    vnsrl.wi v8, v8, 0
2146; RV64D-NEXT:    vsetvli zero, zero, e8, mf4, ta, mu
2147; RV64D-NEXT:    vnsrl.wi v8, v8, 0
2148; RV64D-NEXT:    li a0, 134
2149; RV64D-NEXT:    vrsub.vx v8, v8, a0
2150; RV64D-NEXT:    ret
2151  %a = call <vscale x 2 x i8> @llvm.ctlz.nxv2i8(<vscale x 2 x i8> %va, i1 true)
2152  ret <vscale x 2 x i8> %a
2153}
2154
2155define <vscale x 4 x i8> @ctlz_zero_undef_nxv4i8(<vscale x 4 x i8> %va) {
2156; RV32I-LABEL: ctlz_zero_undef_nxv4i8:
2157; RV32I:       # %bb.0:
2158; RV32I-NEXT:    vsetvli a0, zero, e8, mf2, ta, mu
2159; RV32I-NEXT:    vsrl.vi v9, v8, 1
2160; RV32I-NEXT:    vor.vv v8, v8, v9
2161; RV32I-NEXT:    vsrl.vi v9, v8, 2
2162; RV32I-NEXT:    vor.vv v8, v8, v9
2163; RV32I-NEXT:    vsrl.vi v9, v8, 4
2164; RV32I-NEXT:    vor.vv v8, v8, v9
2165; RV32I-NEXT:    vxor.vi v8, v8, -1
2166; RV32I-NEXT:    vsrl.vi v9, v8, 1
2167; RV32I-NEXT:    li a0, 85
2168; RV32I-NEXT:    vand.vx v9, v9, a0
2169; RV32I-NEXT:    vsub.vv v8, v8, v9
2170; RV32I-NEXT:    li a0, 51
2171; RV32I-NEXT:    vand.vx v9, v8, a0
2172; RV32I-NEXT:    vsrl.vi v8, v8, 2
2173; RV32I-NEXT:    vand.vx v8, v8, a0
2174; RV32I-NEXT:    vadd.vv v8, v9, v8
2175; RV32I-NEXT:    vsrl.vi v9, v8, 4
2176; RV32I-NEXT:    vadd.vv v8, v8, v9
2177; RV32I-NEXT:    vand.vi v8, v8, 15
2178; RV32I-NEXT:    ret
2179;
2180; RV64I-LABEL: ctlz_zero_undef_nxv4i8:
2181; RV64I:       # %bb.0:
2182; RV64I-NEXT:    vsetvli a0, zero, e8, mf2, ta, mu
2183; RV64I-NEXT:    vsrl.vi v9, v8, 1
2184; RV64I-NEXT:    vor.vv v8, v8, v9
2185; RV64I-NEXT:    vsrl.vi v9, v8, 2
2186; RV64I-NEXT:    vor.vv v8, v8, v9
2187; RV64I-NEXT:    vsrl.vi v9, v8, 4
2188; RV64I-NEXT:    vor.vv v8, v8, v9
2189; RV64I-NEXT:    vxor.vi v8, v8, -1
2190; RV64I-NEXT:    vsrl.vi v9, v8, 1
2191; RV64I-NEXT:    li a0, 85
2192; RV64I-NEXT:    vand.vx v9, v9, a0
2193; RV64I-NEXT:    vsub.vv v8, v8, v9
2194; RV64I-NEXT:    li a0, 51
2195; RV64I-NEXT:    vand.vx v9, v8, a0
2196; RV64I-NEXT:    vsrl.vi v8, v8, 2
2197; RV64I-NEXT:    vand.vx v8, v8, a0
2198; RV64I-NEXT:    vadd.vv v8, v9, v8
2199; RV64I-NEXT:    vsrl.vi v9, v8, 4
2200; RV64I-NEXT:    vadd.vv v8, v8, v9
2201; RV64I-NEXT:    vand.vi v8, v8, 15
2202; RV64I-NEXT:    ret
2203;
2204; RV32D-LABEL: ctlz_zero_undef_nxv4i8:
2205; RV32D:       # %bb.0:
2206; RV32D-NEXT:    vsetvli a0, zero, e32, m2, ta, mu
2207; RV32D-NEXT:    vzext.vf4 v10, v8
2208; RV32D-NEXT:    vfcvt.f.xu.v v8, v10
2209; RV32D-NEXT:    vsrl.vi v8, v8, 23
2210; RV32D-NEXT:    vsetvli zero, zero, e16, m1, ta, mu
2211; RV32D-NEXT:    vnsrl.wi v10, v8, 0
2212; RV32D-NEXT:    vsetvli zero, zero, e8, mf2, ta, mu
2213; RV32D-NEXT:    vnsrl.wi v8, v10, 0
2214; RV32D-NEXT:    li a0, 134
2215; RV32D-NEXT:    vrsub.vx v8, v8, a0
2216; RV32D-NEXT:    ret
2217;
2218; RV64D-LABEL: ctlz_zero_undef_nxv4i8:
2219; RV64D:       # %bb.0:
2220; RV64D-NEXT:    vsetvli a0, zero, e32, m2, ta, mu
2221; RV64D-NEXT:    vzext.vf4 v10, v8
2222; RV64D-NEXT:    vfcvt.f.xu.v v8, v10
2223; RV64D-NEXT:    vsrl.vi v8, v8, 23
2224; RV64D-NEXT:    vsetvli zero, zero, e16, m1, ta, mu
2225; RV64D-NEXT:    vnsrl.wi v10, v8, 0
2226; RV64D-NEXT:    vsetvli zero, zero, e8, mf2, ta, mu
2227; RV64D-NEXT:    vnsrl.wi v8, v10, 0
2228; RV64D-NEXT:    li a0, 134
2229; RV64D-NEXT:    vrsub.vx v8, v8, a0
2230; RV64D-NEXT:    ret
2231  %a = call <vscale x 4 x i8> @llvm.ctlz.nxv4i8(<vscale x 4 x i8> %va, i1 true)
2232  ret <vscale x 4 x i8> %a
2233}
2234
2235define <vscale x 8 x i8> @ctlz_zero_undef_nxv8i8(<vscale x 8 x i8> %va) {
2236; RV32I-LABEL: ctlz_zero_undef_nxv8i8:
2237; RV32I:       # %bb.0:
2238; RV32I-NEXT:    vsetvli a0, zero, e8, m1, ta, mu
2239; RV32I-NEXT:    vsrl.vi v9, v8, 1
2240; RV32I-NEXT:    vor.vv v8, v8, v9
2241; RV32I-NEXT:    vsrl.vi v9, v8, 2
2242; RV32I-NEXT:    vor.vv v8, v8, v9
2243; RV32I-NEXT:    vsrl.vi v9, v8, 4
2244; RV32I-NEXT:    vor.vv v8, v8, v9
2245; RV32I-NEXT:    vxor.vi v8, v8, -1
2246; RV32I-NEXT:    vsrl.vi v9, v8, 1
2247; RV32I-NEXT:    li a0, 85
2248; RV32I-NEXT:    vand.vx v9, v9, a0
2249; RV32I-NEXT:    vsub.vv v8, v8, v9
2250; RV32I-NEXT:    li a0, 51
2251; RV32I-NEXT:    vand.vx v9, v8, a0
2252; RV32I-NEXT:    vsrl.vi v8, v8, 2
2253; RV32I-NEXT:    vand.vx v8, v8, a0
2254; RV32I-NEXT:    vadd.vv v8, v9, v8
2255; RV32I-NEXT:    vsrl.vi v9, v8, 4
2256; RV32I-NEXT:    vadd.vv v8, v8, v9
2257; RV32I-NEXT:    vand.vi v8, v8, 15
2258; RV32I-NEXT:    ret
2259;
2260; RV64I-LABEL: ctlz_zero_undef_nxv8i8:
2261; RV64I:       # %bb.0:
2262; RV64I-NEXT:    vsetvli a0, zero, e8, m1, ta, mu
2263; RV64I-NEXT:    vsrl.vi v9, v8, 1
2264; RV64I-NEXT:    vor.vv v8, v8, v9
2265; RV64I-NEXT:    vsrl.vi v9, v8, 2
2266; RV64I-NEXT:    vor.vv v8, v8, v9
2267; RV64I-NEXT:    vsrl.vi v9, v8, 4
2268; RV64I-NEXT:    vor.vv v8, v8, v9
2269; RV64I-NEXT:    vxor.vi v8, v8, -1
2270; RV64I-NEXT:    vsrl.vi v9, v8, 1
2271; RV64I-NEXT:    li a0, 85
2272; RV64I-NEXT:    vand.vx v9, v9, a0
2273; RV64I-NEXT:    vsub.vv v8, v8, v9
2274; RV64I-NEXT:    li a0, 51
2275; RV64I-NEXT:    vand.vx v9, v8, a0
2276; RV64I-NEXT:    vsrl.vi v8, v8, 2
2277; RV64I-NEXT:    vand.vx v8, v8, a0
2278; RV64I-NEXT:    vadd.vv v8, v9, v8
2279; RV64I-NEXT:    vsrl.vi v9, v8, 4
2280; RV64I-NEXT:    vadd.vv v8, v8, v9
2281; RV64I-NEXT:    vand.vi v8, v8, 15
2282; RV64I-NEXT:    ret
2283;
2284; RV32D-LABEL: ctlz_zero_undef_nxv8i8:
2285; RV32D:       # %bb.0:
2286; RV32D-NEXT:    vsetvli a0, zero, e32, m4, ta, mu
2287; RV32D-NEXT:    vzext.vf4 v12, v8
2288; RV32D-NEXT:    vfcvt.f.xu.v v8, v12
2289; RV32D-NEXT:    vsrl.vi v8, v8, 23
2290; RV32D-NEXT:    vsetvli zero, zero, e16, m2, ta, mu
2291; RV32D-NEXT:    vnsrl.wi v12, v8, 0
2292; RV32D-NEXT:    vsetvli zero, zero, e8, m1, ta, mu
2293; RV32D-NEXT:    vnsrl.wi v8, v12, 0
2294; RV32D-NEXT:    li a0, 134
2295; RV32D-NEXT:    vrsub.vx v8, v8, a0
2296; RV32D-NEXT:    ret
2297;
2298; RV64D-LABEL: ctlz_zero_undef_nxv8i8:
2299; RV64D:       # %bb.0:
2300; RV64D-NEXT:    vsetvli a0, zero, e32, m4, ta, mu
2301; RV64D-NEXT:    vzext.vf4 v12, v8
2302; RV64D-NEXT:    vfcvt.f.xu.v v8, v12
2303; RV64D-NEXT:    vsrl.vi v8, v8, 23
2304; RV64D-NEXT:    vsetvli zero, zero, e16, m2, ta, mu
2305; RV64D-NEXT:    vnsrl.wi v12, v8, 0
2306; RV64D-NEXT:    vsetvli zero, zero, e8, m1, ta, mu
2307; RV64D-NEXT:    vnsrl.wi v8, v12, 0
2308; RV64D-NEXT:    li a0, 134
2309; RV64D-NEXT:    vrsub.vx v8, v8, a0
2310; RV64D-NEXT:    ret
2311  %a = call <vscale x 8 x i8> @llvm.ctlz.nxv8i8(<vscale x 8 x i8> %va, i1 true)
2312  ret <vscale x 8 x i8> %a
2313}
2314
2315define <vscale x 16 x i8> @ctlz_zero_undef_nxv16i8(<vscale x 16 x i8> %va) {
2316; RV32I-LABEL: ctlz_zero_undef_nxv16i8:
2317; RV32I:       # %bb.0:
2318; RV32I-NEXT:    vsetvli a0, zero, e8, m2, ta, mu
2319; RV32I-NEXT:    vsrl.vi v10, v8, 1
2320; RV32I-NEXT:    vor.vv v8, v8, v10
2321; RV32I-NEXT:    vsrl.vi v10, v8, 2
2322; RV32I-NEXT:    vor.vv v8, v8, v10
2323; RV32I-NEXT:    vsrl.vi v10, v8, 4
2324; RV32I-NEXT:    vor.vv v8, v8, v10
2325; RV32I-NEXT:    vxor.vi v8, v8, -1
2326; RV32I-NEXT:    vsrl.vi v10, v8, 1
2327; RV32I-NEXT:    li a0, 85
2328; RV32I-NEXT:    vand.vx v10, v10, a0
2329; RV32I-NEXT:    vsub.vv v8, v8, v10
2330; RV32I-NEXT:    li a0, 51
2331; RV32I-NEXT:    vand.vx v10, v8, a0
2332; RV32I-NEXT:    vsrl.vi v8, v8, 2
2333; RV32I-NEXT:    vand.vx v8, v8, a0
2334; RV32I-NEXT:    vadd.vv v8, v10, v8
2335; RV32I-NEXT:    vsrl.vi v10, v8, 4
2336; RV32I-NEXT:    vadd.vv v8, v8, v10
2337; RV32I-NEXT:    vand.vi v8, v8, 15
2338; RV32I-NEXT:    ret
2339;
2340; RV64I-LABEL: ctlz_zero_undef_nxv16i8:
2341; RV64I:       # %bb.0:
2342; RV64I-NEXT:    vsetvli a0, zero, e8, m2, ta, mu
2343; RV64I-NEXT:    vsrl.vi v10, v8, 1
2344; RV64I-NEXT:    vor.vv v8, v8, v10
2345; RV64I-NEXT:    vsrl.vi v10, v8, 2
2346; RV64I-NEXT:    vor.vv v8, v8, v10
2347; RV64I-NEXT:    vsrl.vi v10, v8, 4
2348; RV64I-NEXT:    vor.vv v8, v8, v10
2349; RV64I-NEXT:    vxor.vi v8, v8, -1
2350; RV64I-NEXT:    vsrl.vi v10, v8, 1
2351; RV64I-NEXT:    li a0, 85
2352; RV64I-NEXT:    vand.vx v10, v10, a0
2353; RV64I-NEXT:    vsub.vv v8, v8, v10
2354; RV64I-NEXT:    li a0, 51
2355; RV64I-NEXT:    vand.vx v10, v8, a0
2356; RV64I-NEXT:    vsrl.vi v8, v8, 2
2357; RV64I-NEXT:    vand.vx v8, v8, a0
2358; RV64I-NEXT:    vadd.vv v8, v10, v8
2359; RV64I-NEXT:    vsrl.vi v10, v8, 4
2360; RV64I-NEXT:    vadd.vv v8, v8, v10
2361; RV64I-NEXT:    vand.vi v8, v8, 15
2362; RV64I-NEXT:    ret
2363;
2364; RV32D-LABEL: ctlz_zero_undef_nxv16i8:
2365; RV32D:       # %bb.0:
2366; RV32D-NEXT:    vsetvli a0, zero, e32, m8, ta, mu
2367; RV32D-NEXT:    vzext.vf4 v16, v8
2368; RV32D-NEXT:    vfcvt.f.xu.v v8, v16
2369; RV32D-NEXT:    vsrl.vi v8, v8, 23
2370; RV32D-NEXT:    vsetvli zero, zero, e16, m4, ta, mu
2371; RV32D-NEXT:    vnsrl.wi v16, v8, 0
2372; RV32D-NEXT:    vsetvli zero, zero, e8, m2, ta, mu
2373; RV32D-NEXT:    vnsrl.wi v8, v16, 0
2374; RV32D-NEXT:    li a0, 134
2375; RV32D-NEXT:    vrsub.vx v8, v8, a0
2376; RV32D-NEXT:    ret
2377;
2378; RV64D-LABEL: ctlz_zero_undef_nxv16i8:
2379; RV64D:       # %bb.0:
2380; RV64D-NEXT:    vsetvli a0, zero, e32, m8, ta, mu
2381; RV64D-NEXT:    vzext.vf4 v16, v8
2382; RV64D-NEXT:    vfcvt.f.xu.v v8, v16
2383; RV64D-NEXT:    vsrl.vi v8, v8, 23
2384; RV64D-NEXT:    vsetvli zero, zero, e16, m4, ta, mu
2385; RV64D-NEXT:    vnsrl.wi v16, v8, 0
2386; RV64D-NEXT:    vsetvli zero, zero, e8, m2, ta, mu
2387; RV64D-NEXT:    vnsrl.wi v8, v16, 0
2388; RV64D-NEXT:    li a0, 134
2389; RV64D-NEXT:    vrsub.vx v8, v8, a0
2390; RV64D-NEXT:    ret
2391  %a = call <vscale x 16 x i8> @llvm.ctlz.nxv16i8(<vscale x 16 x i8> %va, i1 true)
2392  ret <vscale x 16 x i8> %a
2393}
2394
2395define <vscale x 32 x i8> @ctlz_zero_undef_nxv32i8(<vscale x 32 x i8> %va) {
2396; CHECK-LABEL: ctlz_zero_undef_nxv32i8:
2397; CHECK:       # %bb.0:
2398; CHECK-NEXT:    vsetvli a0, zero, e8, m4, ta, mu
2399; CHECK-NEXT:    vsrl.vi v12, v8, 1
2400; CHECK-NEXT:    vor.vv v8, v8, v12
2401; CHECK-NEXT:    vsrl.vi v12, v8, 2
2402; CHECK-NEXT:    vor.vv v8, v8, v12
2403; CHECK-NEXT:    vsrl.vi v12, v8, 4
2404; CHECK-NEXT:    vor.vv v8, v8, v12
2405; CHECK-NEXT:    vxor.vi v8, v8, -1
2406; CHECK-NEXT:    vsrl.vi v12, v8, 1
2407; CHECK-NEXT:    li a0, 85
2408; CHECK-NEXT:    vand.vx v12, v12, a0
2409; CHECK-NEXT:    vsub.vv v8, v8, v12
2410; CHECK-NEXT:    li a0, 51
2411; CHECK-NEXT:    vand.vx v12, v8, a0
2412; CHECK-NEXT:    vsrl.vi v8, v8, 2
2413; CHECK-NEXT:    vand.vx v8, v8, a0
2414; CHECK-NEXT:    vadd.vv v8, v12, v8
2415; CHECK-NEXT:    vsrl.vi v12, v8, 4
2416; CHECK-NEXT:    vadd.vv v8, v8, v12
2417; CHECK-NEXT:    vand.vi v8, v8, 15
2418; CHECK-NEXT:    ret
2419  %a = call <vscale x 32 x i8> @llvm.ctlz.nxv32i8(<vscale x 32 x i8> %va, i1 true)
2420  ret <vscale x 32 x i8> %a
2421}
2422
2423define <vscale x 64 x i8> @ctlz_zero_undef_nxv64i8(<vscale x 64 x i8> %va) {
2424; CHECK-LABEL: ctlz_zero_undef_nxv64i8:
2425; CHECK:       # %bb.0:
2426; CHECK-NEXT:    vsetvli a0, zero, e8, m8, ta, mu
2427; CHECK-NEXT:    vsrl.vi v16, v8, 1
2428; CHECK-NEXT:    vor.vv v8, v8, v16
2429; CHECK-NEXT:    vsrl.vi v16, v8, 2
2430; CHECK-NEXT:    vor.vv v8, v8, v16
2431; CHECK-NEXT:    vsrl.vi v16, v8, 4
2432; CHECK-NEXT:    vor.vv v8, v8, v16
2433; CHECK-NEXT:    vxor.vi v8, v8, -1
2434; CHECK-NEXT:    vsrl.vi v16, v8, 1
2435; CHECK-NEXT:    li a0, 85
2436; CHECK-NEXT:    vand.vx v16, v16, a0
2437; CHECK-NEXT:    vsub.vv v8, v8, v16
2438; CHECK-NEXT:    li a0, 51
2439; CHECK-NEXT:    vand.vx v16, v8, a0
2440; CHECK-NEXT:    vsrl.vi v8, v8, 2
2441; CHECK-NEXT:    vand.vx v8, v8, a0
2442; CHECK-NEXT:    vadd.vv v8, v16, v8
2443; CHECK-NEXT:    vsrl.vi v16, v8, 4
2444; CHECK-NEXT:    vadd.vv v8, v8, v16
2445; CHECK-NEXT:    vand.vi v8, v8, 15
2446; CHECK-NEXT:    ret
2447  %a = call <vscale x 64 x i8> @llvm.ctlz.nxv64i8(<vscale x 64 x i8> %va, i1 true)
2448  ret <vscale x 64 x i8> %a
2449}
2450
2451define <vscale x 1 x i16> @ctlz_zero_undef_nxv1i16(<vscale x 1 x i16> %va) {
2452; RV32I-LABEL: ctlz_zero_undef_nxv1i16:
2453; RV32I:       # %bb.0:
2454; RV32I-NEXT:    vsetvli a0, zero, e16, mf4, ta, mu
2455; RV32I-NEXT:    vsrl.vi v9, v8, 1
2456; RV32I-NEXT:    vor.vv v8, v8, v9
2457; RV32I-NEXT:    vsrl.vi v9, v8, 2
2458; RV32I-NEXT:    vor.vv v8, v8, v9
2459; RV32I-NEXT:    vsrl.vi v9, v8, 4
2460; RV32I-NEXT:    vor.vv v8, v8, v9
2461; RV32I-NEXT:    vsrl.vi v9, v8, 8
2462; RV32I-NEXT:    vor.vv v8, v8, v9
2463; RV32I-NEXT:    vxor.vi v8, v8, -1
2464; RV32I-NEXT:    vsrl.vi v9, v8, 1
2465; RV32I-NEXT:    lui a0, 5
2466; RV32I-NEXT:    addi a0, a0, 1365
2467; RV32I-NEXT:    vand.vx v9, v9, a0
2468; RV32I-NEXT:    vsub.vv v8, v8, v9
2469; RV32I-NEXT:    lui a0, 3
2470; RV32I-NEXT:    addi a0, a0, 819
2471; RV32I-NEXT:    vand.vx v9, v8, a0
2472; RV32I-NEXT:    vsrl.vi v8, v8, 2
2473; RV32I-NEXT:    vand.vx v8, v8, a0
2474; RV32I-NEXT:    vadd.vv v8, v9, v8
2475; RV32I-NEXT:    vsrl.vi v9, v8, 4
2476; RV32I-NEXT:    vadd.vv v8, v8, v9
2477; RV32I-NEXT:    lui a0, 1
2478; RV32I-NEXT:    addi a0, a0, -241
2479; RV32I-NEXT:    vand.vx v8, v8, a0
2480; RV32I-NEXT:    li a0, 257
2481; RV32I-NEXT:    vmul.vx v8, v8, a0
2482; RV32I-NEXT:    vsrl.vi v8, v8, 8
2483; RV32I-NEXT:    ret
2484;
2485; RV64I-LABEL: ctlz_zero_undef_nxv1i16:
2486; RV64I:       # %bb.0:
2487; RV64I-NEXT:    vsetvli a0, zero, e16, mf4, ta, mu
2488; RV64I-NEXT:    vsrl.vi v9, v8, 1
2489; RV64I-NEXT:    vor.vv v8, v8, v9
2490; RV64I-NEXT:    vsrl.vi v9, v8, 2
2491; RV64I-NEXT:    vor.vv v8, v8, v9
2492; RV64I-NEXT:    vsrl.vi v9, v8, 4
2493; RV64I-NEXT:    vor.vv v8, v8, v9
2494; RV64I-NEXT:    vsrl.vi v9, v8, 8
2495; RV64I-NEXT:    vor.vv v8, v8, v9
2496; RV64I-NEXT:    vxor.vi v8, v8, -1
2497; RV64I-NEXT:    vsrl.vi v9, v8, 1
2498; RV64I-NEXT:    lui a0, 5
2499; RV64I-NEXT:    addiw a0, a0, 1365
2500; RV64I-NEXT:    vand.vx v9, v9, a0
2501; RV64I-NEXT:    vsub.vv v8, v8, v9
2502; RV64I-NEXT:    lui a0, 3
2503; RV64I-NEXT:    addiw a0, a0, 819
2504; RV64I-NEXT:    vand.vx v9, v8, a0
2505; RV64I-NEXT:    vsrl.vi v8, v8, 2
2506; RV64I-NEXT:    vand.vx v8, v8, a0
2507; RV64I-NEXT:    vadd.vv v8, v9, v8
2508; RV64I-NEXT:    vsrl.vi v9, v8, 4
2509; RV64I-NEXT:    vadd.vv v8, v8, v9
2510; RV64I-NEXT:    lui a0, 1
2511; RV64I-NEXT:    addiw a0, a0, -241
2512; RV64I-NEXT:    vand.vx v8, v8, a0
2513; RV64I-NEXT:    li a0, 257
2514; RV64I-NEXT:    vmul.vx v8, v8, a0
2515; RV64I-NEXT:    vsrl.vi v8, v8, 8
2516; RV64I-NEXT:    ret
2517;
2518; RV32D-LABEL: ctlz_zero_undef_nxv1i16:
2519; RV32D:       # %bb.0:
2520; RV32D-NEXT:    vsetvli a0, zero, e16, mf4, ta, mu
2521; RV32D-NEXT:    vfwcvt.f.xu.v v9, v8
2522; RV32D-NEXT:    vsetvli zero, zero, e32, mf2, ta, mu
2523; RV32D-NEXT:    vsrl.vi v8, v9, 23
2524; RV32D-NEXT:    vsetvli zero, zero, e16, mf4, ta, mu
2525; RV32D-NEXT:    vnsrl.wi v8, v8, 0
2526; RV32D-NEXT:    li a0, 142
2527; RV32D-NEXT:    vrsub.vx v8, v8, a0
2528; RV32D-NEXT:    ret
2529;
2530; RV64D-LABEL: ctlz_zero_undef_nxv1i16:
2531; RV64D:       # %bb.0:
2532; RV64D-NEXT:    vsetvli a0, zero, e16, mf4, ta, mu
2533; RV64D-NEXT:    vfwcvt.f.xu.v v9, v8
2534; RV64D-NEXT:    vsetvli zero, zero, e32, mf2, ta, mu
2535; RV64D-NEXT:    vsrl.vi v8, v9, 23
2536; RV64D-NEXT:    vsetvli zero, zero, e16, mf4, ta, mu
2537; RV64D-NEXT:    vnsrl.wi v8, v8, 0
2538; RV64D-NEXT:    li a0, 142
2539; RV64D-NEXT:    vrsub.vx v8, v8, a0
2540; RV64D-NEXT:    ret
2541  %a = call <vscale x 1 x i16> @llvm.ctlz.nxv1i16(<vscale x 1 x i16> %va, i1 true)
2542  ret <vscale x 1 x i16> %a
2543}
2544
2545define <vscale x 2 x i16> @ctlz_zero_undef_nxv2i16(<vscale x 2 x i16> %va) {
2546; RV32I-LABEL: ctlz_zero_undef_nxv2i16:
2547; RV32I:       # %bb.0:
2548; RV32I-NEXT:    vsetvli a0, zero, e16, mf2, ta, mu
2549; RV32I-NEXT:    vsrl.vi v9, v8, 1
2550; RV32I-NEXT:    vor.vv v8, v8, v9
2551; RV32I-NEXT:    vsrl.vi v9, v8, 2
2552; RV32I-NEXT:    vor.vv v8, v8, v9
2553; RV32I-NEXT:    vsrl.vi v9, v8, 4
2554; RV32I-NEXT:    vor.vv v8, v8, v9
2555; RV32I-NEXT:    vsrl.vi v9, v8, 8
2556; RV32I-NEXT:    vor.vv v8, v8, v9
2557; RV32I-NEXT:    vxor.vi v8, v8, -1
2558; RV32I-NEXT:    vsrl.vi v9, v8, 1
2559; RV32I-NEXT:    lui a0, 5
2560; RV32I-NEXT:    addi a0, a0, 1365
2561; RV32I-NEXT:    vand.vx v9, v9, a0
2562; RV32I-NEXT:    vsub.vv v8, v8, v9
2563; RV32I-NEXT:    lui a0, 3
2564; RV32I-NEXT:    addi a0, a0, 819
2565; RV32I-NEXT:    vand.vx v9, v8, a0
2566; RV32I-NEXT:    vsrl.vi v8, v8, 2
2567; RV32I-NEXT:    vand.vx v8, v8, a0
2568; RV32I-NEXT:    vadd.vv v8, v9, v8
2569; RV32I-NEXT:    vsrl.vi v9, v8, 4
2570; RV32I-NEXT:    vadd.vv v8, v8, v9
2571; RV32I-NEXT:    lui a0, 1
2572; RV32I-NEXT:    addi a0, a0, -241
2573; RV32I-NEXT:    vand.vx v8, v8, a0
2574; RV32I-NEXT:    li a0, 257
2575; RV32I-NEXT:    vmul.vx v8, v8, a0
2576; RV32I-NEXT:    vsrl.vi v8, v8, 8
2577; RV32I-NEXT:    ret
2578;
2579; RV64I-LABEL: ctlz_zero_undef_nxv2i16:
2580; RV64I:       # %bb.0:
2581; RV64I-NEXT:    vsetvli a0, zero, e16, mf2, ta, mu
2582; RV64I-NEXT:    vsrl.vi v9, v8, 1
2583; RV64I-NEXT:    vor.vv v8, v8, v9
2584; RV64I-NEXT:    vsrl.vi v9, v8, 2
2585; RV64I-NEXT:    vor.vv v8, v8, v9
2586; RV64I-NEXT:    vsrl.vi v9, v8, 4
2587; RV64I-NEXT:    vor.vv v8, v8, v9
2588; RV64I-NEXT:    vsrl.vi v9, v8, 8
2589; RV64I-NEXT:    vor.vv v8, v8, v9
2590; RV64I-NEXT:    vxor.vi v8, v8, -1
2591; RV64I-NEXT:    vsrl.vi v9, v8, 1
2592; RV64I-NEXT:    lui a0, 5
2593; RV64I-NEXT:    addiw a0, a0, 1365
2594; RV64I-NEXT:    vand.vx v9, v9, a0
2595; RV64I-NEXT:    vsub.vv v8, v8, v9
2596; RV64I-NEXT:    lui a0, 3
2597; RV64I-NEXT:    addiw a0, a0, 819
2598; RV64I-NEXT:    vand.vx v9, v8, a0
2599; RV64I-NEXT:    vsrl.vi v8, v8, 2
2600; RV64I-NEXT:    vand.vx v8, v8, a0
2601; RV64I-NEXT:    vadd.vv v8, v9, v8
2602; RV64I-NEXT:    vsrl.vi v9, v8, 4
2603; RV64I-NEXT:    vadd.vv v8, v8, v9
2604; RV64I-NEXT:    lui a0, 1
2605; RV64I-NEXT:    addiw a0, a0, -241
2606; RV64I-NEXT:    vand.vx v8, v8, a0
2607; RV64I-NEXT:    li a0, 257
2608; RV64I-NEXT:    vmul.vx v8, v8, a0
2609; RV64I-NEXT:    vsrl.vi v8, v8, 8
2610; RV64I-NEXT:    ret
2611;
2612; RV32D-LABEL: ctlz_zero_undef_nxv2i16:
2613; RV32D:       # %bb.0:
2614; RV32D-NEXT:    vsetvli a0, zero, e16, mf2, ta, mu
2615; RV32D-NEXT:    vfwcvt.f.xu.v v9, v8
2616; RV32D-NEXT:    vsetvli zero, zero, e32, m1, ta, mu
2617; RV32D-NEXT:    vsrl.vi v8, v9, 23
2618; RV32D-NEXT:    vsetvli zero, zero, e16, mf2, ta, mu
2619; RV32D-NEXT:    vnsrl.wi v8, v8, 0
2620; RV32D-NEXT:    li a0, 142
2621; RV32D-NEXT:    vrsub.vx v8, v8, a0
2622; RV32D-NEXT:    ret
2623;
2624; RV64D-LABEL: ctlz_zero_undef_nxv2i16:
2625; RV64D:       # %bb.0:
2626; RV64D-NEXT:    vsetvli a0, zero, e16, mf2, ta, mu
2627; RV64D-NEXT:    vfwcvt.f.xu.v v9, v8
2628; RV64D-NEXT:    vsetvli zero, zero, e32, m1, ta, mu
2629; RV64D-NEXT:    vsrl.vi v8, v9, 23
2630; RV64D-NEXT:    vsetvli zero, zero, e16, mf2, ta, mu
2631; RV64D-NEXT:    vnsrl.wi v8, v8, 0
2632; RV64D-NEXT:    li a0, 142
2633; RV64D-NEXT:    vrsub.vx v8, v8, a0
2634; RV64D-NEXT:    ret
2635  %a = call <vscale x 2 x i16> @llvm.ctlz.nxv2i16(<vscale x 2 x i16> %va, i1 true)
2636  ret <vscale x 2 x i16> %a
2637}
2638
2639define <vscale x 4 x i16> @ctlz_zero_undef_nxv4i16(<vscale x 4 x i16> %va) {
2640; RV32I-LABEL: ctlz_zero_undef_nxv4i16:
2641; RV32I:       # %bb.0:
2642; RV32I-NEXT:    vsetvli a0, zero, e16, m1, ta, mu
2643; RV32I-NEXT:    vsrl.vi v9, v8, 1
2644; RV32I-NEXT:    vor.vv v8, v8, v9
2645; RV32I-NEXT:    vsrl.vi v9, v8, 2
2646; RV32I-NEXT:    vor.vv v8, v8, v9
2647; RV32I-NEXT:    vsrl.vi v9, v8, 4
2648; RV32I-NEXT:    vor.vv v8, v8, v9
2649; RV32I-NEXT:    vsrl.vi v9, v8, 8
2650; RV32I-NEXT:    vor.vv v8, v8, v9
2651; RV32I-NEXT:    vxor.vi v8, v8, -1
2652; RV32I-NEXT:    vsrl.vi v9, v8, 1
2653; RV32I-NEXT:    lui a0, 5
2654; RV32I-NEXT:    addi a0, a0, 1365
2655; RV32I-NEXT:    vand.vx v9, v9, a0
2656; RV32I-NEXT:    vsub.vv v8, v8, v9
2657; RV32I-NEXT:    lui a0, 3
2658; RV32I-NEXT:    addi a0, a0, 819
2659; RV32I-NEXT:    vand.vx v9, v8, a0
2660; RV32I-NEXT:    vsrl.vi v8, v8, 2
2661; RV32I-NEXT:    vand.vx v8, v8, a0
2662; RV32I-NEXT:    vadd.vv v8, v9, v8
2663; RV32I-NEXT:    vsrl.vi v9, v8, 4
2664; RV32I-NEXT:    vadd.vv v8, v8, v9
2665; RV32I-NEXT:    lui a0, 1
2666; RV32I-NEXT:    addi a0, a0, -241
2667; RV32I-NEXT:    vand.vx v8, v8, a0
2668; RV32I-NEXT:    li a0, 257
2669; RV32I-NEXT:    vmul.vx v8, v8, a0
2670; RV32I-NEXT:    vsrl.vi v8, v8, 8
2671; RV32I-NEXT:    ret
2672;
2673; RV64I-LABEL: ctlz_zero_undef_nxv4i16:
2674; RV64I:       # %bb.0:
2675; RV64I-NEXT:    vsetvli a0, zero, e16, m1, ta, mu
2676; RV64I-NEXT:    vsrl.vi v9, v8, 1
2677; RV64I-NEXT:    vor.vv v8, v8, v9
2678; RV64I-NEXT:    vsrl.vi v9, v8, 2
2679; RV64I-NEXT:    vor.vv v8, v8, v9
2680; RV64I-NEXT:    vsrl.vi v9, v8, 4
2681; RV64I-NEXT:    vor.vv v8, v8, v9
2682; RV64I-NEXT:    vsrl.vi v9, v8, 8
2683; RV64I-NEXT:    vor.vv v8, v8, v9
2684; RV64I-NEXT:    vxor.vi v8, v8, -1
2685; RV64I-NEXT:    vsrl.vi v9, v8, 1
2686; RV64I-NEXT:    lui a0, 5
2687; RV64I-NEXT:    addiw a0, a0, 1365
2688; RV64I-NEXT:    vand.vx v9, v9, a0
2689; RV64I-NEXT:    vsub.vv v8, v8, v9
2690; RV64I-NEXT:    lui a0, 3
2691; RV64I-NEXT:    addiw a0, a0, 819
2692; RV64I-NEXT:    vand.vx v9, v8, a0
2693; RV64I-NEXT:    vsrl.vi v8, v8, 2
2694; RV64I-NEXT:    vand.vx v8, v8, a0
2695; RV64I-NEXT:    vadd.vv v8, v9, v8
2696; RV64I-NEXT:    vsrl.vi v9, v8, 4
2697; RV64I-NEXT:    vadd.vv v8, v8, v9
2698; RV64I-NEXT:    lui a0, 1
2699; RV64I-NEXT:    addiw a0, a0, -241
2700; RV64I-NEXT:    vand.vx v8, v8, a0
2701; RV64I-NEXT:    li a0, 257
2702; RV64I-NEXT:    vmul.vx v8, v8, a0
2703; RV64I-NEXT:    vsrl.vi v8, v8, 8
2704; RV64I-NEXT:    ret
2705;
2706; RV32D-LABEL: ctlz_zero_undef_nxv4i16:
2707; RV32D:       # %bb.0:
2708; RV32D-NEXT:    vsetvli a0, zero, e16, m1, ta, mu
2709; RV32D-NEXT:    vfwcvt.f.xu.v v10, v8
2710; RV32D-NEXT:    vsetvli zero, zero, e32, m2, ta, mu
2711; RV32D-NEXT:    vsrl.vi v8, v10, 23
2712; RV32D-NEXT:    vsetvli zero, zero, e16, m1, ta, mu
2713; RV32D-NEXT:    vnsrl.wi v10, v8, 0
2714; RV32D-NEXT:    li a0, 142
2715; RV32D-NEXT:    vrsub.vx v8, v10, a0
2716; RV32D-NEXT:    ret
2717;
2718; RV64D-LABEL: ctlz_zero_undef_nxv4i16:
2719; RV64D:       # %bb.0:
2720; RV64D-NEXT:    vsetvli a0, zero, e16, m1, ta, mu
2721; RV64D-NEXT:    vfwcvt.f.xu.v v10, v8
2722; RV64D-NEXT:    vsetvli zero, zero, e32, m2, ta, mu
2723; RV64D-NEXT:    vsrl.vi v8, v10, 23
2724; RV64D-NEXT:    vsetvli zero, zero, e16, m1, ta, mu
2725; RV64D-NEXT:    vnsrl.wi v10, v8, 0
2726; RV64D-NEXT:    li a0, 142
2727; RV64D-NEXT:    vrsub.vx v8, v10, a0
2728; RV64D-NEXT:    ret
2729  %a = call <vscale x 4 x i16> @llvm.ctlz.nxv4i16(<vscale x 4 x i16> %va, i1 true)
2730  ret <vscale x 4 x i16> %a
2731}
2732
2733define <vscale x 8 x i16> @ctlz_zero_undef_nxv8i16(<vscale x 8 x i16> %va) {
2734; RV32I-LABEL: ctlz_zero_undef_nxv8i16:
2735; RV32I:       # %bb.0:
2736; RV32I-NEXT:    vsetvli a0, zero, e16, m2, ta, mu
2737; RV32I-NEXT:    vsrl.vi v10, v8, 1
2738; RV32I-NEXT:    vor.vv v8, v8, v10
2739; RV32I-NEXT:    vsrl.vi v10, v8, 2
2740; RV32I-NEXT:    vor.vv v8, v8, v10
2741; RV32I-NEXT:    vsrl.vi v10, v8, 4
2742; RV32I-NEXT:    vor.vv v8, v8, v10
2743; RV32I-NEXT:    vsrl.vi v10, v8, 8
2744; RV32I-NEXT:    vor.vv v8, v8, v10
2745; RV32I-NEXT:    vxor.vi v8, v8, -1
2746; RV32I-NEXT:    vsrl.vi v10, v8, 1
2747; RV32I-NEXT:    lui a0, 5
2748; RV32I-NEXT:    addi a0, a0, 1365
2749; RV32I-NEXT:    vand.vx v10, v10, a0
2750; RV32I-NEXT:    vsub.vv v8, v8, v10
2751; RV32I-NEXT:    lui a0, 3
2752; RV32I-NEXT:    addi a0, a0, 819
2753; RV32I-NEXT:    vand.vx v10, v8, a0
2754; RV32I-NEXT:    vsrl.vi v8, v8, 2
2755; RV32I-NEXT:    vand.vx v8, v8, a0
2756; RV32I-NEXT:    vadd.vv v8, v10, v8
2757; RV32I-NEXT:    vsrl.vi v10, v8, 4
2758; RV32I-NEXT:    vadd.vv v8, v8, v10
2759; RV32I-NEXT:    lui a0, 1
2760; RV32I-NEXT:    addi a0, a0, -241
2761; RV32I-NEXT:    vand.vx v8, v8, a0
2762; RV32I-NEXT:    li a0, 257
2763; RV32I-NEXT:    vmul.vx v8, v8, a0
2764; RV32I-NEXT:    vsrl.vi v8, v8, 8
2765; RV32I-NEXT:    ret
2766;
2767; RV64I-LABEL: ctlz_zero_undef_nxv8i16:
2768; RV64I:       # %bb.0:
2769; RV64I-NEXT:    vsetvli a0, zero, e16, m2, ta, mu
2770; RV64I-NEXT:    vsrl.vi v10, v8, 1
2771; RV64I-NEXT:    vor.vv v8, v8, v10
2772; RV64I-NEXT:    vsrl.vi v10, v8, 2
2773; RV64I-NEXT:    vor.vv v8, v8, v10
2774; RV64I-NEXT:    vsrl.vi v10, v8, 4
2775; RV64I-NEXT:    vor.vv v8, v8, v10
2776; RV64I-NEXT:    vsrl.vi v10, v8, 8
2777; RV64I-NEXT:    vor.vv v8, v8, v10
2778; RV64I-NEXT:    vxor.vi v8, v8, -1
2779; RV64I-NEXT:    vsrl.vi v10, v8, 1
2780; RV64I-NEXT:    lui a0, 5
2781; RV64I-NEXT:    addiw a0, a0, 1365
2782; RV64I-NEXT:    vand.vx v10, v10, a0
2783; RV64I-NEXT:    vsub.vv v8, v8, v10
2784; RV64I-NEXT:    lui a0, 3
2785; RV64I-NEXT:    addiw a0, a0, 819
2786; RV64I-NEXT:    vand.vx v10, v8, a0
2787; RV64I-NEXT:    vsrl.vi v8, v8, 2
2788; RV64I-NEXT:    vand.vx v8, v8, a0
2789; RV64I-NEXT:    vadd.vv v8, v10, v8
2790; RV64I-NEXT:    vsrl.vi v10, v8, 4
2791; RV64I-NEXT:    vadd.vv v8, v8, v10
2792; RV64I-NEXT:    lui a0, 1
2793; RV64I-NEXT:    addiw a0, a0, -241
2794; RV64I-NEXT:    vand.vx v8, v8, a0
2795; RV64I-NEXT:    li a0, 257
2796; RV64I-NEXT:    vmul.vx v8, v8, a0
2797; RV64I-NEXT:    vsrl.vi v8, v8, 8
2798; RV64I-NEXT:    ret
2799;
2800; RV32D-LABEL: ctlz_zero_undef_nxv8i16:
2801; RV32D:       # %bb.0:
2802; RV32D-NEXT:    vsetvli a0, zero, e16, m2, ta, mu
2803; RV32D-NEXT:    vfwcvt.f.xu.v v12, v8
2804; RV32D-NEXT:    vsetvli zero, zero, e32, m4, ta, mu
2805; RV32D-NEXT:    vsrl.vi v8, v12, 23
2806; RV32D-NEXT:    vsetvli zero, zero, e16, m2, ta, mu
2807; RV32D-NEXT:    vnsrl.wi v12, v8, 0
2808; RV32D-NEXT:    li a0, 142
2809; RV32D-NEXT:    vrsub.vx v8, v12, a0
2810; RV32D-NEXT:    ret
2811;
2812; RV64D-LABEL: ctlz_zero_undef_nxv8i16:
2813; RV64D:       # %bb.0:
2814; RV64D-NEXT:    vsetvli a0, zero, e16, m2, ta, mu
2815; RV64D-NEXT:    vfwcvt.f.xu.v v12, v8
2816; RV64D-NEXT:    vsetvli zero, zero, e32, m4, ta, mu
2817; RV64D-NEXT:    vsrl.vi v8, v12, 23
2818; RV64D-NEXT:    vsetvli zero, zero, e16, m2, ta, mu
2819; RV64D-NEXT:    vnsrl.wi v12, v8, 0
2820; RV64D-NEXT:    li a0, 142
2821; RV64D-NEXT:    vrsub.vx v8, v12, a0
2822; RV64D-NEXT:    ret
2823  %a = call <vscale x 8 x i16> @llvm.ctlz.nxv8i16(<vscale x 8 x i16> %va, i1 true)
2824  ret <vscale x 8 x i16> %a
2825}
2826
2827define <vscale x 16 x i16> @ctlz_zero_undef_nxv16i16(<vscale x 16 x i16> %va) {
2828; RV32I-LABEL: ctlz_zero_undef_nxv16i16:
2829; RV32I:       # %bb.0:
2830; RV32I-NEXT:    vsetvli a0, zero, e16, m4, ta, mu
2831; RV32I-NEXT:    vsrl.vi v12, v8, 1
2832; RV32I-NEXT:    vor.vv v8, v8, v12
2833; RV32I-NEXT:    vsrl.vi v12, v8, 2
2834; RV32I-NEXT:    vor.vv v8, v8, v12
2835; RV32I-NEXT:    vsrl.vi v12, v8, 4
2836; RV32I-NEXT:    vor.vv v8, v8, v12
2837; RV32I-NEXT:    vsrl.vi v12, v8, 8
2838; RV32I-NEXT:    vor.vv v8, v8, v12
2839; RV32I-NEXT:    vxor.vi v8, v8, -1
2840; RV32I-NEXT:    vsrl.vi v12, v8, 1
2841; RV32I-NEXT:    lui a0, 5
2842; RV32I-NEXT:    addi a0, a0, 1365
2843; RV32I-NEXT:    vand.vx v12, v12, a0
2844; RV32I-NEXT:    vsub.vv v8, v8, v12
2845; RV32I-NEXT:    lui a0, 3
2846; RV32I-NEXT:    addi a0, a0, 819
2847; RV32I-NEXT:    vand.vx v12, v8, a0
2848; RV32I-NEXT:    vsrl.vi v8, v8, 2
2849; RV32I-NEXT:    vand.vx v8, v8, a0
2850; RV32I-NEXT:    vadd.vv v8, v12, v8
2851; RV32I-NEXT:    vsrl.vi v12, v8, 4
2852; RV32I-NEXT:    vadd.vv v8, v8, v12
2853; RV32I-NEXT:    lui a0, 1
2854; RV32I-NEXT:    addi a0, a0, -241
2855; RV32I-NEXT:    vand.vx v8, v8, a0
2856; RV32I-NEXT:    li a0, 257
2857; RV32I-NEXT:    vmul.vx v8, v8, a0
2858; RV32I-NEXT:    vsrl.vi v8, v8, 8
2859; RV32I-NEXT:    ret
2860;
2861; RV64I-LABEL: ctlz_zero_undef_nxv16i16:
2862; RV64I:       # %bb.0:
2863; RV64I-NEXT:    vsetvli a0, zero, e16, m4, ta, mu
2864; RV64I-NEXT:    vsrl.vi v12, v8, 1
2865; RV64I-NEXT:    vor.vv v8, v8, v12
2866; RV64I-NEXT:    vsrl.vi v12, v8, 2
2867; RV64I-NEXT:    vor.vv v8, v8, v12
2868; RV64I-NEXT:    vsrl.vi v12, v8, 4
2869; RV64I-NEXT:    vor.vv v8, v8, v12
2870; RV64I-NEXT:    vsrl.vi v12, v8, 8
2871; RV64I-NEXT:    vor.vv v8, v8, v12
2872; RV64I-NEXT:    vxor.vi v8, v8, -1
2873; RV64I-NEXT:    vsrl.vi v12, v8, 1
2874; RV64I-NEXT:    lui a0, 5
2875; RV64I-NEXT:    addiw a0, a0, 1365
2876; RV64I-NEXT:    vand.vx v12, v12, a0
2877; RV64I-NEXT:    vsub.vv v8, v8, v12
2878; RV64I-NEXT:    lui a0, 3
2879; RV64I-NEXT:    addiw a0, a0, 819
2880; RV64I-NEXT:    vand.vx v12, v8, a0
2881; RV64I-NEXT:    vsrl.vi v8, v8, 2
2882; RV64I-NEXT:    vand.vx v8, v8, a0
2883; RV64I-NEXT:    vadd.vv v8, v12, v8
2884; RV64I-NEXT:    vsrl.vi v12, v8, 4
2885; RV64I-NEXT:    vadd.vv v8, v8, v12
2886; RV64I-NEXT:    lui a0, 1
2887; RV64I-NEXT:    addiw a0, a0, -241
2888; RV64I-NEXT:    vand.vx v8, v8, a0
2889; RV64I-NEXT:    li a0, 257
2890; RV64I-NEXT:    vmul.vx v8, v8, a0
2891; RV64I-NEXT:    vsrl.vi v8, v8, 8
2892; RV64I-NEXT:    ret
2893;
2894; RV32D-LABEL: ctlz_zero_undef_nxv16i16:
2895; RV32D:       # %bb.0:
2896; RV32D-NEXT:    vsetvli a0, zero, e16, m4, ta, mu
2897; RV32D-NEXT:    vfwcvt.f.xu.v v16, v8
2898; RV32D-NEXT:    vsetvli zero, zero, e32, m8, ta, mu
2899; RV32D-NEXT:    vsrl.vi v8, v16, 23
2900; RV32D-NEXT:    vsetvli zero, zero, e16, m4, ta, mu
2901; RV32D-NEXT:    vnsrl.wi v16, v8, 0
2902; RV32D-NEXT:    li a0, 142
2903; RV32D-NEXT:    vrsub.vx v8, v16, a0
2904; RV32D-NEXT:    ret
2905;
2906; RV64D-LABEL: ctlz_zero_undef_nxv16i16:
2907; RV64D:       # %bb.0:
2908; RV64D-NEXT:    vsetvli a0, zero, e16, m4, ta, mu
2909; RV64D-NEXT:    vfwcvt.f.xu.v v16, v8
2910; RV64D-NEXT:    vsetvli zero, zero, e32, m8, ta, mu
2911; RV64D-NEXT:    vsrl.vi v8, v16, 23
2912; RV64D-NEXT:    vsetvli zero, zero, e16, m4, ta, mu
2913; RV64D-NEXT:    vnsrl.wi v16, v8, 0
2914; RV64D-NEXT:    li a0, 142
2915; RV64D-NEXT:    vrsub.vx v8, v16, a0
2916; RV64D-NEXT:    ret
2917  %a = call <vscale x 16 x i16> @llvm.ctlz.nxv16i16(<vscale x 16 x i16> %va, i1 true)
2918  ret <vscale x 16 x i16> %a
2919}
2920
2921define <vscale x 32 x i16> @ctlz_zero_undef_nxv32i16(<vscale x 32 x i16> %va) {
2922; RV32-LABEL: ctlz_zero_undef_nxv32i16:
2923; RV32:       # %bb.0:
2924; RV32-NEXT:    vsetvli a0, zero, e16, m8, ta, mu
2925; RV32-NEXT:    vsrl.vi v16, v8, 1
2926; RV32-NEXT:    vor.vv v8, v8, v16
2927; RV32-NEXT:    vsrl.vi v16, v8, 2
2928; RV32-NEXT:    vor.vv v8, v8, v16
2929; RV32-NEXT:    vsrl.vi v16, v8, 4
2930; RV32-NEXT:    vor.vv v8, v8, v16
2931; RV32-NEXT:    vsrl.vi v16, v8, 8
2932; RV32-NEXT:    vor.vv v8, v8, v16
2933; RV32-NEXT:    vxor.vi v8, v8, -1
2934; RV32-NEXT:    vsrl.vi v16, v8, 1
2935; RV32-NEXT:    lui a0, 5
2936; RV32-NEXT:    addi a0, a0, 1365
2937; RV32-NEXT:    vand.vx v16, v16, a0
2938; RV32-NEXT:    vsub.vv v8, v8, v16
2939; RV32-NEXT:    lui a0, 3
2940; RV32-NEXT:    addi a0, a0, 819
2941; RV32-NEXT:    vand.vx v16, v8, a0
2942; RV32-NEXT:    vsrl.vi v8, v8, 2
2943; RV32-NEXT:    vand.vx v8, v8, a0
2944; RV32-NEXT:    vadd.vv v8, v16, v8
2945; RV32-NEXT:    vsrl.vi v16, v8, 4
2946; RV32-NEXT:    vadd.vv v8, v8, v16
2947; RV32-NEXT:    lui a0, 1
2948; RV32-NEXT:    addi a0, a0, -241
2949; RV32-NEXT:    vand.vx v8, v8, a0
2950; RV32-NEXT:    li a0, 257
2951; RV32-NEXT:    vmul.vx v8, v8, a0
2952; RV32-NEXT:    vsrl.vi v8, v8, 8
2953; RV32-NEXT:    ret
2954;
2955; RV64-LABEL: ctlz_zero_undef_nxv32i16:
2956; RV64:       # %bb.0:
2957; RV64-NEXT:    vsetvli a0, zero, e16, m8, ta, mu
2958; RV64-NEXT:    vsrl.vi v16, v8, 1
2959; RV64-NEXT:    vor.vv v8, v8, v16
2960; RV64-NEXT:    vsrl.vi v16, v8, 2
2961; RV64-NEXT:    vor.vv v8, v8, v16
2962; RV64-NEXT:    vsrl.vi v16, v8, 4
2963; RV64-NEXT:    vor.vv v8, v8, v16
2964; RV64-NEXT:    vsrl.vi v16, v8, 8
2965; RV64-NEXT:    vor.vv v8, v8, v16
2966; RV64-NEXT:    vxor.vi v8, v8, -1
2967; RV64-NEXT:    vsrl.vi v16, v8, 1
2968; RV64-NEXT:    lui a0, 5
2969; RV64-NEXT:    addiw a0, a0, 1365
2970; RV64-NEXT:    vand.vx v16, v16, a0
2971; RV64-NEXT:    vsub.vv v8, v8, v16
2972; RV64-NEXT:    lui a0, 3
2973; RV64-NEXT:    addiw a0, a0, 819
2974; RV64-NEXT:    vand.vx v16, v8, a0
2975; RV64-NEXT:    vsrl.vi v8, v8, 2
2976; RV64-NEXT:    vand.vx v8, v8, a0
2977; RV64-NEXT:    vadd.vv v8, v16, v8
2978; RV64-NEXT:    vsrl.vi v16, v8, 4
2979; RV64-NEXT:    vadd.vv v8, v8, v16
2980; RV64-NEXT:    lui a0, 1
2981; RV64-NEXT:    addiw a0, a0, -241
2982; RV64-NEXT:    vand.vx v8, v8, a0
2983; RV64-NEXT:    li a0, 257
2984; RV64-NEXT:    vmul.vx v8, v8, a0
2985; RV64-NEXT:    vsrl.vi v8, v8, 8
2986; RV64-NEXT:    ret
2987  %a = call <vscale x 32 x i16> @llvm.ctlz.nxv32i16(<vscale x 32 x i16> %va, i1 true)
2988  ret <vscale x 32 x i16> %a
2989}
2990
2991define <vscale x 1 x i32> @ctlz_zero_undef_nxv1i32(<vscale x 1 x i32> %va) {
2992; RV32I-LABEL: ctlz_zero_undef_nxv1i32:
2993; RV32I:       # %bb.0:
2994; RV32I-NEXT:    vsetvli a0, zero, e32, mf2, ta, mu
2995; RV32I-NEXT:    vsrl.vi v9, v8, 1
2996; RV32I-NEXT:    vor.vv v8, v8, v9
2997; RV32I-NEXT:    vsrl.vi v9, v8, 2
2998; RV32I-NEXT:    vor.vv v8, v8, v9
2999; RV32I-NEXT:    vsrl.vi v9, v8, 4
3000; RV32I-NEXT:    vor.vv v8, v8, v9
3001; RV32I-NEXT:    vsrl.vi v9, v8, 8
3002; RV32I-NEXT:    vor.vv v8, v8, v9
3003; RV32I-NEXT:    vsrl.vi v9, v8, 16
3004; RV32I-NEXT:    vor.vv v8, v8, v9
3005; RV32I-NEXT:    vxor.vi v8, v8, -1
3006; RV32I-NEXT:    vsrl.vi v9, v8, 1
3007; RV32I-NEXT:    lui a0, 349525
3008; RV32I-NEXT:    addi a0, a0, 1365
3009; RV32I-NEXT:    vand.vx v9, v9, a0
3010; RV32I-NEXT:    vsub.vv v8, v8, v9
3011; RV32I-NEXT:    lui a0, 209715
3012; RV32I-NEXT:    addi a0, a0, 819
3013; RV32I-NEXT:    vand.vx v9, v8, a0
3014; RV32I-NEXT:    vsrl.vi v8, v8, 2
3015; RV32I-NEXT:    vand.vx v8, v8, a0
3016; RV32I-NEXT:    vadd.vv v8, v9, v8
3017; RV32I-NEXT:    vsrl.vi v9, v8, 4
3018; RV32I-NEXT:    vadd.vv v8, v8, v9
3019; RV32I-NEXT:    lui a0, 61681
3020; RV32I-NEXT:    addi a0, a0, -241
3021; RV32I-NEXT:    vand.vx v8, v8, a0
3022; RV32I-NEXT:    lui a0, 4112
3023; RV32I-NEXT:    addi a0, a0, 257
3024; RV32I-NEXT:    vmul.vx v8, v8, a0
3025; RV32I-NEXT:    vsrl.vi v8, v8, 24
3026; RV32I-NEXT:    ret
3027;
3028; RV64I-LABEL: ctlz_zero_undef_nxv1i32:
3029; RV64I:       # %bb.0:
3030; RV64I-NEXT:    vsetvli a0, zero, e32, mf2, ta, mu
3031; RV64I-NEXT:    vsrl.vi v9, v8, 1
3032; RV64I-NEXT:    vor.vv v8, v8, v9
3033; RV64I-NEXT:    vsrl.vi v9, v8, 2
3034; RV64I-NEXT:    vor.vv v8, v8, v9
3035; RV64I-NEXT:    vsrl.vi v9, v8, 4
3036; RV64I-NEXT:    vor.vv v8, v8, v9
3037; RV64I-NEXT:    vsrl.vi v9, v8, 8
3038; RV64I-NEXT:    vor.vv v8, v8, v9
3039; RV64I-NEXT:    vsrl.vi v9, v8, 16
3040; RV64I-NEXT:    vor.vv v8, v8, v9
3041; RV64I-NEXT:    vxor.vi v8, v8, -1
3042; RV64I-NEXT:    vsrl.vi v9, v8, 1
3043; RV64I-NEXT:    lui a0, 349525
3044; RV64I-NEXT:    addiw a0, a0, 1365
3045; RV64I-NEXT:    vand.vx v9, v9, a0
3046; RV64I-NEXT:    vsub.vv v8, v8, v9
3047; RV64I-NEXT:    lui a0, 209715
3048; RV64I-NEXT:    addiw a0, a0, 819
3049; RV64I-NEXT:    vand.vx v9, v8, a0
3050; RV64I-NEXT:    vsrl.vi v8, v8, 2
3051; RV64I-NEXT:    vand.vx v8, v8, a0
3052; RV64I-NEXT:    vadd.vv v8, v9, v8
3053; RV64I-NEXT:    vsrl.vi v9, v8, 4
3054; RV64I-NEXT:    vadd.vv v8, v8, v9
3055; RV64I-NEXT:    lui a0, 61681
3056; RV64I-NEXT:    addiw a0, a0, -241
3057; RV64I-NEXT:    vand.vx v8, v8, a0
3058; RV64I-NEXT:    lui a0, 4112
3059; RV64I-NEXT:    addiw a0, a0, 257
3060; RV64I-NEXT:    vmul.vx v8, v8, a0
3061; RV64I-NEXT:    vsrl.vi v8, v8, 24
3062; RV64I-NEXT:    ret
3063;
3064; RV32D-LABEL: ctlz_zero_undef_nxv1i32:
3065; RV32D:       # %bb.0:
3066; RV32D-NEXT:    vsetvli a0, zero, e32, mf2, ta, mu
3067; RV32D-NEXT:    vfwcvt.f.xu.v v9, v8
3068; RV32D-NEXT:    li a0, 52
3069; RV32D-NEXT:    vsetvli zero, zero, e64, m1, ta, mu
3070; RV32D-NEXT:    vsrl.vx v8, v9, a0
3071; RV32D-NEXT:    vsetvli zero, zero, e32, mf2, ta, mu
3072; RV32D-NEXT:    vnsrl.wi v8, v8, 0
3073; RV32D-NEXT:    li a0, 1054
3074; RV32D-NEXT:    vrsub.vx v8, v8, a0
3075; RV32D-NEXT:    ret
3076;
3077; RV64D-LABEL: ctlz_zero_undef_nxv1i32:
3078; RV64D:       # %bb.0:
3079; RV64D-NEXT:    vsetvli a0, zero, e32, mf2, ta, mu
3080; RV64D-NEXT:    vfwcvt.f.xu.v v9, v8
3081; RV64D-NEXT:    li a0, 52
3082; RV64D-NEXT:    vsetvli zero, zero, e64, m1, ta, mu
3083; RV64D-NEXT:    vsrl.vx v8, v9, a0
3084; RV64D-NEXT:    vsetvli zero, zero, e32, mf2, ta, mu
3085; RV64D-NEXT:    vnsrl.wi v8, v8, 0
3086; RV64D-NEXT:    li a0, 1054
3087; RV64D-NEXT:    vrsub.vx v8, v8, a0
3088; RV64D-NEXT:    ret
3089  %a = call <vscale x 1 x i32> @llvm.ctlz.nxv1i32(<vscale x 1 x i32> %va, i1 true)
3090  ret <vscale x 1 x i32> %a
3091}
3092
3093define <vscale x 2 x i32> @ctlz_zero_undef_nxv2i32(<vscale x 2 x i32> %va) {
3094; RV32I-LABEL: ctlz_zero_undef_nxv2i32:
3095; RV32I:       # %bb.0:
3096; RV32I-NEXT:    vsetvli a0, zero, e32, m1, ta, mu
3097; RV32I-NEXT:    vsrl.vi v9, v8, 1
3098; RV32I-NEXT:    vor.vv v8, v8, v9
3099; RV32I-NEXT:    vsrl.vi v9, v8, 2
3100; RV32I-NEXT:    vor.vv v8, v8, v9
3101; RV32I-NEXT:    vsrl.vi v9, v8, 4
3102; RV32I-NEXT:    vor.vv v8, v8, v9
3103; RV32I-NEXT:    vsrl.vi v9, v8, 8
3104; RV32I-NEXT:    vor.vv v8, v8, v9
3105; RV32I-NEXT:    vsrl.vi v9, v8, 16
3106; RV32I-NEXT:    vor.vv v8, v8, v9
3107; RV32I-NEXT:    vxor.vi v8, v8, -1
3108; RV32I-NEXT:    vsrl.vi v9, v8, 1
3109; RV32I-NEXT:    lui a0, 349525
3110; RV32I-NEXT:    addi a0, a0, 1365
3111; RV32I-NEXT:    vand.vx v9, v9, a0
3112; RV32I-NEXT:    vsub.vv v8, v8, v9
3113; RV32I-NEXT:    lui a0, 209715
3114; RV32I-NEXT:    addi a0, a0, 819
3115; RV32I-NEXT:    vand.vx v9, v8, a0
3116; RV32I-NEXT:    vsrl.vi v8, v8, 2
3117; RV32I-NEXT:    vand.vx v8, v8, a0
3118; RV32I-NEXT:    vadd.vv v8, v9, v8
3119; RV32I-NEXT:    vsrl.vi v9, v8, 4
3120; RV32I-NEXT:    vadd.vv v8, v8, v9
3121; RV32I-NEXT:    lui a0, 61681
3122; RV32I-NEXT:    addi a0, a0, -241
3123; RV32I-NEXT:    vand.vx v8, v8, a0
3124; RV32I-NEXT:    lui a0, 4112
3125; RV32I-NEXT:    addi a0, a0, 257
3126; RV32I-NEXT:    vmul.vx v8, v8, a0
3127; RV32I-NEXT:    vsrl.vi v8, v8, 24
3128; RV32I-NEXT:    ret
3129;
3130; RV64I-LABEL: ctlz_zero_undef_nxv2i32:
3131; RV64I:       # %bb.0:
3132; RV64I-NEXT:    vsetvli a0, zero, e32, m1, ta, mu
3133; RV64I-NEXT:    vsrl.vi v9, v8, 1
3134; RV64I-NEXT:    vor.vv v8, v8, v9
3135; RV64I-NEXT:    vsrl.vi v9, v8, 2
3136; RV64I-NEXT:    vor.vv v8, v8, v9
3137; RV64I-NEXT:    vsrl.vi v9, v8, 4
3138; RV64I-NEXT:    vor.vv v8, v8, v9
3139; RV64I-NEXT:    vsrl.vi v9, v8, 8
3140; RV64I-NEXT:    vor.vv v8, v8, v9
3141; RV64I-NEXT:    vsrl.vi v9, v8, 16
3142; RV64I-NEXT:    vor.vv v8, v8, v9
3143; RV64I-NEXT:    vxor.vi v8, v8, -1
3144; RV64I-NEXT:    vsrl.vi v9, v8, 1
3145; RV64I-NEXT:    lui a0, 349525
3146; RV64I-NEXT:    addiw a0, a0, 1365
3147; RV64I-NEXT:    vand.vx v9, v9, a0
3148; RV64I-NEXT:    vsub.vv v8, v8, v9
3149; RV64I-NEXT:    lui a0, 209715
3150; RV64I-NEXT:    addiw a0, a0, 819
3151; RV64I-NEXT:    vand.vx v9, v8, a0
3152; RV64I-NEXT:    vsrl.vi v8, v8, 2
3153; RV64I-NEXT:    vand.vx v8, v8, a0
3154; RV64I-NEXT:    vadd.vv v8, v9, v8
3155; RV64I-NEXT:    vsrl.vi v9, v8, 4
3156; RV64I-NEXT:    vadd.vv v8, v8, v9
3157; RV64I-NEXT:    lui a0, 61681
3158; RV64I-NEXT:    addiw a0, a0, -241
3159; RV64I-NEXT:    vand.vx v8, v8, a0
3160; RV64I-NEXT:    lui a0, 4112
3161; RV64I-NEXT:    addiw a0, a0, 257
3162; RV64I-NEXT:    vmul.vx v8, v8, a0
3163; RV64I-NEXT:    vsrl.vi v8, v8, 24
3164; RV64I-NEXT:    ret
3165;
3166; RV32D-LABEL: ctlz_zero_undef_nxv2i32:
3167; RV32D:       # %bb.0:
3168; RV32D-NEXT:    vsetvli a0, zero, e32, m1, ta, mu
3169; RV32D-NEXT:    vfwcvt.f.xu.v v10, v8
3170; RV32D-NEXT:    li a0, 52
3171; RV32D-NEXT:    vsetvli zero, zero, e64, m2, ta, mu
3172; RV32D-NEXT:    vsrl.vx v8, v10, a0
3173; RV32D-NEXT:    vsetvli zero, zero, e32, m1, ta, mu
3174; RV32D-NEXT:    vnsrl.wi v10, v8, 0
3175; RV32D-NEXT:    li a0, 1054
3176; RV32D-NEXT:    vrsub.vx v8, v10, a0
3177; RV32D-NEXT:    ret
3178;
3179; RV64D-LABEL: ctlz_zero_undef_nxv2i32:
3180; RV64D:       # %bb.0:
3181; RV64D-NEXT:    vsetvli a0, zero, e32, m1, ta, mu
3182; RV64D-NEXT:    vfwcvt.f.xu.v v10, v8
3183; RV64D-NEXT:    li a0, 52
3184; RV64D-NEXT:    vsetvli zero, zero, e64, m2, ta, mu
3185; RV64D-NEXT:    vsrl.vx v8, v10, a0
3186; RV64D-NEXT:    vsetvli zero, zero, e32, m1, ta, mu
3187; RV64D-NEXT:    vnsrl.wi v10, v8, 0
3188; RV64D-NEXT:    li a0, 1054
3189; RV64D-NEXT:    vrsub.vx v8, v10, a0
3190; RV64D-NEXT:    ret
3191  %a = call <vscale x 2 x i32> @llvm.ctlz.nxv2i32(<vscale x 2 x i32> %va, i1 true)
3192  ret <vscale x 2 x i32> %a
3193}
3194
3195define <vscale x 4 x i32> @ctlz_zero_undef_nxv4i32(<vscale x 4 x i32> %va) {
3196; RV32I-LABEL: ctlz_zero_undef_nxv4i32:
3197; RV32I:       # %bb.0:
3198; RV32I-NEXT:    vsetvli a0, zero, e32, m2, ta, mu
3199; RV32I-NEXT:    vsrl.vi v10, v8, 1
3200; RV32I-NEXT:    vor.vv v8, v8, v10
3201; RV32I-NEXT:    vsrl.vi v10, v8, 2
3202; RV32I-NEXT:    vor.vv v8, v8, v10
3203; RV32I-NEXT:    vsrl.vi v10, v8, 4
3204; RV32I-NEXT:    vor.vv v8, v8, v10
3205; RV32I-NEXT:    vsrl.vi v10, v8, 8
3206; RV32I-NEXT:    vor.vv v8, v8, v10
3207; RV32I-NEXT:    vsrl.vi v10, v8, 16
3208; RV32I-NEXT:    vor.vv v8, v8, v10
3209; RV32I-NEXT:    vxor.vi v8, v8, -1
3210; RV32I-NEXT:    vsrl.vi v10, v8, 1
3211; RV32I-NEXT:    lui a0, 349525
3212; RV32I-NEXT:    addi a0, a0, 1365
3213; RV32I-NEXT:    vand.vx v10, v10, a0
3214; RV32I-NEXT:    vsub.vv v8, v8, v10
3215; RV32I-NEXT:    lui a0, 209715
3216; RV32I-NEXT:    addi a0, a0, 819
3217; RV32I-NEXT:    vand.vx v10, v8, a0
3218; RV32I-NEXT:    vsrl.vi v8, v8, 2
3219; RV32I-NEXT:    vand.vx v8, v8, a0
3220; RV32I-NEXT:    vadd.vv v8, v10, v8
3221; RV32I-NEXT:    vsrl.vi v10, v8, 4
3222; RV32I-NEXT:    vadd.vv v8, v8, v10
3223; RV32I-NEXT:    lui a0, 61681
3224; RV32I-NEXT:    addi a0, a0, -241
3225; RV32I-NEXT:    vand.vx v8, v8, a0
3226; RV32I-NEXT:    lui a0, 4112
3227; RV32I-NEXT:    addi a0, a0, 257
3228; RV32I-NEXT:    vmul.vx v8, v8, a0
3229; RV32I-NEXT:    vsrl.vi v8, v8, 24
3230; RV32I-NEXT:    ret
3231;
3232; RV64I-LABEL: ctlz_zero_undef_nxv4i32:
3233; RV64I:       # %bb.0:
3234; RV64I-NEXT:    vsetvli a0, zero, e32, m2, ta, mu
3235; RV64I-NEXT:    vsrl.vi v10, v8, 1
3236; RV64I-NEXT:    vor.vv v8, v8, v10
3237; RV64I-NEXT:    vsrl.vi v10, v8, 2
3238; RV64I-NEXT:    vor.vv v8, v8, v10
3239; RV64I-NEXT:    vsrl.vi v10, v8, 4
3240; RV64I-NEXT:    vor.vv v8, v8, v10
3241; RV64I-NEXT:    vsrl.vi v10, v8, 8
3242; RV64I-NEXT:    vor.vv v8, v8, v10
3243; RV64I-NEXT:    vsrl.vi v10, v8, 16
3244; RV64I-NEXT:    vor.vv v8, v8, v10
3245; RV64I-NEXT:    vxor.vi v8, v8, -1
3246; RV64I-NEXT:    vsrl.vi v10, v8, 1
3247; RV64I-NEXT:    lui a0, 349525
3248; RV64I-NEXT:    addiw a0, a0, 1365
3249; RV64I-NEXT:    vand.vx v10, v10, a0
3250; RV64I-NEXT:    vsub.vv v8, v8, v10
3251; RV64I-NEXT:    lui a0, 209715
3252; RV64I-NEXT:    addiw a0, a0, 819
3253; RV64I-NEXT:    vand.vx v10, v8, a0
3254; RV64I-NEXT:    vsrl.vi v8, v8, 2
3255; RV64I-NEXT:    vand.vx v8, v8, a0
3256; RV64I-NEXT:    vadd.vv v8, v10, v8
3257; RV64I-NEXT:    vsrl.vi v10, v8, 4
3258; RV64I-NEXT:    vadd.vv v8, v8, v10
3259; RV64I-NEXT:    lui a0, 61681
3260; RV64I-NEXT:    addiw a0, a0, -241
3261; RV64I-NEXT:    vand.vx v8, v8, a0
3262; RV64I-NEXT:    lui a0, 4112
3263; RV64I-NEXT:    addiw a0, a0, 257
3264; RV64I-NEXT:    vmul.vx v8, v8, a0
3265; RV64I-NEXT:    vsrl.vi v8, v8, 24
3266; RV64I-NEXT:    ret
3267;
3268; RV32D-LABEL: ctlz_zero_undef_nxv4i32:
3269; RV32D:       # %bb.0:
3270; RV32D-NEXT:    vsetvli a0, zero, e32, m2, ta, mu
3271; RV32D-NEXT:    vfwcvt.f.xu.v v12, v8
3272; RV32D-NEXT:    li a0, 52
3273; RV32D-NEXT:    vsetvli zero, zero, e64, m4, ta, mu
3274; RV32D-NEXT:    vsrl.vx v8, v12, a0
3275; RV32D-NEXT:    vsetvli zero, zero, e32, m2, ta, mu
3276; RV32D-NEXT:    vnsrl.wi v12, v8, 0
3277; RV32D-NEXT:    li a0, 1054
3278; RV32D-NEXT:    vrsub.vx v8, v12, a0
3279; RV32D-NEXT:    ret
3280;
3281; RV64D-LABEL: ctlz_zero_undef_nxv4i32:
3282; RV64D:       # %bb.0:
3283; RV64D-NEXT:    vsetvli a0, zero, e32, m2, ta, mu
3284; RV64D-NEXT:    vfwcvt.f.xu.v v12, v8
3285; RV64D-NEXT:    li a0, 52
3286; RV64D-NEXT:    vsetvli zero, zero, e64, m4, ta, mu
3287; RV64D-NEXT:    vsrl.vx v8, v12, a0
3288; RV64D-NEXT:    vsetvli zero, zero, e32, m2, ta, mu
3289; RV64D-NEXT:    vnsrl.wi v12, v8, 0
3290; RV64D-NEXT:    li a0, 1054
3291; RV64D-NEXT:    vrsub.vx v8, v12, a0
3292; RV64D-NEXT:    ret
3293  %a = call <vscale x 4 x i32> @llvm.ctlz.nxv4i32(<vscale x 4 x i32> %va, i1 true)
3294  ret <vscale x 4 x i32> %a
3295}
3296
3297define <vscale x 8 x i32> @ctlz_zero_undef_nxv8i32(<vscale x 8 x i32> %va) {
3298; RV32I-LABEL: ctlz_zero_undef_nxv8i32:
3299; RV32I:       # %bb.0:
3300; RV32I-NEXT:    vsetvli a0, zero, e32, m4, ta, mu
3301; RV32I-NEXT:    vsrl.vi v12, v8, 1
3302; RV32I-NEXT:    vor.vv v8, v8, v12
3303; RV32I-NEXT:    vsrl.vi v12, v8, 2
3304; RV32I-NEXT:    vor.vv v8, v8, v12
3305; RV32I-NEXT:    vsrl.vi v12, v8, 4
3306; RV32I-NEXT:    vor.vv v8, v8, v12
3307; RV32I-NEXT:    vsrl.vi v12, v8, 8
3308; RV32I-NEXT:    vor.vv v8, v8, v12
3309; RV32I-NEXT:    vsrl.vi v12, v8, 16
3310; RV32I-NEXT:    vor.vv v8, v8, v12
3311; RV32I-NEXT:    vxor.vi v8, v8, -1
3312; RV32I-NEXT:    vsrl.vi v12, v8, 1
3313; RV32I-NEXT:    lui a0, 349525
3314; RV32I-NEXT:    addi a0, a0, 1365
3315; RV32I-NEXT:    vand.vx v12, v12, a0
3316; RV32I-NEXT:    vsub.vv v8, v8, v12
3317; RV32I-NEXT:    lui a0, 209715
3318; RV32I-NEXT:    addi a0, a0, 819
3319; RV32I-NEXT:    vand.vx v12, v8, a0
3320; RV32I-NEXT:    vsrl.vi v8, v8, 2
3321; RV32I-NEXT:    vand.vx v8, v8, a0
3322; RV32I-NEXT:    vadd.vv v8, v12, v8
3323; RV32I-NEXT:    vsrl.vi v12, v8, 4
3324; RV32I-NEXT:    vadd.vv v8, v8, v12
3325; RV32I-NEXT:    lui a0, 61681
3326; RV32I-NEXT:    addi a0, a0, -241
3327; RV32I-NEXT:    vand.vx v8, v8, a0
3328; RV32I-NEXT:    lui a0, 4112
3329; RV32I-NEXT:    addi a0, a0, 257
3330; RV32I-NEXT:    vmul.vx v8, v8, a0
3331; RV32I-NEXT:    vsrl.vi v8, v8, 24
3332; RV32I-NEXT:    ret
3333;
3334; RV64I-LABEL: ctlz_zero_undef_nxv8i32:
3335; RV64I:       # %bb.0:
3336; RV64I-NEXT:    vsetvli a0, zero, e32, m4, ta, mu
3337; RV64I-NEXT:    vsrl.vi v12, v8, 1
3338; RV64I-NEXT:    vor.vv v8, v8, v12
3339; RV64I-NEXT:    vsrl.vi v12, v8, 2
3340; RV64I-NEXT:    vor.vv v8, v8, v12
3341; RV64I-NEXT:    vsrl.vi v12, v8, 4
3342; RV64I-NEXT:    vor.vv v8, v8, v12
3343; RV64I-NEXT:    vsrl.vi v12, v8, 8
3344; RV64I-NEXT:    vor.vv v8, v8, v12
3345; RV64I-NEXT:    vsrl.vi v12, v8, 16
3346; RV64I-NEXT:    vor.vv v8, v8, v12
3347; RV64I-NEXT:    vxor.vi v8, v8, -1
3348; RV64I-NEXT:    vsrl.vi v12, v8, 1
3349; RV64I-NEXT:    lui a0, 349525
3350; RV64I-NEXT:    addiw a0, a0, 1365
3351; RV64I-NEXT:    vand.vx v12, v12, a0
3352; RV64I-NEXT:    vsub.vv v8, v8, v12
3353; RV64I-NEXT:    lui a0, 209715
3354; RV64I-NEXT:    addiw a0, a0, 819
3355; RV64I-NEXT:    vand.vx v12, v8, a0
3356; RV64I-NEXT:    vsrl.vi v8, v8, 2
3357; RV64I-NEXT:    vand.vx v8, v8, a0
3358; RV64I-NEXT:    vadd.vv v8, v12, v8
3359; RV64I-NEXT:    vsrl.vi v12, v8, 4
3360; RV64I-NEXT:    vadd.vv v8, v8, v12
3361; RV64I-NEXT:    lui a0, 61681
3362; RV64I-NEXT:    addiw a0, a0, -241
3363; RV64I-NEXT:    vand.vx v8, v8, a0
3364; RV64I-NEXT:    lui a0, 4112
3365; RV64I-NEXT:    addiw a0, a0, 257
3366; RV64I-NEXT:    vmul.vx v8, v8, a0
3367; RV64I-NEXT:    vsrl.vi v8, v8, 24
3368; RV64I-NEXT:    ret
3369;
3370; RV32D-LABEL: ctlz_zero_undef_nxv8i32:
3371; RV32D:       # %bb.0:
3372; RV32D-NEXT:    vsetvli a0, zero, e32, m4, ta, mu
3373; RV32D-NEXT:    vfwcvt.f.xu.v v16, v8
3374; RV32D-NEXT:    li a0, 52
3375; RV32D-NEXT:    vsetvli zero, zero, e64, m8, ta, mu
3376; RV32D-NEXT:    vsrl.vx v8, v16, a0
3377; RV32D-NEXT:    vsetvli zero, zero, e32, m4, ta, mu
3378; RV32D-NEXT:    vnsrl.wi v16, v8, 0
3379; RV32D-NEXT:    li a0, 1054
3380; RV32D-NEXT:    vrsub.vx v8, v16, a0
3381; RV32D-NEXT:    ret
3382;
3383; RV64D-LABEL: ctlz_zero_undef_nxv8i32:
3384; RV64D:       # %bb.0:
3385; RV64D-NEXT:    vsetvli a0, zero, e32, m4, ta, mu
3386; RV64D-NEXT:    vfwcvt.f.xu.v v16, v8
3387; RV64D-NEXT:    li a0, 52
3388; RV64D-NEXT:    vsetvli zero, zero, e64, m8, ta, mu
3389; RV64D-NEXT:    vsrl.vx v8, v16, a0
3390; RV64D-NEXT:    vsetvli zero, zero, e32, m4, ta, mu
3391; RV64D-NEXT:    vnsrl.wi v16, v8, 0
3392; RV64D-NEXT:    li a0, 1054
3393; RV64D-NEXT:    vrsub.vx v8, v16, a0
3394; RV64D-NEXT:    ret
3395  %a = call <vscale x 8 x i32> @llvm.ctlz.nxv8i32(<vscale x 8 x i32> %va, i1 true)
3396  ret <vscale x 8 x i32> %a
3397}
3398
3399define <vscale x 16 x i32> @ctlz_zero_undef_nxv16i32(<vscale x 16 x i32> %va) {
3400; RV32-LABEL: ctlz_zero_undef_nxv16i32:
3401; RV32:       # %bb.0:
3402; RV32-NEXT:    vsetvli a0, zero, e32, m8, ta, mu
3403; RV32-NEXT:    vsrl.vi v16, v8, 1
3404; RV32-NEXT:    vor.vv v8, v8, v16
3405; RV32-NEXT:    vsrl.vi v16, v8, 2
3406; RV32-NEXT:    vor.vv v8, v8, v16
3407; RV32-NEXT:    vsrl.vi v16, v8, 4
3408; RV32-NEXT:    vor.vv v8, v8, v16
3409; RV32-NEXT:    vsrl.vi v16, v8, 8
3410; RV32-NEXT:    vor.vv v8, v8, v16
3411; RV32-NEXT:    vsrl.vi v16, v8, 16
3412; RV32-NEXT:    vor.vv v8, v8, v16
3413; RV32-NEXT:    vxor.vi v8, v8, -1
3414; RV32-NEXT:    vsrl.vi v16, v8, 1
3415; RV32-NEXT:    lui a0, 349525
3416; RV32-NEXT:    addi a0, a0, 1365
3417; RV32-NEXT:    vand.vx v16, v16, a0
3418; RV32-NEXT:    vsub.vv v8, v8, v16
3419; RV32-NEXT:    lui a0, 209715
3420; RV32-NEXT:    addi a0, a0, 819
3421; RV32-NEXT:    vand.vx v16, v8, a0
3422; RV32-NEXT:    vsrl.vi v8, v8, 2
3423; RV32-NEXT:    vand.vx v8, v8, a0
3424; RV32-NEXT:    vadd.vv v8, v16, v8
3425; RV32-NEXT:    vsrl.vi v16, v8, 4
3426; RV32-NEXT:    vadd.vv v8, v8, v16
3427; RV32-NEXT:    lui a0, 61681
3428; RV32-NEXT:    addi a0, a0, -241
3429; RV32-NEXT:    vand.vx v8, v8, a0
3430; RV32-NEXT:    lui a0, 4112
3431; RV32-NEXT:    addi a0, a0, 257
3432; RV32-NEXT:    vmul.vx v8, v8, a0
3433; RV32-NEXT:    vsrl.vi v8, v8, 24
3434; RV32-NEXT:    ret
3435;
3436; RV64-LABEL: ctlz_zero_undef_nxv16i32:
3437; RV64:       # %bb.0:
3438; RV64-NEXT:    vsetvli a0, zero, e32, m8, ta, mu
3439; RV64-NEXT:    vsrl.vi v16, v8, 1
3440; RV64-NEXT:    vor.vv v8, v8, v16
3441; RV64-NEXT:    vsrl.vi v16, v8, 2
3442; RV64-NEXT:    vor.vv v8, v8, v16
3443; RV64-NEXT:    vsrl.vi v16, v8, 4
3444; RV64-NEXT:    vor.vv v8, v8, v16
3445; RV64-NEXT:    vsrl.vi v16, v8, 8
3446; RV64-NEXT:    vor.vv v8, v8, v16
3447; RV64-NEXT:    vsrl.vi v16, v8, 16
3448; RV64-NEXT:    vor.vv v8, v8, v16
3449; RV64-NEXT:    vxor.vi v8, v8, -1
3450; RV64-NEXT:    vsrl.vi v16, v8, 1
3451; RV64-NEXT:    lui a0, 349525
3452; RV64-NEXT:    addiw a0, a0, 1365
3453; RV64-NEXT:    vand.vx v16, v16, a0
3454; RV64-NEXT:    vsub.vv v8, v8, v16
3455; RV64-NEXT:    lui a0, 209715
3456; RV64-NEXT:    addiw a0, a0, 819
3457; RV64-NEXT:    vand.vx v16, v8, a0
3458; RV64-NEXT:    vsrl.vi v8, v8, 2
3459; RV64-NEXT:    vand.vx v8, v8, a0
3460; RV64-NEXT:    vadd.vv v8, v16, v8
3461; RV64-NEXT:    vsrl.vi v16, v8, 4
3462; RV64-NEXT:    vadd.vv v8, v8, v16
3463; RV64-NEXT:    lui a0, 61681
3464; RV64-NEXT:    addiw a0, a0, -241
3465; RV64-NEXT:    vand.vx v8, v8, a0
3466; RV64-NEXT:    lui a0, 4112
3467; RV64-NEXT:    addiw a0, a0, 257
3468; RV64-NEXT:    vmul.vx v8, v8, a0
3469; RV64-NEXT:    vsrl.vi v8, v8, 24
3470; RV64-NEXT:    ret
3471  %a = call <vscale x 16 x i32> @llvm.ctlz.nxv16i32(<vscale x 16 x i32> %va, i1 true)
3472  ret <vscale x 16 x i32> %a
3473}
3474
3475define <vscale x 1 x i64> @ctlz_zero_undef_nxv1i64(<vscale x 1 x i64> %va) {
3476; RV32-LABEL: ctlz_zero_undef_nxv1i64:
3477; RV32:       # %bb.0:
3478; RV32-NEXT:    addi sp, sp, -16
3479; RV32-NEXT:    .cfi_def_cfa_offset 16
3480; RV32-NEXT:    lui a0, 349525
3481; RV32-NEXT:    addi a0, a0, 1365
3482; RV32-NEXT:    sw a0, 12(sp)
3483; RV32-NEXT:    sw a0, 8(sp)
3484; RV32-NEXT:    lui a0, 209715
3485; RV32-NEXT:    addi a0, a0, 819
3486; RV32-NEXT:    sw a0, 12(sp)
3487; RV32-NEXT:    sw a0, 8(sp)
3488; RV32-NEXT:    lui a0, 61681
3489; RV32-NEXT:    addi a0, a0, -241
3490; RV32-NEXT:    sw a0, 12(sp)
3491; RV32-NEXT:    sw a0, 8(sp)
3492; RV32-NEXT:    lui a0, 4112
3493; RV32-NEXT:    addi a0, a0, 257
3494; RV32-NEXT:    sw a0, 12(sp)
3495; RV32-NEXT:    sw a0, 8(sp)
3496; RV32-NEXT:    vsetvli a0, zero, e64, m1, ta, mu
3497; RV32-NEXT:    vsrl.vi v9, v8, 1
3498; RV32-NEXT:    vor.vv v8, v8, v9
3499; RV32-NEXT:    vsrl.vi v9, v8, 2
3500; RV32-NEXT:    vor.vv v8, v8, v9
3501; RV32-NEXT:    vsrl.vi v9, v8, 4
3502; RV32-NEXT:    vor.vv v8, v8, v9
3503; RV32-NEXT:    vsrl.vi v9, v8, 8
3504; RV32-NEXT:    vor.vv v8, v8, v9
3505; RV32-NEXT:    vsrl.vi v9, v8, 16
3506; RV32-NEXT:    vor.vv v8, v8, v9
3507; RV32-NEXT:    li a0, 32
3508; RV32-NEXT:    vsrl.vx v9, v8, a0
3509; RV32-NEXT:    vor.vv v8, v8, v9
3510; RV32-NEXT:    addi a0, sp, 8
3511; RV32-NEXT:    vlse64.v v9, (a0), zero
3512; RV32-NEXT:    vxor.vi v8, v8, -1
3513; RV32-NEXT:    addi a0, sp, 8
3514; RV32-NEXT:    vlse64.v v10, (a0), zero
3515; RV32-NEXT:    vsrl.vi v11, v8, 1
3516; RV32-NEXT:    vand.vv v9, v11, v9
3517; RV32-NEXT:    vsub.vv v8, v8, v9
3518; RV32-NEXT:    vand.vv v9, v8, v10
3519; RV32-NEXT:    vsrl.vi v8, v8, 2
3520; RV32-NEXT:    vand.vv v8, v8, v10
3521; RV32-NEXT:    vadd.vv v8, v9, v8
3522; RV32-NEXT:    addi a0, sp, 8
3523; RV32-NEXT:    vlse64.v v9, (a0), zero
3524; RV32-NEXT:    addi a0, sp, 8
3525; RV32-NEXT:    vlse64.v v10, (a0), zero
3526; RV32-NEXT:    vsrl.vi v11, v8, 4
3527; RV32-NEXT:    vadd.vv v8, v8, v11
3528; RV32-NEXT:    vand.vv v8, v8, v9
3529; RV32-NEXT:    vmul.vv v8, v8, v10
3530; RV32-NEXT:    li a0, 56
3531; RV32-NEXT:    vsrl.vx v8, v8, a0
3532; RV32-NEXT:    addi sp, sp, 16
3533; RV32-NEXT:    ret
3534;
3535; RV64-LABEL: ctlz_zero_undef_nxv1i64:
3536; RV64:       # %bb.0:
3537; RV64-NEXT:    vsetvli a0, zero, e64, m1, ta, mu
3538; RV64-NEXT:    vsrl.vi v9, v8, 1
3539; RV64-NEXT:    vor.vv v8, v8, v9
3540; RV64-NEXT:    vsrl.vi v9, v8, 2
3541; RV64-NEXT:    vor.vv v8, v8, v9
3542; RV64-NEXT:    vsrl.vi v9, v8, 4
3543; RV64-NEXT:    vor.vv v8, v8, v9
3544; RV64-NEXT:    vsrl.vi v9, v8, 8
3545; RV64-NEXT:    vor.vv v8, v8, v9
3546; RV64-NEXT:    vsrl.vi v9, v8, 16
3547; RV64-NEXT:    vor.vv v8, v8, v9
3548; RV64-NEXT:    li a0, 32
3549; RV64-NEXT:    vsrl.vx v9, v8, a0
3550; RV64-NEXT:    vor.vv v8, v8, v9
3551; RV64-NEXT:    vxor.vi v8, v8, -1
3552; RV64-NEXT:    lui a0, %hi(.LCPI40_0)
3553; RV64-NEXT:    ld a0, %lo(.LCPI40_0)(a0)
3554; RV64-NEXT:    lui a1, %hi(.LCPI40_1)
3555; RV64-NEXT:    ld a1, %lo(.LCPI40_1)(a1)
3556; RV64-NEXT:    vsrl.vi v9, v8, 1
3557; RV64-NEXT:    vand.vx v9, v9, a0
3558; RV64-NEXT:    vsub.vv v8, v8, v9
3559; RV64-NEXT:    vand.vx v9, v8, a1
3560; RV64-NEXT:    vsrl.vi v8, v8, 2
3561; RV64-NEXT:    vand.vx v8, v8, a1
3562; RV64-NEXT:    vadd.vv v8, v9, v8
3563; RV64-NEXT:    lui a0, %hi(.LCPI40_2)
3564; RV64-NEXT:    ld a0, %lo(.LCPI40_2)(a0)
3565; RV64-NEXT:    lui a1, %hi(.LCPI40_3)
3566; RV64-NEXT:    ld a1, %lo(.LCPI40_3)(a1)
3567; RV64-NEXT:    vsrl.vi v9, v8, 4
3568; RV64-NEXT:    vadd.vv v8, v8, v9
3569; RV64-NEXT:    vand.vx v8, v8, a0
3570; RV64-NEXT:    vmul.vx v8, v8, a1
3571; RV64-NEXT:    li a0, 56
3572; RV64-NEXT:    vsrl.vx v8, v8, a0
3573; RV64-NEXT:    ret
3574  %a = call <vscale x 1 x i64> @llvm.ctlz.nxv1i64(<vscale x 1 x i64> %va, i1 true)
3575  ret <vscale x 1 x i64> %a
3576}
3577
3578define <vscale x 2 x i64> @ctlz_zero_undef_nxv2i64(<vscale x 2 x i64> %va) {
3579; RV32-LABEL: ctlz_zero_undef_nxv2i64:
3580; RV32:       # %bb.0:
3581; RV32-NEXT:    addi sp, sp, -16
3582; RV32-NEXT:    .cfi_def_cfa_offset 16
3583; RV32-NEXT:    lui a0, 349525
3584; RV32-NEXT:    addi a0, a0, 1365
3585; RV32-NEXT:    sw a0, 12(sp)
3586; RV32-NEXT:    sw a0, 8(sp)
3587; RV32-NEXT:    lui a0, 209715
3588; RV32-NEXT:    addi a0, a0, 819
3589; RV32-NEXT:    sw a0, 12(sp)
3590; RV32-NEXT:    sw a0, 8(sp)
3591; RV32-NEXT:    lui a0, 61681
3592; RV32-NEXT:    addi a0, a0, -241
3593; RV32-NEXT:    sw a0, 12(sp)
3594; RV32-NEXT:    sw a0, 8(sp)
3595; RV32-NEXT:    lui a0, 4112
3596; RV32-NEXT:    addi a0, a0, 257
3597; RV32-NEXT:    sw a0, 12(sp)
3598; RV32-NEXT:    sw a0, 8(sp)
3599; RV32-NEXT:    vsetvli a0, zero, e64, m2, ta, mu
3600; RV32-NEXT:    vsrl.vi v10, v8, 1
3601; RV32-NEXT:    vor.vv v8, v8, v10
3602; RV32-NEXT:    vsrl.vi v10, v8, 2
3603; RV32-NEXT:    vor.vv v8, v8, v10
3604; RV32-NEXT:    vsrl.vi v10, v8, 4
3605; RV32-NEXT:    vor.vv v8, v8, v10
3606; RV32-NEXT:    vsrl.vi v10, v8, 8
3607; RV32-NEXT:    vor.vv v8, v8, v10
3608; RV32-NEXT:    vsrl.vi v10, v8, 16
3609; RV32-NEXT:    vor.vv v8, v8, v10
3610; RV32-NEXT:    li a0, 32
3611; RV32-NEXT:    vsrl.vx v10, v8, a0
3612; RV32-NEXT:    vor.vv v8, v8, v10
3613; RV32-NEXT:    addi a0, sp, 8
3614; RV32-NEXT:    vlse64.v v10, (a0), zero
3615; RV32-NEXT:    vxor.vi v8, v8, -1
3616; RV32-NEXT:    addi a0, sp, 8
3617; RV32-NEXT:    vlse64.v v12, (a0), zero
3618; RV32-NEXT:    vsrl.vi v14, v8, 1
3619; RV32-NEXT:    vand.vv v10, v14, v10
3620; RV32-NEXT:    vsub.vv v8, v8, v10
3621; RV32-NEXT:    vand.vv v10, v8, v12
3622; RV32-NEXT:    vsrl.vi v8, v8, 2
3623; RV32-NEXT:    vand.vv v8, v8, v12
3624; RV32-NEXT:    vadd.vv v8, v10, v8
3625; RV32-NEXT:    addi a0, sp, 8
3626; RV32-NEXT:    vlse64.v v10, (a0), zero
3627; RV32-NEXT:    addi a0, sp, 8
3628; RV32-NEXT:    vlse64.v v12, (a0), zero
3629; RV32-NEXT:    vsrl.vi v14, v8, 4
3630; RV32-NEXT:    vadd.vv v8, v8, v14
3631; RV32-NEXT:    vand.vv v8, v8, v10
3632; RV32-NEXT:    vmul.vv v8, v8, v12
3633; RV32-NEXT:    li a0, 56
3634; RV32-NEXT:    vsrl.vx v8, v8, a0
3635; RV32-NEXT:    addi sp, sp, 16
3636; RV32-NEXT:    ret
3637;
3638; RV64-LABEL: ctlz_zero_undef_nxv2i64:
3639; RV64:       # %bb.0:
3640; RV64-NEXT:    vsetvli a0, zero, e64, m2, ta, mu
3641; RV64-NEXT:    vsrl.vi v10, v8, 1
3642; RV64-NEXT:    vor.vv v8, v8, v10
3643; RV64-NEXT:    vsrl.vi v10, v8, 2
3644; RV64-NEXT:    vor.vv v8, v8, v10
3645; RV64-NEXT:    vsrl.vi v10, v8, 4
3646; RV64-NEXT:    vor.vv v8, v8, v10
3647; RV64-NEXT:    vsrl.vi v10, v8, 8
3648; RV64-NEXT:    vor.vv v8, v8, v10
3649; RV64-NEXT:    vsrl.vi v10, v8, 16
3650; RV64-NEXT:    vor.vv v8, v8, v10
3651; RV64-NEXT:    li a0, 32
3652; RV64-NEXT:    vsrl.vx v10, v8, a0
3653; RV64-NEXT:    vor.vv v8, v8, v10
3654; RV64-NEXT:    vxor.vi v8, v8, -1
3655; RV64-NEXT:    lui a0, %hi(.LCPI41_0)
3656; RV64-NEXT:    ld a0, %lo(.LCPI41_0)(a0)
3657; RV64-NEXT:    lui a1, %hi(.LCPI41_1)
3658; RV64-NEXT:    ld a1, %lo(.LCPI41_1)(a1)
3659; RV64-NEXT:    vsrl.vi v10, v8, 1
3660; RV64-NEXT:    vand.vx v10, v10, a0
3661; RV64-NEXT:    vsub.vv v8, v8, v10
3662; RV64-NEXT:    vand.vx v10, v8, a1
3663; RV64-NEXT:    vsrl.vi v8, v8, 2
3664; RV64-NEXT:    vand.vx v8, v8, a1
3665; RV64-NEXT:    vadd.vv v8, v10, v8
3666; RV64-NEXT:    lui a0, %hi(.LCPI41_2)
3667; RV64-NEXT:    ld a0, %lo(.LCPI41_2)(a0)
3668; RV64-NEXT:    lui a1, %hi(.LCPI41_3)
3669; RV64-NEXT:    ld a1, %lo(.LCPI41_3)(a1)
3670; RV64-NEXT:    vsrl.vi v10, v8, 4
3671; RV64-NEXT:    vadd.vv v8, v8, v10
3672; RV64-NEXT:    vand.vx v8, v8, a0
3673; RV64-NEXT:    vmul.vx v8, v8, a1
3674; RV64-NEXT:    li a0, 56
3675; RV64-NEXT:    vsrl.vx v8, v8, a0
3676; RV64-NEXT:    ret
3677  %a = call <vscale x 2 x i64> @llvm.ctlz.nxv2i64(<vscale x 2 x i64> %va, i1 true)
3678  ret <vscale x 2 x i64> %a
3679}
3680
3681define <vscale x 4 x i64> @ctlz_zero_undef_nxv4i64(<vscale x 4 x i64> %va) {
3682; RV32-LABEL: ctlz_zero_undef_nxv4i64:
3683; RV32:       # %bb.0:
3684; RV32-NEXT:    addi sp, sp, -16
3685; RV32-NEXT:    .cfi_def_cfa_offset 16
3686; RV32-NEXT:    lui a0, 349525
3687; RV32-NEXT:    addi a0, a0, 1365
3688; RV32-NEXT:    sw a0, 12(sp)
3689; RV32-NEXT:    sw a0, 8(sp)
3690; RV32-NEXT:    lui a0, 209715
3691; RV32-NEXT:    addi a0, a0, 819
3692; RV32-NEXT:    sw a0, 12(sp)
3693; RV32-NEXT:    sw a0, 8(sp)
3694; RV32-NEXT:    lui a0, 61681
3695; RV32-NEXT:    addi a0, a0, -241
3696; RV32-NEXT:    sw a0, 12(sp)
3697; RV32-NEXT:    sw a0, 8(sp)
3698; RV32-NEXT:    lui a0, 4112
3699; RV32-NEXT:    addi a0, a0, 257
3700; RV32-NEXT:    sw a0, 12(sp)
3701; RV32-NEXT:    sw a0, 8(sp)
3702; RV32-NEXT:    vsetvli a0, zero, e64, m4, ta, mu
3703; RV32-NEXT:    vsrl.vi v12, v8, 1
3704; RV32-NEXT:    vor.vv v8, v8, v12
3705; RV32-NEXT:    vsrl.vi v12, v8, 2
3706; RV32-NEXT:    vor.vv v8, v8, v12
3707; RV32-NEXT:    vsrl.vi v12, v8, 4
3708; RV32-NEXT:    vor.vv v8, v8, v12
3709; RV32-NEXT:    vsrl.vi v12, v8, 8
3710; RV32-NEXT:    vor.vv v8, v8, v12
3711; RV32-NEXT:    vsrl.vi v12, v8, 16
3712; RV32-NEXT:    vor.vv v8, v8, v12
3713; RV32-NEXT:    li a0, 32
3714; RV32-NEXT:    vsrl.vx v12, v8, a0
3715; RV32-NEXT:    vor.vv v8, v8, v12
3716; RV32-NEXT:    addi a0, sp, 8
3717; RV32-NEXT:    vlse64.v v12, (a0), zero
3718; RV32-NEXT:    vxor.vi v8, v8, -1
3719; RV32-NEXT:    addi a0, sp, 8
3720; RV32-NEXT:    vlse64.v v16, (a0), zero
3721; RV32-NEXT:    vsrl.vi v20, v8, 1
3722; RV32-NEXT:    vand.vv v12, v20, v12
3723; RV32-NEXT:    vsub.vv v8, v8, v12
3724; RV32-NEXT:    vand.vv v12, v8, v16
3725; RV32-NEXT:    vsrl.vi v8, v8, 2
3726; RV32-NEXT:    vand.vv v8, v8, v16
3727; RV32-NEXT:    vadd.vv v8, v12, v8
3728; RV32-NEXT:    addi a0, sp, 8
3729; RV32-NEXT:    vlse64.v v12, (a0), zero
3730; RV32-NEXT:    addi a0, sp, 8
3731; RV32-NEXT:    vlse64.v v16, (a0), zero
3732; RV32-NEXT:    vsrl.vi v20, v8, 4
3733; RV32-NEXT:    vadd.vv v8, v8, v20
3734; RV32-NEXT:    vand.vv v8, v8, v12
3735; RV32-NEXT:    vmul.vv v8, v8, v16
3736; RV32-NEXT:    li a0, 56
3737; RV32-NEXT:    vsrl.vx v8, v8, a0
3738; RV32-NEXT:    addi sp, sp, 16
3739; RV32-NEXT:    ret
3740;
3741; RV64-LABEL: ctlz_zero_undef_nxv4i64:
3742; RV64:       # %bb.0:
3743; RV64-NEXT:    vsetvli a0, zero, e64, m4, ta, mu
3744; RV64-NEXT:    vsrl.vi v12, v8, 1
3745; RV64-NEXT:    vor.vv v8, v8, v12
3746; RV64-NEXT:    vsrl.vi v12, v8, 2
3747; RV64-NEXT:    vor.vv v8, v8, v12
3748; RV64-NEXT:    vsrl.vi v12, v8, 4
3749; RV64-NEXT:    vor.vv v8, v8, v12
3750; RV64-NEXT:    vsrl.vi v12, v8, 8
3751; RV64-NEXT:    vor.vv v8, v8, v12
3752; RV64-NEXT:    vsrl.vi v12, v8, 16
3753; RV64-NEXT:    vor.vv v8, v8, v12
3754; RV64-NEXT:    li a0, 32
3755; RV64-NEXT:    vsrl.vx v12, v8, a0
3756; RV64-NEXT:    vor.vv v8, v8, v12
3757; RV64-NEXT:    vxor.vi v8, v8, -1
3758; RV64-NEXT:    lui a0, %hi(.LCPI42_0)
3759; RV64-NEXT:    ld a0, %lo(.LCPI42_0)(a0)
3760; RV64-NEXT:    lui a1, %hi(.LCPI42_1)
3761; RV64-NEXT:    ld a1, %lo(.LCPI42_1)(a1)
3762; RV64-NEXT:    vsrl.vi v12, v8, 1
3763; RV64-NEXT:    vand.vx v12, v12, a0
3764; RV64-NEXT:    vsub.vv v8, v8, v12
3765; RV64-NEXT:    vand.vx v12, v8, a1
3766; RV64-NEXT:    vsrl.vi v8, v8, 2
3767; RV64-NEXT:    vand.vx v8, v8, a1
3768; RV64-NEXT:    vadd.vv v8, v12, v8
3769; RV64-NEXT:    lui a0, %hi(.LCPI42_2)
3770; RV64-NEXT:    ld a0, %lo(.LCPI42_2)(a0)
3771; RV64-NEXT:    lui a1, %hi(.LCPI42_3)
3772; RV64-NEXT:    ld a1, %lo(.LCPI42_3)(a1)
3773; RV64-NEXT:    vsrl.vi v12, v8, 4
3774; RV64-NEXT:    vadd.vv v8, v8, v12
3775; RV64-NEXT:    vand.vx v8, v8, a0
3776; RV64-NEXT:    vmul.vx v8, v8, a1
3777; RV64-NEXT:    li a0, 56
3778; RV64-NEXT:    vsrl.vx v8, v8, a0
3779; RV64-NEXT:    ret
3780  %a = call <vscale x 4 x i64> @llvm.ctlz.nxv4i64(<vscale x 4 x i64> %va, i1 true)
3781  ret <vscale x 4 x i64> %a
3782}
3783
3784define <vscale x 8 x i64> @ctlz_zero_undef_nxv8i64(<vscale x 8 x i64> %va) {
3785; RV32-LABEL: ctlz_zero_undef_nxv8i64:
3786; RV32:       # %bb.0:
3787; RV32-NEXT:    addi sp, sp, -16
3788; RV32-NEXT:    .cfi_def_cfa_offset 16
3789; RV32-NEXT:    lui a0, 349525
3790; RV32-NEXT:    addi a0, a0, 1365
3791; RV32-NEXT:    sw a0, 12(sp)
3792; RV32-NEXT:    sw a0, 8(sp)
3793; RV32-NEXT:    lui a0, 209715
3794; RV32-NEXT:    addi a0, a0, 819
3795; RV32-NEXT:    sw a0, 12(sp)
3796; RV32-NEXT:    sw a0, 8(sp)
3797; RV32-NEXT:    lui a0, 61681
3798; RV32-NEXT:    addi a0, a0, -241
3799; RV32-NEXT:    sw a0, 12(sp)
3800; RV32-NEXT:    sw a0, 8(sp)
3801; RV32-NEXT:    lui a0, 4112
3802; RV32-NEXT:    addi a0, a0, 257
3803; RV32-NEXT:    sw a0, 12(sp)
3804; RV32-NEXT:    sw a0, 8(sp)
3805; RV32-NEXT:    vsetvli a0, zero, e64, m8, ta, mu
3806; RV32-NEXT:    vsrl.vi v16, v8, 1
3807; RV32-NEXT:    vor.vv v8, v8, v16
3808; RV32-NEXT:    vsrl.vi v16, v8, 2
3809; RV32-NEXT:    vor.vv v8, v8, v16
3810; RV32-NEXT:    vsrl.vi v16, v8, 4
3811; RV32-NEXT:    vor.vv v8, v8, v16
3812; RV32-NEXT:    vsrl.vi v16, v8, 8
3813; RV32-NEXT:    vor.vv v8, v8, v16
3814; RV32-NEXT:    vsrl.vi v16, v8, 16
3815; RV32-NEXT:    vor.vv v8, v8, v16
3816; RV32-NEXT:    li a0, 32
3817; RV32-NEXT:    vsrl.vx v16, v8, a0
3818; RV32-NEXT:    vor.vv v8, v8, v16
3819; RV32-NEXT:    addi a0, sp, 8
3820; RV32-NEXT:    vlse64.v v16, (a0), zero
3821; RV32-NEXT:    vxor.vi v8, v8, -1
3822; RV32-NEXT:    addi a0, sp, 8
3823; RV32-NEXT:    vlse64.v v24, (a0), zero
3824; RV32-NEXT:    vsrl.vi v0, v8, 1
3825; RV32-NEXT:    vand.vv v16, v0, v16
3826; RV32-NEXT:    vsub.vv v8, v8, v16
3827; RV32-NEXT:    vand.vv v16, v8, v24
3828; RV32-NEXT:    vsrl.vi v8, v8, 2
3829; RV32-NEXT:    vand.vv v8, v8, v24
3830; RV32-NEXT:    vadd.vv v8, v16, v8
3831; RV32-NEXT:    addi a0, sp, 8
3832; RV32-NEXT:    vlse64.v v16, (a0), zero
3833; RV32-NEXT:    addi a0, sp, 8
3834; RV32-NEXT:    vlse64.v v24, (a0), zero
3835; RV32-NEXT:    vsrl.vi v0, v8, 4
3836; RV32-NEXT:    vadd.vv v8, v8, v0
3837; RV32-NEXT:    vand.vv v8, v8, v16
3838; RV32-NEXT:    vmul.vv v8, v8, v24
3839; RV32-NEXT:    li a0, 56
3840; RV32-NEXT:    vsrl.vx v8, v8, a0
3841; RV32-NEXT:    addi sp, sp, 16
3842; RV32-NEXT:    ret
3843;
3844; RV64-LABEL: ctlz_zero_undef_nxv8i64:
3845; RV64:       # %bb.0:
3846; RV64-NEXT:    vsetvli a0, zero, e64, m8, ta, mu
3847; RV64-NEXT:    vsrl.vi v16, v8, 1
3848; RV64-NEXT:    vor.vv v8, v8, v16
3849; RV64-NEXT:    vsrl.vi v16, v8, 2
3850; RV64-NEXT:    vor.vv v8, v8, v16
3851; RV64-NEXT:    vsrl.vi v16, v8, 4
3852; RV64-NEXT:    vor.vv v8, v8, v16
3853; RV64-NEXT:    vsrl.vi v16, v8, 8
3854; RV64-NEXT:    vor.vv v8, v8, v16
3855; RV64-NEXT:    vsrl.vi v16, v8, 16
3856; RV64-NEXT:    vor.vv v8, v8, v16
3857; RV64-NEXT:    li a0, 32
3858; RV64-NEXT:    vsrl.vx v16, v8, a0
3859; RV64-NEXT:    vor.vv v8, v8, v16
3860; RV64-NEXT:    vxor.vi v8, v8, -1
3861; RV64-NEXT:    lui a0, %hi(.LCPI43_0)
3862; RV64-NEXT:    ld a0, %lo(.LCPI43_0)(a0)
3863; RV64-NEXT:    lui a1, %hi(.LCPI43_1)
3864; RV64-NEXT:    ld a1, %lo(.LCPI43_1)(a1)
3865; RV64-NEXT:    vsrl.vi v16, v8, 1
3866; RV64-NEXT:    vand.vx v16, v16, a0
3867; RV64-NEXT:    vsub.vv v8, v8, v16
3868; RV64-NEXT:    vand.vx v16, v8, a1
3869; RV64-NEXT:    vsrl.vi v8, v8, 2
3870; RV64-NEXT:    vand.vx v8, v8, a1
3871; RV64-NEXT:    vadd.vv v8, v16, v8
3872; RV64-NEXT:    lui a0, %hi(.LCPI43_2)
3873; RV64-NEXT:    ld a0, %lo(.LCPI43_2)(a0)
3874; RV64-NEXT:    lui a1, %hi(.LCPI43_3)
3875; RV64-NEXT:    ld a1, %lo(.LCPI43_3)(a1)
3876; RV64-NEXT:    vsrl.vi v16, v8, 4
3877; RV64-NEXT:    vadd.vv v8, v8, v16
3878; RV64-NEXT:    vand.vx v8, v8, a0
3879; RV64-NEXT:    vmul.vx v8, v8, a1
3880; RV64-NEXT:    li a0, 56
3881; RV64-NEXT:    vsrl.vx v8, v8, a0
3882; RV64-NEXT:    ret
3883  %a = call <vscale x 8 x i64> @llvm.ctlz.nxv8i64(<vscale x 8 x i64> %va, i1 true)
3884  ret <vscale x 8 x i64> %a
3885}
3886