1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=riscv32 -mattr=+d,+experimental-zfh,+experimental-v -target-abi=ilp32d \
3; RUN:     -verify-machineinstrs < %s | FileCheck %s --check-prefix=RV32
4; RUN: llc -mtriple=riscv64 -mattr=+d,+experimental-zfh,+experimental-v -target-abi=lp64d \
5; RUN:     -verify-machineinstrs < %s | FileCheck %s --check-prefix=RV64
6
7define <vscale x 1 x half> @vfptrunc_nxv1f32_nxv1f16(<vscale x 1 x float> %va) {
8;
9; RV32-LABEL: vfptrunc_nxv1f32_nxv1f16:
10; RV32:       # %bb.0:
11; RV32-NEXT:    vsetvli a0, zero, e16, mf4, ta, mu
12; RV32-NEXT:    vfncvt.f.f.w v25, v8
13; RV32-NEXT:    vmv1r.v v8, v25
14; RV32-NEXT:    ret
15;
16; RV64-LABEL: vfptrunc_nxv1f32_nxv1f16:
17; RV64:       # %bb.0:
18; RV64-NEXT:    vsetvli a0, zero, e16, mf4, ta, mu
19; RV64-NEXT:    vfncvt.f.f.w v25, v8
20; RV64-NEXT:    vmv1r.v v8, v25
21; RV64-NEXT:    ret
22  %evec = fptrunc <vscale x 1 x float> %va to <vscale x 1 x half>
23  ret <vscale x 1 x half> %evec
24}
25
26define <vscale x 2 x half> @vfptrunc_nxv2f32_nxv2f16(<vscale x 2 x float> %va) {
27;
28; RV32-LABEL: vfptrunc_nxv2f32_nxv2f16:
29; RV32:       # %bb.0:
30; RV32-NEXT:    vsetvli a0, zero, e16, mf2, ta, mu
31; RV32-NEXT:    vfncvt.f.f.w v25, v8
32; RV32-NEXT:    vmv1r.v v8, v25
33; RV32-NEXT:    ret
34;
35; RV64-LABEL: vfptrunc_nxv2f32_nxv2f16:
36; RV64:       # %bb.0:
37; RV64-NEXT:    vsetvli a0, zero, e16, mf2, ta, mu
38; RV64-NEXT:    vfncvt.f.f.w v25, v8
39; RV64-NEXT:    vmv1r.v v8, v25
40; RV64-NEXT:    ret
41  %evec = fptrunc <vscale x 2 x float> %va to <vscale x 2 x half>
42  ret <vscale x 2 x half> %evec
43}
44
45define <vscale x 4 x half> @vfptrunc_nxv4f32_nxv4f16(<vscale x 4 x float> %va) {
46;
47; RV32-LABEL: vfptrunc_nxv4f32_nxv4f16:
48; RV32:       # %bb.0:
49; RV32-NEXT:    vsetvli a0, zero, e16, m1, ta, mu
50; RV32-NEXT:    vfncvt.f.f.w v25, v8
51; RV32-NEXT:    vmv1r.v v8, v25
52; RV32-NEXT:    ret
53;
54; RV64-LABEL: vfptrunc_nxv4f32_nxv4f16:
55; RV64:       # %bb.0:
56; RV64-NEXT:    vsetvli a0, zero, e16, m1, ta, mu
57; RV64-NEXT:    vfncvt.f.f.w v25, v8
58; RV64-NEXT:    vmv1r.v v8, v25
59; RV64-NEXT:    ret
60  %evec = fptrunc <vscale x 4 x float> %va to <vscale x 4 x half>
61  ret <vscale x 4 x half> %evec
62}
63
64define <vscale x 8 x half> @vfptrunc_nxv8f32_nxv8f16(<vscale x 8 x float> %va) {
65;
66; RV32-LABEL: vfptrunc_nxv8f32_nxv8f16:
67; RV32:       # %bb.0:
68; RV32-NEXT:    vsetvli a0, zero, e16, m2, ta, mu
69; RV32-NEXT:    vfncvt.f.f.w v26, v8
70; RV32-NEXT:    vmv2r.v v8, v26
71; RV32-NEXT:    ret
72;
73; RV64-LABEL: vfptrunc_nxv8f32_nxv8f16:
74; RV64:       # %bb.0:
75; RV64-NEXT:    vsetvli a0, zero, e16, m2, ta, mu
76; RV64-NEXT:    vfncvt.f.f.w v26, v8
77; RV64-NEXT:    vmv2r.v v8, v26
78; RV64-NEXT:    ret
79  %evec = fptrunc <vscale x 8 x float> %va to <vscale x 8 x half>
80  ret <vscale x 8 x half> %evec
81}
82
83define <vscale x 16 x half> @vfptrunc_nxv16f32_nxv16f16(<vscale x 16 x float> %va) {
84;
85; RV32-LABEL: vfptrunc_nxv16f32_nxv16f16:
86; RV32:       # %bb.0:
87; RV32-NEXT:    vsetvli a0, zero, e16, m4, ta, mu
88; RV32-NEXT:    vfncvt.f.f.w v28, v8
89; RV32-NEXT:    vmv4r.v v8, v28
90; RV32-NEXT:    ret
91;
92; RV64-LABEL: vfptrunc_nxv16f32_nxv16f16:
93; RV64:       # %bb.0:
94; RV64-NEXT:    vsetvli a0, zero, e16, m4, ta, mu
95; RV64-NEXT:    vfncvt.f.f.w v28, v8
96; RV64-NEXT:    vmv4r.v v8, v28
97; RV64-NEXT:    ret
98  %evec = fptrunc <vscale x 16 x float> %va to <vscale x 16 x half>
99  ret <vscale x 16 x half> %evec
100}
101
102define <vscale x 1 x half> @vfptrunc_nxv1f64_nxv1f16(<vscale x 1 x double> %va) {
103;
104; RV32-LABEL: vfptrunc_nxv1f64_nxv1f16:
105; RV32:       # %bb.0:
106; RV32-NEXT:    vsetvli a0, zero, e32, mf2, ta, mu
107; RV32-NEXT:    vfncvt.rod.f.f.w v25, v8
108; RV32-NEXT:    vsetvli zero, zero, e16, mf4, ta, mu
109; RV32-NEXT:    vfncvt.f.f.w v8, v25
110; RV32-NEXT:    ret
111;
112; RV64-LABEL: vfptrunc_nxv1f64_nxv1f16:
113; RV64:       # %bb.0:
114; RV64-NEXT:    vsetvli a0, zero, e32, mf2, ta, mu
115; RV64-NEXT:    vfncvt.rod.f.f.w v25, v8
116; RV64-NEXT:    vsetvli zero, zero, e16, mf4, ta, mu
117; RV64-NEXT:    vfncvt.f.f.w v8, v25
118; RV64-NEXT:    ret
119  %evec = fptrunc <vscale x 1 x double> %va to <vscale x 1 x half>
120  ret <vscale x 1 x half> %evec
121}
122
123define <vscale x 1 x float> @vfptrunc_nxv1f64_nxv1f32(<vscale x 1 x double> %va) {
124;
125; RV32-LABEL: vfptrunc_nxv1f64_nxv1f32:
126; RV32:       # %bb.0:
127; RV32-NEXT:    vsetvli a0, zero, e32, mf2, ta, mu
128; RV32-NEXT:    vfncvt.f.f.w v25, v8
129; RV32-NEXT:    vmv1r.v v8, v25
130; RV32-NEXT:    ret
131;
132; RV64-LABEL: vfptrunc_nxv1f64_nxv1f32:
133; RV64:       # %bb.0:
134; RV64-NEXT:    vsetvli a0, zero, e32, mf2, ta, mu
135; RV64-NEXT:    vfncvt.f.f.w v25, v8
136; RV64-NEXT:    vmv1r.v v8, v25
137; RV64-NEXT:    ret
138  %evec = fptrunc <vscale x 1 x double> %va to <vscale x 1 x float>
139  ret <vscale x 1 x float> %evec
140}
141
142define <vscale x 2 x half> @vfptrunc_nxv2f64_nxv2f16(<vscale x 2 x double> %va) {
143;
144; RV32-LABEL: vfptrunc_nxv2f64_nxv2f16:
145; RV32:       # %bb.0:
146; RV32-NEXT:    vsetvli a0, zero, e32, m1, ta, mu
147; RV32-NEXT:    vfncvt.rod.f.f.w v25, v8
148; RV32-NEXT:    vsetvli zero, zero, e16, mf2, ta, mu
149; RV32-NEXT:    vfncvt.f.f.w v8, v25
150; RV32-NEXT:    ret
151;
152; RV64-LABEL: vfptrunc_nxv2f64_nxv2f16:
153; RV64:       # %bb.0:
154; RV64-NEXT:    vsetvli a0, zero, e32, m1, ta, mu
155; RV64-NEXT:    vfncvt.rod.f.f.w v25, v8
156; RV64-NEXT:    vsetvli zero, zero, e16, mf2, ta, mu
157; RV64-NEXT:    vfncvt.f.f.w v8, v25
158; RV64-NEXT:    ret
159  %evec = fptrunc <vscale x 2 x double> %va to <vscale x 2 x half>
160  ret <vscale x 2 x half> %evec
161}
162
163define <vscale x 2 x float> @vfptrunc_nxv2f64_nxv2f32(<vscale x 2 x double> %va) {
164;
165; RV32-LABEL: vfptrunc_nxv2f64_nxv2f32:
166; RV32:       # %bb.0:
167; RV32-NEXT:    vsetvli a0, zero, e32, m1, ta, mu
168; RV32-NEXT:    vfncvt.f.f.w v25, v8
169; RV32-NEXT:    vmv1r.v v8, v25
170; RV32-NEXT:    ret
171;
172; RV64-LABEL: vfptrunc_nxv2f64_nxv2f32:
173; RV64:       # %bb.0:
174; RV64-NEXT:    vsetvli a0, zero, e32, m1, ta, mu
175; RV64-NEXT:    vfncvt.f.f.w v25, v8
176; RV64-NEXT:    vmv1r.v v8, v25
177; RV64-NEXT:    ret
178  %evec = fptrunc <vscale x 2 x double> %va to <vscale x 2 x float>
179  ret <vscale x 2 x float> %evec
180}
181
182define <vscale x 4 x half> @vfptrunc_nxv4f64_nxv4f16(<vscale x 4 x double> %va) {
183;
184; RV32-LABEL: vfptrunc_nxv4f64_nxv4f16:
185; RV32:       # %bb.0:
186; RV32-NEXT:    vsetvli a0, zero, e32, m2, ta, mu
187; RV32-NEXT:    vfncvt.rod.f.f.w v26, v8
188; RV32-NEXT:    vsetvli zero, zero, e16, m1, ta, mu
189; RV32-NEXT:    vfncvt.f.f.w v8, v26
190; RV32-NEXT:    ret
191;
192; RV64-LABEL: vfptrunc_nxv4f64_nxv4f16:
193; RV64:       # %bb.0:
194; RV64-NEXT:    vsetvli a0, zero, e32, m2, ta, mu
195; RV64-NEXT:    vfncvt.rod.f.f.w v26, v8
196; RV64-NEXT:    vsetvli zero, zero, e16, m1, ta, mu
197; RV64-NEXT:    vfncvt.f.f.w v8, v26
198; RV64-NEXT:    ret
199  %evec = fptrunc <vscale x 4 x double> %va to <vscale x 4 x half>
200  ret <vscale x 4 x half> %evec
201}
202
203define <vscale x 4 x float> @vfptrunc_nxv4f64_nxv4f32(<vscale x 4 x double> %va) {
204;
205; RV32-LABEL: vfptrunc_nxv4f64_nxv4f32:
206; RV32:       # %bb.0:
207; RV32-NEXT:    vsetvli a0, zero, e32, m2, ta, mu
208; RV32-NEXT:    vfncvt.f.f.w v26, v8
209; RV32-NEXT:    vmv2r.v v8, v26
210; RV32-NEXT:    ret
211;
212; RV64-LABEL: vfptrunc_nxv4f64_nxv4f32:
213; RV64:       # %bb.0:
214; RV64-NEXT:    vsetvli a0, zero, e32, m2, ta, mu
215; RV64-NEXT:    vfncvt.f.f.w v26, v8
216; RV64-NEXT:    vmv2r.v v8, v26
217; RV64-NEXT:    ret
218  %evec = fptrunc <vscale x 4 x double> %va to <vscale x 4 x float>
219  ret <vscale x 4 x float> %evec
220}
221
222define <vscale x 8 x half> @vfptrunc_nxv8f64_nxv8f16(<vscale x 8 x double> %va) {
223;
224; RV32-LABEL: vfptrunc_nxv8f64_nxv8f16:
225; RV32:       # %bb.0:
226; RV32-NEXT:    vsetvli a0, zero, e32, m4, ta, mu
227; RV32-NEXT:    vfncvt.rod.f.f.w v28, v8
228; RV32-NEXT:    vsetvli zero, zero, e16, m2, ta, mu
229; RV32-NEXT:    vfncvt.f.f.w v8, v28
230; RV32-NEXT:    ret
231;
232; RV64-LABEL: vfptrunc_nxv8f64_nxv8f16:
233; RV64:       # %bb.0:
234; RV64-NEXT:    vsetvli a0, zero, e32, m4, ta, mu
235; RV64-NEXT:    vfncvt.rod.f.f.w v28, v8
236; RV64-NEXT:    vsetvli zero, zero, e16, m2, ta, mu
237; RV64-NEXT:    vfncvt.f.f.w v8, v28
238; RV64-NEXT:    ret
239  %evec = fptrunc <vscale x 8 x double> %va to <vscale x 8 x half>
240  ret <vscale x 8 x half> %evec
241}
242
243define <vscale x 8 x float> @vfptrunc_nxv8f64_nxv8f32(<vscale x 8 x double> %va) {
244;
245; RV32-LABEL: vfptrunc_nxv8f64_nxv8f32:
246; RV32:       # %bb.0:
247; RV32-NEXT:    vsetvli a0, zero, e32, m4, ta, mu
248; RV32-NEXT:    vfncvt.f.f.w v28, v8
249; RV32-NEXT:    vmv4r.v v8, v28
250; RV32-NEXT:    ret
251;
252; RV64-LABEL: vfptrunc_nxv8f64_nxv8f32:
253; RV64:       # %bb.0:
254; RV64-NEXT:    vsetvli a0, zero, e32, m4, ta, mu
255; RV64-NEXT:    vfncvt.f.f.w v28, v8
256; RV64-NEXT:    vmv4r.v v8, v28
257; RV64-NEXT:    ret
258  %evec = fptrunc <vscale x 8 x double> %va to <vscale x 8 x float>
259  ret <vscale x 8 x float> %evec
260}
261
262