| ; RUN: llc -mtriple=powerpc64-unknown-linux-gnu -verify-machineinstrs -mcpu=pwr7 < %s | FileCheck %s | |
| declare float @fabsf(float) | |
| declare float @llvm.minnum.f32(float, float) | |
| declare double @llvm.minnum.f64(double, double) | |
| declare float @llvm.maxnum.f32(float, float) | |
| declare double @llvm.maxnum.f64(double, double) | |
| declare <4 x float> @llvm.minnum.v4f32(<4 x float>, <4 x float>) | |
| declare <4 x double> @llvm.minnum.v4f64(<4 x double>, <4 x double>) | |
| declare <4 x float> @llvm.maxnum.v4f32(<4 x float>, <4 x float>) | |
| declare <4 x double> @llvm.maxnum.v4f64(<4 x double>, <4 x double>) | |
| define void @test1(float %f, ptr %fp) { | |
| entry: | |
| br label %loop_body | |
| loop_body: | |
| %invar_address.dim.0.01 = phi i64 [ 0, %entry ], [ %1, %loop_body ] | |
| %0 = call float @llvm.minnum.f32(float %f, float 1.0) | |
| store float %0, ptr %fp, align 4 | |
| %1 = add i64 %invar_address.dim.0.01, 1 | |
| %2 = icmp eq i64 %1, 2 | |
| br i1 %2, label %loop_exit, label %loop_body | |
| loop_exit: | |
| ret void | |
| } | |
| ; CHECK-LABEL: test1: | |
| ; CHECK-NOT: mtctr | |
| ; CHECK: xsmindp | |
| ; CHECK-NOT: xsmindp | |
| ; CHECK-NOT: mtctr | |
| ; CHECK: blr | |
| define void @test1v(<4 x float> %f, ptr %fp) { | |
| entry: | |
| br label %loop_body | |
| loop_body: | |
| %invar_address.dim.0.01 = phi i64 [ 0, %entry ], [ %1, %loop_body ] | |
| %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>) | |
| store <4 x float> %0, ptr %fp, align 16 | |
| %1 = add i64 %invar_address.dim.0.01, 1 | |
| %2 = icmp eq i64 %1, 4 | |
| br i1 %2, label %loop_exit, label %loop_body | |
| loop_exit: | |
| ret void | |
| } | |
| ; CHECK-LABEL: test1v: | |
| ; CHECK: xvminsp | |
| ; CHECK-NOT: xsmindp | |
| ; CHECK: mtctr | |
| ; CHECK-NOT: xsmindp | |
| ; CHECK: blr | |
| define void @test2(float %f, ptr %fp) { | |
| entry: | |
| br label %loop_body | |
| loop_body: | |
| %invar_address.dim.0.01 = phi i64 [ 0, %entry ], [ %1, %loop_body ] | |
| %0 = call float @llvm.maxnum.f32(float %f, float 1.0) | |
| store float %0, ptr %fp, align 4 | |
| %1 = add i64 %invar_address.dim.0.01, 1 | |
| %2 = icmp eq i64 %1, 2 | |
| br i1 %2, label %loop_exit, label %loop_body | |
| loop_exit: | |
| ret void | |
| } | |
| ; CHECK-LABEL: test2: | |
| ; CHECK-NOT: mtctr | |
| ; CHECK: xsmaxdp | |
| ; CHECK-NOT: xsmaxdp | |
| ; CHECK-NOT: mtctr | |
| ; CHECK: blr | |
| define void @test2v(<4 x double> %f, ptr %fp) { | |
| entry: | |
| br label %loop_body | |
| loop_body: | |
| %invar_address.dim.0.01 = phi i64 [ 0, %entry ], [ %1, %loop_body ] | |
| %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>) | |
| store <4 x double> %0, ptr %fp, align 16 | |
| %1 = add i64 %invar_address.dim.0.01, 1 | |
| %2 = icmp eq i64 %1, 4 | |
| br i1 %2, label %loop_exit, label %loop_body | |
| loop_exit: | |
| ret void | |
| } | |
| ; CHECK-LABEL: test2v: | |
| ; CHECK: xvmaxdp | |
| ; CHECK: xvmaxdp | |
| ; CHECK-NOT: xsmaxdp | |
| ; CHECK: mtctr | |
| ; CHECK-NOT: xsmaxdp | |
| ; CHECK: blr | |
| define void @test3(double %f, ptr %fp) { | |
| entry: | |
| br label %loop_body | |
| loop_body: | |
| %invar_address.dim.0.01 = phi i64 [ 0, %entry ], [ %1, %loop_body ] | |
| %0 = call double @llvm.minnum.f64(double %f, double 1.0) | |
| store double %0, ptr %fp, align 8 | |
| %1 = add i64 %invar_address.dim.0.01, 1 | |
| %2 = icmp eq i64 %1, 2 | |
| br i1 %2, label %loop_exit, label %loop_body | |
| loop_exit: | |
| ret void | |
| } | |
| ; CHECK-LABEL: test3: | |
| ; CHECK-NOT: mtctr | |
| ; CHECK: xsmindp | |
| ; CHECK-NOT: xsmindp | |
| ; CHECK-NOT: mtctr | |
| ; CHECK: blr | |
| define void @test4(double %f, ptr %fp) { | |
| entry: | |
| br label %loop_body | |
| loop_body: | |
| %invar_address.dim.0.01 = phi i64 [ 0, %entry ], [ %1, %loop_body ] | |
| %0 = call double @llvm.maxnum.f64(double %f, double 1.0) | |
| store double %0, ptr %fp, align 8 | |
| %1 = add i64 %invar_address.dim.0.01, 1 | |
| %2 = icmp eq i64 %1, 2 | |
| br i1 %2, label %loop_exit, label %loop_body | |
| loop_exit: | |
| ret void | |
| } | |
| ; CHECK-LABEL: test4: | |
| ; CHECK-NOT: mtctr | |
| ; CHECK: xsmaxdp | |
| ; CHECK-NOT: xsmaxdp | |
| ; CHECK-NOT: mtctr | |
| ; CHECK: blr |