專利名稱:基于指令隊(duì)列的程序循環(huán)代碼動(dòng)態(tài)檢測及執(zhí)行方法
技術(shù)領(lǐng)域:
本發(fā)明涉及微處理器代碼執(zhí)行方法領(lǐng)域,具體涉及一種基于指令隊(duì)列的程序循環(huán)代碼動(dòng)態(tài)檢測及執(zhí)行方法。
背景技術(shù):
計(jì)算機(jī)程序中一般都會(huì)存在大量循環(huán)代碼,用于表示需要重復(fù)多次執(zhí)行的操作。循環(huán)代碼的執(zhí)行在微處理器中是重復(fù)的行為,尤其是對(duì)于指令讀取而言,每次取指都是相同的地址和相同的指令?,F(xiàn)代微處理器中,為了緩解處理器與外部存儲(chǔ)訪問之間的速度差異(即“存儲(chǔ)墻”問題),都在片內(nèi)集成了高速緩存(即cache),用來保存處理器運(yùn)行時(shí)需要的 指令和數(shù)據(jù)。高速緩存的容量較外部存儲(chǔ)器小,讀寫速度快。在高速緩存中命中的讀寫操作,就無需再訪問片外的存儲(chǔ)器,從而在一定程度上緩解了“存儲(chǔ)墻”問題。同時(shí),由于高速緩存的讀寫端口有限,為了減少因指令和數(shù)據(jù)的讀寫沖突導(dǎo)致的停頓,大多數(shù)高性能微處理器都將高速緩存分割為指令緩存和數(shù)據(jù)緩存(稱為“哈佛結(jié)構(gòu)”),各自擁有獨(dú)立的讀寫總線,提高指令讀取和數(shù)據(jù)讀寫的并行性。在這種結(jié)構(gòu)的處理器中,首先由取指部件提供指令地址,到指令緩存中讀取指令。返回的指令接著進(jìn)行譯碼、執(zhí)行等操作。如果該指令是發(fā)生跳轉(zhuǎn)的分支指令,則它的跳轉(zhuǎn)目標(biāo)指令地址根據(jù)分支指令的計(jì)算結(jié)果得到,作為后續(xù)指令地址,否則后續(xù)指令地址為當(dāng)前指令地址連續(xù)的下一條指令地址。指令在執(zhí)行的過程中可能由于操作數(shù)的不可用(數(shù)據(jù)相關(guān))或執(zhí)行部件的不可用(結(jié)構(gòu)相關(guān))而導(dǎo)致流水線停頓。為了避免流水線執(zhí)行段的停頓阻塞流水線前端的取指,大多數(shù)處理器都在流水線的取指段和譯碼段、執(zhí)行段之間增加一個(gè)指令隊(duì)列,用來保存已經(jīng)從指令緩存中取出但暫時(shí)無法流出到后續(xù)流水線的指令,這樣流水線后端的停頓不會(huì)阻塞前端的取指,直到指令隊(duì)列充滿。但是,當(dāng)程序中的循環(huán)代碼在這種現(xiàn)有技術(shù)的處理器流水線中執(zhí)行時(shí),循環(huán)代碼將被展開,循環(huán)體中的指令將被重復(fù)地從指令存儲(chǔ)器中讀取,造成資源浪費(fèi)。特別是在當(dāng)前多核多線程處理器中,線程之間的交替執(zhí)行可能會(huì)競爭高速緩存資源從而發(fā)生替換操作,在執(zhí)行新的一次循環(huán)時(shí)原本已經(jīng)讀入指令緩存的指令仍可能發(fā)生失效,需要重新載入,導(dǎo)致性能降低。同時(shí),重復(fù)的讀取相同指令也會(huì)增加指令緩存訪問的動(dòng)態(tài)功耗,在功耗問題日益成為微處理器設(shè)計(jì)中首要挑戰(zhàn)的情況下,這是一種功耗的浪費(fèi),存在優(yōu)化的空間。在一些處理器設(shè)計(jì)的技術(shù)方案中,也有一些技術(shù)方案通過編譯手段標(biāo)識(shí)循環(huán)體的起始位置、在執(zhí)行時(shí)將循環(huán)指令保存在特定的存儲(chǔ)器中、后續(xù)的循環(huán)指令從該存儲(chǔ)器中獲得,從而實(shí)現(xiàn)指令重用、減少指令緩存的重復(fù)訪問。但是,這種方法需要增加額外的存儲(chǔ)部件,能夠檢測的循環(huán)代碼長度受限于存儲(chǔ)容量,特別是在多線程處理器中,由于每個(gè)線程都需要獨(dú)立的指令存儲(chǔ)部件,因此帶來的額外面積開銷更大,可擴(kuò)展性不好。而且,這種方法無法動(dòng)態(tài)完成循環(huán)檢測,不利于二進(jìn)制代碼的兼容性。如圖I所示,現(xiàn)有技術(shù)帶指令隊(duì)列的流水線前、后端結(jié)構(gòu),包括取指部件、指令隊(duì)列、各功能部件等部分。指令隊(duì)列之前的取指部件稱為流水線前端,指令隊(duì)列之后的各功能部件稱為流水線后端;取指部件主要由程序計(jì)數(shù)器(PC)和指令緩存(指令cache)組成。取指部件根據(jù)程序計(jì)數(shù)器給出的指令地址到指令緩存中讀取指令,然后根據(jù)寫指針標(biāo)識(shí)的位置存儲(chǔ)到指令隊(duì)列中,然后寫指針遞增。同時(shí)程序計(jì)數(shù)器也遞增,開始讀取順序的下一條指令。如果指令不在當(dāng)前的指令緩存中,則發(fā)生指令緩存失效,停頓流水線前端,直到指令從更高一級(jí)緩存或存儲(chǔ)器中返回。指令隊(duì)列判斷當(dāng)前讀指針?biāo)鶚?biāo)識(shí)的指令是否滿足執(zhí)行條件,如操作數(shù)是否就緒、功能部件是否空閑等。一旦條件滿足,則將該指令發(fā)射到功能部件執(zhí)行,同時(shí)讀指針遞增。如果指令是分支指令,則發(fā)射到分支部件執(zhí)行。如果該分支指令執(zhí)行的結(jié)果是跳轉(zhuǎn),則清空流水線和指令隊(duì)列中的已有指令,將跳轉(zhuǎn)目標(biāo)地址傳遞給流水線前端的程序計(jì)數(shù)器,從新的指令地址開始重新取指。經(jīng)典的帶指令隊(duì)列的流水線不支持循環(huán)檢測功能,指令隊(duì)列中的指令在發(fā)射到流水線后端的同時(shí)就在隊(duì)列中清除,下次再執(zhí)行時(shí)重新從指令緩存中讀取。
發(fā)明內(nèi)容
本發(fā)明要解決的技術(shù)問題是提供一種執(zhí)行效率高、處理性能好、執(zhí)行功耗低、硬件開銷小、支持嵌套循環(huán)、兼容性強(qiáng)、可擴(kuò)展性好的基于指令隊(duì)列的程序循環(huán)代碼動(dòng)態(tài)檢測及執(zhí)行方法。 為了解決上述技術(shù)問題,本發(fā)明采用的技術(shù)方案為
一種基于指令隊(duì)列的程序循環(huán)代碼動(dòng)態(tài)檢測及執(zhí)行方法,其實(shí)施步驟如下
1)從指令緩存中取指并保存到指令隊(duì)列中,將指令隊(duì)列中保存的指令發(fā)射到功能部件執(zhí)行,當(dāng)執(zhí)行指令為分支指令且執(zhí)行結(jié)果為跳轉(zhuǎn)時(shí)獲取跳轉(zhuǎn)方向以及跳轉(zhuǎn)目標(biāo)距離,如果跳轉(zhuǎn)方向?yàn)橄蚝筇D(zhuǎn)且跳轉(zhuǎn)目標(biāo)距離在指令隊(duì)列的長度以內(nèi),則預(yù)測當(dāng)前執(zhí)行的分支指令與跳轉(zhuǎn)目標(biāo)地址之間的代碼為程序循環(huán)代碼,并進(jìn)入下一步;
2)從指令緩存中取出程序循環(huán)代碼對(duì)應(yīng)的指令并填充在指令隊(duì)列中;
3)將指令緩存旁路,直接從指令隊(duì)列中取出指令并發(fā)射到功能部件執(zhí)行,在程序循環(huán)代碼的所有指令執(zhí)行完畢后恢復(fù)指令緩存的工作狀態(tài)。作為本發(fā)明上述技術(shù)方案的進(jìn)一步改進(jìn)
所述步驟2)的詳細(xì)步驟如下
2.I)預(yù)先在指令隊(duì)列中增加循環(huán)頭指針,預(yù)先在分支處理部件增加循環(huán)檢測標(biāo)志寄存器、循環(huán)執(zhí)行標(biāo)識(shí)寄存器和循環(huán)代碼頭指令程序計(jì)數(shù)器寄存器,在預(yù)測當(dāng)前執(zhí)行的分支指令與跳轉(zhuǎn)目標(biāo)地址之間的代碼為程序循環(huán)代碼后將循環(huán)頭指針指向?yàn)橹噶铌?duì)列當(dāng)前寫指針的位置、將循環(huán)檢測標(biāo)志寄存器賦值為I、將循環(huán)執(zhí)行標(biāo)識(shí)寄存器賦值為O、將循環(huán)代碼頭指令程序計(jì)數(shù)器寄存器賦值為當(dāng)前分支指令的跳轉(zhuǎn)目標(biāo)程序計(jì)數(shù)器值;
2.2)從指令緩存中取出程序循環(huán)代碼對(duì)應(yīng)的指令并存儲(chǔ)在指令隊(duì)列中寫指針?biāo)赶虻奈恢貌㈨樞蜻f增寫指針的值,當(dāng)寫指針的下一個(gè)位置為循環(huán)頭指針時(shí)暫停取指;同時(shí)在讀指針指向的指令如果滿足分派條件則分派到功能部件執(zhí)行,保持循環(huán)頭指針不變并順序遞增讀指針直至讀指針的下一個(gè)位置為循環(huán)頭指針,此時(shí)將循環(huán)檢測標(biāo)志寄存器賦值為0,繼續(xù)遞增寫指針,跳轉(zhuǎn)步驟I)繼續(xù)取指執(zhí)行;當(dāng)執(zhí)行指令為分支指令且執(zhí)行結(jié)果為跳轉(zhuǎn)時(shí)判斷跳轉(zhuǎn)指令的跳轉(zhuǎn)方向,如果為向前跳轉(zhuǎn)則清空指令隊(duì)列和流水線中的指令,將循環(huán)檢測標(biāo)志寄存器賦值為0,根據(jù)程序計(jì)數(shù)器中當(dāng)前的分支指令跳轉(zhuǎn)目標(biāo)程序計(jì)數(shù)器值繼續(xù)從指令緩存中取指,跳轉(zhuǎn)步驟I)繼續(xù)執(zhí)行,流水線重新回到正常執(zhí)行狀態(tài),否則跳轉(zhuǎn)執(zhí)行下一I K
少;
2.3)將分支指令跳轉(zhuǎn)目標(biāo)程序計(jì)數(shù)器值和循環(huán)代碼頭指令程序計(jì)數(shù)器寄存器值進(jìn)行比較,如果分支指令跳轉(zhuǎn)目標(biāo)程序計(jì)數(shù)器值大于循環(huán)代碼頭指令程序計(jì)數(shù)器寄存器值,則判定存在嵌套循環(huán)且內(nèi)層循環(huán)代碼已在指令隊(duì)列中,清空已發(fā)射流水線中的指令,然后根據(jù)分支指令跳轉(zhuǎn)目標(biāo)程序計(jì)數(shù)器值和循環(huán)代碼頭指令程序計(jì)數(shù)器寄存器值的差值回退讀指針,重新分派指令執(zhí)行;如果分支指令跳轉(zhuǎn)目標(biāo)程序計(jì)數(shù)器值小于循環(huán)代碼頭指令程序計(jì)數(shù)器寄存器值,則清空指令隊(duì)列和流水線中的指令,將循環(huán)檢測標(biāo)志寄存器賦值為O,根據(jù)程序計(jì)數(shù)器中當(dāng)前的分支指令跳轉(zhuǎn)目標(biāo)程序計(jì)數(shù)器值繼續(xù)從指令緩存中取指,跳轉(zhuǎn)步驟O繼續(xù)執(zhí)行,流水線重新回到正常執(zhí)行狀態(tài);如果分支指令跳轉(zhuǎn)目標(biāo)程序計(jì)數(shù)器值等于循環(huán)代碼頭指令程序計(jì)數(shù)器寄存器值則判定完成了循環(huán)代碼的填充,清空已發(fā)射流水線中的指令,將指令隊(duì)列的讀指針賦值為循環(huán)頭指針、將循環(huán)檢測標(biāo)志寄存器賦值為O、將循環(huán)執(zhí)行標(biāo)識(shí)寄存器賦值為1,進(jìn)入后續(xù)的將指令緩存旁路的操作。
所述步驟3)的詳細(xì)執(zhí)行步驟如下
3.I)將指令緩存芳路,從指令隊(duì)列中取指并發(fā)射到功能部件執(zhí)行,同時(shí)將讀指針逐步遞增,當(dāng)執(zhí)行指令為分支指令且執(zhí)行結(jié)果為跳轉(zhuǎn)時(shí)判斷跳轉(zhuǎn)指令的跳轉(zhuǎn)方向,如果為向前跳轉(zhuǎn)則跳轉(zhuǎn)執(zhí)行步驟3. 3),否則跳轉(zhuǎn)執(zhí)行步驟3. 2);如果直到指令隊(duì)列讀寫指針相等,也沒有發(fā)生指令流的跳轉(zhuǎn)則跳轉(zhuǎn)執(zhí)行步驟3. 3);
3.2)將分支指令跳轉(zhuǎn)目標(biāo)程序計(jì)數(shù)器值和循環(huán)代碼頭指令程序計(jì)數(shù)器寄存器值進(jìn)行比較,如果分支指令跳轉(zhuǎn)目標(biāo)程序計(jì)數(shù)器值等于循環(huán)代碼頭指令程序計(jì)數(shù)器寄存器值則清空流水線中的指令、將指令隊(duì)列的讀指針賦值為循環(huán)頭指針,則繼續(xù)下一個(gè)循環(huán)的執(zhí)行;如果分支指令跳轉(zhuǎn)目標(biāo)程序計(jì)數(shù)器值大于循環(huán)代碼頭指令程序計(jì)數(shù)器寄存器值清空流水線中的指令,根據(jù)分支指令跳轉(zhuǎn)目標(biāo)程序計(jì)數(shù)器值和循環(huán)代碼頭指令程序計(jì)數(shù)器寄存器的差值回退讀指針,重新分派指令執(zhí)行;如果分支指令跳轉(zhuǎn)目標(biāo)程序計(jì)數(shù)器值小于循環(huán)代碼頭指令程序計(jì)數(shù)器寄存器值則跳轉(zhuǎn)執(zhí)行步驟3. 3);
3.3)退出指令緩存旁路,清空指令隊(duì)列和流水線中的指令,將循環(huán)檢測標(biāo)志寄存器賦值為0,將循環(huán)執(zhí)行標(biāo)識(shí)寄存器賦值為0,根據(jù)程序計(jì)數(shù)器中當(dāng)前的分支指令程序計(jì)數(shù)器值繼續(xù)從指令緩存中取指,跳轉(zhuǎn)步驟I)繼續(xù)執(zhí)行,流水線重新回到正常執(zhí)行狀態(tài)。所述步驟2. 2)和步驟3. I)當(dāng)執(zhí)行指令為分支指令且執(zhí)行結(jié)果為跳轉(zhuǎn)時(shí)還包括檢測跳轉(zhuǎn)是否由于發(fā)生中斷或者自陷導(dǎo)致的跳轉(zhuǎn),如果檢測到跳轉(zhuǎn)是由于發(fā)生中斷或者自陷導(dǎo)致的,則清空指令隊(duì)列和流水線中的指令,將循環(huán)檢測標(biāo)志寄存器賦值為0,將循環(huán)執(zhí)行標(biāo)識(shí)寄存器賦值為0,根據(jù)程序計(jì)數(shù)器中當(dāng)前的分支指令跳轉(zhuǎn)目標(biāo)程序計(jì)數(shù)器值繼續(xù)從指令緩存中取指,跳轉(zhuǎn)步驟I)繼續(xù)執(zhí)行,流水線重新回到正常執(zhí)行狀態(tài)。所述將指令緩存旁路具體是指不訪問指令緩存并控制指令緩存進(jìn)入休眠狀態(tài)。本發(fā)明具有下述優(yōu)點(diǎn)
I、本發(fā)明通過檢測判斷程序循環(huán)代碼、從指令緩存中取出程序循環(huán)代碼對(duì)應(yīng)的指令并填充在指令隊(duì)列中、將指令緩存旁路并直接從指令隊(duì)列中取出指令發(fā)射到功能部件執(zhí)行,在程序循環(huán)代碼的所有指令執(zhí)行完畢后恢復(fù)指令緩存的工作狀態(tài),因此使得程序循環(huán)代碼直接從指令隊(duì)列中讀取而暫時(shí)不需要訪問指令緩存,在指令隊(duì)列中實(shí)現(xiàn)循環(huán)代碼的檢測和存儲(chǔ)功能,減少了額外的存儲(chǔ)開銷,動(dòng)態(tài)檢測能夠?qū)崿F(xiàn)二進(jìn)制代碼的兼容性,從而能夠?qū)崿F(xiàn)指令重用、減少指令緩存的重復(fù)訪問、降低指令緩存失效率,能夠提高程序循環(huán)代碼的處理速度和效率,具有執(zhí)行效率高、處理性能好、執(zhí)行功耗低的優(yōu)點(diǎn)。2、硬件開銷小。本發(fā)明能夠復(fù)用在處理器中普遍存在的指令隊(duì)列來存儲(chǔ)程序循環(huán)代碼,不需要獨(dú)立的循環(huán)代碼存儲(chǔ)器,僅在指令隊(duì)列中增加循環(huán)頭指針,在分支處理部件增加循環(huán)檢測標(biāo)志寄存器(I位)、循環(huán)執(zhí)行標(biāo)識(shí)寄存器(I位)和循環(huán)代碼頭指令程序計(jì)數(shù)器寄存器(寬度視處理器地址位寬而定),同時(shí)增加少量針對(duì)這些寄存器的控制邏輯即可,硬件開銷非常小。3、兼容性好。本發(fā)明不依賴于處理器編譯器的輔助提示,使用硬件邏輯實(shí)現(xiàn)動(dòng)態(tài)檢測,對(duì)軟件完全透明,已有代碼可以不進(jìn)行任何修改就能在實(shí)現(xiàn)此技術(shù)的處理器上運(yùn)行,提高性能、降低功耗,能夠最大程度的保證二進(jìn)制代碼的兼容性。4、支持嵌套循環(huán)。本發(fā)明通過識(shí)別程序循環(huán)代碼,能夠自動(dòng)識(shí)別代碼中的嵌套循 環(huán),并且內(nèi)層循環(huán)和外層循環(huán)都無需訪問指令緩存,支持內(nèi)層循環(huán)和外層循環(huán)同時(shí)駐留在指令隊(duì)列中,只要指令隊(duì)列的大小能夠容納得下整個(gè)循環(huán)體,嵌套層數(shù)不受限制。5、可擴(kuò)展性好。本發(fā)明能夠檢測的循環(huán)代碼大小隨處理器中已有的指令隊(duì)列大小的增加而增加,除了循環(huán)頭指針L的寬度和L相應(yīng)控制邏輯略有增加外,其他需要增加的邏輯和存儲(chǔ)資源不發(fā)生任何變化,開銷趨于恒定,可擴(kuò)展性好。
圖I為現(xiàn)有技術(shù)帶有指令隊(duì)列的流水線前后端結(jié)構(gòu)示意圖。圖2為本發(fā)明實(shí)施例的整體流程示意圖。圖3為本發(fā)明實(shí)施例的初始化流程示意圖。圖4為本發(fā)明實(shí)施例的循環(huán)代碼填充指令隊(duì)列時(shí)的流程示意圖。圖5為本發(fā)明實(shí)施例的旁路指令緩存執(zhí)行程序循環(huán)代碼的流程示意圖。
具體實(shí)施例方式如圖2所示,本實(shí)施例基于指令隊(duì)列的程序循環(huán)代碼動(dòng)態(tài)檢測及執(zhí)行方法的實(shí)施步驟如下
1)從指令緩存中取指并保存到指令隊(duì)列中,將指令隊(duì)列中保存的指令發(fā)射到功能部件執(zhí)行,當(dāng)執(zhí)行指令為分支指令且執(zhí)行結(jié)果為跳轉(zhuǎn)時(shí)獲取跳轉(zhuǎn)方向以及跳轉(zhuǎn)目標(biāo)距離,如果跳轉(zhuǎn)方向?yàn)橄蚝筇D(zhuǎn)且跳轉(zhuǎn)目標(biāo)距離在指令隊(duì)列的長度以內(nèi),則預(yù)測當(dāng)前執(zhí)行的分支指令與跳轉(zhuǎn)目標(biāo)地址之間的代碼為程序循環(huán)代碼,并進(jìn)入下一步;
2)從指令緩存中取出程序循環(huán)代碼對(duì)應(yīng)的指令并填充在指令隊(duì)列中;
3)將指令緩存旁路,直接從指令隊(duì)列中取出指令并發(fā)射到功能部件執(zhí)行,在程序循環(huán)代碼的所有指令執(zhí)行完畢后恢復(fù)指令緩存的工作狀態(tài)。本實(shí)施例通過檢測判斷程序循環(huán)代碼、從指令緩存中取出程序循環(huán)代碼對(duì)應(yīng)的指令并填充在指令隊(duì)列中、將指令緩存旁路并直接從指令隊(duì)列中取出指令發(fā)射到功能部件執(zhí)行,在程序循環(huán)代碼的所有指令執(zhí)行完畢后恢復(fù)指令緩存的工作狀態(tài),因此使得程序循環(huán)代碼直接從指令隊(duì)列中讀取而暫時(shí)不需要訪問指令緩存,在指令隊(duì)列中實(shí)現(xiàn)循環(huán)代碼的檢測和存儲(chǔ)功能,減少了額外的存儲(chǔ)開銷,動(dòng)態(tài)檢測能夠?qū)崿F(xiàn)二進(jìn)制代碼的兼容性,從而能夠?qū)崿F(xiàn)指令重用、減少指令緩存的重復(fù)訪問、降低指令緩存失效率,能夠提高程序循環(huán)代碼的處理速度和效率,具有執(zhí)行效率高、處理性能好、執(zhí)行功耗低的優(yōu)點(diǎn)。本實(shí)施例的結(jié)構(gòu)上預(yù)先在指令隊(duì)列中增加循環(huán)頭指針,預(yù)先在分支處理部件增加循環(huán)檢測標(biāo)志寄存器、循環(huán)執(zhí)行標(biāo)識(shí)寄存器和循環(huán)代碼頭指令程序計(jì)數(shù)器寄存器即可,運(yùn)行時(shí)程序循環(huán)代碼通過復(fù)用指令隊(duì)列保存在指令隊(duì)列中,不用額外設(shè)計(jì)單獨(dú)的存儲(chǔ)結(jié)構(gòu),循環(huán)的檢測在分支處理部件中完成,硬件開銷小。如圖3和圖4所示,本實(shí)施例步驟2)的詳細(xì)步驟如下
2.I)預(yù)先在指令隊(duì)列中增加循環(huán)頭指針,預(yù)先在分支處理部件增加循環(huán)檢測標(biāo)志寄存器、循環(huán)執(zhí)行標(biāo)識(shí)寄存器和循環(huán)代碼頭指令程序計(jì)數(shù)器寄存器,在預(yù)測當(dāng)前執(zhí)行的分支指令與跳轉(zhuǎn)目標(biāo)地址之間的代碼為程序循環(huán)代碼后將循環(huán)頭指針指向?yàn)橹噶铌?duì)列當(dāng)前寫指針的位置、將循環(huán)檢測標(biāo)志寄存器賦值為I、將循環(huán)執(zhí)行標(biāo)識(shí)寄存器賦值為O、將循環(huán)代碼頭指令程序計(jì)數(shù)器寄存器賦值為當(dāng)前分支指令的跳轉(zhuǎn)目標(biāo)程序計(jì)數(shù)器值;
2.2)從指令緩存中取出程序循環(huán)代碼對(duì)應(yīng)的指令并存儲(chǔ)在指令隊(duì)列中寫指針?biāo)赶虻奈恢貌㈨樞蜻f增寫指針的值,當(dāng)寫指針的下一個(gè)位置為循環(huán)頭指針時(shí)暫停取指;同時(shí)在讀指針指向的指令如果滿足分派條件則分派到功能部件執(zhí)行,保持循環(huán)頭指針不變并順序遞增讀指針直至讀指針的下一個(gè)位置為循環(huán)頭指針,此時(shí)將循環(huán)檢測標(biāo)志寄存器賦值為0,繼續(xù)遞增寫指針,跳轉(zhuǎn)步驟I)繼續(xù)取指執(zhí)行;當(dāng)執(zhí)行指令為分支指令且執(zhí)行結(jié)果為跳轉(zhuǎn)時(shí)判斷跳轉(zhuǎn)指令的跳轉(zhuǎn)方向,如果為向前跳轉(zhuǎn)則清空指令隊(duì)列和流水線中的指令,將循環(huán)檢測標(biāo)志寄存器賦值為0,根據(jù)程序計(jì)數(shù)器中當(dāng)前的分支指令跳轉(zhuǎn)目標(biāo)程序計(jì)數(shù)器值繼續(xù)從指令緩存中取指,跳轉(zhuǎn)步驟I)繼續(xù)執(zhí)行,流水線重新回到正常執(zhí)行狀態(tài),否則跳轉(zhuǎn)執(zhí)行下一
I K
少;
2.3)將分支指令跳轉(zhuǎn)目標(biāo)程序計(jì)數(shù)器值和循環(huán)代碼頭指令程序計(jì)數(shù)器寄存器值進(jìn)行比較,如果分支指令跳轉(zhuǎn)目標(biāo)程序計(jì)數(shù)器值大于循環(huán)代碼頭指令程序計(jì)數(shù)器寄存器值,則判定存在嵌套循環(huán)且內(nèi)層循環(huán)代碼已在指令隊(duì)列中,清空已發(fā)射流水線中的指令,然后根據(jù)分支指令跳轉(zhuǎn)目標(biāo)程序計(jì)數(shù)器值和循環(huán)代碼頭指令程序計(jì)數(shù)器寄存器值的差值回退讀指針,重新分派指令執(zhí)行;如果分支指令跳轉(zhuǎn)目標(biāo)程序計(jì)數(shù)器值小于循環(huán)代碼頭指令程序計(jì)數(shù)器寄存器值,則清空指令隊(duì)列和流水線中的指令,將循環(huán)檢測標(biāo)志寄存器賦值為0,根據(jù)程序計(jì)數(shù)器中當(dāng)前的分支指令跳轉(zhuǎn)目標(biāo)程序計(jì)數(shù)器值繼續(xù)從指令緩存中取指,跳轉(zhuǎn)步驟O繼續(xù)執(zhí)行,流水線重新回到正常執(zhí)行狀態(tài);如果分支指令跳轉(zhuǎn)目標(biāo)程序計(jì)數(shù)器值等于循環(huán)代碼頭指令程序計(jì)數(shù)器寄存器值則判定完成了循環(huán)代碼的填充,清空已發(fā)射流水線中的指令,將指令隊(duì)列的讀指針賦值為循環(huán)頭指針、將循環(huán)檢測標(biāo)志寄存器賦值為O、將循環(huán)執(zhí)行標(biāo)識(shí)寄存器賦值為1,進(jìn)入后續(xù)的將指令緩存旁路的操作。本實(shí)施例中,上述步驟I)為初始化階段,步驟2)為循環(huán)代碼填充階段,步驟3)為指令緩存旁路階段。其中步驟2. I)為循環(huán)代碼填充階段的準(zhǔn)備步驟,因此也可歸類到初始化階段。本實(shí)施例中,2. 2)當(dāng)執(zhí)行指令為分支指令且執(zhí)行結(jié)果為跳轉(zhuǎn)時(shí)還包括檢測跳轉(zhuǎn)是否由于發(fā)生中斷或者自陷導(dǎo)致的跳轉(zhuǎn),如果檢測到跳轉(zhuǎn)是由于發(fā)生中斷或者自陷導(dǎo)致的,則清空指令隊(duì)列和流水線中的指令,將循環(huán)檢測標(biāo)志寄存器賦值為0,將循環(huán)執(zhí)行標(biāo)識(shí)寄存器賦值為0,根據(jù)程序計(jì)數(shù)器中當(dāng)前的分支指令跳轉(zhuǎn)目標(biāo)程序計(jì)數(shù)器值繼續(xù)從指令緩存中取指,跳轉(zhuǎn)步驟I)繼續(xù)執(zhí)行,流水線重新回到正常執(zhí)行狀態(tài)。
為了描述方便,本實(shí)施例下文的循環(huán)頭指針使用L指代,循環(huán)檢測標(biāo)志寄存器使用 LDF(Loop Detected Flag)指代,循環(huán)執(zhí)行標(biāo)識(shí)寄存器使用 LEF(Loop Executing Flag)指代,循環(huán)代碼頭指令程序計(jì)數(shù)器寄存器使用LHPC指代、分支指令程序計(jì)數(shù)器值使用BRPC指代、分支指令跳轉(zhuǎn)目標(biāo)程序計(jì)數(shù)器使用BTPC指代。本實(shí)施例的指令隊(duì)列除了用通常的讀指針(H)標(biāo)識(shí)隊(duì)列中的頭指令、寫指針(T)標(biāo)識(shí)隊(duì)列中的尾指令外,增加一個(gè)循環(huán)頭指針(L)來標(biāo)識(shí)指令隊(duì)列中循環(huán)代碼的起始位置;在分支處理部件增加循環(huán)檢測標(biāo)志寄存器(LDF)、循環(huán)執(zhí)行標(biāo)識(shí)寄存器(LEF)和循環(huán)代碼頭指令程序計(jì)數(shù)器寄存器(LHPC)即可,運(yùn)行時(shí)程序循環(huán)代碼通過復(fù)用指令隊(duì)列保存在指令隊(duì)列中,不用額外設(shè)計(jì)單獨(dú)的存儲(chǔ)結(jié)構(gòu),循環(huán)的檢測在分支處理部件中完成,硬件開銷小。循環(huán)檢測標(biāo)志寄存器(LDF)的值僅僅在循環(huán)代碼填充階段為有效。LDF用于標(biāo)識(shí)檢測到程序循環(huán)代碼并正在進(jìn)行循環(huán)代碼的填充,LDF默認(rèn)為0,一旦檢測到程序循環(huán)代碼則將LDF置為1,然后開始進(jìn)行程序循環(huán)代碼的填充,并在程序循環(huán)代碼填充指令隊(duì)列完畢后恢復(fù)默認(rèn)值O。循環(huán)執(zhí)行標(biāo)識(shí)寄存器(LEF)的值僅在完成循環(huán)代碼填充后、開始指令緩存旁路時(shí)為有效,LEF用于標(biāo)識(shí)目前的指令緩存被旁路,循環(huán)指令直接從指令隊(duì)列中獲得,LEF默認(rèn)值為0,一旦在步驟2)中循環(huán)代碼填充完畢則將LEF置為1,然后開始從指令隊(duì)列中取指執(zhí)行,并在程序循環(huán)代碼執(zhí)行完畢后恢復(fù)默認(rèn)值O。循環(huán)代碼頭指令程序計(jì)數(shù)器寄存器(LHPC)用于保存程序循環(huán)代碼第一條指令對(duì)應(yīng)的程序計(jì)數(shù)器值。如圖3所示,初始化階段,初始情況下指令流水線為正常執(zhí)行狀態(tài),指令隊(duì)列接收從指令緩存中取出的指令,保存到寫指針T對(duì)應(yīng)的指令隊(duì)列中的位置;條件滿足時(shí)(功能部件可用及操作數(shù)就緒),指令隊(duì)列將讀指針H對(duì)應(yīng)的指令分派到功能部件執(zhí)行。當(dāng)執(zhí)行指令為分支指令且執(zhí)行結(jié)果為跳轉(zhuǎn)時(shí),清空后續(xù)流水線及指令隊(duì)列中的指令(寫指針T賦值等于讀指針H,簡寫為T〈=H),根據(jù)程序計(jì)數(shù)器中分支指令跳轉(zhuǎn)目標(biāo)程序計(jì)數(shù)器值 (BTPC)重新開始取指,并根據(jù)分支指令程序計(jì)數(shù)器值(BRPC)和分支指令跳轉(zhuǎn)目標(biāo)程序計(jì)數(shù)器值(BTPC)的比較結(jié)果判斷其跳轉(zhuǎn)方向。如果是向后跳轉(zhuǎn),且跳轉(zhuǎn)目標(biāo)的距離在N以內(nèi)(N為指令隊(duì)列的長度),則預(yù)測這條分支指令是程序循環(huán)代碼的一個(gè)循環(huán)跳轉(zhuǎn)指令,且指令隊(duì)列的容量可以保存這一段循環(huán)代碼,則將指令隊(duì)列循環(huán)頭指針L賦值為指令隊(duì)列寫指針T (L〈=T),同時(shí)在循環(huán)代碼頭指令程序計(jì)數(shù)器寄存器LHPC中記錄分支目標(biāo)地址(LHPC<=BTPC),置LDF標(biāo)識(shí)(LDF〈=1 ),進(jìn)入程序循環(huán)代碼填充的階段;否則,L、LHPC, LDF均保持不變,按正常分支跳轉(zhuǎn)的流程處理。如圖4所示,本實(shí)施例在循環(huán)代碼填充階段將從指令緩存取出的指令存入寫指針T所指的指令隊(duì)列位置,并順序遞增寫指針T,當(dāng)T+1=L時(shí),暫停取指。指令隊(duì)列中讀指針H所指的指令如果滿足分派條件則分派到功能部件執(zhí)行,并順序遞增H。在此過程中L保持不變。如果直到讀指針H滿足H+1=L (此時(shí)H=T),仍沒有再次遇到指令流的跳轉(zhuǎn),則清除LDF(LDF〈=0),繼續(xù)從指令緩存取指,跳轉(zhuǎn)步驟I)繼續(xù)執(zhí)行(寫指針T繼續(xù)遞增),此時(shí)流水線重新回到了正常執(zhí)行狀態(tài)。當(dāng)執(zhí)行指令為分支指令且執(zhí)行結(jié)果為跳轉(zhuǎn)時(shí),則根據(jù)跳轉(zhuǎn)方向以及分支指令跳轉(zhuǎn)目標(biāo)程序計(jì)數(shù)器值(BTPC)和循環(huán)代碼頭指令程序計(jì)數(shù)器寄存器值(LHPC)的比較結(jié)果會(huì)有如下執(zhí)行結(jié)果
AI、若為向前跳轉(zhuǎn)(例如if_eI se分支、函數(shù)調(diào)用等),則清除LDF(LDF〈=0 ),此時(shí)流水線重新回到正常執(zhí)行狀態(tài),清空指令隊(duì)列(T〈=H)和流水線中的指令,從BTPC處取指,跳轉(zhuǎn)步驟I)繼續(xù)執(zhí)行;
A2、若為向后跳轉(zhuǎn),且BTPC=LHPC,則標(biāo)志著完成了循環(huán)代碼的填充,僅清空已發(fā)射到流水線中的指令,置LDF〈=0,LEF<=1, H〈=L,進(jìn)入指令緩存旁路執(zhí)行階段,暫停前端取指操作,直接從指令隊(duì)列中分派指令執(zhí)行;
A3、若為向后跳轉(zhuǎn),且BTPOLHPC,則認(rèn)為存在嵌套循環(huán),且內(nèi)層循環(huán)代碼已在指令隊(duì)列中,此時(shí)跳轉(zhuǎn)指令不觸發(fā)指令隊(duì)列的清空,僅清空已發(fā)射到流水線中的指令,然后根據(jù)BTPC與LHPC的差值將讀指針H回退相應(yīng)的值,重新分派指令執(zhí)行;
A4、若為向后跳轉(zhuǎn),且BTPC〈LHPC,則認(rèn)為此次填充的不是循環(huán)代碼,清除LDF(LDF<=0 ),此時(shí)流水線重新回到正常執(zhí)行狀態(tài),清空指令隊(duì)列(T〈=H)和流水線中的指令,從BTPC處取指,跳轉(zhuǎn)步驟I)繼續(xù)執(zhí)行;
A5、如果填充階段發(fā)生因中斷或自陷導(dǎo)致的跳轉(zhuǎn),則清除LDF (LDF〈=0),流水線重新回 到正常執(zhí)行狀態(tài),清空指令隊(duì)列(T〈=H)和流水線中的指令,從中斷處理入口處取指,跳轉(zhuǎn)步驟I)繼續(xù)執(zhí)行。如圖5所示,本實(shí)施例步驟3)的詳細(xì)執(zhí)行步驟如下
3.I)將指令緩存芳路,從指令隊(duì)列中取指并發(fā)射到功能部件執(zhí)行,同時(shí)將讀指針逐步遞增,當(dāng)執(zhí)行指令為分支指令且執(zhí)行結(jié)果為跳轉(zhuǎn)時(shí)判斷跳轉(zhuǎn)指令的跳轉(zhuǎn)方向,如果為向前跳轉(zhuǎn)則跳轉(zhuǎn)執(zhí)行步驟3. 3),否則跳轉(zhuǎn)執(zhí)行步驟3. 2);如果直到指令隊(duì)列讀寫指針相等,也沒有發(fā)生指令流的跳轉(zhuǎn)則跳轉(zhuǎn)執(zhí)行步驟3. 3);本實(shí)施例中,將指令緩存旁路具體是指不訪問指令緩存并控制指令緩存進(jìn)入休眠狀態(tài),因此能夠降低指令緩存的功耗,能夠減少微處理器執(zhí)行程序循環(huán)代碼的能耗。3. 2)將分支指令跳轉(zhuǎn)目標(biāo)程序計(jì)數(shù)器值(BTPC)和循環(huán)代碼頭指令程序計(jì)數(shù)器寄存器值(LHPC)進(jìn)行比較,如果分支指令跳轉(zhuǎn)目標(biāo)程序計(jì)數(shù)器值等于循環(huán)代碼頭指令程序計(jì)數(shù)器寄存器值(BTPC=LhPC)則清空流水線中的指令、將指令隊(duì)列的讀指針賦值為循環(huán)頭指針,則繼續(xù)下一個(gè)循環(huán)的執(zhí)行;如果分支指令跳轉(zhuǎn)目標(biāo)程序計(jì)數(shù)器值大于循環(huán)代碼頭指令程序計(jì)數(shù)器寄存器值(BTPOLHPC)清空流水線中的指令,根據(jù)分支指令跳轉(zhuǎn)目標(biāo)程序計(jì)數(shù)器值和循環(huán)代碼頭指令程序計(jì)數(shù)器寄存器的差值回退讀指針,重新分派指令執(zhí)行;如果分支指令跳轉(zhuǎn)目標(biāo)程序計(jì)數(shù)器值小于循環(huán)代碼頭指令程序計(jì)數(shù)器寄存器值(BTPCXLHPC)則跳轉(zhuǎn)執(zhí)行步驟3. 3);
3.3)退出指令緩存旁路,清空指令隊(duì)列和流水線中的指令,將循環(huán)檢測標(biāo)志寄存器賦值為0,將循環(huán)執(zhí)行標(biāo)識(shí)寄存器賦值為0,根據(jù)程序計(jì)數(shù)器中當(dāng)前的分支指令程序計(jì)數(shù)器值繼續(xù)從指令緩存中取指,跳轉(zhuǎn)步驟I)繼續(xù)執(zhí)行,流水線重新回到正常執(zhí)行狀態(tài)。本實(shí)施例中,3. I)當(dāng)執(zhí)行指令為分支指令且執(zhí)行結(jié)果為跳轉(zhuǎn)時(shí)還包括檢測跳轉(zhuǎn)是否由于發(fā)生中斷或者自陷導(dǎo)致的跳轉(zhuǎn),如果檢測到跳轉(zhuǎn)是由于發(fā)生中斷或者自陷導(dǎo)致的,則清空指令隊(duì)列和流水線中的指令,將循環(huán)檢測標(biāo)志寄存器賦值為0,將循環(huán)執(zhí)行標(biāo)識(shí)寄存器賦值為0,根據(jù)程序計(jì)數(shù)器中當(dāng)前的分支指令跳轉(zhuǎn)目標(biāo)程序計(jì)數(shù)器值繼續(xù)從指令緩存中取指,跳轉(zhuǎn)步驟I)繼續(xù)執(zhí)行,流水線重新回到正常執(zhí)行狀態(tài)。本實(shí)施例在指令緩存旁路階段,LEF標(biāo)志寄存器的值為1,指令隊(duì)列頭指針H初始設(shè)置為L,指令緩存的取指操作暫停,所有的指令都從指令隊(duì)列中獲得,H逐步遞增。此時(shí),指令緩存進(jìn)入休眠狀態(tài)(如關(guān)斷電壓、或者關(guān)斷時(shí)鐘、或者其它高級(jí)休眠功能亦可),以降低其功耗。如果在執(zhí)行過程中遇到了分支指令,發(fā)生了跳轉(zhuǎn),則根據(jù)跳轉(zhuǎn)方向以及BTPC和LHPC的比較結(jié)果會(huì)有如下執(zhí)行結(jié)果
BI、如果是向后跳轉(zhuǎn),且BTPC=LHPC,則清空流水線中的指令,置H〈=L,(<=運(yùn)算符為將右側(cè)變量的值賦值給左側(cè)的變量,下同)從循環(huán)代碼的起始位置開始下一個(gè)循環(huán)的執(zhí)行;
B2、如果是向后跳轉(zhuǎn),且BTPOLHPC,則清空流水線中的指令,根據(jù)BTPC與LHPC的差值將隊(duì)列指針H回退相應(yīng)的值,重新分派指令執(zhí)行;
B3、如果是向后跳轉(zhuǎn),且BTPC〈LHPC,則退出指令緩存旁路階段,置LEF〈=0,清空指令隊(duì)列和流水線,恢復(fù)流水線的正常執(zhí)行狀態(tài),從BTPC處取指,跳轉(zhuǎn)步驟I)繼續(xù)執(zhí)行;
B4、如果是向前跳轉(zhuǎn),則退出指令緩存旁路階段,置LEF〈=0,清空指令隊(duì)列和流水線,恢復(fù)流水線的正常執(zhí)行狀態(tài),從BTPC處取指,跳轉(zhuǎn)步驟I)繼續(xù)執(zhí)行;
B5、如果由于中斷或自陷導(dǎo)致了指令流的跳轉(zhuǎn),則退出指令緩存旁路階段,置LEF〈=0,清空指令隊(duì)列和流水線,恢復(fù)流水線的正常執(zhí)行狀態(tài),從中斷處理入口處取指,跳轉(zhuǎn)步驟I)繼續(xù)執(zhí)行。如果直到H=T,仍沒有發(fā)生指令流的跳轉(zhuǎn),表明循環(huán)代碼已經(jīng)執(zhí)行完畢,則退出指令緩存旁路階段,置LEF〈=0,清空指令隊(duì)列和流水線,恢復(fù)流水線的正常執(zhí)行狀態(tài),繼續(xù)取指,跳轉(zhuǎn)步驟I)繼續(xù)執(zhí)行。以上所述僅是本發(fā)明的優(yōu)選實(shí)施方式,本發(fā)明的保護(hù)范圍并不僅局限于上述實(shí)施例,凡屬于本發(fā)明思路下的技術(shù)方案均屬于本發(fā)明的保護(hù)范圍。應(yīng)當(dāng)指出,對(duì)于本技術(shù)領(lǐng)域 的普通技術(shù)人員來說,在不脫離本發(fā)明原理前提下的若干改進(jìn)和潤飾,這些改進(jìn)和潤飾也應(yīng)視為本發(fā)明的保護(hù)范圍。
權(quán)利要求
1.一種基于指令隊(duì)列的程序循環(huán)代碼動(dòng)態(tài)檢測及執(zhí)行方法,其特征在于實(shí)施步驟如下 1)從指令緩存中取指并保存到指令隊(duì)列中,將指令隊(duì)列中保存的指令發(fā)射到功能部件執(zhí)行,當(dāng)執(zhí)行指令為分支指令且執(zhí)行結(jié)果為跳轉(zhuǎn)時(shí)獲取跳轉(zhuǎn)方向以及跳轉(zhuǎn)目標(biāo)距離,如果跳轉(zhuǎn)方向?yàn)橄蚝筇D(zhuǎn)且跳轉(zhuǎn)目標(biāo)距離在指令隊(duì)列的長度以內(nèi),則預(yù)測當(dāng)前執(zhí)行的分支指令與跳轉(zhuǎn)目標(biāo)地址之間的代碼為程序循環(huán)代碼,并進(jìn)入下一步; 2)從指令緩存中取出程序循環(huán)代碼對(duì)應(yīng)的指令并填充在指令隊(duì)列中; 3)將指令緩存旁路,直接從指令隊(duì)列中取出指令并發(fā)射到功能部件執(zhí)行,在程序循環(huán)代碼的所有指令執(zhí)行完畢后恢復(fù)指令緩存的工作狀態(tài)。
2.根據(jù)權(quán)利要求I所述的基于指令隊(duì)列的程序循環(huán)代碼動(dòng)態(tài)檢測及執(zhí)行方法,其特征在于,所述步驟2)的詳細(xì)步驟如下 2.I)預(yù)先在指令隊(duì)列中增加循環(huán)頭指針,預(yù)先在分支處理部件增加循環(huán)檢測標(biāo)志寄存器、循環(huán)執(zhí)行標(biāo)識(shí)寄存器和循環(huán)代碼頭指令程序計(jì)數(shù)器寄存器,在預(yù)測當(dāng)前執(zhí)行的分支指令與跳轉(zhuǎn)目標(biāo)地址之間的代碼為程序循環(huán)代碼后將循環(huán)頭指針指向?yàn)橹噶铌?duì)列當(dāng)前寫指針的位置、將循環(huán)檢測標(biāo)志寄存器賦值為I、將循環(huán)執(zhí)行標(biāo)識(shí)寄存器賦值為O、將循環(huán)代碼頭指令程序計(jì)數(shù)器寄存器賦值為當(dāng)前分支指令的跳轉(zhuǎn)目標(biāo)程序計(jì)數(shù)器值; 2.2)從指令緩存中取出程序循環(huán)代碼對(duì)應(yīng)的指令并存儲(chǔ)在指令隊(duì)列中寫指針?biāo)赶虻奈恢貌㈨樞蜻f增寫指針的值,當(dāng)寫指針的下一個(gè)位置為循環(huán)頭指針時(shí)暫停取指;同時(shí)在讀指針指向的指令如果滿足分派條件則分派到功能部件執(zhí)行,保持循環(huán)頭指針不變并順序遞增讀指針直至讀指針的下一個(gè)位置為循環(huán)頭指針,此時(shí)循環(huán)檢測標(biāo)志寄存器賦值為O,繼續(xù)遞增寫指針,跳轉(zhuǎn)步驟I)繼續(xù)取指執(zhí)行;當(dāng)執(zhí)行指令為分支指令且執(zhí)行結(jié)果為跳轉(zhuǎn)時(shí)判斷跳轉(zhuǎn)指令的跳轉(zhuǎn)方向,如果為向前跳轉(zhuǎn)則清空指令隊(duì)列和流水線中的指令,將循環(huán)檢測標(biāo)志寄存器賦值為O,根據(jù)程序計(jì)數(shù)器中當(dāng)前的分支指令跳轉(zhuǎn)目標(biāo)程序計(jì)數(shù)器值繼續(xù)從指令緩存中取指,跳轉(zhuǎn)步驟I)繼續(xù)執(zhí)行,流水線重新回到正常執(zhí)行狀態(tài),否則跳轉(zhuǎn)執(zhí)行下一I K少; 2.3)將分支指令跳轉(zhuǎn)目標(biāo)程序計(jì)數(shù)器值和循環(huán)代碼頭指令程序計(jì)數(shù)器寄存器值進(jìn)行比較,如果分支指令跳轉(zhuǎn)目標(biāo)程序計(jì)數(shù)器值大于循環(huán)代碼頭指令程序計(jì)數(shù)器寄存器值,則判定存在嵌套循環(huán)且內(nèi)層循環(huán)代碼已在指令隊(duì)列中,清空已發(fā)射流水線中的指令,然后根據(jù)分支指令跳轉(zhuǎn)目標(biāo)程序計(jì)數(shù)器值和循環(huán)代碼頭指令程序計(jì)數(shù)器寄存器值的差值回退讀指針,重新分派指令執(zhí)行;如果分支指令跳轉(zhuǎn)目標(biāo)程序計(jì)數(shù)器值小于循環(huán)代碼頭指令程序計(jì)數(shù)器寄存器值,則清空指令隊(duì)列和流水線中的指令,將循環(huán)檢測標(biāo)志寄存器賦值為O,根據(jù)程序計(jì)數(shù)器中當(dāng)前的分支指令跳轉(zhuǎn)目標(biāo)程序計(jì)數(shù)器值繼續(xù)從指令緩存中取指,跳轉(zhuǎn)步驟O繼續(xù)執(zhí)行,流水線重新回到正常執(zhí)行狀態(tài);如果分支指令跳轉(zhuǎn)目標(biāo)程序計(jì)數(shù)器值等于循環(huán)代碼頭指令程序計(jì)數(shù)器寄存器值則判定完成了循環(huán)代碼的填充,清空已發(fā)射流水線中的指令,將指令隊(duì)列的讀指針賦值為循環(huán)頭指針、將循環(huán)檢測標(biāo)志寄存器賦值為O、將循環(huán)執(zhí)行標(biāo)識(shí)寄存器賦值為1,進(jìn)入后續(xù)的將指令緩存旁路操作。
3.根據(jù)權(quán)利要求2所述的基于指令隊(duì)列的程序循環(huán)代碼動(dòng)態(tài)檢測及執(zhí)行方法,其特征在于,所述步驟3)的詳細(xì)執(zhí)行步驟如下 3.I)將指令緩存芳路,從指令隊(duì)列中取指并發(fā)射到功能部件執(zhí)行,同時(shí)將讀指針逐步遞增,當(dāng)執(zhí)行指令為分支指令且執(zhí)行結(jié)果為跳轉(zhuǎn)時(shí)判斷跳轉(zhuǎn)指令的跳轉(zhuǎn)方向,如果為向前跳轉(zhuǎn)則跳轉(zhuǎn)執(zhí)行步驟3. 3),否則跳轉(zhuǎn)執(zhí)行步驟3. 2);如果直到指令隊(duì)列讀寫指針相等,也沒有發(fā)生指令流的跳轉(zhuǎn)則跳轉(zhuǎn)執(zhí)行步驟3. 3); /3.2)將分支指令跳轉(zhuǎn)目標(biāo)程序計(jì)數(shù)器值和循環(huán)代碼頭指令程序計(jì)數(shù)器寄存器值進(jìn)行比較,如果分支指令跳轉(zhuǎn)目標(biāo)程序計(jì)數(shù)器值等于循環(huán)代碼頭指令程序計(jì)數(shù)器寄存器值則清空流水線中的指令、將指令隊(duì)列的讀指針賦值為循環(huán)頭指針,則繼續(xù)下一個(gè)循環(huán)的執(zhí)行;如果分支指令跳轉(zhuǎn)目標(biāo)程序計(jì)數(shù)器值大于循環(huán)代碼頭指令程序計(jì)數(shù)器寄存器值清空流水線中的指令,則清空流水線中的指令,根據(jù)分支指令程序跳轉(zhuǎn)目標(biāo)計(jì)數(shù)器值和循環(huán)代碼頭指令程序計(jì)數(shù)器寄存器的差值回退讀指針,重新分派指令執(zhí)行;如果分支指令跳轉(zhuǎn)目標(biāo)程序計(jì)數(shù)器值小于循環(huán)代碼頭指令程序計(jì)數(shù)器寄存器值則跳轉(zhuǎn)執(zhí)行步驟3. 3); /3.3)退出指令緩存旁路,清空指令隊(duì)列和流水線中的指令,將循環(huán)檢測標(biāo)志寄存器賦值為O,將循環(huán)執(zhí)行標(biāo)識(shí)寄存器賦值為O,根據(jù)程序計(jì)數(shù)器中當(dāng)前的分支指令跳轉(zhuǎn)目標(biāo)程序計(jì)數(shù)器值繼續(xù)從指令緩存中取指,跳轉(zhuǎn)步驟I)繼續(xù)執(zhí)行,流水線重新回到正常執(zhí)行狀態(tài)。
4.根據(jù)權(quán)利要求3所述的基于指令隊(duì)列的程序循環(huán)代碼動(dòng)態(tài)檢測及執(zhí)行方法,其特征在于所述步驟2. 2)和步驟3. I)中當(dāng)執(zhí)行指令為分支指令且執(zhí)行結(jié)果為跳轉(zhuǎn)時(shí)還包括檢測跳轉(zhuǎn)是否由于發(fā)生中斷或者自陷導(dǎo)致的跳轉(zhuǎn),如果檢測到跳轉(zhuǎn)是由于發(fā)生中斷或者自陷導(dǎo)致的,則清空指令隊(duì)列和流水線中的指令,將循環(huán)檢測標(biāo)志寄存器賦值為O,將循環(huán)執(zhí)行標(biāo)識(shí)寄存器賦值為O,根據(jù)程序計(jì)數(shù)器中當(dāng)前的分支指令跳轉(zhuǎn)目標(biāo)程序計(jì)數(shù)器值繼續(xù)從指令緩存中取指,跳轉(zhuǎn)步驟I)繼續(xù)執(zhí)行,流水線重新回到正常執(zhí)行狀態(tài)。
5.根據(jù)權(quán)利要求I或2或3或4所述的基于指令隊(duì)列的程序循環(huán)代碼動(dòng)態(tài)檢測及執(zhí)行方法,其特征在于所述將指令緩存旁路具體是指不訪問指令緩存并控制指令緩存進(jìn)入休眠狀態(tài)。
全文摘要
本發(fā)明公開了一種基于指令隊(duì)列的程序循環(huán)代碼動(dòng)態(tài)檢測及執(zhí)行方法,其實(shí)施步驟如下1)從指令緩存中取指并保存到指令隊(duì)列中,將指令隊(duì)列中保存的指令發(fā)射到功能部件執(zhí)行,當(dāng)執(zhí)行指令為分支指令且執(zhí)行結(jié)果為跳轉(zhuǎn)時(shí)獲取跳轉(zhuǎn)方向以及跳轉(zhuǎn)目標(biāo)距離,如果跳轉(zhuǎn)方向?yàn)橄蚝筇D(zhuǎn)且跳轉(zhuǎn)目標(biāo)距離在指令隊(duì)列的長度以內(nèi)則進(jìn)入下一步;2)從指令緩存中取出程序循環(huán)代碼對(duì)應(yīng)的指令并填充在指令隊(duì)列中;3)將指令緩存旁路,從指令隊(duì)列中取出指令并執(zhí)行,在程序循環(huán)代碼的所有指令執(zhí)行完畢后恢復(fù)指令緩存的工作狀態(tài)。本發(fā)明具有執(zhí)行效率高、處理性能好、執(zhí)行功耗低、硬件開銷小、支持嵌套循環(huán)、兼容性強(qiáng)、可擴(kuò)展性好的優(yōu)點(diǎn)。
文檔編號(hào)G06F9/30GK102968293SQ201210493778
公開日2013年3月13日 申請(qǐng)日期2012年11月28日 優(yōu)先權(quán)日2012年11月28日
發(fā)明者張承義, 高軍, 孫彩霞, 艾飛虎, 郭維, 孫曜, 王永文, 竇強(qiáng), 倪曉強(qiáng), 隋兵才, 陳微, 趙天磊, 王蕾, 黃立波 申請(qǐng)人:中國人民解放軍國防科學(xué)技術(shù)大學(xué)