O3CPU: Fix iqCount and lsqCount SMT fetch policies.
authorTimothy M. Jones <timothy.jones@cl.cam.ac.uk>
Fri, 25 Feb 2011 13:50:29 +0000 (13:50 +0000)
committerTimothy M. Jones <timothy.jones@cl.cam.ac.uk>
Fri, 25 Feb 2011 13:50:29 +0000 (13:50 +0000)
Fixes two of the SMT fetch policies in O3CPU that were returning the count
of instructions in the IQ or LSQ rather than the thread ID to fetch from.

src/cpu/o3/fetch_impl.hh

index 2c490676071228e17efb8d32029a9945b7cce7f7..a2f2b4f8a1bfb2df618055196e466de67c39df04 100644 (file)
@@ -1404,19 +1404,22 @@ template<class Impl>
 ThreadID
 DefaultFetch<Impl>::iqCount()
 {
-    std::priority_queue<ThreadID> PQ;
+    std::priority_queue<unsigned> PQ;
+    std::map<unsigned, ThreadID> threadMap;
 
     list<ThreadID>::iterator threads = activeThreads->begin();
     list<ThreadID>::iterator end = activeThreads->end();
 
     while (threads != end) {
         ThreadID tid = *threads++;
+        unsigned iqCount = fromIEW->iewInfo[tid].iqCount;
 
-        PQ.push(fromIEW->iewInfo[tid].iqCount);
+        PQ.push(iqCount);
+        threadMap[iqCount] = tid;
     }
 
     while (!PQ.empty()) {
-        ThreadID high_pri = PQ.top();
+        ThreadID high_pri = threadMap[PQ.top()];
 
         if (fetchStatus[high_pri] == Running ||
             fetchStatus[high_pri] == IcacheAccessComplete ||
@@ -1434,19 +1437,22 @@ template<class Impl>
 ThreadID
 DefaultFetch<Impl>::lsqCount()
 {
-    std::priority_queue<ThreadID> PQ;
+    std::priority_queue<unsigned> PQ;
+    std::map<unsigned, ThreadID> threadMap;
 
     list<ThreadID>::iterator threads = activeThreads->begin();
     list<ThreadID>::iterator end = activeThreads->end();
 
     while (threads != end) {
         ThreadID tid = *threads++;
+        unsigned ldstqCount = fromIEW->iewInfo[tid].ldstqCount;
 
-        PQ.push(fromIEW->iewInfo[tid].ldstqCount);
+        PQ.push(ldstqCount);
+        threadMap[ldstqCount] = tid;
     }
 
     while (!PQ.empty()) {
-        ThreadID high_pri = PQ.top();
+        ThreadID high_pri = threadMap[PQ.top()];
 
         if (fetchStatus[high_pri] == Running ||
             fetchStatus[high_pri] == IcacheAccessComplete ||