1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=riscv32 -mattr=+d,+zfh,+experimental-zvfh,+v -target-abi=ilp32d \
3; RUN:     -verify-machineinstrs < %s | FileCheck %s
4; RUN: llc -mtriple=riscv64 -mattr=+d,+zfh,+experimental-zvfh,+v -target-abi=lp64d \
5; RUN:     -verify-machineinstrs < %s | FileCheck %s
6
7define <vscale x 1 x half> @trunc_nxv1f16(<vscale x 1 x half> %x) {
8; CHECK-LABEL: trunc_nxv1f16:
9; CHECK:       # %bb.0:
10; CHECK-NEXT:    lui a0, %hi(.LCPI0_0)
11; CHECK-NEXT:    flh ft0, %lo(.LCPI0_0)(a0)
12; CHECK-NEXT:    vsetvli a0, zero, e16, mf4, ta, mu
13; CHECK-NEXT:    vfabs.v v9, v8
14; CHECK-NEXT:    vmflt.vf v0, v9, ft0
15; CHECK-NEXT:    vfcvt.rtz.x.f.v v9, v8
16; CHECK-NEXT:    vfcvt.f.x.v v9, v9
17; CHECK-NEXT:    vfsgnj.vv v9, v9, v8
18; CHECK-NEXT:    vmerge.vvm v8, v8, v9, v0
19; CHECK-NEXT:    ret
20  %a = call <vscale x 1 x half> @llvm.trunc.nxv1f16(<vscale x 1 x half> %x)
21  ret <vscale x 1 x half> %a
22}
23declare <vscale x 1 x half> @llvm.trunc.nxv1f16(<vscale x 1 x half>)
24
25define <vscale x 2 x half> @trunc_nxv2f16(<vscale x 2 x half> %x) {
26; CHECK-LABEL: trunc_nxv2f16:
27; CHECK:       # %bb.0:
28; CHECK-NEXT:    lui a0, %hi(.LCPI1_0)
29; CHECK-NEXT:    flh ft0, %lo(.LCPI1_0)(a0)
30; CHECK-NEXT:    vsetvli a0, zero, e16, mf2, ta, mu
31; CHECK-NEXT:    vfabs.v v9, v8
32; CHECK-NEXT:    vmflt.vf v0, v9, ft0
33; CHECK-NEXT:    vfcvt.rtz.x.f.v v9, v8
34; CHECK-NEXT:    vfcvt.f.x.v v9, v9
35; CHECK-NEXT:    vfsgnj.vv v9, v9, v8
36; CHECK-NEXT:    vmerge.vvm v8, v8, v9, v0
37; CHECK-NEXT:    ret
38  %a = call <vscale x 2 x half> @llvm.trunc.nxv2f16(<vscale x 2 x half> %x)
39  ret <vscale x 2 x half> %a
40}
41declare <vscale x 2 x half> @llvm.trunc.nxv2f16(<vscale x 2 x half>)
42
43define <vscale x 4 x half> @trunc_nxv4f16(<vscale x 4 x half> %x) {
44; CHECK-LABEL: trunc_nxv4f16:
45; CHECK:       # %bb.0:
46; CHECK-NEXT:    lui a0, %hi(.LCPI2_0)
47; CHECK-NEXT:    flh ft0, %lo(.LCPI2_0)(a0)
48; CHECK-NEXT:    vsetvli a0, zero, e16, m1, ta, mu
49; CHECK-NEXT:    vfabs.v v9, v8
50; CHECK-NEXT:    vmflt.vf v0, v9, ft0
51; CHECK-NEXT:    vfcvt.rtz.x.f.v v9, v8
52; CHECK-NEXT:    vfcvt.f.x.v v9, v9
53; CHECK-NEXT:    vfsgnj.vv v9, v9, v8
54; CHECK-NEXT:    vmerge.vvm v8, v8, v9, v0
55; CHECK-NEXT:    ret
56  %a = call <vscale x 4 x half> @llvm.trunc.nxv4f16(<vscale x 4 x half> %x)
57  ret <vscale x 4 x half> %a
58}
59declare <vscale x 4 x half> @llvm.trunc.nxv4f16(<vscale x 4 x half>)
60
61define <vscale x 8 x half> @trunc_nxv8f16(<vscale x 8 x half> %x) {
62; CHECK-LABEL: trunc_nxv8f16:
63; CHECK:       # %bb.0:
64; CHECK-NEXT:    lui a0, %hi(.LCPI3_0)
65; CHECK-NEXT:    flh ft0, %lo(.LCPI3_0)(a0)
66; CHECK-NEXT:    vsetvli a0, zero, e16, m2, ta, mu
67; CHECK-NEXT:    vfabs.v v10, v8
68; CHECK-NEXT:    vmflt.vf v0, v10, ft0
69; CHECK-NEXT:    vfcvt.rtz.x.f.v v10, v8
70; CHECK-NEXT:    vfcvt.f.x.v v10, v10
71; CHECK-NEXT:    vfsgnj.vv v10, v10, v8
72; CHECK-NEXT:    vmerge.vvm v8, v8, v10, v0
73; CHECK-NEXT:    ret
74  %a = call <vscale x 8 x half> @llvm.trunc.nxv8f16(<vscale x 8 x half> %x)
75  ret <vscale x 8 x half> %a
76}
77declare <vscale x 8 x half> @llvm.trunc.nxv8f16(<vscale x 8 x half>)
78
79define <vscale x 16 x half> @trunc_nxv16f16(<vscale x 16 x half> %x) {
80; CHECK-LABEL: trunc_nxv16f16:
81; CHECK:       # %bb.0:
82; CHECK-NEXT:    lui a0, %hi(.LCPI4_0)
83; CHECK-NEXT:    flh ft0, %lo(.LCPI4_0)(a0)
84; CHECK-NEXT:    vsetvli a0, zero, e16, m4, ta, mu
85; CHECK-NEXT:    vfabs.v v12, v8
86; CHECK-NEXT:    vmflt.vf v0, v12, ft0
87; CHECK-NEXT:    vfcvt.rtz.x.f.v v12, v8
88; CHECK-NEXT:    vfcvt.f.x.v v12, v12
89; CHECK-NEXT:    vfsgnj.vv v12, v12, v8
90; CHECK-NEXT:    vmerge.vvm v8, v8, v12, v0
91; CHECK-NEXT:    ret
92  %a = call <vscale x 16 x half> @llvm.trunc.nxv16f16(<vscale x 16 x half> %x)
93  ret <vscale x 16 x half> %a
94}
95declare <vscale x 16 x half> @llvm.trunc.nxv16f16(<vscale x 16 x half>)
96
97define <vscale x 32 x half> @trunc_nxv32f16(<vscale x 32 x half> %x) {
98; CHECK-LABEL: trunc_nxv32f16:
99; CHECK:       # %bb.0:
100; CHECK-NEXT:    lui a0, %hi(.LCPI5_0)
101; CHECK-NEXT:    flh ft0, %lo(.LCPI5_0)(a0)
102; CHECK-NEXT:    vsetvli a0, zero, e16, m8, ta, mu
103; CHECK-NEXT:    vfabs.v v16, v8
104; CHECK-NEXT:    vmflt.vf v0, v16, ft0
105; CHECK-NEXT:    vfcvt.rtz.x.f.v v16, v8
106; CHECK-NEXT:    vfcvt.f.x.v v16, v16
107; CHECK-NEXT:    vfsgnj.vv v16, v16, v8
108; CHECK-NEXT:    vmerge.vvm v8, v8, v16, v0
109; CHECK-NEXT:    ret
110  %a = call <vscale x 32 x half> @llvm.trunc.nxv32f16(<vscale x 32 x half> %x)
111  ret <vscale x 32 x half> %a
112}
113declare <vscale x 32 x half> @llvm.trunc.nxv32f16(<vscale x 32 x half>)
114
115define <vscale x 1 x float> @trunc_nxv1f32(<vscale x 1 x float> %x) {
116; CHECK-LABEL: trunc_nxv1f32:
117; CHECK:       # %bb.0:
118; CHECK-NEXT:    lui a0, %hi(.LCPI6_0)
119; CHECK-NEXT:    flw ft0, %lo(.LCPI6_0)(a0)
120; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, mu
121; CHECK-NEXT:    vfabs.v v9, v8
122; CHECK-NEXT:    vmflt.vf v0, v9, ft0
123; CHECK-NEXT:    vfcvt.rtz.x.f.v v9, v8
124; CHECK-NEXT:    vfcvt.f.x.v v9, v9
125; CHECK-NEXT:    vfsgnj.vv v9, v9, v8
126; CHECK-NEXT:    vmerge.vvm v8, v8, v9, v0
127; CHECK-NEXT:    ret
128  %a = call <vscale x 1 x float> @llvm.trunc.nxv1f32(<vscale x 1 x float> %x)
129  ret <vscale x 1 x float> %a
130}
131declare <vscale x 1 x float> @llvm.trunc.nxv1f32(<vscale x 1 x float>)
132
133define <vscale x 2 x float> @trunc_nxv2f32(<vscale x 2 x float> %x) {
134; CHECK-LABEL: trunc_nxv2f32:
135; CHECK:       # %bb.0:
136; CHECK-NEXT:    lui a0, %hi(.LCPI7_0)
137; CHECK-NEXT:    flw ft0, %lo(.LCPI7_0)(a0)
138; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, mu
139; CHECK-NEXT:    vfabs.v v9, v8
140; CHECK-NEXT:    vmflt.vf v0, v9, ft0
141; CHECK-NEXT:    vfcvt.rtz.x.f.v v9, v8
142; CHECK-NEXT:    vfcvt.f.x.v v9, v9
143; CHECK-NEXT:    vfsgnj.vv v9, v9, v8
144; CHECK-NEXT:    vmerge.vvm v8, v8, v9, v0
145; CHECK-NEXT:    ret
146  %a = call <vscale x 2 x float> @llvm.trunc.nxv2f32(<vscale x 2 x float> %x)
147  ret <vscale x 2 x float> %a
148}
149declare <vscale x 2 x float> @llvm.trunc.nxv2f32(<vscale x 2 x float>)
150
151define <vscale x 4 x float> @trunc_nxv4f32(<vscale x 4 x float> %x) {
152; CHECK-LABEL: trunc_nxv4f32:
153; CHECK:       # %bb.0:
154; CHECK-NEXT:    lui a0, %hi(.LCPI8_0)
155; CHECK-NEXT:    flw ft0, %lo(.LCPI8_0)(a0)
156; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, mu
157; CHECK-NEXT:    vfabs.v v10, v8
158; CHECK-NEXT:    vmflt.vf v0, v10, ft0
159; CHECK-NEXT:    vfcvt.rtz.x.f.v v10, v8
160; CHECK-NEXT:    vfcvt.f.x.v v10, v10
161; CHECK-NEXT:    vfsgnj.vv v10, v10, v8
162; CHECK-NEXT:    vmerge.vvm v8, v8, v10, v0
163; CHECK-NEXT:    ret
164  %a = call <vscale x 4 x float> @llvm.trunc.nxv4f32(<vscale x 4 x float> %x)
165  ret <vscale x 4 x float> %a
166}
167declare <vscale x 4 x float> @llvm.trunc.nxv4f32(<vscale x 4 x float>)
168
169define <vscale x 8 x float> @trunc_nxv8f32(<vscale x 8 x float> %x) {
170; CHECK-LABEL: trunc_nxv8f32:
171; CHECK:       # %bb.0:
172; CHECK-NEXT:    lui a0, %hi(.LCPI9_0)
173; CHECK-NEXT:    flw ft0, %lo(.LCPI9_0)(a0)
174; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, mu
175; CHECK-NEXT:    vfabs.v v12, v8
176; CHECK-NEXT:    vmflt.vf v0, v12, ft0
177; CHECK-NEXT:    vfcvt.rtz.x.f.v v12, v8
178; CHECK-NEXT:    vfcvt.f.x.v v12, v12
179; CHECK-NEXT:    vfsgnj.vv v12, v12, v8
180; CHECK-NEXT:    vmerge.vvm v8, v8, v12, v0
181; CHECK-NEXT:    ret
182  %a = call <vscale x 8 x float> @llvm.trunc.nxv8f32(<vscale x 8 x float> %x)
183  ret <vscale x 8 x float> %a
184}
185declare <vscale x 8 x float> @llvm.trunc.nxv8f32(<vscale x 8 x float>)
186
187define <vscale x 16 x float> @trunc_nxv16f32(<vscale x 16 x float> %x) {
188; CHECK-LABEL: trunc_nxv16f32:
189; CHECK:       # %bb.0:
190; CHECK-NEXT:    lui a0, %hi(.LCPI10_0)
191; CHECK-NEXT:    flw ft0, %lo(.LCPI10_0)(a0)
192; CHECK-NEXT:    vsetvli a0, zero, e32, m8, ta, mu
193; CHECK-NEXT:    vfabs.v v16, v8
194; CHECK-NEXT:    vmflt.vf v0, v16, ft0
195; CHECK-NEXT:    vfcvt.rtz.x.f.v v16, v8
196; CHECK-NEXT:    vfcvt.f.x.v v16, v16
197; CHECK-NEXT:    vfsgnj.vv v16, v16, v8
198; CHECK-NEXT:    vmerge.vvm v8, v8, v16, v0
199; CHECK-NEXT:    ret
200  %a = call <vscale x 16 x float> @llvm.trunc.nxv16f32(<vscale x 16 x float> %x)
201  ret <vscale x 16 x float> %a
202}
203declare <vscale x 16 x float> @llvm.trunc.nxv16f32(<vscale x 16 x float>)
204
205define <vscale x 1 x double> @trunc_nxv1f64(<vscale x 1 x double> %x) {
206; CHECK-LABEL: trunc_nxv1f64:
207; CHECK:       # %bb.0:
208; CHECK-NEXT:    lui a0, %hi(.LCPI11_0)
209; CHECK-NEXT:    fld ft0, %lo(.LCPI11_0)(a0)
210; CHECK-NEXT:    vsetvli a0, zero, e64, m1, ta, mu
211; CHECK-NEXT:    vfabs.v v9, v8
212; CHECK-NEXT:    vmflt.vf v0, v9, ft0
213; CHECK-NEXT:    vfcvt.rtz.x.f.v v9, v8
214; CHECK-NEXT:    vfcvt.f.x.v v9, v9
215; CHECK-NEXT:    vfsgnj.vv v9, v9, v8
216; CHECK-NEXT:    vmerge.vvm v8, v8, v9, v0
217; CHECK-NEXT:    ret
218  %a = call <vscale x 1 x double> @llvm.trunc.nxv1f64(<vscale x 1 x double> %x)
219  ret <vscale x 1 x double> %a
220}
221declare <vscale x 1 x double> @llvm.trunc.nxv1f64(<vscale x 1 x double>)
222
223define <vscale x 2 x double> @trunc_nxv2f64(<vscale x 2 x double> %x) {
224; CHECK-LABEL: trunc_nxv2f64:
225; CHECK:       # %bb.0:
226; CHECK-NEXT:    lui a0, %hi(.LCPI12_0)
227; CHECK-NEXT:    fld ft0, %lo(.LCPI12_0)(a0)
228; CHECK-NEXT:    vsetvli a0, zero, e64, m2, ta, mu
229; CHECK-NEXT:    vfabs.v v10, v8
230; CHECK-NEXT:    vmflt.vf v0, v10, ft0
231; CHECK-NEXT:    vfcvt.rtz.x.f.v v10, v8
232; CHECK-NEXT:    vfcvt.f.x.v v10, v10
233; CHECK-NEXT:    vfsgnj.vv v10, v10, v8
234; CHECK-NEXT:    vmerge.vvm v8, v8, v10, v0
235; CHECK-NEXT:    ret
236  %a = call <vscale x 2 x double> @llvm.trunc.nxv2f64(<vscale x 2 x double> %x)
237  ret <vscale x 2 x double> %a
238}
239declare <vscale x 2 x double> @llvm.trunc.nxv2f64(<vscale x 2 x double>)
240
241define <vscale x 4 x double> @trunc_nxv4f64(<vscale x 4 x double> %x) {
242; CHECK-LABEL: trunc_nxv4f64:
243; CHECK:       # %bb.0:
244; CHECK-NEXT:    lui a0, %hi(.LCPI13_0)
245; CHECK-NEXT:    fld ft0, %lo(.LCPI13_0)(a0)
246; CHECK-NEXT:    vsetvli a0, zero, e64, m4, ta, mu
247; CHECK-NEXT:    vfabs.v v12, v8
248; CHECK-NEXT:    vmflt.vf v0, v12, ft0
249; CHECK-NEXT:    vfcvt.rtz.x.f.v v12, v8
250; CHECK-NEXT:    vfcvt.f.x.v v12, v12
251; CHECK-NEXT:    vfsgnj.vv v12, v12, v8
252; CHECK-NEXT:    vmerge.vvm v8, v8, v12, v0
253; CHECK-NEXT:    ret
254  %a = call <vscale x 4 x double> @llvm.trunc.nxv4f64(<vscale x 4 x double> %x)
255  ret <vscale x 4 x double> %a
256}
257declare <vscale x 4 x double> @llvm.trunc.nxv4f64(<vscale x 4 x double>)
258
259define <vscale x 8 x double> @trunc_nxv8f64(<vscale x 8 x double> %x) {
260; CHECK-LABEL: trunc_nxv8f64:
261; CHECK:       # %bb.0:
262; CHECK-NEXT:    lui a0, %hi(.LCPI14_0)
263; CHECK-NEXT:    fld ft0, %lo(.LCPI14_0)(a0)
264; CHECK-NEXT:    vsetvli a0, zero, e64, m8, ta, mu
265; CHECK-NEXT:    vfabs.v v16, v8
266; CHECK-NEXT:    vmflt.vf v0, v16, ft0
267; CHECK-NEXT:    vfcvt.rtz.x.f.v v16, v8
268; CHECK-NEXT:    vfcvt.f.x.v v16, v16
269; CHECK-NEXT:    vfsgnj.vv v16, v16, v8
270; CHECK-NEXT:    vmerge.vvm v8, v8, v16, v0
271; CHECK-NEXT:    ret
272  %a = call <vscale x 8 x double> @llvm.trunc.nxv8f64(<vscale x 8 x double> %x)
273  ret <vscale x 8 x double> %a
274}
275declare <vscale x 8 x double> @llvm.trunc.nxv8f64(<vscale x 8 x double>)
276