xref: /llvm-project/llvm/test/CodeGen/RISCV/rvv/fixed-vectors-fround-constrained-sdnode.ll (revision 9122c5235ec85ce0c0ad337e862b006e7b349d84)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=riscv32 -mattr=+d,+zvfh,+v -target-abi=ilp32d \
3; RUN:     -verify-machineinstrs < %s | FileCheck %s
4; RUN: llc -mtriple=riscv64 -mattr=+d,+zvfh,+v -target-abi=lp64d \
5; RUN:     -verify-machineinstrs < %s | FileCheck %s
6
7; This file tests the code generation for `llvm.experimental.constrained.round.*` on scalable vector type.
8
9define <1 x half> @round_v1f16(<1 x half> %x) strictfp {
10; CHECK-LABEL: round_v1f16:
11; CHECK:       # %bb.0:
12; CHECK-NEXT:    vsetivli zero, 1, e16, mf4, ta, mu
13; CHECK-NEXT:    vmfne.vv v0, v8, v8
14; CHECK-NEXT:    lui a0, %hi(.LCPI0_0)
15; CHECK-NEXT:    flh fa5, %lo(.LCPI0_0)(a0)
16; CHECK-NEXT:    vfadd.vv v8, v8, v8, v0.t
17; CHECK-NEXT:    vfabs.v v9, v8
18; CHECK-NEXT:    vmflt.vf v0, v9, fa5
19; CHECK-NEXT:    fsrmi a0, 4
20; CHECK-NEXT:    vsetvli zero, zero, e16, mf4, ta, ma
21; CHECK-NEXT:    vfcvt.x.f.v v9, v8, v0.t
22; CHECK-NEXT:    fsrm a0
23; CHECK-NEXT:    vfcvt.f.x.v v9, v9, v0.t
24; CHECK-NEXT:    vsetvli zero, zero, e16, mf4, ta, mu
25; CHECK-NEXT:    vfsgnj.vv v8, v9, v8, v0.t
26; CHECK-NEXT:    ret
27  %a = call <1 x half> @llvm.experimental.constrained.round.v1f16(<1 x half> %x, metadata !"fpexcept.strict")
28  ret <1 x half> %a
29}
30declare <1 x half> @llvm.experimental.constrained.round.v1f16(<1 x half>, metadata)
31
32define <2 x half> @round_v2f16(<2 x half> %x) strictfp {
33; CHECK-LABEL: round_v2f16:
34; CHECK:       # %bb.0:
35; CHECK-NEXT:    vsetivli zero, 2, e16, mf4, ta, mu
36; CHECK-NEXT:    vmfne.vv v0, v8, v8
37; CHECK-NEXT:    lui a0, %hi(.LCPI1_0)
38; CHECK-NEXT:    flh fa5, %lo(.LCPI1_0)(a0)
39; CHECK-NEXT:    vfadd.vv v8, v8, v8, v0.t
40; CHECK-NEXT:    vfabs.v v9, v8
41; CHECK-NEXT:    vmflt.vf v0, v9, fa5
42; CHECK-NEXT:    fsrmi a0, 4
43; CHECK-NEXT:    vsetvli zero, zero, e16, mf4, ta, ma
44; CHECK-NEXT:    vfcvt.x.f.v v9, v8, v0.t
45; CHECK-NEXT:    fsrm a0
46; CHECK-NEXT:    vfcvt.f.x.v v9, v9, v0.t
47; CHECK-NEXT:    vsetvli zero, zero, e16, mf4, ta, mu
48; CHECK-NEXT:    vfsgnj.vv v8, v9, v8, v0.t
49; CHECK-NEXT:    ret
50  %a = call <2 x half> @llvm.experimental.constrained.round.v2f16(<2 x half> %x, metadata !"fpexcept.strict")
51  ret <2 x half> %a
52}
53declare <2 x half> @llvm.experimental.constrained.round.v2f16(<2 x half>, metadata)
54
55define <4 x half> @round_v4f16(<4 x half> %x) strictfp {
56; CHECK-LABEL: round_v4f16:
57; CHECK:       # %bb.0:
58; CHECK-NEXT:    vsetivli zero, 4, e16, mf2, ta, mu
59; CHECK-NEXT:    vmfne.vv v0, v8, v8
60; CHECK-NEXT:    lui a0, %hi(.LCPI2_0)
61; CHECK-NEXT:    flh fa5, %lo(.LCPI2_0)(a0)
62; CHECK-NEXT:    vfadd.vv v8, v8, v8, v0.t
63; CHECK-NEXT:    vfabs.v v9, v8
64; CHECK-NEXT:    vmflt.vf v0, v9, fa5
65; CHECK-NEXT:    fsrmi a0, 4
66; CHECK-NEXT:    vsetvli zero, zero, e16, mf2, ta, ma
67; CHECK-NEXT:    vfcvt.x.f.v v9, v8, v0.t
68; CHECK-NEXT:    fsrm a0
69; CHECK-NEXT:    vfcvt.f.x.v v9, v9, v0.t
70; CHECK-NEXT:    vsetvli zero, zero, e16, mf2, ta, mu
71; CHECK-NEXT:    vfsgnj.vv v8, v9, v8, v0.t
72; CHECK-NEXT:    ret
73  %a = call <4 x half> @llvm.experimental.constrained.round.v4f16(<4 x half> %x, metadata !"fpexcept.strict")
74  ret <4 x half> %a
75}
76declare <4 x half> @llvm.experimental.constrained.round.v4f16(<4 x half>, metadata)
77
78define <8 x half> @round_v8f16(<8 x half> %x) strictfp {
79; CHECK-LABEL: round_v8f16:
80; CHECK:       # %bb.0:
81; CHECK-NEXT:    vsetivli zero, 8, e16, m1, ta, mu
82; CHECK-NEXT:    vmfne.vv v0, v8, v8
83; CHECK-NEXT:    lui a0, %hi(.LCPI3_0)
84; CHECK-NEXT:    flh fa5, %lo(.LCPI3_0)(a0)
85; CHECK-NEXT:    vfadd.vv v8, v8, v8, v0.t
86; CHECK-NEXT:    vfabs.v v9, v8
87; CHECK-NEXT:    vmflt.vf v0, v9, fa5
88; CHECK-NEXT:    fsrmi a0, 4
89; CHECK-NEXT:    vsetvli zero, zero, e16, m1, ta, ma
90; CHECK-NEXT:    vfcvt.x.f.v v9, v8, v0.t
91; CHECK-NEXT:    fsrm a0
92; CHECK-NEXT:    vfcvt.f.x.v v9, v9, v0.t
93; CHECK-NEXT:    vsetvli zero, zero, e16, m1, ta, mu
94; CHECK-NEXT:    vfsgnj.vv v8, v9, v8, v0.t
95; CHECK-NEXT:    ret
96  %a = call <8 x half> @llvm.experimental.constrained.round.v8f16(<8 x half> %x, metadata !"fpexcept.strict")
97  ret <8 x half> %a
98}
99declare <8 x half> @llvm.experimental.constrained.round.v8f16(<8 x half>, metadata)
100
101define <16 x half> @round_v16f16(<16 x half> %x) strictfp {
102; CHECK-LABEL: round_v16f16:
103; CHECK:       # %bb.0:
104; CHECK-NEXT:    vsetivli zero, 16, e16, m2, ta, mu
105; CHECK-NEXT:    vmfne.vv v0, v8, v8
106; CHECK-NEXT:    lui a0, %hi(.LCPI4_0)
107; CHECK-NEXT:    flh fa5, %lo(.LCPI4_0)(a0)
108; CHECK-NEXT:    vfadd.vv v8, v8, v8, v0.t
109; CHECK-NEXT:    vfabs.v v10, v8
110; CHECK-NEXT:    vmflt.vf v0, v10, fa5
111; CHECK-NEXT:    fsrmi a0, 4
112; CHECK-NEXT:    vsetvli zero, zero, e16, m2, ta, ma
113; CHECK-NEXT:    vfcvt.x.f.v v10, v8, v0.t
114; CHECK-NEXT:    fsrm a0
115; CHECK-NEXT:    vfcvt.f.x.v v10, v10, v0.t
116; CHECK-NEXT:    vsetvli zero, zero, e16, m2, ta, mu
117; CHECK-NEXT:    vfsgnj.vv v8, v10, v8, v0.t
118; CHECK-NEXT:    ret
119  %a = call <16 x half> @llvm.experimental.constrained.round.v16f16(<16 x half> %x, metadata !"fpexcept.strict")
120  ret <16 x half> %a
121}
122declare <16 x half> @llvm.experimental.constrained.round.v16f16(<16 x half>, metadata)
123
124define <32 x half> @round_v32f16(<32 x half> %x) strictfp {
125; CHECK-LABEL: round_v32f16:
126; CHECK:       # %bb.0:
127; CHECK-NEXT:    li a0, 32
128; CHECK-NEXT:    lui a1, %hi(.LCPI5_0)
129; CHECK-NEXT:    vsetvli zero, a0, e16, m4, ta, mu
130; CHECK-NEXT:    vmfne.vv v0, v8, v8
131; CHECK-NEXT:    flh fa5, %lo(.LCPI5_0)(a1)
132; CHECK-NEXT:    vfadd.vv v8, v8, v8, v0.t
133; CHECK-NEXT:    vfabs.v v12, v8
134; CHECK-NEXT:    vmflt.vf v0, v12, fa5
135; CHECK-NEXT:    fsrmi a0, 4
136; CHECK-NEXT:    vsetvli zero, zero, e16, m4, ta, ma
137; CHECK-NEXT:    vfcvt.x.f.v v12, v8, v0.t
138; CHECK-NEXT:    fsrm a0
139; CHECK-NEXT:    vfcvt.f.x.v v12, v12, v0.t
140; CHECK-NEXT:    vsetvli zero, zero, e16, m4, ta, mu
141; CHECK-NEXT:    vfsgnj.vv v8, v12, v8, v0.t
142; CHECK-NEXT:    ret
143  %a = call <32 x half> @llvm.experimental.constrained.round.v32f16(<32 x half> %x, metadata !"fpexcept.strict")
144  ret <32 x half> %a
145}
146declare <32 x half> @llvm.experimental.constrained.round.v32f16(<32 x half>, metadata)
147
148define <1 x float> @round_v1f32(<1 x float> %x) strictfp {
149; CHECK-LABEL: round_v1f32:
150; CHECK:       # %bb.0:
151; CHECK-NEXT:    vsetivli zero, 1, e32, mf2, ta, mu
152; CHECK-NEXT:    vmfne.vv v0, v8, v8
153; CHECK-NEXT:    lui a0, 307200
154; CHECK-NEXT:    vfadd.vv v8, v8, v8, v0.t
155; CHECK-NEXT:    fmv.w.x fa5, a0
156; CHECK-NEXT:    vfabs.v v9, v8
157; CHECK-NEXT:    vmflt.vf v0, v9, fa5
158; CHECK-NEXT:    fsrmi a0, 4
159; CHECK-NEXT:    vsetvli zero, zero, e32, mf2, ta, ma
160; CHECK-NEXT:    vfcvt.x.f.v v9, v8, v0.t
161; CHECK-NEXT:    fsrm a0
162; CHECK-NEXT:    vfcvt.f.x.v v9, v9, v0.t
163; CHECK-NEXT:    vsetvli zero, zero, e32, mf2, ta, mu
164; CHECK-NEXT:    vfsgnj.vv v8, v9, v8, v0.t
165; CHECK-NEXT:    ret
166  %a = call <1 x float> @llvm.experimental.constrained.round.v1f32(<1 x float> %x, metadata !"fpexcept.strict")
167  ret <1 x float> %a
168}
169declare <1 x float> @llvm.experimental.constrained.round.v1f32(<1 x float>, metadata)
170
171define <2 x float> @round_v2f32(<2 x float> %x) strictfp {
172; CHECK-LABEL: round_v2f32:
173; CHECK:       # %bb.0:
174; CHECK-NEXT:    vsetivli zero, 2, e32, mf2, ta, mu
175; CHECK-NEXT:    vmfne.vv v0, v8, v8
176; CHECK-NEXT:    lui a0, 307200
177; CHECK-NEXT:    vfadd.vv v8, v8, v8, v0.t
178; CHECK-NEXT:    fmv.w.x fa5, a0
179; CHECK-NEXT:    vfabs.v v9, v8
180; CHECK-NEXT:    vmflt.vf v0, v9, fa5
181; CHECK-NEXT:    fsrmi a0, 4
182; CHECK-NEXT:    vsetvli zero, zero, e32, mf2, ta, ma
183; CHECK-NEXT:    vfcvt.x.f.v v9, v8, v0.t
184; CHECK-NEXT:    fsrm a0
185; CHECK-NEXT:    vfcvt.f.x.v v9, v9, v0.t
186; CHECK-NEXT:    vsetvli zero, zero, e32, mf2, ta, mu
187; CHECK-NEXT:    vfsgnj.vv v8, v9, v8, v0.t
188; CHECK-NEXT:    ret
189  %a = call <2 x float> @llvm.experimental.constrained.round.v2f32(<2 x float> %x, metadata !"fpexcept.strict")
190  ret <2 x float> %a
191}
192declare <2 x float> @llvm.experimental.constrained.round.v2f32(<2 x float>, metadata)
193
194define <4 x float> @round_v4f32(<4 x float> %x) strictfp {
195; CHECK-LABEL: round_v4f32:
196; CHECK:       # %bb.0:
197; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, mu
198; CHECK-NEXT:    vmfne.vv v0, v8, v8
199; CHECK-NEXT:    lui a0, 307200
200; CHECK-NEXT:    vfadd.vv v8, v8, v8, v0.t
201; CHECK-NEXT:    fmv.w.x fa5, a0
202; CHECK-NEXT:    vfabs.v v9, v8
203; CHECK-NEXT:    vmflt.vf v0, v9, fa5
204; CHECK-NEXT:    fsrmi a0, 4
205; CHECK-NEXT:    vsetvli zero, zero, e32, m1, ta, ma
206; CHECK-NEXT:    vfcvt.x.f.v v9, v8, v0.t
207; CHECK-NEXT:    fsrm a0
208; CHECK-NEXT:    vfcvt.f.x.v v9, v9, v0.t
209; CHECK-NEXT:    vsetvli zero, zero, e32, m1, ta, mu
210; CHECK-NEXT:    vfsgnj.vv v8, v9, v8, v0.t
211; CHECK-NEXT:    ret
212  %a = call <4 x float> @llvm.experimental.constrained.round.v4f32(<4 x float> %x, metadata !"fpexcept.strict")
213  ret <4 x float> %a
214}
215declare <4 x float> @llvm.experimental.constrained.round.v4f32(<4 x float>, metadata)
216
217define <8 x float> @round_v8f32(<8 x float> %x) strictfp {
218; CHECK-LABEL: round_v8f32:
219; CHECK:       # %bb.0:
220; CHECK-NEXT:    vsetivli zero, 8, e32, m2, ta, mu
221; CHECK-NEXT:    vmfne.vv v0, v8, v8
222; CHECK-NEXT:    lui a0, 307200
223; CHECK-NEXT:    vfadd.vv v8, v8, v8, v0.t
224; CHECK-NEXT:    fmv.w.x fa5, a0
225; CHECK-NEXT:    vfabs.v v10, v8
226; CHECK-NEXT:    vmflt.vf v0, v10, fa5
227; CHECK-NEXT:    fsrmi a0, 4
228; CHECK-NEXT:    vsetvli zero, zero, e32, m2, ta, ma
229; CHECK-NEXT:    vfcvt.x.f.v v10, v8, v0.t
230; CHECK-NEXT:    fsrm a0
231; CHECK-NEXT:    vfcvt.f.x.v v10, v10, v0.t
232; CHECK-NEXT:    vsetvli zero, zero, e32, m2, ta, mu
233; CHECK-NEXT:    vfsgnj.vv v8, v10, v8, v0.t
234; CHECK-NEXT:    ret
235  %a = call <8 x float> @llvm.experimental.constrained.round.v8f32(<8 x float> %x, metadata !"fpexcept.strict")
236  ret <8 x float> %a
237}
238declare <8 x float> @llvm.experimental.constrained.round.v8f32(<8 x float>, metadata)
239
240define <16 x float> @round_v16f32(<16 x float> %x) strictfp {
241; CHECK-LABEL: round_v16f32:
242; CHECK:       # %bb.0:
243; CHECK-NEXT:    vsetivli zero, 16, e32, m4, ta, mu
244; CHECK-NEXT:    vmfne.vv v0, v8, v8
245; CHECK-NEXT:    lui a0, 307200
246; CHECK-NEXT:    vfadd.vv v8, v8, v8, v0.t
247; CHECK-NEXT:    fmv.w.x fa5, a0
248; CHECK-NEXT:    vfabs.v v12, v8
249; CHECK-NEXT:    vmflt.vf v0, v12, fa5
250; CHECK-NEXT:    fsrmi a0, 4
251; CHECK-NEXT:    vsetvli zero, zero, e32, m4, ta, ma
252; CHECK-NEXT:    vfcvt.x.f.v v12, v8, v0.t
253; CHECK-NEXT:    fsrm a0
254; CHECK-NEXT:    vfcvt.f.x.v v12, v12, v0.t
255; CHECK-NEXT:    vsetvli zero, zero, e32, m4, ta, mu
256; CHECK-NEXT:    vfsgnj.vv v8, v12, v8, v0.t
257; CHECK-NEXT:    ret
258  %a = call <16 x float> @llvm.experimental.constrained.round.v16f32(<16 x float> %x, metadata !"fpexcept.strict")
259  ret <16 x float> %a
260}
261declare <16 x float> @llvm.experimental.constrained.round.v16f32(<16 x float>, metadata)
262
263define <1 x double> @round_v1f64(<1 x double> %x) strictfp {
264; CHECK-LABEL: round_v1f64:
265; CHECK:       # %bb.0:
266; CHECK-NEXT:    vsetivli zero, 1, e64, m1, ta, mu
267; CHECK-NEXT:    vmfne.vv v0, v8, v8
268; CHECK-NEXT:    lui a0, %hi(.LCPI11_0)
269; CHECK-NEXT:    fld fa5, %lo(.LCPI11_0)(a0)
270; CHECK-NEXT:    vfadd.vv v8, v8, v8, v0.t
271; CHECK-NEXT:    vfabs.v v9, v8
272; CHECK-NEXT:    vmflt.vf v0, v9, fa5
273; CHECK-NEXT:    fsrmi a0, 4
274; CHECK-NEXT:    vsetvli zero, zero, e64, m1, ta, ma
275; CHECK-NEXT:    vfcvt.x.f.v v9, v8, v0.t
276; CHECK-NEXT:    fsrm a0
277; CHECK-NEXT:    vfcvt.f.x.v v9, v9, v0.t
278; CHECK-NEXT:    vsetvli zero, zero, e64, m1, ta, mu
279; CHECK-NEXT:    vfsgnj.vv v8, v9, v8, v0.t
280; CHECK-NEXT:    ret
281  %a = call <1 x double> @llvm.experimental.constrained.round.v1f64(<1 x double> %x, metadata !"fpexcept.strict")
282  ret <1 x double> %a
283}
284declare <1 x double> @llvm.experimental.constrained.round.v1f64(<1 x double>, metadata)
285
286define <2 x double> @round_v2f64(<2 x double> %x) strictfp {
287; CHECK-LABEL: round_v2f64:
288; CHECK:       # %bb.0:
289; CHECK-NEXT:    vsetivli zero, 2, e64, m1, ta, mu
290; CHECK-NEXT:    vmfne.vv v0, v8, v8
291; CHECK-NEXT:    lui a0, %hi(.LCPI12_0)
292; CHECK-NEXT:    fld fa5, %lo(.LCPI12_0)(a0)
293; CHECK-NEXT:    vfadd.vv v8, v8, v8, v0.t
294; CHECK-NEXT:    vfabs.v v9, v8
295; CHECK-NEXT:    vmflt.vf v0, v9, fa5
296; CHECK-NEXT:    fsrmi a0, 4
297; CHECK-NEXT:    vsetvli zero, zero, e64, m1, ta, ma
298; CHECK-NEXT:    vfcvt.x.f.v v9, v8, v0.t
299; CHECK-NEXT:    fsrm a0
300; CHECK-NEXT:    vfcvt.f.x.v v9, v9, v0.t
301; CHECK-NEXT:    vsetvli zero, zero, e64, m1, ta, mu
302; CHECK-NEXT:    vfsgnj.vv v8, v9, v8, v0.t
303; CHECK-NEXT:    ret
304  %a = call <2 x double> @llvm.experimental.constrained.round.v2f64(<2 x double> %x, metadata !"fpexcept.strict")
305  ret <2 x double> %a
306}
307declare <2 x double> @llvm.experimental.constrained.round.v2f64(<2 x double>, metadata)
308
309define <4 x double> @round_v4f64(<4 x double> %x) strictfp {
310; CHECK-LABEL: round_v4f64:
311; CHECK:       # %bb.0:
312; CHECK-NEXT:    vsetivli zero, 4, e64, m2, ta, mu
313; CHECK-NEXT:    vmfne.vv v0, v8, v8
314; CHECK-NEXT:    lui a0, %hi(.LCPI13_0)
315; CHECK-NEXT:    fld fa5, %lo(.LCPI13_0)(a0)
316; CHECK-NEXT:    vfadd.vv v8, v8, v8, v0.t
317; CHECK-NEXT:    vfabs.v v10, v8
318; CHECK-NEXT:    vmflt.vf v0, v10, fa5
319; CHECK-NEXT:    fsrmi a0, 4
320; CHECK-NEXT:    vsetvli zero, zero, e64, m2, ta, ma
321; CHECK-NEXT:    vfcvt.x.f.v v10, v8, v0.t
322; CHECK-NEXT:    fsrm a0
323; CHECK-NEXT:    vfcvt.f.x.v v10, v10, v0.t
324; CHECK-NEXT:    vsetvli zero, zero, e64, m2, ta, mu
325; CHECK-NEXT:    vfsgnj.vv v8, v10, v8, v0.t
326; CHECK-NEXT:    ret
327  %a = call <4 x double> @llvm.experimental.constrained.round.v4f64(<4 x double> %x, metadata !"fpexcept.strict")
328  ret <4 x double> %a
329}
330declare <4 x double> @llvm.experimental.constrained.round.v4f64(<4 x double>, metadata)
331
332define <8 x double> @round_v8f64(<8 x double> %x) strictfp {
333; CHECK-LABEL: round_v8f64:
334; CHECK:       # %bb.0:
335; CHECK-NEXT:    vsetivli zero, 8, e64, m4, ta, mu
336; CHECK-NEXT:    vmfne.vv v0, v8, v8
337; CHECK-NEXT:    lui a0, %hi(.LCPI14_0)
338; CHECK-NEXT:    fld fa5, %lo(.LCPI14_0)(a0)
339; CHECK-NEXT:    vfadd.vv v8, v8, v8, v0.t
340; CHECK-NEXT:    vfabs.v v12, v8
341; CHECK-NEXT:    vmflt.vf v0, v12, fa5
342; CHECK-NEXT:    fsrmi a0, 4
343; CHECK-NEXT:    vsetvli zero, zero, e64, m4, ta, ma
344; CHECK-NEXT:    vfcvt.x.f.v v12, v8, v0.t
345; CHECK-NEXT:    fsrm a0
346; CHECK-NEXT:    vfcvt.f.x.v v12, v12, v0.t
347; CHECK-NEXT:    vsetvli zero, zero, e64, m4, ta, mu
348; CHECK-NEXT:    vfsgnj.vv v8, v12, v8, v0.t
349; CHECK-NEXT:    ret
350  %a = call <8 x double> @llvm.experimental.constrained.round.v8f64(<8 x double> %x, metadata !"fpexcept.strict")
351  ret <8 x double> %a
352}
353declare <8 x double> @llvm.experimental.constrained.round.v8f64(<8 x double>, metadata)
354