1089 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -O3 -mtriple=x86_64-pc-linux < %s | FileCheck %s --check-prefix=NOFMA3; RUN: llc -O3 -mtriple=x86_64-pc-linux -mattr=+fma < %s | FileCheck %s --check-prefixes=FMA,FMA-AVX14; RUN: llc -O3 -mtriple=x86_64-pc-linux -mattr=+fma4 < %s | FileCheck %s --check-prefix=FMA45; RUN: llc -O3 -mtriple=x86_64-pc-linux -mattr=+avx512f < %s | FileCheck %s --check-prefixes=FMA,FMA-AVX5126 7define float @f1(float %0, float %1, float %2) #0 {8; NOFMA-LABEL: f1:9; NOFMA: # %bb.0: # %entry10; NOFMA-NEXT: pushq %rax11; NOFMA-NEXT: .cfi_def_cfa_offset 1612; NOFMA-NEXT: xorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm013; NOFMA-NEXT: callq fmaf@PLT14; NOFMA-NEXT: popq %rax15; NOFMA-NEXT: .cfi_def_cfa_offset 816; NOFMA-NEXT: retq17;18; FMA-LABEL: f1:19; FMA: # %bb.0: # %entry20; FMA-NEXT: vfnmadd213ss {{.*#+}} xmm0 = -(xmm1 * xmm0) + xmm221; FMA-NEXT: retq22;23; FMA4-LABEL: f1:24; FMA4: # %bb.0: # %entry25; FMA4-NEXT: vfnmaddss {{.*#+}} xmm0 = -(xmm0 * xmm1) + xmm226; FMA4-NEXT: retq27entry:28 %3 = fneg float %029 %result = call float @llvm.experimental.constrained.fma.f32(float %3, float %1, float %2,30 metadata !"round.dynamic",31 metadata !"fpexcept.strict") #032 ret float %result33}34 35define double @f2(double %0, double %1, double %2) #0 {36; NOFMA-LABEL: f2:37; NOFMA: # %bb.0: # %entry38; NOFMA-NEXT: pushq %rax39; NOFMA-NEXT: .cfi_def_cfa_offset 1640; NOFMA-NEXT: xorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm041; NOFMA-NEXT: callq fma@PLT42; NOFMA-NEXT: popq %rax43; NOFMA-NEXT: .cfi_def_cfa_offset 844; NOFMA-NEXT: retq45;46; FMA-LABEL: f2:47; FMA: # %bb.0: # %entry48; FMA-NEXT: vfnmadd213sd {{.*#+}} xmm0 = -(xmm1 * xmm0) + xmm249; FMA-NEXT: retq50;51; FMA4-LABEL: f2:52; FMA4: # %bb.0: # %entry53; FMA4-NEXT: vfnmaddsd {{.*#+}} xmm0 = -(xmm0 * xmm1) + xmm254; FMA4-NEXT: retq55entry:56 %3 = fneg double %057 %result = call double @llvm.experimental.constrained.fma.f64(double %3, double %1, double %2,58 metadata !"round.dynamic",59 metadata !"fpexcept.strict") #060 ret double %result61}62 63define float @f3(float %0, float %1, float %2) #0 {64; NOFMA-LABEL: f3:65; NOFMA: # %bb.0: # %entry66; NOFMA-NEXT: pushq %rax67; NOFMA-NEXT: .cfi_def_cfa_offset 1668; NOFMA-NEXT: xorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm269; NOFMA-NEXT: callq fmaf@PLT70; NOFMA-NEXT: popq %rax71; NOFMA-NEXT: .cfi_def_cfa_offset 872; NOFMA-NEXT: retq73;74; FMA-LABEL: f3:75; FMA: # %bb.0: # %entry76; FMA-NEXT: vfmsub213ss {{.*#+}} xmm0 = (xmm1 * xmm0) - xmm277; FMA-NEXT: retq78;79; FMA4-LABEL: f3:80; FMA4: # %bb.0: # %entry81; FMA4-NEXT: vfmsubss {{.*#+}} xmm0 = (xmm0 * xmm1) - xmm282; FMA4-NEXT: retq83entry:84 %3 = fneg float %285 %result = call float @llvm.experimental.constrained.fma.f32(float %0, float %1, float %3,86 metadata !"round.dynamic",87 metadata !"fpexcept.strict") #088 ret float %result89}90 91define double @f4(double %0, double %1, double %2) #0 {92; NOFMA-LABEL: f4:93; NOFMA: # %bb.0: # %entry94; NOFMA-NEXT: pushq %rax95; NOFMA-NEXT: .cfi_def_cfa_offset 1696; NOFMA-NEXT: xorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm297; NOFMA-NEXT: callq fma@PLT98; NOFMA-NEXT: popq %rax99; NOFMA-NEXT: .cfi_def_cfa_offset 8100; NOFMA-NEXT: retq101;102; FMA-LABEL: f4:103; FMA: # %bb.0: # %entry104; FMA-NEXT: vfmsub213sd {{.*#+}} xmm0 = (xmm1 * xmm0) - xmm2105; FMA-NEXT: retq106;107; FMA4-LABEL: f4:108; FMA4: # %bb.0: # %entry109; FMA4-NEXT: vfmsubsd {{.*#+}} xmm0 = (xmm0 * xmm1) - xmm2110; FMA4-NEXT: retq111entry:112 %3 = fneg double %2113 %result = call double @llvm.experimental.constrained.fma.f64(double %0, double %1, double %3,114 metadata !"round.dynamic",115 metadata !"fpexcept.strict") #0116 ret double %result117}118 119define float @f5(float %0, float %1, float %2) #0 {120; NOFMA-LABEL: f5:121; NOFMA: # %bb.0: # %entry122; NOFMA-NEXT: pushq %rax123; NOFMA-NEXT: .cfi_def_cfa_offset 16124; NOFMA-NEXT: movaps {{.*#+}} xmm3 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]125; NOFMA-NEXT: xorps %xmm3, %xmm0126; NOFMA-NEXT: xorps %xmm3, %xmm2127; NOFMA-NEXT: callq fmaf@PLT128; NOFMA-NEXT: popq %rax129; NOFMA-NEXT: .cfi_def_cfa_offset 8130; NOFMA-NEXT: retq131;132; FMA-LABEL: f5:133; FMA: # %bb.0: # %entry134; FMA-NEXT: vfnmsub213ss {{.*#+}} xmm0 = -(xmm1 * xmm0) - xmm2135; FMA-NEXT: retq136;137; FMA4-LABEL: f5:138; FMA4: # %bb.0: # %entry139; FMA4-NEXT: vfnmsubss {{.*#+}} xmm0 = -(xmm0 * xmm1) - xmm2140; FMA4-NEXT: retq141entry:142 %3 = fneg float %0143 %4 = fneg float %2144 %result = call float @llvm.experimental.constrained.fma.f32(float %3, float %1, float %4,145 metadata !"round.dynamic",146 metadata !"fpexcept.strict") #0147 ret float %result148}149 150define double @f6(double %0, double %1, double %2) #0 {151; NOFMA-LABEL: f6:152; NOFMA: # %bb.0: # %entry153; NOFMA-NEXT: pushq %rax154; NOFMA-NEXT: .cfi_def_cfa_offset 16155; NOFMA-NEXT: movaps {{.*#+}} xmm3 = [-0.0E+0,-0.0E+0]156; NOFMA-NEXT: xorps %xmm3, %xmm0157; NOFMA-NEXT: xorps %xmm3, %xmm2158; NOFMA-NEXT: callq fma@PLT159; NOFMA-NEXT: popq %rax160; NOFMA-NEXT: .cfi_def_cfa_offset 8161; NOFMA-NEXT: retq162;163; FMA-LABEL: f6:164; FMA: # %bb.0: # %entry165; FMA-NEXT: vfnmsub213sd {{.*#+}} xmm0 = -(xmm1 * xmm0) - xmm2166; FMA-NEXT: retq167;168; FMA4-LABEL: f6:169; FMA4: # %bb.0: # %entry170; FMA4-NEXT: vfnmsubsd {{.*#+}} xmm0 = -(xmm0 * xmm1) - xmm2171; FMA4-NEXT: retq172entry:173 %3 = fneg double %0174 %4 = fneg double %2175 %result = call double @llvm.experimental.constrained.fma.f64(double %3, double %1, double %4,176 metadata !"round.dynamic",177 metadata !"fpexcept.strict") #0178 ret double %result179}180 181define float @f7(float %0, float %1, float %2) #0 {182; NOFMA-LABEL: f7:183; NOFMA: # %bb.0: # %entry184; NOFMA-NEXT: pushq %rax185; NOFMA-NEXT: .cfi_def_cfa_offset 16186; NOFMA-NEXT: callq fmaf@PLT187; NOFMA-NEXT: xorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0188; NOFMA-NEXT: popq %rax189; NOFMA-NEXT: .cfi_def_cfa_offset 8190; NOFMA-NEXT: retq191;192; FMA-AVX1-LABEL: f7:193; FMA-AVX1: # %bb.0: # %entry194; FMA-AVX1-NEXT: vfmadd213ss {{.*#+}} xmm0 = (xmm1 * xmm0) + xmm2195; FMA-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0196; FMA-AVX1-NEXT: retq197;198; FMA4-LABEL: f7:199; FMA4: # %bb.0: # %entry200; FMA4-NEXT: vfmaddss {{.*#+}} xmm0 = (xmm0 * xmm1) + xmm2201; FMA4-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0202; FMA4-NEXT: retq203;204; FMA-AVX512-LABEL: f7:205; FMA-AVX512: # %bb.0: # %entry206; FMA-AVX512-NEXT: vfmadd213ss {{.*#+}} xmm0 = (xmm1 * xmm0) + xmm2207; FMA-AVX512-NEXT: vbroadcastss {{.*#+}} xmm1 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]208; FMA-AVX512-NEXT: vxorps %xmm1, %xmm0, %xmm0209; FMA-AVX512-NEXT: retq210entry:211 %3 = call float @llvm.experimental.constrained.fma.f32(float %0, float %1, float %2,212 metadata !"round.dynamic",213 metadata !"fpexcept.strict") #0214 %result = fneg float %3215 ret float %result216}217 218define double @f8(double %0, double %1, double %2) #0 {219; NOFMA-LABEL: f8:220; NOFMA: # %bb.0: # %entry221; NOFMA-NEXT: pushq %rax222; NOFMA-NEXT: .cfi_def_cfa_offset 16223; NOFMA-NEXT: callq fma@PLT224; NOFMA-NEXT: xorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0225; NOFMA-NEXT: popq %rax226; NOFMA-NEXT: .cfi_def_cfa_offset 8227; NOFMA-NEXT: retq228;229; FMA-LABEL: f8:230; FMA: # %bb.0: # %entry231; FMA-NEXT: vfmadd213sd {{.*#+}} xmm0 = (xmm1 * xmm0) + xmm2232; FMA-NEXT: vxorpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0233; FMA-NEXT: retq234;235; FMA4-LABEL: f8:236; FMA4: # %bb.0: # %entry237; FMA4-NEXT: vfmaddsd {{.*#+}} xmm0 = (xmm0 * xmm1) + xmm2238; FMA4-NEXT: vxorpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0239; FMA4-NEXT: retq240entry:241 %3 = call double @llvm.experimental.constrained.fma.f64(double %0, double %1, double %2,242 metadata !"round.dynamic",243 metadata !"fpexcept.strict") #0244 %result = fneg double %3245 ret double %result246}247 248define float @f9(float %0, float %1, float %2) #0 {249; NOFMA-LABEL: f9:250; NOFMA: # %bb.0: # %entry251; NOFMA-NEXT: pushq %rax252; NOFMA-NEXT: .cfi_def_cfa_offset 16253; NOFMA-NEXT: movaps {{.*#+}} xmm3 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]254; NOFMA-NEXT: xorps %xmm3, %xmm0255; NOFMA-NEXT: xorps %xmm3, %xmm2256; NOFMA-NEXT: callq fmaf@PLT257; NOFMA-NEXT: xorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0258; NOFMA-NEXT: popq %rax259; NOFMA-NEXT: .cfi_def_cfa_offset 8260; NOFMA-NEXT: retq261;262; FMA-AVX1-LABEL: f9:263; FMA-AVX1: # %bb.0: # %entry264; FMA-AVX1-NEXT: vfnmsub213ss {{.*#+}} xmm0 = -(xmm1 * xmm0) - xmm2265; FMA-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0266; FMA-AVX1-NEXT: retq267;268; FMA4-LABEL: f9:269; FMA4: # %bb.0: # %entry270; FMA4-NEXT: vfnmsubss {{.*#+}} xmm0 = -(xmm0 * xmm1) - xmm2271; FMA4-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0272; FMA4-NEXT: retq273;274; FMA-AVX512-LABEL: f9:275; FMA-AVX512: # %bb.0: # %entry276; FMA-AVX512-NEXT: vfnmsub213ss {{.*#+}} xmm0 = -(xmm1 * xmm0) - xmm2277; FMA-AVX512-NEXT: vbroadcastss {{.*#+}} xmm1 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]278; FMA-AVX512-NEXT: vxorps %xmm1, %xmm0, %xmm0279; FMA-AVX512-NEXT: retq280entry:281 %3 = fneg float %0282 %4 = fneg float %2283 %5 = call float @llvm.experimental.constrained.fma.f32(float %3, float %1, float %4,284 metadata !"round.dynamic",285 metadata !"fpexcept.strict") #0286 %result = fneg float %5287 ret float %result288}289 290define double @f10(double %0, double %1, double %2) #0 {291; NOFMA-LABEL: f10:292; NOFMA: # %bb.0: # %entry293; NOFMA-NEXT: pushq %rax294; NOFMA-NEXT: .cfi_def_cfa_offset 16295; NOFMA-NEXT: movaps {{.*#+}} xmm3 = [-0.0E+0,-0.0E+0]296; NOFMA-NEXT: xorps %xmm3, %xmm0297; NOFMA-NEXT: xorps %xmm3, %xmm2298; NOFMA-NEXT: callq fma@PLT299; NOFMA-NEXT: xorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0300; NOFMA-NEXT: popq %rax301; NOFMA-NEXT: .cfi_def_cfa_offset 8302; NOFMA-NEXT: retq303;304; FMA-LABEL: f10:305; FMA: # %bb.0: # %entry306; FMA-NEXT: vfnmsub213sd {{.*#+}} xmm0 = -(xmm1 * xmm0) - xmm2307; FMA-NEXT: vxorpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0308; FMA-NEXT: retq309;310; FMA4-LABEL: f10:311; FMA4: # %bb.0: # %entry312; FMA4-NEXT: vfnmsubsd {{.*#+}} xmm0 = -(xmm0 * xmm1) - xmm2313; FMA4-NEXT: vxorpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0314; FMA4-NEXT: retq315entry:316 %3 = fneg double %0317 %4 = fneg double %2318 %5 = call double @llvm.experimental.constrained.fma.f64(double %3, double %1, double %4,319 metadata !"round.dynamic",320 metadata !"fpexcept.strict") #0321 %result = fneg double %5322 ret double %result323}324 325; Verify constrained fmul and fadd aren't fused.326define float @f11(float %0, float %1, float %2) #0 {327; NOFMA-LABEL: f11:328; NOFMA: # %bb.0: # %entry329; NOFMA-NEXT: mulss %xmm1, %xmm0330; NOFMA-NEXT: addss %xmm2, %xmm0331; NOFMA-NEXT: retq332;333; FMA-LABEL: f11:334; FMA: # %bb.0: # %entry335; FMA-NEXT: vmulss %xmm1, %xmm0, %xmm0336; FMA-NEXT: vaddss %xmm2, %xmm0, %xmm0337; FMA-NEXT: retq338;339; FMA4-LABEL: f11:340; FMA4: # %bb.0: # %entry341; FMA4-NEXT: vmulss %xmm1, %xmm0, %xmm0342; FMA4-NEXT: vaddss %xmm2, %xmm0, %xmm0343; FMA4-NEXT: retq344entry:345 %3 = call float @llvm.experimental.constrained.fmul.f32(float %0, float %1,346 metadata !"round.dynamic",347 metadata !"fpexcept.strict") #0348 %4 = call float @llvm.experimental.constrained.fadd.f32(float %3, float %2,349 metadata !"round.dynamic",350 metadata !"fpexcept.strict") #0351 ret float %4352}353 354; Verify constrained fmul and fadd aren't fused.355define double @f12(double %0, double %1, double %2) #0 {356; NOFMA-LABEL: f12:357; NOFMA: # %bb.0: # %entry358; NOFMA-NEXT: mulsd %xmm1, %xmm0359; NOFMA-NEXT: addsd %xmm2, %xmm0360; NOFMA-NEXT: retq361;362; FMA-LABEL: f12:363; FMA: # %bb.0: # %entry364; FMA-NEXT: vmulsd %xmm1, %xmm0, %xmm0365; FMA-NEXT: vaddsd %xmm2, %xmm0, %xmm0366; FMA-NEXT: retq367;368; FMA4-LABEL: f12:369; FMA4: # %bb.0: # %entry370; FMA4-NEXT: vmulsd %xmm1, %xmm0, %xmm0371; FMA4-NEXT: vaddsd %xmm2, %xmm0, %xmm0372; FMA4-NEXT: retq373entry:374 %3 = call double @llvm.experimental.constrained.fmul.f64(double %0, double %1,375 metadata !"round.dynamic",376 metadata !"fpexcept.strict") #0377 %4 = call double @llvm.experimental.constrained.fadd.f64(double %3, double %2,378 metadata !"round.dynamic",379 metadata !"fpexcept.strict") #0380 ret double %4381}382 383; Verify that fmuladd(3.5) isn't simplified when the rounding mode is384; unknown.385define float @f15() #0 {386; NOFMA-LABEL: f15:387; NOFMA: # %bb.0: # %entry388; NOFMA-NEXT: movss {{.*#+}} xmm1 = [3.5E+0,0.0E+0,0.0E+0,0.0E+0]389; NOFMA-NEXT: movaps %xmm1, %xmm0390; NOFMA-NEXT: mulss %xmm1, %xmm0391; NOFMA-NEXT: addss %xmm1, %xmm0392; NOFMA-NEXT: retq393;394; FMA-LABEL: f15:395; FMA: # %bb.0: # %entry396; FMA-NEXT: vmovss {{.*#+}} xmm0 = [3.5E+0,0.0E+0,0.0E+0,0.0E+0]397; FMA-NEXT: vfmadd213ss {{.*#+}} xmm0 = (xmm0 * xmm0) + xmm0398; FMA-NEXT: retq399;400; FMA4-LABEL: f15:401; FMA4: # %bb.0: # %entry402; FMA4-NEXT: vmovss {{.*#+}} xmm0 = [3.5E+0,0.0E+0,0.0E+0,0.0E+0]403; FMA4-NEXT: vfmaddss {{.*#+}} xmm0 = (xmm0 * xmm0) + xmm0404; FMA4-NEXT: retq405entry:406 %result = call float @llvm.experimental.constrained.fmuladd.f32(407 float 3.5,408 float 3.5,409 float 3.5,410 metadata !"round.dynamic",411 metadata !"fpexcept.strict") #0412 ret float %result413}414 415; Verify that fmuladd(42.1) isn't simplified when the rounding mode is416; unknown.417define double @f16() #0 {418; NOFMA-LABEL: f16:419; NOFMA: # %bb.0: # %entry420; NOFMA-NEXT: movsd {{.*#+}} xmm1 = [4.2100000000000001E+1,0.0E+0]421; NOFMA-NEXT: movapd %xmm1, %xmm0422; NOFMA-NEXT: mulsd %xmm1, %xmm0423; NOFMA-NEXT: addsd %xmm1, %xmm0424; NOFMA-NEXT: retq425;426; FMA-LABEL: f16:427; FMA: # %bb.0: # %entry428; FMA-NEXT: vmovsd {{.*#+}} xmm0 = [4.2100000000000001E+1,0.0E+0]429; FMA-NEXT: vfmadd213sd {{.*#+}} xmm0 = (xmm0 * xmm0) + xmm0430; FMA-NEXT: retq431;432; FMA4-LABEL: f16:433; FMA4: # %bb.0: # %entry434; FMA4-NEXT: vmovsd {{.*#+}} xmm0 = [4.2100000000000001E+1,0.0E+0]435; FMA4-NEXT: vfmaddsd {{.*#+}} xmm0 = (xmm0 * xmm0) + xmm0436; FMA4-NEXT: retq437entry:438 %result = call double @llvm.experimental.constrained.fmuladd.f64(439 double 42.1,440 double 42.1,441 double 42.1,442 metadata !"round.dynamic",443 metadata !"fpexcept.strict") #0444 ret double %result445}446 447; Verify that fma(3.5) isn't simplified when the rounding mode is448; unknown.449define float @f17() #0 {450; NOFMA-LABEL: f17:451; NOFMA: # %bb.0: # %entry452; NOFMA-NEXT: pushq %rax453; NOFMA-NEXT: .cfi_def_cfa_offset 16454; NOFMA-NEXT: movss {{.*#+}} xmm0 = [3.5E+0,0.0E+0,0.0E+0,0.0E+0]455; NOFMA-NEXT: movaps %xmm0, %xmm1456; NOFMA-NEXT: movaps %xmm0, %xmm2457; NOFMA-NEXT: callq fmaf@PLT458; NOFMA-NEXT: popq %rax459; NOFMA-NEXT: .cfi_def_cfa_offset 8460; NOFMA-NEXT: retq461;462; FMA-LABEL: f17:463; FMA: # %bb.0: # %entry464; FMA-NEXT: vmovss {{.*#+}} xmm0 = [3.5E+0,0.0E+0,0.0E+0,0.0E+0]465; FMA-NEXT: vfmadd213ss {{.*#+}} xmm0 = (xmm0 * xmm0) + xmm0466; FMA-NEXT: retq467;468; FMA4-LABEL: f17:469; FMA4: # %bb.0: # %entry470; FMA4-NEXT: vmovss {{.*#+}} xmm0 = [3.5E+0,0.0E+0,0.0E+0,0.0E+0]471; FMA4-NEXT: vfmaddss {{.*#+}} xmm0 = (xmm0 * xmm0) + xmm0472; FMA4-NEXT: retq473entry:474 %result = call float @llvm.experimental.constrained.fma.f32(475 float 3.5,476 float 3.5,477 float 3.5,478 metadata !"round.dynamic",479 metadata !"fpexcept.strict") #0480 ret float %result481}482 483; Verify that fma(42.1) isn't simplified when the rounding mode is484; unknown.485define double @f18() #0 {486; NOFMA-LABEL: f18:487; NOFMA: # %bb.0: # %entry488; NOFMA-NEXT: pushq %rax489; NOFMA-NEXT: .cfi_def_cfa_offset 16490; NOFMA-NEXT: movsd {{.*#+}} xmm0 = [4.2100000000000001E+1,0.0E+0]491; NOFMA-NEXT: movaps %xmm0, %xmm1492; NOFMA-NEXT: movaps %xmm0, %xmm2493; NOFMA-NEXT: callq fma@PLT494; NOFMA-NEXT: popq %rax495; NOFMA-NEXT: .cfi_def_cfa_offset 8496; NOFMA-NEXT: retq497;498; FMA-LABEL: f18:499; FMA: # %bb.0: # %entry500; FMA-NEXT: vmovsd {{.*#+}} xmm0 = [4.2100000000000001E+1,0.0E+0]501; FMA-NEXT: vfmadd213sd {{.*#+}} xmm0 = (xmm0 * xmm0) + xmm0502; FMA-NEXT: retq503;504; FMA4-LABEL: f18:505; FMA4: # %bb.0: # %entry506; FMA4-NEXT: vmovsd {{.*#+}} xmm0 = [4.2100000000000001E+1,0.0E+0]507; FMA4-NEXT: vfmaddsd {{.*#+}} xmm0 = (xmm0 * xmm0) + xmm0508; FMA4-NEXT: retq509entry:510 %result = call double @llvm.experimental.constrained.fma.f64(511 double 42.1,512 double 42.1,513 double 42.1,514 metadata !"round.dynamic",515 metadata !"fpexcept.strict") #0516 ret double %result517}518 519define <4 x float> @f19(<4 x float> %0, <4 x float> %1, <4 x float> %2) #0 {520; NOFMA-LABEL: f19:521; NOFMA: # %bb.0: # %entry522; NOFMA-NEXT: subq $88, %rsp523; NOFMA-NEXT: .cfi_def_cfa_offset 96524; NOFMA-NEXT: movaps %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill525; NOFMA-NEXT: movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill526; NOFMA-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0527; NOFMA-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill528; NOFMA-NEXT: shufps {{.*#+}} xmm1 = xmm1[3,3,3,3]529; NOFMA-NEXT: shufps {{.*#+}} xmm2 = xmm2[3,3,3,3]530; NOFMA-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]531; NOFMA-NEXT: callq fmaf@PLT532; NOFMA-NEXT: movdqa %xmm0, (%rsp) # 16-byte Spill533; NOFMA-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload534; NOFMA-NEXT: movhlps {{.*#+}} xmm1 = xmm1[1,1]535; NOFMA-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload536; NOFMA-NEXT: movhlps {{.*#+}} xmm2 = xmm2[1,1]537; NOFMA-NEXT: pshufd $238, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload538; NOFMA-NEXT: # xmm0 = mem[2,3,2,3]539; NOFMA-NEXT: callq fmaf@PLT540; NOFMA-NEXT: punpckldq (%rsp), %xmm0 # 16-byte Folded Reload541; NOFMA-NEXT: # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]542; NOFMA-NEXT: movdqa %xmm0, (%rsp) # 16-byte Spill543; NOFMA-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload544; NOFMA-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload545; NOFMA-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload546; NOFMA-NEXT: callq fmaf@PLT547; NOFMA-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill548; NOFMA-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload549; NOFMA-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,1,1,1]550; NOFMA-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload551; NOFMA-NEXT: shufps {{.*#+}} xmm2 = xmm2[1,1,1,1]552; NOFMA-NEXT: pshufd $85, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload553; NOFMA-NEXT: # xmm0 = mem[1,1,1,1]554; NOFMA-NEXT: callq fmaf@PLT555; NOFMA-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload556; NOFMA-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]557; NOFMA-NEXT: punpcklqdq (%rsp), %xmm1 # 16-byte Folded Reload558; NOFMA-NEXT: # xmm1 = xmm1[0],mem[0]559; NOFMA-NEXT: movdqa %xmm1, %xmm0560; NOFMA-NEXT: addq $88, %rsp561; NOFMA-NEXT: .cfi_def_cfa_offset 8562; NOFMA-NEXT: retq563;564; FMA-LABEL: f19:565; FMA: # %bb.0: # %entry566; FMA-NEXT: vfnmadd213ps {{.*#+}} xmm0 = -(xmm1 * xmm0) + xmm2567; FMA-NEXT: retq568;569; FMA4-LABEL: f19:570; FMA4: # %bb.0: # %entry571; FMA4-NEXT: vfnmaddps {{.*#+}} xmm0 = -(xmm0 * xmm1) + xmm2572; FMA4-NEXT: retq573entry:574 %3 = fneg <4 x float> %0575 %result = call <4 x float> @llvm.experimental.constrained.fma.v4f32(<4 x float> %3, <4 x float> %1, <4 x float> %2,576 metadata !"round.dynamic",577 metadata !"fpexcept.strict") #0578 ret <4 x float> %result579}580 581define <2 x double> @f20(<2 x double> %0, <2 x double> %1, <2 x double> %2) #0 {582; NOFMA-LABEL: f20:583; NOFMA: # %bb.0: # %entry584; NOFMA-NEXT: subq $72, %rsp585; NOFMA-NEXT: .cfi_def_cfa_offset 80586; NOFMA-NEXT: movaps %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill587; NOFMA-NEXT: movaps %xmm1, (%rsp) # 16-byte Spill588; NOFMA-NEXT: xorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0589; NOFMA-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill590; NOFMA-NEXT: callq fma@PLT591; NOFMA-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill592; NOFMA-NEXT: movaps (%rsp), %xmm1 # 16-byte Reload593; NOFMA-NEXT: movhlps {{.*#+}} xmm1 = xmm1[1,1]594; NOFMA-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload595; NOFMA-NEXT: movhlps {{.*#+}} xmm2 = xmm2[1,1]596; NOFMA-NEXT: pshufd $238, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload597; NOFMA-NEXT: # xmm0 = mem[2,3,2,3]598; NOFMA-NEXT: callq fma@PLT599; NOFMA-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload600; NOFMA-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]601; NOFMA-NEXT: movdqa %xmm1, %xmm0602; NOFMA-NEXT: addq $72, %rsp603; NOFMA-NEXT: .cfi_def_cfa_offset 8604; NOFMA-NEXT: retq605;606; FMA-LABEL: f20:607; FMA: # %bb.0: # %entry608; FMA-NEXT: vfnmadd213pd {{.*#+}} xmm0 = -(xmm1 * xmm0) + xmm2609; FMA-NEXT: retq610;611; FMA4-LABEL: f20:612; FMA4: # %bb.0: # %entry613; FMA4-NEXT: vfnmaddpd {{.*#+}} xmm0 = -(xmm0 * xmm1) + xmm2614; FMA4-NEXT: retq615entry:616 %3 = fneg <2 x double> %0617 %result = call <2 x double> @llvm.experimental.constrained.fma.v2f64(<2 x double> %3, <2 x double> %1, <2 x double> %2,618 metadata !"round.dynamic",619 metadata !"fpexcept.strict") #0620 ret <2 x double> %result621}622 623define <4 x float> @f21(<4 x float> %0, <4 x float> %1, <4 x float> %2) #0 {624; NOFMA-LABEL: f21:625; NOFMA: # %bb.0: # %entry626; NOFMA-NEXT: subq $88, %rsp627; NOFMA-NEXT: .cfi_def_cfa_offset 96628; NOFMA-NEXT: movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill629; NOFMA-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill630; NOFMA-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2631; NOFMA-NEXT: movdqa %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill632; NOFMA-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,3,3,3]633; NOFMA-NEXT: shufps {{.*#+}} xmm1 = xmm1[3,3,3,3]634; NOFMA-NEXT: pshufd {{.*#+}} xmm2 = xmm2[3,3,3,3]635; NOFMA-NEXT: callq fmaf@PLT636; NOFMA-NEXT: movaps %xmm0, (%rsp) # 16-byte Spill637; NOFMA-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload638; NOFMA-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1]639; NOFMA-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload640; NOFMA-NEXT: movhlps {{.*#+}} xmm1 = xmm1[1,1]641; NOFMA-NEXT: pshufd $238, {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Folded Reload642; NOFMA-NEXT: # xmm2 = mem[2,3,2,3]643; NOFMA-NEXT: callq fmaf@PLT644; NOFMA-NEXT: unpcklps (%rsp), %xmm0 # 16-byte Folded Reload645; NOFMA-NEXT: # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]646; NOFMA-NEXT: movaps %xmm0, (%rsp) # 16-byte Spill647; NOFMA-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload648; NOFMA-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload649; NOFMA-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload650; NOFMA-NEXT: callq fmaf@PLT651; NOFMA-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill652; NOFMA-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload653; NOFMA-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]654; NOFMA-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload655; NOFMA-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,1,1,1]656; NOFMA-NEXT: pshufd $85, {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Folded Reload657; NOFMA-NEXT: # xmm2 = mem[1,1,1,1]658; NOFMA-NEXT: callq fmaf@PLT659; NOFMA-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload660; NOFMA-NEXT: unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]661; NOFMA-NEXT: unpcklpd (%rsp), %xmm1 # 16-byte Folded Reload662; NOFMA-NEXT: # xmm1 = xmm1[0],mem[0]663; NOFMA-NEXT: movaps %xmm1, %xmm0664; NOFMA-NEXT: addq $88, %rsp665; NOFMA-NEXT: .cfi_def_cfa_offset 8666; NOFMA-NEXT: retq667;668; FMA-LABEL: f21:669; FMA: # %bb.0: # %entry670; FMA-NEXT: vfmsub213ps {{.*#+}} xmm0 = (xmm1 * xmm0) - xmm2671; FMA-NEXT: retq672;673; FMA4-LABEL: f21:674; FMA4: # %bb.0: # %entry675; FMA4-NEXT: vfmsubps {{.*#+}} xmm0 = (xmm0 * xmm1) - xmm2676; FMA4-NEXT: retq677entry:678 %3 = fneg <4 x float> %2679 %result = call <4 x float> @llvm.experimental.constrained.fma.v4f32(<4 x float> %0, <4 x float> %1, <4 x float> %3,680 metadata !"round.dynamic",681 metadata !"fpexcept.strict") #0682 ret <4 x float> %result683}684 685define <2 x double> @f22(<2 x double> %0, <2 x double> %1, <2 x double> %2) #0 {686; NOFMA-LABEL: f22:687; NOFMA: # %bb.0: # %entry688; NOFMA-NEXT: subq $72, %rsp689; NOFMA-NEXT: .cfi_def_cfa_offset 80690; NOFMA-NEXT: movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill691; NOFMA-NEXT: movaps %xmm0, (%rsp) # 16-byte Spill692; NOFMA-NEXT: xorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2693; NOFMA-NEXT: movaps %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill694; NOFMA-NEXT: callq fma@PLT695; NOFMA-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill696; NOFMA-NEXT: movaps (%rsp), %xmm0 # 16-byte Reload697; NOFMA-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1]698; NOFMA-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload699; NOFMA-NEXT: movhlps {{.*#+}} xmm1 = xmm1[1,1]700; NOFMA-NEXT: pshufd $238, {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Folded Reload701; NOFMA-NEXT: # xmm2 = mem[2,3,2,3]702; NOFMA-NEXT: callq fma@PLT703; NOFMA-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload704; NOFMA-NEXT: movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]705; NOFMA-NEXT: movaps %xmm1, %xmm0706; NOFMA-NEXT: addq $72, %rsp707; NOFMA-NEXT: .cfi_def_cfa_offset 8708; NOFMA-NEXT: retq709;710; FMA-LABEL: f22:711; FMA: # %bb.0: # %entry712; FMA-NEXT: vfmsub213pd {{.*#+}} xmm0 = (xmm1 * xmm0) - xmm2713; FMA-NEXT: retq714;715; FMA4-LABEL: f22:716; FMA4: # %bb.0: # %entry717; FMA4-NEXT: vfmsubpd {{.*#+}} xmm0 = (xmm0 * xmm1) - xmm2718; FMA4-NEXT: retq719entry:720 %3 = fneg <2 x double> %2721 %result = call <2 x double> @llvm.experimental.constrained.fma.v2f64(<2 x double> %0, <2 x double> %1, <2 x double> %3,722 metadata !"round.dynamic",723 metadata !"fpexcept.strict") #0724 ret <2 x double> %result725}726 727define <4 x float> @f23(<4 x float> %0, <4 x float> %1, <4 x float> %2) #0 {728; NOFMA-LABEL: f23:729; NOFMA: # %bb.0: # %entry730; NOFMA-NEXT: subq $88, %rsp731; NOFMA-NEXT: .cfi_def_cfa_offset 96732; NOFMA-NEXT: movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill733; NOFMA-NEXT: movdqa {{.*#+}} xmm3 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]734; NOFMA-NEXT: pxor %xmm3, %xmm0735; NOFMA-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill736; NOFMA-NEXT: pxor %xmm3, %xmm2737; NOFMA-NEXT: movdqa %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill738; NOFMA-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]739; NOFMA-NEXT: pshufd {{.*#+}} xmm2 = xmm2[3,3,3,3]740; NOFMA-NEXT: shufps {{.*#+}} xmm1 = xmm1[3,3,3,3]741; NOFMA-NEXT: callq fmaf@PLT742; NOFMA-NEXT: movdqa %xmm0, (%rsp) # 16-byte Spill743; NOFMA-NEXT: pshufd $238, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload744; NOFMA-NEXT: # xmm0 = mem[2,3,2,3]745; NOFMA-NEXT: pshufd $238, {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Folded Reload746; NOFMA-NEXT: # xmm2 = mem[2,3,2,3]747; NOFMA-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload748; NOFMA-NEXT: movhlps {{.*#+}} xmm1 = xmm1[1,1]749; NOFMA-NEXT: callq fmaf@PLT750; NOFMA-NEXT: punpckldq (%rsp), %xmm0 # 16-byte Folded Reload751; NOFMA-NEXT: # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]752; NOFMA-NEXT: movdqa %xmm0, (%rsp) # 16-byte Spill753; NOFMA-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload754; NOFMA-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload755; NOFMA-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload756; NOFMA-NEXT: callq fmaf@PLT757; NOFMA-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill758; NOFMA-NEXT: pshufd $85, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload759; NOFMA-NEXT: # xmm0 = mem[1,1,1,1]760; NOFMA-NEXT: pshufd $85, {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Folded Reload761; NOFMA-NEXT: # xmm2 = mem[1,1,1,1]762; NOFMA-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload763; NOFMA-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,1,1,1]764; NOFMA-NEXT: callq fmaf@PLT765; NOFMA-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload766; NOFMA-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]767; NOFMA-NEXT: punpcklqdq (%rsp), %xmm1 # 16-byte Folded Reload768; NOFMA-NEXT: # xmm1 = xmm1[0],mem[0]769; NOFMA-NEXT: movdqa %xmm1, %xmm0770; NOFMA-NEXT: addq $88, %rsp771; NOFMA-NEXT: .cfi_def_cfa_offset 8772; NOFMA-NEXT: retq773;774; FMA-LABEL: f23:775; FMA: # %bb.0: # %entry776; FMA-NEXT: vfnmsub213ps {{.*#+}} xmm0 = -(xmm1 * xmm0) - xmm2777; FMA-NEXT: retq778;779; FMA4-LABEL: f23:780; FMA4: # %bb.0: # %entry781; FMA4-NEXT: vfnmsubps {{.*#+}} xmm0 = -(xmm0 * xmm1) - xmm2782; FMA4-NEXT: retq783entry:784 %3 = fneg <4 x float> %0785 %4 = fneg <4 x float> %2786 %result = call <4 x float> @llvm.experimental.constrained.fma.v4f32(<4 x float> %3, <4 x float> %1, <4 x float> %4,787 metadata !"round.dynamic",788 metadata !"fpexcept.strict") #0789 ret <4 x float> %result790}791 792define <2 x double> @f24(<2 x double> %0, <2 x double> %1, <2 x double> %2) #0 {793; NOFMA-LABEL: f24:794; NOFMA: # %bb.0: # %entry795; NOFMA-NEXT: subq $72, %rsp796; NOFMA-NEXT: .cfi_def_cfa_offset 80797; NOFMA-NEXT: movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill798; NOFMA-NEXT: movaps {{.*#+}} xmm3 = [-0.0E+0,-0.0E+0]799; NOFMA-NEXT: xorps %xmm3, %xmm0800; NOFMA-NEXT: movaps %xmm0, (%rsp) # 16-byte Spill801; NOFMA-NEXT: xorps %xmm3, %xmm2802; NOFMA-NEXT: movaps %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill803; NOFMA-NEXT: callq fma@PLT804; NOFMA-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill805; NOFMA-NEXT: pshufd $238, (%rsp), %xmm0 # 16-byte Folded Reload806; NOFMA-NEXT: # xmm0 = mem[2,3,2,3]807; NOFMA-NEXT: pshufd $238, {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Folded Reload808; NOFMA-NEXT: # xmm2 = mem[2,3,2,3]809; NOFMA-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload810; NOFMA-NEXT: movhlps {{.*#+}} xmm1 = xmm1[1,1]811; NOFMA-NEXT: callq fma@PLT812; NOFMA-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload813; NOFMA-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]814; NOFMA-NEXT: movdqa %xmm1, %xmm0815; NOFMA-NEXT: addq $72, %rsp816; NOFMA-NEXT: .cfi_def_cfa_offset 8817; NOFMA-NEXT: retq818;819; FMA-LABEL: f24:820; FMA: # %bb.0: # %entry821; FMA-NEXT: vfnmsub213pd {{.*#+}} xmm0 = -(xmm1 * xmm0) - xmm2822; FMA-NEXT: retq823;824; FMA4-LABEL: f24:825; FMA4: # %bb.0: # %entry826; FMA4-NEXT: vfnmsubpd {{.*#+}} xmm0 = -(xmm0 * xmm1) - xmm2827; FMA4-NEXT: retq828entry:829 %3 = fneg <2 x double> %0830 %4 = fneg <2 x double> %2831 %result = call <2 x double> @llvm.experimental.constrained.fma.v2f64(<2 x double> %3, <2 x double> %1, <2 x double> %4,832 metadata !"round.dynamic",833 metadata !"fpexcept.strict") #0834 ret <2 x double> %result835}836 837define <4 x float> @f25(<4 x float> %0, <4 x float> %1, <4 x float> %2) #0 {838; NOFMA-LABEL: f25:839; NOFMA: # %bb.0: # %entry840; NOFMA-NEXT: subq $88, %rsp841; NOFMA-NEXT: .cfi_def_cfa_offset 96842; NOFMA-NEXT: movaps %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill843; NOFMA-NEXT: movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill844; NOFMA-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill845; NOFMA-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,3,3,3]846; NOFMA-NEXT: shufps {{.*#+}} xmm1 = xmm1[3,3,3,3]847; NOFMA-NEXT: shufps {{.*#+}} xmm2 = xmm2[3,3,3,3]848; NOFMA-NEXT: callq fmaf@PLT849; NOFMA-NEXT: movaps %xmm0, (%rsp) # 16-byte Spill850; NOFMA-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload851; NOFMA-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1]852; NOFMA-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload853; NOFMA-NEXT: movhlps {{.*#+}} xmm1 = xmm1[1,1]854; NOFMA-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload855; NOFMA-NEXT: movhlps {{.*#+}} xmm2 = xmm2[1,1]856; NOFMA-NEXT: callq fmaf@PLT857; NOFMA-NEXT: unpcklps (%rsp), %xmm0 # 16-byte Folded Reload858; NOFMA-NEXT: # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]859; NOFMA-NEXT: movaps %xmm0, (%rsp) # 16-byte Spill860; NOFMA-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload861; NOFMA-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload862; NOFMA-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload863; NOFMA-NEXT: callq fmaf@PLT864; NOFMA-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill865; NOFMA-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload866; NOFMA-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]867; NOFMA-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload868; NOFMA-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,1,1,1]869; NOFMA-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload870; NOFMA-NEXT: shufps {{.*#+}} xmm2 = xmm2[1,1,1,1]871; NOFMA-NEXT: callq fmaf@PLT872; NOFMA-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload873; NOFMA-NEXT: unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]874; NOFMA-NEXT: unpcklpd (%rsp), %xmm1 # 16-byte Folded Reload875; NOFMA-NEXT: # xmm1 = xmm1[0],mem[0]876; NOFMA-NEXT: xorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1877; NOFMA-NEXT: movaps %xmm1, %xmm0878; NOFMA-NEXT: addq $88, %rsp879; NOFMA-NEXT: .cfi_def_cfa_offset 8880; NOFMA-NEXT: retq881;882; FMA-AVX1-LABEL: f25:883; FMA-AVX1: # %bb.0: # %entry884; FMA-AVX1-NEXT: vfmadd213ps {{.*#+}} xmm0 = (xmm1 * xmm0) + xmm2885; FMA-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0886; FMA-AVX1-NEXT: retq887;888; FMA4-LABEL: f25:889; FMA4: # %bb.0: # %entry890; FMA4-NEXT: vfmaddps {{.*#+}} xmm0 = (xmm0 * xmm1) + xmm2891; FMA4-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0892; FMA4-NEXT: retq893;894; FMA-AVX512-LABEL: f25:895; FMA-AVX512: # %bb.0: # %entry896; FMA-AVX512-NEXT: vfmadd213ps {{.*#+}} xmm0 = (xmm1 * xmm0) + xmm2897; FMA-AVX512-NEXT: vbroadcastss {{.*#+}} xmm1 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]898; FMA-AVX512-NEXT: vxorps %xmm1, %xmm0, %xmm0899; FMA-AVX512-NEXT: retq900entry:901 %3 = call <4 x float> @llvm.experimental.constrained.fma.v4f32(<4 x float> %0, <4 x float> %1, <4 x float> %2,902 metadata !"round.dynamic",903 metadata !"fpexcept.strict") #0904 %result = fneg <4 x float> %3905 ret <4 x float> %result906}907 908define <2 x double> @f26(<2 x double> %0, <2 x double> %1, <2 x double> %2) #0 {909; NOFMA-LABEL: f26:910; NOFMA: # %bb.0: # %entry911; NOFMA-NEXT: subq $72, %rsp912; NOFMA-NEXT: .cfi_def_cfa_offset 80913; NOFMA-NEXT: movaps %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill914; NOFMA-NEXT: movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill915; NOFMA-NEXT: movaps %xmm0, (%rsp) # 16-byte Spill916; NOFMA-NEXT: callq fma@PLT917; NOFMA-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill918; NOFMA-NEXT: movaps (%rsp), %xmm0 # 16-byte Reload919; NOFMA-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1]920; NOFMA-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload921; NOFMA-NEXT: movhlps {{.*#+}} xmm1 = xmm1[1,1]922; NOFMA-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload923; NOFMA-NEXT: movhlps {{.*#+}} xmm2 = xmm2[1,1]924; NOFMA-NEXT: callq fma@PLT925; NOFMA-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload926; NOFMA-NEXT: movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]927; NOFMA-NEXT: xorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1928; NOFMA-NEXT: movaps %xmm1, %xmm0929; NOFMA-NEXT: addq $72, %rsp930; NOFMA-NEXT: .cfi_def_cfa_offset 8931; NOFMA-NEXT: retq932;933; FMA-LABEL: f26:934; FMA: # %bb.0: # %entry935; FMA-NEXT: vfmadd213pd {{.*#+}} xmm0 = (xmm1 * xmm0) + xmm2936; FMA-NEXT: vxorpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0937; FMA-NEXT: retq938;939; FMA4-LABEL: f26:940; FMA4: # %bb.0: # %entry941; FMA4-NEXT: vfmaddpd {{.*#+}} xmm0 = (xmm0 * xmm1) + xmm2942; FMA4-NEXT: vxorpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0943; FMA4-NEXT: retq944entry:945 %3 = call <2 x double> @llvm.experimental.constrained.fma.v2f64(<2 x double> %0, <2 x double> %1, <2 x double> %2,946 metadata !"round.dynamic",947 metadata !"fpexcept.strict") #0948 %result = fneg <2 x double> %3949 ret <2 x double> %result950}951 952define <4 x float> @f27(<4 x float> %0, <4 x float> %1, <4 x float> %2) #0 {953; NOFMA-LABEL: f27:954; NOFMA: # %bb.0: # %entry955; NOFMA-NEXT: subq $88, %rsp956; NOFMA-NEXT: .cfi_def_cfa_offset 96957; NOFMA-NEXT: movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill958; NOFMA-NEXT: movdqa {{.*#+}} xmm3 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]959; NOFMA-NEXT: pxor %xmm3, %xmm0960; NOFMA-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill961; NOFMA-NEXT: pxor %xmm3, %xmm2962; NOFMA-NEXT: movdqa %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill963; NOFMA-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]964; NOFMA-NEXT: pshufd {{.*#+}} xmm2 = xmm2[3,3,3,3]965; NOFMA-NEXT: shufps {{.*#+}} xmm1 = xmm1[3,3,3,3]966; NOFMA-NEXT: callq fmaf@PLT967; NOFMA-NEXT: movdqa %xmm0, (%rsp) # 16-byte Spill968; NOFMA-NEXT: pshufd $238, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload969; NOFMA-NEXT: # xmm0 = mem[2,3,2,3]970; NOFMA-NEXT: pshufd $238, {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Folded Reload971; NOFMA-NEXT: # xmm2 = mem[2,3,2,3]972; NOFMA-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload973; NOFMA-NEXT: movhlps {{.*#+}} xmm1 = xmm1[1,1]974; NOFMA-NEXT: callq fmaf@PLT975; NOFMA-NEXT: punpckldq (%rsp), %xmm0 # 16-byte Folded Reload976; NOFMA-NEXT: # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]977; NOFMA-NEXT: movdqa %xmm0, (%rsp) # 16-byte Spill978; NOFMA-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload979; NOFMA-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload980; NOFMA-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload981; NOFMA-NEXT: callq fmaf@PLT982; NOFMA-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill983; NOFMA-NEXT: pshufd $85, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload984; NOFMA-NEXT: # xmm0 = mem[1,1,1,1]985; NOFMA-NEXT: pshufd $85, {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Folded Reload986; NOFMA-NEXT: # xmm2 = mem[1,1,1,1]987; NOFMA-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload988; NOFMA-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,1,1,1]989; NOFMA-NEXT: callq fmaf@PLT990; NOFMA-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload991; NOFMA-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]992; NOFMA-NEXT: punpcklqdq (%rsp), %xmm1 # 16-byte Folded Reload993; NOFMA-NEXT: # xmm1 = xmm1[0],mem[0]994; NOFMA-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1995; NOFMA-NEXT: movdqa %xmm1, %xmm0996; NOFMA-NEXT: addq $88, %rsp997; NOFMA-NEXT: .cfi_def_cfa_offset 8998; NOFMA-NEXT: retq999;1000; FMA-AVX1-LABEL: f27:1001; FMA-AVX1: # %bb.0: # %entry1002; FMA-AVX1-NEXT: vfnmsub213ps {{.*#+}} xmm0 = -(xmm1 * xmm0) - xmm21003; FMA-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01004; FMA-AVX1-NEXT: retq1005;1006; FMA4-LABEL: f27:1007; FMA4: # %bb.0: # %entry1008; FMA4-NEXT: vfnmsubps {{.*#+}} xmm0 = -(xmm0 * xmm1) - xmm21009; FMA4-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01010; FMA4-NEXT: retq1011;1012; FMA-AVX512-LABEL: f27:1013; FMA-AVX512: # %bb.0: # %entry1014; FMA-AVX512-NEXT: vfnmsub213ps {{.*#+}} xmm0 = -(xmm1 * xmm0) - xmm21015; FMA-AVX512-NEXT: vbroadcastss {{.*#+}} xmm1 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]1016; FMA-AVX512-NEXT: vxorps %xmm1, %xmm0, %xmm01017; FMA-AVX512-NEXT: retq1018entry:1019 %3 = fneg <4 x float> %01020 %4 = fneg <4 x float> %21021 %5 = call <4 x float> @llvm.experimental.constrained.fma.v4f32(<4 x float> %3, <4 x float> %1, <4 x float> %4,1022 metadata !"round.dynamic",1023 metadata !"fpexcept.strict") #01024 %result = fneg <4 x float> %51025 ret <4 x float> %result1026}1027 1028define <2 x double> @f28(<2 x double> %0, <2 x double> %1, <2 x double> %2) #0 {1029; NOFMA-LABEL: f28:1030; NOFMA: # %bb.0: # %entry1031; NOFMA-NEXT: subq $72, %rsp1032; NOFMA-NEXT: .cfi_def_cfa_offset 801033; NOFMA-NEXT: movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1034; NOFMA-NEXT: movaps {{.*#+}} xmm3 = [-0.0E+0,-0.0E+0]1035; NOFMA-NEXT: xorps %xmm3, %xmm01036; NOFMA-NEXT: movaps %xmm0, (%rsp) # 16-byte Spill1037; NOFMA-NEXT: xorps %xmm3, %xmm21038; NOFMA-NEXT: movaps %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1039; NOFMA-NEXT: callq fma@PLT1040; NOFMA-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1041; NOFMA-NEXT: pshufd $238, (%rsp), %xmm0 # 16-byte Folded Reload1042; NOFMA-NEXT: # xmm0 = mem[2,3,2,3]1043; NOFMA-NEXT: pshufd $238, {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Folded Reload1044; NOFMA-NEXT: # xmm2 = mem[2,3,2,3]1045; NOFMA-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload1046; NOFMA-NEXT: movhlps {{.*#+}} xmm1 = xmm1[1,1]1047; NOFMA-NEXT: callq fma@PLT1048; NOFMA-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload1049; NOFMA-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]1050; NOFMA-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11051; NOFMA-NEXT: movdqa %xmm1, %xmm01052; NOFMA-NEXT: addq $72, %rsp1053; NOFMA-NEXT: .cfi_def_cfa_offset 81054; NOFMA-NEXT: retq1055;1056; FMA-LABEL: f28:1057; FMA: # %bb.0: # %entry1058; FMA-NEXT: vfnmsub213pd {{.*#+}} xmm0 = -(xmm1 * xmm0) - xmm21059; FMA-NEXT: vxorpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01060; FMA-NEXT: retq1061;1062; FMA4-LABEL: f28:1063; FMA4: # %bb.0: # %entry1064; FMA4-NEXT: vfnmsubpd {{.*#+}} xmm0 = -(xmm0 * xmm1) - xmm21065; FMA4-NEXT: vxorpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01066; FMA4-NEXT: retq1067entry:1068 %3 = fneg <2 x double> %01069 %4 = fneg <2 x double> %21070 %5 = call <2 x double> @llvm.experimental.constrained.fma.v2f64(<2 x double> %3, <2 x double> %1, <2 x double> %4,1071 metadata !"round.dynamic",1072 metadata !"fpexcept.strict") #01073 %result = fneg <2 x double> %51074 ret <2 x double> %result1075}1076 1077attributes #0 = { strictfp }1078 1079declare float @llvm.experimental.constrained.fmul.f32(float, float, metadata, metadata)1080declare float @llvm.experimental.constrained.fadd.f32(float, float, metadata, metadata)1081declare double @llvm.experimental.constrained.fmul.f64(double, double, metadata, metadata)1082declare double @llvm.experimental.constrained.fadd.f64(double, double, metadata, metadata)1083declare float @llvm.experimental.constrained.fma.f32(float, float, float, metadata, metadata)1084declare double @llvm.experimental.constrained.fma.f64(double, double, double, metadata, metadata)1085declare <4 x float> @llvm.experimental.constrained.fma.v4f32(<4 x float>, <4 x float>, <4 x float>, metadata, metadata)1086declare <2 x double> @llvm.experimental.constrained.fma.v2f64(<2 x double>, <2 x double>, <2 x double>, metadata, metadata)1087declare float @llvm.experimental.constrained.fmuladd.f32(float, float, float, metadata, metadata)1088declare double @llvm.experimental.constrained.fmuladd.f64(double, double, double, metadata, metadata)1089