Fix the O3CPU to support the multi-pass method for checking if the system has fully...
authorKevin Lim <ktlim@umich.edu>
Thu, 6 Jul 2006 21:57:20 +0000 (17:57 -0400)
committerKevin Lim <ktlim@umich.edu>
Thu, 6 Jul 2006 21:57:20 +0000 (17:57 -0400)
src/cpu/o3/commit.hh:
src/cpu/o3/commit_impl.hh:
src/cpu/o3/decode.hh:
src/cpu/o3/decode_impl.hh:
src/cpu/o3/fetch.hh:
src/cpu/o3/fetch_impl.hh:
src/cpu/o3/iew.hh:
src/cpu/o3/iew_impl.hh:
src/cpu/o3/rename.hh:
src/cpu/o3/rename_impl.hh:
    Return a value so that the CPU can instantly return from draining if the pipeline is already drained.
src/cpu/o3/cpu.cc:
    Use values returned from pipeline stages so that the CPU can instantly return from draining if the pipeline is already drained.

--HG--
extra : convert_revision : d8ef6b811644ea67c8b40c4719273fa224105811

src/cpu/o3/commit.hh
src/cpu/o3/commit_impl.hh
src/cpu/o3/cpu.cc
src/cpu/o3/decode.hh
src/cpu/o3/decode_impl.hh
src/cpu/o3/fetch.hh
src/cpu/o3/fetch_impl.hh
src/cpu/o3/iew.hh
src/cpu/o3/iew_impl.hh
src/cpu/o3/rename.hh
src/cpu/o3/rename_impl.hh

index 49ff5cdadbfd6620b7b16a896e21bd8556495812..c39bc10f98cc0f0da201feb02e234ff67d3f3aba 100644 (file)
@@ -188,7 +188,7 @@ class DefaultCommit
     void initStage();
 
     /** Initializes the draining of commit. */
-    void drain();
+    bool drain();
 
     /** Resumes execution after draining. */
     void resume();
index 2eb05afac2ac6168ffd73796039a2553f3ba7310..b50c9a898fb5973ee488c96347ad5c1bc406e83f 100644 (file)
@@ -350,10 +350,18 @@ DefaultCommit<Impl>::initStage()
 }
 
 template <class Impl>
-void
+bool
 DefaultCommit<Impl>::drain()
 {
     drainPending = true;
+
+    // If it's already drained, return true.
+    if (rob->isEmpty() && !iewStage->hasStoresToWB()) {
+        cpu->signalDrained();
+        return true;
+    }
+
+    return false;
 }
 
 template <class Impl>
index b182d5ca78a2f5976b502731284f238ef36434e6..3a52fe4c2a05c3e922f03280651f9a99bb2ace11 100644 (file)
@@ -712,19 +712,27 @@ bool
 FullO3CPU<Impl>::drain(Event *drain_event)
 {
     drainCount = 0;
-    drainEvent = drain_event;
     fetch.drain();
     decode.drain();
     rename.drain();
     iew.drain();
     commit.drain();
+    // A bit of a hack...set the drainEvent after all the drain()
+    // calls have been made, that way if all of the stages drain
+    // immediately, the signalDrained() function knows not to call
+    // process on the drain event.
+    drainEvent = drain_event;
 
     // Wake the CPU and record activity so everything can drain out if
-    // the CPU is currently idle.
-    wakeCPU();
-    activityRec.activity();
+    // the CPU was not able to immediately drain.
+    if (_status != Drained) {
+        wakeCPU();
+        activityRec.activity();
 
-    return false;
+        return false;
+    } else {
+        return true;
+    }
 }
 
 template <class Impl>
@@ -751,8 +759,13 @@ FullO3CPU<Impl>::signalDrained()
     if (++drainCount == NumStages) {
         if (tickEvent.scheduled())
             tickEvent.squash();
+
         _status = Drained;
-        drainEvent->process();
+
+        if (drainEvent) {
+            drainEvent->process();
+            drainEvent = NULL;
+        }
     }
     assert(drainCount <= 5);
 }
