SHUFP* are two address code.
[oota-llvm.git] / lib / Target / SparcV9 / ModuloScheduling / MSScheduleSB.h
1 //===-- MSScheduleSB.h - Schedule ------- -------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file was developed by the LLVM research group and is distributed under
6 // the University of Illinois Open Source License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // The schedule generated by a scheduling algorithm
11 //
12 //===----------------------------------------------------------------------===//
13
14 #ifndef LLVM_MSSCHEDULESB_H
15 #define LLVM_MSSCHEDULESB_H
16
17 #include "MSchedGraphSB.h"
18 #include <vector>
19 #include <set>
20
21 namespace llvm {
22
23   class MSScheduleSB {
24     std::map<int, std::vector<MSchedGraphSBNode*> > schedule;
25     unsigned numIssue;
26
27     //Internal map to keep track of explicit resources
28     std::map<int, std::map<int, int> > resourceNumPerCycle;
29
30     //Check if all resources are free
31     bool resourcesFree(MSchedGraphSBNode*, int, int II);
32     bool resourceAvailable(int resourceNum, int cycle);
33     void useResource(int resourceNum, int cycle);
34
35     //Resulting kernel
36     std::vector<std::pair<MachineInstr*, int> > kernel;
37
38     //Max stage count
39     int maxStage;
40
41     //add at the right spot in the schedule
42     void addToSchedule(int, MSchedGraphSBNode*);
43
44   public:
45     MSScheduleSB(int num) : numIssue(num) {}
46     MSScheduleSB() : numIssue(4) {}
47     bool insert(MSchedGraphSBNode *node, int cycle, int II);
48     int getStartCycle(MSchedGraphSBNode *node);
49     void clear() { schedule.clear(); resourceNumPerCycle.clear(); kernel.clear(); }
50     std::vector<std::pair<MachineInstr*, int> >* getKernel() { return &kernel; }
51     bool constructKernel(int II, std::vector<MSchedGraphSBNode*> &branches, std::map<const MachineInstr*, unsigned> &indVar);
52     int getMaxStage() { return maxStage; }
53     bool defPreviousStage(Value *def, int stage);
54
55     //iterators
56     typedef std::map<int, std::vector<MSchedGraphSBNode*> >::iterator schedule_iterator;
57     typedef std::map<int, std::vector<MSchedGraphSBNode*> >::const_iterator schedule_const_iterator;
58     schedule_iterator begin() { return schedule.begin(); };
59     schedule_iterator end() { return schedule.end(); };
60     void print(std::ostream &os) const;
61     void printSchedule(std::ostream &os) const;
62
63     typedef std::vector<std::pair<MachineInstr*, int> >::iterator kernel_iterator;
64     typedef std::vector<std::pair<MachineInstr*, int> >::const_iterator kernel_const_iterator;
65     kernel_iterator kernel_begin() { return kernel.begin(); }
66     kernel_iterator kernel_end() { return kernel.end(); }
67
68   };
69
70 }
71
72
73 #endif