From 40b0f5d6ce16b819b06f1363a55dda24df346503 Mon Sep 17 00:00:00 2001 From: Bill Schmidt Date: Fri, 14 Nov 2014 12:10:40 +0000 Subject: [PATCH] [PowerPC] Add VSX builtins for vec_div This patch adds builtin support for xvdivdp and xvdivsp, along with a test case. Straightforward stuff. There's a companion patch for Clang. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@221983 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/IR/IntrinsicsPowerPC.td | 7 +++++-- lib/Target/PowerPC/PPCInstrVSX.td | 6 ++++++ test/CodeGen/PowerPC/vsx-div.ll | 29 ++++++++++++++++++++++++++++ 3 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 test/CodeGen/PowerPC/vsx-div.ll diff --git a/include/llvm/IR/IntrinsicsPowerPC.td b/include/llvm/IR/IntrinsicsPowerPC.td index 43ee7d27da7..5cdabdeadae 100644 --- a/include/llvm/IR/IntrinsicsPowerPC.td +++ b/include/llvm/IR/IntrinsicsPowerPC.td @@ -528,14 +528,17 @@ def int_ppc_vsx_stxvw4x : def int_ppc_vsx_stxvd2x : Intrinsic<[], [llvm_v2f64_ty, llvm_ptr_ty], [IntrReadWriteArgMem]>; -// Vector maximum. +// Vector and scalar maximum. def int_ppc_vsx_xvmaxdp : PowerPC_VSX_Vec_DDD_Intrinsic<"xvmaxdp">; def int_ppc_vsx_xvmaxsp : PowerPC_VSX_Vec_FFF_Intrinsic<"xvmaxsp">; def int_ppc_vsx_xsmaxdp : PowerPC_VSX_Sca_DDD_Intrinsic<"xsmaxdp">; -// Vector minimum. +// Vector and scalar minimum. def int_ppc_vsx_xvmindp : PowerPC_VSX_Vec_DDD_Intrinsic<"xvmindp">; def int_ppc_vsx_xvminsp : PowerPC_VSX_Vec_FFF_Intrinsic<"xvminsp">; def int_ppc_vsx_xsmindp : PowerPC_VSX_Sca_DDD_Intrinsic<"xsmindp">; +// Vector divide. +def int_ppc_vsx_xvdivdp : PowerPC_VSX_Vec_DDD_Intrinsic<"xvdivdp">; +def int_ppc_vsx_xvdivsp : PowerPC_VSX_Vec_FFF_Intrinsic<"xvdivsp">; } diff --git a/lib/Target/PowerPC/PPCInstrVSX.td b/lib/Target/PowerPC/PPCInstrVSX.td index 522e0de7386..2c8f9981ec2 100644 --- a/lib/Target/PowerPC/PPCInstrVSX.td +++ b/lib/Target/PowerPC/PPCInstrVSX.td @@ -887,6 +887,12 @@ def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETGT)), def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETNE)), (SELECT_VSFRC (CRXOR $lhs, $rhs), $tval, $fval)>; +// Divides. +def : Pat<(int_ppc_vsx_xvdivsp v4f32:$A, v4f32:$B), + (XVDIVSP $A, $B)>; +def : Pat<(int_ppc_vsx_xvdivdp v2f64:$A, v2f64:$B), + (XVDIVDP $A, $B)>; + } // AddedComplexity } // HasVSX diff --git a/test/CodeGen/PowerPC/vsx-div.ll b/test/CodeGen/PowerPC/vsx-div.ll new file mode 100644 index 00000000000..8a9578e5ed8 --- /dev/null +++ b/test/CodeGen/PowerPC/vsx-div.ll @@ -0,0 +1,29 @@ +; RUN: llc -mcpu=pwr7 -mattr=+vsx -O1 -mtriple=powerpc64-unknown-linux-gnu < %s | FileCheck %s + +@vf = global <4 x float> , align 16 +@vd = global <2 x double> , align 16 +@vf_res = common global <4 x float> zeroinitializer, align 16 +@vd_res = common global <2 x double> zeroinitializer, align 16 + +define void @test1() { +entry: + %0 = load <4 x float>* @vf, align 16 + %1 = tail call <4 x float> @llvm.ppc.vsx.xvdivsp(<4 x float> %0, <4 x float> %0) + store <4 x float> %1, <4 x float>* @vf_res, align 16 + ret void +} +; CHECK-LABEL: @test1 +; CHECK: xvdivsp + +define void @test2() { +entry: + %0 = load <2 x double>* @vd, align 16 + %1 = tail call <2 x double> @llvm.ppc.vsx.xvdivdp(<2 x double> %0, <2 x double> %0) + store <2 x double> %1, <2 x double>* @vd_res, align 16 + ret void +} +; CHECK-LABEL: @test2 +; CHECK: xvdivdp + +declare <2 x double> @llvm.ppc.vsx.xvdivdp(<2 x double>, <2 x double>) +declare <4 x float> @llvm.ppc.vsx.xvdivsp(<4 x float>, <4 x float>) -- 2.34.1