rob_impl.hh
来自「M5,一个功能强大的多处理器系统模拟器.很多针对处理器架构,性能的研究都使用它作」· HH 代码 · 共 696 行 · 第 1/2 页
HH
696 行
ROB<Impl>::doSquash(unsigned tid){ DPRINTF(ROB, "[tid:%u]: Squashing instructions until [sn:%i].\n", tid, squashedSeqNum[tid]); assert(squashIt[tid] != instList[tid].end()); if ((*squashIt[tid])->seqNum < squashedSeqNum[tid]) { DPRINTF(ROB, "[tid:%u]: Done squashing instructions.\n", tid); squashIt[tid] = instList[tid].end(); doneSquashing[tid] = true; return; } bool robTailUpdate = false; for (int numSquashed = 0; numSquashed < squashWidth && squashIt[tid] != instList[tid].end() && (*squashIt[tid])->seqNum > squashedSeqNum[tid]; ++numSquashed) { DPRINTF(ROB, "[tid:%u]: Squashing instruction PC %#x, seq num %i.\n", (*squashIt[tid])->threadNumber, (*squashIt[tid])->readPC(), (*squashIt[tid])->seqNum); // Mark the instruction as squashed, and ready to commit so that // it can drain out of the pipeline. (*squashIt[tid])->setSquashed(); (*squashIt[tid])->setCanCommit(); if (squashIt[tid] == instList[tid].begin()) { DPRINTF(ROB, "Reached head of instruction list while " "squashing.\n"); squashIt[tid] = instList[tid].end(); doneSquashing[tid] = true; return; } InstIt tail_thread = instList[tid].end(); tail_thread--; if ((*squashIt[tid]) == (*tail_thread)) robTailUpdate = true; squashIt[tid]--; } // Check if ROB is done squashing. if ((*squashIt[tid])->seqNum <= squashedSeqNum[tid]) { DPRINTF(ROB, "[tid:%u]: Done squashing instructions.\n", tid); squashIt[tid] = instList[tid].end(); doneSquashing[tid] = true; } if (robTailUpdate) { updateTail(); }}template <class Impl>voidROB<Impl>::updateHead(){ DynInstPtr head_inst; InstSeqNum lowest_num = 0; bool first_valid = true; // @todo: set ActiveThreads through ROB or CPU std::list<unsigned>::iterator threads = activeThreads->begin(); std::list<unsigned>::iterator end = activeThreads->end(); while (threads != end) { unsigned tid = *threads++; if (instList[tid].empty()) continue; if (first_valid) { head = instList[tid].begin(); lowest_num = (*head)->seqNum; first_valid = false; continue; } InstIt head_thread = instList[tid].begin(); DynInstPtr head_inst = (*head_thread); assert(head_inst != 0); if (head_inst->seqNum < lowest_num) { head = head_thread; lowest_num = head_inst->seqNum; } } if (first_valid) { head = instList[0].end(); }}template <class Impl>voidROB<Impl>::updateTail(){ tail = instList[0].end(); bool first_valid = true; std::list<unsigned>::iterator threads = activeThreads->begin(); std::list<unsigned>::iterator end = activeThreads->end(); while (threads != end) { unsigned tid = *threads++; if (instList[tid].empty()) { continue; } // If this is the first valid then assign w/out // comparison if (first_valid) { tail = instList[tid].end(); tail--; first_valid = false; continue; } // Assign new tail if this thread's tail is younger // than our current "tail high" InstIt tail_thread = instList[tid].end(); tail_thread--; if ((*tail_thread)->seqNum > (*tail)->seqNum) { tail = tail_thread; } }}template <class Impl>voidROB<Impl>::squash(InstSeqNum squash_num,unsigned tid){ if (isEmpty()) { DPRINTF(ROB, "Does not need to squash due to being empty " "[sn:%i]\n", squash_num); return; } DPRINTF(ROB, "Starting to squash within the ROB.\n"); robStatus[tid] = ROBSquashing; doneSquashing[tid] = false; squashedSeqNum[tid] = squash_num; if (!instList[tid].empty()) { InstIt tail_thread = instList[tid].end(); tail_thread--; squashIt[tid] = tail_thread; doSquash(tid); }}/*template <class Impl>typename Impl::DynInstPtrROB<Impl>::readHeadInst(){ if (numInstsInROB != 0) { assert((*head)->isInROB()==true); return *head; } else { return dummyInst; }}*/template <class Impl>typename Impl::DynInstPtrROB<Impl>::readHeadInst(unsigned tid){ if (threadEntries[tid] != 0) { InstIt head_thread = instList[tid].begin(); assert((*head_thread)->isInROB()==true); return *head_thread; } else { return dummyInst; }}/*template <class Impl>uint64_tROB<Impl>::readHeadPC(){ //assert(numInstsInROB == countInsts()); DynInstPtr head_inst = *head; return head_inst->readPC();}template <class Impl>uint64_tROB<Impl>::readHeadPC(unsigned tid){ //assert(numInstsInROB == countInsts()); InstIt head_thread = instList[tid].begin(); return (*head_thread)->readPC();}template <class Impl>uint64_tROB<Impl>::readHeadNextPC(){ //assert(numInstsInROB == countInsts()); DynInstPtr head_inst = *head; return head_inst->readNextPC();}template <class Impl>uint64_tROB<Impl>::readHeadNextPC(unsigned tid){ //assert(numInstsInROB == countInsts()); InstIt head_thread = instList[tid].begin(); return (*head_thread)->readNextPC();}template <class Impl>InstSeqNumROB<Impl>::readHeadSeqNum(){ //assert(numInstsInROB == countInsts()); DynInstPtr head_inst = *head; return head_inst->seqNum;}template <class Impl>InstSeqNumROB<Impl>::readHeadSeqNum(unsigned tid){ InstIt head_thread = instList[tid].begin(); return ((*head_thread)->seqNum);}template <class Impl>typename Impl::DynInstPtrROB<Impl>::readTailInst(){ //assert(numInstsInROB == countInsts()); //assert(tail != instList[0].end()); return (*tail);}*/template <class Impl>typename Impl::DynInstPtrROB<Impl>::readTailInst(unsigned tid){ //assert(tail_thread[tid] != instList[tid].end()); InstIt tail_thread = instList[tid].end(); tail_thread--; return *tail_thread;}/*template <class Impl>uint64_tROB<Impl>::readTailPC(){ //assert(numInstsInROB == countInsts()); //assert(tail != instList[0].end()); return (*tail)->readPC();}template <class Impl>uint64_tROB<Impl>::readTailPC(unsigned tid){ //assert(tail_thread[tid] != instList[tid].end()); InstIt tail_thread = instList[tid].end(); tail_thread--; return (*tail_thread)->readPC();}template <class Impl>InstSeqNumROB<Impl>::readTailSeqNum(){ // Return the last sequence number that has not been squashed. Other // stages can use it to squash any instructions younger than the current // tail. return (*tail)->seqNum;}template <class Impl>InstSeqNumROB<Impl>::readTailSeqNum(unsigned tid){ // Return the last sequence number that has not been squashed. Other // stages can use it to squash any instructions younger than the current // tail. // assert(tail_thread[tid] != instList[tid].end()); InstIt tail_thread = instList[tid].end(); tail_thread--; return (*tail_thread)->seqNum;}*/
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?