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