xref: /aosp_15_r20/external/llvm/lib/Target/AMDGPU/R600MachineScheduler.h (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //===-- R600MachineScheduler.h - R600 Scheduler Interface -*- 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 /// \file
11*9880d681SAndroid Build Coastguard Worker /// \brief R600 Machine Scheduler interface
12*9880d681SAndroid Build Coastguard Worker //
13*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
14*9880d681SAndroid Build Coastguard Worker 
15*9880d681SAndroid Build Coastguard Worker #ifndef LLVM_LIB_TARGET_AMDGPU_R600MACHINESCHEDULER_H
16*9880d681SAndroid Build Coastguard Worker #define LLVM_LIB_TARGET_AMDGPU_R600MACHINESCHEDULER_H
17*9880d681SAndroid Build Coastguard Worker 
18*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/MachineScheduler.h"
19*9880d681SAndroid Build Coastguard Worker 
20*9880d681SAndroid Build Coastguard Worker using namespace llvm;
21*9880d681SAndroid Build Coastguard Worker 
22*9880d681SAndroid Build Coastguard Worker namespace llvm {
23*9880d681SAndroid Build Coastguard Worker 
24*9880d681SAndroid Build Coastguard Worker class R600InstrInfo;
25*9880d681SAndroid Build Coastguard Worker struct R600RegisterInfo;
26*9880d681SAndroid Build Coastguard Worker 
27*9880d681SAndroid Build Coastguard Worker class R600SchedStrategy final : public MachineSchedStrategy {
28*9880d681SAndroid Build Coastguard Worker   const ScheduleDAGMILive *DAG;
29*9880d681SAndroid Build Coastguard Worker   const R600InstrInfo *TII;
30*9880d681SAndroid Build Coastguard Worker   const R600RegisterInfo *TRI;
31*9880d681SAndroid Build Coastguard Worker   MachineRegisterInfo *MRI;
32*9880d681SAndroid Build Coastguard Worker 
33*9880d681SAndroid Build Coastguard Worker   enum InstKind {
34*9880d681SAndroid Build Coastguard Worker     IDAlu,
35*9880d681SAndroid Build Coastguard Worker     IDFetch,
36*9880d681SAndroid Build Coastguard Worker     IDOther,
37*9880d681SAndroid Build Coastguard Worker     IDLast
38*9880d681SAndroid Build Coastguard Worker   };
39*9880d681SAndroid Build Coastguard Worker 
40*9880d681SAndroid Build Coastguard Worker   enum AluKind {
41*9880d681SAndroid Build Coastguard Worker     AluAny,
42*9880d681SAndroid Build Coastguard Worker     AluT_X,
43*9880d681SAndroid Build Coastguard Worker     AluT_Y,
44*9880d681SAndroid Build Coastguard Worker     AluT_Z,
45*9880d681SAndroid Build Coastguard Worker     AluT_W,
46*9880d681SAndroid Build Coastguard Worker     AluT_XYZW,
47*9880d681SAndroid Build Coastguard Worker     AluPredX,
48*9880d681SAndroid Build Coastguard Worker     AluTrans,
49*9880d681SAndroid Build Coastguard Worker     AluDiscarded, // LLVM Instructions that are going to be eliminated
50*9880d681SAndroid Build Coastguard Worker     AluLast
51*9880d681SAndroid Build Coastguard Worker   };
52*9880d681SAndroid Build Coastguard Worker 
53*9880d681SAndroid Build Coastguard Worker   std::vector<SUnit *> Available[IDLast], Pending[IDLast];
54*9880d681SAndroid Build Coastguard Worker   std::vector<SUnit *> AvailableAlus[AluLast];
55*9880d681SAndroid Build Coastguard Worker   std::vector<SUnit *> PhysicalRegCopy;
56*9880d681SAndroid Build Coastguard Worker 
57*9880d681SAndroid Build Coastguard Worker   InstKind CurInstKind;
58*9880d681SAndroid Build Coastguard Worker   int CurEmitted;
59*9880d681SAndroid Build Coastguard Worker   InstKind NextInstKind;
60*9880d681SAndroid Build Coastguard Worker 
61*9880d681SAndroid Build Coastguard Worker   unsigned AluInstCount;
62*9880d681SAndroid Build Coastguard Worker   unsigned FetchInstCount;
63*9880d681SAndroid Build Coastguard Worker 
64*9880d681SAndroid Build Coastguard Worker   int InstKindLimit[IDLast];
65*9880d681SAndroid Build Coastguard Worker 
66*9880d681SAndroid Build Coastguard Worker   int OccupedSlotsMask;
67*9880d681SAndroid Build Coastguard Worker 
68*9880d681SAndroid Build Coastguard Worker public:
R600SchedStrategy()69*9880d681SAndroid Build Coastguard Worker   R600SchedStrategy() :
70*9880d681SAndroid Build Coastguard Worker     DAG(nullptr), TII(nullptr), TRI(nullptr), MRI(nullptr) {
71*9880d681SAndroid Build Coastguard Worker   }
72*9880d681SAndroid Build Coastguard Worker 
~R600SchedStrategy()73*9880d681SAndroid Build Coastguard Worker   virtual ~R600SchedStrategy() {}
74*9880d681SAndroid Build Coastguard Worker 
75*9880d681SAndroid Build Coastguard Worker   void initialize(ScheduleDAGMI *dag) override;
76*9880d681SAndroid Build Coastguard Worker   SUnit *pickNode(bool &IsTopNode) override;
77*9880d681SAndroid Build Coastguard Worker   void schedNode(SUnit *SU, bool IsTopNode) override;
78*9880d681SAndroid Build Coastguard Worker   void releaseTopNode(SUnit *SU) override;
79*9880d681SAndroid Build Coastguard Worker   void releaseBottomNode(SUnit *SU) override;
80*9880d681SAndroid Build Coastguard Worker 
81*9880d681SAndroid Build Coastguard Worker private:
82*9880d681SAndroid Build Coastguard Worker   std::vector<MachineInstr *> InstructionsGroupCandidate;
83*9880d681SAndroid Build Coastguard Worker   bool VLIW5;
84*9880d681SAndroid Build Coastguard Worker 
85*9880d681SAndroid Build Coastguard Worker   int getInstKind(SUnit *SU);
86*9880d681SAndroid Build Coastguard Worker   bool regBelongsToClass(unsigned Reg, const TargetRegisterClass *RC) const;
87*9880d681SAndroid Build Coastguard Worker   AluKind getAluKind(SUnit *SU) const;
88*9880d681SAndroid Build Coastguard Worker   void LoadAlu();
89*9880d681SAndroid Build Coastguard Worker   unsigned AvailablesAluCount() const;
90*9880d681SAndroid Build Coastguard Worker   SUnit *AttemptFillSlot (unsigned Slot, bool AnyAlu);
91*9880d681SAndroid Build Coastguard Worker   void PrepareNextSlot();
92*9880d681SAndroid Build Coastguard Worker   SUnit *PopInst(std::vector<SUnit*> &Q, bool AnyALU);
93*9880d681SAndroid Build Coastguard Worker 
94*9880d681SAndroid Build Coastguard Worker   void AssignSlot(MachineInstr *MI, unsigned Slot);
95*9880d681SAndroid Build Coastguard Worker   SUnit* pickAlu();
96*9880d681SAndroid Build Coastguard Worker   SUnit* pickOther(int QID);
97*9880d681SAndroid Build Coastguard Worker   void MoveUnits(std::vector<SUnit *> &QSrc, std::vector<SUnit *> &QDst);
98*9880d681SAndroid Build Coastguard Worker };
99*9880d681SAndroid Build Coastguard Worker 
100*9880d681SAndroid Build Coastguard Worker } // namespace llvm
101*9880d681SAndroid Build Coastguard Worker 
102*9880d681SAndroid Build Coastguard Worker #endif /* R600MACHINESCHEDULER_H_ */
103