diff --git a/src/cpu/o3/iew_impl.hh b/src/cpu/o3/iew_impl.hh index 448be3a74d..bf44fb9f2a 100644 --- a/src/cpu/o3/iew_impl.hh +++ b/src/cpu/o3/iew_impl.hh @@ -381,7 +381,7 @@ template bool DefaultIEW::isDrained() const { - bool drained(ldstQueue.isDrained()); + bool drained = ldstQueue.isDrained() && instQueue.isDrained(); for (ThreadID tid = 0; tid < numThreads; tid++) { if (!insts[tid].empty()) { diff --git a/src/cpu/o3/inst_queue.hh b/src/cpu/o3/inst_queue.hh index d59d5281b5..c6c55d08aa 100644 --- a/src/cpu/o3/inst_queue.hh +++ b/src/cpu/o3/inst_queue.hh @@ -145,6 +145,9 @@ class InstructionQueue /** Sets the global time buffer. */ void setTimeBuffer(TimeBuffer *tb_ptr); + /** Determine if we are drained. */ + bool isDrained() const; + /** Perform sanity checks after a drain. */ void drainSanityCheck() const; diff --git a/src/cpu/o3/inst_queue_impl.hh b/src/cpu/o3/inst_queue_impl.hh index 0caee41ed2..6a76b49d06 100644 --- a/src/cpu/o3/inst_queue_impl.hh +++ b/src/cpu/o3/inst_queue_impl.hh @@ -440,6 +440,17 @@ InstructionQueue::setTimeBuffer(TimeBuffer *tb_ptr) fromCommit = timeBuffer->getWire(-commitToIEWDelay); } +template +bool +InstructionQueue::isDrained() const +{ + bool drained = dependGraph.empty() && instsToExecute.empty(); + for (ThreadID tid = 0; tid < numThreads; ++tid) + drained = drained && memDepUnit[tid].isDrained(); + + return drained; +} + template void InstructionQueue::drainSanityCheck() const diff --git a/src/cpu/o3/mem_dep_unit.hh b/src/cpu/o3/mem_dep_unit.hh index 3cc1d88fe0..c2c411fe45 100644 --- a/src/cpu/o3/mem_dep_unit.hh +++ b/src/cpu/o3/mem_dep_unit.hh @@ -104,6 +104,9 @@ class MemDepUnit /** Registers statistics. */ void regStats(); + /** Determine if we are drained. */ + bool isDrained() const; + /** Perform sanity checks after a drain. */ void drainSanityCheck() const; diff --git a/src/cpu/o3/mem_dep_unit_impl.hh b/src/cpu/o3/mem_dep_unit_impl.hh index 6684e4ff03..376198fc1a 100644 --- a/src/cpu/o3/mem_dep_unit_impl.hh +++ b/src/cpu/o3/mem_dep_unit_impl.hh @@ -127,6 +127,19 @@ MemDepUnit::regStats() .desc("Number of conflicting stores."); } +template +bool +MemDepUnit::isDrained() const +{ + bool drained = instsToReplay.empty() + && memDepHash.empty() + && instsToReplay.empty(); + for (int i = 0; i < Impl::MaxThreads; ++i) + drained = drained && instList[i].empty(); + + return drained; +} + template void MemDepUnit::drainSanityCheck() const