brintos

brintos / llvm-project-archived public Read only

0
0
Text · 16.4 KiB · c3bd658 Raw
499 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 22; RUN: llc -mtriple=riscv32 -mattr=+zfbfmin -verify-machineinstrs \3; RUN:   -target-abi ilp32f < %s | FileCheck -check-prefixes=CHECK,RV32IZFBFMIN %s4; RUN: llc -mtriple=riscv64 -mattr=+zfbfmin -verify-machineinstrs \5; RUN:   -target-abi lp64f < %s | FileCheck -check-prefixes=CHECK,RV64IZFBFMIN %s6 7; These tests descend from float-arith.ll, where each function was targeted at8; a particular RISC-V FPU instruction.9 10define bfloat @fadd_bf16(bfloat %a, bfloat %b) nounwind {11; CHECK-LABEL: fadd_bf16:12; CHECK:       # %bb.0:13; CHECK-NEXT:    fcvt.s.bf16 fa5, fa114; CHECK-NEXT:    fcvt.s.bf16 fa4, fa015; CHECK-NEXT:    fadd.s fa5, fa4, fa516; CHECK-NEXT:    fcvt.bf16.s fa0, fa517; CHECK-NEXT:    ret18  %1 = fadd bfloat %a, %b19  ret bfloat %120}21 22define bfloat @fsub_bf16(bfloat %a, bfloat %b) nounwind {23; CHECK-LABEL: fsub_bf16:24; CHECK:       # %bb.0:25; CHECK-NEXT:    fcvt.s.bf16 fa5, fa126; CHECK-NEXT:    fcvt.s.bf16 fa4, fa027; CHECK-NEXT:    fsub.s fa5, fa4, fa528; CHECK-NEXT:    fcvt.bf16.s fa0, fa529; CHECK-NEXT:    ret30  %1 = fsub bfloat %a, %b31  ret bfloat %132}33 34define bfloat @fmul_bf16(bfloat %a, bfloat %b) nounwind {35; CHECK-LABEL: fmul_bf16:36; CHECK:       # %bb.0:37; CHECK-NEXT:    fcvt.s.bf16 fa5, fa138; CHECK-NEXT:    fcvt.s.bf16 fa4, fa039; CHECK-NEXT:    fmul.s fa5, fa4, fa540; CHECK-NEXT:    fcvt.bf16.s fa0, fa541; CHECK-NEXT:    ret42  %1 = fmul bfloat %a, %b43  ret bfloat %144}45 46define bfloat @fdiv_bf16(bfloat %a, bfloat %b) nounwind {47; CHECK-LABEL: fdiv_bf16:48; CHECK:       # %bb.0:49; CHECK-NEXT:    fcvt.s.bf16 fa5, fa150; CHECK-NEXT:    fcvt.s.bf16 fa4, fa051; CHECK-NEXT:    fdiv.s fa5, fa4, fa552; CHECK-NEXT:    fcvt.bf16.s fa0, fa553; CHECK-NEXT:    ret54  %1 = fdiv bfloat %a, %b55  ret bfloat %156}57 58define bfloat @fsqrt_bf16(bfloat %a) nounwind {59; CHECK-LABEL: fsqrt_bf16:60; CHECK:       # %bb.0:61; CHECK-NEXT:    fcvt.s.bf16 fa5, fa062; CHECK-NEXT:    fsqrt.s fa5, fa563; CHECK-NEXT:    fcvt.bf16.s fa0, fa564; CHECK-NEXT:    ret65  %1 = call bfloat @llvm.sqrt.bf16(bfloat %a)66  ret bfloat %167}68 69define bfloat @fsgnj_bf16(bfloat %a, bfloat %b) nounwind {70; RV32IZFBFMIN-LABEL: fsgnj_bf16:71; RV32IZFBFMIN:       # %bb.0:72; RV32IZFBFMIN-NEXT:    fmv.x.h a0, fa173; RV32IZFBFMIN-NEXT:    lui a1, 104856874; RV32IZFBFMIN-NEXT:    and a0, a0, a175; RV32IZFBFMIN-NEXT:    fmv.x.h a1, fa076; RV32IZFBFMIN-NEXT:    slli a1, a1, 1777; RV32IZFBFMIN-NEXT:    srli a1, a1, 1778; RV32IZFBFMIN-NEXT:    or a0, a1, a079; RV32IZFBFMIN-NEXT:    fmv.h.x fa0, a080; RV32IZFBFMIN-NEXT:    ret81;82; RV64IZFBFMIN-LABEL: fsgnj_bf16:83; RV64IZFBFMIN:       # %bb.0:84; RV64IZFBFMIN-NEXT:    fmv.x.h a0, fa185; RV64IZFBFMIN-NEXT:    lui a1, 104856886; RV64IZFBFMIN-NEXT:    and a0, a0, a187; RV64IZFBFMIN-NEXT:    fmv.x.h a1, fa088; RV64IZFBFMIN-NEXT:    slli a1, a1, 4989; RV64IZFBFMIN-NEXT:    srli a1, a1, 4990; RV64IZFBFMIN-NEXT:    or a0, a1, a091; RV64IZFBFMIN-NEXT:    fmv.h.x fa0, a092; RV64IZFBFMIN-NEXT:    ret93  %1 = call bfloat @llvm.copysign.bf16(bfloat %a, bfloat %b)94  ret bfloat %195}96 97define i32 @fneg_bf16(bfloat %a, bfloat %b) nounwind {98; CHECK-LABEL: fneg_bf16:99; CHECK:       # %bb.0:100; CHECK-NEXT:    fcvt.s.bf16 fa5, fa0101; CHECK-NEXT:    lui a0, 1048568102; CHECK-NEXT:    fadd.s fa5, fa5, fa5103; CHECK-NEXT:    fcvt.bf16.s fa5, fa5104; CHECK-NEXT:    fmv.x.h a1, fa5105; CHECK-NEXT:    xor a0, a1, a0106; CHECK-NEXT:    fmv.h.x fa4, a0107; CHECK-NEXT:    fcvt.s.bf16 fa4, fa4108; CHECK-NEXT:    fcvt.s.bf16 fa5, fa5109; CHECK-NEXT:    feq.s a0, fa5, fa4110; CHECK-NEXT:    ret111  %1 = fadd bfloat %a, %a112  %2 = fneg bfloat %1113  %3 = fcmp oeq bfloat %1, %2114  %4 = zext i1 %3 to i32115  ret i32 %4116}117 118define bfloat @fsgnjn_bf16(bfloat %a, bfloat %b) nounwind {119; RV32IZFBFMIN-LABEL: fsgnjn_bf16:120; RV32IZFBFMIN:       # %bb.0:121; RV32IZFBFMIN-NEXT:    fcvt.s.bf16 fa5, fa1122; RV32IZFBFMIN-NEXT:    fcvt.s.bf16 fa4, fa0123; RV32IZFBFMIN-NEXT:    lui a0, 1048568124; RV32IZFBFMIN-NEXT:    fadd.s fa5, fa4, fa5125; RV32IZFBFMIN-NEXT:    fcvt.bf16.s fa5, fa5126; RV32IZFBFMIN-NEXT:    fmv.x.h a1, fa5127; RV32IZFBFMIN-NEXT:    not a1, a1128; RV32IZFBFMIN-NEXT:    and a0, a1, a0129; RV32IZFBFMIN-NEXT:    fmv.x.h a1, fa0130; RV32IZFBFMIN-NEXT:    slli a1, a1, 17131; RV32IZFBFMIN-NEXT:    srli a1, a1, 17132; RV32IZFBFMIN-NEXT:    or a0, a1, a0133; RV32IZFBFMIN-NEXT:    fmv.h.x fa0, a0134; RV32IZFBFMIN-NEXT:    ret135;136; RV64IZFBFMIN-LABEL: fsgnjn_bf16:137; RV64IZFBFMIN:       # %bb.0:138; RV64IZFBFMIN-NEXT:    fcvt.s.bf16 fa5, fa1139; RV64IZFBFMIN-NEXT:    fcvt.s.bf16 fa4, fa0140; RV64IZFBFMIN-NEXT:    lui a0, 1048568141; RV64IZFBFMIN-NEXT:    fadd.s fa5, fa4, fa5142; RV64IZFBFMIN-NEXT:    fcvt.bf16.s fa5, fa5143; RV64IZFBFMIN-NEXT:    fmv.x.h a1, fa5144; RV64IZFBFMIN-NEXT:    not a1, a1145; RV64IZFBFMIN-NEXT:    and a0, a1, a0146; RV64IZFBFMIN-NEXT:    fmv.x.h a1, fa0147; RV64IZFBFMIN-NEXT:    slli a1, a1, 49148; RV64IZFBFMIN-NEXT:    srli a1, a1, 49149; RV64IZFBFMIN-NEXT:    or a0, a1, a0150; RV64IZFBFMIN-NEXT:    fmv.h.x fa0, a0151; RV64IZFBFMIN-NEXT:    ret152  %1 = fadd bfloat %a, %b153  %2 = fneg bfloat %1154  %3 = call bfloat @llvm.copysign.bf16(bfloat %a, bfloat %2)155  ret bfloat %3156}157 158define bfloat @fabs_bf16(bfloat %a, bfloat %b) nounwind {159; RV32IZFBFMIN-LABEL: fabs_bf16:160; RV32IZFBFMIN:       # %bb.0:161; RV32IZFBFMIN-NEXT:    fcvt.s.bf16 fa5, fa1162; RV32IZFBFMIN-NEXT:    fcvt.s.bf16 fa4, fa0163; RV32IZFBFMIN-NEXT:    fadd.s fa5, fa4, fa5164; RV32IZFBFMIN-NEXT:    fcvt.bf16.s fa5, fa5165; RV32IZFBFMIN-NEXT:    fmv.x.h a0, fa5166; RV32IZFBFMIN-NEXT:    slli a0, a0, 17167; RV32IZFBFMIN-NEXT:    srli a0, a0, 17168; RV32IZFBFMIN-NEXT:    fmv.h.x fa4, a0169; RV32IZFBFMIN-NEXT:    fcvt.s.bf16 fa5, fa5170; RV32IZFBFMIN-NEXT:    fcvt.s.bf16 fa4, fa4171; RV32IZFBFMIN-NEXT:    fadd.s fa5, fa4, fa5172; RV32IZFBFMIN-NEXT:    fcvt.bf16.s fa0, fa5173; RV32IZFBFMIN-NEXT:    ret174;175; RV64IZFBFMIN-LABEL: fabs_bf16:176; RV64IZFBFMIN:       # %bb.0:177; RV64IZFBFMIN-NEXT:    fcvt.s.bf16 fa5, fa1178; RV64IZFBFMIN-NEXT:    fcvt.s.bf16 fa4, fa0179; RV64IZFBFMIN-NEXT:    fadd.s fa5, fa4, fa5180; RV64IZFBFMIN-NEXT:    fcvt.bf16.s fa5, fa5181; RV64IZFBFMIN-NEXT:    fmv.x.h a0, fa5182; RV64IZFBFMIN-NEXT:    slli a0, a0, 49183; RV64IZFBFMIN-NEXT:    srli a0, a0, 49184; RV64IZFBFMIN-NEXT:    fmv.h.x fa4, a0185; RV64IZFBFMIN-NEXT:    fcvt.s.bf16 fa5, fa5186; RV64IZFBFMIN-NEXT:    fcvt.s.bf16 fa4, fa4187; RV64IZFBFMIN-NEXT:    fadd.s fa5, fa4, fa5188; RV64IZFBFMIN-NEXT:    fcvt.bf16.s fa0, fa5189; RV64IZFBFMIN-NEXT:    ret190  %1 = fadd bfloat %a, %b191  %2 = call bfloat @llvm.fabs.bf16(bfloat %1)192  %3 = fadd bfloat %2, %1193  ret bfloat %3194}195 196define bfloat @fmin_bf16(bfloat %a, bfloat %b) nounwind {197; CHECK-LABEL: fmin_bf16:198; CHECK:       # %bb.0:199; CHECK-NEXT:    fcvt.s.bf16 fa5, fa1200; CHECK-NEXT:    fcvt.s.bf16 fa4, fa0201; CHECK-NEXT:    fmin.s fa5, fa4, fa5202; CHECK-NEXT:    fcvt.bf16.s fa0, fa5203; CHECK-NEXT:    ret204  %1 = call bfloat @llvm.minnum.bf16(bfloat %a, bfloat %b)205  ret bfloat %1206}207 208define bfloat @fmax_bf16(bfloat %a, bfloat %b) nounwind {209; CHECK-LABEL: fmax_bf16:210; CHECK:       # %bb.0:211; CHECK-NEXT:    fcvt.s.bf16 fa5, fa1212; CHECK-NEXT:    fcvt.s.bf16 fa4, fa0213; CHECK-NEXT:    fmax.s fa5, fa4, fa5214; CHECK-NEXT:    fcvt.bf16.s fa0, fa5215; CHECK-NEXT:    ret216  %1 = call bfloat @llvm.maxnum.bf16(bfloat %a, bfloat %b)217  ret bfloat %1218}219 220define bfloat @fmadd_bf16(bfloat %a, bfloat %b, bfloat %c) nounwind {221; CHECK-LABEL: fmadd_bf16:222; CHECK:       # %bb.0:223; CHECK-NEXT:    fcvt.s.bf16 fa5, fa2224; CHECK-NEXT:    fcvt.s.bf16 fa4, fa1225; CHECK-NEXT:    fcvt.s.bf16 fa3, fa0226; CHECK-NEXT:    fmadd.s fa5, fa3, fa4, fa5227; CHECK-NEXT:    fcvt.bf16.s fa0, fa5228; CHECK-NEXT:    ret229  %1 = call bfloat @llvm.fma.bf16(bfloat %a, bfloat %b, bfloat %c)230  ret bfloat %1231}232 233define bfloat @fmsub_bf16(bfloat %a, bfloat %b, bfloat %c) nounwind {234; CHECK-LABEL: fmsub_bf16:235; CHECK:       # %bb.0:236; CHECK-NEXT:    fcvt.s.bf16 fa5, fa2237; CHECK-NEXT:    fmv.w.x fa4, zero238; CHECK-NEXT:    lui a0, 1048568239; CHECK-NEXT:    fcvt.s.bf16 fa3, fa1240; CHECK-NEXT:    fadd.s fa5, fa5, fa4241; CHECK-NEXT:    fcvt.bf16.s fa5, fa5242; CHECK-NEXT:    fmv.x.h a1, fa5243; CHECK-NEXT:    xor a0, a1, a0244; CHECK-NEXT:    fmv.h.x fa5, a0245; CHECK-NEXT:    fcvt.s.bf16 fa5, fa5246; CHECK-NEXT:    fcvt.s.bf16 fa4, fa0247; CHECK-NEXT:    fmadd.s fa5, fa4, fa3, fa5248; CHECK-NEXT:    fcvt.bf16.s fa0, fa5249; CHECK-NEXT:    ret250  %c_ = fadd bfloat 0.0, %c ; avoid negation using xor251  %negc = fsub bfloat -0.0, %c_252  %1 = call bfloat @llvm.fma.bf16(bfloat %a, bfloat %b, bfloat %negc)253  ret bfloat %1254}255 256define bfloat @fnmadd_bf16(bfloat %a, bfloat %b, bfloat %c) nounwind {257; CHECK-LABEL: fnmadd_bf16:258; CHECK:       # %bb.0:259; CHECK-NEXT:    fcvt.s.bf16 fa5, fa0260; CHECK-NEXT:    fmv.w.x fa4, zero261; CHECK-NEXT:    fcvt.s.bf16 fa3, fa2262; CHECK-NEXT:    lui a0, 1048568263; CHECK-NEXT:    fadd.s fa5, fa5, fa4264; CHECK-NEXT:    fadd.s fa4, fa3, fa4265; CHECK-NEXT:    fcvt.bf16.s fa5, fa5266; CHECK-NEXT:    fcvt.bf16.s fa4, fa4267; CHECK-NEXT:    fmv.x.h a1, fa5268; CHECK-NEXT:    fmv.x.h a2, fa4269; CHECK-NEXT:    xor a1, a1, a0270; CHECK-NEXT:    xor a0, a2, a0271; CHECK-NEXT:    fmv.h.x fa5, a1272; CHECK-NEXT:    fmv.h.x fa4, a0273; CHECK-NEXT:    fcvt.s.bf16 fa4, fa4274; CHECK-NEXT:    fcvt.s.bf16 fa5, fa5275; CHECK-NEXT:    fcvt.s.bf16 fa3, fa1276; CHECK-NEXT:    fmadd.s fa5, fa5, fa3, fa4277; CHECK-NEXT:    fcvt.bf16.s fa0, fa5278; CHECK-NEXT:    ret279  %a_ = fadd bfloat 0.0, %a280  %c_ = fadd bfloat 0.0, %c281  %nega = fsub bfloat -0.0, %a_282  %negc = fsub bfloat -0.0, %c_283  %1 = call bfloat @llvm.fma.bf16(bfloat %nega, bfloat %b, bfloat %negc)284  ret bfloat %1285}286 287define bfloat @fnmadd_s_2(bfloat %a, bfloat %b, bfloat %c) nounwind {288; CHECK-LABEL: fnmadd_s_2:289; CHECK:       # %bb.0:290; CHECK-NEXT:    fcvt.s.bf16 fa5, fa1291; CHECK-NEXT:    fmv.w.x fa4, zero292; CHECK-NEXT:    fcvt.s.bf16 fa3, fa2293; CHECK-NEXT:    lui a0, 1048568294; CHECK-NEXT:    fadd.s fa5, fa5, fa4295; CHECK-NEXT:    fadd.s fa4, fa3, fa4296; CHECK-NEXT:    fcvt.bf16.s fa5, fa5297; CHECK-NEXT:    fcvt.bf16.s fa4, fa4298; CHECK-NEXT:    fmv.x.h a1, fa5299; CHECK-NEXT:    fmv.x.h a2, fa4300; CHECK-NEXT:    xor a1, a1, a0301; CHECK-NEXT:    xor a0, a2, a0302; CHECK-NEXT:    fmv.h.x fa5, a1303; CHECK-NEXT:    fmv.h.x fa4, a0304; CHECK-NEXT:    fcvt.s.bf16 fa4, fa4305; CHECK-NEXT:    fcvt.s.bf16 fa5, fa5306; CHECK-NEXT:    fcvt.s.bf16 fa3, fa0307; CHECK-NEXT:    fmadd.s fa5, fa3, fa5, fa4308; CHECK-NEXT:    fcvt.bf16.s fa0, fa5309; CHECK-NEXT:    ret310  %b_ = fadd bfloat 0.0, %b311  %c_ = fadd bfloat 0.0, %c312  %negb = fsub bfloat -0.0, %b_313  %negc = fsub bfloat -0.0, %c_314  %1 = call bfloat @llvm.fma.bf16(bfloat %a, bfloat %negb, bfloat %negc)315  ret bfloat %1316}317 318define bfloat @fnmadd_s_3(bfloat %a, bfloat %b, bfloat %c) nounwind {319; CHECK-LABEL: fnmadd_s_3:320; CHECK:       # %bb.0:321; CHECK-NEXT:    fcvt.s.bf16 fa5, fa2322; CHECK-NEXT:    fcvt.s.bf16 fa4, fa1323; CHECK-NEXT:    fcvt.s.bf16 fa3, fa0324; CHECK-NEXT:    fmadd.s fa5, fa3, fa4, fa5325; CHECK-NEXT:    fcvt.bf16.s fa5, fa5326; CHECK-NEXT:    fmv.x.h a0, fa5327; CHECK-NEXT:    lui a1, 1048568328; CHECK-NEXT:    xor a0, a0, a1329; CHECK-NEXT:    fmv.h.x fa0, a0330; CHECK-NEXT:    ret331  %1 = call bfloat @llvm.fma.bf16(bfloat %a, bfloat %b, bfloat %c)332  %neg = fneg bfloat %1333  ret bfloat %neg334}335 336define bfloat @fnmadd_nsz(bfloat %a, bfloat %b, bfloat %c) nounwind {337; CHECK-LABEL: fnmadd_nsz:338; CHECK:       # %bb.0:339; CHECK-NEXT:    fcvt.s.bf16 fa5, fa2340; CHECK-NEXT:    fcvt.s.bf16 fa4, fa1341; CHECK-NEXT:    fcvt.s.bf16 fa3, fa0342; CHECK-NEXT:    fmadd.s fa5, fa3, fa4, fa5343; CHECK-NEXT:    fcvt.bf16.s fa5, fa5344; CHECK-NEXT:    fmv.x.h a0, fa5345; CHECK-NEXT:    lui a1, 1048568346; CHECK-NEXT:    xor a0, a0, a1347; CHECK-NEXT:    fmv.h.x fa0, a0348; CHECK-NEXT:    ret349  %1 = call nsz bfloat @llvm.fma.bf16(bfloat %a, bfloat %b, bfloat %c)350  %neg = fneg nsz bfloat %1351  ret bfloat %neg352}353 354define bfloat @fnmsub_bf16(bfloat %a, bfloat %b, bfloat %c) nounwind {355; CHECK-LABEL: fnmsub_bf16:356; CHECK:       # %bb.0:357; CHECK-NEXT:    fcvt.s.bf16 fa5, fa0358; CHECK-NEXT:    fmv.w.x fa4, zero359; CHECK-NEXT:    lui a0, 1048568360; CHECK-NEXT:    fcvt.s.bf16 fa3, fa2361; CHECK-NEXT:    fadd.s fa5, fa5, fa4362; CHECK-NEXT:    fcvt.bf16.s fa5, fa5363; CHECK-NEXT:    fmv.x.h a1, fa5364; CHECK-NEXT:    xor a0, a1, a0365; CHECK-NEXT:    fmv.h.x fa5, a0366; CHECK-NEXT:    fcvt.s.bf16 fa5, fa5367; CHECK-NEXT:    fcvt.s.bf16 fa4, fa1368; CHECK-NEXT:    fmadd.s fa5, fa5, fa4, fa3369; CHECK-NEXT:    fcvt.bf16.s fa0, fa5370; CHECK-NEXT:    ret371  %a_ = fadd bfloat 0.0, %a372  %nega = fsub bfloat -0.0, %a_373  %1 = call bfloat @llvm.fma.bf16(bfloat %nega, bfloat %b, bfloat %c)374  ret bfloat %1375}376 377define bfloat @fnmsub_bf16_2(bfloat %a, bfloat %b, bfloat %c) nounwind {378; CHECK-LABEL: fnmsub_bf16_2:379; CHECK:       # %bb.0:380; CHECK-NEXT:    fcvt.s.bf16 fa5, fa1381; CHECK-NEXT:    fmv.w.x fa4, zero382; CHECK-NEXT:    lui a0, 1048568383; CHECK-NEXT:    fcvt.s.bf16 fa3, fa2384; CHECK-NEXT:    fadd.s fa5, fa5, fa4385; CHECK-NEXT:    fcvt.bf16.s fa5, fa5386; CHECK-NEXT:    fmv.x.h a1, fa5387; CHECK-NEXT:    xor a0, a1, a0388; CHECK-NEXT:    fmv.h.x fa5, a0389; CHECK-NEXT:    fcvt.s.bf16 fa5, fa5390; CHECK-NEXT:    fcvt.s.bf16 fa4, fa0391; CHECK-NEXT:    fmadd.s fa5, fa4, fa5, fa3392; CHECK-NEXT:    fcvt.bf16.s fa0, fa5393; CHECK-NEXT:    ret394  %b_ = fadd bfloat 0.0, %b395  %negb = fsub bfloat -0.0, %b_396  %1 = call bfloat @llvm.fma.bf16(bfloat %a, bfloat %negb, bfloat %c)397  ret bfloat %1398}399 400define bfloat @fmadd_bf16_contract(bfloat %a, bfloat %b, bfloat %c) nounwind {401; CHECK-LABEL: fmadd_bf16_contract:402; CHECK:       # %bb.0:403; CHECK-NEXT:    fcvt.s.bf16 fa5, fa1404; CHECK-NEXT:    fcvt.s.bf16 fa4, fa0405; CHECK-NEXT:    fmul.s fa5, fa4, fa5406; CHECK-NEXT:    fcvt.bf16.s fa5, fa5407; CHECK-NEXT:    fcvt.s.bf16 fa5, fa5408; CHECK-NEXT:    fcvt.s.bf16 fa4, fa2409; CHECK-NEXT:    fadd.s fa5, fa5, fa4410; CHECK-NEXT:    fcvt.bf16.s fa0, fa5411; CHECK-NEXT:    ret412  %1 = fmul contract bfloat %a, %b413  %2 = fadd contract bfloat %1, %c414  ret bfloat %2415}416 417define bfloat @fmsub_bf16_contract(bfloat %a, bfloat %b, bfloat %c) nounwind {418; CHECK-LABEL: fmsub_bf16_contract:419; CHECK:       # %bb.0:420; CHECK-NEXT:    fcvt.s.bf16 fa5, fa2421; CHECK-NEXT:    fmv.w.x fa4, zero422; CHECK-NEXT:    fcvt.s.bf16 fa3, fa1423; CHECK-NEXT:    fcvt.s.bf16 fa2, fa0424; CHECK-NEXT:    fadd.s fa5, fa5, fa4425; CHECK-NEXT:    fmul.s fa4, fa2, fa3426; CHECK-NEXT:    fcvt.bf16.s fa5, fa5427; CHECK-NEXT:    fcvt.bf16.s fa4, fa4428; CHECK-NEXT:    fcvt.s.bf16 fa5, fa5429; CHECK-NEXT:    fcvt.s.bf16 fa4, fa4430; CHECK-NEXT:    fsub.s fa5, fa4, fa5431; CHECK-NEXT:    fcvt.bf16.s fa0, fa5432; CHECK-NEXT:    ret433  %c_ = fadd bfloat 0.0, %c ; avoid negation using xor434  %1 = fmul contract bfloat %a, %b435  %2 = fsub contract bfloat %1, %c_436  ret bfloat %2437}438 439define bfloat @fnmadd_bf16_contract(bfloat %a, bfloat %b, bfloat %c) nounwind {440; CHECK-LABEL: fnmadd_bf16_contract:441; CHECK:       # %bb.0:442; CHECK-NEXT:    fcvt.s.bf16 fa5, fa0443; CHECK-NEXT:    fmv.w.x fa4, zero444; CHECK-NEXT:    fcvt.s.bf16 fa3, fa1445; CHECK-NEXT:    fcvt.s.bf16 fa2, fa2446; CHECK-NEXT:    lui a0, 1048568447; CHECK-NEXT:    fadd.s fa5, fa5, fa4448; CHECK-NEXT:    fadd.s fa3, fa3, fa4449; CHECK-NEXT:    fadd.s fa4, fa2, fa4450; CHECK-NEXT:    fcvt.bf16.s fa5, fa5451; CHECK-NEXT:    fcvt.bf16.s fa3, fa3452; CHECK-NEXT:    fcvt.bf16.s fa4, fa4453; CHECK-NEXT:    fcvt.s.bf16 fa3, fa3454; CHECK-NEXT:    fcvt.s.bf16 fa5, fa5455; CHECK-NEXT:    fmul.s fa5, fa5, fa3456; CHECK-NEXT:    fcvt.bf16.s fa5, fa5457; CHECK-NEXT:    fmv.x.h a1, fa5458; CHECK-NEXT:    xor a0, a1, a0459; CHECK-NEXT:    fmv.h.x fa5, a0460; CHECK-NEXT:    fcvt.s.bf16 fa5, fa5461; CHECK-NEXT:    fcvt.s.bf16 fa4, fa4462; CHECK-NEXT:    fsub.s fa5, fa5, fa4463; CHECK-NEXT:    fcvt.bf16.s fa0, fa5464; CHECK-NEXT:    ret465  %a_ = fadd bfloat 0.0, %a ; avoid negation using xor466  %b_ = fadd bfloat 0.0, %b ; avoid negation using xor467  %c_ = fadd bfloat 0.0, %c ; avoid negation using xor468  %1 = fmul contract bfloat %a_, %b_469  %2 = fneg bfloat %1470  %3 = fsub contract bfloat %2, %c_471  ret bfloat %3472}473 474define bfloat @fnmsub_bf16_contract(bfloat %a, bfloat %b, bfloat %c) nounwind {475; CHECK-LABEL: fnmsub_bf16_contract:476; CHECK:       # %bb.0:477; CHECK-NEXT:    fcvt.s.bf16 fa5, fa0478; CHECK-NEXT:    fmv.w.x fa4, zero479; CHECK-NEXT:    fcvt.s.bf16 fa3, fa1480; CHECK-NEXT:    fadd.s fa5, fa5, fa4481; CHECK-NEXT:    fadd.s fa4, fa3, fa4482; CHECK-NEXT:    fcvt.bf16.s fa5, fa5483; CHECK-NEXT:    fcvt.bf16.s fa4, fa4484; CHECK-NEXT:    fcvt.s.bf16 fa4, fa4485; CHECK-NEXT:    fcvt.s.bf16 fa5, fa5486; CHECK-NEXT:    fmul.s fa5, fa5, fa4487; CHECK-NEXT:    fcvt.bf16.s fa5, fa5488; CHECK-NEXT:    fcvt.s.bf16 fa5, fa5489; CHECK-NEXT:    fcvt.s.bf16 fa4, fa2490; CHECK-NEXT:    fsub.s fa5, fa4, fa5491; CHECK-NEXT:    fcvt.bf16.s fa0, fa5492; CHECK-NEXT:    ret493  %a_ = fadd bfloat 0.0, %a ; avoid negation using xor494  %b_ = fadd bfloat 0.0, %b ; avoid negation using xor495  %1 = fmul contract bfloat %a_, %b_496  %2 = fsub contract bfloat %c, %1497  ret bfloat %2498}499