// Look for dependent instructions on the same cluster (do not wakeup, // just get the time) void DepWindow::wakeUpDeps(DInst *dinst) { I(!dinst->hasDeps()); // Even if it does not wakeup instructions the port is used Time_t wakeUpTime= wakeUpPort->nextSlot(dinst->getStatsFlag()); //dinst->dump("Clearing:"); dinst->clearRATEntry(); // Not much impact for OoO, mostly for InOrder if (!dinst->hasPending()) return; // NEVER HERE FOR in-order cores wakeUpTime += WakeUpDelay; I(dinst->getCluster()); I(srcCluster == dinst->getCluster()); I(dinst->hasPending()); for(const DInstNext *it = dinst->getFirst(); it ; it = it->getNext() ) { DInst *dstReady = it->getDInst(); const Cluster *dstCluster = dstReady->getCluster(); I(dstCluster); // all the instructions should have a resource after rename stage if (dstCluster == srcCluster && dstReady->getWakeUpTime() < wakeUpTime) dstReady->setWakeUpTime(wakeUpTime); } }
// Called when dinst finished execution. Look for dependent to wakeUp void DepWindow::executed(DInst *dinst) { // MSG("execute [0x%x] @%lld",dinst, globalClock); I(!dinst->hasDeps()); //dinst->dump("Clearing2:"); dinst->clearRATEntry(); if (!dinst->hasPending()) return; // NEVER HERE FOR in-order cores I(dinst->getCluster()); I(srcCluster == dinst->getCluster()); // Only until reaches last. The instructions that are from another processor // should be added again to the dependence chain so that MemRequest::ack can // awake them (other processor instructions) const DInst *stopAtDst = 0; I(dinst->isIssued()); while (dinst->hasPending()) { if (stopAtDst == dinst->getFirstPending()) break; DInst *dstReady = dinst->getNextPending(); I(dstReady); #if 0 if (!dstReady->isIssued()) { I(dinst->getInst()->isStore()); I(!dstReady->hasDeps()); continue; } #endif I(!dstReady->isExecuted()); if (!dstReady->hasDeps()) { // Check dstRes because dstReady may not be issued I(dstReady->getCluster()); const Cluster *dstCluster = dstReady->getCluster(); I(dstCluster); Time_t when = wakeUpPort->nextSlot(dinst->getStatsFlag()); if (dstCluster != srcCluster) { wrForwardBus.inc(dinst->getStatsFlag()); when += InterClusterLat; } dstReady->setWakeUpTime(when); preSelect(dstReady); } } }