void DepWindow::addInst(DInst *dinst) { I(dinst->getCluster() != 0); // Resource::schedule must set the resource field if (!dinst->hasDeps()) { preSelect(dinst); } }
// 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); } } }
void DepWindow::addInst(DInst *dinst) { I(dinst->getCluster() != 0); // Resource::schedule must set the resource field if (!dinst->hasDeps()) { dinst->setWakeUpTime(wakeUpPort->nextSlot(dinst->getStatsFlag()) + WakeUpDelay); preSelect(dinst); } }
// 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->markExecuted(); dinst->clearRATEntry(); if (!dinst->hasPending()) return; // NEVER HERE FOR in-order cores I(dinst->getCluster()); I(srcCluster == dinst->getCluster()); I(dinst->isIssued()); while (dinst->hasPending()) { DInst *dstReady = dinst->getNextPending(); I(dstReady); I(!dstReady->isExecuted()); if (!dstReady->hasDeps()) { // Check dstRes because dstReady may not be issued I(dstReady->getCluster()); const Cluster *dstCluster = dstReady->getCluster(); I(dstCluster); if (dstCluster != srcCluster) { wrForwardBus.inc(dinst->getStatsFlag()); dinst->markInterCluster(); } preSelect(dstReady); } } }