O3 CPU: Improve handling of delayed commit flag
authorNilay Vaish <nilay@cs.wisc.edu>
Fri, 10 Feb 2012 14:37:31 +0000 (08:37 -0600)
committerNilay Vaish <nilay@cs.wisc.edu>
Fri, 10 Feb 2012 14:37:31 +0000 (08:37 -0600)
The delayed commit flag is used in conjunction with interrupt pending flag to
figure out whether or not fetch stage should get more instructions. This patch
clears this flag when instructions are squashed. Also, in case an interrupt is
pending, currently it is not possible to access the instruction cache. This
patch allows accessing the cache in case this flag is set.

src/cpu/o3/fetch_impl.hh

index 72d9e960e6386d58b417010b583fad457b95863d..0b4067f7eeea67cce872dedd28e98ffbd8b6e229 100644 (file)
@@ -544,7 +544,7 @@ DefaultFetch<Impl>::fetchCacheLine(Addr vaddr, ThreadID tid, Addr pc)
         DPRINTF(Fetch, "[tid:%i] Can't fetch cache line, switched out\n",
                 tid);
         return false;
-    } else if (checkInterrupt(pc)) {
+    } else if (checkInterrupt(pc) && !delayedCommit[tid]) {
         // Hold off fetch from getting new instructions when:
         // Cache is blocked, or
         // while an interrupt is pending and we're not in PAL mode, or
@@ -721,6 +721,13 @@ DefaultFetch<Impl>::doSquash(const TheISA::PCState &newPC,
 
     fetchStatus[tid] = Squashing;
 
+    // microops are being squashed, it is not known wheather the
+    // youngest non-squashed microop was  marked delayed commit
+    // or not. Setting the flag to true ensures that the
+    // interrupts are not handled when they cannot be, though
+    // some opportunities to handle interrupts may be missed.
+    delayedCommit[tid] = true;
+
     ++fetchSquashCycles;
 }