1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mcpu=pwr7 -mattr=+vsx | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mcpu=pwr7 -mattr=+vsx -fast-isel -O0 | FileCheck -check-prefix=CHECK-FISL %s 3*9880d681SAndroid Build Coastguard Worker; XFAIL: * 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker; Also run with -schedule-ppc-vsx-fma-mutation-early as a stress test for the 6*9880d681SAndroid Build Coastguard Worker; live-interval-updating logic. 7*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mcpu=pwr7 -mattr=+vsx -schedule-ppc-vsx-fma-mutation-early 8*9880d681SAndroid Build Coastguard Workertarget datalayout = "E-m:e-i64:64-n32:64" 9*9880d681SAndroid Build Coastguard Workertarget triple = "powerpc64-unknown-linux-gnu" 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Workerdefine void @test1(double %a, double %b, double %c, double %e, double* nocapture %d) #0 { 12*9880d681SAndroid Build Coastguard Workerentry: 13*9880d681SAndroid Build Coastguard Worker %0 = tail call double @llvm.fma.f64(double %b, double %c, double %a) 14*9880d681SAndroid Build Coastguard Worker store double %0, double* %d, align 8 15*9880d681SAndroid Build Coastguard Worker %1 = tail call double @llvm.fma.f64(double %b, double %e, double %a) 16*9880d681SAndroid Build Coastguard Worker %arrayidx1 = getelementptr inbounds double, double* %d, i64 1 17*9880d681SAndroid Build Coastguard Worker store double %1, double* %arrayidx1, align 8 18*9880d681SAndroid Build Coastguard Worker ret void 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1 21*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: li [[C1:[0-9]+]], 8 22*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: xsmaddmdp 3, 2, 1 23*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: xsmaddadp 1, 2, 4 24*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: stxsdx 3, 0, 7 25*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: stxsdx 1, 7, [[C1]] 26*9880d681SAndroid Build Coastguard Worker; CHECK: blr 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-LABEL: @test1 29*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: fmr 0, 1 30*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xsmaddadp 0, 2, 3 31*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: stxsdx 0, 0, 7 32*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xsmaddadp 1, 2, 4 33*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: li [[C1:[0-9]+]], 8 34*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: stxsdx 1, 7, [[C1]] 35*9880d681SAndroid Build Coastguard Worker; CHECK-FISL: blr 36*9880d681SAndroid Build Coastguard Worker} 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Workerdefine void @test2(double %a, double %b, double %c, double %e, double %f, double* nocapture %d) #0 { 39*9880d681SAndroid Build Coastguard Workerentry: 40*9880d681SAndroid Build Coastguard Worker %0 = tail call double @llvm.fma.f64(double %b, double %c, double %a) 41*9880d681SAndroid Build Coastguard Worker store double %0, double* %d, align 8 42*9880d681SAndroid Build Coastguard Worker %1 = tail call double @llvm.fma.f64(double %b, double %e, double %a) 43*9880d681SAndroid Build Coastguard Worker %arrayidx1 = getelementptr inbounds double, double* %d, i64 1 44*9880d681SAndroid Build Coastguard Worker store double %1, double* %arrayidx1, align 8 45*9880d681SAndroid Build Coastguard Worker %2 = tail call double @llvm.fma.f64(double %b, double %f, double %a) 46*9880d681SAndroid Build Coastguard Worker %arrayidx2 = getelementptr inbounds double, double* %d, i64 2 47*9880d681SAndroid Build Coastguard Worker store double %2, double* %arrayidx2, align 8 48*9880d681SAndroid Build Coastguard Worker ret void 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2 51*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: li [[C1:[0-9]+]], 8 52*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: li [[C2:[0-9]+]], 16 53*9880d681SAndroid Build Coastguard Worker; FIXME: We no longer get this because of copy ordering at the MI level. 54*9880d681SAndroid Build Coastguard Worker; CHECX-DAG: xsmaddmdp 3, 2, 1 55*9880d681SAndroid Build Coastguard Worker; CHECX-DAG: xsmaddmdp 4, 2, 1 56*9880d681SAndroid Build Coastguard Worker; CHECX-DAG: xsmaddadp 1, 2, 5 57*9880d681SAndroid Build Coastguard Worker; CHECX-DAG: stxsdx 3, 0, 8 58*9880d681SAndroid Build Coastguard Worker; CHECX-DAG: stxsdx 4, 8, [[C1]] 59*9880d681SAndroid Build Coastguard Worker; CHECX-DAG: stxsdx 1, 8, [[C2]] 60*9880d681SAndroid Build Coastguard Worker; CHECK: blr 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-LABEL: @test2 63*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: fmr 0, 1 64*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xsmaddadp 0, 2, 3 65*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: stxsdx 0, 0, 8 66*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: fmr 0, 1 67*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xsmaddadp 0, 2, 4 68*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: li [[C1:[0-9]+]], 8 69*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: stxsdx 0, 8, [[C1]] 70*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xsmaddadp 1, 2, 5 71*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: li [[C2:[0-9]+]], 16 72*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: stxsdx 1, 8, [[C2]] 73*9880d681SAndroid Build Coastguard Worker; CHECK-FISL: blr 74*9880d681SAndroid Build Coastguard Worker} 75*9880d681SAndroid Build Coastguard Worker 76*9880d681SAndroid Build Coastguard Workerdefine void @test3(double %a, double %b, double %c, double %e, double %f, double* nocapture %d) #0 { 77*9880d681SAndroid Build Coastguard Workerentry: 78*9880d681SAndroid Build Coastguard Worker %0 = tail call double @llvm.fma.f64(double %b, double %c, double %a) 79*9880d681SAndroid Build Coastguard Worker store double %0, double* %d, align 8 80*9880d681SAndroid Build Coastguard Worker %1 = tail call double @llvm.fma.f64(double %b, double %e, double %a) 81*9880d681SAndroid Build Coastguard Worker %2 = tail call double @llvm.fma.f64(double %b, double %c, double %1) 82*9880d681SAndroid Build Coastguard Worker %arrayidx1 = getelementptr inbounds double, double* %d, i64 3 83*9880d681SAndroid Build Coastguard Worker store double %2, double* %arrayidx1, align 8 84*9880d681SAndroid Build Coastguard Worker %3 = tail call double @llvm.fma.f64(double %b, double %f, double %a) 85*9880d681SAndroid Build Coastguard Worker %arrayidx2 = getelementptr inbounds double, double* %d, i64 2 86*9880d681SAndroid Build Coastguard Worker store double %3, double* %arrayidx2, align 8 87*9880d681SAndroid Build Coastguard Worker %arrayidx3 = getelementptr inbounds double, double* %d, i64 1 88*9880d681SAndroid Build Coastguard Worker store double %1, double* %arrayidx3, align 8 89*9880d681SAndroid Build Coastguard Worker ret void 90*9880d681SAndroid Build Coastguard Worker 91*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3 92*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmr [[F1:[0-9]+]], 1 93*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: li [[C1:[0-9]+]], 24 94*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: li [[C2:[0-9]+]], 16 95*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: li [[C3:[0-9]+]], 8 96*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: xsmaddmdp 4, 2, 1 97*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: xsmaddadp 1, 2, 5 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Worker; Note: We could convert this next FMA to M-type as well, but it would require 100*9880d681SAndroid Build Coastguard Worker; re-ordering the instructions. 101*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: xsmaddadp [[F1]], 2, 3 102*9880d681SAndroid Build Coastguard Worker 103*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: xsmaddmdp 3, 2, 4 104*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: stxsdx [[F1]], 0, 8 105*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: stxsdx 3, 8, [[C1]] 106*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: stxsdx 1, 8, [[C2]] 107*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: stxsdx 4, 8, [[C3]] 108*9880d681SAndroid Build Coastguard Worker; CHECK: blr 109*9880d681SAndroid Build Coastguard Worker 110*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-LABEL: @test3 111*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: fmr [[F1:[0-9]+]], 1 112*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xsmaddadp [[F1]], 2, 4 113*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: fmr 4, [[F1]] 114*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xsmaddadp 4, 2, 3 115*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: li [[C1:[0-9]+]], 24 116*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: stxsdx 4, 8, [[C1]] 117*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xsmaddadp 1, 2, 5 118*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: li [[C2:[0-9]+]], 16 119*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: stxsdx 1, 8, [[C2]] 120*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: li [[C3:[0-9]+]], 8 121*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: stxsdx 0, 8, [[C3]] 122*9880d681SAndroid Build Coastguard Worker; CHECK-FISL: blr 123*9880d681SAndroid Build Coastguard Worker} 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard Workerdefine void @test4(double %a, double %b, double %c, double %e, double %f, double* nocapture %d) #0 { 126*9880d681SAndroid Build Coastguard Workerentry: 127*9880d681SAndroid Build Coastguard Worker %0 = tail call double @llvm.fma.f64(double %b, double %c, double %a) 128*9880d681SAndroid Build Coastguard Worker store double %0, double* %d, align 8 129*9880d681SAndroid Build Coastguard Worker %1 = tail call double @llvm.fma.f64(double %b, double %e, double %a) 130*9880d681SAndroid Build Coastguard Worker %arrayidx1 = getelementptr inbounds double, double* %d, i64 1 131*9880d681SAndroid Build Coastguard Worker store double %1, double* %arrayidx1, align 8 132*9880d681SAndroid Build Coastguard Worker %2 = tail call double @llvm.fma.f64(double %b, double %c, double %1) 133*9880d681SAndroid Build Coastguard Worker %arrayidx3 = getelementptr inbounds double, double* %d, i64 3 134*9880d681SAndroid Build Coastguard Worker store double %2, double* %arrayidx3, align 8 135*9880d681SAndroid Build Coastguard Worker %3 = tail call double @llvm.fma.f64(double %b, double %f, double %a) 136*9880d681SAndroid Build Coastguard Worker %arrayidx4 = getelementptr inbounds double, double* %d, i64 2 137*9880d681SAndroid Build Coastguard Worker store double %3, double* %arrayidx4, align 8 138*9880d681SAndroid Build Coastguard Worker ret void 139*9880d681SAndroid Build Coastguard Worker 140*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test4 141*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmr [[F1:[0-9]+]], 1 142*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: li [[C1:[0-9]+]], 8 143*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: li [[C2:[0-9]+]], 16 144*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: xsmaddmdp 4, 2, 1 145*9880d681SAndroid Build Coastguard Worker 146*9880d681SAndroid Build Coastguard Worker; Note: We could convert this next FMA to M-type as well, but it would require 147*9880d681SAndroid Build Coastguard Worker; re-ordering the instructions. 148*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: xsmaddadp 1, 2, 5 149*9880d681SAndroid Build Coastguard Worker 150*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: xsmaddadp [[F1]], 2, 3 151*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: stxsdx [[F1]], 0, 8 152*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: stxsdx 4, 8, [[C1]] 153*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: li [[C3:[0-9]+]], 24 154*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: xsmaddadp 4, 2, 3 155*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: stxsdx 4, 8, [[C3]] 156*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: stxsdx 1, 8, [[C2]] 157*9880d681SAndroid Build Coastguard Worker; CHECK: blr 158*9880d681SAndroid Build Coastguard Worker 159*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-LABEL: @test4 160*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: fmr [[F1:[0-9]+]], 1 161*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xsmaddadp [[F1]], 2, 3 162*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: stxsdx 0, 0, 8 163*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: fmr [[F1]], 1 164*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xsmaddadp [[F1]], 2, 4 165*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: li [[C3:[0-9]+]], 8 166*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: stxsdx 0, 8, [[C3]] 167*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xsmaddadp 0, 2, 3 168*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: li [[C1:[0-9]+]], 24 169*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: stxsdx 0, 8, [[C1]] 170*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xsmaddadp 1, 2, 5 171*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: li [[C2:[0-9]+]], 16 172*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: stxsdx 1, 8, [[C2]] 173*9880d681SAndroid Build Coastguard Worker; CHECK-FISL: blr 174*9880d681SAndroid Build Coastguard Worker} 175*9880d681SAndroid Build Coastguard Worker 176*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.fma.f64(double, double, double) #0 177*9880d681SAndroid Build Coastguard Worker 178*9880d681SAndroid Build Coastguard Workerdefine void @testv1(<2 x double> %a, <2 x double> %b, <2 x double> %c, <2 x double> %e, <2 x double>* nocapture %d) #0 { 179*9880d681SAndroid Build Coastguard Workerentry: 180*9880d681SAndroid Build Coastguard Worker %0 = tail call <2 x double> @llvm.fma.v2f64(<2 x double> %b, <2 x double> %c, <2 x double> %a) 181*9880d681SAndroid Build Coastguard Worker store <2 x double> %0, <2 x double>* %d, align 8 182*9880d681SAndroid Build Coastguard Worker %1 = tail call <2 x double> @llvm.fma.v2f64(<2 x double> %b, <2 x double> %e, <2 x double> %a) 183*9880d681SAndroid Build Coastguard Worker %arrayidx1 = getelementptr inbounds <2 x double>, <2 x double>* %d, i64 1 184*9880d681SAndroid Build Coastguard Worker store <2 x double> %1, <2 x double>* %arrayidx1, align 8 185*9880d681SAndroid Build Coastguard Worker ret void 186*9880d681SAndroid Build Coastguard Worker 187*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @testv1 188*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: xvmaddmdp 36, 35, 34 189*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: xvmaddadp 34, 35, 37 190*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: li [[C1:[0-9]+]], 16 191*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: stxvd2x 36, 0, 3 192*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: stxvd2x 34, 3, [[C1:[0-9]+]] 193*9880d681SAndroid Build Coastguard Worker; CHECK: blr 194*9880d681SAndroid Build Coastguard Worker 195*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-LABEL: @testv1 196*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xxlor 0, 34, 34 197*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xvmaddadp 0, 35, 36 198*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: stxvd2x 0, 0, 3 199*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xvmaddadp 34, 35, 37 200*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: li [[C1:[0-9]+]], 16 201*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: stxvd2x 34, 3, [[C1:[0-9]+]] 202*9880d681SAndroid Build Coastguard Worker; CHECK-FISL: blr 203*9880d681SAndroid Build Coastguard Worker} 204*9880d681SAndroid Build Coastguard Worker 205*9880d681SAndroid Build Coastguard Workerdefine void @testv2(<2 x double> %a, <2 x double> %b, <2 x double> %c, <2 x double> %e, <2 x double> %f, <2 x double>* nocapture %d) #0 { 206*9880d681SAndroid Build Coastguard Workerentry: 207*9880d681SAndroid Build Coastguard Worker %0 = tail call <2 x double> @llvm.fma.v2f64(<2 x double> %b, <2 x double> %c, <2 x double> %a) 208*9880d681SAndroid Build Coastguard Worker store <2 x double> %0, <2 x double>* %d, align 8 209*9880d681SAndroid Build Coastguard Worker %1 = tail call <2 x double> @llvm.fma.v2f64(<2 x double> %b, <2 x double> %e, <2 x double> %a) 210*9880d681SAndroid Build Coastguard Worker %arrayidx1 = getelementptr inbounds <2 x double>, <2 x double>* %d, i64 1 211*9880d681SAndroid Build Coastguard Worker store <2 x double> %1, <2 x double>* %arrayidx1, align 8 212*9880d681SAndroid Build Coastguard Worker %2 = tail call <2 x double> @llvm.fma.v2f64(<2 x double> %b, <2 x double> %f, <2 x double> %a) 213*9880d681SAndroid Build Coastguard Worker %arrayidx2 = getelementptr inbounds <2 x double>, <2 x double>* %d, i64 2 214*9880d681SAndroid Build Coastguard Worker store <2 x double> %2, <2 x double>* %arrayidx2, align 8 215*9880d681SAndroid Build Coastguard Worker ret void 216*9880d681SAndroid Build Coastguard Worker 217*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @testv2 218*9880d681SAndroid Build Coastguard Worker; FIXME: We currently don't get this because of copy ordering on the MI level. 219*9880d681SAndroid Build Coastguard Worker; CHECX-DAG: xvmaddmdp 36, 35, 34 220*9880d681SAndroid Build Coastguard Worker; CHECX-DAG: xvmaddmdp 37, 35, 34 221*9880d681SAndroid Build Coastguard Worker; CHECX-DAG: li [[C1:[0-9]+]], 16 222*9880d681SAndroid Build Coastguard Worker; CHECX-DAG: li [[C2:[0-9]+]], 32 223*9880d681SAndroid Build Coastguard Worker; CHECX-DAG: xvmaddadp 34, 35, 38 224*9880d681SAndroid Build Coastguard Worker; CHECX-DAG: stxvd2x 36, 0, 3 225*9880d681SAndroid Build Coastguard Worker; CHECX-DAG: stxvd2x 37, 3, [[C1:[0-9]+]] 226*9880d681SAndroid Build Coastguard Worker; CHECX-DAG: stxvd2x 34, 3, [[C2:[0-9]+]] 227*9880d681SAndroid Build Coastguard Worker; CHECK: blr 228*9880d681SAndroid Build Coastguard Worker 229*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-LABEL: @testv2 230*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xxlor 0, 34, 34 231*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xvmaddadp 0, 35, 36 232*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: stxvd2x 0, 0, 3 233*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xxlor 0, 34, 34 234*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xvmaddadp 0, 35, 37 235*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: li [[C1:[0-9]+]], 16 236*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: stxvd2x 0, 3, [[C1:[0-9]+]] 237*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xvmaddadp 34, 35, 38 238*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: li [[C2:[0-9]+]], 32 239*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: stxvd2x 34, 3, [[C2:[0-9]+]] 240*9880d681SAndroid Build Coastguard Worker; CHECK-FISL: blr 241*9880d681SAndroid Build Coastguard Worker} 242*9880d681SAndroid Build Coastguard Worker 243*9880d681SAndroid Build Coastguard Workerdefine void @testv3(<2 x double> %a, <2 x double> %b, <2 x double> %c, <2 x double> %e, <2 x double> %f, <2 x double>* nocapture %d) #0 { 244*9880d681SAndroid Build Coastguard Workerentry: 245*9880d681SAndroid Build Coastguard Worker %0 = tail call <2 x double> @llvm.fma.v2f64(<2 x double> %b, <2 x double> %c, <2 x double> %a) 246*9880d681SAndroid Build Coastguard Worker store <2 x double> %0, <2 x double>* %d, align 8 247*9880d681SAndroid Build Coastguard Worker %1 = tail call <2 x double> @llvm.fma.v2f64(<2 x double> %b, <2 x double> %e, <2 x double> %a) 248*9880d681SAndroid Build Coastguard Worker %2 = tail call <2 x double> @llvm.fma.v2f64(<2 x double> %b, <2 x double> %c, <2 x double> %1) 249*9880d681SAndroid Build Coastguard Worker %arrayidx1 = getelementptr inbounds <2 x double>, <2 x double>* %d, i64 3 250*9880d681SAndroid Build Coastguard Worker store <2 x double> %2, <2 x double>* %arrayidx1, align 8 251*9880d681SAndroid Build Coastguard Worker %3 = tail call <2 x double> @llvm.fma.v2f64(<2 x double> %b, <2 x double> %f, <2 x double> %a) 252*9880d681SAndroid Build Coastguard Worker %arrayidx2 = getelementptr inbounds <2 x double>, <2 x double>* %d, i64 2 253*9880d681SAndroid Build Coastguard Worker store <2 x double> %3, <2 x double>* %arrayidx2, align 8 254*9880d681SAndroid Build Coastguard Worker %arrayidx3 = getelementptr inbounds <2 x double>, <2 x double>* %d, i64 1 255*9880d681SAndroid Build Coastguard Worker store <2 x double> %1, <2 x double>* %arrayidx3, align 8 256*9880d681SAndroid Build Coastguard Worker ret void 257*9880d681SAndroid Build Coastguard Worker 258*9880d681SAndroid Build Coastguard Worker; Note: There is some unavoidable changeability in this variant. If the 259*9880d681SAndroid Build Coastguard Worker; FMAs are reordered differently, the algorithm can pick a different 260*9880d681SAndroid Build Coastguard Worker; multiplicand to destroy, changing the register assignment. There isn't 261*9880d681SAndroid Build Coastguard Worker; a good way to express this possibility, so hopefully this doesn't change 262*9880d681SAndroid Build Coastguard Worker; too often. 263*9880d681SAndroid Build Coastguard Worker 264*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @testv3 265*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: xxlor [[V1:[0-9]+]], 34, 34 266*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: li [[C1:[0-9]+]], 48 267*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: li [[C2:[0-9]+]], 32 268*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: xvmaddmdp 37, 35, 34 269*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: li [[C3:[0-9]+]], 16 270*9880d681SAndroid Build Coastguard Worker 271*9880d681SAndroid Build Coastguard Worker; Note: We could convert this next FMA to M-type as well, but it would require 272*9880d681SAndroid Build Coastguard Worker; re-ordering the instructions. 273*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: xvmaddadp [[V1]], 35, 36 274*9880d681SAndroid Build Coastguard Worker 275*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: xvmaddmdp 36, 35, 37 276*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: xvmaddadp 34, 35, 38 277*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: stxvd2x 32, 0, 3 278*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: stxvd2x 36, 3, [[C1]] 279*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: stxvd2x 34, 3, [[C2]] 280*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: stxvd2x 37, 3, [[C3]] 281*9880d681SAndroid Build Coastguard Worker; CHECK: blr 282*9880d681SAndroid Build Coastguard Worker 283*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-LABEL: @testv3 284*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xxlor [[V1:[0-9]+]], 34, 34 285*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xvmaddadp [[V1]], 35, 36 286*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: stxvd2x [[V1]], 0, 3 287*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xxlor [[V2:[0-9]+]], 34, 34 288*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xvmaddadp [[V2]], 35, 37 289*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xxlor [[V3:[0-9]+]], 0, 0 290*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xvmaddadp [[V3]], 35, 36 291*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: li [[C1:[0-9]+]], 48 292*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: stxvd2x [[V3]], 3, [[C1]] 293*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xvmaddadp 34, 35, 38 294*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: li [[C2:[0-9]+]], 32 295*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: stxvd2x 34, 3, [[C2]] 296*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: li [[C3:[0-9]+]], 16 297*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: stxvd2x 0, 3, [[C3]] 298*9880d681SAndroid Build Coastguard Worker; CHECK-FISL: blr 299*9880d681SAndroid Build Coastguard Worker} 300*9880d681SAndroid Build Coastguard Worker 301*9880d681SAndroid Build Coastguard Workerdefine void @testv4(<2 x double> %a, <2 x double> %b, <2 x double> %c, <2 x double> %e, <2 x double> %f, <2 x double>* nocapture %d) #0 { 302*9880d681SAndroid Build Coastguard Workerentry: 303*9880d681SAndroid Build Coastguard Worker %0 = tail call <2 x double> @llvm.fma.v2f64(<2 x double> %b, <2 x double> %c, <2 x double> %a) 304*9880d681SAndroid Build Coastguard Worker store <2 x double> %0, <2 x double>* %d, align 8 305*9880d681SAndroid Build Coastguard Worker %1 = tail call <2 x double> @llvm.fma.v2f64(<2 x double> %b, <2 x double> %e, <2 x double> %a) 306*9880d681SAndroid Build Coastguard Worker %arrayidx1 = getelementptr inbounds <2 x double>, <2 x double>* %d, i64 1 307*9880d681SAndroid Build Coastguard Worker store <2 x double> %1, <2 x double>* %arrayidx1, align 8 308*9880d681SAndroid Build Coastguard Worker %2 = tail call <2 x double> @llvm.fma.v2f64(<2 x double> %b, <2 x double> %c, <2 x double> %1) 309*9880d681SAndroid Build Coastguard Worker %arrayidx3 = getelementptr inbounds <2 x double>, <2 x double>* %d, i64 3 310*9880d681SAndroid Build Coastguard Worker store <2 x double> %2, <2 x double>* %arrayidx3, align 8 311*9880d681SAndroid Build Coastguard Worker %3 = tail call <2 x double> @llvm.fma.v2f64(<2 x double> %b, <2 x double> %f, <2 x double> %a) 312*9880d681SAndroid Build Coastguard Worker %arrayidx4 = getelementptr inbounds <2 x double>, <2 x double>* %d, i64 2 313*9880d681SAndroid Build Coastguard Worker store <2 x double> %3, <2 x double>* %arrayidx4, align 8 314*9880d681SAndroid Build Coastguard Worker ret void 315*9880d681SAndroid Build Coastguard Worker 316*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @testv4 317*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: xxlor [[V1:[0-9]+]], 34, 34 318*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: xvmaddmdp 37, 35, 34 319*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: li [[C1:[0-9]+]], 16 320*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: li [[C2:[0-9]+]], 32 321*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: xvmaddadp 34, 35, 38 322*9880d681SAndroid Build Coastguard Worker 323*9880d681SAndroid Build Coastguard Worker; Note: We could convert this next FMA to M-type as well, but it would require 324*9880d681SAndroid Build Coastguard Worker; re-ordering the instructions. 325*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: xvmaddadp [[V1]], 35, 36 326*9880d681SAndroid Build Coastguard Worker 327*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: stxvd2x 32, 0, 3 328*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: stxvd2x 37, 3, [[C1]] 329*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: li [[C3:[0-9]+]], 48 330*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: xvmaddadp 37, 35, 36 331*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: stxvd2x 37, 3, [[C3]] 332*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: stxvd2x 34, 3, [[C2]] 333*9880d681SAndroid Build Coastguard Worker; CHECK: blr 334*9880d681SAndroid Build Coastguard Worker 335*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-LABEL: @testv4 336*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xxlor [[V1:[0-9]+]], 34, 34 337*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xvmaddadp [[V1]], 35, 36 338*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: stxvd2x 0, 0, 3 339*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xxlor [[V2:[0-9]+]], 34, 34 340*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xvmaddadp [[V2]], 35, 37 341*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: li [[C1:[0-9]+]], 16 342*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: stxvd2x 0, 3, [[C1]] 343*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xvmaddadp 0, 35, 37 344*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: li [[C3:[0-9]+]], 48 345*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: stxvd2x 0, 3, [[C3]] 346*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xvmaddadp 0, 35, 36 347*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: li [[C2:[0-9]+]], 32 348*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: stxvd2x 34, 3, [[C2]] 349*9880d681SAndroid Build Coastguard Worker; CHECK-FISL: blr 350*9880d681SAndroid Build Coastguard Worker} 351*9880d681SAndroid Build Coastguard Worker 352*9880d681SAndroid Build Coastguard Workerdeclare <2 x double> @llvm.fma.v2f64(<2 x double>, <2 x double>, <2 x double>) #0 353*9880d681SAndroid Build Coastguard Worker 354*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind readnone } 355*9880d681SAndroid Build Coastguard Worker 356