xref: /llvm-project/llvm/test/CodeGen/RISCV/double-zfa.ll (revision 261d4bbb3bb847b90b9734daefe13618dea91613)
1df56b55eSJun Sha (Joshua); NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2eae1e28cSAlex Bradbury; RUN: llc -mtriple=riscv32 -target-abi ilp32d -mattr=+zfa,+d < %s \
3df56b55eSJun Sha (Joshua); RUN:     | FileCheck --check-prefixes=CHECK,RV32IDZFA %s
4eae1e28cSAlex Bradbury; RUN: llc -mtriple=riscv64 -target-abi lp64d -mattr=+zfa,+d < %s \
5df56b55eSJun Sha (Joshua); RUN:     | FileCheck --check-prefixes=CHECK,RV64DZFA %s
6df56b55eSJun Sha (Joshua)
7ada26414SJun Sha (Joshua)define double @loadfpimm1() {
8ada26414SJun Sha (Joshua); CHECK-LABEL: loadfpimm1:
9ada26414SJun Sha (Joshua); CHECK:       # %bb.0:
10c2bcb21cSCraig Topper; CHECK-NEXT:    fli.d fa0, 0.0625
11ada26414SJun Sha (Joshua); CHECK-NEXT:    ret
12ada26414SJun Sha (Joshua)  ret double 0.0625
13ada26414SJun Sha (Joshua)}
14ada26414SJun Sha (Joshua)
15ada26414SJun Sha (Joshua)define double @loadfpimm2() {
16ada26414SJun Sha (Joshua); CHECK-LABEL: loadfpimm2:
17ada26414SJun Sha (Joshua); CHECK:       # %bb.0:
18c2bcb21cSCraig Topper; CHECK-NEXT:    fli.d fa0, 0.75
19ada26414SJun Sha (Joshua); CHECK-NEXT:    ret
20ada26414SJun Sha (Joshua)  ret double 0.75
21ada26414SJun Sha (Joshua)}
22ada26414SJun Sha (Joshua)
23ada26414SJun Sha (Joshua)define double @loadfpimm3() {
24ada26414SJun Sha (Joshua); CHECK-LABEL: loadfpimm3:
25ada26414SJun Sha (Joshua); CHECK:       # %bb.0:
26c2bcb21cSCraig Topper; CHECK-NEXT:    fli.d fa0, 1.25
27ada26414SJun Sha (Joshua); CHECK-NEXT:    ret
28ada26414SJun Sha (Joshua)  ret double 1.25
29ada26414SJun Sha (Joshua)}
30ada26414SJun Sha (Joshua)
31ada26414SJun Sha (Joshua)define double @loadfpimm4() {
32ada26414SJun Sha (Joshua); CHECK-LABEL: loadfpimm4:
33ada26414SJun Sha (Joshua); CHECK:       # %bb.0:
34c2bcb21cSCraig Topper; CHECK-NEXT:    fli.d fa0, 3.0
35ada26414SJun Sha (Joshua); CHECK-NEXT:    ret
36ada26414SJun Sha (Joshua)  ret double 3.0
37ada26414SJun Sha (Joshua)}
38ada26414SJun Sha (Joshua)
39ada26414SJun Sha (Joshua)define double @loadfpimm5() {
40ada26414SJun Sha (Joshua); CHECK-LABEL: loadfpimm5:
41ada26414SJun Sha (Joshua); CHECK:       # %bb.0:
42c2bcb21cSCraig Topper; CHECK-NEXT:    fli.d fa0, 256.0
43ada26414SJun Sha (Joshua); CHECK-NEXT:    ret
44ada26414SJun Sha (Joshua)  ret double 256.0
45ada26414SJun Sha (Joshua)}
46ada26414SJun Sha (Joshua)
47ada26414SJun Sha (Joshua)define double @loadfpimm6() {
48ada26414SJun Sha (Joshua); CHECK-LABEL: loadfpimm6:
49ada26414SJun Sha (Joshua); CHECK:       # %bb.0:
50ada26414SJun Sha (Joshua); CHECK-NEXT:    fli.d fa0, inf
51ada26414SJun Sha (Joshua); CHECK-NEXT:    ret
52ada26414SJun Sha (Joshua)  ret double 0x7FF0000000000000
53ada26414SJun Sha (Joshua)}
54ada26414SJun Sha (Joshua)
55ada26414SJun Sha (Joshua)define double @loadfpimm7() {
56ada26414SJun Sha (Joshua); CHECK-LABEL: loadfpimm7:
57ada26414SJun Sha (Joshua); CHECK:       # %bb.0:
58ada26414SJun Sha (Joshua); CHECK-NEXT:    fli.d fa0, nan
59ada26414SJun Sha (Joshua); CHECK-NEXT:    ret
60ada26414SJun Sha (Joshua)  ret double 0x7FF8000000000000
61ada26414SJun Sha (Joshua)}
62ada26414SJun Sha (Joshua)
63ada26414SJun Sha (Joshua)define double @loadfpimm8() {
64ada26414SJun Sha (Joshua); CHECK-LABEL: loadfpimm8:
65ada26414SJun Sha (Joshua); CHECK:       # %bb.0:
66ada26414SJun Sha (Joshua); CHECK-NEXT:    fli.d fa0, min
67ada26414SJun Sha (Joshua); CHECK-NEXT:    ret
68ada26414SJun Sha (Joshua)  ret double 0x0010000000000000
69ada26414SJun Sha (Joshua)}
70ada26414SJun Sha (Joshua)
71ada26414SJun Sha (Joshua)define double @loadfpimm9() {
72ada26414SJun Sha (Joshua); CHECK-LABEL: loadfpimm9:
73ada26414SJun Sha (Joshua); CHECK:       # %bb.0:
74ada26414SJun Sha (Joshua); CHECK-NEXT:    lui a0, %hi(.LCPI8_0)
75ada26414SJun Sha (Joshua); CHECK-NEXT:    fld fa0, %lo(.LCPI8_0)(a0)
76ada26414SJun Sha (Joshua); CHECK-NEXT:    ret
77ada26414SJun Sha (Joshua)  ret double 255.0
78ada26414SJun Sha (Joshua)}
79ada26414SJun Sha (Joshua)
80858451c5SCraig Topper; Negative test. This is 1 * 2^256.
81858451c5SCraig Topperdefine double @loadfpimm10() {
82858451c5SCraig Topper; CHECK-LABEL: loadfpimm10:
83858451c5SCraig Topper; CHECK:       # %bb.0:
84bf4b9857SCraig Topper; CHECK-NEXT:    lui a0, %hi(.LCPI9_0)
85bf4b9857SCraig Topper; CHECK-NEXT:    fld fa0, %lo(.LCPI9_0)(a0)
86858451c5SCraig Topper; CHECK-NEXT:    ret
87858451c5SCraig Topper  ret double 0x1000000000000000
88858451c5SCraig Topper}
89858451c5SCraig Topper
90c09730c2SCraig Topper; Negative test. This is a qnan with payload of 1.
91c09730c2SCraig Topperdefine double @loadfpimm11() {
92c09730c2SCraig Topper; CHECK-LABEL: loadfpimm11:
93c09730c2SCraig Topper; CHECK:       # %bb.0:
94c09730c2SCraig Topper; CHECK-NEXT:    lui a0, %hi(.LCPI10_0)
95c09730c2SCraig Topper; CHECK-NEXT:    fld fa0, %lo(.LCPI10_0)(a0)
96c09730c2SCraig Topper; CHECK-NEXT:    ret
97c09730c2SCraig Topper  ret double 0x7ff8000000000001
98c09730c2SCraig Topper}
99c09730c2SCraig Topper
100c09730c2SCraig Topper; Negative test. This is an snan with payload of 1.
101c09730c2SCraig Topperdefine double @loadfpimm12() {
102c09730c2SCraig Topper; CHECK-LABEL: loadfpimm12:
103c09730c2SCraig Topper; CHECK:       # %bb.0:
104c09730c2SCraig Topper; CHECK-NEXT:    lui a0, %hi(.LCPI11_0)
105c09730c2SCraig Topper; CHECK-NEXT:    fld fa0, %lo(.LCPI11_0)(a0)
106c09730c2SCraig Topper; CHECK-NEXT:    ret
107c09730c2SCraig Topper  ret double 0x7ff0000000000001
108c09730c2SCraig Topper}
109c09730c2SCraig Topper
110c09730c2SCraig Topper; Negative test. This is the smallest denormal.
111c09730c2SCraig Topperdefine double @loadfpimm13() {
112c09730c2SCraig Topper; RV32IDZFA-LABEL: loadfpimm13:
113c09730c2SCraig Topper; RV32IDZFA:       # %bb.0:
114c09730c2SCraig Topper; RV32IDZFA-NEXT:    lui a0, %hi(.LCPI12_0)
115c09730c2SCraig Topper; RV32IDZFA-NEXT:    fld fa0, %lo(.LCPI12_0)(a0)
116c09730c2SCraig Topper; RV32IDZFA-NEXT:    ret
117c09730c2SCraig Topper;
118c09730c2SCraig Topper; RV64DZFA-LABEL: loadfpimm13:
119c09730c2SCraig Topper; RV64DZFA:       # %bb.0:
120c09730c2SCraig Topper; RV64DZFA-NEXT:    li a0, 1
121c09730c2SCraig Topper; RV64DZFA-NEXT:    fmv.d.x fa0, a0
122c09730c2SCraig Topper; RV64DZFA-NEXT:    ret
123c09730c2SCraig Topper  ret double 0x0000000000000001
124c09730c2SCraig Topper}
125c09730c2SCraig Topper
126c09730c2SCraig Topper; Negative test. This is 2^-1023, a denormal.
127c09730c2SCraig Topperdefine double @loadfpimm15() {
128c09730c2SCraig Topper; CHECK-LABEL: loadfpimm15:
129c09730c2SCraig Topper; CHECK:       # %bb.0:
130c09730c2SCraig Topper; CHECK-NEXT:    lui a0, %hi(.LCPI13_0)
131c09730c2SCraig Topper; CHECK-NEXT:    fld fa0, %lo(.LCPI13_0)(a0)
132c09730c2SCraig Topper; CHECK-NEXT:    ret
133c09730c2SCraig Topper  ret double 0x0008000000000000
134c09730c2SCraig Topper}
135c09730c2SCraig Topper
136451255b2SAlex Bradburydefine double @loadfpimm16() {
137451255b2SAlex Bradbury; CHECK-LABEL: loadfpimm16:
138451255b2SAlex Bradbury; CHECK:       # %bb.0:
139451255b2SAlex Bradbury; CHECK-NEXT:    fli.d fa0, -1.0
140451255b2SAlex Bradbury; CHECK-NEXT:    ret
141451255b2SAlex Bradbury  ret double -1.0
142451255b2SAlex Bradbury}
143451255b2SAlex Bradbury
14487f67175SMin-Yih Hsu; Ensure fli isn't directly used for negated versions of numbers in the fli
145451255b2SAlex Bradbury; table.
146451255b2SAlex Bradburydefine double @loadfpimm17() {
147451255b2SAlex Bradbury; CHECK-LABEL: loadfpimm17:
148451255b2SAlex Bradbury; CHECK:       # %bb.0:
14987f67175SMin-Yih Hsu; CHECK-NEXT:    fli.d fa5, 2.0
15087f67175SMin-Yih Hsu; CHECK-NEXT:    fneg.d fa0, fa5
151451255b2SAlex Bradbury; CHECK-NEXT:    ret
152451255b2SAlex Bradbury  ret double -2.0
153451255b2SAlex Bradbury}
154451255b2SAlex Bradbury
15587f67175SMin-Yih Hsu; Ensure fli isn't directly used for negative min normal value.
156be0cbe91SCraig Topperdefine double @loadfpimm18() {
157be0cbe91SCraig Topper; CHECK-LABEL: loadfpimm18:
158be0cbe91SCraig Topper; CHECK:       # %bb.0:
15987f67175SMin-Yih Hsu; CHECK-NEXT:    fli.d fa5, min
16087f67175SMin-Yih Hsu; CHECK-NEXT:    fneg.d fa0, fa5
161be0cbe91SCraig Topper; CHECK-NEXT:    ret
162be0cbe91SCraig Topper  ret double 0x8010000000000000
163be0cbe91SCraig Topper}
164be0cbe91SCraig Topper
165df56b55eSJun Sha (Joshua)declare double @llvm.minimum.f64(double, double)
166df56b55eSJun Sha (Joshua)
167df56b55eSJun Sha (Joshua)define double @fminm_d(double %a, double %b) nounwind {
168df56b55eSJun Sha (Joshua); CHECK-LABEL: fminm_d:
169df56b55eSJun Sha (Joshua); CHECK:       # %bb.0:
170df56b55eSJun Sha (Joshua); CHECK-NEXT:    fminm.d fa0, fa0, fa1
171df56b55eSJun Sha (Joshua); CHECK-NEXT:    ret
172df56b55eSJun Sha (Joshua)  %1 = call double @llvm.minimum.f64(double %a, double %b)
173df56b55eSJun Sha (Joshua)  ret double %1
174df56b55eSJun Sha (Joshua)}
175df56b55eSJun Sha (Joshua)
176df56b55eSJun Sha (Joshua)declare double @llvm.maximum.f64(double, double)
177df56b55eSJun Sha (Joshua)
178df56b55eSJun Sha (Joshua)define double @fmaxm_d(double %a, double %b) nounwind {
179df56b55eSJun Sha (Joshua); CHECK-LABEL: fmaxm_d:
180df56b55eSJun Sha (Joshua); CHECK:       # %bb.0:
181df56b55eSJun Sha (Joshua); CHECK-NEXT:    fmaxm.d fa0, fa0, fa1
182df56b55eSJun Sha (Joshua); CHECK-NEXT:    ret
183df56b55eSJun Sha (Joshua)  %1 = call double @llvm.maximum.f64(double %a, double %b)
184df56b55eSJun Sha (Joshua)  ret double %1
185df56b55eSJun Sha (Joshua)}
186df56b55eSJun Sha (Joshua)
187df56b55eSJun Sha (Joshua)define double @fround_d_1(double %a) nounwind {
188df56b55eSJun Sha (Joshua); CHECK-LABEL: fround_d_1:
189df56b55eSJun Sha (Joshua); CHECK:       # %bb.0:
190df56b55eSJun Sha (Joshua); CHECK-NEXT:    fround.d fa0, fa0, rmm
191df56b55eSJun Sha (Joshua); CHECK-NEXT:    ret
192df56b55eSJun Sha (Joshua)  %call = tail call double @round(double %a) nounwind readnone
193df56b55eSJun Sha (Joshua)  ret double %call
194df56b55eSJun Sha (Joshua)}
195df56b55eSJun Sha (Joshua)
196df56b55eSJun Sha (Joshua)declare double @round(double) nounwind readnone
197df56b55eSJun Sha (Joshua)
198df56b55eSJun Sha (Joshua)
199df56b55eSJun Sha (Joshua)define double @fround_d_2(double %a) nounwind {
200df56b55eSJun Sha (Joshua); CHECK-LABEL: fround_d_2:
201df56b55eSJun Sha (Joshua); CHECK:       # %bb.0:
2024bbbae61SJun Sha (Joshua); CHECK-NEXT:    fround.d fa0, fa0, rdn
203df56b55eSJun Sha (Joshua); CHECK-NEXT:    ret
204df56b55eSJun Sha (Joshua)  %call = tail call double @floor(double %a) nounwind readnone
205df56b55eSJun Sha (Joshua)  ret double %call
206df56b55eSJun Sha (Joshua)}
207df56b55eSJun Sha (Joshua)
208df56b55eSJun Sha (Joshua)declare double @floor(double) nounwind readnone
209df56b55eSJun Sha (Joshua)
210df56b55eSJun Sha (Joshua)
211df56b55eSJun Sha (Joshua)define double @fround_d_3(double %a) nounwind {
212df56b55eSJun Sha (Joshua); CHECK-LABEL: fround_d_3:
213df56b55eSJun Sha (Joshua); CHECK:       # %bb.0:
2144bbbae61SJun Sha (Joshua); CHECK-NEXT:    fround.d fa0, fa0, rup
215df56b55eSJun Sha (Joshua); CHECK-NEXT:    ret
216df56b55eSJun Sha (Joshua)  %call = tail call double @ceil(double %a) nounwind readnone
217df56b55eSJun Sha (Joshua)  ret double %call
218df56b55eSJun Sha (Joshua)}
219df56b55eSJun Sha (Joshua)
220df56b55eSJun Sha (Joshua)declare double @ceil(double) nounwind readnone
221df56b55eSJun Sha (Joshua)
222df56b55eSJun Sha (Joshua)
223df56b55eSJun Sha (Joshua)define double @fround_d_4(double %a) nounwind {
224df56b55eSJun Sha (Joshua); CHECK-LABEL: fround_d_4:
225df56b55eSJun Sha (Joshua); CHECK:       # %bb.0:
226df56b55eSJun Sha (Joshua); CHECK-NEXT:    fround.d fa0, fa0, rtz
227df56b55eSJun Sha (Joshua); CHECK-NEXT:    ret
228df56b55eSJun Sha (Joshua)  %call = tail call double @trunc(double %a) nounwind readnone
229df56b55eSJun Sha (Joshua)  ret double %call
230df56b55eSJun Sha (Joshua)}
231df56b55eSJun Sha (Joshua)
232df56b55eSJun Sha (Joshua)declare double @trunc(double) nounwind readnone
233df56b55eSJun Sha (Joshua)
234df56b55eSJun Sha (Joshua)
235df56b55eSJun Sha (Joshua)define double @fround_d_5(double %a) nounwind {
236df56b55eSJun Sha (Joshua); CHECK-LABEL: fround_d_5:
237df56b55eSJun Sha (Joshua); CHECK:       # %bb.0:
238df56b55eSJun Sha (Joshua); CHECK-NEXT:    fround.d fa0, fa0
239df56b55eSJun Sha (Joshua); CHECK-NEXT:    ret
240df56b55eSJun Sha (Joshua)  %call = tail call double @nearbyint(double %a) nounwind readnone
241df56b55eSJun Sha (Joshua)  ret double %call
242df56b55eSJun Sha (Joshua)}
243df56b55eSJun Sha (Joshua)
244df56b55eSJun Sha (Joshua)declare double @nearbyint(double) nounwind readnone
245df56b55eSJun Sha (Joshua)
246*261d4bbbSLuke Quinndefine double @fround_d_6(double %a) nounwind {
247*261d4bbbSLuke Quinn; CHECK-LABEL: fround_d_6:
248*261d4bbbSLuke Quinn; CHECK:       # %bb.0:
249*261d4bbbSLuke Quinn; CHECK-NEXT:    fround.d fa0, fa0, rne
250*261d4bbbSLuke Quinn; CHECK-NEXT:    ret
251*261d4bbbSLuke Quinn  %call = tail call double @llvm.roundeven.f64(double %a) nounwind readnone
252*261d4bbbSLuke Quinn  ret double %call
253*261d4bbbSLuke Quinn}
254*261d4bbbSLuke Quinn
255*261d4bbbSLuke Quinndeclare double @llvm.roundeven.f64(double) nounwind readnone
256*261d4bbbSLuke Quinn
257df56b55eSJun Sha (Joshua)
258df56b55eSJun Sha (Joshua)define double @froundnx_d(double %a) nounwind {
259df56b55eSJun Sha (Joshua); CHECK-LABEL: froundnx_d:
260df56b55eSJun Sha (Joshua); CHECK:       # %bb.0:
261df56b55eSJun Sha (Joshua); CHECK-NEXT:    froundnx.d fa0, fa0
262df56b55eSJun Sha (Joshua); CHECK-NEXT:    ret
263df56b55eSJun Sha (Joshua)  %call = tail call double @rint(double %a) nounwind readnone
264df56b55eSJun Sha (Joshua)  ret double %call
265df56b55eSJun Sha (Joshua)}
266df56b55eSJun Sha (Joshua)
267df56b55eSJun Sha (Joshua)declare double @rint(double) nounwind readnone
268df56b55eSJun Sha (Joshua)
269df56b55eSJun Sha (Joshua)declare i1 @llvm.experimental.constrained.fcmp.f64(double, double, metadata, metadata)
270df56b55eSJun Sha (Joshua)
271df56b55eSJun Sha (Joshua)define i32 @fcmp_olt_q(double %a, double %b) nounwind strictfp {
272df56b55eSJun Sha (Joshua); CHECK-LABEL: fcmp_olt_q:
273df56b55eSJun Sha (Joshua); CHECK:       # %bb.0:
274df56b55eSJun Sha (Joshua); CHECK-NEXT:    fltq.d a0, fa0, fa1
275df56b55eSJun Sha (Joshua); CHECK-NEXT:    ret
276df56b55eSJun Sha (Joshua)  %1 = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"olt", metadata !"fpexcept.strict") strictfp
277df56b55eSJun Sha (Joshua)  %2 = zext i1 %1 to i32
278df56b55eSJun Sha (Joshua)  ret i32 %2
279df56b55eSJun Sha (Joshua)}
280df56b55eSJun Sha (Joshua)
281df56b55eSJun Sha (Joshua)define i32 @fcmp_ole_q(double %a, double %b) nounwind strictfp {
282df56b55eSJun Sha (Joshua); CHECK-LABEL: fcmp_ole_q:
283df56b55eSJun Sha (Joshua); CHECK:       # %bb.0:
284df56b55eSJun Sha (Joshua); CHECK-NEXT:    fleq.d a0, fa0, fa1
285df56b55eSJun Sha (Joshua); CHECK-NEXT:    ret
286df56b55eSJun Sha (Joshua)  %1 = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"ole", metadata !"fpexcept.strict") strictfp
287df56b55eSJun Sha (Joshua)  %2 = zext i1 %1 to i32
288df56b55eSJun Sha (Joshua)  ret i32 %2
289df56b55eSJun Sha (Joshua)}
290df56b55eSJun Sha (Joshua)
2913d0a5bf7SCraig Topperdefine i32 @fcmp_one_q(double %a, double %b) nounwind strictfp {
2923d0a5bf7SCraig Topper; CHECK-LABEL: fcmp_one_q:
2933d0a5bf7SCraig Topper; CHECK:       # %bb.0:
2943d0a5bf7SCraig Topper; CHECK-NEXT:    fltq.d a0, fa0, fa1
2953d0a5bf7SCraig Topper; CHECK-NEXT:    fltq.d a1, fa1, fa0
2963d0a5bf7SCraig Topper; CHECK-NEXT:    or a0, a1, a0
2973d0a5bf7SCraig Topper; CHECK-NEXT:    ret
2983d0a5bf7SCraig Topper  %1 = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"one", metadata !"fpexcept.strict") strictfp
2993d0a5bf7SCraig Topper  %2 = zext i1 %1 to i32
3003d0a5bf7SCraig Topper  ret i32 %2
3013d0a5bf7SCraig Topper}
3023d0a5bf7SCraig Topper
3033d0a5bf7SCraig Topperdefine i32 @fcmp_ueq_q(double %a, double %b) nounwind strictfp {
3043d0a5bf7SCraig Topper; CHECK-LABEL: fcmp_ueq_q:
3053d0a5bf7SCraig Topper; CHECK:       # %bb.0:
3063d0a5bf7SCraig Topper; CHECK-NEXT:    fltq.d a0, fa0, fa1
3073d0a5bf7SCraig Topper; CHECK-NEXT:    fltq.d a1, fa1, fa0
3083d0a5bf7SCraig Topper; CHECK-NEXT:    or a0, a1, a0
3093d0a5bf7SCraig Topper; CHECK-NEXT:    xori a0, a0, 1
3103d0a5bf7SCraig Topper; CHECK-NEXT:    ret
3113d0a5bf7SCraig Topper  %1 = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"ueq", metadata !"fpexcept.strict") strictfp
3123d0a5bf7SCraig Topper  %2 = zext i1 %1 to i32
3133d0a5bf7SCraig Topper  ret i32 %2
3143d0a5bf7SCraig Topper}
3153d0a5bf7SCraig Topper
316df56b55eSJun Sha (Joshua)define i64 @fmvh_x_d(double %fa) {
317df56b55eSJun Sha (Joshua); RV32IDZFA-LABEL: fmvh_x_d:
318df56b55eSJun Sha (Joshua); RV32IDZFA:       # %bb.0:
319df56b55eSJun Sha (Joshua); RV32IDZFA-NEXT:    fmv.x.w a0, fa0
320df56b55eSJun Sha (Joshua); RV32IDZFA-NEXT:    fmvh.x.d a1, fa0
321df56b55eSJun Sha (Joshua); RV32IDZFA-NEXT:    ret
322df56b55eSJun Sha (Joshua);
323df56b55eSJun Sha (Joshua); RV64DZFA-LABEL: fmvh_x_d:
324df56b55eSJun Sha (Joshua); RV64DZFA:       # %bb.0:
325df56b55eSJun Sha (Joshua); RV64DZFA-NEXT:    fmv.x.d a0, fa0
326df56b55eSJun Sha (Joshua); RV64DZFA-NEXT:    ret
327df56b55eSJun Sha (Joshua)  %i = bitcast double %fa to i64
328df56b55eSJun Sha (Joshua)  ret i64 %i
329df56b55eSJun Sha (Joshua)}
330df56b55eSJun Sha (Joshua)
331df56b55eSJun Sha (Joshua)define double @fmvp_d_x(i64 %a) {
332df56b55eSJun Sha (Joshua); RV32IDZFA-LABEL: fmvp_d_x:
333df56b55eSJun Sha (Joshua); RV32IDZFA:       # %bb.0:
334df56b55eSJun Sha (Joshua); RV32IDZFA-NEXT:    fmvp.d.x fa0, a0, a1
335df56b55eSJun Sha (Joshua); RV32IDZFA-NEXT:    ret
336df56b55eSJun Sha (Joshua);
337df56b55eSJun Sha (Joshua); RV64DZFA-LABEL: fmvp_d_x:
338df56b55eSJun Sha (Joshua); RV64DZFA:       # %bb.0:
339df56b55eSJun Sha (Joshua); RV64DZFA-NEXT:    fmv.d.x fa0, a0
340df56b55eSJun Sha (Joshua); RV64DZFA-NEXT:    ret
341df56b55eSJun Sha (Joshua)  %or = bitcast i64 %a to double
342df56b55eSJun Sha (Joshua)  ret double %or
343df56b55eSJun Sha (Joshua)}
344de6d7a6cSCraig Topper
345de6d7a6cSCraig Topperdefine double @fadd_neg_0p5(double %x) {
346de6d7a6cSCraig Topper; CHECK-LABEL: fadd_neg_0p5:
347de6d7a6cSCraig Topper; CHECK:       # %bb.0:
348de6d7a6cSCraig Topper; CHECK-NEXT:    fli.d fa5, 0.5
349de6d7a6cSCraig Topper; CHECK-NEXT:    fsub.d fa0, fa0, fa5
350de6d7a6cSCraig Topper; CHECK-NEXT:    ret
351de6d7a6cSCraig Topper  %a = fadd double %x, -0.5
352de6d7a6cSCraig Topper  ret double %a
353de6d7a6cSCraig Topper}
354de6d7a6cSCraig Topper
355de6d7a6cSCraig Topperdefine double @fma_neg_addend(double %x, double %y) nounwind {
356de6d7a6cSCraig Topper; CHECK-LABEL: fma_neg_addend:
357de6d7a6cSCraig Topper; CHECK:       # %bb.0:
358de6d7a6cSCraig Topper; CHECK-NEXT:    fli.d fa5, 0.5
359de6d7a6cSCraig Topper; CHECK-NEXT:    fmsub.d fa0, fa0, fa1, fa5
360de6d7a6cSCraig Topper; CHECK-NEXT:    ret
361de6d7a6cSCraig Topper  %a = call double @llvm.fma.f32(double %x, double %y, double -0.5)
362de6d7a6cSCraig Topper  ret double %a
363de6d7a6cSCraig Topper}
364de6d7a6cSCraig Topper
365de6d7a6cSCraig Topperdefine double @fma_neg_multiplicand(double %x, double %y) nounwind {
366de6d7a6cSCraig Topper; CHECK-LABEL: fma_neg_multiplicand:
367de6d7a6cSCraig Topper; CHECK:       # %bb.0:
368de6d7a6cSCraig Topper; CHECK-NEXT:    fli.d fa5, 0.125
369de6d7a6cSCraig Topper; CHECK-NEXT:    fnmsub.d fa0, fa5, fa0, fa1
370de6d7a6cSCraig Topper; CHECK-NEXT:    ret
371de6d7a6cSCraig Topper  %a = call double @llvm.fma.f32(double %x, double -0.125, double %y)
372de6d7a6cSCraig Topper  ret double %a
373de6d7a6cSCraig Topper}
374de6d7a6cSCraig Topper
375de6d7a6cSCraig Topperdefine double @fma_neg_addend_multiplicand(double %x) nounwind {
376de6d7a6cSCraig Topper; CHECK-LABEL: fma_neg_addend_multiplicand:
377de6d7a6cSCraig Topper; CHECK:       # %bb.0:
378de6d7a6cSCraig Topper; CHECK-NEXT:    fli.d fa5, 0.25
379de6d7a6cSCraig Topper; CHECK-NEXT:    fli.d fa4, 0.5
380de6d7a6cSCraig Topper; CHECK-NEXT:    fnmadd.d fa0, fa4, fa0, fa5
381de6d7a6cSCraig Topper; CHECK-NEXT:    ret
382de6d7a6cSCraig Topper  %a = call double @llvm.fma.f32(double %x, double -0.5, double -0.25)
383de6d7a6cSCraig Topper  ret double %a
384de6d7a6cSCraig Topper}
385079f31c1SCraig Topper
386079f31c1SCraig Topperdefine double @select_loadfpimm(double %x) nounwind {
387079f31c1SCraig Topper; RV32IDZFA-LABEL: select_loadfpimm:
388079f31c1SCraig Topper; RV32IDZFA:       # %bb.0: # %entry
389079f31c1SCraig Topper; RV32IDZFA-NEXT:    fcvt.d.w fa5, zero
390079f31c1SCraig Topper; RV32IDZFA-NEXT:    fle.d a0, fa5, fa0
391079f31c1SCraig Topper; RV32IDZFA-NEXT:    fli.d fa0, 0.5
392*261d4bbbSLuke Quinn; RV32IDZFA-NEXT:    bnez a0, .LBB36_2
393079f31c1SCraig Topper; RV32IDZFA-NEXT:  # %bb.1:
394079f31c1SCraig Topper; RV32IDZFA-NEXT:    fneg.d fa0, fa0
395*261d4bbbSLuke Quinn; RV32IDZFA-NEXT:  .LBB36_2: # %entry
396079f31c1SCraig Topper; RV32IDZFA-NEXT:    ret
397079f31c1SCraig Topper;
398079f31c1SCraig Topper; RV64DZFA-LABEL: select_loadfpimm:
399079f31c1SCraig Topper; RV64DZFA:       # %bb.0: # %entry
400079f31c1SCraig Topper; RV64DZFA-NEXT:    fmv.d.x fa5, zero
401079f31c1SCraig Topper; RV64DZFA-NEXT:    fle.d a0, fa5, fa0
402079f31c1SCraig Topper; RV64DZFA-NEXT:    fli.d fa0, 0.5
403*261d4bbbSLuke Quinn; RV64DZFA-NEXT:    bnez a0, .LBB36_2
404079f31c1SCraig Topper; RV64DZFA-NEXT:  # %bb.1:
405079f31c1SCraig Topper; RV64DZFA-NEXT:    fneg.d fa0, fa0
406*261d4bbbSLuke Quinn; RV64DZFA-NEXT:  .LBB36_2: # %entry
407079f31c1SCraig Topper; RV64DZFA-NEXT:    ret
408079f31c1SCraig Topperentry:
409079f31c1SCraig Topper  %cmp = fcmp ult double %x, 0.000000e+00
410079f31c1SCraig Topper  %sel = select i1 %cmp, double -5.000000e-01, double 5.000000e-01
411079f31c1SCraig Topper  ret double %sel
412079f31c1SCraig Topper}
413