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