xref: /aosp_15_r20/external/llvm/lib/Target/Hexagon/HexagonSubtarget.h (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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