brintos

brintos / llvm-project-archived public Read only

0
0
Text · 43.6 KiB · ae6418e Raw
1357 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv32 -global-isel -mattr=+d -verify-machineinstrs < %s \3; RUN:   -target-abi=ilp32d | FileCheck -check-prefixes=CHECKIFD,RV32IFD %s4; RUN: llc -mtriple=riscv64 -global-isel -mattr=+d -verify-machineinstrs < %s \5; RUN:   -target-abi=lp64d | FileCheck -check-prefixes=CHECKIFD,RV64IFD %s6; RUN: llc -mtriple=riscv32 -global-isel -verify-machineinstrs < %s \7; RUN:   | FileCheck -check-prefix=RV32I %s8; RUN: llc -mtriple=riscv64 -global-isel -verify-machineinstrs < %s \9; RUN:   | FileCheck -check-prefix=RV64I %s10 11; These tests are each targeted at a particular RISC-V FPU instruction.12; Compares and conversions can be found in double-fcmp.ll and double-convert.ll13; respectively. Some other double-*.ll files in this folder exercise LLVM IR14; instructions that don't directly match a RISC-V instruction.15 16define double @fadd_d(double %a, double %b) nounwind {17; CHECKIFD-LABEL: fadd_d:18; CHECKIFD:       # %bb.0:19; CHECKIFD-NEXT:    fadd.d fa0, fa0, fa120; CHECKIFD-NEXT:    ret21;22; RV32I-LABEL: fadd_d:23; RV32I:       # %bb.0:24; RV32I-NEXT:    addi sp, sp, -1625; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill26; RV32I-NEXT:    call __adddf327; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload28; RV32I-NEXT:    addi sp, sp, 1629; RV32I-NEXT:    ret30;31; RV64I-LABEL: fadd_d:32; RV64I:       # %bb.0:33; RV64I-NEXT:    addi sp, sp, -1634; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill35; RV64I-NEXT:    call __adddf336; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload37; RV64I-NEXT:    addi sp, sp, 1638; RV64I-NEXT:    ret39  %1 = fadd double %a, %b40  ret double %141}42 43define double @fsub_d(double %a, double %b) nounwind {44; CHECKIFD-LABEL: fsub_d:45; CHECKIFD:       # %bb.0:46; CHECKIFD-NEXT:    fsub.d fa0, fa0, fa147; CHECKIFD-NEXT:    ret48;49; RV32I-LABEL: fsub_d:50; RV32I:       # %bb.0:51; RV32I-NEXT:    addi sp, sp, -1652; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill53; RV32I-NEXT:    call __subdf354; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload55; RV32I-NEXT:    addi sp, sp, 1656; RV32I-NEXT:    ret57;58; RV64I-LABEL: fsub_d:59; RV64I:       # %bb.0:60; RV64I-NEXT:    addi sp, sp, -1661; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill62; RV64I-NEXT:    call __subdf363; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload64; RV64I-NEXT:    addi sp, sp, 1665; RV64I-NEXT:    ret66  %1 = fsub double %a, %b67  ret double %168}69 70define double @fmul_d(double %a, double %b) nounwind {71; CHECKIFD-LABEL: fmul_d:72; CHECKIFD:       # %bb.0:73; CHECKIFD-NEXT:    fmul.d fa0, fa0, fa174; CHECKIFD-NEXT:    ret75;76; RV32I-LABEL: fmul_d:77; RV32I:       # %bb.0:78; RV32I-NEXT:    addi sp, sp, -1679; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill80; RV32I-NEXT:    call __muldf381; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload82; RV32I-NEXT:    addi sp, sp, 1683; RV32I-NEXT:    ret84;85; RV64I-LABEL: fmul_d:86; RV64I:       # %bb.0:87; RV64I-NEXT:    addi sp, sp, -1688; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill89; RV64I-NEXT:    call __muldf390; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload91; RV64I-NEXT:    addi sp, sp, 1692; RV64I-NEXT:    ret93  %1 = fmul double %a, %b94  ret double %195}96 97define double @fdiv_d(double %a, double %b) nounwind {98; CHECKIFD-LABEL: fdiv_d:99; CHECKIFD:       # %bb.0:100; CHECKIFD-NEXT:    fdiv.d fa0, fa0, fa1101; CHECKIFD-NEXT:    ret102;103; RV32I-LABEL: fdiv_d:104; RV32I:       # %bb.0:105; RV32I-NEXT:    addi sp, sp, -16106; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill107; RV32I-NEXT:    call __divdf3108; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload109; RV32I-NEXT:    addi sp, sp, 16110; RV32I-NEXT:    ret111;112; RV64I-LABEL: fdiv_d:113; RV64I:       # %bb.0:114; RV64I-NEXT:    addi sp, sp, -16115; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill116; RV64I-NEXT:    call __divdf3117; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload118; RV64I-NEXT:    addi sp, sp, 16119; RV64I-NEXT:    ret120  %1 = fdiv double %a, %b121  ret double %1122}123 124define double @fsqrt_d(double %a) nounwind {125; CHECKIFD-LABEL: fsqrt_d:126; CHECKIFD:       # %bb.0:127; CHECKIFD-NEXT:    fsqrt.d fa0, fa0128; CHECKIFD-NEXT:    ret129;130; RV32I-LABEL: fsqrt_d:131; RV32I:       # %bb.0:132; RV32I-NEXT:    addi sp, sp, -16133; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill134; RV32I-NEXT:    call sqrt135; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload136; RV32I-NEXT:    addi sp, sp, 16137; RV32I-NEXT:    ret138;139; RV64I-LABEL: fsqrt_d:140; RV64I:       # %bb.0:141; RV64I-NEXT:    addi sp, sp, -16142; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill143; RV64I-NEXT:    call sqrt144; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload145; RV64I-NEXT:    addi sp, sp, 16146; RV64I-NEXT:    ret147  %1 = call double @llvm.sqrt.f64(double %a)148  ret double %1149}150 151define double @fsgnj_d(double %a, double %b) nounwind {152; CHECKIFD-LABEL: fsgnj_d:153; CHECKIFD:       # %bb.0:154; CHECKIFD-NEXT:    fsgnj.d fa0, fa0, fa1155; CHECKIFD-NEXT:    ret156;157; RV32I-LABEL: fsgnj_d:158; RV32I:       # %bb.0:159; RV32I-NEXT:    lui a2, 524288160; RV32I-NEXT:    slli a1, a1, 1161; RV32I-NEXT:    srli a1, a1, 1162; RV32I-NEXT:    and a2, a3, a2163; RV32I-NEXT:    or a1, a1, a2164; RV32I-NEXT:    ret165;166; RV64I-LABEL: fsgnj_d:167; RV64I:       # %bb.0:168; RV64I-NEXT:    slli a0, a0, 1169; RV64I-NEXT:    srli a1, a1, 63170; RV64I-NEXT:    srli a0, a0, 1171; RV64I-NEXT:    slli a1, a1, 63172; RV64I-NEXT:    or a0, a0, a1173; RV64I-NEXT:    ret174  %1 = call double @llvm.copysign.f64(double %a, double %b)175  ret double %1176}177 178; This function performs extra work to ensure that179; DAGCombiner::visitBITCAST doesn't replace the fneg with an xor.180define i32 @fneg_d(double %a, double %b) nounwind {181; CHECKIFD-LABEL: fneg_d:182; CHECKIFD:       # %bb.0:183; CHECKIFD-NEXT:    fadd.d fa5, fa0, fa0184; CHECKIFD-NEXT:    fneg.d fa4, fa5185; CHECKIFD-NEXT:    feq.d a0, fa5, fa4186; CHECKIFD-NEXT:    ret187;188; RV32I-LABEL: fneg_d:189; RV32I:       # %bb.0:190; RV32I-NEXT:    addi sp, sp, -16191; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill192; RV32I-NEXT:    mv a2, a0193; RV32I-NEXT:    mv a3, a1194; RV32I-NEXT:    call __adddf3195; RV32I-NEXT:    lui a3, 524288196; RV32I-NEXT:    xor a3, a1, a3197; RV32I-NEXT:    mv a2, a0198; RV32I-NEXT:    call __eqdf2199; RV32I-NEXT:    seqz a0, a0200; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload201; RV32I-NEXT:    addi sp, sp, 16202; RV32I-NEXT:    ret203;204; RV64I-LABEL: fneg_d:205; RV64I:       # %bb.0:206; RV64I-NEXT:    addi sp, sp, -16207; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill208; RV64I-NEXT:    mv a1, a0209; RV64I-NEXT:    call __adddf3210; RV64I-NEXT:    li a1, -1211; RV64I-NEXT:    slli a1, a1, 63212; RV64I-NEXT:    xor a1, a0, a1213; RV64I-NEXT:    call __eqdf2214; RV64I-NEXT:    sext.w a0, a0215; RV64I-NEXT:    seqz a0, a0216; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload217; RV64I-NEXT:    addi sp, sp, 16218; RV64I-NEXT:    ret219  %1 = fadd double %a, %a220  %2 = fneg double %1221  %3 = fcmp oeq double %1, %2222  %4 = zext i1 %3 to i32223  ret i32 %4224}225 226define double @fsgnjn_d(double %a, double %b) nounwind {227; TODO: fsgnjn.s isn't selected on RV64 because DAGCombiner::visitBITCAST will228; convert (bitconvert (fneg x)) to a xor.229;230; CHECKIFD-LABEL: fsgnjn_d:231; CHECKIFD:       # %bb.0:232; CHECKIFD-NEXT:    fsgnjn.d fa0, fa0, fa1233; CHECKIFD-NEXT:    ret234;235; RV32I-LABEL: fsgnjn_d:236; RV32I:       # %bb.0:237; RV32I-NEXT:    lui a2, 524288238; RV32I-NEXT:    slli a1, a1, 1239; RV32I-NEXT:    xor a3, a3, a2240; RV32I-NEXT:    srli a1, a1, 1241; RV32I-NEXT:    and a2, a3, a2242; RV32I-NEXT:    or a1, a1, a2243; RV32I-NEXT:    ret244;245; RV64I-LABEL: fsgnjn_d:246; RV64I:       # %bb.0:247; RV64I-NEXT:    li a2, -1248; RV64I-NEXT:    slli a0, a0, 1249; RV64I-NEXT:    slli a2, a2, 63250; RV64I-NEXT:    xor a1, a1, a2251; RV64I-NEXT:    srli a0, a0, 1252; RV64I-NEXT:    and a1, a1, a2253; RV64I-NEXT:    or a0, a0, a1254; RV64I-NEXT:    ret255  %1 = fneg double %b256  %2 = call double @llvm.copysign.f64(double %a, double %1)257  ret double %2258}259 260; This function performs extra work to ensure that261; DAGCombiner::visitBITCAST doesn't replace the fabs with an and.262define double @fabs_d(double %a, double %b) nounwind {263; CHECKIFD-LABEL: fabs_d:264; CHECKIFD:       # %bb.0:265; CHECKIFD-NEXT:    fadd.d fa5, fa0, fa1266; CHECKIFD-NEXT:    fabs.d fa4, fa5267; CHECKIFD-NEXT:    fadd.d fa0, fa4, fa5268; CHECKIFD-NEXT:    ret269;270; RV32I-LABEL: fabs_d:271; RV32I:       # %bb.0:272; RV32I-NEXT:    addi sp, sp, -16273; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill274; RV32I-NEXT:    call __adddf3275; RV32I-NEXT:    mv a3, a1276; RV32I-NEXT:    slli a1, a1, 1277; RV32I-NEXT:    srli a1, a1, 1278; RV32I-NEXT:    mv a2, a0279; RV32I-NEXT:    call __adddf3280; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload281; RV32I-NEXT:    addi sp, sp, 16282; RV32I-NEXT:    ret283;284; RV64I-LABEL: fabs_d:285; RV64I:       # %bb.0:286; RV64I-NEXT:    addi sp, sp, -16287; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill288; RV64I-NEXT:    call __adddf3289; RV64I-NEXT:    mv a1, a0290; RV64I-NEXT:    slli a0, a0, 1291; RV64I-NEXT:    srli a0, a0, 1292; RV64I-NEXT:    call __adddf3293; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload294; RV64I-NEXT:    addi sp, sp, 16295; RV64I-NEXT:    ret296  %1 = fadd double %a, %b297  %2 = call double @llvm.fabs.f64(double %1)298  %3 = fadd double %2, %1299  ret double %3300}301 302define double @fmin_d(double %a, double %b) nounwind {303; CHECKIFD-LABEL: fmin_d:304; CHECKIFD:       # %bb.0:305; CHECKIFD-NEXT:    fmin.d fa0, fa0, fa1306; CHECKIFD-NEXT:    ret307;308; RV32I-LABEL: fmin_d:309; RV32I:       # %bb.0:310; RV32I-NEXT:    addi sp, sp, -16311; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill312; RV32I-NEXT:    call fmin313; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload314; RV32I-NEXT:    addi sp, sp, 16315; RV32I-NEXT:    ret316;317; RV64I-LABEL: fmin_d:318; RV64I:       # %bb.0:319; RV64I-NEXT:    addi sp, sp, -16320; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill321; RV64I-NEXT:    call fmin322; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload323; RV64I-NEXT:    addi sp, sp, 16324; RV64I-NEXT:    ret325  %1 = call double @llvm.minnum.f64(double %a, double %b)326  ret double %1327}328 329define double @fmax_d(double %a, double %b) nounwind {330; CHECKIFD-LABEL: fmax_d:331; CHECKIFD:       # %bb.0:332; CHECKIFD-NEXT:    fmax.d fa0, fa0, fa1333; CHECKIFD-NEXT:    ret334;335; RV32I-LABEL: fmax_d:336; RV32I:       # %bb.0:337; RV32I-NEXT:    addi sp, sp, -16338; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill339; RV32I-NEXT:    call fmax340; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload341; RV32I-NEXT:    addi sp, sp, 16342; RV32I-NEXT:    ret343;344; RV64I-LABEL: fmax_d:345; RV64I:       # %bb.0:346; RV64I-NEXT:    addi sp, sp, -16347; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill348; RV64I-NEXT:    call fmax349; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload350; RV64I-NEXT:    addi sp, sp, 16351; RV64I-NEXT:    ret352  %1 = call double @llvm.maxnum.f64(double %a, double %b)353  ret double %1354}355 356define double @fminimumnum_d(double %a, double %b) nounwind {357; CHECKIFD-LABEL: fminimumnum_d:358; CHECKIFD:       # %bb.0:359; CHECKIFD-NEXT:    fmin.d fa0, fa0, fa1360; CHECKIFD-NEXT:    ret361;362; RV32I-LABEL: fminimumnum_d:363; RV32I:       # %bb.0:364; RV32I-NEXT:    addi sp, sp, -16365; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill366; RV32I-NEXT:    call fminimum_num367; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload368; RV32I-NEXT:    addi sp, sp, 16369; RV32I-NEXT:    ret370;371; RV64I-LABEL: fminimumnum_d:372; RV64I:       # %bb.0:373; RV64I-NEXT:    addi sp, sp, -16374; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill375; RV64I-NEXT:    call fminimum_num376; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload377; RV64I-NEXT:    addi sp, sp, 16378; RV64I-NEXT:    ret379  %1 = call double @llvm.minimumnum.f64(double %a, double %b)380  ret double %1381}382 383define double @fmaximumnum_d(double %a, double %b) nounwind {384; CHECKIFD-LABEL: fmaximumnum_d:385; CHECKIFD:       # %bb.0:386; CHECKIFD-NEXT:    fmax.d fa0, fa0, fa1387; CHECKIFD-NEXT:    ret388;389; RV32I-LABEL: fmaximumnum_d:390; RV32I:       # %bb.0:391; RV32I-NEXT:    addi sp, sp, -16392; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill393; RV32I-NEXT:    call fmaximum_num394; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload395; RV32I-NEXT:    addi sp, sp, 16396; RV32I-NEXT:    ret397;398; RV64I-LABEL: fmaximumnum_d:399; RV64I:       # %bb.0:400; RV64I-NEXT:    addi sp, sp, -16401; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill402; RV64I-NEXT:    call fmaximum_num403; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload404; RV64I-NEXT:    addi sp, sp, 16405; RV64I-NEXT:    ret406  %1 = call double @llvm.maximumnum.f64(double %a, double %b)407  ret double %1408}409 410define double @fmadd_d(double %a, double %b, double %c) nounwind {411; CHECKIFD-LABEL: fmadd_d:412; CHECKIFD:       # %bb.0:413; CHECKIFD-NEXT:    fmadd.d fa0, fa0, fa1, fa2414; CHECKIFD-NEXT:    ret415;416; RV32I-LABEL: fmadd_d:417; RV32I:       # %bb.0:418; RV32I-NEXT:    addi sp, sp, -16419; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill420; RV32I-NEXT:    call fma421; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload422; RV32I-NEXT:    addi sp, sp, 16423; RV32I-NEXT:    ret424;425; RV64I-LABEL: fmadd_d:426; RV64I:       # %bb.0:427; RV64I-NEXT:    addi sp, sp, -16428; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill429; RV64I-NEXT:    call fma430; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload431; RV64I-NEXT:    addi sp, sp, 16432; RV64I-NEXT:    ret433  %1 = call double @llvm.fma.f64(double %a, double %b, double %c)434  ret double %1435}436 437define double @fmsub_d(double %a, double %b, double %c) nounwind {438; RV32IFD-LABEL: fmsub_d:439; RV32IFD:       # %bb.0:440; RV32IFD-NEXT:    fcvt.d.w fa5, zero441; RV32IFD-NEXT:    fadd.d fa5, fa2, fa5442; RV32IFD-NEXT:    fmsub.d fa0, fa0, fa1, fa5443; RV32IFD-NEXT:    ret444;445; RV64IFD-LABEL: fmsub_d:446; RV64IFD:       # %bb.0:447; RV64IFD-NEXT:    fmv.d.x fa5, zero448; RV64IFD-NEXT:    fadd.d fa5, fa2, fa5449; RV64IFD-NEXT:    fmsub.d fa0, fa0, fa1, fa5450; RV64IFD-NEXT:    ret451;452; RV32I-LABEL: fmsub_d:453; RV32I:       # %bb.0:454; RV32I-NEXT:    addi sp, sp, -32455; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill456; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill457; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill458; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill459; RV32I-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill460; RV32I-NEXT:    mv s0, a0461; RV32I-NEXT:    mv s1, a1462; RV32I-NEXT:    mv s2, a2463; RV32I-NEXT:    mv s3, a3464; RV32I-NEXT:    mv a0, a4465; RV32I-NEXT:    lui a1, %hi(.LCPI14_0)466; RV32I-NEXT:    addi a1, a1, %lo(.LCPI14_0)467; RV32I-NEXT:    lw a2, 0(a1)468; RV32I-NEXT:    lw a3, 4(a1)469; RV32I-NEXT:    mv a1, a5470; RV32I-NEXT:    call __adddf3471; RV32I-NEXT:    mv a4, a0472; RV32I-NEXT:    lui a5, 524288473; RV32I-NEXT:    xor a5, a1, a5474; RV32I-NEXT:    mv a0, s0475; RV32I-NEXT:    mv a1, s1476; RV32I-NEXT:    mv a2, s2477; RV32I-NEXT:    mv a3, s3478; RV32I-NEXT:    call fma479; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload480; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload481; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload482; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload483; RV32I-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload484; RV32I-NEXT:    addi sp, sp, 32485; RV32I-NEXT:    ret486;487; RV64I-LABEL: fmsub_d:488; RV64I:       # %bb.0:489; RV64I-NEXT:    addi sp, sp, -32490; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill491; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill492; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill493; RV64I-NEXT:    mv s0, a0494; RV64I-NEXT:    mv s1, a1495; RV64I-NEXT:    mv a0, a2496; RV64I-NEXT:    li a1, 0497; RV64I-NEXT:    call __adddf3498; RV64I-NEXT:    li a1, -1499; RV64I-NEXT:    slli a1, a1, 63500; RV64I-NEXT:    xor a2, a0, a1501; RV64I-NEXT:    mv a0, s0502; RV64I-NEXT:    mv a1, s1503; RV64I-NEXT:    call fma504; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload505; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload506; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload507; RV64I-NEXT:    addi sp, sp, 32508; RV64I-NEXT:    ret509  %c_ = fadd double 0.0, %c ; avoid negation using xor510  %negc = fneg double %c_511  %1 = call double @llvm.fma.f64(double %a, double %b, double %negc)512  ret double %1513}514 515define double @fnmadd_d(double %a, double %b, double %c) nounwind {516; RV32IFD-LABEL: fnmadd_d:517; RV32IFD:       # %bb.0:518; RV32IFD-NEXT:    fcvt.d.w fa5, zero519; RV32IFD-NEXT:    fadd.d fa4, fa0, fa5520; RV32IFD-NEXT:    fadd.d fa5, fa2, fa5521; RV32IFD-NEXT:    fnmadd.d fa0, fa4, fa1, fa5522; RV32IFD-NEXT:    ret523;524; RV64IFD-LABEL: fnmadd_d:525; RV64IFD:       # %bb.0:526; RV64IFD-NEXT:    fmv.d.x fa5, zero527; RV64IFD-NEXT:    fadd.d fa4, fa0, fa5528; RV64IFD-NEXT:    fadd.d fa5, fa2, fa5529; RV64IFD-NEXT:    fnmadd.d fa0, fa4, fa1, fa5530; RV64IFD-NEXT:    ret531;532; RV32I-LABEL: fnmadd_d:533; RV32I:       # %bb.0:534; RV32I-NEXT:    addi sp, sp, -48535; RV32I-NEXT:    sw ra, 44(sp) # 4-byte Folded Spill536; RV32I-NEXT:    sw s0, 40(sp) # 4-byte Folded Spill537; RV32I-NEXT:    sw s1, 36(sp) # 4-byte Folded Spill538; RV32I-NEXT:    sw s2, 32(sp) # 4-byte Folded Spill539; RV32I-NEXT:    sw s3, 28(sp) # 4-byte Folded Spill540; RV32I-NEXT:    sw s4, 24(sp) # 4-byte Folded Spill541; RV32I-NEXT:    sw s5, 20(sp) # 4-byte Folded Spill542; RV32I-NEXT:    sw s6, 16(sp) # 4-byte Folded Spill543; RV32I-NEXT:    sw s7, 12(sp) # 4-byte Folded Spill544; RV32I-NEXT:    mv s0, a2545; RV32I-NEXT:    mv s1, a3546; RV32I-NEXT:    mv s2, a4547; RV32I-NEXT:    lui a2, %hi(.LCPI15_0)548; RV32I-NEXT:    addi a2, a2, %lo(.LCPI15_0)549; RV32I-NEXT:    lw s3, 0(a2)550; RV32I-NEXT:    lw s4, 4(a2)551; RV32I-NEXT:    mv s5, a5552; RV32I-NEXT:    mv a2, s3553; RV32I-NEXT:    mv a3, s4554; RV32I-NEXT:    call __adddf3555; RV32I-NEXT:    mv s6, a0556; RV32I-NEXT:    mv s7, a1557; RV32I-NEXT:    mv a0, s2558; RV32I-NEXT:    mv a1, s5559; RV32I-NEXT:    mv a2, s3560; RV32I-NEXT:    mv a3, s4561; RV32I-NEXT:    call __adddf3562; RV32I-NEXT:    mv a4, a0563; RV32I-NEXT:    lui a5, 524288564; RV32I-NEXT:    xor a2, s7, a5565; RV32I-NEXT:    xor a5, a1, a5566; RV32I-NEXT:    mv a0, s6567; RV32I-NEXT:    mv a1, a2568; RV32I-NEXT:    mv a2, s0569; RV32I-NEXT:    mv a3, s1570; RV32I-NEXT:    call fma571; RV32I-NEXT:    lw ra, 44(sp) # 4-byte Folded Reload572; RV32I-NEXT:    lw s0, 40(sp) # 4-byte Folded Reload573; RV32I-NEXT:    lw s1, 36(sp) # 4-byte Folded Reload574; RV32I-NEXT:    lw s2, 32(sp) # 4-byte Folded Reload575; RV32I-NEXT:    lw s3, 28(sp) # 4-byte Folded Reload576; RV32I-NEXT:    lw s4, 24(sp) # 4-byte Folded Reload577; RV32I-NEXT:    lw s5, 20(sp) # 4-byte Folded Reload578; RV32I-NEXT:    lw s6, 16(sp) # 4-byte Folded Reload579; RV32I-NEXT:    lw s7, 12(sp) # 4-byte Folded Reload580; RV32I-NEXT:    addi sp, sp, 48581; RV32I-NEXT:    ret582;583; RV64I-LABEL: fnmadd_d:584; RV64I:       # %bb.0:585; RV64I-NEXT:    addi sp, sp, -32586; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill587; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill588; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill589; RV64I-NEXT:    sd s2, 0(sp) # 8-byte Folded Spill590; RV64I-NEXT:    mv s0, a1591; RV64I-NEXT:    mv s1, a2592; RV64I-NEXT:    li a1, 0593; RV64I-NEXT:    call __adddf3594; RV64I-NEXT:    mv s2, a0595; RV64I-NEXT:    mv a0, s1596; RV64I-NEXT:    li a1, 0597; RV64I-NEXT:    call __adddf3598; RV64I-NEXT:    li a1, -1599; RV64I-NEXT:    slli a2, a1, 63600; RV64I-NEXT:    xor a1, s2, a2601; RV64I-NEXT:    xor a2, a0, a2602; RV64I-NEXT:    mv a0, a1603; RV64I-NEXT:    mv a1, s0604; RV64I-NEXT:    call fma605; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload606; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload607; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload608; RV64I-NEXT:    ld s2, 0(sp) # 8-byte Folded Reload609; RV64I-NEXT:    addi sp, sp, 32610; RV64I-NEXT:    ret611  %a_ = fadd double 0.0, %a612  %c_ = fadd double 0.0, %c613  %nega = fneg double %a_614  %negc = fneg double %c_615  %1 = call double @llvm.fma.f64(double %nega, double %b, double %negc)616  ret double %1617}618 619define double @fnmadd_d_2(double %a, double %b, double %c) nounwind {620; RV32IFD-LABEL: fnmadd_d_2:621; RV32IFD:       # %bb.0:622; RV32IFD-NEXT:    fcvt.d.w fa5, zero623; RV32IFD-NEXT:    fadd.d fa4, fa1, fa5624; RV32IFD-NEXT:    fadd.d fa5, fa2, fa5625; RV32IFD-NEXT:    fnmadd.d fa0, fa4, fa0, fa5626; RV32IFD-NEXT:    ret627;628; RV64IFD-LABEL: fnmadd_d_2:629; RV64IFD:       # %bb.0:630; RV64IFD-NEXT:    fmv.d.x fa5, zero631; RV64IFD-NEXT:    fadd.d fa4, fa1, fa5632; RV64IFD-NEXT:    fadd.d fa5, fa2, fa5633; RV64IFD-NEXT:    fnmadd.d fa0, fa4, fa0, fa5634; RV64IFD-NEXT:    ret635;636; RV32I-LABEL: fnmadd_d_2:637; RV32I:       # %bb.0:638; RV32I-NEXT:    addi sp, sp, -48639; RV32I-NEXT:    sw ra, 44(sp) # 4-byte Folded Spill640; RV32I-NEXT:    sw s0, 40(sp) # 4-byte Folded Spill641; RV32I-NEXT:    sw s1, 36(sp) # 4-byte Folded Spill642; RV32I-NEXT:    sw s2, 32(sp) # 4-byte Folded Spill643; RV32I-NEXT:    sw s3, 28(sp) # 4-byte Folded Spill644; RV32I-NEXT:    sw s4, 24(sp) # 4-byte Folded Spill645; RV32I-NEXT:    sw s5, 20(sp) # 4-byte Folded Spill646; RV32I-NEXT:    sw s6, 16(sp) # 4-byte Folded Spill647; RV32I-NEXT:    sw s7, 12(sp) # 4-byte Folded Spill648; RV32I-NEXT:    mv s0, a0649; RV32I-NEXT:    mv s1, a1650; RV32I-NEXT:    mv a0, a2651; RV32I-NEXT:    mv a1, a3652; RV32I-NEXT:    mv s2, a4653; RV32I-NEXT:    lui a2, %hi(.LCPI16_0)654; RV32I-NEXT:    addi a2, a2, %lo(.LCPI16_0)655; RV32I-NEXT:    lw s3, 0(a2)656; RV32I-NEXT:    lw s4, 4(a2)657; RV32I-NEXT:    mv s5, a5658; RV32I-NEXT:    mv a2, s3659; RV32I-NEXT:    mv a3, s4660; RV32I-NEXT:    call __adddf3661; RV32I-NEXT:    mv s6, a0662; RV32I-NEXT:    mv s7, a1663; RV32I-NEXT:    mv a0, s2664; RV32I-NEXT:    mv a1, s5665; RV32I-NEXT:    mv a2, s3666; RV32I-NEXT:    mv a3, s4667; RV32I-NEXT:    call __adddf3668; RV32I-NEXT:    mv a4, a0669; RV32I-NEXT:    lui a5, 524288670; RV32I-NEXT:    xor a3, s7, a5671; RV32I-NEXT:    xor a5, a1, a5672; RV32I-NEXT:    mv a0, s0673; RV32I-NEXT:    mv a1, s1674; RV32I-NEXT:    mv a2, s6675; RV32I-NEXT:    call fma676; RV32I-NEXT:    lw ra, 44(sp) # 4-byte Folded Reload677; RV32I-NEXT:    lw s0, 40(sp) # 4-byte Folded Reload678; RV32I-NEXT:    lw s1, 36(sp) # 4-byte Folded Reload679; RV32I-NEXT:    lw s2, 32(sp) # 4-byte Folded Reload680; RV32I-NEXT:    lw s3, 28(sp) # 4-byte Folded Reload681; RV32I-NEXT:    lw s4, 24(sp) # 4-byte Folded Reload682; RV32I-NEXT:    lw s5, 20(sp) # 4-byte Folded Reload683; RV32I-NEXT:    lw s6, 16(sp) # 4-byte Folded Reload684; RV32I-NEXT:    lw s7, 12(sp) # 4-byte Folded Reload685; RV32I-NEXT:    addi sp, sp, 48686; RV32I-NEXT:    ret687;688; RV64I-LABEL: fnmadd_d_2:689; RV64I:       # %bb.0:690; RV64I-NEXT:    addi sp, sp, -32691; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill692; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill693; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill694; RV64I-NEXT:    sd s2, 0(sp) # 8-byte Folded Spill695; RV64I-NEXT:    mv s0, a0696; RV64I-NEXT:    mv a0, a1697; RV64I-NEXT:    mv s1, a2698; RV64I-NEXT:    li a1, 0699; RV64I-NEXT:    call __adddf3700; RV64I-NEXT:    mv s2, a0701; RV64I-NEXT:    mv a0, s1702; RV64I-NEXT:    li a1, 0703; RV64I-NEXT:    call __adddf3704; RV64I-NEXT:    li a1, -1705; RV64I-NEXT:    slli a2, a1, 63706; RV64I-NEXT:    xor a1, s2, a2707; RV64I-NEXT:    xor a2, a0, a2708; RV64I-NEXT:    mv a0, s0709; RV64I-NEXT:    call fma710; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload711; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload712; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload713; RV64I-NEXT:    ld s2, 0(sp) # 8-byte Folded Reload714; RV64I-NEXT:    addi sp, sp, 32715; RV64I-NEXT:    ret716  %b_ = fadd double 0.0, %b717  %c_ = fadd double 0.0, %c718  %negb = fneg double %b_719  %negc = fneg double %c_720  %1 = call double @llvm.fma.f64(double %a, double %negb, double %negc)721  ret double %1722}723 724define double @fnmadd_d_3(double %a, double %b, double %c) nounwind {725; CHECKIFD-LABEL: fnmadd_d_3:726; CHECKIFD:       # %bb.0:727; CHECKIFD-NEXT:    fmadd.d fa5, fa0, fa1, fa2728; CHECKIFD-NEXT:    fneg.d fa0, fa5729; CHECKIFD-NEXT:    ret730;731; RV32I-LABEL: fnmadd_d_3:732; RV32I:       # %bb.0:733; RV32I-NEXT:    addi sp, sp, -16734; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill735; RV32I-NEXT:    call fma736; RV32I-NEXT:    lui a2, 524288737; RV32I-NEXT:    xor a1, a1, a2738; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload739; RV32I-NEXT:    addi sp, sp, 16740; RV32I-NEXT:    ret741;742; RV64I-LABEL: fnmadd_d_3:743; RV64I:       # %bb.0:744; RV64I-NEXT:    addi sp, sp, -16745; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill746; RV64I-NEXT:    call fma747; RV64I-NEXT:    li a1, -1748; RV64I-NEXT:    slli a1, a1, 63749; RV64I-NEXT:    xor a0, a0, a1750; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload751; RV64I-NEXT:    addi sp, sp, 16752; RV64I-NEXT:    ret753  %1 = call double @llvm.fma.f64(double %a, double %b, double %c)754  %neg = fneg double %1755  ret double %neg756}757 758define double @fnmadd_nsz(double %a, double %b, double %c) nounwind {759; CHECKIFD-LABEL: fnmadd_nsz:760; CHECKIFD:       # %bb.0:761; CHECKIFD-NEXT:    fmadd.d fa5, fa0, fa1, fa2762; CHECKIFD-NEXT:    fneg.d fa0, fa5763; CHECKIFD-NEXT:    ret764;765; RV32I-LABEL: fnmadd_nsz:766; RV32I:       # %bb.0:767; RV32I-NEXT:    addi sp, sp, -16768; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill769; RV32I-NEXT:    call fma770; RV32I-NEXT:    lui a2, 524288771; RV32I-NEXT:    xor a1, a1, a2772; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload773; RV32I-NEXT:    addi sp, sp, 16774; RV32I-NEXT:    ret775;776; RV64I-LABEL: fnmadd_nsz:777; RV64I:       # %bb.0:778; RV64I-NEXT:    addi sp, sp, -16779; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill780; RV64I-NEXT:    call fma781; RV64I-NEXT:    li a1, -1782; RV64I-NEXT:    slli a1, a1, 63783; RV64I-NEXT:    xor a0, a0, a1784; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload785; RV64I-NEXT:    addi sp, sp, 16786; RV64I-NEXT:    ret787  %1 = call nsz double @llvm.fma.f64(double %a, double %b, double %c)788  %neg = fneg nsz double %1789  ret double %neg790}791 792define double @fnmsub_d(double %a, double %b, double %c) nounwind {793; RV32IFD-LABEL: fnmsub_d:794; RV32IFD:       # %bb.0:795; RV32IFD-NEXT:    fcvt.d.w fa5, zero796; RV32IFD-NEXT:    fadd.d fa5, fa0, fa5797; RV32IFD-NEXT:    fnmsub.d fa0, fa5, fa1, fa2798; RV32IFD-NEXT:    ret799;800; RV64IFD-LABEL: fnmsub_d:801; RV64IFD:       # %bb.0:802; RV64IFD-NEXT:    fmv.d.x fa5, zero803; RV64IFD-NEXT:    fadd.d fa5, fa0, fa5804; RV64IFD-NEXT:    fnmsub.d fa0, fa5, fa1, fa2805; RV64IFD-NEXT:    ret806;807; RV32I-LABEL: fnmsub_d:808; RV32I:       # %bb.0:809; RV32I-NEXT:    addi sp, sp, -32810; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill811; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill812; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill813; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill814; RV32I-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill815; RV32I-NEXT:    mv s0, a2816; RV32I-NEXT:    mv s1, a3817; RV32I-NEXT:    mv s2, a4818; RV32I-NEXT:    lui a2, %hi(.LCPI19_0)819; RV32I-NEXT:    addi a3, a2, %lo(.LCPI19_0)820; RV32I-NEXT:    lw a2, 0(a3)821; RV32I-NEXT:    lw a3, 4(a3)822; RV32I-NEXT:    mv s3, a5823; RV32I-NEXT:    call __adddf3824; RV32I-NEXT:    lui a2, 524288825; RV32I-NEXT:    xor a1, a1, a2826; RV32I-NEXT:    mv a2, s0827; RV32I-NEXT:    mv a3, s1828; RV32I-NEXT:    mv a4, s2829; RV32I-NEXT:    mv a5, s3830; RV32I-NEXT:    call fma831; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload832; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload833; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload834; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload835; RV32I-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload836; RV32I-NEXT:    addi sp, sp, 32837; RV32I-NEXT:    ret838;839; RV64I-LABEL: fnmsub_d:840; RV64I:       # %bb.0:841; RV64I-NEXT:    addi sp, sp, -32842; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill843; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill844; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill845; RV64I-NEXT:    mv s0, a1846; RV64I-NEXT:    mv s1, a2847; RV64I-NEXT:    li a1, 0848; RV64I-NEXT:    call __adddf3849; RV64I-NEXT:    li a1, -1850; RV64I-NEXT:    slli a1, a1, 63851; RV64I-NEXT:    xor a0, a0, a1852; RV64I-NEXT:    mv a1, s0853; RV64I-NEXT:    mv a2, s1854; RV64I-NEXT:    call fma855; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload856; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload857; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload858; RV64I-NEXT:    addi sp, sp, 32859; RV64I-NEXT:    ret860  %a_ = fadd double 0.0, %a861  %nega = fneg double %a_862  %1 = call double @llvm.fma.f64(double %nega, double %b, double %c)863  ret double %1864}865 866define double @fnmsub_d_2(double %a, double %b, double %c) nounwind {867; RV32IFD-LABEL: fnmsub_d_2:868; RV32IFD:       # %bb.0:869; RV32IFD-NEXT:    fcvt.d.w fa5, zero870; RV32IFD-NEXT:    fadd.d fa5, fa1, fa5871; RV32IFD-NEXT:    fnmsub.d fa0, fa5, fa0, fa2872; RV32IFD-NEXT:    ret873;874; RV64IFD-LABEL: fnmsub_d_2:875; RV64IFD:       # %bb.0:876; RV64IFD-NEXT:    fmv.d.x fa5, zero877; RV64IFD-NEXT:    fadd.d fa5, fa1, fa5878; RV64IFD-NEXT:    fnmsub.d fa0, fa5, fa0, fa2879; RV64IFD-NEXT:    ret880;881; RV32I-LABEL: fnmsub_d_2:882; RV32I:       # %bb.0:883; RV32I-NEXT:    addi sp, sp, -32884; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill885; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill886; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill887; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill888; RV32I-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill889; RV32I-NEXT:    mv s0, a0890; RV32I-NEXT:    mv s1, a1891; RV32I-NEXT:    mv a0, a2892; RV32I-NEXT:    mv a1, a3893; RV32I-NEXT:    mv s2, a4894; RV32I-NEXT:    lui a2, %hi(.LCPI20_0)895; RV32I-NEXT:    addi a3, a2, %lo(.LCPI20_0)896; RV32I-NEXT:    lw a2, 0(a3)897; RV32I-NEXT:    lw a3, 4(a3)898; RV32I-NEXT:    mv s3, a5899; RV32I-NEXT:    call __adddf3900; RV32I-NEXT:    mv a2, a0901; RV32I-NEXT:    lui a3, 524288902; RV32I-NEXT:    xor a3, a1, a3903; RV32I-NEXT:    mv a0, s0904; RV32I-NEXT:    mv a1, s1905; RV32I-NEXT:    mv a4, s2906; RV32I-NEXT:    mv a5, s3907; RV32I-NEXT:    call fma908; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload909; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload910; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload911; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload912; RV32I-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload913; RV32I-NEXT:    addi sp, sp, 32914; RV32I-NEXT:    ret915;916; RV64I-LABEL: fnmsub_d_2:917; RV64I:       # %bb.0:918; RV64I-NEXT:    addi sp, sp, -32919; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill920; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill921; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill922; RV64I-NEXT:    mv s0, a0923; RV64I-NEXT:    mv a0, a1924; RV64I-NEXT:    mv s1, a2925; RV64I-NEXT:    li a1, 0926; RV64I-NEXT:    call __adddf3927; RV64I-NEXT:    li a1, -1928; RV64I-NEXT:    slli a1, a1, 63929; RV64I-NEXT:    xor a1, a0, a1930; RV64I-NEXT:    mv a0, s0931; RV64I-NEXT:    mv a2, s1932; RV64I-NEXT:    call fma933; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload934; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload935; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload936; RV64I-NEXT:    addi sp, sp, 32937; RV64I-NEXT:    ret938  %b_ = fadd double 0.0, %b939  %negb = fneg double %b_940  %1 = call double @llvm.fma.f64(double %a, double %negb, double %c)941  ret double %1942}943 944define double @fmadd_d_contract(double %a, double %b, double %c) nounwind {945; CHECKIFD-LABEL: fmadd_d_contract:946; CHECKIFD:       # %bb.0:947; CHECKIFD-NEXT:    fmadd.d fa0, fa0, fa1, fa2948; CHECKIFD-NEXT:    ret949;950; RV32I-LABEL: fmadd_d_contract:951; RV32I:       # %bb.0:952; RV32I-NEXT:    addi sp, sp, -16953; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill954; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill955; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill956; RV32I-NEXT:    mv s0, a4957; RV32I-NEXT:    mv s1, a5958; RV32I-NEXT:    call __muldf3959; RV32I-NEXT:    mv a2, s0960; RV32I-NEXT:    mv a3, s1961; RV32I-NEXT:    call __adddf3962; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload963; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload964; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload965; RV32I-NEXT:    addi sp, sp, 16966; RV32I-NEXT:    ret967;968; RV64I-LABEL: fmadd_d_contract:969; RV64I:       # %bb.0:970; RV64I-NEXT:    addi sp, sp, -16971; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill972; RV64I-NEXT:    sd s0, 0(sp) # 8-byte Folded Spill973; RV64I-NEXT:    mv s0, a2974; RV64I-NEXT:    call __muldf3975; RV64I-NEXT:    mv a1, s0976; RV64I-NEXT:    call __adddf3977; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload978; RV64I-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload979; RV64I-NEXT:    addi sp, sp, 16980; RV64I-NEXT:    ret981  %1 = fmul contract double %a, %b982  %2 = fadd contract double %1, %c983  ret double %2984}985 986define double @fmsub_d_contract(double %a, double %b, double %c) nounwind {987; RV32IFD-LABEL: fmsub_d_contract:988; RV32IFD:       # %bb.0:989; RV32IFD-NEXT:    fcvt.d.w fa5, zero990; RV32IFD-NEXT:    fadd.d fa5, fa2, fa5991; RV32IFD-NEXT:    fmul.d fa4, fa0, fa1992; RV32IFD-NEXT:    fsub.d fa0, fa4, fa5993; RV32IFD-NEXT:    ret994;995; RV64IFD-LABEL: fmsub_d_contract:996; RV64IFD:       # %bb.0:997; RV64IFD-NEXT:    fmv.d.x fa5, zero998; RV64IFD-NEXT:    fadd.d fa5, fa2, fa5999; RV64IFD-NEXT:    fmul.d fa4, fa0, fa11000; RV64IFD-NEXT:    fsub.d fa0, fa4, fa51001; RV64IFD-NEXT:    ret1002;1003; RV32I-LABEL: fmsub_d_contract:1004; RV32I:       # %bb.0:1005; RV32I-NEXT:    addi sp, sp, -321006; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill1007; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill1008; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill1009; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill1010; RV32I-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill1011; RV32I-NEXT:    sw s4, 8(sp) # 4-byte Folded Spill1012; RV32I-NEXT:    sw s5, 4(sp) # 4-byte Folded Spill1013; RV32I-NEXT:    mv s0, a01014; RV32I-NEXT:    mv s1, a11015; RV32I-NEXT:    mv s2, a21016; RV32I-NEXT:    mv s3, a31017; RV32I-NEXT:    mv a0, a41018; RV32I-NEXT:    lui a1, %hi(.LCPI22_0)1019; RV32I-NEXT:    addi a1, a1, %lo(.LCPI22_0)1020; RV32I-NEXT:    lw a2, 0(a1)1021; RV32I-NEXT:    lw a3, 4(a1)1022; RV32I-NEXT:    mv a1, a51023; RV32I-NEXT:    call __adddf31024; RV32I-NEXT:    mv s4, a01025; RV32I-NEXT:    mv s5, a11026; RV32I-NEXT:    mv a0, s01027; RV32I-NEXT:    mv a1, s11028; RV32I-NEXT:    mv a2, s21029; RV32I-NEXT:    mv a3, s31030; RV32I-NEXT:    call __muldf31031; RV32I-NEXT:    mv a2, s41032; RV32I-NEXT:    mv a3, s51033; RV32I-NEXT:    call __subdf31034; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload1035; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload1036; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload1037; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload1038; RV32I-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload1039; RV32I-NEXT:    lw s4, 8(sp) # 4-byte Folded Reload1040; RV32I-NEXT:    lw s5, 4(sp) # 4-byte Folded Reload1041; RV32I-NEXT:    addi sp, sp, 321042; RV32I-NEXT:    ret1043;1044; RV64I-LABEL: fmsub_d_contract:1045; RV64I:       # %bb.0:1046; RV64I-NEXT:    addi sp, sp, -321047; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill1048; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill1049; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill1050; RV64I-NEXT:    sd s2, 0(sp) # 8-byte Folded Spill1051; RV64I-NEXT:    mv s0, a01052; RV64I-NEXT:    mv s1, a11053; RV64I-NEXT:    mv a0, a21054; RV64I-NEXT:    li a1, 01055; RV64I-NEXT:    call __adddf31056; RV64I-NEXT:    mv s2, a01057; RV64I-NEXT:    mv a0, s01058; RV64I-NEXT:    mv a1, s11059; RV64I-NEXT:    call __muldf31060; RV64I-NEXT:    mv a1, s21061; RV64I-NEXT:    call __subdf31062; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload1063; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload1064; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload1065; RV64I-NEXT:    ld s2, 0(sp) # 8-byte Folded Reload1066; RV64I-NEXT:    addi sp, sp, 321067; RV64I-NEXT:    ret1068  %c_ = fadd double 0.0, %c ; avoid negation using xor1069  %1 = fmul contract double %a, %b1070  %2 = fsub contract double %1, %c_1071  ret double %21072}1073 1074define double @fnmadd_d_contract(double %a, double %b, double %c) nounwind {1075; RV32IFD-LABEL: fnmadd_d_contract:1076; RV32IFD:       # %bb.0:1077; RV32IFD-NEXT:    fcvt.d.w fa5, zero1078; RV32IFD-NEXT:    fadd.d fa4, fa0, fa51079; RV32IFD-NEXT:    fadd.d fa3, fa1, fa51080; RV32IFD-NEXT:    fadd.d fa5, fa2, fa51081; RV32IFD-NEXT:    fmul.d fa4, fa4, fa31082; RV32IFD-NEXT:    fneg.d fa4, fa41083; RV32IFD-NEXT:    fsub.d fa0, fa4, fa51084; RV32IFD-NEXT:    ret1085;1086; RV64IFD-LABEL: fnmadd_d_contract:1087; RV64IFD:       # %bb.0:1088; RV64IFD-NEXT:    fmv.d.x fa5, zero1089; RV64IFD-NEXT:    fadd.d fa4, fa0, fa51090; RV64IFD-NEXT:    fadd.d fa3, fa1, fa51091; RV64IFD-NEXT:    fadd.d fa5, fa2, fa51092; RV64IFD-NEXT:    fmul.d fa4, fa4, fa31093; RV64IFD-NEXT:    fneg.d fa4, fa41094; RV64IFD-NEXT:    fsub.d fa0, fa4, fa51095; RV64IFD-NEXT:    ret1096;1097; RV32I-LABEL: fnmadd_d_contract:1098; RV32I:       # %bb.0:1099; RV32I-NEXT:    addi sp, sp, -481100; RV32I-NEXT:    sw ra, 44(sp) # 4-byte Folded Spill1101; RV32I-NEXT:    sw s0, 40(sp) # 4-byte Folded Spill1102; RV32I-NEXT:    sw s1, 36(sp) # 4-byte Folded Spill1103; RV32I-NEXT:    sw s2, 32(sp) # 4-byte Folded Spill1104; RV32I-NEXT:    sw s3, 28(sp) # 4-byte Folded Spill1105; RV32I-NEXT:    sw s4, 24(sp) # 4-byte Folded Spill1106; RV32I-NEXT:    sw s5, 20(sp) # 4-byte Folded Spill1107; RV32I-NEXT:    sw s6, 16(sp) # 4-byte Folded Spill1108; RV32I-NEXT:    sw s7, 12(sp) # 4-byte Folded Spill1109; RV32I-NEXT:    mv s0, a21110; RV32I-NEXT:    mv s1, a31111; RV32I-NEXT:    mv s2, a41112; RV32I-NEXT:    lui a2, %hi(.LCPI23_0)1113; RV32I-NEXT:    addi a2, a2, %lo(.LCPI23_0)1114; RV32I-NEXT:    lw s3, 0(a2)1115; RV32I-NEXT:    lw s4, 4(a2)1116; RV32I-NEXT:    mv s5, a51117; RV32I-NEXT:    mv a2, s31118; RV32I-NEXT:    mv a3, s41119; RV32I-NEXT:    call __adddf31120; RV32I-NEXT:    mv s6, a01121; RV32I-NEXT:    mv s7, a11122; RV32I-NEXT:    mv a0, s01123; RV32I-NEXT:    mv a1, s11124; RV32I-NEXT:    mv a2, s31125; RV32I-NEXT:    mv a3, s41126; RV32I-NEXT:    call __adddf31127; RV32I-NEXT:    mv s0, a01128; RV32I-NEXT:    mv s1, a11129; RV32I-NEXT:    mv a0, s21130; RV32I-NEXT:    mv a1, s51131; RV32I-NEXT:    mv a2, s31132; RV32I-NEXT:    mv a3, s41133; RV32I-NEXT:    call __adddf31134; RV32I-NEXT:    mv s2, a01135; RV32I-NEXT:    mv s3, a11136; RV32I-NEXT:    mv a0, s61137; RV32I-NEXT:    mv a1, s71138; RV32I-NEXT:    mv a2, s01139; RV32I-NEXT:    mv a3, s11140; RV32I-NEXT:    call __muldf31141; RV32I-NEXT:    lui a2, 5242881142; RV32I-NEXT:    xor a1, a1, a21143; RV32I-NEXT:    mv a2, s21144; RV32I-NEXT:    mv a3, s31145; RV32I-NEXT:    call __subdf31146; RV32I-NEXT:    lw ra, 44(sp) # 4-byte Folded Reload1147; RV32I-NEXT:    lw s0, 40(sp) # 4-byte Folded Reload1148; RV32I-NEXT:    lw s1, 36(sp) # 4-byte Folded Reload1149; RV32I-NEXT:    lw s2, 32(sp) # 4-byte Folded Reload1150; RV32I-NEXT:    lw s3, 28(sp) # 4-byte Folded Reload1151; RV32I-NEXT:    lw s4, 24(sp) # 4-byte Folded Reload1152; RV32I-NEXT:    lw s5, 20(sp) # 4-byte Folded Reload1153; RV32I-NEXT:    lw s6, 16(sp) # 4-byte Folded Reload1154; RV32I-NEXT:    lw s7, 12(sp) # 4-byte Folded Reload1155; RV32I-NEXT:    addi sp, sp, 481156; RV32I-NEXT:    ret1157;1158; RV64I-LABEL: fnmadd_d_contract:1159; RV64I:       # %bb.0:1160; RV64I-NEXT:    addi sp, sp, -321161; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill1162; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill1163; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill1164; RV64I-NEXT:    sd s2, 0(sp) # 8-byte Folded Spill1165; RV64I-NEXT:    mv s0, a11166; RV64I-NEXT:    mv s1, a21167; RV64I-NEXT:    li a1, 01168; RV64I-NEXT:    call __adddf31169; RV64I-NEXT:    mv s2, a01170; RV64I-NEXT:    mv a0, s01171; RV64I-NEXT:    li a1, 01172; RV64I-NEXT:    call __adddf31173; RV64I-NEXT:    mv s0, a01174; RV64I-NEXT:    mv a0, s11175; RV64I-NEXT:    li a1, 01176; RV64I-NEXT:    call __adddf31177; RV64I-NEXT:    mv s1, a01178; RV64I-NEXT:    mv a0, s21179; RV64I-NEXT:    mv a1, s01180; RV64I-NEXT:    call __muldf31181; RV64I-NEXT:    li a1, -11182; RV64I-NEXT:    slli a1, a1, 631183; RV64I-NEXT:    xor a0, a0, a11184; RV64I-NEXT:    mv a1, s11185; RV64I-NEXT:    call __subdf31186; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload1187; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload1188; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload1189; RV64I-NEXT:    ld s2, 0(sp) # 8-byte Folded Reload1190; RV64I-NEXT:    addi sp, sp, 321191; RV64I-NEXT:    ret1192  %a_ = fadd double 0.0, %a ; avoid negation using xor1193  %b_ = fadd double 0.0, %b ; avoid negation using xor1194  %c_ = fadd double 0.0, %c ; avoid negation using xor1195  %1 = fmul contract double %a_, %b_1196  %2 = fneg double %11197  %3 = fsub contract double %2, %c_1198  ret double %31199}1200 1201define double @fnmsub_d_contract(double %a, double %b, double %c) nounwind {1202; RV32IFD-LABEL: fnmsub_d_contract:1203; RV32IFD:       # %bb.0:1204; RV32IFD-NEXT:    fcvt.d.w fa5, zero1205; RV32IFD-NEXT:    fadd.d fa4, fa0, fa51206; RV32IFD-NEXT:    fadd.d fa5, fa1, fa51207; RV32IFD-NEXT:    fnmsub.d fa0, fa4, fa5, fa21208; RV32IFD-NEXT:    ret1209;1210; RV64IFD-LABEL: fnmsub_d_contract:1211; RV64IFD:       # %bb.0:1212; RV64IFD-NEXT:    fmv.d.x fa5, zero1213; RV64IFD-NEXT:    fadd.d fa4, fa0, fa51214; RV64IFD-NEXT:    fadd.d fa5, fa1, fa51215; RV64IFD-NEXT:    fnmsub.d fa0, fa4, fa5, fa21216; RV64IFD-NEXT:    ret1217;1218; RV32I-LABEL: fnmsub_d_contract:1219; RV32I:       # %bb.0:1220; RV32I-NEXT:    addi sp, sp, -481221; RV32I-NEXT:    sw ra, 44(sp) # 4-byte Folded Spill1222; RV32I-NEXT:    sw s0, 40(sp) # 4-byte Folded Spill1223; RV32I-NEXT:    sw s1, 36(sp) # 4-byte Folded Spill1224; RV32I-NEXT:    sw s2, 32(sp) # 4-byte Folded Spill1225; RV32I-NEXT:    sw s3, 28(sp) # 4-byte Folded Spill1226; RV32I-NEXT:    sw s4, 24(sp) # 4-byte Folded Spill1227; RV32I-NEXT:    sw s5, 20(sp) # 4-byte Folded Spill1228; RV32I-NEXT:    sw s6, 16(sp) # 4-byte Folded Spill1229; RV32I-NEXT:    sw s7, 12(sp) # 4-byte Folded Spill1230; RV32I-NEXT:    mv s0, a21231; RV32I-NEXT:    mv s1, a31232; RV32I-NEXT:    mv s2, a41233; RV32I-NEXT:    lui a2, %hi(.LCPI24_0)1234; RV32I-NEXT:    addi a2, a2, %lo(.LCPI24_0)1235; RV32I-NEXT:    lw s3, 0(a2)1236; RV32I-NEXT:    lw s4, 4(a2)1237; RV32I-NEXT:    mv s5, a51238; RV32I-NEXT:    mv a2, s31239; RV32I-NEXT:    mv a3, s41240; RV32I-NEXT:    call __adddf31241; RV32I-NEXT:    mv s6, a01242; RV32I-NEXT:    mv s7, a11243; RV32I-NEXT:    mv a0, s01244; RV32I-NEXT:    mv a1, s11245; RV32I-NEXT:    mv a2, s31246; RV32I-NEXT:    mv a3, s41247; RV32I-NEXT:    call __adddf31248; RV32I-NEXT:    mv a2, a01249; RV32I-NEXT:    mv a3, a11250; RV32I-NEXT:    mv a0, s61251; RV32I-NEXT:    mv a1, s71252; RV32I-NEXT:    call __muldf31253; RV32I-NEXT:    mv a2, a01254; RV32I-NEXT:    mv a3, a11255; RV32I-NEXT:    mv a0, s21256; RV32I-NEXT:    mv a1, s51257; RV32I-NEXT:    call __subdf31258; RV32I-NEXT:    lw ra, 44(sp) # 4-byte Folded Reload1259; RV32I-NEXT:    lw s0, 40(sp) # 4-byte Folded Reload1260; RV32I-NEXT:    lw s1, 36(sp) # 4-byte Folded Reload1261; RV32I-NEXT:    lw s2, 32(sp) # 4-byte Folded Reload1262; RV32I-NEXT:    lw s3, 28(sp) # 4-byte Folded Reload1263; RV32I-NEXT:    lw s4, 24(sp) # 4-byte Folded Reload1264; RV32I-NEXT:    lw s5, 20(sp) # 4-byte Folded Reload1265; RV32I-NEXT:    lw s6, 16(sp) # 4-byte Folded Reload1266; RV32I-NEXT:    lw s7, 12(sp) # 4-byte Folded Reload1267; RV32I-NEXT:    addi sp, sp, 481268; RV32I-NEXT:    ret1269;1270; RV64I-LABEL: fnmsub_d_contract:1271; RV64I:       # %bb.0:1272; RV64I-NEXT:    addi sp, sp, -321273; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill1274; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill1275; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill1276; RV64I-NEXT:    sd s2, 0(sp) # 8-byte Folded Spill1277; RV64I-NEXT:    mv s0, a11278; RV64I-NEXT:    mv s1, a21279; RV64I-NEXT:    li a1, 01280; RV64I-NEXT:    call __adddf31281; RV64I-NEXT:    mv s2, a01282; RV64I-NEXT:    mv a0, s01283; RV64I-NEXT:    li a1, 01284; RV64I-NEXT:    call __adddf31285; RV64I-NEXT:    mv a1, a01286; RV64I-NEXT:    mv a0, s21287; RV64I-NEXT:    call __muldf31288; RV64I-NEXT:    mv a1, a01289; RV64I-NEXT:    mv a0, s11290; RV64I-NEXT:    call __subdf31291; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload1292; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload1293; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload1294; RV64I-NEXT:    ld s2, 0(sp) # 8-byte Folded Reload1295; RV64I-NEXT:    addi sp, sp, 321296; RV64I-NEXT:    ret1297  %a_ = fadd double 0.0, %a ; avoid negation using xor1298  %b_ = fadd double 0.0, %b ; avoid negation using xor1299  %1 = fmul contract double %a_, %b_1300  %2 = fsub contract double %c, %11301  ret double %21302}1303 1304define double @fsgnjx_f64(double %x, double %y) nounwind {1305; RV32IFD-LABEL: fsgnjx_f64:1306; RV32IFD:       # %bb.0:1307; RV32IFD-NEXT:    addi sp, sp, -161308; RV32IFD-NEXT:    lui a0, 2618881309; RV32IFD-NEXT:    sw zero, 8(sp)1310; RV32IFD-NEXT:    sw a0, 12(sp)1311; RV32IFD-NEXT:    fld fa5, 8(sp)1312; RV32IFD-NEXT:    fsgnj.d fa5, fa5, fa01313; RV32IFD-NEXT:    fmul.d fa0, fa5, fa11314; RV32IFD-NEXT:    addi sp, sp, 161315; RV32IFD-NEXT:    ret1316;1317; RV64IFD-LABEL: fsgnjx_f64:1318; RV64IFD:       # %bb.0:1319; RV64IFD-NEXT:    li a0, 10231320; RV64IFD-NEXT:    slli a0, a0, 521321; RV64IFD-NEXT:    fmv.d.x fa5, a01322; RV64IFD-NEXT:    fsgnj.d fa5, fa5, fa01323; RV64IFD-NEXT:    fmul.d fa0, fa5, fa11324; RV64IFD-NEXT:    ret1325;1326; RV32I-LABEL: fsgnjx_f64:1327; RV32I:       # %bb.0:1328; RV32I-NEXT:    addi sp, sp, -161329; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill1330; RV32I-NEXT:    lui a0, 5242881331; RV32I-NEXT:    lui a4, 2618881332; RV32I-NEXT:    and a0, a1, a01333; RV32I-NEXT:    or a1, a0, a41334; RV32I-NEXT:    li a0, 01335; RV32I-NEXT:    call __muldf31336; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload1337; RV32I-NEXT:    addi sp, sp, 161338; RV32I-NEXT:    ret1339;1340; RV64I-LABEL: fsgnjx_f64:1341; RV64I:       # %bb.0:1342; RV64I-NEXT:    addi sp, sp, -161343; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill1344; RV64I-NEXT:    li a2, 10231345; RV64I-NEXT:    srli a0, a0, 631346; RV64I-NEXT:    slli a2, a2, 521347; RV64I-NEXT:    slli a0, a0, 631348; RV64I-NEXT:    or a0, a0, a21349; RV64I-NEXT:    call __muldf31350; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload1351; RV64I-NEXT:    addi sp, sp, 161352; RV64I-NEXT:    ret1353  %z = call double @llvm.copysign.f64(double 1.0, double %x)1354  %mul = fmul double %z, %y1355  ret double %mul1356}1357