1//===-- HexagonSubtarget.h - Define Subtarget for the Hexagon ---*- 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// 10// This file declares the Hexagon specific subclass of TargetSubtarget. 11// 12//===----------------------------------------------------------------------===// 13 14#ifndef LLVM_LIB_TARGET_HEXAGON_HEXAGONSUBTARGET_H 15#define LLVM_LIB_TARGET_HEXAGON_HEXAGONSUBTARGET_H 16 17#include "HexagonFrameLowering.h" 18#include "HexagonISelLowering.h" 19#include "HexagonInstrInfo.h" 20#include "HexagonSelectionDAGInfo.h" 21#include "llvm/IR/DataLayout.h" 22#include "llvm/Target/TargetMachine.h" 23#include "llvm/Target/TargetSubtargetInfo.h" 24#include <string> 25 26#define GET_SUBTARGETINFO_HEADER 27#include "HexagonGenSubtargetInfo.inc" 28 29#define Hexagon_SMALL_DATA_THRESHOLD 8 30#define Hexagon_SLOTS 4 31 32namespace llvm { 33 34class HexagonSubtarget : public HexagonGenSubtargetInfo { 35 virtual void anchor(); 36 37 bool UseMemOps; 38 bool ModeIEEERndNear; 39 40public: 41 enum HexagonArchEnum { 42 V4, V5 43 }; 44 45 HexagonArchEnum HexagonArchVersion; 46private: 47 std::string CPUString; 48 HexagonInstrInfo InstrInfo; 49 HexagonTargetLowering TLInfo; 50 HexagonSelectionDAGInfo TSInfo; 51 HexagonFrameLowering FrameLowering; 52 InstrItineraryData InstrItins; 53 54public: 55 HexagonSubtarget(StringRef TT, StringRef CPU, StringRef FS, 56 const TargetMachine &TM); 57 58 /// getInstrItins - Return the instruction itineraries based on subtarget 59 /// selection. 60 const InstrItineraryData *getInstrItineraryData() const override { 61 return &InstrItins; 62 } 63 const HexagonInstrInfo *getInstrInfo() const override { return &InstrInfo; } 64 const HexagonRegisterInfo *getRegisterInfo() const override { 65 return &InstrInfo.getRegisterInfo(); 66 } 67 const HexagonTargetLowering *getTargetLowering() const override { 68 return &TLInfo; 69 } 70 const HexagonFrameLowering *getFrameLowering() const override { 71 return &FrameLowering; 72 } 73 const HexagonSelectionDAGInfo *getSelectionDAGInfo() const override { 74 return &TSInfo; 75 } 76 77 HexagonSubtarget &initializeSubtargetDependencies(StringRef CPU, 78 StringRef FS); 79 80 /// ParseSubtargetFeatures - Parses features string setting specified 81 /// subtarget options. Definition of function is auto generated by tblgen. 82 void ParseSubtargetFeatures(StringRef CPU, StringRef FS); 83 84 bool useMemOps() const { return UseMemOps; } 85 bool hasV5TOps() const { return getHexagonArchVersion() >= V5; } 86 bool hasV5TOpsOnly() const { return getHexagonArchVersion() == V5; } 87 bool modeIEEERndNear() const { return ModeIEEERndNear; } 88 bool enableMachineScheduler() const override; 89 // Always use the TargetLowering default scheduler. 90 // FIXME: This will use the vliw scheduler which is probably just hurting 91 // compiler time and will be removed eventually anyway. 92 bool enableMachineSchedDefaultSched() const override { return false; } 93 94 const std::string &getCPUString () const { return CPUString; } 95 96 // Threshold for small data section 97 unsigned getSmallDataThreshold() const { 98 return Hexagon_SMALL_DATA_THRESHOLD; 99 } 100 const HexagonArchEnum &getHexagonArchVersion() const { 101 return HexagonArchVersion; 102 } 103}; 104 105} // end namespace llvm 106 107#endif 108