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