From 41723f358e48ab18edc86636d46ac1c91dcc9a98 Mon Sep 17 00:00:00 2001 From: Sean Fertile Date: Mon, 14 Nov 2016 18:43:59 +0000 Subject: [PATCH] [PPC] Add intrinsic mapping to the xscvhpsp instruction add an intrinsic to expose the 'VSX Scalar Convert Half-Precision to Single-Precision' instruction. Differential review: https://reviews.llvm.org/D26536 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@286862 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/IR/IntrinsicsPowerPC.td | 3 +++ lib/Target/PowerPC/PPCInstrVSX.td | 9 +++++++++ test/CodeGen/PowerPC/vsx-p9.ll | 11 +++++++++++ 3 files changed, 23 insertions(+) diff --git a/include/llvm/IR/IntrinsicsPowerPC.td b/include/llvm/IR/IntrinsicsPowerPC.td index dc8a5f6b8ba..ae4d9b4840d 100644 --- a/include/llvm/IR/IntrinsicsPowerPC.td +++ b/include/llvm/IR/IntrinsicsPowerPC.td @@ -867,6 +867,9 @@ def int_ppc_vsx_xvtstdcdp : def int_ppc_vsx_xvtstdcsp : PowerPC_VSX_Intrinsic<"xvtstdcsp", [llvm_v4i32_ty], [llvm_v4f32_ty,llvm_i32_ty], [IntrNoMem]>; +def int_ppc_vsx_xvcvhpsp : + PowerPC_VSX_Intrinsic<"xvcvhpsp", [llvm_v4f32_ty], + [llvm_v8i16_ty],[IntrNoMem]>; } //===----------------------------------------------------------------------===// diff --git a/lib/Target/PowerPC/PPCInstrVSX.td b/lib/Target/PowerPC/PPCInstrVSX.td index cdf6a24b725..98ac3b77469 100644 --- a/lib/Target/PowerPC/PPCInstrVSX.td +++ b/lib/Target/PowerPC/PPCInstrVSX.td @@ -2132,6 +2132,7 @@ let AddedComplexity = 400, Predicates = [HasP9Vector] in { def XSCVSDQP : X_VT5_XO5_VB5_TyVB<63, 10, 836, "xscvsdqp", vfrc, []>; def XSCVUDQP : X_VT5_XO5_VB5_TyVB<63, 2, 836, "xscvudqp", vfrc, []>; + let UseVSXReg = 1 in { //===--------------------------------------------------------------------===// // Round to Floating-Point Integer Instructions @@ -2148,6 +2149,14 @@ let AddedComplexity = 400, Predicates = [HasP9Vector] in { [(set v4f32:$XT, (int_ppc_vsx_xvcvsphp v4f32:$XB))]>; + } // UseVSXReg = 1 + + // Pattern for matching Vector HP -> Vector SP intrinsic. Defined as a + // seperate pattern so that it can convert the input register class from + // VRRC(v8i16) to VSRC. + def : Pat<(v4f32 (int_ppc_vsx_xvcvhpsp v8i16:$A)), + (v4f32 (XVCVHPSP (COPY_TO_REGCLASS $A, VSRC)))>; + class Z23_VT5_R1_VB5_RMC2_EX1 opcode, bits<8> xo, bit ex, string opc, list pattern> : Z23Form_1 @llvm.ppc.vsx.xvtstdcdp(<2 x double> %a, i32 %b) +define <4 x float> @testXVCVHPSP(<8 x i16> %a) { +entry: + %0 = tail call <4 x float>@llvm.ppc.vsx.xvcvhpsp(<8 x i16> %a) + ret <4 x float> %0 +; CHECK-LABEL: testXVCVHPSP +; CHECK: xvcvhpsp 34, 34 +; CHECK: blr +} +; Function Attrs: nounwind readnone +declare <4 x float>@llvm.ppc.vsx.xvcvhpsp(<8 x i16>) + declare void @sink(...) -- 2.50.1