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

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

?? writeback.cc

?? linux下基于c++的處理器仿真平臺。具有處理器流水線
?? CC
?? 第 1 頁 / 共 2 頁
字號:
/* * Copyright (c) 2000, 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 <iostream>#include <string>#include <sstream>#include <vector>#include "base/statistics.hh"#include "encumbered/cpu/full/create_vector.hh"#include "encumbered/cpu/full/dd_queue.hh"#include "encumbered/cpu/full/dep_link.hh"#include "encumbered/cpu/full/fetch.hh"#include "encumbered/cpu/full/cpu.hh"#include "encumbered/cpu/full/iq/iqueue.hh"#include "encumbered/cpu/full/ls_queue.hh"#include "encumbered/cpu/full/readyq.hh"#include "encumbered/cpu/full/rob_station.hh"#include "encumbered/cpu/full/spec_state.hh"#include "encumbered/cpu/full/thread.hh"#include "encumbered/cpu/full/writeback.hh"#include "sim/eventq.hh"#include "sim/stats.hh"using namespace std;InstSeqNum writeback_break = 0;voidwriteback_breakpoint(){    cout << "got to WB break point!\n";}//// simulate the writeback stage of the pipeline//voidFullCPU::writeback(){    writebackEventQueue.serviceEvents();}////  IQ_WRITEBACK() - instruction result writeback pipeline stage//// writeback completed operation results from the functional units to IQ,// at this point, the output dependency chains of completing instructions// are also walked to determine if any dependent instruction now has all// of its register operands, if so the (nearly) ready instruction is inserted// into the ready instruction queue//// The writeback queue holds pointers to the ROB entry for the//   completed instructions The instruction entries in the IQ were//   removed when the instruction was issued.unsignedROBStation::writeback(FullCPU *cpu, unsigned wb_iqueue){    int i;    unsigned wb_events = 0;    if (writeback_break && (writeback_break == seq)) {	writeback_breakpoint();    }    /* RS has completed execution and (possibly) produced a result */    if (!issued || completed)	panic("writeback: inst completed and !issued or completed");    /*  Squashed instructions need to be removed  */    if (squashed) {	/*  We need to remove associated LSQ entries also  */	if (lsq_entry.notnull()) {	    cpu->LSQ->squash(lsq_entry);	    if (cpu->ptrace)		cpu->ptrace->deleteInst(lsq_entry->inst);	}	cpu->remove_ROB_element(this);	return 0;    }    Tick pred_cycle = (eaCompPending ? pred_wb_cycle - 1 : pred_wb_cycle);    cpu->pred_wb_error_dist.sample(curTick - pred_cycle);    //    //  MISPREDICTED Branch    //    //  Clean up if this is the FIRST writeback event for this instruction    //    if (inst->recover_inst) {	wb_events = PipeTrace::MisPredict;        //        //  The idea here is to order recovery events such that        //  once an event of spec-level "n" is scheduled, we do not        //  sechedule an event for spec-level of "m" if m < n        //        //  This means that once an event is scheduled, we don't        //  schedule events for younger recovery-instructions        //  (since these should be blown away by the existing        //  event, anyway)        //	ThreadInfo *threadInfo = &cpu->thread_info[thread_number];        if (!threadInfo->recovery_event_pending ||	    threadInfo->recovery_spec_level > inst->spec_mode) {	    Tick sched_time = curTick + cpu->cycles(cpu->mispred_fixup_penalty);	    //	    //  If we are using multiple IQ's, we schedule a _single_ event	    //  for all of them, but we delay this event by the	    //  IQ communication latency	    //	    if (cpu->numIQueues > 1)		sched_time += cpu->cycles(cpu->iq_comm_latency);            //  Schedule the event that will fix up the Fetch stage, IFQ,            //  FTDQ, and IQ/LSQ            BranchRecoveryEvent *ev =		new BranchRecoveryEvent(cpu, this, thread_number,					spec_state, inst->spec_mode);            ev->schedule(sched_time);	    //	    //  The recovery event will take responsibility for deleting the	    // spec_state information	    //	    spec_state = 0;            //  Grab a pointer to this event in case commit needs it.            recovery_event = ev;            //  Make a note of this event...            cpu->thread_info[thread_number].recovery_event_pending = true;            cpu->thread_info[thread_number].recovery_spec_level		= inst->spec_mode;        }    }    //    //  Writeback the results of this instrution to the specified IQ    //    //    int eff_num_outputs = num_outputs;    unsigned num_consumers = 0;    if (!eaCompPending) {	CreateVector *cv = &cpu->create_vector[thread_number];	//	//  This instruction has written its results back to the register	//  file... update the create vectors to indicate this fact	//	for (i = 0; i < num_outputs; i++) {	    if (inst->spec_mode) {		// update the speculative create vector:		// future operations get value from later creator or		// architected reg file		CVLink link = cv->spec_cv[onames[i]];		if (link.rs == this && link.odep_num == i) {		    // the result can now be read from a physical		    // register, indicate this as so		    cv->spec_cv[onames[i]] = CVLINK_NULL;		    cv->spec_timestamp[onames[i]] = curTick;		}		// else, creator invalidated or there is another		// creator	    } else {		// update the non-speculative create vector, future		// operations get value from later creator or		// architected register file		CVLink link = cv->cv[onames[i]];		if (link.rs == this && link.odep_num == i) {		    // the result can now be read from a physical		    // register, indicate this as so		    cv->cv[onames[i]] = CVLINK_NULL;		    cv->timestamp[onames[i]] = curTick;		}		// else, creator invalidated or there is another		// creator	    }	}		//   for all outputs	//	//  Tell IQ & LSQ that this instruction is complete	//	//  Every non-EA_Comp instruction must walk its output-dependence	//  chains to broadcast its results to other instructions	//	num_consumers =  cpu->IQ[wb_iqueue]->writeback(this, wb_iqueue);	//	//  It's ok to call the LSQ multiple times, since the odep link gets	//  removed once it has been used.	//	//  The queue number argument is unused (ignored) for the LSQ	num_consumers += cpu->LSQ->writeback(this, 0);    } else {	//	//  Address-generation portion of load/store gets special handling	//	//  --> only one op receives the result data	//  --> no create-vectors to mess with	//	assert(seq == lsq_entry->seq);	eff_num_outputs = 1;	num_consumers = 1;	//  Indicate that we've finished with the address generation portion	eaCompPending = false;	lsq_entry->idep_ready[MEM_ADDR_INDEX] = true;	issued = false;	completed = false;	// LSQ operation will be placed on LSQ's ready list in	// lsq_refresh(), depending on things like address	// disambiguation and memory barriers.    }    if (cpu->ptrace)	cpu->ptrace->moveInst(inst, PipeTrace::Writeback, wb_events, 0, 0);    //    //  Statistics...    //    if (eff_num_outputs > 0) {	++cpu->producer_inst[thread_number];	cpu->consumer_inst[thread_number] += num_consumers;    }    return num_consumers;}//////////////////////////////////////////////////////////////////////  recover processor microarchitecture state back to point of the//  mis-predicted branch at IQ[BRANCH_INDEX]////  This routine is called from the BranchRecoveryEvent//voidFullCPU::recover(ROBStation *ROB_branch_entry, int branch_thread){    BaseIQ::iterator IQ_entry;    BaseIQ::iterator LSQ_entry;    ROBStation *ROB_entry;    // recover from the tail of the ROB towards the head until the branch index    // is reached, this direction ensures that the LSQ can be synchronized with    // the IQ    // traverse to older insts until the mispredicted branch is encountered    // Mark all instructions (from the same thread) FOLLOWING the branch as    // squashed (the branch itself commits as a normal instruction)    //  go to first element to squash (ie. the last element in the list)    for (ROB_entry = ROB.tail();	 (ROB_entry != ROB_branch_entry) && (ROB_entry != NULL);         ROB_entry = ROB.prev(ROB_entry))    {	// the IQ should not drain since the mispredicted branch will remain	assert(ROB.num_active());	// should meet up with the branch index first	assert(ROB_entry);	if (!ROB_entry->squashed &&	    (ROB_entry->thread_number == branch_thread)) {	    if (ptrace) {		ptrace->deleteInst(ROB_entry->inst);	    }#if 0	    if (chainGenerator) {		chainGenerator->squashInstruction(ROB_entry);	    }#endif	    //	    //  Inform the IQ and LSQ that an instruction is being squashed	    //	    for (int i=0; i<numIQueues; ++i) {		IQ[i]->inform_squash(ROB_entry);	    }	    LSQ->inform_squash(ROB_entry);	    //	    //  Remove any associated IQ or LSQ entries	    //	    if (ROB_entry->lsq_entry.notnull()) {		LSQ_entry = ROB_entry->lsq_entry;		// squash this LSQ entry		LSQ_entry->tag++;		LSQ_entry->squashed = true;		LSQ->squash(LSQ_entry);	    }	    if (ROB_entry->iq_entry.notnull()) {		IQ_entry = ROB_entry->iq_entry;		// squash this IQ entry		IQ_entry->tag++;		IQ_entry->squashed = true;		//  remove the instruction from it's home IQ		IQ[ROB_entry->queue_num]->squash(IQ_entry);		ROB_entry->iq_entry = 0;		//  tell the remaining clusters that it's gone		for (int q = 0; q < numIQueues; ++q)		    if (q != ROB_entry->queue_num)			IQ[q]->inform_squash(ROB_entry);	    }	    //

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
麻豆精品在线播放| 成人免费三级在线| 国产精品视频九色porn| 欧美视频一区二区在线观看| 国产乱一区二区| 亚洲成人1区2区| 国产精品黄色在线观看| 91精品国产一区二区| 91香蕉视频黄| 国产九色sp调教91| 首页亚洲欧美制服丝腿| 自拍视频在线观看一区二区| 久久综合久久综合久久综合| 欧美天堂一区二区三区| av成人动漫在线观看| 国产一区二区三区免费看| 午夜精品免费在线| 亚洲码国产岛国毛片在线| 久久久www成人免费毛片麻豆| 欧美无砖专区一中文字| 91在线看国产| 成人精品国产福利| 国产美女精品一区二区三区| 免费观看在线色综合| 午夜精品一区二区三区免费视频 | 国产精品久久久久影院老司| 日韩午夜在线观看| 欧美中文字幕久久| 99riav一区二区三区| 国产成人日日夜夜| 国产一区二区三区香蕉| 久久99精品久久久久| 日本在线不卡视频一二三区| 天堂精品中文字幕在线| 亚洲电影中文字幕在线观看| 一区二区三区在线影院| 17c精品麻豆一区二区免费| 国产精品剧情在线亚洲| 国产精品系列在线| 国产欧美一区二区精品性色 | 91精品中文字幕一区二区三区| 91麻豆国产精品久久| 91污在线观看| 一本色道久久综合亚洲aⅴ蜜桃| 99国产精品久| 在线观看日韩高清av| 在线国产电影不卡| 欧美日韩在线播放三区四区| 欧美日韩成人激情| 69成人精品免费视频| 日韩美一区二区三区| 2014亚洲片线观看视频免费| 国产亚洲精久久久久久| 国产丝袜欧美中文另类| 国产精品久久久久久久久久免费看| 国产精品久久久久毛片软件| 亚洲人成网站精品片在线观看| 一区二区三区精品视频| 日韩国产欧美视频| 国产一区日韩二区欧美三区| 成人免费的视频| 欧美性受xxxx黑人xyx| 3d成人h动漫网站入口| 欧美r级在线观看| 免费成人美女在线观看| 国产一区二区三区av电影| 成人一区二区三区| 在线一区二区三区| 日韩西西人体444www| 国产人久久人人人人爽| 亚洲欧美另类久久久精品2019| 亚洲午夜成aⅴ人片| 久草在线在线精品观看| 国产91精品精华液一区二区三区| 色成年激情久久综合| 91精品国产黑色紧身裤美女| 国产欧美日韩视频在线观看| 亚洲区小说区图片区qvod| 日韩二区三区四区| 国产福利精品导航| 欧美亚洲动漫制服丝袜| 久久免费视频色| 一区二区三区在线视频播放| 蜜臀久久99精品久久久久宅男| 从欧美一区二区三区| 欧美日韩中文字幕精品| 久久九九影视网| 亚洲成人黄色小说| 粉嫩av一区二区三区在线播放| 欧美在线观看视频一区二区| 2024国产精品视频| 亚洲成人在线网站| 成人在线一区二区三区| 制服丝袜在线91| 亚洲视频一区二区在线| 久久99精品久久久| 欧美日韩一区二区在线观看视频| 国产婷婷精品av在线| 午夜精彩视频在线观看不卡| 成人av在线一区二区三区| 日韩欧美亚洲国产另类| 亚洲卡通动漫在线| 国产伦精品一区二区三区免费| 欧洲在线/亚洲| 国产精品嫩草影院av蜜臀| 久久99久久精品欧美| 欧美色国产精品| 亚洲品质自拍视频网站| 豆国产96在线|亚洲| 欧美成人一区二区三区片免费| 亚洲午夜视频在线观看| www.久久精品| 精品粉嫩aⅴ一区二区三区四区| 亚洲国产精品一区二区久久恐怖片| 国产白丝精品91爽爽久久| 日韩西西人体444www| 99久久99久久精品免费看蜜桃| 精品国产成人在线影院| 日韩国产欧美视频| 欧美日韩中文字幕一区二区| 曰韩精品一区二区| 99国产一区二区三精品乱码| 国产女主播在线一区二区| 韩国三级在线一区| 日韩视频在线永久播放| 日韩高清不卡一区二区| 欧美老肥妇做.爰bbww视频| 一区二区三区国产| 色悠悠久久综合| 亚洲柠檬福利资源导航| 99国产欧美久久久精品| 亚洲天堂免费在线观看视频| 成人免费看片app下载| 国产午夜精品久久| 懂色一区二区三区免费观看| 国产午夜三级一区二区三| 国产精品一区二区久久不卡| 久久精品夜色噜噜亚洲aⅴ| 国产一区激情在线| 久久久久久久久蜜桃| 国产精品123| 中文字幕乱码一区二区免费| 成人av资源在线| 亚洲视频每日更新| 欧美在线你懂的| 日韩精品一二三| 日韩欧美中文字幕制服| 老汉av免费一区二区三区| www国产亚洲精品久久麻豆| 国产精品一区二区在线看| 亚洲国产成人私人影院tom| jiyouzz国产精品久久| 亚洲一区二区综合| 欧美精品自拍偷拍| 久久99精品国产麻豆婷婷| 国产亚洲一本大道中文在线| 丁香激情综合国产| 一区二区三区四区在线播放| 欧美精品123区| 国模大尺度一区二区三区| 国产精品无人区| 91视频国产资源| 日韩综合一区二区| 久久影视一区二区| 99精品1区2区| 亚洲成av人**亚洲成av**| 日韩色视频在线观看| 国产成人av自拍| 亚洲一区二区三区中文字幕| 欧美大胆一级视频| av在线播放一区二区三区| 亚洲18女电影在线观看| 26uuu成人网一区二区三区| 91蜜桃免费观看视频| 日韩精品免费专区| 日本一区二区三区在线不卡| 欧美综合久久久| 国内精品写真在线观看| 亚洲图片欧美激情| 日韩欧美成人午夜| 一本久久a久久免费精品不卡| 奇米影视在线99精品| 国产精品理伦片| 91精品国产综合久久婷婷香蕉| 高清在线不卡av| 午夜精品免费在线| 国产精品福利一区| 日韩欧美一卡二卡| 欧美国产精品一区二区三区| 欧美视频完全免费看| 国产麻豆精品95视频| 亚洲国产一二三| 国产欧美视频一区二区三区| 欧美少妇性性性| 成人亚洲一区二区一| 天天影视涩香欲综合网| 国产精品成人免费精品自在线观看| 日韩亚洲电影在线| 欧美天天综合网| 99精品偷自拍|