O3CPU: Fix thread writeback logic.
Fix the logic in the LSQ that determines if there are any stores to write back. In the commit stage, check for thread specific writebacks instead of just any writeback.
This commit is contained in:
parent
712a8ee700
commit
b784903207
3 changed files with 13 additions and 13 deletions
|
@ -814,7 +814,7 @@ DefaultCommit<Impl>::commit()
|
||||||
// @todo: Make this handle multi-cycle communication between
|
// @todo: Make this handle multi-cycle communication between
|
||||||
// commit and IEW.
|
// commit and IEW.
|
||||||
if (checkEmptyROB[tid] && rob->isEmpty(tid) &&
|
if (checkEmptyROB[tid] && rob->isEmpty(tid) &&
|
||||||
!iewStage->hasStoresToWB() && !committedStores[tid]) {
|
!iewStage->hasStoresToWB(tid) && !committedStores[tid]) {
|
||||||
checkEmptyROB[tid] = false;
|
checkEmptyROB[tid] = false;
|
||||||
toIEW->commitInfo[tid].usedROB = true;
|
toIEW->commitInfo[tid].usedROB = true;
|
||||||
toIEW->commitInfo[tid].emptyROB = true;
|
toIEW->commitInfo[tid].emptyROB = true;
|
||||||
|
@ -968,7 +968,7 @@ DefaultCommit<Impl>::commitHead(DynInstPtr &head_inst, unsigned inst_num)
|
||||||
"instruction [sn:%lli] at the head of the ROB, PC %#x.\n",
|
"instruction [sn:%lli] at the head of the ROB, PC %#x.\n",
|
||||||
head_inst->seqNum, head_inst->readPC());
|
head_inst->seqNum, head_inst->readPC());
|
||||||
|
|
||||||
if (inst_num > 0 || iewStage->hasStoresToWB()) {
|
if (inst_num > 0 || iewStage->hasStoresToWB(tid)) {
|
||||||
DPRINTF(Commit, "Waiting for all stores to writeback.\n");
|
DPRINTF(Commit, "Waiting for all stores to writeback.\n");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -983,7 +983,7 @@ DefaultCommit<Impl>::commitHead(DynInstPtr &head_inst, unsigned inst_num)
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
} else if (head_inst->isLoad()) {
|
} else if (head_inst->isLoad()) {
|
||||||
if (inst_num > 0 || iewStage->hasStoresToWB()) {
|
if (inst_num > 0 || iewStage->hasStoresToWB(tid)) {
|
||||||
DPRINTF(Commit, "Waiting for all stores to writeback.\n");
|
DPRINTF(Commit, "Waiting for all stores to writeback.\n");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -1038,7 +1038,7 @@ DefaultCommit<Impl>::commitHead(DynInstPtr &head_inst, unsigned inst_num)
|
||||||
DPRINTF(Commit, "Inst [sn:%lli] PC %#x has a fault\n",
|
DPRINTF(Commit, "Inst [sn:%lli] PC %#x has a fault\n",
|
||||||
head_inst->seqNum, head_inst->readPC());
|
head_inst->seqNum, head_inst->readPC());
|
||||||
|
|
||||||
if (iewStage->hasStoresToWB() || inst_num > 0) {
|
if (iewStage->hasStoresToWB(tid) || inst_num > 0) {
|
||||||
DPRINTF(Commit, "Stores outstanding, fault must wait.\n");
|
DPRINTF(Commit, "Stores outstanding, fault must wait.\n");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -208,6 +208,9 @@ class DefaultIEW
|
||||||
/** Returns if the LSQ has any stores to writeback. */
|
/** Returns if the LSQ has any stores to writeback. */
|
||||||
bool hasStoresToWB() { return ldstQueue.hasStoresToWB(); }
|
bool hasStoresToWB() { return ldstQueue.hasStoresToWB(); }
|
||||||
|
|
||||||
|
/** Returns if the LSQ has any stores to writeback. */
|
||||||
|
bool hasStoresToWB(unsigned tid) { return ldstQueue.hasStoresToWB(tid); }
|
||||||
|
|
||||||
void incrWb(InstSeqNum &sn)
|
void incrWb(InstSeqNum &sn)
|
||||||
{
|
{
|
||||||
if (++wbOutstanding == wbMax)
|
if (++wbOutstanding == wbMax)
|
||||||
|
|
|
@ -584,17 +584,14 @@ LSQ<Impl>::hasStoresToWB()
|
||||||
std::list<unsigned>::iterator threads = activeThreads->begin();
|
std::list<unsigned>::iterator threads = activeThreads->begin();
|
||||||
std::list<unsigned>::iterator end = activeThreads->end();
|
std::list<unsigned>::iterator end = activeThreads->end();
|
||||||
|
|
||||||
if (threads == end)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
while (threads != end) {
|
while (threads != end) {
|
||||||
unsigned tid = *threads++;
|
unsigned tid = *threads++;
|
||||||
|
|
||||||
if (!hasStoresToWB(tid))
|
if (hasStoresToWB(tid))
|
||||||
return false;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class Impl>
|
template<class Impl>
|
||||||
|
@ -607,11 +604,11 @@ LSQ<Impl>::willWB()
|
||||||
while (threads != end) {
|
while (threads != end) {
|
||||||
unsigned tid = *threads++;
|
unsigned tid = *threads++;
|
||||||
|
|
||||||
if (!willWB(tid))
|
if (willWB(tid))
|
||||||
return false;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class Impl>
|
template<class Impl>
|
||||||
|
|
Loading…
Reference in a new issue