mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-27 14:24:40 +00:00
Factor out scoreboard into separate class. This way we might have several different score boards.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@100644 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -22,35 +22,59 @@
|
||||
|
||||
namespace llvm {
|
||||
class ExactHazardRecognizer : public ScheduleHazardRecognizer {
|
||||
// ScoreBoard to track function unit usage. ScoreBoard[0] is a
|
||||
// mask of the FUs in use in the cycle currently being
|
||||
// schedule. ScoreBoard[1] is a mask for the next cycle. The
|
||||
// ScoreBoard is used as a circular buffer with the current cycle
|
||||
// indicated by Head.
|
||||
class ScoreBoard {
|
||||
unsigned *Data;
|
||||
|
||||
// The maximum number of cycles monitored by the Scoreboard. This
|
||||
// value is determined based on the target itineraries to ensure
|
||||
// that all hazards can be tracked.
|
||||
size_t Depth;
|
||||
// Indices into the Scoreboard that represent the current cycle.
|
||||
size_t Head;
|
||||
public:
|
||||
ScoreBoard():Data(NULL), Depth(0), Head(0) { }
|
||||
~ScoreBoard() {
|
||||
delete[] Data;
|
||||
}
|
||||
|
||||
size_t getDepth() const { return Depth; }
|
||||
unsigned& operator[](size_t idx) const {
|
||||
assert(Depth && "ScoreBoard was not initialized properly!");
|
||||
|
||||
return Data[(Head + idx) % Depth];
|
||||
}
|
||||
|
||||
void reset(size_t d = 1) {
|
||||
if (Data == NULL) {
|
||||
Depth = d;
|
||||
Data = new unsigned[Depth];
|
||||
}
|
||||
|
||||
memset(Data, 0, Depth * sizeof(Data[0]));
|
||||
Head = 0;
|
||||
}
|
||||
|
||||
void advance() {
|
||||
Head = (Head + 1) % Depth;
|
||||
}
|
||||
|
||||
// Print the scoreboard.
|
||||
void dump() const;
|
||||
};
|
||||
|
||||
// Itinerary data for the target.
|
||||
const InstrItineraryData &ItinData;
|
||||
|
||||
// Scoreboard to track function unit usage. Scoreboard[0] is a
|
||||
// mask of the FUs in use in the cycle currently being
|
||||
// schedule. Scoreboard[1] is a mask for the next cycle. The
|
||||
// Scoreboard is used as a circular buffer with the current cycle
|
||||
// indicated by ScoreboardHead.
|
||||
unsigned *Scoreboard;
|
||||
|
||||
// The maximum number of cycles monitored by the Scoreboard. This
|
||||
// value is determined based on the target itineraries to ensure
|
||||
// that all hazards can be tracked.
|
||||
unsigned ScoreboardDepth;
|
||||
|
||||
// Indices into the Scoreboard that represent the current cycle.
|
||||
unsigned ScoreboardHead;
|
||||
|
||||
// Return the scoreboard index to use for 'offset' cycles in the
|
||||
// future. 'offset' of 0 returns ScoreboardHead.
|
||||
unsigned getFutureIndex(unsigned offset);
|
||||
|
||||
// Print the scoreboard.
|
||||
void dumpScoreboard();
|
||||
ScoreBoard Scoreboard;
|
||||
|
||||
public:
|
||||
ExactHazardRecognizer(const InstrItineraryData &ItinData);
|
||||
~ExactHazardRecognizer();
|
||||
|
||||
|
||||
virtual HazardType getHazardType(SUnit *SU);
|
||||
virtual void Reset();
|
||||
virtual void EmitInstruction(SUnit *SU);
|
||||
|
Reference in New Issue
Block a user