brintos

brintos / llvm-project-archived public Read only

0
0
Text · 39.1 KiB · 58d20c6 Raw
1101 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc --mtriple=loongarch32 --mattr=+d --fp-contract=fast < %s \3; RUN:   | FileCheck %s --check-prefix=LA32-CONTRACT-FAST4; RUN: llc --mtriple=loongarch32 --mattr=+d --fp-contract=on < %s \5; RUN:   | FileCheck %s --check-prefix=LA32-CONTRACT-ON6; RUN: llc --mtriple=loongarch32 --mattr=+d --fp-contract=off < %s \7; RUN:   | FileCheck %s --check-prefix=LA32-CONTRACT-OFF8; RUN: llc --mtriple=loongarch64 --mattr=+d --fp-contract=fast < %s \9; RUN:   | FileCheck %s --check-prefix=LA64-CONTRACT-FAST10; RUN: llc --mtriple=loongarch64 --mattr=+d --fp-contract=on < %s \11; RUN:   | FileCheck %s --check-prefix=LA64-CONTRACT-ON12; RUN: llc --mtriple=loongarch64 --mattr=+d --fp-contract=off < %s \13; RUN:   | FileCheck %s --check-prefix=LA64-CONTRACT-OFF14 15define double @fmadd_d(double %a, double %b, double %c) nounwind {16; LA32-CONTRACT-FAST-LABEL: fmadd_d:17; LA32-CONTRACT-FAST:       # %bb.0:18; LA32-CONTRACT-FAST-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa219; LA32-CONTRACT-FAST-NEXT:    ret20;21; LA32-CONTRACT-ON-LABEL: fmadd_d:22; LA32-CONTRACT-ON:       # %bb.0:23; LA32-CONTRACT-ON-NEXT:    fmul.d $fa0, $fa0, $fa124; LA32-CONTRACT-ON-NEXT:    fadd.d $fa0, $fa0, $fa225; LA32-CONTRACT-ON-NEXT:    ret26;27; LA32-CONTRACT-OFF-LABEL: fmadd_d:28; LA32-CONTRACT-OFF:       # %bb.0:29; LA32-CONTRACT-OFF-NEXT:    fmul.d $fa0, $fa0, $fa130; LA32-CONTRACT-OFF-NEXT:    fadd.d $fa0, $fa0, $fa231; LA32-CONTRACT-OFF-NEXT:    ret32;33; LA64-CONTRACT-FAST-LABEL: fmadd_d:34; LA64-CONTRACT-FAST:       # %bb.0:35; LA64-CONTRACT-FAST-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa236; LA64-CONTRACT-FAST-NEXT:    ret37;38; LA64-CONTRACT-ON-LABEL: fmadd_d:39; LA64-CONTRACT-ON:       # %bb.0:40; LA64-CONTRACT-ON-NEXT:    fmul.d $fa0, $fa0, $fa141; LA64-CONTRACT-ON-NEXT:    fadd.d $fa0, $fa0, $fa242; LA64-CONTRACT-ON-NEXT:    ret43;44; LA64-CONTRACT-OFF-LABEL: fmadd_d:45; LA64-CONTRACT-OFF:       # %bb.0:46; LA64-CONTRACT-OFF-NEXT:    fmul.d $fa0, $fa0, $fa147; LA64-CONTRACT-OFF-NEXT:    fadd.d $fa0, $fa0, $fa248; LA64-CONTRACT-OFF-NEXT:    ret49  %mul = fmul double %a, %b50  %add = fadd double %mul, %c51  ret double %add52}53 54define double @fmsub_d(double %a, double %b, double %c) nounwind {55; LA32-CONTRACT-FAST-LABEL: fmsub_d:56; LA32-CONTRACT-FAST:       # %bb.0:57; LA32-CONTRACT-FAST-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa258; LA32-CONTRACT-FAST-NEXT:    ret59;60; LA32-CONTRACT-ON-LABEL: fmsub_d:61; LA32-CONTRACT-ON:       # %bb.0:62; LA32-CONTRACT-ON-NEXT:    fmul.d $fa0, $fa0, $fa163; LA32-CONTRACT-ON-NEXT:    fsub.d $fa0, $fa0, $fa264; LA32-CONTRACT-ON-NEXT:    ret65;66; LA32-CONTRACT-OFF-LABEL: fmsub_d:67; LA32-CONTRACT-OFF:       # %bb.0:68; LA32-CONTRACT-OFF-NEXT:    fmul.d $fa0, $fa0, $fa169; LA32-CONTRACT-OFF-NEXT:    fsub.d $fa0, $fa0, $fa270; LA32-CONTRACT-OFF-NEXT:    ret71;72; LA64-CONTRACT-FAST-LABEL: fmsub_d:73; LA64-CONTRACT-FAST:       # %bb.0:74; LA64-CONTRACT-FAST-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa275; LA64-CONTRACT-FAST-NEXT:    ret76;77; LA64-CONTRACT-ON-LABEL: fmsub_d:78; LA64-CONTRACT-ON:       # %bb.0:79; LA64-CONTRACT-ON-NEXT:    fmul.d $fa0, $fa0, $fa180; LA64-CONTRACT-ON-NEXT:    fsub.d $fa0, $fa0, $fa281; LA64-CONTRACT-ON-NEXT:    ret82;83; LA64-CONTRACT-OFF-LABEL: fmsub_d:84; LA64-CONTRACT-OFF:       # %bb.0:85; LA64-CONTRACT-OFF-NEXT:    fmul.d $fa0, $fa0, $fa186; LA64-CONTRACT-OFF-NEXT:    fsub.d $fa0, $fa0, $fa287; LA64-CONTRACT-OFF-NEXT:    ret88  %mul = fmul double %a, %b89  %sub = fsub double %mul, %c90  ret double %sub91}92 93define double @fnmadd_d(double %a, double %b, double %c) nounwind {94; LA32-CONTRACT-FAST-LABEL: fnmadd_d:95; LA32-CONTRACT-FAST:       # %bb.0:96; LA32-CONTRACT-FAST-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa297; LA32-CONTRACT-FAST-NEXT:    ret98;99; LA32-CONTRACT-ON-LABEL: fnmadd_d:100; LA32-CONTRACT-ON:       # %bb.0:101; LA32-CONTRACT-ON-NEXT:    fmul.d $fa0, $fa0, $fa1102; LA32-CONTRACT-ON-NEXT:    fadd.d $fa0, $fa0, $fa2103; LA32-CONTRACT-ON-NEXT:    fneg.d $fa0, $fa0104; LA32-CONTRACT-ON-NEXT:    ret105;106; LA32-CONTRACT-OFF-LABEL: fnmadd_d:107; LA32-CONTRACT-OFF:       # %bb.0:108; LA32-CONTRACT-OFF-NEXT:    fmul.d $fa0, $fa0, $fa1109; LA32-CONTRACT-OFF-NEXT:    fadd.d $fa0, $fa0, $fa2110; LA32-CONTRACT-OFF-NEXT:    fneg.d $fa0, $fa0111; LA32-CONTRACT-OFF-NEXT:    ret112;113; LA64-CONTRACT-FAST-LABEL: fnmadd_d:114; LA64-CONTRACT-FAST:       # %bb.0:115; LA64-CONTRACT-FAST-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2116; LA64-CONTRACT-FAST-NEXT:    ret117;118; LA64-CONTRACT-ON-LABEL: fnmadd_d:119; LA64-CONTRACT-ON:       # %bb.0:120; LA64-CONTRACT-ON-NEXT:    fmul.d $fa0, $fa0, $fa1121; LA64-CONTRACT-ON-NEXT:    fadd.d $fa0, $fa0, $fa2122; LA64-CONTRACT-ON-NEXT:    fneg.d $fa0, $fa0123; LA64-CONTRACT-ON-NEXT:    ret124;125; LA64-CONTRACT-OFF-LABEL: fnmadd_d:126; LA64-CONTRACT-OFF:       # %bb.0:127; LA64-CONTRACT-OFF-NEXT:    fmul.d $fa0, $fa0, $fa1128; LA64-CONTRACT-OFF-NEXT:    fadd.d $fa0, $fa0, $fa2129; LA64-CONTRACT-OFF-NEXT:    fneg.d $fa0, $fa0130; LA64-CONTRACT-OFF-NEXT:    ret131  %mul = fmul double %a, %b132  %add = fadd double %mul, %c133  %negadd = fneg double %add134  ret double %negadd135}136 137define double @fnmadd_d_nsz(double %a, double %b, double %c) nounwind {138; LA32-CONTRACT-FAST-LABEL: fnmadd_d_nsz:139; LA32-CONTRACT-FAST:       # %bb.0:140; LA32-CONTRACT-FAST-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2141; LA32-CONTRACT-FAST-NEXT:    ret142;143; LA32-CONTRACT-ON-LABEL: fnmadd_d_nsz:144; LA32-CONTRACT-ON:       # %bb.0:145; LA32-CONTRACT-ON-NEXT:    fneg.d $fa0, $fa0146; LA32-CONTRACT-ON-NEXT:    fmul.d $fa0, $fa0, $fa1147; LA32-CONTRACT-ON-NEXT:    fsub.d $fa0, $fa0, $fa2148; LA32-CONTRACT-ON-NEXT:    ret149;150; LA32-CONTRACT-OFF-LABEL: fnmadd_d_nsz:151; LA32-CONTRACT-OFF:       # %bb.0:152; LA32-CONTRACT-OFF-NEXT:    fneg.d $fa0, $fa0153; LA32-CONTRACT-OFF-NEXT:    fmul.d $fa0, $fa0, $fa1154; LA32-CONTRACT-OFF-NEXT:    fsub.d $fa0, $fa0, $fa2155; LA32-CONTRACT-OFF-NEXT:    ret156;157; LA64-CONTRACT-FAST-LABEL: fnmadd_d_nsz:158; LA64-CONTRACT-FAST:       # %bb.0:159; LA64-CONTRACT-FAST-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2160; LA64-CONTRACT-FAST-NEXT:    ret161;162; LA64-CONTRACT-ON-LABEL: fnmadd_d_nsz:163; LA64-CONTRACT-ON:       # %bb.0:164; LA64-CONTRACT-ON-NEXT:    fneg.d $fa0, $fa0165; LA64-CONTRACT-ON-NEXT:    fmul.d $fa0, $fa0, $fa1166; LA64-CONTRACT-ON-NEXT:    fsub.d $fa0, $fa0, $fa2167; LA64-CONTRACT-ON-NEXT:    ret168;169; LA64-CONTRACT-OFF-LABEL: fnmadd_d_nsz:170; LA64-CONTRACT-OFF:       # %bb.0:171; LA64-CONTRACT-OFF-NEXT:    fneg.d $fa0, $fa0172; LA64-CONTRACT-OFF-NEXT:    fmul.d $fa0, $fa0, $fa1173; LA64-CONTRACT-OFF-NEXT:    fsub.d $fa0, $fa0, $fa2174; LA64-CONTRACT-OFF-NEXT:    ret175  %nega = fneg nsz double %a176  %negc = fneg nsz double %c177  %mul = fmul nsz double %nega, %b178  %add = fadd nsz double %mul, %negc179  ret double %add180}181 182;; Check that fnmadd.d is not emitted.183define double @not_fnmadd_d(double %a, double %b, double %c) nounwind {184; LA32-CONTRACT-FAST-LABEL: not_fnmadd_d:185; LA32-CONTRACT-FAST:       # %bb.0:186; LA32-CONTRACT-FAST-NEXT:    fneg.d $fa0, $fa0187; LA32-CONTRACT-FAST-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2188; LA32-CONTRACT-FAST-NEXT:    ret189;190; LA32-CONTRACT-ON-LABEL: not_fnmadd_d:191; LA32-CONTRACT-ON:       # %bb.0:192; LA32-CONTRACT-ON-NEXT:    fneg.d $fa0, $fa0193; LA32-CONTRACT-ON-NEXT:    fmul.d $fa0, $fa0, $fa1194; LA32-CONTRACT-ON-NEXT:    fsub.d $fa0, $fa0, $fa2195; LA32-CONTRACT-ON-NEXT:    ret196;197; LA32-CONTRACT-OFF-LABEL: not_fnmadd_d:198; LA32-CONTRACT-OFF:       # %bb.0:199; LA32-CONTRACT-OFF-NEXT:    fneg.d $fa0, $fa0200; LA32-CONTRACT-OFF-NEXT:    fmul.d $fa0, $fa0, $fa1201; LA32-CONTRACT-OFF-NEXT:    fsub.d $fa0, $fa0, $fa2202; LA32-CONTRACT-OFF-NEXT:    ret203;204; LA64-CONTRACT-FAST-LABEL: not_fnmadd_d:205; LA64-CONTRACT-FAST:       # %bb.0:206; LA64-CONTRACT-FAST-NEXT:    fneg.d $fa0, $fa0207; LA64-CONTRACT-FAST-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2208; LA64-CONTRACT-FAST-NEXT:    ret209;210; LA64-CONTRACT-ON-LABEL: not_fnmadd_d:211; LA64-CONTRACT-ON:       # %bb.0:212; LA64-CONTRACT-ON-NEXT:    fneg.d $fa0, $fa0213; LA64-CONTRACT-ON-NEXT:    fmul.d $fa0, $fa0, $fa1214; LA64-CONTRACT-ON-NEXT:    fsub.d $fa0, $fa0, $fa2215; LA64-CONTRACT-ON-NEXT:    ret216;217; LA64-CONTRACT-OFF-LABEL: not_fnmadd_d:218; LA64-CONTRACT-OFF:       # %bb.0:219; LA64-CONTRACT-OFF-NEXT:    fneg.d $fa0, $fa0220; LA64-CONTRACT-OFF-NEXT:    fmul.d $fa0, $fa0, $fa1221; LA64-CONTRACT-OFF-NEXT:    fsub.d $fa0, $fa0, $fa2222; LA64-CONTRACT-OFF-NEXT:    ret223  %nega = fneg double %a224  %negc = fneg double %c225  %mul = fmul double %nega, %b226  %add = fadd double %mul, %negc227  ret double %add228}229 230define double @fnmsub_d(double %a, double %b, double %c) nounwind {231; LA32-CONTRACT-FAST-LABEL: fnmsub_d:232; LA32-CONTRACT-FAST:       # %bb.0:233; LA32-CONTRACT-FAST-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2234; LA32-CONTRACT-FAST-NEXT:    ret235;236; LA32-CONTRACT-ON-LABEL: fnmsub_d:237; LA32-CONTRACT-ON:       # %bb.0:238; LA32-CONTRACT-ON-NEXT:    fmul.d $fa0, $fa0, $fa1239; LA32-CONTRACT-ON-NEXT:    fsub.d $fa0, $fa0, $fa2240; LA32-CONTRACT-ON-NEXT:    fneg.d $fa0, $fa0241; LA32-CONTRACT-ON-NEXT:    ret242;243; LA32-CONTRACT-OFF-LABEL: fnmsub_d:244; LA32-CONTRACT-OFF:       # %bb.0:245; LA32-CONTRACT-OFF-NEXT:    fmul.d $fa0, $fa0, $fa1246; LA32-CONTRACT-OFF-NEXT:    fsub.d $fa0, $fa0, $fa2247; LA32-CONTRACT-OFF-NEXT:    fneg.d $fa0, $fa0248; LA32-CONTRACT-OFF-NEXT:    ret249;250; LA64-CONTRACT-FAST-LABEL: fnmsub_d:251; LA64-CONTRACT-FAST:       # %bb.0:252; LA64-CONTRACT-FAST-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2253; LA64-CONTRACT-FAST-NEXT:    ret254;255; LA64-CONTRACT-ON-LABEL: fnmsub_d:256; LA64-CONTRACT-ON:       # %bb.0:257; LA64-CONTRACT-ON-NEXT:    fmul.d $fa0, $fa0, $fa1258; LA64-CONTRACT-ON-NEXT:    fsub.d $fa0, $fa0, $fa2259; LA64-CONTRACT-ON-NEXT:    fneg.d $fa0, $fa0260; LA64-CONTRACT-ON-NEXT:    ret261;262; LA64-CONTRACT-OFF-LABEL: fnmsub_d:263; LA64-CONTRACT-OFF:       # %bb.0:264; LA64-CONTRACT-OFF-NEXT:    fmul.d $fa0, $fa0, $fa1265; LA64-CONTRACT-OFF-NEXT:    fsub.d $fa0, $fa0, $fa2266; LA64-CONTRACT-OFF-NEXT:    fneg.d $fa0, $fa0267; LA64-CONTRACT-OFF-NEXT:    ret268  %negc = fneg double %c269  %mul = fmul double %a, %b270  %add = fadd double %mul, %negc271  %neg = fneg double %add272  ret double %neg273}274 275define double @fnmsub_d_nsz(double %a, double %b, double %c) nounwind {276; LA32-CONTRACT-FAST-LABEL: fnmsub_d_nsz:277; LA32-CONTRACT-FAST:       # %bb.0:278; LA32-CONTRACT-FAST-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2279; LA32-CONTRACT-FAST-NEXT:    ret280;281; LA32-CONTRACT-ON-LABEL: fnmsub_d_nsz:282; LA32-CONTRACT-ON:       # %bb.0:283; LA32-CONTRACT-ON-NEXT:    fmul.d $fa0, $fa0, $fa1284; LA32-CONTRACT-ON-NEXT:    fsub.d $fa0, $fa2, $fa0285; LA32-CONTRACT-ON-NEXT:    ret286;287; LA32-CONTRACT-OFF-LABEL: fnmsub_d_nsz:288; LA32-CONTRACT-OFF:       # %bb.0:289; LA32-CONTRACT-OFF-NEXT:    fmul.d $fa0, $fa0, $fa1290; LA32-CONTRACT-OFF-NEXT:    fsub.d $fa0, $fa2, $fa0291; LA32-CONTRACT-OFF-NEXT:    ret292;293; LA64-CONTRACT-FAST-LABEL: fnmsub_d_nsz:294; LA64-CONTRACT-FAST:       # %bb.0:295; LA64-CONTRACT-FAST-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2296; LA64-CONTRACT-FAST-NEXT:    ret297;298; LA64-CONTRACT-ON-LABEL: fnmsub_d_nsz:299; LA64-CONTRACT-ON:       # %bb.0:300; LA64-CONTRACT-ON-NEXT:    fmul.d $fa0, $fa0, $fa1301; LA64-CONTRACT-ON-NEXT:    fsub.d $fa0, $fa2, $fa0302; LA64-CONTRACT-ON-NEXT:    ret303;304; LA64-CONTRACT-OFF-LABEL: fnmsub_d_nsz:305; LA64-CONTRACT-OFF:       # %bb.0:306; LA64-CONTRACT-OFF-NEXT:    fmul.d $fa0, $fa0, $fa1307; LA64-CONTRACT-OFF-NEXT:    fsub.d $fa0, $fa2, $fa0308; LA64-CONTRACT-OFF-NEXT:    ret309  %nega = fneg nsz double %a310  %mul = fmul nsz double %nega, %b311  %add = fadd nsz double %mul, %c312  ret double %add313}314 315;; Check that fnmsub.d is not emitted.316define double @not_fnmsub_d(double %a, double %b, double %c) nounwind {317; LA32-CONTRACT-FAST-LABEL: not_fnmsub_d:318; LA32-CONTRACT-FAST:       # %bb.0:319; LA32-CONTRACT-FAST-NEXT:    fneg.d $fa0, $fa0320; LA32-CONTRACT-FAST-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2321; LA32-CONTRACT-FAST-NEXT:    ret322;323; LA32-CONTRACT-ON-LABEL: not_fnmsub_d:324; LA32-CONTRACT-ON:       # %bb.0:325; LA32-CONTRACT-ON-NEXT:    fmul.d $fa0, $fa0, $fa1326; LA32-CONTRACT-ON-NEXT:    fsub.d $fa0, $fa2, $fa0327; LA32-CONTRACT-ON-NEXT:    ret328;329; LA32-CONTRACT-OFF-LABEL: not_fnmsub_d:330; LA32-CONTRACT-OFF:       # %bb.0:331; LA32-CONTRACT-OFF-NEXT:    fmul.d $fa0, $fa0, $fa1332; LA32-CONTRACT-OFF-NEXT:    fsub.d $fa0, $fa2, $fa0333; LA32-CONTRACT-OFF-NEXT:    ret334;335; LA64-CONTRACT-FAST-LABEL: not_fnmsub_d:336; LA64-CONTRACT-FAST:       # %bb.0:337; LA64-CONTRACT-FAST-NEXT:    fneg.d $fa0, $fa0338; LA64-CONTRACT-FAST-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2339; LA64-CONTRACT-FAST-NEXT:    ret340;341; LA64-CONTRACT-ON-LABEL: not_fnmsub_d:342; LA64-CONTRACT-ON:       # %bb.0:343; LA64-CONTRACT-ON-NEXT:    fmul.d $fa0, $fa0, $fa1344; LA64-CONTRACT-ON-NEXT:    fsub.d $fa0, $fa2, $fa0345; LA64-CONTRACT-ON-NEXT:    ret346;347; LA64-CONTRACT-OFF-LABEL: not_fnmsub_d:348; LA64-CONTRACT-OFF:       # %bb.0:349; LA64-CONTRACT-OFF-NEXT:    fmul.d $fa0, $fa0, $fa1350; LA64-CONTRACT-OFF-NEXT:    fsub.d $fa0, $fa2, $fa0351; LA64-CONTRACT-OFF-NEXT:    ret352  %nega = fneg double %a353  %mul = fmul double %nega, %b354  %add = fadd double %mul, %c355  ret double %add356}357 358define double @contract_fmadd_d(double %a, double %b, double %c) nounwind {359; LA32-CONTRACT-FAST-LABEL: contract_fmadd_d:360; LA32-CONTRACT-FAST:       # %bb.0:361; LA32-CONTRACT-FAST-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2362; LA32-CONTRACT-FAST-NEXT:    ret363;364; LA32-CONTRACT-ON-LABEL: contract_fmadd_d:365; LA32-CONTRACT-ON:       # %bb.0:366; LA32-CONTRACT-ON-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2367; LA32-CONTRACT-ON-NEXT:    ret368;369; LA32-CONTRACT-OFF-LABEL: contract_fmadd_d:370; LA32-CONTRACT-OFF:       # %bb.0:371; LA32-CONTRACT-OFF-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2372; LA32-CONTRACT-OFF-NEXT:    ret373;374; LA64-CONTRACT-FAST-LABEL: contract_fmadd_d:375; LA64-CONTRACT-FAST:       # %bb.0:376; LA64-CONTRACT-FAST-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2377; LA64-CONTRACT-FAST-NEXT:    ret378;379; LA64-CONTRACT-ON-LABEL: contract_fmadd_d:380; LA64-CONTRACT-ON:       # %bb.0:381; LA64-CONTRACT-ON-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2382; LA64-CONTRACT-ON-NEXT:    ret383;384; LA64-CONTRACT-OFF-LABEL: contract_fmadd_d:385; LA64-CONTRACT-OFF:       # %bb.0:386; LA64-CONTRACT-OFF-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2387; LA64-CONTRACT-OFF-NEXT:    ret388  %mul = fmul contract double %a, %b389  %add = fadd contract double %mul, %c390  ret double %add391}392 393define double @contract_fmsub_d(double %a, double %b, double %c) nounwind {394; LA32-CONTRACT-FAST-LABEL: contract_fmsub_d:395; LA32-CONTRACT-FAST:       # %bb.0:396; LA32-CONTRACT-FAST-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2397; LA32-CONTRACT-FAST-NEXT:    ret398;399; LA32-CONTRACT-ON-LABEL: contract_fmsub_d:400; LA32-CONTRACT-ON:       # %bb.0:401; LA32-CONTRACT-ON-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2402; LA32-CONTRACT-ON-NEXT:    ret403;404; LA32-CONTRACT-OFF-LABEL: contract_fmsub_d:405; LA32-CONTRACT-OFF:       # %bb.0:406; LA32-CONTRACT-OFF-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2407; LA32-CONTRACT-OFF-NEXT:    ret408;409; LA64-CONTRACT-FAST-LABEL: contract_fmsub_d:410; LA64-CONTRACT-FAST:       # %bb.0:411; LA64-CONTRACT-FAST-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2412; LA64-CONTRACT-FAST-NEXT:    ret413;414; LA64-CONTRACT-ON-LABEL: contract_fmsub_d:415; LA64-CONTRACT-ON:       # %bb.0:416; LA64-CONTRACT-ON-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2417; LA64-CONTRACT-ON-NEXT:    ret418;419; LA64-CONTRACT-OFF-LABEL: contract_fmsub_d:420; LA64-CONTRACT-OFF:       # %bb.0:421; LA64-CONTRACT-OFF-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2422; LA64-CONTRACT-OFF-NEXT:    ret423  %mul = fmul contract double %a, %b424  %sub = fsub contract double %mul, %c425  ret double %sub426}427 428define double @contract_fnmadd_d(double %a, double %b, double %c) nounwind {429; LA32-CONTRACT-FAST-LABEL: contract_fnmadd_d:430; LA32-CONTRACT-FAST:       # %bb.0:431; LA32-CONTRACT-FAST-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2432; LA32-CONTRACT-FAST-NEXT:    ret433;434; LA32-CONTRACT-ON-LABEL: contract_fnmadd_d:435; LA32-CONTRACT-ON:       # %bb.0:436; LA32-CONTRACT-ON-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2437; LA32-CONTRACT-ON-NEXT:    ret438;439; LA32-CONTRACT-OFF-LABEL: contract_fnmadd_d:440; LA32-CONTRACT-OFF:       # %bb.0:441; LA32-CONTRACT-OFF-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2442; LA32-CONTRACT-OFF-NEXT:    ret443;444; LA64-CONTRACT-FAST-LABEL: contract_fnmadd_d:445; LA64-CONTRACT-FAST:       # %bb.0:446; LA64-CONTRACT-FAST-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2447; LA64-CONTRACT-FAST-NEXT:    ret448;449; LA64-CONTRACT-ON-LABEL: contract_fnmadd_d:450; LA64-CONTRACT-ON:       # %bb.0:451; LA64-CONTRACT-ON-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2452; LA64-CONTRACT-ON-NEXT:    ret453;454; LA64-CONTRACT-OFF-LABEL: contract_fnmadd_d:455; LA64-CONTRACT-OFF:       # %bb.0:456; LA64-CONTRACT-OFF-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2457; LA64-CONTRACT-OFF-NEXT:    ret458  %mul = fmul contract double %a, %b459  %add = fadd contract double %mul, %c460  %negadd = fneg contract double %add461  ret double %negadd462}463 464define double @contract_fnmadd_d_nsz(double %a, double %b, double %c) nounwind {465; LA32-CONTRACT-FAST-LABEL: contract_fnmadd_d_nsz:466; LA32-CONTRACT-FAST:       # %bb.0:467; LA32-CONTRACT-FAST-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2468; LA32-CONTRACT-FAST-NEXT:    ret469;470; LA32-CONTRACT-ON-LABEL: contract_fnmadd_d_nsz:471; LA32-CONTRACT-ON:       # %bb.0:472; LA32-CONTRACT-ON-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2473; LA32-CONTRACT-ON-NEXT:    ret474;475; LA32-CONTRACT-OFF-LABEL: contract_fnmadd_d_nsz:476; LA32-CONTRACT-OFF:       # %bb.0:477; LA32-CONTRACT-OFF-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2478; LA32-CONTRACT-OFF-NEXT:    ret479;480; LA64-CONTRACT-FAST-LABEL: contract_fnmadd_d_nsz:481; LA64-CONTRACT-FAST:       # %bb.0:482; LA64-CONTRACT-FAST-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2483; LA64-CONTRACT-FAST-NEXT:    ret484;485; LA64-CONTRACT-ON-LABEL: contract_fnmadd_d_nsz:486; LA64-CONTRACT-ON:       # %bb.0:487; LA64-CONTRACT-ON-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2488; LA64-CONTRACT-ON-NEXT:    ret489;490; LA64-CONTRACT-OFF-LABEL: contract_fnmadd_d_nsz:491; LA64-CONTRACT-OFF:       # %bb.0:492; LA64-CONTRACT-OFF-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2493; LA64-CONTRACT-OFF-NEXT:    ret494  %nega = fneg contract nsz double %a495  %negc = fneg contract nsz double %c496  %mul = fmul contract nsz double %nega, %b497  %add = fadd contract nsz double %mul, %negc498  ret double %add499}500 501;; Check that fnmadd.d is not emitted.502define double @not_contract_fnmadd_d(double %a, double %b, double %c) nounwind {503; LA32-CONTRACT-FAST-LABEL: not_contract_fnmadd_d:504; LA32-CONTRACT-FAST:       # %bb.0:505; LA32-CONTRACT-FAST-NEXT:    fneg.d $fa0, $fa0506; LA32-CONTRACT-FAST-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2507; LA32-CONTRACT-FAST-NEXT:    ret508;509; LA32-CONTRACT-ON-LABEL: not_contract_fnmadd_d:510; LA32-CONTRACT-ON:       # %bb.0:511; LA32-CONTRACT-ON-NEXT:    fneg.d $fa0, $fa0512; LA32-CONTRACT-ON-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2513; LA32-CONTRACT-ON-NEXT:    ret514;515; LA32-CONTRACT-OFF-LABEL: not_contract_fnmadd_d:516; LA32-CONTRACT-OFF:       # %bb.0:517; LA32-CONTRACT-OFF-NEXT:    fneg.d $fa0, $fa0518; LA32-CONTRACT-OFF-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2519; LA32-CONTRACT-OFF-NEXT:    ret520;521; LA64-CONTRACT-FAST-LABEL: not_contract_fnmadd_d:522; LA64-CONTRACT-FAST:       # %bb.0:523; LA64-CONTRACT-FAST-NEXT:    fneg.d $fa0, $fa0524; LA64-CONTRACT-FAST-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2525; LA64-CONTRACT-FAST-NEXT:    ret526;527; LA64-CONTRACT-ON-LABEL: not_contract_fnmadd_d:528; LA64-CONTRACT-ON:       # %bb.0:529; LA64-CONTRACT-ON-NEXT:    fneg.d $fa0, $fa0530; LA64-CONTRACT-ON-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2531; LA64-CONTRACT-ON-NEXT:    ret532;533; LA64-CONTRACT-OFF-LABEL: not_contract_fnmadd_d:534; LA64-CONTRACT-OFF:       # %bb.0:535; LA64-CONTRACT-OFF-NEXT:    fneg.d $fa0, $fa0536; LA64-CONTRACT-OFF-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2537; LA64-CONTRACT-OFF-NEXT:    ret538  %nega = fneg contract double %a539  %negc = fneg contract double %c540  %mul = fmul contract double %nega, %b541  %add = fadd contract double %mul, %negc542  ret double %add543}544 545define double @contract_fnmsub_d(double %a, double %b, double %c) nounwind {546; LA32-CONTRACT-FAST-LABEL: contract_fnmsub_d:547; LA32-CONTRACT-FAST:       # %bb.0:548; LA32-CONTRACT-FAST-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2549; LA32-CONTRACT-FAST-NEXT:    ret550;551; LA32-CONTRACT-ON-LABEL: contract_fnmsub_d:552; LA32-CONTRACT-ON:       # %bb.0:553; LA32-CONTRACT-ON-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2554; LA32-CONTRACT-ON-NEXT:    ret555;556; LA32-CONTRACT-OFF-LABEL: contract_fnmsub_d:557; LA32-CONTRACT-OFF:       # %bb.0:558; LA32-CONTRACT-OFF-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2559; LA32-CONTRACT-OFF-NEXT:    ret560;561; LA64-CONTRACT-FAST-LABEL: contract_fnmsub_d:562; LA64-CONTRACT-FAST:       # %bb.0:563; LA64-CONTRACT-FAST-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2564; LA64-CONTRACT-FAST-NEXT:    ret565;566; LA64-CONTRACT-ON-LABEL: contract_fnmsub_d:567; LA64-CONTRACT-ON:       # %bb.0:568; LA64-CONTRACT-ON-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2569; LA64-CONTRACT-ON-NEXT:    ret570;571; LA64-CONTRACT-OFF-LABEL: contract_fnmsub_d:572; LA64-CONTRACT-OFF:       # %bb.0:573; LA64-CONTRACT-OFF-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2574; LA64-CONTRACT-OFF-NEXT:    ret575  %negc = fneg contract double %c576  %mul = fmul contract double %a, %b577  %add = fadd contract double %mul, %negc578  %neg = fneg contract double %add579  ret double %neg580}581 582define double @contract_fnmsub_d_nsz(double %a, double %b, double %c) nounwind {583; LA32-CONTRACT-FAST-LABEL: contract_fnmsub_d_nsz:584; LA32-CONTRACT-FAST:       # %bb.0:585; LA32-CONTRACT-FAST-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2586; LA32-CONTRACT-FAST-NEXT:    ret587;588; LA32-CONTRACT-ON-LABEL: contract_fnmsub_d_nsz:589; LA32-CONTRACT-ON:       # %bb.0:590; LA32-CONTRACT-ON-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2591; LA32-CONTRACT-ON-NEXT:    ret592;593; LA32-CONTRACT-OFF-LABEL: contract_fnmsub_d_nsz:594; LA32-CONTRACT-OFF:       # %bb.0:595; LA32-CONTRACT-OFF-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2596; LA32-CONTRACT-OFF-NEXT:    ret597;598; LA64-CONTRACT-FAST-LABEL: contract_fnmsub_d_nsz:599; LA64-CONTRACT-FAST:       # %bb.0:600; LA64-CONTRACT-FAST-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2601; LA64-CONTRACT-FAST-NEXT:    ret602;603; LA64-CONTRACT-ON-LABEL: contract_fnmsub_d_nsz:604; LA64-CONTRACT-ON:       # %bb.0:605; LA64-CONTRACT-ON-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2606; LA64-CONTRACT-ON-NEXT:    ret607;608; LA64-CONTRACT-OFF-LABEL: contract_fnmsub_d_nsz:609; LA64-CONTRACT-OFF:       # %bb.0:610; LA64-CONTRACT-OFF-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2611; LA64-CONTRACT-OFF-NEXT:    ret612  %nega = fneg contract nsz double %a613  %mul = fmul contract nsz double %nega, %b614  %add = fadd contract nsz double %mul, %c615  ret double %add616}617 618;; Check that fnmsub.d is not emitted.619define double @not_contract_fnmsub_d(double %a, double %b, double %c) nounwind {620; LA32-CONTRACT-FAST-LABEL: not_contract_fnmsub_d:621; LA32-CONTRACT-FAST:       # %bb.0:622; LA32-CONTRACT-FAST-NEXT:    fneg.d $fa0, $fa0623; LA32-CONTRACT-FAST-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2624; LA32-CONTRACT-FAST-NEXT:    ret625;626; LA32-CONTRACT-ON-LABEL: not_contract_fnmsub_d:627; LA32-CONTRACT-ON:       # %bb.0:628; LA32-CONTRACT-ON-NEXT:    fneg.d $fa0, $fa0629; LA32-CONTRACT-ON-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2630; LA32-CONTRACT-ON-NEXT:    ret631;632; LA32-CONTRACT-OFF-LABEL: not_contract_fnmsub_d:633; LA32-CONTRACT-OFF:       # %bb.0:634; LA32-CONTRACT-OFF-NEXT:    fneg.d $fa0, $fa0635; LA32-CONTRACT-OFF-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2636; LA32-CONTRACT-OFF-NEXT:    ret637;638; LA64-CONTRACT-FAST-LABEL: not_contract_fnmsub_d:639; LA64-CONTRACT-FAST:       # %bb.0:640; LA64-CONTRACT-FAST-NEXT:    fneg.d $fa0, $fa0641; LA64-CONTRACT-FAST-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2642; LA64-CONTRACT-FAST-NEXT:    ret643;644; LA64-CONTRACT-ON-LABEL: not_contract_fnmsub_d:645; LA64-CONTRACT-ON:       # %bb.0:646; LA64-CONTRACT-ON-NEXT:    fneg.d $fa0, $fa0647; LA64-CONTRACT-ON-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2648; LA64-CONTRACT-ON-NEXT:    ret649;650; LA64-CONTRACT-OFF-LABEL: not_contract_fnmsub_d:651; LA64-CONTRACT-OFF:       # %bb.0:652; LA64-CONTRACT-OFF-NEXT:    fneg.d $fa0, $fa0653; LA64-CONTRACT-OFF-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2654; LA64-CONTRACT-OFF-NEXT:    ret655  %nega = fneg contract double %a656  %mul = fmul contract double %nega, %b657  %add = fadd contract double %mul, %c658  ret double %add659}660 661declare double @llvm.fma.f64(double, double, double)662 663define double @fmadd_d_intrinsics(double %a, double %b, double %c) nounwind {664; LA32-CONTRACT-FAST-LABEL: fmadd_d_intrinsics:665; LA32-CONTRACT-FAST:       # %bb.0:666; LA32-CONTRACT-FAST-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2667; LA32-CONTRACT-FAST-NEXT:    ret668;669; LA32-CONTRACT-ON-LABEL: fmadd_d_intrinsics:670; LA32-CONTRACT-ON:       # %bb.0:671; LA32-CONTRACT-ON-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2672; LA32-CONTRACT-ON-NEXT:    ret673;674; LA32-CONTRACT-OFF-LABEL: fmadd_d_intrinsics:675; LA32-CONTRACT-OFF:       # %bb.0:676; LA32-CONTRACT-OFF-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2677; LA32-CONTRACT-OFF-NEXT:    ret678;679; LA64-CONTRACT-FAST-LABEL: fmadd_d_intrinsics:680; LA64-CONTRACT-FAST:       # %bb.0:681; LA64-CONTRACT-FAST-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2682; LA64-CONTRACT-FAST-NEXT:    ret683;684; LA64-CONTRACT-ON-LABEL: fmadd_d_intrinsics:685; LA64-CONTRACT-ON:       # %bb.0:686; LA64-CONTRACT-ON-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2687; LA64-CONTRACT-ON-NEXT:    ret688;689; LA64-CONTRACT-OFF-LABEL: fmadd_d_intrinsics:690; LA64-CONTRACT-OFF:       # %bb.0:691; LA64-CONTRACT-OFF-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2692; LA64-CONTRACT-OFF-NEXT:    ret693  %fma = call double @llvm.fma.f64(double %a, double %b, double %c)694  ret double %fma695}696 697define double @fmsub_d_intrinsics(double %a, double %b, double %c) nounwind {698; LA32-CONTRACT-FAST-LABEL: fmsub_d_intrinsics:699; LA32-CONTRACT-FAST:       # %bb.0:700; LA32-CONTRACT-FAST-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2701; LA32-CONTRACT-FAST-NEXT:    ret702;703; LA32-CONTRACT-ON-LABEL: fmsub_d_intrinsics:704; LA32-CONTRACT-ON:       # %bb.0:705; LA32-CONTRACT-ON-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2706; LA32-CONTRACT-ON-NEXT:    ret707;708; LA32-CONTRACT-OFF-LABEL: fmsub_d_intrinsics:709; LA32-CONTRACT-OFF:       # %bb.0:710; LA32-CONTRACT-OFF-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2711; LA32-CONTRACT-OFF-NEXT:    ret712;713; LA64-CONTRACT-FAST-LABEL: fmsub_d_intrinsics:714; LA64-CONTRACT-FAST:       # %bb.0:715; LA64-CONTRACT-FAST-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2716; LA64-CONTRACT-FAST-NEXT:    ret717;718; LA64-CONTRACT-ON-LABEL: fmsub_d_intrinsics:719; LA64-CONTRACT-ON:       # %bb.0:720; LA64-CONTRACT-ON-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2721; LA64-CONTRACT-ON-NEXT:    ret722;723; LA64-CONTRACT-OFF-LABEL: fmsub_d_intrinsics:724; LA64-CONTRACT-OFF:       # %bb.0:725; LA64-CONTRACT-OFF-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2726; LA64-CONTRACT-OFF-NEXT:    ret727  %negc = fneg double %c728  %fma = call double @llvm.fma.f64(double %a, double %b, double %negc)729  ret double %fma730}731 732define double @fnmadd_d_intrinsics(double %a, double %b, double %c) nounwind {733; LA32-CONTRACT-FAST-LABEL: fnmadd_d_intrinsics:734; LA32-CONTRACT-FAST:       # %bb.0:735; LA32-CONTRACT-FAST-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2736; LA32-CONTRACT-FAST-NEXT:    ret737;738; LA32-CONTRACT-ON-LABEL: fnmadd_d_intrinsics:739; LA32-CONTRACT-ON:       # %bb.0:740; LA32-CONTRACT-ON-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2741; LA32-CONTRACT-ON-NEXT:    ret742;743; LA32-CONTRACT-OFF-LABEL: fnmadd_d_intrinsics:744; LA32-CONTRACT-OFF:       # %bb.0:745; LA32-CONTRACT-OFF-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2746; LA32-CONTRACT-OFF-NEXT:    ret747;748; LA64-CONTRACT-FAST-LABEL: fnmadd_d_intrinsics:749; LA64-CONTRACT-FAST:       # %bb.0:750; LA64-CONTRACT-FAST-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2751; LA64-CONTRACT-FAST-NEXT:    ret752;753; LA64-CONTRACT-ON-LABEL: fnmadd_d_intrinsics:754; LA64-CONTRACT-ON:       # %bb.0:755; LA64-CONTRACT-ON-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2756; LA64-CONTRACT-ON-NEXT:    ret757;758; LA64-CONTRACT-OFF-LABEL: fnmadd_d_intrinsics:759; LA64-CONTRACT-OFF:       # %bb.0:760; LA64-CONTRACT-OFF-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2761; LA64-CONTRACT-OFF-NEXT:    ret762  %fma = call double @llvm.fma.f64(double %a, double %b, double %c)763  %negfma = fneg double %fma764  ret double %negfma765}766 767define double @fnmadd_d_nsz_intrinsics(double %a, double %b, double %c) nounwind {768; LA32-CONTRACT-FAST-LABEL: fnmadd_d_nsz_intrinsics:769; LA32-CONTRACT-FAST:       # %bb.0:770; LA32-CONTRACT-FAST-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2771; LA32-CONTRACT-FAST-NEXT:    ret772;773; LA32-CONTRACT-ON-LABEL: fnmadd_d_nsz_intrinsics:774; LA32-CONTRACT-ON:       # %bb.0:775; LA32-CONTRACT-ON-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2776; LA32-CONTRACT-ON-NEXT:    ret777;778; LA32-CONTRACT-OFF-LABEL: fnmadd_d_nsz_intrinsics:779; LA32-CONTRACT-OFF:       # %bb.0:780; LA32-CONTRACT-OFF-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2781; LA32-CONTRACT-OFF-NEXT:    ret782;783; LA64-CONTRACT-FAST-LABEL: fnmadd_d_nsz_intrinsics:784; LA64-CONTRACT-FAST:       # %bb.0:785; LA64-CONTRACT-FAST-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2786; LA64-CONTRACT-FAST-NEXT:    ret787;788; LA64-CONTRACT-ON-LABEL: fnmadd_d_nsz_intrinsics:789; LA64-CONTRACT-ON:       # %bb.0:790; LA64-CONTRACT-ON-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2791; LA64-CONTRACT-ON-NEXT:    ret792;793; LA64-CONTRACT-OFF-LABEL: fnmadd_d_nsz_intrinsics:794; LA64-CONTRACT-OFF:       # %bb.0:795; LA64-CONTRACT-OFF-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2796; LA64-CONTRACT-OFF-NEXT:    ret797  %nega = fneg double %a798  %negc = fneg double %c799  %fma = call nsz double @llvm.fma.f64(double %nega, double %b, double %negc)800  ret double %fma801}802 803;; Check that fnmadd.d is not emitted.804define double @not_fnmadd_d_intrinsics(double %a, double %b, double %c) nounwind {805; LA32-CONTRACT-FAST-LABEL: not_fnmadd_d_intrinsics:806; LA32-CONTRACT-FAST:       # %bb.0:807; LA32-CONTRACT-FAST-NEXT:    fneg.d $fa0, $fa0808; LA32-CONTRACT-FAST-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2809; LA32-CONTRACT-FAST-NEXT:    ret810;811; LA32-CONTRACT-ON-LABEL: not_fnmadd_d_intrinsics:812; LA32-CONTRACT-ON:       # %bb.0:813; LA32-CONTRACT-ON-NEXT:    fneg.d $fa0, $fa0814; LA32-CONTRACT-ON-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2815; LA32-CONTRACT-ON-NEXT:    ret816;817; LA32-CONTRACT-OFF-LABEL: not_fnmadd_d_intrinsics:818; LA32-CONTRACT-OFF:       # %bb.0:819; LA32-CONTRACT-OFF-NEXT:    fneg.d $fa0, $fa0820; LA32-CONTRACT-OFF-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2821; LA32-CONTRACT-OFF-NEXT:    ret822;823; LA64-CONTRACT-FAST-LABEL: not_fnmadd_d_intrinsics:824; LA64-CONTRACT-FAST:       # %bb.0:825; LA64-CONTRACT-FAST-NEXT:    fneg.d $fa0, $fa0826; LA64-CONTRACT-FAST-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2827; LA64-CONTRACT-FAST-NEXT:    ret828;829; LA64-CONTRACT-ON-LABEL: not_fnmadd_d_intrinsics:830; LA64-CONTRACT-ON:       # %bb.0:831; LA64-CONTRACT-ON-NEXT:    fneg.d $fa0, $fa0832; LA64-CONTRACT-ON-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2833; LA64-CONTRACT-ON-NEXT:    ret834;835; LA64-CONTRACT-OFF-LABEL: not_fnmadd_d_intrinsics:836; LA64-CONTRACT-OFF:       # %bb.0:837; LA64-CONTRACT-OFF-NEXT:    fneg.d $fa0, $fa0838; LA64-CONTRACT-OFF-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2839; LA64-CONTRACT-OFF-NEXT:    ret840  %nega = fneg double %a841  %negc = fneg double %c842  %fma = call double @llvm.fma.f64(double %nega, double %b, double %negc)843  ret double %fma844}845 846define double @fnmsub_d_intrinsics(double %a, double %b, double %c) nounwind {847; LA32-CONTRACT-FAST-LABEL: fnmsub_d_intrinsics:848; LA32-CONTRACT-FAST:       # %bb.0:849; LA32-CONTRACT-FAST-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2850; LA32-CONTRACT-FAST-NEXT:    ret851;852; LA32-CONTRACT-ON-LABEL: fnmsub_d_intrinsics:853; LA32-CONTRACT-ON:       # %bb.0:854; LA32-CONTRACT-ON-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2855; LA32-CONTRACT-ON-NEXT:    ret856;857; LA32-CONTRACT-OFF-LABEL: fnmsub_d_intrinsics:858; LA32-CONTRACT-OFF:       # %bb.0:859; LA32-CONTRACT-OFF-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2860; LA32-CONTRACT-OFF-NEXT:    ret861;862; LA64-CONTRACT-FAST-LABEL: fnmsub_d_intrinsics:863; LA64-CONTRACT-FAST:       # %bb.0:864; LA64-CONTRACT-FAST-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2865; LA64-CONTRACT-FAST-NEXT:    ret866;867; LA64-CONTRACT-ON-LABEL: fnmsub_d_intrinsics:868; LA64-CONTRACT-ON:       # %bb.0:869; LA64-CONTRACT-ON-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2870; LA64-CONTRACT-ON-NEXT:    ret871;872; LA64-CONTRACT-OFF-LABEL: fnmsub_d_intrinsics:873; LA64-CONTRACT-OFF:       # %bb.0:874; LA64-CONTRACT-OFF-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2875; LA64-CONTRACT-OFF-NEXT:    ret876  %negc = fneg double %c877  %fma = call double @llvm.fma.f64(double %a, double %b, double %negc)878  %negfma = fneg double %fma879  ret double %negfma880}881 882define double @fnmsub_d_nsz_intrinsics(double %a, double %b, double %c) nounwind {883; LA32-CONTRACT-FAST-LABEL: fnmsub_d_nsz_intrinsics:884; LA32-CONTRACT-FAST:       # %bb.0:885; LA32-CONTRACT-FAST-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2886; LA32-CONTRACT-FAST-NEXT:    ret887;888; LA32-CONTRACT-ON-LABEL: fnmsub_d_nsz_intrinsics:889; LA32-CONTRACT-ON:       # %bb.0:890; LA32-CONTRACT-ON-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2891; LA32-CONTRACT-ON-NEXT:    ret892;893; LA32-CONTRACT-OFF-LABEL: fnmsub_d_nsz_intrinsics:894; LA32-CONTRACT-OFF:       # %bb.0:895; LA32-CONTRACT-OFF-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2896; LA32-CONTRACT-OFF-NEXT:    ret897;898; LA64-CONTRACT-FAST-LABEL: fnmsub_d_nsz_intrinsics:899; LA64-CONTRACT-FAST:       # %bb.0:900; LA64-CONTRACT-FAST-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2901; LA64-CONTRACT-FAST-NEXT:    ret902;903; LA64-CONTRACT-ON-LABEL: fnmsub_d_nsz_intrinsics:904; LA64-CONTRACT-ON:       # %bb.0:905; LA64-CONTRACT-ON-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2906; LA64-CONTRACT-ON-NEXT:    ret907;908; LA64-CONTRACT-OFF-LABEL: fnmsub_d_nsz_intrinsics:909; LA64-CONTRACT-OFF:       # %bb.0:910; LA64-CONTRACT-OFF-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2911; LA64-CONTRACT-OFF-NEXT:    ret912  %nega = fneg double %a913  %fma = call nsz double @llvm.fma.f64(double %nega, double %b, double %c)914  ret double %fma915}916 917;; Check that fnmsub.d is not emitted.918define double @not_fnmsub_d_intrinsics(double %a, double %b, double %c) nounwind {919; LA32-CONTRACT-FAST-LABEL: not_fnmsub_d_intrinsics:920; LA32-CONTRACT-FAST:       # %bb.0:921; LA32-CONTRACT-FAST-NEXT:    fneg.d $fa0, $fa0922; LA32-CONTRACT-FAST-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2923; LA32-CONTRACT-FAST-NEXT:    ret924;925; LA32-CONTRACT-ON-LABEL: not_fnmsub_d_intrinsics:926; LA32-CONTRACT-ON:       # %bb.0:927; LA32-CONTRACT-ON-NEXT:    fneg.d $fa0, $fa0928; LA32-CONTRACT-ON-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2929; LA32-CONTRACT-ON-NEXT:    ret930;931; LA32-CONTRACT-OFF-LABEL: not_fnmsub_d_intrinsics:932; LA32-CONTRACT-OFF:       # %bb.0:933; LA32-CONTRACT-OFF-NEXT:    fneg.d $fa0, $fa0934; LA32-CONTRACT-OFF-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2935; LA32-CONTRACT-OFF-NEXT:    ret936;937; LA64-CONTRACT-FAST-LABEL: not_fnmsub_d_intrinsics:938; LA64-CONTRACT-FAST:       # %bb.0:939; LA64-CONTRACT-FAST-NEXT:    fneg.d $fa0, $fa0940; LA64-CONTRACT-FAST-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2941; LA64-CONTRACT-FAST-NEXT:    ret942;943; LA64-CONTRACT-ON-LABEL: not_fnmsub_d_intrinsics:944; LA64-CONTRACT-ON:       # %bb.0:945; LA64-CONTRACT-ON-NEXT:    fneg.d $fa0, $fa0946; LA64-CONTRACT-ON-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2947; LA64-CONTRACT-ON-NEXT:    ret948;949; LA64-CONTRACT-OFF-LABEL: not_fnmsub_d_intrinsics:950; LA64-CONTRACT-OFF:       # %bb.0:951; LA64-CONTRACT-OFF-NEXT:    fneg.d $fa0, $fa0952; LA64-CONTRACT-OFF-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2953; LA64-CONTRACT-OFF-NEXT:    ret954  %nega = fneg double %a955  %fma = call double @llvm.fma.f64(double %nega, double %b, double %c)956  ret double %fma957}958 959define double @fmadd_d_contract(double %a, double %b, double %c) nounwind {960; LA32-CONTRACT-FAST-LABEL: fmadd_d_contract:961; LA32-CONTRACT-FAST:       # %bb.0:962; LA32-CONTRACT-FAST-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2963; LA32-CONTRACT-FAST-NEXT:    ret964;965; LA32-CONTRACT-ON-LABEL: fmadd_d_contract:966; LA32-CONTRACT-ON:       # %bb.0:967; LA32-CONTRACT-ON-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2968; LA32-CONTRACT-ON-NEXT:    ret969;970; LA32-CONTRACT-OFF-LABEL: fmadd_d_contract:971; LA32-CONTRACT-OFF:       # %bb.0:972; LA32-CONTRACT-OFF-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2973; LA32-CONTRACT-OFF-NEXT:    ret974;975; LA64-CONTRACT-FAST-LABEL: fmadd_d_contract:976; LA64-CONTRACT-FAST:       # %bb.0:977; LA64-CONTRACT-FAST-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2978; LA64-CONTRACT-FAST-NEXT:    ret979;980; LA64-CONTRACT-ON-LABEL: fmadd_d_contract:981; LA64-CONTRACT-ON:       # %bb.0:982; LA64-CONTRACT-ON-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2983; LA64-CONTRACT-ON-NEXT:    ret984;985; LA64-CONTRACT-OFF-LABEL: fmadd_d_contract:986; LA64-CONTRACT-OFF:       # %bb.0:987; LA64-CONTRACT-OFF-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2988; LA64-CONTRACT-OFF-NEXT:    ret989  %mul = fmul contract double %a, %b990  %add = fadd contract double %mul, %c991  ret double %add992}993 994define double @fmsub_d_contract(double %a, double %b, double %c) nounwind {995; LA32-CONTRACT-FAST-LABEL: fmsub_d_contract:996; LA32-CONTRACT-FAST:       # %bb.0:997; LA32-CONTRACT-FAST-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2998; LA32-CONTRACT-FAST-NEXT:    ret999;1000; LA32-CONTRACT-ON-LABEL: fmsub_d_contract:1001; LA32-CONTRACT-ON:       # %bb.0:1002; LA32-CONTRACT-ON-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa21003; LA32-CONTRACT-ON-NEXT:    ret1004;1005; LA32-CONTRACT-OFF-LABEL: fmsub_d_contract:1006; LA32-CONTRACT-OFF:       # %bb.0:1007; LA32-CONTRACT-OFF-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa21008; LA32-CONTRACT-OFF-NEXT:    ret1009;1010; LA64-CONTRACT-FAST-LABEL: fmsub_d_contract:1011; LA64-CONTRACT-FAST:       # %bb.0:1012; LA64-CONTRACT-FAST-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa21013; LA64-CONTRACT-FAST-NEXT:    ret1014;1015; LA64-CONTRACT-ON-LABEL: fmsub_d_contract:1016; LA64-CONTRACT-ON:       # %bb.0:1017; LA64-CONTRACT-ON-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa21018; LA64-CONTRACT-ON-NEXT:    ret1019;1020; LA64-CONTRACT-OFF-LABEL: fmsub_d_contract:1021; LA64-CONTRACT-OFF:       # %bb.0:1022; LA64-CONTRACT-OFF-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa21023; LA64-CONTRACT-OFF-NEXT:    ret1024  %mul = fmul contract double %a, %b1025  %sub = fsub contract double %mul, %c1026  ret double %sub1027}1028 1029define double @fnmadd_d_contract(double %a, double %b, double %c) nounwind {1030; LA32-CONTRACT-FAST-LABEL: fnmadd_d_contract:1031; LA32-CONTRACT-FAST:       # %bb.0:1032; LA32-CONTRACT-FAST-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa21033; LA32-CONTRACT-FAST-NEXT:    ret1034;1035; LA32-CONTRACT-ON-LABEL: fnmadd_d_contract:1036; LA32-CONTRACT-ON:       # %bb.0:1037; LA32-CONTRACT-ON-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa21038; LA32-CONTRACT-ON-NEXT:    ret1039;1040; LA32-CONTRACT-OFF-LABEL: fnmadd_d_contract:1041; LA32-CONTRACT-OFF:       # %bb.0:1042; LA32-CONTRACT-OFF-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa21043; LA32-CONTRACT-OFF-NEXT:    ret1044;1045; LA64-CONTRACT-FAST-LABEL: fnmadd_d_contract:1046; LA64-CONTRACT-FAST:       # %bb.0:1047; LA64-CONTRACT-FAST-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa21048; LA64-CONTRACT-FAST-NEXT:    ret1049;1050; LA64-CONTRACT-ON-LABEL: fnmadd_d_contract:1051; LA64-CONTRACT-ON:       # %bb.0:1052; LA64-CONTRACT-ON-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa21053; LA64-CONTRACT-ON-NEXT:    ret1054;1055; LA64-CONTRACT-OFF-LABEL: fnmadd_d_contract:1056; LA64-CONTRACT-OFF:       # %bb.0:1057; LA64-CONTRACT-OFF-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa21058; LA64-CONTRACT-OFF-NEXT:    ret1059  %mul = fmul contract double %a, %b1060  %add = fadd contract double %mul, %c1061  %negadd = fneg contract double %add1062  ret double %negadd1063}1064 1065define double @fnmsub_d_contract(double %a, double %b, double %c) nounwind {1066; LA32-CONTRACT-FAST-LABEL: fnmsub_d_contract:1067; LA32-CONTRACT-FAST:       # %bb.0:1068; LA32-CONTRACT-FAST-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa21069; LA32-CONTRACT-FAST-NEXT:    ret1070;1071; LA32-CONTRACT-ON-LABEL: fnmsub_d_contract:1072; LA32-CONTRACT-ON:       # %bb.0:1073; LA32-CONTRACT-ON-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa21074; LA32-CONTRACT-ON-NEXT:    ret1075;1076; LA32-CONTRACT-OFF-LABEL: fnmsub_d_contract:1077; LA32-CONTRACT-OFF:       # %bb.0:1078; LA32-CONTRACT-OFF-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa21079; LA32-CONTRACT-OFF-NEXT:    ret1080;1081; LA64-CONTRACT-FAST-LABEL: fnmsub_d_contract:1082; LA64-CONTRACT-FAST:       # %bb.0:1083; LA64-CONTRACT-FAST-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa21084; LA64-CONTRACT-FAST-NEXT:    ret1085;1086; LA64-CONTRACT-ON-LABEL: fnmsub_d_contract:1087; LA64-CONTRACT-ON:       # %bb.0:1088; LA64-CONTRACT-ON-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa21089; LA64-CONTRACT-ON-NEXT:    ret1090;1091; LA64-CONTRACT-OFF-LABEL: fnmsub_d_contract:1092; LA64-CONTRACT-OFF:       # %bb.0:1093; LA64-CONTRACT-OFF-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa21094; LA64-CONTRACT-OFF-NEXT:    ret1095  %mul = fmul contract double %a, %b1096  %negc = fneg contract double %c1097  %add = fadd contract double %negc, %mul1098  %negadd = fneg contract double %add1099  ret double %negadd1100}1101