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