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