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 + -
显示快捷键?