//=- llvm/Target/TargetTransformImpl.h - Target Loop Trans Info----*- C++ -*-=// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // This file contains the target-specific implementations of the // TargetTransform interfaces. // //===----------------------------------------------------------------------===// #ifndef LLVM_TARGET_TARGET_TRANSFORMATION_IMPL_H #define LLVM_TARGET_TARGET_TRANSFORMATION_IMPL_H #include "llvm/CodeGen/ValueTypes.h" #include "llvm/TargetTransformInfo.h" namespace llvm { class TargetLowering; /// ScalarTargetTransformInfo - This is a default implementation for the /// ScalarTargetTransformInfo interface. Different targets can implement /// this interface differently. class ScalarTargetTransformImpl : public ScalarTargetTransformInfo { protected: const TargetLowering *TLI; public: /// Ctor explicit ScalarTargetTransformImpl(const TargetLowering *TL) : TLI(TL) {} virtual bool isLegalAddImmediate(int64_t imm) const; virtual bool isLegalICmpImmediate(int64_t imm) const; virtual bool isLegalAddressingMode(const AddrMode &AM, Type *Ty) const; virtual bool isTruncateFree(Type *Ty1, Type *Ty2) const; virtual bool isTypeLegal(Type *Ty) const; virtual unsigned getJumpBufAlignment() const; virtual unsigned getJumpBufSize() const; virtual bool shouldBuildLookupTables() const; }; class VectorTargetTransformImpl : public VectorTargetTransformInfo { protected: const TargetLowering *TLI; /// Estimate the cost of type-legalization and the legalized type. std::pair getTypeLegalizationCost(Type *Ty) const; /// Estimate the overhead of scalarizing an instruction. Insert and Extract /// are set if the result needs to be inserted and/or extracted from vectors. unsigned getScalarizationOverhead(Type *Ty, bool Insert, bool Extract) const; // Get the ISD node that corresponds to the Instruction class opcode. int InstructionOpcodeToISD(unsigned Opcode) const; public: explicit VectorTargetTransformImpl(const TargetLowering *TL) : TLI(TL) {} virtual ~VectorTargetTransformImpl() {} virtual unsigned getArithmeticInstrCost(unsigned Opcode, Type *Ty) const; virtual unsigned getShuffleCost(ShuffleKind Kind, Type *Tp, int Index) const; virtual unsigned getCastInstrCost(unsigned Opcode, Type *Dst, Type *Src) const; virtual unsigned getCFInstrCost(unsigned Opcode) const; virtual unsigned getCmpSelInstrCost(unsigned Opcode, Type *ValTy, Type *CondTy) const; virtual unsigned getVectorInstrCost(unsigned Opcode, Type *Val, unsigned Index) const; virtual unsigned getMemoryOpCost(unsigned Opcode, Type *Src, unsigned Alignment, unsigned AddressSpace) const; virtual unsigned getIntrinsicInstrCost(Intrinsic::ID, Type *RetTy, ArrayRef Tys) const; virtual unsigned getNumberOfParts(Type *Tp) const; }; } // end llvm namespace #endif