Go to the documentation of this file.
41 #include "debug/MinorScoreboard.hh"
42 #include "debug/MinorTiming.hh"
55 switch (
reg.classValue()) {
57 scoreboard_index =
reg.index();
89 panic(
"Unknown register class: %d",
reg.classValue());
103 unsigned int num_dests = staticInst->
numDestRegs();
108 for (
unsigned int dest_index = 0; dest_index < num_dests;
115 if (mark_unpredictable)
118 inst->flatDestRegIdx[dest_index] =
reg;
129 DPRINTF(MinorScoreboard,
"Marking up inst: %s"
130 " regIndex: %d final numResults: %d returnCycle: %d\n",
134 inst->flatDestRegIdx[dest_index] =
RegId();
149 unsigned int num_srcs = staticInst->
numSrcRegs();
153 for (
unsigned int src_index = 0; src_index < num_srcs; src_index++) {
155 unsigned short int index;
163 DPRINTF(MinorScoreboard,
"Inst: %s depends on execSeqNum: %d\n",
176 unsigned int num_dests = staticInst->
numDestRegs();
179 for (
unsigned int dest_index = 0; dest_index < num_dests;
182 const RegId&
reg = inst->flatDestRegIdx[dest_index];
197 DPRINTF(MinorScoreboard,
"Clearing inst: %s"
198 " regIndex: %d final numResults: %d\n",
215 unsigned int num_srcs = staticInst->
numSrcRegs();
220 unsigned int num_relative_latencies = 0;
226 if (src_reg_relative_latencies &&
227 src_reg_relative_latencies->size() != 0)
229 num_relative_latencies = src_reg_relative_latencies->size();
230 default_relative_latency = (*src_reg_relative_latencies)
231 [num_relative_latencies-1];
237 unsigned int src_index = 0;
238 while (src_index < num_srcs &&
242 unsigned short int index;
247 cant_forward_from_fu_indices &&
248 src_reg_fu < cant_forward_from_fu_indices->size() &&
249 (*cant_forward_from_fu_indices)[src_reg_fu];
252 (src_index >= num_relative_latencies ?
253 default_relative_latency :
254 (*src_reg_relative_latencies)[src_index]));
265 if (debug::MinorTiming) {
266 if (ret && num_srcs > num_relative_latencies &&
267 num_relative_latencies != 0)
269 DPRINTF(MinorTiming,
"Warning, inst: %s timing extra decode has"
270 " more src. regs: %d than relative latencies: %d\n",
271 staticInst->
disassemble(0), num_srcs, num_relative_latencies);
281 std::ostringstream result_stream;
283 bool printed_element =
false;
288 unsigned short int num_unpredictable_results =
291 if (!(num_results == 0 && num_unpredictable_results ==
Cycles(0))) {
293 result_stream <<
',';
295 result_stream <<
'(' <<
i <<
','
296 << num_results <<
'/'
297 << num_unpredictable_results <<
'/'
301 printed_element =
true;
const unsigned vecRegOffset
RegId flatten(const BaseISA &isa) const
@ VecElemClass
Vector Register Native Elem lane.
@ CCRegClass
Condition-code register.
void markupInstDests(MinorDynInstPtr inst, Cycles retire_time, ThreadContext *thread_context, bool mark_unpredictable)
Mark up an instruction's effects by incrementing numResults counts.
std::vector< Index > numUnpredictableResults
Count of the number of results which can't be predicted.
const unsigned matRegOffset
const unsigned numRegs
The number of registers in the Scoreboard.
bool canInstIssue(MinorDynInstPtr inst, const std::vector< Cycles > *src_reg_relative_latencies, const std::vector< bool > *cant_forward_from_fu_indices, Cycles now, ThreadContext *thread_context)
Can this instruction be issued.
std::vector< Index > numResults
Count of the number of in-flight instructions that have results for each register.
const RegId & destRegIdx(int i) const
Return logical index (architectural reg num) of i'th destination reg.
Cycles is a wrapper class for representing cycle counts, i.e.
@ FloatRegClass
Floating-point register.
ThreadContext is the external interface to all thread state for anything outside of the CPU.
@ MatRegClass
Matrix Register.
const RegId & srcRegIdx(int i) const
Return logical index (architectural reg num) of i'th source reg.
void minorTrace() const
MinorTraceIF interface.
std::vector< int > fuIndices
Index of the FU generating this result.
void clearInstDests(MinorDynInstPtr inst, bool clear_unpredictable)
Clear down the dependencies for this instruction.
bool findIndex(const RegId ®, Index &scoreboard_index)
Sets scoreboard_index to the index into numResults of the given register index.
std::vector< InstSeqNum > writingInst
The execute sequence number of the most recent inst to generate this register value.
void minorTrace(const char *fmt, Args ...args)
DPRINTFN for MinorTrace reporting.
unsigned short int Index
Type to use when indexing numResults.
const unsigned ccRegOffset
@ IntRegClass
Integer register.
std::vector< Cycles > returnCycle
The estimated cycle number that the result will be presented.
virtual const std::string & disassemble(Addr pc, const loader::SymbolTable *symtab=nullptr) const
Return string representation of disassembled instruction.
@ MiscRegClass
Control (misc) register.
InstSeqNum execSeqNumToWaitFor(MinorDynInstPtr inst, ThreadContext *thread_context)
Returns the exec sequence number of the most recent inst on which the given inst depends.
static constexpr int invalidFUIndex
uint8_t numDestRegs() const
Number of destination registers.
uint8_t numSrcRegs() const
Number of source registers.
@ VecRegClass
Vector Register.
virtual BaseISA * getIsaPtr() const =0
Reference material can be found at the JEDEC website: UFS standard http://www.jedec....
const unsigned vecPredRegOffset
const unsigned floatRegOffset
Register ID: describe an architectural register with its class and index.
#define panic(...)
This implements a cprintf based panic() function.
Generated on Sun Jul 30 2023 01:56:52 for gem5 by doxygen 1.8.17