亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? mem_dep_unit_impl.hh

?? linux下基于c++的處理器仿真平臺。具有處理器流水線
?? HH
字號:
/* * Copyright (c) 2004, 2005 * The Regents of The University of Michigan * All Rights Reserved * * This code is part of the M5 simulator, developed by Nathan Binkert, * Erik Hallnor, Steve Raasch, and Steve Reinhardt, with contributions * from Ron Dreslinski, Dave Greene, Lisa Hsu, Kevin Lim, Ali Saidi,  * and Andrew Schultz. * * Permission is granted to use, copy, create derivative works and * redistribute this software and such derivative works for any * purpose, so long as the copyright notice above, this grant of * permission, and the disclaimer below appear in all copies made; and * so long as the name of The University of Michigan is not used in * any advertising or publicity pertaining to the use or distribution * of this software without specific, written prior authorization. * * THIS SOFTWARE IS PROVIDED AS IS, WITHOUT REPRESENTATION FROM THE * UNIVERSITY OF MICHIGAN AS TO ITS FITNESS FOR ANY PURPOSE, AND * WITHOUT WARRANTY BY THE UNIVERSITY OF MICHIGAN OF ANY KIND, EITHER * EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE. THE REGENTS OF THE UNIVERSITY OF MICHIGAN SHALL NOT BE * LIABLE FOR ANY DAMAGES, INCLUDING DIRECT, SPECIAL, INDIRECT, * INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WITH RESPECT TO ANY CLAIM * ARISING OUT OF OR IN CONNECTION WITH THE USE OF THE SOFTWARE, EVEN * IF IT HAS BEEN OR IS HEREAFTER ADVISED OF THE POSSIBILITY OF SUCH * DAMAGES. */#include <map>#include "cpu/o3/mem_dep_unit.hh"template <class MemDepPred, class Impl>MemDepUnit<MemDepPred, Impl>::MemDepUnit(Params &params)    : depPred(params.SSITSize, params.LFSTSize){    DPRINTF(MemDepUnit, "MemDepUnit: Creating MemDepUnit object.\n");}template <class MemDepPred, class Impl>voidMemDepUnit<MemDepPred, Impl>::regStats(){    insertedLoads        .name(name() + ".memDep.insertedLoads")        .desc("Number of loads inserted to the mem dependence unit.");    insertedStores        .name(name() + ".memDep.insertedStores")        .desc("Number of stores inserted to the mem dependence unit.");    conflictingLoads        .name(name() + ".memDep.conflictingLoads")        .desc("Number of conflicting loads.");    conflictingStores        .name(name() + ".memDep.conflictingStores")        .desc("Number of conflicting stores.");}template <class MemDepPred, class Impl>voidMemDepUnit<MemDepPred, Impl>::insert(DynInstPtr &inst){    InstSeqNum inst_seq_num = inst->seqNum;    Dependency unresolved_dependencies(inst_seq_num);    InstSeqNum producing_store = depPred.checkInst(inst->readPC());        if (producing_store == 0 ||        storeDependents.find(producing_store) == storeDependents.end()) {        DPRINTF(MemDepUnit, "MemDepUnit: No dependency for inst PC "                "%#x.\n", inst->readPC());        unresolved_dependencies.storeDep = storeDependents.end();        if (inst->readyToIssue()) {            readyInsts.insert(inst_seq_num);        } else {            unresolved_dependencies.memDepReady = true;            waitingInsts.insert(unresolved_dependencies);        }    } else {        DPRINTF(MemDepUnit, "MemDepUnit: Adding to dependency list; "                "inst PC %#x is dependent on seq num %i.\n",                inst->readPC(), producing_store);        if (inst->readyToIssue()) {            unresolved_dependencies.regsReady = true;        }        // Find the store that this instruction is dependent on.        sd_it_t store_loc = storeDependents.find(producing_store);        assert(store_loc != storeDependents.end());        // Record the location of the store that this instruction is        // dependent on.        unresolved_dependencies.storeDep = store_loc;        // If it's not already ready, then add it to the renamed        // list and the dependencies.        dep_it_t inst_loc =             (waitingInsts.insert(unresolved_dependencies)).first;        // Add this instruction to the list of dependents.        (*store_loc).second.push_back(inst_loc);        assert(!(*store_loc).second.empty());        if (inst->isLoad()) {            ++conflictingLoads;        } else {            ++conflictingStores;        }    }        if (inst->isStore()) {        DPRINTF(MemDepUnit, "MemDepUnit: Inserting store PC %#x.\n",                inst->readPC());        depPred.insertStore(inst->readPC(), inst_seq_num);                // Make sure this store isn't already in this list.        assert(storeDependents.find(inst_seq_num) == storeDependents.end());        // Put a dependency entry in at the store's sequence number.        // Uh, not sure how this works...I want to create an entry but        // I don't have anything to put into the value yet.        storeDependents[inst_seq_num];        assert(storeDependents.size() != 0);        ++insertedStores;    } else if (inst->isLoad()) {        ++insertedLoads;    } else {        panic("MemDepUnit: Unknown type! (most likely a barrier).");    }    memInsts[inst_seq_num] = inst;}template <class MemDepPred, class Impl>voidMemDepUnit<MemDepPred, Impl>::insertNonSpec(DynInstPtr &inst){    InstSeqNum inst_seq_num = inst->seqNum;    Dependency non_spec_inst(inst_seq_num);    non_spec_inst.storeDep = storeDependents.end();    waitingInsts.insert(non_spec_inst);    // Might want to turn this part into an inline function or something.    // It's shared between both insert functions.    if (inst->isStore()) {        DPRINTF(MemDepUnit, "MemDepUnit: Inserting store PC %#x.\n",                inst->readPC());        depPred.insertStore(inst->readPC(), inst_seq_num);                // Make sure this store isn't already in this list.        assert(storeDependents.find(inst_seq_num) == storeDependents.end());        // Put a dependency entry in at the store's sequence number.        // Uh, not sure how this works...I want to create an entry but        // I don't have anything to put into the value yet.        storeDependents[inst_seq_num];        assert(storeDependents.size() != 0);        ++insertedStores;    } else if (inst->isLoad()) {        ++insertedLoads;    } else {        panic("MemDepUnit: Unknown type! (most likely a barrier).");    }    memInsts[inst_seq_num] = inst;}template <class MemDepPred, class Impl>typename Impl::DynInstPtr &MemDepUnit<MemDepPred, Impl>::top(){    topInst = memInsts.find( (*readyInsts.begin()) );    DPRINTF(MemDepUnit, "MemDepUnit: Top instruction is PC %#x.\n",            (*topInst).second->readPC());    return (*topInst).second;}template <class MemDepPred, class Impl>voidMemDepUnit<MemDepPred, Impl>::pop(){    DPRINTF(MemDepUnit, "MemDepUnit: Removing instruction PC %#x.\n",            (*topInst).second->readPC());    wakeDependents((*topInst).second);    issue((*topInst).second);    memInsts.erase(topInst);    topInst = memInsts.end();}template <class MemDepPred, class Impl>voidMemDepUnit<MemDepPred, Impl>::regsReady(DynInstPtr &inst){    DPRINTF(MemDepUnit, "MemDepUnit: Marking registers as ready for "            "instruction PC %#x.\n",            inst->readPC());    InstSeqNum inst_seq_num = inst->seqNum;    Dependency inst_to_find(inst_seq_num);    dep_it_t waiting_inst = waitingInsts.find(inst_to_find);    assert(waiting_inst != waitingInsts.end());    if ((*waiting_inst).memDepReady) {        DPRINTF(MemDepUnit, "MemDepUnit: Instruction has its memory "                "dependencies resolved, adding it to the ready list.\n");        moveToReady(waiting_inst);    } else {        DPRINTF(MemDepUnit, "MemDepUnit: Instruction still waiting on "                "memory dependency.\n");        (*waiting_inst).regsReady = true;    }}template <class MemDepPred, class Impl>voidMemDepUnit<MemDepPred, Impl>::nonSpecInstReady(DynInstPtr &inst){    DPRINTF(MemDepUnit, "MemDepUnit: Marking non speculative "            "instruction PC %#x as ready.\n",            inst->readPC());        InstSeqNum inst_seq_num = inst->seqNum;    Dependency inst_to_find(inst_seq_num);    dep_it_t waiting_inst = waitingInsts.find(inst_to_find);    assert(waiting_inst != waitingInsts.end());    moveToReady(waiting_inst);}template <class MemDepPred, class Impl>voidMemDepUnit<MemDepPred, Impl>::issue(DynInstPtr &inst){    assert(readyInsts.find(inst->seqNum) != readyInsts.end());    DPRINTF(MemDepUnit, "MemDepUnit: Issuing instruction PC %#x.\n",            inst->readPC());    // Remove the instruction from the ready list.    readyInsts.erase(inst->seqNum);    depPred.issued(inst->readPC(), inst->seqNum, inst->isStore());}template <class MemDepPred, class Impl>voidMemDepUnit<MemDepPred, Impl>::wakeDependents(DynInstPtr &inst){    // Only stores have dependents.    if (!inst->isStore()) {        return;    }    // Wake any dependencies.    sd_it_t sd_it = storeDependents.find(inst->seqNum);    // If there's no entry, then return.  Really there should only be    // no entry if the instruction is a load.    if (sd_it == storeDependents.end()) {        DPRINTF(MemDepUnit, "MemDepUnit: Instruction PC %#x, sequence "                "number %i has no dependents.\n",                 inst->readPC(), inst->seqNum);                return;    }    for (int i = 0; i < (*sd_it).second.size(); ++i ) {        dep_it_t woken_inst = (*sd_it).second[i];        DPRINTF(MemDepUnit, "MemDepUnit: Waking up a dependent inst, "                "sequence number %i.\n",                (*woken_inst).seqNum);#if 0        // Should we have reached instructions that are actually squashed,        // there will be no more useful instructions in this dependency        // list.  Break out early.        if (waitingInsts.find(woken_inst) == waitingInsts.end()) {            DPRINTF(MemDepUnit, "MemDepUnit: Dependents on inst PC %#x "                    "are squashed, starting at SN %i.  Breaking early.\n",                    inst->readPC(), woken_inst);            break;        }#endif        if ((*woken_inst).regsReady) {            moveToReady(woken_inst);        } else {            (*woken_inst).memDepReady = true;        }    }    storeDependents.erase(sd_it);}template <class MemDepPred, class Impl>voidMemDepUnit<MemDepPred, Impl>::squash(const InstSeqNum &squashed_num){    if (!waitingInsts.empty()) {         dep_it_t waiting_it = waitingInsts.end();        --waiting_it;                // Remove entries from the renamed list as long as we haven't reached        // the end and the entries continue to be younger than the squashed.        while (!waitingInsts.empty() &&               (*waiting_it).seqNum > squashed_num)        {            if (!(*waiting_it).memDepReady &&                (*waiting_it).storeDep != storeDependents.end()) {                sd_it_t sd_it = (*waiting_it).storeDep;                // Make sure the iterator that the store has pointing                // back is actually to this instruction.                assert((*sd_it).second.back() == waiting_it);                // Now remove this from the store's list of dependent                // instructions.                (*sd_it).second.pop_back();            }            waitingInsts.erase(waiting_it--);        }    }    if (!readyInsts.empty()) {        sn_it_t ready_it = readyInsts.end();                --ready_it;                // Same for the ready list.        while (!readyInsts.empty() &&               (*ready_it) > squashed_num)        {            readyInsts.erase(ready_it--);        }    }    if (!storeDependents.empty()) {        sd_it_t dep_it = storeDependents.end();        --dep_it;        // Same for the dependencies list.        while (!storeDependents.empty() &&               (*dep_it).first > squashed_num)        {            // This store's list of dependent instructions should be empty.            assert((*dep_it).second.empty());            storeDependents.erase(dep_it--);        }    }    // Tell the dependency predictor to squash as well.    depPred.squash(squashed_num);}template <class MemDepPred, class Impl>voidMemDepUnit<MemDepPred, Impl>::violation(DynInstPtr &store_inst,                                        DynInstPtr &violating_load){    DPRINTF(MemDepUnit, "MemDepUnit: Passing violating PCs to store sets,"            " load: %#x, store: %#x\n", violating_load->readPC(),             store_inst->readPC());    // Tell the memory dependence unit of the violation.    depPred.violation(violating_load->readPC(), store_inst->readPC());}template <class MemDepPred, class Impl>inline voidMemDepUnit<MemDepPred, Impl>::moveToReady(dep_it_t &woken_inst){    DPRINTF(MemDepUnit, "MemDepUnit: Adding instruction sequence number %i "            "to the ready list.\n", (*woken_inst).seqNum);    // Add it to the ready list.    readyInsts.insert((*woken_inst).seqNum);        // Remove it from the waiting instructions.    waitingInsts.erase(woken_inst);}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品一级片| 国产喂奶挤奶一区二区三区| 国产精品2024| 另类中文字幕网| 久久99精品久久久久婷婷| 久久精品99久久久| 日本成人在线不卡视频| 亚洲国产精品一区二区www | 色综合色综合色综合色综合色综合| 久久国产麻豆精品| 九色综合狠狠综合久久| 久久99精品久久久久婷婷| 国产美女在线观看一区| 国产大片一区二区| 处破女av一区二区| 97se狠狠狠综合亚洲狠狠| 色噜噜狠狠色综合中国| 欧美日韩国产精选| 日韩欧美精品三级| 国产午夜一区二区三区| 亚洲女同女同女同女同女同69| 亚洲男女毛片无遮挡| 天堂va蜜桃一区二区三区| 美国精品在线观看| 大尺度一区二区| 色琪琪一区二区三区亚洲区| 91麻豆精品国产91久久久资源速度| 日韩一区二区中文字幕| 中文字幕精品一区| 亚洲综合一区二区| 九九视频精品免费| 91在线你懂得| 欧美刺激脚交jootjob| 日本一区二区成人| 亚洲成av人片一区二区三区| 国产一区二区三区不卡在线观看| 不卡一卡二卡三乱码免费网站| 欧美色综合影院| 精品国产免费一区二区三区四区| 国产精品久久久久三级| 日本va欧美va瓶| 91在线一区二区三区| 欧美一区二区三区四区五区| 国产精品国产三级国产aⅴ入口 | 亚洲视频资源在线| 麻豆精品视频在线| 色8久久精品久久久久久蜜| 久久先锋资源网| 午夜私人影院久久久久| 99国产麻豆精品| 久久精品视频在线免费观看 | 天堂一区二区在线| 91网页版在线| 国产欧美va欧美不卡在线| 日韩激情视频网站| 色婷婷精品大在线视频| 欧美国产精品一区二区三区| 美腿丝袜亚洲三区| 这里只有精品免费| 午夜精品国产更新| 日本大香伊一区二区三区| 国产婷婷一区二区| 国内久久精品视频| 日韩精品中文字幕在线一区| 亚洲国产日韩综合久久精品| 99久久精品99国产精品 | 日本一区二区免费在线观看视频| 天堂va蜜桃一区二区三区漫画版| 色综合久久久久综合体桃花网| 日本一区二区免费在线| 国产成人午夜精品影院观看视频 | 视频一区二区三区中文字幕| 色88888久久久久久影院按摩| 欧美激情一区二区三区全黄| 国内成人免费视频| 精品少妇一区二区三区在线视频| 日韩中文字幕av电影| 欧美另类z0zxhd电影| 午夜精品爽啪视频| 欧美挠脚心视频网站| 日韩高清欧美激情| 日韩一二三区视频| 久久99久久99| 久久精品在线免费观看| 丁香激情综合国产| 国产精品欧美极品| 色国产精品一区在线观看| 亚洲宅男天堂在线观看无病毒| 91福利国产精品| 香港成人在线视频| 日韩欧美一区电影| 风间由美性色一区二区三区| 亚洲视频中文字幕| 这里是久久伊人| 国产九色sp调教91| 亚洲视频在线一区二区| 欧美高清一级片在线| 久久超碰97中文字幕| 久久精品亚洲精品国产欧美kt∨ | 色噜噜狠狠成人网p站| 一区二区三区精品在线观看| 欧美色网一区二区| 九九国产精品视频| 专区另类欧美日韩| 欧美日本高清视频在线观看| 黄一区二区三区| 亚洲黄色在线视频| 91精品国产麻豆国产自产在线 | 免费的国产精品| 国产精品无码永久免费888| 在线视频欧美精品| 麻豆成人免费电影| 亚洲日本乱码在线观看| 欧美一区二区视频在线观看2022| 国产丶欧美丶日本不卡视频| 一区二区三区欧美亚洲| 精品乱码亚洲一区二区不卡| 99这里只有精品| 麻豆成人91精品二区三区| 亚洲欧洲综合另类| 欧美精品一区二区三区蜜臀| 色成人在线视频| 成av人片一区二区| 久久97超碰色| 亚洲va韩国va欧美va| 国产精品三级久久久久三级| 欧美一区二区女人| 91久久奴性调教| 国产精品一二三四区| 日本亚洲电影天堂| 亚洲精品乱码久久久久久久久| 精品999在线播放| 91精品一区二区三区久久久久久| 成人永久aaa| 国产麻豆精品视频| 蜜乳av一区二区三区| 五月天视频一区| 一区二区三区视频在线观看| 国产农村妇女毛片精品久久麻豆 | 午夜精品一区在线观看| 国产精品第五页| 国产亚洲精品aa| 欧美一区二区三区爱爱| 欧美日韩高清影院| 在线亚洲人成电影网站色www| 国产suv精品一区二区三区| 久久精品国产成人一区二区三区 | 91精品国产综合久久精品| 欧美在线高清视频| 在线影院国内精品| 欧美色国产精品| 欧美日韩中文精品| 欧美色大人视频| 欧美午夜宅男影院| 欧美午夜在线一二页| 欧美日韩一区在线观看| 日本精品裸体写真集在线观看| 91在线观看成人| 欧美在线视频日韩| 精品视频在线免费观看| 538在线一区二区精品国产| 91精品国产综合久久精品麻豆| 欧美私人免费视频| 欧美久久久久久蜜桃| 日韩一级黄色片| 亚洲精品一区二区三区精华液 | 91片在线免费观看| 91激情在线视频| 欧美伦理电影网| 精品少妇一区二区三区视频免付费 | 亚洲精品国产高清久久伦理二区| 亚洲日穴在线视频| 亚洲电影视频在线| 久久国产精品色婷婷| 国产精品1024| 色婷婷亚洲综合| 91精品欧美一区二区三区综合在| 精品国产乱码91久久久久久网站| 久久综合九色综合久久久精品综合| 久久精品免视看| 亚洲精品视频在线| 另类调教123区 | 91免费在线视频观看| 精品视频资源站| 久久精品夜夜夜夜久久| 一区二区三区鲁丝不卡| 久久99国内精品| 色综合久久天天综合网| 欧美v亚洲v综合ⅴ国产v| 中文字幕一区二区在线观看| 亚洲成av人片观看| 成人免费观看视频| 9191久久久久久久久久久| 久久久一区二区三区捆绑**| 亚洲黄一区二区三区| 国产乱码精品一区二区三区忘忧草 | 国产亚洲综合在线| 亚州成人在线电影| bt欧美亚洲午夜电影天堂| 欧美精品成人一区二区三区四区|