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