From 14000b3cea6b3a44a19b9c80c550d7a2c24b3d31 Mon Sep 17 00:00:00 2001 From: Simon Pilgrim Date: Tue, 24 May 2016 08:17:50 +0000 Subject: [CostModel][X86][XOP] Added XOP costmodel for BITREVERSE Now that we have a nice fast VPPERM solution. Added framework for future intrinsic costs as well. llvm-svn: 270537 --- llvm/lib/Target/X86/X86TargetTransformInfo.cpp | 45 +++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) (limited to 'llvm/lib/Target/X86/X86TargetTransformInfo.cpp') diff --git a/llvm/lib/Target/X86/X86TargetTransformInfo.cpp b/llvm/lib/Target/X86/X86TargetTransformInfo.cpp index 28ae96d4108..508fbe03aeb 100644 --- a/llvm/lib/Target/X86/X86TargetTransformInfo.cpp +++ b/llvm/lib/Target/X86/X86TargetTransformInfo.cpp @@ -917,6 +917,49 @@ int X86TTIImpl::getCmpSelInstrCost(unsigned Opcode, Type *ValTy, Type *CondTy) { return BaseT::getCmpSelInstrCost(Opcode, ValTy, CondTy); } +int X86TTIImpl::getIntrinsicInstrCost(Intrinsic::ID IID, Type *RetTy, + ArrayRef Tys, FastMathFlags FMF) { + static const CostTblEntry XOPCostTbl[] = { + { ISD::BITREVERSE, MVT::v4i64, 4 }, + { ISD::BITREVERSE, MVT::v8i32, 4 }, + { ISD::BITREVERSE, MVT::v16i16, 4 }, + { ISD::BITREVERSE, MVT::v32i8, 4 }, + { ISD::BITREVERSE, MVT::v2i64, 1 }, + { ISD::BITREVERSE, MVT::v4i32, 1 }, + { ISD::BITREVERSE, MVT::v8i16, 1 }, + { ISD::BITREVERSE, MVT::v16i8, 1 }, + { ISD::BITREVERSE, MVT::i64, 3 }, + { ISD::BITREVERSE, MVT::i32, 3 }, + { ISD::BITREVERSE, MVT::i16, 3 }, + { ISD::BITREVERSE, MVT::i8, 3 } + }; + + unsigned ISD = ISD::DELETED_NODE; + switch (IID) { + default: + break; + case Intrinsic::bitreverse: + ISD = ISD::BITREVERSE; + break; + } + + // Legalize the type. + std::pair LT = TLI->getTypeLegalizationCost(DL, RetTy); + MVT MTy = LT.second; + + // Attempt to lookup cost. + if (ST->hasXOP()) + if (const auto *Entry = CostTableLookup(XOPCostTbl, ISD, MTy)) + return LT.first * Entry->Cost; + + return BaseT::getIntrinsicInstrCost(IID, RetTy, Tys, FMF); +} + +int X86TTIImpl::getIntrinsicInstrCost(Intrinsic::ID IID, Type *RetTy, + ArrayRef Args, FastMathFlags FMF) { + return BaseT::getIntrinsicInstrCost(IID, RetTy, Args, FMF); +} + int X86TTIImpl::getVectorInstrCost(unsigned Opcode, Type *Val, unsigned Index) { assert(Val->isVectorTy() && "This must be a vector type"); @@ -1320,7 +1363,7 @@ int X86TTIImpl::getGSVectorCost(unsigned Opcode, Type *SrcVTy, Value *Ptr, GetElementPtrInst *GEP = dyn_cast(Ptr); if (IndexSize < 64 || !GEP) return IndexSize; - + unsigned NumOfVarIndices = 0; Value *Ptrs = GEP->getPointerOperand(); if (Ptrs->getType()->isVectorTy() && !getSplatValue(Ptrs)) -- cgit v1.2.3