xref: /llvm-project/llvm/test/CodeGen/RISCV/GlobalISel/float-arith.ll (revision 115872902b9b056d42e24273f93a2be7c93d2f54)
1bb5bbe52SCraig Topper; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2bb5bbe52SCraig Topper; RUN: llc -mtriple=riscv32 -global-isel -mattr=+f -verify-machineinstrs < %s \
3bb5bbe52SCraig Topper; RUN:   -target-abi=ilp32f | FileCheck -check-prefix=CHECKIF %s
4bb5bbe52SCraig Topper; RUN: llc -mtriple=riscv64 -global-isel -mattr=+f -verify-machineinstrs < %s \
5bb5bbe52SCraig Topper; RUN:   -target-abi=lp64f | FileCheck -check-prefix=CHECKIF %s
6bb5bbe52SCraig Topper; RUN: llc -mtriple=riscv32 -global-isel -verify-machineinstrs < %s \
7bb5bbe52SCraig Topper; RUN:   | FileCheck -check-prefix=RV32I %s
8bb5bbe52SCraig Topper; RUN: llc -mtriple=riscv64 -global-isel -verify-machineinstrs < %s \
9bb5bbe52SCraig Topper; RUN:   | FileCheck -check-prefix=RV64I %s
10bb5bbe52SCraig Topper
11bb5bbe52SCraig Topper; These tests are each targeted at a particular RISC-V FPU instruction.
12bb5bbe52SCraig Topper; Compares and conversions can be found in float-fcmp.ll and float-convert.ll
13bb5bbe52SCraig Topper; respectively. Some other float-*.ll files in this folder exercise LLVM IR
14bb5bbe52SCraig Topper; instructions that don't directly match a RISC-V instruction.
15bb5bbe52SCraig Topper
16bb5bbe52SCraig Topperdefine float @fadd_s(float %a, float %b) nounwind {
17bb5bbe52SCraig Topper; CHECKIF-LABEL: fadd_s:
18bb5bbe52SCraig Topper; CHECKIF:       # %bb.0:
19bb5bbe52SCraig Topper; CHECKIF-NEXT:    fadd.s fa0, fa0, fa1
20bb5bbe52SCraig Topper; CHECKIF-NEXT:    ret
21bb5bbe52SCraig Topper;
22bb5bbe52SCraig Topper; RV32I-LABEL: fadd_s:
23bb5bbe52SCraig Topper; RV32I:       # %bb.0:
24bb5bbe52SCraig Topper; RV32I-NEXT:    addi sp, sp, -16
25bb5bbe52SCraig Topper; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
26bb5bbe52SCraig Topper; RV32I-NEXT:    call __addsf3
27bb5bbe52SCraig Topper; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
28bb5bbe52SCraig Topper; RV32I-NEXT:    addi sp, sp, 16
29bb5bbe52SCraig Topper; RV32I-NEXT:    ret
30bb5bbe52SCraig Topper;
31bb5bbe52SCraig Topper; RV64I-LABEL: fadd_s:
32bb5bbe52SCraig Topper; RV64I:       # %bb.0:
33bb5bbe52SCraig Topper; RV64I-NEXT:    addi sp, sp, -16
34bb5bbe52SCraig Topper; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
35bb5bbe52SCraig Topper; RV64I-NEXT:    call __addsf3
36bb5bbe52SCraig Topper; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
37bb5bbe52SCraig Topper; RV64I-NEXT:    addi sp, sp, 16
38bb5bbe52SCraig Topper; RV64I-NEXT:    ret
39bb5bbe52SCraig Topper  %1 = fadd float %a, %b
40bb5bbe52SCraig Topper  ret float %1
41bb5bbe52SCraig Topper}
42bb5bbe52SCraig Topper
43bb5bbe52SCraig Topperdefine float @fsub_s(float %a, float %b) nounwind {
44bb5bbe52SCraig Topper; CHECKIF-LABEL: fsub_s:
45bb5bbe52SCraig Topper; CHECKIF:       # %bb.0:
46bb5bbe52SCraig Topper; CHECKIF-NEXT:    fsub.s fa0, fa0, fa1
47bb5bbe52SCraig Topper; CHECKIF-NEXT:    ret
48bb5bbe52SCraig Topper;
49bb5bbe52SCraig Topper; RV32I-LABEL: fsub_s:
50bb5bbe52SCraig Topper; RV32I:       # %bb.0:
51bb5bbe52SCraig Topper; RV32I-NEXT:    addi sp, sp, -16
52bb5bbe52SCraig Topper; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
53bb5bbe52SCraig Topper; RV32I-NEXT:    call __subsf3
54bb5bbe52SCraig Topper; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
55bb5bbe52SCraig Topper; RV32I-NEXT:    addi sp, sp, 16
56bb5bbe52SCraig Topper; RV32I-NEXT:    ret
57bb5bbe52SCraig Topper;
58bb5bbe52SCraig Topper; RV64I-LABEL: fsub_s:
59bb5bbe52SCraig Topper; RV64I:       # %bb.0:
60bb5bbe52SCraig Topper; RV64I-NEXT:    addi sp, sp, -16
61bb5bbe52SCraig Topper; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
62bb5bbe52SCraig Topper; RV64I-NEXT:    call __subsf3
63bb5bbe52SCraig Topper; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
64bb5bbe52SCraig Topper; RV64I-NEXT:    addi sp, sp, 16
65bb5bbe52SCraig Topper; RV64I-NEXT:    ret
66bb5bbe52SCraig Topper  %1 = fsub float %a, %b
67bb5bbe52SCraig Topper  ret float %1
68bb5bbe52SCraig Topper}
69bb5bbe52SCraig Topper
70bb5bbe52SCraig Topperdefine float @fmul_s(float %a, float %b) nounwind {
71bb5bbe52SCraig Topper; CHECKIF-LABEL: fmul_s:
72bb5bbe52SCraig Topper; CHECKIF:       # %bb.0:
73bb5bbe52SCraig Topper; CHECKIF-NEXT:    fmul.s fa0, fa0, fa1
74bb5bbe52SCraig Topper; CHECKIF-NEXT:    ret
75bb5bbe52SCraig Topper;
76bb5bbe52SCraig Topper; RV32I-LABEL: fmul_s:
77bb5bbe52SCraig Topper; RV32I:       # %bb.0:
78bb5bbe52SCraig Topper; RV32I-NEXT:    addi sp, sp, -16
79bb5bbe52SCraig Topper; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
80bb5bbe52SCraig Topper; RV32I-NEXT:    call __mulsf3
81bb5bbe52SCraig Topper; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
82bb5bbe52SCraig Topper; RV32I-NEXT:    addi sp, sp, 16
83bb5bbe52SCraig Topper; RV32I-NEXT:    ret
84bb5bbe52SCraig Topper;
85bb5bbe52SCraig Topper; RV64I-LABEL: fmul_s:
86bb5bbe52SCraig Topper; RV64I:       # %bb.0:
87bb5bbe52SCraig Topper; RV64I-NEXT:    addi sp, sp, -16
88bb5bbe52SCraig Topper; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
89bb5bbe52SCraig Topper; RV64I-NEXT:    call __mulsf3
90bb5bbe52SCraig Topper; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
91bb5bbe52SCraig Topper; RV64I-NEXT:    addi sp, sp, 16
92bb5bbe52SCraig Topper; RV64I-NEXT:    ret
93bb5bbe52SCraig Topper  %1 = fmul float %a, %b
94bb5bbe52SCraig Topper  ret float %1
95bb5bbe52SCraig Topper}
96bb5bbe52SCraig Topper
97bb5bbe52SCraig Topperdefine float @fdiv_s(float %a, float %b) nounwind {
98bb5bbe52SCraig Topper; CHECKIF-LABEL: fdiv_s:
99bb5bbe52SCraig Topper; CHECKIF:       # %bb.0:
100bb5bbe52SCraig Topper; CHECKIF-NEXT:    fdiv.s fa0, fa0, fa1
101bb5bbe52SCraig Topper; CHECKIF-NEXT:    ret
102bb5bbe52SCraig Topper;
103bb5bbe52SCraig Topper; RV32I-LABEL: fdiv_s:
104bb5bbe52SCraig Topper; RV32I:       # %bb.0:
105bb5bbe52SCraig Topper; RV32I-NEXT:    addi sp, sp, -16
106bb5bbe52SCraig Topper; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
107bb5bbe52SCraig Topper; RV32I-NEXT:    call __divsf3
108bb5bbe52SCraig Topper; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
109bb5bbe52SCraig Topper; RV32I-NEXT:    addi sp, sp, 16
110bb5bbe52SCraig Topper; RV32I-NEXT:    ret
111bb5bbe52SCraig Topper;
112bb5bbe52SCraig Topper; RV64I-LABEL: fdiv_s:
113bb5bbe52SCraig Topper; RV64I:       # %bb.0:
114bb5bbe52SCraig Topper; RV64I-NEXT:    addi sp, sp, -16
115bb5bbe52SCraig Topper; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
116bb5bbe52SCraig Topper; RV64I-NEXT:    call __divsf3
117bb5bbe52SCraig Topper; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
118bb5bbe52SCraig Topper; RV64I-NEXT:    addi sp, sp, 16
119bb5bbe52SCraig Topper; RV64I-NEXT:    ret
120bb5bbe52SCraig Topper  %1 = fdiv float %a, %b
121bb5bbe52SCraig Topper  ret float %1
122bb5bbe52SCraig Topper}
123bb5bbe52SCraig Topper
124bb5bbe52SCraig Topperdeclare float @llvm.sqrt.f32(float)
125bb5bbe52SCraig Topper
126bb5bbe52SCraig Topperdefine float @fsqrt_s(float %a) nounwind {
127bb5bbe52SCraig Topper; CHECKIF-LABEL: fsqrt_s:
128bb5bbe52SCraig Topper; CHECKIF:       # %bb.0:
129bb5bbe52SCraig Topper; CHECKIF-NEXT:    fsqrt.s fa0, fa0
130bb5bbe52SCraig Topper; CHECKIF-NEXT:    ret
131bb5bbe52SCraig Topper;
132bb5bbe52SCraig Topper; RV32I-LABEL: fsqrt_s:
133bb5bbe52SCraig Topper; RV32I:       # %bb.0:
134bb5bbe52SCraig Topper; RV32I-NEXT:    addi sp, sp, -16
135bb5bbe52SCraig Topper; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
136bb5bbe52SCraig Topper; RV32I-NEXT:    call sqrtf
137bb5bbe52SCraig Topper; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
138bb5bbe52SCraig Topper; RV32I-NEXT:    addi sp, sp, 16
139bb5bbe52SCraig Topper; RV32I-NEXT:    ret
140bb5bbe52SCraig Topper;
141bb5bbe52SCraig Topper; RV64I-LABEL: fsqrt_s:
142bb5bbe52SCraig Topper; RV64I:       # %bb.0:
143bb5bbe52SCraig Topper; RV64I-NEXT:    addi sp, sp, -16
144bb5bbe52SCraig Topper; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
145bb5bbe52SCraig Topper; RV64I-NEXT:    call sqrtf
146bb5bbe52SCraig Topper; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
147bb5bbe52SCraig Topper; RV64I-NEXT:    addi sp, sp, 16
148bb5bbe52SCraig Topper; RV64I-NEXT:    ret
149bb5bbe52SCraig Topper  %1 = call float @llvm.sqrt.f32(float %a)
150bb5bbe52SCraig Topper  ret float %1
151bb5bbe52SCraig Topper}
152bb5bbe52SCraig Topper
153bb5bbe52SCraig Topperdeclare float @llvm.copysign.f32(float, float)
154bb5bbe52SCraig Topper
155bb5bbe52SCraig Topperdefine float @fsgnj_s(float %a, float %b) nounwind {
156bb5bbe52SCraig Topper; CHECKIF-LABEL: fsgnj_s:
157bb5bbe52SCraig Topper; CHECKIF:       # %bb.0:
158bb5bbe52SCraig Topper; CHECKIF-NEXT:    fsgnj.s fa0, fa0, fa1
159bb5bbe52SCraig Topper; CHECKIF-NEXT:    ret
160bb5bbe52SCraig Topper;
161bb5bbe52SCraig Topper; RV32I-LABEL: fsgnj_s:
162bb5bbe52SCraig Topper; RV32I:       # %bb.0:
163bb5bbe52SCraig Topper; RV32I-NEXT:    lui a2, 524288
164d78fe84dSCraig Topper; RV32I-NEXT:    slli a0, a0, 1
165d78fe84dSCraig Topper; RV32I-NEXT:    srli a0, a0, 1
166bb5bbe52SCraig Topper; RV32I-NEXT:    and a1, a1, a2
167bb5bbe52SCraig Topper; RV32I-NEXT:    or a0, a0, a1
168bb5bbe52SCraig Topper; RV32I-NEXT:    ret
169bb5bbe52SCraig Topper;
170bb5bbe52SCraig Topper; RV64I-LABEL: fsgnj_s:
171bb5bbe52SCraig Topper; RV64I:       # %bb.0:
172bb5bbe52SCraig Topper; RV64I-NEXT:    lui a2, 524288
173d78fe84dSCraig Topper; RV64I-NEXT:    slli a0, a0, 33
174d78fe84dSCraig Topper; RV64I-NEXT:    srli a0, a0, 33
175bb5bbe52SCraig Topper; RV64I-NEXT:    and a1, a1, a2
176bb5bbe52SCraig Topper; RV64I-NEXT:    or a0, a0, a1
177bb5bbe52SCraig Topper; RV64I-NEXT:    ret
178bb5bbe52SCraig Topper  %1 = call float @llvm.copysign.f32(float %a, float %b)
179bb5bbe52SCraig Topper  ret float %1
180bb5bbe52SCraig Topper}
181bb5bbe52SCraig Topper
18238a3cce9SCraig Topperdefine i32 @fneg_s(float %a, float %b) nounwind {
18338a3cce9SCraig Topper; CHECKIF-LABEL: fneg_s:
18438a3cce9SCraig Topper; CHECKIF:       # %bb.0:
18538a3cce9SCraig Topper; CHECKIF-NEXT:    fadd.s fa5, fa0, fa0
18638a3cce9SCraig Topper; CHECKIF-NEXT:    fneg.s fa4, fa5
18738a3cce9SCraig Topper; CHECKIF-NEXT:    feq.s a0, fa5, fa4
18838a3cce9SCraig Topper; CHECKIF-NEXT:    ret
18938a3cce9SCraig Topper;
19038a3cce9SCraig Topper; RV32I-LABEL: fneg_s:
19138a3cce9SCraig Topper; RV32I:       # %bb.0:
19238a3cce9SCraig Topper; RV32I-NEXT:    addi sp, sp, -16
19338a3cce9SCraig Topper; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
19438a3cce9SCraig Topper; RV32I-NEXT:    mv a1, a0
19538a3cce9SCraig Topper; RV32I-NEXT:    call __addsf3
19638a3cce9SCraig Topper; RV32I-NEXT:    lui a1, 524288
19738a3cce9SCraig Topper; RV32I-NEXT:    xor a1, a0, a1
19838a3cce9SCraig Topper; RV32I-NEXT:    call __eqsf2
19938a3cce9SCraig Topper; RV32I-NEXT:    seqz a0, a0
20038a3cce9SCraig Topper; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
20138a3cce9SCraig Topper; RV32I-NEXT:    addi sp, sp, 16
20238a3cce9SCraig Topper; RV32I-NEXT:    ret
20338a3cce9SCraig Topper;
20438a3cce9SCraig Topper; RV64I-LABEL: fneg_s:
20538a3cce9SCraig Topper; RV64I:       # %bb.0:
20638a3cce9SCraig Topper; RV64I-NEXT:    addi sp, sp, -16
20738a3cce9SCraig Topper; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
20838a3cce9SCraig Topper; RV64I-NEXT:    mv a1, a0
20938a3cce9SCraig Topper; RV64I-NEXT:    call __addsf3
21038a3cce9SCraig Topper; RV64I-NEXT:    lui a1, 524288
21138a3cce9SCraig Topper; RV64I-NEXT:    xor a1, a0, a1
21238a3cce9SCraig Topper; RV64I-NEXT:    call __eqsf2
213*11587290SCraig Topper; RV64I-NEXT:    sext.w a0, a0
21438a3cce9SCraig Topper; RV64I-NEXT:    seqz a0, a0
21538a3cce9SCraig Topper; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
21638a3cce9SCraig Topper; RV64I-NEXT:    addi sp, sp, 16
21738a3cce9SCraig Topper; RV64I-NEXT:    ret
21838a3cce9SCraig Topper  %1 = fadd float %a, %a
21938a3cce9SCraig Topper  %2 = fneg float %1
22038a3cce9SCraig Topper  %3 = fcmp oeq float %1, %2
22138a3cce9SCraig Topper  %4 = zext i1 %3 to i32
22238a3cce9SCraig Topper  ret i32 %4
22338a3cce9SCraig Topper}
22438a3cce9SCraig Topper
225bb5bbe52SCraig Topperdefine float @fsgnjn_s(float %a, float %b) nounwind {
226bb5bbe52SCraig Topper; CHECKIF-LABEL: fsgnjn_s:
227bb5bbe52SCraig Topper; CHECKIF:       # %bb.0:
228bb5bbe52SCraig Topper; CHECKIF-NEXT:    fadd.s fa5, fa0, fa1
2293fb0bea8SCraig Topper; CHECKIF-NEXT:    fsgnjn.s fa0, fa0, fa5
230bb5bbe52SCraig Topper; CHECKIF-NEXT:    ret
231bb5bbe52SCraig Topper;
232bb5bbe52SCraig Topper; RV32I-LABEL: fsgnjn_s:
233bb5bbe52SCraig Topper; RV32I:       # %bb.0:
234bb5bbe52SCraig Topper; RV32I-NEXT:    addi sp, sp, -16
235bb5bbe52SCraig Topper; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
236bb5bbe52SCraig Topper; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
237bb5bbe52SCraig Topper; RV32I-NEXT:    mv s0, a0
238bb5bbe52SCraig Topper; RV32I-NEXT:    call __addsf3
239bb5bbe52SCraig Topper; RV32I-NEXT:    lui a1, 524288
240d78fe84dSCraig Topper; RV32I-NEXT:    slli s0, s0, 1
241bb5bbe52SCraig Topper; RV32I-NEXT:    xor a0, a0, a1
242d78fe84dSCraig Topper; RV32I-NEXT:    srli s0, s0, 1
243bb5bbe52SCraig Topper; RV32I-NEXT:    and a0, a0, a1
244d78fe84dSCraig Topper; RV32I-NEXT:    or a0, s0, a0
245bb5bbe52SCraig Topper; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
246bb5bbe52SCraig Topper; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
247bb5bbe52SCraig Topper; RV32I-NEXT:    addi sp, sp, 16
248bb5bbe52SCraig Topper; RV32I-NEXT:    ret
249bb5bbe52SCraig Topper;
250bb5bbe52SCraig Topper; RV64I-LABEL: fsgnjn_s:
251bb5bbe52SCraig Topper; RV64I:       # %bb.0:
252bb5bbe52SCraig Topper; RV64I-NEXT:    addi sp, sp, -16
253bb5bbe52SCraig Topper; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
254bb5bbe52SCraig Topper; RV64I-NEXT:    sd s0, 0(sp) # 8-byte Folded Spill
255bb5bbe52SCraig Topper; RV64I-NEXT:    mv s0, a0
256bb5bbe52SCraig Topper; RV64I-NEXT:    call __addsf3
257bb5bbe52SCraig Topper; RV64I-NEXT:    lui a1, 524288
258d78fe84dSCraig Topper; RV64I-NEXT:    slli s0, s0, 33
259bb5bbe52SCraig Topper; RV64I-NEXT:    xor a0, a0, a1
260d78fe84dSCraig Topper; RV64I-NEXT:    srli s0, s0, 33
261bb5bbe52SCraig Topper; RV64I-NEXT:    and a0, a0, a1
262d78fe84dSCraig Topper; RV64I-NEXT:    or a0, s0, a0
263bb5bbe52SCraig Topper; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
264bb5bbe52SCraig Topper; RV64I-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload
265bb5bbe52SCraig Topper; RV64I-NEXT:    addi sp, sp, 16
266bb5bbe52SCraig Topper; RV64I-NEXT:    ret
267bb5bbe52SCraig Topper  %1 = fadd float %a, %b
268bb5bbe52SCraig Topper  %2 = fneg float %1
269bb5bbe52SCraig Topper  %3 = call float @llvm.copysign.f32(float %a, float %2)
270bb5bbe52SCraig Topper  ret float %3
271bb5bbe52SCraig Topper}
272bb5bbe52SCraig Topper
273bb5bbe52SCraig Topperdeclare float @llvm.fabs.f32(float)
274bb5bbe52SCraig Topper
275bb5bbe52SCraig Topperdefine float @fabs_s(float %a, float %b) nounwind {
276bb5bbe52SCraig Topper; CHECKIF-LABEL: fabs_s:
277bb5bbe52SCraig Topper; CHECKIF:       # %bb.0:
278bb5bbe52SCraig Topper; CHECKIF-NEXT:    fadd.s fa5, fa0, fa1
279bb5bbe52SCraig Topper; CHECKIF-NEXT:    fabs.s fa4, fa5
280bb5bbe52SCraig Topper; CHECKIF-NEXT:    fadd.s fa0, fa4, fa5
281bb5bbe52SCraig Topper; CHECKIF-NEXT:    ret
282bb5bbe52SCraig Topper;
283bb5bbe52SCraig Topper; RV32I-LABEL: fabs_s:
284bb5bbe52SCraig Topper; RV32I:       # %bb.0:
285bb5bbe52SCraig Topper; RV32I-NEXT:    addi sp, sp, -16
286bb5bbe52SCraig Topper; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
287bb5bbe52SCraig Topper; RV32I-NEXT:    call __addsf3
288bb5bbe52SCraig Topper; RV32I-NEXT:    mv a1, a0
289d78fe84dSCraig Topper; RV32I-NEXT:    slli a0, a0, 1
290d78fe84dSCraig Topper; RV32I-NEXT:    srli a0, a0, 1
291bb5bbe52SCraig Topper; RV32I-NEXT:    call __addsf3
292bb5bbe52SCraig Topper; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
293bb5bbe52SCraig Topper; RV32I-NEXT:    addi sp, sp, 16
294bb5bbe52SCraig Topper; RV32I-NEXT:    ret
295bb5bbe52SCraig Topper;
296bb5bbe52SCraig Topper; RV64I-LABEL: fabs_s:
297bb5bbe52SCraig Topper; RV64I:       # %bb.0:
298bb5bbe52SCraig Topper; RV64I-NEXT:    addi sp, sp, -16
299bb5bbe52SCraig Topper; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
300bb5bbe52SCraig Topper; RV64I-NEXT:    call __addsf3
301bb5bbe52SCraig Topper; RV64I-NEXT:    mv a1, a0
302d78fe84dSCraig Topper; RV64I-NEXT:    slli a0, a0, 33
303d78fe84dSCraig Topper; RV64I-NEXT:    srli a0, a0, 33
304bb5bbe52SCraig Topper; RV64I-NEXT:    call __addsf3
305bb5bbe52SCraig Topper; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
306bb5bbe52SCraig Topper; RV64I-NEXT:    addi sp, sp, 16
307bb5bbe52SCraig Topper; RV64I-NEXT:    ret
308bb5bbe52SCraig Topper  %1 = fadd float %a, %b
309bb5bbe52SCraig Topper  %2 = call float @llvm.fabs.f32(float %1)
310bb5bbe52SCraig Topper  %3 = fadd float %2, %1
311bb5bbe52SCraig Topper  ret float %3
312bb5bbe52SCraig Topper}
313bb5bbe52SCraig Topper
314bb5bbe52SCraig Topperdeclare float @llvm.minnum.f32(float, float)
315bb5bbe52SCraig Topper
316bb5bbe52SCraig Topperdefine float @fmin_s(float %a, float %b) nounwind {
317bb5bbe52SCraig Topper; CHECKIF-LABEL: fmin_s:
318bb5bbe52SCraig Topper; CHECKIF:       # %bb.0:
319bb5bbe52SCraig Topper; CHECKIF-NEXT:    fmin.s fa0, fa0, fa1
320bb5bbe52SCraig Topper; CHECKIF-NEXT:    ret
321bb5bbe52SCraig Topper;
322bb5bbe52SCraig Topper; RV32I-LABEL: fmin_s:
323bb5bbe52SCraig Topper; RV32I:       # %bb.0:
324bb5bbe52SCraig Topper; RV32I-NEXT:    addi sp, sp, -16
325bb5bbe52SCraig Topper; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
326bb5bbe52SCraig Topper; RV32I-NEXT:    call fminf
327bb5bbe52SCraig Topper; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
328bb5bbe52SCraig Topper; RV32I-NEXT:    addi sp, sp, 16
329bb5bbe52SCraig Topper; RV32I-NEXT:    ret
330bb5bbe52SCraig Topper;
331bb5bbe52SCraig Topper; RV64I-LABEL: fmin_s:
332bb5bbe52SCraig Topper; RV64I:       # %bb.0:
333bb5bbe52SCraig Topper; RV64I-NEXT:    addi sp, sp, -16
334bb5bbe52SCraig Topper; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
335bb5bbe52SCraig Topper; RV64I-NEXT:    call fminf
336bb5bbe52SCraig Topper; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
337bb5bbe52SCraig Topper; RV64I-NEXT:    addi sp, sp, 16
338bb5bbe52SCraig Topper; RV64I-NEXT:    ret
339bb5bbe52SCraig Topper  %1 = call float @llvm.minnum.f32(float %a, float %b)
340bb5bbe52SCraig Topper  ret float %1
341bb5bbe52SCraig Topper}
342bb5bbe52SCraig Topper
343bb5bbe52SCraig Topperdeclare float @llvm.maxnum.f32(float, float)
344bb5bbe52SCraig Topper
345bb5bbe52SCraig Topperdefine float @fmax_s(float %a, float %b) nounwind {
346bb5bbe52SCraig Topper; CHECKIF-LABEL: fmax_s:
347bb5bbe52SCraig Topper; CHECKIF:       # %bb.0:
348bb5bbe52SCraig Topper; CHECKIF-NEXT:    fmax.s fa0, fa0, fa1
349bb5bbe52SCraig Topper; CHECKIF-NEXT:    ret
350bb5bbe52SCraig Topper;
351bb5bbe52SCraig Topper; RV32I-LABEL: fmax_s:
352bb5bbe52SCraig Topper; RV32I:       # %bb.0:
353bb5bbe52SCraig Topper; RV32I-NEXT:    addi sp, sp, -16
354bb5bbe52SCraig Topper; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
355bb5bbe52SCraig Topper; RV32I-NEXT:    call fmaxf
356bb5bbe52SCraig Topper; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
357bb5bbe52SCraig Topper; RV32I-NEXT:    addi sp, sp, 16
358bb5bbe52SCraig Topper; RV32I-NEXT:    ret
359bb5bbe52SCraig Topper;
360bb5bbe52SCraig Topper; RV64I-LABEL: fmax_s:
361bb5bbe52SCraig Topper; RV64I:       # %bb.0:
362bb5bbe52SCraig Topper; RV64I-NEXT:    addi sp, sp, -16
363bb5bbe52SCraig Topper; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
364bb5bbe52SCraig Topper; RV64I-NEXT:    call fmaxf
365bb5bbe52SCraig Topper; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
366bb5bbe52SCraig Topper; RV64I-NEXT:    addi sp, sp, 16
367bb5bbe52SCraig Topper; RV64I-NEXT:    ret
368bb5bbe52SCraig Topper  %1 = call float @llvm.maxnum.f32(float %a, float %b)
369bb5bbe52SCraig Topper  ret float %1
370bb5bbe52SCraig Topper}
371bb5bbe52SCraig Topper
372bb5bbe52SCraig Topperdeclare float @llvm.fma.f32(float, float, float)
373bb5bbe52SCraig Topper
374bb5bbe52SCraig Topperdefine float @fmadd_s(float %a, float %b, float %c) nounwind {
375bb5bbe52SCraig Topper; CHECKIF-LABEL: fmadd_s:
376bb5bbe52SCraig Topper; CHECKIF:       # %bb.0:
377bb5bbe52SCraig Topper; CHECKIF-NEXT:    fmadd.s fa0, fa0, fa1, fa2
378bb5bbe52SCraig Topper; CHECKIF-NEXT:    ret
379bb5bbe52SCraig Topper;
380bb5bbe52SCraig Topper; RV32I-LABEL: fmadd_s:
381bb5bbe52SCraig Topper; RV32I:       # %bb.0:
382bb5bbe52SCraig Topper; RV32I-NEXT:    addi sp, sp, -16
383bb5bbe52SCraig Topper; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
384bb5bbe52SCraig Topper; RV32I-NEXT:    call fmaf
385bb5bbe52SCraig Topper; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
386bb5bbe52SCraig Topper; RV32I-NEXT:    addi sp, sp, 16
387bb5bbe52SCraig Topper; RV32I-NEXT:    ret
388bb5bbe52SCraig Topper;
389bb5bbe52SCraig Topper; RV64I-LABEL: fmadd_s:
390bb5bbe52SCraig Topper; RV64I:       # %bb.0:
391bb5bbe52SCraig Topper; RV64I-NEXT:    addi sp, sp, -16
392bb5bbe52SCraig Topper; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
393bb5bbe52SCraig Topper; RV64I-NEXT:    call fmaf
394bb5bbe52SCraig Topper; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
395bb5bbe52SCraig Topper; RV64I-NEXT:    addi sp, sp, 16
396bb5bbe52SCraig Topper; RV64I-NEXT:    ret
397bb5bbe52SCraig Topper  %1 = call float @llvm.fma.f32(float %a, float %b, float %c)
398bb5bbe52SCraig Topper  ret float %1
399bb5bbe52SCraig Topper}
400bb5bbe52SCraig Topper
401bb5bbe52SCraig Topperdefine float @fmsub_s(float %a, float %b, float %c) nounwind {
402bb5bbe52SCraig Topper; CHECKIF-LABEL: fmsub_s:
403bb5bbe52SCraig Topper; CHECKIF:       # %bb.0:
404bb5bbe52SCraig Topper; CHECKIF-NEXT:    fmv.w.x fa5, zero
405bb5bbe52SCraig Topper; CHECKIF-NEXT:    fadd.s fa5, fa2, fa5
406bb5bbe52SCraig Topper; CHECKIF-NEXT:    fmsub.s fa0, fa0, fa1, fa5
407bb5bbe52SCraig Topper; CHECKIF-NEXT:    ret
408bb5bbe52SCraig Topper;
409bb5bbe52SCraig Topper; RV32I-LABEL: fmsub_s:
410bb5bbe52SCraig Topper; RV32I:       # %bb.0:
411bb5bbe52SCraig Topper; RV32I-NEXT:    addi sp, sp, -16
412bb5bbe52SCraig Topper; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
413bb5bbe52SCraig Topper; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
414bb5bbe52SCraig Topper; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
415bb5bbe52SCraig Topper; RV32I-NEXT:    mv s0, a0
416bb5bbe52SCraig Topper; RV32I-NEXT:    mv s1, a1
41738a3cce9SCraig Topper; RV32I-NEXT:    lui a0, %hi(.LCPI12_0)
41838a3cce9SCraig Topper; RV32I-NEXT:    lw a1, %lo(.LCPI12_0)(a0)
419bb5bbe52SCraig Topper; RV32I-NEXT:    mv a0, a2
420bb5bbe52SCraig Topper; RV32I-NEXT:    call __addsf3
421bb5bbe52SCraig Topper; RV32I-NEXT:    lui a2, 524288
422bb5bbe52SCraig Topper; RV32I-NEXT:    xor a2, a0, a2
423bb5bbe52SCraig Topper; RV32I-NEXT:    mv a0, s0
424bb5bbe52SCraig Topper; RV32I-NEXT:    mv a1, s1
425bb5bbe52SCraig Topper; RV32I-NEXT:    call fmaf
426bb5bbe52SCraig Topper; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
427bb5bbe52SCraig Topper; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
428bb5bbe52SCraig Topper; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
429bb5bbe52SCraig Topper; RV32I-NEXT:    addi sp, sp, 16
430bb5bbe52SCraig Topper; RV32I-NEXT:    ret
431bb5bbe52SCraig Topper;
432bb5bbe52SCraig Topper; RV64I-LABEL: fmsub_s:
433bb5bbe52SCraig Topper; RV64I:       # %bb.0:
434bb5bbe52SCraig Topper; RV64I-NEXT:    addi sp, sp, -32
435bb5bbe52SCraig Topper; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
436bb5bbe52SCraig Topper; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
437bb5bbe52SCraig Topper; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
438bb5bbe52SCraig Topper; RV64I-NEXT:    mv s0, a0
439bb5bbe52SCraig Topper; RV64I-NEXT:    mv s1, a1
44038a3cce9SCraig Topper; RV64I-NEXT:    lui a0, %hi(.LCPI12_0)
44138a3cce9SCraig Topper; RV64I-NEXT:    lw a1, %lo(.LCPI12_0)(a0)
442bb5bbe52SCraig Topper; RV64I-NEXT:    mv a0, a2
443bb5bbe52SCraig Topper; RV64I-NEXT:    call __addsf3
444bb5bbe52SCraig Topper; RV64I-NEXT:    lui a2, 524288
445bb5bbe52SCraig Topper; RV64I-NEXT:    xor a2, a0, a2
446bb5bbe52SCraig Topper; RV64I-NEXT:    mv a0, s0
447bb5bbe52SCraig Topper; RV64I-NEXT:    mv a1, s1
448bb5bbe52SCraig Topper; RV64I-NEXT:    call fmaf
449bb5bbe52SCraig Topper; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
450bb5bbe52SCraig Topper; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
451bb5bbe52SCraig Topper; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
452bb5bbe52SCraig Topper; RV64I-NEXT:    addi sp, sp, 32
453bb5bbe52SCraig Topper; RV64I-NEXT:    ret
454bb5bbe52SCraig Topper  %c_ = fadd float 0.0, %c ; avoid negation using xor
455bb5bbe52SCraig Topper  %negc = fneg float %c_
456bb5bbe52SCraig Topper  %1 = call float @llvm.fma.f32(float %a, float %b, float %negc)
457bb5bbe52SCraig Topper  ret float %1
458bb5bbe52SCraig Topper}
459bb5bbe52SCraig Topper
460bb5bbe52SCraig Topperdefine float @fnmadd_s(float %a, float %b, float %c) nounwind {
461bb5bbe52SCraig Topper; CHECKIF-LABEL: fnmadd_s:
462bb5bbe52SCraig Topper; CHECKIF:       # %bb.0:
463bb5bbe52SCraig Topper; CHECKIF-NEXT:    fmv.w.x fa5, zero
464bb5bbe52SCraig Topper; CHECKIF-NEXT:    fadd.s fa4, fa0, fa5
465bb5bbe52SCraig Topper; CHECKIF-NEXT:    fadd.s fa5, fa2, fa5
466bb5bbe52SCraig Topper; CHECKIF-NEXT:    fnmadd.s fa0, fa4, fa1, fa5
467bb5bbe52SCraig Topper; CHECKIF-NEXT:    ret
468bb5bbe52SCraig Topper;
469bb5bbe52SCraig Topper; RV32I-LABEL: fnmadd_s:
470bb5bbe52SCraig Topper; RV32I:       # %bb.0:
471bb5bbe52SCraig Topper; RV32I-NEXT:    addi sp, sp, -32
472bb5bbe52SCraig Topper; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
473bb5bbe52SCraig Topper; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
474bb5bbe52SCraig Topper; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
475bb5bbe52SCraig Topper; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
476bb5bbe52SCraig Topper; RV32I-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill
477bb5bbe52SCraig Topper; RV32I-NEXT:    mv s0, a1
47838a3cce9SCraig Topper; RV32I-NEXT:    lui a1, %hi(.LCPI13_0)
47938a3cce9SCraig Topper; RV32I-NEXT:    lw s1, %lo(.LCPI13_0)(a1)
480bb5bbe52SCraig Topper; RV32I-NEXT:    mv s2, a2
481bb5bbe52SCraig Topper; RV32I-NEXT:    mv a1, s1
482bb5bbe52SCraig Topper; RV32I-NEXT:    call __addsf3
483bb5bbe52SCraig Topper; RV32I-NEXT:    mv s3, a0
484bb5bbe52SCraig Topper; RV32I-NEXT:    mv a0, s2
485bb5bbe52SCraig Topper; RV32I-NEXT:    mv a1, s1
486bb5bbe52SCraig Topper; RV32I-NEXT:    call __addsf3
487bb5bbe52SCraig Topper; RV32I-NEXT:    lui a2, 524288
488bb5bbe52SCraig Topper; RV32I-NEXT:    xor a1, s3, a2
489bb5bbe52SCraig Topper; RV32I-NEXT:    xor a2, a0, a2
490bb5bbe52SCraig Topper; RV32I-NEXT:    mv a0, a1
491bb5bbe52SCraig Topper; RV32I-NEXT:    mv a1, s0
492bb5bbe52SCraig Topper; RV32I-NEXT:    call fmaf
493bb5bbe52SCraig Topper; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
494bb5bbe52SCraig Topper; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
495bb5bbe52SCraig Topper; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
496bb5bbe52SCraig Topper; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
497bb5bbe52SCraig Topper; RV32I-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload
498bb5bbe52SCraig Topper; RV32I-NEXT:    addi sp, sp, 32
499bb5bbe52SCraig Topper; RV32I-NEXT:    ret
500bb5bbe52SCraig Topper;
501bb5bbe52SCraig Topper; RV64I-LABEL: fnmadd_s:
502bb5bbe52SCraig Topper; RV64I:       # %bb.0:
503bb5bbe52SCraig Topper; RV64I-NEXT:    addi sp, sp, -48
504bb5bbe52SCraig Topper; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
505bb5bbe52SCraig Topper; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
506bb5bbe52SCraig Topper; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
507bb5bbe52SCraig Topper; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
508bb5bbe52SCraig Topper; RV64I-NEXT:    sd s3, 8(sp) # 8-byte Folded Spill
509bb5bbe52SCraig Topper; RV64I-NEXT:    mv s0, a1
51038a3cce9SCraig Topper; RV64I-NEXT:    lui a1, %hi(.LCPI13_0)
51138a3cce9SCraig Topper; RV64I-NEXT:    lw s1, %lo(.LCPI13_0)(a1)
512bb5bbe52SCraig Topper; RV64I-NEXT:    mv s2, a2
513bb5bbe52SCraig Topper; RV64I-NEXT:    mv a1, s1
514bb5bbe52SCraig Topper; RV64I-NEXT:    call __addsf3
515bb5bbe52SCraig Topper; RV64I-NEXT:    mv s3, a0
516bb5bbe52SCraig Topper; RV64I-NEXT:    mv a0, s2
517bb5bbe52SCraig Topper; RV64I-NEXT:    mv a1, s1
518bb5bbe52SCraig Topper; RV64I-NEXT:    call __addsf3
519bb5bbe52SCraig Topper; RV64I-NEXT:    lui a2, 524288
520bb5bbe52SCraig Topper; RV64I-NEXT:    xor a1, s3, a2
521bb5bbe52SCraig Topper; RV64I-NEXT:    xor a2, a0, a2
522bb5bbe52SCraig Topper; RV64I-NEXT:    mv a0, a1
523bb5bbe52SCraig Topper; RV64I-NEXT:    mv a1, s0
524bb5bbe52SCraig Topper; RV64I-NEXT:    call fmaf
525bb5bbe52SCraig Topper; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
526bb5bbe52SCraig Topper; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
527bb5bbe52SCraig Topper; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
528bb5bbe52SCraig Topper; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
529bb5bbe52SCraig Topper; RV64I-NEXT:    ld s3, 8(sp) # 8-byte Folded Reload
530bb5bbe52SCraig Topper; RV64I-NEXT:    addi sp, sp, 48
531bb5bbe52SCraig Topper; RV64I-NEXT:    ret
532bb5bbe52SCraig Topper  %a_ = fadd float 0.0, %a
533bb5bbe52SCraig Topper  %c_ = fadd float 0.0, %c
534bb5bbe52SCraig Topper  %nega = fneg float %a_
535bb5bbe52SCraig Topper  %negc = fneg float %c_
536bb5bbe52SCraig Topper  %1 = call float @llvm.fma.f32(float %nega, float %b, float %negc)
537bb5bbe52SCraig Topper  ret float %1
538bb5bbe52SCraig Topper}
539bb5bbe52SCraig Topper
540bb5bbe52SCraig Topperdefine float @fnmadd_s_2(float %a, float %b, float %c) nounwind {
541bb5bbe52SCraig Topper; CHECKIF-LABEL: fnmadd_s_2:
542bb5bbe52SCraig Topper; CHECKIF:       # %bb.0:
543bb5bbe52SCraig Topper; CHECKIF-NEXT:    fmv.w.x fa5, zero
544bb5bbe52SCraig Topper; CHECKIF-NEXT:    fadd.s fa4, fa1, fa5
545bb5bbe52SCraig Topper; CHECKIF-NEXT:    fadd.s fa5, fa2, fa5
546bb5bbe52SCraig Topper; CHECKIF-NEXT:    fnmadd.s fa0, fa4, fa0, fa5
547bb5bbe52SCraig Topper; CHECKIF-NEXT:    ret
548bb5bbe52SCraig Topper;
549bb5bbe52SCraig Topper; RV32I-LABEL: fnmadd_s_2:
550bb5bbe52SCraig Topper; RV32I:       # %bb.0:
551bb5bbe52SCraig Topper; RV32I-NEXT:    addi sp, sp, -32
552bb5bbe52SCraig Topper; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
553bb5bbe52SCraig Topper; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
554bb5bbe52SCraig Topper; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
555bb5bbe52SCraig Topper; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
556bb5bbe52SCraig Topper; RV32I-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill
557bb5bbe52SCraig Topper; RV32I-NEXT:    mv s0, a0
558bb5bbe52SCraig Topper; RV32I-NEXT:    mv a0, a1
55938a3cce9SCraig Topper; RV32I-NEXT:    lui a1, %hi(.LCPI14_0)
56038a3cce9SCraig Topper; RV32I-NEXT:    lw s1, %lo(.LCPI14_0)(a1)
561bb5bbe52SCraig Topper; RV32I-NEXT:    mv s2, a2
562bb5bbe52SCraig Topper; RV32I-NEXT:    mv a1, s1
563bb5bbe52SCraig Topper; RV32I-NEXT:    call __addsf3
564bb5bbe52SCraig Topper; RV32I-NEXT:    mv s3, a0
565bb5bbe52SCraig Topper; RV32I-NEXT:    mv a0, s2
566bb5bbe52SCraig Topper; RV32I-NEXT:    mv a1, s1
567bb5bbe52SCraig Topper; RV32I-NEXT:    call __addsf3
568bb5bbe52SCraig Topper; RV32I-NEXT:    lui a2, 524288
569bb5bbe52SCraig Topper; RV32I-NEXT:    xor a1, s3, a2
570bb5bbe52SCraig Topper; RV32I-NEXT:    xor a2, a0, a2
571bb5bbe52SCraig Topper; RV32I-NEXT:    mv a0, s0
572bb5bbe52SCraig Topper; RV32I-NEXT:    call fmaf
573bb5bbe52SCraig Topper; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
574bb5bbe52SCraig Topper; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
575bb5bbe52SCraig Topper; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
576bb5bbe52SCraig Topper; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
577bb5bbe52SCraig Topper; RV32I-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload
578bb5bbe52SCraig Topper; RV32I-NEXT:    addi sp, sp, 32
579bb5bbe52SCraig Topper; RV32I-NEXT:    ret
580bb5bbe52SCraig Topper;
581bb5bbe52SCraig Topper; RV64I-LABEL: fnmadd_s_2:
582bb5bbe52SCraig Topper; RV64I:       # %bb.0:
583bb5bbe52SCraig Topper; RV64I-NEXT:    addi sp, sp, -48
584bb5bbe52SCraig Topper; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
585bb5bbe52SCraig Topper; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
586bb5bbe52SCraig Topper; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
587bb5bbe52SCraig Topper; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
588bb5bbe52SCraig Topper; RV64I-NEXT:    sd s3, 8(sp) # 8-byte Folded Spill
589bb5bbe52SCraig Topper; RV64I-NEXT:    mv s0, a0
590bb5bbe52SCraig Topper; RV64I-NEXT:    mv a0, a1
59138a3cce9SCraig Topper; RV64I-NEXT:    lui a1, %hi(.LCPI14_0)
59238a3cce9SCraig Topper; RV64I-NEXT:    lw s1, %lo(.LCPI14_0)(a1)
593bb5bbe52SCraig Topper; RV64I-NEXT:    mv s2, a2
594bb5bbe52SCraig Topper; RV64I-NEXT:    mv a1, s1
595bb5bbe52SCraig Topper; RV64I-NEXT:    call __addsf3
596bb5bbe52SCraig Topper; RV64I-NEXT:    mv s3, a0
597bb5bbe52SCraig Topper; RV64I-NEXT:    mv a0, s2
598bb5bbe52SCraig Topper; RV64I-NEXT:    mv a1, s1
599bb5bbe52SCraig Topper; RV64I-NEXT:    call __addsf3
600bb5bbe52SCraig Topper; RV64I-NEXT:    lui a2, 524288
601bb5bbe52SCraig Topper; RV64I-NEXT:    xor a1, s3, a2
602bb5bbe52SCraig Topper; RV64I-NEXT:    xor a2, a0, a2
603bb5bbe52SCraig Topper; RV64I-NEXT:    mv a0, s0
604bb5bbe52SCraig Topper; RV64I-NEXT:    call fmaf
605bb5bbe52SCraig Topper; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
606bb5bbe52SCraig Topper; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
607bb5bbe52SCraig Topper; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
608bb5bbe52SCraig Topper; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
609bb5bbe52SCraig Topper; RV64I-NEXT:    ld s3, 8(sp) # 8-byte Folded Reload
610bb5bbe52SCraig Topper; RV64I-NEXT:    addi sp, sp, 48
611bb5bbe52SCraig Topper; RV64I-NEXT:    ret
612bb5bbe52SCraig Topper  %b_ = fadd float 0.0, %b
613bb5bbe52SCraig Topper  %c_ = fadd float 0.0, %c
614bb5bbe52SCraig Topper  %negb = fneg float %b_
615bb5bbe52SCraig Topper  %negc = fneg float %c_
616bb5bbe52SCraig Topper  %1 = call float @llvm.fma.f32(float %a, float %negb, float %negc)
617bb5bbe52SCraig Topper  ret float %1
618bb5bbe52SCraig Topper}
619bb5bbe52SCraig Topper
620bb5bbe52SCraig Topperdefine float @fnmadd_s_3(float %a, float %b, float %c) nounwind {
621bb5bbe52SCraig Topper; RV32IF-LABEL: fnmadd_s_3:
622bb5bbe52SCraig Topper; RV32IF:       # %bb.0:
623bb5bbe52SCraig Topper; RV32IF-NEXT:    fmadd.s ft0, fa0, fa1, fa2
624bb5bbe52SCraig Topper; RV32IF-NEXT:    fneg.s fa0, ft0
625bb5bbe52SCraig Topper; RV32IF-NEXT:    ret
626bb5bbe52SCraig Topper;
627bb5bbe52SCraig Topper; RV64IF-LABEL: fnmadd_s_3:
628bb5bbe52SCraig Topper; RV64IF:       # %bb.0:
629bb5bbe52SCraig Topper; RV64IF-NEXT:    fmadd.s ft0, fa0, fa1, fa2
630bb5bbe52SCraig Topper; RV64IF-NEXT:    fneg.s fa0, ft0
631bb5bbe52SCraig Topper; RV64IF-NEXT:    ret
632bb5bbe52SCraig Topper;
633bb5bbe52SCraig Topper; CHECKIF-LABEL: fnmadd_s_3:
634bb5bbe52SCraig Topper; CHECKIF:       # %bb.0:
635bb5bbe52SCraig Topper; CHECKIF-NEXT:    fmadd.s fa5, fa0, fa1, fa2
636bb5bbe52SCraig Topper; CHECKIF-NEXT:    fneg.s fa0, fa5
637bb5bbe52SCraig Topper; CHECKIF-NEXT:    ret
638bb5bbe52SCraig Topper;
639bb5bbe52SCraig Topper; RV32I-LABEL: fnmadd_s_3:
640bb5bbe52SCraig Topper; RV32I:       # %bb.0:
641bb5bbe52SCraig Topper; RV32I-NEXT:    addi sp, sp, -16
642bb5bbe52SCraig Topper; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
643bb5bbe52SCraig Topper; RV32I-NEXT:    call fmaf
644bb5bbe52SCraig Topper; RV32I-NEXT:    lui a1, 524288
645bb5bbe52SCraig Topper; RV32I-NEXT:    xor a0, a0, a1
646bb5bbe52SCraig Topper; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
647bb5bbe52SCraig Topper; RV32I-NEXT:    addi sp, sp, 16
648bb5bbe52SCraig Topper; RV32I-NEXT:    ret
649bb5bbe52SCraig Topper;
650bb5bbe52SCraig Topper; RV64I-LABEL: fnmadd_s_3:
651bb5bbe52SCraig Topper; RV64I:       # %bb.0:
652bb5bbe52SCraig Topper; RV64I-NEXT:    addi sp, sp, -16
653bb5bbe52SCraig Topper; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
654bb5bbe52SCraig Topper; RV64I-NEXT:    call fmaf
655bb5bbe52SCraig Topper; RV64I-NEXT:    lui a1, 524288
656bb5bbe52SCraig Topper; RV64I-NEXT:    xor a0, a0, a1
657bb5bbe52SCraig Topper; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
658bb5bbe52SCraig Topper; RV64I-NEXT:    addi sp, sp, 16
659bb5bbe52SCraig Topper; RV64I-NEXT:    ret
660bb5bbe52SCraig Topper  %1 = call float @llvm.fma.f32(float %a, float %b, float %c)
661bb5bbe52SCraig Topper  %neg = fneg float %1
662bb5bbe52SCraig Topper  ret float %neg
663bb5bbe52SCraig Topper}
664bb5bbe52SCraig Topper
665bb5bbe52SCraig Topperdefine float @fnmadd_nsz(float %a, float %b, float %c) nounwind {
666bb5bbe52SCraig Topper; RV32IF-LABEL: fnmadd_nsz:
667bb5bbe52SCraig Topper; RV32IF:       # %bb.0:
668bb5bbe52SCraig Topper; RV32IF-NEXT:    fnmadd.s fa0, fa0, fa1, fa2
669bb5bbe52SCraig Topper; RV32IF-NEXT:    ret
670bb5bbe52SCraig Topper;
671bb5bbe52SCraig Topper; RV64IF-LABEL: fnmadd_nsz:
672bb5bbe52SCraig Topper; RV64IF:       # %bb.0:
673bb5bbe52SCraig Topper; RV64IF-NEXT:    fnmadd.s fa0, fa0, fa1, fa2
674bb5bbe52SCraig Topper; RV64IF-NEXT:    ret
675bb5bbe52SCraig Topper;
676bb5bbe52SCraig Topper; CHECKIF-LABEL: fnmadd_nsz:
677bb5bbe52SCraig Topper; CHECKIF:       # %bb.0:
678bb5bbe52SCraig Topper; CHECKIF-NEXT:    fmadd.s fa5, fa0, fa1, fa2
679bb5bbe52SCraig Topper; CHECKIF-NEXT:    fneg.s fa0, fa5
680bb5bbe52SCraig Topper; CHECKIF-NEXT:    ret
681bb5bbe52SCraig Topper;
682bb5bbe52SCraig Topper; RV32I-LABEL: fnmadd_nsz:
683bb5bbe52SCraig Topper; RV32I:       # %bb.0:
684bb5bbe52SCraig Topper; RV32I-NEXT:    addi sp, sp, -16
685bb5bbe52SCraig Topper; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
686bb5bbe52SCraig Topper; RV32I-NEXT:    call fmaf
687bb5bbe52SCraig Topper; RV32I-NEXT:    lui a1, 524288
688bb5bbe52SCraig Topper; RV32I-NEXT:    xor a0, a0, a1
689bb5bbe52SCraig Topper; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
690bb5bbe52SCraig Topper; RV32I-NEXT:    addi sp, sp, 16
691bb5bbe52SCraig Topper; RV32I-NEXT:    ret
692bb5bbe52SCraig Topper;
693bb5bbe52SCraig Topper; RV64I-LABEL: fnmadd_nsz:
694bb5bbe52SCraig Topper; RV64I:       # %bb.0:
695bb5bbe52SCraig Topper; RV64I-NEXT:    addi sp, sp, -16
696bb5bbe52SCraig Topper; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
697bb5bbe52SCraig Topper; RV64I-NEXT:    call fmaf
698bb5bbe52SCraig Topper; RV64I-NEXT:    lui a1, 524288
699bb5bbe52SCraig Topper; RV64I-NEXT:    xor a0, a0, a1
700bb5bbe52SCraig Topper; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
701bb5bbe52SCraig Topper; RV64I-NEXT:    addi sp, sp, 16
702bb5bbe52SCraig Topper; RV64I-NEXT:    ret
703bb5bbe52SCraig Topper  %1 = call nsz float @llvm.fma.f32(float %a, float %b, float %c)
704bb5bbe52SCraig Topper  %neg = fneg nsz float %1
705bb5bbe52SCraig Topper  ret float %neg
706bb5bbe52SCraig Topper}
707bb5bbe52SCraig Topper
708bb5bbe52SCraig Topperdefine float @fnmsub_s(float %a, float %b, float %c) nounwind {
709bb5bbe52SCraig Topper; CHECKIF-LABEL: fnmsub_s:
710bb5bbe52SCraig Topper; CHECKIF:       # %bb.0:
711bb5bbe52SCraig Topper; CHECKIF-NEXT:    fmv.w.x fa5, zero
712bb5bbe52SCraig Topper; CHECKIF-NEXT:    fadd.s fa5, fa0, fa5
713bb5bbe52SCraig Topper; CHECKIF-NEXT:    fnmsub.s fa0, fa5, fa1, fa2
714bb5bbe52SCraig Topper; CHECKIF-NEXT:    ret
715bb5bbe52SCraig Topper;
716bb5bbe52SCraig Topper; RV32I-LABEL: fnmsub_s:
717bb5bbe52SCraig Topper; RV32I:       # %bb.0:
718bb5bbe52SCraig Topper; RV32I-NEXT:    addi sp, sp, -16
719bb5bbe52SCraig Topper; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
720bb5bbe52SCraig Topper; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
721bb5bbe52SCraig Topper; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
722bb5bbe52SCraig Topper; RV32I-NEXT:    mv s0, a1
72338a3cce9SCraig Topper; RV32I-NEXT:    lui a1, %hi(.LCPI17_0)
72438a3cce9SCraig Topper; RV32I-NEXT:    lw a1, %lo(.LCPI17_0)(a1)
725bb5bbe52SCraig Topper; RV32I-NEXT:    mv s1, a2
726bb5bbe52SCraig Topper; RV32I-NEXT:    call __addsf3
727bb5bbe52SCraig Topper; RV32I-NEXT:    lui a1, 524288
728bb5bbe52SCraig Topper; RV32I-NEXT:    xor a0, a0, a1
729bb5bbe52SCraig Topper; RV32I-NEXT:    mv a1, s0
730bb5bbe52SCraig Topper; RV32I-NEXT:    mv a2, s1
731bb5bbe52SCraig Topper; RV32I-NEXT:    call fmaf
732bb5bbe52SCraig Topper; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
733bb5bbe52SCraig Topper; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
734bb5bbe52SCraig Topper; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
735bb5bbe52SCraig Topper; RV32I-NEXT:    addi sp, sp, 16
736bb5bbe52SCraig Topper; RV32I-NEXT:    ret
737bb5bbe52SCraig Topper;
738bb5bbe52SCraig Topper; RV64I-LABEL: fnmsub_s:
739bb5bbe52SCraig Topper; RV64I:       # %bb.0:
740bb5bbe52SCraig Topper; RV64I-NEXT:    addi sp, sp, -32
741bb5bbe52SCraig Topper; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
742bb5bbe52SCraig Topper; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
743bb5bbe52SCraig Topper; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
744bb5bbe52SCraig Topper; RV64I-NEXT:    mv s0, a1
74538a3cce9SCraig Topper; RV64I-NEXT:    lui a1, %hi(.LCPI17_0)
74638a3cce9SCraig Topper; RV64I-NEXT:    lw a1, %lo(.LCPI17_0)(a1)
747bb5bbe52SCraig Topper; RV64I-NEXT:    mv s1, a2
748bb5bbe52SCraig Topper; RV64I-NEXT:    call __addsf3
749bb5bbe52SCraig Topper; RV64I-NEXT:    lui a1, 524288
750bb5bbe52SCraig Topper; RV64I-NEXT:    xor a0, a0, a1
751bb5bbe52SCraig Topper; RV64I-NEXT:    mv a1, s0
752bb5bbe52SCraig Topper; RV64I-NEXT:    mv a2, s1
753bb5bbe52SCraig Topper; RV64I-NEXT:    call fmaf
754bb5bbe52SCraig Topper; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
755bb5bbe52SCraig Topper; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
756bb5bbe52SCraig Topper; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
757bb5bbe52SCraig Topper; RV64I-NEXT:    addi sp, sp, 32
758bb5bbe52SCraig Topper; RV64I-NEXT:    ret
759bb5bbe52SCraig Topper  %a_ = fadd float 0.0, %a
760bb5bbe52SCraig Topper  %nega = fneg float %a_
761bb5bbe52SCraig Topper  %1 = call float @llvm.fma.f32(float %nega, float %b, float %c)
762bb5bbe52SCraig Topper  ret float %1
763bb5bbe52SCraig Topper}
764bb5bbe52SCraig Topper
765bb5bbe52SCraig Topperdefine float @fnmsub_s_2(float %a, float %b, float %c) nounwind {
766bb5bbe52SCraig Topper; CHECKIF-LABEL: fnmsub_s_2:
767bb5bbe52SCraig Topper; CHECKIF:       # %bb.0:
768bb5bbe52SCraig Topper; CHECKIF-NEXT:    fmv.w.x fa5, zero
769bb5bbe52SCraig Topper; CHECKIF-NEXT:    fadd.s fa5, fa1, fa5
770bb5bbe52SCraig Topper; CHECKIF-NEXT:    fnmsub.s fa0, fa5, fa0, fa2
771bb5bbe52SCraig Topper; CHECKIF-NEXT:    ret
772bb5bbe52SCraig Topper;
773bb5bbe52SCraig Topper; RV32I-LABEL: fnmsub_s_2:
774bb5bbe52SCraig Topper; RV32I:       # %bb.0:
775bb5bbe52SCraig Topper; RV32I-NEXT:    addi sp, sp, -16
776bb5bbe52SCraig Topper; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
777bb5bbe52SCraig Topper; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
778bb5bbe52SCraig Topper; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
779bb5bbe52SCraig Topper; RV32I-NEXT:    mv s0, a0
780bb5bbe52SCraig Topper; RV32I-NEXT:    mv a0, a1
78138a3cce9SCraig Topper; RV32I-NEXT:    lui a1, %hi(.LCPI18_0)
78238a3cce9SCraig Topper; RV32I-NEXT:    lw a1, %lo(.LCPI18_0)(a1)
783bb5bbe52SCraig Topper; RV32I-NEXT:    mv s1, a2
784bb5bbe52SCraig Topper; RV32I-NEXT:    call __addsf3
785bb5bbe52SCraig Topper; RV32I-NEXT:    lui a1, 524288
786bb5bbe52SCraig Topper; RV32I-NEXT:    xor a1, a0, a1
787bb5bbe52SCraig Topper; RV32I-NEXT:    mv a0, s0
788bb5bbe52SCraig Topper; RV32I-NEXT:    mv a2, s1
789bb5bbe52SCraig Topper; RV32I-NEXT:    call fmaf
790bb5bbe52SCraig Topper; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
791bb5bbe52SCraig Topper; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
792bb5bbe52SCraig Topper; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
793bb5bbe52SCraig Topper; RV32I-NEXT:    addi sp, sp, 16
794bb5bbe52SCraig Topper; RV32I-NEXT:    ret
795bb5bbe52SCraig Topper;
796bb5bbe52SCraig Topper; RV64I-LABEL: fnmsub_s_2:
797bb5bbe52SCraig Topper; RV64I:       # %bb.0:
798bb5bbe52SCraig Topper; RV64I-NEXT:    addi sp, sp, -32
799bb5bbe52SCraig Topper; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
800bb5bbe52SCraig Topper; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
801bb5bbe52SCraig Topper; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
802bb5bbe52SCraig Topper; RV64I-NEXT:    mv s0, a0
803bb5bbe52SCraig Topper; RV64I-NEXT:    mv a0, a1
80438a3cce9SCraig Topper; RV64I-NEXT:    lui a1, %hi(.LCPI18_0)
80538a3cce9SCraig Topper; RV64I-NEXT:    lw a1, %lo(.LCPI18_0)(a1)
806bb5bbe52SCraig Topper; RV64I-NEXT:    mv s1, a2
807bb5bbe52SCraig Topper; RV64I-NEXT:    call __addsf3
808bb5bbe52SCraig Topper; RV64I-NEXT:    lui a1, 524288
809bb5bbe52SCraig Topper; RV64I-NEXT:    xor a1, a0, a1
810bb5bbe52SCraig Topper; RV64I-NEXT:    mv a0, s0
811bb5bbe52SCraig Topper; RV64I-NEXT:    mv a2, s1
812bb5bbe52SCraig Topper; RV64I-NEXT:    call fmaf
813bb5bbe52SCraig Topper; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
814bb5bbe52SCraig Topper; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
815bb5bbe52SCraig Topper; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
816bb5bbe52SCraig Topper; RV64I-NEXT:    addi sp, sp, 32
817bb5bbe52SCraig Topper; RV64I-NEXT:    ret
818bb5bbe52SCraig Topper  %b_ = fadd float 0.0, %b
819bb5bbe52SCraig Topper  %negb = fneg float %b_
820bb5bbe52SCraig Topper  %1 = call float @llvm.fma.f32(float %a, float %negb, float %c)
821bb5bbe52SCraig Topper  ret float %1
822bb5bbe52SCraig Topper}
823bb5bbe52SCraig Topper
824bb5bbe52SCraig Topperdefine float @fmadd_s_contract(float %a, float %b, float %c) nounwind {
825bb5bbe52SCraig Topper; CHECKIF-LABEL: fmadd_s_contract:
826bb5bbe52SCraig Topper; CHECKIF:       # %bb.0:
827bb5bbe52SCraig Topper; CHECKIF-NEXT:    fmadd.s fa0, fa0, fa1, fa2
828bb5bbe52SCraig Topper; CHECKIF-NEXT:    ret
829bb5bbe52SCraig Topper;
830bb5bbe52SCraig Topper; RV32I-LABEL: fmadd_s_contract:
831bb5bbe52SCraig Topper; RV32I:       # %bb.0:
832bb5bbe52SCraig Topper; RV32I-NEXT:    addi sp, sp, -16
833bb5bbe52SCraig Topper; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
834bb5bbe52SCraig Topper; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
835bb5bbe52SCraig Topper; RV32I-NEXT:    mv s0, a2
836bb5bbe52SCraig Topper; RV32I-NEXT:    call __mulsf3
837bb5bbe52SCraig Topper; RV32I-NEXT:    mv a1, s0
838bb5bbe52SCraig Topper; RV32I-NEXT:    call __addsf3
839bb5bbe52SCraig Topper; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
840bb5bbe52SCraig Topper; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
841bb5bbe52SCraig Topper; RV32I-NEXT:    addi sp, sp, 16
842bb5bbe52SCraig Topper; RV32I-NEXT:    ret
843bb5bbe52SCraig Topper;
844bb5bbe52SCraig Topper; RV64I-LABEL: fmadd_s_contract:
845bb5bbe52SCraig Topper; RV64I:       # %bb.0:
846bb5bbe52SCraig Topper; RV64I-NEXT:    addi sp, sp, -16
847bb5bbe52SCraig Topper; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
848bb5bbe52SCraig Topper; RV64I-NEXT:    sd s0, 0(sp) # 8-byte Folded Spill
849bb5bbe52SCraig Topper; RV64I-NEXT:    mv s0, a2
850bb5bbe52SCraig Topper; RV64I-NEXT:    call __mulsf3
851bb5bbe52SCraig Topper; RV64I-NEXT:    mv a1, s0
852bb5bbe52SCraig Topper; RV64I-NEXT:    call __addsf3
853bb5bbe52SCraig Topper; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
854bb5bbe52SCraig Topper; RV64I-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload
855bb5bbe52SCraig Topper; RV64I-NEXT:    addi sp, sp, 16
856bb5bbe52SCraig Topper; RV64I-NEXT:    ret
857bb5bbe52SCraig Topper  %1 = fmul contract float %a, %b
858bb5bbe52SCraig Topper  %2 = fadd contract float %1, %c
859bb5bbe52SCraig Topper  ret float %2
860bb5bbe52SCraig Topper}
861bb5bbe52SCraig Topper
862bb5bbe52SCraig Topperdefine float @fmsub_s_contract(float %a, float %b, float %c) nounwind {
863bb5bbe52SCraig Topper; CHECKIF-LABEL: fmsub_s_contract:
864bb5bbe52SCraig Topper; CHECKIF:       # %bb.0:
865bb5bbe52SCraig Topper; CHECKIF-NEXT:    fmv.w.x fa5, zero
866bb5bbe52SCraig Topper; CHECKIF-NEXT:    fadd.s fa5, fa2, fa5
867bb5bbe52SCraig Topper; CHECKIF-NEXT:    fmul.s fa4, fa0, fa1
868bb5bbe52SCraig Topper; CHECKIF-NEXT:    fsub.s fa0, fa4, fa5
869bb5bbe52SCraig Topper; CHECKIF-NEXT:    ret
870bb5bbe52SCraig Topper;
871bb5bbe52SCraig Topper; RV32I-LABEL: fmsub_s_contract:
872bb5bbe52SCraig Topper; RV32I:       # %bb.0:
873bb5bbe52SCraig Topper; RV32I-NEXT:    addi sp, sp, -16
874bb5bbe52SCraig Topper; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
875bb5bbe52SCraig Topper; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
876bb5bbe52SCraig Topper; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
877bb5bbe52SCraig Topper; RV32I-NEXT:    sw s2, 0(sp) # 4-byte Folded Spill
878bb5bbe52SCraig Topper; RV32I-NEXT:    mv s0, a0
879bb5bbe52SCraig Topper; RV32I-NEXT:    mv s1, a1
88038a3cce9SCraig Topper; RV32I-NEXT:    lui a0, %hi(.LCPI20_0)
88138a3cce9SCraig Topper; RV32I-NEXT:    lw a1, %lo(.LCPI20_0)(a0)
882bb5bbe52SCraig Topper; RV32I-NEXT:    mv a0, a2
883bb5bbe52SCraig Topper; RV32I-NEXT:    call __addsf3
884bb5bbe52SCraig Topper; RV32I-NEXT:    mv s2, a0
885bb5bbe52SCraig Topper; RV32I-NEXT:    mv a0, s0
886bb5bbe52SCraig Topper; RV32I-NEXT:    mv a1, s1
887bb5bbe52SCraig Topper; RV32I-NEXT:    call __mulsf3
888bb5bbe52SCraig Topper; RV32I-NEXT:    mv a1, s2
889bb5bbe52SCraig Topper; RV32I-NEXT:    call __subsf3
890bb5bbe52SCraig Topper; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
891bb5bbe52SCraig Topper; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
892bb5bbe52SCraig Topper; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
893bb5bbe52SCraig Topper; RV32I-NEXT:    lw s2, 0(sp) # 4-byte Folded Reload
894bb5bbe52SCraig Topper; RV32I-NEXT:    addi sp, sp, 16
895bb5bbe52SCraig Topper; RV32I-NEXT:    ret
896bb5bbe52SCraig Topper;
897bb5bbe52SCraig Topper; RV64I-LABEL: fmsub_s_contract:
898bb5bbe52SCraig Topper; RV64I:       # %bb.0:
899bb5bbe52SCraig Topper; RV64I-NEXT:    addi sp, sp, -32
900bb5bbe52SCraig Topper; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
901bb5bbe52SCraig Topper; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
902bb5bbe52SCraig Topper; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
903bb5bbe52SCraig Topper; RV64I-NEXT:    sd s2, 0(sp) # 8-byte Folded Spill
904bb5bbe52SCraig Topper; RV64I-NEXT:    mv s0, a0
905bb5bbe52SCraig Topper; RV64I-NEXT:    mv s1, a1
90638a3cce9SCraig Topper; RV64I-NEXT:    lui a0, %hi(.LCPI20_0)
90738a3cce9SCraig Topper; RV64I-NEXT:    lw a1, %lo(.LCPI20_0)(a0)
908bb5bbe52SCraig Topper; RV64I-NEXT:    mv a0, a2
909bb5bbe52SCraig Topper; RV64I-NEXT:    call __addsf3
910bb5bbe52SCraig Topper; RV64I-NEXT:    mv s2, a0
911bb5bbe52SCraig Topper; RV64I-NEXT:    mv a0, s0
912bb5bbe52SCraig Topper; RV64I-NEXT:    mv a1, s1
913bb5bbe52SCraig Topper; RV64I-NEXT:    call __mulsf3
914bb5bbe52SCraig Topper; RV64I-NEXT:    mv a1, s2
915bb5bbe52SCraig Topper; RV64I-NEXT:    call __subsf3
916bb5bbe52SCraig Topper; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
917bb5bbe52SCraig Topper; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
918bb5bbe52SCraig Topper; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
919bb5bbe52SCraig Topper; RV64I-NEXT:    ld s2, 0(sp) # 8-byte Folded Reload
920bb5bbe52SCraig Topper; RV64I-NEXT:    addi sp, sp, 32
921bb5bbe52SCraig Topper; RV64I-NEXT:    ret
922bb5bbe52SCraig Topper  %c_ = fadd float 0.0, %c ; avoid negation using xor
923bb5bbe52SCraig Topper  %1 = fmul contract float %a, %b
924bb5bbe52SCraig Topper  %2 = fsub contract float %1, %c_
925bb5bbe52SCraig Topper  ret float %2
926bb5bbe52SCraig Topper}
927bb5bbe52SCraig Topper
928bb5bbe52SCraig Topperdefine float @fnmadd_s_contract(float %a, float %b, float %c) nounwind {
929bb5bbe52SCraig Topper; CHECKIF-LABEL: fnmadd_s_contract:
930bb5bbe52SCraig Topper; CHECKIF:       # %bb.0:
931bb5bbe52SCraig Topper; CHECKIF-NEXT:    fmv.w.x fa5, zero
932bb5bbe52SCraig Topper; CHECKIF-NEXT:    fadd.s fa4, fa0, fa5
933bb5bbe52SCraig Topper; CHECKIF-NEXT:    fadd.s fa3, fa1, fa5
934bb5bbe52SCraig Topper; CHECKIF-NEXT:    fadd.s fa5, fa2, fa5
935bb5bbe52SCraig Topper; CHECKIF-NEXT:    fmul.s fa4, fa4, fa3
936bb5bbe52SCraig Topper; CHECKIF-NEXT:    fneg.s fa4, fa4
937bb5bbe52SCraig Topper; CHECKIF-NEXT:    fsub.s fa0, fa4, fa5
938bb5bbe52SCraig Topper; CHECKIF-NEXT:    ret
939bb5bbe52SCraig Topper;
940bb5bbe52SCraig Topper; RV32I-LABEL: fnmadd_s_contract:
941bb5bbe52SCraig Topper; RV32I:       # %bb.0:
942bb5bbe52SCraig Topper; RV32I-NEXT:    addi sp, sp, -32
943bb5bbe52SCraig Topper; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
944bb5bbe52SCraig Topper; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
945bb5bbe52SCraig Topper; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
946bb5bbe52SCraig Topper; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
947bb5bbe52SCraig Topper; RV32I-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill
948bb5bbe52SCraig Topper; RV32I-NEXT:    mv s0, a1
94938a3cce9SCraig Topper; RV32I-NEXT:    lui a1, %hi(.LCPI21_0)
95038a3cce9SCraig Topper; RV32I-NEXT:    lw s1, %lo(.LCPI21_0)(a1)
951bb5bbe52SCraig Topper; RV32I-NEXT:    mv s2, a2
952bb5bbe52SCraig Topper; RV32I-NEXT:    mv a1, s1
953bb5bbe52SCraig Topper; RV32I-NEXT:    call __addsf3
954bb5bbe52SCraig Topper; RV32I-NEXT:    mv s3, a0
955bb5bbe52SCraig Topper; RV32I-NEXT:    mv a0, s0
956bb5bbe52SCraig Topper; RV32I-NEXT:    mv a1, s1
957bb5bbe52SCraig Topper; RV32I-NEXT:    call __addsf3
958bb5bbe52SCraig Topper; RV32I-NEXT:    mv s0, a0
959bb5bbe52SCraig Topper; RV32I-NEXT:    mv a0, s2
960bb5bbe52SCraig Topper; RV32I-NEXT:    mv a1, s1
961bb5bbe52SCraig Topper; RV32I-NEXT:    call __addsf3
962bb5bbe52SCraig Topper; RV32I-NEXT:    mv s1, a0
963bb5bbe52SCraig Topper; RV32I-NEXT:    mv a0, s3
964bb5bbe52SCraig Topper; RV32I-NEXT:    mv a1, s0
965bb5bbe52SCraig Topper; RV32I-NEXT:    call __mulsf3
966bb5bbe52SCraig Topper; RV32I-NEXT:    lui a1, 524288
967bb5bbe52SCraig Topper; RV32I-NEXT:    xor a0, a0, a1
968bb5bbe52SCraig Topper; RV32I-NEXT:    mv a1, s1
969bb5bbe52SCraig Topper; RV32I-NEXT:    call __subsf3
970bb5bbe52SCraig Topper; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
971bb5bbe52SCraig Topper; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
972bb5bbe52SCraig Topper; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
973bb5bbe52SCraig Topper; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
974bb5bbe52SCraig Topper; RV32I-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload
975bb5bbe52SCraig Topper; RV32I-NEXT:    addi sp, sp, 32
976bb5bbe52SCraig Topper; RV32I-NEXT:    ret
977bb5bbe52SCraig Topper;
978bb5bbe52SCraig Topper; RV64I-LABEL: fnmadd_s_contract:
979bb5bbe52SCraig Topper; RV64I:       # %bb.0:
980bb5bbe52SCraig Topper; RV64I-NEXT:    addi sp, sp, -48
981bb5bbe52SCraig Topper; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
982bb5bbe52SCraig Topper; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
983bb5bbe52SCraig Topper; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
984bb5bbe52SCraig Topper; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
985bb5bbe52SCraig Topper; RV64I-NEXT:    sd s3, 8(sp) # 8-byte Folded Spill
986bb5bbe52SCraig Topper; RV64I-NEXT:    mv s0, a1
98738a3cce9SCraig Topper; RV64I-NEXT:    lui a1, %hi(.LCPI21_0)
98838a3cce9SCraig Topper; RV64I-NEXT:    lw s1, %lo(.LCPI21_0)(a1)
989bb5bbe52SCraig Topper; RV64I-NEXT:    mv s2, a2
990bb5bbe52SCraig Topper; RV64I-NEXT:    mv a1, s1
991bb5bbe52SCraig Topper; RV64I-NEXT:    call __addsf3
992bb5bbe52SCraig Topper; RV64I-NEXT:    mv s3, a0
993bb5bbe52SCraig Topper; RV64I-NEXT:    mv a0, s0
994bb5bbe52SCraig Topper; RV64I-NEXT:    mv a1, s1
995bb5bbe52SCraig Topper; RV64I-NEXT:    call __addsf3
996bb5bbe52SCraig Topper; RV64I-NEXT:    mv s0, a0
997bb5bbe52SCraig Topper; RV64I-NEXT:    mv a0, s2
998bb5bbe52SCraig Topper; RV64I-NEXT:    mv a1, s1
999bb5bbe52SCraig Topper; RV64I-NEXT:    call __addsf3
1000bb5bbe52SCraig Topper; RV64I-NEXT:    mv s1, a0
1001bb5bbe52SCraig Topper; RV64I-NEXT:    mv a0, s3
1002bb5bbe52SCraig Topper; RV64I-NEXT:    mv a1, s0
1003bb5bbe52SCraig Topper; RV64I-NEXT:    call __mulsf3
1004bb5bbe52SCraig Topper; RV64I-NEXT:    lui a1, 524288
1005bb5bbe52SCraig Topper; RV64I-NEXT:    xor a0, a0, a1
1006bb5bbe52SCraig Topper; RV64I-NEXT:    mv a1, s1
1007bb5bbe52SCraig Topper; RV64I-NEXT:    call __subsf3
1008bb5bbe52SCraig Topper; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
1009bb5bbe52SCraig Topper; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
1010bb5bbe52SCraig Topper; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
1011bb5bbe52SCraig Topper; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
1012bb5bbe52SCraig Topper; RV64I-NEXT:    ld s3, 8(sp) # 8-byte Folded Reload
1013bb5bbe52SCraig Topper; RV64I-NEXT:    addi sp, sp, 48
1014bb5bbe52SCraig Topper; RV64I-NEXT:    ret
1015bb5bbe52SCraig Topper  %a_ = fadd float 0.0, %a ; avoid negation using xor
1016bb5bbe52SCraig Topper  %b_ = fadd float 0.0, %b ; avoid negation using xor
1017bb5bbe52SCraig Topper  %c_ = fadd float 0.0, %c ; avoid negation using xor
1018bb5bbe52SCraig Topper  %1 = fmul contract float %a_, %b_
1019bb5bbe52SCraig Topper  %2 = fneg float %1
1020bb5bbe52SCraig Topper  %3 = fsub contract float %2, %c_
1021bb5bbe52SCraig Topper  ret float %3
1022bb5bbe52SCraig Topper}
1023bb5bbe52SCraig Topper
1024bb5bbe52SCraig Topperdefine float @fnmsub_s_contract(float %a, float %b, float %c) nounwind {
1025bb5bbe52SCraig Topper; CHECKIF-LABEL: fnmsub_s_contract:
1026bb5bbe52SCraig Topper; CHECKIF:       # %bb.0:
1027bb5bbe52SCraig Topper; CHECKIF-NEXT:    fmv.w.x fa5, zero
1028bb5bbe52SCraig Topper; CHECKIF-NEXT:    fadd.s fa4, fa0, fa5
1029bb5bbe52SCraig Topper; CHECKIF-NEXT:    fadd.s fa5, fa1, fa5
1030bb5bbe52SCraig Topper; CHECKIF-NEXT:    fnmsub.s fa0, fa4, fa5, fa2
1031bb5bbe52SCraig Topper; CHECKIF-NEXT:    ret
1032bb5bbe52SCraig Topper;
1033bb5bbe52SCraig Topper; RV32I-LABEL: fnmsub_s_contract:
1034bb5bbe52SCraig Topper; RV32I:       # %bb.0:
1035bb5bbe52SCraig Topper; RV32I-NEXT:    addi sp, sp, -32
1036bb5bbe52SCraig Topper; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
1037bb5bbe52SCraig Topper; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
1038bb5bbe52SCraig Topper; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
1039bb5bbe52SCraig Topper; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
1040bb5bbe52SCraig Topper; RV32I-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill
1041bb5bbe52SCraig Topper; RV32I-NEXT:    mv s0, a1
104238a3cce9SCraig Topper; RV32I-NEXT:    lui a1, %hi(.LCPI22_0)
104338a3cce9SCraig Topper; RV32I-NEXT:    lw s1, %lo(.LCPI22_0)(a1)
1044bb5bbe52SCraig Topper; RV32I-NEXT:    mv s2, a2
1045bb5bbe52SCraig Topper; RV32I-NEXT:    mv a1, s1
1046bb5bbe52SCraig Topper; RV32I-NEXT:    call __addsf3
1047bb5bbe52SCraig Topper; RV32I-NEXT:    mv s3, a0
1048bb5bbe52SCraig Topper; RV32I-NEXT:    mv a0, s0
1049bb5bbe52SCraig Topper; RV32I-NEXT:    mv a1, s1
1050bb5bbe52SCraig Topper; RV32I-NEXT:    call __addsf3
1051bb5bbe52SCraig Topper; RV32I-NEXT:    mv a1, a0
1052bb5bbe52SCraig Topper; RV32I-NEXT:    mv a0, s3
1053bb5bbe52SCraig Topper; RV32I-NEXT:    call __mulsf3
1054bb5bbe52SCraig Topper; RV32I-NEXT:    mv a1, a0
1055bb5bbe52SCraig Topper; RV32I-NEXT:    mv a0, s2
1056bb5bbe52SCraig Topper; RV32I-NEXT:    call __subsf3
1057bb5bbe52SCraig Topper; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
1058bb5bbe52SCraig Topper; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
1059bb5bbe52SCraig Topper; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
1060bb5bbe52SCraig Topper; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
1061bb5bbe52SCraig Topper; RV32I-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload
1062bb5bbe52SCraig Topper; RV32I-NEXT:    addi sp, sp, 32
1063bb5bbe52SCraig Topper; RV32I-NEXT:    ret
1064bb5bbe52SCraig Topper;
1065bb5bbe52SCraig Topper; RV64I-LABEL: fnmsub_s_contract:
1066bb5bbe52SCraig Topper; RV64I:       # %bb.0:
1067bb5bbe52SCraig Topper; RV64I-NEXT:    addi sp, sp, -48
1068bb5bbe52SCraig Topper; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
1069bb5bbe52SCraig Topper; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
1070bb5bbe52SCraig Topper; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
1071bb5bbe52SCraig Topper; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
1072bb5bbe52SCraig Topper; RV64I-NEXT:    sd s3, 8(sp) # 8-byte Folded Spill
1073bb5bbe52SCraig Topper; RV64I-NEXT:    mv s0, a1
107438a3cce9SCraig Topper; RV64I-NEXT:    lui a1, %hi(.LCPI22_0)
107538a3cce9SCraig Topper; RV64I-NEXT:    lw s1, %lo(.LCPI22_0)(a1)
1076bb5bbe52SCraig Topper; RV64I-NEXT:    mv s2, a2
1077bb5bbe52SCraig Topper; RV64I-NEXT:    mv a1, s1
1078bb5bbe52SCraig Topper; RV64I-NEXT:    call __addsf3
1079bb5bbe52SCraig Topper; RV64I-NEXT:    mv s3, a0
1080bb5bbe52SCraig Topper; RV64I-NEXT:    mv a0, s0
1081bb5bbe52SCraig Topper; RV64I-NEXT:    mv a1, s1
1082bb5bbe52SCraig Topper; RV64I-NEXT:    call __addsf3
1083bb5bbe52SCraig Topper; RV64I-NEXT:    mv a1, a0
1084bb5bbe52SCraig Topper; RV64I-NEXT:    mv a0, s3
1085bb5bbe52SCraig Topper; RV64I-NEXT:    call __mulsf3
1086bb5bbe52SCraig Topper; RV64I-NEXT:    mv a1, a0
1087bb5bbe52SCraig Topper; RV64I-NEXT:    mv a0, s2
1088bb5bbe52SCraig Topper; RV64I-NEXT:    call __subsf3
1089bb5bbe52SCraig Topper; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
1090bb5bbe52SCraig Topper; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
1091bb5bbe52SCraig Topper; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
1092bb5bbe52SCraig Topper; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
1093bb5bbe52SCraig Topper; RV64I-NEXT:    ld s3, 8(sp) # 8-byte Folded Reload
1094bb5bbe52SCraig Topper; RV64I-NEXT:    addi sp, sp, 48
1095bb5bbe52SCraig Topper; RV64I-NEXT:    ret
1096bb5bbe52SCraig Topper  %a_ = fadd float 0.0, %a ; avoid negation using xor
1097bb5bbe52SCraig Topper  %b_ = fadd float 0.0, %b ; avoid negation using xor
1098bb5bbe52SCraig Topper  %1 = fmul contract float %a_, %b_
1099bb5bbe52SCraig Topper  %2 = fsub contract float %c, %1
1100bb5bbe52SCraig Topper  ret float %2
1101bb5bbe52SCraig Topper}
1102bb5bbe52SCraig Topper
1103bb5bbe52SCraig Topperdefine float @fsgnjx_f32(float %x, float %y) nounwind {
1104bb5bbe52SCraig Topper; CHECKIF-LABEL: fsgnjx_f32:
1105bb5bbe52SCraig Topper; CHECKIF:       # %bb.0:
1106bb5bbe52SCraig Topper; CHECKIF-NEXT:    lui a0, 260096
1107bb5bbe52SCraig Topper; CHECKIF-NEXT:    fmv.w.x fa5, a0
1108bb5bbe52SCraig Topper; CHECKIF-NEXT:    fsgnj.s fa5, fa5, fa0
1109bb5bbe52SCraig Topper; CHECKIF-NEXT:    fmul.s fa0, fa5, fa1
1110bb5bbe52SCraig Topper; CHECKIF-NEXT:    ret
1111bb5bbe52SCraig Topper;
1112bb5bbe52SCraig Topper; RV32I-LABEL: fsgnjx_f32:
1113bb5bbe52SCraig Topper; RV32I:       # %bb.0:
1114bb5bbe52SCraig Topper; RV32I-NEXT:    addi sp, sp, -16
1115bb5bbe52SCraig Topper; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1116bb5bbe52SCraig Topper; RV32I-NEXT:    lui a2, 524288
1117bb5bbe52SCraig Topper; RV32I-NEXT:    lui a3, 260096
1118bb5bbe52SCraig Topper; RV32I-NEXT:    and a0, a0, a2
1119bb5bbe52SCraig Topper; RV32I-NEXT:    or a0, a0, a3
1120bb5bbe52SCraig Topper; RV32I-NEXT:    call __mulsf3
1121bb5bbe52SCraig Topper; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1122bb5bbe52SCraig Topper; RV32I-NEXT:    addi sp, sp, 16
1123bb5bbe52SCraig Topper; RV32I-NEXT:    ret
1124bb5bbe52SCraig Topper;
1125bb5bbe52SCraig Topper; RV64I-LABEL: fsgnjx_f32:
1126bb5bbe52SCraig Topper; RV64I:       # %bb.0:
1127bb5bbe52SCraig Topper; RV64I-NEXT:    addi sp, sp, -16
1128bb5bbe52SCraig Topper; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1129bb5bbe52SCraig Topper; RV64I-NEXT:    lui a2, 524288
1130bb5bbe52SCraig Topper; RV64I-NEXT:    lui a3, 260096
1131bb5bbe52SCraig Topper; RV64I-NEXT:    and a0, a0, a2
1132bb5bbe52SCraig Topper; RV64I-NEXT:    or a0, a0, a3
1133bb5bbe52SCraig Topper; RV64I-NEXT:    call __mulsf3
1134bb5bbe52SCraig Topper; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1135bb5bbe52SCraig Topper; RV64I-NEXT:    addi sp, sp, 16
1136bb5bbe52SCraig Topper; RV64I-NEXT:    ret
1137bb5bbe52SCraig Topper  %z = call float @llvm.copysign.f32(float 1.0, float %x)
1138bb5bbe52SCraig Topper  %mul = fmul float %z, %y
1139bb5bbe52SCraig Topper  ret float %mul
1140bb5bbe52SCraig Topper}
1141