1 ; RUN: llc < %s -march=ppc32 -fp-contract=fast -mattr=-vsx | FileCheck %s 2 ; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -fp-contract=fast -mattr=+vsx -mcpu=pwr7 | FileCheck -check-prefix=CHECK-VSX %s 3 4 define double @test_FMADD_ASSOC1(double %A, double %B, double %C, 5 double %D, double %E) { 6 %F = fmul double %A, %B ; <double> [#uses=1] 7 %G = fmul double %C, %D ; <double> [#uses=1] 8 %H = fadd double %F, %G ; <double> [#uses=1] 9 %I = fadd double %H, %E ; <double> [#uses=1] 10 ret double %I 11 ; CHECK-LABEL: test_FMADD_ASSOC1: 12 ; CHECK: fmadd 13 ; CHECK-NEXT: fmadd 14 ; CHECK-NEXT: blr 15 16 ; CHECK-VSX-LABEL: test_FMADD_ASSOC1: 17 ; CHECK-VSX: xsmaddmdp 18 ; CHECK-VSX-NEXT: xsmaddadp 19 ; CHECK-VSX-NEXT: fmr 20 ; CHECK-VSX-NEXT: blr 21 } 22 23 define double @test_FMADD_ASSOC2(double %A, double %B, double %C, 24 double %D, double %E) { 25 %F = fmul double %A, %B ; <double> [#uses=1] 26 %G = fmul double %C, %D ; <double> [#uses=1] 27 %H = fadd double %F, %G ; <double> [#uses=1] 28 %I = fadd double %E, %H ; <double> [#uses=1] 29 ret double %I 30 ; CHECK-LABEL: test_FMADD_ASSOC2: 31 ; CHECK: fmadd 32 ; CHECK-NEXT: fmadd 33 ; CHECK-NEXT: blr 34 35 ; CHECK-VSX-LABEL: test_FMADD_ASSOC2: 36 ; CHECK-VSX: xsmaddmdp 37 ; CHECK-VSX-NEXT: xsmaddadp 38 ; CHECK-VSX-NEXT: fmr 39 ; CHECK-VSX-NEXT: blr 40 } 41 42 define double @test_FMSUB_ASSOC1(double %A, double %B, double %C, 43 double %D, double %E) { 44 %F = fmul double %A, %B ; <double> [#uses=1] 45 %G = fmul double %C, %D ; <double> [#uses=1] 46 %H = fadd double %F, %G ; <double> [#uses=1] 47 %I = fsub double %H, %E ; <double> [#uses=1] 48 ret double %I 49 ; CHECK-LABEL: test_FMSUB_ASSOC1: 50 ; CHECK: fmsub 51 ; CHECK-NEXT: fmadd 52 ; CHECK-NEXT: blr 53 54 ; CHECK-VSX-LABEL: test_FMSUB_ASSOC1: 55 ; CHECK-VSX: xsmsubmdp 56 ; CHECK-VSX-NEXT: xsmaddadp 57 ; CHECK-VSX-NEXT: fmr 58 ; CHECK-VSX-NEXT: blr 59 } 60 61 define double @test_FMSUB_ASSOC2(double %A, double %B, double %C, 62 double %D, double %E) { 63 %F = fmul double %A, %B ; <double> [#uses=1] 64 %G = fmul double %C, %D ; <double> [#uses=1] 65 %H = fadd double %F, %G ; <double> [#uses=1] 66 %I = fsub double %E, %H ; <double> [#uses=1] 67 ret double %I 68 ; CHECK-LABEL: test_FMSUB_ASSOC2: 69 ; CHECK: fnmsub 70 ; CHECK-NEXT: fnmsub 71 ; CHECK-NEXT: blr 72 73 ; CHECK-VSX-LABEL: test_FMSUB_ASSOC2: 74 ; CHECK-VSX: xsnmsubmdp 75 ; CHECK-VSX-NEXT: xsnmsubadp 76 ; CHECK-VSX-NEXT: fmr 77 ; CHECK-VSX-NEXT: blr 78 } 79 80