52#include "enums/OpClass.hh"
53#include "params/BaseO3CPU.hh"
84 return "Functional unit completion";
88 const BaseO3CPUParams ¶ms)
102 const auto ®_classes = params.isa[0]->regClasses();
105 numPhysRegs = params.numPhysIntRegs + params.numPhysFloatRegs +
106 params.numPhysVecRegs +
107 params.numPhysVecRegs * (
110 params.numPhysVecPredRegs +
111 params.numPhysMatRegs +
112 params.numPhysCCRegs;
130 if (
iqPolicy == SMTQueuePolicy::Dynamic) {
136 }
else if (
iqPolicy == SMTQueuePolicy::Partitioned) {
145 DPRINTF(IQ,
"IQ sharing policy set to Partitioned:"
146 "%i entries per thread.\n",part_amt);
147 }
else if (
iqPolicy == SMTQueuePolicy::Threshold) {
148 double threshold = (double)params.smtIQThreshold / 100;
150 int thresholdIQ = (int)((
double)threshold *
numEntries);
157 DPRINTF(IQ,
"IQ sharing policy set to Threshold:"
158 "%i entries per thread.\n",thresholdIQ);
169 cprintf(
"Nodes traversed: %i, removed: %i\n",
177 return cpu->name() +
".iq";
183 "Number of instructions added to the IQ (excludes non-spec)"),
185 "Number of non-speculative instructions added to the IQ"),
187 "Number of instructions issued"),
189 "Number of integer instructions issued"),
191 "Number of float instructions issued"),
193 "Number of branch instructions issued"),
195 "Number of memory instructions issued"),
197 "Number of miscellaneous instructions issued"),
199 "Number of squashed instructions issued"),
201 "Number of squashed instructions iterated over during squash; "
202 "mainly for profiling"),
204 "Number of squashed operands that are examined and possibly "
205 "removed from graph"),
207 "Number of squashed non-spec instructions that were removed"),
209 "Number of insts issued each cycle"),
211 "attempts to use FU when none available"),
213 "Number of instructions issued per FU type, per thread"),
219 "FU busy when requested"),
223 "FU busy rate (busy events/executed inst)")
272 .init(0,total_width,1)
319 .init(
cpu->numThreads)
332 "Number of integer instruction queue reads"),
334 "Number of integer instruction queue writes"),
336 "Number of integer instruction queue wakeup accesses"),
338 "Number of floating instruction queue reads"),
340 "Number of floating instruction queue writes"),
342 "Number of floating instruction queue wakeup accesses"),
344 "Number of vector instruction queue reads"),
346 "Number of vector instruction queue writes"),
348 "Number of vector instruction queue wakeup accesses"),
350 "Number of integer alu accesses"),
352 "Number of floating point alu accesses"),
354 "Number of vector alu accesses")
483 if (
iqPolicy == SMTQueuePolicy::Partitioned) {
498 if (
iqPolicy == SMTQueuePolicy::Partitioned) {
500 }
else if (
iqPolicy == SMTQueuePolicy::Threshold &&
501 active_threads == 1) {
561 if (new_inst->isFloating()) {
563 }
else if (new_inst->isVector()) {
571 DPRINTF(IQ,
"Adding instruction [sn:%llu] PC %s to the IQ.\n",
572 new_inst->seqNum, new_inst->pcState());
576 instList[new_inst->threadNumber].push_back(new_inst);
590 if (new_inst->isMemRef()) {
591 memDepUnit[new_inst->threadNumber].insert(new_inst);
598 count[new_inst->threadNumber]++;
608 if (new_inst->isFloating()) {
610 }
else if (new_inst->isVector()) {
620 DPRINTF(IQ,
"Adding non-speculative instruction [sn:%llu] PC %s "
622 new_inst->seqNum, new_inst->pcState());
626 instList[new_inst->threadNumber].push_back(new_inst);
638 if (new_inst->isMemRef()) {
639 memDepUnit[new_inst->threadNumber].insertNonSpec(new_inst);
644 count[new_inst->threadNumber]++;
652 memDepUnit[barr_inst->threadNumber].insertBarrier(barr_inst);
663 if (inst->isFloating()) {
665 }
else if (inst->isVector()) {
687 while (list_it != list_end_it) {
688 if ((*list_it).oldestInst > queue_entry.
oldestInst) {
708 OpClass op_class = (*list_order_it).
queueType;
717 (*next_it).oldestInst < queue_entry.
oldestInst) {
727 DPRINTF(IQ,
"Processing FU completion [sn:%llu]\n", inst->seqNum);
728 assert(!
cpu->switchedOut());
735 fuPool->freeUnitNextCycle(fu_idx);
750 DPRINTF(IQ,
"Attempting to schedule ready instructions from "
773 int total_issued = 0;
777 while (total_issued <
totalWidth && order_it != order_end_it) {
778 OpClass op_class = (*order_it).queueType;
784 if (issuing_inst->isFloating()) {
786 }
else if (issuing_inst->isVector()) {
792 assert(issuing_inst->seqNum == (*order_it).oldestInst);
794 if (issuing_inst->isSquashed()) {
813 ThreadID tid = issuing_inst->threadNumber;
815 if (op_class != No_OpClass) {
816 idx =
fuPool->getUnit(op_class);
817 if (issuing_inst->isFloating()) {
819 }
else if (issuing_inst->isVector()) {
825 op_latency =
fuPool->getOpLatency(op_class);
833 if (op_latency ==
Cycles(1)) {
840 fuPool->freeUnitNextCycle(idx);
849 issuing_inst->setNoCapableFU();
852 bool pipelined =
fuPool->isPipelined(op_class);
858 cpu->schedule(execution,
867 fuPool->freeUnitNextCycle(idx);
871 DPRINTF(IQ,
"Thread %i: Issuing instruction PC %s "
873 tid, issuing_inst->pcState(),
874 issuing_inst->seqNum);
885 issuing_inst->setIssued();
889 issuing_inst->issueTick =
curTick() - issuing_inst->fetchTick;
892 if (issuing_inst->firstIssue == -1)
893 issuing_inst->firstIssue =
curTick();
895 if (!issuing_inst->isMemRef()) {
900 issuing_inst->clearInIQ();
906 iqStats.issuedInstType[tid][op_class]++;
909 iqStats.statFuBusy[op_class]++;
915 iqStats.numIssuedDist.sample(total_issued);
916 iqStats.instsIssued+= total_issued;
923 cpu->activityThisCycle();
925 DPRINTF(IQ,
"Not able to schedule any instructions.\n");
932 DPRINTF(IQ,
"Marking nonspeculative instruction [sn:%llu] as ready "
933 "to execute.\n", inst);
939 ThreadID tid = (*inst_it).second->threadNumber;
941 (*inst_it).second->setAtCommit();
943 (*inst_it).second->setCanIssue();
945 if (!(*inst_it).second->isMemRef()) {
948 memDepUnit[tid].nonSpecInstReady((*inst_it).second);
951 (*inst_it).second = NULL;
959 DPRINTF(IQ,
"[tid:%i] Committing instructions older than [sn:%llu]\n",
964 while (iq_it !=
instList[tid].end() &&
965 (*iq_it)->seqNum <= inst) {
979 if (completed_inst->isFloating()) {
981 }
else if (completed_inst->isVector()) {
987 completed_inst->lastWakeDependents =
curTick();
989 DPRINTF(IQ,
"Waking dependents of completed instruction.\n");
991 assert(!completed_inst->isSquashed());
996 ThreadID tid = completed_inst->threadNumber;
997 if (completed_inst->isMemRef()) {
1000 DPRINTF(IQ,
"Completing mem instruction PC: %s [sn:%llu]\n",
1001 completed_inst->pcState(), completed_inst->seqNum);
1004 completed_inst->memOpDone(
true);
1006 }
else if (completed_inst->isReadBarrier() ||
1007 completed_inst->isWriteBarrier()) {
1009 memDepUnit[tid].completeInst(completed_inst);
1012 for (
int dest_reg_idx = 0;
1013 dest_reg_idx < completed_inst->numDestRegs();
1017 completed_inst->renamedDestIdx(dest_reg_idx);
1022 DPRINTF(IQ,
"Reg %d [%s] is part of a fix mapping, skipping\n",
1030 completed_inst->setPinnedRegsWritten();
1033 DPRINTF(IQ,
"Reg %d [%s] is pinned, skipping\n",
1038 DPRINTF(IQ,
"Waking any dependents on register %i (%s).\n",
1047 DPRINTF(IQ,
"Waking up a dependent instruction, [sn:%llu] "
1048 "PC %s.\n", dep_inst->seqNum, dep_inst->pcState());
1054 dep_inst->markSrcRegReady();
1077 OpClass op_class = ready_inst->opClass();
1088 (*
readyIt[op_class]).oldestInst) {
1093 DPRINTF(IQ,
"Instruction is ready to issue, putting it onto "
1094 "the ready list, PC %s opclass:%i [sn:%llu].\n",
1095 ready_inst->pcState(), op_class, ready_inst->seqNum);
1101 DPRINTF(IQ,
"Rescheduling mem inst [sn:%llu]\n", resched_inst->seqNum);
1104 resched_inst->translationStarted(
false);
1105 resched_inst->translationCompleted(
false);
1107 resched_inst->clearCanIssue();
1108 memDepUnit[resched_inst->threadNumber].reschedule(resched_inst);
1114 memDepUnit[replay_inst->threadNumber].replay();
1126 blocked_inst->clearIssued();
1127 blocked_inst->clearCanIssue();
1129 DPRINTF(IQ,
"Memory inst [sn:%llu] PC %s is blocked, will be "
1130 "reissued later\n", blocked_inst->seqNum,
1131 blocked_inst->pcState());
1143 DPRINTF(IQ,
"Cache is unblocked, rescheduling blocked memory "
1155 if ((*it)->translationCompleted() || (*it)->isSquashed()) {
1181 memDepUnit[store->threadNumber].violation(store, faulting_load);
1187 DPRINTF(IQ,
"[tid:%i] Starting to squash instructions in "
1207 DPRINTF(IQ,
"[tid:%i] Squashing until sequence number %i!\n",
1212 while (squash_it !=
instList[tid].end() &&
1216 if (squashed_inst->isFloating()) {
1218 }
else if (squashed_inst->isVector()) {
1226 if (squashed_inst->threadNumber != tid ||
1227 squashed_inst->isSquashedInIQ()) {
1232 if (!squashed_inst->isIssued() ||
1233 (squashed_inst->isMemRef() &&
1234 !squashed_inst->memOpDone())) {
1236 DPRINTF(IQ,
"[tid:%i] Instruction [sn:%llu] PC %s squashed.\n",
1237 tid, squashed_inst->seqNum, squashed_inst->pcState());
1239 bool is_acq_rel = squashed_inst->isFullMemBarrier() &&
1240 (squashed_inst->isLoad() ||
1241 (squashed_inst->isStore() &&
1242 !squashed_inst->isStoreConditional()));
1246 (!squashed_inst->isNonSpeculative() &&
1247 !squashed_inst->isStoreConditional() &&
1248 !squashed_inst->isAtomic() &&
1249 !squashed_inst->isReadBarrier() &&
1250 !squashed_inst->isWriteBarrier())) {
1252 for (
int src_reg_idx = 0;
1253 src_reg_idx < squashed_inst->numSrcRegs();
1257 squashed_inst->renamedSrcIdx(src_reg_idx);
1268 if (!squashed_inst->readySrcIdx(src_reg_idx) &&
1274 ++
iqStats.squashedOperandsExamined;
1277 }
else if (!squashed_inst->isStoreConditional() ||
1278 !squashed_inst->isCompleted()) {
1289 assert(squashed_inst->getFault() !=
NoFault ||
1290 squashed_inst->isMemRef());
1293 (*ns_inst_it).second = NULL;
1297 ++
iqStats.squashedNonSpecRemoved;
1304 squashed_inst->setSquashedInIQ();
1308 squashed_inst->setIssued();
1309 squashed_inst->setCanCommit();
1310 squashed_inst->clearInIQ();
1313 count[squashed_inst->threadNumber]--;
1325 for (
int dest_reg_idx = 0;
1326 dest_reg_idx < squashed_inst->numDestRegs();
1330 squashed_inst->renamedDestIdx(dest_reg_idx);
1338 ++
iqStats.squashedInstsExamined;
1346 return lhs->seqNum > rhs->seqNum;
1354 int8_t total_src_regs = new_inst->numSrcRegs();
1355 bool return_val =
false;
1357 for (
int src_reg_idx = 0;
1358 src_reg_idx < total_src_regs;
1362 if (!new_inst->readySrcIdx(src_reg_idx)) {
1363 PhysRegIdPtr src_reg = new_inst->renamedSrcIdx(src_reg_idx);
1372 DPRINTF(IQ,
"Instruction PC %s has src reg %i (%s) that "
1373 "is being added to the dependency chain.\n",
1374 new_inst->pcState(), src_reg->
index(),
1383 DPRINTF(IQ,
"Instruction PC %s has src reg %i (%s) that "
1384 "became ready before it reached the IQ.\n",
1385 new_inst->pcState(), src_reg->
index(),
1388 new_inst->markSrcRegReady(src_reg_idx);
1403 int8_t total_dest_regs = new_inst->numDestRegs();
1405 for (
int dest_reg_idx = 0;
1406 dest_reg_idx < total_dest_regs;
1409 PhysRegIdPtr dest_reg = new_inst->renamedDestIdx(dest_reg_idx);
1419 panic(
"Dependency graph %i (%s) (flat: %i) not empty!",
1436 if (inst->readyToIssue()) {
1439 if (inst->isMemRef()) {
1441 DPRINTF(IQ,
"Checking if memory instruction can issue.\n");
1445 memDepUnit[inst->threadNumber].regsReady(inst);
1450 OpClass op_class = inst->opClass();
1454 DPRINTF(IQ,
"Instruction is ready to issue, putting it onto "
1455 "the ready list, PC %s opclass:%i [sn:%llu].\n",
1456 inst->pcState(), op_class, inst->seqNum);
1465 (*
readyIt[op_class]).oldestInst) {
1492 cprintf(
"Non speculative list: ");
1494 while (non_spec_it != non_spec_end_it) {
1495 cprintf(
"%s [sn:%llu]", (*non_spec_it).second->pcState(),
1496 (*non_spec_it).second->seqNum);
1508 while (list_order_it != list_order_end_it) {
1509 cprintf(
"%i OpClass:%i [sn:%llu] ",
i, (*list_order_it).queueType,
1510 (*list_order_it).oldestInst);
1528 while (inst_list_it !=
instList[tid].end()) {
1529 cprintf(
"Instruction:%i\n", num);
1530 if (!(*inst_list_it)->isSquashed()) {
1531 if (!(*inst_list_it)->isIssued()) {
1533 cprintf(
"Count:%i\n", valid_num);
1534 }
else if ((*inst_list_it)->isMemRef() &&
1535 !(*inst_list_it)->memOpDone()) {
1539 cprintf(
"Count:%i\n", valid_num);
1543 cprintf(
"PC: %s\n[sn:%llu]\n[tid:%i]\n"
1544 "Issued:%i\nSquashed:%i\n",
1545 (*inst_list_it)->pcState(),
1546 (*inst_list_it)->seqNum,
1547 (*inst_list_it)->threadNumber,
1548 (*inst_list_it)->isIssued(),
1549 (*inst_list_it)->isSquashed());
1551 if ((*inst_list_it)->isMemRef()) {
1552 cprintf(
"MemOpDone:%i\n", (*inst_list_it)->memOpDone());
1562 cprintf(
"Insts to Execute list:\n");
1572 if (!(*inst_list_it)->isSquashed()) {
1573 if (!(*inst_list_it)->isIssued()) {
1575 cprintf(
"Count:%i\n", valid_num);
1576 }
else if ((*inst_list_it)->isMemRef() &&
1577 !(*inst_list_it)->memOpDone()) {
1581 cprintf(
"Count:%i\n", valid_num);
1585 cprintf(
"PC: %s\n[sn:%llu]\n[tid:%i]\n"
1586 "Issued:%i\nSquashed:%i\n",
1587 (*inst_list_it)->pcState(),
1588 (*inst_list_it)->seqNum,
1589 (*inst_list_it)->threadNumber,
1590 (*inst_list_it)->isIssued(),
1591 (*inst_list_it)->isSquashed());
1593 if ((*inst_list_it)->isMemRef()) {
1594 cprintf(
"MemOpDone:%i\n", (*inst_list_it)->memOpDone());
Cycles is a wrapper class for representing cycle counts, i.e.
static const FlagsType AutoDelete
Event(Priority p=Default_Pri, Flags f=0)
const RegIndex & flatIndex() const
Flat index accessor.
constexpr RegIndex index() const
Visible RegId methods.
int getNumPinnedWritesToComplete() const
void decrNumPinnedWritesToComplete()
constexpr const char * className() const
Return a const char* with the register class name.
bool isFixedMapping() const
Returns true if this register is always associated to the same architectural register.
O3CPU class, has each of the stages (fetch through commit) within it, as well as all of the time buff...
static constexpr auto NoCapableFU
Instruction asked for a FU but this FUPool does not have a FU for this instruction op type.
static constexpr auto NoFreeFU
Instruction asked for a FU but all FU for this op type have already been allocated to other instructi...
static constexpr auto NoNeedFU
Named constants to differentiate cases where an instruction asked the FUPool for a free FU but did no...
IEW handles both single threaded and SMT IEW (issue/execute/writeback).
FU completion event class.
bool freeFU
Should the FU be added to the list to be freed upon completing this event.
FUCompletion(const DynInstPtr &_inst, int fu_idx, InstructionQueue *iq_ptr)
Construct a FU completion event.
DynInstPtr inst
Executing instruction.
int fuIdx
Index of the FU used for executing.
InstructionQueue * iqPtr
Pointer back to the instruction queue.
virtual const char * description() const
Return a C string describing the event.
std::string name() const
Returns the name of the IQ.
void commit(const InstSeqNum &inst, ThreadID tid=0)
Commits all instructions up to and including the given sequence number, for a specific thread.
gem5::o3::InstructionQueue::IQStats iqStats
void processFUCompletion(const DynInstPtr &inst, int fu_idx)
Process FU completion event.
DynInstPtr getBlockedMemInstToExecute()
Gets a memory instruction that was blocked on the cache.
std::list< DynInstPtr > instList[MaxThreads]
List of all the instructions in the IQ (some of which may be issued).
void retryMemInst(const DynInstPtr &retry_inst)
Retries a memory instruction in the next cycle.
std::list< DynInstPtr > retryMemInsts
List of instructions that were cache blocked, but a retry has been seen since, so they can now be ret...
void deferMemInst(const DynInstPtr &deferred_inst)
Defers a memory instruction when its DTB translation incurs a hw page table walk.
ReadyInstQueue readyInsts[Num_OpClasses]
List of ready instructions, per op class.
unsigned totalWidth
The total number of instructions that can be issued in one cycle.
void addIfReady(const DynInstPtr &inst)
Moves an instruction to the ready queue if it is ready.
unsigned numEntries
The number of entries in the instruction queue.
void insertBarrier(const DynInstPtr &barr_inst)
Inserts a memory or write barrier into the IQ to make sure loads and stores are ordered properly.
bool queueOnList[Num_OpClasses]
Tracks if each ready queue is on the age order list.
FUPool * fuPool
Function unit pool.
int wakeDependents(const DynInstPtr &completed_inst)
Wakes all dependents of a completed instruction.
std::list< DynInstPtr > deferredMemInsts
List of instructions waiting for their DTB translation to complete (hw page table walk in progress).
TimeBuffer< IssueStruct > * issueToExecuteQueue
The queue to the execute stage.
std::list< DynInstPtr > instsToExecute
List of instructions that are ready to be executed.
void setTimeBuffer(TimeBuffer< TimeStruct > *tb_ptr)
Sets the global time buffer.
unsigned numFreeEntries()
Returns total number of free entries.
std::list< DynInstPtr > blockedMemInsts
List of instructions that have been cache blocked.
void rescheduleMemInst(const DynInstPtr &resched_inst)
Reschedules a memory instruction.
TimeBuffer< TimeStruct >::wire fromCommit
Wire to read information from timebuffer.
void insertNonSpec(const DynInstPtr &new_inst)
Inserts a new, non-speculative instruction into the IQ.
void addReadyMemInst(const DynInstPtr &ready_inst)
Adds a ready memory instruction to the ready list.
void replayMemInst(const DynInstPtr &replay_inst)
Replays a memory instruction.
void resetState()
Resets all instruction queue state.
bool isDrained() const
Determine if we are drained.
unsigned count[MaxThreads]
Per Thread IQ count.
void cacheUnblocked()
Notify instruction queue that a previous blockage has resolved.
std::map< InstSeqNum, DynInstPtr > nonSpecInsts
List of non-speculative instructions that will be scheduled once the IQ gets a signal from commit.
unsigned freeEntries
Number of free IQ entries left.
MemDepUnit memDepUnit[MaxThreads]
The memory dependence unit, which tracks/predicts memory dependences between instructions.
void dumpLists()
Debugging function to dump all the list sizes, as well as print out the list of nonspeculative instru...
void blockMemInst(const DynInstPtr &blocked_inst)
Defers a memory instruction when it is cache blocked.
void drainSanityCheck() const
Perform sanity checks after a drain.
unsigned numPhysRegs
The number of physical registers in the CPU.
DynInstPtr getDeferredMemInstToExecute()
Gets a memory instruction that was referred due to a delayed DTB translation if it is now ready to ex...
void dumpInsts()
Debugging function to dump out all instructions that are in the IQ.
void takeOverFrom()
Takes over execution from another CPU's thread.
SMTQueuePolicy iqPolicy
IQ sharing policy for SMT.
gem5::o3::InstructionQueue::IQIOStats iqIOStats
void moveToYoungerInst(ListOrderIt age_order_it)
Called when the oldest instruction has been removed from a ready queue; this places that ready queue ...
InstructionQueue(CPU *cpu_ptr, IEW *iew_ptr, const BaseO3CPUParams ¶ms)
Constructs an IQ.
InstSeqNum squashedSeqNum[MaxThreads]
The sequence number of the squashed instruction.
void violation(const DynInstPtr &store, const DynInstPtr &faulting_load)
Indicates an ordering violation between a store and a load.
std::list< DynInstPtr >::iterator ListIt
bool hasReadyInsts()
Returns if there are any ready instructions in the IQ.
Cycles commitToIEWDelay
Delay between commit stage and the IQ.
void resetEntries()
Resets max entries for all threads.
int countInsts()
Debugging function to count how many entries are in the IQ.
std::list< ThreadID > * activeThreads
Pointer to list of active threads.
std::list< ListOrderEntry >::iterator ListOrderIt
void setActiveThreads(std::list< ThreadID > *at_ptr)
Sets active threads list.
void addToOrderList(OpClass op_class)
Add an op class to the age order list.
ThreadID numThreads
Number of Total Threads.
TimeBuffer< TimeStruct > * timeBuffer
The backwards time buffer.
void scheduleNonSpec(const InstSeqNum &inst)
Schedules a single specific non-speculative instruction.
std::vector< bool > regScoreboard
A cache of the recently woken registers.
void scheduleReadyInsts()
Schedules ready instructions, adding the ready ones (oldest first) to the queue to execute.
bool isFull()
Returns whether or not the IQ is full.
void squash(ThreadID tid)
Squashes instructions for a thread.
IEW * iewStage
Pointer to IEW stage.
std::list< ListOrderEntry > listOrder
List that contains the age order of the oldest instruction of each ready queue.
~InstructionQueue()
Destructs the IQ.
void doSquash(ThreadID tid)
Does the actual squashing.
void setIssueToExecuteQueue(TimeBuffer< IssueStruct > *i2eQueue)
Sets the timer buffer between issue and execute.
int wbOutstanding
Number of instructions currently in flight to FUs.
void insert(const DynInstPtr &new_inst)
Inserts a new instruction into the IQ.
unsigned maxEntries[MaxThreads]
Max IQ Entries Per Thread.
CPU * cpu
Pointer to the CPU.
bool addToDependents(const DynInstPtr &new_inst)
Adds an instruction to the dependency graph, as a consumer.
int entryAmount(ThreadID num_threads)
Number of entries needed for given amount of threads.
DynInstPtr getInstToExecute()
Returns the oldest scheduled instruction, and removes it from the list of instructions waiting to exe...
DependencyGraph< DynInstPtr > dependGraph
ListOrderIt readyIt[Num_OpClasses]
Iterators of each ready queue.
void addToProducers(const DynInstPtr &new_inst)
Adds an instruction to the dependency graph, as a producer.
std::map< InstSeqNum, DynInstPtr >::iterator NonSpecMapIt
#define ADD_STAT(n,...)
Convenience macro to add a stat to a statistics group.
static const Priority Stat_Event_Pri
Statistics events (dump, reset, etc.) come after everything else, but before exit.
#define panic(...)
This implements a cprintf based panic() function.
static constexpr int MaxThreads
RefCountingPtr< DynInst > DynInstPtr
const FlagsType pdf
Print the percent of the total that this entry represents.
const FlagsType total
Print the total.
const FlagsType dist
Print the distribution.
Copyright (c) 2024 Arm Limited All rights reserved.
int16_t ThreadID
Thread index/ID type.
static const OpClass Num_OpClasses
void cprintf(const char *format, const Args &...args)
Tick curTick()
The universal simulation clock.
constexpr decltype(nullptr) NoFault
@ VecRegClass
Vector Register.
@ VecElemClass
Vector Register Native Elem lane.
statistics::Scalar intInstQueueReads
statistics::Scalar vecInstQueueWrites
statistics::Scalar fpInstQueueWrites
statistics::Scalar fpInstQueueReads
statistics::Scalar vecInstQueueReads
statistics::Scalar vecAluAccesses
statistics::Scalar intAluAccesses
statistics::Scalar vecInstQueueWakeupAccesses
statistics::Scalar intInstQueueWakeupAccesses
statistics::Scalar intInstQueueWrites
IQIOStats(statistics::Group *parent)
statistics::Scalar fpAluAccesses
statistics::Scalar fpInstQueueWakeupAccesses
statistics::Scalar floatInstsIssued
Stat for number of floating point instructions issued.
statistics::Vector fuBusy
Number of times the FU was busy.
statistics::Scalar instsAdded
Stat for number of instructions added.
statistics::Distribution numIssuedDist
Distribution of number of instructions in the queue.
statistics::Scalar nonSpecInstsAdded
Stat for number of non-speculative instructions added.
statistics::Scalar squashedInstsExamined
Stat for number of squashed instructions examined when squashing.
statistics::Vector2d issuedInstType
Stat for total number issued for each instruction type.
statistics::Scalar miscInstsIssued
Stat for number of miscellaneous instructions issued.
statistics::Scalar branchInstsIssued
Stat for number of branch instructions issued.
statistics::Formula fuBusyRate
Number of times the FU was busy per instruction issued.
statistics::Scalar memInstsIssued
Stat for number of memory instructions issued.
statistics::Scalar intInstsIssued
Stat for number of integer instructions issued.
statistics::Scalar instsIssued
statistics::Formula issueRate
Number of instructions issued per cycle.
IQStats(CPU *cpu, const unsigned &total_width)
statistics::Scalar squashedOperandsExamined
Stat for number of squashed instruction operands examined when squashing.
statistics::Scalar squashedInstsIssued
Stat for number of squashed instructions that were ready to issue.
statistics::Vector statFuBusy
Distribution of the cycles it takes to issue an instruction.
statistics::Scalar squashedNonSpecRemoved
Stat for number of non-speculative instructions removed due to a squash.
Entry for the list age ordering by op class.
bool operator()(const DynInstPtr &lhs, const DynInstPtr &rhs) const