1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=ppc32 -fp-contract=fast -mattr=-vsx -disable-ppc-vsx-fma-mutation=false | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -fp-contract=fast -mattr=+vsx -mcpu=pwr7 -disable-ppc-vsx-fma-mutation=false | FileCheck -check-prefix=CHECK-VSX %s 3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -fp-contract=fast -mcpu=pwr8 -disable-ppc-vsx-fma-mutation=false | FileCheck -check-prefix=CHECK-P8 %s 4*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=powerpc64le-unknown-linux-gnu -fp-contract=fast -mcpu=pwr8 -disable-ppc-vsx-fma-mutation=false | FileCheck -check-prefix=CHECK-P8 %s 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Workerdeclare double @dummy1(double) #0 7*9880d681SAndroid Build Coastguard Workerdeclare double @dummy2(double, double) #0 8*9880d681SAndroid Build Coastguard Workerdeclare double @dummy3(double, double, double) #0 9*9880d681SAndroid Build Coastguard Workerdeclare float @dummy4(float, float) #0 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Workerdefine double @test_FMADD1(double %A, double %B, double %C) { 12*9880d681SAndroid Build Coastguard Worker %D = fmul double %A, %B ; <double> [#uses=1] 13*9880d681SAndroid Build Coastguard Worker %E = fadd double %C, %D ; <double> [#uses=1] 14*9880d681SAndroid Build Coastguard Worker ret double %E 15*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_FMADD1: 16*9880d681SAndroid Build Coastguard Worker; CHECK: fmadd 17*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-LABEL: test_FMADD1: 20*9880d681SAndroid Build Coastguard Worker; CHECK-VSX: xsmaddmdp 21*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: blr 22*9880d681SAndroid Build Coastguard Worker} 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Workerdefine double @test_FMADD2(double %A, double %B, double %C) { 25*9880d681SAndroid Build Coastguard Worker %D = fmul double %A, %B ; <double> [#uses=1] 26*9880d681SAndroid Build Coastguard Worker %E = fadd double %D, %C ; <double> [#uses=1] 27*9880d681SAndroid Build Coastguard Worker ret double %E 28*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_FMADD2: 29*9880d681SAndroid Build Coastguard Worker; CHECK: fmadd 30*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-LABEL: test_FMADD2: 33*9880d681SAndroid Build Coastguard Worker; CHECK-VSX: xsmaddmdp 34*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: blr 35*9880d681SAndroid Build Coastguard Worker} 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Workerdefine double @test_FMSUB1(double %A, double %B, double %C) { 38*9880d681SAndroid Build Coastguard Worker %D = fmul double %A, %B ; <double> [#uses=1] 39*9880d681SAndroid Build Coastguard Worker %E = fsub double %D, %C ; <double> [#uses=1] 40*9880d681SAndroid Build Coastguard Worker ret double %E 41*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_FMSUB1: 42*9880d681SAndroid Build Coastguard Worker; CHECK: fmsub 43*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-LABEL: test_FMSUB1: 46*9880d681SAndroid Build Coastguard Worker; CHECK-VSX: xsmsubmdp 47*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: blr 48*9880d681SAndroid Build Coastguard Worker} 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Workerdefine double @test_FMSUB2(double %A, double %B, double %C, double %D) { 51*9880d681SAndroid Build Coastguard Worker %E = fmul double %A, %B ; <double> [#uses=2] 52*9880d681SAndroid Build Coastguard Worker %F = fadd double %E, %C ; <double> [#uses=1] 53*9880d681SAndroid Build Coastguard Worker %G = fsub double %E, %D ; <double> [#uses=1] 54*9880d681SAndroid Build Coastguard Worker %H = call double @dummy2(double %F, double %G) ; <double> [#uses=1] 55*9880d681SAndroid Build Coastguard Worker ret double %H 56*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_FMSUB2: 57*9880d681SAndroid Build Coastguard Worker; CHECK: fmadd 58*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmsub 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-LABEL: test_FMSUB2: 61*9880d681SAndroid Build Coastguard Worker; CHECK-VSX: xsmaddadp 62*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: xsmsubmdp 63*9880d681SAndroid Build Coastguard Worker} 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Workerdefine double @test_FNMADD1(double %A, double %B, double %C) { 66*9880d681SAndroid Build Coastguard Worker %D = fmul double %A, %B ; <double> [#uses=1] 67*9880d681SAndroid Build Coastguard Worker %E = fadd double %D, %C ; <double> [#uses=1] 68*9880d681SAndroid Build Coastguard Worker %F = fsub double -0.000000e+00, %E ; <double> [#uses=1] 69*9880d681SAndroid Build Coastguard Worker ret double %F 70*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_FNMADD1: 71*9880d681SAndroid Build Coastguard Worker; CHECK: fnmadd 72*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-LABEL: test_FNMADD1: 75*9880d681SAndroid Build Coastguard Worker; CHECK-VSX: xsnmaddmdp 76*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: blr 77*9880d681SAndroid Build Coastguard Worker} 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Workerdefine double @test_FNMADD2(double %A, double %B, double %C) { 80*9880d681SAndroid Build Coastguard Worker %D = fmul double %A, %B ; <double> [#uses=1] 81*9880d681SAndroid Build Coastguard Worker %E = fadd double %C, %D ; <double> [#uses=1] 82*9880d681SAndroid Build Coastguard Worker %F = fsub double -0.000000e+00, %E ; <double> [#uses=1] 83*9880d681SAndroid Build Coastguard Worker ret double %F 84*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_FNMADD2: 85*9880d681SAndroid Build Coastguard Worker; CHECK: fnmadd 86*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr 87*9880d681SAndroid Build Coastguard Worker 88*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-LABEL: test_FNMADD2: 89*9880d681SAndroid Build Coastguard Worker; CHECK-VSX: xsnmaddmdp 90*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: blr 91*9880d681SAndroid Build Coastguard Worker} 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Workerdefine double @test_FNMSUB1(double %A, double %B, double %C) { 94*9880d681SAndroid Build Coastguard Worker %D = fmul double %A, %B ; <double> [#uses=1] 95*9880d681SAndroid Build Coastguard Worker %E = fsub double %C, %D ; <double> [#uses=1] 96*9880d681SAndroid Build Coastguard Worker ret double %E 97*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_FNMSUB1: 98*9880d681SAndroid Build Coastguard Worker; CHECK: fnmsub 99*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-LABEL: test_FNMSUB1: 102*9880d681SAndroid Build Coastguard Worker; CHECK-VSX: xsnmsubmdp 103*9880d681SAndroid Build Coastguard Worker} 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Workerdefine double @test_FNMSUB2(double %A, double %B, double %C) { 106*9880d681SAndroid Build Coastguard Worker %D = fmul double %A, %B ; <double> [#uses=1] 107*9880d681SAndroid Build Coastguard Worker %E = fsub double %D, %C ; <double> [#uses=1] 108*9880d681SAndroid Build Coastguard Worker %F = fsub double -0.000000e+00, %E ; <double> [#uses=1] 109*9880d681SAndroid Build Coastguard Worker ret double %F 110*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_FNMSUB2: 111*9880d681SAndroid Build Coastguard Worker; CHECK: fnmsub 112*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr 113*9880d681SAndroid Build Coastguard Worker 114*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-LABEL: test_FNMSUB2: 115*9880d681SAndroid Build Coastguard Worker; CHECK-VSX: xsnmsubmdp 116*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: blr 117*9880d681SAndroid Build Coastguard Worker} 118*9880d681SAndroid Build Coastguard Worker 119*9880d681SAndroid Build Coastguard Workerdefine float @test_FNMSUBS(float %A, float %B, float %C) { 120*9880d681SAndroid Build Coastguard Worker %D = fmul float %A, %B ; <float> [#uses=1] 121*9880d681SAndroid Build Coastguard Worker %E = fsub float %D, %C ; <float> [#uses=1] 122*9880d681SAndroid Build Coastguard Worker %F = fsub float -0.000000e+00, %E ; <float> [#uses=1] 123*9880d681SAndroid Build Coastguard Worker ret float %F 124*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_FNMSUBS: 125*9880d681SAndroid Build Coastguard Worker; CHECK: fnmsubs 126*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr 127*9880d681SAndroid Build Coastguard Worker 128*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-LABEL: test_FNMSUBS: 129*9880d681SAndroid Build Coastguard Worker; CHECK-VSX: fnmsubs 130*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: blr 131*9880d681SAndroid Build Coastguard Worker} 132*9880d681SAndroid Build Coastguard Worker 133*9880d681SAndroid Build Coastguard Workerdefine float @test_XSMADDMSP(float %A, float %B, float %C) { 134*9880d681SAndroid Build Coastguard Worker %D = fmul float %A, %B ; <float> [#uses=1] 135*9880d681SAndroid Build Coastguard Worker %E = fadd float %C, %D ; <float> [#uses=1] 136*9880d681SAndroid Build Coastguard Worker ret float %E 137*9880d681SAndroid Build Coastguard Worker; CHECK-P8-LABEL: test_XSMADDMSP: 138*9880d681SAndroid Build Coastguard Worker; CHECK-P8: xsmaddmsp 139*9880d681SAndroid Build Coastguard Worker; CHECK-P8-NEXT: blr 140*9880d681SAndroid Build Coastguard Worker} 141*9880d681SAndroid Build Coastguard Worker 142*9880d681SAndroid Build Coastguard Workerdefine float @test_XSMSUBMSP(float %A, float %B, float %C) { 143*9880d681SAndroid Build Coastguard Worker %D = fmul float %A, %B ; <float> [#uses=1] 144*9880d681SAndroid Build Coastguard Worker %E = fsub float %D, %C ; <float> [#uses=1] 145*9880d681SAndroid Build Coastguard Worker ret float %E 146*9880d681SAndroid Build Coastguard Worker; CHECK-P8-LABEL: test_XSMSUBMSP: 147*9880d681SAndroid Build Coastguard Worker; CHECK-P8: xsmsubmsp 148*9880d681SAndroid Build Coastguard Worker; CHECK-P8-NEXT: blr 149*9880d681SAndroid Build Coastguard Worker} 150*9880d681SAndroid Build Coastguard Worker 151*9880d681SAndroid Build Coastguard Workerdefine float @test_XSMADDASP(float %A, float %B, float %C, float %D) { 152*9880d681SAndroid Build Coastguard Worker %E = fmul float %A, %B ; <float> [#uses=2] 153*9880d681SAndroid Build Coastguard Worker %F = fadd float %E, %C ; <float> [#uses=1] 154*9880d681SAndroid Build Coastguard Worker %G = fsub float %E, %D ; <float> [#uses=1] 155*9880d681SAndroid Build Coastguard Worker %H = call float @dummy4(float %F, float %G) ; <float> [#uses=1] 156*9880d681SAndroid Build Coastguard Worker ret float %H 157*9880d681SAndroid Build Coastguard Worker; CHECK-P8-LABEL: test_XSMADDASP: 158*9880d681SAndroid Build Coastguard Worker; CHECK-P8: xsmaddasp 159*9880d681SAndroid Build Coastguard Worker; CHECK-P8-NEXT: xsmsubmsp 160*9880d681SAndroid Build Coastguard Worker} 161*9880d681SAndroid Build Coastguard Worker 162*9880d681SAndroid Build Coastguard Workerdefine float @test_XSMSUBASP(float %A, float %B, float %C, float %D) { 163*9880d681SAndroid Build Coastguard Worker %E = fmul float %A, %B ; <float> [#uses=2] 164*9880d681SAndroid Build Coastguard Worker %F = fsub float %E, %C ; <float> [#uses=1] 165*9880d681SAndroid Build Coastguard Worker %G = fsub float %E, %D ; <float> [#uses=1] 166*9880d681SAndroid Build Coastguard Worker %H = call float @dummy4(float %F, float %G) ; <float> [#uses=1] 167*9880d681SAndroid Build Coastguard Worker ret float %H 168*9880d681SAndroid Build Coastguard Worker; CHECK-P8-LABEL: test_XSMSUBASP: 169*9880d681SAndroid Build Coastguard Worker; CHECK-P8: xsmsubasp 170*9880d681SAndroid Build Coastguard Worker; CHECK-P8-NEXT: xsmsubmsp 171*9880d681SAndroid Build Coastguard Worker} 172*9880d681SAndroid Build Coastguard Worker 173*9880d681SAndroid Build Coastguard Workerdefine float @test_XSNMADDMSP(float %A, float %B, float %C) { 174*9880d681SAndroid Build Coastguard Worker %D = fmul float %A, %B ; <float> [#uses=1] 175*9880d681SAndroid Build Coastguard Worker %E = fadd float %D, %C ; <float> [#uses=1] 176*9880d681SAndroid Build Coastguard Worker %F = fsub float -0.000000e+00, %E ; <float> [#uses=1] 177*9880d681SAndroid Build Coastguard Worker ret float %F 178*9880d681SAndroid Build Coastguard Worker; CHECK-P8-LABEL: test_XSNMADDMSP: 179*9880d681SAndroid Build Coastguard Worker; CHECK-P8: xsnmaddmsp 180*9880d681SAndroid Build Coastguard Worker; CHECK-P8-NEXT: blr 181*9880d681SAndroid Build Coastguard Worker} 182*9880d681SAndroid Build Coastguard Worker 183*9880d681SAndroid Build Coastguard Workerdefine float @test_XSNMSUBMSP(float %A, float %B, float %C) { 184*9880d681SAndroid Build Coastguard Worker %D = fmul float %A, %B ; <float> [#uses=1] 185*9880d681SAndroid Build Coastguard Worker %E = fsub float %D, %C ; <float> [#uses=1] 186*9880d681SAndroid Build Coastguard Worker %F = fsub float -0.000000e+00, %E ; <float> [#uses=1] 187*9880d681SAndroid Build Coastguard Worker ret float %F 188*9880d681SAndroid Build Coastguard Worker; CHECK-P8-LABEL: test_XSNMSUBMSP: 189*9880d681SAndroid Build Coastguard Worker; CHECK-P8: xsnmsubmsp 190*9880d681SAndroid Build Coastguard Worker; CHECK-P8-NEXT: blr 191*9880d681SAndroid Build Coastguard Worker} 192*9880d681SAndroid Build Coastguard Worker 193*9880d681SAndroid Build Coastguard Workerdefine float @test_XSNMADDASP(float %A, float %B, float %C) { 194*9880d681SAndroid Build Coastguard Worker %D = fmul float %A, %B ; <float> [#uses=1] 195*9880d681SAndroid Build Coastguard Worker %E = fadd float %D, %C ; <float> [#uses=1] 196*9880d681SAndroid Build Coastguard Worker %F = fsub float -0.000000e+00, %E ; <float> [#uses=1] 197*9880d681SAndroid Build Coastguard Worker %H = call float @dummy4(float %E, float %F) ; <float> [#uses=1] 198*9880d681SAndroid Build Coastguard Worker ret float %F 199*9880d681SAndroid Build Coastguard Worker; CHECK-P8-LABEL: test_XSNMADDASP: 200*9880d681SAndroid Build Coastguard Worker; CHECK-P8: xsnmaddasp 201*9880d681SAndroid Build Coastguard Worker} 202*9880d681SAndroid Build Coastguard Worker 203*9880d681SAndroid Build Coastguard Workerdefine float @test_XSNMSUBASP(float %A, float %B, float %C) { 204*9880d681SAndroid Build Coastguard Worker %D = fmul float %A, %B ; <float> [#uses=1] 205*9880d681SAndroid Build Coastguard Worker %E = fsub float %D, %C ; <float> [#uses=1] 206*9880d681SAndroid Build Coastguard Worker %F = fsub float -0.000000e+00, %E ; <float> [#uses=1] 207*9880d681SAndroid Build Coastguard Worker %H = call float @dummy4(float %E, float %F) ; <float> [#uses=1] 208*9880d681SAndroid Build Coastguard Worker ret float %F 209*9880d681SAndroid Build Coastguard Worker; CHECK-P8-LABEL: test_XSNMSUBASP: 210*9880d681SAndroid Build Coastguard Worker; CHECK-P8: xsnmsubasp 211*9880d681SAndroid Build Coastguard Worker} 212