1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=riscv32 -mattr=+d,+experimental-zfh,+experimental-v -verify-machineinstrs < %s | FileCheck %s
3; RUN: llc -mtriple=riscv64 -mattr=+d,+experimental-zfh,+experimental-v -verify-machineinstrs < %s | FileCheck %s
4
5define <vscale x 1 x i8> @sextload_nxv1i1_nxv1i8(<vscale x 1 x i1>* %x) {
6; CHECK-LABEL: sextload_nxv1i1_nxv1i8:
7; CHECK:       # %bb.0:
8; CHECK-NEXT:    vsetvli a1, zero, e8, mf8, ta, mu
9; CHECK-NEXT:    vle1.v v0, (a0)
10; CHECK-NEXT:    vmv.v.i v25, 0
11; CHECK-NEXT:    vmerge.vim v8, v25, -1, v0
12; CHECK-NEXT:    ret
13  %y = load <vscale x 1 x i1>, <vscale x 1 x i1>* %x
14  %z = sext <vscale x 1 x i1> %y to <vscale x 1 x i8>
15  ret <vscale x 1 x i8> %z
16}
17
18define <vscale x 1 x i16> @sextload_nxv1i8_nxv1i16(<vscale x 1 x i8>* %x) {
19; CHECK-LABEL: sextload_nxv1i8_nxv1i16:
20; CHECK:       # %bb.0:
21; CHECK-NEXT:    vsetvli a1, zero, e8, mf8, ta, mu
22; CHECK-NEXT:    vle8.v v25, (a0)
23; CHECK-NEXT:    vsetvli zero, zero, e16, mf4, ta, mu
24; CHECK-NEXT:    vsext.vf2 v8, v25
25; CHECK-NEXT:    ret
26  %y = load <vscale x 1 x i8>, <vscale x 1 x i8>* %x
27  %z = sext <vscale x 1 x i8> %y to <vscale x 1 x i16>
28  ret <vscale x 1 x i16> %z
29}
30
31define <vscale x 1 x i16> @zextload_nxv1i8_nxv1i16(<vscale x 1 x i8>* %x) {
32; CHECK-LABEL: zextload_nxv1i8_nxv1i16:
33; CHECK:       # %bb.0:
34; CHECK-NEXT:    vsetvli a1, zero, e8, mf8, ta, mu
35; CHECK-NEXT:    vle8.v v25, (a0)
36; CHECK-NEXT:    vsetvli zero, zero, e16, mf4, ta, mu
37; CHECK-NEXT:    vzext.vf2 v8, v25
38; CHECK-NEXT:    ret
39  %y = load <vscale x 1 x i8>, <vscale x 1 x i8>* %x
40  %z = zext <vscale x 1 x i8> %y to <vscale x 1 x i16>
41  ret <vscale x 1 x i16> %z
42}
43
44define <vscale x 1 x i32> @sextload_nxv1i8_nxv1i32(<vscale x 1 x i8>* %x) {
45; CHECK-LABEL: sextload_nxv1i8_nxv1i32:
46; CHECK:       # %bb.0:
47; CHECK-NEXT:    vsetvli a1, zero, e8, mf8, ta, mu
48; CHECK-NEXT:    vle8.v v25, (a0)
49; CHECK-NEXT:    vsetvli zero, zero, e32, mf2, ta, mu
50; CHECK-NEXT:    vsext.vf4 v8, v25
51; CHECK-NEXT:    ret
52  %y = load <vscale x 1 x i8>, <vscale x 1 x i8>* %x
53  %z = sext <vscale x 1 x i8> %y to <vscale x 1 x i32>
54  ret <vscale x 1 x i32> %z
55}
56
57define <vscale x 1 x i32> @zextload_nxv1i8_nxv1i32(<vscale x 1 x i8>* %x) {
58; CHECK-LABEL: zextload_nxv1i8_nxv1i32:
59; CHECK:       # %bb.0:
60; CHECK-NEXT:    vsetvli a1, zero, e8, mf8, ta, mu
61; CHECK-NEXT:    vle8.v v25, (a0)
62; CHECK-NEXT:    vsetvli zero, zero, e32, mf2, ta, mu
63; CHECK-NEXT:    vzext.vf4 v8, v25
64; CHECK-NEXT:    ret
65  %y = load <vscale x 1 x i8>, <vscale x 1 x i8>* %x
66  %z = zext <vscale x 1 x i8> %y to <vscale x 1 x i32>
67  ret <vscale x 1 x i32> %z
68}
69
70define <vscale x 1 x i64> @sextload_nxv1i8_nxv1i64(<vscale x 1 x i8>* %x) {
71; CHECK-LABEL: sextload_nxv1i8_nxv1i64:
72; CHECK:       # %bb.0:
73; CHECK-NEXT:    vsetvli a1, zero, e8, mf8, ta, mu
74; CHECK-NEXT:    vle8.v v25, (a0)
75; CHECK-NEXT:    vsetvli zero, zero, e64, m1, ta, mu
76; CHECK-NEXT:    vsext.vf8 v8, v25
77; CHECK-NEXT:    ret
78  %y = load <vscale x 1 x i8>, <vscale x 1 x i8>* %x
79  %z = sext <vscale x 1 x i8> %y to <vscale x 1 x i64>
80  ret <vscale x 1 x i64> %z
81}
82
83define <vscale x 1 x i64> @zextload_nxv1i8_nxv1i64(<vscale x 1 x i8>* %x) {
84; CHECK-LABEL: zextload_nxv1i8_nxv1i64:
85; CHECK:       # %bb.0:
86; CHECK-NEXT:    vsetvli a1, zero, e8, mf8, ta, mu
87; CHECK-NEXT:    vle8.v v25, (a0)
88; CHECK-NEXT:    vsetvli zero, zero, e64, m1, ta, mu
89; CHECK-NEXT:    vzext.vf8 v8, v25
90; CHECK-NEXT:    ret
91  %y = load <vscale x 1 x i8>, <vscale x 1 x i8>* %x
92  %z = zext <vscale x 1 x i8> %y to <vscale x 1 x i64>
93  ret <vscale x 1 x i64> %z
94}
95
96define <vscale x 2 x i16> @sextload_nxv2i8_nxv2i16(<vscale x 2 x i8>* %x) {
97; CHECK-LABEL: sextload_nxv2i8_nxv2i16:
98; CHECK:       # %bb.0:
99; CHECK-NEXT:    vsetvli a1, zero, e8, mf4, ta, mu
100; CHECK-NEXT:    vle8.v v25, (a0)
101; CHECK-NEXT:    vsetvli zero, zero, e16, mf2, ta, mu
102; CHECK-NEXT:    vsext.vf2 v8, v25
103; CHECK-NEXT:    ret
104  %y = load <vscale x 2 x i8>, <vscale x 2 x i8>* %x
105  %z = sext <vscale x 2 x i8> %y to <vscale x 2 x i16>
106  ret <vscale x 2 x i16> %z
107}
108
109define <vscale x 2 x i16> @zextload_nxv2i8_nxv2i16(<vscale x 2 x i8>* %x) {
110; CHECK-LABEL: zextload_nxv2i8_nxv2i16:
111; CHECK:       # %bb.0:
112; CHECK-NEXT:    vsetvli a1, zero, e8, mf4, ta, mu
113; CHECK-NEXT:    vle8.v v25, (a0)
114; CHECK-NEXT:    vsetvli zero, zero, e16, mf2, ta, mu
115; CHECK-NEXT:    vzext.vf2 v8, v25
116; CHECK-NEXT:    ret
117  %y = load <vscale x 2 x i8>, <vscale x 2 x i8>* %x
118  %z = zext <vscale x 2 x i8> %y to <vscale x 2 x i16>
119  ret <vscale x 2 x i16> %z
120}
121
122define <vscale x 2 x i32> @sextload_nxv2i8_nxv2i32(<vscale x 2 x i8>* %x) {
123; CHECK-LABEL: sextload_nxv2i8_nxv2i32:
124; CHECK:       # %bb.0:
125; CHECK-NEXT:    vsetvli a1, zero, e8, mf4, ta, mu
126; CHECK-NEXT:    vle8.v v25, (a0)
127; CHECK-NEXT:    vsetvli zero, zero, e32, m1, ta, mu
128; CHECK-NEXT:    vsext.vf4 v8, v25
129; CHECK-NEXT:    ret
130  %y = load <vscale x 2 x i8>, <vscale x 2 x i8>* %x
131  %z = sext <vscale x 2 x i8> %y to <vscale x 2 x i32>
132  ret <vscale x 2 x i32> %z
133}
134
135define <vscale x 2 x i32> @zextload_nxv2i8_nxv2i32(<vscale x 2 x i8>* %x) {
136; CHECK-LABEL: zextload_nxv2i8_nxv2i32:
137; CHECK:       # %bb.0:
138; CHECK-NEXT:    vsetvli a1, zero, e8, mf4, ta, mu
139; CHECK-NEXT:    vle8.v v25, (a0)
140; CHECK-NEXT:    vsetvli zero, zero, e32, m1, ta, mu
141; CHECK-NEXT:    vzext.vf4 v8, v25
142; CHECK-NEXT:    ret
143  %y = load <vscale x 2 x i8>, <vscale x 2 x i8>* %x
144  %z = zext <vscale x 2 x i8> %y to <vscale x 2 x i32>
145  ret <vscale x 2 x i32> %z
146}
147
148define <vscale x 2 x i64> @sextload_nxv2i8_nxv2i64(<vscale x 2 x i8>* %x) {
149; CHECK-LABEL: sextload_nxv2i8_nxv2i64:
150; CHECK:       # %bb.0:
151; CHECK-NEXT:    vsetvli a1, zero, e8, mf4, ta, mu
152; CHECK-NEXT:    vle8.v v25, (a0)
153; CHECK-NEXT:    vsetvli zero, zero, e64, m2, ta, mu
154; CHECK-NEXT:    vsext.vf8 v8, v25
155; CHECK-NEXT:    ret
156  %y = load <vscale x 2 x i8>, <vscale x 2 x i8>* %x
157  %z = sext <vscale x 2 x i8> %y to <vscale x 2 x i64>
158  ret <vscale x 2 x i64> %z
159}
160
161define <vscale x 2 x i64> @zextload_nxv2i8_nxv2i64(<vscale x 2 x i8>* %x) {
162; CHECK-LABEL: zextload_nxv2i8_nxv2i64:
163; CHECK:       # %bb.0:
164; CHECK-NEXT:    vsetvli a1, zero, e8, mf4, ta, mu
165; CHECK-NEXT:    vle8.v v25, (a0)
166; CHECK-NEXT:    vsetvli zero, zero, e64, m2, ta, mu
167; CHECK-NEXT:    vzext.vf8 v8, v25
168; CHECK-NEXT:    ret
169  %y = load <vscale x 2 x i8>, <vscale x 2 x i8>* %x
170  %z = zext <vscale x 2 x i8> %y to <vscale x 2 x i64>
171  ret <vscale x 2 x i64> %z
172}
173
174define <vscale x 4 x i16> @sextload_nxv4i8_nxv4i16(<vscale x 4 x i8>* %x) {
175; CHECK-LABEL: sextload_nxv4i8_nxv4i16:
176; CHECK:       # %bb.0:
177; CHECK-NEXT:    vsetvli a1, zero, e8, mf2, ta, mu
178; CHECK-NEXT:    vle8.v v25, (a0)
179; CHECK-NEXT:    vsetvli zero, zero, e16, m1, ta, mu
180; CHECK-NEXT:    vsext.vf2 v8, v25
181; CHECK-NEXT:    ret
182  %y = load <vscale x 4 x i8>, <vscale x 4 x i8>* %x
183  %z = sext <vscale x 4 x i8> %y to <vscale x 4 x i16>
184  ret <vscale x 4 x i16> %z
185}
186
187define <vscale x 4 x i16> @zextload_nxv4i8_nxv4i16(<vscale x 4 x i8>* %x) {
188; CHECK-LABEL: zextload_nxv4i8_nxv4i16:
189; CHECK:       # %bb.0:
190; CHECK-NEXT:    vsetvli a1, zero, e8, mf2, ta, mu
191; CHECK-NEXT:    vle8.v v25, (a0)
192; CHECK-NEXT:    vsetvli zero, zero, e16, m1, ta, mu
193; CHECK-NEXT:    vzext.vf2 v8, v25
194; CHECK-NEXT:    ret
195  %y = load <vscale x 4 x i8>, <vscale x 4 x i8>* %x
196  %z = zext <vscale x 4 x i8> %y to <vscale x 4 x i16>
197  ret <vscale x 4 x i16> %z
198}
199
200define <vscale x 4 x i32> @sextload_nxv4i8_nxv4i32(<vscale x 4 x i8>* %x) {
201; CHECK-LABEL: sextload_nxv4i8_nxv4i32:
202; CHECK:       # %bb.0:
203; CHECK-NEXT:    vsetvli a1, zero, e8, mf2, ta, mu
204; CHECK-NEXT:    vle8.v v25, (a0)
205; CHECK-NEXT:    vsetvli zero, zero, e32, m2, ta, mu
206; CHECK-NEXT:    vsext.vf4 v8, v25
207; CHECK-NEXT:    ret
208  %y = load <vscale x 4 x i8>, <vscale x 4 x i8>* %x
209  %z = sext <vscale x 4 x i8> %y to <vscale x 4 x i32>
210  ret <vscale x 4 x i32> %z
211}
212
213define <vscale x 4 x i32> @zextload_nxv4i8_nxv4i32(<vscale x 4 x i8>* %x) {
214; CHECK-LABEL: zextload_nxv4i8_nxv4i32:
215; CHECK:       # %bb.0:
216; CHECK-NEXT:    vsetvli a1, zero, e8, mf2, ta, mu
217; CHECK-NEXT:    vle8.v v25, (a0)
218; CHECK-NEXT:    vsetvli zero, zero, e32, m2, ta, mu
219; CHECK-NEXT:    vzext.vf4 v8, v25
220; CHECK-NEXT:    ret
221  %y = load <vscale x 4 x i8>, <vscale x 4 x i8>* %x
222  %z = zext <vscale x 4 x i8> %y to <vscale x 4 x i32>
223  ret <vscale x 4 x i32> %z
224}
225
226define <vscale x 4 x i64> @sextload_nxv4i8_nxv4i64(<vscale x 4 x i8>* %x) {
227; CHECK-LABEL: sextload_nxv4i8_nxv4i64:
228; CHECK:       # %bb.0:
229; CHECK-NEXT:    vsetvli a1, zero, e8, mf2, ta, mu
230; CHECK-NEXT:    vle8.v v25, (a0)
231; CHECK-NEXT:    vsetvli zero, zero, e64, m4, ta, mu
232; CHECK-NEXT:    vsext.vf8 v8, v25
233; CHECK-NEXT:    ret
234  %y = load <vscale x 4 x i8>, <vscale x 4 x i8>* %x
235  %z = sext <vscale x 4 x i8> %y to <vscale x 4 x i64>
236  ret <vscale x 4 x i64> %z
237}
238
239define <vscale x 4 x i64> @zextload_nxv4i8_nxv4i64(<vscale x 4 x i8>* %x) {
240; CHECK-LABEL: zextload_nxv4i8_nxv4i64:
241; CHECK:       # %bb.0:
242; CHECK-NEXT:    vsetvli a1, zero, e8, mf2, ta, mu
243; CHECK-NEXT:    vle8.v v25, (a0)
244; CHECK-NEXT:    vsetvli zero, zero, e64, m4, ta, mu
245; CHECK-NEXT:    vzext.vf8 v8, v25
246; CHECK-NEXT:    ret
247  %y = load <vscale x 4 x i8>, <vscale x 4 x i8>* %x
248  %z = zext <vscale x 4 x i8> %y to <vscale x 4 x i64>
249  ret <vscale x 4 x i64> %z
250}
251
252define <vscale x 8 x i16> @sextload_nxv8i8_nxv8i16(<vscale x 8 x i8>* %x) {
253; CHECK-LABEL: sextload_nxv8i8_nxv8i16:
254; CHECK:       # %bb.0:
255; CHECK-NEXT:    vl1r.v v25, (a0)
256; CHECK-NEXT:    vsetvli a0, zero, e16, m2, ta, mu
257; CHECK-NEXT:    vsext.vf2 v8, v25
258; CHECK-NEXT:    ret
259  %y = load <vscale x 8 x i8>, <vscale x 8 x i8>* %x
260  %z = sext <vscale x 8 x i8> %y to <vscale x 8 x i16>
261  ret <vscale x 8 x i16> %z
262}
263
264define <vscale x 8 x i16> @zextload_nxv8i8_nxv8i16(<vscale x 8 x i8>* %x) {
265; CHECK-LABEL: zextload_nxv8i8_nxv8i16:
266; CHECK:       # %bb.0:
267; CHECK-NEXT:    vl1r.v v25, (a0)
268; CHECK-NEXT:    vsetvli a0, zero, e16, m2, ta, mu
269; CHECK-NEXT:    vzext.vf2 v8, v25
270; CHECK-NEXT:    ret
271  %y = load <vscale x 8 x i8>, <vscale x 8 x i8>* %x
272  %z = zext <vscale x 8 x i8> %y to <vscale x 8 x i16>
273  ret <vscale x 8 x i16> %z
274}
275
276define <vscale x 8 x i32> @sextload_nxv8i8_nxv8i32(<vscale x 8 x i8>* %x) {
277; CHECK-LABEL: sextload_nxv8i8_nxv8i32:
278; CHECK:       # %bb.0:
279; CHECK-NEXT:    vl1r.v v25, (a0)
280; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, mu
281; CHECK-NEXT:    vsext.vf4 v8, v25
282; CHECK-NEXT:    ret
283  %y = load <vscale x 8 x i8>, <vscale x 8 x i8>* %x
284  %z = sext <vscale x 8 x i8> %y to <vscale x 8 x i32>
285  ret <vscale x 8 x i32> %z
286}
287
288define <vscale x 8 x i32> @zextload_nxv8i8_nxv8i32(<vscale x 8 x i8>* %x) {
289; CHECK-LABEL: zextload_nxv8i8_nxv8i32:
290; CHECK:       # %bb.0:
291; CHECK-NEXT:    vl1r.v v25, (a0)
292; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, mu
293; CHECK-NEXT:    vzext.vf4 v8, v25
294; CHECK-NEXT:    ret
295  %y = load <vscale x 8 x i8>, <vscale x 8 x i8>* %x
296  %z = zext <vscale x 8 x i8> %y to <vscale x 8 x i32>
297  ret <vscale x 8 x i32> %z
298}
299
300define <vscale x 8 x i64> @sextload_nxv8i8_nxv8i64(<vscale x 8 x i8>* %x) {
301; CHECK-LABEL: sextload_nxv8i8_nxv8i64:
302; CHECK:       # %bb.0:
303; CHECK-NEXT:    vl1r.v v25, (a0)
304; CHECK-NEXT:    vsetvli a0, zero, e64, m8, ta, mu
305; CHECK-NEXT:    vsext.vf8 v8, v25
306; CHECK-NEXT:    ret
307  %y = load <vscale x 8 x i8>, <vscale x 8 x i8>* %x
308  %z = sext <vscale x 8 x i8> %y to <vscale x 8 x i64>
309  ret <vscale x 8 x i64> %z
310}
311
312define <vscale x 8 x i64> @zextload_nxv8i8_nxv8i64(<vscale x 8 x i8>* %x) {
313; CHECK-LABEL: zextload_nxv8i8_nxv8i64:
314; CHECK:       # %bb.0:
315; CHECK-NEXT:    vl1r.v v25, (a0)
316; CHECK-NEXT:    vsetvli a0, zero, e64, m8, ta, mu
317; CHECK-NEXT:    vzext.vf8 v8, v25
318; CHECK-NEXT:    ret
319  %y = load <vscale x 8 x i8>, <vscale x 8 x i8>* %x
320  %z = zext <vscale x 8 x i8> %y to <vscale x 8 x i64>
321  ret <vscale x 8 x i64> %z
322}
323
324define <vscale x 16 x i16> @sextload_nxv16i8_nxv16i16(<vscale x 16 x i8>* %x) {
325; CHECK-LABEL: sextload_nxv16i8_nxv16i16:
326; CHECK:       # %bb.0:
327; CHECK-NEXT:    vl2r.v v26, (a0)
328; CHECK-NEXT:    vsetvli a0, zero, e16, m4, ta, mu
329; CHECK-NEXT:    vsext.vf2 v8, v26
330; CHECK-NEXT:    ret
331  %y = load <vscale x 16 x i8>, <vscale x 16 x i8>* %x
332  %z = sext <vscale x 16 x i8> %y to <vscale x 16 x i16>
333  ret <vscale x 16 x i16> %z
334}
335
336define <vscale x 16 x i16> @zextload_nxv16i8_nxv16i16(<vscale x 16 x i8>* %x) {
337; CHECK-LABEL: zextload_nxv16i8_nxv16i16:
338; CHECK:       # %bb.0:
339; CHECK-NEXT:    vl2r.v v26, (a0)
340; CHECK-NEXT:    vsetvli a0, zero, e16, m4, ta, mu
341; CHECK-NEXT:    vzext.vf2 v8, v26
342; CHECK-NEXT:    ret
343  %y = load <vscale x 16 x i8>, <vscale x 16 x i8>* %x
344  %z = zext <vscale x 16 x i8> %y to <vscale x 16 x i16>
345  ret <vscale x 16 x i16> %z
346}
347
348define <vscale x 16 x i32> @sextload_nxv16i8_nxv16i32(<vscale x 16 x i8>* %x) {
349; CHECK-LABEL: sextload_nxv16i8_nxv16i32:
350; CHECK:       # %bb.0:
351; CHECK-NEXT:    vl2r.v v26, (a0)
352; CHECK-NEXT:    vsetvli a0, zero, e32, m8, ta, mu
353; CHECK-NEXT:    vsext.vf4 v8, v26
354; CHECK-NEXT:    ret
355  %y = load <vscale x 16 x i8>, <vscale x 16 x i8>* %x
356  %z = sext <vscale x 16 x i8> %y to <vscale x 16 x i32>
357  ret <vscale x 16 x i32> %z
358}
359
360define <vscale x 16 x i32> @zextload_nxv16i8_nxv16i32(<vscale x 16 x i8>* %x) {
361; CHECK-LABEL: zextload_nxv16i8_nxv16i32:
362; CHECK:       # %bb.0:
363; CHECK-NEXT:    vl2r.v v26, (a0)
364; CHECK-NEXT:    vsetvli a0, zero, e32, m8, ta, mu
365; CHECK-NEXT:    vzext.vf4 v8, v26
366; CHECK-NEXT:    ret
367  %y = load <vscale x 16 x i8>, <vscale x 16 x i8>* %x
368  %z = zext <vscale x 16 x i8> %y to <vscale x 16 x i32>
369  ret <vscale x 16 x i32> %z
370}
371
372define <vscale x 32 x i16> @sextload_nxv32i8_nxv32i16(<vscale x 32 x i8>* %x) {
373; CHECK-LABEL: sextload_nxv32i8_nxv32i16:
374; CHECK:       # %bb.0:
375; CHECK-NEXT:    vl4r.v v28, (a0)
376; CHECK-NEXT:    vsetvli a0, zero, e16, m8, ta, mu
377; CHECK-NEXT:    vsext.vf2 v8, v28
378; CHECK-NEXT:    ret
379  %y = load <vscale x 32 x i8>, <vscale x 32 x i8>* %x
380  %z = sext <vscale x 32 x i8> %y to <vscale x 32 x i16>
381  ret <vscale x 32 x i16> %z
382}
383
384define <vscale x 32 x i16> @zextload_nxv32i8_nxv32i16(<vscale x 32 x i8>* %x) {
385; CHECK-LABEL: zextload_nxv32i8_nxv32i16:
386; CHECK:       # %bb.0:
387; CHECK-NEXT:    vl4r.v v28, (a0)
388; CHECK-NEXT:    vsetvli a0, zero, e16, m8, ta, mu
389; CHECK-NEXT:    vzext.vf2 v8, v28
390; CHECK-NEXT:    ret
391  %y = load <vscale x 32 x i8>, <vscale x 32 x i8>* %x
392  %z = zext <vscale x 32 x i8> %y to <vscale x 32 x i16>
393  ret <vscale x 32 x i16> %z
394}
395
396define void @truncstore_nxv1i8_nxv1i1(<vscale x 1 x i8> %x, <vscale x 1 x i1> *%z) {
397; CHECK-LABEL: truncstore_nxv1i8_nxv1i1:
398; CHECK:       # %bb.0:
399; CHECK-NEXT:    vsetvli a1, zero, e8, mf8, ta, mu
400; CHECK-NEXT:    vand.vi v25, v8, 1
401; CHECK-NEXT:    vmsne.vi v25, v25, 0
402; CHECK-NEXT:    vse1.v v25, (a0)
403; CHECK-NEXT:    ret
404  %y = trunc <vscale x 1 x i8> %x to <vscale x 1 x i1>
405  store <vscale x 1 x i1> %y, <vscale x 1 x i1>* %z
406  ret void
407}
408
409define void @truncstore_nxv1i16_nxv1i8(<vscale x 1 x i16> %x, <vscale x 1 x i8>* %z) {
410; CHECK-LABEL: truncstore_nxv1i16_nxv1i8:
411; CHECK:       # %bb.0:
412; CHECK-NEXT:    vsetvli a1, zero, e8, mf8, ta, mu
413; CHECK-NEXT:    vnsrl.wi v25, v8, 0
414; CHECK-NEXT:    vse8.v v25, (a0)
415; CHECK-NEXT:    ret
416  %y = trunc <vscale x 1 x i16> %x to <vscale x 1 x i8>
417  store <vscale x 1 x i8> %y, <vscale x 1 x i8>* %z
418  ret void
419}
420
421define <vscale x 1 x i32> @sextload_nxv1i16_nxv1i32(<vscale x 1 x i16>* %x) {
422; CHECK-LABEL: sextload_nxv1i16_nxv1i32:
423; CHECK:       # %bb.0:
424; CHECK-NEXT:    vsetvli a1, zero, e16, mf4, ta, mu
425; CHECK-NEXT:    vle16.v v25, (a0)
426; CHECK-NEXT:    vsetvli zero, zero, e32, mf2, ta, mu
427; CHECK-NEXT:    vsext.vf2 v8, v25
428; CHECK-NEXT:    ret
429  %y = load <vscale x 1 x i16>, <vscale x 1 x i16>* %x
430  %z = sext <vscale x 1 x i16> %y to <vscale x 1 x i32>
431  ret <vscale x 1 x i32> %z
432}
433
434define <vscale x 1 x i32> @zextload_nxv1i16_nxv1i32(<vscale x 1 x i16>* %x) {
435; CHECK-LABEL: zextload_nxv1i16_nxv1i32:
436; CHECK:       # %bb.0:
437; CHECK-NEXT:    vsetvli a1, zero, e16, mf4, ta, mu
438; CHECK-NEXT:    vle16.v v25, (a0)
439; CHECK-NEXT:    vsetvli zero, zero, e32, mf2, ta, mu
440; CHECK-NEXT:    vzext.vf2 v8, v25
441; CHECK-NEXT:    ret
442  %y = load <vscale x 1 x i16>, <vscale x 1 x i16>* %x
443  %z = zext <vscale x 1 x i16> %y to <vscale x 1 x i32>
444  ret <vscale x 1 x i32> %z
445}
446
447define <vscale x 1 x i64> @sextload_nxv1i16_nxv1i64(<vscale x 1 x i16>* %x) {
448; CHECK-LABEL: sextload_nxv1i16_nxv1i64:
449; CHECK:       # %bb.0:
450; CHECK-NEXT:    vsetvli a1, zero, e16, mf4, ta, mu
451; CHECK-NEXT:    vle16.v v25, (a0)
452; CHECK-NEXT:    vsetvli zero, zero, e64, m1, ta, mu
453; CHECK-NEXT:    vsext.vf4 v8, v25
454; CHECK-NEXT:    ret
455  %y = load <vscale x 1 x i16>, <vscale x 1 x i16>* %x
456  %z = sext <vscale x 1 x i16> %y to <vscale x 1 x i64>
457  ret <vscale x 1 x i64> %z
458}
459
460define <vscale x 1 x i64> @zextload_nxv1i16_nxv1i64(<vscale x 1 x i16>* %x) {
461; CHECK-LABEL: zextload_nxv1i16_nxv1i64:
462; CHECK:       # %bb.0:
463; CHECK-NEXT:    vsetvli a1, zero, e16, mf4, ta, mu
464; CHECK-NEXT:    vle16.v v25, (a0)
465; CHECK-NEXT:    vsetvli zero, zero, e64, m1, ta, mu
466; CHECK-NEXT:    vzext.vf4 v8, v25
467; CHECK-NEXT:    ret
468  %y = load <vscale x 1 x i16>, <vscale x 1 x i16>* %x
469  %z = zext <vscale x 1 x i16> %y to <vscale x 1 x i64>
470  ret <vscale x 1 x i64> %z
471}
472
473define void @truncstore_nxv2i16_nxv2i8(<vscale x 2 x i16> %x, <vscale x 2 x i8>* %z) {
474; CHECK-LABEL: truncstore_nxv2i16_nxv2i8:
475; CHECK:       # %bb.0:
476; CHECK-NEXT:    vsetvli a1, zero, e8, mf4, ta, mu
477; CHECK-NEXT:    vnsrl.wi v25, v8, 0
478; CHECK-NEXT:    vse8.v v25, (a0)
479; CHECK-NEXT:    ret
480  %y = trunc <vscale x 2 x i16> %x to <vscale x 2 x i8>
481  store <vscale x 2 x i8> %y, <vscale x 2 x i8>* %z
482  ret void
483}
484
485define <vscale x 2 x i32> @sextload_nxv2i16_nxv2i32(<vscale x 2 x i16>* %x) {
486; CHECK-LABEL: sextload_nxv2i16_nxv2i32:
487; CHECK:       # %bb.0:
488; CHECK-NEXT:    vsetvli a1, zero, e16, mf2, ta, mu
489; CHECK-NEXT:    vle16.v v25, (a0)
490; CHECK-NEXT:    vsetvli zero, zero, e32, m1, ta, mu
491; CHECK-NEXT:    vsext.vf2 v8, v25
492; CHECK-NEXT:    ret
493  %y = load <vscale x 2 x i16>, <vscale x 2 x i16>* %x
494  %z = sext <vscale x 2 x i16> %y to <vscale x 2 x i32>
495  ret <vscale x 2 x i32> %z
496}
497
498define <vscale x 2 x i32> @zextload_nxv2i16_nxv2i32(<vscale x 2 x i16>* %x) {
499; CHECK-LABEL: zextload_nxv2i16_nxv2i32:
500; CHECK:       # %bb.0:
501; CHECK-NEXT:    vsetvli a1, zero, e16, mf2, ta, mu
502; CHECK-NEXT:    vle16.v v25, (a0)
503; CHECK-NEXT:    vsetvli zero, zero, e32, m1, ta, mu
504; CHECK-NEXT:    vzext.vf2 v8, v25
505; CHECK-NEXT:    ret
506  %y = load <vscale x 2 x i16>, <vscale x 2 x i16>* %x
507  %z = zext <vscale x 2 x i16> %y to <vscale x 2 x i32>
508  ret <vscale x 2 x i32> %z
509}
510
511define <vscale x 2 x i64> @sextload_nxv2i16_nxv2i64(<vscale x 2 x i16>* %x) {
512; CHECK-LABEL: sextload_nxv2i16_nxv2i64:
513; CHECK:       # %bb.0:
514; CHECK-NEXT:    vsetvli a1, zero, e16, mf2, ta, mu
515; CHECK-NEXT:    vle16.v v25, (a0)
516; CHECK-NEXT:    vsetvli zero, zero, e64, m2, ta, mu
517; CHECK-NEXT:    vsext.vf4 v8, v25
518; CHECK-NEXT:    ret
519  %y = load <vscale x 2 x i16>, <vscale x 2 x i16>* %x
520  %z = sext <vscale x 2 x i16> %y to <vscale x 2 x i64>
521  ret <vscale x 2 x i64> %z
522}
523
524define <vscale x 2 x i64> @zextload_nxv2i16_nxv2i64(<vscale x 2 x i16>* %x) {
525; CHECK-LABEL: zextload_nxv2i16_nxv2i64:
526; CHECK:       # %bb.0:
527; CHECK-NEXT:    vsetvli a1, zero, e16, mf2, ta, mu
528; CHECK-NEXT:    vle16.v v25, (a0)
529; CHECK-NEXT:    vsetvli zero, zero, e64, m2, ta, mu
530; CHECK-NEXT:    vzext.vf4 v8, v25
531; CHECK-NEXT:    ret
532  %y = load <vscale x 2 x i16>, <vscale x 2 x i16>* %x
533  %z = zext <vscale x 2 x i16> %y to <vscale x 2 x i64>
534  ret <vscale x 2 x i64> %z
535}
536
537define void @truncstore_nxv4i16_nxv4i8(<vscale x 4 x i16> %x, <vscale x 4 x i8>* %z) {
538; CHECK-LABEL: truncstore_nxv4i16_nxv4i8:
539; CHECK:       # %bb.0:
540; CHECK-NEXT:    vsetvli a1, zero, e8, mf2, ta, mu
541; CHECK-NEXT:    vnsrl.wi v25, v8, 0
542; CHECK-NEXT:    vse8.v v25, (a0)
543; CHECK-NEXT:    ret
544  %y = trunc <vscale x 4 x i16> %x to <vscale x 4 x i8>
545  store <vscale x 4 x i8> %y, <vscale x 4 x i8>* %z
546  ret void
547}
548
549define <vscale x 4 x i32> @sextload_nxv4i16_nxv4i32(<vscale x 4 x i16>* %x) {
550; CHECK-LABEL: sextload_nxv4i16_nxv4i32:
551; CHECK:       # %bb.0:
552; CHECK-NEXT:    vl1re16.v v25, (a0)
553; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, mu
554; CHECK-NEXT:    vsext.vf2 v8, v25
555; CHECK-NEXT:    ret
556  %y = load <vscale x 4 x i16>, <vscale x 4 x i16>* %x
557  %z = sext <vscale x 4 x i16> %y to <vscale x 4 x i32>
558  ret <vscale x 4 x i32> %z
559}
560
561define <vscale x 4 x i32> @zextload_nxv4i16_nxv4i32(<vscale x 4 x i16>* %x) {
562; CHECK-LABEL: zextload_nxv4i16_nxv4i32:
563; CHECK:       # %bb.0:
564; CHECK-NEXT:    vl1re16.v v25, (a0)
565; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, mu
566; CHECK-NEXT:    vzext.vf2 v8, v25
567; CHECK-NEXT:    ret
568  %y = load <vscale x 4 x i16>, <vscale x 4 x i16>* %x
569  %z = zext <vscale x 4 x i16> %y to <vscale x 4 x i32>
570  ret <vscale x 4 x i32> %z
571}
572
573define <vscale x 4 x i64> @sextload_nxv4i16_nxv4i64(<vscale x 4 x i16>* %x) {
574; CHECK-LABEL: sextload_nxv4i16_nxv4i64:
575; CHECK:       # %bb.0:
576; CHECK-NEXT:    vl1re16.v v25, (a0)
577; CHECK-NEXT:    vsetvli a0, zero, e64, m4, ta, mu
578; CHECK-NEXT:    vsext.vf4 v8, v25
579; CHECK-NEXT:    ret
580  %y = load <vscale x 4 x i16>, <vscale x 4 x i16>* %x
581  %z = sext <vscale x 4 x i16> %y to <vscale x 4 x i64>
582  ret <vscale x 4 x i64> %z
583}
584
585define <vscale x 4 x i64> @zextload_nxv4i16_nxv4i64(<vscale x 4 x i16>* %x) {
586; CHECK-LABEL: zextload_nxv4i16_nxv4i64:
587; CHECK:       # %bb.0:
588; CHECK-NEXT:    vl1re16.v v25, (a0)
589; CHECK-NEXT:    vsetvli a0, zero, e64, m4, ta, mu
590; CHECK-NEXT:    vzext.vf4 v8, v25
591; CHECK-NEXT:    ret
592  %y = load <vscale x 4 x i16>, <vscale x 4 x i16>* %x
593  %z = zext <vscale x 4 x i16> %y to <vscale x 4 x i64>
594  ret <vscale x 4 x i64> %z
595}
596
597define void @truncstore_nxv8i16_nxv8i8(<vscale x 8 x i16> %x, <vscale x 8 x i8>* %z) {
598; CHECK-LABEL: truncstore_nxv8i16_nxv8i8:
599; CHECK:       # %bb.0:
600; CHECK-NEXT:    vsetvli a1, zero, e8, m1, ta, mu
601; CHECK-NEXT:    vnsrl.wi v25, v8, 0
602; CHECK-NEXT:    vs1r.v v25, (a0)
603; CHECK-NEXT:    ret
604  %y = trunc <vscale x 8 x i16> %x to <vscale x 8 x i8>
605  store <vscale x 8 x i8> %y, <vscale x 8 x i8>* %z
606  ret void
607}
608
609define <vscale x 8 x i32> @sextload_nxv8i16_nxv8i32(<vscale x 8 x i16>* %x) {
610; CHECK-LABEL: sextload_nxv8i16_nxv8i32:
611; CHECK:       # %bb.0:
612; CHECK-NEXT:    vl2re16.v v26, (a0)
613; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, mu
614; CHECK-NEXT:    vsext.vf2 v8, v26
615; CHECK-NEXT:    ret
616  %y = load <vscale x 8 x i16>, <vscale x 8 x i16>* %x
617  %z = sext <vscale x 8 x i16> %y to <vscale x 8 x i32>
618  ret <vscale x 8 x i32> %z
619}
620
621define <vscale x 8 x i32> @zextload_nxv8i16_nxv8i32(<vscale x 8 x i16>* %x) {
622; CHECK-LABEL: zextload_nxv8i16_nxv8i32:
623; CHECK:       # %bb.0:
624; CHECK-NEXT:    vl2re16.v v26, (a0)
625; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, mu
626; CHECK-NEXT:    vzext.vf2 v8, v26
627; CHECK-NEXT:    ret
628  %y = load <vscale x 8 x i16>, <vscale x 8 x i16>* %x
629  %z = zext <vscale x 8 x i16> %y to <vscale x 8 x i32>
630  ret <vscale x 8 x i32> %z
631}
632
633define <vscale x 8 x i64> @sextload_nxv8i16_nxv8i64(<vscale x 8 x i16>* %x) {
634; CHECK-LABEL: sextload_nxv8i16_nxv8i64:
635; CHECK:       # %bb.0:
636; CHECK-NEXT:    vl2re16.v v26, (a0)
637; CHECK-NEXT:    vsetvli a0, zero, e64, m8, ta, mu
638; CHECK-NEXT:    vsext.vf4 v8, v26
639; CHECK-NEXT:    ret
640  %y = load <vscale x 8 x i16>, <vscale x 8 x i16>* %x
641  %z = sext <vscale x 8 x i16> %y to <vscale x 8 x i64>
642  ret <vscale x 8 x i64> %z
643}
644
645define <vscale x 8 x i64> @zextload_nxv8i16_nxv8i64(<vscale x 8 x i16>* %x) {
646; CHECK-LABEL: zextload_nxv8i16_nxv8i64:
647; CHECK:       # %bb.0:
648; CHECK-NEXT:    vl2re16.v v26, (a0)
649; CHECK-NEXT:    vsetvli a0, zero, e64, m8, ta, mu
650; CHECK-NEXT:    vzext.vf4 v8, v26
651; CHECK-NEXT:    ret
652  %y = load <vscale x 8 x i16>, <vscale x 8 x i16>* %x
653  %z = zext <vscale x 8 x i16> %y to <vscale x 8 x i64>
654  ret <vscale x 8 x i64> %z
655}
656
657define void @truncstore_nxv16i16_nxv16i8(<vscale x 16 x i16> %x, <vscale x 16 x i8>* %z) {
658; CHECK-LABEL: truncstore_nxv16i16_nxv16i8:
659; CHECK:       # %bb.0:
660; CHECK-NEXT:    vsetvli a1, zero, e8, m2, ta, mu
661; CHECK-NEXT:    vnsrl.wi v26, v8, 0
662; CHECK-NEXT:    vs2r.v v26, (a0)
663; CHECK-NEXT:    ret
664  %y = trunc <vscale x 16 x i16> %x to <vscale x 16 x i8>
665  store <vscale x 16 x i8> %y, <vscale x 16 x i8>* %z
666  ret void
667}
668
669define <vscale x 16 x i32> @sextload_nxv16i16_nxv16i32(<vscale x 16 x i16>* %x) {
670; CHECK-LABEL: sextload_nxv16i16_nxv16i32:
671; CHECK:       # %bb.0:
672; CHECK-NEXT:    vl4re16.v v28, (a0)
673; CHECK-NEXT:    vsetvli a0, zero, e32, m8, ta, mu
674; CHECK-NEXT:    vsext.vf2 v8, v28
675; CHECK-NEXT:    ret
676  %y = load <vscale x 16 x i16>, <vscale x 16 x i16>* %x
677  %z = sext <vscale x 16 x i16> %y to <vscale x 16 x i32>
678  ret <vscale x 16 x i32> %z
679}
680
681define <vscale x 16 x i32> @zextload_nxv16i16_nxv16i32(<vscale x 16 x i16>* %x) {
682; CHECK-LABEL: zextload_nxv16i16_nxv16i32:
683; CHECK:       # %bb.0:
684; CHECK-NEXT:    vl4re16.v v28, (a0)
685; CHECK-NEXT:    vsetvli a0, zero, e32, m8, ta, mu
686; CHECK-NEXT:    vzext.vf2 v8, v28
687; CHECK-NEXT:    ret
688  %y = load <vscale x 16 x i16>, <vscale x 16 x i16>* %x
689  %z = zext <vscale x 16 x i16> %y to <vscale x 16 x i32>
690  ret <vscale x 16 x i32> %z
691}
692
693define void @truncstore_nxv32i16_nxv32i8(<vscale x 32 x i16> %x, <vscale x 32 x i8>* %z) {
694; CHECK-LABEL: truncstore_nxv32i16_nxv32i8:
695; CHECK:       # %bb.0:
696; CHECK-NEXT:    vsetvli a1, zero, e8, m4, ta, mu
697; CHECK-NEXT:    vnsrl.wi v28, v8, 0
698; CHECK-NEXT:    vs4r.v v28, (a0)
699; CHECK-NEXT:    ret
700  %y = trunc <vscale x 32 x i16> %x to <vscale x 32 x i8>
701  store <vscale x 32 x i8> %y, <vscale x 32 x i8>* %z
702  ret void
703}
704
705define void @truncstore_nxv1i32_nxv1i8(<vscale x 1 x i32> %x, <vscale x 1 x i8>* %z) {
706; CHECK-LABEL: truncstore_nxv1i32_nxv1i8:
707; CHECK:       # %bb.0:
708; CHECK-NEXT:    vsetvli a1, zero, e16, mf4, ta, mu
709; CHECK-NEXT:    vnsrl.wi v25, v8, 0
710; CHECK-NEXT:    vsetvli zero, zero, e8, mf8, ta, mu
711; CHECK-NEXT:    vnsrl.wi v25, v25, 0
712; CHECK-NEXT:    vse8.v v25, (a0)
713; CHECK-NEXT:    ret
714  %y = trunc <vscale x 1 x i32> %x to <vscale x 1 x i8>
715  store <vscale x 1 x i8> %y, <vscale x 1 x i8>* %z
716  ret void
717}
718
719define void @truncstore_nxv1i32_nxv1i16(<vscale x 1 x i32> %x, <vscale x 1 x i16>* %z) {
720; CHECK-LABEL: truncstore_nxv1i32_nxv1i16:
721; CHECK:       # %bb.0:
722; CHECK-NEXT:    vsetvli a1, zero, e16, mf4, ta, mu
723; CHECK-NEXT:    vnsrl.wi v25, v8, 0
724; CHECK-NEXT:    vse16.v v25, (a0)
725; CHECK-NEXT:    ret
726  %y = trunc <vscale x 1 x i32> %x to <vscale x 1 x i16>
727  store <vscale x 1 x i16> %y, <vscale x 1 x i16>* %z
728  ret void
729}
730
731define <vscale x 1 x i64> @sextload_nxv1i32_nxv1i64(<vscale x 1 x i32>* %x) {
732; CHECK-LABEL: sextload_nxv1i32_nxv1i64:
733; CHECK:       # %bb.0:
734; CHECK-NEXT:    vsetvli a1, zero, e32, mf2, ta, mu
735; CHECK-NEXT:    vle32.v v25, (a0)
736; CHECK-NEXT:    vsetvli zero, zero, e64, m1, ta, mu
737; CHECK-NEXT:    vsext.vf2 v8, v25
738; CHECK-NEXT:    ret
739  %y = load <vscale x 1 x i32>, <vscale x 1 x i32>* %x
740  %z = sext <vscale x 1 x i32> %y to <vscale x 1 x i64>
741  ret <vscale x 1 x i64> %z
742}
743
744define <vscale x 1 x i64> @zextload_nxv1i32_nxv1i64(<vscale x 1 x i32>* %x) {
745; CHECK-LABEL: zextload_nxv1i32_nxv1i64:
746; CHECK:       # %bb.0:
747; CHECK-NEXT:    vsetvli a1, zero, e32, mf2, ta, mu
748; CHECK-NEXT:    vle32.v v25, (a0)
749; CHECK-NEXT:    vsetvli zero, zero, e64, m1, ta, mu
750; CHECK-NEXT:    vzext.vf2 v8, v25
751; CHECK-NEXT:    ret
752  %y = load <vscale x 1 x i32>, <vscale x 1 x i32>* %x
753  %z = zext <vscale x 1 x i32> %y to <vscale x 1 x i64>
754  ret <vscale x 1 x i64> %z
755}
756
757define void @truncstore_nxv2i32_nxv2i8(<vscale x 2 x i32> %x, <vscale x 2 x i8>* %z) {
758; CHECK-LABEL: truncstore_nxv2i32_nxv2i8:
759; CHECK:       # %bb.0:
760; CHECK-NEXT:    vsetvli a1, zero, e16, mf2, ta, mu
761; CHECK-NEXT:    vnsrl.wi v25, v8, 0
762; CHECK-NEXT:    vsetvli zero, zero, e8, mf4, ta, mu
763; CHECK-NEXT:    vnsrl.wi v25, v25, 0
764; CHECK-NEXT:    vse8.v v25, (a0)
765; CHECK-NEXT:    ret
766  %y = trunc <vscale x 2 x i32> %x to <vscale x 2 x i8>
767  store <vscale x 2 x i8> %y, <vscale x 2 x i8>* %z
768  ret void
769}
770
771define void @truncstore_nxv2i32_nxv2i16(<vscale x 2 x i32> %x, <vscale x 2 x i16>* %z) {
772; CHECK-LABEL: truncstore_nxv2i32_nxv2i16:
773; CHECK:       # %bb.0:
774; CHECK-NEXT:    vsetvli a1, zero, e16, mf2, ta, mu
775; CHECK-NEXT:    vnsrl.wi v25, v8, 0
776; CHECK-NEXT:    vse16.v v25, (a0)
777; CHECK-NEXT:    ret
778  %y = trunc <vscale x 2 x i32> %x to <vscale x 2 x i16>
779  store <vscale x 2 x i16> %y, <vscale x 2 x i16>* %z
780  ret void
781}
782
783define <vscale x 2 x i64> @sextload_nxv2i32_nxv2i64(<vscale x 2 x i32>* %x) {
784; CHECK-LABEL: sextload_nxv2i32_nxv2i64:
785; CHECK:       # %bb.0:
786; CHECK-NEXT:    vl1re32.v v25, (a0)
787; CHECK-NEXT:    vsetvli a0, zero, e64, m2, ta, mu
788; CHECK-NEXT:    vsext.vf2 v8, v25
789; CHECK-NEXT:    ret
790  %y = load <vscale x 2 x i32>, <vscale x 2 x i32>* %x
791  %z = sext <vscale x 2 x i32> %y to <vscale x 2 x i64>
792  ret <vscale x 2 x i64> %z
793}
794
795define <vscale x 2 x i64> @zextload_nxv2i32_nxv2i64(<vscale x 2 x i32>* %x) {
796; CHECK-LABEL: zextload_nxv2i32_nxv2i64:
797; CHECK:       # %bb.0:
798; CHECK-NEXT:    vl1re32.v v25, (a0)
799; CHECK-NEXT:    vsetvli a0, zero, e64, m2, ta, mu
800; CHECK-NEXT:    vzext.vf2 v8, v25
801; CHECK-NEXT:    ret
802  %y = load <vscale x 2 x i32>, <vscale x 2 x i32>* %x
803  %z = zext <vscale x 2 x i32> %y to <vscale x 2 x i64>
804  ret <vscale x 2 x i64> %z
805}
806
807define void @truncstore_nxv4i32_nxv4i8(<vscale x 4 x i32> %x, <vscale x 4 x i8>* %z) {
808; CHECK-LABEL: truncstore_nxv4i32_nxv4i8:
809; CHECK:       # %bb.0:
810; CHECK-NEXT:    vsetvli a1, zero, e16, m1, ta, mu
811; CHECK-NEXT:    vnsrl.wi v25, v8, 0
812; CHECK-NEXT:    vsetvli zero, zero, e8, mf2, ta, mu
813; CHECK-NEXT:    vnsrl.wi v25, v25, 0
814; CHECK-NEXT:    vse8.v v25, (a0)
815; CHECK-NEXT:    ret
816  %y = trunc <vscale x 4 x i32> %x to <vscale x 4 x i8>
817  store <vscale x 4 x i8> %y, <vscale x 4 x i8>* %z
818  ret void
819}
820
821define void @truncstore_nxv4i32_nxv4i16(<vscale x 4 x i32> %x, <vscale x 4 x i16>* %z) {
822; CHECK-LABEL: truncstore_nxv4i32_nxv4i16:
823; CHECK:       # %bb.0:
824; CHECK-NEXT:    vsetvli a1, zero, e16, m1, ta, mu
825; CHECK-NEXT:    vnsrl.wi v25, v8, 0
826; CHECK-NEXT:    vs1r.v v25, (a0)
827; CHECK-NEXT:    ret
828  %y = trunc <vscale x 4 x i32> %x to <vscale x 4 x i16>
829  store <vscale x 4 x i16> %y, <vscale x 4 x i16>* %z
830  ret void
831}
832
833define <vscale x 4 x i64> @sextload_nxv4i32_nxv4i64(<vscale x 4 x i32>* %x) {
834; CHECK-LABEL: sextload_nxv4i32_nxv4i64:
835; CHECK:       # %bb.0:
836; CHECK-NEXT:    vl2re32.v v26, (a0)
837; CHECK-NEXT:    vsetvli a0, zero, e64, m4, ta, mu
838; CHECK-NEXT:    vsext.vf2 v8, v26
839; CHECK-NEXT:    ret
840  %y = load <vscale x 4 x i32>, <vscale x 4 x i32>* %x
841  %z = sext <vscale x 4 x i32> %y to <vscale x 4 x i64>
842  ret <vscale x 4 x i64> %z
843}
844
845define <vscale x 4 x i64> @zextload_nxv4i32_nxv4i64(<vscale x 4 x i32>* %x) {
846; CHECK-LABEL: zextload_nxv4i32_nxv4i64:
847; CHECK:       # %bb.0:
848; CHECK-NEXT:    vl2re32.v v26, (a0)
849; CHECK-NEXT:    vsetvli a0, zero, e64, m4, ta, mu
850; CHECK-NEXT:    vzext.vf2 v8, v26
851; CHECK-NEXT:    ret
852  %y = load <vscale x 4 x i32>, <vscale x 4 x i32>* %x
853  %z = zext <vscale x 4 x i32> %y to <vscale x 4 x i64>
854  ret <vscale x 4 x i64> %z
855}
856
857define void @truncstore_nxv8i32_nxv8i8(<vscale x 8 x i32> %x, <vscale x 8 x i8>* %z) {
858; CHECK-LABEL: truncstore_nxv8i32_nxv8i8:
859; CHECK:       # %bb.0:
860; CHECK-NEXT:    vsetvli a1, zero, e16, m2, ta, mu
861; CHECK-NEXT:    vnsrl.wi v26, v8, 0
862; CHECK-NEXT:    vsetvli zero, zero, e8, m1, ta, mu
863; CHECK-NEXT:    vnsrl.wi v25, v26, 0
864; CHECK-NEXT:    vs1r.v v25, (a0)
865; CHECK-NEXT:    ret
866  %y = trunc <vscale x 8 x i32> %x to <vscale x 8 x i8>
867  store <vscale x 8 x i8> %y, <vscale x 8 x i8>* %z
868  ret void
869}
870
871define void @truncstore_nxv8i32_nxv8i16(<vscale x 8 x i32> %x, <vscale x 8 x i16>* %z) {
872; CHECK-LABEL: truncstore_nxv8i32_nxv8i16:
873; CHECK:       # %bb.0:
874; CHECK-NEXT:    vsetvli a1, zero, e16, m2, ta, mu
875; CHECK-NEXT:    vnsrl.wi v26, v8, 0
876; CHECK-NEXT:    vs2r.v v26, (a0)
877; CHECK-NEXT:    ret
878  %y = trunc <vscale x 8 x i32> %x to <vscale x 8 x i16>
879  store <vscale x 8 x i16> %y, <vscale x 8 x i16>* %z
880  ret void
881}
882
883define <vscale x 8 x i64> @sextload_nxv8i32_nxv8i64(<vscale x 8 x i32>* %x) {
884; CHECK-LABEL: sextload_nxv8i32_nxv8i64:
885; CHECK:       # %bb.0:
886; CHECK-NEXT:    vl4re32.v v28, (a0)
887; CHECK-NEXT:    vsetvli a0, zero, e64, m8, ta, mu
888; CHECK-NEXT:    vsext.vf2 v8, v28
889; CHECK-NEXT:    ret
890  %y = load <vscale x 8 x i32>, <vscale x 8 x i32>* %x
891  %z = sext <vscale x 8 x i32> %y to <vscale x 8 x i64>
892  ret <vscale x 8 x i64> %z
893}
894
895define <vscale x 8 x i64> @zextload_nxv8i32_nxv8i64(<vscale x 8 x i32>* %x) {
896; CHECK-LABEL: zextload_nxv8i32_nxv8i64:
897; CHECK:       # %bb.0:
898; CHECK-NEXT:    vl4re32.v v28, (a0)
899; CHECK-NEXT:    vsetvli a0, zero, e64, m8, ta, mu
900; CHECK-NEXT:    vzext.vf2 v8, v28
901; CHECK-NEXT:    ret
902  %y = load <vscale x 8 x i32>, <vscale x 8 x i32>* %x
903  %z = zext <vscale x 8 x i32> %y to <vscale x 8 x i64>
904  ret <vscale x 8 x i64> %z
905}
906
907define void @truncstore_nxv16i32_nxv16i8(<vscale x 16 x i32> %x, <vscale x 16 x i8>* %z) {
908; CHECK-LABEL: truncstore_nxv16i32_nxv16i8:
909; CHECK:       # %bb.0:
910; CHECK-NEXT:    vsetvli a1, zero, e16, m4, ta, mu
911; CHECK-NEXT:    vnsrl.wi v28, v8, 0
912; CHECK-NEXT:    vsetvli zero, zero, e8, m2, ta, mu
913; CHECK-NEXT:    vnsrl.wi v26, v28, 0
914; CHECK-NEXT:    vs2r.v v26, (a0)
915; CHECK-NEXT:    ret
916  %y = trunc <vscale x 16 x i32> %x to <vscale x 16 x i8>
917  store <vscale x 16 x i8> %y, <vscale x 16 x i8>* %z
918  ret void
919}
920
921define void @truncstore_nxv16i32_nxv16i16(<vscale x 16 x i32> %x, <vscale x 16 x i16>* %z) {
922; CHECK-LABEL: truncstore_nxv16i32_nxv16i16:
923; CHECK:       # %bb.0:
924; CHECK-NEXT:    vsetvli a1, zero, e16, m4, ta, mu
925; CHECK-NEXT:    vnsrl.wi v28, v8, 0
926; CHECK-NEXT:    vs4r.v v28, (a0)
927; CHECK-NEXT:    ret
928  %y = trunc <vscale x 16 x i32> %x to <vscale x 16 x i16>
929  store <vscale x 16 x i16> %y, <vscale x 16 x i16>* %z
930  ret void
931}
932
933define void @truncstore_nxv1i64_nxv1i8(<vscale x 1 x i64> %x, <vscale x 1 x i8>* %z) {
934; CHECK-LABEL: truncstore_nxv1i64_nxv1i8:
935; CHECK:       # %bb.0:
936; CHECK-NEXT:    vsetvli a1, zero, e32, mf2, ta, mu
937; CHECK-NEXT:    vnsrl.wi v25, v8, 0
938; CHECK-NEXT:    vsetvli zero, zero, e16, mf4, ta, mu
939; CHECK-NEXT:    vnsrl.wi v25, v25, 0
940; CHECK-NEXT:    vsetvli zero, zero, e8, mf8, ta, mu
941; CHECK-NEXT:    vnsrl.wi v25, v25, 0
942; CHECK-NEXT:    vse8.v v25, (a0)
943; CHECK-NEXT:    ret
944  %y = trunc <vscale x 1 x i64> %x to <vscale x 1 x i8>
945  store <vscale x 1 x i8> %y, <vscale x 1 x i8>* %z
946  ret void
947}
948
949define void @truncstore_nxv1i64_nxv1i16(<vscale x 1 x i64> %x, <vscale x 1 x i16>* %z) {
950; CHECK-LABEL: truncstore_nxv1i64_nxv1i16:
951; CHECK:       # %bb.0:
952; CHECK-NEXT:    vsetvli a1, zero, e32, mf2, ta, mu
953; CHECK-NEXT:    vnsrl.wi v25, v8, 0
954; CHECK-NEXT:    vsetvli zero, zero, e16, mf4, ta, mu
955; CHECK-NEXT:    vnsrl.wi v25, v25, 0
956; CHECK-NEXT:    vse16.v v25, (a0)
957; CHECK-NEXT:    ret
958  %y = trunc <vscale x 1 x i64> %x to <vscale x 1 x i16>
959  store <vscale x 1 x i16> %y, <vscale x 1 x i16>* %z
960  ret void
961}
962
963define void @truncstore_nxv1i64_nxv1i32(<vscale x 1 x i64> %x, <vscale x 1 x i32>* %z) {
964; CHECK-LABEL: truncstore_nxv1i64_nxv1i32:
965; CHECK:       # %bb.0:
966; CHECK-NEXT:    vsetvli a1, zero, e32, mf2, ta, mu
967; CHECK-NEXT:    vnsrl.wi v25, v8, 0
968; CHECK-NEXT:    vse32.v v25, (a0)
969; CHECK-NEXT:    ret
970  %y = trunc <vscale x 1 x i64> %x to <vscale x 1 x i32>
971  store <vscale x 1 x i32> %y, <vscale x 1 x i32>* %z
972  ret void
973}
974
975define void @truncstore_nxv2i64_nxv2i8(<vscale x 2 x i64> %x, <vscale x 2 x i8>* %z) {
976; CHECK-LABEL: truncstore_nxv2i64_nxv2i8:
977; CHECK:       # %bb.0:
978; CHECK-NEXT:    vsetvli a1, zero, e32, m1, ta, mu
979; CHECK-NEXT:    vnsrl.wi v25, v8, 0
980; CHECK-NEXT:    vsetvli zero, zero, e16, mf2, ta, mu
981; CHECK-NEXT:    vnsrl.wi v25, v25, 0
982; CHECK-NEXT:    vsetvli zero, zero, e8, mf4, ta, mu
983; CHECK-NEXT:    vnsrl.wi v25, v25, 0
984; CHECK-NEXT:    vse8.v v25, (a0)
985; CHECK-NEXT:    ret
986  %y = trunc <vscale x 2 x i64> %x to <vscale x 2 x i8>
987  store <vscale x 2 x i8> %y, <vscale x 2 x i8>* %z
988  ret void
989}
990
991define void @truncstore_nxv2i64_nxv2i16(<vscale x 2 x i64> %x, <vscale x 2 x i16>* %z) {
992; CHECK-LABEL: truncstore_nxv2i64_nxv2i16:
993; CHECK:       # %bb.0:
994; CHECK-NEXT:    vsetvli a1, zero, e32, m1, ta, mu
995; CHECK-NEXT:    vnsrl.wi v25, v8, 0
996; CHECK-NEXT:    vsetvli zero, zero, e16, mf2, ta, mu
997; CHECK-NEXT:    vnsrl.wi v25, v25, 0
998; CHECK-NEXT:    vse16.v v25, (a0)
999; CHECK-NEXT:    ret
1000  %y = trunc <vscale x 2 x i64> %x to <vscale x 2 x i16>
1001  store <vscale x 2 x i16> %y, <vscale x 2 x i16>* %z
1002  ret void
1003}
1004
1005define void @truncstore_nxv2i64_nxv2i32(<vscale x 2 x i64> %x, <vscale x 2 x i32>* %z) {
1006; CHECK-LABEL: truncstore_nxv2i64_nxv2i32:
1007; CHECK:       # %bb.0:
1008; CHECK-NEXT:    vsetvli a1, zero, e32, m1, ta, mu
1009; CHECK-NEXT:    vnsrl.wi v25, v8, 0
1010; CHECK-NEXT:    vs1r.v v25, (a0)
1011; CHECK-NEXT:    ret
1012  %y = trunc <vscale x 2 x i64> %x to <vscale x 2 x i32>
1013  store <vscale x 2 x i32> %y, <vscale x 2 x i32>* %z
1014  ret void
1015}
1016
1017define void @truncstore_nxv4i64_nxv4i8(<vscale x 4 x i64> %x, <vscale x 4 x i8>* %z) {
1018; CHECK-LABEL: truncstore_nxv4i64_nxv4i8:
1019; CHECK:       # %bb.0:
1020; CHECK-NEXT:    vsetvli a1, zero, e32, m2, ta, mu
1021; CHECK-NEXT:    vnsrl.wi v26, v8, 0
1022; CHECK-NEXT:    vsetvli zero, zero, e16, m1, ta, mu
1023; CHECK-NEXT:    vnsrl.wi v25, v26, 0
1024; CHECK-NEXT:    vsetvli zero, zero, e8, mf2, ta, mu
1025; CHECK-NEXT:    vnsrl.wi v25, v25, 0
1026; CHECK-NEXT:    vse8.v v25, (a0)
1027; CHECK-NEXT:    ret
1028  %y = trunc <vscale x 4 x i64> %x to <vscale x 4 x i8>
1029  store <vscale x 4 x i8> %y, <vscale x 4 x i8>* %z
1030  ret void
1031}
1032
1033define void @truncstore_nxv4i64_nxv4i16(<vscale x 4 x i64> %x, <vscale x 4 x i16>* %z) {
1034; CHECK-LABEL: truncstore_nxv4i64_nxv4i16:
1035; CHECK:       # %bb.0:
1036; CHECK-NEXT:    vsetvli a1, zero, e32, m2, ta, mu
1037; CHECK-NEXT:    vnsrl.wi v26, v8, 0
1038; CHECK-NEXT:    vsetvli zero, zero, e16, m1, ta, mu
1039; CHECK-NEXT:    vnsrl.wi v25, v26, 0
1040; CHECK-NEXT:    vs1r.v v25, (a0)
1041; CHECK-NEXT:    ret
1042  %y = trunc <vscale x 4 x i64> %x to <vscale x 4 x i16>
1043  store <vscale x 4 x i16> %y, <vscale x 4 x i16>* %z
1044  ret void
1045}
1046
1047define void @truncstore_nxv4i64_nxv4i32(<vscale x 4 x i64> %x, <vscale x 4 x i32>* %z) {
1048; CHECK-LABEL: truncstore_nxv4i64_nxv4i32:
1049; CHECK:       # %bb.0:
1050; CHECK-NEXT:    vsetvli a1, zero, e32, m2, ta, mu
1051; CHECK-NEXT:    vnsrl.wi v26, v8, 0
1052; CHECK-NEXT:    vs2r.v v26, (a0)
1053; CHECK-NEXT:    ret
1054  %y = trunc <vscale x 4 x i64> %x to <vscale x 4 x i32>
1055  store <vscale x 4 x i32> %y, <vscale x 4 x i32>* %z
1056  ret void
1057}
1058
1059define void @truncstore_nxv8i64_nxv8i8(<vscale x 8 x i64> %x, <vscale x 8 x i8>* %z) {
1060; CHECK-LABEL: truncstore_nxv8i64_nxv8i8:
1061; CHECK:       # %bb.0:
1062; CHECK-NEXT:    vsetvli a1, zero, e32, m4, ta, mu
1063; CHECK-NEXT:    vnsrl.wi v28, v8, 0
1064; CHECK-NEXT:    vsetvli zero, zero, e16, m2, ta, mu
1065; CHECK-NEXT:    vnsrl.wi v26, v28, 0
1066; CHECK-NEXT:    vsetvli zero, zero, e8, m1, ta, mu
1067; CHECK-NEXT:    vnsrl.wi v25, v26, 0
1068; CHECK-NEXT:    vs1r.v v25, (a0)
1069; CHECK-NEXT:    ret
1070  %y = trunc <vscale x 8 x i64> %x to <vscale x 8 x i8>
1071  store <vscale x 8 x i8> %y, <vscale x 8 x i8>* %z
1072  ret void
1073}
1074
1075define void @truncstore_nxv8i64_nxv8i16(<vscale x 8 x i64> %x, <vscale x 8 x i16>* %z) {
1076; CHECK-LABEL: truncstore_nxv8i64_nxv8i16:
1077; CHECK:       # %bb.0:
1078; CHECK-NEXT:    vsetvli a1, zero, e32, m4, ta, mu
1079; CHECK-NEXT:    vnsrl.wi v28, v8, 0
1080; CHECK-NEXT:    vsetvli zero, zero, e16, m2, ta, mu
1081; CHECK-NEXT:    vnsrl.wi v26, v28, 0
1082; CHECK-NEXT:    vs2r.v v26, (a0)
1083; CHECK-NEXT:    ret
1084  %y = trunc <vscale x 8 x i64> %x to <vscale x 8 x i16>
1085  store <vscale x 8 x i16> %y, <vscale x 8 x i16>* %z
1086  ret void
1087}
1088
1089define void @truncstore_nxv8i64_nxv8i32(<vscale x 8 x i64> %x, <vscale x 8 x i32>* %z) {
1090; CHECK-LABEL: truncstore_nxv8i64_nxv8i32:
1091; CHECK:       # %bb.0:
1092; CHECK-NEXT:    vsetvli a1, zero, e32, m4, ta, mu
1093; CHECK-NEXT:    vnsrl.wi v28, v8, 0
1094; CHECK-NEXT:    vs4r.v v28, (a0)
1095; CHECK-NEXT:    ret
1096  %y = trunc <vscale x 8 x i64> %x to <vscale x 8 x i32>
1097  store <vscale x 8 x i32> %y, <vscale x 8 x i32>* %z
1098  ret void
1099}
1100
1101define <vscale x 1 x float> @extload_nxv1f16_nxv1f32(<vscale x 1 x half>* %x) {
1102; CHECK-LABEL: extload_nxv1f16_nxv1f32:
1103; CHECK:       # %bb.0:
1104; CHECK-NEXT:    vsetvli a1, zero, e16, mf4, ta, mu
1105; CHECK-NEXT:    vle16.v v25, (a0)
1106; CHECK-NEXT:    vfwcvt.f.f.v v8, v25
1107; CHECK-NEXT:    ret
1108  %y = load <vscale x 1 x half>, <vscale x 1 x half>* %x
1109  %z = fpext <vscale x 1 x half> %y to <vscale x 1 x float>
1110  ret <vscale x 1 x float> %z
1111}
1112
1113define <vscale x 1 x double> @extload_nxv1f16_nxv1f64(<vscale x 1 x half>* %x) {
1114; CHECK-LABEL: extload_nxv1f16_nxv1f64:
1115; CHECK:       # %bb.0:
1116; CHECK-NEXT:    vsetvli a1, zero, e16, mf4, ta, mu
1117; CHECK-NEXT:    vle16.v v25, (a0)
1118; CHECK-NEXT:    vfwcvt.f.f.v v26, v25
1119; CHECK-NEXT:    vsetvli zero, zero, e32, mf2, ta, mu
1120; CHECK-NEXT:    vfwcvt.f.f.v v8, v26
1121; CHECK-NEXT:    ret
1122  %y = load <vscale x 1 x half>, <vscale x 1 x half>* %x
1123  %z = fpext <vscale x 1 x half> %y to <vscale x 1 x double>
1124  ret <vscale x 1 x double> %z
1125}
1126
1127define <vscale x 2 x float> @extload_nxv2f16_nxv2f32(<vscale x 2 x half>* %x) {
1128; CHECK-LABEL: extload_nxv2f16_nxv2f32:
1129; CHECK:       # %bb.0:
1130; CHECK-NEXT:    vsetvli a1, zero, e16, mf2, ta, mu
1131; CHECK-NEXT:    vle16.v v25, (a0)
1132; CHECK-NEXT:    vfwcvt.f.f.v v8, v25
1133; CHECK-NEXT:    ret
1134  %y = load <vscale x 2 x half>, <vscale x 2 x half>* %x
1135  %z = fpext <vscale x 2 x half> %y to <vscale x 2 x float>
1136  ret <vscale x 2 x float> %z
1137}
1138
1139define <vscale x 2 x double> @extload_nxv2f16_nxv2f64(<vscale x 2 x half>* %x) {
1140; CHECK-LABEL: extload_nxv2f16_nxv2f64:
1141; CHECK:       # %bb.0:
1142; CHECK-NEXT:    vsetvli a1, zero, e16, mf2, ta, mu
1143; CHECK-NEXT:    vle16.v v25, (a0)
1144; CHECK-NEXT:    vfwcvt.f.f.v v26, v25
1145; CHECK-NEXT:    vsetvli zero, zero, e32, m1, ta, mu
1146; CHECK-NEXT:    vfwcvt.f.f.v v8, v26
1147; CHECK-NEXT:    ret
1148  %y = load <vscale x 2 x half>, <vscale x 2 x half>* %x
1149  %z = fpext <vscale x 2 x half> %y to <vscale x 2 x double>
1150  ret <vscale x 2 x double> %z
1151}
1152
1153define <vscale x 4 x float> @extload_nxv4f16_nxv4f32(<vscale x 4 x half>* %x) {
1154; CHECK-LABEL: extload_nxv4f16_nxv4f32:
1155; CHECK:       # %bb.0:
1156; CHECK-NEXT:    vl1re16.v v25, (a0)
1157; CHECK-NEXT:    vsetvli a0, zero, e16, m1, ta, mu
1158; CHECK-NEXT:    vfwcvt.f.f.v v8, v25
1159; CHECK-NEXT:    ret
1160  %y = load <vscale x 4 x half>, <vscale x 4 x half>* %x
1161  %z = fpext <vscale x 4 x half> %y to <vscale x 4 x float>
1162  ret <vscale x 4 x float> %z
1163}
1164
1165define <vscale x 4 x double> @extload_nxv4f16_nxv4f64(<vscale x 4 x half>* %x) {
1166; CHECK-LABEL: extload_nxv4f16_nxv4f64:
1167; CHECK:       # %bb.0:
1168; CHECK-NEXT:    vl1re16.v v25, (a0)
1169; CHECK-NEXT:    vsetvli a0, zero, e16, m1, ta, mu
1170; CHECK-NEXT:    vfwcvt.f.f.v v26, v25
1171; CHECK-NEXT:    vsetvli zero, zero, e32, m2, ta, mu
1172; CHECK-NEXT:    vfwcvt.f.f.v v8, v26
1173; CHECK-NEXT:    ret
1174  %y = load <vscale x 4 x half>, <vscale x 4 x half>* %x
1175  %z = fpext <vscale x 4 x half> %y to <vscale x 4 x double>
1176  ret <vscale x 4 x double> %z
1177}
1178
1179define <vscale x 8 x float> @extload_nxv8f16_nxv8f32(<vscale x 8 x half>* %x) {
1180; CHECK-LABEL: extload_nxv8f16_nxv8f32:
1181; CHECK:       # %bb.0:
1182; CHECK-NEXT:    vl2re16.v v26, (a0)
1183; CHECK-NEXT:    vsetvli a0, zero, e16, m2, ta, mu
1184; CHECK-NEXT:    vfwcvt.f.f.v v8, v26
1185; CHECK-NEXT:    ret
1186  %y = load <vscale x 8 x half>, <vscale x 8 x half>* %x
1187  %z = fpext <vscale x 8 x half> %y to <vscale x 8 x float>
1188  ret <vscale x 8 x float> %z
1189}
1190
1191define <vscale x 8 x double> @extload_nxv8f16_nxv8f64(<vscale x 8 x half>* %x) {
1192; CHECK-LABEL: extload_nxv8f16_nxv8f64:
1193; CHECK:       # %bb.0:
1194; CHECK-NEXT:    vl2re16.v v26, (a0)
1195; CHECK-NEXT:    vsetvli a0, zero, e16, m2, ta, mu
1196; CHECK-NEXT:    vfwcvt.f.f.v v28, v26
1197; CHECK-NEXT:    vsetvli zero, zero, e32, m4, ta, mu
1198; CHECK-NEXT:    vfwcvt.f.f.v v8, v28
1199; CHECK-NEXT:    ret
1200  %y = load <vscale x 8 x half>, <vscale x 8 x half>* %x
1201  %z = fpext <vscale x 8 x half> %y to <vscale x 8 x double>
1202  ret <vscale x 8 x double> %z
1203}
1204
1205define <vscale x 16 x float> @extload_nxv16f16_nxv16f32(<vscale x 16 x half>* %x) {
1206; CHECK-LABEL: extload_nxv16f16_nxv16f32:
1207; CHECK:       # %bb.0:
1208; CHECK-NEXT:    vl4re16.v v28, (a0)
1209; CHECK-NEXT:    vsetvli a0, zero, e16, m4, ta, mu
1210; CHECK-NEXT:    vfwcvt.f.f.v v8, v28
1211; CHECK-NEXT:    ret
1212  %y = load <vscale x 16 x half>, <vscale x 16 x half>* %x
1213  %z = fpext <vscale x 16 x half> %y to <vscale x 16 x float>
1214  ret <vscale x 16 x float> %z
1215}
1216
1217define void @truncstore_nxv1f32_nxv1f16(<vscale x 1 x float> %x, <vscale x 1 x half>* %z) {
1218; CHECK-LABEL: truncstore_nxv1f32_nxv1f16:
1219; CHECK:       # %bb.0:
1220; CHECK-NEXT:    vsetvli a1, zero, e16, mf4, ta, mu
1221; CHECK-NEXT:    vfncvt.f.f.w v25, v8
1222; CHECK-NEXT:    vse16.v v25, (a0)
1223; CHECK-NEXT:    ret
1224  %y = fptrunc <vscale x 1 x float> %x to <vscale x 1 x half>
1225  store <vscale x 1 x half> %y, <vscale x 1 x half>* %z
1226  ret void
1227}
1228
1229define <vscale x 1 x double> @extload_nxv1f32_nxv1f64(<vscale x 1 x float>* %x) {
1230; CHECK-LABEL: extload_nxv1f32_nxv1f64:
1231; CHECK:       # %bb.0:
1232; CHECK-NEXT:    vsetvli a1, zero, e32, mf2, ta, mu
1233; CHECK-NEXT:    vle32.v v25, (a0)
1234; CHECK-NEXT:    vfwcvt.f.f.v v8, v25
1235; CHECK-NEXT:    ret
1236  %y = load <vscale x 1 x float>, <vscale x 1 x float>* %x
1237  %z = fpext <vscale x 1 x float> %y to <vscale x 1 x double>
1238  ret <vscale x 1 x double> %z
1239}
1240
1241define void @truncstore_nxv2f32_nxv2f16(<vscale x 2 x float> %x, <vscale x 2 x half>* %z) {
1242; CHECK-LABEL: truncstore_nxv2f32_nxv2f16:
1243; CHECK:       # %bb.0:
1244; CHECK-NEXT:    vsetvli a1, zero, e16, mf2, ta, mu
1245; CHECK-NEXT:    vfncvt.f.f.w v25, v8
1246; CHECK-NEXT:    vse16.v v25, (a0)
1247; CHECK-NEXT:    ret
1248  %y = fptrunc <vscale x 2 x float> %x to <vscale x 2 x half>
1249  store <vscale x 2 x half> %y, <vscale x 2 x half>* %z
1250  ret void
1251}
1252
1253define <vscale x 2 x double> @extload_nxv2f32_nxv2f64(<vscale x 2 x float>* %x) {
1254; CHECK-LABEL: extload_nxv2f32_nxv2f64:
1255; CHECK:       # %bb.0:
1256; CHECK-NEXT:    vl1re32.v v25, (a0)
1257; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, mu
1258; CHECK-NEXT:    vfwcvt.f.f.v v8, v25
1259; CHECK-NEXT:    ret
1260  %y = load <vscale x 2 x float>, <vscale x 2 x float>* %x
1261  %z = fpext <vscale x 2 x float> %y to <vscale x 2 x double>
1262  ret <vscale x 2 x double> %z
1263}
1264
1265define void @truncstore_nxv4f32_nxv4f16(<vscale x 4 x float> %x, <vscale x 4 x half>* %z) {
1266; CHECK-LABEL: truncstore_nxv4f32_nxv4f16:
1267; CHECK:       # %bb.0:
1268; CHECK-NEXT:    vsetvli a1, zero, e16, m1, ta, mu
1269; CHECK-NEXT:    vfncvt.f.f.w v25, v8
1270; CHECK-NEXT:    vs1r.v v25, (a0)
1271; CHECK-NEXT:    ret
1272  %y = fptrunc <vscale x 4 x float> %x to <vscale x 4 x half>
1273  store <vscale x 4 x half> %y, <vscale x 4 x half>* %z
1274  ret void
1275}
1276
1277define <vscale x 4 x double> @extload_nxv4f32_nxv4f64(<vscale x 4 x float>* %x) {
1278; CHECK-LABEL: extload_nxv4f32_nxv4f64:
1279; CHECK:       # %bb.0:
1280; CHECK-NEXT:    vl2re32.v v26, (a0)
1281; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, mu
1282; CHECK-NEXT:    vfwcvt.f.f.v v8, v26
1283; CHECK-NEXT:    ret
1284  %y = load <vscale x 4 x float>, <vscale x 4 x float>* %x
1285  %z = fpext <vscale x 4 x float> %y to <vscale x 4 x double>
1286  ret <vscale x 4 x double> %z
1287}
1288
1289define void @truncstore_nxv8f32_nxv8f16(<vscale x 8 x float> %x, <vscale x 8 x half>* %z) {
1290; CHECK-LABEL: truncstore_nxv8f32_nxv8f16:
1291; CHECK:       # %bb.0:
1292; CHECK-NEXT:    vsetvli a1, zero, e16, m2, ta, mu
1293; CHECK-NEXT:    vfncvt.f.f.w v26, v8
1294; CHECK-NEXT:    vs2r.v v26, (a0)
1295; CHECK-NEXT:    ret
1296  %y = fptrunc <vscale x 8 x float> %x to <vscale x 8 x half>
1297  store <vscale x 8 x half> %y, <vscale x 8 x half>* %z
1298  ret void
1299}
1300
1301define <vscale x 8 x double> @extload_nxv8f32_nxv8f64(<vscale x 8 x float>* %x) {
1302; CHECK-LABEL: extload_nxv8f32_nxv8f64:
1303; CHECK:       # %bb.0:
1304; CHECK-NEXT:    vl4re32.v v28, (a0)
1305; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, mu
1306; CHECK-NEXT:    vfwcvt.f.f.v v8, v28
1307; CHECK-NEXT:    ret
1308  %y = load <vscale x 8 x float>, <vscale x 8 x float>* %x
1309  %z = fpext <vscale x 8 x float> %y to <vscale x 8 x double>
1310  ret <vscale x 8 x double> %z
1311}
1312
1313define void @truncstore_nxv16f32_nxv16f16(<vscale x 16 x float> %x, <vscale x 16 x half>* %z) {
1314; CHECK-LABEL: truncstore_nxv16f32_nxv16f16:
1315; CHECK:       # %bb.0:
1316; CHECK-NEXT:    vsetvli a1, zero, e16, m4, ta, mu
1317; CHECK-NEXT:    vfncvt.f.f.w v28, v8
1318; CHECK-NEXT:    vs4r.v v28, (a0)
1319; CHECK-NEXT:    ret
1320  %y = fptrunc <vscale x 16 x float> %x to <vscale x 16 x half>
1321  store <vscale x 16 x half> %y, <vscale x 16 x half>* %z
1322  ret void
1323}
1324
1325define void @truncstore_nxv1f64_nxv1f16(<vscale x 1 x double> %x, <vscale x 1 x half>* %z) {
1326; CHECK-LABEL: truncstore_nxv1f64_nxv1f16:
1327; CHECK:       # %bb.0:
1328; CHECK-NEXT:    vsetvli a1, zero, e32, mf2, ta, mu
1329; CHECK-NEXT:    vfncvt.rod.f.f.w v25, v8
1330; CHECK-NEXT:    vsetvli zero, zero, e16, mf4, ta, mu
1331; CHECK-NEXT:    vfncvt.f.f.w v26, v25
1332; CHECK-NEXT:    vse16.v v26, (a0)
1333; CHECK-NEXT:    ret
1334  %y = fptrunc <vscale x 1 x double> %x to <vscale x 1 x half>
1335  store <vscale x 1 x half> %y, <vscale x 1 x half>* %z
1336  ret void
1337}
1338
1339define void @truncstore_nxv1f64_nxv1f32(<vscale x 1 x double> %x, <vscale x 1 x float>* %z) {
1340; CHECK-LABEL: truncstore_nxv1f64_nxv1f32:
1341; CHECK:       # %bb.0:
1342; CHECK-NEXT:    vsetvli a1, zero, e32, mf2, ta, mu
1343; CHECK-NEXT:    vfncvt.f.f.w v25, v8
1344; CHECK-NEXT:    vse32.v v25, (a0)
1345; CHECK-NEXT:    ret
1346  %y = fptrunc <vscale x 1 x double> %x to <vscale x 1 x float>
1347  store <vscale x 1 x float> %y, <vscale x 1 x float>* %z
1348  ret void
1349}
1350
1351define void @truncstore_nxv2f64_nxv2f16(<vscale x 2 x double> %x, <vscale x 2 x half>* %z) {
1352; CHECK-LABEL: truncstore_nxv2f64_nxv2f16:
1353; CHECK:       # %bb.0:
1354; CHECK-NEXT:    vsetvli a1, zero, e32, m1, ta, mu
1355; CHECK-NEXT:    vfncvt.rod.f.f.w v25, v8
1356; CHECK-NEXT:    vsetvli zero, zero, e16, mf2, ta, mu
1357; CHECK-NEXT:    vfncvt.f.f.w v26, v25
1358; CHECK-NEXT:    vse16.v v26, (a0)
1359; CHECK-NEXT:    ret
1360  %y = fptrunc <vscale x 2 x double> %x to <vscale x 2 x half>
1361  store <vscale x 2 x half> %y, <vscale x 2 x half>* %z
1362  ret void
1363}
1364
1365define void @truncstore_nxv2f64_nxv2f32(<vscale x 2 x double> %x, <vscale x 2 x float>* %z) {
1366; CHECK-LABEL: truncstore_nxv2f64_nxv2f32:
1367; CHECK:       # %bb.0:
1368; CHECK-NEXT:    vsetvli a1, zero, e32, m1, ta, mu
1369; CHECK-NEXT:    vfncvt.f.f.w v25, v8
1370; CHECK-NEXT:    vs1r.v v25, (a0)
1371; CHECK-NEXT:    ret
1372  %y = fptrunc <vscale x 2 x double> %x to <vscale x 2 x float>
1373  store <vscale x 2 x float> %y, <vscale x 2 x float>* %z
1374  ret void
1375}
1376
1377define void @truncstore_nxv4f64_nxv4f16(<vscale x 4 x double> %x, <vscale x 4 x half>* %z) {
1378; CHECK-LABEL: truncstore_nxv4f64_nxv4f16:
1379; CHECK:       # %bb.0:
1380; CHECK-NEXT:    vsetvli a1, zero, e32, m2, ta, mu
1381; CHECK-NEXT:    vfncvt.rod.f.f.w v26, v8
1382; CHECK-NEXT:    vsetvli zero, zero, e16, m1, ta, mu
1383; CHECK-NEXT:    vfncvt.f.f.w v25, v26
1384; CHECK-NEXT:    vs1r.v v25, (a0)
1385; CHECK-NEXT:    ret
1386  %y = fptrunc <vscale x 4 x double> %x to <vscale x 4 x half>
1387  store <vscale x 4 x half> %y, <vscale x 4 x half>* %z
1388  ret void
1389}
1390
1391define void @truncstore_nxv4f64_nxv4f32(<vscale x 4 x double> %x, <vscale x 4 x float>* %z) {
1392; CHECK-LABEL: truncstore_nxv4f64_nxv4f32:
1393; CHECK:       # %bb.0:
1394; CHECK-NEXT:    vsetvli a1, zero, e32, m2, ta, mu
1395; CHECK-NEXT:    vfncvt.f.f.w v26, v8
1396; CHECK-NEXT:    vs2r.v v26, (a0)
1397; CHECK-NEXT:    ret
1398  %y = fptrunc <vscale x 4 x double> %x to <vscale x 4 x float>
1399  store <vscale x 4 x float> %y, <vscale x 4 x float>* %z
1400  ret void
1401}
1402
1403define void @truncstore_nxv8f64_nxv8f16(<vscale x 8 x double> %x, <vscale x 8 x half>* %z) {
1404; CHECK-LABEL: truncstore_nxv8f64_nxv8f16:
1405; CHECK:       # %bb.0:
1406; CHECK-NEXT:    vsetvli a1, zero, e32, m4, ta, mu
1407; CHECK-NEXT:    vfncvt.rod.f.f.w v28, v8
1408; CHECK-NEXT:    vsetvli zero, zero, e16, m2, ta, mu
1409; CHECK-NEXT:    vfncvt.f.f.w v26, v28
1410; CHECK-NEXT:    vs2r.v v26, (a0)
1411; CHECK-NEXT:    ret
1412  %y = fptrunc <vscale x 8 x double> %x to <vscale x 8 x half>
1413  store <vscale x 8 x half> %y, <vscale x 8 x half>* %z
1414  ret void
1415}
1416
1417define void @truncstore_nxv8f64_nxv8f32(<vscale x 8 x double> %x, <vscale x 8 x float>* %z) {
1418; CHECK-LABEL: truncstore_nxv8f64_nxv8f32:
1419; CHECK:       # %bb.0:
1420; CHECK-NEXT:    vsetvli a1, zero, e32, m4, ta, mu
1421; CHECK-NEXT:    vfncvt.f.f.w v28, v8
1422; CHECK-NEXT:    vs4r.v v28, (a0)
1423; CHECK-NEXT:    ret
1424  %y = fptrunc <vscale x 8 x double> %x to <vscale x 8 x float>
1425  store <vscale x 8 x float> %y, <vscale x 8 x float>* %z
1426  ret void
1427}
1428