837 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv32 -mattr=+d -verify-machineinstrs < %s \3; RUN: -disable-strictnode-mutation -target-abi=ilp32d \4; RUN: | FileCheck -check-prefixes=CHECKIFD,RV32IFD %s5; RUN: llc -mtriple=riscv64 -mattr=+d -verify-machineinstrs < %s \6; RUN: -disable-strictnode-mutation -target-abi=lp64d \7; RUN: | FileCheck -check-prefixes=CHECKIFD,RV64IFD %s8; RUN: llc -mtriple=riscv32 -mattr=+zdinx -verify-machineinstrs < %s \9; RUN: -disable-strictnode-mutation -target-abi=ilp32 \10; RUN: | FileCheck -check-prefix=RV32IZFINXZDINX %s11; RUN: llc -mtriple=riscv64 -mattr=+zdinx -verify-machineinstrs < %s \12; RUN: -disable-strictnode-mutation -target-abi=lp64 \13; RUN: | FileCheck -check-prefix=RV64IZFINXZDINX %s14; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \15; RUN: -disable-strictnode-mutation | FileCheck -check-prefix=RV32I %s16; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \17; RUN: -disable-strictnode-mutation | FileCheck -check-prefix=RV64I %s18 19define double @fadd_d(double %a, double %b) nounwind strictfp {20; CHECKIFD-LABEL: fadd_d:21; CHECKIFD: # %bb.0:22; CHECKIFD-NEXT: fadd.d fa0, fa0, fa123; CHECKIFD-NEXT: ret24;25; RV32IZFINXZDINX-LABEL: fadd_d:26; RV32IZFINXZDINX: # %bb.0:27; RV32IZFINXZDINX-NEXT: fadd.d a0, a0, a228; RV32IZFINXZDINX-NEXT: ret29;30; RV64IZFINXZDINX-LABEL: fadd_d:31; RV64IZFINXZDINX: # %bb.0:32; RV64IZFINXZDINX-NEXT: fadd.d a0, a0, a133; RV64IZFINXZDINX-NEXT: ret34;35; RV32I-LABEL: fadd_d:36; RV32I: # %bb.0:37; RV32I-NEXT: addi sp, sp, -1638; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill39; RV32I-NEXT: call __adddf340; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload41; RV32I-NEXT: addi sp, sp, 1642; RV32I-NEXT: ret43;44; RV64I-LABEL: fadd_d:45; RV64I: # %bb.0:46; RV64I-NEXT: addi sp, sp, -1647; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill48; RV64I-NEXT: call __adddf349; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload50; RV64I-NEXT: addi sp, sp, 1651; RV64I-NEXT: ret52 %1 = call double @llvm.experimental.constrained.fadd.f64(double %a, double %b, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp53 ret double %154}55 56define double @fsub_d(double %a, double %b) nounwind strictfp {57; CHECKIFD-LABEL: fsub_d:58; CHECKIFD: # %bb.0:59; CHECKIFD-NEXT: fsub.d fa0, fa0, fa160; CHECKIFD-NEXT: ret61;62; RV32IZFINXZDINX-LABEL: fsub_d:63; RV32IZFINXZDINX: # %bb.0:64; RV32IZFINXZDINX-NEXT: fsub.d a0, a0, a265; RV32IZFINXZDINX-NEXT: ret66;67; RV64IZFINXZDINX-LABEL: fsub_d:68; RV64IZFINXZDINX: # %bb.0:69; RV64IZFINXZDINX-NEXT: fsub.d a0, a0, a170; RV64IZFINXZDINX-NEXT: ret71;72; RV32I-LABEL: fsub_d:73; RV32I: # %bb.0:74; RV32I-NEXT: addi sp, sp, -1675; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill76; RV32I-NEXT: call __subdf377; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload78; RV32I-NEXT: addi sp, sp, 1679; RV32I-NEXT: ret80;81; RV64I-LABEL: fsub_d:82; RV64I: # %bb.0:83; RV64I-NEXT: addi sp, sp, -1684; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill85; RV64I-NEXT: call __subdf386; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload87; RV64I-NEXT: addi sp, sp, 1688; RV64I-NEXT: ret89 %1 = call double @llvm.experimental.constrained.fsub.f64(double %a, double %b, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp90 ret double %191}92 93define double @fmul_d(double %a, double %b) nounwind strictfp {94; CHECKIFD-LABEL: fmul_d:95; CHECKIFD: # %bb.0:96; CHECKIFD-NEXT: fmul.d fa0, fa0, fa197; CHECKIFD-NEXT: ret98;99; RV32IZFINXZDINX-LABEL: fmul_d:100; RV32IZFINXZDINX: # %bb.0:101; RV32IZFINXZDINX-NEXT: fmul.d a0, a0, a2102; RV32IZFINXZDINX-NEXT: ret103;104; RV64IZFINXZDINX-LABEL: fmul_d:105; RV64IZFINXZDINX: # %bb.0:106; RV64IZFINXZDINX-NEXT: fmul.d a0, a0, a1107; RV64IZFINXZDINX-NEXT: ret108;109; RV32I-LABEL: fmul_d:110; RV32I: # %bb.0:111; RV32I-NEXT: addi sp, sp, -16112; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill113; RV32I-NEXT: call __muldf3114; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload115; RV32I-NEXT: addi sp, sp, 16116; RV32I-NEXT: ret117;118; RV64I-LABEL: fmul_d:119; RV64I: # %bb.0:120; RV64I-NEXT: addi sp, sp, -16121; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill122; RV64I-NEXT: call __muldf3123; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload124; RV64I-NEXT: addi sp, sp, 16125; RV64I-NEXT: ret126 %1 = call double @llvm.experimental.constrained.fmul.f64(double %a, double %b, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp127 ret double %1128}129 130define double @fdiv_d(double %a, double %b) nounwind strictfp {131; CHECKIFD-LABEL: fdiv_d:132; CHECKIFD: # %bb.0:133; CHECKIFD-NEXT: fdiv.d fa0, fa0, fa1134; CHECKIFD-NEXT: ret135;136; RV32IZFINXZDINX-LABEL: fdiv_d:137; RV32IZFINXZDINX: # %bb.0:138; RV32IZFINXZDINX-NEXT: fdiv.d a0, a0, a2139; RV32IZFINXZDINX-NEXT: ret140;141; RV64IZFINXZDINX-LABEL: fdiv_d:142; RV64IZFINXZDINX: # %bb.0:143; RV64IZFINXZDINX-NEXT: fdiv.d a0, a0, a1144; RV64IZFINXZDINX-NEXT: ret145;146; RV32I-LABEL: fdiv_d:147; RV32I: # %bb.0:148; RV32I-NEXT: addi sp, sp, -16149; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill150; RV32I-NEXT: call __divdf3151; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload152; RV32I-NEXT: addi sp, sp, 16153; RV32I-NEXT: ret154;155; RV64I-LABEL: fdiv_d:156; RV64I: # %bb.0:157; RV64I-NEXT: addi sp, sp, -16158; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill159; RV64I-NEXT: call __divdf3160; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload161; RV64I-NEXT: addi sp, sp, 16162; RV64I-NEXT: ret163 %1 = call double @llvm.experimental.constrained.fdiv.f64(double %a, double %b, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp164 ret double %1165}166 167define double @fsqrt_d(double %a) nounwind strictfp {168; CHECKIFD-LABEL: fsqrt_d:169; CHECKIFD: # %bb.0:170; CHECKIFD-NEXT: fsqrt.d fa0, fa0171; CHECKIFD-NEXT: ret172;173; RV32IZFINXZDINX-LABEL: fsqrt_d:174; RV32IZFINXZDINX: # %bb.0:175; RV32IZFINXZDINX-NEXT: fsqrt.d a0, a0176; RV32IZFINXZDINX-NEXT: ret177;178; RV64IZFINXZDINX-LABEL: fsqrt_d:179; RV64IZFINXZDINX: # %bb.0:180; RV64IZFINXZDINX-NEXT: fsqrt.d a0, a0181; RV64IZFINXZDINX-NEXT: ret182;183; RV32I-LABEL: fsqrt_d:184; RV32I: # %bb.0:185; RV32I-NEXT: addi sp, sp, -16186; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill187; RV32I-NEXT: call sqrt188; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload189; RV32I-NEXT: addi sp, sp, 16190; RV32I-NEXT: ret191;192; RV64I-LABEL: fsqrt_d:193; RV64I: # %bb.0:194; RV64I-NEXT: addi sp, sp, -16195; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill196; RV64I-NEXT: call sqrt197; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload198; RV64I-NEXT: addi sp, sp, 16199; RV64I-NEXT: ret200 %1 = call double @llvm.experimental.constrained.sqrt.f64(double %a, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp201 ret double %1202}203 204define double @fmin_d(double %a, double %b) nounwind strictfp {205; RV32IFD-LABEL: fmin_d:206; RV32IFD: # %bb.0:207; RV32IFD-NEXT: addi sp, sp, -16208; RV32IFD-NEXT: sw ra, 12(sp) # 4-byte Folded Spill209; RV32IFD-NEXT: call fmin210; RV32IFD-NEXT: lw ra, 12(sp) # 4-byte Folded Reload211; RV32IFD-NEXT: addi sp, sp, 16212; RV32IFD-NEXT: ret213;214; RV64IFD-LABEL: fmin_d:215; RV64IFD: # %bb.0:216; RV64IFD-NEXT: addi sp, sp, -16217; RV64IFD-NEXT: sd ra, 8(sp) # 8-byte Folded Spill218; RV64IFD-NEXT: call fmin219; RV64IFD-NEXT: ld ra, 8(sp) # 8-byte Folded Reload220; RV64IFD-NEXT: addi sp, sp, 16221; RV64IFD-NEXT: ret222;223; RV32IZFINXZDINX-LABEL: fmin_d:224; RV32IZFINXZDINX: # %bb.0:225; RV32IZFINXZDINX-NEXT: addi sp, sp, -16226; RV32IZFINXZDINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill227; RV32IZFINXZDINX-NEXT: call fmin228; RV32IZFINXZDINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload229; RV32IZFINXZDINX-NEXT: addi sp, sp, 16230; RV32IZFINXZDINX-NEXT: ret231;232; RV64IZFINXZDINX-LABEL: fmin_d:233; RV64IZFINXZDINX: # %bb.0:234; RV64IZFINXZDINX-NEXT: addi sp, sp, -16235; RV64IZFINXZDINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill236; RV64IZFINXZDINX-NEXT: call fmin237; RV64IZFINXZDINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload238; RV64IZFINXZDINX-NEXT: addi sp, sp, 16239; RV64IZFINXZDINX-NEXT: ret240;241; RV32I-LABEL: fmin_d:242; RV32I: # %bb.0:243; RV32I-NEXT: addi sp, sp, -16244; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill245; RV32I-NEXT: call fmin246; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload247; RV32I-NEXT: addi sp, sp, 16248; RV32I-NEXT: ret249;250; RV64I-LABEL: fmin_d:251; RV64I: # %bb.0:252; RV64I-NEXT: addi sp, sp, -16253; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill254; RV64I-NEXT: call fmin255; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload256; RV64I-NEXT: addi sp, sp, 16257; RV64I-NEXT: ret258 %1 = call double @llvm.experimental.constrained.minnum.f64(double %a, double %b, metadata !"fpexcept.strict") strictfp259 ret double %1260}261 262define double @fmax_d(double %a, double %b) nounwind strictfp {263; RV32IFD-LABEL: fmax_d:264; RV32IFD: # %bb.0:265; RV32IFD-NEXT: addi sp, sp, -16266; RV32IFD-NEXT: sw ra, 12(sp) # 4-byte Folded Spill267; RV32IFD-NEXT: call fmax268; RV32IFD-NEXT: lw ra, 12(sp) # 4-byte Folded Reload269; RV32IFD-NEXT: addi sp, sp, 16270; RV32IFD-NEXT: ret271;272; RV64IFD-LABEL: fmax_d:273; RV64IFD: # %bb.0:274; RV64IFD-NEXT: addi sp, sp, -16275; RV64IFD-NEXT: sd ra, 8(sp) # 8-byte Folded Spill276; RV64IFD-NEXT: call fmax277; RV64IFD-NEXT: ld ra, 8(sp) # 8-byte Folded Reload278; RV64IFD-NEXT: addi sp, sp, 16279; RV64IFD-NEXT: ret280;281; RV32IZFINXZDINX-LABEL: fmax_d:282; RV32IZFINXZDINX: # %bb.0:283; RV32IZFINXZDINX-NEXT: addi sp, sp, -16284; RV32IZFINXZDINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill285; RV32IZFINXZDINX-NEXT: call fmax286; RV32IZFINXZDINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload287; RV32IZFINXZDINX-NEXT: addi sp, sp, 16288; RV32IZFINXZDINX-NEXT: ret289;290; RV64IZFINXZDINX-LABEL: fmax_d:291; RV64IZFINXZDINX: # %bb.0:292; RV64IZFINXZDINX-NEXT: addi sp, sp, -16293; RV64IZFINXZDINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill294; RV64IZFINXZDINX-NEXT: call fmax295; RV64IZFINXZDINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload296; RV64IZFINXZDINX-NEXT: addi sp, sp, 16297; RV64IZFINXZDINX-NEXT: ret298;299; RV32I-LABEL: fmax_d:300; RV32I: # %bb.0:301; RV32I-NEXT: addi sp, sp, -16302; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill303; RV32I-NEXT: call fmax304; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload305; RV32I-NEXT: addi sp, sp, 16306; RV32I-NEXT: ret307;308; RV64I-LABEL: fmax_d:309; RV64I: # %bb.0:310; RV64I-NEXT: addi sp, sp, -16311; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill312; RV64I-NEXT: call fmax313; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload314; RV64I-NEXT: addi sp, sp, 16315; RV64I-NEXT: ret316 %1 = call double @llvm.experimental.constrained.maxnum.f64(double %a, double %b, metadata !"fpexcept.strict") strictfp317 ret double %1318}319 320define double @fmadd_d(double %a, double %b, double %c) nounwind strictfp {321; CHECKIFD-LABEL: fmadd_d:322; CHECKIFD: # %bb.0:323; CHECKIFD-NEXT: fmadd.d fa0, fa0, fa1, fa2324; CHECKIFD-NEXT: ret325;326; RV32IZFINXZDINX-LABEL: fmadd_d:327; RV32IZFINXZDINX: # %bb.0:328; RV32IZFINXZDINX-NEXT: fmadd.d a0, a0, a2, a4329; RV32IZFINXZDINX-NEXT: ret330;331; RV64IZFINXZDINX-LABEL: fmadd_d:332; RV64IZFINXZDINX: # %bb.0:333; RV64IZFINXZDINX-NEXT: fmadd.d a0, a0, a1, a2334; RV64IZFINXZDINX-NEXT: ret335;336; RV32I-LABEL: fmadd_d:337; RV32I: # %bb.0:338; RV32I-NEXT: addi sp, sp, -16339; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill340; RV32I-NEXT: call fma341; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload342; RV32I-NEXT: addi sp, sp, 16343; RV32I-NEXT: ret344;345; RV64I-LABEL: fmadd_d:346; RV64I: # %bb.0:347; RV64I-NEXT: addi sp, sp, -16348; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill349; RV64I-NEXT: call fma350; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload351; RV64I-NEXT: addi sp, sp, 16352; RV64I-NEXT: ret353 %1 = call double @llvm.experimental.constrained.fma.f64(double %a, double %b, double %c, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp354 ret double %1355}356 357define double @fmsub_d(double %a, double %b, double %c) nounwind strictfp {358; RV32IFD-LABEL: fmsub_d:359; RV32IFD: # %bb.0:360; RV32IFD-NEXT: fcvt.d.w fa5, zero361; RV32IFD-NEXT: fadd.d fa5, fa2, fa5362; RV32IFD-NEXT: fmsub.d fa0, fa0, fa1, fa5363; RV32IFD-NEXT: ret364;365; RV64IFD-LABEL: fmsub_d:366; RV64IFD: # %bb.0:367; RV64IFD-NEXT: fmv.d.x fa5, zero368; RV64IFD-NEXT: fadd.d fa5, fa2, fa5369; RV64IFD-NEXT: fmsub.d fa0, fa0, fa1, fa5370; RV64IFD-NEXT: ret371;372; RV32IZFINXZDINX-LABEL: fmsub_d:373; RV32IZFINXZDINX: # %bb.0:374; RV32IZFINXZDINX-NEXT: fadd.d a4, a4, zero375; RV32IZFINXZDINX-NEXT: fmsub.d a0, a0, a2, a4376; RV32IZFINXZDINX-NEXT: ret377;378; RV64IZFINXZDINX-LABEL: fmsub_d:379; RV64IZFINXZDINX: # %bb.0:380; RV64IZFINXZDINX-NEXT: fadd.d a2, a2, zero381; RV64IZFINXZDINX-NEXT: fmsub.d a0, a0, a1, a2382; RV64IZFINXZDINX-NEXT: ret383;384; RV32I-LABEL: fmsub_d:385; RV32I: # %bb.0:386; RV32I-NEXT: addi sp, sp, -32387; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill388; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill389; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill390; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill391; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill392; RV32I-NEXT: mv s0, a3393; RV32I-NEXT: mv s1, a2394; RV32I-NEXT: mv s2, a1395; RV32I-NEXT: mv s3, a0396; RV32I-NEXT: mv a0, a4397; RV32I-NEXT: mv a1, a5398; RV32I-NEXT: li a2, 0399; RV32I-NEXT: li a3, 0400; RV32I-NEXT: call __adddf3401; RV32I-NEXT: mv a4, a0402; RV32I-NEXT: lui a5, 524288403; RV32I-NEXT: xor a5, a1, a5404; RV32I-NEXT: mv a0, s3405; RV32I-NEXT: mv a1, s2406; RV32I-NEXT: mv a2, s1407; RV32I-NEXT: mv a3, s0408; RV32I-NEXT: call fma409; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload410; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload411; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload412; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload413; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload414; RV32I-NEXT: addi sp, sp, 32415; RV32I-NEXT: ret416;417; RV64I-LABEL: fmsub_d:418; RV64I: # %bb.0:419; RV64I-NEXT: addi sp, sp, -32420; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill421; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill422; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill423; RV64I-NEXT: mv s0, a1424; RV64I-NEXT: mv s1, a0425; RV64I-NEXT: mv a0, a2426; RV64I-NEXT: li a1, 0427; RV64I-NEXT: call __adddf3428; RV64I-NEXT: li a1, -1429; RV64I-NEXT: slli a1, a1, 63430; RV64I-NEXT: xor a2, a0, a1431; RV64I-NEXT: mv a0, s1432; RV64I-NEXT: mv a1, s0433; RV64I-NEXT: call fma434; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload435; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload436; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload437; RV64I-NEXT: addi sp, sp, 32438; RV64I-NEXT: ret439 %c_ = fadd double 0.0, %c ; avoid negation using xor440 %negc = fneg double %c_441 %1 = call double @llvm.experimental.constrained.fma.f64(double %a, double %b, double %negc, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp442 ret double %1443}444 445define double @fnmadd_d(double %a, double %b, double %c) nounwind strictfp {446; RV32IFD-LABEL: fnmadd_d:447; RV32IFD: # %bb.0:448; RV32IFD-NEXT: fcvt.d.w fa5, zero449; RV32IFD-NEXT: fadd.d fa4, fa0, fa5450; RV32IFD-NEXT: fadd.d fa5, fa2, fa5451; RV32IFD-NEXT: fnmadd.d fa0, fa4, fa1, fa5452; RV32IFD-NEXT: ret453;454; RV64IFD-LABEL: fnmadd_d:455; RV64IFD: # %bb.0:456; RV64IFD-NEXT: fmv.d.x fa5, zero457; RV64IFD-NEXT: fadd.d fa4, fa0, fa5458; RV64IFD-NEXT: fadd.d fa5, fa2, fa5459; RV64IFD-NEXT: fnmadd.d fa0, fa4, fa1, fa5460; RV64IFD-NEXT: ret461;462; RV32IZFINXZDINX-LABEL: fnmadd_d:463; RV32IZFINXZDINX: # %bb.0:464; RV32IZFINXZDINX-NEXT: fadd.d a0, a0, zero465; RV32IZFINXZDINX-NEXT: fadd.d a4, a4, zero466; RV32IZFINXZDINX-NEXT: fnmadd.d a0, a0, a2, a4467; RV32IZFINXZDINX-NEXT: ret468;469; RV64IZFINXZDINX-LABEL: fnmadd_d:470; RV64IZFINXZDINX: # %bb.0:471; RV64IZFINXZDINX-NEXT: fadd.d a0, a0, zero472; RV64IZFINXZDINX-NEXT: fadd.d a2, a2, zero473; RV64IZFINXZDINX-NEXT: fnmadd.d a0, a0, a1, a2474; RV64IZFINXZDINX-NEXT: ret475;476; RV32I-LABEL: fnmadd_d:477; RV32I: # %bb.0:478; RV32I-NEXT: addi sp, sp, -32479; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill480; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill481; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill482; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill483; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill484; RV32I-NEXT: sw s4, 8(sp) # 4-byte Folded Spill485; RV32I-NEXT: sw s5, 4(sp) # 4-byte Folded Spill486; RV32I-NEXT: mv s0, a5487; RV32I-NEXT: mv s1, a4488; RV32I-NEXT: mv s2, a3489; RV32I-NEXT: mv s3, a2490; RV32I-NEXT: li a2, 0491; RV32I-NEXT: li a3, 0492; RV32I-NEXT: call __adddf3493; RV32I-NEXT: mv s4, a0494; RV32I-NEXT: mv s5, a1495; RV32I-NEXT: mv a0, s1496; RV32I-NEXT: mv a1, s0497; RV32I-NEXT: li a2, 0498; RV32I-NEXT: li a3, 0499; RV32I-NEXT: call __adddf3500; RV32I-NEXT: mv a4, a0501; RV32I-NEXT: lui a5, 524288502; RV32I-NEXT: xor a2, s5, a5503; RV32I-NEXT: xor a5, a1, a5504; RV32I-NEXT: mv a0, s4505; RV32I-NEXT: mv a1, a2506; RV32I-NEXT: mv a2, s3507; RV32I-NEXT: mv a3, s2508; RV32I-NEXT: call fma509; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload510; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload511; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload512; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload513; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload514; RV32I-NEXT: lw s4, 8(sp) # 4-byte Folded Reload515; RV32I-NEXT: lw s5, 4(sp) # 4-byte Folded Reload516; RV32I-NEXT: addi sp, sp, 32517; RV32I-NEXT: ret518;519; RV64I-LABEL: fnmadd_d:520; RV64I: # %bb.0:521; RV64I-NEXT: addi sp, sp, -32522; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill523; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill524; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill525; RV64I-NEXT: sd s2, 0(sp) # 8-byte Folded Spill526; RV64I-NEXT: mv s0, a2527; RV64I-NEXT: mv s1, a1528; RV64I-NEXT: li a1, 0529; RV64I-NEXT: call __adddf3530; RV64I-NEXT: mv s2, a0531; RV64I-NEXT: mv a0, s0532; RV64I-NEXT: li a1, 0533; RV64I-NEXT: call __adddf3534; RV64I-NEXT: li a1, -1535; RV64I-NEXT: slli a2, a1, 63536; RV64I-NEXT: xor a1, s2, a2537; RV64I-NEXT: xor a2, a0, a2538; RV64I-NEXT: mv a0, a1539; RV64I-NEXT: mv a1, s1540; RV64I-NEXT: call fma541; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload542; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload543; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload544; RV64I-NEXT: ld s2, 0(sp) # 8-byte Folded Reload545; RV64I-NEXT: addi sp, sp, 32546; RV64I-NEXT: ret547 %a_ = fadd double 0.0, %a548 %c_ = fadd double 0.0, %c549 %nega = fneg double %a_550 %negc = fneg double %c_551 %1 = call double @llvm.experimental.constrained.fma.f64(double %nega, double %b, double %negc, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp552 ret double %1553}554 555define double @fnmadd_d_2(double %a, double %b, double %c) nounwind strictfp {556; RV32IFD-LABEL: fnmadd_d_2:557; RV32IFD: # %bb.0:558; RV32IFD-NEXT: fcvt.d.w fa5, zero559; RV32IFD-NEXT: fadd.d fa4, fa1, fa5560; RV32IFD-NEXT: fadd.d fa5, fa2, fa5561; RV32IFD-NEXT: fnmadd.d fa0, fa4, fa0, fa5562; RV32IFD-NEXT: ret563;564; RV64IFD-LABEL: fnmadd_d_2:565; RV64IFD: # %bb.0:566; RV64IFD-NEXT: fmv.d.x fa5, zero567; RV64IFD-NEXT: fadd.d fa4, fa1, fa5568; RV64IFD-NEXT: fadd.d fa5, fa2, fa5569; RV64IFD-NEXT: fnmadd.d fa0, fa4, fa0, fa5570; RV64IFD-NEXT: ret571;572; RV32IZFINXZDINX-LABEL: fnmadd_d_2:573; RV32IZFINXZDINX: # %bb.0:574; RV32IZFINXZDINX-NEXT: fadd.d a2, a2, zero575; RV32IZFINXZDINX-NEXT: fadd.d a4, a4, zero576; RV32IZFINXZDINX-NEXT: fnmadd.d a0, a2, a0, a4577; RV32IZFINXZDINX-NEXT: ret578;579; RV64IZFINXZDINX-LABEL: fnmadd_d_2:580; RV64IZFINXZDINX: # %bb.0:581; RV64IZFINXZDINX-NEXT: fadd.d a1, a1, zero582; RV64IZFINXZDINX-NEXT: fadd.d a2, a2, zero583; RV64IZFINXZDINX-NEXT: fnmadd.d a0, a1, a0, a2584; RV64IZFINXZDINX-NEXT: ret585;586; RV32I-LABEL: fnmadd_d_2:587; RV32I: # %bb.0:588; RV32I-NEXT: addi sp, sp, -32589; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill590; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill591; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill592; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill593; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill594; RV32I-NEXT: sw s4, 8(sp) # 4-byte Folded Spill595; RV32I-NEXT: sw s5, 4(sp) # 4-byte Folded Spill596; RV32I-NEXT: mv s0, a5597; RV32I-NEXT: mv s1, a4598; RV32I-NEXT: mv s2, a1599; RV32I-NEXT: mv s3, a0600; RV32I-NEXT: mv a0, a2601; RV32I-NEXT: mv a1, a3602; RV32I-NEXT: li a2, 0603; RV32I-NEXT: li a3, 0604; RV32I-NEXT: call __adddf3605; RV32I-NEXT: mv s4, a0606; RV32I-NEXT: mv s5, a1607; RV32I-NEXT: mv a0, s1608; RV32I-NEXT: mv a1, s0609; RV32I-NEXT: li a2, 0610; RV32I-NEXT: li a3, 0611; RV32I-NEXT: call __adddf3612; RV32I-NEXT: mv a4, a0613; RV32I-NEXT: lui a5, 524288614; RV32I-NEXT: xor a3, s5, a5615; RV32I-NEXT: xor a5, a1, a5616; RV32I-NEXT: mv a0, s3617; RV32I-NEXT: mv a1, s2618; RV32I-NEXT: mv a2, s4619; RV32I-NEXT: call fma620; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload621; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload622; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload623; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload624; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload625; RV32I-NEXT: lw s4, 8(sp) # 4-byte Folded Reload626; RV32I-NEXT: lw s5, 4(sp) # 4-byte Folded Reload627; RV32I-NEXT: addi sp, sp, 32628; RV32I-NEXT: ret629;630; RV64I-LABEL: fnmadd_d_2:631; RV64I: # %bb.0:632; RV64I-NEXT: addi sp, sp, -32633; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill634; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill635; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill636; RV64I-NEXT: sd s2, 0(sp) # 8-byte Folded Spill637; RV64I-NEXT: mv s0, a2638; RV64I-NEXT: mv s1, a0639; RV64I-NEXT: mv a0, a1640; RV64I-NEXT: li a1, 0641; RV64I-NEXT: call __adddf3642; RV64I-NEXT: mv s2, a0643; RV64I-NEXT: mv a0, s0644; RV64I-NEXT: li a1, 0645; RV64I-NEXT: call __adddf3646; RV64I-NEXT: li a1, -1647; RV64I-NEXT: slli a2, a1, 63648; RV64I-NEXT: xor a1, s2, a2649; RV64I-NEXT: xor a2, a0, a2650; RV64I-NEXT: mv a0, s1651; RV64I-NEXT: call fma652; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload653; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload654; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload655; RV64I-NEXT: ld s2, 0(sp) # 8-byte Folded Reload656; RV64I-NEXT: addi sp, sp, 32657; RV64I-NEXT: ret658 %b_ = fadd double 0.0, %b659 %c_ = fadd double 0.0, %c660 %negb = fneg double %b_661 %negc = fneg double %c_662 %1 = call double @llvm.experimental.constrained.fma.f64(double %a, double %negb, double %negc, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp663 ret double %1664}665 666define double @fnmsub_d(double %a, double %b, double %c) nounwind strictfp {667; RV32IFD-LABEL: fnmsub_d:668; RV32IFD: # %bb.0:669; RV32IFD-NEXT: fcvt.d.w fa5, zero670; RV32IFD-NEXT: fadd.d fa5, fa0, fa5671; RV32IFD-NEXT: fnmsub.d fa0, fa5, fa1, fa2672; RV32IFD-NEXT: ret673;674; RV64IFD-LABEL: fnmsub_d:675; RV64IFD: # %bb.0:676; RV64IFD-NEXT: fmv.d.x fa5, zero677; RV64IFD-NEXT: fadd.d fa5, fa0, fa5678; RV64IFD-NEXT: fnmsub.d fa0, fa5, fa1, fa2679; RV64IFD-NEXT: ret680;681; RV32IZFINXZDINX-LABEL: fnmsub_d:682; RV32IZFINXZDINX: # %bb.0:683; RV32IZFINXZDINX-NEXT: fadd.d a0, a0, zero684; RV32IZFINXZDINX-NEXT: fnmsub.d a0, a0, a2, a4685; RV32IZFINXZDINX-NEXT: ret686;687; RV64IZFINXZDINX-LABEL: fnmsub_d:688; RV64IZFINXZDINX: # %bb.0:689; RV64IZFINXZDINX-NEXT: fadd.d a0, a0, zero690; RV64IZFINXZDINX-NEXT: fnmsub.d a0, a0, a1, a2691; RV64IZFINXZDINX-NEXT: ret692;693; RV32I-LABEL: fnmsub_d:694; RV32I: # %bb.0:695; RV32I-NEXT: addi sp, sp, -32696; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill697; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill698; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill699; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill700; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill701; RV32I-NEXT: mv s0, a5702; RV32I-NEXT: mv s1, a4703; RV32I-NEXT: mv s2, a3704; RV32I-NEXT: mv s3, a2705; RV32I-NEXT: li a2, 0706; RV32I-NEXT: li a3, 0707; RV32I-NEXT: call __adddf3708; RV32I-NEXT: lui a2, 524288709; RV32I-NEXT: xor a1, a1, a2710; RV32I-NEXT: mv a2, s3711; RV32I-NEXT: mv a3, s2712; RV32I-NEXT: mv a4, s1713; RV32I-NEXT: mv a5, s0714; RV32I-NEXT: call fma715; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload716; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload717; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload718; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload719; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload720; RV32I-NEXT: addi sp, sp, 32721; RV32I-NEXT: ret722;723; RV64I-LABEL: fnmsub_d:724; RV64I: # %bb.0:725; RV64I-NEXT: addi sp, sp, -32726; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill727; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill728; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill729; RV64I-NEXT: mv s0, a2730; RV64I-NEXT: mv s1, a1731; RV64I-NEXT: li a1, 0732; RV64I-NEXT: call __adddf3733; RV64I-NEXT: li a1, -1734; RV64I-NEXT: slli a1, a1, 63735; RV64I-NEXT: xor a0, a0, a1736; RV64I-NEXT: mv a1, s1737; RV64I-NEXT: mv a2, s0738; RV64I-NEXT: call fma739; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload740; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload741; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload742; RV64I-NEXT: addi sp, sp, 32743; RV64I-NEXT: ret744 %a_ = fadd double 0.0, %a745 %nega = fneg double %a_746 %1 = call double @llvm.experimental.constrained.fma.f64(double %nega, double %b, double %c, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp747 ret double %1748}749 750define double @fnmsub_d_2(double %a, double %b, double %c) nounwind strictfp {751; RV32IFD-LABEL: fnmsub_d_2:752; RV32IFD: # %bb.0:753; RV32IFD-NEXT: fcvt.d.w fa5, zero754; RV32IFD-NEXT: fadd.d fa5, fa1, fa5755; RV32IFD-NEXT: fnmsub.d fa0, fa5, fa0, fa2756; RV32IFD-NEXT: ret757;758; RV64IFD-LABEL: fnmsub_d_2:759; RV64IFD: # %bb.0:760; RV64IFD-NEXT: fmv.d.x fa5, zero761; RV64IFD-NEXT: fadd.d fa5, fa1, fa5762; RV64IFD-NEXT: fnmsub.d fa0, fa5, fa0, fa2763; RV64IFD-NEXT: ret764;765; RV32IZFINXZDINX-LABEL: fnmsub_d_2:766; RV32IZFINXZDINX: # %bb.0:767; RV32IZFINXZDINX-NEXT: fadd.d a2, a2, zero768; RV32IZFINXZDINX-NEXT: fnmsub.d a0, a2, a0, a4769; RV32IZFINXZDINX-NEXT: ret770;771; RV64IZFINXZDINX-LABEL: fnmsub_d_2:772; RV64IZFINXZDINX: # %bb.0:773; RV64IZFINXZDINX-NEXT: fadd.d a1, a1, zero774; RV64IZFINXZDINX-NEXT: fnmsub.d a0, a1, a0, a2775; RV64IZFINXZDINX-NEXT: ret776;777; RV32I-LABEL: fnmsub_d_2:778; RV32I: # %bb.0:779; RV32I-NEXT: addi sp, sp, -32780; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill781; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill782; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill783; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill784; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill785; RV32I-NEXT: mv s0, a5786; RV32I-NEXT: mv s1, a4787; RV32I-NEXT: mv s2, a1788; RV32I-NEXT: mv s3, a0789; RV32I-NEXT: mv a0, a2790; RV32I-NEXT: mv a1, a3791; RV32I-NEXT: li a2, 0792; RV32I-NEXT: li a3, 0793; RV32I-NEXT: call __adddf3794; RV32I-NEXT: mv a2, a0795; RV32I-NEXT: lui a3, 524288796; RV32I-NEXT: xor a3, a1, a3797; RV32I-NEXT: mv a0, s3798; RV32I-NEXT: mv a1, s2799; RV32I-NEXT: mv a4, s1800; RV32I-NEXT: mv a5, s0801; RV32I-NEXT: call fma802; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload803; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload804; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload805; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload806; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload807; RV32I-NEXT: addi sp, sp, 32808; RV32I-NEXT: ret809;810; RV64I-LABEL: fnmsub_d_2:811; RV64I: # %bb.0:812; RV64I-NEXT: addi sp, sp, -32813; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill814; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill815; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill816; RV64I-NEXT: mv s0, a2817; RV64I-NEXT: mv s1, a0818; RV64I-NEXT: mv a0, a1819; RV64I-NEXT: li a1, 0820; RV64I-NEXT: call __adddf3821; RV64I-NEXT: li a1, -1822; RV64I-NEXT: slli a1, a1, 63823; RV64I-NEXT: xor a1, a0, a1824; RV64I-NEXT: mv a0, s1825; RV64I-NEXT: mv a2, s0826; RV64I-NEXT: call fma827; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload828; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload829; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload830; RV64I-NEXT: addi sp, sp, 32831; RV64I-NEXT: ret832 %b_ = fadd double 0.0, %b833 %negb = fneg double %b_834 %1 = call double @llvm.experimental.constrained.fma.f64(double %a, double %negb, double %c, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp835 ret double %1836}837