1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mcpu=pwr7 < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; RUN: llc -mcpu=a2q < %s | FileCheck %s --check-prefix=QPX 3*9880d681SAndroid Build Coastguard Workertarget triple = "powerpc64-unknown-linux-gnu" 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Workerdeclare float @fabsf(float) 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Workerdeclare float @fminf(float, float) 8*9880d681SAndroid Build Coastguard Workerdeclare double @fmin(double, double) 9*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.minnum.f32(float, float) 10*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.minnum.f64(double, double) 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Workerdeclare float @fmaxf(float, float) 13*9880d681SAndroid Build Coastguard Workerdeclare double @fmax(double, double) 14*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.maxnum.f32(float, float) 15*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.maxnum.f64(double, double) 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Workerdeclare <4 x float> @llvm.minnum.v4f32(<4 x float>, <4 x float>) 18*9880d681SAndroid Build Coastguard Workerdeclare <4 x double> @llvm.minnum.v4f64(<4 x double>, <4 x double>) 19*9880d681SAndroid Build Coastguard Workerdeclare <4 x float> @llvm.maxnum.v4f32(<4 x float>, <4 x float>) 20*9880d681SAndroid Build Coastguard Workerdeclare <4 x double> @llvm.maxnum.v4f64(<4 x double>, <4 x double>) 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Workerdefine void @test1(float %f, float* %fp) { 23*9880d681SAndroid Build Coastguard Workerentry: 24*9880d681SAndroid Build Coastguard Worker br label %loop_body 25*9880d681SAndroid Build Coastguard Worker 26*9880d681SAndroid Build Coastguard Workerloop_body: 27*9880d681SAndroid Build Coastguard Worker %invar_address.dim.0.01 = phi i64 [ 0, %entry ], [ %1, %loop_body ] 28*9880d681SAndroid Build Coastguard Worker %0 = call float @llvm.minnum.f32(float %f, float 1.0) 29*9880d681SAndroid Build Coastguard Worker store float %0, float* %fp, align 4 30*9880d681SAndroid Build Coastguard Worker %1 = add i64 %invar_address.dim.0.01, 1 31*9880d681SAndroid Build Coastguard Worker %2 = icmp eq i64 %1, 2 32*9880d681SAndroid Build Coastguard Worker br i1 %2, label %loop_exit, label %loop_body 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Workerloop_exit: 35*9880d681SAndroid Build Coastguard Worker ret void 36*9880d681SAndroid Build Coastguard Worker} 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test1: 39*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: mtctr 40*9880d681SAndroid Build Coastguard Worker; CHECK: bl fminf 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Workerdefine void @test1v(<4 x float> %f, <4 x float>* %fp) { 43*9880d681SAndroid Build Coastguard Workerentry: 44*9880d681SAndroid Build Coastguard Worker br label %loop_body 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Workerloop_body: 47*9880d681SAndroid Build Coastguard Worker %invar_address.dim.0.01 = phi i64 [ 0, %entry ], [ %1, %loop_body ] 48*9880d681SAndroid Build Coastguard Worker %0 = call <4 x float> @llvm.minnum.v4f32(<4 x float> %f, <4 x float> <float 1.0, float 1.0, float 1.0, float 1.0>) 49*9880d681SAndroid Build Coastguard Worker store <4 x float> %0, <4 x float>* %fp, align 16 50*9880d681SAndroid Build Coastguard Worker %1 = add i64 %invar_address.dim.0.01, 1 51*9880d681SAndroid Build Coastguard Worker %2 = icmp eq i64 %1, 2 52*9880d681SAndroid Build Coastguard Worker br i1 %2, label %loop_exit, label %loop_body 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Workerloop_exit: 55*9880d681SAndroid Build Coastguard Worker ret void 56*9880d681SAndroid Build Coastguard Worker} 57*9880d681SAndroid Build Coastguard Worker 58*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test1v: 59*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: mtctr 60*9880d681SAndroid Build Coastguard Worker; CHECK: bl fminf 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Worker; QPX-LABEL: test1v: 63*9880d681SAndroid Build Coastguard Worker; QPX: mtctr 64*9880d681SAndroid Build Coastguard Worker; QPX-NOT: bl fminf 65*9880d681SAndroid Build Coastguard Worker; QPX: blr 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Workerdefine void @test1a(float %f, float* %fp) { 68*9880d681SAndroid Build Coastguard Workerentry: 69*9880d681SAndroid Build Coastguard Worker br label %loop_body 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Workerloop_body: 72*9880d681SAndroid Build Coastguard Worker %invar_address.dim.0.01 = phi i64 [ 0, %entry ], [ %1, %loop_body ] 73*9880d681SAndroid Build Coastguard Worker %0 = call float @fminf(float %f, float 1.0) readnone 74*9880d681SAndroid Build Coastguard Worker store float %0, float* %fp, align 4 75*9880d681SAndroid Build Coastguard Worker %1 = add i64 %invar_address.dim.0.01, 1 76*9880d681SAndroid Build Coastguard Worker %2 = icmp eq i64 %1, 2 77*9880d681SAndroid Build Coastguard Worker br i1 %2, label %loop_exit, label %loop_body 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Workerloop_exit: 80*9880d681SAndroid Build Coastguard Worker ret void 81*9880d681SAndroid Build Coastguard Worker} 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test1a: 84*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: mtctr 85*9880d681SAndroid Build Coastguard Worker; CHECK: bl fminf 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Workerdefine void @test2(float %f, float* %fp) { 88*9880d681SAndroid Build Coastguard Workerentry: 89*9880d681SAndroid Build Coastguard Worker br label %loop_body 90*9880d681SAndroid Build Coastguard Worker 91*9880d681SAndroid Build Coastguard Workerloop_body: 92*9880d681SAndroid Build Coastguard Worker %invar_address.dim.0.01 = phi i64 [ 0, %entry ], [ %1, %loop_body ] 93*9880d681SAndroid Build Coastguard Worker %0 = call float @llvm.maxnum.f32(float %f, float 1.0) 94*9880d681SAndroid Build Coastguard Worker store float %0, float* %fp, align 4 95*9880d681SAndroid Build Coastguard Worker %1 = add i64 %invar_address.dim.0.01, 1 96*9880d681SAndroid Build Coastguard Worker %2 = icmp eq i64 %1, 2 97*9880d681SAndroid Build Coastguard Worker br i1 %2, label %loop_exit, label %loop_body 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Workerloop_exit: 100*9880d681SAndroid Build Coastguard Worker ret void 101*9880d681SAndroid Build Coastguard Worker} 102*9880d681SAndroid Build Coastguard Worker 103*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2: 104*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: mtctr 105*9880d681SAndroid Build Coastguard Worker; CHECK: bl fmaxf 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Workerdefine void @test2v(<4 x double> %f, <4 x double>* %fp) { 108*9880d681SAndroid Build Coastguard Workerentry: 109*9880d681SAndroid Build Coastguard Worker br label %loop_body 110*9880d681SAndroid Build Coastguard Worker 111*9880d681SAndroid Build Coastguard Workerloop_body: 112*9880d681SAndroid Build Coastguard Worker %invar_address.dim.0.01 = phi i64 [ 0, %entry ], [ %1, %loop_body ] 113*9880d681SAndroid Build Coastguard Worker %0 = call <4 x double> @llvm.maxnum.v4f64(<4 x double> %f, <4 x double> <double 1.0, double 1.0, double 1.0, double 1.0>) 114*9880d681SAndroid Build Coastguard Worker store <4 x double> %0, <4 x double>* %fp, align 16 115*9880d681SAndroid Build Coastguard Worker %1 = add i64 %invar_address.dim.0.01, 1 116*9880d681SAndroid Build Coastguard Worker %2 = icmp eq i64 %1, 2 117*9880d681SAndroid Build Coastguard Worker br i1 %2, label %loop_exit, label %loop_body 118*9880d681SAndroid Build Coastguard Worker 119*9880d681SAndroid Build Coastguard Workerloop_exit: 120*9880d681SAndroid Build Coastguard Worker ret void 121*9880d681SAndroid Build Coastguard Worker} 122*9880d681SAndroid Build Coastguard Worker 123*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2v: 124*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: mtctr 125*9880d681SAndroid Build Coastguard Worker; CHECK: bl fmax 126*9880d681SAndroid Build Coastguard Worker 127*9880d681SAndroid Build Coastguard Worker; QPX-LABEL: test2v: 128*9880d681SAndroid Build Coastguard Worker; QPX: mtctr 129*9880d681SAndroid Build Coastguard Worker; QPX-NOT: bl fmax 130*9880d681SAndroid Build Coastguard Worker; QPX: blr 131*9880d681SAndroid Build Coastguard Worker 132*9880d681SAndroid Build Coastguard Workerdefine void @test2a(float %f, float* %fp) { 133*9880d681SAndroid Build Coastguard Workerentry: 134*9880d681SAndroid Build Coastguard Worker br label %loop_body 135*9880d681SAndroid Build Coastguard Worker 136*9880d681SAndroid Build Coastguard Workerloop_body: 137*9880d681SAndroid Build Coastguard Worker %invar_address.dim.0.01 = phi i64 [ 0, %entry ], [ %1, %loop_body ] 138*9880d681SAndroid Build Coastguard Worker %0 = call float @fmaxf(float %f, float 1.0) readnone 139*9880d681SAndroid Build Coastguard Worker store float %0, float* %fp, align 4 140*9880d681SAndroid Build Coastguard Worker %1 = add i64 %invar_address.dim.0.01, 1 141*9880d681SAndroid Build Coastguard Worker %2 = icmp eq i64 %1, 2 142*9880d681SAndroid Build Coastguard Worker br i1 %2, label %loop_exit, label %loop_body 143*9880d681SAndroid Build Coastguard Worker 144*9880d681SAndroid Build Coastguard Workerloop_exit: 145*9880d681SAndroid Build Coastguard Worker ret void 146*9880d681SAndroid Build Coastguard Worker} 147*9880d681SAndroid Build Coastguard Worker 148*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2a: 149*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: mtctr 150*9880d681SAndroid Build Coastguard Worker; CHECK: bl fmaxf 151*9880d681SAndroid Build Coastguard Worker 152*9880d681SAndroid Build Coastguard Workerdefine void @test3(double %f, double* %fp) { 153*9880d681SAndroid Build Coastguard Workerentry: 154*9880d681SAndroid Build Coastguard Worker br label %loop_body 155*9880d681SAndroid Build Coastguard Worker 156*9880d681SAndroid Build Coastguard Workerloop_body: 157*9880d681SAndroid Build Coastguard Worker %invar_address.dim.0.01 = phi i64 [ 0, %entry ], [ %1, %loop_body ] 158*9880d681SAndroid Build Coastguard Worker %0 = call double @llvm.minnum.f64(double %f, double 1.0) 159*9880d681SAndroid Build Coastguard Worker store double %0, double* %fp, align 8 160*9880d681SAndroid Build Coastguard Worker %1 = add i64 %invar_address.dim.0.01, 1 161*9880d681SAndroid Build Coastguard Worker %2 = icmp eq i64 %1, 2 162*9880d681SAndroid Build Coastguard Worker br i1 %2, label %loop_exit, label %loop_body 163*9880d681SAndroid Build Coastguard Worker 164*9880d681SAndroid Build Coastguard Workerloop_exit: 165*9880d681SAndroid Build Coastguard Worker ret void 166*9880d681SAndroid Build Coastguard Worker} 167*9880d681SAndroid Build Coastguard Worker 168*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test3: 169*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: mtctr 170*9880d681SAndroid Build Coastguard Worker; CHECK: bl fmin 171*9880d681SAndroid Build Coastguard Worker 172*9880d681SAndroid Build Coastguard Workerdefine void @test3a(double %f, double* %fp) { 173*9880d681SAndroid Build Coastguard Workerentry: 174*9880d681SAndroid Build Coastguard Worker br label %loop_body 175*9880d681SAndroid Build Coastguard Worker 176*9880d681SAndroid Build Coastguard Workerloop_body: 177*9880d681SAndroid Build Coastguard Worker %invar_address.dim.0.01 = phi i64 [ 0, %entry ], [ %1, %loop_body ] 178*9880d681SAndroid Build Coastguard Worker %0 = call double @fmin(double %f, double 1.0) readnone 179*9880d681SAndroid Build Coastguard Worker store double %0, double* %fp, align 8 180*9880d681SAndroid Build Coastguard Worker %1 = add i64 %invar_address.dim.0.01, 1 181*9880d681SAndroid Build Coastguard Worker %2 = icmp eq i64 %1, 2 182*9880d681SAndroid Build Coastguard Worker br i1 %2, label %loop_exit, label %loop_body 183*9880d681SAndroid Build Coastguard Worker 184*9880d681SAndroid Build Coastguard Workerloop_exit: 185*9880d681SAndroid Build Coastguard Worker ret void 186*9880d681SAndroid Build Coastguard Worker} 187*9880d681SAndroid Build Coastguard Worker 188*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test3a: 189*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: mtctr 190*9880d681SAndroid Build Coastguard Worker; CHECK: bl fmin 191*9880d681SAndroid Build Coastguard Worker 192*9880d681SAndroid Build Coastguard Workerdefine void @test4(double %f, double* %fp) { 193*9880d681SAndroid Build Coastguard Workerentry: 194*9880d681SAndroid Build Coastguard Worker br label %loop_body 195*9880d681SAndroid Build Coastguard Worker 196*9880d681SAndroid Build Coastguard Workerloop_body: 197*9880d681SAndroid Build Coastguard Worker %invar_address.dim.0.01 = phi i64 [ 0, %entry ], [ %1, %loop_body ] 198*9880d681SAndroid Build Coastguard Worker %0 = call double @llvm.maxnum.f64(double %f, double 1.0) 199*9880d681SAndroid Build Coastguard Worker store double %0, double* %fp, align 8 200*9880d681SAndroid Build Coastguard Worker %1 = add i64 %invar_address.dim.0.01, 1 201*9880d681SAndroid Build Coastguard Worker %2 = icmp eq i64 %1, 2 202*9880d681SAndroid Build Coastguard Worker br i1 %2, label %loop_exit, label %loop_body 203*9880d681SAndroid Build Coastguard Worker 204*9880d681SAndroid Build Coastguard Workerloop_exit: 205*9880d681SAndroid Build Coastguard Worker ret void 206*9880d681SAndroid Build Coastguard Worker} 207*9880d681SAndroid Build Coastguard Worker 208*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test4: 209*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: mtctr 210*9880d681SAndroid Build Coastguard Worker; CHECK: bl fmax 211*9880d681SAndroid Build Coastguard Worker 212*9880d681SAndroid Build Coastguard Workerdefine void @test4a(double %f, double* %fp) { 213*9880d681SAndroid Build Coastguard Workerentry: 214*9880d681SAndroid Build Coastguard Worker br label %loop_body 215*9880d681SAndroid Build Coastguard Worker 216*9880d681SAndroid Build Coastguard Workerloop_body: 217*9880d681SAndroid Build Coastguard Worker %invar_address.dim.0.01 = phi i64 [ 0, %entry ], [ %1, %loop_body ] 218*9880d681SAndroid Build Coastguard Worker %0 = call double @fmax(double %f, double 1.0) readnone 219*9880d681SAndroid Build Coastguard Worker store double %0, double* %fp, align 8 220*9880d681SAndroid Build Coastguard Worker %1 = add i64 %invar_address.dim.0.01, 1 221*9880d681SAndroid Build Coastguard Worker %2 = icmp eq i64 %1, 2 222*9880d681SAndroid Build Coastguard Worker br i1 %2, label %loop_exit, label %loop_body 223*9880d681SAndroid Build Coastguard Worker 224*9880d681SAndroid Build Coastguard Workerloop_exit: 225*9880d681SAndroid Build Coastguard Worker ret void 226*9880d681SAndroid Build Coastguard Worker} 227*9880d681SAndroid Build Coastguard Worker 228*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test4a: 229*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: mtctr 230*9880d681SAndroid Build Coastguard Worker; CHECK: bl fmax 231*9880d681SAndroid Build Coastguard Worker 232