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