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