index 1e96f188485beab0be984c9bb3b298a18d9f74d8..7f5ecbc269397b0c83f41b9c375b0344f5d3d88f 100644 (file)
@@ -110,7 +110,7 @@ class DefaultDecode
     void setActiveThreads(std::list<unsigned> *at_ptr);
 
     /** Drains the decode stage. */
-    void drain();
+    bool drain();
 
     /** Resumes execution after a drain. */
     void resume() { }
index 71637883bc1e9d25b3cb884045531958545e2f31..8b851c032810327f4fb8f3f0aa0891dacb55f404 100644 (file)
@@ -165,11 +165,12 @@ DefaultDecode<Impl>::setActiveThreads(list<unsigned> *at_ptr)
 }
 
 template <class Impl>
-void
+bool
 DefaultDecode<Impl>::drain()
 {
     // Decode is done draining at any time.
     cpu->signalDrained();
+    return true;
 }
 
 template <class Impl>
index 9611f0455b46a6974091df251f9a97b2efb80a7b..a793c736127e1d675183180acb4342d5fb6f2bc5 100644 (file)
@@ -181,7 +181,7 @@ class DefaultFetch
     void processCacheCompletion(PacketPtr pkt);
 
     /** Begins the drain of the fetch stage. */
-    void drain();
+    bool drain();
 
     /** Resumes execution after a drain. */
     void resume();
index 500b5304ebf77de9f3dbace83c136f50f8130d1a..c0cc189f27043d4801c4a1e00ebe1e843a47c172 100644 (file)
@@ -385,12 +385,13 @@ DefaultFetch<Impl>::processCacheCompletion(PacketPtr pkt)
 }
 
 template <class Impl>
-void
+bool
 DefaultFetch<Impl>::drain()
 {
     // Fetch is ready to drain at any time.
     cpu->signalDrained();
     drainPending = true;
+    return true;
 }
 
 template <class Impl>
index 774b6dcbdca02a1660654ef1c5bc8bdd17f308ae..4908a66495f4eed3a8c2fa9c24c0612292540b37 100644 (file)
@@ -144,7 +144,7 @@ class DefaultIEW
     void setScoreboard(Scoreboard *sb_ptr);
 
     /** Drains IEW stage. */
-    void drain();
+    bool drain();
 
     /** Resumes execution after a drain. */
     void resume();
index c3aa748ae8468163d48882e472d072e313ff0717..0d82645e337857d05b57f092f93aa22c87b4514f 100644 (file)
@@ -354,11 +354,12 @@ DefaultIEW<Impl>::setScoreboard(Scoreboard *sb_ptr)
 }
 
 template <class Impl>
-void
+bool
 DefaultIEW<Impl>::drain()
 {
     // IEW is ready to drain at any time.
     cpu->signalDrained();
+    return true;
 }
 
 template <class Impl>
index 538dd9bb43340abe5241340022c660228fd72c6c..034087febb3af48c2695b6806b292a3d3f572c02 100644 (file)
@@ -158,7 +158,7 @@ class DefaultRename
     void setScoreboard(Scoreboard *_scoreboard);
 
     /** Drains the rename stage. */
-    void drain();
+    bool drain();
 
     /** Resumes execution after a drain. */
     void resume() { }
index fddbae3dba5773d3c648cb6ea952976422349cf8..805a72808aba46a43ed274866a1bf312f0905522 100644 (file)
@@ -257,11 +257,12 @@ DefaultRename<Impl>::setScoreboard(Scoreboard *_scoreboard)
 }
 
 template <class Impl>
-void
+bool
 DefaultRename<Impl>::drain()
 {
     // Rename is ready to switch out at any time.
     cpu->signalDrained();
+    return true;
 }
 
 template <class Impl>