xref: /llvm-project/llvm/test/CodeGen/LoongArch/fp-rounding.ll (revision 92be2cb08632ea38f6fbc41adfeb475ba27447dd)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2; RUN: llc --mtriple=loongarch64 --mattr=-lsx < %s | FileCheck %s --check-prefix=NOLSX
3; RUN: llc --mtriple=loongarch64 --mattr=+lsx < %s | FileCheck %s --check-prefix=LSX
4
5;; ceilf
6define float @ceil_f32(float %i) nounwind {
7; NOLSX-LABEL: ceil_f32:
8; NOLSX:       # %bb.0: # %entry
9; NOLSX-NEXT:    b %plt(ceilf)
10;
11; LSX-LABEL: ceil_f32:
12; LSX:       # %bb.0: # %entry
13; LSX-NEXT:    # kill: def $f0 killed $f0 def $vr0
14; LSX-NEXT:    vreplvei.w $vr0, $vr0, 0
15; LSX-NEXT:    vfrintrp.s $vr0, $vr0
16; LSX-NEXT:    # kill: def $f0 killed $f0 killed $vr0
17; LSX-NEXT:    ret
18entry:
19  %0 = call float @llvm.ceil.f32(float %i)
20  ret float %0
21}
22
23;; ceil
24define double @ceil_f64(double %i) nounwind {
25; NOLSX-LABEL: ceil_f64:
26; NOLSX:       # %bb.0: # %entry
27; NOLSX-NEXT:    b %plt(ceil)
28;
29; LSX-LABEL: ceil_f64:
30; LSX:       # %bb.0: # %entry
31; LSX-NEXT:    # kill: def $f0_64 killed $f0_64 def $vr0
32; LSX-NEXT:    vreplvei.d $vr0, $vr0, 0
33; LSX-NEXT:    vfrintrp.d $vr0, $vr0
34; LSX-NEXT:    # kill: def $f0_64 killed $f0_64 killed $vr0
35; LSX-NEXT:    ret
36entry:
37  %0 = call double @llvm.ceil.f64(double %i)
38  ret double %0
39}
40
41;; floorf
42define float @floor_f32(float %i) nounwind {
43; NOLSX-LABEL: floor_f32:
44; NOLSX:       # %bb.0: # %entry
45; NOLSX-NEXT:    b %plt(floorf)
46;
47; LSX-LABEL: floor_f32:
48; LSX:       # %bb.0: # %entry
49; LSX-NEXT:    # kill: def $f0 killed $f0 def $vr0
50; LSX-NEXT:    vreplvei.w $vr0, $vr0, 0
51; LSX-NEXT:    vfrintrm.s $vr0, $vr0
52; LSX-NEXT:    # kill: def $f0 killed $f0 killed $vr0
53; LSX-NEXT:    ret
54entry:
55  %0 = call float @llvm.floor.f32(float %i)
56  ret float %0
57}
58
59;; floor
60define double @floor_f64(double %i) nounwind {
61; NOLSX-LABEL: floor_f64:
62; NOLSX:       # %bb.0: # %entry
63; NOLSX-NEXT:    b %plt(floor)
64;
65; LSX-LABEL: floor_f64:
66; LSX:       # %bb.0: # %entry
67; LSX-NEXT:    # kill: def $f0_64 killed $f0_64 def $vr0
68; LSX-NEXT:    vreplvei.d $vr0, $vr0, 0
69; LSX-NEXT:    vfrintrm.d $vr0, $vr0
70; LSX-NEXT:    # kill: def $f0_64 killed $f0_64 killed $vr0
71; LSX-NEXT:    ret
72entry:
73  %0 = call double @llvm.floor.f64(double %i)
74  ret double %0
75}
76
77;; truncf
78define float @trunc_f32(float %i) nounwind {
79; NOLSX-LABEL: trunc_f32:
80; NOLSX:       # %bb.0: # %entry
81; NOLSX-NEXT:    b %plt(truncf)
82;
83; LSX-LABEL: trunc_f32:
84; LSX:       # %bb.0: # %entry
85; LSX-NEXT:    # kill: def $f0 killed $f0 def $vr0
86; LSX-NEXT:    vreplvei.w $vr0, $vr0, 0
87; LSX-NEXT:    vfrintrz.s $vr0, $vr0
88; LSX-NEXT:    # kill: def $f0 killed $f0 killed $vr0
89; LSX-NEXT:    ret
90entry:
91  %0 = call float @llvm.trunc.f32(float %i)
92  ret float %0
93}
94
95;; trunc
96define double @trunc_f64(double %i) nounwind {
97; NOLSX-LABEL: trunc_f64:
98; NOLSX:       # %bb.0: # %entry
99; NOLSX-NEXT:    b %plt(trunc)
100;
101; LSX-LABEL: trunc_f64:
102; LSX:       # %bb.0: # %entry
103; LSX-NEXT:    # kill: def $f0_64 killed $f0_64 def $vr0
104; LSX-NEXT:    vreplvei.d $vr0, $vr0, 0
105; LSX-NEXT:    vfrintrz.d $vr0, $vr0
106; LSX-NEXT:    # kill: def $f0_64 killed $f0_64 killed $vr0
107; LSX-NEXT:    ret
108entry:
109  %0 = call double @llvm.trunc.f64(double %i)
110  ret double %0
111}
112
113;; roundevenf
114define float @roundeven_f32(float %i) nounwind {
115; NOLSX-LABEL: roundeven_f32:
116; NOLSX:       # %bb.0: # %entry
117; NOLSX-NEXT:    b %plt(roundevenf)
118;
119; LSX-LABEL: roundeven_f32:
120; LSX:       # %bb.0: # %entry
121; LSX-NEXT:    # kill: def $f0 killed $f0 def $vr0
122; LSX-NEXT:    vreplvei.w $vr0, $vr0, 0
123; LSX-NEXT:    vfrintrne.s $vr0, $vr0
124; LSX-NEXT:    # kill: def $f0 killed $f0 killed $vr0
125; LSX-NEXT:    ret
126entry:
127  %0 = call float @llvm.roundeven.f32(float %i)
128  ret float %0
129}
130
131;; roundeven
132define double @roundeven_f64(double %i) nounwind {
133; NOLSX-LABEL: roundeven_f64:
134; NOLSX:       # %bb.0: # %entry
135; NOLSX-NEXT:    b %plt(roundeven)
136;
137; LSX-LABEL: roundeven_f64:
138; LSX:       # %bb.0: # %entry
139; LSX-NEXT:    # kill: def $f0_64 killed $f0_64 def $vr0
140; LSX-NEXT:    vreplvei.d $vr0, $vr0, 0
141; LSX-NEXT:    vfrintrne.d $vr0, $vr0
142; LSX-NEXT:    # kill: def $f0_64 killed $f0_64 killed $vr0
143; LSX-NEXT:    ret
144entry:
145  %0 = call double @llvm.roundeven.f64(double %i)
146  ret double %0
147}
148
149declare float @llvm.ceil.f32(float)
150declare double @llvm.ceil.f64(double)
151declare float @llvm.floor.f32(float)
152declare double @llvm.floor.f64(double)
153declare float @llvm.trunc.f32(float)
154declare double @llvm.trunc.f64(double)
155declare float @llvm.roundeven.f32(float)
156declare double @llvm.roundeven.f64(double)
157