blob: fc5b95c28e715bbb889675499fa4d3cadcf50f3b [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
Benjamin Kramera7c40ef2014-08-13 16:26:38 +000015#ifndef LLVM_LIB_TARGET_R600_R600MACHINESCHEDULER_H
16#define LLVM_LIB_TARGET_R600_R600MACHINESCHEDULER_H
Vincent Lejeune68b6b6d2013-03-05 18:41:32 +000017
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
Andrew Trickd7f890e2013-12-28 21:56:47 +000029 const ScheduleDAGMILive *DAG;
Vincent Lejeune68b6b6d2013-03-05 18:41:32 +000030 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];
Vincent Lejeune4b5b8492013-06-05 20:27:35 +000056 std::vector<SUnit *> PhysicalRegCopy;
Vincent Lejeune68b6b6d2013-03-05 18:41:32 +000057
58 InstKind CurInstKind;
59 int CurEmitted;
60 InstKind NextInstKind;
61
Vincent Lejeuned1a9d182013-06-07 23:30:34 +000062 unsigned AluInstCount;
63 unsigned FetchInstCount;
64
Vincent Lejeune68b6b6d2013-03-05 18:41:32 +000065 int InstKindLimit[IDLast];
66
67 int OccupedSlotsMask;
68
69public:
70 R600SchedStrategy() :
Craig Toppere73658d2014-04-28 04:05:08 +000071 DAG(nullptr), TII(nullptr), TRI(nullptr), MRI(nullptr) {
Vincent Lejeune68b6b6d2013-03-05 18:41:32 +000072 }
73
Craig Topper5656db42014-04-29 07:57:24 +000074 virtual ~R600SchedStrategy() {}
Vincent Lejeune68b6b6d2013-03-05 18:41:32 +000075
Craig Topper5656db42014-04-29 07:57:24 +000076 void initialize(ScheduleDAGMI *dag) override;
77 SUnit *pickNode(bool &IsTopNode) override;
78 void schedNode(SUnit *SU, bool IsTopNode) override;
79 void releaseTopNode(SUnit *SU) override;
80 void releaseBottomNode(SUnit *SU) override;
Vincent Lejeune68b6b6d2013-03-05 18:41:32 +000081
82private:
Vincent Lejeune0a22bc42013-03-14 15:50:45 +000083 std::vector<MachineInstr *> InstructionsGroupCandidate;
Vincent Lejeune7e2c8322013-09-04 19:53:46 +000084 bool VLIW5;
Vincent Lejeune68b6b6d2013-03-05 18:41:32 +000085
86 int getInstKind(SUnit *SU);
87 bool regBelongsToClass(unsigned Reg, const TargetRegisterClass *RC) const;
88 AluKind getAluKind(SUnit *SU) const;
89 void LoadAlu();
Vincent Lejeuned1a9d182013-06-07 23:30:34 +000090 unsigned AvailablesAluCount() const;
Vincent Lejeune7e2c8322013-09-04 19:53:46 +000091 SUnit *AttemptFillSlot (unsigned Slot, bool AnyAlu);
Vincent Lejeune68b6b6d2013-03-05 18:41:32 +000092 void PrepareNextSlot();
Vincent Lejeune7e2c8322013-09-04 19:53:46 +000093 SUnit *PopInst(std::vector<SUnit*> &Q, bool AnyALU);
Vincent Lejeune68b6b6d2013-03-05 18:41:32 +000094
95 void AssignSlot(MachineInstr *MI, unsigned Slot);
96 SUnit* pickAlu();
97 SUnit* pickOther(int QID);
Vincent Lejeune4c81d4d2013-05-17 16:50:44 +000098 void MoveUnits(std::vector<SUnit *> &QSrc, std::vector<SUnit *> &QDst);
Vincent Lejeune68b6b6d2013-03-05 18:41:32 +000099};
100
101} // namespace llvm
102
103#endif /* R600MACHINESCHEDULER_H_ */