brintos

brintos / llvm-project-archived public Read only

0
0
Text · 45.4 KiB · 71d4948 Raw
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