StallCause GProcessor::sharedAddInst(DInst *dinst) { // rename an instruction. Steps: // // 1-Get a ROB entry // // 2-Get a register // // 3-Try to schedule in Resource (window entry...) if( ROB.size() >= MaxROBSize ) { return SmallROBStall; } #if SESC_INORDER if (switching) { if(!ROB.empty()) return SwitchStall; // New stall Type to add switching = false; } #endif const Instruction *inst = dinst->getInst(); // Register count I(inst->getDstPool()<3); #ifdef SESC_MISPATH if ((regPool[inst->getDstPool()] - misRegPool[inst->getDstPool()]) == 0) return SmallREGStall; #else if (regPool[inst->getDstPool()] == 0) return SmallREGStall; #endif Resource *res = clusterManager.getResource(inst->getOpcode()); I(res); const Cluster *cluster = res->getCluster(); StallCause sc = cluster->canIssue(dinst); if (sc != NoStall) return sc; sc = res->canIssue(dinst); if (sc != NoStall) return sc; // BEGIN INSERTION (note that schedule already inserted in the window) dinst->markIssued(); #ifdef SESC_BAAD dinst->setRenameTime(); #endif #ifdef SESC_MISPATH if (dinst->isFake()) { nInstFake[inst->getOpcode()]->inc(); misRegPool[inst->getDstPool()]++; }else{ nInst[inst->getOpcode()]->inc(); regPool[inst->getDstPool()]--; } #else nInst[inst->getOpcode()]->inc(); regPool[inst->getDstPool()]--; #endif renameEnergy->inc(); // Rename RAT robEnergy->inc(); // one for insert rdRegEnergy[inst->getSrc1Pool()]->inc(); rdRegEnergy[inst->getSrc2Pool()]->inc(); wrRegEnergy[inst->getDstPool()]->inc(); ROB.push(dinst); dinst->setResource(res); return NoStall; }