| Chandler Carruth | 93dcdc4 | 2015-01-31 11:17:59 +0000 | [diff] [blame] | 1 | //===-- X86TargetTransformInfo.h - X86 specific TTI -------------*- C++ -*-===// | 
|  | 2 | // | 
|  | 3 | //                     The LLVM Compiler Infrastructure | 
|  | 4 | // | 
|  | 5 | // This file is distributed under the University of Illinois Open Source | 
|  | 6 | // License. See LICENSE.TXT for details. | 
|  | 7 | // | 
|  | 8 | //===----------------------------------------------------------------------===// | 
|  | 9 | /// \file | 
|  | 10 | /// This file a TargetTransformInfo::Concept conforming object specific to the | 
|  | 11 | /// X86 target machine. It uses the target's detailed information to | 
|  | 12 | /// provide more precise answers to certain TTI queries, while letting the | 
|  | 13 | /// target independent and default TTI implementations handle the rest. | 
|  | 14 | /// | 
|  | 15 | //===----------------------------------------------------------------------===// | 
|  | 16 |  | 
|  | 17 | #ifndef LLVM_LIB_TARGET_X86_X86TARGETTRANSFORMINFO_H | 
|  | 18 | #define LLVM_LIB_TARGET_X86_X86TARGETTRANSFORMINFO_H | 
|  | 19 |  | 
|  | 20 | #include "X86.h" | 
|  | 21 | #include "X86TargetMachine.h" | 
|  | 22 | #include "llvm/Analysis/TargetTransformInfo.h" | 
|  | 23 | #include "llvm/CodeGen/BasicTTIImpl.h" | 
|  | 24 | #include "llvm/Target/TargetLowering.h" | 
|  | 25 |  | 
|  | 26 | namespace llvm { | 
|  | 27 |  | 
|  | 28 | class X86TTIImpl : public BasicTTIImplBase<X86TTIImpl> { | 
|  | 29 | typedef BasicTTIImplBase<X86TTIImpl> BaseT; | 
|  | 30 | typedef TargetTransformInfo TTI; | 
| Chandler Carruth | c340ca8 | 2015-02-01 14:01:15 +0000 | [diff] [blame] | 31 | friend BaseT; | 
| Chandler Carruth | 93dcdc4 | 2015-01-31 11:17:59 +0000 | [diff] [blame] | 32 |  | 
|  | 33 | const X86Subtarget *ST; | 
|  | 34 | const X86TargetLowering *TLI; | 
|  | 35 |  | 
| Chandler Carruth | 93205eb | 2015-08-05 18:08:10 +0000 | [diff] [blame] | 36 | int getScalarizationOverhead(Type *Ty, bool Insert, bool Extract); | 
| Chandler Carruth | 93dcdc4 | 2015-01-31 11:17:59 +0000 | [diff] [blame] | 37 |  | 
| Chandler Carruth | c956ab66 | 2015-02-01 14:22:17 +0000 | [diff] [blame] | 38 | const X86Subtarget *getST() const { return ST; } | 
| Chandler Carruth | c340ca8 | 2015-02-01 14:01:15 +0000 | [diff] [blame] | 39 | const X86TargetLowering *getTLI() const { return TLI; } | 
|  | 40 |  | 
| Chandler Carruth | 93dcdc4 | 2015-01-31 11:17:59 +0000 | [diff] [blame] | 41 | public: | 
| Eric Christopher | a4e5d3c | 2015-09-16 23:38:13 +0000 | [diff] [blame] | 42 | explicit X86TTIImpl(const X86TargetMachine *TM, const Function &F) | 
| Mehdi Amini | 5010ebf | 2015-07-09 02:08:42 +0000 | [diff] [blame] | 43 | : BaseT(TM, F.getParent()->getDataLayout()), ST(TM->getSubtargetImpl(F)), | 
|  | 44 | TLI(ST->getTargetLowering()) {} | 
| Chandler Carruth | 93dcdc4 | 2015-01-31 11:17:59 +0000 | [diff] [blame] | 45 |  | 
| Chandler Carruth | 93dcdc4 | 2015-01-31 11:17:59 +0000 | [diff] [blame] | 46 | /// \name Scalar TTI Implementations | 
|  | 47 | /// @{ | 
|  | 48 | TTI::PopcntSupportKind getPopcntSupport(unsigned TyWidth); | 
|  | 49 |  | 
|  | 50 | /// @} | 
|  | 51 |  | 
|  | 52 | /// \name Vector TTI Implementations | 
|  | 53 | /// @{ | 
|  | 54 |  | 
|  | 55 | unsigned getNumberOfRegisters(bool Vector); | 
|  | 56 | unsigned getRegisterBitWidth(bool Vector); | 
| Wei Mi | 062c744 | 2015-05-06 17:12:25 +0000 | [diff] [blame] | 57 | unsigned getMaxInterleaveFactor(unsigned VF); | 
| Chandler Carruth | 93205eb | 2015-08-05 18:08:10 +0000 | [diff] [blame] | 58 | int getArithmeticInstrCost( | 
| Chandler Carruth | 93dcdc4 | 2015-01-31 11:17:59 +0000 | [diff] [blame] | 59 | unsigned Opcode, Type *Ty, | 
|  | 60 | TTI::OperandValueKind Opd1Info = TTI::OK_AnyValue, | 
|  | 61 | TTI::OperandValueKind Opd2Info = TTI::OK_AnyValue, | 
|  | 62 | TTI::OperandValueProperties Opd1PropInfo = TTI::OP_None, | 
|  | 63 | TTI::OperandValueProperties Opd2PropInfo = TTI::OP_None); | 
| Chandler Carruth | 93205eb | 2015-08-05 18:08:10 +0000 | [diff] [blame] | 64 | int getShuffleCost(TTI::ShuffleKind Kind, Type *Tp, int Index, Type *SubTp); | 
|  | 65 | int getCastInstrCost(unsigned Opcode, Type *Dst, Type *Src); | 
|  | 66 | int getCmpSelInstrCost(unsigned Opcode, Type *ValTy, Type *CondTy); | 
|  | 67 | int getVectorInstrCost(unsigned Opcode, Type *Val, unsigned Index); | 
|  | 68 | int getMemoryOpCost(unsigned Opcode, Type *Src, unsigned Alignment, | 
|  | 69 | unsigned AddressSpace); | 
|  | 70 | int getMaskedMemoryOpCost(unsigned Opcode, Type *Src, unsigned Alignment, | 
|  | 71 | unsigned AddressSpace); | 
| Elena Demikhovsky | 5494698 | 2015-12-28 20:10:59 +0000 | [diff] [blame] | 72 | int getGatherScatterOpCost(unsigned Opcode, Type *DataTy, Value *Ptr, | 
|  | 73 | bool VariableMask, unsigned Alignment); | 
| Chandler Carruth | 93205eb | 2015-08-05 18:08:10 +0000 | [diff] [blame] | 74 | int getAddressComputationCost(Type *PtrTy, bool IsComplex); | 
| Chandler Carruth | 93dcdc4 | 2015-01-31 11:17:59 +0000 | [diff] [blame] | 75 |  | 
| Simon Pilgrim | 14000b3 | 2016-05-24 08:17:50 +0000 | [diff] [blame] | 76 | int getIntrinsicInstrCost(Intrinsic::ID IID, Type *RetTy, | 
|  | 77 | ArrayRef<Type *> Tys, FastMathFlags FMF); | 
|  | 78 | int getIntrinsicInstrCost(Intrinsic::ID IID, Type *RetTy, | 
|  | 79 | ArrayRef<Value *> Args, FastMathFlags FMF); | 
|  | 80 |  | 
| Chandler Carruth | 93205eb | 2015-08-05 18:08:10 +0000 | [diff] [blame] | 81 | int getReductionCost(unsigned Opcode, Type *Ty, bool IsPairwiseForm); | 
| Chandler Carruth | 93dcdc4 | 2015-01-31 11:17:59 +0000 | [diff] [blame] | 82 |  | 
| Chandler Carruth | 93205eb | 2015-08-05 18:08:10 +0000 | [diff] [blame] | 83 | int getIntImmCost(int64_t); | 
| Chandler Carruth | 93dcdc4 | 2015-01-31 11:17:59 +0000 | [diff] [blame] | 84 |  | 
| Chandler Carruth | 93205eb | 2015-08-05 18:08:10 +0000 | [diff] [blame] | 85 | int getIntImmCost(const APInt &Imm, Type *Ty); | 
| Chandler Carruth | 93dcdc4 | 2015-01-31 11:17:59 +0000 | [diff] [blame] | 86 |  | 
| Chandler Carruth | 93205eb | 2015-08-05 18:08:10 +0000 | [diff] [blame] | 87 | int getIntImmCost(unsigned Opcode, unsigned Idx, const APInt &Imm, Type *Ty); | 
|  | 88 | int getIntImmCost(Intrinsic::ID IID, unsigned Idx, const APInt &Imm, | 
|  | 89 | Type *Ty); | 
| Elena Demikhovsky | 20662e3 | 2015-10-19 07:43:38 +0000 | [diff] [blame] | 90 | bool isLegalMaskedLoad(Type *DataType); | 
|  | 91 | bool isLegalMaskedStore(Type *DataType); | 
| Elena Demikhovsky | 0928585 | 2015-10-25 15:37:55 +0000 | [diff] [blame] | 92 | bool isLegalMaskedGather(Type *DataType); | 
|  | 93 | bool isLegalMaskedScatter(Type *DataType); | 
| Eric Christopher | d566fb1 | 2015-07-29 22:09:48 +0000 | [diff] [blame] | 94 | bool areInlineCompatible(const Function *Caller, | 
|  | 95 | const Function *Callee) const; | 
| Michael Kuperstein | b2443ed | 2016-10-20 21:04:31 +0000 | [diff] [blame] | 96 |  | 
|  | 97 | bool enableInterleavedAccessVectorization(); | 
| Elena Demikhovsky | 5494698 | 2015-12-28 20:10:59 +0000 | [diff] [blame] | 98 | private: | 
|  | 99 | int getGSScalarCost(unsigned Opcode, Type *DataTy, bool VariableMask, | 
|  | 100 | unsigned Alignment, unsigned AddressSpace); | 
|  | 101 | int getGSVectorCost(unsigned Opcode, Type *DataTy, Value *Ptr, | 
|  | 102 | unsigned Alignment, unsigned AddressSpace); | 
| Chandler Carruth | 93dcdc4 | 2015-01-31 11:17:59 +0000 | [diff] [blame] | 103 |  | 
|  | 104 | /// @} | 
|  | 105 | }; | 
| Chandler Carruth | 93dcdc4 | 2015-01-31 11:17:59 +0000 | [diff] [blame] | 106 |  | 
|  | 107 | } // end namespace llvm | 
|  | 108 |  | 
|  | 109 | #endif |