alpha: Make the TLB cache to actually work.
authorVincentius Robby <acolyte@umich.edu>
Wed, 8 Aug 2007 18:18:09 +0000 (14:18 -0400)
committerVincentius Robby <acolyte@umich.edu>
Wed, 8 Aug 2007 18:18:09 +0000 (14:18 -0400)
Improve MRU checking for StaticInst, Bus, TLB

--HG--
extra : convert_revision : 9116b5655cd2986aeb4205438aad4a0f5a440006

src/arch/alpha/tlb.cc
src/cpu/static_inst.hh
src/mem/bus.hh

index 205b81baf96f9dcdb3674c3633b81265e5b15683..16aaca54d57739e72196cffdc13175f2c5843180 100644 (file)
@@ -80,16 +80,21 @@ TLB::lookup(Addr vpn, uint8_t asn) const
     // assume not found...
     PTE *retval = NULL;
 
-    if (PTECache[0] && vpn == PTECache[0]->tag &&
-        (PTECache[0]->asma || PTECache[0]->asn == asn))
-        retval = PTECache[0];
-    else if (PTECache[1] && vpn == PTECache[1]->tag &&
-        (PTECache[1]->asma || PTECache[1]->asn == asn))
-        retval = PTECache[1];
-    else if (PTECache[2] && vpn == PTECache[2]->tag &&
-        (PTECache[2]->asma || PTECache[2]->asn == asn))
-        retval = PTECache[2];
-    else {
+    if (PTECache[0]) {
+        if (vpn == PTECache[0]->tag &&
+            (PTECache[0]->asma || PTECache[0]->asn == asn))
+            retval = PTECache[0];
+        else if (PTECache[1]) {
+            if (vpn == PTECache[1]->tag &&
+                (PTECache[1]->asma || PTECache[1]->asn == asn))
+                retval = PTECache[1];
+            else if (PTECache[2] && vpn == PTECache[2]->tag &&
+                     (PTECache[2]->asma || PTECache[2]->asn == asn))
+                retval = PTECache[2];
+        }
+    }
+
+    if (retval == NULL)
         PageTable::const_iterator i = lookupTable.find(vpn);
         if (i != lookupTable.end()) {
             while (i->first == vpn) {
@@ -98,6 +103,9 @@ TLB::lookup(Addr vpn, uint8_t asn) const
                 assert(pte->valid);
                 if (vpn == pte->tag && (pte->asma || pte->asn == asn)) {
                     retval = pte;
+                    PTECache[2] = PTECache[1];
+                    PTECache[1] = PTECache[0];
+                    PTECache[0] = pte;
                     break;
                 }
 
index 2e1ebd76633a9dd08c5df5791859cef06adf0fe8..c4a29da59a0ae033579ef1e757c050898a0b45e6 100644 (file)
@@ -597,20 +597,19 @@ StaticInst::decode(StaticInst::ExtMachInst mach_inst, Addr addr)
     Addr page_addr = addr & ~(TheISA::PageBytes - 1);
 
     // checks recently decoded addresses
-    if (recentDecodes[0].decodePage &&
-        page_addr == recentDecodes[0].page_addr) {
-        if (recentDecodes[0].decodePage->decoded(mach_inst, addr))
-            return recentDecodes[0].decodePage->getInst(addr);
-
-        return searchCache(mach_inst, addr, recentDecodes[0].decodePage);
-    }
-
-    if (recentDecodes[1].decodePage &&
-        page_addr == recentDecodes[1].page_addr) {
-        if (recentDecodes[1].decodePage->decoded(mach_inst, addr))
-            return recentDecodes[1].decodePage->getInst(addr);
-
-        return searchCache(mach_inst, addr, recentDecodes[1].decodePage);
+    if (recentDecodes[0].decodePage) {
+        if (page_addr == recentDecodes[0].page_addr) {
+            if (recentDecodes[0].decodePage->decoded(mach_inst, addr))
+                return recentDecodes[0].decodePage->getInst(addr);
+
+            return searchCache(mach_inst, addr, recentDecodes[0].decodePage);
+        } else if (recentDecodes[1].decodePage &&
+            page_addr == recentDecodes[1].page_addr) {
+            if (recentDecodes[1].decodePage->decoded(mach_inst, addr))
+                return recentDecodes[1].decodePage->getInst(addr);
+
+            return searchCache(mach_inst, addr, recentDecodes[1].decodePage);
+        }
     }
 
     // searches the page containing the address to decode
index f5cad058661da09e29c9a0afe81f21ca699bcbad..32a03933542e6989d4676fcb38f8cb589bc51a26 100644 (file)
@@ -193,15 +193,17 @@ class Bus : public MemObject
     // Checks the cache and returns the id of the port that has the requested
     // address within its range
     inline int checkPortCache(Addr addr) {
-        if (portCache[0].valid && addr >= portCache[0].start &&
-            addr < portCache[0].end) {
-            return portCache[0].id;
-        } else if (portCache[1].valid && addr >= portCache[1].start &&
-                   addr < portCache[1].end) {
-            return portCache[1].id;
-        } else if (portCache[2].valid && addr >= portCache[2].start &&
-                   addr < portCache[2].end) {
-            return portCache[2].id;
+        if (portCache[0].valid) {
+            if (addr >= portCache[0].start && addr < portCache[0].end) {
+                return portCache[0].id;
+            } else if (portCache[1].valid) {
+                if (addr >= portCache[1].start && addr < portCache[1].end) {
+                    return portCache[1].id;
+                } else if (portCache[2].valid && addr >= portCache[2].start &&
+                           addr < portCache[2].end) {
+                    return portCache[2].id;
+                }
+            }
         }
 
         return -1;
@@ -310,12 +312,17 @@ class Bus : public MemObject
     // Checks the peer port interfaces cache for the port id and returns
     // a pointer to the matching port
     inline BusPort* checkBusCache(short id) {
-        if (busCache[0].valid && id == busCache[0].id) {
-            return busCache[0].port;
-        } else if (busCache[1].valid && id == busCache[1].id) {
-            return busCache[1].port;
-        } else if (busCache[2].valid && id == busCache[2].id) {
-            return busCache[2].port;
+        if (busCache[0].valid) {
+            if (id == busCache[0].id) {
+                return busCache[0].port;
+                if (busCache[1].valid) {
+                    if (id == busCache[1].id) {
+                        return busCache[1].port;
+                        if (busCache[2].valid && id == busCache[2].id)
+                            return busCache[2].port;
+                    }
+                }
+            }
         }
 
         return NULL;