Go to the documentation of this file.
42 #ifndef __CPU_O3_RENAME_IMPL_HH__
43 #define __CPU_O3_RENAME_IMPL_HH__
47 #include "arch/registers.hh"
48 #include "config/the_isa.hh"
51 #include "debug/Activity.hh"
52 #include "debug/Rename.hh"
53 #include "debug/O3PipeView.hh"
54 #include "params/DerivO3CPU.hh"
59 iewToRenameDelay(params.iewToRenameDelay),
60 decodeToRenameDelay(params.decodeToRenameDelay),
61 commitToRenameDelay(params.commitToRenameDelay),
62 renameWidth(params.renameWidth),
63 commitWidth(params.commitWidth),
64 numThreads(params.numThreads),
68 fatal(
"renameWidth (%d) is larger than compiled limit (%d),\n"
69 "\tincrease MaxWidth in src/cpu/o3/impl.hh\n",
74 for (uint32_t tid = 0; tid < Impl::MaxThreads; tid++) {
82 stalls[tid] = {
false,
false};
92 return cpu->name() +
".rename";
97 :
Stats::Group(parent,
"rename"),
99 "Number of cycles rename is squashing"),
103 "count of cycles rename stalled for serializing inst"),
106 "Number of cycles rename is unblocking"),
108 "Number of instructions processed by rename"),
110 "Number of squashed instructions processed by rename"),
112 "Number of times rename has blocked due to ROB full"),
114 "Number of times rename has blocked due to IQ full"),
116 "Number of times rename has blocked due to LQ full" ),
118 "Number of times rename has blocked due to SQ full"),
120 "Number of times there has been no free registers"),
122 "Number of destination operands rename has renamed"),
124 "Number of register rename lookups that rename has made"),
129 "Number of vector predicate rename lookups"),
131 "Number of HB maps that are committed"),
133 "Number of HB maps that are undone due to squashing"),
136 "count of temporary serializing insts renamed"),
138 "count of insts added to the skid buffer")
170 template <
class Impl>
179 template <
class Impl>
195 template <
class Impl>
205 template <
class Impl>
215 template <
class Impl>
222 template <
class Impl>
244 template <
class Impl>
282 template <
class Impl>
290 template <
class Impl>
304 template <
class Impl>
312 !
insts[tid].empty() ||
319 template <
class Impl>
326 template <
class Impl>
332 assert(
insts[tid].empty());
338 template <
class Impl>
342 DPRINTF(Rename,
"[tid:%i] [squash sn:%llu] Squashing instructions.\n",
356 DPRINTF(Rename,
"[tid:%i] [squash sn:%llu] "
357 "Rename will resume serializing after squash\n",
392 template <
class Impl>
400 bool status_change =
false;
410 while (threads != end) {
413 DPRINTF(Rename,
"Processing [tid:%i]\n", tid);
417 rename(status_change, tid);
425 DPRINTF(Activity,
"Activity this cycle.\n");
426 cpu->activityThisCycle();
431 while (threads != end) {
435 if (
fromCommit->commitInfo[tid].doneSeqNum != 0 &&
479 toDecode->renameUnblock[tid] =
false;
485 toDecode->renameUnblock[tid] =
false;
493 "Not blocked, so attempting to run stage.\n",
512 template <
class Impl>
523 if (insts_available == 0) {
524 DPRINTF(Rename,
"[tid:%i] Nothing to do, breaking out early.\n",
539 int min_free_entries = free_rob_entries;
543 if (free_iq_entries < min_free_entries) {
544 min_free_entries = free_iq_entries;
549 if (min_free_entries <= 0) {
551 "[tid:%i] Blocking due to no free ROB/IQ/ entries.\n"
552 "ROB has %i free entries.\n"
553 "IQ has %i free entries.\n",
554 tid, free_rob_entries, free_iq_entries);
563 }
else if (min_free_entries < insts_available) {
566 "Will have to block this cycle. "
567 "%i insts available, "
568 "but only %i insts can be renamed due to ROB/IQ/LSQ limits.\n",
569 tid, insts_available, min_free_entries);
571 insts_available = min_free_entries;
583 "%i available instructions to send iew.\n",
584 tid, insts_available);
588 "%i insts pipelining from Rename | "
589 "%i insts dispatched to IQ last cycle.\n",
597 }
else if (!insts_to_rename.empty()) {
598 insts_to_rename.front()->setSerializeBefore();
602 int renamed_insts = 0;
605 DPRINTF(Rename,
"[tid:%i] Sending instructions to IEW.\n", tid);
607 assert(!insts_to_rename.empty());
615 if (inst->isLoad()) {
617 DPRINTF(Rename,
"[tid:%i] Cannot rename due to no free LQ\n",
625 if (inst->isStore() || inst->isAtomic()) {
627 DPRINTF(Rename,
"[tid:%i] Cannot rename due to no free SQ\n",
635 insts_to_rename.pop_front();
640 "Removing [sn:%llu] PC:%s from rename skidBuffer\n",
641 tid, inst->seqNum, inst->pcState());
644 if (inst->isSquashed()) {
647 "instruction %i with PC %s is squashed, skipping.\n",
648 tid, inst->seqNum, inst->pcState());
660 "Processing instruction [sn:%llu] with PC %s.\n",
661 tid, inst->seqNum, inst->pcState());
665 if (!
renameMap[tid]->canRename(inst->numIntDestRegs(),
666 inst->numFPDestRegs(),
667 inst->numVecDestRegs(),
668 inst->numVecElemDestRegs(),
669 inst->numVecPredDestRegs(),
670 inst->numCCDestRegs())) {
673 " lack of free physical registers to rename to.\n");
675 insts_to_rename.push_front(inst);
691 if (inst->isSerializeBefore() && !inst->isSerializeHandled()) {
692 DPRINTF(Rename,
"Serialize before instruction encountered.\n");
694 if (!inst->isTempSerializeBefore()) {
696 inst->setSerializeHandled();
710 }
else if ((inst->isStoreConditional() || inst->isSerializeAfter()) &&
711 !inst->isSerializeHandled()) {
712 DPRINTF(Rename,
"Serialize after instruction encountered.\n");
716 inst->setSerializeHandled();
725 if (inst->isAtomic() || inst->isStore()) {
727 }
else if (inst->isLoad()) {
757 if (insts_available) {
763 toDecode->renameUnblock[tid] =
false;
773 while (!
insts[tid].empty()) {
774 inst =
insts[tid].front();
776 insts[tid].pop_front();
778 assert(tid == inst->threadNumber);
780 DPRINTF(Rename,
"[tid:%i] Inserting [sn:%llu] PC: %s into Rename "
781 "skidBuffer\n", tid, inst->seqNum, inst->pcState());
790 typename InstQueue::iterator it;
791 warn(
"Skidbuffer contents:\n");
794 warn(
"[tid:%i] %s [sn:%llu].\n", tid,
795 (*it)->staticInst->disassemble(inst->instAddr()),
798 panic(
"Skidbuffer Exceeded Max Size");
802 template <
class Impl>
807 for (
int i = 0;
i < insts_from_decode; ++
i) {
809 insts[inst->threadNumber].push_back(inst);
812 inst->renameTick =
curTick() - inst->fetchTick;
825 while (threads != end) {
839 bool any_unblocking =
false;
844 while (threads != end) {
848 any_unblocking =
true;
854 if (any_unblocking) {
858 DPRINTF(Activity,
"Activating stage.\n");
860 cpu->activateStage(O3CPU::RenameIdx);
867 DPRINTF(Activity,
"Deactivating stage.\n");
869 cpu->deactivateStage(O3CPU::RenameIdx);
874 template <
class Impl>
878 DPRINTF(Rename,
"[tid:%i] Blocking.\n", tid);
892 toDecode->renameUnblock[tid] =
false;
908 template <
class Impl>
912 DPRINTF(Rename,
"[tid:%i] Trying to unblock.\n", tid);
917 DPRINTF(Rename,
"[tid:%i] Done unblocking.\n", tid);
919 toDecode->renameUnblock[tid] =
true;
929 template <
class Impl>
941 hb_it->instSeqNum > squashed_seq_num) {
944 DPRINTF(Rename,
"[tid:%i] Removing history entry with sequence "
945 "number %i (archReg: %d, newPhysReg: %d, prevPhysReg: %d).\n",
946 tid, hb_it->instSeqNum, hb_it->archReg.index(),
947 hb_it->newPhysReg->index(), hb_it->prevPhysReg->index());
955 if (hb_it->newPhysReg != hb_it->prevPhysReg) {
958 renameMap[tid]->setEntry(hb_it->archReg, hb_it->prevPhysReg);
961 freeList->addReg(hb_it->newPhysReg);
983 DPRINTF(Rename,
"[tid:%i] Removing a committed instruction from the "
984 "history buffer %u (size=%i), until [sn:%llu].\n",
993 DPRINTF(Rename,
"[tid:%i] History buffer is empty.\n", tid);
995 }
else if (hb_it->instSeqNum > inst_seq_num) {
996 DPRINTF(Rename,
"[tid:%i] [sn:%llu] "
997 "Old sequence number encountered. "
998 "Ensure that a syscall happened recently.\n",
1009 hb_it->instSeqNum <= inst_seq_num) {
1011 DPRINTF(Rename,
"[tid:%i] Freeing up older rename of reg %i (%s), "
1013 tid, hb_it->prevPhysReg->index(),
1014 hb_it->prevPhysReg->className(),
1020 if (hb_it->newPhysReg != hb_it->prevPhysReg) {
1021 freeList->addReg(hb_it->prevPhysReg);
1030 template <
class Impl>
1036 unsigned num_src_regs = inst->numSrcRegs();
1040 for (
int src_idx = 0; src_idx < num_src_regs; src_idx++) {
1041 const RegId& src_reg = inst->srcRegIdx(src_idx);
1069 "Looking up %s arch reg %i, got phys reg %i (%s)\n",
1074 inst->renameSrcReg(src_idx, renamed_reg);
1080 "Register %d (flat: %d) (%s) is ready.\n",
1084 inst->markSrcRegReady(src_idx);
1088 "Register %d (flat: %d) (%s) is not ready.\n",
1097 template <
class Impl>
1103 unsigned num_dest_regs = inst->numDestRegs();
1106 for (
int dest_idx = 0; dest_idx < num_dest_regs; dest_idx++) {
1107 const RegId& dest_reg = inst->destRegIdx(dest_idx);
1108 typename RenameMap::RenameInfo rename_result;
1113 rename_result = map->rename(flat_dest_regid);
1115 inst->regs.flattenedDestIdx(dest_idx, flat_dest_regid);
1121 "Renaming arch reg %i (%s) to physical reg %i (%i).\n",
1123 rename_result.first->index(),
1124 rename_result.first->flatIndex());
1128 rename_result.first,
1129 rename_result.second);
1133 DPRINTF(Rename,
"[tid:%i] [sn:%llu] "
1134 "Adding instruction to history buffer (size=%i).\n",
1143 inst->renameDestReg(dest_idx,
1144 rename_result.first,
1145 rename_result.second);
1151 template <
class Impl>
1163 template <
class Impl>
1175 template <
class Impl>
1182 "calcFreeLQEntries: free lqEntries: %d, loadsInProgress: %d, "
1183 "loads dispatchedToLQ: %d\n",
1185 fromIEW->iewInfo[tid].dispatchedToLQ);
1189 template <
class Impl>
1195 DPRINTF(Rename,
"calcFreeSQEntries: free sqEntries: %d, storesInProgress: %d, "
1196 "stores dispatchedToSQ: %d\n",
freeEntries[tid].sqEntries,
1201 template <
class Impl>
1205 unsigned inst_count = 0;
1215 template <
class Impl>
1223 if (
fromIEW->iewUnblock[tid]) {
1229 template <
class Impl>
1233 bool ret_val =
false;
1236 DPRINTF(Rename,
"[tid:%i] Stall from IEW stage detected.\n", tid);
1239 DPRINTF(Rename,
"[tid:%i] Stall: ROB has 0 free entries.\n", tid);
1242 DPRINTF(Rename,
"[tid:%i] Stall: IQ has 0 free entries.\n", tid);
1245 DPRINTF(Rename,
"[tid:%i] Stall: LSQ has 0 free entries.\n", tid);
1247 }
else if (
renameMap[tid]->numFreeEntries() <= 0) {
1248 DPRINTF(Rename,
"[tid:%i] Stall: RenameMap has 0 free entries.\n", tid);
1252 DPRINTF(Rename,
"[tid:%i] Stall: Serialize stall and ROB is not "
1261 template <
class Impl>
1265 if (
fromIEW->iewInfo[tid].usedIQ)
1268 if (
fromIEW->iewInfo[tid].usedLSQ) {
1279 DPRINTF(Rename,
"[tid:%i] Free IQ: %i, Free ROB: %i, "
1280 "Free LQ: %i, Free SQ: %i, FreeRM %i(%i %i %i %i %i)\n",
1293 DPRINTF(Rename,
"[tid:%i] %i instructions not yet in ROB\n",
1297 template <
class Impl>
1315 DPRINTF(Rename,
"[tid:%i] Squashing instructions due to squash from "
1328 DPRINTF(Rename,
"[tid:%i] Done blocking, switching to unblocking.\n",
1343 "[tid:%i] Done squashing, switching to serialize.\n", tid);
1349 "[tid:%i] Done squashing, switching to unblocking.\n",
1354 DPRINTF(Rename,
"[tid:%i] Done squashing, switching to running.\n",
1363 DPRINTF(Rename,
"[tid:%i] Done with serialize stall, switching to "
1364 "unblocking.\n", tid);
1372 DPRINTF(Rename,
"[tid:%i] Processing instruction [%lli] with "
1373 "PC %s.\n", tid, serial_inst->seqNum, serial_inst->pcState());
1376 serial_inst->clearSerializeBefore();
1381 insts[tid].push_front(serial_inst);
1384 DPRINTF(Rename,
"[tid:%i] Instruction must be processed by rename."
1385 " Adding to front of list.\n", tid);
1397 template<
class Impl>
1401 if (inst_list.empty()) {
1408 inst_list.front()->setSerializeBefore();
1411 template <
class Impl>
1429 panic(
"Rename full stall stat should be incremented for a reason!");
1434 template <
class Impl>
1445 cprintf(
"Seq num: %i\nArch reg[%s]: %i New phys reg:"
1446 " %i[%s] Old phys reg: %i[%s]\n",
1447 (*buf_it).instSeqNum,
1448 (*buf_it).archReg.className(),
1449 (*buf_it).archReg.index(),
1450 (*buf_it).newPhysReg->index(),
1451 (*buf_it).newPhysReg->className(),
1452 (*buf_it).prevPhysReg->index(),
1453 (*buf_it).prevPhysReg->className());
1460 #endif//__CPU_O3_RENAME_IMPL_HH__
void rename(bool &status_change, ThreadID tid)
Determines what to do based on rename's current status.
int getNumPinnedWrites() const
void skidInsert(ThreadID tid)
Inserts unused instructions from a given thread into the skid buffer, to be renamed once rename unblo...
#define fatal(...)
This implements a cprintf based fatal() function.
int decodeToRenameDelay
Delay between decode and rename, in ticks.
bool checkStall(ThreadID tid)
Checks if any stages are telling rename to block.
bool skidsEmpty()
Returns if all of the skid buffers are empty.
FreeEntries freeEntries[Impl::MaxThreads]
Per-thread tracking of the number of free entries of back-end structures.
Stats::Scalar serializeStallCycles
Stat for total number of cycles spent stalling for a serializing inst.
unsigned skidBufferMax
The maximum skid buffer size.
Stats::Scalar renamedInsts
Stat for total number of renamed instructions.
int calcFreeIQEntries(ThreadID tid)
Calculates the number of free IQ entries for a specific thread.
Stats::Scalar skidInsts
Number of instructions inserted into skid buffers.
void dumpHistory()
Debugging function used to dump history buffer of renamings.
@ VecElemClass
Vector Register Native Elem lane.
const char * className() const
Return a const char* with the register class name.
void tick()
Ticks rename, which processes all input signals and attempts to rename as many instructions as possib...
int storesInProgress[Impl::MaxThreads]
Count of Store instructions in progress that have been sent off to the IQ and ROB,...
void setDecodeQueue(TimeBuffer< DecodeStruct > *dq_ptr)
Sets pointer to time buffer coming from decode.
int16_t ThreadID
Thread index/ID type.
bool emptyROB[Impl::MaxThreads]
Records if the ROB is empty.
InstQueue insts[Impl::MaxThreads]
Queue of all instructions coming from decode this cycle.
void removeFromHistory(InstSeqNum inst_seq_num, ThreadID tid)
Removes a committed instruction's rename history.
void setFreeList(FreeList *fl_ptr)
Sets pointer to the free list.
Stats::Scalar tempSerializing
Number of instructions marked as temporarily serializing.
TimeBuffer< TimeStruct >::wire toDecode
Wire to write infromation heading to previous stages.
Stats::Scalar blockCycles
Stat for total number of cycles spent blocking.
DefaultRename(O3CPU *_cpu, const DerivO3CPUParams ¶ms)
DefaultRename constructor.
TimeBuffer< DecodeStruct > * decodeQueue
Decode instruction queue interface.
TimeBuffer< DecodeStruct >::wire fromDecode
Wire to get decode's output from decode queue.
const PhysRegIndex & flatIndex() const
Flat index accessor.
void setRenameQueue(TimeBuffer< RenameStruct > *rq_ptr)
Sets pointer to time buffer used to communicate to the next stage.
virtual RegId flattenRegId(const RegId ®_id) const =0
void setTimeBuffer(TimeBuffer< TimeStruct > *tb_ptr)
Sets the main backwards communication time buffer pointer.
void readStallSignals(ThreadID tid)
Reads signals telling rename to block/unblock.
void renameInsts(ThreadID tid)
Renames instructions for the given thread.
bool checkSignalsAndUpdate(ThreadID tid)
Checks the signals and updates the status.
Stats::Scalar vecPredLookups
void notify(const Arg &arg)
called at the ProbePoint call site, passes arg to each listener.
std::list< RenameHistory > historyBuffer[Impl::MaxThreads]
A per-thread list of all destination register renames, used to either undo rename mappings or free ol...
int calcFreeSQEntries(ThreadID tid)
Calculates the number of free SQ entries for a specific thread.
void clearStates(ThreadID tid)
Clear all thread-specific states.
void resetStage()
Reset this pipeline stage.
Register ID: describe an architectural register with its class and index.
Derived & flags(Flags _flags)
Set the flags and marks this stat to print at the end of simulation.
TimeBuffer< TimeStruct >::wire fromIEW
Wire to get IEW's output from backwards time buffer.
void startupStage()
Initializes variables for the stage.
bool blockThisCycle
Whether or not rename needs to block this cycle.
Stats::Scalar undoneMaps
Stat for total number of mappings that were undone due to a squash.
void updateStatus()
Updates overall rename status based on all of the threads' statuses.
std::list< ThreadID > * activeThreads
Pointer to the list of active threads.
void setNumPinnedWrites(int num_writes)
const RegIndex & index() const
Visible RegId methods.
bool resumeUnblocking
Whether or not rename needs to resume clearing out the skidbuffer after squashing.
Stalls stalls[Impl::MaxThreads]
Tracks which stages are telling decode to stall.
@ FloatRegClass
Floating-point register.
FullSource
Enum to record the source of a structure full stall.
void takeOverFrom()
Takes over from another CPU's thread.
int calcFreeLQEntries(ThreadID tid)
Calculates the number of free LQ entries for a specific thread.
ThreadContext is the external interface to all thread state for anything outside of the CPU.
O3CPU * cpu
Pointer to CPU.
Derived & prereq(const Stat &prereq)
Set the prerequisite stat and marks this stat to print at the end of simulation.
void setScoreboard(Scoreboard *_scoreboard)
Sets pointer to the scoreboard.
Holds the information for each destination register rename.
void readFreeEntries(ThreadID tid)
Gets the number of free entries for a specific thread.
void cprintf(const char *format, const Args &...args)
Stats::Scalar unblockCycles
Stat for total number of cycles spent unblocking.
#define ADD_STAT(n,...)
Convenience macro to add a stat to a statistics group.
Scoreboard * scoreboard
Pointer to the scoreboard.
FreeList * freeList
Free list interface.
bool isDrained() const
Has the stage drained?
void incrFullStat(const FullSource &source)
Function used to increment the stat that corresponds to the source of the stall.
CPUPol::RenameMap RenameMap
bool getReg(PhysRegIdPtr phys_reg) const
Checks if the register is ready.
RenameStats(Stats::Group *parent)
DynInstPtr serializeInst[Impl::MaxThreads]
The serialize instruction that rename has stalled on.
Stats::Scalar LQFullEvents
Stat for total number of times that the LQ starts a stall in rename.
void sortInsts()
Separates instructions from decode into individual lists of instructions sorted by thread.
bool wroteToTimeBuffer
Variable that tracks if decode has written to the time buffer this cycle.
bool block(ThreadID tid)
Switches rename to blocking, and signals back that rename has become blocked.
void renameSrcRegs(const DynInstPtr &inst, ThreadID tid)
Renames the source registers of an instruction.
Stats::Scalar squashCycles
Stat for total number of cycles spent squashing.
Stats::Scalar SQFullEvents
Stat for total number of times that the SQ starts a stall in rename.
IEW * iew_ptr
Pointer to IEW stage.
void squash(const InstSeqNum &squash_seq_num, ThreadID tid)
Squashes all instructions in a thread.
void regProbePoints()
Registers probes.
Stats::Scalar squashedInsts
Stat for total number of squashed instructions that rename discards.
Stats::Scalar IQFullEvents
Stat for total number of times that the IQ starts a stall in rename.
Stats::Scalar fullRegistersEvents
Stat for total number of times that rename runs out of free registers to use to rename.
void setRenameMap(RenameMap rm_ptr[Impl::MaxThreads])
Sets pointer to rename maps (per-thread structures).
void renameDestRegs(const DynInstPtr &inst, ThreadID tid)
Renames the destination registers of an instruction.
unsigned toIEWIndex
The index of the instruction in the time buffer to IEW that rename is currently using.
Impl::DynInstPtr DynInstPtr
@ IntRegClass
Integer register.
@ CCRegClass
Condition-code register.
Stats::Scalar committedMaps
Stat for total number of committed renaming mappings.
void serializeAfter(InstQueue &inst_list, ThreadID tid)
Either serializes on the next instruction available in the InstQueue, or records that it must seriali...
bool resumeSerialize
Whether or not rename needs to resume a serialize instruction after squashing.
void doSquash(const InstSeqNum &squash_seq_num, ThreadID tid)
Executes actual squash, removing squashed instructions.
DefaultRename::RenameStats stats
@ MiscRegClass
Control (misc) register.
std::string name() const
Returns the name of rename.
@ VecRegClass
Vector Register.
TimeBuffer< RenameStruct > * renameQueue
Rename instruction queue.
const char * className() const
Return a const char* with the register class name.
Stats::Scalar runCycles
Stat for total number of cycles spent running normally.
void setActiveThreads(std::list< ThreadID > *at_ptr)
Sets pointer to list of active threads.
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.
RenameStatus _status
Rename status.
ThreadStatus renameStatus[Impl::MaxThreads]
Per-thread status.
InstQueue skidBuffer[Impl::MaxThreads]
Skid buffer between rename and decode.
RenameMap * renameMap[Impl::MaxThreads]
Rename map interface.
int instsInProgress[Impl::MaxThreads]
Count of instructions in progress that have been sent off to the IQ and ROB, but are not yet included...
Stats::Scalar idleCycles
Stat for total number of cycles spent idle.
Commit * commit_ptr
Pointer to commit stage.
#define UNIT_CYCLE
Convenience macros to declare the unit of a stat.
int calcFreeROBEntries(ThreadID tid)
Calculates the number of free ROB entries for a specific thread.
ProbePointArg< DynInstPtr > * ppRename
To probe when register renaming for an instruction is complete.
CPUPol::FreeList FreeList
void drainSanityCheck() const
Perform sanity checks after a drain.
Tick curTick()
The universal simulation clock.
Stats::Scalar ROBFullEvents
Stat for total number of times that the ROB starts a stall in rename.
const RegIndex & index() const
Index accessors.
unsigned validInsts()
Returns the number of valid instructions coming from decode.
unsigned commitToRenameDelay
Delay between commit and rename, in ticks.
const FlagsType total
Print the total.
bool serializeOnNextInst[Impl::MaxThreads]
Records if rename needs to serialize on the next instruction for any thread.
TimeBuffer< RenameStruct >::wire toIEW
Wire to write any information heading to IEW.
ThreadID numThreads
The number of threads active in rename.
const RegClass & classValue() const
Class accessor.
Stats::Scalar serializing
Number of serialize instructions handled.
Stats::Scalar lookups
Stat for total number of source register rename lookups.
int loadsInProgress[Impl::MaxThreads]
Count of Load instructions in progress that have been sent off to the IQ and ROB, but are not yet inc...
ProbePointArg< SeqNumRegPair > * ppSquashInRename
To probe when an instruction is squashed and the register mapping for it needs to be undone.
Implements a simple scoreboard to track which registers are ready.
void unsetReg(PhysRegIdPtr phys_reg)
Sets the register as not ready.
#define panic(...)
This implements a cprintf based panic() function.
int iewToRenameDelay
Delay between iew and rename, in ticks.
Stats::Scalar renamedOperands
Stat for total number of renamed destination registers.
TimeBuffer< TimeStruct >::wire fromCommit
Wire to get commit's output from backwards time buffer.
unsigned renameWidth
Rename width, in instructions.
Generated on Tue Mar 23 2021 19:41:25 for gem5 by doxygen 1.8.17