diff options
author | Simon Pilgrim <llvm-dev@redking.me.uk> | 2016-05-24 08:17:50 +0000 |
---|---|---|
committer | Simon Pilgrim <llvm-dev@redking.me.uk> | 2016-05-24 08:17:50 +0000 |
commit | 14000b3cea6b3a44a19b9c80c550d7a2c24b3d31 (patch) | |
tree | 7f66f2a1a54f88292157b52145da843112a5f28a /llvm/lib | |
parent | 9afe57541e4194e947876617ecc993d309214b99 (diff) | |
download | bcm5719-llvm-14000b3cea6b3a44a19b9c80c550d7a2c24b3d31.tar.gz bcm5719-llvm-14000b3cea6b3a44a19b9c80c550d7a2c24b3d31.zip |
[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
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Target/X86/X86TargetTransformInfo.cpp | 45 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86TargetTransformInfo.h | 5 |
2 files changed, 49 insertions, 1 deletions
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<Type *> 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<int, MVT> 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<Value *> 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<GetElementPtrInst>(Ptr); if (IndexSize < 64 || !GEP) return IndexSize; - + unsigned NumOfVarIndices = 0; Value *Ptrs = GEP->getPointerOperand(); if (Ptrs->getType()->isVectorTy() && !getSplatValue(Ptrs)) diff --git a/llvm/lib/Target/X86/X86TargetTransformInfo.h b/llvm/lib/Target/X86/X86TargetTransformInfo.h index adb745e912d..ab8046bb9fd 100644 --- a/llvm/lib/Target/X86/X86TargetTransformInfo.h +++ b/llvm/lib/Target/X86/X86TargetTransformInfo.h @@ -80,6 +80,11 @@ public: bool VariableMask, unsigned Alignment); int getAddressComputationCost(Type *PtrTy, bool IsComplex); + int getIntrinsicInstrCost(Intrinsic::ID IID, Type *RetTy, + ArrayRef<Type *> Tys, FastMathFlags FMF); + int getIntrinsicInstrCost(Intrinsic::ID IID, Type *RetTy, + ArrayRef<Value *> Args, FastMathFlags FMF); + int getReductionCost(unsigned Opcode, Type *Ty, bool IsPairwiseForm); int getIntImmCost(int64_t); |