專利名稱:保存代碼重新排序中的精確異常的方法和設(shè)備的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及代碼重新排序,尤其涉及用于通過采用控制預(yù)測來保存代碼重新排序中的精確異常的方法和設(shè)備。
背景技術(shù):
代碼重新排序使一條指令或者指令序列,在獲知動態(tài)代碼流實際到達(dá)程序中指令序列所需的位置之前,即可被執(zhí)行。這樣,通過預(yù)見(lookahead),可以刪除程序流中的等待時間。由于指令可被提前執(zhí)行,代碼重新排序可以提高應(yīng)用程序的性能。不過,由于被重新排序的指令將生成其他情況下不會生成的異常,被重新排序的代碼序列將產(chǎn)生與標(biāo)準(zhǔn)代碼流所生成的不同的體系狀態(tài)。在諸如二進(jìn)制翻譯等必須保存精確異常的特定環(huán)境中,這可能是無法接受的。
已經(jīng)提出了可以解決保存精確異常的問題的方法,但是所有這些方法都將在硬件、處理速度和(或)存儲器方面招致一些額外的代價。這些方法中,其中一些需要有不可以為通用目的訪問的附加寄存器,并且需要附加的處理運算來恢復(fù)體系狀態(tài)。其他方法需要附加的硬件支持和存儲器來保存預(yù)測的寄存器值,并使用原始的代碼序列來恢復(fù)體系狀態(tài)。
圖1是顯示用于所揭示的系統(tǒng)的環(huán)境的一個計算機(jī)系統(tǒng)的示范實施例的框圖。
圖2是顯示用于所揭示的系統(tǒng)的環(huán)境的另一個計算機(jī)系統(tǒng)的示范實施例的框圖。
圖3是示例機(jī)器可讀指令的一個典型流程圖,該示例機(jī)器可讀指令可由一設(shè)備執(zhí)行,來實現(xiàn)一個在保存精確異常的同時,進(jìn)行代碼重新排序的方法的示范實施例。
圖4是示例機(jī)器可讀指令的一個典型流程圖,該示例機(jī)器可讀指令可由一設(shè)備執(zhí)行,來實現(xiàn)一個重新排序異常指令的方法的示范實施例。
圖5是圖4中所示的流程圖的繼續(xù)。
圖6是示例機(jī)器可讀指令的一個典型流程圖,該示例機(jī)器可讀指令可由一設(shè)備執(zhí)行,來實現(xiàn)一個向上跨越一條校驗指令重新排序指令的方法的示范實施例。
圖7是示例機(jī)器可讀指令的一個典型流程圖,該示例機(jī)器可讀指令可由一設(shè)備執(zhí)行,來實現(xiàn)一個向上跨越一條校驗指令重新排序指令的方法的示范實施例,其中,與該指令相關(guān)聯(lián)的目標(biāo)寄存器由異常指令決定。
圖8是示例機(jī)器可讀指令的一個典型流程圖,該示例機(jī)器可讀指令可由一設(shè)備執(zhí)行,來實現(xiàn)一個向上跨越一條校驗指令重新排序指令的方法的示范實施例,其中,與該指令相關(guān)聯(lián)的目標(biāo)寄存器和異常指令無關(guān)。
圖9是示例機(jī)器可讀指令的一個典型流程圖,該示例機(jī)器可讀指令可由一設(shè)備執(zhí)行,來實現(xiàn)一個向下跨越一條校驗指令重新排序指令的方法的示范實施例。
圖10是圖9中所示流程圖的繼續(xù)。
具體實施例方式
總體上,所揭示的系統(tǒng)采用一個控制預(yù)測模塊來重新排序應(yīng)用程序內(nèi)的指令并保存精確異常。通過將異常推遲和在更晚的時間檢測異常來重新定位異常指令并且保存它們的異常。利用控制預(yù)測模塊,其他指令(即,非異常指令)也可以在應(yīng)用程序內(nèi)被重新定位。指令被重新定位時,生成了一個恢復(fù)塊?;謴?fù)塊包括可以被執(zhí)行來將處理器的體系狀態(tài)恢復(fù)到和代碼重新排序未發(fā)生時一樣的狀態(tài)(例如,和正常程序流被有效執(zhí)行時一樣的狀態(tài))的指令。如果檢測到了一個被推遲的異常,就執(zhí)行恢復(fù)塊,恢復(fù)體系狀態(tài),同時處理異常。
圖1是顯示用于所揭示的系統(tǒng)的環(huán)境的一個計算機(jī)系統(tǒng)的示范實施例的框圖。計算機(jī)系統(tǒng)100可以是個人計算機(jī)(PC)或者任何其他計算設(shè)備。在所示的示范實施例中,計算機(jī)系統(tǒng)100包括由電源104供電的主處理單元102。主處理單元102可以包括處理器106,其通過系統(tǒng)互連108與主存儲器設(shè)備110、閃存設(shè)備112,以及一個或多個接口電路114電氣耦聯(lián)。在一個示范實施例中,系統(tǒng)互連108是地址/數(shù)據(jù)總線。當(dāng)然,本領(lǐng)域內(nèi)具有普通技術(shù)水準(zhǔn)的人很容易明白,除了總線,其他互連也可以用于將處理器106與其他設(shè)備110、112和114連接起來。在一個示范實施例中,可以用一個或多個專用線和(或)一個十字頭(crossbar)來將處理器106與其他設(shè)備110、112和114相連。
處理器106可以是任何公知類型的處理器,例如一個Intel Pentium微處理器系列、Intel Itanium微處理器系列、Intel Centrino微處理器系列,和(或)Intel XScale微處理器系列的處理器。此外,處理器106可以包括任何公知類型的高速緩存,例如靜態(tài)隨機(jī)存取存儲器(SRAM)。主存儲器設(shè)備110可以包括動態(tài)隨機(jī)存取存儲器(DRAM)和(或)任何其他形式的隨機(jī)存取存儲器。在一個示范實施例中,主存儲器設(shè)備110可以包括雙倍數(shù)據(jù)速率隨機(jī)存取存儲器(DDRAM)。主存儲器設(shè)備110也可以包括非易失存儲器。在一個示范實施例中,主存儲器設(shè)備110保存了一個由處理器106按照公知的方式執(zhí)行的一個軟件程序。閃存設(shè)備112可以是任何類型的閃存設(shè)備。閃存設(shè)備112可以保存用于引導(dǎo)計算機(jī)系統(tǒng)100的固件。
接口電路114可以用任何公知類型的接口標(biāo)準(zhǔn)(例如,以太網(wǎng)接口和(或)通用串行總線(USB)接口)來實現(xiàn)??梢詫⒁粋€或多個輸入設(shè)備116連接到接口電路114,以便向主處理單元102輸入數(shù)據(jù)和命令。在一個示范實施例中,輸入設(shè)備116可以是鍵盤、鼠標(biāo)、觸摸屏、跟蹤板、跟蹤球、isopoint,和(或)語音識別系統(tǒng)。
通過一個或多個接口電路114,也可將一個或多個顯示器、打印機(jī)、揚聲器和(或)其他輸出設(shè)備118連接到主處理單元102上。顯示器118可以是陰極射線管(CRT)、液晶顯示器(LCD),或者任何其他類型的顯示器。顯示器118可以生成主處理單元102運行期間生成的數(shù)據(jù)的可視表示。可視表示可以包括用于人工輸入的提示符、計算值、檢測數(shù)據(jù)等。
計算機(jī)系統(tǒng)100也可以包括一個或多個存儲設(shè)備120。在一個示范實施例中,計算機(jī)系統(tǒng)100可以包括一個或多個硬盤驅(qū)動器、光盤(CD)驅(qū)動器、數(shù)字多媒體光盤驅(qū)動器(DVD),和(或)其他的計算機(jī)介質(zhì)輸入/輸出(I/O)設(shè)備。
計算機(jī)系統(tǒng)100也可以通過和網(wǎng)絡(luò)124相連與其他設(shè)備122交換數(shù)據(jù)。網(wǎng)絡(luò)連接可以是任何類型的網(wǎng)絡(luò)連接,例如以太網(wǎng)聯(lián)接、數(shù)字用戶線(DSL)、電話線、同軸電纜等。網(wǎng)絡(luò)124可以是任何類型的網(wǎng)絡(luò),例如互聯(lián)網(wǎng)、電話網(wǎng)、電纜網(wǎng),和(或)無線網(wǎng)絡(luò)。網(wǎng)絡(luò)設(shè)備122可以是任何類型的網(wǎng)絡(luò)設(shè)備122。在一個示范實施例中,網(wǎng)絡(luò)設(shè)備122可以是客戶機(jī)、服務(wù)器、硬盤驅(qū)動器等。
圖2顯示了另一個示范實施例計算機(jī)系統(tǒng)200。在這個示范實施例中,計算機(jī)系統(tǒng)200包括處理器202、控制預(yù)測模塊206、主存儲器204、異常處理程序208和程序指令210。
此外,處理器202可以是任何公知類型的處理器,例如一個IntelPentium微處理器系列、Intel Itanium微處理器系列、Intel Centrino微處理器系列,和(或)Intel XScale微處理器系列的處理器。主存儲器設(shè)備204可以包括動態(tài)隨機(jī)存取存儲器(DRAM)和(或)任何其他形式的隨機(jī)存取存儲器。在一個示范實施例中,主存儲器設(shè)備204可以包括雙倍數(shù)據(jù)速率隨機(jī)存取存儲器(DDRAM)。主存儲器設(shè)備204也可以包括非易失存儲器。在一個示范實施例中,主存儲器設(shè)備204保存了一個可由處理器202按照公知的方式執(zhí)行的軟件程序。
典型情況下,處理器202從程序指令210中取一條或多條指令,并且按照指令210排列的順序執(zhí)行由每條取到的指令所定義的操作。指令210可以是處理器的指令集中的任何指令,如數(shù)學(xué)/邏輯操作和(或)存儲器操作。
在一個示范實施例中,由于存在一個控制預(yù)測模塊206,程序指令210可以亂序執(zhí)行??刂祁A(yù)測模塊206使得指令210可以被重新排序,并在獲知動態(tài)代碼流實際到達(dá)程序210中被重新排序的指令所需的位置之前執(zhí)行。這有助于提高應(yīng)用程序的性能。
異常指令是指可以導(dǎo)致異常發(fā)生的指令。當(dāng)程序210中的一條異常指令被重新排序時,問題就會發(fā)生。典型情況下,當(dāng)一條異常指令發(fā)出信號通知一個異常已經(jīng)發(fā)生時,異常處理程序208將通過指定的方法來提供異常服務(wù)。該指定方法可以包括,但不限于,保存沖突指令的地址和(或)將計算機(jī)系統(tǒng)100的控制權(quán)移交給某些指定地址處的某些其他的應(yīng)用軟件或程序。在一個示范實施例中,算術(shù)溢出是一個可能由乘法指令產(chǎn)生的異常。當(dāng)處理器202檢測到算術(shù)溢出時,將保存乘法指令的地址。隨后,異常處理程序208把控制權(quán)交給計算機(jī)系統(tǒng)100來處理該異常。
由于被重新排序的異常指令(其將生成一個異常)實際上可以不必按照原始程序流來執(zhí)行,問題就會發(fā)生。在一個示范實施例中,如果一條加載指令被重新排序,并且加載指令在被原始(即,未被重新排序的)程序流執(zhí)行前就被執(zhí)行,加載指令將生成一個異常。不過,由于程序的原始動態(tài)流實際上可能沒有執(zhí)行該加載指令,這個異常實際上可能不需要處理。這樣,當(dāng)一條被重新排序的異常指令生成一個異常時,該異常就被推遲了,而控制權(quán)也沒有移交給異常處理程序208。相反,在到達(dá)異常指令將被原始程序流執(zhí)行的位置處(即,被推遲的異常點)前,程序指令210將繼續(xù)按照重新排序過的序列執(zhí)行。當(dāng)?shù)竭_(dá)該被推遲的異常點并且檢測到該被推遲的異常時,異常指令被重新執(zhí)行,而同時異常處理程序208也被允許接收控制權(quán)。
圖3-10是示例機(jī)器可讀指令的典型流程圖,該示例機(jī)器可讀指令可由一設(shè)備執(zhí)行,來實現(xiàn)一個通過采用控制預(yù)測來保存代碼重新排序中的精確異常的示例方法。優(yōu)選地,六個顯示的流程(例如,300、400、600、700、800和900)被具體實現(xiàn)在一個或多個軟件程序中,這些軟件程序保存在一個或多個存儲器(例如,閃存112和(或)硬盤120)中,并且由一個或多個處理器(例如,處理器106)按照公知的方式執(zhí)行。不過,流程300、400、600、700、800和900的一些或者全部塊可以由人工和(或者)通過其他一些設(shè)備來完成。盡管流程300、400、600、700、800和900是用圖3-10中所顯示的流程圖來描述的,本領(lǐng)域內(nèi)具有普通技術(shù)水準(zhǔn)的人很容易明白,可以使用許多其他方法來完成這六個流程300、400、600、700、800和900。在一個示范實施例中,許多塊的次序可以更改,一個或多個塊的操作可被改變,塊可以被組合和(或)被取消。
通常,示例的流程300使用一個控制預(yù)測模塊206來重新排列一個程序的指令210,以便提高應(yīng)用程序的性能??刂祁A(yù)測使程序的指令210可以被重新排序,以便一條或多條指令可以不按照原始次序執(zhí)行。此外,控制預(yù)測允許由被重新排序的指令生成的異常被推遲并在程序的指令執(zhí)行路徑中的更晚時刻進(jìn)行處理。體系狀態(tài),如寄存器內(nèi)容,可以被恢復(fù)到未發(fā)生代碼重新排序時的狀態(tài)。這可以通過執(zhí)行位于恢復(fù)塊中的指令來完成。換言之,恢復(fù)塊包括一個逆轉(zhuǎn)代碼重新排序的效果的指令序列。
流程300開始時,檢查程序的指令210,并且確定是否有任何代碼移動候選者(塊302)。代碼移動候選者是指可被重新排序的指令。編譯器或者二進(jìn)制翻譯器應(yīng)用程序可以按照公知的方式確定何時移動代碼移動候選者對于提高處理能力具有潛在的優(yōu)勢。如果沒有代碼移動候選者,流程300就退出(塊304)。如果存在代碼移動候選者,流程300將確定該代碼移動候選者是否滿足特定的條件。根據(jù)所滿足的條件,將啟動流程400、600或900其中的一個。具體而言,通過檢查代碼移動候選者“INST”來確定它是不是“異常指令”。異常指令是可以在處理器(例如,處理器106或者處理器202)內(nèi)引起內(nèi)部異常的指令(塊308)。在一個示范實施例中,“加載”指令可以是異常指令。
如果代碼移動候選者INST是異常指令,圖4中所顯示的流程400將開始。在流程400中,將INST402在程序的執(zhí)行序列中從原始位置404上移至新位置406,這使INST402可在更早時候被執(zhí)行(塊408)。INST402用于指代INST的一個具體的示范實施例,其中INST是一條被重新排序的異常指令。
接下來,將INST 402轉(zhuǎn)換成一條控制預(yù)測指令410(塊412)。有幾種不同的方法來實現(xiàn)將一條指令向該指令的控制預(yù)測版本進(jìn)行轉(zhuǎn)換。一種實現(xiàn)轉(zhuǎn)換的方法是采用一個查詢表來保存控制預(yù)測指令。在一個示范實施例中,當(dāng)需要轉(zhuǎn)換一條“l(fā)d”指令時,流程400可以訪問查詢表并確定適當(dāng)?shù)目刂祁A(yù)測指令是“l(fā)d.s”。
接下來,在程序執(zhí)行路徑中的INST402的原始位置404處插入一條校驗指令414(例如,chk.s)(塊416),并且生成一個恢復(fù)塊502(參看圖5,塊504)?;謴?fù)塊502是可以用來恢復(fù)處理器的體系狀態(tài)的一條或者一組指令。如果需要執(zhí)行恢復(fù)塊502,校驗指令414就轉(zhuǎn)移到恢復(fù)塊502。在一個示范實施例中,控制預(yù)測模塊206可以校驗一個或者多個狀態(tài)位,來確定是否需要執(zhí)行恢復(fù)塊502。如果狀態(tài)位指示應(yīng)該執(zhí)行恢復(fù)塊502,程序流將延續(xù)到恢復(fù)塊502。異常指令I(lǐng)NST402被復(fù)制在恢復(fù)塊502中,這里稱作RECOVERY EXCEPTION INST508(塊506)。
在將異常指令I(lǐng)NST402重新排序,并且生成合適的恢復(fù)塊502后,流程400退出并返回到流程300。然后,流程300繼續(xù)進(jìn)行來確定是否還有任何代碼移動候選者(塊302)。
如果INST不是異常指令,流程300將確定是否將INST上移跨越一條校驗指令(例如,校驗指令414),以便INST可在校驗指令414之前被執(zhí)行(塊310)。如果要將INST上移跨越校驗指令412,那么流程600開始(參看圖6)。流程600通過上移INST(例如,指令602和指令604)跨越校驗指令414來開始(塊606)。INST602和INST604是INST的示范實施例,二者被重新排序向上跨越了校驗指令414。
接下來,流程600發(fā)現(xiàn)了指令“PREV INST”(例如,指令608)(塊610)。PREV INST608是計算INST604的目標(biāo)寄存器(即,保存INST604結(jié)果的寄存器)先前值的指令。在一個示范實施例中,流程600使用一個高速緩存結(jié)構(gòu)來找到PREV INST604。高速緩存結(jié)構(gòu)可以保存修改每個寄存器的最近的指令和原始程序內(nèi)的每一條這些指令的地址。當(dāng)INST604被重新排序跨越校驗指令414時,控制預(yù)測模塊206可以檢查高速緩存結(jié)構(gòu),并試圖查找修改INST604的目標(biāo)寄存器的最近的指令(例如,PREVINST608)。另一種查找PREV INST604的方法是使用軟件遍歷程序指令210并查找最近修改過INST604的目標(biāo)寄存器的指令。
流程600接下來確定PREV INST的源操作數(shù)612(即,PREV INST608用于其操作的寄存器或值)對校驗指令414是否可用(塊614)??梢允褂煤蜕鲜鲇糜诓檎襊REV INST608的相類似的高速緩存結(jié)構(gòu)來確定源操作數(shù)是否可用。在圖6中的示范實施例中,I1是用于指令I(lǐng)6的PREV INST。操作數(shù)b和c是I1的源操作數(shù)612。高速緩存結(jié)構(gòu)可以保存用于修改操作數(shù)寄存器和某些最近使用的存儲器位置的指令的地址。通過檢查最近修改過源操作數(shù)612的指令的指令地址,流程600可以確定源操作數(shù)612是否可用。
INST602表示一條其源操作數(shù)不可為校驗指令414所用的指令。對于源操作數(shù)不可用的情形,流程700開始(參看圖7)。一條新的指令702“NEW INST”被插入到程序的執(zhí)行路徑中來保存PREV INST的目標(biāo)寄存器(塊704)。NEW INST702指令可以是任何將PREV INST的目標(biāo)寄存器的內(nèi)容賦值給一個未使用的寄存器或者某些其他的存儲器位置的指令。在所顯示的示范實施例中,NEW INST702是將寄存器i的值保存到臨時位置t的指令。
另一條新的指令706“NEW RECOVERY INST”被插入到恢復(fù)塊502中,并且被放置在RECOVERY EXCEPTION INST508之前(塊708)。當(dāng)執(zhí)行恢復(fù)塊502時,PREV INST的目標(biāo)寄存器由NEW RECOVERY INST706恢復(fù)。NEW RECOVERY INST706可以是任何將PREV INST的目標(biāo)寄存器恢復(fù)為由NEW INST702保存的值的指令。在圖7中的示范實施例中,NEW RECOVERYINST706是將保存在臨時位置t的值移到PREV INST的目標(biāo)寄存器i的指令。這導(dǎo)致i的內(nèi)容被恢復(fù)為其正常的代碼流內(nèi)容。
在將NEW INST702插入到程序執(zhí)行路徑中,并且將NEW RECOVERY INST706插入到恢復(fù)塊502中后,流程700退出并返回至流程300。然后,流程300繼續(xù)執(zhí)行并確定是否還有任何代碼移動候選者(塊302)。
如果PREV INST的源操作數(shù)612可以為校驗指令414所用(塊614),那么流程800開始(參看圖8)。在圖6中的示范實施例中,PREV INST608是與INST604相關(guān)聯(lián)的先前的指令。操作數(shù)b和c是I1的源操作數(shù)612。在執(zhí)行校驗指令414時,b和c的值還沒有被改變,并且被認(rèn)為可為校驗指令414所用。
流程800復(fù)制了一份PREV INST802并且將PREV INST802的拷貝放到了恢復(fù)塊502中(塊804)。在恢復(fù)塊502中,該PREV INST802的拷貝被放在RECOVERY EXCEPTION INST508的前面(塊806)。當(dāng)執(zhí)行該PREV INST802的拷貝時,它將恢復(fù)目標(biāo)寄存器的值。既然源操作數(shù)612的值可為校驗指令414所用,因此流程800可以通過重新執(zhí)行恢復(fù)塊502中的PREV INST802來恢復(fù)INST604的目標(biāo)寄存器狀態(tài)。由于源操作數(shù)b和c的內(nèi)容尚未被改變,因此目標(biāo)寄存器中將恢復(fù)正確的值。
在恢復(fù)塊502包含一條恢復(fù)INST的目標(biāo)寄存器的指令的狀態(tài)下,流程800將退出并返回至流程300。流程300將繼續(xù)執(zhí)行并確定是否還有任何代碼移動候選者(塊302)。
返回到圖3,如果INST沒有被上移跨越一條校驗指令(例如,校驗指令414)以便INST較早執(zhí)行(塊310),流程300將確定是否將INST下移跨越一條校驗指令414,以使INST晚些時候執(zhí)行(塊312)。某些編譯器或者二進(jìn)制翻譯器應(yīng)用程序可以按照公知的方式確定下移INST是有利的。在一個示范實施例中,可以將INST下移以防止流水線中的失速。這種情形的一個示范實施例是,第一指令修改了一個存儲器位置,緊接著第二指令立即要讀取同一存儲器位置。該讀指令可以是下移的候選者。通過下移該指令,可以消除與第一指令寫入一個存儲器位置和第二指令需要訪問同一存儲器位置相關(guān)聯(lián)的流水線中的時延。
如果INST被下移跨越校驗指令414,流程900將開始(參看圖9)。INST902是被重新排序下移跨越校驗指令414的INST的一個示范實施例。流程900將INST902下移跨越校驗指令414(塊904)。接著INST902的一份拷貝(即,指令906)被放置到恢復(fù)塊502中(塊908)。該INST906的拷貝被放置在RECOVERY EXCEPTION INST508之前(圖10中的塊1002)。既然將INST902下移跨越校驗指令414,在程序流到達(dá)該校驗指令414時,不會執(zhí)行INST902。通過將INST906的一份拷貝放置到恢復(fù)塊502中,并且使INST906的拷貝在RECOVERY EXCEPTION INST508之前執(zhí)行,可以逆轉(zhuǎn)重新排序INST902的效果。
在生成合適的恢復(fù)塊502之后,流程900將退出并返回至流程300。接下來,流程300將繼續(xù)執(zhí)行并確定是否還有任何代碼移動候選者(塊302)。
返回到圖3,如果INST不是異常指令(塊308),并且INST沒有被上移跨越一條校驗指令414(塊310),而且INST也沒有被下移跨越一條校驗指令414(塊312),那么將按公知的方式執(zhí)行正常的代碼移動(塊314)。接下來,流程300將繼續(xù)進(jìn)行并確定是否還有任何代碼移動候選者(塊302)。
盡管以上內(nèi)容揭示的是包括除去其他組件之外,在硬件上執(zhí)行的軟件的示例系統(tǒng),需要明白的是,這樣的系統(tǒng)僅僅是說明性的,不應(yīng)看作是對本發(fā)明的限制。在一個示范實施例中,可以預(yù)期,所揭示的硬件和軟件組件中的任一個或者全部可以只用專用硬件來實現(xiàn),也可以只用軟件來實現(xiàn),還可以只用固件來實現(xiàn),或者用硬件、固件和(或)軟件的某種結(jié)合來實現(xiàn)。
此外,雖然這里描述的是特定的方法、設(shè)備和產(chǎn)品,本專利所覆蓋的范圍卻不限于這些。相反,本專利將覆蓋無論是在文字上,還是根據(jù)等同原則,明確落入附加權(quán)利要求范圍內(nèi)的所有方法、設(shè)備和產(chǎn)品。
權(quán)利要求
1.一種保存代碼重新排序中的異常的方法,該方法包括接收多條軟件指令,所述多條軟件指令包括一條在其內(nèi)第一位置處的軟件指令;確定該軟件指令是不是異常指令;如果該軟件指令是異常指令,在所述多條軟件指令內(nèi)的第二位置處插入該軟件指令的控制預(yù)測版本;在第一位置處用一條校驗指令代替第一位置處的該軟件指令;以及生成一個從該校驗指令分支出來的恢復(fù)塊,該恢復(fù)塊包括該軟件指令的一份拷貝。
2.根據(jù)權(quán)利要求1中所述的方法,其中所述的軟件指令包括一條加載指令。
3.根據(jù)權(quán)利要求1中所述的方法,其中所述的第二位置在指令執(zhí)行上的位置先于第一位置。
4.根據(jù)權(quán)利要求1中所述的方法,其中所述的在第二位置處插入軟件指令的控制預(yù)測版本的步驟包括插入一條加載指令的控制預(yù)測版本。
5.一種保存代碼重新排序中的異常的方法,該方法包括接收包括一條第一指令在內(nèi)的多條指令;確定第一指令是不是異常指令;確定第一指令是否要被上移跨越一條校驗指令;如果第一指令不是異常指令并且要被上移跨越一條校驗指令,在所述多條指令內(nèi),確定一條用于計算與第一指令相關(guān)聯(lián)的目標(biāo)寄存器的先前值的第二指令;確定與第二指令相關(guān)聯(lián)的源操作數(shù)是否可為校驗指令所用;如果與第二指令相關(guān)聯(lián)的源操作數(shù)不可為校驗指令所用,向所述多條指令中插入一條第三指令來保存目標(biāo)寄存器的值;以及向一個恢復(fù)塊中插入一條第四指令來恢復(fù)目標(biāo)寄存器的值。
6.根據(jù)權(quán)利要求5中所述的方法,進(jìn)一步包括如果與第二指令相關(guān)聯(lián)的源操作數(shù)可為校驗指令所用,則向恢復(fù)塊中插入第二指令的一份拷貝。
7.根據(jù)權(quán)利要求6中所述的方法,其中所述的向恢復(fù)塊中插入第二指令的一份拷貝的步驟包括在異常指令的拷貝之前向恢復(fù)塊中插入第二指令的一份拷貝。
8.一種保存代碼重新排序中的異常的方法,該方法包括接收包括一條第一指令在內(nèi)的多條指令;確定第一指令是不是異常指令;確定第一指令是否要被上移跨越一條校驗指令;確定第一指令是否要被下移跨越該校驗指令;以及如果(i)第一指令不是異常指令,(ii)第一指令不要被上移跨越一條校驗指令,并且(iii)第一指令被下移跨越一條校驗指令,那么向恢復(fù)塊中插入第一指令的一份拷貝。
9.根據(jù)權(quán)利要求8中所述的方法,其中所述的向恢復(fù)塊中插入第一指令的一份拷貝包括在異常指令的拷貝之前向恢復(fù)塊中插入第一指令的一份拷貝。
10.一種保存代碼重新排序中的精確異常的設(shè)備,該設(shè)備包括用于執(zhí)行多條軟件指令的處理器;與處理器可操作地耦聯(lián)用以保存所述多條軟件指令的存儲器設(shè)備;與處理器可操作地耦聯(lián)的控制預(yù)測模塊,該控制預(yù)測模塊被構(gòu)建為向所述多條軟件指令中插入軟件指令的控制預(yù)測版本;以及與處理器可操作地耦聯(lián)的異常處理程序,該異常處理程序被構(gòu)建為用來處理與軟件指令的控制預(yù)測版本相關(guān)聯(lián)的異常。
11.根據(jù)權(quán)利要求10中所述的設(shè)備,其中所述的控制預(yù)測模塊向所述多條軟件指令中插入一條校驗指令。
12.根據(jù)權(quán)利要求11中所述的設(shè)備,其中所述控制預(yù)測模塊生成一個從校驗指令分支的恢復(fù)塊。
13.一種用于保存代碼重新排序中的精確異常的設(shè)備,該設(shè)備包括一個計算設(shè)備,該計算設(shè)備被構(gòu)建得可以接收多條軟件指令,所述多條軟件指令包括一條在其內(nèi)第一位置處的軟件指令;確定該軟件指令是不是異常指令;如果該軟件指令是異常指令,在所述多條軟件指令的第二位置處插入該軟件指令的控制預(yù)測版本;在第一位置處用一條校驗指令代替第一位置處的該軟件指令;生成一個從校驗指令分支的恢復(fù)塊,該恢復(fù)塊包括該軟件指令的一份拷貝。
14.根據(jù)權(quán)利要求13中所述的設(shè)備,其中所述的軟件指令包括一條加載指令。
15.根據(jù)權(quán)利要求13中所述的設(shè)備,其中所述的第二位置在指令執(zhí)行上的位置先于第一位置。
16.根據(jù)權(quán)利要求13中所述的設(shè)備,其中所述的在第二位置處插入該軟件指令的控制預(yù)測版本包括插入一條加載指令的控制預(yù)測版本。
17.一種機(jī)器可讀介質(zhì),被構(gòu)建得可以使機(jī)器接收多條軟件指令,所述多條軟件指令包括一條在其內(nèi)第一位置處的軟件指令;確定軟件指令是不是異常指令;如果該軟件指令是異常指令,在所述多條軟件指令的第二位置處插入該軟件指令的控制預(yù)測版本;在第一位置處用一條校驗指令代替第一位置處的該軟件指令;以及生成一個從校驗指令分支的恢復(fù)塊,該恢復(fù)塊包括該軟件指令的一份拷貝。
18.根據(jù)權(quán)利要求17中所述的機(jī)器可讀介質(zhì),其中所述的軟件指令包括一條加載指令,并且第二位置在指令執(zhí)行上的位置先于第一位置。
19.根據(jù)權(quán)利要求17中所述的機(jī)器可讀介質(zhì),其中所述的在第二位置處插入該軟件指令的控制預(yù)測版本包括插入一條加載指令的控制預(yù)測版本。
20.一種機(jī)器可讀介質(zhì),被構(gòu)建得可以使機(jī)器接收包括一條第一指令在內(nèi)的多條指令;確定第一指令是不是異常指令;確定第一指令是否要被上移跨越一條校驗指令;如果第一指令不是一條異常指令并且第一指令要被上移跨越一條校驗指令,在所述多條指令中確定一條用于計算與第一指令相關(guān)聯(lián)的目標(biāo)寄存器的先前值的第二指令;確定與第二指令相關(guān)聯(lián)的源操作數(shù)是否可為該校驗指令所用;如果與第二指令相關(guān)聯(lián)的源操作數(shù)不可為該校驗指令所用,向所述多條指令中插入一條第三指令來保存目標(biāo)寄存器的值;以及向一個恢復(fù)塊中插入一條第四指令來恢復(fù)目標(biāo)寄存器的值。
21.根據(jù)權(quán)利要求20中所述的機(jī)器可讀介質(zhì),其中如果與第二指令相關(guān)聯(lián)的源操作數(shù)可為該校驗指令所用,則向恢復(fù)塊中插入第二指令的一份拷貝。
22.根據(jù)權(quán)利要求21中所述的機(jī)器可讀介質(zhì),其中所述的插入到恢復(fù)塊中的第二指令的拷貝包括在異常指令的拷貝之前插入到恢復(fù)塊中的第二指令的拷貝。
23.一種機(jī)器可讀介質(zhì),被構(gòu)建得可以使機(jī)器接收包括一條第一指令在內(nèi)的多條指令;確定第一指令是不是異常指令;確定第一指令是否要被上移跨越一條校驗指令;確定第一指令是否要被下移跨越該校驗指令;以及如果(i)第一指令不是異常指令,(ii)第一指令不要被上移跨越一條校驗指令,并且(iii)第一指令要被下移跨越一條校驗指令,那么向一個恢復(fù)塊中插入第一指令的一份拷貝。
24.根據(jù)權(quán)利要求23中所述的機(jī)器可讀介質(zhì),其中所述的插入到恢復(fù)塊中的第一指令的拷貝包括在一條異常指令之前插入到恢復(fù)塊中的第一指令的拷貝。
全文摘要
揭示了用于通過采用控制預(yù)測來保存代碼重新排序中的精確異常的方法和設(shè)備。所揭示的系統(tǒng)使用一個控制預(yù)測模塊來重新排序應(yīng)用程序內(nèi)的指令并保存精確異常。如果指令滿足特定的條件,無論是異常指令或者非異常指令,都可由控制預(yù)測模塊來重新排序。當(dāng)重新排序異常指令時,校驗指令被插入到程序執(zhí)行路徑中,并且生成了一個恢復(fù)塊。校驗指令確定被重新排序的異常指令是否實際需要生成一個異常?;謴?fù)塊包含用于逆轉(zhuǎn)代碼重新排序的效果的指令。如果校驗指令檢測到需要一個異常,將執(zhí)行恢復(fù)塊來恢復(fù)處理器的體系狀態(tài)并處理異常。
文檔編號G06F7/38GK1573712SQ0315607
公開日2005年2月2日 申請日期2003年8月29日 優(yōu)先權(quán)日2003年6月23日
發(fā)明者朱子青 申請人:英特爾公司