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