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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? iq_seg.cc

?? linux下基于c++的處理器仿真平臺。具有處理器流水線
?? CC
?? 第 1 頁 / 共 3 頁
字號:
/* * Copyright (c) 2001, 2002, 2003, 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 <iomanip>#include <iostream>#include <map>#include <sstream>#include "base/cprintf.hh"#include "base/statistics.hh"#include "encumbered/cpu/full/cpu.hh"#include "encumbered/cpu/full/create_vector.hh"#include "encumbered/cpu/full/dep_link.hh"#include "encumbered/cpu/full/iq/iqueue.hh"#include "encumbered/cpu/full/iq/segmented/iq_seg.hh"#include "encumbered/cpu/full/iq/segmented/iq_segmented.hh"#include "encumbered/cpu/full/iq/segmented/seg_chain.hh"#include "encumbered/cpu/full/issue.hh"#include "encumbered/cpu/full/ls_queue.hh"#include "encumbered/cpu/full/reg_info.hh"#include "sim/eventq.hh"#include "sim/stats.hh"using namespace std;#define use_dest_sort   1#define use_pushdown    1//==========================================================================////  The segment implementation////==========================================================================////  Constructor//segment_t::segment_t(SegmentedIQ *iq, string n,		     unsigned seg_num, unsigned num_segs,		     unsigned sz, unsigned n_chains, unsigned thresh,		     bool pipelined, bool en_pri){    //  Allows us to reference our own queue data    seg_queue = iq;    name_string = n;    segment_number = seg_num;    num_segments = num_segs;    size = sz;    num_chains = n_chains;    threshold = thresh;    // we need to set this after the chain info table gets built    chain_info = 0;    //    //  The list of iterators to the instructions we're tracking    //    //  ["size" elements, allocated, doesn't grow]    //    queue = new iq_iterator_list(size, true, 0);    chains = new iq_iterator_list * [num_chains];    for (int i = 0; i < num_chains; ++i)	chains[i] = new iq_iterator_list(20, true, 2);    self_timed_list = new iq_iterator_list(20, true, 2);    //  Keep track of which instructions are "ready" to promote (or issue)    //    //  NOTE: Segment zero uses a different ready-list policy!    string seg_name = name() + ":RQ";    if (seg_num != 0) {	ready_list =	    new ready_queue_t<IQStation, RQ_Seg_Policy>	    (&(seg_queue->cpu), seg_name, size, en_pri);    } else {	ready_list =	    new ready_queue_t<IQStation, RQ_Issue_Policy>	    (&(seg_queue->cpu), seg_name, size, en_pri);    }    //    //  Initilize statistics, etc    //    total_insts = 0;    segment_full = 0;    segment_empty = 0;    cycles_low_ready = 0;    insts_fanout_loads = 0;    insts_waiting_for_loads = 0;    insts_waiting_for_unissued = 0;    for (int i = 0; i < SMT_MAX_THREADS; ++i) {	insts[i] = 0;    }}////  Copy an instruction into this segment. Add this instruction to//  the correct specified chain.////  The instruction is checked to see if it is in the "right" segment//  and if not, is automatically marked as ready to promote. This assumes//  that the queue _forward_of_this_segment_ is in a consistent state.////  This allows instructions that have not reached their correct segment//  to move forward, even though their chain-head isn't moving.//segment_t::iq_iteratorsegment_t::add(segment_t::iq_iterator &p){    unsigned n_chains = 0;    //  Add this iterator to this segment's queue    iq_it_list_iterator q = queue->add_tail(p);    if (q.isnull())	return 0;    //  So we can remove it from the segment queue    p->queue_entry = q;    p->queued = false;    p->rq_entry = 0;    p->segment_number = segment_number;    //    //  Add this instruction to it's chain(s)    //    for (int i = 0; i < TheISA::MaxInstSrcRegs; ++i) {	if (p->idep_info[i].chained) {	    unsigned c_num = p->idep_info[i].follows_chain;	    bool duplicate = false;	    for (int j = 0; j < i; ++j) {		if (p->idep_info[j].chained &&		    (p->idep_info[j].follows_chain == c_num)) {		    duplicate = true;		    break;		}	    }	    if (! duplicate) {		p->idep_info[i].chain_entry = chains[c_num]->add_tail(p);		++n_chains;	    } else {		p->idep_info[i].chain_entry = 0;	    }	}    }    //    //  Only if this instruction is completely unchained, do we add it    //  to the self-timed list    //    if (n_chains == 0)	p->idep_info[0].chain_entry = self_timed_list->add_tail(p);    //  Has this instruction reached the "right" segment yet?    if (segment_number != 0 && promotable(p))	enqueue(p);    ++insts[p->thread_number()];    ++total_insts;    //    //  SEGMENT 0:  Enqueue incoming instructions if their input    //              dependencies have been met.    //    if ((segment_number == 0) && p->ops_ready()) {	// we shouldn't become ready too early	//	assert(p->delay == 0);	enqueue(p);    }    return p;}////  Removing an instruction (actually an iterator to an instruction) from//  this queue segment////    (1) Remove the inst from the chain it's following (or the unchained list)//    (2) Remove the inst from the chain it's the head of//    (3) Remove the inst from the ready-queue (if queued)//    (4) Remove the iterator from the queue//segment_t::iq_iteratorsegment_t::remove(segment_t::iq_iterator &e){    iq_iterator next = e.next();    unsigned n_chains = 0;    if (e.notnull()) {	--insts[e->thread_number()];	--total_insts;	for (int i = 0; i < TheISA::MaxInstSrcRegs; ++i) {	    //	    //  Remove it from the correct chain...	    //	    if (e->idep_info[i].chained) {		unsigned chain = e->idep_info[i].follows_chain;		chains[chain]->remove(e->idep_info[i].chain_entry);		++n_chains;	    }	}	if (n_chains == 0)	    self_timed_list->remove(e->idep_info[0].chain_entry);	//	//  If this inst was queued	//	if (e->queued)	    ready_list->remove(e->rq_entry);	//	//  Finally, remove it from the segment queue list	//	queue->remove(e->queue_entry);    }    return next;}////  When the head instruction issues, we leave the instructions on//  the chain, but tell it to self-time.////  We may want to stop the self-time operation later...//voidsegment_t::self_time(ROBStation *rob){    if (rob->seq == (*chain_info)[rob->head_chain].creator)	(*chain_info)[rob->head_chain].self_timed = true;}////  Stop the chain from self-timing//voidsegment_t::stop_self_time(ROBStation *rob){    if (rob->seq == (*chain_info)[rob->head_chain].creator)	(*chain_info)[rob->head_chain].self_timed = false;}////  When the head instruction writes-back, we'll free the chain,//  Allowing the individual instructions to sit on the self_timed_list//voidsegment_t::release_chain(ROBStation *rob_entry){    iq_it_list_iterator n;    unsigned t_count = 0;    unsigned chain_num = rob_entry->head_chain;#if 0    // We don't want to free a chain that really belongs to someone else!    if (rob_entry->seq != seg_queue->chain_info[chain_num]->creator) 	return;#endif    //    //  Walk the list of instructions on this chain    //    iq_it_list_iterator i = chains[chain_num]->head();    for (; i.notnull(); i = n) {	unsigned n_chains = 0;	n = i.next();	for (int j = 0; j < TheISA::MaxInstSrcRegs; ++j) {	    if ((*i)->idep_info[j].chained) {		if ((*i)->idep_info[j].follows_chain == chain_num) {		    (*i)->idep_info[j].chained = false;		    //chains[chain_num]->remove(i);		    ++t_count;		} else {		    ++n_chains;		}	    }	}	//  If this inst is no longer on _any_ chain... put it on the	//  self-timed list	if (n_chains == 0) {	    (*i)->idep_info[0].chain_entry = self_timed_list->add_tail(*i);	    //  We need to set the self-timed flag in any register produced	    //  by this instruction	    ROBStation *rob = (*i)->rob_entry;	    for (int j = 0; j < rob->num_outputs; ++j) {		RegInfoElement &r =		    (*reg_info_table)[rob->thread_number][rob->onames[j]];		//		//  If this ROB entry is responsible for producing this		//  arch register result...		//		if (r.producer() && (r.producer()->seq == rob->seq)) {		    //  Clear the chained flag so that future consumers		    //  will know not to wait on the chain head		    r.unChain();		}	    }	}    }    //  instead of the individual removes above...    assert(chains[chain_num]->count() == t_count);    chains[chain_num]->clear();}voidsegment_t::check_promotable(){    //    //  All segments except segment 0 need to determine which instructions are    //  promotable.    //    //  Segment zero instructions are enqueued either on entry    //  (if no outstanding ideps) or when an instruction writes-back.    //    //    //  Walk the entire list of instructions...    //    (1)  Decrement the delay values as necessary    //    (2)  Enqueue instructions that are promotable    //    iq_it_list_iterator i = queue->head();    for (; i.notnull(); i = i.next()) {	bool recalc_position = false;	//	//  Do the easy case first	//	//  (this works because any instruction that is ops-ready MUST be	//   self-timed)	//	if ((*i)->ops_ready() && !(*i)->queued)	    enqueue(*i);	//	// Decrement the delay counters depending on the state of the chain	//	for (int j = 0; j < TheISA::MaxInstSrcRegs; ++j) {	    if (!(*i)->idep_ready[j]) {		if ((*i)->idep_info[j].chained) {		    unsigned c_num = (*i)->idep_info[j].follows_chain;		    //  If the head of this chain was promoted,		    //  or is self-timed, then we need to see if we are		    //  promotable		    if (chain_info->head_was_promoted(c_num, segment_number) ||			(*chain_info)[c_num].self_timed)		    {			if ((*chain_info)[c_num].self_timed) {			    decrement_delay(*i, j);			    recalc_position = true;			}			//  Don't enqueue for segment zero

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产一本一道久久香蕉| 久久综合九色综合欧美98| 色综合天天视频在线观看 | 国产成人综合亚洲91猫咪| 久久国产精品区| 老色鬼精品视频在线观看播放| 日本系列欧美系列| 精品亚洲成a人在线观看| 狠狠狠色丁香婷婷综合激情| 国产精品亚洲一区二区三区在线 | 精品久久国产97色综合| 亚洲成人三级小说| 秋霞成人午夜伦在线观看| 久久精品国产77777蜜臀| 极品少妇xxxx精品少妇| 国产成人日日夜夜| 91蜜桃网址入口| 欧美日本视频在线| 欧美r级在线观看| 中文子幕无线码一区tr| 日韩理论片在线| 亚洲电影一区二区三区| 日韩1区2区3区| 国产宾馆实践打屁股91| 91免费看视频| 欧美猛男超大videosgay| 精品国产一区二区精华| 国产欧美日韩中文久久| 一区二区三区中文字幕精品精品| 亚洲成a人v欧美综合天堂| 久久国产尿小便嘘嘘尿| 成人av电影在线网| 欧美日韩高清影院| 久久无码av三级| 一区二区三区欧美视频| 另类小说视频一区二区| 国产69精品一区二区亚洲孕妇| 色狠狠一区二区| 日韩欧美高清一区| 亚洲日本一区二区| 蜜桃久久久久久| 91丨九色丨黑人外教| 337p亚洲精品色噜噜噜| 国产精品视频观看| 日本亚洲电影天堂| 91在线精品一区二区三区| 制服丝袜在线91| 国产精品久久久久影院亚瑟| 日韩av在线发布| 波多野结衣在线一区| 欧美电影一区二区| 中文字幕亚洲一区二区av在线| 日韩电影在线一区二区三区| 99精品久久免费看蜜臀剧情介绍| 日韩写真欧美这视频| 亚洲色图一区二区| 国产毛片精品国产一区二区三区| 欧美视频一区二区三区在线观看| 国产欧美一区二区精品秋霞影院| 日韩精品国产精品| 91猫先生在线| 久久久久久久久97黄色工厂| 婷婷久久综合九色国产成人 | 日韩高清不卡一区二区| 成人av网站免费观看| 精品久久久久一区二区国产| 一区二区三区四区亚洲| 国产乱码字幕精品高清av| 3d动漫精品啪啪一区二区竹菊 | aaa国产一区| 日韩免费电影一区| 亚洲五码中文字幕| 色综合天天综合在线视频| 国产夜色精品一区二区av| 免费在线观看一区二区三区| 99免费精品在线| 国产色一区二区| 精品一区二区精品| 9191国产精品| 一区二区三区视频在线看| 成人精品国产免费网站| 久久久久久一二三区| 久久国产精品第一页| 欧美一区二区三区的| 午夜视黄欧洲亚洲| 91成人看片片| 亚洲美女偷拍久久| 91麻豆6部合集magnet| 国产精品蜜臀av| 成人精品免费看| 国产午夜一区二区三区| 国内精品国产成人国产三级粉色 | 一区二区三区中文在线| 波波电影院一区二区三区| 久久久天堂av| 国产成人一区二区精品非洲| 久久精品一区二区三区不卡 | 欧美三级中文字幕| 一个色综合网站| 欧美性色欧美a在线播放| 久久99国产精品久久| 久久女同性恋中文字幕| 看电视剧不卡顿的网站| 91麻豆精品91久久久久同性| 日韩精品电影在线| 日韩精品一区二区三区蜜臀| 久久丁香综合五月国产三级网站| 日韩三级在线观看| 精品一区中文字幕| 国产欧美日韩激情| 波多野结衣中文字幕一区| 成人免费在线观看入口| 在线免费av一区| 亚洲成av人片www| 欧美一区二区免费视频| 激情综合色综合久久综合| 久久久精品黄色| av激情亚洲男人天堂| 亚洲一区二区三区免费视频| 欧美性做爰猛烈叫床潮| 免费看日韩精品| 国产日韩欧美高清在线| caoporm超碰国产精品| 一区二区三区在线观看网站| 欧美精品 国产精品| 久久99精品久久只有精品| 欧美国产日韩亚洲一区| 日韩欧美国产1| 国产在线视频一区二区| 国产丝袜在线精品| 色婷婷综合久色| 欧美午夜精品电影| 免费久久精品视频| 欧美高清在线一区| 欧美日韩一区国产| 国产精品夜夜嗨| 一区二区三区四区视频精品免费| 欧美一级免费大片| 国产成人精品免费在线| 一区二区三区91| 欧美不卡视频一区| 色老综合老女人久久久| 日韩一区精品字幕| 亚洲国产精品99久久久久久久久| 日本久久一区二区三区| 久久99国产精品免费| 亚洲男人都懂的| 精品毛片乱码1区2区3区| 色呦呦网站一区| 狠狠网亚洲精品| 亚洲一区视频在线观看视频| 久久亚洲影视婷婷| 欧美色综合影院| 国产成人av福利| 亚洲午夜影视影院在线观看| 国产午夜精品久久久久久免费视| 欧美日韩视频一区二区| 成人app软件下载大全免费| 日本亚洲最大的色成网站www| 国产精品久久99| 精品免费一区二区三区| 欧美一区二区人人喊爽| 欧美日本在线看| 国产综合久久久久久久久久久久 | 亚洲主播在线播放| 国产亚洲一二三区| 91.com视频| 色av成人天堂桃色av| 国产成人精品影视| 日本在线不卡一区| 一区二区三区免费网站| 欧美经典一区二区| 日韩欧美国产三级| 欧美日韩国产免费| 97久久超碰国产精品电影| 国产激情偷乱视频一区二区三区| 97精品电影院| 国产一区欧美日韩| 热久久免费视频| 午夜久久久久久久久久一区二区| 中文字幕日本不卡| 国产偷国产偷精品高清尤物| 欧美一区午夜精品| 欧美精选在线播放| 欧美亚州韩日在线看免费版国语版| 99免费精品视频| 成人av在线资源网站| 国产精品一区二区三区99 | 日韩精品综合一本久道在线视频| 欧美日韩在线电影| 色乱码一区二区三区88| 成a人片国产精品| 高清久久久久久| 成人欧美一区二区三区白人| 国产人妖乱国产精品人妖| 精品捆绑美女sm三区| 欧美一级一区二区| 欧美精品123区| 欧美一级久久久久久久大片| 欧美喷水一区二区|