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
3
4define <vscale x 1 x i8> @vtrunc_nxv1i16_nxv1i8(<vscale x 1 x i16> %va) {
5; CHECK-LABEL: vtrunc_nxv1i16_nxv1i8:
6; CHECK:       # %bb.0:
7; CHECK-NEXT:    vsetvli a0, zero, e8, mf8, ta, mu
8; CHECK-NEXT:    vnsrl.wi v8, v8, 0
9; CHECK-NEXT:    ret
10  %tvec = trunc <vscale x 1 x i16> %va to <vscale x 1 x i8>
11  ret <vscale x 1 x i8> %tvec
12}
13
14define <vscale x 2 x i8> @vtrunc_nxv2i16_nxv2i8(<vscale x 2 x i16> %va) {
15; CHECK-LABEL: vtrunc_nxv2i16_nxv2i8:
16; CHECK:       # %bb.0:
17; CHECK-NEXT:    vsetvli a0, zero, e8, mf4, ta, mu
18; CHECK-NEXT:    vnsrl.wi v8, v8, 0
19; CHECK-NEXT:    ret
20  %tvec = trunc <vscale x 2 x i16> %va to <vscale x 2 x i8>
21  ret <vscale x 2 x i8> %tvec
22}
23
24define <vscale x 4 x i8> @vtrunc_nxv4i16_nxv4i8(<vscale x 4 x i16> %va) {
25; CHECK-LABEL: vtrunc_nxv4i16_nxv4i8:
26; CHECK:       # %bb.0:
27; CHECK-NEXT:    vsetvli a0, zero, e8, mf2, ta, mu
28; CHECK-NEXT:    vnsrl.wi v8, v8, 0
29; CHECK-NEXT:    ret
30  %tvec = trunc <vscale x 4 x i16> %va to <vscale x 4 x i8>
31  ret <vscale x 4 x i8> %tvec
32}
33
34define <vscale x 8 x i8> @vtrunc_nxv8i16_nxv8i8(<vscale x 8 x i16> %va) {
35; CHECK-LABEL: vtrunc_nxv8i16_nxv8i8:
36; CHECK:       # %bb.0:
37; CHECK-NEXT:    vsetvli a0, zero, e8, m1, ta, mu
38; CHECK-NEXT:    vnsrl.wi v25, v8, 0
39; CHECK-NEXT:    vmv1r.v v8, v25
40; CHECK-NEXT:    ret
41  %tvec = trunc <vscale x 8 x i16> %va to <vscale x 8 x i8>
42  ret <vscale x 8 x i8> %tvec
43}
44
45define <vscale x 16 x i8> @vtrunc_nxv16i16_nxv16i8(<vscale x 16 x i16> %va) {
46; CHECK-LABEL: vtrunc_nxv16i16_nxv16i8:
47; CHECK:       # %bb.0:
48; CHECK-NEXT:    vsetvli a0, zero, e8, m2, ta, mu
49; CHECK-NEXT:    vnsrl.wi v26, v8, 0
50; CHECK-NEXT:    vmv2r.v v8, v26
51; CHECK-NEXT:    ret
52  %tvec = trunc <vscale x 16 x i16> %va to <vscale x 16 x i8>
53  ret <vscale x 16 x i8> %tvec
54}
55
56define <vscale x 1 x i8> @vtrunc_nxv1i32_nxv1i8(<vscale x 1 x i32> %va) {
57; CHECK-LABEL: vtrunc_nxv1i32_nxv1i8:
58; CHECK:       # %bb.0:
59; CHECK-NEXT:    vsetvli a0, zero, e16, mf4, ta, mu
60; CHECK-NEXT:    vnsrl.wi v25, v8, 0
61; CHECK-NEXT:    vsetvli zero, zero, e8, mf8, ta, mu
62; CHECK-NEXT:    vnsrl.wi v8, v25, 0
63; CHECK-NEXT:    ret
64  %tvec = trunc <vscale x 1 x i32> %va to <vscale x 1 x i8>
65  ret <vscale x 1 x i8> %tvec
66}
67
68define <vscale x 1 x i16> @vtrunc_nxv1i32_nxv1i16(<vscale x 1 x i32> %va) {
69; CHECK-LABEL: vtrunc_nxv1i32_nxv1i16:
70; CHECK:       # %bb.0:
71; CHECK-NEXT:    vsetvli a0, zero, e16, mf4, ta, mu
72; CHECK-NEXT:    vnsrl.wi v8, v8, 0
73; CHECK-NEXT:    ret
74  %tvec = trunc <vscale x 1 x i32> %va to <vscale x 1 x i16>
75  ret <vscale x 1 x i16> %tvec
76}
77
78define <vscale x 2 x i8> @vtrunc_nxv2i32_nxv2i8(<vscale x 2 x i32> %va) {
79; CHECK-LABEL: vtrunc_nxv2i32_nxv2i8:
80; CHECK:       # %bb.0:
81; CHECK-NEXT:    vsetvli a0, zero, e16, mf2, ta, mu
82; CHECK-NEXT:    vnsrl.wi v25, v8, 0
83; CHECK-NEXT:    vsetvli zero, zero, e8, mf4, ta, mu
84; CHECK-NEXT:    vnsrl.wi v8, v25, 0
85; CHECK-NEXT:    ret
86  %tvec = trunc <vscale x 2 x i32> %va to <vscale x 2 x i8>
87  ret <vscale x 2 x i8> %tvec
88}
89
90define <vscale x 2 x i16> @vtrunc_nxv2i32_nxv2i16(<vscale x 2 x i32> %va) {
91; CHECK-LABEL: vtrunc_nxv2i32_nxv2i16:
92; CHECK:       # %bb.0:
93; CHECK-NEXT:    vsetvli a0, zero, e16, mf2, ta, mu
94; CHECK-NEXT:    vnsrl.wi v8, v8, 0
95; CHECK-NEXT:    ret
96  %tvec = trunc <vscale x 2 x i32> %va to <vscale x 2 x i16>
97  ret <vscale x 2 x i16> %tvec
98}
99
100define <vscale x 4 x i8> @vtrunc_nxv4i32_nxv4i8(<vscale x 4 x i32> %va) {
101; CHECK-LABEL: vtrunc_nxv4i32_nxv4i8:
102; CHECK:       # %bb.0:
103; CHECK-NEXT:    vsetvli a0, zero, e16, m1, ta, mu
104; CHECK-NEXT:    vnsrl.wi v25, v8, 0
105; CHECK-NEXT:    vsetvli zero, zero, e8, mf2, ta, mu
106; CHECK-NEXT:    vnsrl.wi v8, v25, 0
107; CHECK-NEXT:    ret
108  %tvec = trunc <vscale x 4 x i32> %va to <vscale x 4 x i8>
109  ret <vscale x 4 x i8> %tvec
110}
111
112define <vscale x 4 x i16> @vtrunc_nxv4i32_nxv4i16(<vscale x 4 x i32> %va) {
113; CHECK-LABEL: vtrunc_nxv4i32_nxv4i16:
114; CHECK:       # %bb.0:
115; CHECK-NEXT:    vsetvli a0, zero, e16, m1, ta, mu
116; CHECK-NEXT:    vnsrl.wi v25, v8, 0
117; CHECK-NEXT:    vmv1r.v v8, v25
118; CHECK-NEXT:    ret
119  %tvec = trunc <vscale x 4 x i32> %va to <vscale x 4 x i16>
120  ret <vscale x 4 x i16> %tvec
121}
122
123define <vscale x 8 x i8> @vtrunc_nxv8i32_nxv8i8(<vscale x 8 x i32> %va) {
124; CHECK-LABEL: vtrunc_nxv8i32_nxv8i8:
125; CHECK:       # %bb.0:
126; CHECK-NEXT:    vsetvli a0, zero, e16, m2, ta, mu
127; CHECK-NEXT:    vnsrl.wi v26, v8, 0
128; CHECK-NEXT:    vsetvli zero, zero, e8, m1, ta, mu
129; CHECK-NEXT:    vnsrl.wi v8, v26, 0
130; CHECK-NEXT:    ret
131  %tvec = trunc <vscale x 8 x i32> %va to <vscale x 8 x i8>
132  ret <vscale x 8 x i8> %tvec
133}
134
135define <vscale x 8 x i16> @vtrunc_nxv8i32_nxv8i16(<vscale x 8 x i32> %va) {
136; CHECK-LABEL: vtrunc_nxv8i32_nxv8i16:
137; CHECK:       # %bb.0:
138; CHECK-NEXT:    vsetvli a0, zero, e16, m2, ta, mu
139; CHECK-NEXT:    vnsrl.wi v26, v8, 0
140; CHECK-NEXT:    vmv2r.v v8, v26
141; CHECK-NEXT:    ret
142  %tvec = trunc <vscale x 8 x i32> %va to <vscale x 8 x i16>
143  ret <vscale x 8 x i16> %tvec
144}
145
146define <vscale x 16 x i8> @vtrunc_nxv16i32_nxv16i8(<vscale x 16 x i32> %va) {
147; CHECK-LABEL: vtrunc_nxv16i32_nxv16i8:
148; CHECK:       # %bb.0:
149; CHECK-NEXT:    vsetvli a0, zero, e16, m4, ta, mu
150; CHECK-NEXT:    vnsrl.wi v28, v8, 0
151; CHECK-NEXT:    vsetvli zero, zero, e8, m2, ta, mu
152; CHECK-NEXT:    vnsrl.wi v8, v28, 0
153; CHECK-NEXT:    ret
154  %tvec = trunc <vscale x 16 x i32> %va to <vscale x 16 x i8>
155  ret <vscale x 16 x i8> %tvec
156}
157
158define <vscale x 16 x i16> @vtrunc_nxv16i32_nxv16i16(<vscale x 16 x i32> %va) {
159; CHECK-LABEL: vtrunc_nxv16i32_nxv16i16:
160; CHECK:       # %bb.0:
161; CHECK-NEXT:    vsetvli a0, zero, e16, m4, ta, mu
162; CHECK-NEXT:    vnsrl.wi v28, v8, 0
163; CHECK-NEXT:    vmv4r.v v8, v28
164; CHECK-NEXT:    ret
165  %tvec = trunc <vscale x 16 x i32> %va to <vscale x 16 x i16>
166  ret <vscale x 16 x i16> %tvec
167}
168
169define <vscale x 1 x i8> @vtrunc_nxv1i64_nxv1i8(<vscale x 1 x i64> %va) {
170; CHECK-LABEL: vtrunc_nxv1i64_nxv1i8:
171; CHECK:       # %bb.0:
172; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, mu
173; CHECK-NEXT:    vnsrl.wi v25, v8, 0
174; CHECK-NEXT:    vsetvli zero, zero, e16, mf4, ta, mu
175; CHECK-NEXT:    vnsrl.wi v25, v25, 0
176; CHECK-NEXT:    vsetvli zero, zero, e8, mf8, ta, mu
177; CHECK-NEXT:    vnsrl.wi v8, v25, 0
178; CHECK-NEXT:    ret
179  %tvec = trunc <vscale x 1 x i64> %va to <vscale x 1 x i8>
180  ret <vscale x 1 x i8> %tvec
181}
182
183define <vscale x 1 x i16> @vtrunc_nxv1i64_nxv1i16(<vscale x 1 x i64> %va) {
184; CHECK-LABEL: vtrunc_nxv1i64_nxv1i16:
185; CHECK:       # %bb.0:
186; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, mu
187; CHECK-NEXT:    vnsrl.wi v25, v8, 0
188; CHECK-NEXT:    vsetvli zero, zero, e16, mf4, ta, mu
189; CHECK-NEXT:    vnsrl.wi v8, v25, 0
190; CHECK-NEXT:    ret
191  %tvec = trunc <vscale x 1 x i64> %va to <vscale x 1 x i16>
192  ret <vscale x 1 x i16> %tvec
193}
194
195define <vscale x 1 x i32> @vtrunc_nxv1i64_nxv1i32(<vscale x 1 x i64> %va) {
196; CHECK-LABEL: vtrunc_nxv1i64_nxv1i32:
197; CHECK:       # %bb.0:
198; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, mu
199; CHECK-NEXT:    vnsrl.wi v8, v8, 0
200; CHECK-NEXT:    ret
201  %tvec = trunc <vscale x 1 x i64> %va to <vscale x 1 x i32>
202  ret <vscale x 1 x i32> %tvec
203}
204
205define <vscale x 2 x i8> @vtrunc_nxv2i64_nxv2i8(<vscale x 2 x i64> %va) {
206; CHECK-LABEL: vtrunc_nxv2i64_nxv2i8:
207; CHECK:       # %bb.0:
208; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, mu
209; CHECK-NEXT:    vnsrl.wi v25, v8, 0
210; CHECK-NEXT:    vsetvli zero, zero, e16, mf2, ta, mu
211; CHECK-NEXT:    vnsrl.wi v25, v25, 0
212; CHECK-NEXT:    vsetvli zero, zero, e8, mf4, ta, mu
213; CHECK-NEXT:    vnsrl.wi v8, v25, 0
214; CHECK-NEXT:    ret
215  %tvec = trunc <vscale x 2 x i64> %va to <vscale x 2 x i8>
216  ret <vscale x 2 x i8> %tvec
217}
218
219define <vscale x 2 x i16> @vtrunc_nxv2i64_nxv2i16(<vscale x 2 x i64> %va) {
220; CHECK-LABEL: vtrunc_nxv2i64_nxv2i16:
221; CHECK:       # %bb.0:
222; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, mu
223; CHECK-NEXT:    vnsrl.wi v25, v8, 0
224; CHECK-NEXT:    vsetvli zero, zero, e16, mf2, ta, mu
225; CHECK-NEXT:    vnsrl.wi v8, v25, 0
226; CHECK-NEXT:    ret
227  %tvec = trunc <vscale x 2 x i64> %va to <vscale x 2 x i16>
228  ret <vscale x 2 x i16> %tvec
229}
230
231define <vscale x 2 x i32> @vtrunc_nxv2i64_nxv2i32(<vscale x 2 x i64> %va) {
232; CHECK-LABEL: vtrunc_nxv2i64_nxv2i32:
233; CHECK:       # %bb.0:
234; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, mu
235; CHECK-NEXT:    vnsrl.wi v25, v8, 0
236; CHECK-NEXT:    vmv1r.v v8, v25
237; CHECK-NEXT:    ret
238  %tvec = trunc <vscale x 2 x i64> %va to <vscale x 2 x i32>
239  ret <vscale x 2 x i32> %tvec
240}
241
242define <vscale x 4 x i8> @vtrunc_nxv4i64_nxv4i8(<vscale x 4 x i64> %va) {
243; CHECK-LABEL: vtrunc_nxv4i64_nxv4i8:
244; CHECK:       # %bb.0:
245; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, mu
246; CHECK-NEXT:    vnsrl.wi v26, v8, 0
247; CHECK-NEXT:    vsetvli zero, zero, e16, m1, ta, mu
248; CHECK-NEXT:    vnsrl.wi v25, v26, 0
249; CHECK-NEXT:    vsetvli zero, zero, e8, mf2, ta, mu
250; CHECK-NEXT:    vnsrl.wi v8, v25, 0
251; CHECK-NEXT:    ret
252  %tvec = trunc <vscale x 4 x i64> %va to <vscale x 4 x i8>
253  ret <vscale x 4 x i8> %tvec
254}
255
256define <vscale x 4 x i16> @vtrunc_nxv4i64_nxv4i16(<vscale x 4 x i64> %va) {
257; CHECK-LABEL: vtrunc_nxv4i64_nxv4i16:
258; CHECK:       # %bb.0:
259; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, mu
260; CHECK-NEXT:    vnsrl.wi v26, v8, 0
261; CHECK-NEXT:    vsetvli zero, zero, e16, m1, ta, mu
262; CHECK-NEXT:    vnsrl.wi v8, v26, 0
263; CHECK-NEXT:    ret
264  %tvec = trunc <vscale x 4 x i64> %va to <vscale x 4 x i16>
265  ret <vscale x 4 x i16> %tvec
266}
267
268define <vscale x 4 x i32> @vtrunc_nxv4i64_nxv4i32(<vscale x 4 x i64> %va) {
269; CHECK-LABEL: vtrunc_nxv4i64_nxv4i32:
270; CHECK:       # %bb.0:
271; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, mu
272; CHECK-NEXT:    vnsrl.wi v26, v8, 0
273; CHECK-NEXT:    vmv2r.v v8, v26
274; CHECK-NEXT:    ret
275  %tvec = trunc <vscale x 4 x i64> %va to <vscale x 4 x i32>
276  ret <vscale x 4 x i32> %tvec
277}
278
279define <vscale x 8 x i8> @vtrunc_nxv8i64_nxv8i8(<vscale x 8 x i64> %va) {
280; CHECK-LABEL: vtrunc_nxv8i64_nxv8i8:
281; CHECK:       # %bb.0:
282; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, mu
283; CHECK-NEXT:    vnsrl.wi v28, v8, 0
284; CHECK-NEXT:    vsetvli zero, zero, e16, m2, ta, mu
285; CHECK-NEXT:    vnsrl.wi v26, v28, 0
286; CHECK-NEXT:    vsetvli zero, zero, e8, m1, ta, mu
287; CHECK-NEXT:    vnsrl.wi v8, v26, 0
288; CHECK-NEXT:    ret
289  %tvec = trunc <vscale x 8 x i64> %va to <vscale x 8 x i8>
290  ret <vscale x 8 x i8> %tvec
291}
292
293define <vscale x 8 x i16> @vtrunc_nxv8i64_nxv8i16(<vscale x 8 x i64> %va) {
294; CHECK-LABEL: vtrunc_nxv8i64_nxv8i16:
295; CHECK:       # %bb.0:
296; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, mu
297; CHECK-NEXT:    vnsrl.wi v28, v8, 0
298; CHECK-NEXT:    vsetvli zero, zero, e16, m2, ta, mu
299; CHECK-NEXT:    vnsrl.wi v8, v28, 0
300; CHECK-NEXT:    ret
301  %tvec = trunc <vscale x 8 x i64> %va to <vscale x 8 x i16>
302  ret <vscale x 8 x i16> %tvec
303}
304
305define <vscale x 8 x i32> @vtrunc_nxv8i64_nxv8i32(<vscale x 8 x i64> %va) {
306; CHECK-LABEL: vtrunc_nxv8i64_nxv8i32:
307; CHECK:       # %bb.0:
308; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, mu
309; CHECK-NEXT:    vnsrl.wi v28, v8, 0
310; CHECK-NEXT:    vmv4r.v v8, v28
311; CHECK-NEXT:    ret
312  %tvec = trunc <vscale x 8 x i64> %va to <vscale x 8 x i32>
313  ret <vscale x 8 x i32> %tvec
314}
315
316