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 Hexagon_SUBTARGET_H 15 #define Hexagon_SUBTARGET_H 16 17 #include "HexagonFrameLowering.h" 18 #include "HexagonInstrInfo.h" 19 #include "HexagonISelLowering.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 32 namespace llvm { 33 34 class HexagonSubtarget : public HexagonGenSubtargetInfo { 35 virtual void anchor(); 36 37 bool UseMemOps; 38 bool ModeIEEERndNear; 39 40 public: 41 enum HexagonArchEnum { 42 V1, V2, V3, V4, V5 43 }; 44 45 HexagonArchEnum HexagonArchVersion; 46 private: 47 std::string CPUString; 48 const DataLayout DL; // Calculates type size & alignment. 49 HexagonInstrInfo InstrInfo; 50 HexagonTargetLowering TLInfo; 51 HexagonSelectionDAGInfo TSInfo; 52 HexagonFrameLowering FrameLowering; 53 InstrItineraryData InstrItins; 54 55 public: 56 HexagonSubtarget(StringRef TT, StringRef CPU, StringRef FS, 57 const TargetMachine &TM); 58 59 /// getInstrItins - Return the instruction itineraies based on subtarget 60 /// selection. 61 const InstrItineraryData &getInstrItineraryData() const { return InstrItins; } 62 const HexagonInstrInfo *getInstrInfo() const { return &InstrInfo; } 63 const HexagonRegisterInfo *getRegisterInfo() const { 64 return &InstrInfo.getRegisterInfo(); 65 } 66 const HexagonTargetLowering *getTargetLowering() const { return &TLInfo; } 67 const HexagonFrameLowering *getFrameLowering() const { 68 return &FrameLowering; 69 } 70 const HexagonSelectionDAGInfo *getSelectionDAGInfo() const { return &TSInfo; } 71 const DataLayout *getDataLayout() const { return &DL; } 72 73 HexagonSubtarget &initializeSubtargetDependencies(StringRef CPU, 74 StringRef FS); 75 76 /// ParseSubtargetFeatures - Parses features string setting specified 77 /// subtarget options. Definition of function is auto generated by tblgen. 78 void ParseSubtargetFeatures(StringRef CPU, StringRef FS); 79 80 bool hasV2TOps () const { return HexagonArchVersion >= V2; } 81 bool hasV2TOpsOnly () const { return HexagonArchVersion == V2; } 82 bool hasV3TOps () const { return HexagonArchVersion >= V3; } 83 bool hasV3TOpsOnly () const { return HexagonArchVersion == V3; } 84 bool hasV4TOps () const { return HexagonArchVersion >= V4; } 85 bool hasV4TOpsOnly () const { return HexagonArchVersion == V4; } 86 bool useMemOps () const { return HexagonArchVersion >= V4 && UseMemOps; } 87 bool hasV5TOps () const { return HexagonArchVersion >= V5; } 88 bool hasV5TOpsOnly () const { return HexagonArchVersion == V5; } 89 bool modeIEEERndNear () const { return ModeIEEERndNear; } 90 91 bool isSubtargetV2() const { return HexagonArchVersion == V2;} 92 const std::string &getCPUString () const { return CPUString; } 93 94 // Threshold for small data section 95 unsigned getSmallDataThreshold() const { 96 return Hexagon_SMALL_DATA_THRESHOLD; 97 } 98 const HexagonArchEnum &getHexagonArchVersion() const { 99 return HexagonArchVersion; 100 } 101 }; 102 103 } // end namespace llvm 104 105 #endif 106