811 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc --mtriple=loongarch32 --mattr=+32s,+lsx --fp-contract=fast < %s \3; RUN: | FileCheck %s --check-prefix=CONTRACT-FAST4; RUN: llc --mtriple=loongarch64 --mattr=+lsx --fp-contract=fast < %s \5; RUN: | FileCheck %s --check-prefix=CONTRACT-FAST6; RUN: llc --mtriple=loongarch32 --mattr=+32s,+lsx --fp-contract=on < %s \7; RUN: | FileCheck %s --check-prefix=CONTRACT-ON8; RUN: llc --mtriple=loongarch64 --mattr=+lsx --fp-contract=on < %s \9; RUN: | FileCheck %s --check-prefix=CONTRACT-ON10; RUN: llc --mtriple=loongarch32 --mattr=+32s,+lsx --fp-contract=off < %s \11; RUN: | FileCheck %s --check-prefix=CONTRACT-OFF12; RUN: llc --mtriple=loongarch64 --mattr=+lsx --fp-contract=off < %s \13; RUN: | FileCheck %s --check-prefix=CONTRACT-OFF14 15define void @vfmadd_s(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {16; CONTRACT-FAST-LABEL: vfmadd_s:17; CONTRACT-FAST: # %bb.0: # %entry18; CONTRACT-FAST-NEXT: vld $vr0, $a1, 019; CONTRACT-FAST-NEXT: vld $vr1, $a2, 020; CONTRACT-FAST-NEXT: vld $vr2, $a3, 021; CONTRACT-FAST-NEXT: vfmadd.s $vr0, $vr0, $vr1, $vr222; CONTRACT-FAST-NEXT: vst $vr0, $a0, 023; CONTRACT-FAST-NEXT: ret24;25; CONTRACT-ON-LABEL: vfmadd_s:26; CONTRACT-ON: # %bb.0: # %entry27; CONTRACT-ON-NEXT: vld $vr0, $a1, 028; CONTRACT-ON-NEXT: vld $vr1, $a2, 029; CONTRACT-ON-NEXT: vld $vr2, $a3, 030; CONTRACT-ON-NEXT: vfmul.s $vr0, $vr0, $vr131; CONTRACT-ON-NEXT: vfadd.s $vr0, $vr0, $vr232; CONTRACT-ON-NEXT: vst $vr0, $a0, 033; CONTRACT-ON-NEXT: ret34;35; CONTRACT-OFF-LABEL: vfmadd_s:36; CONTRACT-OFF: # %bb.0: # %entry37; CONTRACT-OFF-NEXT: vld $vr0, $a1, 038; CONTRACT-OFF-NEXT: vld $vr1, $a2, 039; CONTRACT-OFF-NEXT: vld $vr2, $a3, 040; CONTRACT-OFF-NEXT: vfmul.s $vr0, $vr0, $vr141; CONTRACT-OFF-NEXT: vfadd.s $vr0, $vr0, $vr242; CONTRACT-OFF-NEXT: vst $vr0, $a0, 043; CONTRACT-OFF-NEXT: ret44entry:45 %v0 = load <4 x float>, ptr %a046 %v1 = load <4 x float>, ptr %a147 %v2 = load <4 x float>, ptr %a248 %mul = fmul<4 x float> %v0, %v149 %add = fadd<4 x float> %mul, %v250 store <4 x float> %add, ptr %res51 ret void52}53 54define void @vfmsub_s(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {55; CONTRACT-FAST-LABEL: vfmsub_s:56; CONTRACT-FAST: # %bb.0: # %entry57; CONTRACT-FAST-NEXT: vld $vr0, $a1, 058; CONTRACT-FAST-NEXT: vld $vr1, $a2, 059; CONTRACT-FAST-NEXT: vld $vr2, $a3, 060; CONTRACT-FAST-NEXT: vfmsub.s $vr0, $vr0, $vr1, $vr261; CONTRACT-FAST-NEXT: vst $vr0, $a0, 062; CONTRACT-FAST-NEXT: ret63;64; CONTRACT-ON-LABEL: vfmsub_s:65; CONTRACT-ON: # %bb.0: # %entry66; CONTRACT-ON-NEXT: vld $vr0, $a1, 067; CONTRACT-ON-NEXT: vld $vr1, $a2, 068; CONTRACT-ON-NEXT: vld $vr2, $a3, 069; CONTRACT-ON-NEXT: vfmul.s $vr0, $vr0, $vr170; CONTRACT-ON-NEXT: vfsub.s $vr0, $vr0, $vr271; CONTRACT-ON-NEXT: vst $vr0, $a0, 072; CONTRACT-ON-NEXT: ret73;74; CONTRACT-OFF-LABEL: vfmsub_s:75; CONTRACT-OFF: # %bb.0: # %entry76; CONTRACT-OFF-NEXT: vld $vr0, $a1, 077; CONTRACT-OFF-NEXT: vld $vr1, $a2, 078; CONTRACT-OFF-NEXT: vld $vr2, $a3, 079; CONTRACT-OFF-NEXT: vfmul.s $vr0, $vr0, $vr180; CONTRACT-OFF-NEXT: vfsub.s $vr0, $vr0, $vr281; CONTRACT-OFF-NEXT: vst $vr0, $a0, 082; CONTRACT-OFF-NEXT: ret83entry:84 %v0 = load <4 x float>, ptr %a085 %v1 = load <4 x float>, ptr %a186 %v2 = load <4 x float>, ptr %a287 %mul = fmul<4 x float> %v0, %v188 %sub = fsub<4 x float> %mul, %v289 store <4 x float> %sub, ptr %res90 ret void91}92 93define void @vfnmadd_s(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {94; CONTRACT-FAST-LABEL: vfnmadd_s:95; CONTRACT-FAST: # %bb.0: # %entry96; CONTRACT-FAST-NEXT: vld $vr0, $a1, 097; CONTRACT-FAST-NEXT: vld $vr1, $a2, 098; CONTRACT-FAST-NEXT: vld $vr2, $a3, 099; CONTRACT-FAST-NEXT: vfnmadd.s $vr0, $vr0, $vr1, $vr2100; CONTRACT-FAST-NEXT: vst $vr0, $a0, 0101; CONTRACT-FAST-NEXT: ret102;103; CONTRACT-ON-LABEL: vfnmadd_s:104; CONTRACT-ON: # %bb.0: # %entry105; CONTRACT-ON-NEXT: vld $vr0, $a1, 0106; CONTRACT-ON-NEXT: vld $vr1, $a2, 0107; CONTRACT-ON-NEXT: vld $vr2, $a3, 0108; CONTRACT-ON-NEXT: vfmul.s $vr0, $vr0, $vr1109; CONTRACT-ON-NEXT: vfadd.s $vr0, $vr0, $vr2110; CONTRACT-ON-NEXT: vbitrevi.w $vr0, $vr0, 31111; CONTRACT-ON-NEXT: vst $vr0, $a0, 0112; CONTRACT-ON-NEXT: ret113;114; CONTRACT-OFF-LABEL: vfnmadd_s:115; CONTRACT-OFF: # %bb.0: # %entry116; CONTRACT-OFF-NEXT: vld $vr0, $a1, 0117; CONTRACT-OFF-NEXT: vld $vr1, $a2, 0118; CONTRACT-OFF-NEXT: vld $vr2, $a3, 0119; CONTRACT-OFF-NEXT: vfmul.s $vr0, $vr0, $vr1120; CONTRACT-OFF-NEXT: vfadd.s $vr0, $vr0, $vr2121; CONTRACT-OFF-NEXT: vbitrevi.w $vr0, $vr0, 31122; CONTRACT-OFF-NEXT: vst $vr0, $a0, 0123; CONTRACT-OFF-NEXT: ret124entry:125 %v0 = load <4 x float>, ptr %a0126 %v1 = load <4 x float>, ptr %a1127 %v2 = load <4 x float>, ptr %a2128 %mul = fmul<4 x float> %v0, %v1129 %add = fadd<4 x float> %mul, %v2130 %negadd = fneg<4 x float> %add131 store <4 x float> %negadd, ptr %res132 ret void133}134 135define void @vfnmadd_s_nsz(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {136; CONTRACT-FAST-LABEL: vfnmadd_s_nsz:137; CONTRACT-FAST: # %bb.0: # %entry138; CONTRACT-FAST-NEXT: vld $vr0, $a1, 0139; CONTRACT-FAST-NEXT: vld $vr1, $a2, 0140; CONTRACT-FAST-NEXT: vld $vr2, $a3, 0141; CONTRACT-FAST-NEXT: vfnmadd.s $vr0, $vr0, $vr1, $vr2142; CONTRACT-FAST-NEXT: vst $vr0, $a0, 0143; CONTRACT-FAST-NEXT: ret144;145; CONTRACT-ON-LABEL: vfnmadd_s_nsz:146; CONTRACT-ON: # %bb.0: # %entry147; CONTRACT-ON-NEXT: vld $vr0, $a1, 0148; CONTRACT-ON-NEXT: vld $vr1, $a2, 0149; CONTRACT-ON-NEXT: vld $vr2, $a3, 0150; CONTRACT-ON-NEXT: vbitrevi.w $vr0, $vr0, 31151; CONTRACT-ON-NEXT: vfmul.s $vr0, $vr0, $vr1152; CONTRACT-ON-NEXT: vfsub.s $vr0, $vr0, $vr2153; CONTRACT-ON-NEXT: vst $vr0, $a0, 0154; CONTRACT-ON-NEXT: ret155;156; CONTRACT-OFF-LABEL: vfnmadd_s_nsz:157; CONTRACT-OFF: # %bb.0: # %entry158; CONTRACT-OFF-NEXT: vld $vr0, $a1, 0159; CONTRACT-OFF-NEXT: vld $vr1, $a2, 0160; CONTRACT-OFF-NEXT: vld $vr2, $a3, 0161; CONTRACT-OFF-NEXT: vbitrevi.w $vr0, $vr0, 31162; CONTRACT-OFF-NEXT: vfmul.s $vr0, $vr0, $vr1163; CONTRACT-OFF-NEXT: vfsub.s $vr0, $vr0, $vr2164; CONTRACT-OFF-NEXT: vst $vr0, $a0, 0165; CONTRACT-OFF-NEXT: ret166entry:167 %v0 = load <4 x float>, ptr %a0168 %v1 = load <4 x float>, ptr %a1169 %v2 = load <4 x float>, ptr %a2170 %negv0 = fneg nsz<4 x float> %v0171 %negv2 = fneg nsz<4 x float> %v2172 %mul = fmul nsz<4 x float> %negv0, %v1173 %add = fadd nsz<4 x float> %mul, %negv2174 store <4 x float> %add, ptr %res175 ret void176}177 178;; Check that vfnmadd.s is not emitted.179define void @not_vfnmadd_s(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {180; CONTRACT-FAST-LABEL: not_vfnmadd_s:181; CONTRACT-FAST: # %bb.0: # %entry182; CONTRACT-FAST-NEXT: vld $vr0, $a1, 0183; CONTRACT-FAST-NEXT: vld $vr1, $a2, 0184; CONTRACT-FAST-NEXT: vld $vr2, $a3, 0185; CONTRACT-FAST-NEXT: vbitrevi.w $vr0, $vr0, 31186; CONTRACT-FAST-NEXT: vfmsub.s $vr0, $vr0, $vr1, $vr2187; CONTRACT-FAST-NEXT: vst $vr0, $a0, 0188; CONTRACT-FAST-NEXT: ret189;190; CONTRACT-ON-LABEL: not_vfnmadd_s:191; CONTRACT-ON: # %bb.0: # %entry192; CONTRACT-ON-NEXT: vld $vr0, $a1, 0193; CONTRACT-ON-NEXT: vld $vr1, $a2, 0194; CONTRACT-ON-NEXT: vld $vr2, $a3, 0195; CONTRACT-ON-NEXT: vbitrevi.w $vr0, $vr0, 31196; CONTRACT-ON-NEXT: vfmul.s $vr0, $vr0, $vr1197; CONTRACT-ON-NEXT: vfsub.s $vr0, $vr0, $vr2198; CONTRACT-ON-NEXT: vst $vr0, $a0, 0199; CONTRACT-ON-NEXT: ret200;201; CONTRACT-OFF-LABEL: not_vfnmadd_s:202; CONTRACT-OFF: # %bb.0: # %entry203; CONTRACT-OFF-NEXT: vld $vr0, $a1, 0204; CONTRACT-OFF-NEXT: vld $vr1, $a2, 0205; CONTRACT-OFF-NEXT: vld $vr2, $a3, 0206; CONTRACT-OFF-NEXT: vbitrevi.w $vr0, $vr0, 31207; CONTRACT-OFF-NEXT: vfmul.s $vr0, $vr0, $vr1208; CONTRACT-OFF-NEXT: vfsub.s $vr0, $vr0, $vr2209; CONTRACT-OFF-NEXT: vst $vr0, $a0, 0210; CONTRACT-OFF-NEXT: ret211entry:212 %v0 = load <4 x float>, ptr %a0213 %v1 = load <4 x float>, ptr %a1214 %v2 = load <4 x float>, ptr %a2215 %negv0 = fneg<4 x float> %v0216 %negv2 = fneg<4 x float> %v2217 %mul = fmul<4 x float> %negv0, %v1218 %add = fadd<4 x float> %mul, %negv2219 store <4 x float> %add, ptr %res220 ret void221}222 223define void @vfnmsub_s(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {224; CONTRACT-FAST-LABEL: vfnmsub_s:225; CONTRACT-FAST: # %bb.0: # %entry226; CONTRACT-FAST-NEXT: vld $vr0, $a1, 0227; CONTRACT-FAST-NEXT: vld $vr1, $a2, 0228; CONTRACT-FAST-NEXT: vld $vr2, $a3, 0229; CONTRACT-FAST-NEXT: vfnmsub.s $vr0, $vr0, $vr1, $vr2230; CONTRACT-FAST-NEXT: vst $vr0, $a0, 0231; CONTRACT-FAST-NEXT: ret232;233; CONTRACT-ON-LABEL: vfnmsub_s:234; CONTRACT-ON: # %bb.0: # %entry235; CONTRACT-ON-NEXT: vld $vr0, $a1, 0236; CONTRACT-ON-NEXT: vld $vr1, $a2, 0237; CONTRACT-ON-NEXT: vld $vr2, $a3, 0238; CONTRACT-ON-NEXT: vfmul.s $vr0, $vr0, $vr1239; CONTRACT-ON-NEXT: vfsub.s $vr0, $vr0, $vr2240; CONTRACT-ON-NEXT: vbitrevi.w $vr0, $vr0, 31241; CONTRACT-ON-NEXT: vst $vr0, $a0, 0242; CONTRACT-ON-NEXT: ret243;244; CONTRACT-OFF-LABEL: vfnmsub_s:245; CONTRACT-OFF: # %bb.0: # %entry246; CONTRACT-OFF-NEXT: vld $vr0, $a1, 0247; CONTRACT-OFF-NEXT: vld $vr1, $a2, 0248; CONTRACT-OFF-NEXT: vld $vr2, $a3, 0249; CONTRACT-OFF-NEXT: vfmul.s $vr0, $vr0, $vr1250; CONTRACT-OFF-NEXT: vfsub.s $vr0, $vr0, $vr2251; CONTRACT-OFF-NEXT: vbitrevi.w $vr0, $vr0, 31252; CONTRACT-OFF-NEXT: vst $vr0, $a0, 0253; CONTRACT-OFF-NEXT: ret254entry:255 %v0 = load <4 x float>, ptr %a0256 %v1 = load <4 x float>, ptr %a1257 %v2 = load <4 x float>, ptr %a2258 %negv2 = fneg<4 x float> %v2259 %mul = fmul<4 x float> %v0, %v1260 %add = fadd<4 x float> %mul, %negv2261 %neg = fneg<4 x float> %add262 store <4 x float> %neg, ptr %res263 ret void264}265 266define void @vfnmsub_s_nsz(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {267; CONTRACT-FAST-LABEL: vfnmsub_s_nsz:268; CONTRACT-FAST: # %bb.0: # %entry269; CONTRACT-FAST-NEXT: vld $vr0, $a1, 0270; CONTRACT-FAST-NEXT: vld $vr1, $a2, 0271; CONTRACT-FAST-NEXT: vld $vr2, $a3, 0272; CONTRACT-FAST-NEXT: vfnmsub.s $vr0, $vr0, $vr1, $vr2273; CONTRACT-FAST-NEXT: vst $vr0, $a0, 0274; CONTRACT-FAST-NEXT: ret275;276; CONTRACT-ON-LABEL: vfnmsub_s_nsz:277; CONTRACT-ON: # %bb.0: # %entry278; CONTRACT-ON-NEXT: vld $vr0, $a1, 0279; CONTRACT-ON-NEXT: vld $vr1, $a2, 0280; CONTRACT-ON-NEXT: vld $vr2, $a3, 0281; CONTRACT-ON-NEXT: vfmul.s $vr0, $vr0, $vr1282; CONTRACT-ON-NEXT: vfsub.s $vr0, $vr2, $vr0283; CONTRACT-ON-NEXT: vst $vr0, $a0, 0284; CONTRACT-ON-NEXT: ret285;286; CONTRACT-OFF-LABEL: vfnmsub_s_nsz:287; CONTRACT-OFF: # %bb.0: # %entry288; CONTRACT-OFF-NEXT: vld $vr0, $a1, 0289; CONTRACT-OFF-NEXT: vld $vr1, $a2, 0290; CONTRACT-OFF-NEXT: vld $vr2, $a3, 0291; CONTRACT-OFF-NEXT: vfmul.s $vr0, $vr0, $vr1292; CONTRACT-OFF-NEXT: vfsub.s $vr0, $vr2, $vr0293; CONTRACT-OFF-NEXT: vst $vr0, $a0, 0294; CONTRACT-OFF-NEXT: ret295entry:296 %v0 = load <4 x float>, ptr %a0297 %v1 = load <4 x float>, ptr %a1298 %v2 = load <4 x float>, ptr %a2299 %negv0 = fneg nsz<4 x float> %v0300 %mul = fmul nsz<4 x float> %negv0, %v1301 %add = fadd nsz<4 x float> %mul, %v2302 store <4 x float> %add, ptr %res303 ret void304}305 306;; Check that vfnmsub.s is not emitted.307define void @not_vfnmsub_s(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {308; CONTRACT-FAST-LABEL: not_vfnmsub_s:309; CONTRACT-FAST: # %bb.0: # %entry310; CONTRACT-FAST-NEXT: vld $vr0, $a1, 0311; CONTRACT-FAST-NEXT: vld $vr1, $a2, 0312; CONTRACT-FAST-NEXT: vld $vr2, $a3, 0313; CONTRACT-FAST-NEXT: vbitrevi.w $vr0, $vr0, 31314; CONTRACT-FAST-NEXT: vfmadd.s $vr0, $vr0, $vr1, $vr2315; CONTRACT-FAST-NEXT: vst $vr0, $a0, 0316; CONTRACT-FAST-NEXT: ret317;318; CONTRACT-ON-LABEL: not_vfnmsub_s:319; CONTRACT-ON: # %bb.0: # %entry320; CONTRACT-ON-NEXT: vld $vr0, $a1, 0321; CONTRACT-ON-NEXT: vld $vr1, $a2, 0322; CONTRACT-ON-NEXT: vld $vr2, $a3, 0323; CONTRACT-ON-NEXT: vfmul.s $vr0, $vr0, $vr1324; CONTRACT-ON-NEXT: vfsub.s $vr0, $vr2, $vr0325; CONTRACT-ON-NEXT: vst $vr0, $a0, 0326; CONTRACT-ON-NEXT: ret327;328; CONTRACT-OFF-LABEL: not_vfnmsub_s:329; CONTRACT-OFF: # %bb.0: # %entry330; CONTRACT-OFF-NEXT: vld $vr0, $a1, 0331; CONTRACT-OFF-NEXT: vld $vr1, $a2, 0332; CONTRACT-OFF-NEXT: vld $vr2, $a3, 0333; CONTRACT-OFF-NEXT: vfmul.s $vr0, $vr0, $vr1334; CONTRACT-OFF-NEXT: vfsub.s $vr0, $vr2, $vr0335; CONTRACT-OFF-NEXT: vst $vr0, $a0, 0336; CONTRACT-OFF-NEXT: ret337entry:338 %v0 = load <4 x float>, ptr %a0339 %v1 = load <4 x float>, ptr %a1340 %v2 = load <4 x float>, ptr %a2341 %negv0 = fneg<4 x float> %v0342 %mul = fmul<4 x float> %negv0, %v1343 %add = fadd<4 x float> %mul, %v2344 store <4 x float> %add, ptr %res345 ret void346}347 348define void @contract_vfmadd_s(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {349; CONTRACT-FAST-LABEL: contract_vfmadd_s:350; CONTRACT-FAST: # %bb.0: # %entry351; CONTRACT-FAST-NEXT: vld $vr0, $a1, 0352; CONTRACT-FAST-NEXT: vld $vr1, $a2, 0353; CONTRACT-FAST-NEXT: vld $vr2, $a3, 0354; CONTRACT-FAST-NEXT: vfmadd.s $vr0, $vr0, $vr1, $vr2355; CONTRACT-FAST-NEXT: vst $vr0, $a0, 0356; CONTRACT-FAST-NEXT: ret357;358; CONTRACT-ON-LABEL: contract_vfmadd_s:359; CONTRACT-ON: # %bb.0: # %entry360; CONTRACT-ON-NEXT: vld $vr0, $a1, 0361; CONTRACT-ON-NEXT: vld $vr1, $a2, 0362; CONTRACT-ON-NEXT: vld $vr2, $a3, 0363; CONTRACT-ON-NEXT: vfmadd.s $vr0, $vr0, $vr1, $vr2364; CONTRACT-ON-NEXT: vst $vr0, $a0, 0365; CONTRACT-ON-NEXT: ret366;367; CONTRACT-OFF-LABEL: contract_vfmadd_s:368; CONTRACT-OFF: # %bb.0: # %entry369; CONTRACT-OFF-NEXT: vld $vr0, $a1, 0370; CONTRACT-OFF-NEXT: vld $vr1, $a2, 0371; CONTRACT-OFF-NEXT: vld $vr2, $a3, 0372; CONTRACT-OFF-NEXT: vfmadd.s $vr0, $vr0, $vr1, $vr2373; CONTRACT-OFF-NEXT: vst $vr0, $a0, 0374; CONTRACT-OFF-NEXT: ret375entry:376 %v0 = load <4 x float>, ptr %a0377 %v1 = load <4 x float>, ptr %a1378 %v2 = load <4 x float>, ptr %a2379 %mul = fmul contract <4 x float> %v0, %v1380 %add = fadd contract <4 x float> %mul, %v2381 store <4 x float> %add, ptr %res382 ret void383}384 385define void @contract_vfmsub_s(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {386; CONTRACT-FAST-LABEL: contract_vfmsub_s:387; CONTRACT-FAST: # %bb.0: # %entry388; CONTRACT-FAST-NEXT: vld $vr0, $a1, 0389; CONTRACT-FAST-NEXT: vld $vr1, $a2, 0390; CONTRACT-FAST-NEXT: vld $vr2, $a3, 0391; CONTRACT-FAST-NEXT: vfmsub.s $vr0, $vr0, $vr1, $vr2392; CONTRACT-FAST-NEXT: vst $vr0, $a0, 0393; CONTRACT-FAST-NEXT: ret394;395; CONTRACT-ON-LABEL: contract_vfmsub_s:396; CONTRACT-ON: # %bb.0: # %entry397; CONTRACT-ON-NEXT: vld $vr0, $a1, 0398; CONTRACT-ON-NEXT: vld $vr1, $a2, 0399; CONTRACT-ON-NEXT: vld $vr2, $a3, 0400; CONTRACT-ON-NEXT: vfmsub.s $vr0, $vr0, $vr1, $vr2401; CONTRACT-ON-NEXT: vst $vr0, $a0, 0402; CONTRACT-ON-NEXT: ret403;404; CONTRACT-OFF-LABEL: contract_vfmsub_s:405; CONTRACT-OFF: # %bb.0: # %entry406; CONTRACT-OFF-NEXT: vld $vr0, $a1, 0407; CONTRACT-OFF-NEXT: vld $vr1, $a2, 0408; CONTRACT-OFF-NEXT: vld $vr2, $a3, 0409; CONTRACT-OFF-NEXT: vfmsub.s $vr0, $vr0, $vr1, $vr2410; CONTRACT-OFF-NEXT: vst $vr0, $a0, 0411; CONTRACT-OFF-NEXT: ret412entry:413 %v0 = load <4 x float>, ptr %a0414 %v1 = load <4 x float>, ptr %a1415 %v2 = load <4 x float>, ptr %a2416 %mul = fmul contract <4 x float> %v0, %v1417 %sub = fsub contract <4 x float> %mul, %v2418 store <4 x float> %sub, ptr %res419 ret void420}421 422define void @contract_vfnmadd_s(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {423; CONTRACT-FAST-LABEL: contract_vfnmadd_s:424; CONTRACT-FAST: # %bb.0: # %entry425; CONTRACT-FAST-NEXT: vld $vr0, $a1, 0426; CONTRACT-FAST-NEXT: vld $vr1, $a2, 0427; CONTRACT-FAST-NEXT: vld $vr2, $a3, 0428; CONTRACT-FAST-NEXT: vfnmadd.s $vr0, $vr0, $vr1, $vr2429; CONTRACT-FAST-NEXT: vst $vr0, $a0, 0430; CONTRACT-FAST-NEXT: ret431;432; CONTRACT-ON-LABEL: contract_vfnmadd_s:433; CONTRACT-ON: # %bb.0: # %entry434; CONTRACT-ON-NEXT: vld $vr0, $a1, 0435; CONTRACT-ON-NEXT: vld $vr1, $a2, 0436; CONTRACT-ON-NEXT: vld $vr2, $a3, 0437; CONTRACT-ON-NEXT: vfnmadd.s $vr0, $vr0, $vr1, $vr2438; CONTRACT-ON-NEXT: vst $vr0, $a0, 0439; CONTRACT-ON-NEXT: ret440;441; CONTRACT-OFF-LABEL: contract_vfnmadd_s:442; CONTRACT-OFF: # %bb.0: # %entry443; CONTRACT-OFF-NEXT: vld $vr0, $a1, 0444; CONTRACT-OFF-NEXT: vld $vr1, $a2, 0445; CONTRACT-OFF-NEXT: vld $vr2, $a3, 0446; CONTRACT-OFF-NEXT: vfnmadd.s $vr0, $vr0, $vr1, $vr2447; CONTRACT-OFF-NEXT: vst $vr0, $a0, 0448; CONTRACT-OFF-NEXT: ret449entry:450 %v0 = load <4 x float>, ptr %a0451 %v1 = load <4 x float>, ptr %a1452 %v2 = load <4 x float>, ptr %a2453 %mul = fmul contract <4 x float> %v0, %v1454 %add = fadd contract <4 x float> %mul, %v2455 %negadd = fneg contract <4 x float> %add456 store <4 x float> %negadd, ptr %res457 ret void458}459 460define void @contract_vfnmadd_s_nsz(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {461; CONTRACT-FAST-LABEL: contract_vfnmadd_s_nsz:462; CONTRACT-FAST: # %bb.0: # %entry463; CONTRACT-FAST-NEXT: vld $vr0, $a1, 0464; CONTRACT-FAST-NEXT: vld $vr1, $a2, 0465; CONTRACT-FAST-NEXT: vld $vr2, $a3, 0466; CONTRACT-FAST-NEXT: vfnmadd.s $vr0, $vr0, $vr1, $vr2467; CONTRACT-FAST-NEXT: vst $vr0, $a0, 0468; CONTRACT-FAST-NEXT: ret469;470; CONTRACT-ON-LABEL: contract_vfnmadd_s_nsz:471; CONTRACT-ON: # %bb.0: # %entry472; CONTRACT-ON-NEXT: vld $vr0, $a1, 0473; CONTRACT-ON-NEXT: vld $vr1, $a2, 0474; CONTRACT-ON-NEXT: vld $vr2, $a3, 0475; CONTRACT-ON-NEXT: vfnmadd.s $vr0, $vr0, $vr1, $vr2476; CONTRACT-ON-NEXT: vst $vr0, $a0, 0477; CONTRACT-ON-NEXT: ret478;479; CONTRACT-OFF-LABEL: contract_vfnmadd_s_nsz:480; CONTRACT-OFF: # %bb.0: # %entry481; CONTRACT-OFF-NEXT: vld $vr0, $a1, 0482; CONTRACT-OFF-NEXT: vld $vr1, $a2, 0483; CONTRACT-OFF-NEXT: vld $vr2, $a3, 0484; CONTRACT-OFF-NEXT: vfnmadd.s $vr0, $vr0, $vr1, $vr2485; CONTRACT-OFF-NEXT: vst $vr0, $a0, 0486; CONTRACT-OFF-NEXT: ret487entry:488 %v0 = load <4 x float>, ptr %a0489 %v1 = load <4 x float>, ptr %a1490 %v2 = load <4 x float>, ptr %a2491 %negv0 = fneg contract nsz<4 x float> %v0492 %negv2 = fneg contract nsz<4 x float> %v2493 %mul = fmul contract nsz<4 x float> %negv0, %v1494 %add = fadd contract nsz<4 x float> %mul, %negv2495 store <4 x float> %add, ptr %res496 ret void497}498 499;; Check that vfnmadd.s is not emitted.500define void @not_contract_vfnmadd_s(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {501; CONTRACT-FAST-LABEL: not_contract_vfnmadd_s:502; CONTRACT-FAST: # %bb.0: # %entry503; CONTRACT-FAST-NEXT: vld $vr0, $a1, 0504; CONTRACT-FAST-NEXT: vld $vr1, $a2, 0505; CONTRACT-FAST-NEXT: vld $vr2, $a3, 0506; CONTRACT-FAST-NEXT: vbitrevi.w $vr0, $vr0, 31507; CONTRACT-FAST-NEXT: vfmsub.s $vr0, $vr0, $vr1, $vr2508; CONTRACT-FAST-NEXT: vst $vr0, $a0, 0509; CONTRACT-FAST-NEXT: ret510;511; CONTRACT-ON-LABEL: not_contract_vfnmadd_s:512; CONTRACT-ON: # %bb.0: # %entry513; CONTRACT-ON-NEXT: vld $vr0, $a1, 0514; CONTRACT-ON-NEXT: vld $vr1, $a2, 0515; CONTRACT-ON-NEXT: vld $vr2, $a3, 0516; CONTRACT-ON-NEXT: vbitrevi.w $vr0, $vr0, 31517; CONTRACT-ON-NEXT: vfmsub.s $vr0, $vr0, $vr1, $vr2518; CONTRACT-ON-NEXT: vst $vr0, $a0, 0519; CONTRACT-ON-NEXT: ret520;521; CONTRACT-OFF-LABEL: not_contract_vfnmadd_s:522; CONTRACT-OFF: # %bb.0: # %entry523; CONTRACT-OFF-NEXT: vld $vr0, $a1, 0524; CONTRACT-OFF-NEXT: vld $vr1, $a2, 0525; CONTRACT-OFF-NEXT: vld $vr2, $a3, 0526; CONTRACT-OFF-NEXT: vbitrevi.w $vr0, $vr0, 31527; CONTRACT-OFF-NEXT: vfmsub.s $vr0, $vr0, $vr1, $vr2528; CONTRACT-OFF-NEXT: vst $vr0, $a0, 0529; CONTRACT-OFF-NEXT: ret530entry:531 %v0 = load <4 x float>, ptr %a0532 %v1 = load <4 x float>, ptr %a1533 %v2 = load <4 x float>, ptr %a2534 %negv0 = fneg contract <4 x float> %v0535 %negv2 = fneg contract <4 x float> %v2536 %mul = fmul contract <4 x float> %negv0, %v1537 %add = fadd contract <4 x float> %mul, %negv2538 store <4 x float> %add, ptr %res539 ret void540}541 542define void @contract_vfnmsub_s(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {543; CONTRACT-FAST-LABEL: contract_vfnmsub_s:544; CONTRACT-FAST: # %bb.0: # %entry545; CONTRACT-FAST-NEXT: vld $vr0, $a1, 0546; CONTRACT-FAST-NEXT: vld $vr1, $a2, 0547; CONTRACT-FAST-NEXT: vld $vr2, $a3, 0548; CONTRACT-FAST-NEXT: vfnmsub.s $vr0, $vr0, $vr1, $vr2549; CONTRACT-FAST-NEXT: vst $vr0, $a0, 0550; CONTRACT-FAST-NEXT: ret551;552; CONTRACT-ON-LABEL: contract_vfnmsub_s:553; CONTRACT-ON: # %bb.0: # %entry554; CONTRACT-ON-NEXT: vld $vr0, $a1, 0555; CONTRACT-ON-NEXT: vld $vr1, $a2, 0556; CONTRACT-ON-NEXT: vld $vr2, $a3, 0557; CONTRACT-ON-NEXT: vfnmsub.s $vr0, $vr0, $vr1, $vr2558; CONTRACT-ON-NEXT: vst $vr0, $a0, 0559; CONTRACT-ON-NEXT: ret560;561; CONTRACT-OFF-LABEL: contract_vfnmsub_s:562; CONTRACT-OFF: # %bb.0: # %entry563; CONTRACT-OFF-NEXT: vld $vr0, $a1, 0564; CONTRACT-OFF-NEXT: vld $vr1, $a2, 0565; CONTRACT-OFF-NEXT: vld $vr2, $a3, 0566; CONTRACT-OFF-NEXT: vfnmsub.s $vr0, $vr0, $vr1, $vr2567; CONTRACT-OFF-NEXT: vst $vr0, $a0, 0568; CONTRACT-OFF-NEXT: ret569entry:570 %v0 = load <4 x float>, ptr %a0571 %v1 = load <4 x float>, ptr %a1572 %v2 = load <4 x float>, ptr %a2573 %negv2 = fneg contract <4 x float> %v2574 %mul = fmul contract <4 x float> %v0, %v1575 %add = fadd contract <4 x float> %mul, %negv2576 %neg = fneg contract <4 x float> %add577 store <4 x float> %neg, ptr %res578 ret void579}580 581define void @contract_vfnmsub_s_nsz(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {582; CONTRACT-FAST-LABEL: contract_vfnmsub_s_nsz:583; CONTRACT-FAST: # %bb.0: # %entry584; CONTRACT-FAST-NEXT: vld $vr0, $a1, 0585; CONTRACT-FAST-NEXT: vld $vr1, $a2, 0586; CONTRACT-FAST-NEXT: vld $vr2, $a3, 0587; CONTRACT-FAST-NEXT: vfnmsub.s $vr0, $vr0, $vr1, $vr2588; CONTRACT-FAST-NEXT: vst $vr0, $a0, 0589; CONTRACT-FAST-NEXT: ret590;591; CONTRACT-ON-LABEL: contract_vfnmsub_s_nsz:592; CONTRACT-ON: # %bb.0: # %entry593; CONTRACT-ON-NEXT: vld $vr0, $a1, 0594; CONTRACT-ON-NEXT: vld $vr1, $a2, 0595; CONTRACT-ON-NEXT: vld $vr2, $a3, 0596; CONTRACT-ON-NEXT: vfnmsub.s $vr0, $vr0, $vr1, $vr2597; CONTRACT-ON-NEXT: vst $vr0, $a0, 0598; CONTRACT-ON-NEXT: ret599;600; CONTRACT-OFF-LABEL: contract_vfnmsub_s_nsz:601; CONTRACT-OFF: # %bb.0: # %entry602; CONTRACT-OFF-NEXT: vld $vr0, $a1, 0603; CONTRACT-OFF-NEXT: vld $vr1, $a2, 0604; CONTRACT-OFF-NEXT: vld $vr2, $a3, 0605; CONTRACT-OFF-NEXT: vfnmsub.s $vr0, $vr0, $vr1, $vr2606; CONTRACT-OFF-NEXT: vst $vr0, $a0, 0607; CONTRACT-OFF-NEXT: ret608entry:609 %v0 = load <4 x float>, ptr %a0610 %v1 = load <4 x float>, ptr %a1611 %v2 = load <4 x float>, ptr %a2612 %negv0 = fneg contract nsz<4 x float> %v0613 %mul = fmul contract nsz<4 x float> %negv0, %v1614 %add = fadd contract nsz<4 x float> %mul, %v2615 store <4 x float> %add, ptr %res616 ret void617}618 619;; Check that vfnmsub.s is not emitted.620define void @not_contract_vfnmsub_s(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {621; CONTRACT-FAST-LABEL: not_contract_vfnmsub_s:622; CONTRACT-FAST: # %bb.0: # %entry623; CONTRACT-FAST-NEXT: vld $vr0, $a1, 0624; CONTRACT-FAST-NEXT: vld $vr1, $a2, 0625; CONTRACT-FAST-NEXT: vld $vr2, $a3, 0626; CONTRACT-FAST-NEXT: vbitrevi.w $vr0, $vr0, 31627; CONTRACT-FAST-NEXT: vfmadd.s $vr0, $vr0, $vr1, $vr2628; CONTRACT-FAST-NEXT: vst $vr0, $a0, 0629; CONTRACT-FAST-NEXT: ret630;631; CONTRACT-ON-LABEL: not_contract_vfnmsub_s:632; CONTRACT-ON: # %bb.0: # %entry633; CONTRACT-ON-NEXT: vld $vr0, $a1, 0634; CONTRACT-ON-NEXT: vld $vr1, $a2, 0635; CONTRACT-ON-NEXT: vld $vr2, $a3, 0636; CONTRACT-ON-NEXT: vbitrevi.w $vr0, $vr0, 31637; CONTRACT-ON-NEXT: vfmadd.s $vr0, $vr0, $vr1, $vr2638; CONTRACT-ON-NEXT: vst $vr0, $a0, 0639; CONTRACT-ON-NEXT: ret640;641; CONTRACT-OFF-LABEL: not_contract_vfnmsub_s:642; CONTRACT-OFF: # %bb.0: # %entry643; CONTRACT-OFF-NEXT: vld $vr0, $a1, 0644; CONTRACT-OFF-NEXT: vld $vr1, $a2, 0645; CONTRACT-OFF-NEXT: vld $vr2, $a3, 0646; CONTRACT-OFF-NEXT: vbitrevi.w $vr0, $vr0, 31647; CONTRACT-OFF-NEXT: vfmadd.s $vr0, $vr0, $vr1, $vr2648; CONTRACT-OFF-NEXT: vst $vr0, $a0, 0649; CONTRACT-OFF-NEXT: ret650entry:651 %v0 = load <4 x float>, ptr %a0652 %v1 = load <4 x float>, ptr %a1653 %v2 = load <4 x float>, ptr %a2654 %negv0 = fneg contract <4 x float> %v0655 %mul = fmul contract <4 x float> %negv0, %v1656 %add = fadd contract <4 x float> %mul, %v2657 store <4 x float> %add, ptr %res658 ret void659}660 661define void @vfmadd_s_contract(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {662; CONTRACT-FAST-LABEL: vfmadd_s_contract:663; CONTRACT-FAST: # %bb.0: # %entry664; CONTRACT-FAST-NEXT: vld $vr0, $a1, 0665; CONTRACT-FAST-NEXT: vld $vr1, $a2, 0666; CONTRACT-FAST-NEXT: vld $vr2, $a3, 0667; CONTRACT-FAST-NEXT: vfmadd.s $vr0, $vr0, $vr1, $vr2668; CONTRACT-FAST-NEXT: vst $vr0, $a0, 0669; CONTRACT-FAST-NEXT: ret670;671; CONTRACT-ON-LABEL: vfmadd_s_contract:672; CONTRACT-ON: # %bb.0: # %entry673; CONTRACT-ON-NEXT: vld $vr0, $a1, 0674; CONTRACT-ON-NEXT: vld $vr1, $a2, 0675; CONTRACT-ON-NEXT: vld $vr2, $a3, 0676; CONTRACT-ON-NEXT: vfmadd.s $vr0, $vr0, $vr1, $vr2677; CONTRACT-ON-NEXT: vst $vr0, $a0, 0678; CONTRACT-ON-NEXT: ret679;680; CONTRACT-OFF-LABEL: vfmadd_s_contract:681; CONTRACT-OFF: # %bb.0: # %entry682; CONTRACT-OFF-NEXT: vld $vr0, $a1, 0683; CONTRACT-OFF-NEXT: vld $vr1, $a2, 0684; CONTRACT-OFF-NEXT: vld $vr2, $a3, 0685; CONTRACT-OFF-NEXT: vfmadd.s $vr0, $vr0, $vr1, $vr2686; CONTRACT-OFF-NEXT: vst $vr0, $a0, 0687; CONTRACT-OFF-NEXT: ret688entry:689 %v0 = load <4 x float>, ptr %a0690 %v1 = load <4 x float>, ptr %a1691 %v2 = load <4 x float>, ptr %a2692 %mul = fmul contract <4 x float> %v0, %v1693 %add = fadd contract <4 x float> %mul, %v2694 store <4 x float> %add, ptr %res695 ret void696}697 698define void @vfmsub_s_contract(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {699; CONTRACT-FAST-LABEL: vfmsub_s_contract:700; CONTRACT-FAST: # %bb.0: # %entry701; CONTRACT-FAST-NEXT: vld $vr0, $a1, 0702; CONTRACT-FAST-NEXT: vld $vr1, $a2, 0703; CONTRACT-FAST-NEXT: vld $vr2, $a3, 0704; CONTRACT-FAST-NEXT: vfmsub.s $vr0, $vr0, $vr1, $vr2705; CONTRACT-FAST-NEXT: vst $vr0, $a0, 0706; CONTRACT-FAST-NEXT: ret707;708; CONTRACT-ON-LABEL: vfmsub_s_contract:709; CONTRACT-ON: # %bb.0: # %entry710; CONTRACT-ON-NEXT: vld $vr0, $a1, 0711; CONTRACT-ON-NEXT: vld $vr1, $a2, 0712; CONTRACT-ON-NEXT: vld $vr2, $a3, 0713; CONTRACT-ON-NEXT: vfmsub.s $vr0, $vr0, $vr1, $vr2714; CONTRACT-ON-NEXT: vst $vr0, $a0, 0715; CONTRACT-ON-NEXT: ret716;717; CONTRACT-OFF-LABEL: vfmsub_s_contract:718; CONTRACT-OFF: # %bb.0: # %entry719; CONTRACT-OFF-NEXT: vld $vr0, $a1, 0720; CONTRACT-OFF-NEXT: vld $vr1, $a2, 0721; CONTRACT-OFF-NEXT: vld $vr2, $a3, 0722; CONTRACT-OFF-NEXT: vfmsub.s $vr0, $vr0, $vr1, $vr2723; CONTRACT-OFF-NEXT: vst $vr0, $a0, 0724; CONTRACT-OFF-NEXT: ret725entry:726 %v0 = load <4 x float>, ptr %a0727 %v1 = load <4 x float>, ptr %a1728 %v2 = load <4 x float>, ptr %a2729 %mul = fmul contract <4 x float> %v0, %v1730 %sub = fsub contract <4 x float> %mul, %v2731 store <4 x float> %sub, ptr %res732 ret void733}734 735define void @vfnmadd_s_contract(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {736; CONTRACT-FAST-LABEL: vfnmadd_s_contract:737; CONTRACT-FAST: # %bb.0: # %entry738; CONTRACT-FAST-NEXT: vld $vr0, $a1, 0739; CONTRACT-FAST-NEXT: vld $vr1, $a2, 0740; CONTRACT-FAST-NEXT: vld $vr2, $a3, 0741; CONTRACT-FAST-NEXT: vfnmadd.s $vr0, $vr0, $vr1, $vr2742; CONTRACT-FAST-NEXT: vst $vr0, $a0, 0743; CONTRACT-FAST-NEXT: ret744;745; CONTRACT-ON-LABEL: vfnmadd_s_contract:746; CONTRACT-ON: # %bb.0: # %entry747; CONTRACT-ON-NEXT: vld $vr0, $a1, 0748; CONTRACT-ON-NEXT: vld $vr1, $a2, 0749; CONTRACT-ON-NEXT: vld $vr2, $a3, 0750; CONTRACT-ON-NEXT: vfnmadd.s $vr0, $vr0, $vr1, $vr2751; CONTRACT-ON-NEXT: vst $vr0, $a0, 0752; CONTRACT-ON-NEXT: ret753;754; CONTRACT-OFF-LABEL: vfnmadd_s_contract:755; CONTRACT-OFF: # %bb.0: # %entry756; CONTRACT-OFF-NEXT: vld $vr0, $a1, 0757; CONTRACT-OFF-NEXT: vld $vr1, $a2, 0758; CONTRACT-OFF-NEXT: vld $vr2, $a3, 0759; CONTRACT-OFF-NEXT: vfnmadd.s $vr0, $vr0, $vr1, $vr2760; CONTRACT-OFF-NEXT: vst $vr0, $a0, 0761; CONTRACT-OFF-NEXT: ret762entry:763 %v0 = load <4 x float>, ptr %a0764 %v1 = load <4 x float>, ptr %a1765 %v2 = load <4 x float>, ptr %a2766 %mul = fmul contract <4 x float> %v0, %v1767 %add = fadd contract <4 x float> %mul, %v2768 %negadd = fneg contract <4 x float> %add769 store <4 x float> %negadd, ptr %res770 ret void771}772 773define void @vfnmsub_s_contract(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {774; CONTRACT-FAST-LABEL: vfnmsub_s_contract:775; CONTRACT-FAST: # %bb.0: # %entry776; CONTRACT-FAST-NEXT: vld $vr0, $a1, 0777; CONTRACT-FAST-NEXT: vld $vr1, $a2, 0778; CONTRACT-FAST-NEXT: vld $vr2, $a3, 0779; CONTRACT-FAST-NEXT: vfnmsub.s $vr0, $vr0, $vr1, $vr2780; CONTRACT-FAST-NEXT: vst $vr0, $a0, 0781; CONTRACT-FAST-NEXT: ret782;783; CONTRACT-ON-LABEL: vfnmsub_s_contract:784; CONTRACT-ON: # %bb.0: # %entry785; CONTRACT-ON-NEXT: vld $vr0, $a1, 0786; CONTRACT-ON-NEXT: vld $vr1, $a2, 0787; CONTRACT-ON-NEXT: vld $vr2, $a3, 0788; CONTRACT-ON-NEXT: vfnmsub.s $vr0, $vr0, $vr1, $vr2789; CONTRACT-ON-NEXT: vst $vr0, $a0, 0790; CONTRACT-ON-NEXT: ret791;792; CONTRACT-OFF-LABEL: vfnmsub_s_contract:793; CONTRACT-OFF: # %bb.0: # %entry794; CONTRACT-OFF-NEXT: vld $vr0, $a1, 0795; CONTRACT-OFF-NEXT: vld $vr1, $a2, 0796; CONTRACT-OFF-NEXT: vld $vr2, $a3, 0797; CONTRACT-OFF-NEXT: vfnmsub.s $vr0, $vr0, $vr1, $vr2798; CONTRACT-OFF-NEXT: vst $vr0, $a0, 0799; CONTRACT-OFF-NEXT: ret800entry:801 %v0 = load <4 x float>, ptr %a0802 %v1 = load <4 x float>, ptr %a1803 %v2 = load <4 x float>, ptr %a2804 %mul = fmul contract <4 x float> %v0, %v1805 %negv2 = fneg contract <4 x float> %v2806 %add = fadd contract <4 x float> %negv2, %mul807 %negadd = fneg contract <4 x float> %add808 store <4 x float> %negadd, ptr %res809 ret void810}811