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