xref: /llvm-project/llvm/test/CodeGen/RISCV/rvv/mask-exts-truncs.ll (revision 99fb40d488c9d53dc1dfa0a1791f690523d7e50a)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -mattr=+v \
3; RUN:   -verify-machineinstrs  | FileCheck %s
4; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -mattr=+v \
5; RUN:   -verify-machineinstrs  | FileCheck %s
6
7define <vscale x 1 x i8> @sext_nxv1i1_nxv1i8(<vscale x 1 x i1> %v) {
8; CHECK-LABEL: sext_nxv1i1_nxv1i8:
9; CHECK:       # %bb.0:
10; CHECK-NEXT:    vsetvli a0, zero, e8, mf8, ta, ma
11; CHECK-NEXT:    vmv.v.i v8, 0
12; CHECK-NEXT:    vmerge.vim v8, v8, -1, v0
13; CHECK-NEXT:    ret
14  %r = sext <vscale x 1 x i1> %v to <vscale x 1 x i8>
15  ret <vscale x 1 x i8> %r
16}
17
18define <vscale x 1 x i8> @zext_nxv1i1_nxv1i8(<vscale x 1 x i1> %v) {
19; CHECK-LABEL: zext_nxv1i1_nxv1i8:
20; CHECK:       # %bb.0:
21; CHECK-NEXT:    vsetvli a0, zero, e8, mf8, ta, ma
22; CHECK-NEXT:    vmv.v.i v8, 0
23; CHECK-NEXT:    vmerge.vim v8, v8, 1, v0
24; CHECK-NEXT:    ret
25  %r = zext <vscale x 1 x i1> %v to <vscale x 1 x i8>
26  ret <vscale x 1 x i8> %r
27}
28
29define <vscale x 1 x i1> @trunc_nxv1i8_nxv1i1(<vscale x 1 x i8> %v) {
30; CHECK-LABEL: trunc_nxv1i8_nxv1i1:
31; CHECK:       # %bb.0:
32; CHECK-NEXT:    vsetvli a0, zero, e8, mf8, ta, ma
33; CHECK-NEXT:    vand.vi v8, v8, 1
34; CHECK-NEXT:    vmsne.vi v0, v8, 0
35; CHECK-NEXT:    ret
36  %r = trunc <vscale x 1 x i8> %v to <vscale x 1 x i1>
37  ret <vscale x 1 x i1> %r
38}
39
40define <vscale x 2 x i8> @sext_nxv2i1_nxv2i8(<vscale x 2 x i1> %v) {
41; CHECK-LABEL: sext_nxv2i1_nxv2i8:
42; CHECK:       # %bb.0:
43; CHECK-NEXT:    vsetvli a0, zero, e8, mf4, ta, ma
44; CHECK-NEXT:    vmv.v.i v8, 0
45; CHECK-NEXT:    vmerge.vim v8, v8, -1, v0
46; CHECK-NEXT:    ret
47  %r = sext <vscale x 2 x i1> %v to <vscale x 2 x i8>
48  ret <vscale x 2 x i8> %r
49}
50
51define <vscale x 2 x i8> @zext_nxv2i1_nxv2i8(<vscale x 2 x i1> %v) {
52; CHECK-LABEL: zext_nxv2i1_nxv2i8:
53; CHECK:       # %bb.0:
54; CHECK-NEXT:    vsetvli a0, zero, e8, mf4, ta, ma
55; CHECK-NEXT:    vmv.v.i v8, 0
56; CHECK-NEXT:    vmerge.vim v8, v8, 1, v0
57; CHECK-NEXT:    ret
58  %r = zext <vscale x 2 x i1> %v to <vscale x 2 x i8>
59  ret <vscale x 2 x i8> %r
60}
61
62define <vscale x 2 x i1> @trunc_nxv2i8_nxv2i1(<vscale x 2 x i8> %v) {
63; CHECK-LABEL: trunc_nxv2i8_nxv2i1:
64; CHECK:       # %bb.0:
65; CHECK-NEXT:    vsetvli a0, zero, e8, mf4, ta, ma
66; CHECK-NEXT:    vand.vi v8, v8, 1
67; CHECK-NEXT:    vmsne.vi v0, v8, 0
68; CHECK-NEXT:    ret
69  %r = trunc <vscale x 2 x i8> %v to <vscale x 2 x i1>
70  ret <vscale x 2 x i1> %r
71}
72
73define <vscale x 4 x i8> @sext_nxv4i1_nxv4i8(<vscale x 4 x i1> %v) {
74; CHECK-LABEL: sext_nxv4i1_nxv4i8:
75; CHECK:       # %bb.0:
76; CHECK-NEXT:    vsetvli a0, zero, e8, mf2, ta, ma
77; CHECK-NEXT:    vmv.v.i v8, 0
78; CHECK-NEXT:    vmerge.vim v8, v8, -1, v0
79; CHECK-NEXT:    ret
80  %r = sext <vscale x 4 x i1> %v to <vscale x 4 x i8>
81  ret <vscale x 4 x i8> %r
82}
83
84define <vscale x 4 x i8> @zext_nxv4i1_nxv4i8(<vscale x 4 x i1> %v) {
85; CHECK-LABEL: zext_nxv4i1_nxv4i8:
86; CHECK:       # %bb.0:
87; CHECK-NEXT:    vsetvli a0, zero, e8, mf2, ta, ma
88; CHECK-NEXT:    vmv.v.i v8, 0
89; CHECK-NEXT:    vmerge.vim v8, v8, 1, v0
90; CHECK-NEXT:    ret
91  %r = zext <vscale x 4 x i1> %v to <vscale x 4 x i8>
92  ret <vscale x 4 x i8> %r
93}
94
95define <vscale x 4 x i1> @trunc_nxv4i8_nxv4i1(<vscale x 4 x i8> %v) {
96; CHECK-LABEL: trunc_nxv4i8_nxv4i1:
97; CHECK:       # %bb.0:
98; CHECK-NEXT:    vsetvli a0, zero, e8, mf2, ta, ma
99; CHECK-NEXT:    vand.vi v8, v8, 1
100; CHECK-NEXT:    vmsne.vi v0, v8, 0
101; CHECK-NEXT:    ret
102  %r = trunc <vscale x 4 x i8> %v to <vscale x 4 x i1>
103  ret <vscale x 4 x i1> %r
104}
105
106define <vscale x 8 x i8> @sext_nxv8i1_nxv8i8(<vscale x 8 x i1> %v) {
107; CHECK-LABEL: sext_nxv8i1_nxv8i8:
108; CHECK:       # %bb.0:
109; CHECK-NEXT:    vsetvli a0, zero, e8, m1, ta, ma
110; CHECK-NEXT:    vmv.v.i v8, 0
111; CHECK-NEXT:    vmerge.vim v8, v8, -1, v0
112; CHECK-NEXT:    ret
113  %r = sext <vscale x 8 x i1> %v to <vscale x 8 x i8>
114  ret <vscale x 8 x i8> %r
115}
116
117define <vscale x 8 x i8> @zext_nxv8i1_nxv8i8(<vscale x 8 x i1> %v) {
118; CHECK-LABEL: zext_nxv8i1_nxv8i8:
119; CHECK:       # %bb.0:
120; CHECK-NEXT:    vsetvli a0, zero, e8, m1, ta, ma
121; CHECK-NEXT:    vmv.v.i v8, 0
122; CHECK-NEXT:    vmerge.vim v8, v8, 1, v0
123; CHECK-NEXT:    ret
124  %r = zext <vscale x 8 x i1> %v to <vscale x 8 x i8>
125  ret <vscale x 8 x i8> %r
126}
127
128define <vscale x 8 x i1> @trunc_nxv8i8_nxv8i1(<vscale x 8 x i8> %v) {
129; CHECK-LABEL: trunc_nxv8i8_nxv8i1:
130; CHECK:       # %bb.0:
131; CHECK-NEXT:    vsetvli a0, zero, e8, m1, ta, ma
132; CHECK-NEXT:    vand.vi v8, v8, 1
133; CHECK-NEXT:    vmsne.vi v0, v8, 0
134; CHECK-NEXT:    ret
135  %r = trunc <vscale x 8 x i8> %v to <vscale x 8 x i1>
136  ret <vscale x 8 x i1> %r
137}
138
139define <vscale x 16 x i8> @sext_nxv16i1_nxv16i8(<vscale x 16 x i1> %v) {
140; CHECK-LABEL: sext_nxv16i1_nxv16i8:
141; CHECK:       # %bb.0:
142; CHECK-NEXT:    vsetvli a0, zero, e8, m2, ta, ma
143; CHECK-NEXT:    vmv.v.i v8, 0
144; CHECK-NEXT:    vmerge.vim v8, v8, -1, v0
145; CHECK-NEXT:    ret
146  %r = sext <vscale x 16 x i1> %v to <vscale x 16 x i8>
147  ret <vscale x 16 x i8> %r
148}
149
150define <vscale x 16 x i8> @zext_nxv16i1_nxv16i8(<vscale x 16 x i1> %v) {
151; CHECK-LABEL: zext_nxv16i1_nxv16i8:
152; CHECK:       # %bb.0:
153; CHECK-NEXT:    vsetvli a0, zero, e8, m2, ta, ma
154; CHECK-NEXT:    vmv.v.i v8, 0
155; CHECK-NEXT:    vmerge.vim v8, v8, 1, v0
156; CHECK-NEXT:    ret
157  %r = zext <vscale x 16 x i1> %v to <vscale x 16 x i8>
158  ret <vscale x 16 x i8> %r
159}
160
161define <vscale x 16 x i1> @trunc_nxv16i8_nxv16i1(<vscale x 16 x i8> %v) {
162; CHECK-LABEL: trunc_nxv16i8_nxv16i1:
163; CHECK:       # %bb.0:
164; CHECK-NEXT:    vsetvli a0, zero, e8, m2, ta, ma
165; CHECK-NEXT:    vand.vi v8, v8, 1
166; CHECK-NEXT:    vmsne.vi v0, v8, 0
167; CHECK-NEXT:    ret
168  %r = trunc <vscale x 16 x i8> %v to <vscale x 16 x i1>
169  ret <vscale x 16 x i1> %r
170}
171
172define <vscale x 32 x i8> @sext_nxv32i1_nxv32i8(<vscale x 32 x i1> %v) {
173; CHECK-LABEL: sext_nxv32i1_nxv32i8:
174; CHECK:       # %bb.0:
175; CHECK-NEXT:    vsetvli a0, zero, e8, m4, ta, ma
176; CHECK-NEXT:    vmv.v.i v8, 0
177; CHECK-NEXT:    vmerge.vim v8, v8, -1, v0
178; CHECK-NEXT:    ret
179  %r = sext <vscale x 32 x i1> %v to <vscale x 32 x i8>
180  ret <vscale x 32 x i8> %r
181}
182
183define <vscale x 32 x i8> @zext_nxv32i1_nxv32i8(<vscale x 32 x i1> %v) {
184; CHECK-LABEL: zext_nxv32i1_nxv32i8:
185; CHECK:       # %bb.0:
186; CHECK-NEXT:    vsetvli a0, zero, e8, m4, ta, ma
187; CHECK-NEXT:    vmv.v.i v8, 0
188; CHECK-NEXT:    vmerge.vim v8, v8, 1, v0
189; CHECK-NEXT:    ret
190  %r = zext <vscale x 32 x i1> %v to <vscale x 32 x i8>
191  ret <vscale x 32 x i8> %r
192}
193
194define <vscale x 32 x i1> @trunc_nxv32i8_nxv32i1(<vscale x 32 x i8> %v) {
195; CHECK-LABEL: trunc_nxv32i8_nxv32i1:
196; CHECK:       # %bb.0:
197; CHECK-NEXT:    vsetvli a0, zero, e8, m4, ta, ma
198; CHECK-NEXT:    vand.vi v8, v8, 1
199; CHECK-NEXT:    vmsne.vi v0, v8, 0
200; CHECK-NEXT:    ret
201  %r = trunc <vscale x 32 x i8> %v to <vscale x 32 x i1>
202  ret <vscale x 32 x i1> %r
203}
204
205define <vscale x 64 x i8> @sext_nxv64i1_nxv64i8(<vscale x 64 x i1> %v) {
206; CHECK-LABEL: sext_nxv64i1_nxv64i8:
207; CHECK:       # %bb.0:
208; CHECK-NEXT:    vsetvli a0, zero, e8, m8, ta, ma
209; CHECK-NEXT:    vmv.v.i v8, 0
210; CHECK-NEXT:    vmerge.vim v8, v8, -1, v0
211; CHECK-NEXT:    ret
212  %r = sext <vscale x 64 x i1> %v to <vscale x 64 x i8>
213  ret <vscale x 64 x i8> %r
214}
215
216define <vscale x 64 x i8> @zext_nxv64i1_nxv64i8(<vscale x 64 x i1> %v) {
217; CHECK-LABEL: zext_nxv64i1_nxv64i8:
218; CHECK:       # %bb.0:
219; CHECK-NEXT:    vsetvli a0, zero, e8, m8, ta, ma
220; CHECK-NEXT:    vmv.v.i v8, 0
221; CHECK-NEXT:    vmerge.vim v8, v8, 1, v0
222; CHECK-NEXT:    ret
223  %r = zext <vscale x 64 x i1> %v to <vscale x 64 x i8>
224  ret <vscale x 64 x i8> %r
225}
226
227define <vscale x 64 x i1> @trunc_nxv64i8_nxv64i1(<vscale x 64 x i8> %v) {
228; CHECK-LABEL: trunc_nxv64i8_nxv64i1:
229; CHECK:       # %bb.0:
230; CHECK-NEXT:    vsetvli a0, zero, e8, m8, ta, ma
231; CHECK-NEXT:    vand.vi v8, v8, 1
232; CHECK-NEXT:    vmsne.vi v0, v8, 0
233; CHECK-NEXT:    ret
234  %r = trunc <vscale x 64 x i8> %v to <vscale x 64 x i1>
235  ret <vscale x 64 x i1> %r
236}
237
238define <vscale x 1 x i16> @sext_nxv1i1_nxv1i16(<vscale x 1 x i1> %v) {
239; CHECK-LABEL: sext_nxv1i1_nxv1i16:
240; CHECK:       # %bb.0:
241; CHECK-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
242; CHECK-NEXT:    vmv.v.i v8, 0
243; CHECK-NEXT:    vmerge.vim v8, v8, -1, v0
244; CHECK-NEXT:    ret
245  %r = sext <vscale x 1 x i1> %v to <vscale x 1 x i16>
246  ret <vscale x 1 x i16> %r
247}
248
249define <vscale x 1 x i16> @zext_nxv1i1_nxv1i16(<vscale x 1 x i1> %v) {
250; CHECK-LABEL: zext_nxv1i1_nxv1i16:
251; CHECK:       # %bb.0:
252; CHECK-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
253; CHECK-NEXT:    vmv.v.i v8, 0
254; CHECK-NEXT:    vmerge.vim v8, v8, 1, v0
255; CHECK-NEXT:    ret
256  %r = zext <vscale x 1 x i1> %v to <vscale x 1 x i16>
257  ret <vscale x 1 x i16> %r
258}
259
260define <vscale x 1 x i1> @trunc_nxv1i16_nxv1i1(<vscale x 1 x i16> %v) {
261; CHECK-LABEL: trunc_nxv1i16_nxv1i1:
262; CHECK:       # %bb.0:
263; CHECK-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
264; CHECK-NEXT:    vand.vi v8, v8, 1
265; CHECK-NEXT:    vmsne.vi v0, v8, 0
266; CHECK-NEXT:    ret
267  %r = trunc <vscale x 1 x i16> %v to <vscale x 1 x i1>
268  ret <vscale x 1 x i1> %r
269}
270
271define <vscale x 2 x i16> @sext_nxv2i1_nxv2i16(<vscale x 2 x i1> %v) {
272; CHECK-LABEL: sext_nxv2i1_nxv2i16:
273; CHECK:       # %bb.0:
274; CHECK-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
275; CHECK-NEXT:    vmv.v.i v8, 0
276; CHECK-NEXT:    vmerge.vim v8, v8, -1, v0
277; CHECK-NEXT:    ret
278  %r = sext <vscale x 2 x i1> %v to <vscale x 2 x i16>
279  ret <vscale x 2 x i16> %r
280}
281
282define <vscale x 2 x i16> @zext_nxv2i1_nxv2i16(<vscale x 2 x i1> %v) {
283; CHECK-LABEL: zext_nxv2i1_nxv2i16:
284; CHECK:       # %bb.0:
285; CHECK-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
286; CHECK-NEXT:    vmv.v.i v8, 0
287; CHECK-NEXT:    vmerge.vim v8, v8, 1, v0
288; CHECK-NEXT:    ret
289  %r = zext <vscale x 2 x i1> %v to <vscale x 2 x i16>
290  ret <vscale x 2 x i16> %r
291}
292
293define <vscale x 2 x i1> @trunc_nxv2i16_nxv2i1(<vscale x 2 x i16> %v) {
294; CHECK-LABEL: trunc_nxv2i16_nxv2i1:
295; CHECK:       # %bb.0:
296; CHECK-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
297; CHECK-NEXT:    vand.vi v8, v8, 1
298; CHECK-NEXT:    vmsne.vi v0, v8, 0
299; CHECK-NEXT:    ret
300  %r = trunc <vscale x 2 x i16> %v to <vscale x 2 x i1>
301  ret <vscale x 2 x i1> %r
302}
303
304define <vscale x 4 x i16> @sext_nxv4i1_nxv4i16(<vscale x 4 x i1> %v) {
305; CHECK-LABEL: sext_nxv4i1_nxv4i16:
306; CHECK:       # %bb.0:
307; CHECK-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
308; CHECK-NEXT:    vmv.v.i v8, 0
309; CHECK-NEXT:    vmerge.vim v8, v8, -1, v0
310; CHECK-NEXT:    ret
311  %r = sext <vscale x 4 x i1> %v to <vscale x 4 x i16>
312  ret <vscale x 4 x i16> %r
313}
314
315define <vscale x 4 x i16> @zext_nxv4i1_nxv4i16(<vscale x 4 x i1> %v) {
316; CHECK-LABEL: zext_nxv4i1_nxv4i16:
317; CHECK:       # %bb.0:
318; CHECK-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
319; CHECK-NEXT:    vmv.v.i v8, 0
320; CHECK-NEXT:    vmerge.vim v8, v8, 1, v0
321; CHECK-NEXT:    ret
322  %r = zext <vscale x 4 x i1> %v to <vscale x 4 x i16>
323  ret <vscale x 4 x i16> %r
324}
325
326define <vscale x 4 x i1> @trunc_nxv4i16_nxv4i1(<vscale x 4 x i16> %v) {
327; CHECK-LABEL: trunc_nxv4i16_nxv4i1:
328; CHECK:       # %bb.0:
329; CHECK-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
330; CHECK-NEXT:    vand.vi v8, v8, 1
331; CHECK-NEXT:    vmsne.vi v0, v8, 0
332; CHECK-NEXT:    ret
333  %r = trunc <vscale x 4 x i16> %v to <vscale x 4 x i1>
334  ret <vscale x 4 x i1> %r
335}
336
337define <vscale x 8 x i16> @sext_nxv8i1_nxv8i16(<vscale x 8 x i1> %v) {
338; CHECK-LABEL: sext_nxv8i1_nxv8i16:
339; CHECK:       # %bb.0:
340; CHECK-NEXT:    vsetvli a0, zero, e16, m2, ta, ma
341; CHECK-NEXT:    vmv.v.i v8, 0
342; CHECK-NEXT:    vmerge.vim v8, v8, -1, v0
343; CHECK-NEXT:    ret
344  %r = sext <vscale x 8 x i1> %v to <vscale x 8 x i16>
345  ret <vscale x 8 x i16> %r
346}
347
348define <vscale x 8 x i16> @zext_nxv8i1_nxv8i16(<vscale x 8 x i1> %v) {
349; CHECK-LABEL: zext_nxv8i1_nxv8i16:
350; CHECK:       # %bb.0:
351; CHECK-NEXT:    vsetvli a0, zero, e16, m2, ta, ma
352; CHECK-NEXT:    vmv.v.i v8, 0
353; CHECK-NEXT:    vmerge.vim v8, v8, 1, v0
354; CHECK-NEXT:    ret
355  %r = zext <vscale x 8 x i1> %v to <vscale x 8 x i16>
356  ret <vscale x 8 x i16> %r
357}
358
359define <vscale x 8 x i1> @trunc_nxv8i16_nxv8i1(<vscale x 8 x i16> %v) {
360; CHECK-LABEL: trunc_nxv8i16_nxv8i1:
361; CHECK:       # %bb.0:
362; CHECK-NEXT:    vsetvli a0, zero, e16, m2, ta, ma
363; CHECK-NEXT:    vand.vi v8, v8, 1
364; CHECK-NEXT:    vmsne.vi v0, v8, 0
365; CHECK-NEXT:    ret
366  %r = trunc <vscale x 8 x i16> %v to <vscale x 8 x i1>
367  ret <vscale x 8 x i1> %r
368}
369
370define <vscale x 16 x i16> @sext_nxv16i1_nxv16i16(<vscale x 16 x i1> %v) {
371; CHECK-LABEL: sext_nxv16i1_nxv16i16:
372; CHECK:       # %bb.0:
373; CHECK-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
374; CHECK-NEXT:    vmv.v.i v8, 0
375; CHECK-NEXT:    vmerge.vim v8, v8, -1, v0
376; CHECK-NEXT:    ret
377  %r = sext <vscale x 16 x i1> %v to <vscale x 16 x i16>
378  ret <vscale x 16 x i16> %r
379}
380
381define <vscale x 16 x i16> @zext_nxv16i1_nxv16i16(<vscale x 16 x i1> %v) {
382; CHECK-LABEL: zext_nxv16i1_nxv16i16:
383; CHECK:       # %bb.0:
384; CHECK-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
385; CHECK-NEXT:    vmv.v.i v8, 0
386; CHECK-NEXT:    vmerge.vim v8, v8, 1, v0
387; CHECK-NEXT:    ret
388  %r = zext <vscale x 16 x i1> %v to <vscale x 16 x i16>
389  ret <vscale x 16 x i16> %r
390}
391
392define <vscale x 16 x i1> @trunc_nxv16i16_nxv16i1(<vscale x 16 x i16> %v) {
393; CHECK-LABEL: trunc_nxv16i16_nxv16i1:
394; CHECK:       # %bb.0:
395; CHECK-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
396; CHECK-NEXT:    vand.vi v8, v8, 1
397; CHECK-NEXT:    vmsne.vi v0, v8, 0
398; CHECK-NEXT:    ret
399  %r = trunc <vscale x 16 x i16> %v to <vscale x 16 x i1>
400  ret <vscale x 16 x i1> %r
401}
402
403define <vscale x 32 x i16> @sext_nxv32i1_nxv32i16(<vscale x 32 x i1> %v) {
404; CHECK-LABEL: sext_nxv32i1_nxv32i16:
405; CHECK:       # %bb.0:
406; CHECK-NEXT:    vsetvli a0, zero, e16, m8, ta, ma
407; CHECK-NEXT:    vmv.v.i v8, 0
408; CHECK-NEXT:    vmerge.vim v8, v8, -1, v0
409; CHECK-NEXT:    ret
410  %r = sext <vscale x 32 x i1> %v to <vscale x 32 x i16>
411  ret <vscale x 32 x i16> %r
412}
413
414define <vscale x 32 x i16> @zext_nxv32i1_nxv32i16(<vscale x 32 x i1> %v) {
415; CHECK-LABEL: zext_nxv32i1_nxv32i16:
416; CHECK:       # %bb.0:
417; CHECK-NEXT:    vsetvli a0, zero, e16, m8, ta, ma
418; CHECK-NEXT:    vmv.v.i v8, 0
419; CHECK-NEXT:    vmerge.vim v8, v8, 1, v0
420; CHECK-NEXT:    ret
421  %r = zext <vscale x 32 x i1> %v to <vscale x 32 x i16>
422  ret <vscale x 32 x i16> %r
423}
424
425define <vscale x 32 x i1> @trunc_nxv32i16_nxv32i1(<vscale x 32 x i16> %v) {
426; CHECK-LABEL: trunc_nxv32i16_nxv32i1:
427; CHECK:       # %bb.0:
428; CHECK-NEXT:    vsetvli a0, zero, e16, m8, ta, ma
429; CHECK-NEXT:    vand.vi v8, v8, 1
430; CHECK-NEXT:    vmsne.vi v0, v8, 0
431; CHECK-NEXT:    ret
432  %r = trunc <vscale x 32 x i16> %v to <vscale x 32 x i1>
433  ret <vscale x 32 x i1> %r
434}
435
436define <vscale x 1 x i32> @sext_nxv1i1_nxv1i32(<vscale x 1 x i1> %v) {
437; CHECK-LABEL: sext_nxv1i1_nxv1i32:
438; CHECK:       # %bb.0:
439; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
440; CHECK-NEXT:    vmv.v.i v8, 0
441; CHECK-NEXT:    vmerge.vim v8, v8, -1, v0
442; CHECK-NEXT:    ret
443  %r = sext <vscale x 1 x i1> %v to <vscale x 1 x i32>
444  ret <vscale x 1 x i32> %r
445}
446
447define <vscale x 1 x i32> @zext_nxv1i1_nxv1i32(<vscale x 1 x i1> %v) {
448; CHECK-LABEL: zext_nxv1i1_nxv1i32:
449; CHECK:       # %bb.0:
450; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
451; CHECK-NEXT:    vmv.v.i v8, 0
452; CHECK-NEXT:    vmerge.vim v8, v8, 1, v0
453; CHECK-NEXT:    ret
454  %r = zext <vscale x 1 x i1> %v to <vscale x 1 x i32>
455  ret <vscale x 1 x i32> %r
456}
457
458define <vscale x 1 x i1> @trunc_nxv1i32_nxv1i1(<vscale x 1 x i32> %v) {
459; CHECK-LABEL: trunc_nxv1i32_nxv1i1:
460; CHECK:       # %bb.0:
461; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
462; CHECK-NEXT:    vand.vi v8, v8, 1
463; CHECK-NEXT:    vmsne.vi v0, v8, 0
464; CHECK-NEXT:    ret
465  %r = trunc <vscale x 1 x i32> %v to <vscale x 1 x i1>
466  ret <vscale x 1 x i1> %r
467}
468
469define <vscale x 2 x i32> @sext_nxv2i1_nxv2i32(<vscale x 2 x i1> %v) {
470; CHECK-LABEL: sext_nxv2i1_nxv2i32:
471; CHECK:       # %bb.0:
472; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
473; CHECK-NEXT:    vmv.v.i v8, 0
474; CHECK-NEXT:    vmerge.vim v8, v8, -1, v0
475; CHECK-NEXT:    ret
476  %r = sext <vscale x 2 x i1> %v to <vscale x 2 x i32>
477  ret <vscale x 2 x i32> %r
478}
479
480define <vscale x 2 x i32> @zext_nxv2i1_nxv2i32(<vscale x 2 x i1> %v) {
481; CHECK-LABEL: zext_nxv2i1_nxv2i32:
482; CHECK:       # %bb.0:
483; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
484; CHECK-NEXT:    vmv.v.i v8, 0
485; CHECK-NEXT:    vmerge.vim v8, v8, 1, v0
486; CHECK-NEXT:    ret
487  %r = zext <vscale x 2 x i1> %v to <vscale x 2 x i32>
488  ret <vscale x 2 x i32> %r
489}
490
491define <vscale x 2 x i1> @trunc_nxv2i32_nxv2i1(<vscale x 2 x i32> %v) {
492; CHECK-LABEL: trunc_nxv2i32_nxv2i1:
493; CHECK:       # %bb.0:
494; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
495; CHECK-NEXT:    vand.vi v8, v8, 1
496; CHECK-NEXT:    vmsne.vi v0, v8, 0
497; CHECK-NEXT:    ret
498  %r = trunc <vscale x 2 x i32> %v to <vscale x 2 x i1>
499  ret <vscale x 2 x i1> %r
500}
501
502define <vscale x 4 x i32> @sext_nxv4i1_nxv4i32(<vscale x 4 x i1> %v) {
503; CHECK-LABEL: sext_nxv4i1_nxv4i32:
504; CHECK:       # %bb.0:
505; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
506; CHECK-NEXT:    vmv.v.i v8, 0
507; CHECK-NEXT:    vmerge.vim v8, v8, -1, v0
508; CHECK-NEXT:    ret
509  %r = sext <vscale x 4 x i1> %v to <vscale x 4 x i32>
510  ret <vscale x 4 x i32> %r
511}
512
513define <vscale x 4 x i32> @zext_nxv4i1_nxv4i32(<vscale x 4 x i1> %v) {
514; CHECK-LABEL: zext_nxv4i1_nxv4i32:
515; CHECK:       # %bb.0:
516; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
517; CHECK-NEXT:    vmv.v.i v8, 0
518; CHECK-NEXT:    vmerge.vim v8, v8, 1, v0
519; CHECK-NEXT:    ret
520  %r = zext <vscale x 4 x i1> %v to <vscale x 4 x i32>
521  ret <vscale x 4 x i32> %r
522}
523
524define <vscale x 4 x i1> @trunc_nxv4i32_nxv4i1(<vscale x 4 x i32> %v) {
525; CHECK-LABEL: trunc_nxv4i32_nxv4i1:
526; CHECK:       # %bb.0:
527; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
528; CHECK-NEXT:    vand.vi v8, v8, 1
529; CHECK-NEXT:    vmsne.vi v0, v8, 0
530; CHECK-NEXT:    ret
531  %r = trunc <vscale x 4 x i32> %v to <vscale x 4 x i1>
532  ret <vscale x 4 x i1> %r
533}
534
535define <vscale x 8 x i32> @sext_nxv8i1_nxv8i32(<vscale x 8 x i1> %v) {
536; CHECK-LABEL: sext_nxv8i1_nxv8i32:
537; CHECK:       # %bb.0:
538; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, ma
539; CHECK-NEXT:    vmv.v.i v8, 0
540; CHECK-NEXT:    vmerge.vim v8, v8, -1, v0
541; CHECK-NEXT:    ret
542  %r = sext <vscale x 8 x i1> %v to <vscale x 8 x i32>
543  ret <vscale x 8 x i32> %r
544}
545
546define <vscale x 8 x i32> @zext_nxv8i1_nxv8i32(<vscale x 8 x i1> %v) {
547; CHECK-LABEL: zext_nxv8i1_nxv8i32:
548; CHECK:       # %bb.0:
549; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, ma
550; CHECK-NEXT:    vmv.v.i v8, 0
551; CHECK-NEXT:    vmerge.vim v8, v8, 1, v0
552; CHECK-NEXT:    ret
553  %r = zext <vscale x 8 x i1> %v to <vscale x 8 x i32>
554  ret <vscale x 8 x i32> %r
555}
556
557define <vscale x 8 x i1> @trunc_nxv8i32_nxv8i1(<vscale x 8 x i32> %v) {
558; CHECK-LABEL: trunc_nxv8i32_nxv8i1:
559; CHECK:       # %bb.0:
560; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, ma
561; CHECK-NEXT:    vand.vi v8, v8, 1
562; CHECK-NEXT:    vmsne.vi v0, v8, 0
563; CHECK-NEXT:    ret
564  %r = trunc <vscale x 8 x i32> %v to <vscale x 8 x i1>
565  ret <vscale x 8 x i1> %r
566}
567
568define <vscale x 16 x i32> @sext_nxv16i1_nxv16i32(<vscale x 16 x i1> %v) {
569; CHECK-LABEL: sext_nxv16i1_nxv16i32:
570; CHECK:       # %bb.0:
571; CHECK-NEXT:    vsetvli a0, zero, e32, m8, ta, ma
572; CHECK-NEXT:    vmv.v.i v8, 0
573; CHECK-NEXT:    vmerge.vim v8, v8, -1, v0
574; CHECK-NEXT:    ret
575  %r = sext <vscale x 16 x i1> %v to <vscale x 16 x i32>
576  ret <vscale x 16 x i32> %r
577}
578
579define <vscale x 16 x i32> @zext_nxv16i1_nxv16i32(<vscale x 16 x i1> %v) {
580; CHECK-LABEL: zext_nxv16i1_nxv16i32:
581; CHECK:       # %bb.0:
582; CHECK-NEXT:    vsetvli a0, zero, e32, m8, ta, ma
583; CHECK-NEXT:    vmv.v.i v8, 0
584; CHECK-NEXT:    vmerge.vim v8, v8, 1, v0
585; CHECK-NEXT:    ret
586  %r = zext <vscale x 16 x i1> %v to <vscale x 16 x i32>
587  ret <vscale x 16 x i32> %r
588}
589
590define <vscale x 16 x i1> @trunc_nxv16i32_nxv16i1(<vscale x 16 x i32> %v) {
591; CHECK-LABEL: trunc_nxv16i32_nxv16i1:
592; CHECK:       # %bb.0:
593; CHECK-NEXT:    vsetvli a0, zero, e32, m8, ta, ma
594; CHECK-NEXT:    vand.vi v8, v8, 1
595; CHECK-NEXT:    vmsne.vi v0, v8, 0
596; CHECK-NEXT:    ret
597  %r = trunc <vscale x 16 x i32> %v to <vscale x 16 x i1>
598  ret <vscale x 16 x i1> %r
599}
600
601define <vscale x 1 x i64> @sext_nxv1i1_nxv1i64(<vscale x 1 x i1> %v) {
602; CHECK-LABEL: sext_nxv1i1_nxv1i64:
603; CHECK:       # %bb.0:
604; CHECK-NEXT:    vsetvli a0, zero, e64, m1, ta, ma
605; CHECK-NEXT:    vmv.v.i v8, 0
606; CHECK-NEXT:    vmerge.vim v8, v8, -1, v0
607; CHECK-NEXT:    ret
608  %r = sext <vscale x 1 x i1> %v to <vscale x 1 x i64>
609  ret <vscale x 1 x i64> %r
610}
611
612define <vscale x 1 x i64> @zext_nxv1i1_nxv1i64(<vscale x 1 x i1> %v) {
613; CHECK-LABEL: zext_nxv1i1_nxv1i64:
614; CHECK:       # %bb.0:
615; CHECK-NEXT:    vsetvli a0, zero, e64, m1, ta, ma
616; CHECK-NEXT:    vmv.v.i v8, 0
617; CHECK-NEXT:    vmerge.vim v8, v8, 1, v0
618; CHECK-NEXT:    ret
619  %r = zext <vscale x 1 x i1> %v to <vscale x 1 x i64>
620  ret <vscale x 1 x i64> %r
621}
622
623define <vscale x 1 x i1> @trunc_nxv1i64_nxv1i1(<vscale x 1 x i64> %v) {
624; CHECK-LABEL: trunc_nxv1i64_nxv1i1:
625; CHECK:       # %bb.0:
626; CHECK-NEXT:    vsetvli a0, zero, e64, m1, ta, ma
627; CHECK-NEXT:    vand.vi v8, v8, 1
628; CHECK-NEXT:    vmsne.vi v0, v8, 0
629; CHECK-NEXT:    ret
630  %r = trunc <vscale x 1 x i64> %v to <vscale x 1 x i1>
631  ret <vscale x 1 x i1> %r
632}
633
634define <vscale x 2 x i64> @sext_nxv2i1_nxv2i64(<vscale x 2 x i1> %v) {
635; CHECK-LABEL: sext_nxv2i1_nxv2i64:
636; CHECK:       # %bb.0:
637; CHECK-NEXT:    vsetvli a0, zero, e64, m2, ta, ma
638; CHECK-NEXT:    vmv.v.i v8, 0
639; CHECK-NEXT:    vmerge.vim v8, v8, -1, v0
640; CHECK-NEXT:    ret
641  %r = sext <vscale x 2 x i1> %v to <vscale x 2 x i64>
642  ret <vscale x 2 x i64> %r
643}
644
645define <vscale x 2 x i64> @zext_nxv2i1_nxv2i64(<vscale x 2 x i1> %v) {
646; CHECK-LABEL: zext_nxv2i1_nxv2i64:
647; CHECK:       # %bb.0:
648; CHECK-NEXT:    vsetvli a0, zero, e64, m2, ta, ma
649; CHECK-NEXT:    vmv.v.i v8, 0
650; CHECK-NEXT:    vmerge.vim v8, v8, 1, v0
651; CHECK-NEXT:    ret
652  %r = zext <vscale x 2 x i1> %v to <vscale x 2 x i64>
653  ret <vscale x 2 x i64> %r
654}
655
656define <vscale x 2 x i1> @trunc_nxv2i64_nxv2i1(<vscale x 2 x i64> %v) {
657; CHECK-LABEL: trunc_nxv2i64_nxv2i1:
658; CHECK:       # %bb.0:
659; CHECK-NEXT:    vsetvli a0, zero, e64, m2, ta, ma
660; CHECK-NEXT:    vand.vi v8, v8, 1
661; CHECK-NEXT:    vmsne.vi v0, v8, 0
662; CHECK-NEXT:    ret
663  %r = trunc <vscale x 2 x i64> %v to <vscale x 2 x i1>
664  ret <vscale x 2 x i1> %r
665}
666
667define <vscale x 4 x i64> @sext_nxv4i1_nxv4i64(<vscale x 4 x i1> %v) {
668; CHECK-LABEL: sext_nxv4i1_nxv4i64:
669; CHECK:       # %bb.0:
670; CHECK-NEXT:    vsetvli a0, zero, e64, m4, ta, ma
671; CHECK-NEXT:    vmv.v.i v8, 0
672; CHECK-NEXT:    vmerge.vim v8, v8, -1, v0
673; CHECK-NEXT:    ret
674  %r = sext <vscale x 4 x i1> %v to <vscale x 4 x i64>
675  ret <vscale x 4 x i64> %r
676}
677
678define <vscale x 4 x i64> @zext_nxv4i1_nxv4i64(<vscale x 4 x i1> %v) {
679; CHECK-LABEL: zext_nxv4i1_nxv4i64:
680; CHECK:       # %bb.0:
681; CHECK-NEXT:    vsetvli a0, zero, e64, m4, ta, ma
682; CHECK-NEXT:    vmv.v.i v8, 0
683; CHECK-NEXT:    vmerge.vim v8, v8, 1, v0
684; CHECK-NEXT:    ret
685  %r = zext <vscale x 4 x i1> %v to <vscale x 4 x i64>
686  ret <vscale x 4 x i64> %r
687}
688
689define <vscale x 4 x i1> @trunc_nxv4i64_nxv4i1(<vscale x 4 x i64> %v) {
690; CHECK-LABEL: trunc_nxv4i64_nxv4i1:
691; CHECK:       # %bb.0:
692; CHECK-NEXT:    vsetvli a0, zero, e64, m4, ta, ma
693; CHECK-NEXT:    vand.vi v8, v8, 1
694; CHECK-NEXT:    vmsne.vi v0, v8, 0
695; CHECK-NEXT:    ret
696  %r = trunc <vscale x 4 x i64> %v to <vscale x 4 x i1>
697  ret <vscale x 4 x i1> %r
698}
699
700define <vscale x 8 x i64> @sext_nxv8i1_nxv8i64(<vscale x 8 x i1> %v) {
701; CHECK-LABEL: sext_nxv8i1_nxv8i64:
702; CHECK:       # %bb.0:
703; CHECK-NEXT:    vsetvli a0, zero, e64, m8, ta, ma
704; CHECK-NEXT:    vmv.v.i v8, 0
705; CHECK-NEXT:    vmerge.vim v8, v8, -1, v0
706; CHECK-NEXT:    ret
707  %r = sext <vscale x 8 x i1> %v to <vscale x 8 x i64>
708  ret <vscale x 8 x i64> %r
709}
710
711define <vscale x 8 x i64> @zext_nxv8i1_nxv8i64(<vscale x 8 x i1> %v) {
712; CHECK-LABEL: zext_nxv8i1_nxv8i64:
713; CHECK:       # %bb.0:
714; CHECK-NEXT:    vsetvli a0, zero, e64, m8, ta, ma
715; CHECK-NEXT:    vmv.v.i v8, 0
716; CHECK-NEXT:    vmerge.vim v8, v8, 1, v0
717; CHECK-NEXT:    ret
718  %r = zext <vscale x 8 x i1> %v to <vscale x 8 x i64>
719  ret <vscale x 8 x i64> %r
720}
721
722define <vscale x 8 x i1> @trunc_nxv8i64_nxv8i1(<vscale x 8 x i64> %v) {
723; CHECK-LABEL: trunc_nxv8i64_nxv8i1:
724; CHECK:       # %bb.0:
725; CHECK-NEXT:    vsetvli a0, zero, e64, m8, ta, ma
726; CHECK-NEXT:    vand.vi v8, v8, 1
727; CHECK-NEXT:    vmsne.vi v0, v8, 0
728; CHECK-NEXT:    ret
729  %r = trunc <vscale x 8 x i64> %v to <vscale x 8 x i1>
730  ret <vscale x 8 x i1> %r
731}
732