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