xref: /llvm-project/llvm/test/CodeGen/RISCV/bfloat-arith.ll (revision 9122c5235ec85ce0c0ad337e862b006e7b349d84)
18a71f44eSAlex Bradbury; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
232597685SJianjian Guan; RUN: llc -mtriple=riscv32 -mattr=+zfbfmin -verify-machineinstrs \
38a71f44eSAlex Bradbury; RUN:   -target-abi ilp32f < %s | FileCheck -check-prefixes=CHECK,RV32IZFBFMIN %s
432597685SJianjian Guan; RUN: llc -mtriple=riscv64 -mattr=+zfbfmin -verify-machineinstrs \
58a71f44eSAlex Bradbury; RUN:   -target-abi lp64f < %s | FileCheck -check-prefixes=CHECK,RV64IZFBFMIN %s
68a71f44eSAlex Bradbury
78a71f44eSAlex Bradbury; These tests descend from float-arith.ll, where each function was targeted at
88a71f44eSAlex Bradbury; a particular RISC-V FPU instruction.
98a71f44eSAlex Bradbury
10dc19b59eSCraig Topperdefine bfloat @fadd_bf16(bfloat %a, bfloat %b) nounwind {
11dc19b59eSCraig Topper; CHECK-LABEL: fadd_bf16:
128a71f44eSAlex Bradbury; CHECK:       # %bb.0:
138a71f44eSAlex Bradbury; CHECK-NEXT:    fcvt.s.bf16 fa5, fa1
148a71f44eSAlex Bradbury; CHECK-NEXT:    fcvt.s.bf16 fa4, fa0
158a71f44eSAlex Bradbury; CHECK-NEXT:    fadd.s fa5, fa4, fa5
168a71f44eSAlex Bradbury; CHECK-NEXT:    fcvt.bf16.s fa0, fa5
178a71f44eSAlex Bradbury; CHECK-NEXT:    ret
188a71f44eSAlex Bradbury  %1 = fadd bfloat %a, %b
198a71f44eSAlex Bradbury  ret bfloat %1
208a71f44eSAlex Bradbury}
218a71f44eSAlex Bradbury
22dc19b59eSCraig Topperdefine bfloat @fsub_bf16(bfloat %a, bfloat %b) nounwind {
23dc19b59eSCraig Topper; CHECK-LABEL: fsub_bf16:
248a71f44eSAlex Bradbury; CHECK:       # %bb.0:
258a71f44eSAlex Bradbury; CHECK-NEXT:    fcvt.s.bf16 fa5, fa1
268a71f44eSAlex Bradbury; CHECK-NEXT:    fcvt.s.bf16 fa4, fa0
278a71f44eSAlex Bradbury; CHECK-NEXT:    fsub.s fa5, fa4, fa5
288a71f44eSAlex Bradbury; CHECK-NEXT:    fcvt.bf16.s fa0, fa5
298a71f44eSAlex Bradbury; CHECK-NEXT:    ret
308a71f44eSAlex Bradbury  %1 = fsub bfloat %a, %b
318a71f44eSAlex Bradbury  ret bfloat %1
328a71f44eSAlex Bradbury}
338a71f44eSAlex Bradbury
34dc19b59eSCraig Topperdefine bfloat @fmul_bf16(bfloat %a, bfloat %b) nounwind {
35dc19b59eSCraig Topper; CHECK-LABEL: fmul_bf16:
368a71f44eSAlex Bradbury; CHECK:       # %bb.0:
378a71f44eSAlex Bradbury; CHECK-NEXT:    fcvt.s.bf16 fa5, fa1
388a71f44eSAlex Bradbury; CHECK-NEXT:    fcvt.s.bf16 fa4, fa0
398a71f44eSAlex Bradbury; CHECK-NEXT:    fmul.s fa5, fa4, fa5
408a71f44eSAlex Bradbury; CHECK-NEXT:    fcvt.bf16.s fa0, fa5
418a71f44eSAlex Bradbury; CHECK-NEXT:    ret
428a71f44eSAlex Bradbury  %1 = fmul bfloat %a, %b
438a71f44eSAlex Bradbury  ret bfloat %1
448a71f44eSAlex Bradbury}
458a71f44eSAlex Bradbury
46dc19b59eSCraig Topperdefine bfloat @fdiv_bf16(bfloat %a, bfloat %b) nounwind {
47dc19b59eSCraig Topper; CHECK-LABEL: fdiv_bf16:
488a71f44eSAlex Bradbury; CHECK:       # %bb.0:
498a71f44eSAlex Bradbury; CHECK-NEXT:    fcvt.s.bf16 fa5, fa1
508a71f44eSAlex Bradbury; CHECK-NEXT:    fcvt.s.bf16 fa4, fa0
518a71f44eSAlex Bradbury; CHECK-NEXT:    fdiv.s fa5, fa4, fa5
528a71f44eSAlex Bradbury; CHECK-NEXT:    fcvt.bf16.s fa0, fa5
538a71f44eSAlex Bradbury; CHECK-NEXT:    ret
548a71f44eSAlex Bradbury  %1 = fdiv bfloat %a, %b
558a71f44eSAlex Bradbury  ret bfloat %1
568a71f44eSAlex Bradbury}
578a71f44eSAlex Bradbury
588a71f44eSAlex Bradburydeclare bfloat @llvm.sqrt.bf16(bfloat)
598a71f44eSAlex Bradbury
60dc19b59eSCraig Topperdefine bfloat @fsqrt_bf16(bfloat %a) nounwind {
61dc19b59eSCraig Topper; CHECK-LABEL: fsqrt_bf16:
628a71f44eSAlex Bradbury; CHECK:       # %bb.0:
638a71f44eSAlex Bradbury; CHECK-NEXT:    fcvt.s.bf16 fa5, fa0
648a71f44eSAlex Bradbury; CHECK-NEXT:    fsqrt.s fa5, fa5
658a71f44eSAlex Bradbury; CHECK-NEXT:    fcvt.bf16.s fa0, fa5
668a71f44eSAlex Bradbury; CHECK-NEXT:    ret
678a71f44eSAlex Bradbury  %1 = call bfloat @llvm.sqrt.bf16(bfloat %a)
688a71f44eSAlex Bradbury  ret bfloat %1
698a71f44eSAlex Bradbury}
708a71f44eSAlex Bradbury
718a71f44eSAlex Bradburydeclare bfloat @llvm.copysign.bf16(bfloat, bfloat)
728a71f44eSAlex Bradbury
73dc19b59eSCraig Topperdefine bfloat @fsgnj_bf16(bfloat %a, bfloat %b) nounwind {
74dc19b59eSCraig Topper; RV32IZFBFMIN-LABEL: fsgnj_bf16:
758a71f44eSAlex Bradbury; RV32IZFBFMIN:       # %bb.0:
769a1eded9SCraig Topper; RV32IZFBFMIN-NEXT:    fmv.x.h a0, fa1
779a1eded9SCraig Topper; RV32IZFBFMIN-NEXT:    lui a1, 1048568
789a1eded9SCraig Topper; RV32IZFBFMIN-NEXT:    and a0, a0, a1
793bdec313SCraig Topper; RV32IZFBFMIN-NEXT:    fmv.x.h a1, fa0
803bdec313SCraig Topper; RV32IZFBFMIN-NEXT:    slli a1, a1, 17
819a1eded9SCraig Topper; RV32IZFBFMIN-NEXT:    srli a1, a1, 17
829a1eded9SCraig Topper; RV32IZFBFMIN-NEXT:    or a0, a1, a0
839a1eded9SCraig Topper; RV32IZFBFMIN-NEXT:    fmv.h.x fa0, a0
848a71f44eSAlex Bradbury; RV32IZFBFMIN-NEXT:    ret
858a71f44eSAlex Bradbury;
86dc19b59eSCraig Topper; RV64IZFBFMIN-LABEL: fsgnj_bf16:
878a71f44eSAlex Bradbury; RV64IZFBFMIN:       # %bb.0:
889a1eded9SCraig Topper; RV64IZFBFMIN-NEXT:    fmv.x.h a0, fa1
899a1eded9SCraig Topper; RV64IZFBFMIN-NEXT:    lui a1, 1048568
909a1eded9SCraig Topper; RV64IZFBFMIN-NEXT:    and a0, a0, a1
913bdec313SCraig Topper; RV64IZFBFMIN-NEXT:    fmv.x.h a1, fa0
923bdec313SCraig Topper; RV64IZFBFMIN-NEXT:    slli a1, a1, 49
939a1eded9SCraig Topper; RV64IZFBFMIN-NEXT:    srli a1, a1, 49
949a1eded9SCraig Topper; RV64IZFBFMIN-NEXT:    or a0, a1, a0
959a1eded9SCraig Topper; RV64IZFBFMIN-NEXT:    fmv.h.x fa0, a0
968a71f44eSAlex Bradbury; RV64IZFBFMIN-NEXT:    ret
978a71f44eSAlex Bradbury  %1 = call bfloat @llvm.copysign.bf16(bfloat %a, bfloat %b)
988a71f44eSAlex Bradbury  ret bfloat %1
998a71f44eSAlex Bradbury}
1008a71f44eSAlex Bradbury
101dc19b59eSCraig Topperdefine i32 @fneg_bf16(bfloat %a, bfloat %b) nounwind {
102dc19b59eSCraig Topper; CHECK-LABEL: fneg_bf16:
1033bdec313SCraig Topper; CHECK:       # %bb.0:
1043bdec313SCraig Topper; CHECK-NEXT:    fcvt.s.bf16 fa5, fa0
105*9122c523SPengcheng Wang; CHECK-NEXT:    lui a0, 1048568
1063bdec313SCraig Topper; CHECK-NEXT:    fadd.s fa5, fa5, fa5
1073bdec313SCraig Topper; CHECK-NEXT:    fcvt.bf16.s fa5, fa5
108*9122c523SPengcheng Wang; CHECK-NEXT:    fmv.x.h a1, fa5
109*9122c523SPengcheng Wang; CHECK-NEXT:    xor a0, a1, a0
1103bdec313SCraig Topper; CHECK-NEXT:    fmv.h.x fa4, a0
1113bdec313SCraig Topper; CHECK-NEXT:    fcvt.s.bf16 fa4, fa4
1123bdec313SCraig Topper; CHECK-NEXT:    fcvt.s.bf16 fa5, fa5
1133bdec313SCraig Topper; CHECK-NEXT:    feq.s a0, fa5, fa4
1143bdec313SCraig Topper; CHECK-NEXT:    ret
1158a71f44eSAlex Bradbury  %1 = fadd bfloat %a, %a
1168a71f44eSAlex Bradbury  %2 = fneg bfloat %1
1178a71f44eSAlex Bradbury  %3 = fcmp oeq bfloat %1, %2
1188a71f44eSAlex Bradbury  %4 = zext i1 %3 to i32
1198a71f44eSAlex Bradbury  ret i32 %4
1208a71f44eSAlex Bradbury}
1218a71f44eSAlex Bradbury
122dc19b59eSCraig Topperdefine bfloat @fsgnjn_bf16(bfloat %a, bfloat %b) nounwind {
123dc19b59eSCraig Topper; RV32IZFBFMIN-LABEL: fsgnjn_bf16:
1248a71f44eSAlex Bradbury; RV32IZFBFMIN:       # %bb.0:
1258a71f44eSAlex Bradbury; RV32IZFBFMIN-NEXT:    fcvt.s.bf16 fa5, fa1
1268a71f44eSAlex Bradbury; RV32IZFBFMIN-NEXT:    fcvt.s.bf16 fa4, fa0
127*9122c523SPengcheng Wang; RV32IZFBFMIN-NEXT:    lui a0, 1048568
1288a71f44eSAlex Bradbury; RV32IZFBFMIN-NEXT:    fadd.s fa5, fa4, fa5
1298a71f44eSAlex Bradbury; RV32IZFBFMIN-NEXT:    fcvt.bf16.s fa5, fa5
130*9122c523SPengcheng Wang; RV32IZFBFMIN-NEXT:    fmv.x.h a1, fa5
131*9122c523SPengcheng Wang; RV32IZFBFMIN-NEXT:    not a1, a1
132*9122c523SPengcheng Wang; RV32IZFBFMIN-NEXT:    and a0, a1, a0
1339a1eded9SCraig Topper; RV32IZFBFMIN-NEXT:    fmv.x.h a1, fa0
1349a1eded9SCraig Topper; RV32IZFBFMIN-NEXT:    slli a1, a1, 17
1359a1eded9SCraig Topper; RV32IZFBFMIN-NEXT:    srli a1, a1, 17
1363bdec313SCraig Topper; RV32IZFBFMIN-NEXT:    or a0, a1, a0
1379a1eded9SCraig Topper; RV32IZFBFMIN-NEXT:    fmv.h.x fa0, a0
1388a71f44eSAlex Bradbury; RV32IZFBFMIN-NEXT:    ret
1398a71f44eSAlex Bradbury;
140dc19b59eSCraig Topper; RV64IZFBFMIN-LABEL: fsgnjn_bf16:
1418a71f44eSAlex Bradbury; RV64IZFBFMIN:       # %bb.0:
1428a71f44eSAlex Bradbury; RV64IZFBFMIN-NEXT:    fcvt.s.bf16 fa5, fa1
1438a71f44eSAlex Bradbury; RV64IZFBFMIN-NEXT:    fcvt.s.bf16 fa4, fa0
144*9122c523SPengcheng Wang; RV64IZFBFMIN-NEXT:    lui a0, 1048568
1458a71f44eSAlex Bradbury; RV64IZFBFMIN-NEXT:    fadd.s fa5, fa4, fa5
1468a71f44eSAlex Bradbury; RV64IZFBFMIN-NEXT:    fcvt.bf16.s fa5, fa5
147*9122c523SPengcheng Wang; RV64IZFBFMIN-NEXT:    fmv.x.h a1, fa5
148*9122c523SPengcheng Wang; RV64IZFBFMIN-NEXT:    not a1, a1
149*9122c523SPengcheng Wang; RV64IZFBFMIN-NEXT:    and a0, a1, a0
1509a1eded9SCraig Topper; RV64IZFBFMIN-NEXT:    fmv.x.h a1, fa0
1519a1eded9SCraig Topper; RV64IZFBFMIN-NEXT:    slli a1, a1, 49
1529a1eded9SCraig Topper; RV64IZFBFMIN-NEXT:    srli a1, a1, 49
1533bdec313SCraig Topper; RV64IZFBFMIN-NEXT:    or a0, a1, a0
1549a1eded9SCraig Topper; RV64IZFBFMIN-NEXT:    fmv.h.x fa0, a0
1558a71f44eSAlex Bradbury; RV64IZFBFMIN-NEXT:    ret
1568a71f44eSAlex Bradbury  %1 = fadd bfloat %a, %b
1578a71f44eSAlex Bradbury  %2 = fneg bfloat %1
1588a71f44eSAlex Bradbury  %3 = call bfloat @llvm.copysign.bf16(bfloat %a, bfloat %2)
1598a71f44eSAlex Bradbury  ret bfloat %3
1608a71f44eSAlex Bradbury}
1618a71f44eSAlex Bradbury
1628a71f44eSAlex Bradburydeclare bfloat @llvm.fabs.bf16(bfloat)
1638a71f44eSAlex Bradbury
164dc19b59eSCraig Topperdefine bfloat @fabs_bf16(bfloat %a, bfloat %b) nounwind {
165dc19b59eSCraig Topper; RV32IZFBFMIN-LABEL: fabs_bf16:
166a9ffb719SCraig Topper; RV32IZFBFMIN:       # %bb.0:
167a9ffb719SCraig Topper; RV32IZFBFMIN-NEXT:    fcvt.s.bf16 fa5, fa1
168a9ffb719SCraig Topper; RV32IZFBFMIN-NEXT:    fcvt.s.bf16 fa4, fa0
169a9ffb719SCraig Topper; RV32IZFBFMIN-NEXT:    fadd.s fa5, fa4, fa5
170a9ffb719SCraig Topper; RV32IZFBFMIN-NEXT:    fcvt.bf16.s fa5, fa5
1713bdec313SCraig Topper; RV32IZFBFMIN-NEXT:    fmv.x.h a0, fa5
1723bdec313SCraig Topper; RV32IZFBFMIN-NEXT:    slli a0, a0, 17
1733bdec313SCraig Topper; RV32IZFBFMIN-NEXT:    srli a0, a0, 17
1743bdec313SCraig Topper; RV32IZFBFMIN-NEXT:    fmv.h.x fa4, a0
175a9ffb719SCraig Topper; RV32IZFBFMIN-NEXT:    fcvt.s.bf16 fa5, fa5
176a9ffb719SCraig Topper; RV32IZFBFMIN-NEXT:    fcvt.s.bf16 fa4, fa4
177a9ffb719SCraig Topper; RV32IZFBFMIN-NEXT:    fadd.s fa5, fa4, fa5
178a9ffb719SCraig Topper; RV32IZFBFMIN-NEXT:    fcvt.bf16.s fa0, fa5
179a9ffb719SCraig Topper; RV32IZFBFMIN-NEXT:    ret
180a9ffb719SCraig Topper;
181dc19b59eSCraig Topper; RV64IZFBFMIN-LABEL: fabs_bf16:
182a9ffb719SCraig Topper; RV64IZFBFMIN:       # %bb.0:
183a9ffb719SCraig Topper; RV64IZFBFMIN-NEXT:    fcvt.s.bf16 fa5, fa1
184a9ffb719SCraig Topper; RV64IZFBFMIN-NEXT:    fcvt.s.bf16 fa4, fa0
185a9ffb719SCraig Topper; RV64IZFBFMIN-NEXT:    fadd.s fa5, fa4, fa5
186a9ffb719SCraig Topper; RV64IZFBFMIN-NEXT:    fcvt.bf16.s fa5, fa5
1873bdec313SCraig Topper; RV64IZFBFMIN-NEXT:    fmv.x.h a0, fa5
1883bdec313SCraig Topper; RV64IZFBFMIN-NEXT:    slli a0, a0, 49
1893bdec313SCraig Topper; RV64IZFBFMIN-NEXT:    srli a0, a0, 49
1903bdec313SCraig Topper; RV64IZFBFMIN-NEXT:    fmv.h.x fa4, a0
191a9ffb719SCraig Topper; RV64IZFBFMIN-NEXT:    fcvt.s.bf16 fa5, fa5
192a9ffb719SCraig Topper; RV64IZFBFMIN-NEXT:    fcvt.s.bf16 fa4, fa4
193a9ffb719SCraig Topper; RV64IZFBFMIN-NEXT:    fadd.s fa5, fa4, fa5
194a9ffb719SCraig Topper; RV64IZFBFMIN-NEXT:    fcvt.bf16.s fa0, fa5
195a9ffb719SCraig Topper; RV64IZFBFMIN-NEXT:    ret
1968a71f44eSAlex Bradbury  %1 = fadd bfloat %a, %b
1978a71f44eSAlex Bradbury  %2 = call bfloat @llvm.fabs.bf16(bfloat %1)
1988a71f44eSAlex Bradbury  %3 = fadd bfloat %2, %1
1998a71f44eSAlex Bradbury  ret bfloat %3
2008a71f44eSAlex Bradbury}
2018a71f44eSAlex Bradbury
2028a71f44eSAlex Bradburydeclare bfloat @llvm.minnum.bf16(bfloat, bfloat)
2038a71f44eSAlex Bradbury
204dc19b59eSCraig Topperdefine bfloat @fmin_bf16(bfloat %a, bfloat %b) nounwind {
205dc19b59eSCraig Topper; CHECK-LABEL: fmin_bf16:
2068a71f44eSAlex Bradbury; CHECK:       # %bb.0:
2078a71f44eSAlex Bradbury; CHECK-NEXT:    fcvt.s.bf16 fa5, fa1
2088a71f44eSAlex Bradbury; CHECK-NEXT:    fcvt.s.bf16 fa4, fa0
2098a71f44eSAlex Bradbury; CHECK-NEXT:    fmin.s fa5, fa4, fa5
2108a71f44eSAlex Bradbury; CHECK-NEXT:    fcvt.bf16.s fa0, fa5
2118a71f44eSAlex Bradbury; CHECK-NEXT:    ret
2128a71f44eSAlex Bradbury  %1 = call bfloat @llvm.minnum.bf16(bfloat %a, bfloat %b)
2138a71f44eSAlex Bradbury  ret bfloat %1
2148a71f44eSAlex Bradbury}
2158a71f44eSAlex Bradbury
2168a71f44eSAlex Bradburydeclare bfloat @llvm.maxnum.bf16(bfloat, bfloat)
2178a71f44eSAlex Bradbury
218dc19b59eSCraig Topperdefine bfloat @fmax_bf16(bfloat %a, bfloat %b) nounwind {
219dc19b59eSCraig Topper; CHECK-LABEL: fmax_bf16:
2208a71f44eSAlex Bradbury; CHECK:       # %bb.0:
2218a71f44eSAlex Bradbury; CHECK-NEXT:    fcvt.s.bf16 fa5, fa1
2228a71f44eSAlex Bradbury; CHECK-NEXT:    fcvt.s.bf16 fa4, fa0
2238a71f44eSAlex Bradbury; CHECK-NEXT:    fmax.s fa5, fa4, fa5
2248a71f44eSAlex Bradbury; CHECK-NEXT:    fcvt.bf16.s fa0, fa5
2258a71f44eSAlex Bradbury; CHECK-NEXT:    ret
2268a71f44eSAlex Bradbury  %1 = call bfloat @llvm.maxnum.bf16(bfloat %a, bfloat %b)
2278a71f44eSAlex Bradbury  ret bfloat %1
2288a71f44eSAlex Bradbury}
2298a71f44eSAlex Bradbury
2308a71f44eSAlex Bradburydeclare bfloat @llvm.fma.bf16(bfloat, bfloat, bfloat)
2318a71f44eSAlex Bradbury
232dc19b59eSCraig Topperdefine bfloat @fmadd_bf16(bfloat %a, bfloat %b, bfloat %c) nounwind {
233dc19b59eSCraig Topper; CHECK-LABEL: fmadd_bf16:
2348a71f44eSAlex Bradbury; CHECK:       # %bb.0:
2358a71f44eSAlex Bradbury; CHECK-NEXT:    fcvt.s.bf16 fa5, fa2
2368a71f44eSAlex Bradbury; CHECK-NEXT:    fcvt.s.bf16 fa4, fa1
2378a71f44eSAlex Bradbury; CHECK-NEXT:    fcvt.s.bf16 fa3, fa0
2388a71f44eSAlex Bradbury; CHECK-NEXT:    fmadd.s fa5, fa3, fa4, fa5
2398a71f44eSAlex Bradbury; CHECK-NEXT:    fcvt.bf16.s fa0, fa5
2408a71f44eSAlex Bradbury; CHECK-NEXT:    ret
2418a71f44eSAlex Bradbury  %1 = call bfloat @llvm.fma.bf16(bfloat %a, bfloat %b, bfloat %c)
2428a71f44eSAlex Bradbury  ret bfloat %1
2438a71f44eSAlex Bradbury}
2448a71f44eSAlex Bradbury
245dc19b59eSCraig Topperdefine bfloat @fmsub_bf16(bfloat %a, bfloat %b, bfloat %c) nounwind {
246dc19b59eSCraig Topper; CHECK-LABEL: fmsub_bf16:
2473bdec313SCraig Topper; CHECK:       # %bb.0:
2483bdec313SCraig Topper; CHECK-NEXT:    fcvt.s.bf16 fa5, fa2
2493bdec313SCraig Topper; CHECK-NEXT:    fmv.w.x fa4, zero
250*9122c523SPengcheng Wang; CHECK-NEXT:    lui a0, 1048568
251*9122c523SPengcheng Wang; CHECK-NEXT:    fcvt.s.bf16 fa3, fa1
2523bdec313SCraig Topper; CHECK-NEXT:    fadd.s fa5, fa5, fa4
2533bdec313SCraig Topper; CHECK-NEXT:    fcvt.bf16.s fa5, fa5
254*9122c523SPengcheng Wang; CHECK-NEXT:    fmv.x.h a1, fa5
255*9122c523SPengcheng Wang; CHECK-NEXT:    xor a0, a1, a0
2563bdec313SCraig Topper; CHECK-NEXT:    fmv.h.x fa5, a0
2573bdec313SCraig Topper; CHECK-NEXT:    fcvt.s.bf16 fa5, fa5
258*9122c523SPengcheng Wang; CHECK-NEXT:    fcvt.s.bf16 fa4, fa0
259*9122c523SPengcheng Wang; CHECK-NEXT:    fmadd.s fa5, fa4, fa3, fa5
2603bdec313SCraig Topper; CHECK-NEXT:    fcvt.bf16.s fa0, fa5
2613bdec313SCraig Topper; CHECK-NEXT:    ret
2628a71f44eSAlex Bradbury  %c_ = fadd bfloat 0.0, %c ; avoid negation using xor
2638a71f44eSAlex Bradbury  %negc = fsub bfloat -0.0, %c_
2648a71f44eSAlex Bradbury  %1 = call bfloat @llvm.fma.bf16(bfloat %a, bfloat %b, bfloat %negc)
2658a71f44eSAlex Bradbury  ret bfloat %1
2668a71f44eSAlex Bradbury}
2678a71f44eSAlex Bradbury
268dc19b59eSCraig Topperdefine bfloat @fnmadd_bf16(bfloat %a, bfloat %b, bfloat %c) nounwind {
269dc19b59eSCraig Topper; CHECK-LABEL: fnmadd_bf16:
2703bdec313SCraig Topper; CHECK:       # %bb.0:
2713bdec313SCraig Topper; CHECK-NEXT:    fcvt.s.bf16 fa5, fa0
2723bdec313SCraig Topper; CHECK-NEXT:    fmv.w.x fa4, zero
2733bdec313SCraig Topper; CHECK-NEXT:    fcvt.s.bf16 fa3, fa2
274*9122c523SPengcheng Wang; CHECK-NEXT:    lui a0, 1048568
275*9122c523SPengcheng Wang; CHECK-NEXT:    fadd.s fa5, fa5, fa4
2763bdec313SCraig Topper; CHECK-NEXT:    fadd.s fa4, fa3, fa4
277*9122c523SPengcheng Wang; CHECK-NEXT:    fcvt.bf16.s fa5, fa5
2783bdec313SCraig Topper; CHECK-NEXT:    fcvt.bf16.s fa4, fa4
279*9122c523SPengcheng Wang; CHECK-NEXT:    fmv.x.h a1, fa5
280*9122c523SPengcheng Wang; CHECK-NEXT:    fmv.x.h a2, fa4
281*9122c523SPengcheng Wang; CHECK-NEXT:    xor a1, a1, a0
282*9122c523SPengcheng Wang; CHECK-NEXT:    xor a0, a2, a0
283*9122c523SPengcheng Wang; CHECK-NEXT:    fmv.h.x fa5, a1
2843bdec313SCraig Topper; CHECK-NEXT:    fmv.h.x fa4, a0
2853bdec313SCraig Topper; CHECK-NEXT:    fcvt.s.bf16 fa4, fa4
2863bdec313SCraig Topper; CHECK-NEXT:    fcvt.s.bf16 fa5, fa5
2873bdec313SCraig Topper; CHECK-NEXT:    fcvt.s.bf16 fa3, fa1
2883bdec313SCraig Topper; CHECK-NEXT:    fmadd.s fa5, fa5, fa3, fa4
2893bdec313SCraig Topper; CHECK-NEXT:    fcvt.bf16.s fa0, fa5
2903bdec313SCraig Topper; CHECK-NEXT:    ret
2918a71f44eSAlex Bradbury  %a_ = fadd bfloat 0.0, %a
2928a71f44eSAlex Bradbury  %c_ = fadd bfloat 0.0, %c
2938a71f44eSAlex Bradbury  %nega = fsub bfloat -0.0, %a_
2948a71f44eSAlex Bradbury  %negc = fsub bfloat -0.0, %c_
2958a71f44eSAlex Bradbury  %1 = call bfloat @llvm.fma.bf16(bfloat %nega, bfloat %b, bfloat %negc)
2968a71f44eSAlex Bradbury  ret bfloat %1
2978a71f44eSAlex Bradbury}
2988a71f44eSAlex Bradbury
2998a71f44eSAlex Bradburydefine bfloat @fnmadd_s_2(bfloat %a, bfloat %b, bfloat %c) nounwind {
3003bdec313SCraig Topper; CHECK-LABEL: fnmadd_s_2:
3013bdec313SCraig Topper; CHECK:       # %bb.0:
3023bdec313SCraig Topper; CHECK-NEXT:    fcvt.s.bf16 fa5, fa1
3033bdec313SCraig Topper; CHECK-NEXT:    fmv.w.x fa4, zero
3043bdec313SCraig Topper; CHECK-NEXT:    fcvt.s.bf16 fa3, fa2
305*9122c523SPengcheng Wang; CHECK-NEXT:    lui a0, 1048568
306*9122c523SPengcheng Wang; CHECK-NEXT:    fadd.s fa5, fa5, fa4
3073bdec313SCraig Topper; CHECK-NEXT:    fadd.s fa4, fa3, fa4
308*9122c523SPengcheng Wang; CHECK-NEXT:    fcvt.bf16.s fa5, fa5
3093bdec313SCraig Topper; CHECK-NEXT:    fcvt.bf16.s fa4, fa4
310*9122c523SPengcheng Wang; CHECK-NEXT:    fmv.x.h a1, fa5
311*9122c523SPengcheng Wang; CHECK-NEXT:    fmv.x.h a2, fa4
312*9122c523SPengcheng Wang; CHECK-NEXT:    xor a1, a1, a0
313*9122c523SPengcheng Wang; CHECK-NEXT:    xor a0, a2, a0
314*9122c523SPengcheng Wang; CHECK-NEXT:    fmv.h.x fa5, a1
3153bdec313SCraig Topper; CHECK-NEXT:    fmv.h.x fa4, a0
3163bdec313SCraig Topper; CHECK-NEXT:    fcvt.s.bf16 fa4, fa4
3173bdec313SCraig Topper; CHECK-NEXT:    fcvt.s.bf16 fa5, fa5
3183bdec313SCraig Topper; CHECK-NEXT:    fcvt.s.bf16 fa3, fa0
3193bdec313SCraig Topper; CHECK-NEXT:    fmadd.s fa5, fa3, fa5, fa4
3203bdec313SCraig Topper; CHECK-NEXT:    fcvt.bf16.s fa0, fa5
3213bdec313SCraig Topper; CHECK-NEXT:    ret
3228a71f44eSAlex Bradbury  %b_ = fadd bfloat 0.0, %b
3238a71f44eSAlex Bradbury  %c_ = fadd bfloat 0.0, %c
3248a71f44eSAlex Bradbury  %negb = fsub bfloat -0.0, %b_
3258a71f44eSAlex Bradbury  %negc = fsub bfloat -0.0, %c_
3268a71f44eSAlex Bradbury  %1 = call bfloat @llvm.fma.bf16(bfloat %a, bfloat %negb, bfloat %negc)
3278a71f44eSAlex Bradbury  ret bfloat %1
3288a71f44eSAlex Bradbury}
3298a71f44eSAlex Bradbury
3308a71f44eSAlex Bradburydefine bfloat @fnmadd_s_3(bfloat %a, bfloat %b, bfloat %c) nounwind {
3313bdec313SCraig Topper; CHECK-LABEL: fnmadd_s_3:
3323bdec313SCraig Topper; CHECK:       # %bb.0:
3333bdec313SCraig Topper; CHECK-NEXT:    fcvt.s.bf16 fa5, fa2
3343bdec313SCraig Topper; CHECK-NEXT:    fcvt.s.bf16 fa4, fa1
3353bdec313SCraig Topper; CHECK-NEXT:    fcvt.s.bf16 fa3, fa0
3363bdec313SCraig Topper; CHECK-NEXT:    fmadd.s fa5, fa3, fa4, fa5
3373bdec313SCraig Topper; CHECK-NEXT:    fcvt.bf16.s fa5, fa5
3383bdec313SCraig Topper; CHECK-NEXT:    fmv.x.h a0, fa5
3393bdec313SCraig Topper; CHECK-NEXT:    lui a1, 1048568
3403bdec313SCraig Topper; CHECK-NEXT:    xor a0, a0, a1
3413bdec313SCraig Topper; CHECK-NEXT:    fmv.h.x fa0, a0
3423bdec313SCraig Topper; CHECK-NEXT:    ret
3438a71f44eSAlex Bradbury  %1 = call bfloat @llvm.fma.bf16(bfloat %a, bfloat %b, bfloat %c)
3448a71f44eSAlex Bradbury  %neg = fneg bfloat %1
3458a71f44eSAlex Bradbury  ret bfloat %neg
3468a71f44eSAlex Bradbury}
3478a71f44eSAlex Bradbury
3488a71f44eSAlex Bradbury
3498a71f44eSAlex Bradburydefine bfloat @fnmadd_nsz(bfloat %a, bfloat %b, bfloat %c) nounwind {
3503bdec313SCraig Topper; CHECK-LABEL: fnmadd_nsz:
3513bdec313SCraig Topper; CHECK:       # %bb.0:
3523bdec313SCraig Topper; CHECK-NEXT:    fcvt.s.bf16 fa5, fa2
3533bdec313SCraig Topper; CHECK-NEXT:    fcvt.s.bf16 fa4, fa1
3543bdec313SCraig Topper; CHECK-NEXT:    fcvt.s.bf16 fa3, fa0
3553bdec313SCraig Topper; CHECK-NEXT:    fmadd.s fa5, fa3, fa4, fa5
3563bdec313SCraig Topper; CHECK-NEXT:    fcvt.bf16.s fa5, fa5
3573bdec313SCraig Topper; CHECK-NEXT:    fmv.x.h a0, fa5
3583bdec313SCraig Topper; CHECK-NEXT:    lui a1, 1048568
3593bdec313SCraig Topper; CHECK-NEXT:    xor a0, a0, a1
3603bdec313SCraig Topper; CHECK-NEXT:    fmv.h.x fa0, a0
3613bdec313SCraig Topper; CHECK-NEXT:    ret
3628a71f44eSAlex Bradbury  %1 = call nsz bfloat @llvm.fma.bf16(bfloat %a, bfloat %b, bfloat %c)
3638a71f44eSAlex Bradbury  %neg = fneg nsz bfloat %1
3648a71f44eSAlex Bradbury  ret bfloat %neg
3658a71f44eSAlex Bradbury}
3668a71f44eSAlex Bradbury
367dc19b59eSCraig Topperdefine bfloat @fnmsub_bf16(bfloat %a, bfloat %b, bfloat %c) nounwind {
368dc19b59eSCraig Topper; CHECK-LABEL: fnmsub_bf16:
3693bdec313SCraig Topper; CHECK:       # %bb.0:
3703bdec313SCraig Topper; CHECK-NEXT:    fcvt.s.bf16 fa5, fa0
3713bdec313SCraig Topper; CHECK-NEXT:    fmv.w.x fa4, zero
372*9122c523SPengcheng Wang; CHECK-NEXT:    lui a0, 1048568
373*9122c523SPengcheng Wang; CHECK-NEXT:    fcvt.s.bf16 fa3, fa2
3743bdec313SCraig Topper; CHECK-NEXT:    fadd.s fa5, fa5, fa4
3753bdec313SCraig Topper; CHECK-NEXT:    fcvt.bf16.s fa5, fa5
376*9122c523SPengcheng Wang; CHECK-NEXT:    fmv.x.h a1, fa5
377*9122c523SPengcheng Wang; CHECK-NEXT:    xor a0, a1, a0
3783bdec313SCraig Topper; CHECK-NEXT:    fmv.h.x fa5, a0
3793bdec313SCraig Topper; CHECK-NEXT:    fcvt.s.bf16 fa5, fa5
380*9122c523SPengcheng Wang; CHECK-NEXT:    fcvt.s.bf16 fa4, fa1
381*9122c523SPengcheng Wang; CHECK-NEXT:    fmadd.s fa5, fa5, fa4, fa3
3823bdec313SCraig Topper; CHECK-NEXT:    fcvt.bf16.s fa0, fa5
3833bdec313SCraig Topper; CHECK-NEXT:    ret
3848a71f44eSAlex Bradbury  %a_ = fadd bfloat 0.0, %a
3858a71f44eSAlex Bradbury  %nega = fsub bfloat -0.0, %a_
3868a71f44eSAlex Bradbury  %1 = call bfloat @llvm.fma.bf16(bfloat %nega, bfloat %b, bfloat %c)
3878a71f44eSAlex Bradbury  ret bfloat %1
3888a71f44eSAlex Bradbury}
3898a71f44eSAlex Bradbury
390dc19b59eSCraig Topperdefine bfloat @fnmsub_bf16_2(bfloat %a, bfloat %b, bfloat %c) nounwind {
391dc19b59eSCraig Topper; CHECK-LABEL: fnmsub_bf16_2:
3923bdec313SCraig Topper; CHECK:       # %bb.0:
3933bdec313SCraig Topper; CHECK-NEXT:    fcvt.s.bf16 fa5, fa1
3943bdec313SCraig Topper; CHECK-NEXT:    fmv.w.x fa4, zero
395*9122c523SPengcheng Wang; CHECK-NEXT:    lui a0, 1048568
396*9122c523SPengcheng Wang; CHECK-NEXT:    fcvt.s.bf16 fa3, fa2
3973bdec313SCraig Topper; CHECK-NEXT:    fadd.s fa5, fa5, fa4
3983bdec313SCraig Topper; CHECK-NEXT:    fcvt.bf16.s fa5, fa5
399*9122c523SPengcheng Wang; CHECK-NEXT:    fmv.x.h a1, fa5
400*9122c523SPengcheng Wang; CHECK-NEXT:    xor a0, a1, a0
4013bdec313SCraig Topper; CHECK-NEXT:    fmv.h.x fa5, a0
4023bdec313SCraig Topper; CHECK-NEXT:    fcvt.s.bf16 fa5, fa5
403*9122c523SPengcheng Wang; CHECK-NEXT:    fcvt.s.bf16 fa4, fa0
404*9122c523SPengcheng Wang; CHECK-NEXT:    fmadd.s fa5, fa4, fa5, fa3
4053bdec313SCraig Topper; CHECK-NEXT:    fcvt.bf16.s fa0, fa5
4063bdec313SCraig Topper; CHECK-NEXT:    ret
4078a71f44eSAlex Bradbury  %b_ = fadd bfloat 0.0, %b
4088a71f44eSAlex Bradbury  %negb = fsub bfloat -0.0, %b_
4098a71f44eSAlex Bradbury  %1 = call bfloat @llvm.fma.bf16(bfloat %a, bfloat %negb, bfloat %c)
4108a71f44eSAlex Bradbury  ret bfloat %1
4118a71f44eSAlex Bradbury}
4128a71f44eSAlex Bradbury
413dc19b59eSCraig Topperdefine bfloat @fmadd_bf16_contract(bfloat %a, bfloat %b, bfloat %c) nounwind {
414dc19b59eSCraig Topper; CHECK-LABEL: fmadd_bf16_contract:
4158a71f44eSAlex Bradbury; CHECK:       # %bb.0:
4168a71f44eSAlex Bradbury; CHECK-NEXT:    fcvt.s.bf16 fa5, fa1
4178a71f44eSAlex Bradbury; CHECK-NEXT:    fcvt.s.bf16 fa4, fa0
4188a71f44eSAlex Bradbury; CHECK-NEXT:    fmul.s fa5, fa4, fa5
4198a71f44eSAlex Bradbury; CHECK-NEXT:    fcvt.bf16.s fa5, fa5
4208a71f44eSAlex Bradbury; CHECK-NEXT:    fcvt.s.bf16 fa5, fa5
4218a71f44eSAlex Bradbury; CHECK-NEXT:    fcvt.s.bf16 fa4, fa2
4228a71f44eSAlex Bradbury; CHECK-NEXT:    fadd.s fa5, fa5, fa4
4238a71f44eSAlex Bradbury; CHECK-NEXT:    fcvt.bf16.s fa0, fa5
4248a71f44eSAlex Bradbury; CHECK-NEXT:    ret
4258a71f44eSAlex Bradbury  %1 = fmul contract bfloat %a, %b
4268a71f44eSAlex Bradbury  %2 = fadd contract bfloat %1, %c
4278a71f44eSAlex Bradbury  ret bfloat %2
4288a71f44eSAlex Bradbury}
4298a71f44eSAlex Bradbury
430dc19b59eSCraig Topperdefine bfloat @fmsub_bf16_contract(bfloat %a, bfloat %b, bfloat %c) nounwind {
431dc19b59eSCraig Topper; CHECK-LABEL: fmsub_bf16_contract:
4328a71f44eSAlex Bradbury; CHECK:       # %bb.0:
4338a71f44eSAlex Bradbury; CHECK-NEXT:    fcvt.s.bf16 fa5, fa2
4348a71f44eSAlex Bradbury; CHECK-NEXT:    fmv.w.x fa4, zero
435*9122c523SPengcheng Wang; CHECK-NEXT:    fcvt.s.bf16 fa3, fa1
436*9122c523SPengcheng Wang; CHECK-NEXT:    fcvt.s.bf16 fa2, fa0
4378a71f44eSAlex Bradbury; CHECK-NEXT:    fadd.s fa5, fa5, fa4
438*9122c523SPengcheng Wang; CHECK-NEXT:    fmul.s fa4, fa2, fa3
4398a71f44eSAlex Bradbury; CHECK-NEXT:    fcvt.bf16.s fa5, fa5
4408a71f44eSAlex Bradbury; CHECK-NEXT:    fcvt.bf16.s fa4, fa4
4418a71f44eSAlex Bradbury; CHECK-NEXT:    fcvt.s.bf16 fa5, fa5
4428a71f44eSAlex Bradbury; CHECK-NEXT:    fcvt.s.bf16 fa4, fa4
4438a71f44eSAlex Bradbury; CHECK-NEXT:    fsub.s fa5, fa4, fa5
4448a71f44eSAlex Bradbury; CHECK-NEXT:    fcvt.bf16.s fa0, fa5
4458a71f44eSAlex Bradbury; CHECK-NEXT:    ret
4468a71f44eSAlex Bradbury  %c_ = fadd bfloat 0.0, %c ; avoid negation using xor
4478a71f44eSAlex Bradbury  %1 = fmul contract bfloat %a, %b
4488a71f44eSAlex Bradbury  %2 = fsub contract bfloat %1, %c_
4498a71f44eSAlex Bradbury  ret bfloat %2
4508a71f44eSAlex Bradbury}
4518a71f44eSAlex Bradbury
452dc19b59eSCraig Topperdefine bfloat @fnmadd_bf16_contract(bfloat %a, bfloat %b, bfloat %c) nounwind {
453dc19b59eSCraig Topper; CHECK-LABEL: fnmadd_bf16_contract:
4543bdec313SCraig Topper; CHECK:       # %bb.0:
4553bdec313SCraig Topper; CHECK-NEXT:    fcvt.s.bf16 fa5, fa0
4563bdec313SCraig Topper; CHECK-NEXT:    fmv.w.x fa4, zero
4573bdec313SCraig Topper; CHECK-NEXT:    fcvt.s.bf16 fa3, fa1
4583bdec313SCraig Topper; CHECK-NEXT:    fcvt.s.bf16 fa2, fa2
459*9122c523SPengcheng Wang; CHECK-NEXT:    lui a0, 1048568
460*9122c523SPengcheng Wang; CHECK-NEXT:    fadd.s fa5, fa5, fa4
461*9122c523SPengcheng Wang; CHECK-NEXT:    fadd.s fa3, fa3, fa4
4623bdec313SCraig Topper; CHECK-NEXT:    fadd.s fa4, fa2, fa4
463*9122c523SPengcheng Wang; CHECK-NEXT:    fcvt.bf16.s fa5, fa5
464*9122c523SPengcheng Wang; CHECK-NEXT:    fcvt.bf16.s fa3, fa3
4653bdec313SCraig Topper; CHECK-NEXT:    fcvt.bf16.s fa4, fa4
4663bdec313SCraig Topper; CHECK-NEXT:    fcvt.s.bf16 fa3, fa3
4673bdec313SCraig Topper; CHECK-NEXT:    fcvt.s.bf16 fa5, fa5
4683bdec313SCraig Topper; CHECK-NEXT:    fmul.s fa5, fa5, fa3
4693bdec313SCraig Topper; CHECK-NEXT:    fcvt.bf16.s fa5, fa5
470*9122c523SPengcheng Wang; CHECK-NEXT:    fmv.x.h a1, fa5
471*9122c523SPengcheng Wang; CHECK-NEXT:    xor a0, a1, a0
4723bdec313SCraig Topper; CHECK-NEXT:    fmv.h.x fa5, a0
4733bdec313SCraig Topper; CHECK-NEXT:    fcvt.s.bf16 fa5, fa5
4743bdec313SCraig Topper; CHECK-NEXT:    fcvt.s.bf16 fa4, fa4
4753bdec313SCraig Topper; CHECK-NEXT:    fsub.s fa5, fa5, fa4
4763bdec313SCraig Topper; CHECK-NEXT:    fcvt.bf16.s fa0, fa5
4773bdec313SCraig Topper; CHECK-NEXT:    ret
4788a71f44eSAlex Bradbury  %a_ = fadd bfloat 0.0, %a ; avoid negation using xor
4798a71f44eSAlex Bradbury  %b_ = fadd bfloat 0.0, %b ; avoid negation using xor
4808a71f44eSAlex Bradbury  %c_ = fadd bfloat 0.0, %c ; avoid negation using xor
4818a71f44eSAlex Bradbury  %1 = fmul contract bfloat %a_, %b_
4828a71f44eSAlex Bradbury  %2 = fneg bfloat %1
4838a71f44eSAlex Bradbury  %3 = fsub contract bfloat %2, %c_
4848a71f44eSAlex Bradbury  ret bfloat %3
4858a71f44eSAlex Bradbury}
4868a71f44eSAlex Bradbury
487dc19b59eSCraig Topperdefine bfloat @fnmsub_bf16_contract(bfloat %a, bfloat %b, bfloat %c) nounwind {
488dc19b59eSCraig Topper; CHECK-LABEL: fnmsub_bf16_contract:
4898a71f44eSAlex Bradbury; CHECK:       # %bb.0:
4908a71f44eSAlex Bradbury; CHECK-NEXT:    fcvt.s.bf16 fa5, fa0
4918a71f44eSAlex Bradbury; CHECK-NEXT:    fmv.w.x fa4, zero
4928a71f44eSAlex Bradbury; CHECK-NEXT:    fcvt.s.bf16 fa3, fa1
493*9122c523SPengcheng Wang; CHECK-NEXT:    fadd.s fa5, fa5, fa4
4948a71f44eSAlex Bradbury; CHECK-NEXT:    fadd.s fa4, fa3, fa4
495*9122c523SPengcheng Wang; CHECK-NEXT:    fcvt.bf16.s fa5, fa5
4968a71f44eSAlex Bradbury; CHECK-NEXT:    fcvt.bf16.s fa4, fa4
4978a71f44eSAlex Bradbury; CHECK-NEXT:    fcvt.s.bf16 fa4, fa4
4988a71f44eSAlex Bradbury; CHECK-NEXT:    fcvt.s.bf16 fa5, fa5
4998a71f44eSAlex Bradbury; CHECK-NEXT:    fmul.s fa5, fa5, fa4
5008a71f44eSAlex Bradbury; CHECK-NEXT:    fcvt.bf16.s fa5, fa5
5018a71f44eSAlex Bradbury; CHECK-NEXT:    fcvt.s.bf16 fa5, fa5
5028a71f44eSAlex Bradbury; CHECK-NEXT:    fcvt.s.bf16 fa4, fa2
5038a71f44eSAlex Bradbury; CHECK-NEXT:    fsub.s fa5, fa4, fa5
5048a71f44eSAlex Bradbury; CHECK-NEXT:    fcvt.bf16.s fa0, fa5
5058a71f44eSAlex Bradbury; CHECK-NEXT:    ret
5068a71f44eSAlex Bradbury  %a_ = fadd bfloat 0.0, %a ; avoid negation using xor
5078a71f44eSAlex Bradbury  %b_ = fadd bfloat 0.0, %b ; avoid negation using xor
5088a71f44eSAlex Bradbury  %1 = fmul contract bfloat %a_, %b_
5098a71f44eSAlex Bradbury  %2 = fsub contract bfloat %c, %1
5108a71f44eSAlex Bradbury  ret bfloat %2
5118a71f44eSAlex Bradbury}
512