1*9880d681SAndroid Build Coastguard Worker //===-- HexagonSubtarget.h - Define Subtarget for the Hexagon ---*- C++ -*-===// 2*9880d681SAndroid Build Coastguard Worker // 3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker // 5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker // 8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker // 10*9880d681SAndroid Build Coastguard Worker // This file declares the Hexagon specific subclass of TargetSubtarget. 11*9880d681SAndroid Build Coastguard Worker // 12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker #ifndef LLVM_LIB_TARGET_HEXAGON_HEXAGONSUBTARGET_H 15*9880d681SAndroid Build Coastguard Worker #define LLVM_LIB_TARGET_HEXAGON_HEXAGONSUBTARGET_H 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Worker #include "HexagonFrameLowering.h" 18*9880d681SAndroid Build Coastguard Worker #include "HexagonISelLowering.h" 19*9880d681SAndroid Build Coastguard Worker #include "HexagonInstrInfo.h" 20*9880d681SAndroid Build Coastguard Worker #include "HexagonSelectionDAGInfo.h" 21*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/DataLayout.h" 22*9880d681SAndroid Build Coastguard Worker #include "llvm/Target/TargetMachine.h" 23*9880d681SAndroid Build Coastguard Worker #include "llvm/Target/TargetSubtargetInfo.h" 24*9880d681SAndroid Build Coastguard Worker #include <string> 25*9880d681SAndroid Build Coastguard Worker 26*9880d681SAndroid Build Coastguard Worker #define GET_SUBTARGETINFO_HEADER 27*9880d681SAndroid Build Coastguard Worker #include "HexagonGenSubtargetInfo.inc" 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Worker #define Hexagon_SMALL_DATA_THRESHOLD 8 30*9880d681SAndroid Build Coastguard Worker #define Hexagon_SLOTS 4 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Worker namespace llvm { 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Worker class HexagonSubtarget : public HexagonGenSubtargetInfo { 35*9880d681SAndroid Build Coastguard Worker virtual void anchor(); 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Worker bool UseMemOps, UseHVXOps, UseHVXDblOps; 38*9880d681SAndroid Build Coastguard Worker bool ModeIEEERndNear; 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Worker public: 41*9880d681SAndroid Build Coastguard Worker enum HexagonArchEnum { 42*9880d681SAndroid Build Coastguard Worker V4, V5, V55, V60 43*9880d681SAndroid Build Coastguard Worker }; 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Worker HexagonArchEnum HexagonArchVersion; 46*9880d681SAndroid Build Coastguard Worker /// True if the target should use Back-Skip-Back scheduling. This is the 47*9880d681SAndroid Build Coastguard Worker /// default for V60. 48*9880d681SAndroid Build Coastguard Worker bool UseBSBScheduling; 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Worker private: 51*9880d681SAndroid Build Coastguard Worker std::string CPUString; 52*9880d681SAndroid Build Coastguard Worker HexagonInstrInfo InstrInfo; 53*9880d681SAndroid Build Coastguard Worker HexagonTargetLowering TLInfo; 54*9880d681SAndroid Build Coastguard Worker HexagonSelectionDAGInfo TSInfo; 55*9880d681SAndroid Build Coastguard Worker HexagonFrameLowering FrameLowering; 56*9880d681SAndroid Build Coastguard Worker InstrItineraryData InstrItins; 57*9880d681SAndroid Build Coastguard Worker void initializeEnvironment(); 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Worker public: 60*9880d681SAndroid Build Coastguard Worker HexagonSubtarget(const Triple &TT, StringRef CPU, StringRef FS, 61*9880d681SAndroid Build Coastguard Worker const TargetMachine &TM); 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Worker /// getInstrItins - Return the instruction itineraries based on subtarget 64*9880d681SAndroid Build Coastguard Worker /// selection. getInstrItineraryData()65*9880d681SAndroid Build Coastguard Worker const InstrItineraryData *getInstrItineraryData() const override { 66*9880d681SAndroid Build Coastguard Worker return &InstrItins; 67*9880d681SAndroid Build Coastguard Worker } getInstrInfo()68*9880d681SAndroid Build Coastguard Worker const HexagonInstrInfo *getInstrInfo() const override { return &InstrInfo; } getRegisterInfo()69*9880d681SAndroid Build Coastguard Worker const HexagonRegisterInfo *getRegisterInfo() const override { 70*9880d681SAndroid Build Coastguard Worker return &InstrInfo.getRegisterInfo(); 71*9880d681SAndroid Build Coastguard Worker } getTargetLowering()72*9880d681SAndroid Build Coastguard Worker const HexagonTargetLowering *getTargetLowering() const override { 73*9880d681SAndroid Build Coastguard Worker return &TLInfo; 74*9880d681SAndroid Build Coastguard Worker } getFrameLowering()75*9880d681SAndroid Build Coastguard Worker const HexagonFrameLowering *getFrameLowering() const override { 76*9880d681SAndroid Build Coastguard Worker return &FrameLowering; 77*9880d681SAndroid Build Coastguard Worker } getSelectionDAGInfo()78*9880d681SAndroid Build Coastguard Worker const HexagonSelectionDAGInfo *getSelectionDAGInfo() const override { 79*9880d681SAndroid Build Coastguard Worker return &TSInfo; 80*9880d681SAndroid Build Coastguard Worker } 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Worker HexagonSubtarget &initializeSubtargetDependencies(StringRef CPU, 83*9880d681SAndroid Build Coastguard Worker StringRef FS); 84*9880d681SAndroid Build Coastguard Worker 85*9880d681SAndroid Build Coastguard Worker /// ParseSubtargetFeatures - Parses features string setting specified 86*9880d681SAndroid Build Coastguard Worker /// subtarget options. Definition of function is auto generated by tblgen. 87*9880d681SAndroid Build Coastguard Worker void ParseSubtargetFeatures(StringRef CPU, StringRef FS); 88*9880d681SAndroid Build Coastguard Worker useMemOps()89*9880d681SAndroid Build Coastguard Worker bool useMemOps() const { return UseMemOps; } hasV5TOps()90*9880d681SAndroid Build Coastguard Worker bool hasV5TOps() const { return getHexagonArchVersion() >= V5; } hasV5TOpsOnly()91*9880d681SAndroid Build Coastguard Worker bool hasV5TOpsOnly() const { return getHexagonArchVersion() == V5; } hasV55TOps()92*9880d681SAndroid Build Coastguard Worker bool hasV55TOps() const { return getHexagonArchVersion() >= V55; } hasV55TOpsOnly()93*9880d681SAndroid Build Coastguard Worker bool hasV55TOpsOnly() const { return getHexagonArchVersion() == V55; } hasV60TOps()94*9880d681SAndroid Build Coastguard Worker bool hasV60TOps() const { return getHexagonArchVersion() >= V60; } hasV60TOpsOnly()95*9880d681SAndroid Build Coastguard Worker bool hasV60TOpsOnly() const { return getHexagonArchVersion() == V60; } modeIEEERndNear()96*9880d681SAndroid Build Coastguard Worker bool modeIEEERndNear() const { return ModeIEEERndNear; } useHVXOps()97*9880d681SAndroid Build Coastguard Worker bool useHVXOps() const { return UseHVXOps; } useHVXDblOps()98*9880d681SAndroid Build Coastguard Worker bool useHVXDblOps() const { return UseHVXOps && UseHVXDblOps; } useHVXSglOps()99*9880d681SAndroid Build Coastguard Worker bool useHVXSglOps() const { return UseHVXOps && !UseHVXDblOps; } 100*9880d681SAndroid Build Coastguard Worker useBSBScheduling()101*9880d681SAndroid Build Coastguard Worker bool useBSBScheduling() const { return UseBSBScheduling; } 102*9880d681SAndroid Build Coastguard Worker bool enableMachineScheduler() const override; 103*9880d681SAndroid Build Coastguard Worker // Always use the TargetLowering default scheduler. 104*9880d681SAndroid Build Coastguard Worker // FIXME: This will use the vliw scheduler which is probably just hurting 105*9880d681SAndroid Build Coastguard Worker // compiler time and will be removed eventually anyway. enableMachineSchedDefaultSched()106*9880d681SAndroid Build Coastguard Worker bool enableMachineSchedDefaultSched() const override { return false; } 107*9880d681SAndroid Build Coastguard Worker getAntiDepBreakMode()108*9880d681SAndroid Build Coastguard Worker AntiDepBreakMode getAntiDepBreakMode() const override { return ANTIDEP_ALL; } enablePostRAScheduler()109*9880d681SAndroid Build Coastguard Worker bool enablePostRAScheduler() const override { return true; } 110*9880d681SAndroid Build Coastguard Worker 111*9880d681SAndroid Build Coastguard Worker bool enableSubRegLiveness() const override; 112*9880d681SAndroid Build Coastguard Worker getCPUString()113*9880d681SAndroid Build Coastguard Worker const std::string &getCPUString () const { return CPUString; } 114*9880d681SAndroid Build Coastguard Worker 115*9880d681SAndroid Build Coastguard Worker // Threshold for small data section getSmallDataThreshold()116*9880d681SAndroid Build Coastguard Worker unsigned getSmallDataThreshold() const { 117*9880d681SAndroid Build Coastguard Worker return Hexagon_SMALL_DATA_THRESHOLD; 118*9880d681SAndroid Build Coastguard Worker } getHexagonArchVersion()119*9880d681SAndroid Build Coastguard Worker const HexagonArchEnum &getHexagonArchVersion() const { 120*9880d681SAndroid Build Coastguard Worker return HexagonArchVersion; 121*9880d681SAndroid Build Coastguard Worker } 122*9880d681SAndroid Build Coastguard Worker }; 123*9880d681SAndroid Build Coastguard Worker 124*9880d681SAndroid Build Coastguard Worker } // end namespace llvm 125*9880d681SAndroid Build Coastguard Worker 126*9880d681SAndroid Build Coastguard Worker #endif 127