專利名稱::重啟動翻譯的指令的制作方法
技術(shù)領(lǐng)域:
:本發(fā)明領(lǐng)域數(shù)據(jù)處理系統(tǒng)領(lǐng)域。更準(zhǔn)確地說,本發(fā)明涉及具有用來執(zhí)行第一指令集的指令的一處理器內(nèi)核以及可用來將第二指令集的指令翻譯成適于由該處理器內(nèi)核執(zhí)行的一種形式的一指令翻譯器的數(shù)據(jù)處理系統(tǒng)。提供能結(jié)合具有一本機指令集的一處理器內(nèi)核操作來將非本機指令翻譯成由處理器內(nèi)核執(zhí)行的本機指令的指令翻譯器是公知的。雖然這種方法在擴展一數(shù)據(jù)處理系統(tǒng)的能力方面是很有吸引力的,但它也帶來某些困難和復(fù)雜性。一個這樣的問題是如何處理中斷信號。需要一種能盡可能快速地響應(yīng)中斷信號的處理系統(tǒng)。這在控制實時操作的系統(tǒng)中特別重要。中斷等待時間能是一臨界特性參數(shù)并可使用最糟糕的情形來測量。因此,當(dāng)執(zhí)行本機指令時,基于當(dāng)前正在執(zhí)行本機指令的完成安排響應(yīng)一中斷信號是公知的。在一系統(tǒng)環(huán)境中,其中非本機指令將被翻譯成本機指令,它通常發(fā)生一單個非本機指令可被翻譯成多個本機指令。因此,如果在執(zhí)行表示一單個非本機指令的本機指令序列期間接收到一中斷,那么該非本機指令可僅部分地完成且該處理系統(tǒng)的狀態(tài)可是不確定的。解決這種問題的一個方法是提供在接收到一中斷信號的基礎(chǔ)上被啟動的另外的硬件來存儲該處理系統(tǒng)的當(dāng)前狀態(tài)以便在重啟動前中斷后該狀態(tài)被恢復(fù),因此任何部分完成的非本機指令能被提前完成。然而,這種方法具有導(dǎo)致另外的硬件開銷、重大的另外的復(fù)雜性以及由于需要在提供中斷服務(wù)前保存該處理系統(tǒng)的狀態(tài),從而降低其自身的中斷性能的缺點。另一方法是控制該系統(tǒng)以便非本機指令可被作為最小單元(atomic),即直到一非本機指令完全完成其執(zhí)行后才會提供中斷服務(wù)。該方法又與中斷等待時間沖突。用于指令集間的翻譯的已知系統(tǒng)的例子和其他背景信息可在以下中發(fā)現(xiàn)US-A-5,805,895;US-A-3,955,180;US-A-5,970,242;US-A-5,619,665;US-A-5,826,089;US-A-5,925,123;US-A-5,875,336;US-A-5,937,193;US-A-5,953,520;US-A-6,021,469;US-A-5,568,646;US-A-5,758,115;US-A-5,367,685;IBM技術(shù)公開布告板,March1988,pp308-309,“用于精簡指令集計算機的系統(tǒng)/370模擬器輔助處理器”(IBMTechnicalDisclosureBulletin,March1988,pp308-309,“System/370EmulatorAssistProcessorForaReducedInstructionSetComputer”);IBM技術(shù)公開布告板,March1988,pp548-549,“全功能系列/1指令集模擬器”(IBMTechnicalDisclosureBulletin,July1986,pp548-549,“FullFunctionSeries/1InstructionSetEmulator”);IBM技術(shù)公開布告板,March1994,pp605-606,“在RISC處理器上的實時CISC結(jié)構(gòu)HW模擬器”(IBMTechnicalDisclosureBulletin,March1994,pp605-606,“Real-TimeCISCArchitectureHWEmulatorONARISCProcessor”);IBM技術(shù)公開布告板,March1998,p272,“使用模擬控制塊的性能改進”(IBMTechnicalDisclosureBulletin,March1998,p272,“PerformanceImprovementUsinganEmulationControlBlock”);IBM技術(shù)公開布告板,January1995,pp537-540,“用于精簡指令集計算機/循環(huán)系統(tǒng)模擬的快速指令解碼”(IBMTechnicalDisclosureBulletin,January1995,pp537-540,“FastInstructionDecodeForEmulationonReducedInstructionSetComputer/CyclesSystem”);IBM技術(shù)公開布告板,F(xiàn)ebruary1993,pp231-234,“高性能雙結(jié)構(gòu)處理器”(IBMTechnicalDisclosureBulletin,F(xiàn)ebruary1993,pp231-234,“HighperformanceDualArchitectureProcessor)”;IBM技術(shù)公開布告板,August1989,pp40-43,“系統(tǒng)370I/O通道程序命令字預(yù)取”(IBMTechnicalDisclosureBulletin,August1989,pp40-43,“System/370I/OChannelProgramChannelCommandWordPrefetch”);IBM技術(shù)公開布告板,June19851988,pp305-306,“全微碼控制結(jié)構(gòu)”(IBMTechnicalDisclosureBulletin,June19851988,pp305-306,“FullyMicrocode-ControlledEmulationArchitecture”);IBM技術(shù)公開布告板,March1972,pp3074-3076,“模擬的操作碼和狀態(tài)處理”(IBMTechnicalDisclosureBulletin,March1972,pp3074-3076,“OpCodeandStatusHandlingForEmulation”);IBM技術(shù)公開布告板,August1982,pp954-956,“帶有大系統(tǒng)最常使用的指令和適于碼保持指令的微處理器的芯片上微碼”(IBMTechnicalDisclosureBulletin,August1982,pp954-956,“On-ChipMicrocodingofaMicroprocessorWithMostFrequentlyUsedInstructionofLargeSystemandPrimitivesSuitableforCodingRemainingInstructions”);IBM技術(shù)公開布告板,April1983,pp5576-5577,“模擬指令”(IBMTechnicalDisclosureBulletin,April1983,pp5576-5577,“EmulationInstruction”);系統(tǒng)結(jié)構(gòu)(thebookARMSystemArchitecturebySFurber);計算機結(jié)構(gòu)大量方案(thebookComputerArchitectureAQuantitativeApproachbyHennessyandPatterson);和JAVA虛擬機標(biāo)準(zhǔn)(thebookTheJavaVirtualMachineSpecificationbyTimLindholmandFrankYellin1stand2stEditions)。如果有人認為有人希望在實時應(yīng)用如氣囊控制系統(tǒng)或防鎖制動系統(tǒng)中使用這種系統(tǒng)時,則當(dāng)執(zhí)行非本機指令時實現(xiàn)低中斷等待時間的需要是很突出的,其中最壞情況下中斷等待時間可能是一安全的臨界參數(shù)。從一個方面可以看到,本發(fā)明提供用于處理數(shù)據(jù)的裝置,所述裝置包括一處理器內(nèi)核,用來執(zhí)行由第一指令集的指令指定的操作;一指令翻譯器,用來將第二指令集的指令翻譯成與所述第一指令集的指令一致的翻譯器輸出信號,使用一個或多個輸入變量,所述第二指令集的至少一個指令指定將被執(zhí)行的操作;一中斷處理器,響應(yīng)一中斷信號,在完成一當(dāng)前正在執(zhí)行的操作的執(zhí)行后,中斷與所述第一指令集的指令一致的操作的執(zhí)行;以及重啟動邏輯,用于在所述中斷后重啟動執(zhí)行;其中所述指令翻譯器用來生成與所述第一指令集的指令一致的一組或多組翻譯器輸出信號序列以表示所述第二指令集的所述至少一個指令,每個序列是直到在所述序列中的最后操作被執(zhí)行才改變所述一個或多個輸入變量;以及在執(zhí)行表示所述第二指令集的所述至少一個指令的操作序列間發(fā)生一中斷后(i)如果在開始執(zhí)行所述序列中的最后一個操作前發(fā)生所述中斷,那么所述重啟動邏輯在所述序列中第一操作重啟動執(zhí)行;以及(ii)如果在開始執(zhí)行所述序列中的最后一個操作后發(fā)生所述中斷,那么所述重啟動邏輯在所述序列后的下一指令重啟動執(zhí)行。本發(fā)明允許將非本機指令翻譯成可采取幾種等效的本機指令來執(zhí)行以及在完成與一本機指令一致的一操作后提供中斷服務(wù)而不會在重啟動上引入過分的困難的一種方式。本發(fā)明通過安排翻譯的操作序列不對用于那個操作的輸入變量做任何改變直到最后操作被執(zhí)行為來實現(xiàn)上述目的。因此,如果發(fā)生的中斷先于執(zhí)行最后操作,那么非本機指令能被整個地重啟動同時輸入變量將不變,而如果發(fā)生的中斷在開始最后操作的執(zhí)行后,那么在該發(fā)生的中斷期間最后操作將完成以及重啟動邏輯能從該非本機指令后的下一指令繼續(xù)。應(yīng)當(dāng)理解來自第二(非本機)指令集的指令可被完全翻譯成第一(本機)指令集的指令。然而,也可能來自第二指令集的指令可翻譯成能用與來自第一指令集的指令相同的方式控制處理器內(nèi)核的控制信號的形式。另外的可能性是來自第二指令集的指令可具有超過來自第一指令集的指令的能力以及從第二指令集的指令推導(dǎo)出來的控制信號可控制處理器內(nèi)核的操作,在某種意義上超出由第一指令集的指令提供的功能。應(yīng)當(dāng)理解重啟動邏輯可是一種專用的硬件產(chǎn)品,在本發(fā)明的優(yōu)選實施例中,重啟動邏輯可是指令翻譯器的一部分。指令翻譯器生成控制為非本機指令提供的操作序列的翻譯器輸出信號以及可容易地確定當(dāng)中斷發(fā)生時是否已經(jīng)開始最后操作。該信息因此可容易地提供給指令翻譯器中的重啟動邏輯以便確定是非本機指令整個重啟動還是重啟動下一指令。如果的確發(fā)生一中斷,了解該系統(tǒng)應(yīng)當(dāng)如何被重啟動的一方便的方法是將一指針存儲到一重啟動單元同時該指針基于最后操作的執(zhí)行向前移。該指針可適于指向存儲當(dāng)前正被翻譯的一指令的一存儲單元的一存儲地址的一程序計數(shù)值。同時本發(fā)明也可用于許多不同類型的指令集,當(dāng)?shù)诙噶罴诒4嬖谝欢褩V械亩褩2僮鞔a是指定將被執(zhí)行的一個操作時則特別有用。這種基于系統(tǒng)的堆棧通常從該堆棧讀取它們的輸入操作碼以及將它們的輸出操作碼寫入該堆棧中。當(dāng)仿真這種操作時,本發(fā)明確保堆棧操作碼不被重寫直到執(zhí)行最后操作已經(jīng)開始后為止。用相同的方式,直到執(zhí)行最后操作開始堆棧操作碼才被添加到堆棧中。應(yīng)當(dāng)理解,控制一特定的非本機指令如何執(zhí)行的系統(tǒng)的輸入變量可超過在那個非本機指令中的設(shè)定地公開的操作碼。尤其,周圍的系統(tǒng)狀態(tài)變量可影響一指定的指令如何執(zhí)行,因此,本發(fā)明提供直到最后操作執(zhí)行開始以后才改變此類系統(tǒng)狀態(tài)變量。確保系統(tǒng)狀態(tài)直到最后操作執(zhí)行才被改變的需要在生成有效的翻譯操作序列上可能是一種約束。因此,中斷等待時間可被保存,可影響非本機指令的處理速度。然而,這種效果在系統(tǒng)中可被降低,其中基于處理器內(nèi)核的寄存器通過提供保存在處理器內(nèi)核的寄存器中的堆棧操作碼被映射到與一映射狀態(tài)一致的堆棧位置正在仿真基于指令的堆棧,該映射狀態(tài)直到最后操作被執(zhí)行才被更新,以便輸入操作碼不會被移出該堆棧以及輸出操作碼不被添加到該堆棧中直到最后操作為止,而不會強加太多的約束到可被翻譯的或可獲得的指令類型或翻譯序列的緊密度上。從另一方面來看,本發(fā)明提供處理數(shù)據(jù)的一種方法,所述方法包括步驟執(zhí)行由第一指令集的指令指定的操作;將第二指令集的指令翻譯成與所述第一指令集的指令一致的翻譯器輸出信號,使用一個或多個輸入變量,所述第二指令集的至少一個指令指定將被執(zhí)行的操作;響應(yīng)一中斷信號,在完成一當(dāng)前正在執(zhí)行的操作的執(zhí)行后,中斷與所述第一指令集的指令一致的操作的執(zhí)行;以及在所述中斷后重啟動執(zhí)行;其中所述翻譯步驟生成與所述第一指令集的指令一致的一組或多組翻譯器輸出信號序列以表示所述第二指令集的所述至少一個指令,每個序列是直到在所述序列中的最后操作被執(zhí)行才改變所述一個或多個輸入變量;以及在執(zhí)行表示所述第二指令集的所述至少一個指令的操作序列間發(fā)生中斷后(i)如果在開始執(zhí)行所述序列中的最后一個操作前發(fā)生所述中斷,那么所述重啟動邏輯在所述序列中第一操作重啟動執(zhí)行;以及(ii)如果在開始執(zhí)行所述序列中的最后一個操作后發(fā)生所述中斷,那么所述重啟動邏輯在所述序列后的一下一指令重啟動執(zhí)行。本發(fā)明也提供具有根據(jù)上述技術(shù)能控制通用計算機的計算機程序的計算機程序產(chǎn)品。本發(fā)明的實施例將僅通過例子,參考附圖來說明,其中圖1和2示意性地表示示例性的指令流水線裝置;圖3更詳細地說明一讀取階段裝置;圖4示意性地說明從該提取階段中緩沖指令字中讀取可變長度的非本機指令;圖5示意性地說明用于執(zhí)行處理器內(nèi)核本機指令以及要求翻譯的指令的一數(shù)據(jù)處理系統(tǒng);圖6示意性地說明用于示例性指令序列以及說明用于堆棧操作碼存儲的寄存器內(nèi)容、映射狀態(tài)以及要求翻譯的指令與本機指令間的關(guān)系;圖7示意性地說明作為本機指令序列的一非本機指令的執(zhí)行;圖8是說明指令翻譯器可用保存用于翻譯的指令的中斷等待時間的方式操作的方法的流程圖;圖9示意性地說明使用硬件和軟件技術(shù)將Java字節(jié)碼翻譯成ARM操作碼;圖10示意性地說明基于翻譯器的一硬件、基于翻譯程序的一軟件以及基于調(diào)度的一軟件間的控制的流程;圖11和12說明使用基于方法的一定時器控制調(diào)度操作的另一種方法;以及圖13是說明控制圖12的電路的操作的信號的信號圖。圖1示出了適于用在基于系統(tǒng)的ARM處理器中的第一個示例性的指令流水線30的一種類型。該指令流水線30包括一讀取階段32、一本機指令(ARM/Thumb指令)譯碼階段34、一執(zhí)行階段36、一存儲器存取階段38以及一回寫階段40。該執(zhí)行階段36、存儲器存取階段38以及回寫階段40基本上是常規(guī)的。讀取階段32的下游以及本機指令譯碼階段34的上游,具有一指令翻譯器階段42。該指令翻譯器階段42是將一可變長度的Java字節(jié)碼指令翻譯成本機ARM指令的一有限態(tài)機器。該指令翻譯器階段42能多步操作由此一單個Java字節(jié)碼指令能生成沿剩余的指令流水線30饋送的ARM指令序列來執(zhí)行由Java字節(jié)碼指令指定的操作。簡單的Java字節(jié)碼指令可僅要求一單個的ARM指令來執(zhí)行它們的操作,而更復(fù)雜的Java字節(jié)碼指令或在周圍系統(tǒng)狀態(tài)專用環(huán)境中,需要幾個ARM指令來提供由Java字節(jié)碼指令指定的操作。該多步操作發(fā)生在讀取階段32的下游,因此,基于從一存儲器系統(tǒng)取多個翻譯的ARM指令或Java字節(jié)碼電力不會消耗。Java字節(jié)碼指令用常規(guī)的方式被存儲在存儲器系統(tǒng)中以便不對存儲器系統(tǒng)提出另外的約束從而支持Java字節(jié)碼翻譯操作。如上所述,指令翻譯器階段42具有一分路器通路。當(dāng)不在一指令翻譯模式中操作時,指令流水線30可繞過指令翻譯器階段42并用基本上不變的方式操作來提供譯碼本機指令。在指令流水線30中,指令翻譯器階段42被描述成生成完全表示相應(yīng)的ARM指令的翻譯器輸出信號并通過多路復(fù)用器被傳遞到本機指令譯碼器34。指令翻譯器42也生成可被傳遞給本機指令譯碼器34的一些附加的控制信號。在該本機指令編碼中的位空間約束可將限制強加于由本機指令提定的操作碼的范圍上。這些限制不必由非本機指令共享。附加的控制信號被提供以傳遞從非本機指令推導(dǎo)出的另外的指令指定信號,所述非本機指令不可能在存儲在存儲器中的本機指定中指定。例如,本機指令可僅提供相對低的多位用作本機指令中的立即操作數(shù)字段,而非本機指令可允許擴充的范圍并且這可通過使用另外的控制信號向翻譯的本機指令的本機指令譯碼器外面?zhèn)魉土⒓床僮鲾?shù)的擴充部分被采用,翻譯的本機指令也可被傳遞給本機指令譯碼器34。圖2描述一另外指令流水線44。在該例子中,該系統(tǒng)具有兩個本機指令譯碼器46、48以及一非本機指令譯碼器50。非本機指令譯碼器50在操作中被約束,該操作可由被提供來支持本機指令的執(zhí)行階段52、存儲器階段54以及回寫階段56指定。因此,非本機指令譯碼器50必須有效地將非本機指令翻譯成本機操作(其可是單個的本機操作或本機操作序列),然后,向執(zhí)行階段52提供適當(dāng)?shù)目刂菩盘杹韴?zhí)行一個或多個本機操作。應(yīng)當(dāng)理解,在該例子中,該非本機指令譯碼器不產(chǎn)生形成一本機指令的信號,而是提供指定本機指令(或擴展的本機指令)操作的控制信號。生成的控制信號可與本機指令譯碼器46、48生成的控制信號不匹配。在操作中,由讀取階段58提取的一指令根據(jù)特定的處理模式使用所述的信號分離器被有選擇地提供給指令譯碼器46、48或50中的一個。圖3示意性地詳細描述一指令流水線的讀取階段。取指邏輯60從一存儲器系統(tǒng)提取固定長度指令字并將這些提供給一指令字緩沖器62。該指令字緩沖器62是一個具有兩個端的搖擺緩沖器以便它可存儲一當(dāng)前指令字和一下一指令字。無論何時當(dāng)前指令字已經(jīng)被完全譯碼以及編碼已經(jīng)加在下一指令字上,然后取指邏輯60用來將從存儲器中提取的下一指令字代替前一個當(dāng)前指令字,即,擺動緩沖器的每一端將以一種交叉存取的方法以2遞增連續(xù)存儲的指令字。在所描述的例子中,一Java字節(jié)碼指令最大的指令長度是三字節(jié)。因此,提供三個多路復(fù)用器允許字緩沖器62的任一端的任何三個相鄰字節(jié)被選擇并提供給指令翻譯器64。字緩沖器62以及指令翻譯器64也具有一旁路通路(bypasspath),用在提取并被譯碼本機指令時。將會看到,每個指令字被從存儲器提取一次并存儲在字緩沖器62中。一單個的指令字可具有從其讀出的多個Java字節(jié)碼同時指令翻譯器64執(zhí)行將Java字節(jié)碼翻譯成ARM指令??勺冮L度的本機指令翻譯序列可被生成而不要求多個存儲器系統(tǒng)讀取以及不浪費存儲器資源或?qū)⑵渌s束強加于存儲器系統(tǒng)同時指令翻譯操作可被限制在指令流水線中。一程序計數(shù)值與當(dāng)前正被翻譯的每個Java字節(jié)碼有關(guān)。該程序計數(shù)值沿流水線階段被傳遞以便每個階段能,如果必要的話,使用與它正在處理的特定的Java字節(jié)碼有關(guān)的信息。用于翻譯成多個ARM指令操作序列的一Java字節(jié)碼的該程序計數(shù)值不會遞增直到在那個序列中的最后的ARM指令操作開始被執(zhí)行為止。用繼續(xù)直接指向存儲器中的正在被執(zhí)行的指令的方式保持該程序計數(shù)值簡化該系統(tǒng)的其他方面,如調(diào)試以及分支目標(biāo)計算。圖4示意性地描述從指令緩沖器62讀取可變長度Java字節(jié)碼指令。在第一階段,具有一個長度的一Java字節(jié)碼指令被讀取并被譯碼。下一階段是三個字節(jié)長度以及跨距已經(jīng)從存儲器提取的相鄰指令字間的一Java字節(jié)碼指令。這些指令字均出現(xiàn)在指令緩沖器62中因而指令譯碼和處理不會被所提取的指令字間的一可變長度指令的跨距而延遲。只要已經(jīng)從指令緩沖器62讀出三個Java字節(jié)碼,先前提取的指令字的替換物(refill)可開始同時后續(xù)處理將從已經(jīng)出現(xiàn)的下一指令字繼續(xù)譯碼Java字節(jié)碼。圖4中描述的最后階段描述了正被讀取的第二三字節(jié)碼指令。這再次跨越兩個指令字間。如果在前的指令字還沒有完成其替換,那么讀取的指令可被一流水線停頓延遲直到適當(dāng)?shù)闹噶钭忠呀?jīng)被存儲在指令緩沖器62中為止。在某些實施例中,計時可由于行為類型,流水線永不停頓。應(yīng)當(dāng)理解,特殊的例子是相對的偶爾發(fā)生的例子同時大多數(shù)Java字節(jié)碼比所描述的例子短,因此均跨越指令字間的兩個連續(xù)編碼相對來說是不尋常的。有效信號可用能用信號表示在從其讀出一Java字節(jié)碼前該指令字是否被適當(dāng)?shù)靥鎿Q的方式與指令緩沖器62中的每個指令字相關(guān)聯(lián)。圖5表示包括一處理器內(nèi)核104和一寄存體106的數(shù)據(jù)處理系統(tǒng)102。在指令通路中提供一指令翻譯器108以便將Java虛擬機器指令翻譯成本機ARM指令(或與其相應(yīng)的控制信號),然后將其提供給處理器內(nèi)核104。當(dāng)本機ARM指令正被從可尋址的存儲器中提取時可繞過指令翻譯器108??蓪ぶ反鎯ζ骺墒且淮鎯ζ飨到y(tǒng),諸如具有另外的片外的RAM存儲器的高速緩存存儲器。在存儲器系統(tǒng),特別是高速緩存存儲器的下游提供指令翻譯器108允許高效使用存儲器系統(tǒng)的存儲容量,因為要求翻譯的緊密指令可被存儲在該存儲器系統(tǒng)中并在被傳送給處理器內(nèi)核104前僅立即被擴展為本機指令。在該例子中寄存體106包含十六個通用32位寄存器,在它們中,有四個被分配用于存儲堆棧操作碼,即,用于存儲堆棧操作碼的寄存器組是寄存器R0、R1、R2以及R3。寄存器組可是空的、部分填充堆棧操作碼或完全填充堆棧操作碼。當(dāng)前保存堆棧操作碼的頂端的特定的寄存器可是寄存器組中的任何一個寄存器。因此,應(yīng)當(dāng)理解指令翻譯器可在當(dāng)所有寄存器為空時的一個狀態(tài)以及四組的四個狀態(tài)一致的十七個不同映射狀態(tài)的任何一個中,四組的四個狀態(tài)的每一個與保存在寄存器組中的各個不同的若干堆棧操作碼一致并具有保存堆棧操作碼的頂端的一個不同的寄存器。表1表示用于指令翻譯器108的該狀態(tài)映射的十七種不同的狀態(tài)。應(yīng)當(dāng)理解為堆棧操作碼存儲所分配的不同的若干寄存器,或由于特定存儲器內(nèi)核具有的約束,它能處理存儲在寄存器中的數(shù)據(jù)值,映射狀態(tài)可非常依賴于特定的實現(xiàn)以及Tabel1僅作為一個特定實現(xiàn)的例子。狀態(tài)0000R0=EMPTYR1=EMPTYR2=EMPTYR3=EMPTY狀態(tài)00100狀態(tài)01000狀態(tài)01100狀態(tài)10000R0=TOSR0=TOSR0=TOSR0=TOSR1=EMPTYR1=EMPTYR1=EMPTYR1=TOSR2=EMPTYR2=EMPTYR2=TOS-2R2=TOS-2R3=EMPTYR3=TOS-1R3=TOS-1R3=TOS-1狀態(tài)00101狀態(tài)01001狀態(tài)01101狀態(tài)10001R0=EMPTYR0=TOS-1R0=TOS-1R0=TOS-1R1=TOSR1=TOSR1=TOSR1=TOSR2=EMPTYR2=EMPTYR2=EMPTYR2=TOS-3R3=EMPTYR3=EMPTYR3=TOS-2R3=TOS-2狀態(tài)00110狀態(tài)01010狀態(tài)01110狀態(tài)10010R0=EMPTYR0=EMPTYR0=TOS-2R0=TOS-2R1=EMPTYR1=TOS-1R1=TOS-1R1=TOS-1R2=TOSR2=TOSR2=TOSR2=TOSR3=EMPTYR3=EMPTYR3=EMPTYR3=TOS-3狀態(tài)00111狀態(tài)01011狀態(tài)01111狀態(tài)10011R0=EMPPTYR0=EMPTYR0=EMPTYR0=TOS-3R1=EMPTYR1=EMPTYR1=TOS-2R1=TOS-2R2=EMPTYR2=TOS-1R2=TOS-1R2=TOS-2R3=TOSR3=TOSR3=TOSR3=TOS表1在表1中,可以看到前三位狀態(tài)值表示寄存器組中非空寄存器的數(shù)量。后兩位狀態(tài)值表示保存堆棧操作碼的頂端的寄存器號。這樣,該狀態(tài)值可被輕易用來控制一硬件翻譯器或一軟件翻譯程序的操作來考慮當(dāng)前占用的寄存器組以及堆棧操作碼的頂端的當(dāng)前位置。如圖5中所示,Java字節(jié)碼J1、J2、J3流從可尋址存儲器系統(tǒng)被送入指令翻譯器108。然后指令翻譯器108根據(jù)該輸入的Java字節(jié)碼以及該指令翻譯器8的瞬時映射狀態(tài)以及其他變量輸出ARM指令流(或等效的控制信號,或者擴展)。所描述的例子表示Java字節(jié)碼J1可被映射成ARM指令A(yù)11和A12。Java字節(jié)碼J2映射成ARM指令A(yù)21、A22以及A23。最后,Java字節(jié)碼J3映射成ARM指令A(yù)31。每個Java字節(jié)碼可要求一個或多個堆棧操作碼作為輸入以及可產(chǎn)生一個或多個堆棧操作碼作為一輸出。假定在該例子中處理器內(nèi)核104是具有一載入/存儲結(jié)構(gòu)的一ARM處理器內(nèi)核,由此僅保存在寄存器中的數(shù)據(jù)值可被處理,指令翻譯器108被安排來生成ARM指令,按照需要,將所需的堆棧操作碼在它們被處理前裝入寄存器組或存儲到寄存器組中任何保存堆棧操作碼的可尋址存儲器以便為可被生成的最后堆棧操作碼騰位。應(yīng)當(dāng)理解,每個Java字節(jié)碼可被認為具有表示堆棧操作碼的數(shù)量的一個相關(guān)的“要求滿(requirefull)”值,這些操作碼在其執(zhí)行前必須出現(xiàn)在寄存器組中以及表示寄存器組中空寄存器數(shù)量的一個“要求空(requireempty)”值,這些寄存器在執(zhí)行表示Java操作碼的ARM指令執(zhí)行前必須有效。表2描述最初映射狀態(tài)值,要求滿值、最后狀態(tài)值以及相關(guān)的ARM指令間的關(guān)系。最初狀態(tài)值以及最后狀態(tài)值與表1中描述的映射狀態(tài)一致。指令翻譯器108確定與它正在翻譯的特定Java字節(jié)碼(操作碼)有關(guān)的一要求滿值。指令翻譯器108,根據(jù)它的最初映射狀態(tài),確定多個堆棧操作碼是否需要在執(zhí)行Java字節(jié)碼前載入寄存器組。表1示出了使用相關(guān)的ARM指令(LDR指令)和如在堆棧高速緩存載入操作后將被采用的最后映射狀態(tài)來確定堆棧操作碼是否需要被載入寄存器組中最初狀態(tài)以及應(yīng)用到Java字節(jié)碼的要求滿值的測試和最后映射狀態(tài)。實際上,如果不至一個堆棧操作碼需要在執(zhí)行Java字節(jié)碼前被載入寄存器組,那么多個映射狀態(tài)翻譯將會發(fā)生,每個具有一相關(guān)的ARM指令,ARM指令將堆棧操作碼載入寄存器組的一個寄存器中。在不同的實施例中,可能在一單個狀態(tài)翻譯中載入多個堆棧操作碼并因此使映射狀態(tài)改變超過表2中所示以外。最初狀態(tài)要求滿最后狀態(tài)動作00000>000100LDRR0,[Rstack,#-4]!00100>101000LDRR3,[Rstack,#-4]!01001>201101LDRR3,[Rstack,#-4]!01110>310010LDRR3,[Rstack,#-4]!01111>310011LDRR0,[Rstack,#-4]!01100>310000LDRR1,[Rstack,#-4]!01101>310001LDRR2,[Rstack,#-4]!01010>201110LDRR0,[Rstack,#-4]!01011>201111LDRR1,[Rstack,#-4]!01000>201100LDRR2,[Rstack,#-4]!00110>101010LDRR1,[Rstack,#-4]!00111>101011LDRR2,[Rstack,#-4]!00101>101001LDRR0,[Rstack,#-4]!表2從表2可以看出,載入存儲堆棧操作碼的寄存器組中的一新的堆棧操作碼將形成堆棧操作碼的新的頂端以及根據(jù)最初狀態(tài)將被載入寄存器組中的特定的一個寄存器。表3用相同的方法表示最初狀態(tài)、要求空值、最后狀態(tài)以及相關(guān)的ARM指令的關(guān)系,該ARM指令用于清空寄存器組中的一個寄存器以便如果一特定的Java字節(jié)碼的要求空值表示有必要在Java字節(jié)碼執(zhí)行前給出該最初狀態(tài),在最初狀態(tài)和最后狀態(tài)間移動。存儲于具有一STR指令的可尋址存儲器的該特定的寄存器值將隨哪一寄存器是堆棧操作碼的當(dāng)前的頂端而改變。起始狀態(tài)要求空最后狀態(tài)動作00100>300000STRR0[Rstack],#401001>200101STRR0[Rstack],#401110>101010STRR0[Rstack],#410011>001111STRR0[Rstack],#410000>001100STRR1[Rstack],#410001>001101STRR2[Rstack],#410010>001110STRR3[Rstack],#401111>101011STRR1[Rstack],#401100>101000STRR2[Rstack],#401101>101001STRR3[Rstack],#401010>200110STRR1[Rstack],#401011>200111STRR2[Rstack],#401000>200100STRR3[Rstack],#400110>300000STRR2[Rstack],#400111>300000STRR3[Rstack],#400101>300000STRR1[Rstack],#4表3應(yīng)當(dāng)理解在上面描述的典型的系統(tǒng)中,要求滿和要求空狀態(tài)是相互排斥的,即在任何結(jié)定時間對一特定的Java字節(jié)碼來說只有要求滿或要求空要求中的一個是真的,該Java字節(jié)碼是指令翻譯器正試圖翻譯的。指令翻譯器108使用的指令模板以及被選擇來支持硬件指令翻譯器108的指令被選擇以便可滿足相互排斥的要求。如果該要求不適當(dāng),那么該情形可出現(xiàn),其中要求大量輸入堆棧操作碼出現(xiàn)在寄存器組中的一特定的Java字節(jié)碼不允許在執(zhí)行表示該Java字節(jié)碼的指令后足夠的空寄存器是有效的以允許執(zhí)行結(jié)果被存儲在所要求的寄存器中。應(yīng)當(dāng)理解一給定的Java字節(jié)碼將具有表示用掉的堆棧操作碼的數(shù)量和在執(zhí)行那個Java操作碼的基礎(chǔ)上生成的堆棧操作碼的數(shù)量間的差值的一總的基本的堆棧動作。由于用掉的堆棧操作碼的數(shù)量是在執(zhí)行前的一個必要條件以及生成的堆棧操作碼是執(zhí)行后的一個必要條件,與每個Java字節(jié)碼有關(guān)的要求滿以及要求空值必須在那個字節(jié)碼執(zhí)行前被滿足,即使基本的總動作本身是被滿足的。表4描述一最初狀態(tài)、一整體堆棧動作、一最后狀態(tài)以及在寄存器使用和堆棧操作碼(TOS)頂端的相對位置中的改變的關(guān)系。可能在表2或表3中描述的一個或多個狀態(tài)翻譯需要在執(zhí)行表4中所述的狀態(tài)翻譯前執(zhí)行以便根據(jù)該Java字節(jié)碼的要求滿和要求空值建立對一給定Java字節(jié)碼的預(yù)處理。最初狀態(tài)堆棧動作最后狀態(tài)動作00000+100101R1<-TOS00000+200101R1<-TOS-1,R2<-TOS00000+300101R1<-TOS-2,R2<-TOS-1,R3<-TOS00000+400101R0<-TOS,R1<-TOS-3,R2<-TOS-2,R3<-TOS-100100+101001R1<-TOS00100+201110R1<-TOS-1,R2<-TOS00100+310011R1<-TOS-2,R2<-TOS-1,R3<-TOS00100-100000R0<-EMPTY01001+101110R2<-TOS01001+210011R2<-TOS-1,R3<-TOS01001-100100R1<-EMPTY01001-200000R0<-EMPTY,R1<-EMPTY01110+110011R3<-TOS01110-101001R2<-EMPTY01110-200100R1<-EMPTY,R2<-EMPTY01110-300000R0<-EMPTY,R1<-EMPTY,R2<-EMPTY10011-101110R3<-EMPTY10011-201001R2<-EMPTY,R3<-EMPTY10011-300100R1<-EMPTY,R2<-EMPTY,R3<-EMPTY10011-400000R0<-EMPTY,R1<-EMPTY,R2<-EMPTY,R3<-EMPTY10000-101111R0<-EMPTY10000-201010R0<-EMPTY,R3<-EMPTY10000-3001001R0<-EMPTY,R2<-EMPTY,R3<-EMPTY10000-400000R0<-EMPTY,R1<-EMPTY,R2<-EMPTY,R3<-EMPTY10001-101100R1<-EMPTY10001-201011R0<-EMPTY,R1<-EMPTY10001-300110R0<-EMPTY,R1<-EMPTY,R3<-EMPTY10001-400000R0<-EMPTY,R1<-EMPTY,R2<-EMPTY,R3<-EMPTY10010-101101R2<-EMPTY10010-201000R1<-EMPTY,R2<-EMPTY10010-300111R0<-EMPTY,R1<-EMPTY,R2<-EMPTY10010-400000R0<-EMPTY,R1<-EMPTY,R2<-EMPTY,R3<-EMPTY01111+110000R0<-TOS01111-101010R3<-EMPTY01111-200101R2<-EMPTY,R3<-EMPTY01111-300000R1<-EMPTY,R2<-EMPTY,R3<-EMPTY01100+110001R1<-TOS01100-101011R3<-EMPTY01100-200110R2<-EMPTY,R3<-EMPTY01100-300000R1<-EMPTY,R2<-EMPTY,R3<-EMPTY01101+110010R2<-TOS01101-101000R1<-EMPTY01101-200111R0<-EMPTY,R1<-EMPTY01101-300000R0<-EMPTY,R1<-EMPTY,R3<-EMPTY01010+101111R3<-TOS01010+210000R3<-TOS-1,R0<-TOS01010-100101R2<-EMPTY01010-200000R1<-EMPTY,R2<-EMPTY01011+101100R0<-TOS01011+210001R0<-TOS-1,R1<-TOS01011-100110R3<-EMPTY01011-200000R2<-EMPTY,R3<-EMPTY01000+101101R1<-TOS01000+210010R1<-TOS-1,R2<-TOS01000-100111R0<-EMPTY01000-200000R0<-EMPTY,R3<-EMPTY00110+101011R3<-TOS00110+201100R0<-TOS,R3<-TOS-100110+310001R1<-TOS,R0<-TOS-1,R3<-TOS-200110-100000R2<-EMPTY00111+101000R0<-TOS00111+201101R0<-TOS-1,R1<-TOS00111+310010R0<-TOS-2,R1<-TOS-1,R2<-TOS00111-100000R3<-EMPTY00101+101010R2<-TOS00101+201111R2<-TOS-1,R3<-TOS00101+310000R2<-TOS-2,R3<-TOS-1,R1<-TOS00101-100000R1<-EMPTY表4應(yīng)當(dāng)理解在表2、表3以及表4中描述的狀態(tài)和條件間的關(guān)系可被組合成一單個的狀態(tài)翻譯表或狀態(tài)圖,但它們可分別表示有助于清楚。不同狀態(tài)、條件以及基本動作間的關(guān)系可被用來定義一硬件狀態(tài)機(有限態(tài)機器的形式),用于控制指令翻譯器108的操作方面。另外,這些關(guān)系可通過軟件或硬件和軟件的組合被模擬。以下是可能的Java字節(jié)碼的子集的例子,該例子表示對該子集的每個Java字節(jié)碼來說,用于那個字節(jié)碼的相關(guān)的要求滿、要求空以及堆棧動作值,該字節(jié)碼可結(jié)合表2、3和4使用。<prelisting-type="program-listing"><![CDATA[ ---iconst0 操作Pushintconstant 堆棧…=> …,0 Require-Full=0 Require-Empty=1 Stack-Action=+1 ---iadd 操作Addint 堆?!?,valuel,value2=> …,result Require-Full=2 Require-Empty=0 Stack-Action=-1 ---lload_0 操作Loadlongfromlocalvariable 堆?!剑尽 ?,value.wordl,value.word2 Require-Full=0 Require-Empty=2 Stack-Action=+2 ---lastore 操作Storeintolongarray堆?!琣rrayref,index,value.word1,value.word2=> Require-Full=4 Require-Empty=0 Stack-Action=-4 ---land 操作BooleanAndlong 堆?!瑅alue.word1,value.word2,value2.word1, …,result.word1,result.word2 Require-Full=4 Require-Empty=0 Stack-Action=-2 ---iastore 操作Storeintointarray 堆?!琣rrayref,index,value=> Require-Full=3 Require-Empty=0 Stack-Action=-3 ---ineg 操作Negateint 堆?!瑅alue=> …,result Require-Full=1 Require-Empty=0 Stack-Action=0]]></pre>上面給出了用于每個Java字節(jié)碼指令的示例性的指令模板。所示的指令是實現(xiàn)每個Java字節(jié)碼的所要求的行為的ARM指令。寄存器字域“TOS-3”、“TOS-2”、“TOS-1”、“TOS”、“TOS+1”以及“TOS+2”可根據(jù)當(dāng)前采用的映射狀態(tài)用從表1讀出的適當(dāng)?shù)募拇嫫髡f明符代替。符號“TOS+n”表示從存儲堆棧操作碼的頂端的寄存器開始并向上計算寄存器值直到寄存器組未的寄存器的當(dāng)前存儲堆棧操作碼的頂端的寄存器上的第N個寄存器,在指向一約束(wrap)的寄存器組未被指向該寄存器組中的第一寄存器。<prelisting-type="program-listing"><![CDATA[ iconst_0MOVtos+1,#0 lload_0LDRtos+2,[vars,#4] LDRtos+1,[vars,#4] iastoreLDRRtmp2,[tos-2,#4] LDRRtmp1,[tos-2,#0] CMPtos-1,Rtmp2,LSR#5 BLXCSRexc STRtos,[Rtmp1,tos-1,LSL#2] lastoreLDRRtmp2,[tos-3,#4] LDRRtmp1,[tos-3,#0] CMPtos-1,Rtmp2,LSR#5 BLXCSRexc STRtos-1,[Rtmp1,tos-2,LSL#3]! STRtos,[Rtmp1,#4] iaddADDtos-1,tos-1,tos inegRSBtos,tos,#0 landANDtos-2,tos-2,tos ANDtos-3,tos-3,tos-1]]></pre>根據(jù)所描述的技術(shù),下面描述一單個Java字節(jié)碼的示例性的由硬件翻譯單元108執(zhí)行的執(zhí)行序列。執(zhí)行序列按最初狀態(tài)顯示,根據(jù)正被執(zhí)行的指令執(zhí)行狀態(tài)序列,生成ARM指令序列作為在每個狀態(tài)翻譯上正被執(zhí)行的動作結(jié)果,整體具有將一Java字節(jié)碼翻譯成一RAM指令序列的結(jié)果。<prelisting-type="program-listing"><![CDATA[ Initiaistate00000 Instructioniadd(Reguire-Full=2,Require-Empty=0,Stack-Action=-1) ConditionRequire-Full>0 StateTransition00000>000100 ARMInstruction(s) LDRR0,[Rstack,#-4]!Nextstate00100 Instructioniadd(Require-Full=2Require-Empty=0,Stack-Action=-1) ConditionRequite-Full>1 StateTransition00100>101000 ARMInstructions(s) LDRR3,[Rstack,#-4]! Nextstate01000 Instructioniadd(Require-Full-2,Require-Empty=0,Stack-Action=-1) ConditionStack-Action=-1 StateTransition01000-100111 Instructiontemplate ADDtos-1,tos-1,tos ArmInstructions(s)(aftersubstitution) ADDR3,R3,R0 Nextstate00111]]></pre>圖6用不同的方法描述執(zhí)行多個另外的Java字節(jié)碼指令。圖6的上面部分描述ARM指令序列以及映射狀態(tài)的改變以及在執(zhí)行一iadd字節(jié)碼指令時發(fā)生的寄存器內(nèi)容。最初映射狀態(tài)是寄存器組中的所有為空的寄存器一致的00000。所生成的前兩個ARM指令用來將兩個堆棧操作碼彈入存儲堆棧操作碼的具有堆棧“TOS”寄存器的頂端的為R0的寄存器中。第三個ARM指令實際上執(zhí)行添加操作以及將結(jié)果寫入寄存器R3(其現(xiàn)在為堆棧操作碼的頂端)同時使用先前用掉保存在寄存器R1中的堆棧操作碼,從而產(chǎn)生一整個堆棧操作-1。然后,處理進行到執(zhí)行兩個Java字節(jié)碼,每個Java字節(jié)碼表示兩個堆棧操作碼的一長載荷。用于第一Java字節(jié)碼的為2的要求空條件被立即滿足并且得出和執(zhí)行相應(yīng)的兩個ARMLDR指令。在執(zhí)行第一長載荷Java字節(jié)碼后映射狀態(tài)為01101。在這種狀態(tài)下,寄存器組僅包括一單個的空寄存器。下一Java字節(jié)碼長載荷指令具有為2的要求空值,為2的要求空值不被滿足,因此所要求的第一動作是使用ARMSTR指令將一堆棧操作碼壓入可尋址存儲器。這釋放了由一個新的堆棧操作碼使用的寄存器組中的一個寄存器,然后,該操作碼可作為兩個隨后的LDR指令的一部分被載入。如上所述,指令翻譯可通過硬件、軟件或兩者的結(jié)合來實現(xiàn)。假定下面是根據(jù)上面描述的技術(shù)生成的一示范性的軟件翻譯程序的一部分。<prelisting-type="program-listing"><![CDATA[ InterpretLDRBRtmp,[Rjpc,#1]! LDRpc,[pc,Rtmp,lsl#2] DCD0 … DCDdo_iconst_0;Opcode0x03 … DCOdo_lload_0;Opcode0x1e … DCDdo_iastore;Opcode0x4f DCDdo_lastore;Opcode0x50 … DCDdo_iadd;Opcode0x60 … DCDdo_ineg;Opcode0x74 … DCDdo_land;Opcode0x7f do_iconst_0MOVR0,#0 STRR0,[Rstack],#4 BInterpret do_lload_0LDMIARvars,{R0,R1} STMIARstack!,{R0,R1} BInterpret do_iastoreLDMDBRstack!,{R0,R1,R2} LDRRtmp2,[r0,#4] LDRRtmp1,[r0,#0] CMPR1,Rtmp2,LSR#5 BCSArrayBoundException STRR2,[Rtmp1,R1,LSL#2]BInterpret do_lastoreLDMDBRstack!,{R0,R1,R2,R3} LDRRtmp2,[r0,#4] LDRRtmp1,[r0,#0] CMPR1,Rtmp2,LSR#5 BCSArrayBoundException STRR2,[Rtmp1,R1,LSL#3]! STRR3,[Rtmp1,#4] BInterpret do_iaddLDMDBRstack!,{r0,r1} ADDr0,r0,r1 STRr0,[Rstack],#4 BInterPret do_inegLDRr0,[Rstack,#-4]! RSBtos,tos,#0 STRr0,[Rstack],#4 BInterpret do_landLDMDBRstack!,{r0,r1,r2,r3} ANDr1,r1,r3 ANDr0,r0,r2 STMIARstack!,{10,r1} BInterpret State_00000_InterPretLDRBRtmp,[Rjpc,#1]! LDRpc,[pc,Rtmp,lsl#2] DCD0 DCDState_00000_do_iconst_0;Opcode0x03 DCDState_00000_do_lload_0;Opcode0x1e DCDState_00000_do_iastore;0pcode0x4f DCDState_00000_do_lastore;Opcode0x50 DCDState_00000_do_iadd;Opcode0x60 DCDState_00000_do_ineg;Opcode0x74DCDState_00000_do_land;Opcode0x7f State_00000_do_iconst_0MOVR1,#0 BState_00101_Interpret RSBr1,r1,#0 BState_00101_Interpret State_00000_do-landLDRr0[Rstack.#-4]! LDMDBRstack!,{r1,r2,r3) ANDr2,r2,r0 ANDr1,r1,r3 BState_01010_Interpret State_00100_InterPretLDRBRtmp,[Rjpc,#1]! LDRpc,[pc,Rtmp,lsl#2] DCD0 DCDState_00100_do_iconst-0;Opcode0x03 DCDState_00100_d0_lload_0;Opcode0x1e DCDState_00100_do_iastore;Opcode0x4f DCDState_00100_do_lastore;0pcode0x50 DCDState_00100_do_iadd;Opcode0x60 DCDState_00100_do_ineg;0pcode0x74 DCDState_00100_do_land;Opcode0x7f State_00100_dO_iconst_0MOVR1,#0 BState_01001_InterPret State_00100_do_lload_0LDMIARvars,{r1,R2} BState-01110_Interpret State_00100_do_iastoreLDMDBRstack!,{r2,r3} LDRRtmp2,[r2,#4] LDRRtmp1,[r2,#0]CMPR3,Rtmp2,LSR#5 BCSArrayBoundException STRR0,[Rtmp1,R3,lsl#2] BState_00000_Interpret State_00100_do_lastoreLDMDBRstack!,{r1,r2,r3} LDRRtmp2,[r1,#4] LDRRtmp1,[r1,#0] CMPr2,Rtmp2,LSR#5 BCSAsrayBoundException STRr3,[Rtmp1,r2,lsl#3]! STRr0,[Rtmp1,#4] BState_00000_Interpret State_00100_do_iaddLDRI3,[Rstack,#-4]! ADDr3,r3,r0 BState_00111_InterPret State_00100_do_inegRSBr0,r0,#0 BState_00100_InterPret State_0100_do_landLDMDBRstack!,{r1,r2,r3} ANDr2,r2,r0 ANDr1,r1,r3 BState_01010_Interpret State_01000_InterpretLDRBRtmp,[Rjpc,#1]! LDRpc,[pc,Rtmp,lsl#2] DCD0 DCDState_01000_do_iconst_0;Opcode0x03 DCDState_01000_do_lload0;0pcode0x1e DCDState_01000_do_iastore;Opcode0x4f DCDState_01000_do_lastore;Opcode0x50 DCDState_01000_do_iadd;Opcode0x60DCDState_01000_do_ineg;Opcode0x74 DCDState_01000-do_land;Opcode0x7f State01000_do_iconst_0MOVR1,#0 BState_01101_Interpret State_01000_do_lload_0LDMIARvars,{r1,r2} BState_10010_InterPret State_01000_do_iastoreLDRr1,[Rstack,#-4]! LDRRtInP2,[R3,#4] LDRRtIUP1,[R3,#01 CMPr0,Rtmp2,LSR#5 BCSAsrayBounasxception STRr1,[Rtmp1,r0,lsl#2] BState_00000_Interpret State_01000_do_lastoreLDMDBRstaCk!,{r1,r2} LDRRtmp2,{r3,#4} LORRtmp1,{R3,#0} CMPr0,Rtmp2,LSR#5 BCSArrayBoundException STRr1,[Rtmp1,r0,lsl#3]! STRr2,[Rtmp1,#4] BState_00000_Interpret State_01000_do_iaddADDr3,r3,r0 BState_00111_Interpret State_01000_do_inegRSBr0,r0,#0 BState-01000_Interpret State_01000_do_landLDMDBRstack!,{r1,r2} ANDR0,R0,R2 ANDR3,R3,R1]]></pre>圖7描述一Java字節(jié)碼指令“l(fā)aload”,該指令具有從堆棧位置的頂端開始的由兩個數(shù)據(jù)字指定的一數(shù)據(jù)組中讀取兩個數(shù)據(jù)字的功能。然后從該數(shù)據(jù)組中讀取的兩個字替換指定它們的位置的兩個字并形成最頂端的堆棧入口。為使“l(fā)aload”指令具有足夠的寄存器空間用于暫時存儲從該數(shù)組中提取的堆棧操作碼而不重寫指定該數(shù)組和該數(shù)據(jù)組中的單元的輸入操作碼,該Java字節(jié)碼指令被指定為具有為2的要求空值,即專用于堆棧操作碼存儲的寄存體中的兩個寄存器必須在執(zhí)行仿真“l(fā)aload”指令的ARM指令前必須被清空。如果當(dāng)該Java字節(jié)碼被沖突時沒有兩個空的寄存器,那么可執(zhí)行存儲操作(STRs)來將當(dāng)前保存在寄存器中的堆棧操作碼推出存儲器以便為臨時存儲需要騰出空位并符合用于該指令的要求空值。指令還具有為2的要求滿值因為該數(shù)據(jù)地址是由一數(shù)組單元和那個數(shù)組中的一索引指定作為兩個分開的堆棧操作碼。該圖表示第一狀態(tài)已經(jīng)滿足要求滿或要求空狀態(tài)并具有一“01001”的映射狀態(tài)。該“l(fā)aload”指令被分成三個ARM指令。這些中的第一個將數(shù)組子串引用載入寄存器組外的作為堆棧操作碼的一寄存器高速緩存器的一備用的工作寄存器。然后第二指令使用該數(shù)組子串引用結(jié)合該數(shù)組中的一索引值來訪問第一數(shù)組字,該數(shù)組字被寫入專用于堆棧操作碼存儲的一個空寄存器。應(yīng)當(dāng)特別注意在執(zhí)行前兩個ARM指令后,該系統(tǒng)的映射狀態(tài)沒有改變且堆棧指針的頂端仍然在以所指定為空的寄存器開始的地方。在ARM指令序列中的最后指令將第二數(shù)組字載入用于存儲堆棧操作碼的寄存器組中。由于這是最后指令,如果在這期間的確有一中斷發(fā)生,那么直到該指令完成才會提供該中斷,因此用該指令通過改變存儲堆棧操作碼的寄存器的映射狀態(tài)的一改變能安全地改變該輸入狀態(tài)。在該例子中,映射狀態(tài)改變?yōu)樵诘诙?shù)組字中放置堆棧指針的新的頂端以及表示數(shù)據(jù)引用的輸入變量以及索引值現(xiàn)有均為空寄存器的“01011”,即,標(biāo)記這些寄存器為空與從保存它們的堆棧中移出這些值等效。應(yīng)當(dāng)注意“l(fā)aload”指令的整個堆棧動作沒有改變保存在寄存器中的堆棧操作碼的數(shù)量的同時,一映射狀態(tài)交換仍然發(fā)生?;趫?zhí)行的最后操作所執(zhí)行的映射狀態(tài)的改變被硬連線到指令翻譯器作為被翻譯的Java字節(jié)碼的函數(shù)并且由“swap”參數(shù)表示,“swap”參數(shù)表示為“l(fā)aload”指令的特性。雖然該圖的例子是一特殊的指令,應(yīng)當(dāng)理解,所提出的原理可被擴展到被仿真為ARM指令或其他類型的指令的許多不同的Java字節(jié)碼指令。圖8是示意地說明上述技術(shù)的流程圖。在步驟10,從存儲器提取Java字節(jié)碼。在步驟12,用于那個Java字節(jié)碼的要求滿和要求空值被檢查。如果既不符合要求空也不符合要求滿條件,那么堆棧操作碼(可能是多個堆棧操作碼)的各自的PUSH和POS操作可用步驟14和16執(zhí)行。應(yīng)當(dāng)注意該特定的系統(tǒng)不允許同時不滿足要求空和要求滿條件。通過步驟14和16的多個通路可被要求直到步驟12的條件滿足為止。在步驟18,選擇在用于Java字節(jié)碼有關(guān)的翻譯模板中指定的第一個ARM指令。在步驟20,做一核對以便確定所選擇的ARM指令是否是在步驟10提取的Java字節(jié)碼的仿真中被執(zhí)行的最后指令。如果被執(zhí)行的ARM指令是最后指令,那么步驟21用來更新程序計數(shù)值以指向?qū)⒈粓?zhí)行的指令序列中的下一Java字節(jié)碼。應(yīng)當(dāng)理解,如果ARM指令是最后指令,那么它將完成其執(zhí)行,而不管現(xiàn)在是否發(fā)生中斷,因此,它能安全地更新下一Java字節(jié)碼的程序計數(shù)值并從那一點重啟動執(zhí)行,因為系統(tǒng)的狀態(tài)將達到該Java字節(jié)的匹配標(biāo)準(zhǔn)、不中斷、全執(zhí)行。如果在步驟20的測試表示還未到最后字節(jié)碼,那么將忽略程序計數(shù)值的更新。步驟22執(zhí)行當(dāng)前的ARM指令。在步驟24,做一測試以便確定是否還有要求作為模擬的一部分執(zhí)行的ARM指令。如果還有ARM指令,那么在步驟26選擇它們中的一個并返回步驟20處理。如果沒有另外的指令,那么處理進入步驟28,在該步驟,為相關(guān)的Java字節(jié)碼指定的任何映射改變/交換被執(zhí)行以便反映堆棧單元的所需頂端以及保存堆棧操作碼的不同寄存器的全/空狀態(tài)。圖8也示意地描述這些點,在這些點上如果確定一中斷是有用的,那么在一中斷后處理重啟動。一中斷開始在執(zhí)行當(dāng)前的ARM指令后在步驟22被使用以及無論被存儲為具有字節(jié)碼序列的返回點的當(dāng)前程序計數(shù)值是什么,那么步驟21將僅更新程序計數(shù)值,因此這將指向下一Java字節(jié)碼(或ARM指令應(yīng)當(dāng)使指令集翻譯正好被啟動)。如果當(dāng)前執(zhí)行的ARM指令是除序列中最后指令外的任何指令,那么程序計數(shù)值將仍然與在開始執(zhí)行相關(guān)Java字節(jié)碼所表示的相同,因此,當(dāng)返回時,整個Java字節(jié)碼將被重新執(zhí)行。圖9描述接收Java字節(jié)碼和輸出翻譯后的ARM指令流(或相應(yīng)的控制信號)以控制處理器內(nèi)核的動作的Java字節(jié)碼翻譯單元68。如前所述,Java字節(jié)碼翻譯器68使用指令模板將簡單的Java字節(jié)碼翻譯成ARM指令或ARM指令序列。當(dāng)每個Java字節(jié)碼已經(jīng)被執(zhí)行時,那么在調(diào)度控制邏輯70中的計數(shù)值被減少。當(dāng)該計數(shù)值到達0時,那么Java字節(jié)碼翻譯單元68將一ARM指令分支發(fā)布給適當(dāng)管理線程或任務(wù)間的調(diào)度的調(diào)度碼。雖然簡單的Java字節(jié)碼是由提供基于這些字節(jié)碼的執(zhí)行的高速硬件的Java字節(jié)碼翻譯單元68本身處理,要求更復(fù)雜的處理操作的字節(jié)碼被發(fā)送到以解釋程序(如在本說明書中前面提出的那些例程的選擇)集合的形式提供的軟件解釋程序。更準(zhǔn)確地說,Java字節(jié)碼翻譯單元68能確定它已經(jīng)接收的字節(jié)碼不是由硬件翻譯器所支持的那一個,因此,可根據(jù)那個Java字節(jié)碼對一地址做一分支,在該地址用于翻譯那個字節(jié)碼的軟件例程被發(fā)現(xiàn)或引用。當(dāng)調(diào)度邏輯70表示需要調(diào)度操作來產(chǎn)生對該調(diào)度碼的分支時可使用該機理。圖10更詳細地描述圖9的實施例的操作和硬件和軟件間的任務(wù)分離。在步驟72由Java字節(jié)碼翻譯單元68接收所有Java字節(jié)碼并使計數(shù)遞減。在步驟74,核對計數(shù)值是否已經(jīng)到0,如果計數(shù)值已經(jīng)為0(從硬連線到該系統(tǒng)的預(yù)定值或可由用戶控制的/編程的值遞減計數(shù)),那么在步驟76對調(diào)度碼做一分支。只要在步驟76高度碼已經(jīng)完成,控制被返回到該硬件以及處理進入步驟72,在該處,提取下一Java字節(jié)碼以及計數(shù)再次遞減。由于計數(shù)到達0,那么它現(xiàn)在將重新面臨一個新的、非零值。另外,新值可被迫進入計數(shù)同時在步驟76退出調(diào)度過程。如果在步驟74的測試表示計數(shù)不等于0,那么步驟78提取Java字節(jié)碼。在步驟80,確定提取的字節(jié)碼是否是在步驟82可由硬件翻譯執(zhí)行的一簡單的字節(jié)碼或是否要求更復(fù)雜的處理,因此,在步驟84應(yīng)當(dāng)不存在用于軟件翻譯程序。如果不存在對軟件解釋程序的處理,那么只要這個過程已經(jīng)完成,控制返回硬件,在該處,步驟72再次遞減計數(shù)來考慮提取下一Java字節(jié)碼。圖11表示另外的控制裝置。在處理開始時,在步驟86,指令信號(調(diào)度信號是不確定的(dessert)。在步驟88,提取的Java字節(jié)碼被檢驗以查看它是否是硬件翻譯器所支持的一個簡單的字節(jié)碼。如果硬件翻譯器不支持,那么控制被分送到步驟90的解釋軟件,然后,在步驟90執(zhí)行ARM指令例程來翻譯Java字節(jié)碼。如果該字節(jié)碼是硬件翻譯所支持的簡單的一個,那么處理進入步驟92,在步驟92,一個或多個ARM指令通過充當(dāng)多周期有限態(tài)機器的Java字節(jié)碼翻譯單元68按順序發(fā)行。只要在步驟90或在步驟92已經(jīng)正確處理該Java字節(jié)碼,那么處理進入步驟94,在步驟94,指令信號在步驟86不確定前確定一短周期。確定的指令信號向外電路表示已經(jīng)到達合適的安全點,在該點處,由于部分執(zhí)行一個解釋的或翻譯的指令,基于調(diào)度中斷的定時器能產(chǎn)生而不冒數(shù)據(jù)完整性的風(fēng)險。圖12描述可被用來響應(yīng)在圖11中生成的指令信號的典型的電路圖。定時器96在給定時限期滿后定期生成一定時器信號。該定時器信號被存儲在鎖存器98中直到由清除定時器中斷信號被清零為止。在步驟94鎖存器98的輸出通過一AND門100與確定的指令信號邏輯結(jié)合。當(dāng)該鎖存器被設(shè)置以及指令信號被確定時,那么生成一中斷作為AND門100的輸出并被用來觸發(fā)一中斷,該中斷使用在系統(tǒng)中提供的用于標(biāo)準(zhǔn)中斷處理的中斷處理機制來執(zhí)行調(diào)度操作。只要中斷信號已經(jīng)產(chǎn)生,依次觸發(fā)產(chǎn)生清零鎖存器98的清定時器中斷信號直到下一定時器輸出脈沖產(chǎn)生。圖13是表示圖12的電路的操作的信號圖。處理器內(nèi)核時鐘信號以有規(guī)律的頻率產(chǎn)生。定時器96在預(yù)定周期生成定時器信號以表示當(dāng)安全時,調(diào)度操作應(yīng)當(dāng)被啟動。定時器信號被鎖住。指令信號以由時間間隔分開的次數(shù)產(chǎn)生,該時間間隔取決于一特定的Java字節(jié)碼被執(zhí)行有多快。一簡單的Java字節(jié)碼可在一單個的處理器內(nèi)核時鐘周期,或更典型的兩個或三個中執(zhí)行,而提供一高水平管理類型功能的一個復(fù)雜的Java字節(jié)碼在由該軟件翻譯程序完成其執(zhí)行前可花費幾百個處理器時鐘周期。在另一種情形中,掛起的確定的鎖住的定時器信號觸發(fā)一調(diào)度操作直到指令信號發(fā)布表示對開始調(diào)度操作它很安全為止。鎖住的定時器信號以及指令信號的同時發(fā)生觸發(fā)產(chǎn)生一中斷信號,該中斷信號其后立即被清鎖存器98的清除信號跟蹤。權(quán)利要求1.用于處理數(shù)據(jù)的裝置,所述裝置包括一處理器內(nèi)核,用來執(zhí)行由第一指令集的指令指定的操作;一指令翻譯器,用來將第二指令集的指令翻譯成與所述第一指令集的指令一致的翻譯器輸出信號,使用一個或多個輸入變量,所述第二指令集的至少一個指令指定將被執(zhí)行的操作;一中斷處理器,響應(yīng)一中斷信號,在完成一當(dāng)前正在執(zhí)行的操作的執(zhí)行后,中斷與所述第一指令集的指令一致的操作的執(zhí)行;以及重啟動邏輯,用于在所述中斷后重啟動執(zhí)行;其中所述指令翻譯器用來生成與所述第一指令集的指令一致的一組或多組翻譯器輸出信號序列以表示所述第二指令集的所述至少一個指令,每個序列是直到在所述序列中的最后操作被執(zhí)行才改變所述一個或多個輸入變量;以及在執(zhí)行表示所述第二指令集的所述至少一個指令的操作序列間發(fā)生一中斷后(i)如果在開始執(zhí)行所述序列中的最后一個操作前發(fā)生所述中斷,那么所述重啟動邏輯在所述序列中第一操作重啟動執(zhí)行;以及(ii)如果在開始執(zhí)行所述序列中的最后一個操作后發(fā)生所述中斷,那么所述重啟動邏輯在所述序列后的下一指令重啟動執(zhí)行。2.如權(quán)利要求1所述的裝置,其中所述翻譯器輸出信號包括形成所述第一指令集的一個指令的信號。3.如權(quán)利要求1和2中任何一個所述的裝置,其中所述翻譯器輸出信號包括控制所述處理器內(nèi)核的操作的控制信號以及在所述第一指令集的譯碼指令上產(chǎn)生的匹配控制信號。4.如權(quán)利要求1、2和3中任何一個所述的裝置,其中所述翻譯器輸出信號包括控制所述處理器內(nèi)核的操作的控制信號以及不是由在所述第一指令集的譯碼指令上產(chǎn)生的控制信號指定的特殊參數(shù)。5.如以上任何一個權(quán)利要求所述的裝置,其中所述重啟動邏輯是所述指令翻譯器的一部分。6.如以上任何一個權(quán)利要求所述的裝置,其中所述重啟動邏輯將一指針存儲到正被翻譯的所述第二指令集的指令中的一重啟動單元,所述指針基于所述最后操作的執(zhí)行向前移。7.如權(quán)利要求6所述的裝置,其中所述指針是指向存儲當(dāng)前正被翻譯的所述第二指令集的一個指令的一個存儲器單元的一個存儲地址的一程序計數(shù)值。8.如以上任何一個權(quán)利要求所述的裝置,其中所述第二指令集的指令根據(jù)保存在一堆棧中的堆棧操作碼指定將執(zhí)行的操作以及所述輸入變量包括輸入堆棧操作碼。9.如權(quán)利要求8所述的裝置,其中通過執(zhí)行所述第二指令集的所述至少一個指令從所述堆棧中移出任何堆棧操作碼直到開始執(zhí)行所述最后操作后才被移出。10.如權(quán)利要求8和9中任何一個所述的裝置,其中通過執(zhí)行所述第二指令集的所述至少一個指令添加到所述堆棧的任何操作碼直到開始執(zhí)行所述最后操作后才被添加。11.如以上任何一個權(quán)利要求所述的裝置,其中所述輸入變量包括未在所述第二指令中指定的系統(tǒng)狀態(tài)變量。12.如以上任何一個權(quán)利要求所述的裝置,其中所述處理器具有包含多個寄存器的寄存器體以及所述第一指令集的指令根據(jù)保存在所述寄存器中的寄存器操作碼執(zhí)行操作。13.如權(quán)利要求12所述的裝置,其中在所述寄存器體中的寄存器組保存來自所述堆棧的頂端的堆棧操作碼。14.如權(quán)利要求13所述的裝置,其中所述指令翻譯器具有多個映射狀態(tài),其中在所述寄存器組中的不同寄存器保存來自所述堆棧中的不同位置的堆棧操作碼,所述指令翻譯器當(dāng)所述最后操作被執(zhí)行時可在映射狀態(tài)間移動以便更新所述輸入變量。15.如以上任何一個權(quán)利要求所述的裝置,其中所述第二指令集的所述指令是Java虛擬機指令。16.一種處理數(shù)據(jù)的方法,所述方法包括步驟執(zhí)行由第一指令集的指令指定的操作;將第二指令集的指令翻譯成與所述第一指令集的指令一致的翻譯器輸出信號,使用一個或多個輸入變量,所述第二指令集的至少一個指令指定將被執(zhí)行的操作;響應(yīng)一中斷信號,在完成一當(dāng)前正在執(zhí)行的操作的執(zhí)行后,中斷與所述第一指令集的指令一致的操作的執(zhí)行;以及在所述中斷后重啟動執(zhí)行;其中所述翻譯步驟生成與所述第一指令集的指令一致的一組或多組翻譯器輸出信號序列以表示所述第二指令集的所述至少一個指令,每個序列是直到在所述序列中的最后操作被執(zhí)行才改變所述一個或多個輸入變量;以及在執(zhí)行表示所述第二指令集的所述至少一個指令的操作序列間發(fā)生中斷后(i)如果在開始執(zhí)行所述序列中的最后一個操作前發(fā)生所述中斷,那么所述重啟動邏輯在所述序列中第一操作重啟動執(zhí)行;以及(ii)如果在開始執(zhí)行所述序列中的最后一個操作后發(fā)生所述中斷,那么所述重啟動邏輯在所述序列后的一下一指令重啟動執(zhí)行。17.一種計算機程序產(chǎn)品,保存用于控制計算機執(zhí)行如權(quán)利要求15所述的方法的計算機程序。全文摘要一處理系統(tǒng),具有執(zhí)行第一指令集的指令的一處理器內(nèi)核(104)以及用于生成與第一指令集的一個或多個指令一致的翻譯器輸出信號的指令翻譯器(108)以便仿真第二指令集的指令。指令翻譯器(108)提供指定操作的翻譯器輸出信號,該操作被分配以便對第二指令集的一個指令的輸入變量直到仿真那個指令的最后操作被執(zhí)行才被改變。在執(zhí)行第一指令集的指令的一個操作后一中斷處理器提供中斷服務(wù)。分配翻譯的指令序列以便輸入狀態(tài)直到執(zhí)行最后的指令才會改變具有在中斷后如果當(dāng)中斷發(fā)生時最后操作還未開始,則可通過重新運行整個仿真,或如果當(dāng)中斷發(fā)生時最后操作已經(jīng)開始則通過運行來自第二指令集的下一指令重啟動處理的結(jié)果。文檔編號G06F9/45GK1434938SQ01810818公開日2003年8月6日申請日期2001年6月21日優(yōu)先權(quán)日2000年10月5日發(fā)明者E·C·內(nèi)維爾,A·C·羅斯申請人:Arm有限公司