Fix I$ simulator hit count
authorAndrew Waterman <waterman@cs.berkeley.edu>
Sun, 26 Apr 2015 00:51:23 +0000 (17:51 -0700)
committerAndrew Waterman <waterman@cs.berkeley.edu>
Sun, 26 Apr 2015 00:53:27 +0000 (17:53 -0700)
Also, improve performance by allowing the soft-ITLB to refill.

riscv/mmu.cc
riscv/mmu.h

index e6bbbd44976034be08b8a1253fb092f41d4532a4..8ebee60f43972f1e3a8ae669c2aa2dab206d87eb 100644 (file)
@@ -67,7 +67,8 @@ void* mmu_t::refill_tlb(reg_t addr, reg_t bytes, bool store, bool fetch)
     else throw trap_load_access_fault(addr);
   }
 
-  if (unlikely(tracer.interested_in_range(pgbase, pgbase + PGSIZE, store, fetch)))
+  bool trace = tracer.interested_in_range(pgbase, pgbase + PGSIZE, store, fetch);
+  if (unlikely(!fetch && trace))
     tracer.trace(paddr, bytes, store, fetch);
   else
   {
index a8853d31a532f2a6c3fc310a984e0f77ad28768e..4ca9d0aaedce911aba7ff4eb7144a56b2ef253fd 100644 (file)
@@ -85,15 +85,16 @@ public:
 
     char* iaddr = (char*)translate(addr, 1, false, true);
     insn_bits_t insn = *(uint16_t*)iaddr;
+    int length = insn_length(insn);
 
-    if (likely(insn_length(insn) == 4)) {
+    if (likely(length == 4)) {
       if (likely(addr % PGSIZE < PGSIZE-2))
         insn |= (insn_bits_t)*(int16_t*)(iaddr + 2) << 16;
       else
         insn |= (insn_bits_t)*(int16_t*)translate(addr + 2, 1, false, true) << 16;
-    } else if (insn_length(insn) == 2) {
+    } else if (length == 2) {
       insn = (int16_t)insn;
-    } else if (insn_length(insn) == 6) {
+    } else if (length == 6) {
       insn |= (insn_bits_t)*(int16_t*)translate(addr + 4, 1, false, true) << 32;
       insn |= (insn_bits_t)*(uint16_t*)translate(addr + 2, 1, false, true) << 16;
     } else {
@@ -111,7 +112,7 @@ public:
     if (!tracer.empty() && tracer.interested_in_range(paddr, paddr + 1, false, true))
     {
       icache[idx].tag = -1;
-      tracer.trace(paddr, 1, false, true);
+      tracer.trace(paddr, length, false, true);
     }
     return &icache[idx];
   }