1*9880d681SAndroid Build Coastguard Worker //===-- AArch64TargetTransformInfo.h - AArch64 specific TTI -----*- C++ -*-===// 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 //===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker /// \file 10*9880d681SAndroid Build Coastguard Worker /// This file a TargetTransformInfo::Concept conforming object specific to the 11*9880d681SAndroid Build Coastguard Worker /// AArch64 target machine. It uses the target's detailed information to 12*9880d681SAndroid Build Coastguard Worker /// provide more precise answers to certain TTI queries, while letting the 13*9880d681SAndroid Build Coastguard Worker /// target independent and default TTI implementations handle the rest. 14*9880d681SAndroid Build Coastguard Worker /// 15*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Worker #ifndef LLVM_LIB_TARGET_AARCH64_AARCH64TARGETTRANSFORMINFO_H 18*9880d681SAndroid Build Coastguard Worker #define LLVM_LIB_TARGET_AARCH64_AARCH64TARGETTRANSFORMINFO_H 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Worker #include "AArch64.h" 21*9880d681SAndroid Build Coastguard Worker #include "AArch64TargetMachine.h" 22*9880d681SAndroid Build Coastguard Worker #include "llvm/Analysis/TargetTransformInfo.h" 23*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/BasicTTIImpl.h" 24*9880d681SAndroid Build Coastguard Worker #include "llvm/Target/TargetLowering.h" 25*9880d681SAndroid Build Coastguard Worker #include <algorithm> 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Worker namespace llvm { 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Worker class AArch64TTIImpl : public BasicTTIImplBase<AArch64TTIImpl> { 30*9880d681SAndroid Build Coastguard Worker typedef BasicTTIImplBase<AArch64TTIImpl> BaseT; 31*9880d681SAndroid Build Coastguard Worker typedef TargetTransformInfo TTI; 32*9880d681SAndroid Build Coastguard Worker friend BaseT; 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Worker const AArch64Subtarget *ST; 35*9880d681SAndroid Build Coastguard Worker const AArch64TargetLowering *TLI; 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Worker /// Estimate the overhead of scalarizing an instruction. Insert and Extract 38*9880d681SAndroid Build Coastguard Worker /// are set if the result needs to be inserted and/or extracted from vectors. 39*9880d681SAndroid Build Coastguard Worker unsigned getScalarizationOverhead(Type *Ty, bool Insert, bool Extract); 40*9880d681SAndroid Build Coastguard Worker getST()41*9880d681SAndroid Build Coastguard Worker const AArch64Subtarget *getST() const { return ST; } getTLI()42*9880d681SAndroid Build Coastguard Worker const AArch64TargetLowering *getTLI() const { return TLI; } 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Worker enum MemIntrinsicType { 45*9880d681SAndroid Build Coastguard Worker VECTOR_LDST_TWO_ELEMENTS, 46*9880d681SAndroid Build Coastguard Worker VECTOR_LDST_THREE_ELEMENTS, 47*9880d681SAndroid Build Coastguard Worker VECTOR_LDST_FOUR_ELEMENTS 48*9880d681SAndroid Build Coastguard Worker }; 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Worker public: AArch64TTIImpl(const AArch64TargetMachine * TM,const Function & F)51*9880d681SAndroid Build Coastguard Worker explicit AArch64TTIImpl(const AArch64TargetMachine *TM, const Function &F) 52*9880d681SAndroid Build Coastguard Worker : BaseT(TM, F.getParent()->getDataLayout()), ST(TM->getSubtargetImpl(F)), 53*9880d681SAndroid Build Coastguard Worker TLI(ST->getTargetLowering()) {} 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Worker // Provide value semantics. MSVC requires that we spell all of these out. AArch64TTIImpl(const AArch64TTIImpl & Arg)56*9880d681SAndroid Build Coastguard Worker AArch64TTIImpl(const AArch64TTIImpl &Arg) 57*9880d681SAndroid Build Coastguard Worker : BaseT(static_cast<const BaseT &>(Arg)), ST(Arg.ST), TLI(Arg.TLI) {} AArch64TTIImpl(AArch64TTIImpl && Arg)58*9880d681SAndroid Build Coastguard Worker AArch64TTIImpl(AArch64TTIImpl &&Arg) 59*9880d681SAndroid Build Coastguard Worker : BaseT(std::move(static_cast<BaseT &>(Arg))), ST(std::move(Arg.ST)), 60*9880d681SAndroid Build Coastguard Worker TLI(std::move(Arg.TLI)) {} 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Worker /// \name Scalar TTI Implementations 63*9880d681SAndroid Build Coastguard Worker /// @{ 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Worker using BaseT::getIntImmCost; 66*9880d681SAndroid Build Coastguard Worker int getIntImmCost(int64_t Val); 67*9880d681SAndroid Build Coastguard Worker int getIntImmCost(const APInt &Imm, Type *Ty); 68*9880d681SAndroid Build Coastguard Worker int getIntImmCost(unsigned Opcode, unsigned Idx, const APInt &Imm, Type *Ty); 69*9880d681SAndroid Build Coastguard Worker int getIntImmCost(Intrinsic::ID IID, unsigned Idx, const APInt &Imm, 70*9880d681SAndroid Build Coastguard Worker Type *Ty); 71*9880d681SAndroid Build Coastguard Worker TTI::PopcntSupportKind getPopcntSupport(unsigned TyWidth); 72*9880d681SAndroid Build Coastguard Worker 73*9880d681SAndroid Build Coastguard Worker /// @} 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Worker /// \name Vector TTI Implementations 76*9880d681SAndroid Build Coastguard Worker /// @{ 77*9880d681SAndroid Build Coastguard Worker enableInterleavedAccessVectorization()78*9880d681SAndroid Build Coastguard Worker bool enableInterleavedAccessVectorization() { return true; } 79*9880d681SAndroid Build Coastguard Worker getNumberOfRegisters(bool Vector)80*9880d681SAndroid Build Coastguard Worker unsigned getNumberOfRegisters(bool Vector) { 81*9880d681SAndroid Build Coastguard Worker if (Vector) { 82*9880d681SAndroid Build Coastguard Worker if (ST->hasNEON()) 83*9880d681SAndroid Build Coastguard Worker return 32; 84*9880d681SAndroid Build Coastguard Worker return 0; 85*9880d681SAndroid Build Coastguard Worker } 86*9880d681SAndroid Build Coastguard Worker return 31; 87*9880d681SAndroid Build Coastguard Worker } 88*9880d681SAndroid Build Coastguard Worker getRegisterBitWidth(bool Vector)89*9880d681SAndroid Build Coastguard Worker unsigned getRegisterBitWidth(bool Vector) { 90*9880d681SAndroid Build Coastguard Worker if (Vector) { 91*9880d681SAndroid Build Coastguard Worker if (ST->hasNEON()) 92*9880d681SAndroid Build Coastguard Worker return 128; 93*9880d681SAndroid Build Coastguard Worker return 0; 94*9880d681SAndroid Build Coastguard Worker } 95*9880d681SAndroid Build Coastguard Worker return 64; 96*9880d681SAndroid Build Coastguard Worker } 97*9880d681SAndroid Build Coastguard Worker 98*9880d681SAndroid Build Coastguard Worker unsigned getMaxInterleaveFactor(unsigned VF); 99*9880d681SAndroid Build Coastguard Worker 100*9880d681SAndroid Build Coastguard Worker int getCastInstrCost(unsigned Opcode, Type *Dst, Type *Src); 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard Worker int getExtractWithExtendCost(unsigned Opcode, Type *Dst, VectorType *VecTy, 103*9880d681SAndroid Build Coastguard Worker unsigned Index); 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Worker int getVectorInstrCost(unsigned Opcode, Type *Val, unsigned Index); 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Worker int getArithmeticInstrCost( 108*9880d681SAndroid Build Coastguard Worker unsigned Opcode, Type *Ty, 109*9880d681SAndroid Build Coastguard Worker TTI::OperandValueKind Opd1Info = TTI::OK_AnyValue, 110*9880d681SAndroid Build Coastguard Worker TTI::OperandValueKind Opd2Info = TTI::OK_AnyValue, 111*9880d681SAndroid Build Coastguard Worker TTI::OperandValueProperties Opd1PropInfo = TTI::OP_None, 112*9880d681SAndroid Build Coastguard Worker TTI::OperandValueProperties Opd2PropInfo = TTI::OP_None); 113*9880d681SAndroid Build Coastguard Worker 114*9880d681SAndroid Build Coastguard Worker int getAddressComputationCost(Type *Ty, bool IsComplex); 115*9880d681SAndroid Build Coastguard Worker 116*9880d681SAndroid Build Coastguard Worker int getCmpSelInstrCost(unsigned Opcode, Type *ValTy, Type *CondTy); 117*9880d681SAndroid Build Coastguard Worker 118*9880d681SAndroid Build Coastguard Worker int getMemoryOpCost(unsigned Opcode, Type *Src, unsigned Alignment, 119*9880d681SAndroid Build Coastguard Worker unsigned AddressSpace); 120*9880d681SAndroid Build Coastguard Worker 121*9880d681SAndroid Build Coastguard Worker int getCostOfKeepingLiveOverCall(ArrayRef<Type *> Tys); 122*9880d681SAndroid Build Coastguard Worker 123*9880d681SAndroid Build Coastguard Worker void getUnrollingPreferences(Loop *L, TTI::UnrollingPreferences &UP); 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard Worker Value *getOrCreateResultFromMemIntrinsic(IntrinsicInst *Inst, 126*9880d681SAndroid Build Coastguard Worker Type *ExpectedType); 127*9880d681SAndroid Build Coastguard Worker 128*9880d681SAndroid Build Coastguard Worker bool getTgtMemIntrinsic(IntrinsicInst *Inst, MemIntrinsicInfo &Info); 129*9880d681SAndroid Build Coastguard Worker 130*9880d681SAndroid Build Coastguard Worker int getInterleavedMemoryOpCost(unsigned Opcode, Type *VecTy, unsigned Factor, 131*9880d681SAndroid Build Coastguard Worker ArrayRef<unsigned> Indices, unsigned Alignment, 132*9880d681SAndroid Build Coastguard Worker unsigned AddressSpace); 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard Worker unsigned getCacheLineSize(); 135*9880d681SAndroid Build Coastguard Worker 136*9880d681SAndroid Build Coastguard Worker unsigned getPrefetchDistance(); 137*9880d681SAndroid Build Coastguard Worker 138*9880d681SAndroid Build Coastguard Worker unsigned getMinPrefetchStride(); 139*9880d681SAndroid Build Coastguard Worker 140*9880d681SAndroid Build Coastguard Worker unsigned getMaxPrefetchIterationsAhead(); 141*9880d681SAndroid Build Coastguard Worker /// @} 142*9880d681SAndroid Build Coastguard Worker }; 143*9880d681SAndroid Build Coastguard Worker 144*9880d681SAndroid Build Coastguard Worker } // end namespace llvm 145*9880d681SAndroid Build Coastguard Worker 146*9880d681SAndroid Build Coastguard Worker #endif 147