專利名稱:用于java硬件加速器的猜測執(zhí)行的制作方法
技術(shù)領(lǐng)域:
本發(fā)明總體上涉及計(jì)算機(jī)編程語言,更具體地涉及虛擬機(jī)語言的翻譯和執(zhí)行。
背景技術(shù):
計(jì)算機(jī)編程語言被用于生成包含人類可讀的源代碼的應(yīng)用程序,其中該源代碼代表供計(jì)算機(jī)執(zhí)行的指令。但是,在計(jì)算機(jī)可以根據(jù)指令進(jìn)行工作之前,源代碼必須被翻譯成計(jì)算機(jī)可讀的二進(jìn)制機(jī)器碼。
例如C、C++或者COBOL的編程語言典型地使用翻譯器通過源代碼來生成匯編語言,然后將匯編語言翻譯成被轉(zhuǎn)換為機(jī)器碼的機(jī)器語言。因此,最終的對源代碼的翻譯是發(fā)生在運(yùn)行時(shí)間之前的。不同的計(jì)算機(jī)要求不同的機(jī)器語言,所以例如用C++寫出的程序就只能運(yùn)行在該C++程序?yàn)槠涠鴮懙奶囟ǖ挠布脚_(tái)上。
解釋性編程語言被設(shè)計(jì)用于以源代碼生成應(yīng)用程序的情況,其中該源代碼可以運(yùn)行在多種硬件平臺(tái)上。JavaTM是一種解釋性編程語言,它通過生成在運(yùn)行之前被轉(zhuǎn)換成中間語言的源代碼來實(shí)現(xiàn)平臺(tái)獨(dú)立性,其中該中間語言被稱作“字節(jié)碼”或“虛擬機(jī)語言”。在運(yùn)行的時(shí)候,通過解釋軟件將字節(jié)碼翻譯成適合于平臺(tái)的機(jī)器碼,如在美國專利No.4443865中公開的那樣。為了解釋每個(gè)字節(jié)碼,解釋器軟件執(zhí)行“提取、解碼,以及調(diào)度”(FDD)的系列操作。對于每條字節(jié)碼指令,解釋器軟件都包含一個(gè)用原始的中央處理單元(CPU)指令表示的相應(yīng)的執(zhí)行程序。解釋器軟件使得CPU從存儲(chǔ)器提取或讀取虛擬機(jī)指令,對用于字節(jié)碼指令的執(zhí)行程序的CPU地址進(jìn)行解碼,并且通過將對CPU的控制轉(zhuǎn)移到該執(zhí)行程序從而實(shí)現(xiàn)調(diào)度。該解釋過程可能是耗費(fèi)時(shí)間的。
如在PCT專利申請No.WO9918484中公開的那樣,在存儲(chǔ)器和CPU之間加入預(yù)處理器(虛擬機(jī)解釋器(VMI))改善了虛擬機(jī)指令的處理。本質(zhì)上,虛擬機(jī)并不是一種物理結(jié)構(gòu),而是一種解釋用于硬件平臺(tái)的字節(jié)碼的獨(dú)立的操作環(huán)境,其中對字節(jié)碼的解釋是通過選擇存儲(chǔ)于VM或CPU中的相應(yīng)的原始機(jī)器語言指令而得以實(shí)現(xiàn)的。然后,這些本機(jī)指令被提供到硬件平臺(tái)的CPU中并且在硬件平臺(tái)的CPU中被連續(xù)地執(zhí)行。典型的虛擬機(jī)要求對于每字節(jié)碼有20-60個(gè)周期的處理時(shí)間(取決于字節(jié)碼的質(zhì)量和復(fù)雜度),從而執(zhí)行FDD系列操作。首先,VMI從存儲(chǔ)器讀取(提取)字節(jié)碼。接下來,VMI查找到所提取的字節(jié)碼的多個(gè)屬性(解碼)。VMI所訪問的屬性確定了該字節(jié)碼如何被處理成用于在CPU中執(zhí)行的本機(jī)指令。當(dāng)CPU正在執(zhí)行一條指令的時(shí)候,VMI提取下一個(gè)字節(jié)碼,并將該字節(jié)碼處理成CPU指令。VMI可以在1-4個(gè)周期的時(shí)間內(nèi)處理完簡單的字節(jié)碼。
當(dāng)解釋一系列字節(jié)碼的時(shí)候,虛擬機(jī)可能遇到一個(gè)代表?xiàng)l件分支指令(此后被稱作CBI)的字節(jié)碼。當(dāng)遇到CBI的時(shí)候,VMI生成驅(qū)使CPU確定該條件是否得到滿足的一系列本機(jī)指令。因此,對執(zhí)行分支的決定取決于早先的計(jì)算,這些早先的計(jì)算對于VMI來說是在CPU中被執(zhí)行的,并且計(jì)算結(jié)果仍保留在CPU寄存器中。例如,JavaTM字節(jié)碼“ifeq n”對字節(jié)碼計(jì)數(shù)器的偏移量為n,但是僅在堆棧的頂部是零(即上一次計(jì)算在堆棧上留下的值為0)的情況下才會(huì)這樣。必須重新獲得分支條件的值(這里,指的是堆棧的頂部),并將該值寫入VMI的控制寄存器(它專門被保留用于分支條件)。如果該條件得到了滿足,那么CBI使得VMI字節(jié)碼計(jì)數(shù)器發(fā)生更新(跳轉(zhuǎn)),這改變了字節(jié)碼的執(zhí)行順序。典型地,當(dāng)一條指令正在VMI中被處理的時(shí)候,要被處理的下一條指令已經(jīng)位于VMI管道當(dāng)中,所以如果一條指令導(dǎo)致分支,那么必須清除已經(jīng)位于VMI管道當(dāng)中的字節(jié)碼。另外,處理器硬件的“管道化”結(jié)構(gòu)使得在指令和/或數(shù)據(jù)被調(diào)度到處理器的時(shí)刻與處理器實(shí)際執(zhí)行該指令和/或處理該數(shù)據(jù)的時(shí)刻之間由于傳遞指令和數(shù)據(jù)而產(chǎn)生了固有的延遲。特別地,因?yàn)榈湫偷腃PU具有多級(典型地,3到8級)管道,所以寫操作不會(huì)在發(fā)出該指令后立即就被執(zhí)行。在CBI的情況下,額外的延遲出現(xiàn)在CPU確定條件是否得到滿足并將該確定的結(jié)果傳遞到VMI的時(shí)候。如果分支條件的值(控制值)指示分支條件得到了滿足,那么多條(取決于CPU管道的尺寸大小)指令將會(huì)已經(jīng)進(jìn)入到CPU管道中。為了使CPU和指令高速緩沖存儲(chǔ)器一直保持工作,在等待用于指示條件是否得到滿足的控制值的時(shí)候可以生成一系列“空操作”(NOP)命令。當(dāng)CPU執(zhí)行倒數(shù)第二個(gè)NOP的時(shí)候,接收到控制值,并且VMI生成最后一個(gè)NOP。在做出決定之后,VMI的管道要求得到幾個(gè)周期,用于從VMI的高速緩沖存儲(chǔ)器中獲得代表下一條指令的字節(jié)碼。
其它方法通過預(yù)測一條指令是否將導(dǎo)致到達(dá)另一個(gè)地方的分支從而猜測地執(zhí)行潛在的分支指令。這種方法的一個(gè)例子用于RISC(精簡指令集計(jì)算)微處理器,并且提供一個(gè)分支指令比特用于確定哪些條件分支“容易”被預(yù)測,并且對于這些“容易”被預(yù)測的分支,使用軟件分支預(yù)測從而確定是否執(zhí)行跳轉(zhuǎn)。軟件分支預(yù)測使用受軟件控制的預(yù)測比特對分支進(jìn)行預(yù)測。如果分支被確定為“難以”被預(yù)測,那么使用硬件分支預(yù)測(例如分支預(yù)測陣列)對分支進(jìn)行預(yù)測。這種方法公開了使用這樣一種分支預(yù)測方案如果偏移量小于零(向后分支),那么該方案預(yù)測該分支將會(huì)被采用,而如果偏移量大于零(向前分支),那么該方案預(yù)測該分支不會(huì)被采用。這種方法的一個(gè)劣勢在于為了做出和更新是否容易預(yù)測的決定,需要消耗處理器資源,這是基于采用該分支的歷史操作在確定是否采用該分支時(shí)所具有的重要性的。
在另一種分支預(yù)測方法中,將來自潛在的分支指令的地址的比特與把來自本地的分支歷史表和全局的歷史寄存器的比特結(jié)合在一起得到的比特進(jìn)行比較。該比較的結(jié)果被用于讀取分支預(yù)測表。這種方法的一個(gè)劣勢在于執(zhí)行該結(jié)合和比較操作以及存儲(chǔ)和訪問分支預(yù)測表需要消耗資源。而且,該方法并沒有公開用于校正錯(cuò)誤預(yù)測的方法。美國專利No.5136696中公開了類似的方法,其中由分支高速緩沖存儲(chǔ)器基于潛在的分支指令的地址做出分支預(yù)測。根據(jù)該公開,如果預(yù)測是錯(cuò)誤的,那么相應(yīng)的指令就是無效的,但是它仍會(huì)被執(zhí)行,所以可以使用正確的預(yù)測對分支高速緩沖存儲(chǔ)器進(jìn)行更新,以防再次遇到相同的指令。在與分支高速緩沖存儲(chǔ)器更新相同的周期期間,通過使CPU管道的前七級中的所有指令變?yōu)闊o效并且加載程序計(jì)數(shù)器寄存器的內(nèi)容的方法,使得CPU管道被清除。
因?yàn)闂l件分支發(fā)生比較頻繁(所有虛擬機(jī)指令中10%左右的指令)并且在根據(jù)現(xiàn)有的方法對它們進(jìn)行處理的時(shí)候的處理工作也比較繁重,其中這些現(xiàn)有的方法獲得了高的準(zhǔn)確性但是消耗了處理器資源,所以需要這樣一種解釋性編程語言的系統(tǒng)該系統(tǒng)準(zhǔn)確地和有效率地執(zhí)行條件分支指令字節(jié)碼想要執(zhí)行的指令,而同時(shí)提高了處理速度。
發(fā)明概述本發(fā)明通過這樣一種方法滿足了上述的需要配置虛擬機(jī)硬件加速器(例如VMI),使得在遇到條件字節(jié)碼(CBI)的時(shí)候VMI執(zhí)行分支預(yù)測并且決定是否開始猜測執(zhí)行過程。如果決定開始該過程,那么只要被猜測執(zhí)行的字節(jié)碼是可容易地逆轉(zhuǎn)的(readily reversible),該猜測執(zhí)行就一直繼續(xù),或者一直持續(xù)到預(yù)測得到確認(rèn)。在多數(shù)情況下,預(yù)測是正確的,由此使得VMI和CPU可以在預(yù)測得到確認(rèn)之后按照被猜測選擇的字節(jié)碼的順序連續(xù)進(jìn)行工作。如果預(yù)測是不正確的(并且因此是無效的),那么在VMI和CPU中被執(zhí)行的猜測過程被清除,并且VMI返回到分支之前的狀態(tài)。高效率是通過以下方式得以實(shí)現(xiàn)的通過將虛擬機(jī)硬件加速技術(shù)、分支預(yù)測方案以及潛在的猜測執(zhí)行所帶來的性能提高結(jié)合在一起,以及通過只要影響是可容易地逆轉(zhuǎn)的就猜測地執(zhí)行指令。通過校正任意的錯(cuò)誤預(yù)測來實(shí)現(xiàn)準(zhǔn)確性。因此,平均而言,一條條件分支指令(CBI)僅會(huì)引入相對較小的延遲。
本發(fā)明適用于更復(fù)雜的分支預(yù)測方法(例如,在“調(diào)整分支預(yù)測器從而支持Java中的虛擬方法革新”(Tuning Branch Predictor toSupport Virtual Method Innovation in Java)中所涉及的用于詳細(xì)討論計(jì)劃和路徑歷史的方法,第五屆USENIX面向?qū)ο蠹夹g(shù)和系統(tǒng)會(huì)議的會(huì)議論文集,第217-228頁,1999),以及適用于基于所遇到的每個(gè)潛在的分支指令的類型做出簡單的(但是是大概的)預(yù)測的方案。
簡要地說,本發(fā)明包含用于處理?xiàng)l件分支虛擬機(jī)指令的系統(tǒng)和方法,該指令在本發(fā)明的示例性實(shí)施例中由JavaTM編程語言生成。在編程層面上,JavaTM源代碼被翻譯為被稱作字節(jié)碼的中間語言。字節(jié)碼包含可以被虛擬機(jī)解釋從而由處理器執(zhí)行的虛擬機(jī)指令。根據(jù)本發(fā)明的示例性實(shí)施例,虛擬機(jī)(在該示例性實(shí)施例中為VMI)在運(yùn)行時(shí)被初始化。參數(shù)被初始化,這使得可以識(shí)別每個(gè)字節(jié)碼的某些屬性。例如,字節(jié)碼可能是簡單的或是復(fù)雜的,并且還可能是有條件的或回歸的。僅在分支條件得到滿足的情況下,條件字節(jié)碼才是改變字節(jié)碼的執(zhí)行順序的虛擬機(jī)指令。
VMI持續(xù)將一系列字節(jié)碼中的每一個(gè)處理成一條或多條本機(jī)指令。VMI保持一個(gè)字節(jié)碼計(jì)數(shù)器,在從指令存儲(chǔ)器中取出每個(gè)字節(jié)碼之后該計(jì)數(shù)器會(huì)加1。當(dāng)遇到CBI的時(shí)候,VMI生成一系列本機(jī)指令,這些本機(jī)指令使得CPU通過獲得分支條件控制值從而確定分支條件是否得到了滿足。根據(jù)本發(fā)明的示例性實(shí)施例的系統(tǒng)和方法,VMI執(zhí)行分支預(yù)測并且選擇是否執(zhí)行猜測執(zhí)行,即是否做出分支條件是否將得到滿足的假設(shè),而不是暫停處理直到完成了控制值得獲取。在做出了假設(shè)的時(shí)候,一個(gè)字節(jié)碼序列被猜測地執(zhí)行,直到該假設(shè)得到了確認(rèn)或變?yōu)闊o效,或者直到遇到不可容易地逆轉(zhuǎn)的字節(jié)碼。
在本發(fā)明的前三個(gè)實(shí)施例中,決定是基于CBI所指定的分支的類型的。根據(jù)第一實(shí)施例,如果CBI指定一個(gè)向后分支,那么VMI假設(shè)分支條件為真,并且更新字節(jié)碼計(jì)數(shù)器從而跳轉(zhuǎn)到該分支所指向的下一個(gè)字節(jié)碼。如果CBI指定一個(gè)向前分支,那么VMI假設(shè)分支條件不會(huì)得到滿足,并且不執(zhí)行該分支。在一個(gè)替換的實(shí)施例中,如果CBI要求向后分支,那么就假設(shè)分支條件得到了滿足,但是如果CBI要求向前分支,那么就不做出假設(shè)。在另一個(gè)替換的實(shí)施例中,VMI假設(shè)分支條件總是得到滿足的,并且因此只要沿著猜測分支上的字節(jié)碼是可容易地逆轉(zhuǎn)的,就處理這些字節(jié)碼,直到假設(shè)得到確認(rèn)或者變?yōu)闊o效。
在另一個(gè)實(shí)施例中,使用一種已知的分支預(yù)測方案從而確定是否猜測地執(zhí)行一個(gè)分支,但是VMI僅猜測地處理可容易地逆轉(zhuǎn)的字節(jié)碼,直到假設(shè)得到確認(rèn)或變?yōu)闊o效。在下面的內(nèi)容中,根據(jù)使用VMI來實(shí)施該方法的實(shí)施例對該方法進(jìn)行了詳細(xì)的描述,但是可以使用更多的分支預(yù)測或猜測執(zhí)行方案來實(shí)施該方法。
根據(jù)本發(fā)明的實(shí)施例,在做出假設(shè)之后,只要本機(jī)指令是可容易地逆轉(zhuǎn)的,例如涉及堆棧操作(例如堆棧壓棧操作)的指令,VMI就持續(xù)地將這些本機(jī)指令調(diào)度到CPU,這是對沿著被猜測執(zhí)行的分支或者沿著字節(jié)碼的原始順序的連續(xù)字節(jié)碼所進(jìn)行的轉(zhuǎn)移。當(dāng)遇到不可容易地逆轉(zhuǎn)的指令時(shí),生成一系列“空操作”(NOP)命令,并且VMI調(diào)度這些命令使得CPU一直保持工作,直到獲得了控制值。如果隨后收到的控制值指示該假設(shè)是正確的,那么VMI繼續(xù)對存在于VMI管道中的字節(jié)碼進(jìn)行操作,并且CPU繼續(xù)對CPU管道中的本機(jī)指令進(jìn)行操作。如果隨后收到的控制值指示該假設(shè)是不正確的(即出現(xiàn)了錯(cuò)誤預(yù)測),那么使得CPU返回到分支之前的狀態(tài),由此逆轉(zhuǎn)了被猜測執(zhí)行的可容易地逆轉(zhuǎn)的字節(jié)碼。由此,對由不正確的假設(shè)導(dǎo)致的錯(cuò)誤預(yù)測的逆轉(zhuǎn)要求使VMI和CPU都返回到分支之前的狀態(tài),并且根據(jù)被猜測執(zhí)行的字節(jié)碼的特性,這種逆轉(zhuǎn)可以容易地得到實(shí)現(xiàn)。例如,在本發(fā)明的一個(gè)實(shí)施例中,“可容易地逆轉(zhuǎn)的字節(jié)碼”被定義為這樣一種字節(jié)碼它僅執(zhí)行堆棧操作,或者不改變VMI之外的任何狀態(tài),所以對于一系列這種字節(jié)碼的執(zhí)行,可以通過重新設(shè)置VMI中的字節(jié)碼計(jì)數(shù)器和寄存器堆棧指針來實(shí)現(xiàn)該執(zhí)行的逆轉(zhuǎn)?!翱扇菀椎啬孓D(zhuǎn)的”的其它定義可以根據(jù)本發(fā)明被實(shí)現(xiàn),并且這些一些其它定義可能要求為了逆轉(zhuǎn)被猜測執(zhí)行的字節(jié)碼,需要清除VMI和CPU的管道。
本發(fā)明的另一個(gè)方面是用于執(zhí)行由例如JavaTM的解釋性語言寫成的虛擬機(jī)指令的系統(tǒng)。該系統(tǒng)包含處理器(CPU)和預(yù)處理器(VMI)、指令存儲(chǔ)器,以及翻譯器(JVM)。處理器包含針對硬件的指令,并且處理器被配置從而執(zhí)行這些針對硬件的指令,其中這些針對硬件的指令此后被稱作本機(jī)指令。預(yù)處理器是一種虛擬機(jī),例如VMI,它被配置用于從指令存儲(chǔ)器提取字節(jié)碼并且將該字節(jié)碼翻譯成原始CPU指令。VMI包含控制寄存器、字節(jié)碼計(jì)數(shù)器BCC、假設(shè)變量寄存器,以及猜測模式開關(guān)歷史。在本發(fā)明的示例性實(shí)施例中,VMI被配置用于將每個(gè)字節(jié)碼所要求的本機(jī)指令調(diào)度到CPU用于處理。如果被處理的字節(jié)碼是CBI,那么VMI所提取的本機(jī)指令驅(qū)使CPU發(fā)送一個(gè)指示一個(gè)分支是否要被執(zhí)行的控制值。VMI還被配置用于在已經(jīng)推測認(rèn)為或確認(rèn)分支條件得到滿足的時(shí)候,更新BCC從而執(zhí)行CBI所要求的跳轉(zhuǎn)。當(dāng)?shù)却刂浦档臅r(shí)候,基于根據(jù)被列為上述實(shí)施例的方法的分支預(yù)測方案,VMI被配置用于猜測地處理或拒絕處理分支。VMI被配置用于通過存儲(chǔ)被假設(shè)的控制值A(chǔ)CV,在做出假設(shè)或拒絕做出假設(shè)的時(shí)候更新假設(shè)變量的值。VMI被配置用于保持猜測模式開關(guān)歷史,當(dāng)一個(gè)序列被猜測地執(zhí)行或者當(dāng)猜測執(zhí)行停止的時(shí)候,該猜測模式開關(guān)歷史被更新,并且當(dāng)接收到一個(gè)控制值的時(shí)候,該猜測模式開關(guān)歷史被清除。在做出了一個(gè)分支應(yīng)該被猜測地執(zhí)行的假設(shè)之后,VMI被配置用于識(shí)別和處理可逆的字節(jié)碼,用于接收控制值,以及用于如果在VMI隨后接收到一個(gè)指示先前的假設(shè)是不正確的控制值的時(shí)候,逆轉(zhuǎn)這些被猜測執(zhí)行的字節(jié)碼。
盡管執(zhí)行本發(fā)明的方法有可能處理各種類型的條件分支指令,但是本發(fā)明的示例性實(shí)施例只用于對JavaTM條件分支字節(jié)碼的處理。
本發(fā)明可以在使用例如由Sun Microsystems制造的JVM的虛擬機(jī)從而執(zhí)行JavaTM字節(jié)碼的系統(tǒng)上得到執(zhí)行。但是,還可以使用其它的JavaTM虛擬機(jī),例如Microsoft虛擬機(jī)來實(shí)現(xiàn)本發(fā)明,并且本發(fā)明還適用于執(zhí)行其它解釋性語言的系統(tǒng),這些解釋性語言例如VisualBasic、dBASE、BASIC以及.NET。
本發(fā)明的其它目的、優(yōu)點(diǎn)和新特征將部分地在隨后的描述中得到闡明,并且當(dāng)本領(lǐng)域的技術(shù)人員查看過下面內(nèi)容后,本發(fā)明的這些其它目的、優(yōu)點(diǎn)和新特征將部分地對于本領(lǐng)域的技術(shù)人員來說變得很明顯,并且可以通過實(shí)施本發(fā)明從而掌握這些其它目的、優(yōu)點(diǎn)和新特征。
附圖簡述當(dāng)參考描述來查看被包含到說明中并形成了說明的一部分的附圖時(shí),這些附圖舉例說明了本發(fā)明。
附
圖1是框圖,顯示了本發(fā)明的環(huán)境的示例性實(shí)施例的功能元件。
附圖2是顯示在典型的CPU管道中對指令進(jìn)行處理的圖。
附圖3顯示了一個(gè)示例性字節(jié)碼處理序列。
附圖4表示了根據(jù)本發(fā)明的示例性實(shí)施例的方法的流程。
優(yōu)選實(shí)施例描述如所要求的,在這里公開了本發(fā)明的詳細(xì)實(shí)施例;但是,應(yīng)該理解,所公開的實(shí)施例僅僅是本發(fā)明的示例,并且本發(fā)明可以通過其它不同的和替換的形式得以實(shí)現(xiàn)。附圖不必是按照比例繪制的;為了顯示特征器件的詳細(xì)情況,某些特征被夸大或被縮小。因此,這里所公開的特定的結(jié)構(gòu)和功能細(xì)節(jié)并不應(yīng)被理解為對本發(fā)明進(jìn)行限制,而僅僅是作為用于權(quán)利要求的基礎(chǔ),以及作為用于向本領(lǐng)域的技術(shù)人員教授如何以各種不同方式使用本發(fā)明的典型的基礎(chǔ)。
現(xiàn)在參考本發(fā)明的一個(gè)示例性實(shí)施例的詳細(xì)內(nèi)容,其中該示例性實(shí)施例在附圖中被舉例說明,并且在這些附圖中相同的數(shù)字代表相同的器件,圖1是本發(fā)明的環(huán)境的示例性實(shí)施例的框圖。本環(huán)境的基本器件是硬件平臺(tái)100,該硬件平臺(tái)包含處理器110、預(yù)處理器120以及指令存儲(chǔ)器150,并且它們通過系統(tǒng)總線160連接在一起。預(yù)處理器120包含控制寄存器130和翻譯器140。硬件平臺(tái)100典型地包含中央處理單元(CPU)、基本的外設(shè)、操作系統(tǒng)(OS)。本發(fā)明的處理器110是例如MIPS、ARM、Intel x86、PowerPC或者SPARC類型的微處理器的CPU,而且包含針對硬件的指令,并且被配置用于執(zhí)行這些針對硬件的指令,其中這些針對硬件的指令此后被稱作本機(jī)指令。在本發(fā)明的該示例性實(shí)施例中,翻譯器140是JavaTM虛擬機(jī)(JVM),例如Sun Microsystems的KVM。指令存儲(chǔ)器150包含虛擬機(jī)指令,例如JavaTM字節(jié)碼170。該示例性實(shí)施例中的預(yù)處理器120是在WO9918486中公開的虛擬機(jī)解釋器(VMI),并且它被配置用于從指令存儲(chǔ)器150提取虛擬機(jī)指令(例如字節(jié)碼170),并且將該虛擬機(jī)指令翻譯成一系列原始CPU指令。VMI 120是總線160上的外設(shè),并且充當(dāng)存儲(chǔ)器映射外設(shè),其中將預(yù)先確定的CPU地址范圍分配給VMI 120。VMI 120管理一個(gè)獨(dú)立的虛擬機(jī)指令指針180,該指針指示指令存儲(chǔ)器150中的當(dāng)前的(或下一個(gè))虛擬機(jī)指令。VMI還管理一個(gè)猜測模式開關(guān)歷史和假設(shè)變量(未示出)。
現(xiàn)在參考圖2并且根據(jù)本發(fā)明的示例性實(shí)施例,處理器110包含多級管道200,從而在連續(xù)的時(shí)鐘周期內(nèi),機(jī)器指令的執(zhí)行以并行和前后緊接的方式進(jìn)行。換句話說,當(dāng)?shù)谝恢噶領(lǐng)1進(jìn)入管道的第二級的時(shí)候,隨后的指令I(lǐng)2進(jìn)入第一級,依此類推。理想情況下,指令在連續(xù)的周期內(nèi)連續(xù)進(jìn)入管道,由此使得可以實(shí)現(xiàn)對八條指令的同時(shí)處理,并且每隔一個(gè)時(shí)鐘周期完成對一條指令的執(zhí)行。但是,典型地,對一般指令的執(zhí)行實(shí)際上要求多于一個(gè)時(shí)鐘周期。
作為本發(fā)明的工作情況的一個(gè)例子,VMI 120將字節(jié)碼170的第一系列310翻譯成一條或多條本機(jī)指令?,F(xiàn)在參考圖3,字節(jié)碼B0到B2是非條件的,所以VMI 120只是從指令存儲(chǔ)器150提取B0-B2,選擇本機(jī)指令或?yàn)槊總€(gè)字節(jié)碼170定義的指令,并且將這些指令提供到處理器110用于執(zhí)行。Bn是條件分支指令(CBI 330),因此如果分支條件得到滿足,那么Bn導(dǎo)致VMI從第一序列310跳轉(zhuǎn)到序列320中的字節(jié)碼Br。當(dāng)分支條件正在被評價(jià)的時(shí)候(即VMI 120等待從CPU 110返回控制值的時(shí)候),根據(jù)分支預(yù)測方案做出關(guān)于分支條件是否將得到滿足的預(yù)測,并且VMI決定是否猜測地執(zhí)行這些指令,直到預(yù)測可以被證實(shí)。分支預(yù)測方案是具有可變復(fù)雜度的探試性過程,該過程提供關(guān)于分支條件是否將得到滿足的預(yù)測,并且還可能提供對預(yù)測準(zhǔn)確度的統(tǒng)計(jì)評價(jià)。根據(jù)本發(fā)明的一個(gè)實(shí)施例,VMI 120實(shí)施這樣一種分支預(yù)測方案如果CBI 330(Bn)要求向后分支(即相對于字節(jié)碼計(jì)數(shù)器BCC的負(fù)的偏移量),那么該方案假設(shè)分支條件得到滿足并且VMI120執(zhí)行到字節(jié)碼Br的跳轉(zhuǎn)。與此同時(shí),VMI 120調(diào)度本機(jī)指令序列,這些本機(jī)指令序列導(dǎo)致CPU 110獲得指示分支條件是否得到滿足的控制值。根據(jù)另一個(gè)實(shí)施例的分支預(yù)測方案,如果CBI 330(Bn)要求向前跳轉(zhuǎn)(即相對于BCC的正的偏移量),那么VMI 120假設(shè)分支條件未得到滿足并且不執(zhí)行跳轉(zhuǎn)。根據(jù)另一個(gè)實(shí)施例的分支預(yù)測方案,如果CBI 330在任何條件下都要求分支,那么VMI 120假設(shè)分支條件得到滿足并且執(zhí)行跳轉(zhuǎn)。
根據(jù)本發(fā)明的一個(gè)示例性實(shí)施例,如果分支預(yù)測方案導(dǎo)致字節(jié)碼的序列320的猜測執(zhí)行,那么通過僅猜測地執(zhí)行可容易地逆轉(zhuǎn)的字節(jié)碼170可以使得不正確的預(yù)測的影響最小化。在VMI 120對字節(jié)碼170進(jìn)行解碼(即訪問它的屬性)時(shí),確定逆轉(zhuǎn)的容易程度。CPU 110猜測地執(zhí)行每個(gè)被調(diào)度的指令。例如,在許多情況下,分支后面跟有一個(gè)堆棧壓棧操作(即一個(gè)常量或變量被壓入堆棧),通過將堆棧指針值(該值被保持在VMI 120中)重新設(shè)置到它在分支之前的狀態(tài),可以容易地實(shí)現(xiàn)對該操作的逆轉(zhuǎn)。這樣的本機(jī)指令(通常被稱作“堆棧壓?!?可以被猜測地執(zhí)行直到接收到了控制值,這是因?yàn)閷Σ聹y執(zhí)行的逆轉(zhuǎn)僅通過重新設(shè)置寄存器就可以得以實(shí)現(xiàn),并且因此錯(cuò)誤預(yù)測的不良影響是可以忽略的。
因此,當(dāng)VMI 120假設(shè)分支條件將得到滿足的時(shí)候,對字節(jié)碼Br-Bz(猜測分支)的處理隨后就在第二序列320中持續(xù)進(jìn)行,除非VMI 120遇到沿著猜測分支上的這樣一個(gè)字節(jié)碼,該字節(jié)碼代表了不能被容易地逆轉(zhuǎn)的一系列本機(jī)指令。當(dāng)沿著猜測分支上的字節(jié)碼170不能被容易地逆轉(zhuǎn)時(shí),暫停該猜測執(zhí)行。如果VMI 120隨后接收到指示分支條件未得到滿足的控制值,那么VMI 120重新設(shè)置BCC和寄存器堆棧指針從而逆轉(zhuǎn)該跳轉(zhuǎn)(并且如果有必要的話,向CPU 110發(fā)送一條本機(jī)指令從而清除CPU管道200)。如果VMI 120假設(shè)分支條件將不會(huì)得到滿足,那么BCC加1,并且分支猜測地不被處理。當(dāng)猜測地處理非分支字節(jié)碼的時(shí)候,VMI 120持續(xù)地檢查接收到的控制值是否已經(jīng)被寫入到它的控制寄存器130中。
如圖4的塊410中所示的,VMI 120在運(yùn)行到塊420從而從指令存儲(chǔ)器150提取每個(gè)字節(jié)碼170之前,都要使虛擬機(jī)計(jì)數(shù)器BCC加1。在塊430中,VMI 120通過訪問每個(gè)字節(jié)碼170的屬性從而對該字節(jié)碼170進(jìn)行解碼。因?yàn)楫?dāng)一個(gè)序列的第一個(gè)字節(jié)碼170已經(jīng)被解碼的時(shí)候,猜測模式開關(guān)SMS是關(guān)閉的,所以VMI 120(在塊435中)調(diào)度對應(yīng)于字節(jié)碼170的本機(jī)指令序列。如果在塊445中,確定了字節(jié)碼170不是CBI 330,那么該方法返回到塊410,在塊410中虛擬機(jī)計(jì)數(shù)器(BCC)180加1,并且重新開始進(jìn)行提取過程(塊420)。但是,如果在塊445中確定了字節(jié)碼170是條件性的,那么在塊435中被調(diào)度的本機(jī)指令在塊450中將代表一個(gè)控制值取回過程。構(gòu)成該控制值取回過程的本機(jī)指令將導(dǎo)致CPU 110發(fā)送一個(gè)指示CBI 330所要求的分支是否會(huì)得到執(zhí)行(即是否跳轉(zhuǎn)到位于當(dāng)前正在被執(zhí)行的字節(jié)碼序列之外的目標(biāo)字節(jié)碼170)的控制值,并且將該控制值寫到控制寄存器130中。與控制值取回過程的同時(shí),VMI 120決定(在塊470中)是否做出分支條件會(huì)得到滿足或是不會(huì)得到滿足的假設(shè)。該決定基于所使用的特定的分支預(yù)測或猜測執(zhí)行方案。
如果VMI 120決定做出關(guān)于分支條件是否得到滿足的假設(shè),那么猜測模式開關(guān)(SMS)被打開并且一個(gè)假設(shè)的控制值(ACV)被存儲(chǔ)到VMI寄存器(假設(shè)變量195)。在塊475中,如果分支是猜測被采用的,那么BCC被更新(從而反映CBI 330所要求的跳轉(zhuǎn))。無論分支是否猜測被采用的,該方法前進(jìn)到塊410,在塊410中BCC加1。如果沿著猜測被采用的字節(jié)碼序列上的下一個(gè)字節(jié)碼170是可逆的(例如對應(yīng)于下一個(gè)字節(jié)碼170的本機(jī)指令組成了一個(gè)簡單的堆棧操作),那么就對該字節(jié)碼進(jìn)行處理?;谧止?jié)碼170的屬性來確定可逆性的容易程度。可容易地逆轉(zhuǎn)的字節(jié)碼典型地代表這樣一些操作這些操作在CBI 330翻譯之后發(fā)生在位于堆棧頂部之上的堆棧位置并且不改變系統(tǒng)的狀態(tài)(特別地,在VMI 120之外)。在塊420中,字節(jié)碼170被提取,在塊430中,該字節(jié)碼被解碼。SMS是打開的,這是因?yàn)閂MI120決定做出假設(shè)(該序列正被猜測地執(zhí)行),所以如果控制值還沒有被返回(塊485)并且解碼后得到的屬性指示所提取的字節(jié)碼170是可容易地逆轉(zhuǎn)的,那么在塊435中,對應(yīng)于該被提取的字節(jié)碼的本機(jī)指令被調(diào)度。所以,只要被提取的字節(jié)碼170不是另一個(gè)CBI 330(塊445),那么BCC就加1(塊410)并且沿著猜測序列上的下一個(gè)字節(jié)碼被提取和解碼(塊420和430)。因此,只要每個(gè)下一個(gè)字節(jié)碼170是可容易地逆轉(zhuǎn)的,并且只要還沒有接收到分支條件,那么猜測序列的處理就在塊410、420、430、432、485、486、460和435之間循環(huán)。
如果在塊460中,在猜測序列的處理期間遇到了不可容易地逆轉(zhuǎn)的字節(jié)碼170,那么通過在塊461中關(guān)閉SMS從而停止該猜測,這導(dǎo)致VMI 120在塊485中等待接收控制值。接收到的控制值RCV被存儲(chǔ)到VMI 120的控制寄存器130中。在塊487,對分支條件進(jìn)行評價(jià)。如果RCV指示分支條件得到了滿足,并且SMS歷史指示當(dāng)前序列正在被猜測地處理(SMS歷史190顯示在當(dāng)前序列中的某個(gè)點(diǎn)處SMS被打開),那么在塊494中,將被存儲(chǔ)為假設(shè)變量195的假設(shè)的控制值A(chǔ)CV與存儲(chǔ)在控制寄存器130中的接收到的控制值RCV進(jìn)行比較從而確定VMI 120所做的假設(shè)是否是正確的(即猜測序列是否應(yīng)該被處理)。如果假設(shè)是正確的(即ACV=RCV),那么當(dāng)前分支序列的猜測執(zhí)行得到確認(rèn)。換句話說,VMI 120正確地假設(shè)了該分支應(yīng)該被采用。在塊410中,BCC加1并且重新開始提取指令。如果假設(shè)是不正確的,那么VMI120對分支所進(jìn)行的處理是錯(cuò)誤的,并且清除VMI 120和CPU 110從而逆轉(zhuǎn)被猜測處理的非分支字節(jié)碼序列,該方法在塊498中更新BCC從而反映該跳轉(zhuǎn),并且隨后返回到塊410中使BCC加1,并且處理沿著分支序列上的下一個(gè)字節(jié)碼。
如果RCV指示分支條件未得到滿足并且SMS歷史190指示當(dāng)前序列正在被猜測地處理,那么在塊494中,將假設(shè)的控制值A(chǔ)CV與接收到的控制值RCV進(jìn)行比較,從而確定VMI 120所做的假設(shè)是否是正確的。如果假設(shè)是正確的,那么當(dāng)前非分支序列的猜測執(zhí)行得到了確認(rèn)。換句話說,VMI 120正確地假設(shè)了分支不應(yīng)該被采用。在塊410中,BCC加1并且重新開始提取。如果假設(shè)是不正確的,那么分支不應(yīng)被采用,并且在塊495中通過重新設(shè)置BCC和堆棧寄存器指針從而逆轉(zhuǎn)沿著被猜測處理的分支上的所有字節(jié)碼。如有必要,在塊495中清除VMI 120和CPU 110的管道。
只要接收到控制值,SMS歷史190就被重新設(shè)置,這是因?yàn)榉种l件已經(jīng)得到了確認(rèn),并且因此確認(rèn)或清除任何的猜測處理。
如果在塊470中,VMI 120決定不做出關(guān)于分支條件是否得到滿足的假設(shè),那么VMI 120等待,直到在塊485中通過檢查對控制值的接收情況從而接收到控制值。因?yàn)镾MS保持關(guān)閉的,所以從塊486返回到塊485從而繼續(xù)檢查直到接收到控制值。當(dāng)接收到控制值的時(shí)候,該方法運(yùn)行到塊487,在該塊中,對分支條件進(jìn)行評價(jià)。如果控制值指示分支條件得到滿足,那么因?yàn)樵谧止?jié)碼序列的執(zhí)行過程中并未發(fā)生猜測,所以該方法運(yùn)行到塊498,在該塊中,BCC被更新從而反映CBI330所要求的跳轉(zhuǎn),并且然后在塊410中重新開始字節(jié)碼提取。如果控制值指示分支條件未得到滿足,那么該方法返回到塊410,重新開始字節(jié)碼提取。通過這種方法,如果VMI 120決定不做出假設(shè),那么VMI 120正常地處理CBI 330(僅在分支條件得到滿足的情況下才采用分支)。
如上面討論的那樣,關(guān)于是否做出關(guān)于分支條件是否得到滿足的假設(shè)的決定是基于所采用的分支預(yù)測方案,如下面所示。
分支預(yù)測方案
在本發(fā)明的第一實(shí)施例中,VMI 120使用這樣一種猜測執(zhí)行方案,該方案假設(shè)向后分支會(huì)被采用,而向前分支不會(huì)被采用。在第二和可替換的實(shí)施例中,VMI 120僅猜測地執(zhí)行向后分支,并且對向前分支不做出假設(shè)。在第三和可替換的實(shí)施例中,VMI 120使用更加簡單的猜測執(zhí)行方案,該方案假設(shè)所有的分支都被采用。進(jìn)一步,根據(jù)第四和可替換的實(shí)施例,VMI 120使用一種分支預(yù)測方案從而確定是否采用分支。根據(jù)上述任意一個(gè)實(shí)施例,猜測執(zhí)行僅用于可容易地逆轉(zhuǎn)的字節(jié)碼。
根據(jù)本發(fā)明的第一實(shí)施例,VMI 120總是做出關(guān)于CBI 330所代表的分支條件的結(jié)果的假設(shè),但是將猜測基于CBI 330所要求的分支類型。如果CBI 330要求向前分支(BCC偏移量>0),那么VMI 120假設(shè)該分支條件將不會(huì)得到滿足,并且只要該字節(jié)碼是可容易地逆轉(zhuǎn)的,就猜測地繼續(xù)處理非分支字節(jié)碼序列。如果CBI 330要求向后分支(BCC偏移量<0),那么VMI 120假設(shè)該分支條件將會(huì)得到滿足,并且只要該字節(jié)碼是可容易地逆轉(zhuǎn)的,就猜測地處理分支字節(jié)碼序列。
根據(jù)本發(fā)明的第二實(shí)施例,僅在CBI要求向后分支的時(shí)候,VMI 120才做出關(guān)于CBI 330所代表的分支條件的結(jié)果的假設(shè)。如果CBI 330要求向前分支,那么VMI 120正常地處理分支條件,即VMI 120等待對控制值的接收,并且相應(yīng)地處理適當(dāng)?shù)淖止?jié)碼序列。
在本發(fā)明的第三實(shí)施例中,當(dāng)遇到CBI的時(shí)候,該方案推測分支總是被采用。當(dāng)處理RISC碼時(shí),該猜測執(zhí)行方案在大約70%的情況下是準(zhǔn)確的,這是因?yàn)榉种ǔ3霈F(xiàn)在循環(huán)的底部,并且循環(huán)典型地是被重復(fù)執(zhí)行的。分支預(yù)測使得VMI的綜合RISC代碼處理性能提高了大約35%。根據(jù)Amdahl定律,當(dāng)處理Java代碼時(shí),這種簡單的預(yù)測將會(huì)使字節(jié)碼處理速度提高7-20%。通過使用分支預(yù)測和猜測操作,與CPU采用原始的方式進(jìn)行工作的情況相比,分支的開銷可以從10到20個(gè)周期降低到大約2到4個(gè)周期。根據(jù)第三實(shí)施例的一個(gè)方面,當(dāng)VMI 120假設(shè)分支條件已經(jīng)得到滿足的時(shí)候,VMI 120更新字節(jié)碼計(jì)數(shù)器BCC從而反映分支偏移量,開始根據(jù)偏移地址提取指令,并且恢復(fù)它的管道。如果假設(shè)是正確的,被要求用于處理該分支的時(shí)間被減少到大約5個(gè)周期。但是,不能得出這樣的結(jié)論根據(jù)本發(fā)明的該實(shí)施例的分支預(yù)測會(huì)使每個(gè)分支的處理時(shí)間都降低到大約三分之一(從14個(gè)周期降低到5個(gè)周期),這是因?yàn)樗蟹种е械拇蠹s10%的分支都會(huì)導(dǎo)致高速緩沖存儲(chǔ)器錯(cuò)誤。
在第四實(shí)施例中,將任意一種已知的分支預(yù)測方案與VMI 120結(jié)合使用從而處理每個(gè)CBI 330。
本發(fā)明的系統(tǒng)和方法的許多優(yōu)勢在這里得到了描述,盡管如此,本領(lǐng)域的技術(shù)人員可以認(rèn)識(shí)到還存在其它的優(yōu)勢。例如,為了實(shí)現(xiàn)最佳總線使用,CPU 110以脈沖串的方式(典型地包含至少4個(gè)周期)讀取本機(jī)指令。因此,CPU 110在將控制值發(fā)送回到VMI 120之前,必須讀取整個(gè)脈沖串。VMI 120必須生成一些NOP從而填充包含控制值取回命令的脈沖串,以便確保在VMI 120處理猜測分支的時(shí)候CPU110處理該取回命令。本發(fā)明的一個(gè)優(yōu)勢在于,只要每條指令的效果都是可以逆轉(zhuǎn)的,VMI 120就通過猜測地從猜測序列320調(diào)度下一條指令,使得CPU 110和VMI 120管道裝滿有意義的指令,而不是不得不用NOP來占據(jù)處理器時(shí)間從而填充CPU脈沖串。
根據(jù)上面的描述,可以理解,本發(fā)明提供了一種用于實(shí)現(xiàn)對條件分支虛擬機(jī)指令的準(zhǔn)確的和有效率的處理的系統(tǒng)和方法。另外,可以理解的是,上述內(nèi)容只涉及本發(fā)明的示例性實(shí)施例,并且可以對本發(fā)明進(jìn)行多種修改,而不偏離由下面的權(quán)利要求所定義的本發(fā)明的精神和范圍。
權(quán)利要求
1.一種處理虛擬機(jī)指令的方法,該方法包含以下步驟識(shí)別虛擬機(jī)指令的一個(gè)子集,對于該子集中的虛擬機(jī)指令的處理有條件地取決于條件控制變量的值;提取一定范圍的虛擬機(jī)指令,并將該范圍內(nèi)的虛擬機(jī)指令處理成可以由處理器執(zhí)行的本機(jī)指令,其中在處理所述范圍內(nèi)的虛擬機(jī)指令并且將所述范圍內(nèi)的虛擬機(jī)指令調(diào)度到該處理器用于執(zhí)行之后,虛擬機(jī)指令計(jì)數(shù)器加1,并且持續(xù)進(jìn)行直到遇到了所述的虛擬機(jī)指令的子集中的一條指令;當(dāng)遇到了所述的虛擬機(jī)指令的子集中的一條指令的時(shí)候,通過將由這條指令代表的本機(jī)指令調(diào)度到處理器用于執(zhí)行,從而開始一個(gè)控制值取回過程;以及當(dāng)已經(jīng)做出了對于條件控制變量的真實(shí)值的假設(shè)值的假設(shè)時(shí),處理虛擬機(jī)指令的猜測序列,這是通過以下方式完成的打開猜測模式開關(guān);根據(jù)假設(shè)值更新虛擬機(jī)指令計(jì)數(shù)器,以便將所述虛擬機(jī)指令的猜測序列的每條虛擬機(jī)指令處理成本機(jī)指令,使虛擬機(jī)指令計(jì)數(shù)器加1,并且在處理完每條虛擬機(jī)指令之后調(diào)度該本機(jī)指令,直到接收到該條件控制變量的真實(shí)值;將該真實(shí)值與假設(shè)值進(jìn)行比較;以及如果該真實(shí)值不等于假設(shè)值,那么逆轉(zhuǎn)對于該虛擬機(jī)指令的猜測序列的處理,清除猜測模式歷史,并且逆轉(zhuǎn)對于該虛擬機(jī)計(jì)數(shù)器的更新;或者如果該真實(shí)值等于假設(shè)值,那么關(guān)閉所述猜測模式開關(guān),并且清除所述猜測模式歷史;如果沒有做出對于條件控制變量的真實(shí)值的假設(shè)值的假設(shè),那么就延遲對于該范圍內(nèi)的虛擬機(jī)指令的進(jìn)一步提取和處理,直到接收到了條件控制變量的真實(shí)值,然后根據(jù)真實(shí)的控制值處理下一條虛擬機(jī)指令。
2.如權(quán)利要求1所述的方法,其中提取所述范圍內(nèi)的虛擬機(jī)指令并將所述范圍內(nèi)的虛擬機(jī)指令處理成可以由處理器執(zhí)行的本機(jī)指令是由虛擬機(jī)解釋器(VMI)虛擬機(jī)硬件加速器實(shí)現(xiàn)的。
3.如權(quán)利要求1所述的方法,其中對于所述虛擬機(jī)指令的猜測序列的處理進(jìn)一步包含處理所述猜測序列的每條虛擬機(jī)指令,其前提是僅當(dāng)該虛擬機(jī)指令是可容易地逆轉(zhuǎn)的時(shí)候才進(jìn)行所述處理;以及如果下一條虛擬機(jī)指令不代表一個(gè)堆棧操作,那么暫停對于所述虛擬機(jī)指令的猜測序列的處理,直到接收到條件控制變量的真實(shí)值。
4.如權(quán)利要求3所述的方法,其中暫停對于所述猜測序列的處理進(jìn)一步包含將一系列“空操作”指令調(diào)度到處理器,直到接收到條件控制變量的真實(shí)值。
5.如權(quán)利要求2所述的方法,其中確定是否做出對于條件控制變量的真實(shí)值的假設(shè)值的假設(shè)進(jìn)一步包含確定所述被識(shí)別的虛擬機(jī)指令的子集中的所述指令所要求的、對于虛擬機(jī)計(jì)數(shù)器的偏移量;以及如果所述被識(shí)別的虛擬機(jī)指令的子集中的該指令要求的是對于虛擬機(jī)計(jì)數(shù)器的一個(gè)負(fù)的偏移量(偏移量<0),那么設(shè)置該條件控制變量的假設(shè)值從而使得分支條件得到滿足。
6.如權(quán)利要求5所述的方法,該方法進(jìn)一步包含如果所述被識(shí)別的虛擬機(jī)指令的子集中的該指令要求的是對于虛擬機(jī)計(jì)數(shù)器的一個(gè)正的偏移量(偏移量>0),那么設(shè)置該條件控制變量的假設(shè)值從而指示分支條件未得到滿足。
7.如權(quán)利要求5所述的方法,該方法進(jìn)一步包含如果所述被識(shí)別的虛擬機(jī)指令的子集中的該指令要求的是對于虛擬機(jī)計(jì)數(shù)器的一個(gè)正的偏移量(偏移量>0),那么不做出對于條件控制變量的真實(shí)值的假設(shè)。
8.如權(quán)利要求2所述的方法,其中確定是否做出對于條件控制變量的真實(shí)值的假設(shè)值的假設(shè)進(jìn)一步包含設(shè)置條件控制變量的假設(shè)值從而指示分支條件得到滿足。
9.如權(quán)利要求2所述的方法,其中確定是否做出對于條件控制變量的真實(shí)值的假設(shè)值的假設(shè)進(jìn)一步包含根據(jù)分支預(yù)測方案來設(shè)置條件控制變量的假設(shè)值。
10.如權(quán)利要求2所述的方法,其中確定是否做出對于條件控制變量的真實(shí)值的假設(shè)值的假設(shè)進(jìn)一步包含根據(jù)猜測執(zhí)行方案來設(shè)置條件控制變量的假設(shè)值。
11.一種處理虛擬機(jī)指令的方法,該方法包含提取一定范圍的虛擬機(jī)指令,并將該一定范圍內(nèi)的虛擬機(jī)指令處理成可以由處理器執(zhí)行的本機(jī)指令,并且持續(xù)進(jìn)行直到遇到條件分支指令;當(dāng)遇到該條件分支指令的時(shí)候,通過將該條件分支指令所代表的本機(jī)指令調(diào)度到處理器用于執(zhí)行,從而開始一個(gè)控制值取回過程;確定是否做出對于條件控制變量的值的假設(shè);以及當(dāng)做出了對于條件控制變量的值的假設(shè)時(shí),處理虛擬機(jī)指令的猜測序列,這是通過如下方式完成的僅當(dāng)該虛擬機(jī)指令是可容易地逆轉(zhuǎn)的時(shí)候,才將所述虛擬機(jī)指令的猜測序列的虛擬機(jī)指令處理成預(yù)備的本機(jī)指令;以及如果該虛擬機(jī)指令不代表一個(gè)堆棧操作,那么暫停對于所述虛擬機(jī)指令的猜測序列的處理,直到接收到條件控制變量的值;如果沒有做出對于條件控制變量的值的假設(shè),那么就延遲對于該范圍內(nèi)的虛擬機(jī)指令的進(jìn)一步提取和處理,直到接收到了條件控制變量的值,并且然后根據(jù)該接收到的值處理下一條虛擬機(jī)指令。
12.如權(quán)利要求11所述的方法,其中處理虛擬機(jī)指令的猜測序列進(jìn)一步包含將該接收到的條件控制變量的值與假設(shè)值進(jìn)行比較;如果該條件控制變量的值不等于假設(shè)值,那么逆轉(zhuǎn)對于該虛擬機(jī)指令的猜測序列的處理,清除猜測模式歷史;并且如果該條件控制變量的值等于假設(shè)值,那么關(guān)閉所述猜測模式開關(guān),并且清除所述猜測模式歷史。
13.一種用于處理虛擬機(jī)指令的裝置,包含具有本機(jī)指令集的處理器(110),并且該處理器被配置用于執(zhí)行該本機(jī)指令;指令存儲(chǔ)器(150),被配置用于存儲(chǔ)虛擬機(jī)指令;預(yù)處理器(120),被配置用于從指令存儲(chǔ)器提取虛擬機(jī)指令,并且將提取到的虛擬機(jī)指令處理成可由處理器(110)執(zhí)行的本機(jī)指令,識(shí)別條件虛擬機(jī)指令,確定在處理器正在發(fā)送條件控制變量的值的時(shí)候是否猜測地處理虛擬機(jī)指令,以及在接收到該條件控制變量的時(shí)候確認(rèn)或逆轉(zhuǎn)所述被猜測處理的虛擬機(jī)指令,并且進(jìn)一步包含控制寄存器(180),被配置用于存儲(chǔ)從處理器接收到的條件控制變量的值;虛擬機(jī)指令計(jì)數(shù)器,被配置用于指示要被處理的下一條虛擬機(jī)指令;假設(shè)變量寄存器,被配置用于存儲(chǔ)假設(shè)的控制變量的值;猜測模式比特,被配置用于指示預(yù)處理器是否做出了關(guān)于條件控制變量的值的假設(shè);以及猜測模式歷史,被配置用于在控制變量的值正在被發(fā)送的時(shí)候存儲(chǔ)猜測模式比特。
14.如權(quán)利要求13所述的裝置,其中預(yù)處理器(120)是虛擬機(jī)解釋器(VMI)虛擬機(jī)硬件加速器。
15.如權(quán)利要求13所述的裝置,其中預(yù)處理器(120)進(jìn)一步被配置用于僅猜測地處理可容易地逆轉(zhuǎn)的虛擬機(jī)指令,以及當(dāng)遇到不可容易地逆轉(zhuǎn)的虛擬機(jī)指令的時(shí)候,暫停對于虛擬機(jī)指令的猜測處理,直到接收到條件控制變量的值。
16.如權(quán)利要求15所述的裝置,其中預(yù)處理器(120)進(jìn)一步被配置用于當(dāng)在接收到條件控制變量的值之前暫停猜測處理的時(shí)候,調(diào)度一系列“空操作”指令。
17.如權(quán)利要求15所述的裝置,其中預(yù)處理器(120)進(jìn)一步被配置用于僅猜測地處理代表堆棧操作的虛擬機(jī)指令,以及當(dāng)遇到的虛擬機(jī)指令不是堆棧操作的時(shí)候,暫停對于虛擬機(jī)指令的猜測處理,直到接收到條件控制變量的值。
18.如權(quán)利要求17所述的裝置,其中預(yù)處理器(120)進(jìn)一步被配置用于當(dāng)猜測處理被暫停的時(shí)候調(diào)度一系列“空操作”,并且直到接收到了條件控制變量的值。
全文摘要
虛擬機(jī)解釋器(VMI)硬件加速器使用分支預(yù)測方案對條件分支字節(jié)碼進(jìn)行處理,從而確定是否在等待CPU返回條件控制變量的時(shí)候猜測地處理該字節(jié)碼。在一種分支預(yù)測方案中,如果一個(gè)條件分支字節(jié)碼要求向后跳轉(zhuǎn),那么VMI假設(shè)分支條件將得到滿足,而如果一個(gè)條件分支字節(jié)碼要求向前跳轉(zhuǎn),那么VMI假設(shè)分支條件將不會(huì)得到滿足。在另一種分支預(yù)測方案中,僅當(dāng)條件分支字節(jié)碼要求向后跳轉(zhuǎn)的時(shí)候,VMI才做出假設(shè)。在另一種猜測執(zhí)行方案中,每當(dāng)VMI處理?xiàng)l件分支字節(jié)碼的時(shí)候,它都假設(shè)分支條件將得到滿足。VMI僅猜測地處理可容易地逆轉(zhuǎn)的字節(jié)碼(例如,代表簡單堆棧操作的字節(jié)碼),并且在遇到不可容易地逆轉(zhuǎn)的字節(jié)碼的時(shí)候,VMI暫停對字節(jié)碼的猜測處理。當(dāng)接收到條件控制變量的時(shí)候,由VMI所做的假設(shè)得到確認(rèn)或變?yōu)闊o效。如果假設(shè)變?yōu)闊o效,那么任意被猜測處理的字節(jié)碼都被逆轉(zhuǎn)。
文檔編號(hào)G06F9/45GK1561481SQ02819401
公開日2005年1月5日 申請日期2002年9月9日 優(yōu)先權(quán)日2001年10月2日
發(fā)明者M·M·林德沃特 申請人:皇家飛利浦電子股份有限公司