47 #include "debug/Activity.hh"
48 #include "debug/Branch.hh"
49 #include "debug/Drain.hh"
50 #include "debug/ExecFaulting.hh"
51 #include "debug/MinorExecute.hh"
52 #include "debug/MinorInterrupt.hh"
53 #include "debug/MinorMem.hh"
54 #include "debug/MinorTrace.hh"
55 #include "debug/PCEvent.hh"
65 const BaseMinorCPUParams ¶ms,
72 issueLimit(params.executeIssueLimit),
73 memoryIssueLimit(params.executeMemoryIssueLimit),
74 commitLimit(params.executeCommitLimit),
75 memoryCommitLimit(params.executeMemoryCommitLimit),
76 processMoreThanOneInput(params.executeCycleInput),
77 fuDescriptions(*params.executeFuncUnits),
78 numFuncUnits(fuDescriptions.funcUnits.size()),
79 setTraceTimeOnCommit(params.executeSetTraceTimeOnCommit),
80 setTraceTimeOnIssue(params.executeSetTraceTimeOnIssue),
81 allowEarlyMemIssue(params.executeAllowEarlyMemoryIssue),
82 noCostFUIndex(fuDescriptions.funcUnits.size() + 1),
83 lsq(name_ +
".lsq", name_ +
".dcache_port",
85 params.executeMaxAccessesInMemory,
86 params.executeMemoryWidth,
87 params.executeLSQRequestsQueueSize,
88 params.executeLSQTransfersQueueSize,
89 params.executeLSQStoreBufferSize,
90 params.executeLSQMaxStoreBufferStoresPerCycle),
91 executeInfo(params.numThreads,
98 fatal(
"%s: executeCommitLimit must be >= 1 (%d)\n", name_,
103 fatal(
"%s: executeCommitLimit must be >= 1 (%d)\n", name_,
108 fatal(
"%s: executeMemoryIssueLimit must be >= 1 (%d)\n", name_,
113 fatal(
"%s: executeMemoryCommitLimit (%d) must be <="
114 " executeCommitLimit (%d)\n",
118 if (params.executeInputBufferSize < 1) {
119 fatal(
"%s: executeInputBufferSize must be >= 1 (%d)\n", name_,
120 params.executeInputBufferSize);
123 if (params.executeInputBufferSize < 1) {
124 fatal(
"%s: executeInputBufferSize must be >= 1 (%d)\n", name_,
125 params.executeInputBufferSize);
131 unsigned int total_slots = 0;
135 std::ostringstream fu_name;
141 total_slots += fu_description->
opLat;
143 fu_name << name_ <<
".fu." <<
i;
151 for (
int op_class = No_OpClass + 1; op_class <
Num_OpClasses; op_class++) {
152 bool found_fu =
false;
153 unsigned int fu_index = 0;
158 static_cast<OpClass
>(op_class)))
166 warn(
"No functional unit for OpClass %s\n",
167 enums::OpClassStrings[op_class]);
172 for (
ThreadID tid = 0; tid < params.numThreads; tid++) {
178 name_ +
".inputBuffer" + tid_str,
"insts",
179 params.executeInputBufferSize));
181 const auto ®Classes =
cpu.
threads[tid]->getIsaPtr()->regClasses();
184 scoreboard.emplace_back(name_ +
".scoreboard" + tid_str, regClasses);
189 name_ +
".inFlightInsts" + tid_str,
"insts", total_slots);
193 name_ +
".inFUMemInsts" + tid_str,
"insts", total_slots);
223 const std::unique_ptr<PCStateBase> pc_before(inst->pc->clone());
224 std::unique_ptr<PCStateBase> target(thread->
pcState().
clone());
230 inst->isLastOpInInst() &&
231 (inst->staticInst->isSerializeAfter() ||
232 inst->staticInst->isSquashAfter());
235 *pc_before, *target, (force_branch ?
" (forcing)" :
""));
238 bool must_branch = *pc_before != *target ||
246 inst->staticInst->advancePC(*target);
250 *pc_before, *target);
253 if (inst->predictedTaken && !force_branch) {
259 " none happened inst: %s\n",
260 inst->pc->instAddr(), inst->predictedTarget->instAddr(),
264 }
else if (*inst->predictedTarget == *target) {
269 DPRINTF(
Branch,
"Predicted a branch from 0x%x to 0x%x correctly"
271 inst->pc->instAddr(), inst->predictedTarget->instAddr(),
278 " but got the wrong target (actual: 0x%x) inst: %s\n",
279 inst->pc->instAddr(), inst->predictedTarget->instAddr(),
280 target->instAddr(), *inst);
284 }
else if (must_branch) {
286 DPRINTF(
Branch,
"Unpredicted branch from 0x%x to 0x%x inst: %s\n",
287 inst->pc->instAddr(), target->instAddr(), *inst);
316 (inst->isBubble() ?
executeInfo[tid].lastPredictionSeqNum
317 : inst->id.predictionSeqNum),
328 ThreadID thread_id = inst->id.threadId;
335 bool is_load = inst->staticInst->isLoad();
336 bool is_store = inst->staticInst->isStore();
337 bool is_atomic = inst->staticInst->isAtomic();
338 bool is_prefetch = inst->staticInst->isDataPrefetch();
342 bool use_context_predicate =
true;
344 if (inst->translationFault !=
NoFault) {
346 DPRINTF(MinorMem,
"Completing fault from DTLB access: %s\n",
347 inst->translationFault->name());
349 if (inst->staticInst->isPrefetch()) {
350 DPRINTF(MinorMem,
"Not taking fault on prefetch: %s\n",
351 inst->translationFault->name());
356 fault = inst->translationFault;
358 fault->invoke(thread, inst->staticInst);
360 }
else if (!packet) {
361 DPRINTF(MinorMem,
"Completing failed request inst: %s\n",
363 use_context_predicate =
false;
365 inst->staticInst->completeAcc(
nullptr, &context, inst->traceData);
366 }
else if (packet->
isError()) {
367 DPRINTF(MinorMem,
"Trying to commit error response: %s\n",
370 fatal(
"Received error response packet for inst: %s\n", *inst);
371 }
else if (is_store || is_load || is_prefetch || is_atomic) {
374 DPRINTF(MinorMem,
"Memory response inst: %s addr: 0x%x size: %d\n",
377 if (is_load && packet->
getSize() > 0) {
378 DPRINTF(MinorMem,
"Memory data[0]: 0x%x\n",
379 static_cast<unsigned int>(packet->
getConstPtr<uint8_t>()[0]));
383 fault = inst->staticInst->completeAcc(packet, &context,
388 DPRINTF(MinorMem,
"Fault in memory completeAcc: %s\n",
390 fault->invoke(thread, inst->staticInst);
398 fatal(
"There should only ever be reads, "
399 "writes or faults at this point\n");
404 if (inst->traceData) {
405 inst->traceData->setPredicate((use_context_predicate ?
424 DPRINTF(MinorInterrupt,
"Considering interrupt status from PC: %s\n",
436 DPRINTF(MinorInterrupt,
"Invoking interrupt: %s to PC: %s\n",
451 bool &passed_predicate,
Fault &fault)
456 passed_predicate =
false;
464 std::unique_ptr<PCStateBase> old_pc(thread->
pcState().
clone());
468 DPRINTF(MinorExecute,
"Initiating memRef inst: %s\n", *inst);
470 Fault init_fault = inst->staticInst->initiateAcc(&context,
475 assert(inst->translationFault !=
NoFault);
481 inst->translationFault =
NoFault;
486 DPRINTF(MinorExecute,
"Fault on memory inst: %s"
487 " initiateAcc: %s\n", *inst, init_fault->name());
493 DPRINTF(MinorMem,
"No memory access for inst: %s\n", *inst);
500 inst->traceData->setPredicate(passed_predicate);
526 unsigned int ret =
index + 1;
528 if (ret == cycle_size)
541 ret = cycle_size - 1;
557 unsigned int fu_index = 0;
566 unsigned num_insts_issued = 0;
569 unsigned num_mem_insts_issued = 0;
573 Fault fault = inst->fault;
574 bool discarded =
false;
575 bool issued_mem_ref =
false;
577 if (inst->isBubble()) {
583 DPRINTF(MinorExecute,
"Discarding inst: %s from suspended"
588 }
else if (inst->id.streamSeqNum != thread.
streamSeqNum) {
589 DPRINTF(MinorExecute,
"Discarding inst: %s as its stream"
590 " state was unexpected, expected: %d\n",
607 DPRINTF(MinorExecute,
"Trying to issue inst: %s to FU: %d\n",
614 bool fu_is_capable = (!inst->isFault() ?
615 fu->provides(inst->staticInst->opClass()) :
true);
617 if (inst->isNoCostInst()) {
632 inst->extraCommitDelay =
Cycles(0);
633 inst->extraCommitDelayExpr = NULL;
642 }
else if (!fu_is_capable ||
fu->alreadyPushed()) {
644 if (!fu_is_capable) {
645 DPRINTF(MinorExecute,
"Can't issue as FU: %d isn't"
646 " capable\n", fu_index);
648 DPRINTF(MinorExecute,
"Can't issue as FU: %d is"
649 " already busy\n", fu_index);
651 }
else if (
fu->stalled) {
652 DPRINTF(MinorExecute,
"Can't issue inst: %s into FU: %d,"
655 }
else if (!
fu->canInsert()) {
656 DPRINTF(MinorExecute,
"Can't issue inst: %s to busy FU"
657 " for another: %d cycles\n",
658 *inst,
fu->cyclesBeforeInsert());
661 fu->findTiming(inst->staticInst) : NULL);
668 &(
fu->cantForwardFromFUIndices);
671 DPRINTF(MinorExecute,
"Can't issue inst: %s as extra"
672 " decoding is suppressing it\n",
674 }
else if (!
scoreboard[thread_id].canInstIssue(inst,
675 src_latencies, cant_forward_from_fu_indices,
678 DPRINTF(MinorExecute,
"Can't issue inst: %s yet\n",
682 DPRINTF(MinorExecute,
"Issuing inst: %s"
683 " into FU %d\n", *inst,
687 TimingExpr *extra_dest_retire_lat_expr = NULL;
693 extra_dest_retire_lat =
695 extra_dest_retire_lat_expr =
701 issued_mem_ref = inst->isMemRef();
706 inst->fuIndex = fu_index;
707 inst->extraCommitDelay = extra_dest_retire_lat;
708 inst->extraCommitDelayExpr =
709 extra_dest_retire_lat_expr;
711 if (issued_mem_ref) {
716 inst->instToWaitFor =
717 scoreboard[thread_id].execSeqNumToWaitFor(inst,
723 DPRINTF(MinorExecute,
"A barrier will"
724 " cause a delay in mem ref issue of"
725 " inst: %s until after inst"
726 " %d(exec)\n", *inst,
729 inst->instToWaitFor =
732 DPRINTF(MinorExecute,
"Memory ref inst:"
733 " %s must wait for inst %d(exec)"
735 *inst, inst->instToWaitFor);
738 inst->canEarlyIssue =
true;
742 DPRINTF(MinorExecute,
"Pushing mem inst: %s\n",
756 fu->description.opLat +
757 extra_dest_retire_lat +
760 issued_mem_ref && extra_assumed_lat ==
Cycles(0));
774 DPRINTF(MinorExecute,
"Didn't issue inst: %s\n", *inst);
780 if (debug::MinorTrace && !inst->isBubble()) {
781 inst->minorTraceInst(*
this);
785 if (!discarded && inst->isInst() &&
786 inst->staticInst->isFullMemBarrier())
788 DPRINTF(MinorMem,
"Issuing memory barrier inst: %s\n", *inst);
793 inst->traceData->setWhen(
curTick());
797 num_mem_insts_issued++;
799 if (!discarded && !inst->isBubble()) {
803 DPRINTF(MinorExecute,
"Reached inst issue limit\n");
807 DPRINTF(MinorExecute,
"Stepping to next inst inputIndex: %d\n",
819 DPRINTF(MinorExecute,
"Wrapping\n");
830 return num_insts_issued;
837 unsigned int num_pc_event_checks = 0;
843 cpu.
threads[thread_id]->pcEventQueue.service(oldPC, thread);
844 num_pc_event_checks++;
847 if (num_pc_event_checks > 1) {
852 return num_pc_event_checks > 1;
858 assert(!inst->isFault());
864 if (!inst->staticInst->isMicroop() || inst->staticInst->isLastMicroop())
878 ->committedInstType[inst->staticInst->opClass()]++;
882 inst->traceData->setCPSeq(thread->
numOp);
890 bool &completed_mem_issue)
892 ThreadID thread_id = inst->id.threadId;
895 bool completed_inst =
true;
903 panic(
"We should never hit the case where we try to commit from a "
904 "suspended thread as the streamSeqNum should not match");
905 }
else if (inst->isFault()) {
908 DPRINTF(MinorExecute,
"Fault inst reached Execute: %s\n",
909 inst->fault->name());
912 inst->fault->invoke(thread, NULL);
915 }
else if (inst->staticInst->isMemRef()) {
928 bool predicate_passed =
false;
930 predicate_passed, fault);
932 if (completed_mem_inst && fault !=
NoFault) {
933 if (early_memory_issue) {
934 DPRINTF(MinorExecute,
"Fault in early executing inst: %s\n",
938 inst->canEarlyIssue =
false;
941 completed_inst =
false;
943 DPRINTF(MinorExecute,
"Fault in execute: %s\n",
945 fault->invoke(thread, NULL);
948 completed_inst =
true;
951 completed_inst = completed_mem_inst;
953 completed_mem_issue = completed_inst;
954 }
else if (inst->isInst() && inst->staticInst->isFullMemBarrier() &&
957 DPRINTF(MinorExecute,
"Can't commit data barrier inst: %s yet as"
958 " there isn't space in the store buffer\n", *inst);
960 completed_inst =
false;
961 }
else if (inst->isInst() && inst->staticInst->isQuiesce()
965 completed_inst =
false;
969 DPRINTF(MinorExecute,
"Committing inst: %s\n", *inst);
971 fault = inst->staticInst->execute(&context,
981 if (inst->traceData) {
982 if (debug::ExecFaulting) {
983 inst->traceData->setFaulting(
true);
985 delete inst->traceData;
986 inst->traceData = NULL;
990 DPRINTF(MinorExecute,
"Fault in execute of inst: %s fault: %s\n",
991 *inst, fault->name());
992 fault->invoke(thread, inst->staticInst);
999 if (completed_inst) {
1003 executeInfo[thread_id].lastPredictionSeqNum = inst->id.predictionSeqNum;
1006 if (!inst->isFault() &&
1014 assert(resume_pc.microPC() == 0);
1016 DPRINTF(MinorInterrupt,
"Suspending thread: %d from Execute"
1017 " inst: %s\n", thread_id, *inst);
1026 return completed_inst;
1064 bool completed_inst =
true;
1067 unsigned int num_insts_committed = 0;
1071 unsigned int num_mem_refs_committed = 0;
1073 if (only_commit_microops && !ex_info.
inFlightInsts->empty()) {
1074 DPRINTF(MinorInterrupt,
"Only commit microops %s %d\n",
1086 if (only_commit_microops) {
1087 DPRINTF(MinorInterrupt,
"Committing tail of insts before"
1095 head_inflight_inst->
inst->id.execSeqNum;
1102 bool committed_inst =
false;
1103 bool discard_inst =
false;
1104 bool completed_mem_ref =
false;
1105 bool issued_mem_ref =
false;
1106 bool early_memory_issue =
false;
1109 completed_inst =
false;
1121 DPRINTF(MinorExecute,
"Trying to commit canCommitInsts: %d\n",
1131 }
else if (mem_response &&
1135 discard_inst = inst->id.streamSeqNum !=
1138 DPRINTF(MinorExecute,
"Trying to commit mem response: %s\n",
1143 DPRINTF(MinorExecute,
"Discarding mem inst: %s as its"
1144 " stream state was unexpected, expected: %d\n",
1150 committed_inst =
true;
1153 completed_mem_ref =
true;
1154 completed_inst =
true;
1155 }
else if (can_commit_insts) {
1160 bool try_to_commit =
false;
1172 DPRINTF(MinorExecute,
"Trying to commit from mem FUs\n");
1181 if (!fu_inst->isBubble() &&
1183 fu_inst->canEarlyIssue &&
1185 head_exec_seq_num > fu_inst->instToWaitFor)
1187 DPRINTF(MinorExecute,
"Issuing mem ref early"
1188 " inst: %s instToWaitFor: %d\n",
1189 *(fu_inst), fu_inst->instToWaitFor);
1192 try_to_commit =
true;
1193 early_memory_issue =
true;
1194 completed_inst =
true;
1199 if (!completed_inst && inst->isNoCostInst()) {
1200 DPRINTF(MinorExecute,
"Committing no cost inst: %s", *inst);
1202 try_to_commit =
true;
1203 completed_inst =
true;
1208 if (!completed_inst && !inst->inLSQ) {
1209 DPRINTF(MinorExecute,
"Trying to commit from FUs\n");
1218 if (fu_inst.
inst->isBubble()) {
1220 completed_inst =
false;
1221 }
else if (fu_inst_seq_num != head_exec_seq_num) {
1227 }
else if (fu_inst.
inst->id == inst->id) {
1231 try_to_commit =
true;
1232 completed_inst =
true;
1236 if (try_to_commit) {
1237 discard_inst = inst->id.streamSeqNum !=
1242 if (!discard_inst) {
1248 if (inst->extraCommitDelayExpr) {
1249 DPRINTF(MinorExecute,
"Evaluating expression for"
1250 " extra commit delay inst: %s\n", *inst);
1257 uint64_t extra_delay = inst->extraCommitDelayExpr->
1260 DPRINTF(MinorExecute,
"Extra commit delay expr"
1261 " result: %d\n", extra_delay);
1263 if (extra_delay < 128) {
1264 inst->extraCommitDelay +=
Cycles(extra_delay);
1266 DPRINTF(MinorExecute,
"Extra commit delay was"
1267 " very long: %d\n", extra_delay);
1269 inst->extraCommitDelayExpr = NULL;
1274 if (inst->extraCommitDelay !=
Cycles(0)) {
1276 inst->extraCommitDelay;
1277 inst->extraCommitDelay =
Cycles(0);
1282 if (!inst->isFault() && inst->isMemRef() &&
1284 inst->id.execSeqNum &&
1287 DPRINTF(MinorExecute,
"Not committing inst: %s yet"
1288 " as there are incomplete barriers in flight\n",
1290 completed_inst =
false;
1291 }
else if (inst->minimumCommitCycle > now) {
1292 DPRINTF(MinorExecute,
"Not committing inst: %s yet"
1293 " as it wants to be stalled for %d more cycles\n",
1294 *inst, inst->minimumCommitCycle - now);
1295 completed_inst =
false;
1298 early_memory_issue, branch, fault,
1299 committed_inst, issued_mem_ref);
1303 completed_inst =
true;
1306 if (completed_inst) {
1312 DPRINTF(MinorExecute,
"Unstalling %d for inst %s\n", inst->fuIndex, inst->id);
1313 funcUnits[inst->fuIndex]->stalled =
false;
1318 DPRINTF(MinorExecute,
"No instructions to commit\n");
1319 completed_inst =
false;
1323 assert(!(discard_inst && !completed_inst));
1328 DPRINTF(MinorExecute,
"Discarding inst: %s as its stream"
1329 " state was unexpected, expected: %d\n",
1338 if (issued_mem_ref) {
1345 if (completed_inst && inst->isMemRef()) {
1355 if (completed_inst && !(issued_mem_ref && fault ==
NoFault)) {
1357 DPRINTF(MinorExecute,
"Completed inst: %s\n", *inst);
1361 inst->isLastOpInInst();
1372 if (inst->isInst() && inst->staticInst->isFullMemBarrier()) {
1373 DPRINTF(MinorMem,
"Completing memory barrier"
1374 " inst: %s committed: %d\n", *inst, committed_inst);
1378 scoreboard[thread_id].clearInstDests(inst, inst->isMemRef());
1382 if (committed_inst) {
1383 bool is_no_cost_inst = inst->isNoCostInst();
1387 if (debug::MinorTrace && !is_no_cost_inst)
1390 if (!is_no_cost_inst)
1391 num_insts_committed++;
1394 DPRINTF(MinorExecute,
"Reached inst commit limit\n");
1398 if (inst->traceData) {
1400 inst->traceData->setWhen(
curTick());
1401 inst->traceData->dump();
1404 if (completed_mem_ref)
1405 num_mem_refs_committed++;
1408 DPRINTF(MinorExecute,
"Reached mem ref commit limit\n");
1416 return executeInfo[thread_id].lastCommitWasEndOfMacroop &&
1423 if (!
inp.outputWire->isBubble())
1428 unsigned int num_issued = 0;
1435 bool interrupted =
false;
1444 DPRINTF(MinorInterrupt,
"Execute skipping a cycle to allow old"
1445 " branch to complete\n");
1452 DPRINTF(MinorExecute,
"Attempting to commit [tid:%d]\n",
1459 commit(commit_tid,
true,
false, branch);
1470 commit(commit_tid,
false,
true, branch);
1475 DPRINTF(MinorExecute,
"Committing micro-ops for interrupt[tid:%d]\n",
1477 bool only_commit_microops = interrupted &&
1479 commit(commit_tid, only_commit_microops,
false, branch);
1497 DPRINTF(MinorExecute,
"Attempting to issue [tid:%d]\n",
1499 num_issued =
issue(issue_tid);
1507 bool can_issue_next =
false;
1513 unsigned int input_index =
executeInfo[tid].inputIndex;
1515 if (inst->isFault()) {
1516 can_issue_next =
true;
1517 }
else if (!inst->isBubble()) {
1518 next_issuable_insts.push_back(inst);
1523 bool becoming_stalled =
true;
1533 if (
fu->occupancy !=0 && !
fu->stalled)
1534 becoming_stalled =
false;
1540 for (
auto inst : next_issuable_insts) {
1541 if (!
fu->stalled &&
fu->provides(inst->staticInst->opClass()) &&
1542 scoreboard[inst->id.threadId].canInstIssue(inst,
1545 can_issue_next =
true;
1551 bool head_inst_might_commit =
false;
1555 if (!info.inFlightInsts->empty()) {
1556 const QueuedInst &head_inst = info.inFlightInsts->front();
1558 if (head_inst.
inst->isNoCostInst()) {
1559 head_inst_might_commit =
true;
1563 fu->front().inst->id == head_inst.
inst->id) ||
1566 head_inst_might_commit =
true;
1573 DPRINTF(Activity,
"Need to tick num issued insts: %s%s%s%s%s%s\n",
1574 (num_issued != 0 ?
" (issued some insts)" :
""),
1575 (becoming_stalled ?
"(becoming stalled)" :
"(not becoming stalled)"),
1576 (can_issue_next ?
" (can issued next inst)" :
""),
1577 (head_inst_might_commit ?
"(head inst might commit)" :
""),
1579 (interrupted ?
" (interrupted)" :
""));
1583 !becoming_stalled ||
1585 head_inst_might_commit ||
1589 if (!need_to_tick) {
1590 DPRINTF(Activity,
"The next cycle might be skippable as there are no"
1591 " advanceable FUs\n");
1603 if (!
inp.outputWire->isBubble())
1615 bool thread_interrupted =
false;
1622 interrupted = interrupted || thread_interrupted;
1624 DPRINTF(MinorInterrupt,
"No interrupt controller\n");
1626 DPRINTF(MinorInterrupt,
"[tid:%d] thread_interrupted?=%d isInbetweenInsts?=%d\n",
1656 std::ostringstream insts;
1657 std::ostringstream stalled;
1659 executeInfo[0].instsBeingCommitted.reportData(insts);
1668 stalled << (
funcUnits[
i]->stalled ?
'1' :
'E');
1675 " stalled=%s drainState=%d isInbetweenInsts=%d\n",
1692 case enums::SingleThreaded:
1694 case enums::RoundRobin:
1701 panic(
"Invalid thread policy");
1704 for (
auto tid : priority_list) {
1707 if (can_commit_insts) {
1711 can_commit_insts = can_commit_insts &&
1715 bool can_transfer_mem_inst =
false;
1721 can_transfer_mem_inst =
1722 !fu_inst->isBubble() &&
1723 fu_inst->id.threadId == tid &&
1725 fu_inst->canEarlyIssue &&
1726 inst->id.execSeqNum > fu_inst->instToWaitFor;
1730 if (can_commit_insts && !can_transfer_mem_inst &&
1734 can_execute_fu_inst = !fu_inst.
inst->isBubble() &&
1735 fu_inst.
inst->id == inst->id;
1738 can_commit_insts = can_commit_insts &&
1739 (can_transfer_mem_inst || can_execute_fu_inst);
1744 if (can_commit_insts) {
1759 case enums::SingleThreaded:
1761 case enums::RoundRobin:
1768 panic(
"Invalid thread scheduling policy.");
1771 for (
auto tid : priority_list) {
1784 DPRINTF(Drain,
"MinorExecute drainResume\n");
1798 os <<
"NotDraining";
1801 os <<
"DrainCurrentInst";
1804 os <<
"DrainHaltFetch";
1807 os <<
"DrainAllInsts";
1810 os <<
"Drain-" <<
static_cast<int>(
state);
1820 DPRINTF(Drain,
"setDrainState[%d]: %s\n", thread_id,
state);
1827 DPRINTF(Drain,
"MinorExecute drain\n");
1875 return inst->id.streamSeqNum ==
executeInfo[inst->id.threadId].streamSeqNum;
1883 if (!
executeInfo[inst->id.threadId].inFlightInsts->empty())
1884 ret =
executeInfo[inst->id.threadId].inFlightInsts->front().inst->id == inst->id;