inorder: remove memdep tracking for default pipeline
authorKorey Sewell <ksewell@umich.edu>
Mon, 20 Jun 2011 01:43:39 +0000 (21:43 -0400)
committerKorey Sewell <ksewell@umich.edu>
Mon, 20 Jun 2011 01:43:39 +0000 (21:43 -0400)
speculative load/store pipelines can reenable this

src/cpu/inorder/resources/cache_unit.cc
src/cpu/inorder/resources/fetch_unit.cc
src/cpu/inorder/resources/fetch_unit.hh
src/cpu/inorder/resources/graduation_unit.cc

index c627466a18700a57d69c3b93373b147b1ce32aa0..ee7ec821259c744772f9e2843e5f503ec5bffa53 100644 (file)
@@ -159,8 +159,7 @@ int
 CacheUnit::getSlot(DynInstPtr inst)
 {
     ThreadID tid = inst->readTid();
-    
-    if (tlbBlocked[inst->threadNumber]) {
+    if (tlbBlocked[tid]) {
         return -1;
     }
 
@@ -171,40 +170,11 @@ CacheUnit::getSlot(DynInstPtr inst)
               "cache access\n", inst->readTid(), inst->seqNum);
     }
 
-    Addr req_addr = inst->getMemAddr();
-
-    if (resName == "icache_port" ||
-        find(addrList[tid].begin(), addrList[tid].end(), req_addr) == 
-        addrList[tid].end()) {
-
-        int new_slot = Resource::getSlot(inst);
-
-        if (new_slot == -1)
-            return -1;
-
-        inst->memTime = curTick();
-        setAddrDependency(inst);            
-        return new_slot;
-    } else {
-        // Allow same instruction multiple accesses to same address
-        // should only happen maybe after a squashed inst. needs to replay
-        if (addrMap[tid][req_addr] == inst->seqNum) {
-            int new_slot = Resource::getSlot(inst);
-        
-            if (new_slot == -1)
-                return -1;     
-
-            return new_slot;       
-        } else {                    
-            DPRINTF(InOrderCachePort,
-                "[tid:%i] Denying request because there is an outstanding"
-                " request to/for addr. %08p. by [sn:%i] @ tick %i\n",
-                inst->readTid(), req_addr, addrMap[tid][req_addr], inst->memTime);
-            return -1;
-        }        
-    }
-
-    return -1;   
+    int new_slot = Resource::getSlot(inst);
+    inst->memTime = curTick();
+    //@note: add back in if you want speculative loads/store capability
+    //setAddrDependency(inst);
+    return new_slot;
 }
 
 void
@@ -758,6 +728,14 @@ CacheUnit::execute(int slot_num)
         DPRINTF(InOrderCachePort,
                 "[tid:%i]: [sn:%i]: Trying to Complete Data Write Access\n",
                 tid, inst->seqNum);
+        DPRINTF(InOrderCachePort,
+                "[tid:%i]: [sn:%i]: cSwap:%i LLSC:%i isSwap:%i isCond:%i\n",
+                tid, inst->seqNum,
+                cache_req->memReq->isCondSwap(),
+                cache_req->memReq->isLLSC(),
+                cache_req->memReq->isSwap(),
+                inst->isStoreConditional());
+
         //@todo: check that timing translation is finished here
         if (cache_req->dataPkt->isRead()) {
             assert(cache_req->memReq->isCondSwap() ||
@@ -824,7 +802,8 @@ CacheUnit::execute(int slot_num)
 void
 CacheUnit::finishCacheUnitReq(DynInstPtr inst, CacheRequest *cache_req)
 {
-    removeAddrDependency(inst);
+    //@note: add back in for speculative load/store capability
+    //removeAddrDependency(inst);
     cache_req->setMemStall(false);
     cache_req->done();
 }
@@ -1219,10 +1198,11 @@ void
 CacheUnit::squashCacheRequest(CacheReqPtr req_ptr)
 {
     DynInstPtr inst =  req_ptr->getInst();
-
     req_ptr->setSquashed();
     inst->setSquashed();
-    if (inst->validMemAddr()) {
+
+    //@note: add back in for speculative load/store capability
+    /*if (inst->validMemAddr()) {
         DPRINTF(AddrDep, "Squash of [tid:%i] [sn:%i], attempting to "
                 "remove addr. %08p dependencies.\n",
                 inst->readTid(),
@@ -1230,7 +1210,7 @@ CacheUnit::squashCacheRequest(CacheReqPtr req_ptr)
                 inst->getMemAddr());
 
         removeAddrDependency(inst);
-    }
+    }*/
 }
 
 
index 52997917d8a3f23b4df65eeb1c3300e665e60e0e..28200c852b0c3e3ea2c836b5b053699c0162afca 100644 (file)
@@ -118,27 +118,6 @@ FetchUnit::createMachInst(std::list<FetchBlock*>::iterator fetch_it,
     inst->setMachInst(ext_inst);
 }
 
-int
-FetchUnit::getSlot(DynInstPtr inst)
-{
-    if (tlbBlocked[inst->threadNumber]) {
-        return -1;
-    }
-
-    if (!inst->validMemAddr()) {
-        panic("[tid:%i][sn:%i] Mem. Addr. must be set before requesting "
-              "cache access\n", inst->readTid(), inst->seqNum);
-    }
-
-    int new_slot = Resource::getSlot(inst);
-
-    if (new_slot == -1)
-        return -1;
-
-    inst->memTime = curTick();
-    return new_slot;
-}
-
 void
 FetchUnit::removeAddrDependency(DynInstPtr inst)
 {
index cc1e72914820eadedfe620d5b3c9b7d3c59cee6b..6c0b4871bfd360b0adf6c53da18b6f97d9e900b2 100644 (file)
@@ -83,8 +83,6 @@ class FetchUnit : public CacheUnit
                                 int res_idx, int slot_num,
                                 unsigned cmd);
 
-    int getSlot(DynInstPtr inst);
-
     /** Executes one of the commands from the "Command" enum */
     void execute(int slot_num);
 
index d34e1b512fecf503d8d58e958d79c6dc28393e19..afa9421a8327843699d5bcfef31c187513391239 100644 (file)
@@ -88,7 +88,7 @@ GraduationUnit::execute(int slot_num)
 
             DPRINTF(InOrderGraduation,
                     "[tid:%i]:[sn:%i]: Graduating instruction %s.\n",
-                    tid, inst->seqNum, inst->instName());
+                    tid, inst->seqNum, inst->staticInst->disassemble(inst->instAddr()));
 
             // Release Non-Speculative "Block" on instructions that could not
             // execute because there was a non-speculative inst. active.