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

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

?? dispatch.cc

?? linux下基于c++的處理器仿真平臺。具有處理器流水線
?? CC
?? 第 1 頁 / 共 4 頁
字號:
		//  If we run out of chains...		//	      case FLOSS_DIS_POLICY:		done = true;		break;	      case FLOSS_DIS_CAUSE_NOT_SET:		done = false;		break;	      default:		warn("need to adjust endCauses for dispatch_thread()");		done = false;	    }	    if (queue_endCause == FLOSS_DIS_CAUSE_NOT_SET) {		if (decodeQueue->instsAvailable(thread) == 0) {		    SET_FIRST_FLOSS_CAUSE(endCause, FLOSS_DIS_NO_INSN);		    done = true; // nothing left to dispatch		}	    }	    if (dispatched_this_cycle == dispatch_width) {		SET_FIRST_FLOSS_CAUSE(endCause, FLOSS_DIS_BW);		done = true;  // we used all available BW	    }	    if (done)		SET_FIRST_FLOSS_CAUSE(endCause, queue_endCause);	} while (!done);	assert(endCause != FLOSS_DIS_CAUSE_NOT_SET);	break;      case MODULO_N:	//	//  We dispatch A SINGLE thread to as many IQ's as necessary.	//	//  rotate through all the IQ's until:	//    (1) We run out of instructions to dispatch	//    (2) We try to dispatch to an IQ, and fail	//	//  ==> This means that we have to check each IQ for caps, etc	//      as we rotate through...	//	lastDispatchTime[thread] = curTick;	do {	    DispatchEndCause queue_endCause = FLOSS_DIS_CAUSE_NOT_SET;	    unsigned dispatched_this_queue =		dispatch_thread(thread, iq_idx, dispatch_width,				queue_endCause);	    dispatched_this_cycle += dispatched_this_queue;	    switch (queue_endCause) {		//		// The following end-causes indicate that we can't dispatch		// any more instructions this cycle		//	      case FLOSS_DIS_ROB_FULL:	      case FLOSS_DIS_LSQ_FULL:	      case FLOSS_DIS_IREG_FULL:	      case FLOSS_DIS_FPREG_FULL:		done = true;		endCause = queue_endCause;		break;		//		// The following end-causes indicate that we can't continue		// dispatching this thread this cycle		//	      case FLOSS_DIS_ROB_CAP:	      case FLOSS_DIS_NO_INSN:		done = true;		endCause = queue_endCause;		break;		//		// The following end-causes indicate that we can't continue		// dispatching to this Queue, but should try the next one		//	      case FLOSS_DIS_IQ_FULL:	      case FLOSS_DIS_IQ_CAP:	      case FLOSS_DIS_BW:	      case FLOSS_DIS_POLICY:		endCause = queue_endCause;		//		done = false;		done = true;		break;	      case FLOSS_DIS_CAUSE_NOT_SET:		done = false;		break;	      default:		warn("need to adjust endCauses for dispatch_thread()");		done = false;	    }	    if (queue_endCause == FLOSS_DIS_CAUSE_NOT_SET) {		if (decodeQueue->instsAvailable(thread) == 0) {		    SET_FIRST_FLOSS_CAUSE(endCause, FLOSS_DIS_NO_INSN);		    done = true; // nothing left to dispatch		}	    }	    if (dispatched_this_cycle == dispatch_width) {		SET_FIRST_FLOSS_CAUSE(endCause, FLOSS_DIS_BW);		done = true;  // we used all available BW	    }	    if (!done) {#if 0		//  Rotate to the next IQ		iq_idx = choose_iqueue(thread);		if ((iq_idx < 0) || (iq_idx == first)) {		    done = true;		    // we call this policy...		    SET_FIRST_FLOSS_CAUSE(endCause, FLOSS_DIS_POLICY);		}#endif	    } else		SET_FIRST_FLOSS_CAUSE(endCause, queue_endCause);	} while (!done);	assert(endCause != FLOSS_DIS_CAUSE_NOT_SET);	break;      case THREAD_PER_QUEUE:	//	//  Walk the sorted list of threads, dispatching as many insts	//  from each as possible.	//	for (unsigned t = 0; t < SMT_MAX_THREADS; ++t) {	    if (tlist[t].eligable) {		unsigned dispatched_this_thread = 0;		unsigned iq_idx = tlist[t].iq_idx;		unsigned thread = tlist[t].thread_number;		unsigned possible_dispatches =		    dispatch_width - dispatched_this_cycle;		dispatched_this_thread =		    dispatch_thread(thread, iq_idx, possible_dispatches,				    endCause);		dispatched_this_cycle += dispatched_this_thread;		bool done;		switch (endCause) {		    //		    // The following end-causes indicate that we can't dispatch		    // any more instructions this cycle		    //		  case FLOSS_DIS_ROB_FULL:		  case FLOSS_DIS_LSQ_FULL:		  case FLOSS_DIS_IREG_FULL:		  case FLOSS_DIS_FPREG_FULL:		    done = true;  // stop dispatching		    break;		    //		    // The following end-causes indicate that we can't		    // continue dispatching this thread this cycle		    //		  case FLOSS_DIS_ROB_CAP:		  case FLOSS_DIS_NO_INSN:		  case FLOSS_DIS_POLICY:		    done = false; // continue dispatching		    break;		    //		    // The following end-causes indicate that we can't continue		    // dispatching to this Queue, but should try the next one		    //		  case FLOSS_DIS_IQ_FULL:		  case FLOSS_DIS_IQ_CAP:		  case FLOSS_DIS_BW:		    done = false; // continue dispatching		    break;		  case FLOSS_DIS_CAUSE_NOT_SET:		    done = false;		    break;		  default:		    warn("need to adjust endCauses for dispatch_thread()");		    done = false;		}		if (done)		    break;		if (dispatched_this_cycle == dispatch_width) {		    SET_FIRST_FLOSS_CAUSE(endCause, FLOSS_DIS_BW);		    break;  // we used _all_ available BW		}		//		//  If we dispatched all available instructions		//  for this thread, and the "next" thread is going		//  to try to dispatch, then reset the endCause		//		if (dispatched_this_thread == tlist[t].disp_insts &&		    t < (SMT_MAX_THREADS - 1) && tlist[t + 1].eligable)		    endCause = FLOSS_DIS_CAUSE_NOT_SET;	    } else {		//  endCause will have been set earlier, when we assigned		//  scores		break;  // no other threads will be eligible	    }	}	break;    }    //    //  Anything that we didn't set a cause for before this point, MUST    //  be a thread that we _could_ have dispatched, but chose not to    //    if (floss_state.dispatch_end_cause == FLOSS_DIS_CAUSE_NOT_SET)	floss_state.dispatch_end_cause = FLOSS_DIS_BROKEN;#if DUMP_IQ    IQ[0]->dump(0);#endif}////  Return the desired cluster//unsignedFullCPU::choose_dependence_cluster(DynInst *inst){    unsigned thread = inst->thread_number;    RegInfoTable * rit = clusterSharedInfo->ri_table;    bool chained = false;    Tick pred_ready = 0;    unsigned pred_cluster = IQLeastFull();  // default if no chained idep    for (int i = 0; i < inst->numSrcRegs(); ++i) {	unsigned ireg = inst->srcRegIdx(i);	//	//  If we have an input register that is not yet ready and is chained	//	chained = (*rit)[thread][ireg].isChained();	if (create_vector[thread].entry(ireg).rs != 0) {	    if ((*rit)[thread][ireg].predReady() > pred_ready) {		pred_ready = (*rit)[thread][ireg].predReady();		pred_cluster = (*rit)[thread][ireg].cluster();	    }	} else {	    // sanity check: if the input reg does not have a creator,	    // it had better not be chained...	    assert(!chained);	}    }    return pred_cluster;}////  Dispatch the next 'max' instructions for thread number 'thread' to//  Instruction queue 'iq_idx'.////  Returns://     - The number of instructions actually dispatched//       (squashed instructions _do_ count)//     - The reason we stopped dispatching//       (this value will NOT be set if we stop due to reaching 'max')////  Dispatch End Causes Returned://     FLOSS_DIS_NO_INSN   --> No more instructions to dispatch for this thread//     FLOSS_DIS_BW        --> No BW left for this queue////     FLOSS_DIS_IQ_FULL     {via checkThreadForDispatch()}//     FLOSS_DIS_IQ_CAP      {via checkThreadForDispatch()}//     FLOSS_DIS_LSQ_FULL    {via checkThreadForDispatch()}//     FLOSS_DIS_ROB_FULL    {via checkThreadForDispatch()}//     FLOSS_DIS_ROB_CAP     {via checkThreadForDispatch()}//     FLOSS_DIS_IREG_FULL   {via checkThreadForDispatch()}//     FLOSS_DIS_FPREG_FULL  {via checkThreadForDispatch()}//unsignedFullCPU::dispatch_thread(unsigned thread, unsigned iq_idx, unsigned max,		     DispatchEndCause &endCause){    ROBStation *rob;    unsigned dCount = 0;    unsigned first_idx;    bool using_loose_mod_n = false;    DPRINTF(Pipeline, "DISP:     dispatch_thread (thread %d) (clust %d)\n", thread, iq_idx);    //  Default case... no maximum value    if (max == 0) {	max = dispatch_width;    }    first_idx = iq_idx;    //    //  Dispatch until:    //    (1) An instruction fails to dispatch    //    (2) We dispatch the "max" number of instructions    //    (3) We run out of decodeQueue bandwidth    //    do {	DynInst * inst = decodeQueue->peek(thread);	//	//  If this inst hasn't been squashed...	//	if (inst != 0) {	    // If it's a serializing instruction, flush the pipeline	    // by stalling here until all older instructions have	    // committed.  Do this before checking for No_OpClass,	    // since instructions that only serialize (e.g. Alpha	    // trapb) will have No_OpClass and thus get discarded	    // before being dispatched once the serialization is	    // complete.	    if (inst->isSerializing() && ROB.num_thread(thread) != 0) {		SET_FIRST_FLOSS_CAUSE(endCause, FLOSS_DIS_SERIALIZING);		++dispatch_serialize_stall_cycles[thread];		break;	    } else if (inst->fault == No_Fault		       && (inst->opClass() == No_OpClass || inst->isNop()			   || inst->isInstPrefetch())) {		// Drop things that don't need to go any farther in the		// pipeline.  This includes all instructions that do not		// use a function unit (i.e. have No_OpClass for their op		// class).  This should include all instructions that		// declare themselves as no-ops (isNop()), but just to be		// sure we'll check that too.  We're also dropping		// instruction prefetches here for historical reasons (in		// practice we don't have any, I believe).		if (ptrace) {		    ptrace->moveInst(inst, PipeTrace::Dispatch, 0, 0, 0);		    ptrace->deleteInst(inst);		}		// Copied this here from dispatch_one_inst() since		// insts that get discarded here never make it to that		// function.  Causes minor inconsistencies since these		// don't get counted in some other stats, but oh well.		if (inst->isSerializing())		    ++dispatched_serializing[thread];		delete inst;		inst = 0;		// not going to need this one...		decodeQueue->remove(thread);		++dCount;	    } else {		DispatchEndCause cause;		unsigned output_reg = 0;		bool output_reg_valid = false;		if (numIQueues == 1) {		    cause = checkThreadForDispatch(thread, iq_idx, 1);		} else {		    //		    //  Some dispatch policies require decisions to be made		    //  for each instruction...		    //		    switch (dispatch_policy) {		      case DEPENDENCE:			//			//  Find the output register			//  (--> assumes only one output register per			//  instruction)			//			for (int i = 0; i < inst->numDestRegs(); ++i) {			    output_reg = inst->destRegIdx(i);			    output_reg_valid = true;			    break;			}			//			//  Now pick the Cluster...			//			iq_idx = choose_dependence_cluster(inst);			//			//  Check for available resources			//			cause = checkThreadForDispatch(thread, iq_idx, 1);			//			//  Just because we can't put the instruction where			//  we want it doesn't mean that we shouldn't dispatch			//  it...			//			if (cause == FLOSS_DIS_BW) {			    //  No IQ bandwidth for our preferred IQ...			    //  --> try to dispatch to the least full IQ, but			    //      if that also fails, blame the original IQ			    //      BW problem			    unsigned new_idx = IQLeastFull();			    DispatchEndCause new_cause =				checkThreadForDispatch(thread, new_idx, 1);			    if (new_cause == FLOSS_DIS_CAUSE_NOT_SET) {				// go with the new IQ				cause = new_cause;				iq_idx = new_idx;			    }			}			break;		      case MODULO_N:			cause = checkThreadForDispatch(thread, iq_idx, 1);			if (cause == FLOSS_DIS_IQ_FULL ||			    cause == FLOSS_DIS_IQ_CAP ||			    cause == FLOSS_DIS_BW)			{			    DispatchEndCause temp = cause;			    unsigned n = IQFreeSlotsX(iq_idx);			    if (n) {				++mod_n_disp_stalls[thread];				mod_n_disp_stall_free[thread] += n;				//				//  Loose Mod-N:				//				//  if we'd normally just quit, try to find a				//  different cluster for these instructions				//				if (loose_mod_n_policy) {				    do {					iq_idx = (iq_idx+1) % numIQueues;					if (iq_idx == first_idx) {					    cause = temp;					    break;					}					cause = checkThreadForDispatch					    (thread, iq_idx, 1);				    } while (cause != FLOSS_DIS_CAUSE_NOT_SET);				    if (cause == FLOSS_DIS_CAUSE_NOT_SET)					using_loose_mod_n = true;				}			    }			}			break;		      default:			//			//  "normal case": Just check for available resources			//			cause = checkThreadForDispatch(thread, iq_idx, 1);			break;		    }		}		if (cause != FLOSS_DIS_CAUSE_NOT_SET) {		    SET_FIRST_FLOSS_CAUSE(endCause, cause);		    break;		}		//		//  Dispatch this instruction		//		rob = dispatch_one_inst(inst, iq_idx);		//		//  Policy-Dependant post-processing		//		if (numIQueues > 1) {		    switch (dispatch_policy) {		      case MODULO_N:			if ((rob != 0) &&			    ((dispatch_count[thread]) % MODULO_VAL))			{			    mod_n_queue_idx = ++mod_n_queue_idx % numIQueues;			    if (!using_loose_mod_n) {				iq_idx = mod_n_queue_idx;				first_idx = iq_idx;			    }			}			break;		      default:			break;		    }		}		//		//  If we dispatched the instruction...		//		if (rob != 0) {		    //  remove it from the decode queue		    decodeQueue->remove(thread);		    ++dCount;		    if (dispatch_policy == DEPENDENCE) {			if (output_reg_valid) {			    rob->output_reg = output_reg;			    (*clusterSharedInfo->ri_table)[thread][output_reg].				setCluster(iq_idx);			}		    }		    if (decodeQueue->instsAvailable(thread) == 0) {			SET_FIRST_FLOSS_CAUSE(endCause, FLOSS_DIS_NO_INSN);			break;		    }		} else {		    //  this should really never happen...		    //  ==> It can if the segmented IQ enters deadlock		    //      recovery mode!		    // warn("dispatch_one_inst() failed @%d!", curTick);		    endCause = FLOSS_DIS_POLICY;		    break;		}	    }	} else {	    //	    //  Squashed instruction	    //	    decodeQueue->remove(thread);	    ++dCount;	}	//	//  We must have instructions to continue...	//	if (decodeQueue->instsAvailable(thread) == 0) {	    SET_FIRST_FLOSS_CAUSE(endCause, FLOSS_DIS_NO_INSN);	    break;	}	DispatchEndCause c = checkGlobalResourcesForDispatch(1);	if (c != FLOSS_DIS_CAUSE_NOT_SET) {	    SET_FIRST_FLOSS_CAUSE(endCause, c);	    break;	}	//  Check to see if we've dispatched the specified maximum number of	//  instructions	if (dCount >= max)	    break;    } while (true);    return dCount;}//////  Dispatch this instruction to the specified queue////ROBStation *FullCPU::dispatch_one_inst(DynInst *inst, unsigned iq_idx){    if (dispatch_break && (dispatch_break == dispatch_seq))	dispatch_breakpoint();    unsigned thread = inst->thread_number;    if (DTRACE(Pipeline)) {	string s;	inst->dump(s);	DPRINTF(Pipeline, "Dispatch %s\n", s);    }

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品三级电影| 欧美色欧美亚洲另类二区| 日韩午夜激情免费电影| 亚洲福利视频一区| 欧美人妖巨大在线| 日本强好片久久久久久aaa| 欧美一区日本一区韩国一区| 日韩黄色片在线观看| 日韩欧美视频在线| 国产精品一区二区三区四区| 国产精品久久看| 色婷婷精品久久二区二区蜜臀av| 亚洲在线观看免费| 日韩女优av电影| 国产精品99久久久久久久vr| 中文字幕亚洲视频| 欧美日韩成人综合天天影院| 美女诱惑一区二区| 国产精品美女久久久久久| 91久久精品一区二区二区| 午夜久久久久久久久| 精品国产一区二区三区忘忧草 | 另类调教123区| 日本一区二区在线不卡| 91丨九色丨黑人外教| 天堂成人国产精品一区| 久久亚洲影视婷婷| 色婷婷综合久久久中文字幕| 美国十次综合导航| ㊣最新国产の精品bt伙计久久| 欧美日韩一区二区电影| 国产成人综合网站| 一区二区三区 在线观看视频| 51精品久久久久久久蜜臀| 国产宾馆实践打屁股91| 午夜伊人狠狠久久| 国产欧美一区二区三区鸳鸯浴| 欧美亚洲综合色| 国产高清久久久久| 亚洲成人精品一区| 国产精品毛片高清在线完整版| 69久久99精品久久久久婷婷| 成人激情电影免费在线观看| 日本欧洲一区二区| 一区二区三区中文字幕在线观看| 精品成人在线观看| 5858s免费视频成人| 99久久国产综合精品女不卡 | 国产一区二区按摩在线观看| 亚洲欧美日韩在线| 2020国产精品久久精品美国| 欧美图区在线视频| 99久久精品国产精品久久| 国产一区二区在线看| 亚洲国产综合人成综合网站| 国产精品色一区二区三区| 精品电影一区二区| 欧美一区二区三区免费在线看| 日本福利一区二区| 国产91富婆露脸刺激对白| 午夜精品福利一区二区三区av| 成人欧美一区二区三区小说| 久久久午夜精品理论片中文字幕| 欧美一区二区三区色| 欧美视频在线观看一区二区| 99久久er热在这里只有精品66| 久久er精品视频| 蜜乳av一区二区| 视频一区中文字幕国产| 午夜伊人狠狠久久| 一区二区三区四区av| 亚洲欧美日韩国产综合| 国产精品久久精品日日| 欧美激情综合网| 国产亚洲成年网址在线观看| 久久综合av免费| www国产成人免费观看视频 深夜成人网| 91精品国产丝袜白色高跟鞋| 欧美日韩电影在线| 欧美精品在欧美一区二区少妇| 欧美系列日韩一区| 欧美嫩在线观看| 欧美高清激情brazzers| 91精品国产综合久久久久久漫画| 欧美日韩亚洲综合在线 | 成人黄色国产精品网站大全在线免费观看| 精品一区二区免费在线观看| 九色|91porny| 国产美女精品人人做人人爽 | 欧美高清在线一区二区| 日本一区二区综合亚洲| 中文字幕制服丝袜一区二区三区 | 99国产一区二区三精品乱码| www.综合网.com| 一本色道**综合亚洲精品蜜桃冫| 一本到高清视频免费精品| 欧洲日韩一区二区三区| 91精品国产免费| 久久久精品国产免大香伊| 国产精品电影一区二区| 亚洲午夜久久久久久久久电影院| 国产在线一区二区| 成人av影视在线观看| 色妹子一区二区| 欧美一区午夜精品| 日本一区免费视频| 怡红院av一区二区三区| 日韩不卡免费视频| 国产精品一二三| 日本韩国一区二区| 91精品欧美福利在线观看| 国产性色一区二区| 亚洲综合色区另类av| 精品在线你懂的| 91麻豆国产福利在线观看| 欧美一三区三区四区免费在线看| 久久午夜免费电影| 亚洲精品日韩综合观看成人91| 日韩成人av影视| 成人免费高清在线| 337p亚洲精品色噜噜狠狠| 国产欧美一区二区三区鸳鸯浴| 亚洲午夜精品一区二区三区他趣| 九九精品一区二区| 日本高清不卡视频| 久久精品免视看| 午夜视频在线观看一区| 国产成人综合视频| 欧美日韩成人一区| 国产精品第13页| 国产在线一区二区综合免费视频| 日本韩国精品一区二区在线观看| 精品久久久久一区二区国产| 亚洲免费在线视频一区 二区| 奇米色一区二区| 91亚洲国产成人精品一区二三| 精品美女在线播放| 亚洲第一激情av| 91在线观看视频| 久久久亚洲午夜电影| 一本色道a无线码一区v| 久久精品人人做人人爽97| 日韩电影在线免费观看| 色噜噜久久综合| 亚洲国产精品激情在线观看| 美国三级日本三级久久99| 欧美伊人久久久久久午夜久久久久| 国产亚洲综合性久久久影院| 日韩av一级片| 精品视频免费看| 亚洲黄色小说网站| eeuss影院一区二区三区| 久久综合狠狠综合久久激情| 日韩高清不卡一区| 4438亚洲最大| 亚洲国产美女搞黄色| 日本韩国视频一区二区| 18成人在线观看| 99re成人精品视频| 国产精品久久久一本精品 | 亚洲一区二区在线观看视频| 成人h动漫精品一区二区| 久久久久久免费毛片精品| 精品在线免费视频| 欧美一区二区女人| 欧美a级理论片| 日韩欧美一区二区视频| 蜜桃一区二区三区在线观看| 日韩丝袜情趣美女图片| 蜜臀av亚洲一区中文字幕| 欧美一区二区视频在线观看 | 欧美激情综合网| 国产精品资源站在线| 国产欧美日韩另类一区| 国产99一区视频免费| 国产精品乱码妇女bbbb| 99久久久精品免费观看国产蜜| 中文字幕一区二区三区乱码在线 | 国产精品成人网| 色女孩综合影院| 午夜视频一区二区| 日韩欧美亚洲另类制服综合在线| 蜜桃一区二区三区四区| 26uuu久久天堂性欧美| 国产成人综合亚洲91猫咪| 国产精品毛片久久久久久| 91免费在线播放| 五月天中文字幕一区二区| 91精品久久久久久蜜臀| 国产一区中文字幕| 国产精品久99| 国产精品伦理一区二区| 色菇凉天天综合网| 日韩av不卡一区二区| 久久亚洲精华国产精华液| av亚洲产国偷v产偷v自拍| 亚洲精品免费在线| 日韩一区二区三免费高清| 国产成人免费视频网站| 一区二区久久久|