42 #ifndef __CPU_O3_RENAME_IMPL_HH__ 43 #define __CPU_O3_RENAME_IMPL_HH__ 47 #include "arch/isa_traits.hh" 48 #include "arch/registers.hh" 49 #include "config/the_isa.hh" 52 #include "debug/Activity.hh" 53 #include "debug/Rename.hh" 54 #include "debug/O3PipeView.hh" 55 #include "params/DerivO3CPU.hh" 62 iewToRenameDelay(params->iewToRenameDelay),
63 decodeToRenameDelay(params->decodeToRenameDelay),
64 commitToRenameDelay(params->commitToRenameDelay),
65 renameWidth(params->renameWidth),
66 commitWidth(params->commitWidth),
67 numThreads(params->numThreads)
70 fatal(
"renameWidth (%d) is larger than compiled limit (%d),\n" 71 "\tincrease MaxWidth in src/cpu/o3/impl.hh\n",
76 for (uint32_t tid = 0; tid < Impl::MaxThreads; tid++) {
84 stalls[tid] = {
false,
false};
94 return cpu->name() +
".rename";
103 .
desc(
"Number of cycles rename is squashing")
107 .
desc(
"Number of cycles rename is idle")
111 .
desc(
"Number of cycles rename is blocking")
114 .
name(
name() +
".serializeStallCycles")
115 .
desc(
"count of cycles rename stalled for serializing inst")
119 .
desc(
"Number of cycles rename is running")
123 .
desc(
"Number of cycles rename is unblocking")
127 .
desc(
"Number of instructions processed by rename")
131 .
desc(
"Number of squashed instructions processed by rename")
135 .
desc(
"Number of times rename has blocked due to ROB full")
139 .
desc(
"Number of times rename has blocked due to IQ full")
143 .
desc(
"Number of times rename has blocked due to LQ full")
147 .
desc(
"Number of times rename has blocked due to SQ full")
150 .
name(
name() +
".FullRegisterEvents")
151 .
desc(
"Number of times there has been no free registers")
155 .
desc(
"Number of destination operands rename has renamed")
159 .
desc(
"Number of register rename lookups that rename has made")
163 .
desc(
"Number of HB maps that are committed")
167 .
desc(
"Number of HB maps that are undone due to squashing")
171 .
desc(
"count of serializing insts renamed")
175 .
name(
name() +
".tempSerializingInsts")
176 .
desc(
"count of temporary serializing insts renamed")
181 .
desc(
"count of insts added to the skid buffer")
185 .
name(
name() +
".int_rename_lookups")
186 .
desc(
"Number of integer rename lookups")
189 .
name(
name() +
".fp_rename_lookups")
190 .
desc(
"Number of floating rename lookups")
193 .
name(
name() +
".vec_rename_lookups")
194 .
desc(
"Number of vector rename lookups")
197 .
name(
name() +
".vec_pred_rename_lookups")
198 .
desc(
"Number of vector predicate rename lookups")
202 template <
class Impl>
211 template <
class Impl>
227 template <
class Impl>
237 template <
class Impl>
247 template <
class Impl>
254 template <
class Impl>
276 template <
class Impl>
314 template <
class Impl>
322 template <
class Impl>
336 template <
class Impl>
344 !
insts[tid].empty() ||
351 template <
class Impl>
358 template <
class Impl>
364 assert(
insts[tid].empty());
370 template <
class Impl>
374 DPRINTF(Rename,
"[tid:%i] [squash sn:%llu] Squashing instructions.\n",
388 DPRINTF(Rename,
"[tid:%i] [squash sn:%llu] " 389 "Rename will resume serializing after squash\n",
424 template <
class Impl>
432 bool status_change =
false;
442 while (threads != end) {
445 DPRINTF(Rename,
"Processing [tid:%i]\n", tid);
449 rename(status_change, tid);
457 DPRINTF(Activity,
"Activity this cycle.\n");
458 cpu->activityThisCycle();
463 while (threads != end) {
467 if (
fromCommit->commitInfo[tid].doneSeqNum != 0 &&
511 toDecode->renameUnblock[tid] =
false;
517 toDecode->renameUnblock[tid] =
false;
525 "Not blocked, so attempting to run stage.\n",
544 template <
class Impl>
555 if (insts_available == 0) {
556 DPRINTF(Rename,
"[tid:%i] Nothing to do, breaking out early.\n",
571 int min_free_entries = free_rob_entries;
575 if (free_iq_entries < min_free_entries) {
576 min_free_entries = free_iq_entries;
581 if (min_free_entries <= 0) {
583 "[tid:%i] Blocking due to no free ROB/IQ/ entries.\n" 584 "ROB has %i free entries.\n" 585 "IQ has %i free entries.\n",
586 tid, free_rob_entries, free_iq_entries);
595 }
else if (min_free_entries < insts_available) {
598 "Will have to block this cycle. " 599 "%i insts available, " 600 "but only %i insts can be renamed due to ROB/IQ/LSQ limits.\n",
601 tid, insts_available, min_free_entries);
603 insts_available = min_free_entries;
615 "%i available instructions to send iew.\n",
616 tid, insts_available);
620 "%i insts pipelining from Rename | " 621 "%i insts dispatched to IQ last cycle.\n",
629 }
else if (!insts_to_rename.empty()) {
630 insts_to_rename.front()->setSerializeBefore();
634 int renamed_insts = 0;
637 DPRINTF(Rename,
"[tid:%i] Sending instructions to IEW.\n", tid);
639 assert(!insts_to_rename.empty());
647 if (inst->isLoad()) {
649 DPRINTF(Rename,
"[tid:%i] Cannot rename due to no free LQ\n");
656 if (inst->isStore() || inst->isAtomic()) {
658 DPRINTF(Rename,
"[tid:%i] Cannot rename due to no free SQ\n");
665 insts_to_rename.pop_front();
670 "Removing [sn:%llu] PC:%s from rename skidBuffer\n",
671 tid, inst->seqNum, inst->pcState());
674 if (inst->isSquashed()) {
677 "instruction %i with PC %s is squashed, skipping.\n",
678 tid, inst->seqNum, inst->pcState());
690 "Processing instruction [sn:%llu] with PC %s.\n",
691 tid, inst->seqNum, inst->pcState());
695 if (!
renameMap[tid]->canRename(inst->numIntDestRegs(),
696 inst->numFPDestRegs(),
697 inst->numVecDestRegs(),
698 inst->numVecElemDestRegs(),
699 inst->numVecPredDestRegs(),
700 inst->numCCDestRegs())) {
703 " lack of free physical registers to rename to.\n");
705 insts_to_rename.push_front(inst);
721 if ((inst->isIprAccess() || inst->isSerializeBefore()) &&
722 !inst->isSerializeHandled()) {
723 DPRINTF(Rename,
"Serialize before instruction encountered.\n");
725 if (!inst->isTempSerializeBefore()) {
727 inst->setSerializeHandled();
741 }
else if ((inst->isStoreConditional() || inst->isSerializeAfter()) &&
742 !inst->isSerializeHandled()) {
743 DPRINTF(Rename,
"Serialize after instruction encountered.\n");
747 inst->setSerializeHandled();
756 if (inst->isAtomic() || inst->isStore()) {
758 }
else if (inst->isLoad()) {
788 if (insts_available) {
794 toDecode->renameUnblock[tid] =
false;
804 while (!
insts[tid].empty()) {
805 inst =
insts[tid].front();
807 insts[tid].pop_front();
809 assert(tid == inst->threadNumber);
811 DPRINTF(Rename,
"[tid:%i] Inserting [sn:%llu] PC: %s into Rename " 812 "skidBuffer\n", tid, inst->seqNum, inst->pcState());
821 typename InstQueue::iterator it;
822 warn(
"Skidbuffer contents:\n");
825 warn(
"[tid:%i] %s [sn:%llu].\n", tid,
826 (*it)->staticInst->disassemble(inst->instAddr()),
829 panic(
"Skidbuffer Exceeded Max Size");
833 template <
class Impl>
838 for (
int i = 0;
i < insts_from_decode; ++
i) {
840 insts[inst->threadNumber].push_back(inst);
843 inst->renameTick =
curTick() - inst->fetchTick;
856 while (threads != end) {
870 bool any_unblocking =
false;
875 while (threads != end) {
879 any_unblocking =
true;
885 if (any_unblocking) {
889 DPRINTF(Activity,
"Activating stage.\n");
891 cpu->activateStage(O3CPU::RenameIdx);
898 DPRINTF(Activity,
"Deactivating stage.\n");
900 cpu->deactivateStage(O3CPU::RenameIdx);
905 template <
class Impl>
909 DPRINTF(Rename,
"[tid:%i] Blocking.\n", tid);
923 toDecode->renameUnblock[tid] =
false;
939 template <
class Impl>
943 DPRINTF(Rename,
"[tid:%i] Trying to unblock.\n", tid);
948 DPRINTF(Rename,
"[tid:%i] Done unblocking.\n", tid);
950 toDecode->renameUnblock[tid] =
true;
960 template <
class Impl>
972 hb_it->instSeqNum > squashed_seq_num) {
975 DPRINTF(Rename,
"[tid:%i] Removing history entry with sequence " 976 "number %i (archReg: %d, newPhysReg: %d, prevPhysReg: %d).\n",
977 tid, hb_it->instSeqNum, hb_it->archReg.index(),
978 hb_it->newPhysReg->index(), hb_it->prevPhysReg->index());
986 if (hb_it->newPhysReg != hb_it->prevPhysReg) {
989 renameMap[tid]->setEntry(hb_it->archReg, hb_it->prevPhysReg);
992 freeList->addReg(hb_it->newPhysReg);
1010 template<
class Impl>
1014 DPRINTF(Rename,
"[tid:%i] Removing a committed instruction from the " 1015 "history buffer %u (size=%i), until [sn:%llu].\n",
1024 DPRINTF(Rename,
"[tid:%i] History buffer is empty.\n", tid);
1026 }
else if (hb_it->instSeqNum > inst_seq_num) {
1027 DPRINTF(Rename,
"[tid:%i] [sn:%llu] " 1028 "Old sequence number encountered. " 1029 "Ensure that a syscall happened recently.\n",
1040 hb_it->instSeqNum <= inst_seq_num) {
1042 DPRINTF(Rename,
"[tid:%i] Freeing up older rename of reg %i (%s), " 1044 tid, hb_it->prevPhysReg->index(),
1045 hb_it->prevPhysReg->className(),
1051 if (hb_it->newPhysReg != hb_it->prevPhysReg) {
1052 freeList->addReg(hb_it->prevPhysReg);
1061 template <
class Impl>
1067 unsigned num_src_regs = inst->numSrcRegs();
1071 for (
int src_idx = 0; src_idx < num_src_regs; src_idx++) {
1072 const RegId& src_reg = inst->srcRegIdx(src_idx);
1100 "Looking up %s arch reg %i, got phys reg %i (%s)\n",
1105 inst->renameSrcReg(src_idx, renamed_reg);
1111 "Register %d (flat: %d) (%s) is ready.\n",
1115 inst->markSrcRegReady(src_idx);
1119 "Register %d (flat: %d) (%s) is not ready.\n",
1128 template <
class Impl>
1134 unsigned num_dest_regs = inst->numDestRegs();
1137 for (
int dest_idx = 0; dest_idx < num_dest_regs; dest_idx++) {
1138 const RegId& dest_reg = inst->destRegIdx(dest_idx);
1139 typename RenameMap::RenameInfo rename_result;
1144 rename_result = map->rename(flat_dest_regid);
1146 inst->flattenDestReg(dest_idx, flat_dest_regid);
1152 "Renaming arch reg %i (%s) to physical reg %i (%i).\n",
1154 rename_result.first->index(),
1155 rename_result.first->flatIndex());
1159 rename_result.first,
1160 rename_result.second);
1164 DPRINTF(Rename,
"[tid:%i] [sn:%llu] " 1165 "Adding instruction to history buffer (size=%i).\n",
1174 inst->renameDestReg(dest_idx,
1175 rename_result.first,
1176 rename_result.second);
1182 template <
class Impl>
1194 template <
class Impl>
1206 template <
class Impl>
1213 "calcFreeLQEntries: free lqEntries: %d, loadsInProgress: %d, " 1214 "loads dispatchedToLQ: %d\n",
1216 fromIEW->iewInfo[tid].dispatchedToLQ);
1220 template <
class Impl>
1226 DPRINTF(Rename,
"calcFreeSQEntries: free sqEntries: %d, storesInProgress: %d, " 1227 "stores dispatchedToSQ: %d\n",
freeEntries[tid].sqEntries,
1232 template <
class Impl>
1236 unsigned inst_count = 0;
1246 template <
class Impl>
1254 if (
fromIEW->iewUnblock[tid]) {
1260 template <
class Impl>
1264 bool ret_val =
false;
1267 DPRINTF(Rename,
"[tid:%i] Stall from IEW stage detected.\n", tid);
1270 DPRINTF(Rename,
"[tid:%i] Stall: ROB has 0 free entries.\n", tid);
1273 DPRINTF(Rename,
"[tid:%i] Stall: IQ has 0 free entries.\n", tid);
1276 DPRINTF(Rename,
"[tid:%i] Stall: LSQ has 0 free entries.\n", tid);
1278 }
else if (
renameMap[tid]->numFreeEntries() <= 0) {
1279 DPRINTF(Rename,
"[tid:%i] Stall: RenameMap has 0 free entries.\n", tid);
1283 DPRINTF(Rename,
"[tid:%i] Stall: Serialize stall and ROB is not " 1292 template <
class Impl>
1296 if (
fromIEW->iewInfo[tid].usedIQ)
1299 if (
fromIEW->iewInfo[tid].usedLSQ) {
1310 DPRINTF(Rename,
"[tid:%i] Free IQ: %i, Free ROB: %i, " 1311 "Free LQ: %i, Free SQ: %i, FreeRM %i(%i %i %i %i %i)\n",
1324 DPRINTF(Rename,
"[tid:%i] %i instructions not yet in ROB\n",
1328 template <
class Impl>
1346 DPRINTF(Rename,
"[tid:%i] Squashing instructions due to squash from " 1359 DPRINTF(Rename,
"[tid:%i] Done blocking, switching to unblocking.\n",
1374 "[tid:%i] Done squashing, switching to serialize.\n", tid);
1380 "[tid:%i] Done squashing, switching to unblocking.\n",
1385 DPRINTF(Rename,
"[tid:%i] Done squashing, switching to running.\n",
1394 DPRINTF(Rename,
"[tid:%i] Done with serialize stall, switching to " 1395 "unblocking.\n", tid);
1403 DPRINTF(Rename,
"[tid:%i] Processing instruction [%lli] with " 1404 "PC %s.\n", tid, serial_inst->seqNum, serial_inst->pcState());
1407 serial_inst->clearSerializeBefore();
1412 insts[tid].push_front(serial_inst);
1415 DPRINTF(Rename,
"[tid:%i] Instruction must be processed by rename." 1416 " Adding to front of list.\n", tid);
1428 template<
class Impl>
1432 if (inst_list.empty()) {
1439 inst_list.front()->setSerializeBefore();
1442 template <
class Impl>
1460 panic(
"Rename full stall stat should be incremented for a reason!");
1465 template <
class Impl>
1476 cprintf(
"Seq num: %i\nArch reg[%s]: %i New phys reg:" 1477 " %i[%s] Old phys reg: %i[%s]\n",
1478 (*buf_it).instSeqNum,
1479 (*buf_it).archReg.className(),
1480 (*buf_it).archReg.index(),
1481 (*buf_it).newPhysReg->index(),
1482 (*buf_it).newPhysReg->className(),
1483 (*buf_it).prevPhysReg->index(),
1484 (*buf_it).prevPhysReg->className());
1491 #endif//__CPU_O3_RENAME_IMPL_HH__
void setScoreboard(Scoreboard *_scoreboard)
Sets pointer to the scoreboard.
#define panic(...)
This implements a cprintf based panic() function.
Stats::Scalar renameFullRegistersEvents
Stat for total number of times that rename runs out of free registers to use to rename.
int decodeToRenameDelay
Delay between decode and rename, in ticks.
void readStallSignals(ThreadID tid)
Reads signals telling rename to block/unblock.
bool unblock(ThreadID tid)
Switches rename to unblocking if the skid buffer is empty, and signals back that rename has unblocked...
Impl::DynInstPtr DynInstPtr
Stats::Scalar renameRunCycles
Stat for total number of cycles spent running normally.
int iewToRenameDelay
Delay between iew and rename, in ticks.
RenameStatus _status
Rename status.
int getNumPinnedWrites() const
RenameMap * renameMap[Impl::MaxThreads]
Rename map interface.
TimeBuffer< RenameStruct >::wire toIEW
Wire to write any information heading to IEW.
#define fatal(...)
This implements a cprintf based fatal() function.
ProbePointArg< DynInstPtr > * ppRename
To probe when register renaming for an instruction is complete.
void setFreeList(FreeList *fl_ptr)
Sets pointer to the free list.
void drainSanityCheck() const
Perform sanity checks after a drain.
std::list< ThreadID > * activeThreads
Pointer to the list of active threads.
FreeEntries freeEntries[Impl::MaxThreads]
Per-thread tracking of the number of free entries of back-end structures.
void setRenameQueue(TimeBuffer< RenameStruct > *rq_ptr)
Sets pointer to time buffer used to communicate to the next stage.
TimeBuffer< TimeStruct > * timeBuffer
Pointer to main time buffer used for backwards communication.
bool block(ThreadID tid)
Switches rename to blocking, and signals back that rename has become blocked.
void clearStates(ThreadID tid)
Clear all thread-specific states.
void notify(const Arg &arg)
called at the ProbePoint call site, passes arg to each listener.
std::string name() const
Returns the name of rename.
Stats::Scalar renameRenamedOperands
Stat for total number of renamed destination registers.
IEW * iew_ptr
Pointer to IEW stage.
Stats::Scalar renameROBFullEvents
Stat for total number of times that the ROB starts a stall in rename.
void renameDestRegs(const DynInstPtr &inst, ThreadID tid)
Renames the destination registers of an instruction.
bool serializeOnNextInst[Impl::MaxThreads]
Records if rename needs to serialize on the next instruction for any thread.
void regProbePoints()
Registers probes.
Stalls stalls[Impl::MaxThreads]
Tracks which stages are telling decode to stall.
bool wroteToTimeBuffer
Variable that tracks if decode has written to the time buffer this cycle.
Stats::Scalar renamedSerializing
Number of serialize instructions handled.
Overload hash function for BasicBlockRange type.
int calcFreeSQEntries(ThreadID tid)
Calculates the number of free SQ entries for a specific thread.
TimeBuffer< DecodeStruct > * decodeQueue
Decode instruction queue interface.
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.
Stats::Scalar renameSquashedInsts
Stat for total number of squashed instructions that rename discards.
Derived & flags(Flags _flags)
Set the flags and marks this stat to print at the end of simulation.
CPUPol::FreeList FreeList
ThreadContext is the external interface to all thread state for anything outside of the CPU...
unsigned validInsts()
Returns the number of valid instructions coming from decode.
void dumpHistory()
Debugging function used to dump history buffer of renamings.
Stats::Scalar renamedTempSerializing
Number of instructions marked as temporarily serializing.
Scoreboard * scoreboard
Pointer to the scoreboard.
void renameSrcRegs(const DynInstPtr &inst, ThreadID tid)
Renames the source registers of an instruction.
bool checkSignalsAndUpdate(ThreadID tid)
Checks the signals and updates the status.
void setNumPinnedWrites(int num_writes)
unsigned toIEWIndex
The index of the instruction in the time buffer to IEW that rename is currently using.
TimeBuffer< TimeStruct >::wire fromCommit
Wire to get commit's output from backwards time buffer.
Stats::Scalar renameUnblockCycles
Stat for total number of cycles spent unblocking.
void regStats()
Registers statistics.
TimeBuffer< RenameStruct > * renameQueue
Rename instruction queue.
void renameInsts(ThreadID tid)
Renames instructions for the given thread.
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...
Implements a simple scoreboard to track which registers are ready.
Vector Register Native Elem lane.
Tick curTick()
The current simulated tick.
std::list< RenameHistory > historyBuffer[Impl::MaxThreads]
A per-thread list of all destination register renames, used to either undo rename mappings or free ol...
bool skidsEmpty()
Returns if all of the skid buffers are empty.
Stats::Scalar renameIQFullEvents
Stat for total number of times that the IQ starts a stall in rename.
void removeFromHistory(InstSeqNum inst_seq_num, ThreadID tid)
Removes a committed instruction's rename history.
Stats::Scalar renameCommittedMaps
Stat for total number of committed renaming mappings.
Stats::Scalar renameRenamedInsts
Stat for total number of renamed instructions.
CPUPol::RenameMap RenameMap
Derived & prereq(const Stat &prereq)
Set the prerequisite stat and marks this stat to print at the end of simulation.
Holds the information for each destination register rename.
Commit * commit_ptr
Pointer to commit stage.
void unsetReg(PhysRegIdPtr phys_reg)
Sets the register as not ready.
void readFreeEntries(ThreadID tid)
Gets the number of free entries for a specific thread.
O3CPU * cpu
Pointer to CPU.
void takeOverFrom()
Takes over from another CPU's thread.
void skidInsert(ThreadID tid)
Inserts unused instructions from a given thread into the skid buffer, to be renamed once rename unblo...
TimeBuffer< DecodeStruct >::wire fromDecode
Wire to get decode's output from decode queue.
bool isDrained() const
Has the stage drained?
FullSource
Enum to record the source of a structure full stall.
int calcFreeROBEntries(ThreadID tid)
Calculates the number of free ROB entries for a specific thread.
Stats::Scalar renameSquashCycles
Stat for total number of cycles spent squashing.
ProbePointArg< SeqNumRegPair > * ppSquashInRename
To probe when an instruction is squashed and the register mapping for it needs to be undone...
Stats::Scalar renameSerializeStallCycles
Stat for total number of cycles spent stalling for a serializing inst.
void squash(const InstSeqNum &squash_seq_num, ThreadID tid)
Squashes all instructions in a thread.
ThreadID numThreads
The number of threads active in rename.
InstQueue skidBuffer[Impl::MaxThreads]
Skid buffer between rename and decode.
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 renameBlockCycles
Stat for total number of cycles spent blocking.
const FlagsType total
Print the total.
TimeBuffer< TimeStruct >::wire fromIEW
Wire to get IEW's output from backwards time buffer.
Stats::Scalar renameRenameLookups
Stat for total number of source register rename lookups.
Stats::Scalar renameLQFullEvents
Stat for total number of times that the LQ starts a stall in rename.
void resetStage()
Reset this pipeline stage.
Stats::Scalar renameSQFullEvents
Stat for total number of times that the SQ starts a stall in rename.
Derived & name(const std::string &name)
Set the name and marks this stat to print at the end of simulation.
int16_t ThreadID
Thread index/ID type.
Stats::Scalar fpRenameLookups
void rename(bool &status_change, ThreadID tid)
Determines what to do based on rename's current status.
int calcFreeLQEntries(ThreadID tid)
Calculates the number of free LQ entries for a specific thread.
int storesInProgress[Impl::MaxThreads]
Count of Store instructions in progress that have been sent off to the IQ and ROB, but are not yet included in their occupancy counts.
const PhysRegIndex & flatIndex() const
Flat index accessor.
bool blockThisCycle
Whether or not rename needs to block this cycle.
void setActiveThreads(std::list< ThreadID > *at_ptr)
Sets pointer to list of active threads.
void tick()
Ticks rename, which processes all input signals and attempts to rename as many instructions as possib...
TimeBuffer< TimeStruct >::wire toDecode
Wire to write infromation heading to previous stages.
bool emptyROB[Impl::MaxThreads]
Records if the ROB is empty.
const RegClass & classValue() const
Class accessor.
unsigned commitToRenameDelay
Delay between commit and rename, in ticks.
InstQueue insts[Impl::MaxThreads]
Queue of all instructions coming from decode this cycle.
void startupStage()
Initializes variables for the stage.
void setTimeBuffer(TimeBuffer< TimeStruct > *tb_ptr)
Sets the main backwards communication time buffer pointer.
const RegIndex & index() const
Index accessors.
int calcFreeIQEntries(ThreadID tid)
Calculates the number of free IQ entries for a specific thread.
virtual RegId flattenRegId(const RegId ®Id) const =0
Stats::Scalar renameUndoneMaps
Stat for total number of mappings that were undone due to a squash.
Stats::Scalar vecRenameLookups
void sortInsts()
Separates instructions from decode into individual lists of instructions sorted by thread...
void setRenameMap(RenameMap rm_ptr[Impl::MaxThreads])
Sets pointer to rename maps (per-thread structures).
Register ID: describe an architectural register with its class and index.
void incrFullStat(const FullSource &source)
Function used to increment the stat that corresponds to the source of the stall.
Derived & desc(const std::string &_desc)
Set the description and marks this stat to print at the end of simulation.
unsigned skidBufferMax
The maximum skid buffer size.
FreeList * freeList
Free list interface.
Stats::Scalar vecPredRenameLookups
DefaultRename(O3CPU *_cpu, DerivO3CPUParams *params)
DefaultRename constructor.
void updateStatus()
Updates overall rename status based on all of the threads' statuses.
void serializeAfter(InstQueue &inst_list, ThreadID tid)
Either serializes on the next instruction available in the InstQueue, or records that it must seriali...
Stats::Scalar renameSkidInsts
Number of instructions inserted into skid buffers.
unsigned renameWidth
Rename width, in instructions.
DynInstPtr serializeInst[Impl::MaxThreads]
The serialize instruction that rename has stalled on.
bool resumeUnblocking
Whether or not rename needs to resume clearing out the skidbuffer after squashing.
bool checkStall(ThreadID tid)
Checks if any stages are telling rename to block.
Stats::Scalar intRenameLookups
void setDecodeQueue(TimeBuffer< DecodeStruct > *dq_ptr)
Sets pointer to time buffer coming from decode.
const char * className() const
Return a const char* with the register class name.
ThreadStatus renameStatus[Impl::MaxThreads]
Per-thread status.
void cprintf(const char *format, const Args &...args)
Stats::Scalar renameIdleCycles
Stat for total number of cycles spent idle.
bool getReg(PhysRegIdPtr phys_reg) const
Checks if the register is ready.