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

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

?? fetch.cc

?? linux下基于c++的處理器仿真平臺。具有處理器流水線
?? CC
?? 第 1 頁 / 共 4 頁
字號:
	/*  itterate through the fetch list  */	for (int j = 0; j < SMT_MAX_THREADS; j++) {	    int thread = fetch_list[j].thread_number;	    /*  look for this thread number in the active list  */	    for (int i = 0; i < active_index; i++) {		/*  If it's in the active list,		 *  Put it into the temporary list so we can sort it		 */		if (active_list[i] == thread) {		    temp_list[templist_index] = fetch_list[j];		    /*  Must make sure that we have the latest			priority information  */		    temp_list[templist_index].priority =			thread_info[thread].priority;		    templist_index++;		}	    }	}	/*  RR policy requires these threads to be sorted into	 * descending priority order */	if (fetch_policy == RR)	    qsort(temp_list,templist_index,		  sizeof(ThreadListElement),rr_compare);	/* put the inactive entries into the temp list */	for (int i = 0; i < inactive_index; i++)	    for (int j = 0; j < SMT_MAX_THREADS; j++)		if (fetch_list[j].thread_number == inactive_list[i])		    temp_list[templist_index++] = fetch_list[j];	/* copy back to the real list */	for (int i = 0; i < SMT_MAX_THREADS; i++)	    fetch_list[i] = temp_list[i];    }}voidFullCPU::change_thread_state(int thread_number, int activate, int priority){    // override specified priority if prioritization disabled via option    if (!fetch_priority_enable)	priority = 100;    thread_info[thread_number].priority = priority;    /*  look for thread in the fetch list  */    int ptr = -1;    for (int i = 0; i < number_of_threads; i++)	if (fetch_list[i].thread_number == thread_number)	    ptr = i;    /*  ptr >= 0 if we found it  */    if (ptr >= 0) {	thread_info[thread_number].active = activate;	thread_info[thread_number].priority = priority;	fetch_list[ptr].priority = priority;	if (fetch_policy == RR)	    fetch_list[ptr].sort_key = priority;    } else	panic("fetch list is screwed up!");    /*  make sure that the fetch list is kosher  */    initialize_fetch_list(false);}/*  Remove all instructions from a specific thread from the fetch queue  */voidFullCPU::fetch_squash(int thread_number){    icache_output_buffer[thread_number]->squash(thread_number);    // free ifq slots reserved for icache_output_buffer insts    if (mt_frontend)        ifq[thread_number].squash();    else        ifq[0].squash(thread_number);    icacheInterface->squash(thread_number);}/* initialize the instruction fetch pipeline stage */voidFullCPU::fetch_init(){    icache_block_size = icacheInterface->getBlockSize();    insts_per_block = icache_block_size / TheISA::fetchInstSize();    for (int i = 0; i < number_of_threads; i++) {        /* allocate the IFETCH -> DISPATCH instruction queue */        if (!mt_frontend) {            if (i == 0)                ifq[0].init(this, ifq_size, number_of_threads);        }        else            ifq[i].init(this, ifq_size, i);	icache_output_buffer[i] = new IcacheOutputBuffer;        icache_output_buffer[i]->init(fetch_width, i);	fetch_stall[i] = 0;	fetch_fault_count[i] = 0;    }}voidFullCPU::clear_fetch_stall(Tick when, int thread_number, int stall_type){    if (fetch_stall[thread_number] == stall_type) {	fetch_stall[thread_number] = 0;    }}// ===========================================================================////  Events used here//voidClearFetchStallEvent::process(){    cpu->clear_fetch_stall(curTick, thread_number, stall_type);    delete this;}const char *ClearFetchStallEvent::description(){    return "clear fetch stall";}voidFetchCompleteEvent::process(){    IcacheOutputBuffer *bufferp;    IcacheOutputBufferEntry *entryp;    int index = first_index;    bufferp = cpu->icache_output_buffer[thread_number];    // checkmshrp->targets[target_idx]. to see if first instruction is    // still valid    entryp = &(bufferp->insts[first_index]);    if (!entryp->inst || entryp->inst->fetch_seq != first_seq_num) {	// squashed! no point in continuing, as any squash will	// eliminate the whole group of instrs	goto done;    }    // are the instrs we fetched at the head of the buffer?  if so,    // we'll want to copy them to the ifq as we go.  if we allow    // multiple fetches on the same thread and they complete out of    // order, this may not be the case.    if (first_index == bufferp->head) {	for (int i = 0; i < num_insts; ++i) {	    entryp = &bufferp->insts[index];            if (cpu->mt_frontend) {                cpu->ifq[entryp->inst->thread_number].append(entryp->inst);            } else {                cpu->ifq[0].append(entryp->inst);            }	    entryp->inst = NULL;	    index = bufferp->incr(index);	}	// now copy any succeeding ready instrs (that were the result	// of an out-of-order fetch completion) to the ifq	while (entryp = &bufferp->insts[index], entryp->ready) {            if (cpu->mt_frontend) {                cpu->ifq[entryp->inst->thread_number].append(entryp->inst);            } else {                cpu->ifq[0].append(entryp->inst);            }	    entryp->ready = false;	    entryp->inst = NULL;	    ++num_insts;	    index = bufferp->incr(index);	}	// update head & num_insts to reflect instrs copied to ifq	bufferp->head = index;	bufferp->num_insts -= num_insts;	assert(bufferp->num_insts >= 0);    } else {	// just mak instrs as ready until preceding instrs complete fetch	for (int i = 0; i < num_insts; ++i) {	    entryp = &(bufferp->insts[index]);	    entryp->ready = true;	    index = bufferp->incr(index);	}    }  done:    delete this;}const char *FetchCompleteEvent::description(){    return "fetch complete";}// ===========================================================================/** * Fetch one instruction from functional memory and execute it * functionally. * * @param thread_number Thread ID to fetch from. * @return A pair consisting of a pointer to a newly * allocated DynInst record and a fault code.  The DynInst pointer may * be NULL if the fetch was unsuccessful.  The fault code may reflect a * fault caused by the fetch itself (e.g., ITLB miss trap), or on the * functional execution.  The fault code will be No_Fault if no * fault was encountered. */pair<DynInst *, Fault>FullCPU::fetchOneInst(int thread_number){    SpecExecContext *xc = thread[thread_number];    Addr pc = xc->regs.pc;    // fetch instruction from *functional* memory into IR so we can    // look at it    MachInst IR;	// instruction register#if FULL_SYSTEM#define IFETCH_FLAGS(pc)	((pc) & 1) ? PHYSICAL : 0#else#define IFETCH_FLAGS(pc)	0#endif    MemReqPtr req = new MemReq(pc & ~(Addr)3, xc, sizeof(MachInst),			       IFETCH_FLAGS(pc));    req->flags |= INST_READ;    req->pc = pc;    /**     * @todo     * Need to set asid correctly once we put in a unified memory system.     */    // Need to make sure asid is 0 so functional memory works correctly    req->asid = 0;    Fault fetch_fault = xc->translateInstReq(req);#if FULL_SYSTEM    if (xc->spec_mode &&	(fetch_fault != No_Fault || (req->flags & UNCACHEABLE) ||	 xc->memctrl->badaddr(req->paddr))) {	// Bad things can happen on misspeculated accesses to bad	// or uncached addresses...  stop now before it's too late	return make_pair((DynInst *)NULL, No_Fault);    }#endif    if (fetch_fault == No_Fault) {	// translation succeeded... attempt access	fetch_fault = xc->mem->read(req, IR);    }    if (fetch_fault != No_Fault) {#if FULL_SYSTEM	assert(!xc->spec_mode);	xc->ev5_trap(fetch_fault);	// couldn't fetch real instruction, so replace it with a noop	IR = TheISA::NoopMachInst;#else	fatal("Bad translation on instruction fetch, vaddr = 0x%x",	      req->vaddr);#endif    }    StaticInstPtr<TheISA> si(IR);    // If SWP_SQUASH is set, filter out SW prefetch instructions right    // away; we don't want them to even count against our fetch    // bandwidth limit.    if (softwarePrefetchPolicy == SWP_SQUASH && si->isDataPrefetch()) {	xc->regs.pc += sizeof(MachInst);	// need this for EIO syscall checking	if (!xc->spec_mode)	    xc->func_exe_inst++;	exe_swp[thread_number]++;	// next instruction instead by calling fetchOneInst()	// again recursively	return fetchOneInst(thread_number);    }    //    // Allocate a DynInst object and populate it    //    DynInst *inst = new DynInst(si);    inst->fetch_seq = next_fetch_seq++;    inst->PC = pc;    inst->thread_number = thread_number;    inst->asid = thread[thread_number]->getDataAsid();    inst->cpu = this;    inst->xc = xc;    inst->fault = fetch_fault;    inst->spec_mode = xc->spec_mode;    inst->trace_data = Trace::getInstRecord(curTick, xc, this,					    inst->staticInst,					    xc->regs.pc, thread_number);    inst->correctPathSeq = (xc->spec_mode == 0) ? correctPathSeq[thread_number]++ : 0;    // Predict next PC to fetch.    // default guess: sequential    inst->Pred_PC = pc + sizeof(MachInst);    if (inst->isControl()) {	// it's a control-flow instruction: check with predictor	// FIXME: This should be a compressed fetch_address	BranchPred::LookupResult result;	if (branch_pred) {	  result =	    branch_pred->lookup(thread_number, pc, inst->staticInst,				&inst->Pred_PC, &inst->dir_update);	  // The old branch predictor interface used a predicted PC of 0	  // to indicate Predict_Not_Taken.  In some rare cases (e.g.,	  // underflow of an uninitialized return address stack), the	  // predictor will predict taken but provided a predicted	  // target of 0.  With the old interface, this was	  // misinterpreted as a not-taken prediction.  Since the new	  // predictor interface actually distinguishes these cases, it	  // gets slightly different misspeculation behavior, leading to	  // slightly different results.  For exact emulation of the old	  // behavior, uncomment the code below.	  //	  // if (inst->Pred_PC == 0) {	  //     inst->Pred_PC = pc + sizeof(MachInst);	  //     result = BranchPred::Predict_Not_Taken;	  // }	  inst->btb_missed = (result == BranchPred::Predict_Taken_No_Target);	} else {	  // Do perfect branch prediction	  // We can't set this yet.	  //inst->Pred_PC = inst->Next_PC;	  inst->btb_missed = false;	}    }    /********************************************************/    /*                                                      */    /*   Fill in the fetch queue entry                      */    /*                                                      */    /********************************************************/    IcacheOutputBufferEntry *buf_entry =	icache_output_buffer[thread_number]->new_tail();    buf_entry->inst = inst;    buf_entry->ready = false;    if (mt_frontend) {	ifq[thread_number].reserve(thread_number);	assert(ifq[thread_number].num_total() <= ifq_size);    } else {	ifq[0].reserve(thread_number);	assert(ifq[0].num_total() <= ifq_size);    }    /**********************************************************/    /*                                                        */    /*   Execute this instruction.			      */    /*                                                        */    /**********************************************************/    if (inst->fault == No_Fault)	inst->fault = execute_instruction(inst, thread_number);    if (inst->fault != No_Fault)	return make_pair(inst, inst->fault);    if (!branch_pred) {      // Do perfect branch prediction      inst->Pred_PC = inst->Next_PC;    }    //    // Update execution context's PC to point to next instruction to    // fetch (based on predicted next PC).    //    //    //  Pipe-tracing...    //    //  This doesn't quite work the way we might want it:    //    - The fourth parameter (latency) is supposed to indicate the    //      cache miss delay...    //    - The fifth parameter (longest latency event) is designed    //      to indicate which of several events took the longest...    //      since our model doesn't generate events, this    //      isn't used here either.    //    if (ptrace) {	ptrace->newInst(inst);	ptrace->moveInst(inst, PipeTrace::Fetch, 0, 0, 0);    }    /*     *   Handle the transition "into" mis-speculative mode     *   (note that we may _already_ be misspeculating)     *     *   There are two "forms" of misspeculation that we have to     *   deal with:     *     (1) Mispredicting the direction of a branch     *     (2) Mispredicting the     */    if (inst->Pred_PC != inst->Next_PC) {	// Conflicting maps are also recover insts, but why?  Perhaps	// because all of the aliased registers are updated?  But	// that shouldn't matter for a renaming machine with the LRT.	// Ah, except the LRT won't be updated until the map executes,	// which is too late.	inst->recover_inst = true;	xc->spec_mode++;    }    return make_pair(inst, No_Fault);}/** * Fetch several instructions (up to a full cache line) from * functional memory and execute them functionally (by calling * fetchOneInst()).  Fetching will cease if the end of the current * cache line is reached, a predicted-taken branch is encountered, a * fault occurs, the fetch queue fills up, or the CPU parameter limits * on instructions or branches per cycle are reached.  In the first * two cases, fetching can continue for this thread in this cycle in * another block; in the remaining cases, fetching for this thread * must be terminated for this cycle. * * @param thread_number Thread ID to fetch from. * @param max_to_fetch Maximum number of instructions to fetch. * @param branch_cnt Reference to number of branches fetched this cycle * for the current thread.  This value will be updated if any branches * are fetched. * @return A pair combining an integer indicating * the number of instructions fetched and a boolean indicating whether * fetching on the current thread should continue. */pair<int, bool>FullCPU::fetchOneLine(int thread_number, int max_to_fetch, int &branch_cnt,		      bool entering_interrupt){    SpecExecContext *xc = thread[thread_number];    int num_fetched = 0;    // remember start address of current line, so we can tell if we

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美性大战久久久久久久| 色综合 综合色| 国内久久婷婷综合| 国产传媒日韩欧美成人| 9l国产精品久久久久麻豆| 色欧美片视频在线观看在线视频| gogo大胆日本视频一区| 日本福利一区二区| 欧美电影免费观看高清完整版在线| 久久久五月婷婷| 一区二区国产视频| 国精产品一区一区三区mba桃花| 成人午夜av在线| 91精品国产91久久久久久最新毛片| 久久久噜噜噜久噜久久综合| 亚洲精品欧美激情| 国产一区二区三区电影在线观看 | 日韩福利视频网| 99精品国产热久久91蜜凸| 久久影院电视剧免费观看| 日本成人在线网站| 欧美精品在线一区二区三区| 亚洲色欲色欲www在线观看| 成人自拍视频在线观看| 久久男人中文字幕资源站| 麻豆精品在线看| 久久天天做天天爱综合色| 午夜精品爽啪视频| 欧美日韩中文另类| 亚洲成人一区在线| 欧洲精品一区二区三区在线观看| 国产精品二三区| 99久久国产综合色|国产精品| 久久精品视频在线免费观看| 激情另类小说区图片区视频区| 精品欧美一区二区在线观看| 免费在线观看不卡| 日韩美女视频在线| 精品夜夜嗨av一区二区三区| 精品国产欧美一区二区| 国产真实精品久久二三区| 国产亚洲一区二区三区在线观看 | 亚洲精品乱码久久久久久黑人| 成人国产免费视频| 亚洲色图清纯唯美| 在线观看免费一区| 日韩主播视频在线| 精品久久免费看| 国产suv精品一区二区883| 国产精品人成在线观看免费 | 久久久亚洲精华液精华液精华液| 韩国女主播成人在线观看| 久久久美女艺术照精彩视频福利播放| 国产激情视频一区二区三区欧美 | 欧美日韩国产经典色站一区二区三区 | 国产日韩一级二级三级| 成人ar影院免费观看视频| 一区二区三区精品视频| 欧美精品自拍偷拍| 国产精品自拍一区| 一区二区三区**美女毛片| 欧美一级在线观看| 波多野结衣视频一区| 午夜影院久久久| 久久久综合九色合综国产精品| 91色视频在线| 麻豆精品一区二区综合av| 亚洲黄色av一区| 精品久久久久久久人人人人传媒| 国产成人av网站| 亚洲成人在线免费| 久久精品一区二区三区不卡| 在线视频国内一区二区| 国产呦萝稀缺另类资源| 亚洲三级在线免费| 精品国产免费一区二区三区香蕉| 99国产精品久久久久| 捆绑紧缚一区二区三区视频| 国产精品的网站| 欧美tickling网站挠脚心| 色诱视频网站一区| 国产精品1区2区| 五月婷婷久久综合| 最新国产成人在线观看| 日韩一区二区三区高清免费看看| 成人免费毛片app| 日本午夜一本久久久综合| 亚洲精品免费播放| 国产拍揄自揄精品视频麻豆| 777奇米四色成人影色区| 91成人网在线| 捆绑调教一区二区三区| 亚洲激情校园春色| 久久久久久久综合| 91麻豆精品国产| 欧美性受xxxx黑人xyx性爽| 国产乱妇无码大片在线观看| 日本成人中文字幕| 一区二区三区高清在线| 国产精品卡一卡二| 久久久亚洲精品一区二区三区| 3d动漫精品啪啪| 欧美视频在线播放| 日本道精品一区二区三区| www.日韩大片| 国产高清视频一区| 久久精品国产久精国产| 视频在线观看一区二区三区| 亚洲一区在线免费观看| 亚洲天堂网中文字| 国产精品二三区| 奇米精品一区二区三区四区| 中文字幕一区二区5566日韩| 国产午夜精品理论片a级大结局| 日韩欧美一级特黄在线播放| 欧美一区二区视频在线观看2022| 欧美色倩网站大全免费| 精品婷婷伊人一区三区三| 欧美三级视频在线| 精品视频一区三区九区| 欧美美女黄视频| 欧美大片在线观看| 久久久久久一级片| 国产精品久久久久三级| 亚洲日本一区二区| 亚洲福利视频三区| 日韩国产精品久久| 激情文学综合丁香| 成人免费毛片片v| 色噜噜夜夜夜综合网| 欧美放荡的少妇| 精品国产一区二区三区av性色| 精品播放一区二区| 亚洲欧美一区二区在线观看| 亚洲人成网站在线| 亚洲成人tv网| 捆绑紧缚一区二区三区视频| 国产乱码一区二区三区| 成年人国产精品| 欧美日韩精品综合在线| 欧美大白屁股肥臀xxxxxx| 久久久99精品免费观看| 亚洲男人天堂一区| 三级不卡在线观看| 成人午夜短视频| 欧美性猛交xxxx黑人交| 日韩一区二区三区三四区视频在线观看| 26uuu精品一区二区在线观看| 国产精品女同互慰在线看| 一区二区三区四区亚洲| 青草国产精品久久久久久| 成人午夜av影视| 欧美高清一级片在线| 日本一区二区成人在线| 亚洲无线码一区二区三区| 狠狠色丁香久久婷婷综| 在线一区二区视频| 久久久不卡网国产精品一区| 亚洲激情第一区| 国产精品 日产精品 欧美精品| 91毛片在线观看| xf在线a精品一区二区视频网站| 国产精品成人在线观看| 久久99久久99| 色偷偷久久一区二区三区| 精品国产一二三| 亚洲成a人v欧美综合天堂| 成人影视亚洲图片在线| 欧美一区二区在线免费观看| 亚洲精品综合在线| 国产一区二区伦理| 日韩一区二区在线观看视频播放| 亚洲三级在线看| 国产精品夜夜嗨| 欧美成人女星排名| 亚洲成人综合在线| 色综合久久久久综合体桃花网| 欧美成人video| 婷婷综合久久一区二区三区| 91亚洲国产成人精品一区二区三| 久久精品视频在线看| 免费高清成人在线| 欧美日韩中文字幕一区二区| 日韩伦理av电影| 成人激情免费电影网址| 久久综合九色综合久久久精品综合 | 成人欧美一区二区三区白人| 久草热8精品视频在线观看| 欧美日韩高清在线播放| 亚洲欧美福利一区二区| 成人av在线播放网址| 中文av一区二区| 国产成人午夜电影网| 久久久久久久久蜜桃| 激情图片小说一区| 亚洲精品一区二区三区福利| 男男成人高潮片免费网站| 欧美一区二区三区不卡| 日韩精品亚洲专区| 欧美一区二区三区白人|