Go to the documentation of this file.
50 #include "debug/Activity.hh"
51 #include "debug/O3PipeView.hh"
52 #include "debug/Rename.hh"
53 #include "params/BaseO3CPU.hh"
63 iewToRenameDelay(params.iewToRenameDelay),
64 decodeToRenameDelay(params.decodeToRenameDelay),
65 commitToRenameDelay(params.commitToRenameDelay),
66 renameWidth(params.renameWidth),
67 numThreads(params.numThreads),
71 fatal(
"renameWidth (%d) is larger than compiled limit (%d),\n"
72 "\tincrease MaxWidth in src/cpu/o3/limits.hh\n",
77 for (uint32_t tid = 0; tid <
MaxThreads; tid++) {
85 stalls[tid] = {
false,
false};
98 : statistics::
Group(parent,
"rename"),
99 ADD_STAT(squashCycles, statistics::units::Cycle::get(),
100 "Number of cycles rename is squashing"),
101 ADD_STAT(idleCycles, statistics::units::Cycle::get(),
102 "Number of cycles rename is idle"),
103 ADD_STAT(blockCycles, statistics::units::Cycle::get(),
104 "Number of cycles rename is blocking"),
105 ADD_STAT(serializeStallCycles, statistics::units::Cycle::get(),
106 "count of cycles rename stalled for serializing inst"),
107 ADD_STAT(runCycles, statistics::units::Cycle::get(),
108 "Number of cycles rename is running"),
109 ADD_STAT(unblockCycles, statistics::units::Cycle::get(),
110 "Number of cycles rename is unblocking"),
112 "Number of instructions processed by rename"),
114 "Number of squashed instructions processed by rename"),
116 "Number of times rename has blocked due to ROB full"),
118 "Number of times rename has blocked due to IQ full"),
120 "Number of times rename has blocked due to LQ full" ),
122 "Number of times rename has blocked due to SQ full"),
123 ADD_STAT(fullRegistersEvents, statistics::units::
Count::get(),
124 "Number of times there has been no free registers"),
126 "Number of destination operands rename has renamed"),
128 "Number of register rename lookups that rename has made"),
130 "Number of integer rename lookups"),
132 "Number of floating rename lookups"),
134 "Number of vector rename lookups"),
136 "Number of vector predicate rename lookups"),
138 "Number of matrix rename lookups"),
140 "Number of HB maps that are committed"),
142 "Number of HB maps that are undone due to squashing"),
144 "count of serializing insts renamed"),
146 "count of temporary serializing insts renamed"),
148 "count of insts added to the skid buffer")
314 !
insts[tid].empty() ||
332 assert(
insts[tid].empty());
341 DPRINTF(
Rename,
"[tid:%i] [squash sn:%llu] Squashing instructions.\n",
356 "Rename will resume serializing after squash\n",
398 bool status_change =
false;
408 while (threads != end) {
415 rename(status_change, tid);
423 DPRINTF(Activity,
"Activity this cycle.\n");
429 while (threads != end) {
433 if (
fromCommit->commitInfo[tid].doneSeqNum != 0 &&
476 toDecode->renameUnblock[tid] =
false;
482 toDecode->renameUnblock[tid] =
false;
490 "Not blocked, so attempting to run stage.\n",
519 if (insts_available == 0) {
520 DPRINTF(
Rename,
"[tid:%i] Nothing to do, breaking out early.\n",
535 int min_free_entries = free_rob_entries;
539 if (free_iq_entries < min_free_entries) {
540 min_free_entries = free_iq_entries;
545 if (min_free_entries <= 0) {
547 "[tid:%i] Blocking due to no free ROB/IQ/ entries.\n"
548 "ROB has %i free entries.\n"
549 "IQ has %i free entries.\n",
550 tid, free_rob_entries, free_iq_entries);
559 }
else if (min_free_entries < insts_available) {
562 "Will have to block this cycle. "
563 "%i insts available, "
564 "but only %i insts can be renamed due to ROB/IQ/LSQ limits.\n",
565 tid, insts_available, min_free_entries);
567 insts_available = min_free_entries;
579 "%i available instructions to send iew.\n",
580 tid, insts_available);
584 "%i insts pipelining from Rename | "
585 "%i insts dispatched to IQ last cycle.\n",
593 }
else if (!insts_to_rename.empty()) {
594 insts_to_rename.front()->setSerializeBefore();
598 int renamed_insts = 0;
601 DPRINTF(
Rename,
"[tid:%i] Sending instructions to IEW.\n", tid);
603 assert(!insts_to_rename.empty());
612 if (inst->isLoad()) {
614 DPRINTF(
Rename,
"[tid:%i] Cannot rename due to no free LQ\n",
622 if (inst->isStore() || inst->isAtomic()) {
624 DPRINTF(
Rename,
"[tid:%i] Cannot rename due to no free SQ\n",
632 insts_to_rename.pop_front();
637 "Removing [sn:%llu] PC:%s from rename skidBuffer\n",
638 tid, inst->seqNum, inst->pcState());
641 if (inst->isSquashed()) {
644 "instruction %i with PC %s is squashed, skipping.\n",
645 tid, inst->seqNum, inst->pcState());
657 "Processing instruction [sn:%llu] with PC %s.\n",
658 tid, inst->seqNum, inst->pcState());
665 " lack of free physical registers to rename to.\n");
667 insts_to_rename.push_front(inst);
683 if (inst->isSerializeBefore() && !inst->isSerializeHandled()) {
684 DPRINTF(
Rename,
"Serialize before instruction encountered.\n");
686 if (!inst->isTempSerializeBefore()) {
688 inst->setSerializeHandled();
702 }
else if ((inst->isStoreConditional() || inst->isSerializeAfter()) &&
703 !inst->isSerializeHandled()) {
704 DPRINTF(
Rename,
"Serialize after instruction encountered.\n");
708 inst->setSerializeHandled();
717 if (inst->isAtomic() || inst->isStore()) {
719 }
else if (inst->isLoad()) {
749 if (insts_available) {
755 toDecode->renameUnblock[tid] =
false;
764 while (!
insts[tid].empty()) {
765 inst =
insts[tid].front();
767 insts[tid].pop_front();
769 assert(tid == inst->threadNumber);
771 DPRINTF(
Rename,
"[tid:%i] Inserting [sn:%llu] PC: %s into Rename "
772 "skidBuffer\n", tid, inst->seqNum, inst->pcState());
780 InstQueue::iterator it;
781 warn(
"Skidbuffer contents:\n");
783 warn(
"[tid:%i] %s [sn:%llu].\n", tid,
784 (*it)->staticInst->disassemble(
785 inst->pcState().instAddr()),
788 panic(
"Skidbuffer Exceeded Max Size");
796 for (
int i = 0;
i < insts_from_decode; ++
i) {
798 insts[inst->threadNumber].push_back(inst);
800 if (debug::O3PipeView) {
801 inst->renameTick =
curTick() - inst->fetchTick;
813 while (threads != end) {
826 bool any_unblocking =
false;
831 while (threads != end) {
835 any_unblocking =
true;
841 if (any_unblocking) {
845 DPRINTF(Activity,
"Activating stage.\n");
854 DPRINTF(Activity,
"Deactivating stage.\n");
878 toDecode->renameUnblock[tid] =
false;
904 toDecode->renameUnblock[tid] =
true;
924 hb_it->instSeqNum > squashed_seq_num) {
927 DPRINTF(
Rename,
"[tid:%i] Removing history entry with sequence "
928 "number %i (archReg: %d, newPhysReg: %d, prevPhysReg: %d).\n",
929 tid, hb_it->instSeqNum, hb_it->archReg.index(),
930 hb_it->newPhysReg->index(), hb_it->prevPhysReg->index());
938 if (hb_it->newPhysReg != hb_it->prevPhysReg) {
962 DPRINTF(
Rename,
"[tid:%i] Removing a committed instruction from the "
963 "history buffer %u (size=%i), until [sn:%llu].\n",
973 }
else if (hb_it->instSeqNum > inst_seq_num) {
975 "Old sequence number encountered. "
976 "Ensure that a syscall happened recently.\n",
987 hb_it->instSeqNum <= inst_seq_num) {
989 DPRINTF(
Rename,
"[tid:%i] Freeing up older rename of reg %i (%s), "
991 tid, hb_it->prevPhysReg->index(),
992 hb_it->prevPhysReg->className(),
998 if (hb_it->newPhysReg != hb_it->prevPhysReg) {
1013 unsigned num_src_regs = inst->numSrcRegs();
1018 for (
int src_idx = 0; src_idx < num_src_regs; src_idx++) {
1019 const RegId& src_reg = inst->srcRegIdx(src_idx);
1023 renamed_reg = map->
lookup(flat_reg);
1053 "Looking up %s arch reg %i, got phys reg %i (%s)\n",
1058 inst->renameSrcReg(src_idx, renamed_reg);
1064 "Register %d (flat: %d) (%s) is ready.\n",
1068 inst->markSrcRegReady(src_idx);
1072 "Register %d (flat: %d) (%s) is not ready.\n",
1086 unsigned num_dest_regs = inst->numDestRegs();
1090 for (
int dest_idx = 0; dest_idx < num_dest_regs; dest_idx++) {
1091 const RegId& dest_reg = inst->destRegIdx(dest_idx);
1097 rename_result = map->
rename(flat_dest_regid);
1099 inst->flattenedDestIdx(dest_idx, flat_dest_regid);
1105 "Renaming arch reg %i (%s) to physical reg %i (%i).\n",
1107 rename_result.first->index(),
1108 rename_result.first->flatIndex());
1112 rename_result.first,
1113 rename_result.second);
1118 "Adding instruction to history buffer (size=%i).\n",
1127 inst->renameDestReg(dest_idx,
1128 rename_result.first,
1129 rename_result.second);
1163 "calcFreeLQEntries: free lqEntries: %d, loadsInProgress: %d, "
1164 "loads dispatchedToLQ: %d\n",
1166 fromIEW->iewInfo[tid].dispatchedToLQ);
1176 "storesInProgress: %d, stores dispatchedToSQ: %d\n",
1178 fromIEW->iewInfo[tid].dispatchedToSQ);
1185 unsigned inst_count = 0;
1202 if (
fromIEW->iewUnblock[tid]) {
1211 bool ret_val =
false;
1214 DPRINTF(
Rename,
"[tid:%i] Stall from IEW stage detected.\n", tid);
1217 DPRINTF(
Rename,
"[tid:%i] Stall: ROB has 0 free entries.\n", tid);
1220 DPRINTF(
Rename,
"[tid:%i] Stall: IQ has 0 free entries.\n", tid);
1223 DPRINTF(
Rename,
"[tid:%i] Stall: LSQ has 0 free entries.\n", tid);
1225 }
else if (
renameMap[tid]->numFreeEntries() <= 0) {
1226 DPRINTF(
Rename,
"[tid:%i] Stall: RenameMap has 0 free entries.\n", tid);
1230 DPRINTF(
Rename,
"[tid:%i] Stall: Serialize stall and ROB is not "
1242 if (
fromIEW->iewInfo[tid].usedIQ)
1245 if (
fromIEW->iewInfo[tid].usedLSQ) {
1257 "Free LQ: %i, Free SQ: %i, FreeRM %i(%i %i %i %i %i %i %i)\n",
1272 DPRINTF(
Rename,
"[tid:%i] %i instructions not yet in ROB\n",
1293 DPRINTF(
Rename,
"[tid:%i] Squashing instructions due to squash from "
1306 DPRINTF(
Rename,
"[tid:%i] Done blocking, switching to unblocking.\n",
1321 "[tid:%i] Done squashing, switching to serialize.\n", tid);
1327 "[tid:%i] Done squashing, switching to unblocking.\n",
1332 DPRINTF(
Rename,
"[tid:%i] Done squashing, switching to running.\n",
1341 DPRINTF(
Rename,
"[tid:%i] Done with serialize stall, switching to "
1342 "unblocking.\n", tid);
1350 DPRINTF(
Rename,
"[tid:%i] Processing instruction [%lli] with "
1351 "PC %s.\n", tid, serial_inst->seqNum, serial_inst->pcState());
1354 serial_inst->clearSerializeBefore();
1359 insts[tid].push_front(serial_inst);
1362 DPRINTF(
Rename,
"[tid:%i] Instruction must be processed by rename."
1363 " Adding to front of list.\n", tid);
1378 if (inst_list.empty()) {
1385 inst_list.front()->setSerializeBefore();
1405 panic(
"Rename full stall stat should be incremented for a reason!");
1420 cprintf(
"Seq num: %i\nArch reg[%s]: %i New phys reg:"
1421 " %i[%s] Old phys reg: %i[%s]\n",
1422 (*buf_it).instSeqNum,
1423 (*buf_it).archReg.className(),
1424 (*buf_it).archReg.index(),
1425 (*buf_it).newPhysReg->index(),
1426 (*buf_it).newPhysReg->className(),
1427 (*buf_it).prevPhysReg->index(),
1428 (*buf_it).prevPhysReg->className());
bool isDrained() const
Has the stage drained?
Tick curTick()
The universal simulation clock.
#define fatal(...)
This implements a cprintf based fatal() function.
int decodeToRenameDelay
Delay between decode and rename, in ticks.
RegId flatten(const BaseISA &isa) const
FreeEntries freeEntries[MaxThreads]
Per-thread tracking of the number of free entries of back-end structures.
int storesInProgress[MaxThreads]
Count of Store instructions in progress that have been sent off to the IQ and ROB,...
void tick()
Ticks rename, which processes all input signals and attempts to rename as many instructions as possib...
bool serializeOnNextInst[MaxThreads]
Records if rename needs to serialize on the next instruction for any thread.
void drainSanityCheck() const
Perform sanity checks after a drain.
void squash(const InstSeqNum &squash_seq_num, ThreadID tid)
Squashes all instructions in a thread.
IEW * iew_ptr
Pointer to IEW stage.
void cprintf(const char *format, const Args &...args)
int getNumPinnedWrites() const
void dumpHistory()
Debugging function used to dump history buffer of renamings.
void setRenameQueue(TimeBuffer< RenameStruct > *rq_ptr)
Sets pointer to time buffer used to communicate to the next stage.
int calcFreeROBEntries(ThreadID tid)
Calculates the number of free ROB entries for a specific thread.
unsigned validInsts()
Returns the number of valid instructions coming from decode.
statistics::Scalar blockCycles
Stat for total number of cycles spent blocking.
@ VecElemClass
Vector Register Native Elem lane.
bool getReg(PhysRegIdPtr phys_reg) const
Checks if the register is ready.
void setRenameMap(UnifiedRenameMap rm_ptr[MaxThreads])
Sets pointer to rename maps (per-thread structures).
statistics::Scalar runCycles
Stat for total number of cycles spent running normally.
bool wroteToTimeBuffer
Variable that tracks if decode has written to the time buffer this cycle.
RenameStatus _status
Rename status.
bool resumeSerialize
Whether or not rename needs to resume a serialize instruction after squashing.
int instsInProgress[MaxThreads]
Count of instructions in progress that have been sent off to the IQ and ROB, but are not yet included...
void skidInsert(ThreadID tid)
Inserts unused instructions from a given thread into the skid buffer, to be renamed once rename unblo...
unsigned commitToRenameDelay
Delay between commit and rename, in ticks.
void removeFromHistory(InstSeqNum inst_seq_num, ThreadID tid)
Removes a committed instruction's rename history.
RenameStats(statistics::Group *parent)
UnifiedFreeList * freeList
Free list interface.
@ CCRegClass
Condition-code register.
TimeBuffer< RenameStruct > * renameQueue
Rename instruction queue.
void setScoreboard(Scoreboard *_scoreboard)
Sets pointer to the scoreboard.
statistics::Scalar renamedInsts
Stat for total number of renamed instructions.
statistics::Scalar vecPredLookups
std::list< RenameHistory > historyBuffer[MaxThreads]
A per-thread list of all destination register renames, used to either undo rename mappings or free ol...
bool block(ThreadID tid)
Switches rename to blocking, and signals back that rename has become blocked.
bool unblock(ThreadID tid)
Switches rename to unblocking if the skid buffer is empty, and signals back that rename has unblocked...
TimeBuffer< TimeStruct > * timeBuffer
Pointer to main time buffer used for backwards communication.
void renameDestRegs(const DynInstPtr &inst, ThreadID tid)
Renames the destination registers of an instruction.
ProbePointArg< SeqNumRegPair > * ppSquashInRename
To probe when an instruction is squashed and the register mapping for it needs to be undone.
FreeList class that simply holds the list of free integer and floating point registers.
statistics::Scalar fpLookups
Implements a simple scoreboard to track which registers are ready.
ThreadID numThreads
The number of threads active in rename.
bool skidsEmpty()
Returns if all of the skid buffers are empty.
statistics::Scalar SQFullEvents
Stat for total number of times that the SQ starts a stall in rename.
void sortInsts()
Separates instructions from decode into individual lists of instructions sorted by thread.
unsigned skidBufferMax
The maximum skid buffer size.
statistics::Scalar undoneMaps
Stat for total number of mappings that were undone due to a squash.
statistics::Scalar serializeStallCycles
Stat for total number of cycles spent stalling for a serializing inst.
statistics::Scalar skidInsts
Number of instructions inserted into skid buffers.
statistics::Scalar unblockCycles
Stat for total number of cycles spent unblocking.
int calcFreeLQEntries(ThreadID tid)
Calculates the number of free LQ entries for a specific thread.
size_t numROBFreeEntries(ThreadID tid)
Returns the number of free ROB entries for a specific thread.
statistics::Scalar serializing
Number of serialize instructions handled.
void deactivateStage(const StageIdx idx)
Changes a stage's status to inactive within the activity recorder.
TimeBuffer< DecodeStruct > * decodeQueue
Decode instruction queue interface.
void rename(bool &status_change, ThreadID tid)
Determines what to do based on rename's current status.
InstructionQueue instQueue
Instruction queue.
@ FloatRegClass
Floating-point register.
void clearStates(ThreadID tid)
Clear all thread-specific states.
void renameSrcRegs(const DynInstPtr &inst, ThreadID tid)
Renames the source registers of an instruction.
unsigned renameWidth
Rename width, in instructions.
Scoreboard * scoreboard
Pointer to the scoreboard.
void setNumPinnedWrites(int num_writes)
const RegIndex & flatIndex() const
Flat index accessor.
O3CPU class, has each of the stages (fetch through commit) within it, as well as all of the time buff...
Stalls stalls[MaxThreads]
Tracks which stages are telling decode to stall.
ThreadContext is the external interface to all thread state for anything outside of the CPU.
virtual std::string name() const
@ MatRegClass
Matrix Register.
std::string name() const
Returns the name of rename.
#define ADD_STAT(n,...)
Convenience macro to add a stat to a statistics group.
void updateStatus()
Updates overall rename status based on all of the threads' statuses.
statistics::Scalar idleCycles
Stat for total number of cycles spent idle.
TimeBuffer< DecodeStruct >::wire fromDecode
Wire to get decode's output from decode queue.
ProbePointArg< DynInstPtr > * ppRename
To probe when register renaming for an instruction is complete.
statistics::Scalar tempSerializing
Number of instructions marked as temporarily serializing.
void doSquash(const InstSeqNum &squash_seq_num, ThreadID tid)
Executes actual squash, removing squashed instructions.
bool checkStall(ThreadID tid)
Checks if any stages are telling rename to block.
void resetStage()
Reset this pipeline stage.
Holds the information for each destination register rename.
void activateStage(const StageIdx idx)
Changes a stage's status to active within the activity recorder.
unsigned numFreeLoadEntries()
Returns the number of free load entries.
unsigned numFreeEntries()
Returns total number of free entries.
InstQueue insts[MaxThreads]
Queue of all instructions coming from decode this cycle.
int calcFreeIQEntries(ThreadID tid)
Calculates the number of free IQ entries for a specific thread.
constexpr const char * className() const
Return a const char* with the register class name.
static constexpr int MaxWidth
int loadsInProgress[MaxThreads]
Count of Load instructions in progress that have been sent off to the IQ and ROB, but are not yet inc...
statistics::Scalar lookups
Stat for total number of source register rename lookups.
unsigned toIEWIndex
The index of the instruction in the time buffer to IEW that rename is currently using.
UnifiedRenameMap * renameMap[MaxThreads]
Rename map interface.
statistics::Scalar fullRegistersEvents
Stat for total number of times that rename runs out of free registers to use to rename.
statistics::Scalar renamedOperands
Stat for total number of renamed destination registers.
void unsetReg(PhysRegIdPtr phys_reg)
Sets the register as not ready.
statistics::Scalar matLookups
statistics::Scalar IQFullEvents
Stat for total number of times that the IQ starts a stall in rename.
Rename(CPU *_cpu, const BaseO3CPUParams ¶ms)
Rename constructor.
void setTimeBuffer(TimeBuffer< TimeStruct > *tb_ptr)
Sets the main backwards communication time buffer pointer.
ProbePointArg generates a point for the class of Arg.
void serializeAfter(InstQueue &inst_list, ThreadID tid)
Either serializes on the next instruction available in the InstQueue, or records that it must seriali...
@ IntRegClass
Integer register.
ProbeManager * getProbeManager()
Get the probe manager for this object.
static constexpr int MaxThreads
Rename handles both single threaded and SMT rename.
void activityThisCycle()
Records that there was time buffer activity this cycle.
int iewToRenameDelay
Delay between iew and rename, in ticks.
gem5::o3::Rename::RenameStats stats
statistics::Scalar ROBFullEvents
Stat for total number of times that the ROB starts a stall in rename.
void incrFullStat(const FullSource &source)
Function used to increment the stat that corresponds to the source of the stall.
@ MiscRegClass
Control (misc) register.
Derived & prereq(const Stat &prereq)
Set the prerequisite stat and marks this stat to print at the end of simulation.
int calcFreeSQEntries(ThreadID tid)
Calculates the number of free SQ entries for a specific thread.
statistics::Scalar vecLookups
void setDecodeQueue(TimeBuffer< DecodeStruct > *dq_ptr)
Sets pointer to time buffer coming from decode.
TimeBuffer< TimeStruct >::wire fromCommit
Wire to get commit's output from backwards time buffer.
bool emptyROB[MaxThreads]
Records if the ROB is empty.
unsigned numFreeStoreEntries()
Returns the number of free store entries.
PhysRegIdPtr lookup(const RegId &arch_reg) const
Look up the physical register mapped to an architectural register.
bool checkSignalsAndUpdate(ThreadID tid)
Checks the signals and updates the status.
void startupStage()
Initializes variables for the stage.
constexpr RegIndex index() const
Visible RegId methods.
void setFreeList(UnifiedFreeList *fl_ptr)
Sets pointer to the free list.
statistics::Scalar committedMaps
Stat for total number of committed renaming mappings.
bool blockThisCycle
Whether or not rename needs to block this cycle.
FullSource
Enum to record the source of a structure full stall.
TimeBuffer< TimeStruct >::wire fromIEW
Wire to get IEW's output from backwards time buffer.
void readStallSignals(ThreadID tid)
Reads signals telling rename to block/unblock.
void regProbePoints()
Registers probes.
DynInstPtr serializeInst[MaxThreads]
The serialize instruction that rename has stalled on.
Derived & flags(Flags _flags)
Set the flags and marks this stat to print at the end of simulation.
@ VecRegClass
Vector Register.
constexpr RegIndex index() const
Index accessors.
LSQ ldstQueue
Load / store queue.
virtual BaseISA * getIsaPtr() const =0
void renameInsts(ThreadID tid)
Renames instructions for the given thread.
statistics::Scalar squashedInsts
Stat for total number of squashed instructions that rename discards.
statistics::Scalar squashCycles
Stat for total number of cycles spent squashing.
TimeBuffer< TimeStruct >::wire toDecode
Wire to write infromation heading to previous stages.
Reference material can be found at the JEDEC website: UFS standard http://www.jedec....
constexpr RegClassType classValue() const
const FlagsType total
Print the total.
void takeOverFrom()
Takes over from another CPU's thread.
std::list< ThreadID > * activeThreads
Pointer to the list of active threads.
statistics::Scalar LQFullEvents
Stat for total number of times that the LQ starts a stall in rename.
statistics::Scalar intLookups
constexpr const char * className() const
Return a const char* with the register class name.
RenameInfo rename(const RegId &arch_reg)
Tell rename map to get a new free physical register to remap the specified architectural register.
TimeBuffer< RenameStruct >::wire toIEW
Wire to write any information heading to IEW.
ThreadStatus renameStatus[MaxThreads]
Per-thread status.
bool resumeUnblocking
Whether or not rename needs to resume clearing out the skidbuffer after squashing.
void readFreeEntries(ThreadID tid)
Gets the number of free entries for a specific thread.
void addReg(PhysRegIdPtr freed_reg)
Adds a register back to the free list.
int16_t ThreadID
Thread index/ID type.
Commit * commit_ptr
Pointer to commit stage.
Register ID: describe an architectural register with its class and index.
InstQueue skidBuffer[MaxThreads]
Skid buffer between rename and decode.
#define panic(...)
This implements a cprintf based panic() function.
void setEntry(const RegId &arch_reg, PhysRegIdPtr phys_reg)
Update rename map with a specific mapping.
void setActiveThreads(std::list< ThreadID > *at_ptr)
Sets pointer to list of active threads.
Unified register rename map for all classes of registers.
Generated on Sun Jul 30 2023 01:56:53 for gem5 by doxygen 1.8.17