blob: f8965d8998a4cac8bd66834203c9f524cf17d99f [file] [log] [blame]
Vincent Lejeune68b6b6d2013-03-05 18:41:32 +00001//===-- 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"
Benjamin Kramerd78bb462013-05-23 17:10:37 +000019#include "llvm/ADT/PriorityQueue.h"
Vincent Lejeune68b6b6d2013-03-05 18:41:32 +000020#include "llvm/CodeGen/MachineScheduler.h"
21#include "llvm/Support/Debug.h"
Vincent Lejeune68b6b6d2013-03-05 18:41:32 +000022
23using namespace llvm;
24
25namespace llvm {
26
Vincent Lejeune68b6b6d2013-03-05 18:41:32 +000027class R600SchedStrategy : public MachineSchedStrategy {
28
29 const ScheduleDAGMI *DAG;
30 const R600InstrInfo *TII;
31 const R600RegisterInfo *TRI;
32 MachineRegisterInfo *MRI;
33
Vincent Lejeune68b6b6d2013-03-05 18:41:32 +000034 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,
Vincent Lejeune3d5118c2013-05-17 16:50:56 +000048 AluPredX,
Vincent Lejeune77a83522013-06-29 19:32:43 +000049 AluTrans,
Vincent Lejeune68b6b6d2013-03-05 18:41:32 +000050 AluDiscarded, // LLVM Instructions that are going to be eliminated
51 AluLast
52 };
53
Vincent Lejeune4c81d4d2013-05-17 16:50:44 +000054 std::vector<SUnit *> Available[IDLast], Pending[IDLast];
55 std::vector<SUnit *> AvailableAlus[AluLast];
Tom Stellardaad53762013-06-05 03:43:06 +000056 std::vector<SUnit *> UnscheduledARDefs;
57 std::vector<SUnit *> UnscheduledARUses;
Vincent Lejeune4b5b8492013-06-05 20:27:35 +000058 std::vector<SUnit *> PhysicalRegCopy;
Vincent Lejeune68b6b6d2013-03-05 18:41:32 +000059
60 InstKind CurInstKind;
61 int CurEmitted;
62 InstKind NextInstKind;
63
Vincent Lejeuned1a9d182013-06-07 23:30:34 +000064 unsigned AluInstCount;
65 unsigned FetchInstCount;
66
Vincent Lejeune68b6b6d2013-03-05 18:41:32 +000067 int InstKindLimit[IDLast];
68
69 int OccupedSlotsMask;
70
71public:
72 R600SchedStrategy() :
73 DAG(0), TII(0), TRI(0), MRI(0) {
Vincent Lejeune68b6b6d2013-03-05 18:41:32 +000074 }
75
76 virtual ~R600SchedStrategy() {
Vincent Lejeune68b6b6d2013-03-05 18:41:32 +000077 }
78
79 virtual void initialize(ScheduleDAGMI *dag);
80 virtual SUnit *pickNode(bool &IsTopNode);
81 virtual void schedNode(SUnit *SU, bool IsTopNode);
82 virtual void releaseTopNode(SUnit *SU);
83 virtual void releaseBottomNode(SUnit *SU);
84
85private:
Vincent Lejeune0a22bc42013-03-14 15:50:45 +000086 std::vector<MachineInstr *> InstructionsGroupCandidate;
Vincent Lejeune68b6b6d2013-03-05 18:41:32 +000087
88 int getInstKind(SUnit *SU);
89 bool regBelongsToClass(unsigned Reg, const TargetRegisterClass *RC) const;
90 AluKind getAluKind(SUnit *SU) const;
91 void LoadAlu();
Vincent Lejeuned1a9d182013-06-07 23:30:34 +000092 unsigned AvailablesAluCount() const;
Vincent Lejeune68b6b6d2013-03-05 18:41:32 +000093 SUnit *AttemptFillSlot (unsigned Slot);
94 void PrepareNextSlot();
Vincent Lejeune4c81d4d2013-05-17 16:50:44 +000095 SUnit *PopInst(std::vector<SUnit*> &Q);
Vincent Lejeune68b6b6d2013-03-05 18:41:32 +000096
97 void AssignSlot(MachineInstr *MI, unsigned Slot);
98 SUnit* pickAlu();
99 SUnit* pickOther(int QID);
Vincent Lejeune4c81d4d2013-05-17 16:50:44 +0000100 void MoveUnits(std::vector<SUnit *> &QSrc, std::vector<SUnit *> &QDst);
Vincent Lejeune68b6b6d2013-03-05 18:41:32 +0000101};
102
103} // namespace llvm
104
105#endif /* R600MACHINESCHEDULER_H_ */