2829 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv32 -mattr=+zfh -verify-machineinstrs \3; RUN: -target-abi ilp32f < %s | FileCheck -check-prefix=CHECKIZFH %s4; RUN: llc -mtriple=riscv64 -mattr=+zfh -verify-machineinstrs \5; RUN: -target-abi lp64f < %s | FileCheck -check-prefix=CHECKIZFH %s6; RUN: llc -mtriple=riscv32 -mattr=+zhinx -verify-machineinstrs \7; RUN: -target-abi ilp32 < %s | FileCheck -check-prefix=CHECKIZHINX %s8; RUN: llc -mtriple=riscv64 -mattr=+zhinx -verify-machineinstrs \9; RUN: -target-abi lp64 < %s | FileCheck -check-prefix=CHECKIZHINX %s10; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \11; RUN: | FileCheck -check-prefix=RV32I %s12; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \13; RUN: | FileCheck -check-prefix=RV64I %s14; RUN: llc -mtriple=riscv32 -mattr=+zfhmin -verify-machineinstrs \15; RUN: -target-abi ilp32f < %s | FileCheck -check-prefixes=CHECKIZFHMIN,RV32IZFHMIN %s16; RUN: llc -mtriple=riscv64 -mattr=+zfhmin -verify-machineinstrs \17; RUN: -target-abi lp64f < %s | FileCheck --check-prefixes=CHECKIZFHMIN,RV64IZFHMIN %s18; RUN: llc -mtriple=riscv32 -mattr=+zhinxmin -verify-machineinstrs \19; RUN: -target-abi ilp32 < %s | FileCheck --check-prefixes=CHECKIZHINXMIN,RV32IZHINXMIN %s20; RUN: llc -mtriple=riscv64 -mattr=+zhinxmin -verify-machineinstrs \21; RUN: -target-abi lp64 < %s | FileCheck --check-prefixes=CHECKIZHINXMIN,RV64IZHINXMIN %s22 23; These tests are each targeted at a particular RISC-V FPU instruction.24; Compares and conversions can be found in half-fcmp.ll and half-convert.ll25; respectively. Some other half-*.ll files in this folder exercise LLVM IR26; instructions that don't directly match a RISC-V instruction.27 28define half @fadd_h(half %a, half %b) nounwind {29; CHECKIZFH-LABEL: fadd_h:30; CHECKIZFH: # %bb.0:31; CHECKIZFH-NEXT: fadd.h fa0, fa0, fa132; CHECKIZFH-NEXT: ret33;34; CHECKIZHINX-LABEL: fadd_h:35; CHECKIZHINX: # %bb.0:36; CHECKIZHINX-NEXT: fadd.h a0, a0, a137; CHECKIZHINX-NEXT: ret38;39; RV32I-LABEL: fadd_h:40; RV32I: # %bb.0:41; RV32I-NEXT: addi sp, sp, -1642; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill43; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill44; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill45; RV32I-NEXT: sw s2, 0(sp) # 4-byte Folded Spill46; RV32I-NEXT: mv s0, a147; RV32I-NEXT: lui a1, 1648; RV32I-NEXT: addi s2, a1, -149; RV32I-NEXT: and a0, a0, s250; RV32I-NEXT: call __extendhfsf251; RV32I-NEXT: mv s1, a052; RV32I-NEXT: and a0, s0, s253; RV32I-NEXT: call __extendhfsf254; RV32I-NEXT: mv a1, a055; RV32I-NEXT: mv a0, s156; RV32I-NEXT: call __addsf357; RV32I-NEXT: call __truncsfhf258; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload59; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload60; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload61; RV32I-NEXT: lw s2, 0(sp) # 4-byte Folded Reload62; RV32I-NEXT: addi sp, sp, 1663; RV32I-NEXT: ret64;65; RV64I-LABEL: fadd_h:66; RV64I: # %bb.0:67; RV64I-NEXT: addi sp, sp, -3268; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill69; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill70; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill71; RV64I-NEXT: sd s2, 0(sp) # 8-byte Folded Spill72; RV64I-NEXT: mv s0, a173; RV64I-NEXT: lui a1, 1674; RV64I-NEXT: addi s2, a1, -175; RV64I-NEXT: and a0, a0, s276; RV64I-NEXT: call __extendhfsf277; RV64I-NEXT: mv s1, a078; RV64I-NEXT: and a0, s0, s279; RV64I-NEXT: call __extendhfsf280; RV64I-NEXT: mv a1, a081; RV64I-NEXT: mv a0, s182; RV64I-NEXT: call __addsf383; RV64I-NEXT: call __truncsfhf284; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload85; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload86; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload87; RV64I-NEXT: ld s2, 0(sp) # 8-byte Folded Reload88; RV64I-NEXT: addi sp, sp, 3289; RV64I-NEXT: ret90;91; CHECKIZFHMIN-LABEL: fadd_h:92; CHECKIZFHMIN: # %bb.0:93; CHECKIZFHMIN-NEXT: fcvt.s.h fa5, fa194; CHECKIZFHMIN-NEXT: fcvt.s.h fa4, fa095; CHECKIZFHMIN-NEXT: fadd.s fa5, fa4, fa596; CHECKIZFHMIN-NEXT: fcvt.h.s fa0, fa597; CHECKIZFHMIN-NEXT: ret98;99; CHECKIZHINXMIN-LABEL: fadd_h:100; CHECKIZHINXMIN: # %bb.0:101; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a1102; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a0103; CHECKIZHINXMIN-NEXT: fadd.s a0, a0, a1104; CHECKIZHINXMIN-NEXT: fcvt.h.s a0, a0105; CHECKIZHINXMIN-NEXT: ret106 %1 = fadd half %a, %b107 ret half %1108}109 110define half @fsub_h(half %a, half %b) nounwind {111; CHECKIZFH-LABEL: fsub_h:112; CHECKIZFH: # %bb.0:113; CHECKIZFH-NEXT: fsub.h fa0, fa0, fa1114; CHECKIZFH-NEXT: ret115;116; CHECKIZHINX-LABEL: fsub_h:117; CHECKIZHINX: # %bb.0:118; CHECKIZHINX-NEXT: fsub.h a0, a0, a1119; CHECKIZHINX-NEXT: ret120;121; RV32I-LABEL: fsub_h:122; RV32I: # %bb.0:123; RV32I-NEXT: addi sp, sp, -16124; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill125; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill126; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill127; RV32I-NEXT: sw s2, 0(sp) # 4-byte Folded Spill128; RV32I-NEXT: mv s0, a1129; RV32I-NEXT: lui a1, 16130; RV32I-NEXT: addi s2, a1, -1131; RV32I-NEXT: and a0, a0, s2132; RV32I-NEXT: call __extendhfsf2133; RV32I-NEXT: mv s1, a0134; RV32I-NEXT: and a0, s0, s2135; RV32I-NEXT: call __extendhfsf2136; RV32I-NEXT: mv a1, a0137; RV32I-NEXT: mv a0, s1138; RV32I-NEXT: call __subsf3139; RV32I-NEXT: call __truncsfhf2140; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload141; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload142; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload143; RV32I-NEXT: lw s2, 0(sp) # 4-byte Folded Reload144; RV32I-NEXT: addi sp, sp, 16145; RV32I-NEXT: ret146;147; RV64I-LABEL: fsub_h:148; RV64I: # %bb.0:149; RV64I-NEXT: addi sp, sp, -32150; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill151; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill152; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill153; RV64I-NEXT: sd s2, 0(sp) # 8-byte Folded Spill154; RV64I-NEXT: mv s0, a1155; RV64I-NEXT: lui a1, 16156; RV64I-NEXT: addi s2, a1, -1157; RV64I-NEXT: and a0, a0, s2158; RV64I-NEXT: call __extendhfsf2159; RV64I-NEXT: mv s1, a0160; RV64I-NEXT: and a0, s0, s2161; RV64I-NEXT: call __extendhfsf2162; RV64I-NEXT: mv a1, a0163; RV64I-NEXT: mv a0, s1164; RV64I-NEXT: call __subsf3165; RV64I-NEXT: call __truncsfhf2166; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload167; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload168; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload169; RV64I-NEXT: ld s2, 0(sp) # 8-byte Folded Reload170; RV64I-NEXT: addi sp, sp, 32171; RV64I-NEXT: ret172;173; CHECKIZFHMIN-LABEL: fsub_h:174; CHECKIZFHMIN: # %bb.0:175; CHECKIZFHMIN-NEXT: fcvt.s.h fa5, fa1176; CHECKIZFHMIN-NEXT: fcvt.s.h fa4, fa0177; CHECKIZFHMIN-NEXT: fsub.s fa5, fa4, fa5178; CHECKIZFHMIN-NEXT: fcvt.h.s fa0, fa5179; CHECKIZFHMIN-NEXT: ret180;181; CHECKIZHINXMIN-LABEL: fsub_h:182; CHECKIZHINXMIN: # %bb.0:183; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a1184; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a0185; CHECKIZHINXMIN-NEXT: fsub.s a0, a0, a1186; CHECKIZHINXMIN-NEXT: fcvt.h.s a0, a0187; CHECKIZHINXMIN-NEXT: ret188 %1 = fsub half %a, %b189 ret half %1190}191 192define half @fmul_h(half %a, half %b) nounwind {193; CHECKIZFH-LABEL: fmul_h:194; CHECKIZFH: # %bb.0:195; CHECKIZFH-NEXT: fmul.h fa0, fa0, fa1196; CHECKIZFH-NEXT: ret197;198; CHECKIZHINX-LABEL: fmul_h:199; CHECKIZHINX: # %bb.0:200; CHECKIZHINX-NEXT: fmul.h a0, a0, a1201; CHECKIZHINX-NEXT: ret202;203; RV32I-LABEL: fmul_h:204; RV32I: # %bb.0:205; RV32I-NEXT: addi sp, sp, -16206; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill207; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill208; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill209; RV32I-NEXT: sw s2, 0(sp) # 4-byte Folded Spill210; RV32I-NEXT: mv s0, a1211; RV32I-NEXT: lui a1, 16212; RV32I-NEXT: addi s2, a1, -1213; RV32I-NEXT: and a0, a0, s2214; RV32I-NEXT: call __extendhfsf2215; RV32I-NEXT: mv s1, a0216; RV32I-NEXT: and a0, s0, s2217; RV32I-NEXT: call __extendhfsf2218; RV32I-NEXT: mv a1, a0219; RV32I-NEXT: mv a0, s1220; RV32I-NEXT: call __mulsf3221; RV32I-NEXT: call __truncsfhf2222; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload223; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload224; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload225; RV32I-NEXT: lw s2, 0(sp) # 4-byte Folded Reload226; RV32I-NEXT: addi sp, sp, 16227; RV32I-NEXT: ret228;229; RV64I-LABEL: fmul_h:230; RV64I: # %bb.0:231; RV64I-NEXT: addi sp, sp, -32232; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill233; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill234; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill235; RV64I-NEXT: sd s2, 0(sp) # 8-byte Folded Spill236; RV64I-NEXT: mv s0, a1237; RV64I-NEXT: lui a1, 16238; RV64I-NEXT: addi s2, a1, -1239; RV64I-NEXT: and a0, a0, s2240; RV64I-NEXT: call __extendhfsf2241; RV64I-NEXT: mv s1, a0242; RV64I-NEXT: and a0, s0, s2243; RV64I-NEXT: call __extendhfsf2244; RV64I-NEXT: mv a1, a0245; RV64I-NEXT: mv a0, s1246; RV64I-NEXT: call __mulsf3247; RV64I-NEXT: call __truncsfhf2248; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload249; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload250; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload251; RV64I-NEXT: ld s2, 0(sp) # 8-byte Folded Reload252; RV64I-NEXT: addi sp, sp, 32253; RV64I-NEXT: ret254;255; CHECKIZFHMIN-LABEL: fmul_h:256; CHECKIZFHMIN: # %bb.0:257; CHECKIZFHMIN-NEXT: fcvt.s.h fa5, fa1258; CHECKIZFHMIN-NEXT: fcvt.s.h fa4, fa0259; CHECKIZFHMIN-NEXT: fmul.s fa5, fa4, fa5260; CHECKIZFHMIN-NEXT: fcvt.h.s fa0, fa5261; CHECKIZFHMIN-NEXT: ret262;263; CHECKIZHINXMIN-LABEL: fmul_h:264; CHECKIZHINXMIN: # %bb.0:265; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a1266; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a0267; CHECKIZHINXMIN-NEXT: fmul.s a0, a0, a1268; CHECKIZHINXMIN-NEXT: fcvt.h.s a0, a0269; CHECKIZHINXMIN-NEXT: ret270 %1 = fmul half %a, %b271 ret half %1272}273 274define half @fdiv_h(half %a, half %b) nounwind {275; CHECKIZFH-LABEL: fdiv_h:276; CHECKIZFH: # %bb.0:277; CHECKIZFH-NEXT: fdiv.h fa0, fa0, fa1278; CHECKIZFH-NEXT: ret279;280; CHECKIZHINX-LABEL: fdiv_h:281; CHECKIZHINX: # %bb.0:282; CHECKIZHINX-NEXT: fdiv.h a0, a0, a1283; CHECKIZHINX-NEXT: ret284;285; RV32I-LABEL: fdiv_h:286; RV32I: # %bb.0:287; RV32I-NEXT: addi sp, sp, -16288; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill289; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill290; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill291; RV32I-NEXT: sw s2, 0(sp) # 4-byte Folded Spill292; RV32I-NEXT: mv s0, a1293; RV32I-NEXT: lui a1, 16294; RV32I-NEXT: addi s2, a1, -1295; RV32I-NEXT: and a0, a0, s2296; RV32I-NEXT: call __extendhfsf2297; RV32I-NEXT: mv s1, a0298; RV32I-NEXT: and a0, s0, s2299; RV32I-NEXT: call __extendhfsf2300; RV32I-NEXT: mv a1, a0301; RV32I-NEXT: mv a0, s1302; RV32I-NEXT: call __divsf3303; RV32I-NEXT: call __truncsfhf2304; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload305; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload306; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload307; RV32I-NEXT: lw s2, 0(sp) # 4-byte Folded Reload308; RV32I-NEXT: addi sp, sp, 16309; RV32I-NEXT: ret310;311; RV64I-LABEL: fdiv_h:312; RV64I: # %bb.0:313; RV64I-NEXT: addi sp, sp, -32314; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill315; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill316; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill317; RV64I-NEXT: sd s2, 0(sp) # 8-byte Folded Spill318; RV64I-NEXT: mv s0, a1319; RV64I-NEXT: lui a1, 16320; RV64I-NEXT: addi s2, a1, -1321; RV64I-NEXT: and a0, a0, s2322; RV64I-NEXT: call __extendhfsf2323; RV64I-NEXT: mv s1, a0324; RV64I-NEXT: and a0, s0, s2325; RV64I-NEXT: call __extendhfsf2326; RV64I-NEXT: mv a1, a0327; RV64I-NEXT: mv a0, s1328; RV64I-NEXT: call __divsf3329; RV64I-NEXT: call __truncsfhf2330; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload331; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload332; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload333; RV64I-NEXT: ld s2, 0(sp) # 8-byte Folded Reload334; RV64I-NEXT: addi sp, sp, 32335; RV64I-NEXT: ret336;337; CHECKIZFHMIN-LABEL: fdiv_h:338; CHECKIZFHMIN: # %bb.0:339; CHECKIZFHMIN-NEXT: fcvt.s.h fa5, fa1340; CHECKIZFHMIN-NEXT: fcvt.s.h fa4, fa0341; CHECKIZFHMIN-NEXT: fdiv.s fa5, fa4, fa5342; CHECKIZFHMIN-NEXT: fcvt.h.s fa0, fa5343; CHECKIZFHMIN-NEXT: ret344;345; CHECKIZHINXMIN-LABEL: fdiv_h:346; CHECKIZHINXMIN: # %bb.0:347; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a1348; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a0349; CHECKIZHINXMIN-NEXT: fdiv.s a0, a0, a1350; CHECKIZHINXMIN-NEXT: fcvt.h.s a0, a0351; CHECKIZHINXMIN-NEXT: ret352 %1 = fdiv half %a, %b353 ret half %1354}355 356define half @fsqrt_h(half %a) nounwind {357; CHECKIZFH-LABEL: fsqrt_h:358; CHECKIZFH: # %bb.0:359; CHECKIZFH-NEXT: fsqrt.h fa0, fa0360; CHECKIZFH-NEXT: ret361;362; CHECKIZHINX-LABEL: fsqrt_h:363; CHECKIZHINX: # %bb.0:364; CHECKIZHINX-NEXT: fsqrt.h a0, a0365; CHECKIZHINX-NEXT: ret366;367; RV32I-LABEL: fsqrt_h:368; RV32I: # %bb.0:369; RV32I-NEXT: addi sp, sp, -16370; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill371; RV32I-NEXT: slli a0, a0, 16372; RV32I-NEXT: srli a0, a0, 16373; RV32I-NEXT: call __extendhfsf2374; RV32I-NEXT: call sqrtf375; RV32I-NEXT: call __truncsfhf2376; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload377; RV32I-NEXT: addi sp, sp, 16378; RV32I-NEXT: ret379;380; RV64I-LABEL: fsqrt_h:381; RV64I: # %bb.0:382; RV64I-NEXT: addi sp, sp, -16383; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill384; RV64I-NEXT: slli a0, a0, 48385; RV64I-NEXT: srli a0, a0, 48386; RV64I-NEXT: call __extendhfsf2387; RV64I-NEXT: call sqrtf388; RV64I-NEXT: call __truncsfhf2389; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload390; RV64I-NEXT: addi sp, sp, 16391; RV64I-NEXT: ret392;393; CHECKIZFHMIN-LABEL: fsqrt_h:394; CHECKIZFHMIN: # %bb.0:395; CHECKIZFHMIN-NEXT: fcvt.s.h fa5, fa0396; CHECKIZFHMIN-NEXT: fsqrt.s fa5, fa5397; CHECKIZFHMIN-NEXT: fcvt.h.s fa0, fa5398; CHECKIZFHMIN-NEXT: ret399;400; CHECKIZHINXMIN-LABEL: fsqrt_h:401; CHECKIZHINXMIN: # %bb.0:402; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a0403; CHECKIZHINXMIN-NEXT: fsqrt.s a0, a0404; CHECKIZHINXMIN-NEXT: fcvt.h.s a0, a0405; CHECKIZHINXMIN-NEXT: ret406 %1 = call half @llvm.sqrt.f16(half %a)407 ret half %1408}409 410define half @fsgnj_h(half %a, half %b) nounwind {411; CHECKIZFH-LABEL: fsgnj_h:412; CHECKIZFH: # %bb.0:413; CHECKIZFH-NEXT: fsgnj.h fa0, fa0, fa1414; CHECKIZFH-NEXT: ret415;416; CHECKIZHINX-LABEL: fsgnj_h:417; CHECKIZHINX: # %bb.0:418; CHECKIZHINX-NEXT: fsgnj.h a0, a0, a1419; CHECKIZHINX-NEXT: ret420;421; RV32I-LABEL: fsgnj_h:422; RV32I: # %bb.0:423; RV32I-NEXT: lui a2, 1048568424; RV32I-NEXT: slli a0, a0, 17425; RV32I-NEXT: and a1, a1, a2426; RV32I-NEXT: srli a0, a0, 17427; RV32I-NEXT: or a0, a0, a1428; RV32I-NEXT: ret429;430; RV64I-LABEL: fsgnj_h:431; RV64I: # %bb.0:432; RV64I-NEXT: lui a2, 1048568433; RV64I-NEXT: slli a0, a0, 49434; RV64I-NEXT: and a1, a1, a2435; RV64I-NEXT: srli a0, a0, 49436; RV64I-NEXT: or a0, a0, a1437; RV64I-NEXT: ret438;439; RV32IZFHMIN-LABEL: fsgnj_h:440; RV32IZFHMIN: # %bb.0:441; RV32IZFHMIN-NEXT: fmv.x.h a0, fa1442; RV32IZFHMIN-NEXT: lui a1, 1048568443; RV32IZFHMIN-NEXT: and a0, a0, a1444; RV32IZFHMIN-NEXT: fmv.x.h a1, fa0445; RV32IZFHMIN-NEXT: slli a1, a1, 17446; RV32IZFHMIN-NEXT: srli a1, a1, 17447; RV32IZFHMIN-NEXT: or a0, a1, a0448; RV32IZFHMIN-NEXT: fmv.h.x fa0, a0449; RV32IZFHMIN-NEXT: ret450;451; RV64IZFHMIN-LABEL: fsgnj_h:452; RV64IZFHMIN: # %bb.0:453; RV64IZFHMIN-NEXT: fmv.x.h a0, fa1454; RV64IZFHMIN-NEXT: lui a1, 1048568455; RV64IZFHMIN-NEXT: and a0, a0, a1456; RV64IZFHMIN-NEXT: fmv.x.h a1, fa0457; RV64IZFHMIN-NEXT: slli a1, a1, 49458; RV64IZFHMIN-NEXT: srli a1, a1, 49459; RV64IZFHMIN-NEXT: or a0, a1, a0460; RV64IZFHMIN-NEXT: fmv.h.x fa0, a0461; RV64IZFHMIN-NEXT: ret462;463; RV32IZHINXMIN-LABEL: fsgnj_h:464; RV32IZHINXMIN: # %bb.0:465; RV32IZHINXMIN-NEXT: # kill: def $x11_h killed $x11_h def $x11466; RV32IZHINXMIN-NEXT: # kill: def $x10_h killed $x10_h def $x10467; RV32IZHINXMIN-NEXT: lui a2, 1048568468; RV32IZHINXMIN-NEXT: slli a0, a0, 17469; RV32IZHINXMIN-NEXT: and a1, a1, a2470; RV32IZHINXMIN-NEXT: srli a0, a0, 17471; RV32IZHINXMIN-NEXT: or a0, a0, a1472; RV32IZHINXMIN-NEXT: # kill: def $x10_h killed $x10_h killed $x10473; RV32IZHINXMIN-NEXT: ret474;475; RV64IZHINXMIN-LABEL: fsgnj_h:476; RV64IZHINXMIN: # %bb.0:477; RV64IZHINXMIN-NEXT: # kill: def $x11_h killed $x11_h def $x11478; RV64IZHINXMIN-NEXT: # kill: def $x10_h killed $x10_h def $x10479; RV64IZHINXMIN-NEXT: lui a2, 1048568480; RV64IZHINXMIN-NEXT: slli a0, a0, 49481; RV64IZHINXMIN-NEXT: and a1, a1, a2482; RV64IZHINXMIN-NEXT: srli a0, a0, 49483; RV64IZHINXMIN-NEXT: or a0, a0, a1484; RV64IZHINXMIN-NEXT: # kill: def $x10_h killed $x10_h killed $x10485; RV64IZHINXMIN-NEXT: ret486 %1 = call half @llvm.copysign.f16(half %a, half %b)487 ret half %1488}489 490; This function performs extra work to ensure that491; DAGCombiner::visitBITCAST doesn't replace the fneg with an xor.492define i32 @fneg_h(half %a, half %b) nounwind {493; CHECKIZFH-LABEL: fneg_h:494; CHECKIZFH: # %bb.0:495; CHECKIZFH-NEXT: fadd.h fa5, fa0, fa0496; CHECKIZFH-NEXT: fneg.h fa4, fa5497; CHECKIZFH-NEXT: feq.h a0, fa5, fa4498; CHECKIZFH-NEXT: ret499;500; CHECKIZHINX-LABEL: fneg_h:501; CHECKIZHINX: # %bb.0:502; CHECKIZHINX-NEXT: fadd.h a0, a0, a0503; CHECKIZHINX-NEXT: fneg.h a1, a0504; CHECKIZHINX-NEXT: feq.h a0, a0, a1505; CHECKIZHINX-NEXT: ret506;507; RV32I-LABEL: fneg_h:508; RV32I: # %bb.0:509; RV32I-NEXT: addi sp, sp, -16510; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill511; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill512; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill513; RV32I-NEXT: sw s2, 0(sp) # 4-byte Folded Spill514; RV32I-NEXT: lui a1, 16515; RV32I-NEXT: addi s1, a1, -1516; RV32I-NEXT: and a0, a0, s1517; RV32I-NEXT: call __extendhfsf2518; RV32I-NEXT: mv a1, a0519; RV32I-NEXT: call __addsf3520; RV32I-NEXT: call __truncsfhf2521; RV32I-NEXT: lui a1, 8522; RV32I-NEXT: xor s2, a0, a1523; RV32I-NEXT: and a0, a0, s1524; RV32I-NEXT: call __extendhfsf2525; RV32I-NEXT: mv s0, a0526; RV32I-NEXT: and a0, s2, s1527; RV32I-NEXT: call __extendhfsf2528; RV32I-NEXT: mv a1, a0529; RV32I-NEXT: mv a0, s0530; RV32I-NEXT: call __eqsf2531; RV32I-NEXT: seqz a0, a0532; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload533; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload534; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload535; RV32I-NEXT: lw s2, 0(sp) # 4-byte Folded Reload536; RV32I-NEXT: addi sp, sp, 16537; RV32I-NEXT: ret538;539; RV64I-LABEL: fneg_h:540; RV64I: # %bb.0:541; RV64I-NEXT: addi sp, sp, -32542; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill543; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill544; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill545; RV64I-NEXT: sd s2, 0(sp) # 8-byte Folded Spill546; RV64I-NEXT: lui a1, 16547; RV64I-NEXT: addi s1, a1, -1548; RV64I-NEXT: and a0, a0, s1549; RV64I-NEXT: call __extendhfsf2550; RV64I-NEXT: mv a1, a0551; RV64I-NEXT: call __addsf3552; RV64I-NEXT: call __truncsfhf2553; RV64I-NEXT: lui a1, 8554; RV64I-NEXT: xor s2, a0, a1555; RV64I-NEXT: and a0, a0, s1556; RV64I-NEXT: call __extendhfsf2557; RV64I-NEXT: mv s0, a0558; RV64I-NEXT: and a0, s2, s1559; RV64I-NEXT: call __extendhfsf2560; RV64I-NEXT: mv a1, a0561; RV64I-NEXT: mv a0, s0562; RV64I-NEXT: call __eqsf2563; RV64I-NEXT: seqz a0, a0564; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload565; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload566; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload567; RV64I-NEXT: ld s2, 0(sp) # 8-byte Folded Reload568; RV64I-NEXT: addi sp, sp, 32569; RV64I-NEXT: ret570;571; CHECKIZFHMIN-LABEL: fneg_h:572; CHECKIZFHMIN: # %bb.0:573; CHECKIZFHMIN-NEXT: fcvt.s.h fa5, fa0574; CHECKIZFHMIN-NEXT: lui a0, 1048568575; CHECKIZFHMIN-NEXT: fadd.s fa5, fa5, fa5576; CHECKIZFHMIN-NEXT: fcvt.h.s fa5, fa5577; CHECKIZFHMIN-NEXT: fmv.x.h a1, fa5578; CHECKIZFHMIN-NEXT: xor a0, a1, a0579; CHECKIZFHMIN-NEXT: fmv.h.x fa4, a0580; CHECKIZFHMIN-NEXT: fcvt.s.h fa4, fa4581; CHECKIZFHMIN-NEXT: fcvt.s.h fa5, fa5582; CHECKIZFHMIN-NEXT: feq.s a0, fa5, fa4583; CHECKIZFHMIN-NEXT: ret584;585; CHECKIZHINXMIN-LABEL: fneg_h:586; CHECKIZHINXMIN: # %bb.0:587; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a0588; CHECKIZHINXMIN-NEXT: lui a1, 1048568589; CHECKIZHINXMIN-NEXT: fadd.s a0, a0, a0590; CHECKIZHINXMIN-NEXT: fcvt.h.s a0, a0591; CHECKIZHINXMIN-NEXT: xor a1, a0, a1592; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a1593; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a0594; CHECKIZHINXMIN-NEXT: feq.s a0, a0, a1595; CHECKIZHINXMIN-NEXT: ret596 %1 = fadd half %a, %a597 %2 = fneg half %1598 %3 = fcmp oeq half %1, %2599 %4 = zext i1 %3 to i32600 ret i32 %4601}602 603; This function performs extra work to ensure that604; DAGCombiner::visitBITCAST doesn't replace the fneg with an xor.605define half @fsgnjn_h(half %a, half %b) nounwind {606; CHECKIZFH-LABEL: fsgnjn_h:607; CHECKIZFH: # %bb.0:608; CHECKIZFH-NEXT: fadd.h fa5, fa0, fa1609; CHECKIZFH-NEXT: fsgnjn.h fa0, fa0, fa5610; CHECKIZFH-NEXT: ret611;612; CHECKIZHINX-LABEL: fsgnjn_h:613; CHECKIZHINX: # %bb.0:614; CHECKIZHINX-NEXT: fadd.h a1, a0, a1615; CHECKIZHINX-NEXT: fsgnjn.h a0, a0, a1616; CHECKIZHINX-NEXT: ret617;618; RV32I-LABEL: fsgnjn_h:619; RV32I: # %bb.0:620; RV32I-NEXT: addi sp, sp, -32621; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill622; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill623; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill624; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill625; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill626; RV32I-NEXT: mv s0, a1627; RV32I-NEXT: mv s1, a0628; RV32I-NEXT: lui a0, 16629; RV32I-NEXT: addi s3, a0, -1630; RV32I-NEXT: and a0, s1, s3631; RV32I-NEXT: call __extendhfsf2632; RV32I-NEXT: mv s2, a0633; RV32I-NEXT: and a0, s0, s3634; RV32I-NEXT: call __extendhfsf2635; RV32I-NEXT: mv a1, a0636; RV32I-NEXT: mv a0, s2637; RV32I-NEXT: call __addsf3638; RV32I-NEXT: call __truncsfhf2639; RV32I-NEXT: not a0, a0640; RV32I-NEXT: lui a1, 1048568641; RV32I-NEXT: slli s1, s1, 17642; RV32I-NEXT: and a0, a0, a1643; RV32I-NEXT: srli s1, s1, 17644; RV32I-NEXT: or a0, s1, a0645; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload646; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload647; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload648; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload649; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload650; RV32I-NEXT: addi sp, sp, 32651; RV32I-NEXT: ret652;653; RV64I-LABEL: fsgnjn_h:654; RV64I: # %bb.0:655; RV64I-NEXT: addi sp, sp, -48656; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill657; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill658; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill659; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill660; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill661; RV64I-NEXT: mv s0, a1662; RV64I-NEXT: mv s1, a0663; RV64I-NEXT: lui a0, 16664; RV64I-NEXT: addi s3, a0, -1665; RV64I-NEXT: and a0, s1, s3666; RV64I-NEXT: call __extendhfsf2667; RV64I-NEXT: mv s2, a0668; RV64I-NEXT: and a0, s0, s3669; RV64I-NEXT: call __extendhfsf2670; RV64I-NEXT: mv a1, a0671; RV64I-NEXT: mv a0, s2672; RV64I-NEXT: call __addsf3673; RV64I-NEXT: call __truncsfhf2674; RV64I-NEXT: not a0, a0675; RV64I-NEXT: lui a1, 1048568676; RV64I-NEXT: slli s1, s1, 49677; RV64I-NEXT: and a0, a0, a1678; RV64I-NEXT: srli s1, s1, 49679; RV64I-NEXT: or a0, s1, a0680; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload681; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload682; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload683; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload684; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload685; RV64I-NEXT: addi sp, sp, 48686; RV64I-NEXT: ret687;688; RV32IZFHMIN-LABEL: fsgnjn_h:689; RV32IZFHMIN: # %bb.0:690; RV32IZFHMIN-NEXT: fcvt.s.h fa5, fa1691; RV32IZFHMIN-NEXT: fcvt.s.h fa4, fa0692; RV32IZFHMIN-NEXT: lui a0, 1048568693; RV32IZFHMIN-NEXT: fadd.s fa5, fa4, fa5694; RV32IZFHMIN-NEXT: fcvt.h.s fa5, fa5695; RV32IZFHMIN-NEXT: fmv.x.h a1, fa5696; RV32IZFHMIN-NEXT: not a1, a1697; RV32IZFHMIN-NEXT: and a0, a1, a0698; RV32IZFHMIN-NEXT: fmv.x.h a1, fa0699; RV32IZFHMIN-NEXT: slli a1, a1, 17700; RV32IZFHMIN-NEXT: srli a1, a1, 17701; RV32IZFHMIN-NEXT: or a0, a1, a0702; RV32IZFHMIN-NEXT: fmv.h.x fa0, a0703; RV32IZFHMIN-NEXT: ret704;705; RV64IZFHMIN-LABEL: fsgnjn_h:706; RV64IZFHMIN: # %bb.0:707; RV64IZFHMIN-NEXT: fcvt.s.h fa5, fa1708; RV64IZFHMIN-NEXT: fcvt.s.h fa4, fa0709; RV64IZFHMIN-NEXT: lui a0, 1048568710; RV64IZFHMIN-NEXT: fadd.s fa5, fa4, fa5711; RV64IZFHMIN-NEXT: fcvt.h.s fa5, fa5712; RV64IZFHMIN-NEXT: fmv.x.h a1, fa5713; RV64IZFHMIN-NEXT: not a1, a1714; RV64IZFHMIN-NEXT: and a0, a1, a0715; RV64IZFHMIN-NEXT: fmv.x.h a1, fa0716; RV64IZFHMIN-NEXT: slli a1, a1, 49717; RV64IZFHMIN-NEXT: srli a1, a1, 49718; RV64IZFHMIN-NEXT: or a0, a1, a0719; RV64IZFHMIN-NEXT: fmv.h.x fa0, a0720; RV64IZFHMIN-NEXT: ret721;722; RV32IZHINXMIN-LABEL: fsgnjn_h:723; RV32IZHINXMIN: # %bb.0:724; RV32IZHINXMIN-NEXT: # kill: def $x10_h killed $x10_h def $x10725; RV32IZHINXMIN-NEXT: fcvt.s.h a1, a1726; RV32IZHINXMIN-NEXT: fcvt.s.h a2, a0727; RV32IZHINXMIN-NEXT: fadd.s a1, a2, a1728; RV32IZHINXMIN-NEXT: lui a2, 1048568729; RV32IZHINXMIN-NEXT: slli a0, a0, 17730; RV32IZHINXMIN-NEXT: fcvt.h.s a1, a1731; RV32IZHINXMIN-NEXT: not a1, a1732; RV32IZHINXMIN-NEXT: and a1, a1, a2733; RV32IZHINXMIN-NEXT: srli a0, a0, 17734; RV32IZHINXMIN-NEXT: or a0, a0, a1735; RV32IZHINXMIN-NEXT: # kill: def $x10_h killed $x10_h killed $x10736; RV32IZHINXMIN-NEXT: ret737;738; RV64IZHINXMIN-LABEL: fsgnjn_h:739; RV64IZHINXMIN: # %bb.0:740; RV64IZHINXMIN-NEXT: # kill: def $x10_h killed $x10_h def $x10741; RV64IZHINXMIN-NEXT: fcvt.s.h a1, a1742; RV64IZHINXMIN-NEXT: fcvt.s.h a2, a0743; RV64IZHINXMIN-NEXT: fadd.s a1, a2, a1744; RV64IZHINXMIN-NEXT: lui a2, 1048568745; RV64IZHINXMIN-NEXT: slli a0, a0, 49746; RV64IZHINXMIN-NEXT: fcvt.h.s a1, a1747; RV64IZHINXMIN-NEXT: not a1, a1748; RV64IZHINXMIN-NEXT: and a1, a1, a2749; RV64IZHINXMIN-NEXT: srli a0, a0, 49750; RV64IZHINXMIN-NEXT: or a0, a0, a1751; RV64IZHINXMIN-NEXT: # kill: def $x10_h killed $x10_h killed $x10752; RV64IZHINXMIN-NEXT: ret753 %1 = fadd half %a, %b754 %2 = fneg half %1755 %3 = call half @llvm.copysign.f16(half %a, half %2)756 ret half %3757}758 759; This function performs extra work to ensure that760; DAGCombiner::visitBITCAST doesn't replace the fabs with an and.761define half @fabs_h(half %a, half %b) nounwind {762; CHECKIZFH-LABEL: fabs_h:763; CHECKIZFH: # %bb.0:764; CHECKIZFH-NEXT: fadd.h fa5, fa0, fa1765; CHECKIZFH-NEXT: fabs.h fa4, fa5766; CHECKIZFH-NEXT: fadd.h fa0, fa4, fa5767; CHECKIZFH-NEXT: ret768;769; CHECKIZHINX-LABEL: fabs_h:770; CHECKIZHINX: # %bb.0:771; CHECKIZHINX-NEXT: fadd.h a0, a0, a1772; CHECKIZHINX-NEXT: fabs.h a1, a0773; CHECKIZHINX-NEXT: fadd.h a0, a1, a0774; CHECKIZHINX-NEXT: ret775;776; RV32I-LABEL: fabs_h:777; RV32I: # %bb.0:778; RV32I-NEXT: addi sp, sp, -16779; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill780; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill781; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill782; RV32I-NEXT: sw s2, 0(sp) # 4-byte Folded Spill783; RV32I-NEXT: mv s0, a1784; RV32I-NEXT: lui a1, 16785; RV32I-NEXT: addi s2, a1, -1786; RV32I-NEXT: and a0, a0, s2787; RV32I-NEXT: call __extendhfsf2788; RV32I-NEXT: mv s1, a0789; RV32I-NEXT: and a0, s0, s2790; RV32I-NEXT: call __extendhfsf2791; RV32I-NEXT: mv a1, a0792; RV32I-NEXT: mv a0, s1793; RV32I-NEXT: call __addsf3794; RV32I-NEXT: call __truncsfhf2795; RV32I-NEXT: slli s0, a0, 17796; RV32I-NEXT: srli s0, s0, 17797; RV32I-NEXT: and a0, a0, s2798; RV32I-NEXT: call __extendhfsf2799; RV32I-NEXT: mv s1, a0800; RV32I-NEXT: mv a0, s0801; RV32I-NEXT: call __extendhfsf2802; RV32I-NEXT: mv a1, s1803; RV32I-NEXT: call __addsf3804; RV32I-NEXT: call __truncsfhf2805; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload806; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload807; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload808; RV32I-NEXT: lw s2, 0(sp) # 4-byte Folded Reload809; RV32I-NEXT: addi sp, sp, 16810; RV32I-NEXT: ret811;812; RV64I-LABEL: fabs_h:813; RV64I: # %bb.0:814; RV64I-NEXT: addi sp, sp, -32815; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill816; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill817; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill818; RV64I-NEXT: sd s2, 0(sp) # 8-byte Folded Spill819; RV64I-NEXT: mv s0, a1820; RV64I-NEXT: lui a1, 16821; RV64I-NEXT: addi s2, a1, -1822; RV64I-NEXT: and a0, a0, s2823; RV64I-NEXT: call __extendhfsf2824; RV64I-NEXT: mv s1, a0825; RV64I-NEXT: and a0, s0, s2826; RV64I-NEXT: call __extendhfsf2827; RV64I-NEXT: mv a1, a0828; RV64I-NEXT: mv a0, s1829; RV64I-NEXT: call __addsf3830; RV64I-NEXT: call __truncsfhf2831; RV64I-NEXT: slli s0, a0, 49832; RV64I-NEXT: srli s0, s0, 49833; RV64I-NEXT: and a0, a0, s2834; RV64I-NEXT: call __extendhfsf2835; RV64I-NEXT: mv s1, a0836; RV64I-NEXT: mv a0, s0837; RV64I-NEXT: call __extendhfsf2838; RV64I-NEXT: mv a1, s1839; RV64I-NEXT: call __addsf3840; RV64I-NEXT: call __truncsfhf2841; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload842; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload843; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload844; RV64I-NEXT: ld s2, 0(sp) # 8-byte Folded Reload845; RV64I-NEXT: addi sp, sp, 32846; RV64I-NEXT: ret847;848; RV32IZFHMIN-LABEL: fabs_h:849; RV32IZFHMIN: # %bb.0:850; RV32IZFHMIN-NEXT: fcvt.s.h fa5, fa1851; RV32IZFHMIN-NEXT: fcvt.s.h fa4, fa0852; RV32IZFHMIN-NEXT: fadd.s fa5, fa4, fa5853; RV32IZFHMIN-NEXT: fcvt.h.s fa5, fa5854; RV32IZFHMIN-NEXT: fmv.x.h a0, fa5855; RV32IZFHMIN-NEXT: slli a0, a0, 17856; RV32IZFHMIN-NEXT: srli a0, a0, 17857; RV32IZFHMIN-NEXT: fmv.h.x fa4, a0858; RV32IZFHMIN-NEXT: fcvt.s.h fa5, fa5859; RV32IZFHMIN-NEXT: fcvt.s.h fa4, fa4860; RV32IZFHMIN-NEXT: fadd.s fa5, fa4, fa5861; RV32IZFHMIN-NEXT: fcvt.h.s fa0, fa5862; RV32IZFHMIN-NEXT: ret863;864; RV64IZFHMIN-LABEL: fabs_h:865; RV64IZFHMIN: # %bb.0:866; RV64IZFHMIN-NEXT: fcvt.s.h fa5, fa1867; RV64IZFHMIN-NEXT: fcvt.s.h fa4, fa0868; RV64IZFHMIN-NEXT: fadd.s fa5, fa4, fa5869; RV64IZFHMIN-NEXT: fcvt.h.s fa5, fa5870; RV64IZFHMIN-NEXT: fmv.x.h a0, fa5871; RV64IZFHMIN-NEXT: slli a0, a0, 49872; RV64IZFHMIN-NEXT: srli a0, a0, 49873; RV64IZFHMIN-NEXT: fmv.h.x fa4, a0874; RV64IZFHMIN-NEXT: fcvt.s.h fa5, fa5875; RV64IZFHMIN-NEXT: fcvt.s.h fa4, fa4876; RV64IZFHMIN-NEXT: fadd.s fa5, fa4, fa5877; RV64IZFHMIN-NEXT: fcvt.h.s fa0, fa5878; RV64IZFHMIN-NEXT: ret879;880; RV32IZHINXMIN-LABEL: fabs_h:881; RV32IZHINXMIN: # %bb.0:882; RV32IZHINXMIN-NEXT: fcvt.s.h a1, a1883; RV32IZHINXMIN-NEXT: fcvt.s.h a0, a0884; RV32IZHINXMIN-NEXT: fadd.s a0, a0, a1885; RV32IZHINXMIN-NEXT: fcvt.h.s a0, a0886; RV32IZHINXMIN-NEXT: slli a1, a0, 17887; RV32IZHINXMIN-NEXT: srli a1, a1, 17888; RV32IZHINXMIN-NEXT: fcvt.s.h a0, a0889; RV32IZHINXMIN-NEXT: fcvt.s.h a1, a1890; RV32IZHINXMIN-NEXT: fadd.s a0, a1, a0891; RV32IZHINXMIN-NEXT: fcvt.h.s a0, a0892; RV32IZHINXMIN-NEXT: ret893;894; RV64IZHINXMIN-LABEL: fabs_h:895; RV64IZHINXMIN: # %bb.0:896; RV64IZHINXMIN-NEXT: fcvt.s.h a1, a1897; RV64IZHINXMIN-NEXT: fcvt.s.h a0, a0898; RV64IZHINXMIN-NEXT: fadd.s a0, a0, a1899; RV64IZHINXMIN-NEXT: fcvt.h.s a0, a0900; RV64IZHINXMIN-NEXT: slli a1, a0, 49901; RV64IZHINXMIN-NEXT: srli a1, a1, 49902; RV64IZHINXMIN-NEXT: fcvt.s.h a0, a0903; RV64IZHINXMIN-NEXT: fcvt.s.h a1, a1904; RV64IZHINXMIN-NEXT: fadd.s a0, a1, a0905; RV64IZHINXMIN-NEXT: fcvt.h.s a0, a0906; RV64IZHINXMIN-NEXT: ret907 %1 = fadd half %a, %b908 %2 = call half @llvm.fabs.f16(half %1)909 %3 = fadd half %2, %1910 ret half %3911}912 913define half @fmin_h(half %a, half %b) nounwind {914; CHECKIZFH-LABEL: fmin_h:915; CHECKIZFH: # %bb.0:916; CHECKIZFH-NEXT: fmin.h fa0, fa0, fa1917; CHECKIZFH-NEXT: ret918;919; CHECKIZHINX-LABEL: fmin_h:920; CHECKIZHINX: # %bb.0:921; CHECKIZHINX-NEXT: fmin.h a0, a0, a1922; CHECKIZHINX-NEXT: ret923;924; RV32I-LABEL: fmin_h:925; RV32I: # %bb.0:926; RV32I-NEXT: addi sp, sp, -16927; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill928; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill929; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill930; RV32I-NEXT: sw s2, 0(sp) # 4-byte Folded Spill931; RV32I-NEXT: mv s0, a1932; RV32I-NEXT: lui a1, 16933; RV32I-NEXT: addi s2, a1, -1934; RV32I-NEXT: and a0, a0, s2935; RV32I-NEXT: call __extendhfsf2936; RV32I-NEXT: mv s1, a0937; RV32I-NEXT: and a0, s0, s2938; RV32I-NEXT: call __extendhfsf2939; RV32I-NEXT: mv a1, a0940; RV32I-NEXT: mv a0, s1941; RV32I-NEXT: call fminf942; RV32I-NEXT: call __truncsfhf2943; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload944; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload945; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload946; RV32I-NEXT: lw s2, 0(sp) # 4-byte Folded Reload947; RV32I-NEXT: addi sp, sp, 16948; RV32I-NEXT: ret949;950; RV64I-LABEL: fmin_h:951; RV64I: # %bb.0:952; RV64I-NEXT: addi sp, sp, -32953; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill954; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill955; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill956; RV64I-NEXT: sd s2, 0(sp) # 8-byte Folded Spill957; RV64I-NEXT: mv s0, a1958; RV64I-NEXT: lui a1, 16959; RV64I-NEXT: addi s2, a1, -1960; RV64I-NEXT: and a0, a0, s2961; RV64I-NEXT: call __extendhfsf2962; RV64I-NEXT: mv s1, a0963; RV64I-NEXT: and a0, s0, s2964; RV64I-NEXT: call __extendhfsf2965; RV64I-NEXT: mv a1, a0966; RV64I-NEXT: mv a0, s1967; RV64I-NEXT: call fminf968; RV64I-NEXT: call __truncsfhf2969; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload970; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload971; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload972; RV64I-NEXT: ld s2, 0(sp) # 8-byte Folded Reload973; RV64I-NEXT: addi sp, sp, 32974; RV64I-NEXT: ret975;976; CHECKIZFHMIN-LABEL: fmin_h:977; CHECKIZFHMIN: # %bb.0:978; CHECKIZFHMIN-NEXT: fcvt.s.h fa5, fa1979; CHECKIZFHMIN-NEXT: fcvt.s.h fa4, fa0980; CHECKIZFHMIN-NEXT: fmin.s fa5, fa4, fa5981; CHECKIZFHMIN-NEXT: fcvt.h.s fa0, fa5982; CHECKIZFHMIN-NEXT: ret983;984; CHECKIZHINXMIN-LABEL: fmin_h:985; CHECKIZHINXMIN: # %bb.0:986; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a1987; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a0988; CHECKIZHINXMIN-NEXT: fmin.s a0, a0, a1989; CHECKIZHINXMIN-NEXT: fcvt.h.s a0, a0990; CHECKIZHINXMIN-NEXT: ret991 %1 = call half @llvm.minnum.f16(half %a, half %b)992 ret half %1993}994 995define half @fmax_h(half %a, half %b) nounwind {996; CHECKIZFH-LABEL: fmax_h:997; CHECKIZFH: # %bb.0:998; CHECKIZFH-NEXT: fmax.h fa0, fa0, fa1999; CHECKIZFH-NEXT: ret1000;1001; CHECKIZHINX-LABEL: fmax_h:1002; CHECKIZHINX: # %bb.0:1003; CHECKIZHINX-NEXT: fmax.h a0, a0, a11004; CHECKIZHINX-NEXT: ret1005;1006; RV32I-LABEL: fmax_h:1007; RV32I: # %bb.0:1008; RV32I-NEXT: addi sp, sp, -161009; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1010; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill1011; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill1012; RV32I-NEXT: sw s2, 0(sp) # 4-byte Folded Spill1013; RV32I-NEXT: mv s0, a11014; RV32I-NEXT: lui a1, 161015; RV32I-NEXT: addi s2, a1, -11016; RV32I-NEXT: and a0, a0, s21017; RV32I-NEXT: call __extendhfsf21018; RV32I-NEXT: mv s1, a01019; RV32I-NEXT: and a0, s0, s21020; RV32I-NEXT: call __extendhfsf21021; RV32I-NEXT: mv a1, a01022; RV32I-NEXT: mv a0, s11023; RV32I-NEXT: call fmaxf1024; RV32I-NEXT: call __truncsfhf21025; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1026; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload1027; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload1028; RV32I-NEXT: lw s2, 0(sp) # 4-byte Folded Reload1029; RV32I-NEXT: addi sp, sp, 161030; RV32I-NEXT: ret1031;1032; RV64I-LABEL: fmax_h:1033; RV64I: # %bb.0:1034; RV64I-NEXT: addi sp, sp, -321035; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill1036; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill1037; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill1038; RV64I-NEXT: sd s2, 0(sp) # 8-byte Folded Spill1039; RV64I-NEXT: mv s0, a11040; RV64I-NEXT: lui a1, 161041; RV64I-NEXT: addi s2, a1, -11042; RV64I-NEXT: and a0, a0, s21043; RV64I-NEXT: call __extendhfsf21044; RV64I-NEXT: mv s1, a01045; RV64I-NEXT: and a0, s0, s21046; RV64I-NEXT: call __extendhfsf21047; RV64I-NEXT: mv a1, a01048; RV64I-NEXT: mv a0, s11049; RV64I-NEXT: call fmaxf1050; RV64I-NEXT: call __truncsfhf21051; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload1052; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload1053; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload1054; RV64I-NEXT: ld s2, 0(sp) # 8-byte Folded Reload1055; RV64I-NEXT: addi sp, sp, 321056; RV64I-NEXT: ret1057;1058; CHECKIZFHMIN-LABEL: fmax_h:1059; CHECKIZFHMIN: # %bb.0:1060; CHECKIZFHMIN-NEXT: fcvt.s.h fa5, fa11061; CHECKIZFHMIN-NEXT: fcvt.s.h fa4, fa01062; CHECKIZFHMIN-NEXT: fmax.s fa5, fa4, fa51063; CHECKIZFHMIN-NEXT: fcvt.h.s fa0, fa51064; CHECKIZFHMIN-NEXT: ret1065;1066; CHECKIZHINXMIN-LABEL: fmax_h:1067; CHECKIZHINXMIN: # %bb.0:1068; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a11069; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a01070; CHECKIZHINXMIN-NEXT: fmax.s a0, a0, a11071; CHECKIZHINXMIN-NEXT: fcvt.h.s a0, a01072; CHECKIZHINXMIN-NEXT: ret1073 %1 = call half @llvm.maxnum.f16(half %a, half %b)1074 ret half %11075}1076 1077define half @fmadd_h(half %a, half %b, half %c) nounwind {1078; CHECKIZFH-LABEL: fmadd_h:1079; CHECKIZFH: # %bb.0:1080; CHECKIZFH-NEXT: fmadd.h fa0, fa0, fa1, fa21081; CHECKIZFH-NEXT: ret1082;1083; CHECKIZHINX-LABEL: fmadd_h:1084; CHECKIZHINX: # %bb.0:1085; CHECKIZHINX-NEXT: fmadd.h a0, a0, a1, a21086; CHECKIZHINX-NEXT: ret1087;1088; RV32I-LABEL: fmadd_h:1089; RV32I: # %bb.0:1090; RV32I-NEXT: addi sp, sp, -321091; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill1092; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill1093; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill1094; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill1095; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill1096; RV32I-NEXT: mv s0, a21097; RV32I-NEXT: mv s1, a11098; RV32I-NEXT: lui a1, 161099; RV32I-NEXT: addi s3, a1, -11100; RV32I-NEXT: and a0, a0, s31101; RV32I-NEXT: call __extendhfsf21102; RV32I-NEXT: mv s2, a01103; RV32I-NEXT: and a0, s1, s31104; RV32I-NEXT: call __extendhfsf21105; RV32I-NEXT: mv s1, a01106; RV32I-NEXT: and a0, s0, s31107; RV32I-NEXT: call __extendhfsf21108; RV32I-NEXT: mv a2, a01109; RV32I-NEXT: mv a0, s21110; RV32I-NEXT: mv a1, s11111; RV32I-NEXT: call fmaf1112; RV32I-NEXT: call __truncsfhf21113; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload1114; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload1115; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload1116; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload1117; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload1118; RV32I-NEXT: addi sp, sp, 321119; RV32I-NEXT: ret1120;1121; RV64I-LABEL: fmadd_h:1122; RV64I: # %bb.0:1123; RV64I-NEXT: addi sp, sp, -481124; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill1125; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill1126; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill1127; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill1128; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill1129; RV64I-NEXT: mv s0, a21130; RV64I-NEXT: mv s1, a11131; RV64I-NEXT: lui a1, 161132; RV64I-NEXT: addi s3, a1, -11133; RV64I-NEXT: and a0, a0, s31134; RV64I-NEXT: call __extendhfsf21135; RV64I-NEXT: mv s2, a01136; RV64I-NEXT: and a0, s1, s31137; RV64I-NEXT: call __extendhfsf21138; RV64I-NEXT: mv s1, a01139; RV64I-NEXT: and a0, s0, s31140; RV64I-NEXT: call __extendhfsf21141; RV64I-NEXT: mv a2, a01142; RV64I-NEXT: mv a0, s21143; RV64I-NEXT: mv a1, s11144; RV64I-NEXT: call fmaf1145; RV64I-NEXT: call __truncsfhf21146; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload1147; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload1148; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload1149; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload1150; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload1151; RV64I-NEXT: addi sp, sp, 481152; RV64I-NEXT: ret1153;1154; CHECKIZFHMIN-LABEL: fmadd_h:1155; CHECKIZFHMIN: # %bb.0:1156; CHECKIZFHMIN-NEXT: fcvt.s.h fa5, fa21157; CHECKIZFHMIN-NEXT: fcvt.s.h fa4, fa11158; CHECKIZFHMIN-NEXT: fcvt.s.h fa3, fa01159; CHECKIZFHMIN-NEXT: fmadd.s fa5, fa3, fa4, fa51160; CHECKIZFHMIN-NEXT: fcvt.h.s fa0, fa51161; CHECKIZFHMIN-NEXT: ret1162;1163; CHECKIZHINXMIN-LABEL: fmadd_h:1164; CHECKIZHINXMIN: # %bb.0:1165; CHECKIZHINXMIN-NEXT: fcvt.s.h a2, a21166; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a11167; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a01168; CHECKIZHINXMIN-NEXT: fmadd.s a0, a0, a1, a21169; CHECKIZHINXMIN-NEXT: fcvt.h.s a0, a01170; CHECKIZHINXMIN-NEXT: ret1171 %1 = call half @llvm.fma.f16(half %a, half %b, half %c)1172 ret half %11173}1174 1175define half @fmsub_h(half %a, half %b, half %c) nounwind {1176; CHECKIZFH-LABEL: fmsub_h:1177; CHECKIZFH: # %bb.0:1178; CHECKIZFH-NEXT: fmv.h.x fa5, zero1179; CHECKIZFH-NEXT: fadd.h fa5, fa2, fa51180; CHECKIZFH-NEXT: fmsub.h fa0, fa0, fa1, fa51181; CHECKIZFH-NEXT: ret1182;1183; CHECKIZHINX-LABEL: fmsub_h:1184; CHECKIZHINX: # %bb.0:1185; CHECKIZHINX-NEXT: fadd.h a2, a2, zero1186; CHECKIZHINX-NEXT: fmsub.h a0, a0, a1, a21187; CHECKIZHINX-NEXT: ret1188;1189; RV32I-LABEL: fmsub_h:1190; RV32I: # %bb.0:1191; RV32I-NEXT: addi sp, sp, -321192; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill1193; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill1194; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill1195; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill1196; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill1197; RV32I-NEXT: mv s0, a11198; RV32I-NEXT: mv s1, a01199; RV32I-NEXT: lui a0, 161200; RV32I-NEXT: addi s2, a0, -11201; RV32I-NEXT: and a0, a2, s21202; RV32I-NEXT: call __extendhfsf21203; RV32I-NEXT: li a1, 01204; RV32I-NEXT: call __addsf31205; RV32I-NEXT: call __truncsfhf21206; RV32I-NEXT: lui a1, 81207; RV32I-NEXT: xor s3, a0, a11208; RV32I-NEXT: and a0, s1, s21209; RV32I-NEXT: call __extendhfsf21210; RV32I-NEXT: mv s1, a01211; RV32I-NEXT: and a0, s0, s21212; RV32I-NEXT: call __extendhfsf21213; RV32I-NEXT: mv s0, a01214; RV32I-NEXT: and a0, s3, s21215; RV32I-NEXT: call __extendhfsf21216; RV32I-NEXT: mv a2, a01217; RV32I-NEXT: mv a0, s11218; RV32I-NEXT: mv a1, s01219; RV32I-NEXT: call fmaf1220; RV32I-NEXT: call __truncsfhf21221; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload1222; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload1223; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload1224; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload1225; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload1226; RV32I-NEXT: addi sp, sp, 321227; RV32I-NEXT: ret1228;1229; RV64I-LABEL: fmsub_h:1230; RV64I: # %bb.0:1231; RV64I-NEXT: addi sp, sp, -481232; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill1233; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill1234; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill1235; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill1236; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill1237; RV64I-NEXT: mv s0, a11238; RV64I-NEXT: mv s1, a01239; RV64I-NEXT: lui a0, 161240; RV64I-NEXT: addi s2, a0, -11241; RV64I-NEXT: and a0, a2, s21242; RV64I-NEXT: call __extendhfsf21243; RV64I-NEXT: li a1, 01244; RV64I-NEXT: call __addsf31245; RV64I-NEXT: call __truncsfhf21246; RV64I-NEXT: lui a1, 81247; RV64I-NEXT: xor s3, a0, a11248; RV64I-NEXT: and a0, s1, s21249; RV64I-NEXT: call __extendhfsf21250; RV64I-NEXT: mv s1, a01251; RV64I-NEXT: and a0, s0, s21252; RV64I-NEXT: call __extendhfsf21253; RV64I-NEXT: mv s0, a01254; RV64I-NEXT: and a0, s3, s21255; RV64I-NEXT: call __extendhfsf21256; RV64I-NEXT: mv a2, a01257; RV64I-NEXT: mv a0, s11258; RV64I-NEXT: mv a1, s01259; RV64I-NEXT: call fmaf1260; RV64I-NEXT: call __truncsfhf21261; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload1262; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload1263; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload1264; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload1265; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload1266; RV64I-NEXT: addi sp, sp, 481267; RV64I-NEXT: ret1268;1269; CHECKIZFHMIN-LABEL: fmsub_h:1270; CHECKIZFHMIN: # %bb.0:1271; CHECKIZFHMIN-NEXT: fcvt.s.h fa5, fa21272; CHECKIZFHMIN-NEXT: fmv.w.x fa4, zero1273; CHECKIZFHMIN-NEXT: lui a0, 10485681274; CHECKIZFHMIN-NEXT: fcvt.s.h fa3, fa11275; CHECKIZFHMIN-NEXT: fadd.s fa5, fa5, fa41276; CHECKIZFHMIN-NEXT: fcvt.h.s fa5, fa51277; CHECKIZFHMIN-NEXT: fmv.x.h a1, fa51278; CHECKIZFHMIN-NEXT: xor a0, a1, a01279; CHECKIZFHMIN-NEXT: fmv.h.x fa5, a01280; CHECKIZFHMIN-NEXT: fcvt.s.h fa5, fa51281; CHECKIZFHMIN-NEXT: fcvt.s.h fa4, fa01282; CHECKIZFHMIN-NEXT: fmadd.s fa5, fa4, fa3, fa51283; CHECKIZFHMIN-NEXT: fcvt.h.s fa0, fa51284; CHECKIZFHMIN-NEXT: ret1285;1286; CHECKIZHINXMIN-LABEL: fmsub_h:1287; CHECKIZHINXMIN: # %bb.0:1288; CHECKIZHINXMIN-NEXT: fcvt.s.h a2, a21289; CHECKIZHINXMIN-NEXT: lui a3, 10485681290; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a11291; CHECKIZHINXMIN-NEXT: fadd.s a2, a2, zero1292; CHECKIZHINXMIN-NEXT: fcvt.h.s a2, a21293; CHECKIZHINXMIN-NEXT: xor a2, a2, a31294; CHECKIZHINXMIN-NEXT: fcvt.s.h a2, a21295; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a01296; CHECKIZHINXMIN-NEXT: fmadd.s a0, a0, a1, a21297; CHECKIZHINXMIN-NEXT: fcvt.h.s a0, a01298; CHECKIZHINXMIN-NEXT: ret1299 %c_ = fadd half 0.0, %c ; avoid negation using xor1300 %negc = fsub half -0.0, %c_1301 %1 = call half @llvm.fma.f16(half %a, half %b, half %negc)1302 ret half %11303}1304 1305define half @fnmadd_h(half %a, half %b, half %c) nounwind {1306; CHECKIZFH-LABEL: fnmadd_h:1307; CHECKIZFH: # %bb.0:1308; CHECKIZFH-NEXT: fmv.h.x fa5, zero1309; CHECKIZFH-NEXT: fadd.h fa4, fa0, fa51310; CHECKIZFH-NEXT: fadd.h fa5, fa2, fa51311; CHECKIZFH-NEXT: fnmadd.h fa0, fa4, fa1, fa51312; CHECKIZFH-NEXT: ret1313;1314; CHECKIZHINX-LABEL: fnmadd_h:1315; CHECKIZHINX: # %bb.0:1316; CHECKIZHINX-NEXT: fadd.h a0, a0, zero1317; CHECKIZHINX-NEXT: fadd.h a2, a2, zero1318; CHECKIZHINX-NEXT: fnmadd.h a0, a0, a1, a21319; CHECKIZHINX-NEXT: ret1320;1321; RV32I-LABEL: fnmadd_h:1322; RV32I: # %bb.0:1323; RV32I-NEXT: addi sp, sp, -321324; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill1325; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill1326; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill1327; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill1328; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill1329; RV32I-NEXT: sw s4, 8(sp) # 4-byte Folded Spill1330; RV32I-NEXT: mv s0, a21331; RV32I-NEXT: mv s1, a11332; RV32I-NEXT: lui a1, 161333; RV32I-NEXT: addi s3, a1, -11334; RV32I-NEXT: and a0, a0, s31335; RV32I-NEXT: call __extendhfsf21336; RV32I-NEXT: li a1, 01337; RV32I-NEXT: call __addsf31338; RV32I-NEXT: call __truncsfhf21339; RV32I-NEXT: mv s2, a01340; RV32I-NEXT: and a0, s0, s31341; RV32I-NEXT: call __extendhfsf21342; RV32I-NEXT: li a1, 01343; RV32I-NEXT: call __addsf31344; RV32I-NEXT: call __truncsfhf21345; RV32I-NEXT: lui a1, 81346; RV32I-NEXT: xor s2, s2, a11347; RV32I-NEXT: xor s4, a0, a11348; RV32I-NEXT: and a0, s1, s31349; RV32I-NEXT: call __extendhfsf21350; RV32I-NEXT: mv s0, a01351; RV32I-NEXT: and a0, s2, s31352; RV32I-NEXT: call __extendhfsf21353; RV32I-NEXT: mv s1, a01354; RV32I-NEXT: and a0, s4, s31355; RV32I-NEXT: call __extendhfsf21356; RV32I-NEXT: mv a2, a01357; RV32I-NEXT: mv a0, s11358; RV32I-NEXT: mv a1, s01359; RV32I-NEXT: call fmaf1360; RV32I-NEXT: call __truncsfhf21361; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload1362; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload1363; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload1364; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload1365; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload1366; RV32I-NEXT: lw s4, 8(sp) # 4-byte Folded Reload1367; RV32I-NEXT: addi sp, sp, 321368; RV32I-NEXT: ret1369;1370; RV64I-LABEL: fnmadd_h:1371; RV64I: # %bb.0:1372; RV64I-NEXT: addi sp, sp, -481373; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill1374; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill1375; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill1376; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill1377; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill1378; RV64I-NEXT: sd s4, 0(sp) # 8-byte Folded Spill1379; RV64I-NEXT: mv s0, a21380; RV64I-NEXT: mv s1, a11381; RV64I-NEXT: lui a1, 161382; RV64I-NEXT: addi s3, a1, -11383; RV64I-NEXT: and a0, a0, s31384; RV64I-NEXT: call __extendhfsf21385; RV64I-NEXT: li a1, 01386; RV64I-NEXT: call __addsf31387; RV64I-NEXT: call __truncsfhf21388; RV64I-NEXT: mv s2, a01389; RV64I-NEXT: and a0, s0, s31390; RV64I-NEXT: call __extendhfsf21391; RV64I-NEXT: li a1, 01392; RV64I-NEXT: call __addsf31393; RV64I-NEXT: call __truncsfhf21394; RV64I-NEXT: lui a1, 81395; RV64I-NEXT: xor s2, s2, a11396; RV64I-NEXT: xor s4, a0, a11397; RV64I-NEXT: and a0, s1, s31398; RV64I-NEXT: call __extendhfsf21399; RV64I-NEXT: mv s0, a01400; RV64I-NEXT: and a0, s2, s31401; RV64I-NEXT: call __extendhfsf21402; RV64I-NEXT: mv s1, a01403; RV64I-NEXT: and a0, s4, s31404; RV64I-NEXT: call __extendhfsf21405; RV64I-NEXT: mv a2, a01406; RV64I-NEXT: mv a0, s11407; RV64I-NEXT: mv a1, s01408; RV64I-NEXT: call fmaf1409; RV64I-NEXT: call __truncsfhf21410; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload1411; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload1412; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload1413; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload1414; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload1415; RV64I-NEXT: ld s4, 0(sp) # 8-byte Folded Reload1416; RV64I-NEXT: addi sp, sp, 481417; RV64I-NEXT: ret1418;1419; CHECKIZFHMIN-LABEL: fnmadd_h:1420; CHECKIZFHMIN: # %bb.0:1421; CHECKIZFHMIN-NEXT: fcvt.s.h fa5, fa01422; CHECKIZFHMIN-NEXT: fmv.w.x fa4, zero1423; CHECKIZFHMIN-NEXT: fcvt.s.h fa3, fa21424; CHECKIZFHMIN-NEXT: lui a0, 10485681425; CHECKIZFHMIN-NEXT: fadd.s fa5, fa5, fa41426; CHECKIZFHMIN-NEXT: fadd.s fa4, fa3, fa41427; CHECKIZFHMIN-NEXT: fcvt.h.s fa5, fa51428; CHECKIZFHMIN-NEXT: fcvt.h.s fa4, fa41429; CHECKIZFHMIN-NEXT: fmv.x.h a1, fa51430; CHECKIZFHMIN-NEXT: fmv.x.h a2, fa41431; CHECKIZFHMIN-NEXT: xor a1, a1, a01432; CHECKIZFHMIN-NEXT: xor a0, a2, a01433; CHECKIZFHMIN-NEXT: fmv.h.x fa5, a11434; CHECKIZFHMIN-NEXT: fmv.h.x fa4, a01435; CHECKIZFHMIN-NEXT: fcvt.s.h fa4, fa41436; CHECKIZFHMIN-NEXT: fcvt.s.h fa5, fa51437; CHECKIZFHMIN-NEXT: fcvt.s.h fa3, fa11438; CHECKIZFHMIN-NEXT: fmadd.s fa5, fa5, fa3, fa41439; CHECKIZFHMIN-NEXT: fcvt.h.s fa0, fa51440; CHECKIZFHMIN-NEXT: ret1441;1442; CHECKIZHINXMIN-LABEL: fnmadd_h:1443; CHECKIZHINXMIN: # %bb.0:1444; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a01445; CHECKIZHINXMIN-NEXT: fcvt.s.h a2, a21446; CHECKIZHINXMIN-NEXT: lui a3, 10485681447; CHECKIZHINXMIN-NEXT: fadd.s a0, a0, zero1448; CHECKIZHINXMIN-NEXT: fadd.s a2, a2, zero1449; CHECKIZHINXMIN-NEXT: fcvt.h.s a0, a01450; CHECKIZHINXMIN-NEXT: fcvt.h.s a2, a21451; CHECKIZHINXMIN-NEXT: xor a0, a0, a31452; CHECKIZHINXMIN-NEXT: xor a2, a2, a31453; CHECKIZHINXMIN-NEXT: fcvt.s.h a2, a21454; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a01455; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a11456; CHECKIZHINXMIN-NEXT: fmadd.s a0, a0, a1, a21457; CHECKIZHINXMIN-NEXT: fcvt.h.s a0, a01458; CHECKIZHINXMIN-NEXT: ret1459 %a_ = fadd half 0.0, %a1460 %c_ = fadd half 0.0, %c1461 %nega = fsub half -0.0, %a_1462 %negc = fsub half -0.0, %c_1463 %1 = call half @llvm.fma.f16(half %nega, half %b, half %negc)1464 ret half %11465}1466 1467define half @fnmadd_h_2(half %a, half %b, half %c) nounwind {1468; CHECKIZFH-LABEL: fnmadd_h_2:1469; CHECKIZFH: # %bb.0:1470; CHECKIZFH-NEXT: fmv.h.x fa5, zero1471; CHECKIZFH-NEXT: fadd.h fa4, fa1, fa51472; CHECKIZFH-NEXT: fadd.h fa5, fa2, fa51473; CHECKIZFH-NEXT: fnmadd.h fa0, fa4, fa0, fa51474; CHECKIZFH-NEXT: ret1475;1476; CHECKIZHINX-LABEL: fnmadd_h_2:1477; CHECKIZHINX: # %bb.0:1478; CHECKIZHINX-NEXT: fadd.h a1, a1, zero1479; CHECKIZHINX-NEXT: fadd.h a2, a2, zero1480; CHECKIZHINX-NEXT: fnmadd.h a0, a1, a0, a21481; CHECKIZHINX-NEXT: ret1482;1483; RV32I-LABEL: fnmadd_h_2:1484; RV32I: # %bb.0:1485; RV32I-NEXT: addi sp, sp, -321486; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill1487; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill1488; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill1489; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill1490; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill1491; RV32I-NEXT: sw s4, 8(sp) # 4-byte Folded Spill1492; RV32I-NEXT: mv s0, a21493; RV32I-NEXT: mv s1, a01494; RV32I-NEXT: lui a0, 161495; RV32I-NEXT: addi s3, a0, -11496; RV32I-NEXT: and a0, a1, s31497; RV32I-NEXT: call __extendhfsf21498; RV32I-NEXT: li a1, 01499; RV32I-NEXT: call __addsf31500; RV32I-NEXT: call __truncsfhf21501; RV32I-NEXT: mv s2, a01502; RV32I-NEXT: and a0, s0, s31503; RV32I-NEXT: call __extendhfsf21504; RV32I-NEXT: li a1, 01505; RV32I-NEXT: call __addsf31506; RV32I-NEXT: call __truncsfhf21507; RV32I-NEXT: lui a1, 81508; RV32I-NEXT: xor s2, s2, a11509; RV32I-NEXT: xor s4, a0, a11510; RV32I-NEXT: and a0, s1, s31511; RV32I-NEXT: call __extendhfsf21512; RV32I-NEXT: mv s0, a01513; RV32I-NEXT: and a0, s2, s31514; RV32I-NEXT: call __extendhfsf21515; RV32I-NEXT: mv s1, a01516; RV32I-NEXT: and a0, s4, s31517; RV32I-NEXT: call __extendhfsf21518; RV32I-NEXT: mv a2, a01519; RV32I-NEXT: mv a0, s01520; RV32I-NEXT: mv a1, s11521; RV32I-NEXT: call fmaf1522; RV32I-NEXT: call __truncsfhf21523; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload1524; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload1525; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload1526; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload1527; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload1528; RV32I-NEXT: lw s4, 8(sp) # 4-byte Folded Reload1529; RV32I-NEXT: addi sp, sp, 321530; RV32I-NEXT: ret1531;1532; RV64I-LABEL: fnmadd_h_2:1533; RV64I: # %bb.0:1534; RV64I-NEXT: addi sp, sp, -481535; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill1536; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill1537; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill1538; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill1539; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill1540; RV64I-NEXT: sd s4, 0(sp) # 8-byte Folded Spill1541; RV64I-NEXT: mv s0, a21542; RV64I-NEXT: mv s1, a01543; RV64I-NEXT: lui a0, 161544; RV64I-NEXT: addi s3, a0, -11545; RV64I-NEXT: and a0, a1, s31546; RV64I-NEXT: call __extendhfsf21547; RV64I-NEXT: li a1, 01548; RV64I-NEXT: call __addsf31549; RV64I-NEXT: call __truncsfhf21550; RV64I-NEXT: mv s2, a01551; RV64I-NEXT: and a0, s0, s31552; RV64I-NEXT: call __extendhfsf21553; RV64I-NEXT: li a1, 01554; RV64I-NEXT: call __addsf31555; RV64I-NEXT: call __truncsfhf21556; RV64I-NEXT: lui a1, 81557; RV64I-NEXT: xor s2, s2, a11558; RV64I-NEXT: xor s4, a0, a11559; RV64I-NEXT: and a0, s1, s31560; RV64I-NEXT: call __extendhfsf21561; RV64I-NEXT: mv s0, a01562; RV64I-NEXT: and a0, s2, s31563; RV64I-NEXT: call __extendhfsf21564; RV64I-NEXT: mv s1, a01565; RV64I-NEXT: and a0, s4, s31566; RV64I-NEXT: call __extendhfsf21567; RV64I-NEXT: mv a2, a01568; RV64I-NEXT: mv a0, s01569; RV64I-NEXT: mv a1, s11570; RV64I-NEXT: call fmaf1571; RV64I-NEXT: call __truncsfhf21572; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload1573; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload1574; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload1575; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload1576; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload1577; RV64I-NEXT: ld s4, 0(sp) # 8-byte Folded Reload1578; RV64I-NEXT: addi sp, sp, 481579; RV64I-NEXT: ret1580;1581; CHECKIZFHMIN-LABEL: fnmadd_h_2:1582; CHECKIZFHMIN: # %bb.0:1583; CHECKIZFHMIN-NEXT: fcvt.s.h fa5, fa11584; CHECKIZFHMIN-NEXT: fmv.w.x fa4, zero1585; CHECKIZFHMIN-NEXT: fcvt.s.h fa3, fa21586; CHECKIZFHMIN-NEXT: lui a0, 10485681587; CHECKIZFHMIN-NEXT: fadd.s fa5, fa5, fa41588; CHECKIZFHMIN-NEXT: fadd.s fa4, fa3, fa41589; CHECKIZFHMIN-NEXT: fcvt.h.s fa5, fa51590; CHECKIZFHMIN-NEXT: fcvt.h.s fa4, fa41591; CHECKIZFHMIN-NEXT: fmv.x.h a1, fa51592; CHECKIZFHMIN-NEXT: fmv.x.h a2, fa41593; CHECKIZFHMIN-NEXT: xor a1, a1, a01594; CHECKIZFHMIN-NEXT: xor a0, a2, a01595; CHECKIZFHMIN-NEXT: fmv.h.x fa5, a11596; CHECKIZFHMIN-NEXT: fmv.h.x fa4, a01597; CHECKIZFHMIN-NEXT: fcvt.s.h fa4, fa41598; CHECKIZFHMIN-NEXT: fcvt.s.h fa5, fa51599; CHECKIZFHMIN-NEXT: fcvt.s.h fa3, fa01600; CHECKIZFHMIN-NEXT: fmadd.s fa5, fa3, fa5, fa41601; CHECKIZFHMIN-NEXT: fcvt.h.s fa0, fa51602; CHECKIZFHMIN-NEXT: ret1603;1604; CHECKIZHINXMIN-LABEL: fnmadd_h_2:1605; CHECKIZHINXMIN: # %bb.0:1606; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a11607; CHECKIZHINXMIN-NEXT: fcvt.s.h a2, a21608; CHECKIZHINXMIN-NEXT: lui a3, 10485681609; CHECKIZHINXMIN-NEXT: fadd.s a1, a1, zero1610; CHECKIZHINXMIN-NEXT: fadd.s a2, a2, zero1611; CHECKIZHINXMIN-NEXT: fcvt.h.s a1, a11612; CHECKIZHINXMIN-NEXT: fcvt.h.s a2, a21613; CHECKIZHINXMIN-NEXT: xor a1, a1, a31614; CHECKIZHINXMIN-NEXT: xor a2, a2, a31615; CHECKIZHINXMIN-NEXT: fcvt.s.h a2, a21616; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a11617; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a01618; CHECKIZHINXMIN-NEXT: fmadd.s a0, a0, a1, a21619; CHECKIZHINXMIN-NEXT: fcvt.h.s a0, a01620; CHECKIZHINXMIN-NEXT: ret1621 %b_ = fadd half 0.0, %b1622 %c_ = fadd half 0.0, %c1623 %negb = fsub half -0.0, %b_1624 %negc = fsub half -0.0, %c_1625 %1 = call half @llvm.fma.f16(half %a, half %negb, half %negc)1626 ret half %11627}1628 1629define half @fnmadd_h_3(half %a, half %b, half %c) nounwind {1630; RV32IZFH-LABEL: fnmadd_h_3:1631; RV32IZFH: # %bb.0:1632; RV32IZFH-NEXT: fmadd.h ft0, fa0, fa1, fa21633; RV32IZFH-NEXT: fneg.h fa0, ft01634; RV32IZFH-NEXT: ret1635;1636; RV64IZFH-LABEL: fnmadd_h_3:1637; RV64IZFH: # %bb.0:1638; RV64IZFH-NEXT: fmadd.h ft0, fa0, fa1, fa21639; RV64IZFH-NEXT: fneg.h fa0, ft01640; RV64IZFH-NEXT: ret1641;1642; CHECKIZFH-LABEL: fnmadd_h_3:1643; CHECKIZFH: # %bb.0:1644; CHECKIZFH-NEXT: fmadd.h fa5, fa0, fa1, fa21645; CHECKIZFH-NEXT: fneg.h fa0, fa51646; CHECKIZFH-NEXT: ret1647;1648; CHECKIZHINX-LABEL: fnmadd_h_3:1649; CHECKIZHINX: # %bb.0:1650; CHECKIZHINX-NEXT: fmadd.h a0, a0, a1, a21651; CHECKIZHINX-NEXT: fneg.h a0, a01652; CHECKIZHINX-NEXT: ret1653;1654; RV32I-LABEL: fnmadd_h_3:1655; RV32I: # %bb.0:1656; RV32I-NEXT: addi sp, sp, -321657; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill1658; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill1659; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill1660; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill1661; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill1662; RV32I-NEXT: mv s0, a21663; RV32I-NEXT: mv s1, a11664; RV32I-NEXT: lui a1, 161665; RV32I-NEXT: addi s3, a1, -11666; RV32I-NEXT: and a0, a0, s31667; RV32I-NEXT: call __extendhfsf21668; RV32I-NEXT: mv s2, a01669; RV32I-NEXT: and a0, s1, s31670; RV32I-NEXT: call __extendhfsf21671; RV32I-NEXT: mv s1, a01672; RV32I-NEXT: and a0, s0, s31673; RV32I-NEXT: call __extendhfsf21674; RV32I-NEXT: mv a2, a01675; RV32I-NEXT: mv a0, s21676; RV32I-NEXT: mv a1, s11677; RV32I-NEXT: call fmaf1678; RV32I-NEXT: call __truncsfhf21679; RV32I-NEXT: lui a1, 10485681680; RV32I-NEXT: xor a0, a0, a11681; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload1682; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload1683; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload1684; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload1685; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload1686; RV32I-NEXT: addi sp, sp, 321687; RV32I-NEXT: ret1688;1689; RV64I-LABEL: fnmadd_h_3:1690; RV64I: # %bb.0:1691; RV64I-NEXT: addi sp, sp, -481692; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill1693; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill1694; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill1695; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill1696; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill1697; RV64I-NEXT: mv s0, a21698; RV64I-NEXT: mv s1, a11699; RV64I-NEXT: lui a1, 161700; RV64I-NEXT: addi s3, a1, -11701; RV64I-NEXT: and a0, a0, s31702; RV64I-NEXT: call __extendhfsf21703; RV64I-NEXT: mv s2, a01704; RV64I-NEXT: and a0, s1, s31705; RV64I-NEXT: call __extendhfsf21706; RV64I-NEXT: mv s1, a01707; RV64I-NEXT: and a0, s0, s31708; RV64I-NEXT: call __extendhfsf21709; RV64I-NEXT: mv a2, a01710; RV64I-NEXT: mv a0, s21711; RV64I-NEXT: mv a1, s11712; RV64I-NEXT: call fmaf1713; RV64I-NEXT: call __truncsfhf21714; RV64I-NEXT: lui a1, 10485681715; RV64I-NEXT: xor a0, a0, a11716; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload1717; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload1718; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload1719; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload1720; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload1721; RV64I-NEXT: addi sp, sp, 481722; RV64I-NEXT: ret1723;1724; CHECKIZFHMIN-LABEL: fnmadd_h_3:1725; CHECKIZFHMIN: # %bb.0:1726; CHECKIZFHMIN-NEXT: fcvt.s.h fa5, fa21727; CHECKIZFHMIN-NEXT: fcvt.s.h fa4, fa11728; CHECKIZFHMIN-NEXT: fcvt.s.h fa3, fa01729; CHECKIZFHMIN-NEXT: fmadd.s fa5, fa3, fa4, fa51730; CHECKIZFHMIN-NEXT: fcvt.h.s fa5, fa51731; CHECKIZFHMIN-NEXT: fmv.x.h a0, fa51732; CHECKIZFHMIN-NEXT: lui a1, 10485681733; CHECKIZFHMIN-NEXT: xor a0, a0, a11734; CHECKIZFHMIN-NEXT: fmv.h.x fa0, a01735; CHECKIZFHMIN-NEXT: ret1736;1737; CHECKIZHINXMIN-LABEL: fnmadd_h_3:1738; CHECKIZHINXMIN: # %bb.0:1739; CHECKIZHINXMIN-NEXT: fcvt.s.h a2, a21740; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a11741; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a01742; CHECKIZHINXMIN-NEXT: fmadd.s a0, a0, a1, a21743; CHECKIZHINXMIN-NEXT: fcvt.h.s a0, a01744; CHECKIZHINXMIN-NEXT: lui a1, 10485681745; CHECKIZHINXMIN-NEXT: xor a0, a0, a11746; CHECKIZHINXMIN-NEXT: # kill: def $x10_h killed $x10_h killed $x101747; CHECKIZHINXMIN-NEXT: ret1748 %1 = call half @llvm.fma.f16(half %a, half %b, half %c)1749 %neg = fneg half %11750 ret half %neg1751}1752 1753define half @fnmadd_nsz(half %a, half %b, half %c) nounwind {1754; RV32IZFH-LABEL: fnmadd_nsz:1755; RV32IZFH: # %bb.0:1756; RV32IZFH-NEXT: fnmadd.h fa0, fa0, fa1, fa21757; RV32IZFH-NEXT: ret1758;1759; RV64IZFH-LABEL: fnmadd_nsz:1760; RV64IZFH: # %bb.0:1761; RV64IZFH-NEXT: fnmadd.h fa0, fa0, fa1, fa21762; RV64IZFH-NEXT: ret1763;1764; CHECKIZFH-LABEL: fnmadd_nsz:1765; CHECKIZFH: # %bb.0:1766; CHECKIZFH-NEXT: fnmadd.h fa0, fa0, fa1, fa21767; CHECKIZFH-NEXT: ret1768;1769; CHECKIZHINX-LABEL: fnmadd_nsz:1770; CHECKIZHINX: # %bb.0:1771; CHECKIZHINX-NEXT: fnmadd.h a0, a0, a1, a21772; CHECKIZHINX-NEXT: ret1773;1774; RV32I-LABEL: fnmadd_nsz:1775; RV32I: # %bb.0:1776; RV32I-NEXT: addi sp, sp, -321777; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill1778; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill1779; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill1780; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill1781; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill1782; RV32I-NEXT: mv s0, a21783; RV32I-NEXT: mv s1, a11784; RV32I-NEXT: lui a1, 161785; RV32I-NEXT: addi s3, a1, -11786; RV32I-NEXT: and a0, a0, s31787; RV32I-NEXT: call __extendhfsf21788; RV32I-NEXT: mv s2, a01789; RV32I-NEXT: and a0, s1, s31790; RV32I-NEXT: call __extendhfsf21791; RV32I-NEXT: mv s1, a01792; RV32I-NEXT: and a0, s0, s31793; RV32I-NEXT: call __extendhfsf21794; RV32I-NEXT: mv a2, a01795; RV32I-NEXT: mv a0, s21796; RV32I-NEXT: mv a1, s11797; RV32I-NEXT: call fmaf1798; RV32I-NEXT: call __truncsfhf21799; RV32I-NEXT: lui a1, 10485681800; RV32I-NEXT: xor a0, a0, a11801; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload1802; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload1803; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload1804; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload1805; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload1806; RV32I-NEXT: addi sp, sp, 321807; RV32I-NEXT: ret1808;1809; RV64I-LABEL: fnmadd_nsz:1810; RV64I: # %bb.0:1811; RV64I-NEXT: addi sp, sp, -481812; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill1813; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill1814; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill1815; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill1816; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill1817; RV64I-NEXT: mv s0, a21818; RV64I-NEXT: mv s1, a11819; RV64I-NEXT: lui a1, 161820; RV64I-NEXT: addi s3, a1, -11821; RV64I-NEXT: and a0, a0, s31822; RV64I-NEXT: call __extendhfsf21823; RV64I-NEXT: mv s2, a01824; RV64I-NEXT: and a0, s1, s31825; RV64I-NEXT: call __extendhfsf21826; RV64I-NEXT: mv s1, a01827; RV64I-NEXT: and a0, s0, s31828; RV64I-NEXT: call __extendhfsf21829; RV64I-NEXT: mv a2, a01830; RV64I-NEXT: mv a0, s21831; RV64I-NEXT: mv a1, s11832; RV64I-NEXT: call fmaf1833; RV64I-NEXT: call __truncsfhf21834; RV64I-NEXT: lui a1, 10485681835; RV64I-NEXT: xor a0, a0, a11836; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload1837; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload1838; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload1839; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload1840; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload1841; RV64I-NEXT: addi sp, sp, 481842; RV64I-NEXT: ret1843;1844; CHECKIZFHMIN-LABEL: fnmadd_nsz:1845; CHECKIZFHMIN: # %bb.0:1846; CHECKIZFHMIN-NEXT: fcvt.s.h fa5, fa21847; CHECKIZFHMIN-NEXT: fcvt.s.h fa4, fa11848; CHECKIZFHMIN-NEXT: fcvt.s.h fa3, fa01849; CHECKIZFHMIN-NEXT: fmadd.s fa5, fa3, fa4, fa51850; CHECKIZFHMIN-NEXT: fcvt.h.s fa5, fa51851; CHECKIZFHMIN-NEXT: fmv.x.h a0, fa51852; CHECKIZFHMIN-NEXT: lui a1, 10485681853; CHECKIZFHMIN-NEXT: xor a0, a0, a11854; CHECKIZFHMIN-NEXT: fmv.h.x fa0, a01855; CHECKIZFHMIN-NEXT: ret1856;1857; CHECKIZHINXMIN-LABEL: fnmadd_nsz:1858; CHECKIZHINXMIN: # %bb.0:1859; CHECKIZHINXMIN-NEXT: fcvt.s.h a2, a21860; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a11861; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a01862; CHECKIZHINXMIN-NEXT: fmadd.s a0, a0, a1, a21863; CHECKIZHINXMIN-NEXT: fcvt.h.s a0, a01864; CHECKIZHINXMIN-NEXT: lui a1, 10485681865; CHECKIZHINXMIN-NEXT: xor a0, a0, a11866; CHECKIZHINXMIN-NEXT: # kill: def $x10_h killed $x10_h killed $x101867; CHECKIZHINXMIN-NEXT: ret1868 %1 = call nsz half @llvm.fma.f16(half %a, half %b, half %c)1869 %neg = fneg nsz half %11870 ret half %neg1871}1872 1873define half @fnmsub_h(half %a, half %b, half %c) nounwind {1874; CHECKIZFH-LABEL: fnmsub_h:1875; CHECKIZFH: # %bb.0:1876; CHECKIZFH-NEXT: fmv.h.x fa5, zero1877; CHECKIZFH-NEXT: fadd.h fa5, fa0, fa51878; CHECKIZFH-NEXT: fnmsub.h fa0, fa5, fa1, fa21879; CHECKIZFH-NEXT: ret1880;1881; CHECKIZHINX-LABEL: fnmsub_h:1882; CHECKIZHINX: # %bb.0:1883; CHECKIZHINX-NEXT: fadd.h a0, a0, zero1884; CHECKIZHINX-NEXT: fnmsub.h a0, a0, a1, a21885; CHECKIZHINX-NEXT: ret1886;1887; RV32I-LABEL: fnmsub_h:1888; RV32I: # %bb.0:1889; RV32I-NEXT: addi sp, sp, -321890; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill1891; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill1892; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill1893; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill1894; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill1895; RV32I-NEXT: mv s0, a21896; RV32I-NEXT: mv s1, a11897; RV32I-NEXT: lui a1, 161898; RV32I-NEXT: addi s2, a1, -11899; RV32I-NEXT: and a0, a0, s21900; RV32I-NEXT: call __extendhfsf21901; RV32I-NEXT: li a1, 01902; RV32I-NEXT: call __addsf31903; RV32I-NEXT: call __truncsfhf21904; RV32I-NEXT: lui a1, 81905; RV32I-NEXT: xor s3, a0, a11906; RV32I-NEXT: and a0, s1, s21907; RV32I-NEXT: call __extendhfsf21908; RV32I-NEXT: mv s1, a01909; RV32I-NEXT: and a0, s0, s21910; RV32I-NEXT: call __extendhfsf21911; RV32I-NEXT: mv s0, a01912; RV32I-NEXT: and a0, s3, s21913; RV32I-NEXT: call __extendhfsf21914; RV32I-NEXT: mv a1, s11915; RV32I-NEXT: mv a2, s01916; RV32I-NEXT: call fmaf1917; RV32I-NEXT: call __truncsfhf21918; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload1919; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload1920; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload1921; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload1922; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload1923; RV32I-NEXT: addi sp, sp, 321924; RV32I-NEXT: ret1925;1926; RV64I-LABEL: fnmsub_h:1927; RV64I: # %bb.0:1928; RV64I-NEXT: addi sp, sp, -481929; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill1930; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill1931; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill1932; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill1933; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill1934; RV64I-NEXT: mv s0, a21935; RV64I-NEXT: mv s1, a11936; RV64I-NEXT: lui a1, 161937; RV64I-NEXT: addi s2, a1, -11938; RV64I-NEXT: and a0, a0, s21939; RV64I-NEXT: call __extendhfsf21940; RV64I-NEXT: li a1, 01941; RV64I-NEXT: call __addsf31942; RV64I-NEXT: call __truncsfhf21943; RV64I-NEXT: lui a1, 81944; RV64I-NEXT: xor s3, a0, a11945; RV64I-NEXT: and a0, s1, s21946; RV64I-NEXT: call __extendhfsf21947; RV64I-NEXT: mv s1, a01948; RV64I-NEXT: and a0, s0, s21949; RV64I-NEXT: call __extendhfsf21950; RV64I-NEXT: mv s0, a01951; RV64I-NEXT: and a0, s3, s21952; RV64I-NEXT: call __extendhfsf21953; RV64I-NEXT: mv a1, s11954; RV64I-NEXT: mv a2, s01955; RV64I-NEXT: call fmaf1956; RV64I-NEXT: call __truncsfhf21957; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload1958; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload1959; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload1960; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload1961; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload1962; RV64I-NEXT: addi sp, sp, 481963; RV64I-NEXT: ret1964;1965; CHECKIZFHMIN-LABEL: fnmsub_h:1966; CHECKIZFHMIN: # %bb.0:1967; CHECKIZFHMIN-NEXT: fcvt.s.h fa5, fa01968; CHECKIZFHMIN-NEXT: fmv.w.x fa4, zero1969; CHECKIZFHMIN-NEXT: lui a0, 10485681970; CHECKIZFHMIN-NEXT: fcvt.s.h fa3, fa21971; CHECKIZFHMIN-NEXT: fadd.s fa5, fa5, fa41972; CHECKIZFHMIN-NEXT: fcvt.h.s fa5, fa51973; CHECKIZFHMIN-NEXT: fmv.x.h a1, fa51974; CHECKIZFHMIN-NEXT: xor a0, a1, a01975; CHECKIZFHMIN-NEXT: fmv.h.x fa5, a01976; CHECKIZFHMIN-NEXT: fcvt.s.h fa5, fa51977; CHECKIZFHMIN-NEXT: fcvt.s.h fa4, fa11978; CHECKIZFHMIN-NEXT: fmadd.s fa5, fa5, fa4, fa31979; CHECKIZFHMIN-NEXT: fcvt.h.s fa0, fa51980; CHECKIZFHMIN-NEXT: ret1981;1982; CHECKIZHINXMIN-LABEL: fnmsub_h:1983; CHECKIZHINXMIN: # %bb.0:1984; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a01985; CHECKIZHINXMIN-NEXT: lui a3, 10485681986; CHECKIZHINXMIN-NEXT: fcvt.s.h a2, a21987; CHECKIZHINXMIN-NEXT: fadd.s a0, a0, zero1988; CHECKIZHINXMIN-NEXT: fcvt.h.s a0, a01989; CHECKIZHINXMIN-NEXT: xor a0, a0, a31990; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a01991; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a11992; CHECKIZHINXMIN-NEXT: fmadd.s a0, a0, a1, a21993; CHECKIZHINXMIN-NEXT: fcvt.h.s a0, a01994; CHECKIZHINXMIN-NEXT: ret1995 %a_ = fadd half 0.0, %a1996 %nega = fsub half -0.0, %a_1997 %1 = call half @llvm.fma.f16(half %nega, half %b, half %c)1998 ret half %11999}2000 2001define half @fnmsub_h_2(half %a, half %b, half %c) nounwind {2002; CHECKIZFH-LABEL: fnmsub_h_2:2003; CHECKIZFH: # %bb.0:2004; CHECKIZFH-NEXT: fmv.h.x fa5, zero2005; CHECKIZFH-NEXT: fadd.h fa5, fa1, fa52006; CHECKIZFH-NEXT: fnmsub.h fa0, fa5, fa0, fa22007; CHECKIZFH-NEXT: ret2008;2009; CHECKIZHINX-LABEL: fnmsub_h_2:2010; CHECKIZHINX: # %bb.0:2011; CHECKIZHINX-NEXT: fadd.h a1, a1, zero2012; CHECKIZHINX-NEXT: fnmsub.h a0, a1, a0, a22013; CHECKIZHINX-NEXT: ret2014;2015; RV32I-LABEL: fnmsub_h_2:2016; RV32I: # %bb.0:2017; RV32I-NEXT: addi sp, sp, -322018; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill2019; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill2020; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill2021; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill2022; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill2023; RV32I-NEXT: mv s0, a22024; RV32I-NEXT: mv s1, a02025; RV32I-NEXT: lui a0, 162026; RV32I-NEXT: addi s2, a0, -12027; RV32I-NEXT: and a0, a1, s22028; RV32I-NEXT: call __extendhfsf22029; RV32I-NEXT: li a1, 02030; RV32I-NEXT: call __addsf32031; RV32I-NEXT: call __truncsfhf22032; RV32I-NEXT: lui a1, 82033; RV32I-NEXT: xor s3, a0, a12034; RV32I-NEXT: and a0, s1, s22035; RV32I-NEXT: call __extendhfsf22036; RV32I-NEXT: mv s1, a02037; RV32I-NEXT: and a0, s0, s22038; RV32I-NEXT: call __extendhfsf22039; RV32I-NEXT: mv s0, a02040; RV32I-NEXT: and a0, s3, s22041; RV32I-NEXT: call __extendhfsf22042; RV32I-NEXT: mv a1, a02043; RV32I-NEXT: mv a0, s12044; RV32I-NEXT: mv a2, s02045; RV32I-NEXT: call fmaf2046; RV32I-NEXT: call __truncsfhf22047; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload2048; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload2049; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload2050; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload2051; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload2052; RV32I-NEXT: addi sp, sp, 322053; RV32I-NEXT: ret2054;2055; RV64I-LABEL: fnmsub_h_2:2056; RV64I: # %bb.0:2057; RV64I-NEXT: addi sp, sp, -482058; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill2059; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill2060; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill2061; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill2062; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill2063; RV64I-NEXT: mv s0, a22064; RV64I-NEXT: mv s1, a02065; RV64I-NEXT: lui a0, 162066; RV64I-NEXT: addi s2, a0, -12067; RV64I-NEXT: and a0, a1, s22068; RV64I-NEXT: call __extendhfsf22069; RV64I-NEXT: li a1, 02070; RV64I-NEXT: call __addsf32071; RV64I-NEXT: call __truncsfhf22072; RV64I-NEXT: lui a1, 82073; RV64I-NEXT: xor s3, a0, a12074; RV64I-NEXT: and a0, s1, s22075; RV64I-NEXT: call __extendhfsf22076; RV64I-NEXT: mv s1, a02077; RV64I-NEXT: and a0, s0, s22078; RV64I-NEXT: call __extendhfsf22079; RV64I-NEXT: mv s0, a02080; RV64I-NEXT: and a0, s3, s22081; RV64I-NEXT: call __extendhfsf22082; RV64I-NEXT: mv a1, a02083; RV64I-NEXT: mv a0, s12084; RV64I-NEXT: mv a2, s02085; RV64I-NEXT: call fmaf2086; RV64I-NEXT: call __truncsfhf22087; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload2088; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload2089; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload2090; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload2091; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload2092; RV64I-NEXT: addi sp, sp, 482093; RV64I-NEXT: ret2094;2095; CHECKIZFHMIN-LABEL: fnmsub_h_2:2096; CHECKIZFHMIN: # %bb.0:2097; CHECKIZFHMIN-NEXT: fcvt.s.h fa5, fa12098; CHECKIZFHMIN-NEXT: fmv.w.x fa4, zero2099; CHECKIZFHMIN-NEXT: lui a0, 10485682100; CHECKIZFHMIN-NEXT: fcvt.s.h fa3, fa22101; CHECKIZFHMIN-NEXT: fadd.s fa5, fa5, fa42102; CHECKIZFHMIN-NEXT: fcvt.h.s fa5, fa52103; CHECKIZFHMIN-NEXT: fmv.x.h a1, fa52104; CHECKIZFHMIN-NEXT: xor a0, a1, a02105; CHECKIZFHMIN-NEXT: fmv.h.x fa5, a02106; CHECKIZFHMIN-NEXT: fcvt.s.h fa5, fa52107; CHECKIZFHMIN-NEXT: fcvt.s.h fa4, fa02108; CHECKIZFHMIN-NEXT: fmadd.s fa5, fa4, fa5, fa32109; CHECKIZFHMIN-NEXT: fcvt.h.s fa0, fa52110; CHECKIZFHMIN-NEXT: ret2111;2112; CHECKIZHINXMIN-LABEL: fnmsub_h_2:2113; CHECKIZHINXMIN: # %bb.0:2114; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a12115; CHECKIZHINXMIN-NEXT: lui a3, 10485682116; CHECKIZHINXMIN-NEXT: fcvt.s.h a2, a22117; CHECKIZHINXMIN-NEXT: fadd.s a1, a1, zero2118; CHECKIZHINXMIN-NEXT: fcvt.h.s a1, a12119; CHECKIZHINXMIN-NEXT: xor a1, a1, a32120; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a12121; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a02122; CHECKIZHINXMIN-NEXT: fmadd.s a0, a0, a1, a22123; CHECKIZHINXMIN-NEXT: fcvt.h.s a0, a02124; CHECKIZHINXMIN-NEXT: ret2125 %b_ = fadd half 0.0, %b2126 %negb = fsub half -0.0, %b_2127 %1 = call half @llvm.fma.f16(half %a, half %negb, half %c)2128 ret half %12129}2130 2131define half @fmadd_h_contract(half %a, half %b, half %c) nounwind {2132; CHECKIZFH-LABEL: fmadd_h_contract:2133; CHECKIZFH: # %bb.0:2134; CHECKIZFH-NEXT: fmadd.h fa0, fa0, fa1, fa22135; CHECKIZFH-NEXT: ret2136;2137; CHECKIZHINX-LABEL: fmadd_h_contract:2138; CHECKIZHINX: # %bb.0:2139; CHECKIZHINX-NEXT: fmadd.h a0, a0, a1, a22140; CHECKIZHINX-NEXT: ret2141;2142; RV32I-LABEL: fmadd_h_contract:2143; RV32I: # %bb.0:2144; RV32I-NEXT: addi sp, sp, -322145; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill2146; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill2147; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill2148; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill2149; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill2150; RV32I-NEXT: mv s0, a22151; RV32I-NEXT: mv s1, a12152; RV32I-NEXT: lui a1, 162153; RV32I-NEXT: addi s3, a1, -12154; RV32I-NEXT: and a0, a0, s32155; RV32I-NEXT: call __extendhfsf22156; RV32I-NEXT: mv s2, a02157; RV32I-NEXT: and a0, s1, s32158; RV32I-NEXT: call __extendhfsf22159; RV32I-NEXT: mv a1, a02160; RV32I-NEXT: mv a0, s22161; RV32I-NEXT: call __mulsf32162; RV32I-NEXT: call __truncsfhf22163; RV32I-NEXT: mv s1, a02164; RV32I-NEXT: and a0, s0, s32165; RV32I-NEXT: call __extendhfsf22166; RV32I-NEXT: mv s0, a02167; RV32I-NEXT: and a0, s1, s32168; RV32I-NEXT: call __extendhfsf22169; RV32I-NEXT: mv a1, s02170; RV32I-NEXT: call __addsf32171; RV32I-NEXT: call __truncsfhf22172; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload2173; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload2174; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload2175; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload2176; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload2177; RV32I-NEXT: addi sp, sp, 322178; RV32I-NEXT: ret2179;2180; RV64I-LABEL: fmadd_h_contract:2181; RV64I: # %bb.0:2182; RV64I-NEXT: addi sp, sp, -482183; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill2184; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill2185; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill2186; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill2187; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill2188; RV64I-NEXT: mv s0, a22189; RV64I-NEXT: mv s1, a12190; RV64I-NEXT: lui a1, 162191; RV64I-NEXT: addi s3, a1, -12192; RV64I-NEXT: and a0, a0, s32193; RV64I-NEXT: call __extendhfsf22194; RV64I-NEXT: mv s2, a02195; RV64I-NEXT: and a0, s1, s32196; RV64I-NEXT: call __extendhfsf22197; RV64I-NEXT: mv a1, a02198; RV64I-NEXT: mv a0, s22199; RV64I-NEXT: call __mulsf32200; RV64I-NEXT: call __truncsfhf22201; RV64I-NEXT: mv s1, a02202; RV64I-NEXT: and a0, s0, s32203; RV64I-NEXT: call __extendhfsf22204; RV64I-NEXT: mv s0, a02205; RV64I-NEXT: and a0, s1, s32206; RV64I-NEXT: call __extendhfsf22207; RV64I-NEXT: mv a1, s02208; RV64I-NEXT: call __addsf32209; RV64I-NEXT: call __truncsfhf22210; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload2211; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload2212; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload2213; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload2214; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload2215; RV64I-NEXT: addi sp, sp, 482216; RV64I-NEXT: ret2217;2218; CHECKIZFHMIN-LABEL: fmadd_h_contract:2219; CHECKIZFHMIN: # %bb.0:2220; CHECKIZFHMIN-NEXT: fcvt.s.h fa5, fa12221; CHECKIZFHMIN-NEXT: fcvt.s.h fa4, fa02222; CHECKIZFHMIN-NEXT: fmul.s fa5, fa4, fa52223; CHECKIZFHMIN-NEXT: fcvt.h.s fa5, fa52224; CHECKIZFHMIN-NEXT: fcvt.s.h fa5, fa52225; CHECKIZFHMIN-NEXT: fcvt.s.h fa4, fa22226; CHECKIZFHMIN-NEXT: fadd.s fa5, fa5, fa42227; CHECKIZFHMIN-NEXT: fcvt.h.s fa0, fa52228; CHECKIZFHMIN-NEXT: ret2229;2230; CHECKIZHINXMIN-LABEL: fmadd_h_contract:2231; CHECKIZHINXMIN: # %bb.0:2232; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a12233; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a02234; CHECKIZHINXMIN-NEXT: fmul.s a0, a0, a12235; CHECKIZHINXMIN-NEXT: fcvt.h.s a0, a02236; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a02237; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a22238; CHECKIZHINXMIN-NEXT: fadd.s a0, a0, a12239; CHECKIZHINXMIN-NEXT: fcvt.h.s a0, a02240; CHECKIZHINXMIN-NEXT: ret2241 %1 = fmul contract half %a, %b2242 %2 = fadd contract half %1, %c2243 ret half %22244}2245 2246define half @fmsub_h_contract(half %a, half %b, half %c) nounwind {2247; CHECKIZFH-LABEL: fmsub_h_contract:2248; CHECKIZFH: # %bb.0:2249; CHECKIZFH-NEXT: fmv.h.x fa5, zero2250; CHECKIZFH-NEXT: fadd.h fa5, fa2, fa52251; CHECKIZFH-NEXT: fmsub.h fa0, fa0, fa1, fa52252; CHECKIZFH-NEXT: ret2253;2254; CHECKIZHINX-LABEL: fmsub_h_contract:2255; CHECKIZHINX: # %bb.0:2256; CHECKIZHINX-NEXT: fadd.h a2, a2, zero2257; CHECKIZHINX-NEXT: fmsub.h a0, a0, a1, a22258; CHECKIZHINX-NEXT: ret2259;2260; RV32I-LABEL: fmsub_h_contract:2261; RV32I: # %bb.0:2262; RV32I-NEXT: addi sp, sp, -322263; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill2264; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill2265; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill2266; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill2267; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill2268; RV32I-NEXT: mv s0, a12269; RV32I-NEXT: mv s1, a02270; RV32I-NEXT: lui a0, 162271; RV32I-NEXT: addi s3, a0, -12272; RV32I-NEXT: and a0, a2, s32273; RV32I-NEXT: call __extendhfsf22274; RV32I-NEXT: li a1, 02275; RV32I-NEXT: call __addsf32276; RV32I-NEXT: call __truncsfhf22277; RV32I-NEXT: mv s2, a02278; RV32I-NEXT: and a0, s1, s32279; RV32I-NEXT: call __extendhfsf22280; RV32I-NEXT: mv s1, a02281; RV32I-NEXT: and a0, s0, s32282; RV32I-NEXT: call __extendhfsf22283; RV32I-NEXT: mv a1, a02284; RV32I-NEXT: mv a0, s12285; RV32I-NEXT: call __mulsf32286; RV32I-NEXT: call __truncsfhf22287; RV32I-NEXT: and a0, a0, s32288; RV32I-NEXT: call __extendhfsf22289; RV32I-NEXT: mv s0, a02290; RV32I-NEXT: and a0, s2, s32291; RV32I-NEXT: call __extendhfsf22292; RV32I-NEXT: mv a1, a02293; RV32I-NEXT: mv a0, s02294; RV32I-NEXT: call __subsf32295; RV32I-NEXT: call __truncsfhf22296; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload2297; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload2298; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload2299; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload2300; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload2301; RV32I-NEXT: addi sp, sp, 322302; RV32I-NEXT: ret2303;2304; RV64I-LABEL: fmsub_h_contract:2305; RV64I: # %bb.0:2306; RV64I-NEXT: addi sp, sp, -482307; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill2308; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill2309; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill2310; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill2311; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill2312; RV64I-NEXT: mv s0, a12313; RV64I-NEXT: mv s1, a02314; RV64I-NEXT: lui a0, 162315; RV64I-NEXT: addi s3, a0, -12316; RV64I-NEXT: and a0, a2, s32317; RV64I-NEXT: call __extendhfsf22318; RV64I-NEXT: li a1, 02319; RV64I-NEXT: call __addsf32320; RV64I-NEXT: call __truncsfhf22321; RV64I-NEXT: mv s2, a02322; RV64I-NEXT: and a0, s1, s32323; RV64I-NEXT: call __extendhfsf22324; RV64I-NEXT: mv s1, a02325; RV64I-NEXT: and a0, s0, s32326; RV64I-NEXT: call __extendhfsf22327; RV64I-NEXT: mv a1, a02328; RV64I-NEXT: mv a0, s12329; RV64I-NEXT: call __mulsf32330; RV64I-NEXT: call __truncsfhf22331; RV64I-NEXT: and a0, a0, s32332; RV64I-NEXT: call __extendhfsf22333; RV64I-NEXT: mv s0, a02334; RV64I-NEXT: and a0, s2, s32335; RV64I-NEXT: call __extendhfsf22336; RV64I-NEXT: mv a1, a02337; RV64I-NEXT: mv a0, s02338; RV64I-NEXT: call __subsf32339; RV64I-NEXT: call __truncsfhf22340; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload2341; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload2342; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload2343; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload2344; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload2345; RV64I-NEXT: addi sp, sp, 482346; RV64I-NEXT: ret2347;2348; CHECKIZFHMIN-LABEL: fmsub_h_contract:2349; CHECKIZFHMIN: # %bb.0:2350; CHECKIZFHMIN-NEXT: fcvt.s.h fa5, fa22351; CHECKIZFHMIN-NEXT: fmv.w.x fa4, zero2352; CHECKIZFHMIN-NEXT: fcvt.s.h fa3, fa12353; CHECKIZFHMIN-NEXT: fcvt.s.h fa2, fa02354; CHECKIZFHMIN-NEXT: fadd.s fa5, fa5, fa42355; CHECKIZFHMIN-NEXT: fmul.s fa4, fa2, fa32356; CHECKIZFHMIN-NEXT: fcvt.h.s fa5, fa52357; CHECKIZFHMIN-NEXT: fcvt.h.s fa4, fa42358; CHECKIZFHMIN-NEXT: fcvt.s.h fa5, fa52359; CHECKIZFHMIN-NEXT: fcvt.s.h fa4, fa42360; CHECKIZFHMIN-NEXT: fsub.s fa5, fa4, fa52361; CHECKIZFHMIN-NEXT: fcvt.h.s fa0, fa52362; CHECKIZFHMIN-NEXT: ret2363;2364; CHECKIZHINXMIN-LABEL: fmsub_h_contract:2365; CHECKIZHINXMIN: # %bb.0:2366; CHECKIZHINXMIN-NEXT: fcvt.s.h a2, a22367; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a12368; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a02369; CHECKIZHINXMIN-NEXT: fadd.s a2, a2, zero2370; CHECKIZHINXMIN-NEXT: fmul.s a0, a0, a12371; CHECKIZHINXMIN-NEXT: fcvt.h.s a1, a22372; CHECKIZHINXMIN-NEXT: fcvt.h.s a0, a02373; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a12374; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a02375; CHECKIZHINXMIN-NEXT: fsub.s a0, a0, a12376; CHECKIZHINXMIN-NEXT: fcvt.h.s a0, a02377; CHECKIZHINXMIN-NEXT: ret2378 %c_ = fadd half 0.0, %c ; avoid negation using xor2379 %1 = fmul contract half %a, %b2380 %2 = fsub contract half %1, %c_2381 ret half %22382}2383 2384define half @fnmadd_h_contract(half %a, half %b, half %c) nounwind {2385; CHECKIZFH-LABEL: fnmadd_h_contract:2386; CHECKIZFH: # %bb.0:2387; CHECKIZFH-NEXT: fmv.h.x fa5, zero2388; CHECKIZFH-NEXT: fadd.h fa4, fa0, fa52389; CHECKIZFH-NEXT: fadd.h fa3, fa1, fa52390; CHECKIZFH-NEXT: fadd.h fa5, fa2, fa52391; CHECKIZFH-NEXT: fnmadd.h fa0, fa4, fa3, fa52392; CHECKIZFH-NEXT: ret2393;2394; CHECKIZHINX-LABEL: fnmadd_h_contract:2395; CHECKIZHINX: # %bb.0:2396; CHECKIZHINX-NEXT: fadd.h a0, a0, zero2397; CHECKIZHINX-NEXT: fadd.h a1, a1, zero2398; CHECKIZHINX-NEXT: fadd.h a2, a2, zero2399; CHECKIZHINX-NEXT: fnmadd.h a0, a0, a1, a22400; CHECKIZHINX-NEXT: ret2401;2402; RV32I-LABEL: fnmadd_h_contract:2403; RV32I: # %bb.0:2404; RV32I-NEXT: addi sp, sp, -322405; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill2406; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill2407; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill2408; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill2409; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill2410; RV32I-NEXT: mv s0, a22411; RV32I-NEXT: mv s1, a12412; RV32I-NEXT: lui s3, 162413; RV32I-NEXT: addi s3, s3, -12414; RV32I-NEXT: and a0, a0, s32415; RV32I-NEXT: call __extendhfsf22416; RV32I-NEXT: li a1, 02417; RV32I-NEXT: call __addsf32418; RV32I-NEXT: call __truncsfhf22419; RV32I-NEXT: mv s2, a02420; RV32I-NEXT: and a0, s1, s32421; RV32I-NEXT: call __extendhfsf22422; RV32I-NEXT: li a1, 02423; RV32I-NEXT: call __addsf32424; RV32I-NEXT: call __truncsfhf22425; RV32I-NEXT: mv s1, a02426; RV32I-NEXT: and a0, s0, s32427; RV32I-NEXT: call __extendhfsf22428; RV32I-NEXT: li a1, 02429; RV32I-NEXT: call __addsf32430; RV32I-NEXT: call __truncsfhf22431; RV32I-NEXT: mv s0, a02432; RV32I-NEXT: and a0, s2, s32433; RV32I-NEXT: call __extendhfsf22434; RV32I-NEXT: mv s2, a02435; RV32I-NEXT: and a0, s1, s32436; RV32I-NEXT: call __extendhfsf22437; RV32I-NEXT: mv a1, a02438; RV32I-NEXT: mv a0, s22439; RV32I-NEXT: call __mulsf32440; RV32I-NEXT: call __truncsfhf22441; RV32I-NEXT: lui a1, 82442; RV32I-NEXT: xor s1, a0, a12443; RV32I-NEXT: and a0, s0, s32444; RV32I-NEXT: call __extendhfsf22445; RV32I-NEXT: mv s0, a02446; RV32I-NEXT: and a0, s1, s32447; RV32I-NEXT: call __extendhfsf22448; RV32I-NEXT: mv a1, s02449; RV32I-NEXT: call __subsf32450; RV32I-NEXT: call __truncsfhf22451; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload2452; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload2453; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload2454; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload2455; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload2456; RV32I-NEXT: addi sp, sp, 322457; RV32I-NEXT: ret2458;2459; RV64I-LABEL: fnmadd_h_contract:2460; RV64I: # %bb.0:2461; RV64I-NEXT: addi sp, sp, -482462; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill2463; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill2464; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill2465; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill2466; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill2467; RV64I-NEXT: mv s0, a22468; RV64I-NEXT: mv s1, a12469; RV64I-NEXT: lui s3, 162470; RV64I-NEXT: addi s3, s3, -12471; RV64I-NEXT: and a0, a0, s32472; RV64I-NEXT: call __extendhfsf22473; RV64I-NEXT: li a1, 02474; RV64I-NEXT: call __addsf32475; RV64I-NEXT: call __truncsfhf22476; RV64I-NEXT: mv s2, a02477; RV64I-NEXT: and a0, s1, s32478; RV64I-NEXT: call __extendhfsf22479; RV64I-NEXT: li a1, 02480; RV64I-NEXT: call __addsf32481; RV64I-NEXT: call __truncsfhf22482; RV64I-NEXT: mv s1, a02483; RV64I-NEXT: and a0, s0, s32484; RV64I-NEXT: call __extendhfsf22485; RV64I-NEXT: li a1, 02486; RV64I-NEXT: call __addsf32487; RV64I-NEXT: call __truncsfhf22488; RV64I-NEXT: mv s0, a02489; RV64I-NEXT: and a0, s2, s32490; RV64I-NEXT: call __extendhfsf22491; RV64I-NEXT: mv s2, a02492; RV64I-NEXT: and a0, s1, s32493; RV64I-NEXT: call __extendhfsf22494; RV64I-NEXT: mv a1, a02495; RV64I-NEXT: mv a0, s22496; RV64I-NEXT: call __mulsf32497; RV64I-NEXT: call __truncsfhf22498; RV64I-NEXT: lui a1, 82499; RV64I-NEXT: xor s1, a0, a12500; RV64I-NEXT: and a0, s0, s32501; RV64I-NEXT: call __extendhfsf22502; RV64I-NEXT: mv s0, a02503; RV64I-NEXT: and a0, s1, s32504; RV64I-NEXT: call __extendhfsf22505; RV64I-NEXT: mv a1, s02506; RV64I-NEXT: call __subsf32507; RV64I-NEXT: call __truncsfhf22508; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload2509; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload2510; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload2511; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload2512; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload2513; RV64I-NEXT: addi sp, sp, 482514; RV64I-NEXT: ret2515;2516; CHECKIZFHMIN-LABEL: fnmadd_h_contract:2517; CHECKIZFHMIN: # %bb.0:2518; CHECKIZFHMIN-NEXT: fcvt.s.h fa5, fa02519; CHECKIZFHMIN-NEXT: fmv.w.x fa4, zero2520; CHECKIZFHMIN-NEXT: fcvt.s.h fa3, fa12521; CHECKIZFHMIN-NEXT: fcvt.s.h fa2, fa22522; CHECKIZFHMIN-NEXT: lui a0, 10485682523; CHECKIZFHMIN-NEXT: fadd.s fa5, fa5, fa42524; CHECKIZFHMIN-NEXT: fadd.s fa3, fa3, fa42525; CHECKIZFHMIN-NEXT: fadd.s fa4, fa2, fa42526; CHECKIZFHMIN-NEXT: fcvt.h.s fa5, fa52527; CHECKIZFHMIN-NEXT: fcvt.h.s fa3, fa32528; CHECKIZFHMIN-NEXT: fcvt.h.s fa4, fa42529; CHECKIZFHMIN-NEXT: fcvt.s.h fa3, fa32530; CHECKIZFHMIN-NEXT: fcvt.s.h fa5, fa52531; CHECKIZFHMIN-NEXT: fmul.s fa5, fa5, fa32532; CHECKIZFHMIN-NEXT: fcvt.h.s fa5, fa52533; CHECKIZFHMIN-NEXT: fmv.x.h a1, fa52534; CHECKIZFHMIN-NEXT: xor a0, a1, a02535; CHECKIZFHMIN-NEXT: fmv.h.x fa5, a02536; CHECKIZFHMIN-NEXT: fcvt.s.h fa5, fa52537; CHECKIZFHMIN-NEXT: fcvt.s.h fa4, fa42538; CHECKIZFHMIN-NEXT: fsub.s fa5, fa5, fa42539; CHECKIZFHMIN-NEXT: fcvt.h.s fa0, fa52540; CHECKIZFHMIN-NEXT: ret2541;2542; CHECKIZHINXMIN-LABEL: fnmadd_h_contract:2543; CHECKIZHINXMIN: # %bb.0:2544; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a02545; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a12546; CHECKIZHINXMIN-NEXT: fcvt.s.h a2, a22547; CHECKIZHINXMIN-NEXT: fadd.s a0, a0, zero2548; CHECKIZHINXMIN-NEXT: fadd.s a1, a1, zero2549; CHECKIZHINXMIN-NEXT: fcvt.h.s a0, a02550; CHECKIZHINXMIN-NEXT: fcvt.h.s a1, a12551; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a12552; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a02553; CHECKIZHINXMIN-NEXT: fmul.s a0, a0, a12554; CHECKIZHINXMIN-NEXT: lui a1, 10485682555; CHECKIZHINXMIN-NEXT: fadd.s a2, a2, zero2556; CHECKIZHINXMIN-NEXT: fcvt.h.s a2, a22557; CHECKIZHINXMIN-NEXT: fcvt.h.s a0, a02558; CHECKIZHINXMIN-NEXT: xor a0, a0, a12559; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a02560; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a22561; CHECKIZHINXMIN-NEXT: fsub.s a0, a0, a12562; CHECKIZHINXMIN-NEXT: fcvt.h.s a0, a02563; CHECKIZHINXMIN-NEXT: ret2564 %a_ = fadd half 0.0, %a ; avoid negation using xor2565 %b_ = fadd half 0.0, %b ; avoid negation using xor2566 %c_ = fadd half 0.0, %c ; avoid negation using xor2567 %1 = fmul contract half %a_, %b_2568 %2 = fneg half %12569 %3 = fsub contract half %2, %c_2570 ret half %32571}2572 2573define half @fnmsub_h_contract(half %a, half %b, half %c) nounwind {2574; CHECKIZFH-LABEL: fnmsub_h_contract:2575; CHECKIZFH: # %bb.0:2576; CHECKIZFH-NEXT: fmv.h.x fa5, zero2577; CHECKIZFH-NEXT: fadd.h fa4, fa0, fa52578; CHECKIZFH-NEXT: fadd.h fa5, fa1, fa52579; CHECKIZFH-NEXT: fnmsub.h fa0, fa4, fa5, fa22580; CHECKIZFH-NEXT: ret2581;2582; CHECKIZHINX-LABEL: fnmsub_h_contract:2583; CHECKIZHINX: # %bb.0:2584; CHECKIZHINX-NEXT: fadd.h a0, a0, zero2585; CHECKIZHINX-NEXT: fadd.h a1, a1, zero2586; CHECKIZHINX-NEXT: fnmsub.h a0, a0, a1, a22587; CHECKIZHINX-NEXT: ret2588;2589; RV32I-LABEL: fnmsub_h_contract:2590; RV32I: # %bb.0:2591; RV32I-NEXT: addi sp, sp, -322592; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill2593; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill2594; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill2595; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill2596; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill2597; RV32I-NEXT: mv s0, a22598; RV32I-NEXT: mv s1, a12599; RV32I-NEXT: lui s3, 162600; RV32I-NEXT: addi s3, s3, -12601; RV32I-NEXT: and a0, a0, s32602; RV32I-NEXT: call __extendhfsf22603; RV32I-NEXT: li a1, 02604; RV32I-NEXT: call __addsf32605; RV32I-NEXT: call __truncsfhf22606; RV32I-NEXT: mv s2, a02607; RV32I-NEXT: and a0, s1, s32608; RV32I-NEXT: call __extendhfsf22609; RV32I-NEXT: li a1, 02610; RV32I-NEXT: call __addsf32611; RV32I-NEXT: call __truncsfhf22612; RV32I-NEXT: mv s1, a02613; RV32I-NEXT: and a0, s2, s32614; RV32I-NEXT: call __extendhfsf22615; RV32I-NEXT: mv s2, a02616; RV32I-NEXT: and a0, s1, s32617; RV32I-NEXT: call __extendhfsf22618; RV32I-NEXT: mv a1, a02619; RV32I-NEXT: mv a0, s22620; RV32I-NEXT: call __mulsf32621; RV32I-NEXT: call __truncsfhf22622; RV32I-NEXT: mv s1, a02623; RV32I-NEXT: and a0, s0, s32624; RV32I-NEXT: call __extendhfsf22625; RV32I-NEXT: mv s0, a02626; RV32I-NEXT: and a0, s1, s32627; RV32I-NEXT: call __extendhfsf22628; RV32I-NEXT: mv a1, a02629; RV32I-NEXT: mv a0, s02630; RV32I-NEXT: call __subsf32631; RV32I-NEXT: call __truncsfhf22632; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload2633; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload2634; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload2635; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload2636; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload2637; RV32I-NEXT: addi sp, sp, 322638; RV32I-NEXT: ret2639;2640; RV64I-LABEL: fnmsub_h_contract:2641; RV64I: # %bb.0:2642; RV64I-NEXT: addi sp, sp, -482643; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill2644; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill2645; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill2646; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill2647; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill2648; RV64I-NEXT: mv s0, a22649; RV64I-NEXT: mv s1, a12650; RV64I-NEXT: lui s3, 162651; RV64I-NEXT: addi s3, s3, -12652; RV64I-NEXT: and a0, a0, s32653; RV64I-NEXT: call __extendhfsf22654; RV64I-NEXT: li a1, 02655; RV64I-NEXT: call __addsf32656; RV64I-NEXT: call __truncsfhf22657; RV64I-NEXT: mv s2, a02658; RV64I-NEXT: and a0, s1, s32659; RV64I-NEXT: call __extendhfsf22660; RV64I-NEXT: li a1, 02661; RV64I-NEXT: call __addsf32662; RV64I-NEXT: call __truncsfhf22663; RV64I-NEXT: mv s1, a02664; RV64I-NEXT: and a0, s2, s32665; RV64I-NEXT: call __extendhfsf22666; RV64I-NEXT: mv s2, a02667; RV64I-NEXT: and a0, s1, s32668; RV64I-NEXT: call __extendhfsf22669; RV64I-NEXT: mv a1, a02670; RV64I-NEXT: mv a0, s22671; RV64I-NEXT: call __mulsf32672; RV64I-NEXT: call __truncsfhf22673; RV64I-NEXT: mv s1, a02674; RV64I-NEXT: and a0, s0, s32675; RV64I-NEXT: call __extendhfsf22676; RV64I-NEXT: mv s0, a02677; RV64I-NEXT: and a0, s1, s32678; RV64I-NEXT: call __extendhfsf22679; RV64I-NEXT: mv a1, a02680; RV64I-NEXT: mv a0, s02681; RV64I-NEXT: call __subsf32682; RV64I-NEXT: call __truncsfhf22683; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload2684; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload2685; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload2686; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload2687; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload2688; RV64I-NEXT: addi sp, sp, 482689; RV64I-NEXT: ret2690;2691; CHECKIZFHMIN-LABEL: fnmsub_h_contract:2692; CHECKIZFHMIN: # %bb.0:2693; CHECKIZFHMIN-NEXT: fcvt.s.h fa5, fa02694; CHECKIZFHMIN-NEXT: fmv.w.x fa4, zero2695; CHECKIZFHMIN-NEXT: fcvt.s.h fa3, fa12696; CHECKIZFHMIN-NEXT: fadd.s fa5, fa5, fa42697; CHECKIZFHMIN-NEXT: fadd.s fa4, fa3, fa42698; CHECKIZFHMIN-NEXT: fcvt.h.s fa5, fa52699; CHECKIZFHMIN-NEXT: fcvt.h.s fa4, fa42700; CHECKIZFHMIN-NEXT: fcvt.s.h fa4, fa42701; CHECKIZFHMIN-NEXT: fcvt.s.h fa5, fa52702; CHECKIZFHMIN-NEXT: fmul.s fa5, fa5, fa42703; CHECKIZFHMIN-NEXT: fcvt.h.s fa5, fa52704; CHECKIZFHMIN-NEXT: fcvt.s.h fa5, fa52705; CHECKIZFHMIN-NEXT: fcvt.s.h fa4, fa22706; CHECKIZFHMIN-NEXT: fsub.s fa5, fa4, fa52707; CHECKIZFHMIN-NEXT: fcvt.h.s fa0, fa52708; CHECKIZFHMIN-NEXT: ret2709;2710; CHECKIZHINXMIN-LABEL: fnmsub_h_contract:2711; CHECKIZHINXMIN: # %bb.0:2712; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a02713; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a12714; CHECKIZHINXMIN-NEXT: fadd.s a0, a0, zero2715; CHECKIZHINXMIN-NEXT: fadd.s a1, a1, zero2716; CHECKIZHINXMIN-NEXT: fcvt.h.s a0, a02717; CHECKIZHINXMIN-NEXT: fcvt.h.s a1, a12718; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a12719; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a02720; CHECKIZHINXMIN-NEXT: fmul.s a0, a0, a12721; CHECKIZHINXMIN-NEXT: fcvt.h.s a0, a02722; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a02723; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a22724; CHECKIZHINXMIN-NEXT: fsub.s a0, a1, a02725; CHECKIZHINXMIN-NEXT: fcvt.h.s a0, a02726; CHECKIZHINXMIN-NEXT: ret2727 %a_ = fadd half 0.0, %a ; avoid negation using xor2728 %b_ = fadd half 0.0, %b ; avoid negation using xor2729 %1 = fmul contract half %a_, %b_2730 %2 = fsub contract half %c, %12731 ret half %22732}2733 2734define half @fsgnjx_f16(half %x, half %y) nounwind {2735; CHECKIZFH-LABEL: fsgnjx_f16:2736; CHECKIZFH: # %bb.0:2737; CHECKIZFH-NEXT: fsgnjx.h fa0, fa1, fa02738; CHECKIZFH-NEXT: ret2739;2740; CHECKIZHINX-LABEL: fsgnjx_f16:2741; CHECKIZHINX: # %bb.0:2742; CHECKIZHINX-NEXT: fsgnjx.h a0, a1, a02743; CHECKIZHINX-NEXT: ret2744;2745; RV32I-LABEL: fsgnjx_f16:2746; RV32I: # %bb.0:2747; RV32I-NEXT: addi sp, sp, -162748; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill2749; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill2750; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill2751; RV32I-NEXT: li a2, 152752; RV32I-NEXT: slli a2, a2, 102753; RV32I-NEXT: or s1, a0, a22754; RV32I-NEXT: slli a0, a1, 162755; RV32I-NEXT: srli a0, a0, 162756; RV32I-NEXT: call __extendhfsf22757; RV32I-NEXT: mv s0, a02758; RV32I-NEXT: lui a0, 122759; RV32I-NEXT: addi a0, a0, -10242760; RV32I-NEXT: and a0, s1, a02761; RV32I-NEXT: call __extendhfsf22762; RV32I-NEXT: mv a1, s02763; RV32I-NEXT: call __mulsf32764; RV32I-NEXT: call __truncsfhf22765; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload2766; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload2767; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload2768; RV32I-NEXT: addi sp, sp, 162769; RV32I-NEXT: ret2770;2771; RV64I-LABEL: fsgnjx_f16:2772; RV64I: # %bb.0:2773; RV64I-NEXT: addi sp, sp, -322774; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill2775; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill2776; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill2777; RV64I-NEXT: li a2, 152778; RV64I-NEXT: slli a2, a2, 102779; RV64I-NEXT: or s1, a0, a22780; RV64I-NEXT: slli a0, a1, 482781; RV64I-NEXT: srli a0, a0, 482782; RV64I-NEXT: call __extendhfsf22783; RV64I-NEXT: mv s0, a02784; RV64I-NEXT: lui a0, 122785; RV64I-NEXT: addi a0, a0, -10242786; RV64I-NEXT: and a0, s1, a02787; RV64I-NEXT: call __extendhfsf22788; RV64I-NEXT: mv a1, s02789; RV64I-NEXT: call __mulsf32790; RV64I-NEXT: call __truncsfhf22791; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload2792; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload2793; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload2794; RV64I-NEXT: addi sp, sp, 322795; RV64I-NEXT: ret2796;2797; CHECKIZFHMIN-LABEL: fsgnjx_f16:2798; CHECKIZFHMIN: # %bb.0:2799; CHECKIZFHMIN-NEXT: fmv.x.h a0, fa02800; CHECKIZFHMIN-NEXT: lui a1, 10485682801; CHECKIZFHMIN-NEXT: and a0, a0, a12802; CHECKIZFHMIN-NEXT: li a1, 152803; CHECKIZFHMIN-NEXT: slli a1, a1, 102804; CHECKIZFHMIN-NEXT: or a0, a0, a12805; CHECKIZFHMIN-NEXT: fmv.h.x fa5, a02806; CHECKIZFHMIN-NEXT: fcvt.s.h fa5, fa52807; CHECKIZFHMIN-NEXT: fcvt.s.h fa4, fa12808; CHECKIZFHMIN-NEXT: fmul.s fa5, fa5, fa42809; CHECKIZFHMIN-NEXT: fcvt.h.s fa0, fa52810; CHECKIZFHMIN-NEXT: ret2811;2812; CHECKIZHINXMIN-LABEL: fsgnjx_f16:2813; CHECKIZHINXMIN: # %bb.0:2814; CHECKIZHINXMIN-NEXT: # kill: def $x10_h killed $x10_h def $x102815; CHECKIZHINXMIN-NEXT: lui a2, 10485682816; CHECKIZHINXMIN-NEXT: and a0, a0, a22817; CHECKIZHINXMIN-NEXT: li a2, 152818; CHECKIZHINXMIN-NEXT: slli a2, a2, 102819; CHECKIZHINXMIN-NEXT: or a0, a0, a22820; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a02821; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a12822; CHECKIZHINXMIN-NEXT: fmul.s a0, a0, a12823; CHECKIZHINXMIN-NEXT: fcvt.h.s a0, a02824; CHECKIZHINXMIN-NEXT: ret2825 %z = call half @llvm.copysign.f16(half 1.0, half %x)2826 %mul = fmul half %z, %y2827 ret half %mul2828}2829