1*9880d681SAndroid Build Coastguard Worker //===-- HexagonTargetTransformInfo.cpp - Hexagon specific TTI pass --------===// 2*9880d681SAndroid Build Coastguard Worker // 3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker // 5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker // 8*9880d681SAndroid Build Coastguard Worker /// \file 9*9880d681SAndroid Build Coastguard Worker /// This file implements a TargetTransformInfo analysis pass specific to the 10*9880d681SAndroid Build Coastguard Worker /// Hexagon target machine. It uses the target's detailed information to provide 11*9880d681SAndroid Build Coastguard Worker /// more precise answers to certain TTI queries, while letting the target 12*9880d681SAndroid Build Coastguard Worker /// independent and default TTI implementations handle the rest. 13*9880d681SAndroid Build Coastguard Worker /// 14*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Worker #ifndef LLVM_LIB_TARGET_HEXAGON_HEXAGONTARGETTRANSFORMINFO_H 17*9880d681SAndroid Build Coastguard Worker #define LLVM_LIB_TARGET_HEXAGON_HEXAGONTARGETTRANSFORMINFO_H 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Worker #include "Hexagon.h" 20*9880d681SAndroid Build Coastguard Worker #include "HexagonTargetMachine.h" 21*9880d681SAndroid Build Coastguard Worker #include "llvm/Analysis/TargetTransformInfo.h" 22*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/BasicTTIImpl.h" 23*9880d681SAndroid Build Coastguard Worker #include "llvm/Target/TargetLowering.h" 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Worker namespace llvm { 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Worker class HexagonTTIImpl : public BasicTTIImplBase<HexagonTTIImpl> { 28*9880d681SAndroid Build Coastguard Worker typedef BasicTTIImplBase<HexagonTTIImpl> BaseT; 29*9880d681SAndroid Build Coastguard Worker typedef TargetTransformInfo TTI; 30*9880d681SAndroid Build Coastguard Worker friend BaseT; 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Worker const HexagonSubtarget *ST; 33*9880d681SAndroid Build Coastguard Worker const HexagonTargetLowering *TLI; 34*9880d681SAndroid Build Coastguard Worker getST()35*9880d681SAndroid Build Coastguard Worker const HexagonSubtarget *getST() const { return ST; } getTLI()36*9880d681SAndroid Build Coastguard Worker const HexagonTargetLowering *getTLI() const { return TLI; } 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Worker public: HexagonTTIImpl(const HexagonTargetMachine * TM,const Function & F)39*9880d681SAndroid Build Coastguard Worker explicit HexagonTTIImpl(const HexagonTargetMachine *TM, const Function &F) 40*9880d681SAndroid Build Coastguard Worker : BaseT(TM, F.getParent()->getDataLayout()), ST(TM->getSubtargetImpl(F)), 41*9880d681SAndroid Build Coastguard Worker TLI(ST->getTargetLowering()) {} 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Worker // Provide value semantics. MSVC requires that we spell all of these out. HexagonTTIImpl(const HexagonTTIImpl & Arg)44*9880d681SAndroid Build Coastguard Worker HexagonTTIImpl(const HexagonTTIImpl &Arg) 45*9880d681SAndroid Build Coastguard Worker : BaseT(static_cast<const BaseT &>(Arg)), ST(Arg.ST), TLI(Arg.TLI) {} HexagonTTIImpl(HexagonTTIImpl && Arg)46*9880d681SAndroid Build Coastguard Worker HexagonTTIImpl(HexagonTTIImpl &&Arg) 47*9880d681SAndroid Build Coastguard Worker : BaseT(std::move(static_cast<BaseT &>(Arg))), ST(std::move(Arg.ST)), 48*9880d681SAndroid Build Coastguard Worker TLI(std::move(Arg.TLI)) {} 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Worker /// \name Scalar TTI Implementations 51*9880d681SAndroid Build Coastguard Worker /// @{ 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Worker TTI::PopcntSupportKind getPopcntSupport(unsigned IntTyWidthInBit) const; 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Worker // The Hexagon target can unroll loops with run-time trip counts. 56*9880d681SAndroid Build Coastguard Worker void getUnrollingPreferences(Loop *L, TTI::UnrollingPreferences &UP); 57*9880d681SAndroid Build Coastguard Worker 58*9880d681SAndroid Build Coastguard Worker /// @} 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Worker /// \name Vector TTI Implementations 61*9880d681SAndroid Build Coastguard Worker /// @{ 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Worker unsigned getNumberOfRegisters(bool vector) const; 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Worker /// @} 66*9880d681SAndroid Build Coastguard Worker }; 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Worker } // end namespace llvm 69*9880d681SAndroid Build Coastguard Worker 70*9880d681SAndroid Build Coastguard Worker #endif 71