欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

處理器流水線中的硬件指令翻譯的制作方法

文檔序號:6475584閱讀:354來源:國知局
專利名稱:處理器流水線中的硬件指令翻譯的制作方法
技術(shù)領(lǐng)域
本發(fā)明涉及數(shù)據(jù)處理系統(tǒng)。具體地說,本發(fā)明涉及這樣的數(shù)據(jù)處理系統(tǒng),其中,在處理器流水線內(nèi)將指令從一個(gè)指令集翻譯成另一個(gè)指令集。
周知提供了這樣的處理系統(tǒng),其中,在指令流水線內(nèi)將指令從第一指令集翻譯成第二指令集。在這類系統(tǒng)中,要加以翻譯的每條指令均映射成單條本機(jī)指令。這類系統(tǒng)的一個(gè)實(shí)例是ARM有限公司生產(chǎn)的處理器,這種處理器支持ARM和Thumb指令代碼。
周知提供了這樣的處理系統(tǒng),其中,可將非本機(jī)指令翻譯成包括多條本機(jī)指令的本機(jī)指令序列。US-A-5937193說明了這種系統(tǒng)的一個(gè)實(shí)例。這種系統(tǒng)將Java字節(jié)碼映射成32位的ARM指令。這種翻譯是在指令進(jìn)處理器流水線之間進(jìn)行的并使用了存儲器地址重映射技術(shù)。Java字節(jié)碼用于查找存儲器中模擬Java字節(jié)碼活動(dòng)的ARM指令序列。
US-A-5937193的系統(tǒng)具有若干相關(guān)缺陷。這種系統(tǒng)在使用存儲器和存儲器取操作的方式上效率低下。即使ARM指令序列可以被設(shè)置成占據(jù)較少的存儲器空間,但它們?nèi)远家紦?jù)同樣大小的存儲器空間。在對各Java字節(jié)碼解碼時(shí)需要從存儲器中多次取ARM指令,這就會很不利地消耗能力并且負(fù)面地影響效率。被翻譯的指令序列是固定的,從而在執(zhí)行能夠?qū)е虏煌蚋鼮閮?yōu)化的指令翻譯的各Java字節(jié)碼時(shí),難以將不同的起始系統(tǒng)狀態(tài)考慮在內(nèi)。
用于在指令集之間進(jìn)行翻譯的周知系統(tǒng)的實(shí)例以及其它背景信息可在以下專利中找到,它們是US-A-5805895、US-A-3955180、US-A-5970242、US-A-5619665、US-A-5826089、US-A-5925123、US-A-5875336、US-A-5937193、US-A-5953520、US-A-6021469、US-A-5568646、US-A-5758115、US-A-5367685、《IBM技術(shù)通報(bào)》1988年3月第308-309頁的“用于精簡指令集計(jì)算機(jī)的系統(tǒng)/370模擬器輔助處理器”、《IBM技術(shù)通報(bào)》1986年7月第548-549頁的“全功能系列/1指令集模擬器”、《IBM技術(shù)通報(bào)》1994年3月第605-606頁的“RISC處理器上的實(shí)時(shí)CISC結(jié)構(gòu)的Hw模擬器”、《IBM技術(shù)通報(bào)》1998年3月第272頁的“用EMULATION控制塊提高效率”、《IBM技術(shù)通報(bào)》1995年1月第537-540頁的“用于在精簡指令集計(jì)算機(jī)/循環(huán)系統(tǒng)中進(jìn)行代碼模擬的快速指令解碼”、《IBM技術(shù)通報(bào)》1993年2月第231-234頁的“高性能復(fù)式結(jié)構(gòu)處理器”、《IBM技術(shù)通報(bào)》1989年8月第40-43頁的“系統(tǒng)/370的I/O通道的程序通道命令字預(yù)取操作”、《IBM技術(shù)通報(bào)》1985年6月第305-306頁的“全微碼控制的模擬結(jié)構(gòu)”、《IBM技術(shù)通報(bào)》1972年3月第3074-3076頁的“用于模擬的Op代碼與狀態(tài)處理”、《IBM技術(shù)通報(bào)》1982年8月第954-956頁的“對大系統(tǒng)的帶有最經(jīng)常使用的指令的微處理器進(jìn)行芯片上的微編碼以及適用于對其余指令進(jìn)行編碼的原語”、《IBM技術(shù)通報(bào)》1983年4月第5576-5577頁的“模擬指令”、S Furber所著圖書《ARM系統(tǒng)體系結(jié)構(gòu)》、Hennessy和Patterson所著圖書《計(jì)算機(jī)體系結(jié)構(gòu)定量方法》以及Tim Lindholm和Frank Yellin所著圖書《Java虛擬機(jī)規(guī)范》第1和第2版。
從一個(gè)方面看,本發(fā)明提供了用于處理數(shù)據(jù)的設(shè)備,該設(shè)備包括一處理器核芯,它可執(zhí)行第一指令集的指令所指定的操作,所述處理器核芯具有這樣的指令流水線,可將要執(zhí)行的指令從存儲器取至該流水線,并且,指令沿該流水線前進(jìn);以及一指令翻譯器,它可將第二指令集的指令翻譯成與第一指令集的指令相對應(yīng)的翻譯器輸出信號;其中,所述指令翻譯器位于上述指令流水線內(nèi)并翻譯業(yè)已被從前述存儲器中取至所述指令流水線內(nèi)的第二指令集的指令;所述第二指令集的至少一個(gè)指令指定了需要多個(gè)操作的多步操作,所述多個(gè)操作可由第一指令集的指令來指定,以便由前述處理器核芯來加以執(zhí)行;以及所述指令翻譯器可生成翻譯器輸出信號序列,以便控制前述處理器核芯去執(zhí)行上述多步操作。
本發(fā)明提供了上述位于處理器核芯本身的指令流水線內(nèi)的指令翻譯器,該翻譯器處于取指階段的下游。通過這種方式,非本機(jī)指令(第二指令集指令)可按與本機(jī)指令(第一指令集指令)相同的方式存儲在存儲系統(tǒng)內(nèi),從而消除了對存儲器系統(tǒng)利用的限制。此外,對各非本機(jī)指令而言,對來自存儲器系統(tǒng)的非本機(jī)指令的單次存儲器取操作發(fā)生在處理器流水線中產(chǎn)生任何多步本機(jī)指令操作序列的同時(shí)。這就會降低存儲器取操作的能力消耗并改進(jìn)效率。再有,流水線中的指令翻譯器能沿流水線其余部分往下發(fā)出可變數(shù)量的要執(zhí)行的本機(jī)指令操作,這要取決于正被解碼的特定本機(jī)指令并取決于任何在本機(jī)操作有效執(zhí)行所需的非本機(jī)操作時(shí)會產(chǎn)生影響的周圍系統(tǒng)的狀態(tài)。
應(yīng)該注意,指令翻譯器可生成翻譯器輸出信號,這些信號可全部并完整地表示來自第一指令集的本機(jī)指令。這種結(jié)構(gòu)允許簡單地重新使用被設(shè)計(jì)成與第一指令集的指令一道操作的硬件邏輯。但是,應(yīng)該注意,指令翻譯器也可生成這樣的翻譯器輸出信號,它們是控制信號,可在不與本機(jī)指令直接相對應(yīng)的情況下產(chǎn)生與本機(jī)指令一樣的效果或額外提供諸如擴(kuò)展的操作數(shù)域之類的本身不是由第一指令集的指令直接提供的其它操作。
在指令流水線中設(shè)置指令翻譯器能當(dāng)在不依賴存儲器組織的情況下翻譯成非本機(jī)指令的本機(jī)指令時(shí)將處理器核芯的程序計(jì)數(shù)值用于按通常的方式從存儲器中取出非本機(jī)指令。此外,可在與非本機(jī)指令是翻譯成本機(jī)指令的單步還是多步操作無關(guān)的情況下根據(jù)對這些非本機(jī)指令的執(zhí)行來控制程序計(jì)數(shù)值的前進(jìn)。用程序計(jì)數(shù)值跟蹤非本機(jī)指令的執(zhí)行,可最佳地簡化對中斷、分支和系統(tǒng)結(jié)構(gòu)其它方面進(jìn)行處理的方法。
按被認(rèn)為是提供有限狀態(tài)機(jī)的方式在指令流水線中設(shè)置指令翻譯器具有這樣的結(jié)果即指令翻譯器能更容易地調(diào)節(jié)所翻譯的指令操作以反映系統(tǒng)狀態(tài)以及正被翻譯的非本機(jī)指令。作為一個(gè)最佳實(shí)例,當(dāng)?shù)诙噶罴付ㄒ远褩榛A(chǔ)的處理而處理核心是以寄存器為基礎(chǔ)的處理時(shí),則可以用一組寄存器來有效地緩存堆棧操作數(shù),以使處理加快。在這種情況下,所翻譯的指令序列會隨特定的堆棧操作數(shù)是否被緩存在寄存器內(nèi)或是否必須要取出該堆棧操作數(shù)而變。
為了減少指令翻譯器可能對執(zhí)行本機(jī)指令產(chǎn)生的影響,最佳實(shí)施例是這樣的指令流水線內(nèi)的指令翻譯器配備有旁通通路,因此,在按本機(jī)指令處理模式進(jìn)行操作時(shí),可在不受指令翻譯器影響的情況下處理本機(jī)指令。
應(yīng)該注意,本機(jī)指令和非本機(jī)指令可有多種不同的形式。但是,在第二指令集的非本機(jī)指令是Java虛擬機(jī)指令時(shí),本發(fā)明特別有用,因?yàn)椋瑢⑦@些指令翻譯成本機(jī)指令會有許多問題和困難,這些問題和困難本發(fā)明可以解決。
從另一個(gè)方面看,本發(fā)明提供了一種用帶有指令流水線的處理器核芯來處理數(shù)據(jù)的方法,可將要執(zhí)行的指令從存儲器取至該流水線,并且,指令沿該流水線前進(jìn),所述處理器核芯能執(zhí)行第一指令集所指定的操作,所述方法包括下列步驟將指令取至上述指令流水線;以及用前述指令流水線中的指令翻譯器將取出的第二指令集的指令翻譯成與上述第一指令集的指令相對應(yīng)的翻譯器輸出信號;其中所述第二指令集的至少一個(gè)指令指定了需要多個(gè)操作的多步操作,所述多個(gè)操作可由前述第一指令集來指定,以便由上述處理器核芯來加以執(zhí)行;以及所述指令翻譯器可生成一系列翻譯器輸出,以便控制上述處理器核芯,從而執(zhí)行前述多步操作。
本發(fā)明還提供了一種計(jì)算機(jī)程序產(chǎn)品,它存放有計(jì)算機(jī)程序,以便按著上述技術(shù)控制計(jì)算機(jī)。
當(dāng)在指令流水線中取要翻譯的指令時(shí),若要翻譯的指令是變長指令時(shí),則會出現(xiàn)問題。在取定長指令時(shí),指令該水線的取階段具有相對可預(yù)測的操作。例如,若在每個(gè)指令周期上執(zhí)行一條指令,則取階段可設(shè)置成根據(jù)每一指令周期取一條指令,以便使指令流水線滿。但是,當(dāng)被取出的指令是變長的時(shí),則在識別指令之間邊界方面存在困難。因此,在提供定長存儲讀取操作的存儲器系統(tǒng)中,特定的變長指令可跨越存儲讀取操作,從而需要第二次取操作,以讀取指令的最后部分。
從又一個(gè)方面看,本發(fā)明提供了用于處理數(shù)據(jù)的設(shè)備,該設(shè)備包括一處理器核芯,它可執(zhí)行第一指令集的指令所指定的操作,所述處理器核芯具有這樣的指令流水線,可將要執(zhí)行的指令從存儲器取至該流水線,并且,指令沿該流水線前進(jìn);以及一指令翻譯器,它可將第二指令集的指令翻譯成與第一指令集的指令相對應(yīng)的翻譯器輸出信號;其中,所述第二指令集的指令是變長指令;
所述指令翻譯器位于上述指令流水線內(nèi)并翻譯業(yè)已被從前述存儲器中取至所述指令流水線的取階段的第二指令集的指令;所述指令流水線的取階段包括一指令緩存,它存放有至少一個(gè)當(dāng)前指令字以及從所述存儲器中取出的下一個(gè)指令字,因此,若所述第二指令集的變長指令在前述當(dāng)前指令字內(nèi)開始并延伸至所述下一個(gè)指令字,則該下一個(gè)指令字可在上述流水線內(nèi)獲得,以便在不需要另外的取操作的情況下由所述指令翻譯器來翻譯。
本發(fā)明在取階段內(nèi)提供了一緩存,以存儲至少一個(gè)當(dāng)前指令字和下一個(gè)指令字。通過這種方式,若特定的變長指令超出當(dāng)當(dāng)前指令字延伸至下一個(gè)指令字,則該指令業(yè)已被取出因而也是可使用的,從而能立即進(jìn)行解碼和使用。這可避免任何第二次性能上低效的取操作。應(yīng)該注意,在流水線中提供一緩存下一指令字和當(dāng)前指令字并支持變長指令的取階段能使取階段相對于指令流水線中其余階段而言更為異步的方式進(jìn)行操作。這一點(diǎn)與其中流水線階段會同步操作的用于執(zhí)行定長指令的指令流水線中的通常操作趨勢相反。
本發(fā)明的將指令緩存在取階段內(nèi)的實(shí)施例能很好地適用于這類系統(tǒng),該系統(tǒng)具有就本發(fā)明第一方面所說的上述最佳特征。
從再一個(gè)方面看,本發(fā)明提供了用能執(zhí)行第一指令集所指定的操作的處理器核芯來處理數(shù)據(jù)的方法,所述處理器核芯具有這樣的指令流水線,可將要執(zhí)行的指令從存儲器取至該流水線,并且,指令沿該流水線前進(jìn),所述方法包括下列步驟將指令取至上述指令流水線;以及用所述指令流水線內(nèi)的指令翻譯器將取出的第二指令集的指令翻譯成與第一指令集的指令相對應(yīng)的翻譯器輸出信號;其中,所述第二指令集的指令是變長指令;所述指令翻譯器位于上述指令流水線內(nèi)并翻譯業(yè)已被從前述存儲器中取至所述指令流水線的取階段的第二指令;以及所述指令流水線的取階段包括一指令緩存,它存放有至少一個(gè)當(dāng)前指令字以及從所述存儲器中取出的下一個(gè)指令字,因此,若所述第二指令集的變長指令在前述當(dāng)前指令字內(nèi)開始并延伸至所述下一個(gè)指令字,則該下一個(gè)指令字可在上述流水線內(nèi)獲得,以便在不需要另外的取操作的情況下由所述指令翻譯器來翻譯。
以下參照附圖僅以舉例的方式說明本發(fā)明的實(shí)施例,附圖中圖1和2概略地表示示例性的指令流水線結(jié)構(gòu);圖3詳細(xì)地說明了取階段的結(jié)構(gòu);圖4概略地說明了在取階段從緩存的指令字中讀取變長非本機(jī)指令;圖5概略地說明了一數(shù)據(jù)處理系統(tǒng),它用于執(zhí)行處理器核芯的本機(jī)指令和需要翻譯的指令;圖6就一系列示例指令和狀態(tài)以及用于堆棧操作數(shù)的寄存器的內(nèi)容概略地說明了映射狀態(tài)和需要翻譯的指令與本機(jī)指令之間的關(guān)系;圖7概略地說明了對作為本機(jī)指令序列的非本機(jī)指令的執(zhí)行;圖8是說明指令翻譯器可按能保留被翻譯的指令的中斷等待時(shí)間的方式進(jìn)行操作的方式的流程圖;圖9概略地說明了用硬件和軟件技術(shù)將Java字節(jié)碼翻譯成ARM操作碼;圖10概略地說明了基于硬件的翻譯器、基于信息軟件的解釋器與基于軟件的調(diào)度之間的控制流程;圖11和12說明了另一種用基于計(jì)時(shí)器方法來控制調(diào)度操作的方式;圖13是說明控制圖12的電路操作的信號的信號圖。
圖1示出了適用于基于ARM處理器的系統(tǒng)的第一示例指令流水線30。指令流水線30包括取階段32、本機(jī)指令(ARM/THUMB指令)解碼階段34、執(zhí)行階段36、存儲器存取階段38以及回寫階段40。執(zhí)行階段36、存儲器存取階段38以及回寫階段40基本上是通常的。在取階段32的下游和在本機(jī)指令解碼階段34的上游,設(shè)置有指令翻譯器階段42。指令翻譯器階段42是將變長Java字節(jié)碼指令翻譯成本機(jī)ARM指令的有限狀態(tài)機(jī)。指令翻譯器階段42能進(jìn)行多級操作,從而單條Java字節(jié)碼指令可生成一系列提供給沿指令流水線30的其余部分的ARM指令,以便執(zhí)行Java字節(jié)碼所指定的操作。簡單的Java字節(jié)碼指令為執(zhí)行它們的操作可能僅需要單條ARM指令,而更復(fù)雜的Java字節(jié)碼指令或周圍系統(tǒng)狀態(tài)是這樣規(guī)定的情況下,則需要若干條ARM指令來提供Java字節(jié)碼指令所指令的操作。這種多步操作出現(xiàn)在取階段32的下游,因而在從存儲器系統(tǒng)中取出多條被翻譯的ARM指令或Java字節(jié)碼時(shí)不會增加能力的損失。Java字節(jié)碼指令按通常的方式存儲在存儲器系統(tǒng)內(nèi),因此,不會為了支持Java字節(jié)碼翻譯操作而對存儲器系統(tǒng)有額外的限制。
如上所述,指令翻譯器階段42配備有旁通通路。當(dāng)不是按指令翻譯模式進(jìn)行操作時(shí),指令流水線30可繞過指令翻譯器階段并按本質(zhì)上沒有改變的方式進(jìn)行操作來提供對本機(jī)指令的解碼。
在指令流水線30中,指令翻譯器階段42被說明為生成翻譯器輸出信號,這些信號完全表示相應(yīng)的ARM指令并且通過多路復(fù)用器傳至本機(jī)指令解碼器34。指令翻譯器42還生成某些額外的控制信號,這些信號被傳給本機(jī)指令解碼器34。本機(jī)指令編碼中的位空間限制會限制本機(jī)指令所指定的操作數(shù)的范圍。這些限制不一定由非本機(jī)指令所分擔(dān)。額外的控制信號能傳送額外的指令,該指令規(guī)定了源于非本機(jī)指令的信號,這些信號是不能在存儲于存儲器內(nèi)的本機(jī)指令中指定的。作為一個(gè)實(shí)例,本機(jī)指令對用作本機(jī)指令中的直接操作數(shù)域僅提供較少數(shù)量的位,而非本機(jī)指令則允許有擴(kuò)展的范圍,這一點(diǎn)可通過用額外的控制信號而加以利用,從而將直接操作數(shù)的擴(kuò)展部分傳至所翻譯的本機(jī)指令之外的本機(jī)指令解碼器34,所翻譯的本機(jī)指令也被傳至本機(jī)指令解碼器34。
圖2示出了另一個(gè)指令流水線44。在這一實(shí)例中,系統(tǒng)配備有兩個(gè)本機(jī)指令解碼器46、48以及一個(gè)非本機(jī)指令解碼器50。非本機(jī)指令解碼器50被限制在這樣一些操作,這些操作可以通過用以支持本機(jī)指令的執(zhí)行階段52、存儲階段54和回寫階段56來指定。因此,非本機(jī)指令解碼器50必須將非本機(jī)指令有效地翻譯成本機(jī)操作(這些操作可以是單個(gè)的本機(jī)操作,也可以是一系列本機(jī)操作),然后將適當(dāng)?shù)目刂菩盘柼峁┙o執(zhí)行階段52,以便實(shí)現(xiàn)上述一個(gè)或多個(gè)本機(jī)操作。應(yīng)該注意,在本例中,非本機(jī)指令解碼器不會產(chǎn)生構(gòu)成本機(jī)指令的信號,而是提供指定本機(jī)指令(或擴(kuò)展的本機(jī)指令)操作的控制信號。所生成的控制信號可能會與本機(jī)指令解碼器46、48所產(chǎn)生的控制信號不相匹配。
在操作中,用所說的多路分解器根據(jù)特定的處理模式將取階段58所取出的指令有選擇地提供給指令解碼器46、48或50中的一個(gè)。
圖3更詳盡地在原理上說明了指令流水線的取階段。取指邏輯電路60從存儲器系統(tǒng)中取出定長指令字并將它們提供給指令字緩存62。指令字緩存62是擺動(dòng)緩存,它具有兩側(cè),因此,該緩沖可存儲當(dāng)前的指令字和下一個(gè)指令字。在當(dāng)前指令字業(yè)已被完全解碼并且解碼已前進(jìn)至下一個(gè)指令字時(shí),取指邏輯電路60就把要從存儲器中取出的下一個(gè)指令字來替換前一個(gè)當(dāng)前指令字,也就是說,擺動(dòng)緩存的各側(cè)會以交替的方式按二遞增這兩側(cè)所連續(xù)存儲的指令字。
在所述的實(shí)例中,Java字節(jié)碼指令的最大指令長度是三個(gè)字節(jié)。因此,設(shè)置有三個(gè)多路復(fù)用器,這些復(fù)用器能選擇字緩存62兩側(cè)中的任何三個(gè)相鄰字節(jié)并將它們提供給指令翻譯器64。字緩存62和指令翻譯器64還配備有旁通通路66,以便在取出本機(jī)指令并對其解碼時(shí)使用。
應(yīng)該看到,從存儲器中取出每個(gè)指令字一次并將其存儲在字緩存62內(nèi)。當(dāng)指令翻譯器64將Java字節(jié)碼翻譯成ARM指令時(shí),單個(gè)的指令字可以允許從中讀出多條Java字節(jié)碼。當(dāng)指令翻譯操作被限制在指令流水線內(nèi)時(shí)在,不需要多次讀取存儲器系統(tǒng)并且在不消耗存儲器資源或?qū)⑵渌拗剖┘佑诖鎯ζ飨到y(tǒng)的情況下,就可以生成所翻譯的變長本機(jī)指令序列。
程序計(jì)數(shù)器值與當(dāng)前正被翻譯的各Java字節(jié)碼有關(guān)。所述程序計(jì)數(shù)值沿流水線的階段前進(jìn),以便如果必要的話,每一級都能使用與其正在處理的特定Java字節(jié)碼有關(guān)的信息。對翻譯成一系列多個(gè)ARM指令操作的Java字節(jié)碼其程序計(jì)數(shù)值不會增加,直至所述序列中的最后ARM指令操作開始執(zhí)行。仍然直接指向存儲器內(nèi)正被執(zhí)行的指令的方式來保持程序計(jì)數(shù)器的值,能最佳地簡化系統(tǒng)的其它方面,諸如調(diào)試查錯(cuò)和分支目標(biāo)計(jì)算之類。
圖4概略地說明了從指令緩存62中讀取變長Java字節(jié)碼指令。在第一階段,讀取長度為1的Java字節(jié)碼指令并對其解碼。下一階段是這樣的Java字節(jié)碼,其長度為三字節(jié)并跨越業(yè)已從存儲器中取出的兩個(gè)相鄰指令字。這兩個(gè)相鄰指令字出現(xiàn)在指令緩存62內(nèi),因此,指令解碼和處理不會因變長指令跨越取出的指令字而延遲。一旦從指令緩存62中讀取了三個(gè)Java字節(jié)碼,就開始重填先前取出的指令字,因?yàn)?,后續(xù)的處理會繼續(xù)對業(yè)已存在的后續(xù)指令字的Java字節(jié)碼進(jìn)行解碼。
圖4所示的最后階段說明了正被讀取的第二個(gè)三字節(jié)碼指令。該指令也跨越指令字。如果前一個(gè)指令字尚未完成其重填,則指令的讀取會因流水線停頓而延遲,直至適當(dāng)?shù)闹噶钭忠驯淮鎯M(jìn)指令緩存62。在某些實(shí)施例中,時(shí)標(biāo)可以是這樣的即流水線不會因這種行為而停頓。應(yīng)該注意,這種特殊實(shí)例是不常出現(xiàn)的,因?yàn)?,大多?shù)Java字節(jié)碼要比所示的實(shí)例短,因此,兩次連續(xù)對跨越指令字的指令進(jìn)行解碼是不太常見的。有效信號可以用如下方式與指令緩沖器62中的每個(gè)指令字相關(guān)聯(lián),即它能發(fā)信號表示在從中讀取了Java字節(jié)碼之前指令字是否已被適當(dāng)?shù)刂靥盍恕?br> 圖5示出了數(shù)據(jù)處理系統(tǒng)102,它包括處理器核芯104和寄存器庫106。指令翻譯器108設(shè)置在指令通路內(nèi)以便將Java虛擬機(jī)指令翻譯成要提供給處理器核芯104的本機(jī)ARM指令(或與之相對應(yīng)的控制信號)。當(dāng)本機(jī)ARM指令從可尋址的存儲器中取出時(shí),可繞過指令翻譯器108??蓪ぶ返拇鎯ζ骺梢允侵T如帶有在芯片之外的RAM存儲器的高速緩存存儲器的存儲器系統(tǒng)。將指令翻譯器108設(shè)置在存儲器系統(tǒng)的下游特別是高速緩存存儲器的下游能有效地使用存儲器系統(tǒng)的存儲容量,因?yàn)?,需要翻譯的密集指令可存儲在存儲器系統(tǒng)內(nèi)并僅在剛要傳給處理器核芯104之前才擴(kuò)展成本機(jī)指令。
本例中的寄存器庫106包含有16個(gè)通用32位寄存器,其中有四個(gè)被分配成用于存儲棧操作數(shù)即用于存儲棧操作數(shù)的成組寄存器是R0、R1、R2和R3。
所述成組寄存器可以是空的、部分地填充有棧操作數(shù)或完全填有棧操作數(shù)。當(dāng)前保存棧頂操作數(shù)的特定寄存器可以是該組寄存器中的任何寄存器。因此,應(yīng)該注意,指令翻譯器可以處于十七種不同映射狀態(tài)中的與所有寄存器都為空時(shí)的一種狀態(tài)相對應(yīng)的任何一種狀態(tài),并且,在成組寄存器中保存有四組每組都與相應(yīng)不同數(shù)量的棧操作數(shù)相對應(yīng)的四種狀態(tài),其中一個(gè)不同的寄存器保持著棧頂操作數(shù)。表1表明了用于指令翻譯器108的狀態(tài)映射的十七種不同的狀態(tài)。應(yīng)該注意,在有不同數(shù)量的寄存器分配給棧操作數(shù)存儲裝置的情況下,或者由于有特定的處理器核芯以能處理保存在寄存器內(nèi)的數(shù)據(jù)值的方式所具有的限制,映射狀態(tài)會明顯地取決于特定的實(shí)現(xiàn)形式,表1僅是作為一種特定實(shí)現(xiàn)形式而給出的。
狀態(tài)00000R0=EMPTYR1=EMPTYR2=EMPTYR3=EMPTY狀態(tài)00100狀態(tài)01000 狀態(tài)01100狀態(tài)10000R0=TOS R0=TOSR0=TOS R0=TOSR1=EMPTYR1=EMPTY R1=EMPTYR1=TOS-3R2=EMPTYR2=EMPTY R2=TOS-2R2=TOS-2R3=EMPTYR3=TOS-1 R3=TOS-1R3=TOS-1狀態(tài)00101狀態(tài)01001 狀態(tài)01101狀態(tài)10001R0=EMPTYR0=TOS-1 R0=TOS-1R0=TOS-1R1=TOS R1=TOSR1=TOS R1=TOSR2=EMPTYR2=EMPTY R2=EMPTYR2=TOS-3R3=EMPTYR3=EMPTY R3=TOS-2R3=TOS-2狀態(tài)00110狀態(tài)01010 狀態(tài)01110狀態(tài)10010R0=EMPTYR0=EMPTY R0=TOS-2R0=TOS-2R1=EMPTYR1=TOS-1 R1=TOS-1R1=TOS-1R2=TOS R2=TOSR2=TOS R2=TOSR3=EMPTYR3=EMPTY R3=EMPTYR3=TOS-3狀態(tài)00111狀態(tài)01011 狀態(tài)01111狀態(tài)10011R0=EMPTYR0=EMPTY R0=EMPTYR0=TOS-3R1=EMPTYR1=EMPTY R1=TOS-2R1=TOS-2R2=EMPTYR2=TOS-1 R2=TOS-1R2=TOS-1R3=TOS R3=TOSR3=TOS R3=TOS表1在表1中,可以看出,狀態(tài)值的頭三位表示成組寄存器內(nèi)非空寄存器數(shù)。狀態(tài)值的最后兩位表示保存棧頂操作數(shù)的寄存器的寄存器數(shù)。通過這種方式,狀態(tài)值可以很容易地用于控制硬件翻譯器或軟件翻譯器的操作,以便考慮到成組寄存器當(dāng)前占用情況以及棧頂操作數(shù)的當(dāng)前位置。
如圖5所示,將Java字節(jié)流J1、J2、J3從可尋址的存儲系統(tǒng)提供給指令翻譯器。然后,指令翻譯器108根據(jù)輸入的Java字節(jié)碼和指令翻譯器8的瞬時(shí)映射狀態(tài)以及其它變量輸出ARM指令流(或等價(jià)的控制信號,也許是經(jīng)擴(kuò)展的)。所述的實(shí)例示出Java字節(jié)碼J1被映射至ARM指令A(yù)11和A12。Java字節(jié)碼J2映射至ARM指令A(yù)21、A22和A23。最后,Java字節(jié)碼J3映射至ARM指令A(yù)31。每個(gè)Java字節(jié)碼均需要一個(gè)或多個(gè)棧操作數(shù)作為輸入并且產(chǎn)生一個(gè)或多個(gè)棧操作數(shù)作為輸出。假定本例中的處理器核芯104是具有裝載/存儲結(jié)構(gòu)的ARM處理器核芯因而僅可處理保持在寄存器中的數(shù)據(jù)值,則指令翻譯器108設(shè)置成生成ARM指令,這些指令在需要時(shí)將任何需要的棧操作數(shù)在被處理之前取進(jìn)成組的寄存器或者將成組寄存器中任何當(dāng)前保存的棧操作數(shù)存儲至可尋址的存儲器,以便形成用于所生成的結(jié)果棧操作數(shù)的空間。應(yīng)該注意,每個(gè)Java字節(jié)碼可認(rèn)為具有相關(guān)的“需要滿”值和在一起的“需要空”值,前者表示在執(zhí)行之前成組寄存器中必須存在的棧操作數(shù)的數(shù)量,而“需要空”值表示在執(zhí)行代表Java操作碼的ARM指令之前成組寄存器中必須有的空寄存器的數(shù)量。
表2說明了初始映射狀態(tài)值、需要滿值、最終狀態(tài)值與相關(guān)ARM指令之間的關(guān)系。初始狀態(tài)值和最終狀態(tài)值對應(yīng)于表1所述的映射狀態(tài)。指令翻譯器108確定與它正在翻譯的特定Java字節(jié)碼(操作碼)相關(guān)的需要滿值。指令翻譯器(108)根據(jù)它所具有的初始映射狀態(tài)確定是否有更多的棧操作數(shù)需要在執(zhí)行Java字節(jié)碼之前加載進(jìn)成組寄存器。表1示出了初始狀態(tài)以及用于Java字節(jié)碼的需要滿值的測試,它們一道用于確定是否需要用相關(guān)的ARM指令(LDR指令)和最終映射狀態(tài)將棧操作數(shù)裝載進(jìn)成組寄存器,所述最終映射狀態(tài)將在這種棧高速緩存裝載操作之后加以采用。實(shí)際上,如果在執(zhí)行Java字節(jié)碼之前需要將一個(gè)以上的棧操作數(shù)裝載進(jìn)成組寄存器,則要進(jìn)行多次映射狀態(tài)轉(zhuǎn)換,每次轉(zhuǎn)換都伴隨著相關(guān)的ARM指令將棧操作數(shù)裝載進(jìn)成組寄存器的一個(gè)寄存器。在不同的實(shí)施例中,可以按單個(gè)的狀態(tài)轉(zhuǎn)換來裝載多個(gè)棧操作數(shù),從而使映射狀態(tài)發(fā)生表2所述之外的變化。
初始 需要滿最終 活動(dòng)狀態(tài) 狀態(tài)00000>0 00100LDR R0,[Rstack,#-4]!00100>1 01000LDR R3,[Rstack,#-4]!01001>2 01101LDR R3,[Rstack,#-4]!01110>3 10010LDR R3,[Rstack,#-4]!01111>3 10011LDR R0,[Rstack,#-4]!01100>3 10000LDR R1,[Rstack,#-4]!01101>3 10001LDR R2,[Rstack,#-4]!01010>2 01110LDR R0,[Rstack,#-4]!01011>2 01111LDR R1,[Rstack,#-4]!01000>2 01100LDR R2,[Rstack,#-4]!00110>1 01010LDR R1,[Rstack,#-4]!00111>1 01011LDR R2,[Rstack,#-4]!00101>1 01001LDR R0,[Rstack,#-4]!表2從表2中可以看出,被裝進(jìn)存儲有棧操作數(shù)的成組寄存器內(nèi)的新棧操作數(shù)會構(gòu)成新的棧頂操作數(shù),它會取決于初始狀態(tài)被裝進(jìn)成組寄存器中的一個(gè)特定的寄存器內(nèi)。
表3以類似的方式說明了初始映射狀態(tài)值、需要空值、最終狀態(tài)值與相關(guān)ARM指令之間的關(guān)系,所述ARM指令用于使成組寄存器中的寄存器變空,以便在特定Java字節(jié)碼的需要空值表示需要在執(zhí)行Java字節(jié)碼之前給出初始狀態(tài)的情況下在初始狀態(tài)與最終狀態(tài)之間移動(dòng)。存儲在可尋址存儲器外的特定寄存器值以及STR指令根據(jù)哪個(gè)寄存器是當(dāng)前的棧頂操作數(shù)而變。
初始 需要空最終 活動(dòng)狀態(tài) 狀態(tài)00100>3 00000STR R0,[Rstack],#401001>2 00101STR R0,[Rstack],#401110>1 01010STR R0,[Rstack],#410011>0 01111STR R0,[Rstack],#410000>0 01100STR R1,[Rstack],#410001>0 01101STR R2,[Rstack],#410010>0 01110STR R3,[Rstack],#401111>1 01011STR R1,[Rstack],#401100>1 01000STR R2,[Rstack],#401101>1 01001STR R3,[Rstack],#401010>2 00110STR R1,[Rstack],#401011>2 00111STR R2,[Rstack],#401000>2 00100STR R3,[Rstack],#400110>3 00000STR R2,[Rstack],#400111>3 00000STR R3,[Rstack],#400101>3 00000STR R1,[Rstack],#4表3
應(yīng)該注意,在上述示例系統(tǒng)中,需要滿和需要空條件是相互排斥的,也就是說,在任何給定時(shí)刻,對指令翻譯器正試圖進(jìn)行翻譯的特定Java字節(jié)碼來說,只有需要滿或需要空條件中的一個(gè)為真。指令翻譯器108所使用的模板連同著選擇該模板以便用硬件翻譯器108來加以支持的指令一起被選擇,從而使得能滿足這種相互排斥的要求。如果這種要求是不適當(dāng)?shù)?,則會出現(xiàn)這樣的情形,其中,在執(zhí)行表示Java字節(jié)碼的指令以便使執(zhí)行的結(jié)果按需保存在寄存器內(nèi)之后,特定的Java字節(jié)碼需要在不允許有足夠的空寄存器的成組寄存器中存在多個(gè)輸入棧操作數(shù)。
應(yīng)該注意,給定的Java字節(jié)碼具有表示執(zhí)行該Java字節(jié)碼時(shí)所消耗的棧操作數(shù)的數(shù)量與生成的棧操作數(shù)的數(shù)量之間平衡的總體的凈?;顒?dòng)。由于所消耗的棧操作數(shù)的數(shù)量是執(zhí)行前的要求,所生成的棧操作數(shù)的數(shù)量是執(zhí)行之后的要求,故即便基本的凈活動(dòng)自身得到滿足,也必須在執(zhí)行該字節(jié)碼之前滿足與各Java字節(jié)碼相關(guān)的需要滿和需要空值。表4說明了初始狀態(tài)、總體?;顒?dòng)、最終狀態(tài)和寄存器使用變化與棧頂操作數(shù)(TOS)的相對位置之間的關(guān)系。需要在執(zhí)行表4所述的狀態(tài)轉(zhuǎn)換之前執(zhí)行一個(gè)或多個(gè)表2或表3所述的狀態(tài)轉(zhuǎn)換,以便根據(jù)Java字節(jié)碼的需要滿和需要空值對給定的Java字節(jié)碼進(jìn)行預(yù)處理。
初始 ?;顒?dòng)最終 活動(dòng)狀態(tài) 狀態(tài)00000+100101 R1<-TOS00000+201010 R1<-TOS-1,R2<-TOS00000+301111 R1<-TOS-2,R2<-TOS-1,R3<-TOS00000+410000 R0<-TOS,R1<-TOS-3,R2<-TOS-2,R3<-TOS-100100+101001 R1<-TOS00100+201110 R1<-TOS-1,R2<-TOS00100+310011 R1<-TOS-2,R2<-TOS-1,R3<-TOS00100-100000 R0<-EMPTY01001+101110 R2<-TOS01001+210011 R2<-TOS-1,R3<-TOS01001-100100 R1<-EMPTY01001-2O0000 R0<-EMPTY,R1<-EMPTY01110+110011 R3<-TOS01110-101001 R2<-EMPTY01110-200100 R1<-EMPTY,R2<-EMPTY01110-300000 R0<-EMPTY,R1<-EMPTY,R2<-EMPTY10011-101110 R3<-EMPTY10011-201001 R2<-EMPTY,R3<-EMPTY10011-300100 R1<-EMPTY,R2<-EMPTY,R3<-EMPTY10011-400000 R0<-EMPTY,R1<-EMPTY,R2<-EMPTY,R3<-EMPTY10000-101111 R0<-EMPTY10000-201010 R0<-EMPTY,R3<-EMPTY10000-300101 R0<-EMPTY,R2<-EMPTY,R3<-EMPTY10000-400000 R0<-EMPTY,R1<-EMPTY,R2<-EMPTY,R3<-EMPTY
10001-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-101011R0<-EMPTY01100-200110R0<-EMPTY,R3<-EMPTY01100-300000R0<-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)該注意,表2、表3和表4所述的狀態(tài)與條件之間的關(guān)系可以組合成一單個(gè)的狀態(tài)轉(zhuǎn)換表或狀態(tài)圖,但為清楚起見,他們在以上是分別示出的。
不同狀態(tài)、條件與凈活動(dòng)之間的關(guān)系可用于規(guī)定硬件狀態(tài)機(jī)(呈有限狀態(tài)機(jī)的形式),以便控制指令翻譯器108的這一方面的操作。另外,所述關(guān)系可以由軟件或硬件和軟件的組合來建模。
以下是可能的Java字節(jié)碼的一個(gè)子集的實(shí)例,它表明該子集中的各Java字節(jié)碼中該字節(jié)碼的相關(guān)的需要滿、需要空和?;顒?dòng)值,這些值可與表2、3和4結(jié)合使用。
--- iconst_0操作Push int constant棧 ....=>...,0Require-Full=0Require-Empty=1Stack-Action=+1---iadd操作Add int棧 ...,value1,value2=>...,resultRequire-Full=2Require-Empty=0Stack-Action=-1---lload_0操作Load long from local variable棧 ...=>...,value.word1,value.word2Require-Full=0Require-Empty=2Stack-Action=+2--- lastore操作Store into long array
棧 ...,arrayref,index,value.word1,value.word2=>...
Require-Full=4Require-Empty=0Stack-Action=-4---land操作 Boolean AND long棧 ...,value1.word1,value1.word2,value2.word1,value2.word2=>...,result.word1,result.word2Require-Full=4Require-Empty = 0Stack-Action=-2---iastore操作 Store into int array棧 ...,arrayref,index,value=>...
Require-Full=3Require-Empty=0Stack-Action=-3---ineg操作 Negate int棧 ...,value=>...,resultRequire-Full=1Require-Empty=0Stack-Action=0以下是用于上述各Java碼指令的示例性指令模板。所示的指令是ARM指令,這些指令實(shí)現(xiàn)所需的各Java字節(jié)碼的行為。在從表1中讀出時(shí)根據(jù)當(dāng)前采用的映射狀態(tài),寄存器域“TOS-3”、“TOS-1”、“TOS”、“TOS+1”和“TOS+2”可用適當(dāng)?shù)募拇嫫鲄^(qū)分符來代替。標(biāo)記“TOS+n”表示當(dāng)前存儲棧頂操作數(shù)的寄存器之上的第n個(gè)寄存器,它從存儲棧頂操作數(shù)的寄存器開始并按寄存器值向上數(shù)直至到達(dá)成組寄存器尾部,在該點(diǎn)處,折返回到成組寄存器中的第一個(gè)寄存器。
<pre listing-type="program-listing"><![CDATA[iconst_0 MOV tos+1,#0lload_0LDR tos+2,[vars,#4] LDR tos+1,[vars,#0]iastoreLDR Rtmp2,[tos-2,#4] LDR Rtmp1,[tos-2,#0] CMP tos-1,Rtmp2,LSR#5 BLXCS Rexc STR tos,[Rtmp1,tos-1,LSL #2]lastoreLDR Rtmp2,[tos-3,#4] LDR Rtmp1,[tos-3,#0] CMP tos-2,Rtmp2,LSR #5 BLXCS Rexc STR tos-1,[Rtmp1,tos-2,LSL #3]! STR tos,[Rtmp1,#4]iadd ADD tos-1,tos-1,tosineg RSB tos,tos,#0land AND tos-2,tos-2,tos AND tos-3,tos-3,tos-1]]></pre>以下說明了依照上述技術(shù)的硬件翻譯器108所執(zhí)行的單個(gè)Java字節(jié)碼的示例性執(zhí)行順序。執(zhí)行順序是從初始狀態(tài)開始顯示的,該狀態(tài)根據(jù)正執(zhí)行的指令經(jīng)過一系列狀態(tài)、由于在每一狀態(tài)轉(zhuǎn)換執(zhí)行活動(dòng)而生成一系列ARM指令,整個(gè)順序具有將Java字節(jié)碼翻譯成一系列ARM指令的效果。
初始狀態(tài)00000指令iadd(Require-Full=2,Require-Empty=0,Stack-Action=-1)條件Require-Full>0狀態(tài)轉(zhuǎn)換00000>000100ARM指令(s)LDR R0,[Rstack,#-4]!下一狀態(tài)00100指令 iadd(Require-Full=2,Require-Empty=0,Stack-Action=-1)條件 Requite-Full>1狀態(tài)轉(zhuǎn)換 00100 >101000ARM指令(s)LDR R3,[Rstack,#-4]!下一狀態(tài) 01000指令 iadd(Require-Full=2,Require-Empty=0,Stack-Action=-1)條件 Stack-Action=-1狀態(tài)轉(zhuǎn)換 01000 -100111指令模板ADDtos-1,tos-1,tosARM指令(s)(替換之后)ADD R3,R3,R0下一狀態(tài)00111圖6以不同的方式說明了執(zhí)行多種其它Java字節(jié)碼指令。圖6的頂部說明了在執(zhí)行iadd Java字節(jié)碼指令時(shí)出現(xiàn)的ARM指令序列以及映射狀態(tài)和寄存器內(nèi)容的變化。初始映射狀態(tài)是000000,它對應(yīng)于成組寄存器中的所有寄存器均為空。所生成的頭兩個(gè)ARM指令用于將兩個(gè)棧操作數(shù)彈(POP)至存儲有棧操作數(shù)的寄存器,棧頂“TOS”寄存器為R0。第三個(gè)ARM指令實(shí)際執(zhí)行加操作并將結(jié)果寫至寄存器R3(它目前成為棧頂操作數(shù)),同時(shí)使用先前保存在寄存器R1內(nèi)的棧操作數(shù),因此,產(chǎn)生的總體?;顒?dòng)為-1。
然后,處理過程前進(jìn)至執(zhí)行兩個(gè)Java字節(jié)碼,每個(gè)字節(jié)碼均表示兩個(gè)棧操作數(shù)的長裝載。用于第一Java字節(jié)碼的為2的需要空條件可被立即滿足,因此,可發(fā)出并執(zhí)行兩個(gè)ARM LDR指令。執(zhí)行第一個(gè)長裝載Java字節(jié)碼之后的映射狀態(tài)是01101。在這種狀態(tài)下,成組寄存器僅含有單個(gè)空寄存器。下一個(gè)Java字節(jié)碼長載指令具有為2的需要空值,它不能被滿足,因此,所需要的第一動(dòng)作用ARM STR指令起將棧操作數(shù)推(PUSH)至可尋址的存儲器。這就能釋放成組寄存器中的寄存器,以供可作為兩個(gè)后續(xù)LDR指令的一部分而裝載的新棧操作數(shù)使用。如前所述,可用硬件、軟件或兩者的結(jié)合來進(jìn)行指令翻譯。以下給出了根據(jù)上述技術(shù)生成的示例性軟件解釋器的一部分。
解釋 LDRBRtmp,[Rjpc,#1]!LDRpc,[pc,Rtmp,lsl #2]DCD0...
DCDdo_iconst_0;Opcode 0x03...
DCDdo_lload_0 ;Opcode 0xle...
DCDdo_iastore ;Opcode 0x4fDCDdo_lastore ;Opcode 0x50...
DCDdo_iadd;Opcode 0x60...
DCDdo_ineg;Opcode 0x74...
DCDdo_land;Opcode 0x7f...
do_iconst_0MOVR0,#0STRR0,[Rstack],#4B Interpretdo_lload_0 LDMIA Rvars,{R0,R1}STMIA Rstack!,{R0,R1}B Interpretdo_iastore LDMDB Rstack!,{R0,R1,R2}LDRRtmp2,[r0,#4]LDRRtmp1,[r0,#0]CMPR1,Rtmp2,LSR #5BCSArrayBoundExceptionSTRR2,[Rtmp1,R1,LSL #2]B Interpretdo_lastore LDMDB Rstack!,{R0,R1,R2,R3}LDRRtmp2,[r0,#4]LDRRtmp1,[r0,#0]CMPR1,Rtmp2,LSR #5BCSArrayBoundExceptionSTRR2,[Rtmp1,R1,LSL#3]!STRR3,[Rtmp1,#4]B Interpretdo_iaddLDMDB Rstack!,{r0,r1}ADDr0,r0,r1STRr0,[Rstack],#4B Interpretdo_inegLDRr0,[Rstack,#-4]!RSBtos,tos,#0STRr0,[Rstack],#4B Interpretdo_landLDMDB Rstack!,{r0,r1,r2,r3}ANDr1,r1,r3ANDr0,r0,r2STMIA Rstack!,{r0,r1}B InterpretState_00000_Interpret LDRB Rtmp,[Rjpc, #1]!LDRpc,[pc,Rtmp,1sl #2]DCD0...
DCDState_00000_do_iconst_0 ;Opcode 0x03...
DCDState_00000_do_lload_0 ;Opcode 0xle...
DCDState_00000_do_iastore ;Opcode 0x4f...
DCDState_00000_do_lastore ;Opcode 0x50...
DCDState_00000_do_iadd ;Opcode 0x60...
DCDState_00000_do_ineg ;Opcode 0x74...
DCDState_00000_do_land ;Opcode 0x7f...
State_00000_do_iconst_0MOVR1,#0B State_00101_InterpretState_00000_do_lload_0 LDMIA Rvars,{R1,R2}B State_01010_InterpretState_00000_do_iastore LDMDB Rstack!,{R0,R1,R2}
LDRRtmp2,[r0,#4]LDRRtmp1,[r0,#0]CMPR1,Rtmp2,LSR #5BCSArrayBoundExceptionSTRR2,[Rtmp1,R1,LSL #2]B State_00000_InterpretState_00000_do_lastoreLDMDB Rstack!,{R0,R1,R2,R3}LDRRtmp2,[r0,#4]LDRRtmp1,[r0,#0]CMPR1,Rtmp2,LSR #5BCSArray Bound ExceptionSTRR2,[Rtmp1,R1,LSL #3]!STRR3,[Rtmp1,#4]B State_00000_InterpretState_00000_do_iadd LDMDB Rstack!,{R1,R2}ADDr1,r1,r2B State_00101_InterpretState_00000_do_ineg LDRr1,[Rstack,#-4]!RSBr1,r1,#0B State_00101_InterpretState_00000_do_land LDRr0,[Rstack,#-4]!LDMDB Rstack!,{r1,r2,r3}ANDr2,r2,r0ANDr1,r1,r3B State_01010_InterpretState_00100_Interpret LDRB Rtmp,[Rjpc,#1]!LDRpc,[pc,Rtmp,lsl #2]DCD0...
DCDState_00100_do_iconst_0 ;Opcode 0x03...
DCDState_00100_do_lload_0 ;Opcode 0xle...
DCDState_00100_do_iastore ;Opcode 0x4fDCDState_00100_do_lastore ;Opcode 0x50...
DCDState_00100_do_iadd ;Opcode 0x60...
DCDState_00100_do_ineg ;Opcode 0x74...
DCDState_00100_do_land ;Opcode 0x7f...
State_00100_do_iconst_0 MOVR1,#0B State_01001_InterpretState_00100_do_lload_0LDMIA Rvars,{r1,R2}B State_01110_InterpretState_00100_do_iastoreLDMDB Rstack!,{ r2,r3}LDRRtmp2,[r2,#4]LDRRtmp1,[r2,#0]CMPR3,Rtmp2,LSR #5BCSArrayBoundExceptionSTRR0,[Rtmp1,R3,lsl #2]B State_00000_InterpretState_00100_do_lastoreLDMDB Rstack!,{r1,r2,r3}LDRRtmp2,[r1,#4]LDRRtmp1,[r1,#0]CMPr2,Rtmp2,LSR #5BCSArrayBoundExceptionSTRr3,[Rtmpl,r2,lsl #3]!STRr0,[Rtmpl,#4]
BState_00000_InterpretState_00100_do_iadd LDR r3,[Rstack,#-4]!ADD r3,r3,r0BState_00111_InterpretState_00100_do_ineg RSB r0,r0,#0BState_00100_InterpretState_00100_do_land LDMDBRstack!,{r1,r2,r3)AND r2,r2,r0AND r1,r1,r3BState_01010_InterpretState_01000_Interpret LDRB Rtmp,[Rjpc,#1]!LDR pc,[pc,Rtmp,lsl #2]DCD 0...
DCD State_01000_do_iconst_0;Opcode 0x03...
DCD State_01000_do_lload_0 ;Opcode 0xle...
DCD State_01000_do_iastore ;Opcode 0x4fDCD State_01000_do_lastore ;Opcode 0x50...
DCD State_01000_do_iadd;Opcode 0x60...
DCD State_01000_do_ineg;Opcode 0x74...
DCD State_01000_do_land;Opcode 0x7f...
State_01000_do_iconst_0 MOV R1,#0BState_01101_InterpretState_01000_do_lload_0LDMIARvars,{r1,r2}BState_10010_InterpretState_01000__do_iastore LDR r1,[Rstack,#-4]!LDR Rtmp2,[R3,#4]LDR Rtmp1,[R3,#0]CMP r0,Rtmp2,LSR #5BCS ArrayBoundExceptionSTR r1,[Rtmp1,r0,lsl #2]BState_00000_InterpretState_01000_do_lastoreLDMDBRstack!,{r1,r2}LDR Rtmp2,{r3,#4}LDR Rtmp1,{R3,#0}CMP r0,Rtmp2,LSR #5BCS ArrayBoundExceptionSTR r1,[Rtmp1,r0,lsl #3]!STR r2,[Rtmp1,#4]BState_00000_InterpretState_01000_do_iadd ADD r3,r3,r0BState_00111_InterpretState_01000_do_ineg RSB r0,r0,#0BState_01000_InterpretState_01000_do_land LDMDBRstack!,{r1,r2}AND R0,R0,R2AND R3,R3,R1BState_01000_InterpretState_01100_Interpret ...
State_10000_Interpret ...
State_00101_Interpret ...
State_01001_Interpret ...
State_01101_Interpret ...
State_10001_Interpret...
State_00110_Interpret...
State_01010_Interpret...
State_01110_Interpret...
State_10010_Interpret...
State_00111_Interpret...
State_01011_Interpret...
State_01111_Interpret...
State_10011_Interpret...
圖7說明了Java字節(jié)碼指令“l(fā)aload”,它具有從始于找頂位置的數(shù)據(jù)的兩個(gè)字所指定的數(shù)據(jù)陣列中讀出數(shù)據(jù)的兩個(gè)字的功能。從數(shù)據(jù)陣列中讀出的兩個(gè)字代替指定它們位置的兩個(gè)字,以便形成最頂部的棧入口。
為了使得“l(fā)aload”指令具有足夠的寄存器空間以用于存儲從所述陣列中取出的棧操作數(shù)而不會重寫用于指定數(shù)據(jù)陣列中的陣列和位置的輸入棧操作數(shù),Java字節(jié)碼指令被指定為具有為2的需要空值,也就是說,必須在執(zhí)行模仿“l(fā)aload”指令的ARM指令之前,清空棧操作數(shù)存儲所專用的寄存器中的兩個(gè)寄存器。如果在遇到所述Java字節(jié)碼時(shí)不存在有兩個(gè)空的寄存器,則可執(zhí)行存儲操作(STR),以便將當(dāng)前保存在寄存器內(nèi)的棧操作數(shù)推(PUSH)出至存儲器,從而形成用于暫時(shí)存儲所需的空間并滿足用于所述指令的需要空值。
當(dāng)陣列中的陣列位置和下標(biāo)作為兩個(gè)獨(dú)立的棧操數(shù)而指定了數(shù)據(jù)的位置時(shí),所述指令還具有為2的需要滿值。


了在已經(jīng)滿足了需要滿和需要空條件時(shí)并具有為“01001”的映射狀態(tài)的第一狀態(tài)。將“l(fā)aload”指令分成三個(gè)ARM指令。第一個(gè)指令將陣列基準(zhǔn)裝載進(jìn)成組寄存器以外的備用工作寄存器,該寄存器起棧操作數(shù)的寄存器高速緩存的作用。第二個(gè)指令用所述陣列基準(zhǔn)以及陣列中的下標(biāo)值去訪問第一陣列字,該陣列字被寫至棧操作數(shù)存儲所專用的空寄存器之一內(nèi)。
值得注意的是,在執(zhí)行了上述頭兩ARM指令之后,系統(tǒng)的映射狀態(tài)并未改變,棧頂指針仍保持在該寄存器被指定為空面如此規(guī)定的開始位置上。
ARM指令序列中的最后一個(gè)指令將第二陣列字裝載進(jìn)用于存儲找操作數(shù)的成組寄存器中。由于這是最后一個(gè)指令,如果其間真的出現(xiàn)中斷,則該中斷不會得到響應(yīng)直至該指令結(jié)束,所以通過改變到存儲棧操作數(shù)的寄存器的映射狀態(tài)而改變此指令的輸入狀態(tài)是安全的。在本例中,映射狀態(tài)改變成“01011”,這種狀態(tài)將新的棧頂指針置于第二陣列字并指明陣列的基準(zhǔn)和下標(biāo)值的輸入變量目前是空寄存器,也就是說,將寄存器標(biāo)記為空等價(jià)于從棧中除去這些寄存器所保存的值。
應(yīng)該注意,盡管“l(fā)aload”指令的總體棧活動(dòng)尚未改變寄存器中所保存的棧操作數(shù)的數(shù)量,但仍會發(fā)生映射狀態(tài)的交換。在執(zhí)行最后操作時(shí)的映射狀態(tài)的改變是作為所翻譯的Java字節(jié)碼的功能而硬連線至指令翻譯器并由被顯示為“l(fā)aload”指令特征的“交換”參數(shù)來表明的。
盡管附圖中的實(shí)例是一個(gè)特定的指令,但是,應(yīng)該注意,所述的原理可擴(kuò)展至被模擬為ARM指令或其它類型指令的多種不同的Java字節(jié)碼。
圖8是概略說明上述技術(shù)的流程圖。在步驟10,從存儲器中取出Java字節(jié)碼。在步驟12,檢驗(yàn)用于該Java字節(jié)碼的需要滿和需要空值。如果未滿足需要空或需要滿條件中的任何一個(gè),則用步驟14和16執(zhí)行棧操作數(shù)(可能為多個(gè)棧操作數(shù))的相應(yīng)PUSH和POP操作。應(yīng)該注意,這種特定的系統(tǒng)不允許同時(shí)不滿足需要空和需要滿條件。需要多次進(jìn)行步驟14和16,直至滿足步驟12的條件。
在步驟18,選擇在翻譯模板中為相關(guān)Java字節(jié)碼指定的第一ARM指令。在步驟20,檢查選定的ARM指令是否是在模擬步驟10所取出的Java字節(jié)碼時(shí)要執(zhí)行的最后一個(gè)指令。如果正在執(zhí)行的ARM指令是所述最后一個(gè)指令,則步驟21用來更新程序計(jì)數(shù)器值以指向要執(zhí)行的指令序列中的下一個(gè)Java字節(jié)碼。應(yīng)該理解,如果ARM指令是最后一個(gè)指令,則該指令在不管當(dāng)前是否出現(xiàn)中斷都要完成其執(zhí)行,因此,能安全地將程序計(jì)數(shù)器值更新至下一個(gè)Java字節(jié)碼并從該點(diǎn)重啟動(dòng)執(zhí)行,因?yàn)?,系統(tǒng)的狀態(tài)將會達(dá)到匹配正常、無中斷、完全地執(zhí)行Java字節(jié)碼。如果步驟20的測試表明尚未達(dá)到最后一個(gè)字節(jié)碼,則繞過對程序計(jì)數(shù)器值的更新。
步驟22執(zhí)行當(dāng)前的ARM指令。在步驟24,測試是否存在有任何更多的需要作為模板的一部分加以執(zhí)行的ARM指令。如果存在更多的ARM指令,則在步驟26選擇這些指令中的下一個(gè)指令,并且,程序過程返回至步驟20。如果沒有更多的指令,則處理過程前進(jìn)至步驟28,在該步驟中,執(zhí)行為相關(guān)Java字節(jié)碼指定的任何映射改變/交換,以便反映預(yù)定的棧頂位置以及保存著棧操作數(shù)的各種寄存器的滿/空狀態(tài)。
圖8還概略地說明了有確定的中斷并得到響應(yīng)時(shí)的點(diǎn)以及在中斷之后重啟動(dòng)的處理過程。在執(zhí)行了當(dāng)前于步驟22中進(jìn)行的ARM指令之后,中斷開始得到響應(yīng)而不管作為字節(jié)碼序列返回值而存儲起來的當(dāng)前程序計(jì)數(shù)器值是什么。如果當(dāng)前執(zhí)行的ARM指令是模板序列中的最后一個(gè)指令,則步驟21會剛好更新完程序計(jì)數(shù)器值,因此,該計(jì)數(shù)器值會指向下一個(gè)Java字節(jié)碼(或ARM指令,如果是指令集轉(zhuǎn)換剛開始的情況下)。如果當(dāng)前執(zhí)行的ARM指令是除所述序列中最后一個(gè)指令以外的任何一個(gè)指令,則程序計(jì)數(shù)器值與在開始執(zhí)行相關(guān)Java字節(jié)碼時(shí)所指明的值相同,因此,在返回時(shí),會重新執(zhí)行整個(gè)的Java字節(jié)碼。
圖9說明了Java字節(jié)碼翻譯器68,它接收J(rèn)ava字節(jié)碼流并輸出所翻譯的ARM指令流(或相應(yīng)的控制信號),以控制處理器核芯的活動(dòng)。如前所述,Java字節(jié)碼翻譯器68將使用指令模板將簡單Java字節(jié)碼翻譯成ARM指令或ARM指令序列。當(dāng)已執(zhí)行各Java字節(jié)碼時(shí),調(diào)度控制邏輯電路70中的計(jì)數(shù)器值遞減。當(dāng)該計(jì)數(shù)器值達(dá)到0時(shí),Java字節(jié)碼翻譯器68將發(fā)出ARM指令以分支到調(diào)度代碼,該代碼適當(dāng)?shù)毓芾砭€程或任務(wù)之間的調(diào)度。
盡管由Java字節(jié)碼翻譯器68本身來處理簡單的Java字節(jié)碼可以用硬件為基礎(chǔ)高速執(zhí)行這些字節(jié)碼,但是,可將需要更復(fù)雜處理操作的字節(jié)碼發(fā)送給軟件解釋器,該解釋器呈一組解釋例程的形式(以上在本說明書中給出了這一類例程的實(shí)例)。具體地說,Java字節(jié)碼翻譯器68可確定它所接收的字節(jié)碼不是由硬件翻譯來支持的字節(jié)碼,因此,可根據(jù)Java字節(jié)碼分支轉(zhuǎn)換至這樣的地址,在該地址處,發(fā)現(xiàn)或引用用于對該字節(jié)碼進(jìn)行解釋的軟件例程。在調(diào)度邏輯電路70指示需要調(diào)度操作來對調(diào)度代碼產(chǎn)生分支時(shí),也可以使用這種機(jī)制。
圖10更詳細(xì)地說明了圖9的實(shí)施例的操作以及硬件與軟件之間的任務(wù)分解。所有的Java字節(jié)碼均由Java字節(jié)碼翻譯器68來接收并且在步驟72使計(jì)數(shù)器遞減。在步驟74,檢查計(jì)數(shù)器值是否達(dá)到0。如果計(jì)數(shù)器值已達(dá)到0(從與系統(tǒng)硬連線所預(yù)定的值或可由用戶控制/編程的值開始遞減計(jì)數(shù)),則在步驟76轉(zhuǎn)移到調(diào)度代碼。一旦在步驟76完成了調(diào)度代碼,則控制權(quán)返回至硬件,處理過程前進(jìn)至步驟72,在該步驟處,取出下一個(gè)Java字節(jié)碼,計(jì)數(shù)值再再遞減。由于計(jì)數(shù)器值達(dá)到0,則它會循環(huán)至新的非零值?;蛘?,在步驟76,新值可作為現(xiàn)存調(diào)度過程的一部分強(qiáng)制送入計(jì)數(shù)器。
如果步驟74的測試表明計(jì)數(shù)器不等于0,則步驟78取出Java字節(jié)碼。在步驟80,判斷所取出的字節(jié)碼是可以由步驟82的硬件翻譯所執(zhí)行的簡單字節(jié)碼還是需要更復(fù)雜的處理因此應(yīng)加以傳送以便在步驟84作軟件解釋的字節(jié)碼。如果處理是傳送到軟件解釋去的,則一且完成,控制權(quán)就返回至硬件,在硬件中,步驟72再次使計(jì)數(shù)器遞減,以便考慮取出下一個(gè)Java字節(jié)碼。
圖11說明了另一種控制結(jié)構(gòu)。在步驟86的處理過程的開始,去除對指令信號(調(diào)度信號)的確認(rèn)。在步驟88,檢查取出的Java字節(jié)碼以確認(rèn)該字節(jié)碼是否是支持硬件翻譯的簡單字節(jié)碼。如果不支持硬件翻譯,則控制權(quán)在步驟90傳給解釋軟件,然后該軟件執(zhí)行ARM例程以解釋Java字節(jié)碼。如果字節(jié)碼是支持硬件翻譯的簡單字節(jié)碼,則處理過程前進(jìn)至步驟92,在該步驟,以多循環(huán)有限狀態(tài)機(jī)形式工作的Java字節(jié)碼翻譯器68按順序發(fā)出一個(gè)或多個(gè)ARM指令。一旦在步驟90或步驟92適當(dāng)?shù)貓?zhí)行了Java字節(jié)碼,則處理過程前進(jìn)至步驟94,在該步驟,在步驟86解除確認(rèn)之前在短時(shí)間段內(nèi)確認(rèn)該指令信號。對指令信號的確認(rèn)是向外部電路表示已達(dá)到適當(dāng)?shù)陌踩c(diǎn),在這種安全點(diǎn),可以產(chǎn)生基于計(jì)時(shí)器的調(diào)度中斷而不會因部分地執(zhí)行中斷或翻譯的指令而損失數(shù)據(jù)的完整性。
圖12說明了可用于響應(yīng)圖11所生成的指令信號的示例性電路。計(jì)時(shí)器76在給定時(shí)間周期結(jié)束之后周期性生成計(jì)時(shí)器信號。這種計(jì)時(shí)器信號存儲在鎖存器98內(nèi),直至鎖存器被清空計(jì)時(shí)器中斷信號所清空。鎖存器98的輸出由AND(與)門100在邏輯上與在步驟94確認(rèn)的指令信號相結(jié)合。當(dāng)鎖存器置位并指令信號被確認(rèn)時(shí),作為AND門100的輸出產(chǎn)生一中斷,該中斷用來觸發(fā)利用系統(tǒng)中設(shè)置的用于標(biāo)準(zhǔn)中斷處理的中斷處理機(jī)制來執(zhí)行調(diào)度操作的中斷。一旦生成了中斷信號,則該信號又會觸發(fā)產(chǎn)生清空計(jì)時(shí)器中斷信號,它清空鎖存器98,直至下一個(gè)計(jì)時(shí)器輸出脈沖出現(xiàn)。
圖13是說明圖12的電路操作的信號圖。處理器核芯時(shí)鐘信號按規(guī)則的頻率出現(xiàn)。計(jì)時(shí)器96按預(yù)定的周期生成計(jì)時(shí)器信號,以指示在安全時(shí)開始調(diào)度操作。計(jì)時(shí)器信號被鎖存。用一定間隔分隔開的時(shí)間生成指令信號,所述間隔取決于何等快速地執(zhí)行特定的Java字節(jié)碼。簡單Java字節(jié)碼可在單個(gè)處理器核芯時(shí)鐘周期或更一般地為兩個(gè)或三個(gè)的多個(gè)周期內(nèi)執(zhí)行,而提供高層管理類型功能的復(fù)雜Java字節(jié)碼則在其執(zhí)行由軟件解釋器完成之前要花費(fèi)數(shù)百個(gè)處理器時(shí)鐘周期。在每一種情況下,掛起的確認(rèn)鎖存計(jì)時(shí)器信號都不會起作用去觸發(fā)調(diào)度操作,直至指令信號指明開始調(diào)度操作是安全的。鎖存的計(jì)時(shí)器信號和指令信號的同時(shí)出現(xiàn)會觸發(fā)產(chǎn)生中斷信號,其后緊跟著清空鎖存器98的清空信號。
權(quán)利要求
1.用于處理數(shù)據(jù)的設(shè)備,該設(shè)備包括一處理器核芯,它可執(zhí)行第一指令集的指令所指定的操作,所述處理器核芯具有這樣的指令流水線,它可將要執(zhí)行的指令從存儲器取至該流水線,并且,指令沿該流水線前進(jìn);以及一指令翻譯器,它可將第二指令集的指令翻譯成與第一指令集的指令相對應(yīng)的翻譯器輸出信號;其中,所述指令翻譯器位于上述指令流水線內(nèi)并翻譯業(yè)已被從前述存儲器中取至所述指令流水線內(nèi)的第二指令集的指令;所述第二指令集的至少一個(gè)指令指定了一個(gè)需要多個(gè)操作的多步操作,所述多個(gè)操作可由第一指令集的指令來指定,以便由前述處理器核芯來加以執(zhí)行;以及所述指令翻譯器可生成翻譯器輸出信號序列,以便控制前述處理器核芯去執(zhí)行上述多步操作。
2.如權(quán)利要求1的設(shè)備,其特征在于,所述翻譯器輸出信號包括構(gòu)成前述第一指令集的指令的信號。
3.如權(quán)利要求1和2中的任何一項(xiàng)的設(shè)備,其特征在于,所述翻譯器輸出信號包括控制信號,這些信號控制所述處理器核芯的操作并與在對前述第一指令集的指令進(jìn)行解碼時(shí)產(chǎn)生的控制信號相匹配。
4.如權(quán)利要求1、2和3中任何一項(xiàng)的設(shè)備,其特征在于,所述翻譯器輸出信號包括控制信號,這些信號控制所述處理器核芯的操作并指定未被在對前述第一指令集的指令進(jìn)行解碼時(shí)產(chǎn)生的控制信號所指定的參數(shù)。
5.如前述權(quán)利要求中任何一項(xiàng)的設(shè)備,其特征在于,所述處理器核芯從前述存儲器內(nèi)由程序計(jì)數(shù)器值所指定的指令地址處取出指令,所述程序計(jì)數(shù)器值保存在上述處理器核芯內(nèi)。
6.如權(quán)利要求5的設(shè)備,其特征在于,在執(zhí)行所述第二指令集的指令時(shí),所述程序計(jì)數(shù)器值的增加量與第二指令集的指令是否指定多步操作無關(guān)。
7.如權(quán)利要求5和6中任何一項(xiàng)的設(shè)備,其特征在于,在執(zhí)行所述第二指令集的指令時(shí),所述程序計(jì)數(shù)器值增加以指定要加以執(zhí)行的第二指令集的下一個(gè)指令。
8.如權(quán)利要求5、6和7中任何一項(xiàng)的設(shè)備,其特征在于,如果在執(zhí)行所述第二指令集的指令時(shí)出現(xiàn)中斷,就保存所述程序計(jì)數(shù)器值,該值用于在上述中斷之后重新開始執(zhí)行第二指令集的所述指令。
9.如前述權(quán)利要求中任何一項(xiàng)的設(shè)備,其特征在于,所述第二指令集的指令規(guī)定了要對保存在棧內(nèi)的棧操作數(shù)執(zhí)行的操作。
10.如前述權(quán)利要求中任何一項(xiàng)的設(shè)備,其特征在于,所述處理器具有寄存器庫,它包含有多個(gè)寄存器,所述第一指令集的指令對保存在上述寄存器內(nèi)的寄存器操作數(shù)執(zhí)行操作。
11.如權(quán)利要求10的設(shè)備,其特征在于,所述寄存器庫中的一組寄存器保存著來自前述堆棧頂部的棧操作數(shù)。
12.如權(quán)利要求9和11的設(shè)備,其特征在于,所述指令翻譯器具有多種映射狀態(tài),其中,上述成組寄存器中的不同寄存器保存來自所述堆棧中不同位置的相應(yīng)棧操作數(shù),所述指令翻譯器可根據(jù)增加或去掉保存在上述堆棧中的棧操作數(shù)而在映射狀態(tài)之間移動(dòng)。
13.如前述權(quán)利要求中任何一個(gè)的設(shè)備,其特征在于,該設(shè)備還包括所述指令流水線內(nèi)的旁通通路,因此,在所述第二指令集的指令未被處理時(shí)可繞過所述指令翻譯器。
14.如前述權(quán)利要求中任何一個(gè)的設(shè)備,其特征在于,所述第二指令集的指令是Java虛擬機(jī)字節(jié)碼。
15.一種用帶有指令流水線的處理器核芯來處理數(shù)據(jù)的方法,要執(zhí)行的指令從存儲器取至該流水線,并且,指令沿該流水線前進(jìn),所述處理器核芯能執(zhí)行第一指令集所指定的操作,所述方法包括下列步驟將指令取至上述指令流水線;以及用前述指令流水線中的指令翻譯器將取出的第二指令集的指令翻譯成與上述第一指令集的指令相對應(yīng)的翻譯器輸出信號;其中所述第二指令集的至少一個(gè)指令指定了一需要多個(gè)操作的多步操作,所述多個(gè)操作可由前述第一指令集來指定,以便由上述處理器核芯執(zhí)行;以及所述指令翻譯器可生成一系列翻譯器輸出,以便控制上述處理器核芯,從而執(zhí)行前述多步操作。
16.一種計(jì)算機(jī)程序產(chǎn)品,它存放計(jì)算機(jī)程序,以控制計(jì)算機(jī)執(zhí)行權(quán)利要求13的方法。
17.用于處理數(shù)據(jù)的設(shè)備,該設(shè)備包括一處理器核芯,它可執(zhí)行第一指令集的指令所指定的操作,所述處理器核芯具有這樣的指令流水線,可將要執(zhí)行的指令從存儲器取至該流水線,并且,指令沿該流水線前進(jìn);以及一指令翻譯器,它可將第二指令集的指令翻譯成與第一指令集的指令相對應(yīng)的翻譯器輸出信號;其中,所述第二指令集的上述指令是變長指令;所述指令翻譯器位于上述指令流水線內(nèi)并翻譯業(yè)已從前述存儲器中在取階段取至所述指令流水線的第二指令集的指令;所述指令流水線的取階段包括一指令緩存,它存放著從所述存儲器中取出的至少一個(gè)當(dāng)前指令字以及下一個(gè)指令字,因此,若所述第二指令集的變長指令在前述當(dāng)前指令字內(nèi)開始并延伸至所述下一個(gè)指令字,則該下一個(gè)指令字可在上述流水線內(nèi)獲得,以便在不需要另外的取操作的情況下由所述指令翻譯器來翻譯。
18.如權(quán)利要求17的設(shè)備,其特征在于,所述指令字緩存是擺動(dòng)緩存。
19.如權(quán)利要求17和18中的任何一項(xiàng)設(shè)備,其特征在于,所述取階段包括多個(gè)多路復(fù)用器,它們用于從一個(gè)或多個(gè)所述當(dāng)前指令字和下一個(gè)指令字中選擇變長指令。
20.如權(quán)利要求17、18和19中的任何一項(xiàng)設(shè)備,其特征在于,所述第二指令集的指令是Java虛擬機(jī)字節(jié)碼。
21.如權(quán)利要求17至20中的任何一項(xiàng)設(shè)備,其特征在于,該設(shè)備還包括所述指令流水線內(nèi)的旁通通路,因此,在所述第二指令集的指令未作處理時(shí)可繞過所述指令翻譯器。
22.如權(quán)利要求17至21中的任何一項(xiàng)設(shè)備,其特征在于,所述第二指令集的至少一個(gè)指令指定了需要多個(gè)操作的多步操作,所述多個(gè)操作可由前述第一指令集來指定,以便由上述處理器核芯執(zhí)行;以及所述指令翻譯器可生成一系列翻譯器輸出,以便控制上述處理器核芯去執(zhí)行前述多步操作。
23.如權(quán)利要求22以及如權(quán)利要求2至12中的任何一項(xiàng)設(shè)備。
24.用能執(zhí)行第一指令集所指定的操作的處理器核芯來處理數(shù)據(jù)的方法,所述處理器核芯具有這樣的指令流水線,可將要執(zhí)行的指令從存儲器取至該流水線,并且,指令沿該流水線前進(jìn),所述方法包括下列步驟將指令取至上述指令流水線;以及用所述指令流水線內(nèi)的指令翻譯器將取出的第二指令集的指令翻譯成與第一指令集的指令相對應(yīng)的翻譯器輸出信號;其中,所述第二指令集的所述指令是變長指令;所述指令翻譯器位于上述指令流水線內(nèi)并翻譯業(yè)已從前述存儲器中在取階段取至所述指令流水線的第二指令;以及所述指令流水線的取階段包括一指令緩存,它存放著從所述存儲器中取出的至少一個(gè)當(dāng)前指令字以及下一個(gè)指令字,因此,若所述第二指令集的變長指令在前述當(dāng)前指令字內(nèi)開始并延伸至所述下一個(gè)指令字,則該下一個(gè)指令字可在上述流水線內(nèi)獲得,以便在不需要另外的取操作的情況下由所述指令翻譯器來翻譯。
25.一種計(jì)算機(jī)程序產(chǎn)品,它保存計(jì)算機(jī)程序,以便控制計(jì)算機(jī)來執(zhí)行權(quán)利要求24的方法。
全文摘要
一種處理系統(tǒng)具有指令流水線(30)和處理器核芯。在指令流水線中取階段(32)的下游處設(shè)置有一指令翻譯器,它用于將非本機(jī)指令翻譯成本機(jī)指令操作。所述指令翻譯器能以允許生成變長本機(jī)指令操作序列以模擬非本機(jī)指令的方式生成本機(jī)指令操作的多步序列。所述取階段配備有字緩存(62),它存儲當(dāng)前指令字和下一個(gè)指令字。因此,可以提供要跨越從存儲器中讀出的指令字的變長非本機(jī)指令,以便快速解碼,避免了耗費(fèi)能力的存儲器多次取操作。
文檔編號G06F9/48GK1484787SQ0182009
公開日2004年3月24日 申請日期2001年6月21日 優(yōu)先權(quán)日2000年10月5日
發(fā)明者E·C·內(nèi)維爾, A·C·羅斯, E C 內(nèi)維爾, 羅斯 申請人:Arm有限公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點(diǎn)贊!
1
常州市| 肥西县| 武冈市| 五寨县| 奉新县| 沙田区| 黄石市| 新津县| 霸州市| 库伦旗| 盱眙县| 新民市| 班玛县| 邢台市| 盐城市| 克什克腾旗| 集贤县| 四会市| 沭阳县| 泉州市| 额济纳旗| 揭东县| 文成县| 遵义市| 堆龙德庆县| 民勤县| 镇雄县| 苏州市| 维西| 突泉县| 琼海市| 双流县| 文水县| 喀喇沁旗| 娱乐| 兴仁县| 栖霞市| 深水埗区| 来安县| 靖安县| 德格县|