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 4*9880d681SAndroid Build Coastguard Workerdefine double @test_FMADD_ASSOC1(double %A, double %B, double %C, 5*9880d681SAndroid Build Coastguard Worker double %D, double %E) { 6*9880d681SAndroid Build Coastguard Worker %F = fmul double %A, %B ; <double> [#uses=1] 7*9880d681SAndroid Build Coastguard Worker %G = fmul double %C, %D ; <double> [#uses=1] 8*9880d681SAndroid Build Coastguard Worker %H = fadd double %F, %G ; <double> [#uses=1] 9*9880d681SAndroid Build Coastguard Worker %I = fadd double %H, %E ; <double> [#uses=1] 10*9880d681SAndroid Build Coastguard Worker ret double %I 11*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_FMADD_ASSOC1: 12*9880d681SAndroid Build Coastguard Worker; CHECK: fmadd 13*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmadd 14*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-LABEL: test_FMADD_ASSOC1: 17*9880d681SAndroid Build Coastguard Worker; CHECK-VSX: xsmaddmdp 18*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: xsmaddadp 19*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: fmr 20*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: blr 21*9880d681SAndroid Build Coastguard Worker} 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Workerdefine double @test_FMADD_ASSOC2(double %A, double %B, double %C, 24*9880d681SAndroid Build Coastguard Worker double %D, double %E) { 25*9880d681SAndroid Build Coastguard Worker %F = fmul double %A, %B ; <double> [#uses=1] 26*9880d681SAndroid Build Coastguard Worker %G = fmul double %C, %D ; <double> [#uses=1] 27*9880d681SAndroid Build Coastguard Worker %H = fadd double %F, %G ; <double> [#uses=1] 28*9880d681SAndroid Build Coastguard Worker %I = fadd double %E, %H ; <double> [#uses=1] 29*9880d681SAndroid Build Coastguard Worker ret double %I 30*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_FMADD_ASSOC2: 31*9880d681SAndroid Build Coastguard Worker; CHECK: fmadd 32*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmadd 33*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-LABEL: test_FMADD_ASSOC2: 36*9880d681SAndroid Build Coastguard Worker; CHECK-VSX: xsmaddmdp 37*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: xsmaddadp 38*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: fmr 39*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: blr 40*9880d681SAndroid Build Coastguard Worker} 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Workerdefine double @test_FMSUB_ASSOC1(double %A, double %B, double %C, 43*9880d681SAndroid Build Coastguard Worker double %D, double %E) { 44*9880d681SAndroid Build Coastguard Worker %F = fmul double %A, %B ; <double> [#uses=1] 45*9880d681SAndroid Build Coastguard Worker %G = fmul double %C, %D ; <double> [#uses=1] 46*9880d681SAndroid Build Coastguard Worker %H = fadd double %F, %G ; <double> [#uses=1] 47*9880d681SAndroid Build Coastguard Worker %I = fsub double %H, %E ; <double> [#uses=1] 48*9880d681SAndroid Build Coastguard Worker ret double %I 49*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_FMSUB_ASSOC1: 50*9880d681SAndroid Build Coastguard Worker; CHECK: fmsub 51*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmadd 52*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-LABEL: test_FMSUB_ASSOC1: 55*9880d681SAndroid Build Coastguard Worker; CHECK-VSX: xsmsubmdp 56*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: xsmaddadp 57*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: fmr 58*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: blr 59*9880d681SAndroid Build Coastguard Worker} 60*9880d681SAndroid Build Coastguard Worker 61*9880d681SAndroid Build Coastguard Workerdefine double @test_FMSUB_ASSOC2(double %A, double %B, double %C, 62*9880d681SAndroid Build Coastguard Worker double %D, double %E) { 63*9880d681SAndroid Build Coastguard Worker %F = fmul double %A, %B ; <double> [#uses=1] 64*9880d681SAndroid Build Coastguard Worker %G = fmul double %C, %D ; <double> [#uses=1] 65*9880d681SAndroid Build Coastguard Worker %H = fadd double %F, %G ; <double> [#uses=1] 66*9880d681SAndroid Build Coastguard Worker %I = fsub double %E, %H ; <double> [#uses=1] 67*9880d681SAndroid Build Coastguard Worker ret double %I 68*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_FMSUB_ASSOC2: 69*9880d681SAndroid Build Coastguard Worker; CHECK: fnmsub 70*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fnmsub 71*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr 72*9880d681SAndroid Build Coastguard Worker 73*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-LABEL: test_FMSUB_ASSOC2: 74*9880d681SAndroid Build Coastguard Worker; CHECK-VSX: xsnmsubmdp 75*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: xsnmsubadp 76*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: fmr 77*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: blr 78*9880d681SAndroid Build Coastguard Worker} 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Workerdefine double @test_FMADD_ASSOC_EXT1(float %A, float %B, double %C, 81*9880d681SAndroid Build Coastguard Worker double %D, double %E) { 82*9880d681SAndroid Build Coastguard Worker %F = fmul float %A, %B ; <float> [#uses=1] 83*9880d681SAndroid Build Coastguard Worker %G = fpext float %F to double ; <double> [#uses=1] 84*9880d681SAndroid Build Coastguard Worker %H = fmul double %C, %D ; <double> [#uses=1] 85*9880d681SAndroid Build Coastguard Worker %I = fadd double %H, %G ; <double> [#uses=1] 86*9880d681SAndroid Build Coastguard Worker %J = fadd double %I, %E ; <double> [#uses=1] 87*9880d681SAndroid Build Coastguard Worker ret double %J 88*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_FMADD_ASSOC_EXT1: 89*9880d681SAndroid Build Coastguard Worker; CHECK: fmadd 90*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmadd 91*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-LABEL: test_FMADD_ASSOC_EXT1: 94*9880d681SAndroid Build Coastguard Worker; CHECK-VSX: xsmaddmdp 95*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: xsmaddadp 96*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: blr 97*9880d681SAndroid Build Coastguard Worker} 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Workerdefine double @test_FMADD_ASSOC_EXT2(float %A, float %B, float %C, 100*9880d681SAndroid Build Coastguard Worker float %D, double %E) { 101*9880d681SAndroid Build Coastguard Worker %F = fmul float %A, %B ; <float> [#uses=1] 102*9880d681SAndroid Build Coastguard Worker %G = fmul float %C, %D ; <float> [#uses=1] 103*9880d681SAndroid Build Coastguard Worker %H = fadd float %F, %G ; <float> [#uses=1] 104*9880d681SAndroid Build Coastguard Worker %I = fpext float %H to double ; <double> [#uses=1] 105*9880d681SAndroid Build Coastguard Worker %J = fadd double %I, %E ; <double> [#uses=1] 106*9880d681SAndroid Build Coastguard Worker ret double %J 107*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_FMADD_ASSOC_EXT2: 108*9880d681SAndroid Build Coastguard Worker; CHECK: fmadd 109*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmadd 110*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr 111*9880d681SAndroid Build Coastguard Worker 112*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-LABEL: test_FMADD_ASSOC_EXT2: 113*9880d681SAndroid Build Coastguard Worker; CHECK-VSX: xsmaddmdp 114*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: xsmaddadp 115*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: fmr 116*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: blr 117*9880d681SAndroid Build Coastguard Worker} 118*9880d681SAndroid Build Coastguard Worker 119*9880d681SAndroid Build Coastguard Workerdefine double @test_FMADD_ASSOC_EXT3(float %A, float %B, double %C, 120*9880d681SAndroid Build Coastguard Worker double %D, double %E) { 121*9880d681SAndroid Build Coastguard Worker %F = fmul float %A, %B ; <float> [#uses=1] 122*9880d681SAndroid Build Coastguard Worker %G = fpext float %F to double ; <double> [#uses=1] 123*9880d681SAndroid Build Coastguard Worker %H = fmul double %C, %D ; <double> [#uses=1] 124*9880d681SAndroid Build Coastguard Worker %I = fadd double %H, %G ; <double> [#uses=1] 125*9880d681SAndroid Build Coastguard Worker %J = fadd double %E, %I ; <double> [#uses=1] 126*9880d681SAndroid Build Coastguard Worker ret double %J 127*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_FMADD_ASSOC_EXT3: 128*9880d681SAndroid Build Coastguard Worker; CHECK: fmadd 129*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmadd 130*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr 131*9880d681SAndroid Build Coastguard Worker 132*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-LABEL: test_FMADD_ASSOC_EXT3: 133*9880d681SAndroid Build Coastguard Worker; CHECK-VSX: xsmaddmdp 134*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: xsmaddadp 135*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: blr 136*9880d681SAndroid Build Coastguard Worker} 137*9880d681SAndroid Build Coastguard Worker 138*9880d681SAndroid Build Coastguard Workerdefine double @test_FMADD_ASSOC_EXT4(float %A, float %B, float %C, 139*9880d681SAndroid Build Coastguard Worker float %D, double %E) { 140*9880d681SAndroid Build Coastguard Worker %F = fmul float %A, %B ; <float> [#uses=1] 141*9880d681SAndroid Build Coastguard Worker %G = fmul float %C, %D ; <float> [#uses=1] 142*9880d681SAndroid Build Coastguard Worker %H = fadd float %F, %G ; <float> [#uses=1] 143*9880d681SAndroid Build Coastguard Worker %I = fpext float %H to double ; <double> [#uses=1] 144*9880d681SAndroid Build Coastguard Worker %J = fadd double %E, %I ; <double> [#uses=1] 145*9880d681SAndroid Build Coastguard Worker ret double %J 146*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_FMADD_ASSOC_EXT4: 147*9880d681SAndroid Build Coastguard Worker; CHECK: fmadd 148*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmadd 149*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr 150*9880d681SAndroid Build Coastguard Worker 151*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-LABEL: test_FMADD_ASSOC_EXT4: 152*9880d681SAndroid Build Coastguard Worker; CHECK-VSX: xsmaddmdp 153*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: xsmaddadp 154*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: fmr 155*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: blr 156*9880d681SAndroid Build Coastguard Worker} 157*9880d681SAndroid Build Coastguard Worker 158*9880d681SAndroid Build Coastguard Workerdefine double @test_FMSUB_ASSOC_EXT1(float %A, float %B, double %C, 159*9880d681SAndroid Build Coastguard Worker double %D, double %E) { 160*9880d681SAndroid Build Coastguard Worker %F = fmul float %A, %B ; <float> [#uses=1] 161*9880d681SAndroid Build Coastguard Worker %G = fpext float %F to double ; <double> [#uses=1] 162*9880d681SAndroid Build Coastguard Worker %H = fmul double %C, %D ; <double> [#uses=1] 163*9880d681SAndroid Build Coastguard Worker %I = fadd double %H, %G ; <double> [#uses=1] 164*9880d681SAndroid Build Coastguard Worker %J = fsub double %I, %E ; <double> [#uses=1] 165*9880d681SAndroid Build Coastguard Worker ret double %J 166*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_FMSUB_ASSOC_EXT1: 167*9880d681SAndroid Build Coastguard Worker; CHECK: fmsub 168*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmadd 169*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr 170*9880d681SAndroid Build Coastguard Worker 171*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-LABEL: test_FMSUB_ASSOC_EXT1: 172*9880d681SAndroid Build Coastguard Worker; CHECK-VSX: xsmsubmdp 173*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: xsmaddadp 174*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: blr 175*9880d681SAndroid Build Coastguard Worker} 176*9880d681SAndroid Build Coastguard Worker 177*9880d681SAndroid Build Coastguard Workerdefine double @test_FMSUB_ASSOC_EXT2(float %A, float %B, float %C, 178*9880d681SAndroid Build Coastguard Worker float %D, double %E) { 179*9880d681SAndroid Build Coastguard Worker %F = fmul float %A, %B ; <float> [#uses=1] 180*9880d681SAndroid Build Coastguard Worker %G = fmul float %C, %D ; <float> [#uses=1] 181*9880d681SAndroid Build Coastguard Worker %H = fadd float %F, %G ; <float> [#uses=1] 182*9880d681SAndroid Build Coastguard Worker %I = fpext float %H to double ; <double> [#uses=1] 183*9880d681SAndroid Build Coastguard Worker %J = fsub double %I, %E ; <double> [#uses=1] 184*9880d681SAndroid Build Coastguard Worker ret double %J 185*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_FMSUB_ASSOC_EXT2: 186*9880d681SAndroid Build Coastguard Worker; CHECK: fmsub 187*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmadd 188*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr 189*9880d681SAndroid Build Coastguard Worker 190*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-LABEL: test_FMSUB_ASSOC_EXT2: 191*9880d681SAndroid Build Coastguard Worker; CHECK-VSX: xsmsubmdp 192*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: xsmaddadp 193*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: fmr 194*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: blr 195*9880d681SAndroid Build Coastguard Worker} 196*9880d681SAndroid Build Coastguard Worker 197*9880d681SAndroid Build Coastguard Workerdefine double @test_FMSUB_ASSOC_EXT3(float %A, float %B, double %C, 198*9880d681SAndroid Build Coastguard Worker double %D, double %E) { 199*9880d681SAndroid Build Coastguard Worker %F = fmul float %A, %B ; <float> [#uses=1] 200*9880d681SAndroid Build Coastguard Worker %G = fpext float %F to double ; <double> [#uses=1] 201*9880d681SAndroid Build Coastguard Worker %H = fmul double %C, %D ; <double> [#uses=1] 202*9880d681SAndroid Build Coastguard Worker %I = fadd double %H, %G ; <double> [#uses=1] 203*9880d681SAndroid Build Coastguard Worker %J = fsub double %E, %I ; <double> [#uses=1] 204*9880d681SAndroid Build Coastguard Worker ret double %J 205*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_FMSUB_ASSOC_EXT3: 206*9880d681SAndroid Build Coastguard Worker; CHECK: fnmsub 207*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fnmsub 208*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr 209*9880d681SAndroid Build Coastguard Worker 210*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-LABEL: test_FMSUB_ASSOC_EXT3: 211*9880d681SAndroid Build Coastguard Worker; CHECK-VSX: xsnmsubmdp 212*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: xsnmsubadp 213*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: fmr 214*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: blr 215*9880d681SAndroid Build Coastguard Worker} 216*9880d681SAndroid Build Coastguard Worker 217*9880d681SAndroid Build Coastguard Workerdefine double @test_FMSUB_ASSOC_EXT4(float %A, float %B, float %C, 218*9880d681SAndroid Build Coastguard Worker float %D, double %E) { 219*9880d681SAndroid Build Coastguard Worker %F = fmul float %A, %B ; <float> [#uses=1] 220*9880d681SAndroid Build Coastguard Worker %G = fmul float %C, %D ; <float> [#uses=1] 221*9880d681SAndroid Build Coastguard Worker %H = fadd float %F, %G ; <float> [#uses=1] 222*9880d681SAndroid Build Coastguard Worker %I = fpext float %H to double ; <double> [#uses=1] 223*9880d681SAndroid Build Coastguard Worker %J = fsub double %E, %I ; <double> [#uses=1] 224*9880d681SAndroid Build Coastguard Worker ret double %J 225*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_FMSUB_ASSOC_EXT4: 226*9880d681SAndroid Build Coastguard Worker; CHECK: fnmsub 227*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fnmsub 228*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr 229*9880d681SAndroid Build Coastguard Worker 230*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-LABEL: test_FMSUB_ASSOC_EXT4: 231*9880d681SAndroid Build Coastguard Worker; CHECK-VSX: xsnmsubmdp 232*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: xsnmsubadp 233*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: fmr 234*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: blr 235*9880d681SAndroid Build Coastguard Worker} 236