Index: llvm/lib/Target/PowerPC/PPCISelLowering.cpp =================================================================== --- llvm/lib/Target/PowerPC/PPCISelLowering.cpp +++ llvm/lib/Target/PowerPC/PPCISelLowering.cpp @@ -16726,6 +16726,8 @@ bool PPCTargetLowering::isFMAFasterThanFMulAndFAdd(const Function &F, Type *Ty) const { + if (Subtarget.hasSPE()) + return false; switch (Ty->getScalarType()->getTypeID()) { case Type::FloatTyID: case Type::DoubleTyID: Index: llvm/test/CodeGen/PowerPC/fma-assoc.ll =================================================================== --- llvm/test/CodeGen/PowerPC/fma-assoc.ll +++ llvm/test/CodeGen/PowerPC/fma-assoc.ll @@ -9,6 +9,8 @@ ; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64-ibm-aix-xcoff \ ; RUN: -fp-contract=fast -mattr=+vsx -disable-ppc-vsx-fma-mutation=false \ ; RUN: -mcpu=pwr7 -vec-extabi | FileCheck -check-prefix=CHECK-VSX %s +; RUN: llc -verify-machineinstrs < %s -mtriple=powerpcspe-linux-unknown-gnu \ +; RUN: | FileCheck -check-prefix=CHECK-SPE %s define double @test_FMADD_ASSOC1(double %A, double %B, double %C, ; CHECK-LABEL: test_FMADD_ASSOC1: @@ -24,6 +26,22 @@ ; CHECK-VSX-NEXT: xsmaddadp 0, 1, 2 ; CHECK-VSX-NEXT: xsadddp 1, 0, 5 ; CHECK-VSX-NEXT: blr +; +; CHECK-SPE-LABEL: test_FMADD_ASSOC1: +; CHECK-SPE: # %bb.0: +; CHECK-SPE-NEXT: evmergelo 9, 9, 10 +; CHECK-SPE-NEXT: evmergelo 7, 7, 8 +; CHECK-SPE-NEXT: evmergelo 5, 5, 6 +; CHECK-SPE-NEXT: evmergelo 3, 3, 4 +; CHECK-SPE-NEXT: efdmul 4, 7, 9 +; CHECK-SPE-NEXT: efdmul 3, 3, 5 +; CHECK-SPE-NEXT: evldd 5, 8(1) +; CHECK-SPE-NEXT: efdadd 3, 3, 4 +; CHECK-SPE-NEXT: efdadd 4, 3, 5 +; CHECK-SPE-NEXT: evmergehi 3, 4, 4 +; CHECK-SPE-NEXT: # kill: def $r4 killed $r4 killed $s4 +; CHECK-SPE-NEXT: # kill: def $r3 killed $r3 killed $s3 +; CHECK-SPE-NEXT: blr double %D, double %E) { %F = fmul double %A, %B ; [#uses=1] %G = fmul double %C, %D ; [#uses=1] @@ -46,6 +64,22 @@ ; CHECK-VSX-NEXT: xsmaddadp 0, 1, 2 ; CHECK-VSX-NEXT: xsadddp 1, 5, 0 ; CHECK-VSX-NEXT: blr +; +; CHECK-SPE-LABEL: test_FMADD_ASSOC2: +; CHECK-SPE: # %bb.0: +; CHECK-SPE-NEXT: evmergelo 9, 9, 10 +; CHECK-SPE-NEXT: evmergelo 7, 7, 8 +; CHECK-SPE-NEXT: evmergelo 5, 5, 6 +; CHECK-SPE-NEXT: evmergelo 3, 3, 4 +; CHECK-SPE-NEXT: efdmul 4, 7, 9 +; CHECK-SPE-NEXT: efdmul 3, 3, 5 +; CHECK-SPE-NEXT: evldd 5, 8(1) +; CHECK-SPE-NEXT: efdadd 3, 3, 4 +; CHECK-SPE-NEXT: efdadd 4, 5, 3 +; CHECK-SPE-NEXT: evmergehi 3, 4, 4 +; CHECK-SPE-NEXT: # kill: def $r4 killed $r4 killed $s4 +; CHECK-SPE-NEXT: # kill: def $r3 killed $r3 killed $s3 +; CHECK-SPE-NEXT: blr double %D, double %E) { %F = fmul double %A, %B ; [#uses=1] %G = fmul double %C, %D ; [#uses=1] @@ -68,6 +102,22 @@ ; CHECK-VSX-NEXT: xsmaddadp 0, 1, 2 ; CHECK-VSX-NEXT: xssubdp 1, 0, 5 ; CHECK-VSX-NEXT: blr +; +; CHECK-SPE-LABEL: test_FMSUB_ASSOC1: +; CHECK-SPE: # %bb.0: +; CHECK-SPE-NEXT: evmergelo 9, 9, 10 +; CHECK-SPE-NEXT: evmergelo 7, 7, 8 +; CHECK-SPE-NEXT: evmergelo 5, 5, 6 +; CHECK-SPE-NEXT: evmergelo 3, 3, 4 +; CHECK-SPE-NEXT: efdmul 4, 7, 9 +; CHECK-SPE-NEXT: efdmul 3, 3, 5 +; CHECK-SPE-NEXT: evldd 5, 8(1) +; CHECK-SPE-NEXT: efdadd 3, 3, 4 +; CHECK-SPE-NEXT: efdsub 4, 3, 5 +; CHECK-SPE-NEXT: evmergehi 3, 4, 4 +; CHECK-SPE-NEXT: # kill: def $r4 killed $r4 killed $s4 +; CHECK-SPE-NEXT: # kill: def $r3 killed $r3 killed $s3 +; CHECK-SPE-NEXT: blr double %D, double %E) { %F = fmul double %A, %B ; [#uses=1] %G = fmul double %C, %D ; [#uses=1] @@ -90,6 +140,22 @@ ; CHECK-VSX-NEXT: xsmaddadp 0, 1, 2 ; CHECK-VSX-NEXT: xssubdp 1, 5, 0 ; CHECK-VSX-NEXT: blr +; +; CHECK-SPE-LABEL: test_FMSUB_ASSOC2: +; CHECK-SPE: # %bb.0: +; CHECK-SPE-NEXT: evmergelo 9, 9, 10 +; CHECK-SPE-NEXT: evmergelo 7, 7, 8 +; CHECK-SPE-NEXT: evmergelo 5, 5, 6 +; CHECK-SPE-NEXT: evmergelo 3, 3, 4 +; CHECK-SPE-NEXT: efdmul 4, 7, 9 +; CHECK-SPE-NEXT: efdmul 3, 3, 5 +; CHECK-SPE-NEXT: evldd 5, 8(1) +; CHECK-SPE-NEXT: efdadd 3, 3, 4 +; CHECK-SPE-NEXT: efdsub 4, 5, 3 +; CHECK-SPE-NEXT: evmergehi 3, 4, 4 +; CHECK-SPE-NEXT: # kill: def $r4 killed $r4 killed $s4 +; CHECK-SPE-NEXT: # kill: def $r3 killed $r3 killed $s3 +; CHECK-SPE-NEXT: blr double %D, double %E) { %F = fmul double %A, %B ; [#uses=1] %G = fmul double %C, %D ; [#uses=1] @@ -110,6 +176,21 @@ ; CHECK-VSX-NEXT: xsmaddmdp 1, 2, 5 ; CHECK-VSX-NEXT: xsmaddadp 1, 3, 4 ; CHECK-VSX-NEXT: blr +; +; CHECK-SPE-LABEL: test_FMADD_ASSOC_EXT1: +; CHECK-SPE: # %bb.0: +; CHECK-SPE-NEXT: efsmul 3, 3, 4 +; CHECK-SPE-NEXT: evmergelo 4, 9, 10 +; CHECK-SPE-NEXT: evmergelo 7, 7, 8 +; CHECK-SPE-NEXT: efdcfs 3, 3 +; CHECK-SPE-NEXT: evmergelo 5, 5, 6 +; CHECK-SPE-NEXT: efdmul 5, 5, 7 +; CHECK-SPE-NEXT: efdadd 3, 5, 3 +; CHECK-SPE-NEXT: efdadd 4, 3, 4 +; CHECK-SPE-NEXT: evmergehi 3, 4, 4 +; CHECK-SPE-NEXT: # kill: def $r4 killed $r4 killed $s4 +; CHECK-SPE-NEXT: # kill: def $r3 killed $r3 killed $s3 +; CHECK-SPE-NEXT: blr double %D, double %E) { %F = fmul float %A, %B ; [#uses=1] %G = fpext float %F to double ; [#uses=1] @@ -132,6 +213,19 @@ ; CHECK-VSX-NEXT: xsmaddadp 3, 1, 2 ; CHECK-VSX-NEXT: fmr 1, 3 ; CHECK-VSX-NEXT: blr +; +; CHECK-SPE-LABEL: test_FMADD_ASSOC_EXT2: +; CHECK-SPE: # %bb.0: +; CHECK-SPE-NEXT: efsmul 3, 3, 4 +; CHECK-SPE-NEXT: efsmul 4, 5, 6 +; CHECK-SPE-NEXT: efsadd 3, 3, 4 +; CHECK-SPE-NEXT: evmergelo 4, 7, 8 +; CHECK-SPE-NEXT: efdcfs 3, 3 +; CHECK-SPE-NEXT: efdadd 4, 3, 4 +; CHECK-SPE-NEXT: evmergehi 3, 4, 4 +; CHECK-SPE-NEXT: # kill: def $r4 killed $r4 killed $s4 +; CHECK-SPE-NEXT: # kill: def $r3 killed $r3 killed $s3 +; CHECK-SPE-NEXT: blr float %D, double %E) { %F = fmul float %A, %B ; [#uses=1] %G = fmul float %C, %D ; [#uses=1] @@ -153,6 +247,21 @@ ; CHECK-VSX-NEXT: xsmaddmdp 1, 2, 5 ; CHECK-VSX-NEXT: xsmaddadp 1, 3, 4 ; CHECK-VSX-NEXT: blr +; +; CHECK-SPE-LABEL: test_FMADD_ASSOC_EXT3: +; CHECK-SPE: # %bb.0: +; CHECK-SPE-NEXT: efsmul 3, 3, 4 +; CHECK-SPE-NEXT: evmergelo 4, 9, 10 +; CHECK-SPE-NEXT: evmergelo 7, 7, 8 +; CHECK-SPE-NEXT: efdcfs 3, 3 +; CHECK-SPE-NEXT: evmergelo 5, 5, 6 +; CHECK-SPE-NEXT: efdmul 5, 5, 7 +; CHECK-SPE-NEXT: efdadd 3, 5, 3 +; CHECK-SPE-NEXT: efdadd 4, 4, 3 +; CHECK-SPE-NEXT: evmergehi 3, 4, 4 +; CHECK-SPE-NEXT: # kill: def $r4 killed $r4 killed $s4 +; CHECK-SPE-NEXT: # kill: def $r3 killed $r3 killed $s3 +; CHECK-SPE-NEXT: blr double %D, double %E) { %F = fmul float %A, %B ; [#uses=1] %G = fpext float %F to double ; [#uses=1] @@ -175,6 +284,19 @@ ; CHECK-VSX-NEXT: xsmaddadp 3, 1, 2 ; CHECK-VSX-NEXT: fmr 1, 3 ; CHECK-VSX-NEXT: blr +; +; CHECK-SPE-LABEL: test_FMADD_ASSOC_EXT4: +; CHECK-SPE: # %bb.0: +; CHECK-SPE-NEXT: efsmul 3, 3, 4 +; CHECK-SPE-NEXT: efsmul 4, 5, 6 +; CHECK-SPE-NEXT: efsadd 3, 3, 4 +; CHECK-SPE-NEXT: evmergelo 4, 7, 8 +; CHECK-SPE-NEXT: efdcfs 3, 3 +; CHECK-SPE-NEXT: efdadd 4, 4, 3 +; CHECK-SPE-NEXT: evmergehi 3, 4, 4 +; CHECK-SPE-NEXT: # kill: def $r4 killed $r4 killed $s4 +; CHECK-SPE-NEXT: # kill: def $r3 killed $r3 killed $s3 +; CHECK-SPE-NEXT: blr float %D, double %E) { %F = fmul float %A, %B ; [#uses=1] %G = fmul float %C, %D ; [#uses=1] @@ -198,6 +320,21 @@ ; CHECK-VSX-NEXT: xsmaddadp 0, 3, 4 ; CHECK-VSX-NEXT: xssubdp 1, 0, 5 ; CHECK-VSX-NEXT: blr +; +; CHECK-SPE-LABEL: test_FMSUB_ASSOC_EXT1: +; CHECK-SPE: # %bb.0: +; CHECK-SPE-NEXT: efsmul 3, 3, 4 +; CHECK-SPE-NEXT: evmergelo 4, 9, 10 +; CHECK-SPE-NEXT: evmergelo 7, 7, 8 +; CHECK-SPE-NEXT: efdcfs 3, 3 +; CHECK-SPE-NEXT: evmergelo 5, 5, 6 +; CHECK-SPE-NEXT: efdmul 5, 5, 7 +; CHECK-SPE-NEXT: efdadd 3, 5, 3 +; CHECK-SPE-NEXT: efdsub 4, 3, 4 +; CHECK-SPE-NEXT: evmergehi 3, 4, 4 +; CHECK-SPE-NEXT: # kill: def $r4 killed $r4 killed $s4 +; CHECK-SPE-NEXT: # kill: def $r3 killed $r3 killed $s3 +; CHECK-SPE-NEXT: blr double %D, double %E) { %F = fmul float %A, %B ; [#uses=1] %G = fpext float %F to double ; [#uses=1] @@ -221,6 +358,19 @@ ; CHECK-VSX-NEXT: fmadds 0, 1, 2, 0 ; CHECK-VSX-NEXT: xssubdp 1, 0, 5 ; CHECK-VSX-NEXT: blr +; +; CHECK-SPE-LABEL: test_FMSUB_ASSOC_EXT2: +; CHECK-SPE: # %bb.0: +; CHECK-SPE-NEXT: efsmul 3, 3, 4 +; CHECK-SPE-NEXT: efsmul 4, 5, 6 +; CHECK-SPE-NEXT: efsadd 3, 3, 4 +; CHECK-SPE-NEXT: evmergelo 4, 7, 8 +; CHECK-SPE-NEXT: efdcfs 3, 3 +; CHECK-SPE-NEXT: efdsub 4, 3, 4 +; CHECK-SPE-NEXT: evmergehi 3, 4, 4 +; CHECK-SPE-NEXT: # kill: def $r4 killed $r4 killed $s4 +; CHECK-SPE-NEXT: # kill: def $r3 killed $r3 killed $s3 +; CHECK-SPE-NEXT: blr float %D, double %E) { %F = fmul float %A, %B ; [#uses=1] %G = fmul float %C, %D ; [#uses=1] @@ -244,6 +394,21 @@ ; CHECK-VSX-NEXT: xsmaddadp 0, 3, 4 ; CHECK-VSX-NEXT: xssubdp 1, 5, 0 ; CHECK-VSX-NEXT: blr +; +; CHECK-SPE-LABEL: test_FMSUB_ASSOC_EXT3: +; CHECK-SPE: # %bb.0: +; CHECK-SPE-NEXT: efsmul 3, 3, 4 +; CHECK-SPE-NEXT: evmergelo 4, 9, 10 +; CHECK-SPE-NEXT: evmergelo 7, 7, 8 +; CHECK-SPE-NEXT: efdcfs 3, 3 +; CHECK-SPE-NEXT: evmergelo 5, 5, 6 +; CHECK-SPE-NEXT: efdmul 5, 5, 7 +; CHECK-SPE-NEXT: efdadd 3, 5, 3 +; CHECK-SPE-NEXT: efdsub 4, 4, 3 +; CHECK-SPE-NEXT: evmergehi 3, 4, 4 +; CHECK-SPE-NEXT: # kill: def $r4 killed $r4 killed $s4 +; CHECK-SPE-NEXT: # kill: def $r3 killed $r3 killed $s3 +; CHECK-SPE-NEXT: blr double %D, double %E) { %F = fmul float %A, %B ; [#uses=1] %G = fpext float %F to double ; [#uses=1] @@ -267,6 +432,19 @@ ; CHECK-VSX-NEXT: fmadds 0, 1, 2, 0 ; CHECK-VSX-NEXT: xssubdp 1, 5, 0 ; CHECK-VSX-NEXT: blr +; +; CHECK-SPE-LABEL: test_FMSUB_ASSOC_EXT4: +; CHECK-SPE: # %bb.0: +; CHECK-SPE-NEXT: efsmul 3, 3, 4 +; CHECK-SPE-NEXT: efsmul 4, 5, 6 +; CHECK-SPE-NEXT: efsadd 3, 3, 4 +; CHECK-SPE-NEXT: evmergelo 4, 7, 8 +; CHECK-SPE-NEXT: efdcfs 3, 3 +; CHECK-SPE-NEXT: efdsub 4, 4, 3 +; CHECK-SPE-NEXT: evmergehi 3, 4, 4 +; CHECK-SPE-NEXT: # kill: def $r4 killed $r4 killed $s4 +; CHECK-SPE-NEXT: # kill: def $r3 killed $r3 killed $s3 +; CHECK-SPE-NEXT: blr float %D, double %E) { %F = fmul float %A, %B ; [#uses=1] %G = fmul float %C, %D ; [#uses=1] @@ -289,6 +467,22 @@ ; CHECK-VSX-NEXT: xsmaddadp 3, 1, 2 ; CHECK-VSX-NEXT: fmr 1, 3 ; CHECK-VSX-NEXT: blr +; +; CHECK-SPE-LABEL: test_reassoc_FMADD_ASSOC1: +; CHECK-SPE: # %bb.0: +; CHECK-SPE-NEXT: evmergelo 9, 9, 10 +; CHECK-SPE-NEXT: evmergelo 7, 7, 8 +; CHECK-SPE-NEXT: evmergelo 5, 5, 6 +; CHECK-SPE-NEXT: evmergelo 3, 3, 4 +; CHECK-SPE-NEXT: efdmul 4, 7, 9 +; CHECK-SPE-NEXT: efdmul 3, 3, 5 +; CHECK-SPE-NEXT: evldd 5, 8(1) +; CHECK-SPE-NEXT: efdadd 3, 3, 4 +; CHECK-SPE-NEXT: efdadd 4, 3, 5 +; CHECK-SPE-NEXT: evmergehi 3, 4, 4 +; CHECK-SPE-NEXT: # kill: def $r4 killed $r4 killed $s4 +; CHECK-SPE-NEXT: # kill: def $r3 killed $r3 killed $s3 +; CHECK-SPE-NEXT: blr double %D, double %E) { %F = fmul reassoc double %A, %B ; [#uses=1] %G = fmul reassoc double %C, %D ; [#uses=1] @@ -310,6 +504,22 @@ ; CHECK-VSX-NEXT: xsmaddadp 3, 1, 2 ; CHECK-VSX-NEXT: fmr 1, 3 ; CHECK-VSX-NEXT: blr +; +; CHECK-SPE-LABEL: test_reassoc_FMADD_ASSOC2: +; CHECK-SPE: # %bb.0: +; CHECK-SPE-NEXT: evmergelo 9, 9, 10 +; CHECK-SPE-NEXT: evmergelo 7, 7, 8 +; CHECK-SPE-NEXT: evmergelo 5, 5, 6 +; CHECK-SPE-NEXT: evmergelo 3, 3, 4 +; CHECK-SPE-NEXT: efdmul 4, 7, 9 +; CHECK-SPE-NEXT: efdmul 3, 3, 5 +; CHECK-SPE-NEXT: evldd 5, 8(1) +; CHECK-SPE-NEXT: efdadd 3, 3, 4 +; CHECK-SPE-NEXT: efdadd 4, 5, 3 +; CHECK-SPE-NEXT: evmergehi 3, 4, 4 +; CHECK-SPE-NEXT: # kill: def $r4 killed $r4 killed $s4 +; CHECK-SPE-NEXT: # kill: def $r3 killed $r3 killed $s3 +; CHECK-SPE-NEXT: blr double %D, double %E) { %F = fmul reassoc double %A, %B ; [#uses=1] %G = fmul reassoc double %C, %D ; [#uses=1] @@ -333,6 +543,22 @@ ; CHECK-VSX-NEXT: xsmaddadp 0, 1, 2 ; CHECK-VSX-NEXT: xssubdp 1, 0, 5 ; CHECK-VSX-NEXT: blr +; +; CHECK-SPE-LABEL: test_reassoc_FMSUB_ASSOC1: +; CHECK-SPE: # %bb.0: +; CHECK-SPE-NEXT: evmergelo 9, 9, 10 +; CHECK-SPE-NEXT: evmergelo 7, 7, 8 +; CHECK-SPE-NEXT: evmergelo 5, 5, 6 +; CHECK-SPE-NEXT: evmergelo 3, 3, 4 +; CHECK-SPE-NEXT: efdmul 4, 7, 9 +; CHECK-SPE-NEXT: efdmul 3, 3, 5 +; CHECK-SPE-NEXT: evldd 5, 8(1) +; CHECK-SPE-NEXT: efdadd 3, 3, 4 +; CHECK-SPE-NEXT: efdsub 4, 3, 5 +; CHECK-SPE-NEXT: evmergehi 3, 4, 4 +; CHECK-SPE-NEXT: # kill: def $r4 killed $r4 killed $s4 +; CHECK-SPE-NEXT: # kill: def $r3 killed $r3 killed $s3 +; CHECK-SPE-NEXT: blr double %D, double %E) { %F = fmul reassoc double %A, %B ; [#uses=1] %G = fmul reassoc double %C, %D ; [#uses=1] @@ -354,6 +580,22 @@ ; CHECK-VSX-NEXT: xsmaddadp 3, 1, 2 ; CHECK-VSX-NEXT: fmr 1, 3 ; CHECK-VSX-NEXT: blr +; +; CHECK-SPE-LABEL: test_reassoc_FMSUB_ASSOC11: +; CHECK-SPE: # %bb.0: +; CHECK-SPE-NEXT: evmergelo 9, 9, 10 +; CHECK-SPE-NEXT: evmergelo 7, 7, 8 +; CHECK-SPE-NEXT: evmergelo 5, 5, 6 +; CHECK-SPE-NEXT: evmergelo 3, 3, 4 +; CHECK-SPE-NEXT: efdmul 4, 7, 9 +; CHECK-SPE-NEXT: efdmul 3, 3, 5 +; CHECK-SPE-NEXT: evldd 5, 8(1) +; CHECK-SPE-NEXT: efdadd 3, 3, 4 +; CHECK-SPE-NEXT: efdsub 4, 3, 5 +; CHECK-SPE-NEXT: evmergehi 3, 4, 4 +; CHECK-SPE-NEXT: # kill: def $r4 killed $r4 killed $s4 +; CHECK-SPE-NEXT: # kill: def $r3 killed $r3 killed $s3 +; CHECK-SPE-NEXT: blr double %D, double %E) { %F = fmul contract reassoc double %A, %B ; [#uses=1] %G = fmul contract reassoc double %C, %D ; [#uses=1] @@ -377,6 +619,22 @@ ; CHECK-VSX-NEXT: xsmaddadp 0, 1, 2 ; CHECK-VSX-NEXT: xssubdp 1, 5, 0 ; CHECK-VSX-NEXT: blr +; +; CHECK-SPE-LABEL: test_reassoc_FMSUB_ASSOC2: +; CHECK-SPE: # %bb.0: +; CHECK-SPE-NEXT: evmergelo 9, 9, 10 +; CHECK-SPE-NEXT: evmergelo 7, 7, 8 +; CHECK-SPE-NEXT: evmergelo 5, 5, 6 +; CHECK-SPE-NEXT: evmergelo 3, 3, 4 +; CHECK-SPE-NEXT: efdmul 4, 7, 9 +; CHECK-SPE-NEXT: efdmul 3, 3, 5 +; CHECK-SPE-NEXT: evldd 5, 8(1) +; CHECK-SPE-NEXT: efdadd 3, 3, 4 +; CHECK-SPE-NEXT: efdsub 4, 5, 3 +; CHECK-SPE-NEXT: evmergehi 3, 4, 4 +; CHECK-SPE-NEXT: # kill: def $r4 killed $r4 killed $s4 +; CHECK-SPE-NEXT: # kill: def $r3 killed $r3 killed $s3 +; CHECK-SPE-NEXT: blr double %D, double %E) { %F = fmul reassoc double %A, %B ; [#uses=1] %G = fmul reassoc double %C, %D ; [#uses=1] @@ -399,6 +657,22 @@ ; CHECK-VSX-NEXT: xsmaddadp 0, 1, 2 ; CHECK-VSX-NEXT: xssubdp 1, 5, 0 ; CHECK-VSX-NEXT: blr +; +; CHECK-SPE-LABEL: test_fast_FMSUB_ASSOC2: +; CHECK-SPE: # %bb.0: +; CHECK-SPE-NEXT: evmergelo 9, 9, 10 +; CHECK-SPE-NEXT: evmergelo 7, 7, 8 +; CHECK-SPE-NEXT: evmergelo 5, 5, 6 +; CHECK-SPE-NEXT: evmergelo 3, 3, 4 +; CHECK-SPE-NEXT: efdmul 4, 7, 9 +; CHECK-SPE-NEXT: efdmul 3, 3, 5 +; CHECK-SPE-NEXT: evldd 5, 8(1) +; CHECK-SPE-NEXT: efdadd 3, 3, 4 +; CHECK-SPE-NEXT: efdsub 4, 5, 3 +; CHECK-SPE-NEXT: evmergehi 3, 4, 4 +; CHECK-SPE-NEXT: # kill: def $r4 killed $r4 killed $s4 +; CHECK-SPE-NEXT: # kill: def $r3 killed $r3 killed $s3 +; CHECK-SPE-NEXT: blr double %D, double %E) { %F = fmul reassoc double %A, %B ; [#uses=1] %G = fmul reassoc double %C, %D ; [#uses=1] @@ -419,6 +693,21 @@ ; CHECK-VSX-NEXT: xsmaddmdp 1, 2, 5 ; CHECK-VSX-NEXT: xsmaddadp 1, 3, 4 ; CHECK-VSX-NEXT: blr +; +; CHECK-SPE-LABEL: test_reassoc_FMADD_ASSOC_EXT1: +; CHECK-SPE: # %bb.0: +; CHECK-SPE-NEXT: efsmul 3, 3, 4 +; CHECK-SPE-NEXT: evmergelo 4, 9, 10 +; CHECK-SPE-NEXT: evmergelo 7, 7, 8 +; CHECK-SPE-NEXT: efdcfs 3, 3 +; CHECK-SPE-NEXT: evmergelo 5, 5, 6 +; CHECK-SPE-NEXT: efdmul 5, 5, 7 +; CHECK-SPE-NEXT: efdadd 3, 5, 3 +; CHECK-SPE-NEXT: efdadd 4, 3, 4 +; CHECK-SPE-NEXT: evmergehi 3, 4, 4 +; CHECK-SPE-NEXT: # kill: def $r4 killed $r4 killed $s4 +; CHECK-SPE-NEXT: # kill: def $r3 killed $r3 killed $s3 +; CHECK-SPE-NEXT: blr double %D, double %E) { %F = fmul reassoc float %A, %B ; [#uses=1] %G = fpext float %F to double ; [#uses=1] @@ -441,6 +730,19 @@ ; CHECK-VSX-NEXT: xsmaddadp 3, 1, 2 ; CHECK-VSX-NEXT: fmr 1, 3 ; CHECK-VSX-NEXT: blr +; +; CHECK-SPE-LABEL: test_reassoc_FMADD_ASSOC_EXT2: +; CHECK-SPE: # %bb.0: +; CHECK-SPE-NEXT: efsmul 3, 3, 4 +; CHECK-SPE-NEXT: efsmul 4, 5, 6 +; CHECK-SPE-NEXT: efsadd 3, 3, 4 +; CHECK-SPE-NEXT: evmergelo 4, 7, 8 +; CHECK-SPE-NEXT: efdcfs 3, 3 +; CHECK-SPE-NEXT: efdadd 4, 3, 4 +; CHECK-SPE-NEXT: evmergehi 3, 4, 4 +; CHECK-SPE-NEXT: # kill: def $r4 killed $r4 killed $s4 +; CHECK-SPE-NEXT: # kill: def $r3 killed $r3 killed $s3 +; CHECK-SPE-NEXT: blr float %D, double %E) { %F = fmul reassoc float %A, %B ; [#uses=1] %G = fmul reassoc float %C, %D ; [#uses=1] @@ -462,6 +764,21 @@ ; CHECK-VSX-NEXT: xsmaddmdp 1, 2, 5 ; CHECK-VSX-NEXT: xsmaddadp 1, 3, 4 ; CHECK-VSX-NEXT: blr +; +; CHECK-SPE-LABEL: test_reassoc_FMADD_ASSOC_EXT3: +; CHECK-SPE: # %bb.0: +; CHECK-SPE-NEXT: efsmul 3, 3, 4 +; CHECK-SPE-NEXT: evmergelo 4, 9, 10 +; CHECK-SPE-NEXT: evmergelo 7, 7, 8 +; CHECK-SPE-NEXT: efdcfs 3, 3 +; CHECK-SPE-NEXT: evmergelo 5, 5, 6 +; CHECK-SPE-NEXT: efdmul 5, 5, 7 +; CHECK-SPE-NEXT: efdadd 3, 5, 3 +; CHECK-SPE-NEXT: efdadd 4, 4, 3 +; CHECK-SPE-NEXT: evmergehi 3, 4, 4 +; CHECK-SPE-NEXT: # kill: def $r4 killed $r4 killed $s4 +; CHECK-SPE-NEXT: # kill: def $r3 killed $r3 killed $s3 +; CHECK-SPE-NEXT: blr double %D, double %E) { %F = fmul reassoc float %A, %B ; [#uses=1] %G = fpext float %F to double ; [#uses=1] @@ -484,6 +801,19 @@ ; CHECK-VSX-NEXT: xsmaddadp 3, 1, 2 ; CHECK-VSX-NEXT: fmr 1, 3 ; CHECK-VSX-NEXT: blr +; +; CHECK-SPE-LABEL: test_reassoc_FMADD_ASSOC_EXT4: +; CHECK-SPE: # %bb.0: +; CHECK-SPE-NEXT: efsmul 3, 3, 4 +; CHECK-SPE-NEXT: efsmul 4, 5, 6 +; CHECK-SPE-NEXT: efsadd 3, 3, 4 +; CHECK-SPE-NEXT: evmergelo 4, 7, 8 +; CHECK-SPE-NEXT: efdcfs 3, 3 +; CHECK-SPE-NEXT: efdadd 4, 4, 3 +; CHECK-SPE-NEXT: evmergehi 3, 4, 4 +; CHECK-SPE-NEXT: # kill: def $r4 killed $r4 killed $s4 +; CHECK-SPE-NEXT: # kill: def $r3 killed $r3 killed $s3 +; CHECK-SPE-NEXT: blr float %D, double %E) { %F = fmul reassoc float %A, %B ; [#uses=1] %G = fmul reassoc float %C, %D ; [#uses=1] @@ -505,6 +835,21 @@ ; CHECK-VSX-NEXT: xsmsubmdp 1, 2, 5 ; CHECK-VSX-NEXT: xsmaddadp 1, 3, 4 ; CHECK-VSX-NEXT: blr +; +; CHECK-SPE-LABEL: test_reassoc_FMSUB_ASSOC_EXT1: +; CHECK-SPE: # %bb.0: +; CHECK-SPE-NEXT: efsmul 3, 3, 4 +; CHECK-SPE-NEXT: evmergelo 4, 9, 10 +; CHECK-SPE-NEXT: evmergelo 7, 7, 8 +; CHECK-SPE-NEXT: efdcfs 3, 3 +; CHECK-SPE-NEXT: evmergelo 5, 5, 6 +; CHECK-SPE-NEXT: efdmul 5, 5, 7 +; CHECK-SPE-NEXT: efdadd 3, 5, 3 +; CHECK-SPE-NEXT: efdsub 4, 3, 4 +; CHECK-SPE-NEXT: evmergehi 3, 4, 4 +; CHECK-SPE-NEXT: # kill: def $r4 killed $r4 killed $s4 +; CHECK-SPE-NEXT: # kill: def $r3 killed $r3 killed $s3 +; CHECK-SPE-NEXT: blr double %D, double %E) { %F = fmul reassoc float %A, %B ; [#uses=1] %G = fpext float %F to double ; [#uses=1] @@ -527,6 +872,19 @@ ; CHECK-VSX-NEXT: xsmaddadp 3, 1, 2 ; CHECK-VSX-NEXT: fmr 1, 3 ; CHECK-VSX-NEXT: blr +; +; CHECK-SPE-LABEL: test_reassoc_FMSUB_ASSOC_EXT2: +; CHECK-SPE: # %bb.0: +; CHECK-SPE-NEXT: efsmul 3, 3, 4 +; CHECK-SPE-NEXT: efsmul 4, 5, 6 +; CHECK-SPE-NEXT: efsadd 3, 3, 4 +; CHECK-SPE-NEXT: evmergelo 4, 7, 8 +; CHECK-SPE-NEXT: efdcfs 3, 3 +; CHECK-SPE-NEXT: efdsub 4, 3, 4 +; CHECK-SPE-NEXT: evmergehi 3, 4, 4 +; CHECK-SPE-NEXT: # kill: def $r4 killed $r4 killed $s4 +; CHECK-SPE-NEXT: # kill: def $r3 killed $r3 killed $s3 +; CHECK-SPE-NEXT: blr float %D, double %E) { %F = fmul reassoc float %A, %B ; [#uses=1] %G = fmul reassoc float %C, %D ; [#uses=1] @@ -552,6 +910,21 @@ ; CHECK-VSX-NEXT: xsmaddmdp 1, 2, 5 ; CHECK-VSX-NEXT: xsmaddadp 1, 0, 4 ; CHECK-VSX-NEXT: blr +; +; CHECK-SPE-LABEL: test_reassoc_FMSUB_ASSOC_EXT3: +; CHECK-SPE: # %bb.0: +; CHECK-SPE-NEXT: efsmul 3, 3, 4 +; CHECK-SPE-NEXT: evmergelo 4, 9, 10 +; CHECK-SPE-NEXT: evmergelo 7, 7, 8 +; CHECK-SPE-NEXT: efdcfs 3, 3 +; CHECK-SPE-NEXT: evmergelo 5, 5, 6 +; CHECK-SPE-NEXT: efdmul 5, 5, 7 +; CHECK-SPE-NEXT: efdadd 3, 5, 3 +; CHECK-SPE-NEXT: efdsub 4, 4, 3 +; CHECK-SPE-NEXT: evmergehi 3, 4, 4 +; CHECK-SPE-NEXT: # kill: def $r4 killed $r4 killed $s4 +; CHECK-SPE-NEXT: # kill: def $r3 killed $r3 killed $s3 +; CHECK-SPE-NEXT: blr double %D, double %E) { %F = fmul reassoc float %A, %B ; [#uses=1] %G = fpext float %F to double ; [#uses=1] @@ -575,6 +948,21 @@ ; CHECK-VSX-NEXT: xsnmsubmdp 1, 2, 5 ; CHECK-VSX-NEXT: xsnmsubadp 1, 3, 4 ; CHECK-VSX-NEXT: blr +; +; CHECK-SPE-LABEL: test_fast_FMSUB_ASSOC_EXT3: +; CHECK-SPE: # %bb.0: +; CHECK-SPE-NEXT: efsmul 3, 3, 4 +; CHECK-SPE-NEXT: evmergelo 4, 9, 10 +; CHECK-SPE-NEXT: evmergelo 7, 7, 8 +; CHECK-SPE-NEXT: efdcfs 3, 3 +; CHECK-SPE-NEXT: evmergelo 5, 5, 6 +; CHECK-SPE-NEXT: efdmul 5, 5, 7 +; CHECK-SPE-NEXT: efdadd 3, 5, 3 +; CHECK-SPE-NEXT: efdsub 4, 4, 3 +; CHECK-SPE-NEXT: evmergehi 3, 4, 4 +; CHECK-SPE-NEXT: # kill: def $r4 killed $r4 killed $s4 +; CHECK-SPE-NEXT: # kill: def $r3 killed $r3 killed $s3 +; CHECK-SPE-NEXT: blr double %D, double %E) { %F = fmul reassoc float %A, %B %G = fpext float %F to double @@ -601,6 +989,19 @@ ; CHECK-VSX-NEXT: xsmaddadp 0, 1, 2 ; CHECK-VSX-NEXT: fmr 1, 0 ; CHECK-VSX-NEXT: blr +; +; CHECK-SPE-LABEL: test_reassoc_FMSUB_ASSOC_EXT4: +; CHECK-SPE: # %bb.0: +; CHECK-SPE-NEXT: efsmul 3, 3, 4 +; CHECK-SPE-NEXT: efsmul 4, 5, 6 +; CHECK-SPE-NEXT: efsadd 3, 3, 4 +; CHECK-SPE-NEXT: evmergelo 4, 7, 8 +; CHECK-SPE-NEXT: efdcfs 3, 3 +; CHECK-SPE-NEXT: efdsub 4, 4, 3 +; CHECK-SPE-NEXT: evmergehi 3, 4, 4 +; CHECK-SPE-NEXT: # kill: def $r4 killed $r4 killed $s4 +; CHECK-SPE-NEXT: # kill: def $r3 killed $r3 killed $s3 +; CHECK-SPE-NEXT: blr float %D, double %E) { %F = fmul reassoc float %A, %B ; [#uses=1] %G = fmul reassoc float %C, %D ; [#uses=1] @@ -623,6 +1024,19 @@ ; CHECK-VSX-NEXT: xsnmsubadp 3, 1, 2 ; CHECK-VSX-NEXT: fmr 1, 3 ; CHECK-VSX-NEXT: blr +; +; CHECK-SPE-LABEL: test_fast_FMSUB_ASSOC_EXT4: +; CHECK-SPE: # %bb.0: +; CHECK-SPE-NEXT: efsmul 3, 3, 4 +; CHECK-SPE-NEXT: efsmul 4, 5, 6 +; CHECK-SPE-NEXT: efsadd 3, 3, 4 +; CHECK-SPE-NEXT: evmergelo 4, 7, 8 +; CHECK-SPE-NEXT: efdcfs 3, 3 +; CHECK-SPE-NEXT: efdsub 4, 4, 3 +; CHECK-SPE-NEXT: evmergehi 3, 4, 4 +; CHECK-SPE-NEXT: # kill: def $r4 killed $r4 killed $s4 +; CHECK-SPE-NEXT: # kill: def $r3 killed $r3 killed $s3 +; CHECK-SPE-NEXT: blr float %D, double %E) { %F = fmul reassoc float %A, %B %G = fmul reassoc float %C, %D