專利名稱:在多指令集系統(tǒng)中對未處理操作的處理的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及數(shù)據(jù)處理系統(tǒng)領(lǐng)域。更具體而言,本發(fā)明涉及在支持多指令集的系統(tǒng)中對未處理操作的處理。
提供支持多指令集的數(shù)據(jù)處理系統(tǒng)是眾所周知的。這種系統(tǒng)的一個例子是由英格蘭劍橋ARM有限公司所生產(chǎn)的支持Thumb指令的處理器。這些啟用Thumb指令的處理器支持32位ARM指令和16位Thumb指令的執(zhí)行。
在數(shù)據(jù)處理系統(tǒng)中,程序指令不能夠直接被所述數(shù)據(jù)處理系統(tǒng)處理的情況會時常發(fā)生。相應(yīng)地,提供處理這種未處理操作的機制也是眾所周知的。這種情形的例子是預(yù)取指令中止。眾所周知的是,當(dāng)在虛擬存儲器系統(tǒng)中預(yù)取指令時,指令的加載可能會跨過頁面邊界,并且中止也會由于新的頁面還沒有被正確地映射到所述虛擬存儲器系統(tǒng)中而發(fā)生。然后,就可以完成正確的映射并且重新發(fā)出指令預(yù)取。
這種情形的另一個例子是執(zhí)行浮點指令。眾所周知的是,在浮點運算執(zhí)行期間,所述數(shù)據(jù)處理系統(tǒng)不能直接處理的情形有可能會發(fā)生。這對于與IEEE 754規(guī)范相兼容的浮點系統(tǒng)而言尤其如此。這種情形的例子是除以零的運算、涉及NaN的任何操作、涉及無窮大的任一操作或者涉及反向規(guī)格化數(shù)的某些操作。
問題出現(xiàn)的原因在于當(dāng)添加一個新指令集時,人們需要花費相當(dāng)大的精力和相當(dāng)可觀的開發(fā)來確保用于所有可能發(fā)生的中止的合適中止機制是適當(dāng)?shù)摹?br>
當(dāng)未處理的浮點運算發(fā)生時,一個特別的問題會發(fā)生。許多系統(tǒng)依靠檢查指令流來確定還沒有被處理過的浮點運算。使用新指令集,這些系統(tǒng)不得不被重寫以便迎合所述新指令集。此外,當(dāng)所述新指令集能夠為新指令集的單條指令生成多個浮點運算時,問題也會出現(xiàn)。在這一情況下,讓所述系統(tǒng)通過檢查指令流來確定哪個浮點運算還沒有被處理過也許是不可能的,因為單條指令可以引起不止一個未處理的浮點運算。
另一個問題出現(xiàn)在所述未處理浮點運算是不精確之時,也就是說,在執(zhí)行生成浮點運算的指令之時,所述未處理浮點運算沒有被檢測,而相反在以后的某個時候被檢測。這種情形發(fā)生的原因是由于許多浮點系統(tǒng)的并行性質(zhì)。所述數(shù)據(jù)處理系統(tǒng)在碰到指定浮點運算的指令時,給浮點子系統(tǒng)發(fā)出浮點運算。一旦所述浮點運算已經(jīng)被發(fā)送給所述浮點子系統(tǒng),則所述主數(shù)據(jù)處理系統(tǒng)繼續(xù)執(zhí)行在指令流中的其他指令。在所述浮點子系統(tǒng)檢測未處理浮點運算并且將未處理操作狀態(tài)發(fā)信號通知給所述主數(shù)據(jù)處理系統(tǒng)之前,許多指令都可以被執(zhí)行。在這一情況下,未處理浮點運算的原因都無法通過檢查指令流來加以確定。眾所周知的是,在像上述的情況下,包含了用于標(biāo)識未處理浮點運算的寄存器的浮點系統(tǒng),例如是由英格蘭劍橋ARM有限公司所生產(chǎn)的向量浮點系統(tǒng)。
在許多系統(tǒng)中,讓浮點子系統(tǒng)在任意點將未處理操作發(fā)信號通知主數(shù)據(jù)處理系統(tǒng)是不可能的,未處理操作僅僅在主數(shù)據(jù)處理系統(tǒng)與浮點子系統(tǒng)執(zhí)行握手的、已經(jīng)定義好的點才可以被發(fā)信號通知給主數(shù)據(jù)處理系統(tǒng)。典型地,這些握手僅僅發(fā)生在執(zhí)行指定浮點運算的指令之時。在這一情況下,未處理浮點運算不能夠被發(fā)信號通知給主數(shù)據(jù)處理系統(tǒng),直到主數(shù)據(jù)處理系統(tǒng)執(zhí)行指定浮點運算的另一條指令時為止。
引入那種可以結(jié)合不精確的未處理浮點運算執(zhí)行每指令多個浮點運算的新指令集,導(dǎo)致很困難的問題或者使系統(tǒng)不可能來處理未處理浮點運算。所述系統(tǒng)無法確定哪條指令引發(fā)過未處理浮點運算,并且它還無法確定一旦所述未處理浮點運算已經(jīng)被處理了,指令流中的執(zhí)行應(yīng)該從哪里繼續(xù)。
從一方面來看,本發(fā)明提供了如下裝置,所述裝置用于在來自第一指令集和一個或者多個其他指令集的程序指令的控制之下來處理數(shù)據(jù),所述裝置包括未處理操作檢測器,可操作地來檢測所述第一指令集的程序指令的未處理操作;和未處理操作處理器,可操作地來在檢測所述未處理操作時,觸發(fā)使用所述一個或多個其他指令集中的至少一個指令集的一條或者多條指令來仿真所述第一指令集的所述指令。
本發(fā)明認為上述問題可以通過如下安排而得到相當(dāng)大的減少,即,安排所述系統(tǒng)來識別第一指令集中的未處理操作,而不必設(shè)法來修補所述情形并且重新執(zhí)行所涉及到的第一指令集指令。取而代之,引起過所述未處理操作的第一指令集(新指令集)的指令被采用所述一個或多個其他指令集(例如,第二指令集)的一條或者多條指令加以仿真。根據(jù)發(fā)生了的未處理操作的類型,可能的情況是在仿真時,所述未處理操作將不會重新發(fā)生。可替換地,如果在使用所述一個或多個其他指令集的指令進行仿真時,未處理操作又發(fā)生了,則處理所述一個或多個其他指令集的這種未處理操作的現(xiàn)有機制可以被用來克服未處理操作。
所述未處理操作處理器可以發(fā)出指令以便清除數(shù)據(jù)處理系統(tǒng)的未處理操作狀態(tài)。一些數(shù)據(jù)處理系統(tǒng)包括一個或者多個標(biāo)志,所述標(biāo)志用于記錄數(shù)據(jù)處理系統(tǒng)是否處在未處理操作狀態(tài)之中。在仿真所述第一指令集的所述指令之前,這種標(biāo)志可能需要未處理操作處理器來清除。所述標(biāo)志是否需要被清除取決于未處理操作的類型以及是否存在與那種未處理操作類型相關(guān)聯(lián)的標(biāo)志。
盡管本發(fā)明是屬于通用型的,但是本發(fā)明卻特別好地適用于如下系統(tǒng),在所述系統(tǒng)中,第一指令集是可變長度指令集,所述一個或多個其他指令集則是固定長度指令集。這種組合是這樣的其中在固定指令集中不可能的新類型的未處理操作在可變長度指令集中卻是可能的,并且其中,在當(dāng)未處理操作自身結(jié)合可變長度第一指令集發(fā)生時,為處理在所述一個或多個其他指令集中的那些未處理操作而開發(fā)的機制并不是很容易地就適合于來處理所述未處理操作。
本發(fā)明在其中具有極強優(yōu)勢的特定情形是處理可變長度指令的提取中止。在這種情形下,可變長度指令可以跨越不止一個指令字,并且對于引起過所述未處理操作的那個指令字的提取,它也許能并不清除。這樣就會在正確地處理所述未處理操作中引發(fā)困難。
本技術(shù)還特別好地適用于包含浮點系統(tǒng)或者子系統(tǒng)的系統(tǒng),在所述系統(tǒng)中,第一指令集的單條指令可以生成多個浮點運算,或者發(fā)信號通知未處理浮點運算是不精確的。
本發(fā)明在其中具有極強優(yōu)勢的特定情形是在如下系統(tǒng)中,在所述系統(tǒng)中,結(jié)合不精確地發(fā)信號通知未處理浮點運算,第一指令集的單條指令可以生成多個浮點運算。在這種情形下,讓所述系統(tǒng)確定第一指令集的哪一條指令引發(fā)過未處理浮點運算也許是不可能的。
本發(fā)明通過觸發(fā)使用所述一個或多個其他指令集的一條或多條指令來仿真第一指令集的如下指令來克服這一情形,所述指令在未處理浮點運算已被觸發(fā)之時正在被執(zhí)行。第一指令集中的、未處理浮點運算被觸發(fā)之時正在被執(zhí)行的指令可能是、也可能不是引發(fā)所述未處理浮點運算的那條指令。不管第一指令集中的、未處理浮點運算被觸發(fā)之時正在被執(zhí)行的指令是否引發(fā)過未處理浮點運算,對第一指令集中的、未處理浮點運算被觸發(fā)之時正在被執(zhí)行的指令的仿真,將能夠使用于處理所述一個或多個其他指令集的這種未處理操作的現(xiàn)有機制被利用來克服所述未處理操作。
在使用所述一個或多個其他指令集的指令對第一指令集的所述指令進行仿真之前,如果存在一個未處理浮點運算標(biāo)志,則所述未處理浮點運算處理器可能需要將其清除。
如果第一指令集中的、未處理浮點運算被觸發(fā)之時正在被執(zhí)行的指令是引發(fā)未處理浮點運算的那條指令,則在那條指令被仿真之時,相同的未處理浮點運算將再次發(fā)生,并且用于處理所述一個或多個其他指令集的這種未處理操作的現(xiàn)有機制將被用來克服所述未處理操作。
如果因為數(shù)據(jù)處理系統(tǒng)采用了不精確的未處理浮點運算檢測,所以第一指令集中的、未處理浮點運算被觸發(fā)之時正在被執(zhí)行的指令不是引發(fā)未處理浮點運算的那條指令,則在那條指令被仿真之時,相同的未處理浮點運算將不會發(fā)生。在這一情況下,數(shù)據(jù)處理系統(tǒng)通常將使未處理浮點運算標(biāo)志或等效機制來記錄未處理浮點運算已經(jīng)發(fā)生這一事實。此外,數(shù)據(jù)處理系統(tǒng)通常還將記錄引發(fā)過未處理浮點運算的浮點運算。
清除用于記錄未處理浮點運算已經(jīng)發(fā)生這一事實的所述標(biāo)志或者其他機制,通常將能夠使用于處理所述一個或多個其他指令集的這種未處理操作的現(xiàn)有機制被利用來克服未處理操作。
在其他系統(tǒng)中,有必要測試所述標(biāo)志或者其他機制,如果它指示未處理浮點運算已經(jīng)被記錄過了,則在清除所述標(biāo)志或其他機制之前,顯式地利用所述一個或多個其他指令集的、用于處理這種未處理操作的機制。利用所述一個或多個其他指令集的、用于處理所述未處理操作的機制還可以自動地清除所述標(biāo)志或其他機制,在這一情形下,不需要讓未處理浮點運算處理器來顯式地清除所述標(biāo)志或者其他機制。
在另外的其他系統(tǒng)上,可以不必測試所述標(biāo)志或其他機制。取而代之,利用所述一個或多個其他指令集的、用于處理所述未處理操作的機制可能就足夠了。上述可以足夠的原因在于,眾所周知的是,憑借系統(tǒng)在未處理浮點運算處理器中執(zhí)行代碼這一事實,所述標(biāo)志或者其他機制被置位,或者也可能是這種情況,即,所述機制的利用將涉及到測試所述標(biāo)志或者其他機制以及可能后續(xù)對其進行的清除,它們都作為利用所述機制的整體的一部分。
不管在可以隨不同數(shù)據(jù)處理系統(tǒng)而變化的未處理浮點處理器中所采用的確切技術(shù)是什么,在第一指令集中的、未處理浮點運算被觸發(fā)之時正在被執(zhí)行的指令不是引發(fā)未處理浮點運算的那條指令的情形下,在仿真第一指令集中的、引發(fā)過未處理浮點操的那條指令之前,所述未處理浮點運算將被弄清楚。在這一情況下,仿真第一指令集中的那條指令可能會、也可能不會引發(fā)未處理操作。然而,因為不知道它是否會引發(fā)未處理操作,所以,不可能簡單地恢復(fù)執(zhí)行,所以隨著所述未處理浮點運算被重復(fù)地觸發(fā),并且未處理浮點運算處理器重復(fù)地重新執(zhí)行所述指令,這樣也許就會引發(fā)可能是無窮的循環(huán)。因此,第一指令集的指令必須要被仿真,并恢復(fù)執(zhí)行后面的指令。
本技術(shù)還特別好地適用于如下的情形,在所述情形中,所述一個或多個其他指令集是處理器核心的本機指令集,所述處理器核心趨向于具有一組開發(fā)得很好的中止處理器,并且第一指令集是要求在以后的某個日子來為其添加支持的解釋型指令集。這種可變長度解釋型的第一指令集的特別例子是Java字節(jié)碼指令。
從另一方面來看,本發(fā)明提供一種方法,用于在第一指令集和一個或多他其他指令集的程序指令的控制下處理數(shù)據(jù),所述方法包括如下步驟檢測所述第一指令集的程序指令的未處理操作;和當(dāng)檢測所述未處理操作時,觸發(fā)使用所述一個或多個其他指令集的至少一個指令集的一條或多條指令來仿真所述第一指令集的所述指令。
從本發(fā)明的再一個方面來看,本發(fā)明還提供一種計算機程序產(chǎn)品,用于控制數(shù)據(jù)處理裝置在第一指令集和一個或多他其他指令集的程序指令的控制下處理數(shù)據(jù),所述計算機程序產(chǎn)品包括未處理操作處理器邏輯,可操作地在檢測到未處理操作時,觸發(fā)使用所述一個或多個其他指令集的至少一個指令集的一條或多條指令來仿真一個指令集中引起所述未處理操作的指令。
本發(fā)明除了將自身表示在裝置和操作裝置的方法方面,本發(fā)明還可以將自身表示成充當(dāng)未處理操作處理器的計算機支持代碼的形式。這種支持代碼可以采用獨立可記錄的介質(zhì)來加以分發(fā),作為固件或采用某種其他方式被嵌入到嵌入式處理系統(tǒng)中。
本發(fā)明的實施例在以下將僅僅采用舉例的方式并參考附圖來加以描述,在所述附圖中
圖1圖示了一種并入字節(jié)碼翻譯硬件的數(shù)據(jù)處理系統(tǒng);圖2示意性地圖示了對字節(jié)碼的軟件指令解釋;圖3是示意性地表示以序列終止指令結(jié)尾的代碼片斷在軟件指令解釋器之中操作的流程圖;圖4是執(zhí)行代替字節(jié)碼的代碼片斷的例子;圖5圖示了沒有硬件字節(jié)碼執(zhí)行支持的數(shù)據(jù)處理系統(tǒng)的例子;圖6是圖示當(dāng)與圖5的系統(tǒng)一起操作時軟件指令解釋器活動的流程圖;圖7圖示了在Java字節(jié)碼和處理操作之間的映射;圖8圖示了采用內(nèi)容可編址存儲器的形式的可編程翻譯表;圖9圖示了采用隨機存取存儲器形式的可編程翻譯表;圖10是示意性地圖示可編程翻譯表的初始化和編程的流程圖;圖11是示意性圖示在系統(tǒng)之中執(zhí)行Java字節(jié)碼解釋的處理流水線部分的方框圖;圖12示意性地圖示了跨越兩個指令字和兩個虛擬存儲器頁的可變長度指令;圖13示意性地圖示了包括了用于處理圖12所示預(yù)取中止類型的機制的數(shù)據(jù)處理系統(tǒng)流水線部分;圖14給出了邏輯表達式,它是一種指定如何檢測圖12所示的預(yù)取中止類型的方式;圖15示意性地圖示了用于中止處理和指令仿真的支持代碼的裝置;圖16是示意性地圖示了用于處理可變長度字節(jié)碼指令的預(yù)取中止所執(zhí)行的處理的流程圖;圖17圖示了操作系統(tǒng)和受該操作系統(tǒng)控制的各種進程之間的關(guān)系;圖18圖示了包括處理器核心和Java加速器的處理系統(tǒng);圖19是示意性地圖示正在控制Java加速器配置中的操作系統(tǒng)運行的流程圖;圖20是示意性地圖示Java虛擬機結(jié)合Java加速機制運行的流程圖,其中,所述Java虛擬機在控制Java加速機制的配置中使用。
圖21圖示了并入圖1中的字節(jié)碼翻譯硬件的數(shù)據(jù)處理系統(tǒng),它還并入了浮點子系統(tǒng);圖22圖示了并入圖1中的字節(jié)碼翻譯硬件和圖21中的浮點子系統(tǒng)的數(shù)據(jù)處理系統(tǒng),它還并入了浮點運算寄存器和未處理操作狀態(tài)標(biāo)志;圖23顯示了為Java浮點指令所生成的ARM浮點指令;圖24顯示了可以由Java加速硬件為Java‘dmul’和‘dcmpg’指令生成的ARM指令序列;圖25顯示了當(dāng)執(zhí)行接著‘dcmpg’指令的‘dmul’指令時的操作序列,其中未處理浮點運算是通過執(zhí)行由Java加速硬件為Java‘dmul’指令所生成的‘FCMPD’指令引發(fā)的,所示的操作序列適用于使用對應(yīng)于圖22的不精確的未處理操作檢測的系統(tǒng);圖26顯示了在執(zhí)行圖25的FMULD指令之后的浮點運算寄存器的狀態(tài)和未處理操作狀態(tài)標(biāo)志;圖27顯示了當(dāng)執(zhí)行接著‘dcmpg’指令的‘dmul’指令時的操作序列,其中未處理浮點運算是通過執(zhí)行由Java加速硬件為Java‘dcmpg’指令所生成的‘FCMPD’指令引發(fā)的,所表示的操作序列適用于使用對應(yīng)于圖22的不精確的未處理操作檢測的系統(tǒng);
圖28顯示了在執(zhí)行圖27的FCMPD指令之后的浮點運算寄存器的狀態(tài)和未處理操作狀態(tài)標(biāo)志;圖29顯示了當(dāng)執(zhí)行接著‘dcmpg’指令的‘dmul’指令時的操作序列,其中未處理浮點運算是通過執(zhí)行由Java加速硬件為Java‘dmul’指令所生成的‘FMULD’指令引發(fā)的,所表示的操作序列適用于使用對應(yīng)于圖21的精確的未處理操作檢測的系統(tǒng);圖30顯示了當(dāng)執(zhí)行接著‘dcmpg’指令的‘dmul’指令時的操作序列,其中未處理浮點運算是通過執(zhí)行由Java加速硬件為Java‘dcmpg’指令所生成的‘FCMPD’指令引發(fā)的,所表示的操作序列適用于使用對應(yīng)于圖21的精確的未處理操作檢測的系統(tǒng)。
圖1圖示了數(shù)據(jù)處理系統(tǒng)2,它并入了處理器核心4(諸如ARM處理器)以及字節(jié)碼翻譯硬件6(也稱為Jazelle)。處理器核心4包括寄存器庫8、指令譯碼器10以及數(shù)據(jù)通路12,所述處理器核心4用于對存儲在寄存器庫8的寄存器之中的數(shù)據(jù)值執(zhí)行各種數(shù)據(jù)處理操作。所提供的寄存器18包括用于控制字節(jié)碼翻譯硬件6當(dāng)前是啟用還是禁止的標(biāo)志20。此外,所提供的寄存器19包括用于指示字節(jié)碼翻譯硬件當(dāng)前是活動還是不活動的標(biāo)志21。換言之,標(biāo)志21指示數(shù)據(jù)處理系統(tǒng)當(dāng)前是執(zhí)行Java字節(jié)碼還是執(zhí)行ARM指令。應(yīng)該理解,在其它實施例中,寄存器18和19可以是包括了標(biāo)志20和21這兩者的單個寄存器。
在運行時,如果Java字節(jié)碼處于執(zhí)行中,并且字節(jié)碼翻譯硬件6是活動的,則Java字節(jié)碼由字節(jié)碼翻譯硬件6接收,并且用于生成對應(yīng)的ARM指令序列(在這一特定的沒有限制的示例實施例中),或者生成至少表示ARM指令的處理器核心控制信號,然后它們被傳遞到處理器核心4。因此,字節(jié)碼翻譯硬件6可以把單個Java字節(jié)碼映射為可以被處理器核心4執(zhí)行的對應(yīng)的ARM指令序列。當(dāng)字節(jié)碼翻譯硬件不活動時,它將被繞過并且可以將一般ARM指令供應(yīng)到ARM指令譯碼器10,以便根據(jù)其本機指令集控制處理器核心4。應(yīng)該理解,ARM指令序列可以等同于Thumb指令序列和/或不同指令集中的指令的混合,而且這種替換被考慮和包括。
應(yīng)該理解,字節(jié)碼翻譯硬件6僅僅可以對也許會碰到的可能的Java字節(jié)碼的子集提供硬件翻譯支持。某些Java字節(jié)碼可能要求如此擴展和抽象的處理以至于在硬件中嘗試將這些映射成對應(yīng)的ARM指令操作常常是低效率的。因此,當(dāng)字節(jié)碼翻譯硬件6碰到這種沒有硬件支持的字節(jié)碼時,它將觸發(fā)用ARM本機指令所寫的軟件指令解釋器來執(zhí)行由所述沒有硬件支持的Java字節(jié)碼指定的處理。
軟件指令解釋器可以被寫入以便為所有可以被解釋的可能Java字節(jié)碼提供軟件支持。如果字節(jié)碼翻譯硬件6存在并被啟用,則只有那些沒有硬件支持的Java字節(jié)碼將正常地被提交到軟件指令解釋器之中的相關(guān)代碼片段。然而,如果字節(jié)碼翻譯硬件6沒有提供或者是禁止的(諸如在調(diào)試等期間),則所有的Java字節(jié)碼都將被提交到軟件指令解釋器。
圖2示意性地圖示了軟件指令解釋器的活動。Java字節(jié)碼流22代表Java程序。這些Java字節(jié)碼可以與操作數(shù)互相交錯。因此,在執(zhí)行給定的Java字節(jié)碼之后,要執(zhí)行的下一個Java字節(jié)碼可能緊跟著出現(xiàn)在后面的字節(jié)位置,或者如果存在有插入的操作數(shù)字節(jié),則可能是再后面的若干個字節(jié)位置。
如圖2所示,遇到Java字節(jié)碼BC4,它得不到字節(jié)碼翻譯硬件6的支持。這將在字節(jié)碼硬件翻譯6之中觸發(fā)如下異常,所述異常將引發(fā)使用字節(jié)碼值BC4作為索引在指針表24中執(zhí)行的查詢,以便讀取指向代碼片段26的指針P#4,所述代碼片段26將執(zhí)行得不到硬件支持的字節(jié)碼BC4指定的處理。指針表的基地址值還可以存儲在寄存器中。接著通過指向得不到支持的字節(jié)碼BC4的R14進入所選定的代碼片段。
如所圖示的,因為存在256個可能的字節(jié)碼值,所述指針表24包括256個指針。相似地,最大可提供256個ARM本機指令代碼片段,用于執(zhí)行由所有可能的Java字節(jié)碼所指定的處理。(在兩個字節(jié)碼能夠使用相同代碼片段的情況下,可以少于256個)。為了提高處理速度,字節(jié)碼翻譯硬件6典型地為許多單個Java字節(jié)碼提供硬件支持,在這一情況下,在軟件指令解釋器之中的對應(yīng)代碼片段將永遠得不到使用,除非強制使用(諸如在調(diào)試期間或者在其它環(huán)境中(諸如在后面將要論述的預(yù)取中止等))。然而,因為這些通常是比較簡單和比較短的代碼片段,所以由于提供它們所產(chǎn)生的額外存儲器開銷就相對地小。此外,這種小的額外的存儲器開銷,要大于軟件指令解釋器的普遍性質(zhì)以及在字節(jié)碼翻譯硬件不存在或者被禁止的情形下其處理所有可能的Java字節(jié)碼的能力所補償?shù)拈_銷。
可以看出,圖2的代碼片段26中的每個都是以序列終止指令BXJ結(jié)尾的。這種序列終止指令BXJ的活動隨著如圖3所示的數(shù)據(jù)處理系統(tǒng)2的狀態(tài)而變化。圖3是采用高層原理的形式來圖示由軟件指令解釋器之中的代碼片段26所執(zhí)行的處理的流程圖。在步驟28,正在被解釋的Java字節(jié)碼指定的操作被執(zhí)行。在步驟30,將要執(zhí)行的下一個Java字節(jié)碼從字節(jié)碼流22中讀取,并且在Java字節(jié)碼流22之中對應(yīng)下一個Java字節(jié)碼的字節(jié)碼指針被存儲在寄存器庫8中的寄存器(即R14)之中。因此,對于圖2的Java字節(jié)碼BC4,下一個Java字節(jié)碼將是BC5,并且指向Java字節(jié)碼BC5的存儲器單元的指針被加載到寄存器R14。
在步驟32,在指針表24之中對應(yīng)于下一個Java字節(jié)碼BC5的指針被從指針表24中讀取,并且被存儲在寄存器庫8的寄存器即R12之中。
應(yīng)該理解,圖3圖示了獨立、順序地被執(zhí)行的步驟28、30以及32。然而,根據(jù)已知的編程技術(shù),步驟30和32的處理按照常規(guī)可以交織在步驟28的處理之中,以便利用在步驟28的處理過程中不用就會浪費的處理機會(周期)。因此,步驟30和32的處理可以使用相對小的執(zhí)行速度開銷而被實現(xiàn)。
步驟34使用被指定為操作數(shù)的寄存器R14來執(zhí)行序列終止指令BXJ。
在步驟34執(zhí)行BXJ指令之前,系統(tǒng)的狀態(tài)已經(jīng)通過如下指針設(shè)置過了,所述指針是指向Java字節(jié)碼流22之中的下一個Java字節(jié)碼的、正存儲在寄存器R14之中的指針;以及指向?qū)?yīng)于所述下一個Java字節(jié)碼的代碼片段、正存儲在寄存器R12之中的指針。對特定寄存器的選擇可以是變化的,并且沒有、一個或者兩個都被指定為針對序列終止指令的操作數(shù)或者是由所述體系結(jié)構(gòu)所預(yù)定和定義的。
步驟28、30、32和34主要是軟件步驟。在圖3的步驟34之后的那些步驟主要是硬件步驟,并且是在沒有獨立地可標(biāo)識的程序指令的情況下發(fā)生的。在步驟36,硬件檢測字節(jié)碼翻譯硬件6是否是活動的。它是通過讀取字節(jié)碼翻譯硬件6存在和啟用的寄存器標(biāo)志值而進行的。用于確定活動的字節(jié)碼翻譯硬件6的存在的其它機制也是可能的。
如果字節(jié)碼翻譯硬件6存在的并且是啟用的,則處理進行到步驟38,在步驟38,將控制與指定字節(jié)碼指針的寄存器R14的內(nèi)容一起傳遞給字節(jié)碼翻譯硬件6,其中所述字節(jié)碼指針指向字節(jié)碼流22之中的、字節(jié)碼翻譯硬件6嘗試將其作為它的下一個字節(jié)碼來執(zhí)行的字節(jié)碼。所示的代碼片段26的活動然后就終止。
可替換地,如果在步驟36的判定是這樣的沒有字節(jié)碼翻譯硬件6或者字節(jié)碼翻譯硬件6是禁止的,則處理進行到步驟40,在步驟40,進行在本機ARM指令代碼中的跳轉(zhuǎn),以便開始執(zhí)行在軟件指令解釋器之中的、由存儲在寄存器R12之中的地址所指向的代碼片段。因此,對下一個代碼片段的快速執(zhí)行將被啟動,從而得到在處理速度上的優(yōu)勢。
圖4更加詳細地圖示了特定代碼片段。這一特定例子是整數(shù)加法Java字節(jié)碼,它的助記符為iadd。
第一ARM本機指令使用寄存器R14中的已增量1的字節(jié)碼指針,以便讀取下一個字節(jié)碼值(整數(shù)加指令沒有任何跟隨的字節(jié)碼操作數(shù),因此下一個字節(jié)碼將緊跟著當(dāng)前字節(jié)碼)。寄存器R14中的字節(jié)碼指針還以增量值被更新了。
第二和第三指令用來從堆棧中獲取將要被相加的兩個整數(shù)操作數(shù)值。
第四指令利用由于在寄存器R0上的寄存器互鎖而不用就會浪費的處理周期,以便為存儲在寄存器R4中的下一個字節(jié)碼獲取代碼片段的地址值,并且將這一地址存儲在寄存器R12之中。寄存器Rexc用于存儲指向指針表24的開始的基指針。
第五指令執(zhí)行由Java字節(jié)碼指定的整數(shù)加。
第六指令將Java字節(jié)碼的結(jié)果反向存儲到堆棧中。
最后的指令是使用操作數(shù)R12所指定的序列終止指令BXJ。如果要求軟件解釋,則寄存器R12存儲對于軟件解釋下一個Java字節(jié)碼所需要的ARM代碼片段的地址。BXJ指令的執(zhí)行確定是否存在啟用的字節(jié)碼翻譯硬件6。如果它存在,則控制就同存儲在寄存器R14之中的指定下一個字節(jié)碼地址的操作數(shù)一起傳遞到這一字節(jié)碼翻譯硬件6。如果活動的字節(jié)碼翻譯硬件6不存在,則開始執(zhí)行由寄存器R12之中的地址值所指向的下一個字節(jié)碼的代碼片段。
圖5示意性地圖示了與圖1相似的數(shù)據(jù)處理系統(tǒng)42,例外的是,在這種情況下,不提供字節(jié)碼翻譯硬件6。在這一系統(tǒng)中,標(biāo)志21總是指示ARM指令處于執(zhí)行之中,并且使用BXJ指令進入Java字節(jié)碼的執(zhí)行的嘗試總是被當(dāng)作好像字節(jié)碼翻譯硬件6是禁止的,標(biāo)志20被忽略了的情況一樣來處理。
圖6圖示了系統(tǒng)42在執(zhí)行Java字節(jié)碼時所執(zhí)行的處理的流程圖。這與圖3的處理是相似的,原因在于,相同的軟件解釋器代碼處于使用之中,除了在序列終止指令BXJ被執(zhí)行時的情況之外,所以不可能有硬件字節(jié)碼支持,并且由此處理總是這樣繼續(xù),也就是跳轉(zhuǎn)到執(zhí)行由R12所指向的、作為下一個Java字節(jié)碼的代碼片段的代碼片段。
應(yīng)該理解,在這一情況之下的軟件指令解釋器是作為ARM本機指令被提供的。軟件指令解釋器(或者其它的支持代碼)可以作為有其自身的版權(quán)的獨立的計算機程序產(chǎn)品被提供。這一計算機程序產(chǎn)品可以通過記錄介質(zhì)(諸如軟盤或者CD)來發(fā)布或者可以通過網(wǎng)絡(luò)鏈接動態(tài)地下載。在本發(fā)明特別好地適合于用在其中的嵌入式處理應(yīng)用的情況下,軟件指令解釋器可以作為嵌入式系統(tǒng)中的只讀存儲器或者一些其它非易失性程序存儲設(shè)備之中的固件而被提供。
圖7圖示了Java字節(jié)碼和它們所指定的處理操作之間的關(guān)系。從圖7可以看出,8位Java字節(jié)碼提供256個可能的不同字節(jié)碼值。這些Java字節(jié)碼中的第一個203從屬于以Java標(biāo)準(zhǔn)所指定的、對應(yīng)的處理操作(諸如前面所論述的iadd)的固定式綁定。最后兩個Java字節(jié)碼即254和255在作為定義的實施的Java虛擬機規(guī)范之中進行論述。因此,Java實施是隨意分配固定式綁定給這些字節(jié)的。或者,Java實施可以選擇將這些作為可編程式綁定對待。Jazelle為這些字節(jié)碼指定固定式綁定。在包含的字節(jié)碼值203和253之間,可編程式綁定可以按照用戶的希望而指定。這些通常用于提供在字節(jié)碼和處理操作之間的綁定,諸如在運行時被解析的快速形式字節(jié)碼(參見《Java虛擬機規(guī)范》,作者Tim Lindholm和Frank Yellin,發(fā)行商AddisonWesley,ISBN 0-201-63452-X)。
根據(jù)圖7應(yīng)該理解,盡管硬件加速的解釋技術(shù)非常適合于處理固定式綁定,但是這些技術(shù)卻不怎么適合于可編程式綁定。盡管有可能使用軟件解釋技術(shù)來處理所有的可編程式綁定,諸如解釋對應(yīng)的代碼片段所代表的相關(guān)字節(jié)碼,但是由于在一些情況下可能成為性能關(guān)鍵字節(jié)碼的內(nèi)容而會是慢速的。
圖8圖示了可編程翻譯表的一種形式。這一可編程翻譯表100采用的是內(nèi)容可尋址存儲器的形式。要翻譯的字節(jié)碼被輸入到CAM查詢陣列102。如果這一陣列102包含匹配的字節(jié)碼條目,則生成命中,它引發(fā)指定要輸出的值的對應(yīng)操作,即如果在CAM表中存在匹配的字節(jié)碼條目,則硬件使用指定操作的代碼來確定要在硬件中執(zhí)行的操作,執(zhí)行上述操作并移動到下一個字節(jié)碼;如果在CAM表中不存在匹配的字節(jié)碼條目,則字節(jié)碼就被當(dāng)作得不到硬件支持來處理并且調(diào)用其代碼片段。
在這個例子中,指定操作的值是4位值,并且已經(jīng)引起命中的CAM條目對應(yīng)于字節(jié)碼bc6。根據(jù)圖7可以看出,可能要進行這種可編程翻譯的所有字節(jié)碼的最高有效的兩位是“1”,因此只有這些字節(jié)碼的最低有效的6位需要被輸入到陣列102。
在這一例子的可編程翻譯表100有8個條目。存在的條目數(shù)可以隨著專用于這一任務(wù)所需要的硬件資源的量而變化。在一些例子中,可以只提供四個條目,不過在其它情況下10個條目也許是適當(dāng)?shù)?。還有可能為每個可能的可編程式綁定字節(jié)碼提供條目。
可以理解,如果可用的可編程映射資源首先被最關(guān)鍵的翻譯占用,則不是很關(guān)鍵的翻譯可能就接受軟件解釋。提供軟件解釋器結(jié)合可編程翻譯表允許配置系統(tǒng)以及對生成的表進行編程,而不需要知道有多少表條目可以使用,因為如果表溢出,則所要求的翻譯將被捕獲(trap)并且由軟件解釋器來執(zhí)行。
圖9圖示了可編程翻譯表104的第二個例子。在這一例子中,翻譯表采用隨機存取存儲器的形式來提供,所述隨機存取存儲器包括要輸入到譯碼器106進行翻譯的字節(jié)碼,譯碼器106將字節(jié)碼處理為到4位字的RAM陣列108的地址,每個字代表操作指定的代碼。在這種情況下,指定操作的代碼總是對應(yīng)字節(jié)碼。因此,這種類型的表使用額外的指定操作的代碼,它指定“調(diào)用這一字節(jié)碼的代碼片段”。
圖10是圖示初始化和配置具有圖8的例子的形式的可編程映射硬件解釋器的示意性的流程圖。實際上,在這一流程圖中所圖示的活動的不同部分分別由軟件初始化指令和對應(yīng)于這些指令的硬件來執(zhí)行。
在步驟110,表初始化指令被執(zhí)行,初始化指令用于清除全部現(xiàn)有的表條目,并且設(shè)置指向表中頂部條目的指針。接著,初始化代碼可以執(zhí)行從而使用諸如協(xié)處理器寄存器加載之類的程序指令將映射加載到翻譯表中。這些表加載指令的不同形式可以隨著特定情況和環(huán)境的變化而變化。可編程映射硬件解釋器系統(tǒng)通過在步驟112接收程序指令值(諸如Java字節(jié)碼)以及與其相關(guān)聯(lián)的操作值來響應(yīng)這些指令。在步驟114,不被支持的操作捕獲硬件檢查處于編程之中的操作值是否是得到那個可編程映射硬件解釋器支持的操作值。不同的可編程映射硬件解釋器可以支持不同的操作值組,因此可以為其提供它們自己的專用捕獲硬件。捕獲硬件可以相對簡單些,假如特定系統(tǒng)例如知道它支持操作值0,1,2,3,4,5,6,7,8,10而不支持9的話。在步驟114的硬件比較器能夠比較操作值與值9是否相等,并且如果檢測到9,則通過把處理轉(zhuǎn)向步驟116而拒絕編程。
假設(shè)步驟114指示操作值是得到支持的,則步驟118檢查來確定是否已經(jīng)到達可編程映射表的尾部。如果可編程映射表已經(jīng)滿了,則處理再次進行到步驟116而不添加新的映射。將步驟118提供在硬件之中意味著在硬件只是拒絕溢出條目的情況下,支持代碼可以嘗試來編程可編程映射表而不用知道有多少條目是可以使用的。因此,程序員應(yīng)該將最關(guān)鍵的映射放在表的開始,從而編程來確保這些占用的時隙(slot)可以使用。對支持代碼來說避免必須知道有多少可編程時隙可以使用意味著單一組支持代碼可以運行在多種平臺上。
假設(shè)表具有空條目,則在步驟120,將新映射寫入到所述空條目,表指針然后在步驟122推進。
在步驟116,系統(tǒng)對將要被編程到可編程映射表中的更多的程序指令值進行測試。步驟116通常是軟件步驟,在初始化系統(tǒng)期間支持代碼嘗試對它所希望的數(shù)量的映射進行編程。
在初始化圖9所示的RAM表的情況下,結(jié)合圖10的上述的過程接著可以進行下列的修改在步驟110,通過設(shè)置圖9的陣列108中的所有表條目為“調(diào)用這一字節(jié)碼的字節(jié)碼片斷”而不是通過設(shè)置圖8的陣列102來清除表,從而使每一表條目不匹配任何字節(jié)碼;在步驟110,沒有要初始化的翻譯表指針;步驟118不存在,因為沒有翻譯表指針;步驟120變?yōu)椤皩⒉僮髦祵懙接沙绦蛑噶钪邓甘镜谋項l目”;以及步驟122不存在,因為沒有翻譯表指針。
圖11圖示了可以用于Java字節(jié)碼解釋的處理流水線的一部分。處理流水線124包括翻譯級126和Java譯碼級128。后續(xù)級130可以采用多種不同的形式,這要取決于特定的實施。
來自Java字節(jié)碼流的字可以交替地加載到擺動緩沖器(swingbuffer)132的兩個半部分。通常,多路復(fù)用器133選擇來自擺動緩沖器132的當(dāng)前字節(jié)碼以及其操作數(shù),并通過多路復(fù)用器137將它交付給鎖存器134。如果因為流水線已經(jīng)被清空或者一些其它原因而使擺動緩沖器132為空,則多路復(fù)用器135選擇直接來自Java字節(jié)碼流的進入的字的正確的字節(jié)碼并且將它交付給鎖存器134。
譯碼字節(jié)碼的第一周期是通過第一周期譯碼器146而進行的,第一周期譯碼器146對鎖存器134中的字節(jié)碼進行動作。為了允許在硬件支持的字節(jié)碼帶有操作數(shù)的的情況,其它多路復(fù)用器選擇來自擺動緩沖器132的操作數(shù)并且將它們交付到第一周期譯碼器146。這些多路復(fù)用器未在圖中示出,它們與多路復(fù)用器133是類似的。典型地,第一周期譯碼器146對操作數(shù)輸入的松散定時要求要多于對字節(jié)碼輸入的,從而對于操作數(shù)就不要求與多路復(fù)用器135和137以及鎖存器134所提供的旁路路徑相似的旁路路徑。
如果擺動緩沖器132包括的操作數(shù)字節(jié)對于鎖存器134中的字節(jié)碼是不充足的,則在充足的操作數(shù)字節(jié)可以使用之前,第一周期譯碼器146停止。
第一周期譯碼器146的輸出是通過多路復(fù)用器142被傳遞到后續(xù)流水線級130的ARM指令(或者代表ARM指令的處理器核心控制的信號組)。第二輸出是通過多路復(fù)用器139被寫到鎖存器138的指定操作的代碼。指定操作的代碼包括位140,它指定這是否是單周期字節(jié)碼。
在下一個周期,接著的字節(jié)碼通過如前所述的第一周期譯碼器146來譯碼。如果位140指示單周期字節(jié)碼,則那個字節(jié)碼就被譯碼并且控制如前所述的后續(xù)流水線階段130。
如果位140相反指示的是多周期字節(jié)碼,則第一周期譯碼器146就停止,并且多周期或者翻譯譯碼器144就譯碼在鎖存器138中的指定操作的代碼,以便產(chǎn)生ARM指令(或者是代表ARM指令的處理器核心控制的信號組),多路復(fù)用器142將ARM指令傳遞到后續(xù)的流水線級130而不是傳遞到第一周期譯碼器146的對應(yīng)輸出。多周期或翻譯譯碼器還產(chǎn)生通過多路復(fù)用器139被寫到鎖存器138(同樣地不寫到第一周期譯碼器146的對應(yīng)輸出)的其它指定操作的代碼。這個其他指定操作的代碼也包括位140,它指定這是否是為多周期字節(jié)碼生成的最后的ARM指令。在位140指示最后的ARM指令已經(jīng)產(chǎn)生之前,多周期或翻譯譯碼器144繼續(xù)如上面所描述的生成其它ARM指令,接著第一周期譯碼器146取消停止并為后面的字節(jié)碼產(chǎn)生第一個ARM指令。
當(dāng)鎖存器134中的字節(jié)碼需要翻譯時,前述的過程采用三種方式加以修改。第一,字節(jié)碼由多路復(fù)用器133從擺動緩沖器132中提取并且由字節(jié)碼翻譯器136進行翻譯,產(chǎn)生通過多路復(fù)用器139寫到鎖存器138的指定操作的代碼。這一指定操作的代碼具有位140,它被設(shè)置以便指示還沒有為當(dāng)前字節(jié)碼產(chǎn)生最后的ARM指令,從而多路復(fù)用器142和多路復(fù)用器139在翻譯的字節(jié)碼的第一周期將選擇多周期或翻譯譯碼器144的輸出而不選擇第一周期譯碼146的輸出。
第二,多周期或翻譯譯碼器144生成要傳遞到后續(xù)流水線級130的所有ARM指令以及它們的要反向?qū)懙芥i存器138的對應(yīng)的其它指定操作的代碼,而不是僅僅在第一周期之后按照常規(guī)為不要求翻譯的字節(jié)碼生成那些指令。
第三,如果字節(jié)碼是通過多路復(fù)用器135被直接寫到鎖存器134的,并且因此不存在于擺動緩沖器132中,以及在前一個周期不可能得到字節(jié)碼翻譯器136的翻譯,則第一周期譯碼器146發(fā)信號通知字節(jié)碼翻譯器136它必須重新啟動并停止一個周期。這樣就保證當(dāng)?shù)谝恢茏g碼器146取消停止時,鎖存器138為翻譯的字節(jié)碼保持有效的指定操作的代碼。
從圖11可以看出,提供翻譯流水線級啟用可編程翻譯步驟所要求的處理以便有效地被隱藏或疊合到流水線之中,因為緩沖了的指令可以按照要求提前被翻譯并流進流水線的其余部分。
在圖11中可以看出,在這一例子實施例中,可以考慮固定映射硬件解釋器主要由第一周期譯碼器146以及運行在如下模式中的多周期或翻譯譯碼器144所構(gòu)成,在所述模式下,其中多周期或翻譯譯碼器144譯碼已經(jīng)由第一周期譯碼器146進行譯碼的多周期字節(jié)碼。在這一例子中的可編程映射硬件解釋器可以考慮由字節(jié)碼翻譯器136和多周期或翻譯譯碼器144(在這一例子中它在翻譯可編程字節(jié)碼之后運行)來構(gòu)成。固定映射硬件解釋器以及可編程映射硬件解釋器可以采用多種不同的方式來提供,并且從抽象的觀點來看可以共享重要的公共硬件同時還保留它們不同的功能。所有這些不同的可能性是包括在這里所描述的技術(shù)之中的。
圖12圖示了跨越了虛擬存儲器頁邊界204的兩個32位指令字200,202。它可以是1kB的頁邊界,不過其它的頁大小是可能的。
第一指令字200位于完全(properly)映射在虛擬存儲器系統(tǒng)的虛擬存儲頁之中。第二指令字202位于在這一級沒有被映射到虛擬存儲器系統(tǒng)的虛擬存儲器頁中。因此,2字節(jié)的可變長度指令206具有在指令字200中的第一字節(jié)以及在指令字202中的第二字節(jié),它將具有與其第二字節(jié)相關(guān)聯(lián)的預(yù)取中止。常規(guī)預(yù)取中止處理機制例如僅僅支持對齊指令的指令字,這些機制不能夠處理這一情況,并且能夠例如嘗試來檢查和修復(fù)包括可變長度指令206的第一字節(jié)的指令字200的讀取而不是集中于實際上導(dǎo)致所述中止的、包括可變長度指令字206的第二字節(jié)的指令字202。
圖13圖示了數(shù)據(jù)處理系統(tǒng)中用于處理Java字節(jié)碼的指令流水線208的一部分,它包括用于處理圖12中所示類型預(yù)取中止的機制。指令緩沖器包括兩個指令字寄存器210和212,其中的每個存儲32位的指令字。Java字節(jié)碼每個長度是8位,伴隨有0個或者多個操作數(shù)值。一組多路復(fù)用器214根據(jù)當(dāng)前Java字節(jié)碼指針位置從指令字寄存器210和212中選擇合適的字節(jié),所述當(dāng)前Java字節(jié)碼指針位置指示要譯碼的當(dāng)前Java字節(jié)碼指令的第一字節(jié)的地址。
與指令字寄存器210和212中的每個相關(guān)聯(lián)的是各個指令地址寄存器216和218以及預(yù)取中止標(biāo)志寄存器220和222。這些相關(guān)聯(lián)的寄存器分別存儲指令字所相關(guān)的指令地址以及當(dāng)那個指令從存儲器系統(tǒng)中被讀取時是否出現(xiàn)預(yù)取中止。這一信息與指令字本身一起沿著流水線傳遞,因為順著流水線進一步往下,這一信息通常是需要的。
如果需要,多路復(fù)用器224,226和228允許繞過輸入緩沖器裝置。這種類型的操作在上面已經(jīng)論述了。應(yīng)該理解,指令流水線208(為簡潔起見)沒有顯示前述指令流水線的所有特征。相似地,前述的指令流水線也沒有顯示指令流水線208的所有技術(shù)特征。實際上,系統(tǒng)可以被提供為具有在兩個圖示的指令流水線中顯示的技術(shù)特征的組合。
在指令流水線208的字節(jié)碼譯碼級,字節(jié)碼譯碼器230響應(yīng)來自多路復(fù)用器224的至少一個Java字節(jié)碼以及可選地響應(yīng)來自多路復(fù)用器226和228的一個或兩個操作數(shù)字節(jié),以便生成映射的指令或?qū)?yīng)的控制信號從而傳遞到流水線的其它級來執(zhí)行對應(yīng)于譯碼的Java字節(jié)碼的處理。
如果已經(jīng)發(fā)生了圖12所示類型的預(yù)取中止,則盡管Java字節(jié)碼本身可能是有效的,但是跟隨其后的操作數(shù)值將是無效的并且正確的操作直到修復(fù)了預(yù)取中止時才會發(fā)生。字節(jié)碼異常發(fā)生器232響應(yīng)來自寄存器216和218的指令字地址以及響應(yīng)來自寄存器220和222的預(yù)取中止標(biāo)志,以便檢測圖12所示情況的類型的發(fā)生。如果字節(jié)碼異常發(fā)生器232檢測到了這種情況,然后它就強制多路復(fù)用器234向下一級發(fā)出由字節(jié)碼異常發(fā)生器本身而不是由字節(jié)碼譯碼器230所生成的指令或控制信號。通過觸發(fā)執(zhí)行仿真中止Java字節(jié)碼的ARM 32位代碼片段而不是允許硬件解釋那個Java字節(jié)碼,字節(jié)碼異常發(fā)生器232對檢測到圖12情形下的預(yù)取中止作出響應(yīng)。因此,經(jīng)歷過預(yù)取中止的可變長度Java指令206本身將不會得到執(zhí)行,相反地,它會被32位ARM指令序列所替代。當(dāng)加載一個或多個操作數(shù)字節(jié)時,用于仿真該指令的ARM指令有可能遭受數(shù)據(jù)中止,這些數(shù)據(jù)中止發(fā)生是因為與當(dāng)那些字節(jié)最初作為第二指令字202的一部分被讀取時所發(fā)生的預(yù)取中止的原因相同的原因,并且在執(zhí)行ARM 32位代碼片段期間還有可能發(fā)生其它的預(yù)取和數(shù)據(jù)中止。所有這些中止發(fā)生在ARM指令執(zhí)行期間,因此通過現(xiàn)有的中止異常處理器例程將會得到正確的處理。
照這樣,在讀取字節(jié)碼時發(fā)生的預(yù)取中止就被遏制了(即,不被傳遞到ARM核心)。相反,ARM指令序列得到執(zhí)行,并且與這些ARM指令一起發(fā)生的任何中止將使用現(xiàn)有的機制來處理,這樣就跳過了存在問題的字節(jié)碼。在執(zhí)行用于用中止來替換字節(jié)碼的仿真的ARM指令之后,對字節(jié)碼的執(zhí)行可以恢復(fù)。
如果字節(jié)碼本身碰到預(yù)取中止,則標(biāo)記有預(yù)取中止的ARM指令就被傳遞到ARM流水線的其余部分。如果且當(dāng)它到達了流水線的執(zhí)行級,則它將引發(fā)預(yù)取中止異常這是處理ARM指令的預(yù)取中止的非常標(biāo)準(zhǔn)的方式。
如果字節(jié)碼沒有碰到預(yù)取中止,但是它的一個或多個操作數(shù)碰到了(如圖12所示),則調(diào)用那個字節(jié)碼的軟件代碼片段。被傳遞到ARM流水線其余部分的、用于引發(fā)代碼片段被調(diào)用的任何ARM指令將不作預(yù)取中止的標(biāo)記,因此如果且當(dāng)它們到達了流水線的執(zhí)行級,ARM指令將會正常地執(zhí)行。
圖14圖示了可以由字節(jié)碼異常發(fā)生器232用來檢測圖12所示情況類型的邏輯表達式類型。圖13的擺動緩沖器的任一半個部分指示為“Half1”(塊210,216,220構(gòu)成半個部分,塊212,218,222構(gòu)成另外的半個部分,在圖13中用這些元件周圍的虛線指示),它當(dāng)前保存第一指令字(圖12的200),用“Half2”指示擺動緩沖器的另外半個部分,它保存第二指令字(圖12的202)。假設(shè)PA(Half1)意思是塊220和222中的任一個的內(nèi)容在Half1中,對于Half2也是一樣。
那么,圖12所示情況的指示符是PA(Half1)是假,PA(Half2)是真,字節(jié)碼加上其操作數(shù)跨越了擺動緩沖器的兩個半個部分的邊界。(事實是頁邊界被標(biāo)記了,僅僅是因為那是正常的要求,對于它來說兩個PA()值不相同是可能的)。
在優(yōu)選設(shè)計(諸如擺動緩沖器半個部分中的每個部分存儲一個字以及受硬件支持的字節(jié)碼被限制在最多兩個操作數(shù))中,用于確定字節(jié)碼加上其操作數(shù)是否跨越邊界的公式如下((操作數(shù)的數(shù)目=1)AND(bcaddr[1:0]=11))OR((操作數(shù)的數(shù)目=2)AND(bcaddr[1]=1))其中bcaddr是字節(jié)碼的地址。這樣就可導(dǎo)出圖14所示的邏輯表達式。
用于標(biāo)識預(yù)取中止的其它技術(shù)是可以使用的,諸如在存儲器頁邊界的預(yù)定距離之內(nèi)開始的可變長指令。
圖15示意性地圖示了與Java字節(jié)碼解釋相關(guān)聯(lián)的支持代碼的結(jié)構(gòu)。這與前述的圖是相似的,但是在這一情況下,圖示了包括指向由字節(jié)碼異常事件觸發(fā)的字節(jié)碼異常處理代碼片段的指針。因此,每個Java字節(jié)碼具有仿真其操作的相關(guān)聯(lián)的ARM代碼片段。而且,可能發(fā)生的每個字節(jié)碼異常都具有相關(guān)聯(lián)的ARM異常處理代碼部分。在所示情況下,字節(jié)碼預(yù)取中止處理例程236被提供以便在檢測到上述類型的預(yù)取中止時由字節(jié)碼異常發(fā)生器232將它觸發(fā)。這一中止處理代碼236通過標(biāo)識在觸發(fā)過它的可變長度指令的開始處的字節(jié)碼而進行工作,接著調(diào)用在代碼片段集合中那個字節(jié)碼對應(yīng)的仿真代碼片段。
圖16是示意性地圖示字節(jié)碼異常發(fā)生器232的操作和后續(xù)處理的流程圖。步驟238用于確定圖14的表達式是否為真。如果表達式為假,則這一過程結(jié)束。
如果步驟238已經(jīng)指示了圖12所示情況的類型,則步驟246被執(zhí)行,它觸發(fā)將要由字節(jié)碼異常發(fā)生器232啟動的字節(jié)碼預(yù)取中止異常。字節(jié)碼異常發(fā)生器232可以僅僅觸發(fā)執(zhí)行ARM代碼字節(jié)碼預(yù)取中止處理器236。中止處理器236在步驟248用于標(biāo)識可變長度指令的開始字節(jié)碼,然后在步驟250觸發(fā)執(zhí)行仿真那個標(biāo)識的字節(jié)碼的ARM指令的代碼片段。
上述用于處理預(yù)取中止的機制在如下情況中可很好地工作,在這些情況下,有4個或稍少的操作數(shù)(即,總量是5個或稍少的字節(jié)),否則字節(jié)碼及其操作數(shù)有可能溢出第二緩沖器。實際上,字節(jié)碼(優(yōu)選地,為其提供硬件加速機制)都具有0,1,2個操作數(shù),而其余字節(jié)碼在所有情況下都使用軟件處理(主要是由于它們的復(fù)雜性)。
圖17圖示了用于控制多個用戶態(tài)進程302,304,306以及308的操作系統(tǒng)300。操作系統(tǒng)300在管態(tài)下運行而其它進程302,304,306,308在用戶態(tài)下運行,用戶態(tài)下所具有的對系統(tǒng)的配置控制參數(shù)的訪問權(quán)要少于操作系統(tǒng)300在管態(tài)下所具有的。
如圖17所示,進程302和308分別涉及到不同的Java虛擬機。這些Java虛擬機320,308中的每一個都具有其自己的由字節(jié)碼翻譯映射數(shù)據(jù)310,312以及配置寄存器數(shù)據(jù)314,316所構(gòu)成的配置數(shù)據(jù)。實際上,可以理解,單一的Java加速硬件組被提供以便執(zhí)行這兩個進程302,308,但是當(dāng)這些不同的進程正在使用Java加速硬件時,它們中的每個都要求使用它們相關(guān)聯(lián)的配置數(shù)據(jù)310,312,314,316來配置Java加速硬件。因此,當(dāng)操作系統(tǒng)300切換到使用Java加速硬件執(zhí)行不同于使用了那個硬件的前一個進程的進程時,則Java加速硬件就應(yīng)該被重新初始化和重新配置。操作系統(tǒng)300本身并不執(zhí)行Java加速硬件的重新初始化和重新配置,但是指示它應(yīng)該通過將與Java加速硬件相關(guān)聯(lián)的配置無效指示符設(shè)置到無效狀態(tài)來實現(xiàn)。
圖18示意性地圖示了包括帶有本機指令集(例如ARM指令集)的處理器核心320以及相關(guān)聯(lián)的Java加速硬件322的數(shù)據(jù)處理系統(tǒng)318。存儲器324存儲可以采用ARM指令或Java字節(jié)碼形式的計算機程序代碼。在Java字節(jié)碼的情況下,這些被傳遞到Java加速硬件322,Java加速硬件322用于將它們解釋為然后可以由處理器核心320執(zhí)行的ARM指令流(或者對應(yīng)于ARM指令的控制信號)。Java加速硬件322包括字節(jié)碼翻譯表326,它需要為希望執(zhí)行Java字節(jié)碼的每個Java虛擬機進行編程。在Java加速硬件322中還提供有配置數(shù)據(jù)寄存器328和操作系統(tǒng)控制寄存器330,以便控制其配置。包括在操作系統(tǒng)控制寄存器330之中的是采用標(biāo)志CV形式的配置無效指示符,當(dāng)它被置位時,指示Java加速硬件322的配置是有效的,當(dāng)取消對其的置位時,指示它是無效的。
如果配置有效指示符對應(yīng)于Java加速硬件322的、處于無效形式的配置數(shù)據(jù),則嘗試執(zhí)行Java字節(jié)碼時的Java加速硬件322對配置有效指示符作出響應(yīng),以便觸發(fā)配置無效異常。配置無效異常處理器可以是采用上述為預(yù)取中止處理器提供ARM代碼例程相似的方式提供的ARM代碼例程。硬件機制提供在Java加速硬件322之中,用于在配置異常被觸發(fā)時以及在新的有效配置數(shù)據(jù)實際上已經(jīng)被寫入位置之前,將配置有效指示符設(shè)置為指示配置數(shù)據(jù)是有效的形式。盡管在配置數(shù)據(jù)實際上已經(jīng)被寫入之前,采用這種方式設(shè)置配置有效指示符直覺上好像是計數(shù)器,但是這種方法在通過設(shè)置配置數(shù)據(jù)能夠避免與進程交換局部方式一起出現(xiàn)的問題上具有相當(dāng)明顯的優(yōu)勢。然后,配置異常例程為Java虛擬機建立所需的配置數(shù)據(jù),配置異常例程通過寫入前述的字節(jié)碼翻譯表條目以及所需要的任何其它配置數(shù)據(jù)寄存器值328而與Java虛擬機保持一致。配置異常代碼必須確保在由Java加速硬件322接手任何其它的任務(wù)之前,對配置數(shù)據(jù)的寫入必須完成。
圖19示意性地圖示了操作系統(tǒng)300的操作。在步驟332,操作系統(tǒng)等待以檢測進程切換。當(dāng)檢測到進程切換時,步驟334確定新進程是否使用Java加速硬件322(如前述也稱為Jazelle)。如果不使用Java加速硬件322,則處理進行到步驟336,在該步驟,在進行到將執(zhí)行轉(zhuǎn)移到新進程的步驟339之前,將Java加速硬件322禁止。如果使用Java加速硬件322,則處理進行到步驟338,在該步驟,確定正被調(diào)用的新進程與由操作系統(tǒng)300記錄的、存儲的Java加速硬件322的當(dāng)前所有者是否相同。如果所有者沒有改變(即,新進程實際上與使用了Java加速硬件322的上一個進程相同),則處理進行到步驟337,在該步驟,在進行到步驟339之前啟用Java加速硬件322。如果新進程不是所存儲的當(dāng)前所有者,則處理進行到步驟340,在該步驟中,配置有效指示符被置位來指示Java加速硬件322的當(dāng)前配置是無效的。這樣就限制了操作系統(tǒng)用來管理這一配置變化的責(zé)任,對配置數(shù)據(jù)的實際更新作為任務(wù)就留給Java加速硬件322使用它自己的異常處理機制來操作。
在步驟340之后,步驟342用于在執(zhí)行控制的轉(zhuǎn)移被傳遞到步驟337然后再到步驟339之前將所存儲的當(dāng)前所有者更新為新進程。
圖20圖示了由Java加速硬件322所執(zhí)行的操作。在步驟344,Java加速硬件322等待以便接收字節(jié)碼來執(zhí)行。當(dāng)接收到字節(jié)碼時,該硬件使用步驟346檢查配置有效指示符是否顯示Java加速硬件322的配置是有效的。如果配置是有效的,則處理就進行到步驟348,在該步驟執(zhí)行所接收的字節(jié)碼。
如果配置是無效的,則處理進行到步驟350,在該步驟,Java加速硬件322使用硬件機制來置位配置有效指示符以便顯示配置是有效的。如果希望的話,這還可以由異常處理器中的程序指令來進行。步驟352用于觸發(fā)配置無效異常。配置無效異常處理器可以提供為指向代碼片段的指針表以及合適的代碼片段的組合以便處理所涉及到的每個異常,諸如指令的軟件仿真、預(yù)取中止(它們都已經(jīng)在上面論述過了)、或者這一例子中的配置異常。
步驟354用于執(zhí)行組成配置無效異常、以及用于將所要求的配置數(shù)據(jù)寫到Java加速硬件322的ARM代碼。這一ARM代碼可以采用協(xié)處理器的寄存器寫序列的形式以便增加可編程翻譯表326以及其它配置寄存器330。在步驟354之后,步驟356反向跳轉(zhuǎn)到Java字節(jié)碼程序以便重新嘗試執(zhí)行原始字節(jié)碼。
如果進程切換發(fā)生在步驟354或者358期間,則至此時所建立的配置有可能會被其它進程改為無效,并且配置有效指示符會被操作系統(tǒng)清零。在圖20的過程中,這導(dǎo)致再次進入344-346-350-352-354循環(huán),即導(dǎo)致要從開始重新嘗試重新配置。當(dāng)字節(jié)碼最終實際上得到了執(zhí)行時,則該配置被保證是有效的。
圖21圖示了圖1所示的、還并入有浮點子系統(tǒng)的數(shù)據(jù)處理系統(tǒng)。當(dāng)未處理浮點運算發(fā)生時,浮點子系統(tǒng)提供用于處理ARM代碼中的未處理浮點運算的機制。
這種子系統(tǒng)的例子是英格蘭劍橋ARM有限公司的VFP軟件仿真器系統(tǒng)。在VFP軟件仿真器系統(tǒng)的例子中,所有的浮點運算都被當(dāng)作未處理浮點運算來處理,因為沒有可用的硬件來執(zhí)行浮點運算。因此,所有的浮點運算都是使用所提供的用于仿真ARM代碼中VFP行為的機制進行處理的。
在這種系統(tǒng)的情況下,未處理浮點運算是精確的,也就是說,未處理浮點運算的檢測點與未處理浮點運算的出現(xiàn)點相同。
圖22圖示了如圖1和圖21所示的、還并入了浮點運算寄存器和未處理運算狀態(tài)標(biāo)志的數(shù)據(jù)處理系統(tǒng)。
這種子系統(tǒng)的例子是英格蘭劍橋ARM有限公司的VFP硬件系統(tǒng)。在VFP硬件系統(tǒng)的情況下,只有特定類型的浮點運算被當(dāng)作未處理浮點運算來處理,其余的由VFP硬件處理。
可能從屬于未處理浮點運算的運算類包括-除零;-涉及NaN的運算;-涉及無窮大的運算;-涉及反向規(guī)格化數(shù)的運算;在這種系統(tǒng)的情況下,未處理浮點運算可以是不精確的,也就是說,未處理浮點運算的檢測點可以不必與未處理浮點運算的出現(xiàn)點相同。
未處理VFP運算出現(xiàn)在當(dāng)VFP協(xié)處理器拒絕接受通常構(gòu)成ARM指令流的一部分的VFP指令時,但是當(dāng)存在圖1所示的字節(jié)碼翻譯器時,未處理VFP運算還可能是已經(jīng)被翻譯成ARM和VFP指令的組合的字節(jié)碼所導(dǎo)致的結(jié)果。
在未處理VFP運算作為ARM指令流的一部分的情況下,用于處理未處理VFP運算的ARM機制將生成未定義的指令異常并執(zhí)行安裝在未定義的指令矢量上的未定義指令處理器。
在VFP軟件仿真器系統(tǒng)的情況下,所有VFP運算都被當(dāng)作未處理VFP運算并且應(yīng)用相同的ARM機制,生成未定義的指令異常并且執(zhí)行未定義的指令處理器。
當(dāng)未處理VFP運算作為ARM指令流的一部分出現(xiàn)時,未定義的指令處理器能夠通過檢查指令流而知道引發(fā)未處理VFP運算的指令是否的確是VFP指令,而不是一些其它類型的未定義的指令,并且當(dāng)未定義的指令處理器在特權(quán)模式下執(zhí)行時,它能夠發(fā)出所需要的協(xié)處理器指令以便從VFP協(xié)處理器中提取它所需要的任何內(nèi)部狀態(tài),然后在軟件中完成所需要的指令。未定義的指令處理器將使用在ARM指令流和VFP的內(nèi)部狀態(tài)中都標(biāo)識了的指令,以便處理未處理操作。
在許多VFP的實施中,引發(fā)未處理操作的指令可以不同于在檢測到未處理操作時正在執(zhí)行的指令。未處理操作可以由在較早前所發(fā)出的指令引發(fā),并且與后續(xù)的ARM指令并行地執(zhí)行,除了它碰到未處理狀態(tài)之外。VFP通過拒絕接受后面的VFP指令,并且強制進入VFP未定義指令處理器而發(fā)信號通知這種狀態(tài),所述VFP未定義指令處理器能夠詢問VFP以便找到未處理操作的原始原因。
當(dāng)Jazelle被集成到包括VFP子系統(tǒng)的系統(tǒng)中時,下列應(yīng)用Java浮點指令是通過使用一組與VFP指令直接對應(yīng)的信號在核心之中直接發(fā)出對應(yīng)的VFP指令而得到翻譯的。
如果VFP碰到未處理運算,它可以發(fā)信號通知未處理運算狀態(tài)。
假如ARM指令流中的VFP指令發(fā)信號通知了不正確的操作,則Jazelle截取未處理運算信號,以防止它被送到核心以及防止未定義指令處理器按照常規(guī)執(zhí)行。反之,Jazelle生成由Jazelle VM支持代碼處理的VFP異常。
當(dāng)碰到這樣的Jazelle VFP異常時,VM支持代碼會執(zhí)行VFP“不操作”指令,即,使Jazelle狀態(tài)保持不變的任何VFP指令,諸如FMRXRd,F(xiàn)PSCR指令。這樣就使VFP硬件與支持代碼保持同步并且結(jié)合未處理操作狀態(tài)標(biāo)志完成由浮點運算寄存器所指示的任何VFP操作的操作,在這一例子中,當(dāng)剛碰到未處理操作時,該未處理操作狀態(tài)標(biāo)志就應(yīng)該被置位。一旦完成了操作,未處理操作狀態(tài)標(biāo)志就被清零。
該方法利用了這樣的事實由Jazelle發(fā)出的指令序列是可以重啟動的,如在2000年10月5日所提交的共同待審的英國專利申請?zhí)枮?024402.0的申請,在此全部引入以供參考。結(jié)合本發(fā)明的技術(shù)使用上述參考文獻中所描述的技術(shù)允許重新啟動引發(fā)生成VFP指令的指令,其中,該VFP指令引發(fā)未處理操作。
圖23圖示了用于每個Java浮點運算的、由Java字節(jié)碼翻譯器所發(fā)出的對應(yīng)VFP指令。注意,僅僅顯示了被發(fā)出的VFP指令,Java字節(jié)碼翻譯器可以結(jié)合VFP指令發(fā)出附加的ARM指令。Jazelle字節(jié)碼翻譯器也可以發(fā)出附加VFP加載和存儲指令,以便加載和存儲浮點值。
圖24圖示了指令序列或者對應(yīng)于可以由Jazelle字節(jié)碼翻譯器為由其后跟著‘dcmpg’字節(jié)碼的‘dmul’字節(jié)碼組成的Java字節(jié)碼序列發(fā)出的指令的信號。假如(dmul,dcmpg)字節(jié)碼序列在當(dāng)雙精度寄存器D0,D1以及D2分別保存Java執(zhí)行堆棧的從頂部起的第三、從頂部起的第二以及頂部元素時,以及字節(jié)碼序列的整數(shù)結(jié)果被期望放在整數(shù)寄存器R0時被執(zhí)行,所示的序列將會出現(xiàn),。
圖25,27,29以及30圖示了未處理浮點運算發(fā)生在翻譯的指令序列的各個點時的操作序列。圖25和29圖示了在未處理浮點運算是由FMULD指令引發(fā)時的操作序列。圖27和30圖示了未處理浮點運算是由FCMPD指令引發(fā)時的操作序列。圖25和27圖示了發(fā)信號通知未處理浮點運算是不精確時的操作序列。圖29和30圖示了發(fā)信號通知未處理浮點運算是精確時的操作序列。
可以看出,有四個可能的事件序列1)圖25不精確未處理操作檢測,發(fā)出信號通知未處理操作的Java字節(jié)碼與引發(fā)未處理操作的Java字節(jié)碼不相同。
2)圖27不精確未處理操作檢測,盡管系統(tǒng)使用不精確未處理操作檢測的事實,但發(fā)出信號通知未處理操作的Java字節(jié)碼與引發(fā)所述未處理操作的Java字節(jié)碼卻是相同。這是因為第二個Java字節(jié)碼‘dcmpg’為一個Java字節(jié)碼發(fā)出了兩個VFP指令,其中的第一個引發(fā)未處理操作,第二個發(fā)信號通知所述未處理操作。
3)圖29精確未處理操作檢測,發(fā)出信號通知未處理操作的Java字節(jié)碼與引發(fā)未處理操作的Java字節(jié)碼相同。
4)圖30精確未處理操作檢測,發(fā)出信號通知未處理操作的Java字節(jié)碼與引發(fā)未處理操作的Java字節(jié)碼相同,但是卻不知道兩個VFP指令中的哪個是由于執(zhí)行實際上引發(fā)并發(fā)信號通知未處理操作的‘dcmpg’字節(jié)碼而被發(fā)出的。
上面提到的重啟動技術(shù)和本發(fā)明的技術(shù)的組合允許正確地處理所有這些可能的事件序列。
圖26和28圖示了緊跟在引發(fā)了未處理操作之后的浮點運算寄存器和未處理操作狀態(tài)標(biāo)志的狀態(tài),分別對應(yīng)圖25和圖27所示的操作序列。
應(yīng)該參考如下均在2000年10月5日提交的共同待審的英國專利申請0024399.8,0024402.0,0024404.6,0024396.4,在2000年11月20日提交的英國專利申請0028249.1和在2000年12月7日提交的美國專利申請09/731,060(它們也描述了Java字節(jié)碼解釋系統(tǒng))。這些共同待審的申請的公開內(nèi)容在全部引入以供參考。
權(quán)利要求
1.用于在第一指令集和一個或多他指令集的程序指令的控制下處理數(shù)據(jù)的裝置,所述裝置包括(i)未處理操作檢測器,可操作地來檢測所述第一指令集程序指令的未處理操作;和(ii)未處理操作處理器,可操作地來在檢測所述未處理操作時,觸發(fā)使用所述一個或多個其他指令集中的至少一個指令集的一條或多條指令來仿真所述第一指令集的所述指令。
2.如權(quán)利要求1所述的裝置,其中,所述未處理操作檢測器是提取中止檢測器,可操作地來檢測指令字的未處理提取。
3.如權(quán)利要求1所述的裝置,其中,所述未處理操作檢測器是未處理浮點運算檢測器,可操作地來檢測未處理浮點運算。
4.如權(quán)利要求1、2和3中任一項所述的裝置,其中,所述第一指令集是可變長度指令集,所述一個或多個其他指令集中的至少一個指令集是固定長度指令集。
5.如權(quán)利要求1、2和3中任一項所述的裝置,其中,所述第一指令集是可變長度指令集,所述一個或多個其他指令集全部都是固定長度指令集。
6.如權(quán)利要求4和5中任一項所述的裝置,包括指令提取器,可操作地來提取包含要被執(zhí)行的程序指令的固定長度指令字,所述可變長度指令集的至少一些程序指令跨越了多于一個指令字。
7.如權(quán)利要求6所述的裝置,其中,所述未處理操作檢測器是提取中止檢測器,可操作地來在檢測如下指令字的未處理提取時,中止所述可變長度指令并觸發(fā)使用一條或多條固定長度指令來仿真所述可變長度指令,其中所述指令字是包含可變長度指令的一部分的第二或后續(xù)指令字。
8.如權(quán)利要求6所述的裝置,其中,所述未處理操作檢測器是提取中止檢測器,可操作地來在檢測到如下指令字的未處理提取時,中止所述可變長度指令并且觸發(fā)使用一條或多條固定長度指令來仿真所述可變長度指令,在所述指令字中,所述可變長度指令被確定為跨過存儲器頁面邊界。
9.如權(quán)利要求6所述的裝置,其中,所述未處理操作檢測器是提取中止檢測器,可操作地來在檢測到如下指令字的未處理提取時,中止所述可變長度指令并且觸發(fā)使用一條或多條固定長度指令來仿真所述可變長度指令,其中在所述指令字中,所述可變長度指令被確定為在存儲器頁面邊界尾部的字節(jié)的固定數(shù)目內(nèi)開始,其中,所述字節(jié)的固定數(shù)目小于由用于在第一指令集程序指令的控制下處理數(shù)據(jù)的所述裝置所處理的最長的可變長度指令。
10.如權(quán)利要求3所述的裝置,其中,多個浮點運算可以在執(zhí)行所述第一指令集的單條指令期間加以執(zhí)行,所述多個浮點運算中的任一浮點運算都潛在地會引發(fā)未處理浮點運算,并且所述未處理操作檢測器是未處理浮點運算檢測器,可操作地來檢測由所述多個浮點運算中的任一浮點運算所生成的未處理浮點運算。
11.如權(quán)利要求3和10中任一項所述的裝置,其中,當(dāng)執(zhí)行所述第一指令集中的、引發(fā)所述未處理浮點運算的指令時,所述未處理操作檢測器并不立即檢測未處理浮點運算,相反,在執(zhí)行所述第一指令集的后續(xù)指令時才檢測所述未處理浮點運算,所述未處理操作檢測器可操作用來中止所述后續(xù)指令并觸發(fā)使用一條或多條固定長度指令來仿真所述后續(xù)指令。
12.如權(quán)利要求11所述的裝置,其中,所述未處理操作檢測器僅僅在所述后續(xù)指令又引發(fā)浮點運算時,才檢測所述未處理浮點運算。
13.如權(quán)利要求11和12中任一項所述的裝置,還包括事件指示器,用于使所述未處理操作處理器能夠確定未處理浮點運算已經(jīng)發(fā)生。
14.如權(quán)利要求11-13中任一項所述的裝置,還包括操作指示器,用于允許確定引發(fā)未處理浮點運算的浮點運算。
15.如權(quán)利要求11-14中任一項所述的裝置,其中,在仿真所述第一指令集的所述指令之前,所述未處理操作處理器采用現(xiàn)有機制來處理所述未處理操作。
16.如權(quán)利要求15所述的裝置,其中,所述未處理操作處理器執(zhí)行固定長度浮點指令,所述固定長度浮點指令的執(zhí)行具有采用現(xiàn)有機制來處理所述未處理操作的效果。
17.如在先權(quán)利要求中任一項所述的裝置,其中,所述第二指令集是執(zhí)行所述程序指令的處理器核心的本機指令集。
18.如在先權(quán)利要求中任一項所述的裝置,其中,所述第一指令集是解釋型指令集。
19.如在先權(quán)利要求中任一項所述的裝置,其中,所述第一指令集包括Java字節(jié)碼指令。
20.如在先權(quán)利要求中任一項所述的裝置,還包括重啟動邏輯,用于在所述未處理操作之后重新開始執(zhí)行;其中所述裝置可被操作用來生成對應(yīng)于所述多個指令集中一個指令集的指令的多組翻譯器輸出信號中的一組的序列,以便表示所述多個指令集的至少一條指令,每個序列都是這樣的,不對輸入變量做任何改變,直到所述序列中的最后操作被執(zhí)行為止;和在執(zhí)行表示所述多個指令集的所述至少一條指令的操作序列期間,未處理操作發(fā)生之后(i)如果所述未處理操作是在開始執(zhí)行所述序列的最后操作之前發(fā)生的,則所述重啟動邏輯重新啟動所述序列中第一操作的執(zhí)行;和(ii)如果所述未處理操作是在開始執(zhí)行所述序列的最后操作之后發(fā)生的,則所述重啟動邏輯重新啟動在所述序列之后的下一個指令的執(zhí)行。
21.一種在第一指令集和一個或多他指令集的程序指令的控制下處理數(shù)據(jù)的方法,所述方法包括如下操作(i)檢測所述第一指令集的程序指令的未處理操作;和(ii)當(dāng)檢測到所述未處理操作時,觸發(fā)使用所述一個或多個其他指令集的至少一個指令集的一條或多條指令來仿真所述第一指令集的所述指令。
22.如權(quán)利要求21所述的方法,其中,所述檢測步驟檢測指令字的未處理提取。
23.如權(quán)利要求21所述的方法,其中,所述檢測步驟檢測未處理浮點運算。
24.如權(quán)利要求21、22和23中任一項所述的方法,其中,所述第一指令集是可變長度指令集,所述一個或多個其他指令集中的至少一個指令集是固定長度指令集。
25.如權(quán)利要求21、22和23中任一項所述的方法,其中,所述第一指令集是可變長度指令集,所述一個或多個其他指令集全部都是固定長度指令集。
26.如權(quán)利要求24和25中任一項所述的方法,包括(i)提取包含要被執(zhí)行的程序指令的固定長度指令字,所述可變長度指令集的至少一些程序指令跨越了多于一個指令字。
27.如權(quán)利要求26所述的方法,其中,當(dāng)檢測到如下指令字的未處理提取時,中止所述可變長度指令并觸發(fā)使用一條或多條固定長度指令來仿真所述可變長度指令,其中所述指令字是包含可變長度指令的一部分的第二或者后續(xù)指令字。
28.如權(quán)利要求26所述的方法,其中,當(dāng)檢測到如下指令字的未處理提取時,中止所述可變長度指令并觸發(fā)使用一條或多條固定長度指令來仿真所述可變長度指令,在所述指令字中,所述可變長度指令被確定為跨過存儲頁面邊界。
29.如權(quán)利要求26所述的方法,其中,當(dāng)檢測到如下指令字的未處理提取時,中止所述可變長度指令并且觸發(fā)使用一條或多條固定長度指令來仿真所述可變長度指令,其中在所述指令字中,所述可變長度指令被確定為在存儲器頁面邊界尾部的字節(jié)的固定數(shù)目內(nèi)開始,其中,所述字節(jié)的固定數(shù)目小于所處理的最長的可變長度指令。
30.如權(quán)利要求23所述的方法,其中,多個浮點運算可以在執(zhí)行所述第一指令集的單條指令期間執(zhí)行,所述多個浮點運算中的任一浮點運算都潛在地會引發(fā)未處理浮點運算,并且所述檢測可操作地來檢測由所述多個浮點運算中的任一浮點運算所生成的未處理浮點運算。
31.如權(quán)利要求23和30中任一項所述的方法,其中,當(dāng)執(zhí)行所述第一指令集中的、引發(fā)所述未處理浮點運算的指令時,所述未處理操作檢測器并不立即檢測未處理浮點運算,相反,在執(zhí)行所述第一指令集的后續(xù)指令時才檢測所述未處理浮點運算,以便中止所述后續(xù)指令并觸發(fā)使用一條或多條固定長度指令來仿真所述后續(xù)指令。
32.如權(quán)利要求31所述的方法,其中,所述檢測僅僅在所述后續(xù)指令又引發(fā)浮點運算時,才檢測所述未處理浮點運算。
33.如權(quán)利要求31和32中任一項所述的方法,還包括事件指示器,用于使所述未處理操作處理器能夠確定未處理浮點運算已經(jīng)發(fā)生。
34.如權(quán)利要求31-33中任一項所述的方法,還包括設(shè)置指示器以便允許確定引發(fā)未處理浮點運算的浮點運算。
35.如權(quán)利要求31-34中任一項所述的方法,其中,在仿真所述第一指令集的所述指令之前,處理所述未處理操作采用現(xiàn)有機制來處理所述未處理操作。
36.如權(quán)利要求35所述的方法,其中,處理所述未處理操作執(zhí)行固定長度浮點指令,所述固定長度浮點指令的執(zhí)行具有采用現(xiàn)有機制來處理所述未處理操作的效果。
37.如權(quán)利要求21-36中任一項所述的方法,其中,所述第二指令集是執(zhí)行所述程序指令的處理器核心的本機指令集。
38.如權(quán)利要求21-37中任一項所述的方法,其中,所述第一指令集是解釋型指令集。
39.如權(quán)利要求21-38中任一項所述的方法,其中,所述第一指令集包括Java字節(jié)碼指令。
40.如權(quán)利要求21-39中任一項所述的方法,還包括生成對應(yīng)于所述多個指令集中一個指令集的指令的多組翻譯器輸出信號的一組的序列,以便表示所述多個指令集的至少一條指令,每個序列都是這樣的,不對輸入變量做任何改變,直到所述序列中的最后操作被執(zhí)行為止;和在執(zhí)行表示所述多個指令集的所述至少一條指令期間,未處理操作發(fā)生之后(i)如果所述未處理操作是在開始執(zhí)行所述序列的最后操作之前發(fā)生的,則所述重啟動邏輯重新啟動所述序列中第一操作的執(zhí)行;和(ii)如果所述未處理操作是在開始執(zhí)行所述序列的最后操作之后發(fā)生的,則所述重啟動邏輯重新啟動在所述序列之后的下一個指令的執(zhí)行。
41.一種用于控制數(shù)據(jù)處理裝置在第一指令集和一個或多他指令集的程序指令的控制下處理數(shù)據(jù)的計算機程序產(chǎn)品,所述計算機程序產(chǎn)品包括未處理操作處理器邏輯,可操作地來在檢測到所述未處理操作時,觸發(fā)使用所述一個或多個其他指令集的至少一個指令集的一條或多條指令來仿真一指令集中引發(fā)所述微處理操作的所述指令。
42.如權(quán)利要求41所述的計算機程序產(chǎn)品,其中,所述未處理操作是指令字的未處理提取。
43.如權(quán)利要求41所述的計算機程序產(chǎn)品,其中,所述未處理操作是一個或多個未處理浮點運算。
44.如權(quán)利要求41、42和43中任一項所述的計算機程序產(chǎn)品,其中,所述第一指令集是可變長度指令集,所述一個或多個其他指令集中的至少一個指令集是固定長度指令集。
45.如權(quán)利要求41、42和43中任一項所述的計算機程序產(chǎn)品,其中,所述第一指令集是可變長度指令集,所述一個或多個其他指令集全部都是固定長度指令集。
46.如權(quán)利要求44和45中任一項所述的計算機程序產(chǎn)品,其中,包含要被執(zhí)行的程序指令的固定長度指令字被提取,所述可變長度指令集的至少一些程序指令跨越了多于一個指令字。
47.如權(quán)利要求46所述的計算機程序產(chǎn)品,其中,當(dāng)檢測到如下指令字的未處理提取時,中止所述可變長度指令并觸發(fā)使用一條或多條固定長度指令來仿真所述可變長度指令,其中所述指令字是包含可變長度指令的一部分的第二或后續(xù)指令字。
48.如權(quán)利要求46所述的計算機程序產(chǎn)品,其中,當(dāng)在檢測到如下指令字的未處理提取時,中止所述可變長度指令并且觸發(fā)使用一條或多條固定長度指令來仿真所述可變長度指令,在所述指令字中,所述可變長度指令被確定為跨越存儲器頁面邊界。
49.如權(quán)利要求46所述的計算機程序產(chǎn)品,其中,當(dāng)檢測到如下指令字的未處理提取時,中止所述可變長度指令并且觸發(fā)使用一條或多條固定長度指令來仿真所述可變長度指令,其中在所述指令字中,所述可變長度指令被確定為在存儲器頁面邊界尾部的字節(jié)的固定數(shù)目內(nèi)開始,其中,所述字節(jié)的固定數(shù)目小于所處理的最長的可變長度指令。
50.如權(quán)利要求43所述的計算機程序產(chǎn)品,其中,多個浮點運算可以在執(zhí)行所述第一指令集的單條指令期間執(zhí)行,所述多個浮點運算中的任一浮點運算都潛在地會引發(fā)未處理浮點運算,并且未處理浮點運算檢測可操作地來檢測由所述多個浮點運算中的任一浮點運算所生成的未處理浮點運算。
51.如權(quán)利要求43和50中任一項所述的計算機程序產(chǎn)品,其中,當(dāng)執(zhí)行所述第一指令集中的、引發(fā)所述未處理浮點運算的指令時,未處理操作檢測并不立即檢測未處理浮點運算,相反,在執(zhí)行所述第一指令集的后續(xù)指令時才檢測所述未處理浮點運算,以便中止所述后續(xù)指令并觸發(fā)使用一條或多條固定長度指令來仿真所述后續(xù)指令。
52.如權(quán)利要求51所述的計算機程序產(chǎn)品,其中,檢測未處理操作僅僅在所述后續(xù)指令還引發(fā)浮點運算時,才檢測所述未處理浮點運算。
53.如權(quán)利要求51和52中任一項所述的計算機程序產(chǎn)品,還包括事件指示器邏輯,用于使所述未處理操作處理器邏輯能夠確定未處理浮點運算已經(jīng)發(fā)生。
54.如權(quán)利要求51-53中任一項所述的計算機程序產(chǎn)品51,還包括操作指示器邏輯,用于允許確定引發(fā)未處理浮點運算的浮點運算。
55.如權(quán)利要求51-54中任一項所述的計算機程序產(chǎn)品,其中,所述未處理操作處理器邏輯在仿真所述第一指令集的所述指令之前,采用現(xiàn)有機制來處理所述未處理操作。
56.如權(quán)利要求55所述的計算機程序產(chǎn)品,其中所述未處理操作處理器邏輯執(zhí)執(zhí)行固定長度浮點指令,所述固定長度浮點指令的執(zhí)行具有采用現(xiàn)有機制來處理所述未處理操作的效果。
57.如權(quán)利要求41-56中任一項所述的計算機程序產(chǎn)品,其中,所述第二指令集是執(zhí)行所述程序指令的處理器核心的本機指令集。
58.如權(quán)利要求41-57中任一項所述的計算機程序產(chǎn)品,其中,所述第一指令集是解釋型指令集。
59.如權(quán)利要求41-58中任一項所述的計算機程序產(chǎn)品,其中,所述第一指令集包括Java字節(jié)碼指令。
60.如權(quán)利要求41-59中任一項所述的計算機程序產(chǎn)品還包括重啟動邏輯,用于在所述未處理操作之后重新開始執(zhí)行;其中所述數(shù)據(jù)處理裝置可被操作用來生成對應(yīng)于所述多個指令集中一個指令集的指令的多組翻譯器輸出信號的一組的序列,以便表示所述多個指令集的至少一條指令,每個序列都是這樣的,不對輸入變量做任何改變,直到所述序列中的最后操作被執(zhí)行為止;和在執(zhí)行表示所述多個指令集的所述至少一條指令期間,發(fā)生未處理操作之后(i)如果所述未處理操作是在開始執(zhí)行所述序列的最后操作之前發(fā)生的,則所述重啟動邏輯重新啟動所述序列中第一操作的執(zhí)行;和(ii)如果所述未處理操作是在開始執(zhí)行所述序列的最后操作之后發(fā)生的,則所述重啟動邏輯重新啟動在所述序列之后的下一個指令的執(zhí)行。
全文摘要
諸如Java字節(jié)碼之類的第一指令集的程序指令的未處理操作被檢測。不調(diào)用直接處理那個未處理操作的機制,相反,使用來自諸如ARM指令之類的第二指令集的一條或多條指令來仿真遭受所述未處理操作的那條指令。如果第二指令集的這些指令也遭受到未處理操作,則在所述第二指令集中的、用于處理所述未處理操作的機制可以被調(diào)用來修補那個操作。這一方法很好地適用于處理如下的可變長度指令的未處理操作,所述可變長度指令由具有本機固定指令集的處理器核心來加以解釋。特別是,采用這種方式,可以分方便地處理預(yù)取中止和未處理浮點運算。
文檔編號G06F9/30GK1522404SQ02811101
公開日2004年8月18日 申請日期2002年2月26日 優(yōu)先權(quán)日2001年5月31日
發(fā)明者E·C·內(nèi)維爾, A·C·羅斯, E C 內(nèi)維爾, 羅斯 申請人:Arm有限公司