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 4declare double @dummy1(double) #0 5declare double @dummy2(double, double) #0 6declare double @dummy3(double, double, double) #0 7 8define double @test_FMADD1(double %A, double %B, double %C) { 9 %D = fmul double %A, %B ; <double> [#uses=1] 10 %E = fadd double %C, %D ; <double> [#uses=1] 11 ret double %E 12; CHECK-LABEL: test_FMADD1: 13; CHECK: fmadd 14; CHECK-NEXT: blr 15 16; CHECK-VSX-LABEL: test_FMADD1: 17; CHECK-VSX: xsmaddmdp 18; CHECK-VSX-NEXT: blr 19} 20 21define double @test_FMADD2(double %A, double %B, double %C) { 22 %D = fmul double %A, %B ; <double> [#uses=1] 23 %E = fadd double %D, %C ; <double> [#uses=1] 24 ret double %E 25; CHECK-LABEL: test_FMADD2: 26; CHECK: fmadd 27; CHECK-NEXT: blr 28 29; CHECK-VSX-LABEL: test_FMADD2: 30; CHECK-VSX: xsmaddmdp 31; CHECK-VSX-NEXT: blr 32} 33 34define double @test_FMSUB1(double %A, double %B, double %C) { 35 %D = fmul double %A, %B ; <double> [#uses=1] 36 %E = fsub double %D, %C ; <double> [#uses=1] 37 ret double %E 38; CHECK-LABEL: test_FMSUB1: 39; CHECK: fmsub 40; CHECK-NEXT: blr 41 42; CHECK-VSX-LABEL: test_FMSUB1: 43; CHECK-VSX: xsmsubmdp 44; CHECK-VSX-NEXT: blr 45} 46 47define double @test_FMSUB2(double %A, double %B, double %C, double %D) { 48 %E = fmul double %A, %B ; <double> [#uses=2] 49 %F = fadd double %E, %C ; <double> [#uses=1] 50 %G = fsub double %E, %D ; <double> [#uses=1] 51 %H = call double @dummy2(double %F, double %G) ; <double> [#uses=1] 52 ret double %H 53; CHECK-LABEL: test_FMSUB2: 54; CHECK: fmadd 55; CHECK-NEXT: fmsub 56 57; CHECK-VSX-LABEL: test_FMSUB2: 58; CHECK-VSX: xsmaddadp 59; CHECK-VSX-NEXT: xsmsubmdp 60} 61 62define double @test_FNMADD1(double %A, double %B, double %C) { 63 %D = fmul double %A, %B ; <double> [#uses=1] 64 %E = fadd double %D, %C ; <double> [#uses=1] 65 %F = fsub double -0.000000e+00, %E ; <double> [#uses=1] 66 ret double %F 67; CHECK-LABEL: test_FNMADD1: 68; CHECK: fnmadd 69; CHECK-NEXT: blr 70 71; CHECK-VSX-LABEL: test_FNMADD1: 72; CHECK-VSX: xsnmaddmdp 73; CHECK-VSX-NEXT: blr 74} 75 76define double @test_FNMADD2(double %A, double %B, double %C) { 77 %D = fmul double %A, %B ; <double> [#uses=1] 78 %E = fadd double %C, %D ; <double> [#uses=1] 79 %F = fsub double -0.000000e+00, %E ; <double> [#uses=1] 80 ret double %F 81; CHECK-LABEL: test_FNMADD2: 82; CHECK: fnmadd 83; CHECK-NEXT: blr 84 85; CHECK-VSX-LABEL: test_FNMADD2: 86; CHECK-VSX: xsnmaddmdp 87; CHECK-VSX-NEXT: blr 88} 89 90define double @test_FNMSUB1(double %A, double %B, double %C) { 91 %D = fmul double %A, %B ; <double> [#uses=1] 92 %E = fsub double %C, %D ; <double> [#uses=1] 93 ret double %E 94; CHECK-LABEL: test_FNMSUB1: 95; CHECK: fnmsub 96; CHECK-NEXT: blr 97 98; CHECK-VSX-LABEL: test_FNMSUB1: 99; CHECK-VSX: xsnmsubmdp 100} 101 102define double @test_FNMSUB2(double %A, double %B, double %C) { 103 %D = fmul double %A, %B ; <double> [#uses=1] 104 %E = fsub double %D, %C ; <double> [#uses=1] 105 %F = fsub double -0.000000e+00, %E ; <double> [#uses=1] 106 ret double %F 107; CHECK-LABEL: test_FNMSUB2: 108; CHECK: fnmsub 109; CHECK-NEXT: blr 110 111; CHECK-VSX-LABEL: test_FNMSUB2: 112; CHECK-VSX: xsnmsubmdp 113; CHECK-VSX-NEXT: blr 114} 115 116define float @test_FNMSUBS(float %A, float %B, float %C) { 117 %D = fmul float %A, %B ; <float> [#uses=1] 118 %E = fsub float %D, %C ; <float> [#uses=1] 119 %F = fsub float -0.000000e+00, %E ; <float> [#uses=1] 120 ret float %F 121; CHECK-LABEL: test_FNMSUBS: 122; CHECK: fnmsubs 123; CHECK-NEXT: blr 124 125; CHECK-VSX-LABEL: test_FNMSUBS: 126; CHECK-VSX: fnmsubs 127; CHECK-VSX-NEXT: blr 128} 129