專利名稱:N基數(shù)類型算術(shù)表達(dá)式的優(yōu)化的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計算機(jī)系統(tǒng)。尤其是,本發(fā)明涉及對n基數(shù)類型算術(shù)表達(dá)式(n-base typed arithmetic expression)進(jìn)行優(yōu)化。
背景技術(shù):
圖1說明了對計算機(jī)程序的預(yù)處理。用戶用高級程序設(shè)計語言10編寫程序。用高級程序設(shè)計語言10所編寫的程序被編譯成低級機(jī)器語言12,其可由目標(biāo)機(jī)來執(zhí)行。例如,用高級JavaTM程序設(shè)計語言所編寫的程序被編譯成低級字節(jié)碼指令。字節(jié)碼指令是用于JavaTM虛擬機(jī)的機(jī)器語言。Lindholm等人所著的“JavaTM虛擬機(jī)規(guī)范(The JavaTMVirtual Machine Specification)”(出版于1999年,Addison Wesley,第二版)中描述了JavaTM虛擬機(jī)規(guī)范。
典型的高級程序設(shè)計語言支持算術(shù)表達(dá)式。可操作一個或多個操作數(shù)的算術(shù)運(yùn)算符定義了算術(shù)表達(dá)式。通常支持的運(yùn)算符包括加法、減法、乘法、除法、求余、求反、移位、按位“或”、按位“與”、及按位“異或”。中間數(shù)值是一個或多個算術(shù)運(yùn)算的結(jié)果。
高級程序設(shè)計語言通常還支持多重或n基數(shù)整數(shù)類型并且算術(shù)運(yùn)算是超載的(overloaded)。超載允許運(yùn)算符接收具有混合類型的操作數(shù)。例如JavaTM程序設(shè)計語言支持四種基本整數(shù)類型字節(jié)(byte)、短整數(shù)(short)、整數(shù)(int)及長整數(shù)(long)。這些類型分別支持8位、16位、32位及64位數(shù)值。諸如“+”運(yùn)算符這樣的運(yùn)算符可接收任何這些整數(shù)類型的運(yùn)算符。下面的三個例子說明在具有混合基數(shù)類型的操作數(shù)上所操作的超載的“+”運(yùn)算符。
int a,b;a+b;short a,b;a+b;byte a,b;a+b;這種超載是一般是通過將數(shù)值擴(kuò)展到更寬的基數(shù)類型并隨后執(zhí)行算術(shù)運(yùn)算來完成的。例如,C和JavaTM編譯器通常將字節(jié)類型和短整數(shù)類型的數(shù)值擴(kuò)展到整數(shù)類型。在JavaTM語言中,整數(shù)類型一般是32位。因此,在執(zhí)行算術(shù)運(yùn)算之前,短整數(shù)類型的16位數(shù)值和字節(jié)類型的8位數(shù)值被擴(kuò)展到32位的整數(shù)類型。在JavaTM語言中,為每個上面所列的三個例子而生成了下述字節(jié)碼iload aiload biaddiload指令取任意的8、16或32位的變量并將32位的操作數(shù)放入堆棧。iadd指令將兩個32位的操作數(shù)彈出堆棧,將其相加并將32位的結(jié)果放回堆棧。
不同于JavaTM,一些高級程序設(shè)計語言只定義了整數(shù)類型間的關(guān)系,但是沒有定義每個類型的大小。例如,一個C編譯器廠商可將字節(jié)類型、短整數(shù)類型及整數(shù)類型的位長度分別定義為8、16和32位。然而,另一個C編譯器廠商可將相同類型的位長度分別定義為16、32和64位。而又有一種編譯器可將這些位長度分別定義為16、32和32位。在所有的情況下,每個類型的長度間的關(guān)系得到保持(由字節(jié)類型所表示的數(shù)值數(shù)目<由短整數(shù)類型表示的數(shù)值數(shù)目,由短整數(shù)類型表示的數(shù)值數(shù)目<由整數(shù)類型表示的數(shù)值數(shù)目),但是用于表示每種類型的位的實(shí)際數(shù)目是不同的。與JavaTM類似,但C以每個特定編譯器所定義的整數(shù)類型的大小來執(zhí)行算術(shù)操作。這需要將具有較小基數(shù)類型的數(shù)值擴(kuò)展到整數(shù)類型。
這種類型擴(kuò)展方法減少了機(jī)器指令的數(shù)目,因此減小了目標(biāo)機(jī)的復(fù)雜性。然而,這種類型擴(kuò)展方法通常需要更多的計算堆??臻g。例如,在兩個16位的短整數(shù)類型數(shù)值擴(kuò)展成32位類型之后,將其相加所使用的堆??臻g與將兩個32位的整數(shù)類型數(shù)值進(jìn)行相加所使用的堆??臻g相同,如圖2A和2B所示。
現(xiàn)在轉(zhuǎn)向圖2A,說明以JavaTM語言對兩個短整數(shù)類型的16位數(shù)值進(jìn)行相加時堆棧使用的流程圖。在附圖標(biāo)記20,取第一個16位的操作數(shù)并下推進(jìn)入操作數(shù)堆棧。此時的操作數(shù)堆棧被標(biāo)注為附圖標(biāo)記30。在附圖標(biāo)記22,所述第一個16位的操作數(shù)被擴(kuò)展為32位。在附圖標(biāo)記24,取第二個16位的操作數(shù)并下推進(jìn)入操作數(shù)堆棧。在附圖標(biāo)記26,所述第二個16位的操作數(shù)被擴(kuò)展為32位。此時,操作數(shù)堆棧占用4×16=64位。在附圖標(biāo)記28,利用32位的加運(yùn)算符使這兩個32位的操作數(shù)相加。
轉(zhuǎn)向圖3A,介紹使兩個整數(shù)類型的32位數(shù)值相加時堆棧使用的流程圖。在附圖標(biāo)記40,取第一個32位的操作數(shù)并下推進(jìn)入操作數(shù)堆棧。圖3B說明了操作數(shù)堆棧。在附圖標(biāo)記42,取第二個32位的操作數(shù)并下推進(jìn)入操作數(shù)堆棧。在附圖標(biāo)記44,利用32位的加運(yùn)算符使這兩個32位的操作數(shù)相加。因此,在上述16位的加操作和32位的加操作的例子中,兩個32位操作數(shù)在被彈出堆棧之前,被下推進(jìn)入到堆棧并利用32位加運(yùn)算而進(jìn)行相加。
在程序執(zhí)行過程期間,可改變堆棧的大小,其原因在于諸如嵌套過程調(diào)用的級別、計算表達(dá)式的復(fù)雜度及局部說明的變量這樣的因素。在像智能卡這樣的資源受限設(shè)備中,通常就沒有足夠內(nèi)存來執(zhí)行這些其中發(fā)生了類型擴(kuò)展的計算。
與典型的臺式計算機(jī)和類似設(shè)備相比,資源受限設(shè)備一般被認(rèn)為是在內(nèi)存和/或計算能力或速度上相對受限的設(shè)備。舉例來說,其它資源受限設(shè)備包括蜂窩式電話、邊界掃描(boundary scan)設(shè)備、現(xiàn)場編程(field programmable)設(shè)備、個人數(shù)字助理(PDA)和傳呼機(jī)以及其它微型或小體積設(shè)備。
智能卡是資源受限設(shè)備的其中一種類型,還被稱為智能化便攜式數(shù)據(jù)攜帶卡。智能卡由塑料或者金屬制成并具有電子芯片,電子芯片包括用于執(zhí)行程序的嵌入式微處理器或者微控制器和用于存儲程序和數(shù)據(jù)的存儲器。這些設(shè)備可能有信用卡大小,具有8位或者16位結(jié)構(gòu)的計算機(jī)芯片。另外,這些設(shè)備的存儲能力通常有限。例如,某些智能卡的隨機(jī)存儲器(RAM)容量小于1K,只讀存儲器(ROM)和/或非易失性存儲器(例如電可擦除只讀存儲器(EEPROM))容量也有限。
另外,具有8位或16位體系結(jié)構(gòu)的智能卡通常分別具有內(nèi)置的8位或16位算術(shù)運(yùn)算。這樣,智能卡即通??蓤?zhí)行比32位運(yùn)算更有效的8位或16位運(yùn)算。對于已經(jīng)擴(kuò)展到32位的數(shù)據(jù)執(zhí)行32位運(yùn)算尤其低效。所以,像智能卡這樣的資源受限設(shè)備的有限體系結(jié)構(gòu)和內(nèi)存,就使得要執(zhí)行其中數(shù)值已擴(kuò)展到更大整數(shù)類型的程序成為不切實(shí)際的或不可能的。
JavaTM虛擬機(jī)指令集定義了一個算術(shù)指令集以處理字節(jié)類型、短整數(shù)類型和整數(shù)類型數(shù)值。字節(jié)類型和短整數(shù)類型變量在編譯期間被擴(kuò)展到整數(shù)類型。相反,除了處理整數(shù)類型的指令系統(tǒng)之外,JavaCardTM(支持JavaTM編程語言的智能卡)虛擬機(jī)還定義了單獨(dú)的指令集以處理字節(jié)和短整數(shù)類型的變量。大多數(shù)Java CardTM應(yīng)用程序都運(yùn)行于短整數(shù)或字節(jié)整數(shù)類型的數(shù)據(jù)值之上。
在計算機(jī)工業(yè)中,日益趨向于支持為在內(nèi)存相對充足的臺式計算機(jī)上執(zhí)行而設(shè)計的高級計算機(jī)語言,使得相同的程序可在資源受限設(shè)備上運(yùn)行,從而實(shí)現(xiàn)跨垂直平臺的互用性。這種跨垂直平臺的互用性要求用高級程序設(shè)計語言所編寫的程序在資源受限設(shè)備上運(yùn)行時可獲得與他們將在內(nèi)存相對充足的設(shè)備上運(yùn)行時相同的結(jié)果。例如,希望支持在各種平臺上——包括智能卡平臺、手提式設(shè)備、用戶設(shè)備、臺式計算機(jī)及超級計算機(jī)——執(zhí)行用JavaTM程序設(shè)計語言所編寫的程序。
因此,需要將程序表示(program representation)加以轉(zhuǎn)換,使得可利用較少的計算堆??臻g來執(zhí)行語義相等的數(shù)學(xué)表達(dá)式。此外,現(xiàn)有技術(shù)需要執(zhí)行這樣的轉(zhuǎn)換以增加執(zhí)行速度。
發(fā)明概要對算術(shù)表達(dá)式進(jìn)行優(yōu)化的方法包括接收為具有第一基數(shù)(base)的第一處理器所定義的第一指令,第一指令包括一個運(yùn)算符和至少一個操作數(shù),當(dāng)所有的操作數(shù)都不可能進(jìn)位溢出時或當(dāng)運(yùn)算符對溢出不敏感時,將第一指令轉(zhuǎn)換成為第二指令,該第二指令經(jīng)優(yōu)化用于具有第二基數(shù)的第二處理器,第二基數(shù)小于第一基數(shù),并且當(dāng)至少一個操作數(shù)可能溢出或運(yùn)算符對溢出敏感時,該第二基數(shù)轉(zhuǎn)換成第三指令的更寬基數(shù),該第三指令是所述溢出的源。用于對算術(shù)表達(dá)式進(jìn)行優(yōu)化的裝置包括至少一個具有程序指令的存儲器以及至少一個處理器,該處理器被設(shè)置為利用程序指令以接收為具有第一基數(shù)的第一處理器所定義的第一指令,當(dāng)所述至少一個中的每個操作數(shù)都不可能進(jìn)位溢出時或當(dāng)運(yùn)算符對溢出不敏感時將第一指令轉(zhuǎn)換成第二指令,該第二指令經(jīng)優(yōu)化用于具有第二基數(shù)的第二處理器,第二基數(shù)小于第一基數(shù),并且當(dāng)所述至少一個操作數(shù)可能溢出或運(yùn)算符對溢出敏感時,該第二基數(shù)轉(zhuǎn)換成第三指令的更寬基數(shù),該第三指令是所述溢出的源。
附圖簡述圖1說明了對由高級語言所編寫的程序進(jìn)行編譯的方框圖;圖2A說明了將兩個被擴(kuò)展到32位的16位操作數(shù)進(jìn)行相加時堆棧使用的流程圖;圖2B說明了將兩個被擴(kuò)展到32位的16位操作數(shù)進(jìn)行相加時堆棧使用的方框圖;圖3A說明了將兩個32位的操作數(shù)進(jìn)行相加時使用堆棧的流程圖;圖3B說明了將兩個32位的操作數(shù)進(jìn)行相加時使用堆棧的方框圖;圖4A說明了根據(jù)本發(fā)明的一個實(shí)施例將在資源受限設(shè)備上所執(zhí)行的算術(shù)表達(dá)式進(jìn)行轉(zhuǎn)換的方框圖;圖4B說明了根據(jù)本發(fā)明的一個實(shí)施例對JavaTM類文件進(jìn)行轉(zhuǎn)換的方框圖;圖5A說明了在臺式計算機(jī)上對兩個短整數(shù)類型的數(shù)值進(jìn)行相加的代碼例子;圖5B說明了在資源受限設(shè)備上對兩個短整數(shù)類型的數(shù)值進(jìn)行相加的代碼例子;
圖6A說明了在臺式計算機(jī)上對兩個短整數(shù)類型的數(shù)值進(jìn)行相加并立即將結(jié)果進(jìn)行類型轉(zhuǎn)換(casting)的代碼例子;圖6B說明了在資源受限設(shè)備上立即將結(jié)果進(jìn)行類型轉(zhuǎn)換的代碼例子,該運(yùn)算可能進(jìn)位溢出。
圖7A在臺式計算機(jī)上對三個短整數(shù)類型的數(shù)值進(jìn)行相加并立即將結(jié)果進(jìn)行類型轉(zhuǎn)換的代碼例子;圖7B說明了在資源受限設(shè)備上通過可能溢出的運(yùn)算來執(zhí)行不受操作數(shù)溢出作用的運(yùn)算的代碼例子。
圖8A說明了在臺式計算機(jī)上對兩個短整數(shù)類型的數(shù)值進(jìn)行相加并將結(jié)果除以短整數(shù)類型的數(shù)值的代碼例子;圖8B說明了在資源受限設(shè)備上通過可能溢出的運(yùn)算來執(zhí)行受操作數(shù)溢出作用的運(yùn)算的代碼例子。
圖9說明了根據(jù)本發(fā)明的一個實(shí)施例對n基數(shù)型算術(shù)表達(dá)式進(jìn)行優(yōu)化的方法流程圖;圖10說明了根據(jù)本發(fā)明的一個實(shí)施例對n基數(shù)型算術(shù)表達(dá)式進(jìn)行優(yōu)化的方法的詳細(xì)流程圖;圖11說明了根據(jù)本發(fā)明一個實(shí)施例的對指令進(jìn)行轉(zhuǎn)換的流程圖;圖12A說明了根據(jù)本發(fā)明一個實(shí)施例的對目標(biāo)指令進(jìn)行轉(zhuǎn)換的流程圖;圖12B說明了根據(jù)本發(fā)明一個實(shí)施例的對初值指令進(jìn)行轉(zhuǎn)換的流程圖;圖13說明了根據(jù)本發(fā)明一個實(shí)施例的對類型轉(zhuǎn)換指令進(jìn)行轉(zhuǎn)換的流程圖;圖14說明了根據(jù)本發(fā)明一個實(shí)施例的對堆棧處理指令進(jìn)行轉(zhuǎn)換的流程圖;圖15說明了根據(jù)本發(fā)明一個實(shí)施例的對算術(shù)表達(dá)式進(jìn)行轉(zhuǎn)換的流程圖;圖16說明了根據(jù)本發(fā)明一個實(shí)施例的用于確定所優(yōu)化的指令類型的方法的流程圖;圖17說明了根據(jù)本發(fā)明一個實(shí)施例的用于確定結(jié)果類型及結(jié)果溢出的方法的流程圖18說明了根據(jù)本發(fā)明一個實(shí)施例的用于記錄返回點(diǎn)(rollbackpoint)的方法的流程圖;圖19說明了根據(jù)本發(fā)明一個實(shí)施例的用于返回轉(zhuǎn)換處理的方法的流程圖;圖20說明了根據(jù)本發(fā)明一個實(shí)施例的用于傳播(propagating)指令優(yōu)化結(jié)果的流程圖;圖21說明了根據(jù)本發(fā)明一個實(shí)施例的對來自不同控制路徑的轉(zhuǎn)換信息進(jìn)行合并的流程圖;圖22A說明了根據(jù)本發(fā)明一個實(shí)施例的指令轉(zhuǎn)換的方框圖;圖22B說明了根據(jù)本發(fā)明一個實(shí)施例的指令轉(zhuǎn)換的方框圖。
具體實(shí)施方案詳述本領(lǐng)域普通技術(shù)人員會明白以下對本發(fā)明的描述僅是說明性的。對受益于本發(fā)明描述的技術(shù)人員來說,易于想到本發(fā)明的其它實(shí)施例。
本發(fā)明涉及計算機(jī)系統(tǒng)。尤其是,本發(fā)明涉及n基數(shù)類型算術(shù)表達(dá)式的優(yōu)化。本發(fā)明進(jìn)一步涉及機(jī)器可讀介質(zhì),在其上存儲有(1)本發(fā)明的設(shè)計參數(shù)和/或(2)利用本發(fā)明在計算機(jī)上執(zhí)行運(yùn)算的程序指令。這種介質(zhì)包括例如磁帶、磁盤、諸如CD ROM這樣的光學(xué)可讀介質(zhì)、以及諸如PCMCIA卡這樣的半導(dǎo)體存儲器。所述介質(zhì)還可采取諸如硬盤驅(qū)動或計算機(jī)RAM這樣較大的或固定的對象的形式。
與典型的臺式計算機(jī)和類似設(shè)備相比,資源受限設(shè)備一般被認(rèn)為是在內(nèi)存和/或計算能力或速度上相對受限的設(shè)備。舉例來說,其它資源受限設(shè)備包括蜂窩式電話、邊界掃描設(shè)備、現(xiàn)場編程設(shè)備、個人數(shù)字助理(PDA)和傳呼機(jī)以及其它微型或小體積設(shè)備。本發(fā)明還可用在非資源受限的設(shè)備中。
為本說明的目的,術(shù)語“處理器”可用于指實(shí)體計算機(jī)或虛擬機(jī)。
現(xiàn)在轉(zhuǎn)向圖4A,提出了用于說明根據(jù)本發(fā)明的一個實(shí)施例,對在資源受限設(shè)備上所執(zhí)行的算術(shù)表達(dá)式進(jìn)行轉(zhuǎn)換的方框圖。編譯器獲得用高級語言62所編寫的并將操作數(shù)擴(kuò)展到更大整數(shù)類型的算術(shù)表達(dá)式60,生成更大基數(shù)類型的指令64以便在典型臺式機(jī)66上執(zhí)行。該更大基數(shù)類型指令64被優(yōu)化到語義相等的較小基數(shù)類型的指令68,以便在資源受限設(shè)備70上執(zhí)行。例如用短整數(shù)類型加指令來運(yùn)算短整數(shù)類型操作數(shù),而結(jié)果是短整數(shù)類型。
根據(jù)本發(fā)明另一實(shí)施例,優(yōu)化到語義相等的較小基數(shù)類型的指令是適時(just-in-time)代碼生成器的一部分。就在第一次執(zhí)行一組指令之前,未優(yōu)化的指令被優(yōu)化為語義相等的較小基數(shù)類型的指令,以便在資源受限設(shè)備上執(zhí)行。隨后使用這組優(yōu)化指令來執(zhí)行同一組指令。
根據(jù)本發(fā)明另外一個實(shí)施例,當(dāng)要求較大類型的指令64來保存算術(shù)指令的語義,而目標(biāo)處理機(jī)不支持較大類型的指令時,該算術(shù)表達(dá)式即因不受支持而被拒絕。
現(xiàn)在轉(zhuǎn)向圖4B,提出了用于說明根據(jù)本發(fā)明的一個實(shí)施例對指令進(jìn)行轉(zhuǎn)換的方框圖。JavaTM類文件72通過Java CardTM類文件轉(zhuǎn)換器74而被接收,該JavaTM類文件72包含具有32位操作數(shù)的指令。轉(zhuǎn)換器74生成優(yōu)化的指令76以在資源受限設(shè)備上執(zhí)行。所述優(yōu)化包括,舉例說明,提供較少的堆棧使用量、較小的程序長度以及更快的執(zhí)行。
目標(biāo)機(jī)支持n型算術(shù)運(yùn)算符。JavaTM虛擬機(jī)支持整數(shù)類型的運(yùn)算符,而JavaTM虛擬機(jī)支持短整數(shù)類型的運(yùn)算符并選擇性地支持整數(shù)類型的運(yùn)算符。其它設(shè)備可能僅支持字節(jié)類型的算術(shù)運(yùn)算,或所有的字節(jié)類型、短整數(shù)類型、整數(shù)類型的運(yùn)算。通常在8位或16位處理器上執(zhí)行16位運(yùn)算需要相對少的時間,而在相同處理器上執(zhí)行32位運(yùn)算需要相對較多的時間。
因為在優(yōu)化時期內(nèi)不知道在算術(shù)操作中所使用的實(shí)際數(shù)值,優(yōu)化必須為每個操作數(shù)假定一個最壞情況的數(shù)值。根據(jù)輸入操作數(shù)的類型來確定每個操作數(shù)的最壞情況的數(shù)值。較小類型的運(yùn)算可具有要求較大類型的表示或溢出到較大類型的結(jié)果。因此,根據(jù)本發(fā)明,算術(shù)運(yùn)算符被分類成受溢出作用的運(yùn)算符和具有產(chǎn)生溢出可能性的運(yùn)算符。為了公開這個目的,溢出包括負(fù)值的下溢(underflow)。如果產(chǎn)生結(jié)果的運(yùn)算符屬于可能會生成溢出到較大類型表示的一組運(yùn)算符時,較小類型的運(yùn)算結(jié)果被認(rèn)為可能進(jìn)位溢出。只要中間數(shù)值不被用作屬于受溢出作用的一組運(yùn)算符的操作數(shù),即允許中間數(shù)值可能進(jìn)位溢出。
具有產(chǎn)生溢出可能性的運(yùn)算符包括加法、減法、乘法、除法、求反及左移位。表1給出了這些運(yùn)算符的JavaTM字節(jié)碼。表1-具有溢出可能性的運(yùn)算
表2給出了受溢出作用的運(yùn)算符。受溢出作用的算術(shù)運(yùn)算符包括除法、求余、求反、右移位及無符號右移位。受溢出作用的非算術(shù)運(yùn)算符包括數(shù)組運(yùn)算、轉(zhuǎn)換運(yùn)算及比較運(yùn)算。
表2-受溢出作用的運(yùn)算
當(dāng)表1的運(yùn)算優(yōu)化為較小類型時,結(jié)果可溢出為較大類型。如果表達(dá)式的一個操作數(shù)是中間數(shù)值并包含可能溢出的數(shù)據(jù),那么在表2中具有一個運(yùn)算符的表達(dá)式的結(jié)果會失去精確性。為了實(shí)現(xiàn)優(yōu)化并保存高級源代碼的語義,當(dāng)結(jié)果輸入到表2中的一個運(yùn)算時,必須利用明確的源級類型轉(zhuǎn)換(cast)來將可能的溢出校正為結(jié)果的類型。
如果表2中的任意一個運(yùn)算的輸入操作數(shù)是表1中運(yùn)算的結(jié)果并且不存在明確的高級源代碼類型轉(zhuǎn)換,則不可能發(fā)生優(yōu)化。這樣的錯誤優(yōu)化不能保證語義相等的結(jié)果。換句話說,為在資源受限設(shè)備上執(zhí)行而生成的被優(yōu)化代碼提供了與為臺式計算機(jī)而生成的非優(yōu)化代碼不同的結(jié)果。例如,溢出數(shù)據(jù)可存在于操作數(shù)的JavaTM32位表示中,但是不存在于Java CardTM16位表示中。
如果使用了具有較小類型的運(yùn)算符,那么具有表1所列運(yùn)算符的運(yùn)算結(jié)果可導(dǎo)致溢出。圖5A-8B提供了將目標(biāo)為臺式計算機(jī)平臺的指令優(yōu)化到目標(biāo)為資源受限設(shè)備平臺的這些相關(guān)問題的例子。這些例子假定臺式計算機(jī)基于32位體系結(jié)構(gòu)并具有相對充足的內(nèi)存。資源受限設(shè)備被假定基于具有相對較少內(nèi)存的16位體系結(jié)構(gòu)。本領(lǐng)域普通技術(shù)人員可認(rèn)識到本發(fā)明可用于具有不同體系結(jié)構(gòu)的計算平臺。
圖5A-8B還使用帶符號數(shù)值。本領(lǐng)域普通技術(shù)人員也可認(rèn)識到不管數(shù)值是帶符號還是不帶符號,溢出都可發(fā)生。
現(xiàn)在轉(zhuǎn)向圖5B,提出了一個代碼例子,該例子說明了在臺式計算機(jī)上對兩個短整數(shù)類型數(shù)值進(jìn)行相加。數(shù)值“a”包括可由16位帶符號短整數(shù)類型所表示的最大數(shù)值。如上所述,即使數(shù)值是16位短整數(shù)類型數(shù)值,也使用整數(shù)類型加法。因此,在結(jié)果數(shù)值中存在從16位區(qū)域到32位區(qū)域的溢出,并且溢出的結(jié)果是生成了較大的32位正值。
現(xiàn)在轉(zhuǎn)向圖5B,提出了一個代碼例子,該例子說明了在如圖5A所示的資源受限設(shè)備上對相同的數(shù)值進(jìn)行相加。因為運(yùn)行是在資源受限設(shè)備上執(zhí)行的并且兩個數(shù)值都是16位短整數(shù)類型,對指令進(jìn)行優(yōu)化以使用短整數(shù)類型加法,從而使用較少堆??臻g。然而,因為用16位加法代替了32位加法,加法在符號位產(chǎn)生溢出。盡管臺式計算機(jī)計算出數(shù)值32768,在資源受限設(shè)備實(shí)例中計算出的結(jié)果是-32768,一個負(fù)值。這個結(jié)果是不可接受的,因為它與臺式計算機(jī)的結(jié)果不同,阻止了跨多計算機(jī)平臺的互用性。
現(xiàn)在轉(zhuǎn)向圖6A,提出了一個代碼例子,該例子說明了對兩個相同的數(shù)值進(jìn)行相加并立即對出現(xiàn)的結(jié)果進(jìn)行類型轉(zhuǎn)換。這個例子與圖5A的例子相同,除了相加的結(jié)果被轉(zhuǎn)換為短整數(shù)類型。將類型轉(zhuǎn)換為短整數(shù)類型是對最重要的16位進(jìn)行舍位(truncate),使之成為一個短整數(shù)類型數(shù)值并且符號延伸至32位數(shù)值??赡苓M(jìn)位溢出的運(yùn)算(加法運(yùn)算)的結(jié)果經(jīng)類型轉(zhuǎn)換而成為短整數(shù)類型,從而消除了任何可能的溢出問題。圖6B說明了在資源受限設(shè)備上對圖6A所示的兩個相同的數(shù)值進(jìn)行相加,這兩個相同的數(shù)值被表示為16位數(shù)值。臺式計算機(jī)和資源受限設(shè)備的結(jié)果數(shù)值相同。
現(xiàn)在轉(zhuǎn)向圖7A,提出了一個代碼例子,該例子說明了在臺式計算機(jī)上對三個短整數(shù)類型的數(shù)值進(jìn)行相加。在這個例子中,整數(shù)類型加法被用于使16位的數(shù)值“a”和“b”相加,并將結(jié)果加到“c”上。最后的結(jié)果經(jīng)類型轉(zhuǎn)換成為短整數(shù)類型。
現(xiàn)在轉(zhuǎn)向圖7B,提出了一個代碼例子,該例子說明了在資源受限設(shè)備上執(zhí)行不受操作數(shù)溢出作用的運(yùn)算的代碼例子,該操作數(shù)是由可能進(jìn)位溢出的運(yùn)算生成的。因為此例中所有數(shù)值都是16位短整數(shù)類型,短整數(shù)類型加法被用于所有的中間數(shù)值加法。如表1所示,加法運(yùn)算符可能產(chǎn)生溢出,但是不受溢出的作用。因此“a”和“b”相加生成了可能進(jìn)位溢出的數(shù)值。該數(shù)值被加到“c”上,生成了另一個可能進(jìn)位溢出的數(shù)值。盡管第二個加運(yùn)算包含可能進(jìn)位溢出的一個操作數(shù)(a+b結(jié)果),該加運(yùn)算不受進(jìn)位溢出的操作數(shù)的作用。最后的結(jié)果經(jīng)類型轉(zhuǎn)換成為短整數(shù)類型,除去了來自加法運(yùn)算的可能溢出。這樣,臺式計算機(jī)和資源受限設(shè)備的結(jié)果數(shù)值相同。
現(xiàn)在轉(zhuǎn)向圖8A,提出了一個代碼例子,該例子說明了在臺式計算機(jī)上對兩個短整數(shù)類型的數(shù)值進(jìn)行相加并將結(jié)果除以短整數(shù)類型的數(shù)值。因為運(yùn)行是在臺式計算機(jī)上執(zhí)行的,使用了整數(shù)類型運(yùn)算。利用整數(shù)類型加法將數(shù)值“a”和“b”相加。中間數(shù)值除以“c”。
現(xiàn)在轉(zhuǎn)向圖8B,提出一個代碼例子,該例子說明了在資源受限設(shè)備上執(zhí)行受操作數(shù)溢出作用的運(yùn)算的代碼例子,該操作數(shù)是由可能進(jìn)位溢出的運(yùn)算生成的。因為運(yùn)行是在資源受限設(shè)備上執(zhí)行的,使用短整數(shù)類型運(yùn)算。利用短整數(shù)類型加法將數(shù)值“a”和“b”相加。中間數(shù)值除以“c”。與圖7B中所用的加法運(yùn)算符不一樣,這里運(yùn)算符受到溢出作用,如表2所示。16位數(shù)值被認(rèn)為是負(fù)值,因為設(shè)置了最高位。這樣,臺式計算機(jī)和資源受限設(shè)備實(shí)例即提供了不同結(jié)果,該結(jié)果未經(jīng)如圖6A-7B中所示程序的類型轉(zhuǎn)換修正。
根據(jù)本發(fā)明,根據(jù)操作數(shù)的類型,利用最佳的類型指令對算術(shù)表達(dá)式進(jìn)行優(yōu)化。優(yōu)化處理一直進(jìn)行,直到遇見可能溢出的問題。此時,算術(shù)表達(dá)式的輸入操作數(shù)被再次訪問并被轉(zhuǎn)換到下一級更大類型的指令。該處理重復(fù)執(zhí)行,直到選擇了指令的合適類型,使得臺式計算機(jī)上的算術(shù)表達(dá)式提供與具有優(yōu)化指令集的資源受限設(shè)備相同的結(jié)果。
在轉(zhuǎn)換處理期間保持幾個關(guān)系。這些關(guān)系涉及指令以及在目標(biāo)機(jī)上執(zhí)行指令時所產(chǎn)生的數(shù)值。關(guān)系數(shù)據(jù)包括數(shù)值的實(shí)際上的和所希望的類型。關(guān)系數(shù)據(jù)還包括源指令,一旦在目標(biāo)機(jī)上執(zhí)行該指令,則其將在目標(biāo)機(jī)上產(chǎn)生數(shù)值。每個指令還被鏈接到其操作數(shù)關(guān)系數(shù)據(jù)。此外,結(jié)果的關(guān)系數(shù)據(jù)被鏈接到使用該結(jié)果的指令。每個關(guān)系數(shù)據(jù)還被鏈接到如在目標(biāo)機(jī)上執(zhí)行則可導(dǎo)致溢出的指令(如果有的話)。該指令被稱為返回點(diǎn)。因為當(dāng)可能進(jìn)位溢出的數(shù)值由被對溢出敏感的運(yùn)算符使用時會產(chǎn)生錯誤的最后結(jié)果,當(dāng)轉(zhuǎn)換處理不能進(jìn)一步進(jìn)行時,將所生成的數(shù)值鏈接到可引起溢出的指令,這提供了返回到引起溢出問題的指令的途徑。
可進(jìn)一步使用一個中間數(shù)值,作為后繼指令的操作數(shù)。如果中間數(shù)值可能進(jìn)位溢出,則返回指令也在結(jié)果中傳播。在轉(zhuǎn)換表達(dá)式期間對此重復(fù)執(zhí)行。返回動作總是作用于中間數(shù)值(和操作數(shù)),并且返回到其中要求重新轉(zhuǎn)換的指令。以下討論用于確定返回指令的方法以及優(yōu)化的其它細(xì)節(jié)。
現(xiàn)在轉(zhuǎn)向圖9,提出了用于說明根據(jù)本發(fā)明的一個實(shí)施例對n基數(shù)型算術(shù)表達(dá)式進(jìn)行優(yōu)化的方法流程圖。在附圖標(biāo)記80,接收要轉(zhuǎn)換的指令。在附圖標(biāo)記82,判斷是否任一個輸入操作數(shù)可能進(jìn)位溢出。如果至少一個操作數(shù)可能進(jìn)位溢出,在附圖標(biāo)記84處判斷被轉(zhuǎn)換的指令是否對溢出敏感。在此所用的JAVATM字節(jié)碼列于表2。本領(lǐng)域普通技術(shù)人員會認(rèn)識到,所列的受溢出作用的運(yùn)算符隨不同的高級語言而變化,并且本發(fā)明同樣適用于其它語言。
在附圖標(biāo)記86,如果被轉(zhuǎn)換的指令對溢出敏感,則轉(zhuǎn)換處理返回到為問題源的指令,并利用具有較寬基數(shù)的類型來轉(zhuǎn)換該指令。例如,8位字節(jié)類型可被加寬到16位字(word)類型,16位字類型可被加寬到32位字類型。將操作數(shù)加寬到更寬類型需要將后續(xù)操作數(shù)的指令加以轉(zhuǎn)換,以使用對應(yīng)于更大類型的指令。
如果被轉(zhuǎn)換的指令不對溢出敏感,或者沒有輸入操作數(shù)可能進(jìn)位溢出,在附圖標(biāo)記88指令被轉(zhuǎn)換到最優(yōu)類型,以便在資源受限設(shè)備上執(zhí)行。在附圖標(biāo)記90,判斷是否尚有更多指令要進(jìn)行轉(zhuǎn)換。如果留有更多的指令,下一指令的轉(zhuǎn)換開始于附圖標(biāo)記80。當(dāng)最后的指令已經(jīng)轉(zhuǎn)換,則轉(zhuǎn)換處理在附圖標(biāo)記90結(jié)束。
現(xiàn)在轉(zhuǎn)向圖10,提出了一個詳細(xì)的流程圖,該流程圖說明了根據(jù)本發(fā)明一個實(shí)施例對n基數(shù)型算術(shù)表達(dá)式進(jìn)行優(yōu)化。在附圖標(biāo)記100,產(chǎn)生轉(zhuǎn)換未完成的指示。在附圖標(biāo)記102,產(chǎn)生應(yīng)執(zhí)行第一指令轉(zhuǎn)換的指示。在附圖標(biāo)記104,判斷指令轉(zhuǎn)換是否已完成。如果指令轉(zhuǎn)換已完成,在附圖標(biāo)記106結(jié)束執(zhí)行。如果轉(zhuǎn)換沒有完成,在附圖標(biāo)記108產(chǎn)生轉(zhuǎn)換完成的指示。在附圖標(biāo)記110,獲得第一指令。在附圖標(biāo)記112,判斷指令是否應(yīng)被轉(zhuǎn)換。
如果指令應(yīng)被轉(zhuǎn)換,在附圖標(biāo)記114和116分別產(chǎn)生轉(zhuǎn)換未結(jié)束的指示和當(dāng)前指令不應(yīng)再次轉(zhuǎn)換的指示。在附圖標(biāo)記118,指令被轉(zhuǎn)換為另一個被優(yōu)化的指令,以便用于具有較小基數(shù)類型的目標(biāo)機(jī)。在附圖標(biāo)記120,判斷在附圖標(biāo)記118的轉(zhuǎn)換是否觸發(fā)了返回。如果返回被觸發(fā),在附圖標(biāo)記122獲得返回點(diǎn)的指令并在附圖標(biāo)記104重新開始返回點(diǎn)的指令的轉(zhuǎn)換。如果返回沒有被觸發(fā),在附圖標(biāo)記124結(jié)果類型和所需類型進(jìn)行匹配。在附圖標(biāo)記126,轉(zhuǎn)換指令被傳播給每一控制路徑的后繼指令。
在附圖標(biāo)記128,判斷是否留存更多指令。如果留存更多的指令,在附圖標(biāo)記130獲得下一指令并在附圖標(biāo)記112繼續(xù)執(zhí)行。當(dāng)最后的指令已被轉(zhuǎn)換時轉(zhuǎn)換處理結(jié)束。
現(xiàn)在轉(zhuǎn)向圖11,提出了一個流程圖,該流程圖說明了根據(jù)本發(fā)明的一個實(shí)施例來轉(zhuǎn)換指令。在附圖標(biāo)記140,判斷當(dāng)前指令是否是算術(shù)指令。如果是算術(shù)指令,它在附圖標(biāo)記142被轉(zhuǎn)換。類似地,在附圖標(biāo)記146、150、154和158,分別進(jìn)行堆棧處理、目標(biāo)、類型轉(zhuǎn)換及轉(zhuǎn)換初值指令的轉(zhuǎn)換。在圖11中根據(jù)指令是否是算術(shù)、堆棧操作、類型轉(zhuǎn)換或初值指令的指令分類僅用于說明目的。本領(lǐng)域普通技術(shù)人員會認(rèn)識到本發(fā)明可適用于許多其它的指令類型或分類。
現(xiàn)在轉(zhuǎn)向圖12A,提出了一個流程圖,該流程圖說明了根據(jù)本發(fā)明的一個實(shí)施例來轉(zhuǎn)換目標(biāo)指令的方法。在JavaTM虛擬機(jī)指令集中,目標(biāo)指令包括分支、轉(zhuǎn)換、數(shù)組存取、數(shù)組建立和變量存儲/輸入指令,以及計算機(jī)語言中的堆棧處理、類型轉(zhuǎn)換、初值指令或算術(shù)表達(dá)式之外的其它類型的敏感的非算術(shù)指令。
在附圖標(biāo)記160,判斷所需的指令操作數(shù)的類型。在附圖標(biāo)記162,判斷目標(biāo)機(jī)所使用的操作數(shù)是否具有比所需的目標(biāo)指令類型更小的類型。如果操作數(shù)具有比所需的更小的類型,在附圖標(biāo)記164,返回具有較小類型的操作數(shù)的轉(zhuǎn)換處理。如果操作數(shù)不具有比所需的更小的類型,在附圖標(biāo)記166,判斷操作數(shù)是否可能進(jìn)位溢出。如果操作數(shù)由表1所列出的一個操作數(shù)來生成,或如果其由在操作數(shù)中傳播溢出的運(yùn)算符來生成,則該操作數(shù)可能進(jìn)位溢出。舉例來說,傳播溢出的運(yùn)算符包括“與”、“或”及“異或”(xor)運(yùn)算符。如果沒有可能進(jìn)位溢出的操作數(shù),則在附圖標(biāo)記167優(yōu)化指令。如果至少一個操作數(shù)可能進(jìn)位溢出,在附圖標(biāo)記164,返回具有較小類型的操作數(shù)的轉(zhuǎn)換處理。
現(xiàn)在轉(zhuǎn)向圖12B,提出了一個流程圖,該流程圖說明了根據(jù)本發(fā)明的一個實(shí)施例來轉(zhuǎn)換初值指令的方法。初值指令的例子包括取/載入指令及其它載入變量的指令。初值指令還包括方法調(diào)用(methodinvocation)指令,該指令返回方法結(jié)果(method result)。這些指令被稱為“初值”指令,因為該指令所產(chǎn)生的數(shù)值不是中間計算的結(jié)果。在附圖標(biāo)記168,接收變量、返回的數(shù)值及常量的類型。在附圖標(biāo)記169,根據(jù)變量或常量的類型來優(yōu)化初值指令。例如,為載入短類型的局部變量,iload指令被優(yōu)化為sload。
現(xiàn)在轉(zhuǎn)向圖13,提出了一個流程圖,該流程圖說明了根據(jù)本發(fā)明的一個實(shí)施例來轉(zhuǎn)換類型轉(zhuǎn)換指令的方法。類型轉(zhuǎn)換指令可將操作數(shù)轉(zhuǎn)換為更大類型或更小類型。例如,將32位整數(shù)類型轉(zhuǎn)換為16位短整數(shù)類型是將操作數(shù)轉(zhuǎn)換為較小的類型。類似地,將8位字節(jié)類型轉(zhuǎn)換為32位整數(shù)類型是將操作數(shù)轉(zhuǎn)換為較大的類型。在后面的類型轉(zhuǎn)換中,字節(jié)類型被稱為操作數(shù)類型,而整數(shù)類型被稱為目標(biāo)類型。
在附圖標(biāo)記170接收指令。在附圖標(biāo)記172和174分別確定操作數(shù)類型及目標(biāo)類型。如果操作數(shù)類型大于目標(biāo)類型,則在附圖標(biāo)記178將操作數(shù)類型變窄為目標(biāo)類型。如果操作數(shù)類型小于目標(biāo)類型,在附圖標(biāo)記180判斷操作數(shù)是否可能進(jìn)位溢出。如果操作數(shù)可能進(jìn)位溢出,則在附圖標(biāo)記182使轉(zhuǎn)換處理返回以修正類型。如果操作數(shù)進(jìn)位不可能溢出,則在附圖標(biāo)記184將操作數(shù)加寬到目標(biāo)類型。
現(xiàn)在轉(zhuǎn)向圖14,提出了一個流程圖,該流程圖說明了根據(jù)本發(fā)明的一個實(shí)施例來轉(zhuǎn)換堆棧處理指令的方法。在JavaTM虛擬機(jī)指令集中,堆棧處理指令包括“復(fù)制”、“交換”及“彈出”指令。在附圖標(biāo)記190接收指令。在附圖標(biāo)記192判斷指令是否為復(fù)制指令。如果是復(fù)制指令,在附圖標(biāo)記194判斷是否存在用于初始堆棧入口的返回點(diǎn)。如果初始堆棧入口不具有返回點(diǎn),則在附圖標(biāo)記196將用于復(fù)制的堆棧入口的返回點(diǎn)設(shè)置為初始堆棧入口的返回點(diǎn)。如果初始堆棧入口具有返回點(diǎn),在附圖標(biāo)記198,將用于復(fù)制的堆棧入口的返回點(diǎn)設(shè)置為初始堆棧入口的源指令。在附圖標(biāo)記200,指令被轉(zhuǎn)換。
現(xiàn)在轉(zhuǎn)向圖15,提出了一個流程圖,該流程圖說明了根據(jù)本發(fā)明的一個實(shí)施例來轉(zhuǎn)換算術(shù)表達(dá)式的方法。在附圖標(biāo)記210,判斷操作數(shù)是否可能進(jìn)位溢出。如果操作數(shù)進(jìn)位不可能溢出,在附圖標(biāo)記212產(chǎn)生操作數(shù)不具有溢出可能的指示。如果操作數(shù)可能進(jìn)位溢出,在附圖標(biāo)記214判斷指令是否受溢出作用。如果指令不受溢出作用,在附圖標(biāo)記216產(chǎn)生操作數(shù)具有溢出可能的指示。如果指令受溢出作用,在附圖標(biāo)記218轉(zhuǎn)換返回到具有溢出的第一操作數(shù)。如果轉(zhuǎn)換沒有被返回,在附圖標(biāo)記220確定優(yōu)化的指令類型,在附圖標(biāo)記222優(yōu)化指令并在附圖標(biāo)記224確定結(jié)果類型和結(jié)果溢出。
現(xiàn)在轉(zhuǎn)向圖16,提出了一個流程圖,該流程圖說明了根據(jù)本發(fā)明的一個實(shí)施例來確定優(yōu)化的指令類型的方法。在附圖標(biāo)記230,接收至少一個操作數(shù)。在附圖標(biāo)記232,所需的指令類型被設(shè)置為與操作數(shù)相關(guān)的最大類型。在附圖標(biāo)記234,判斷任一個操作數(shù)是否具有比所需指令類型更小的類型。如果至少一個操作數(shù)具有比所需類型更小的類型,則在附圖標(biāo)記236將該較小類型的操作數(shù)返回以修正類型。
現(xiàn)在轉(zhuǎn)向圖17,提出了一個流程圖,該流程圖說明了根據(jù)本發(fā)明的一個實(shí)施例來確定結(jié)果類型和結(jié)果溢出的方法。在附圖標(biāo)記240,結(jié)果類型被設(shè)置為指令類型。在表3至10總結(jié)了Java CardTM結(jié)果類型和所返回的溢出指示。每一個表表示基于一個或多個操作數(shù)類型的結(jié)果類型和溢出指示。
表3-加法,乘法,減法
表4-除法
表5-左移位
表6-右移位
表7-求反
表8-無符號右移
表9-求余
表10-和、或、異或
圖17中使用Java CardTM結(jié)果類型和溢出指示僅用于說明目的。本領(lǐng)域普通技術(shù)人員會認(rèn)識到本發(fā)明還適用于其它的具有其它類型的高級語言。
在附圖標(biāo)記244,判斷是否可能由于使用更加優(yōu)化的指令而導(dǎo)致結(jié)果進(jìn)位溢出。如果結(jié)果進(jìn)位不可能溢出,在附圖標(biāo)記246判斷任意操作數(shù)是否傳播溢出。如至少一個操作數(shù)傳播溢出或如結(jié)果可能進(jìn)位溢出,在附圖標(biāo)記248記錄結(jié)果的返回點(diǎn)并且在附圖標(biāo)記250產(chǎn)生結(jié)果具有溢出可能的指示。
現(xiàn)在轉(zhuǎn)向圖18,提出了一個流程圖,該流程圖說明了根據(jù)本發(fā)明的一個實(shí)施例來記錄返回點(diǎn)的方法。在附圖標(biāo)記260,判斷第一操作數(shù)是否具有與其有關(guān)的返回點(diǎn)。如果第一操作數(shù)具有與其相關(guān)的返回點(diǎn),在附圖標(biāo)記262將當(dāng)前指令的返回點(diǎn)設(shè)置為該第一操作數(shù)的返回點(diǎn)。如果第一操作數(shù)不具有與其相關(guān)的返回點(diǎn),在附圖標(biāo)記264判斷第二操作數(shù)是否具有與其相關(guān)的返回點(diǎn)。如果第二操作數(shù)具有與其相關(guān)的返回點(diǎn),在附圖標(biāo)記266將指令的返回點(diǎn)設(shè)置為該第二操作數(shù)的返回點(diǎn)。如果兩者都不具有與其相關(guān)的返回點(diǎn),則在附圖標(biāo)記268將指令的返回點(diǎn)設(shè)置到用于第一操作數(shù)的源指令。
根據(jù)本發(fā)明的特定實(shí)施例,如圖18所示,“第一操作數(shù)”是指第一個被生成的操作數(shù)。將返回點(diǎn)設(shè)置為較老操作數(shù)的源指令可避免必須執(zhí)行較新操作數(shù)的額外的返回操作,因為修正與較老操作數(shù)相關(guān)的類型可修正被較新操作數(shù)隨后使用的類型。
現(xiàn)在轉(zhuǎn)向圖19,提出了一個流程圖,該流程圖說明了根據(jù)本發(fā)明的一個實(shí)施例來返回轉(zhuǎn)換處理的方法。在附圖標(biāo)記270,優(yōu)先取得當(dāng)前指令的轉(zhuǎn)換。在附圖標(biāo)記272,判斷操作數(shù)是否具有返回點(diǎn)。如果操作數(shù)不具有返回點(diǎn),在附圖標(biāo)記276將返回指令設(shè)置為生產(chǎn)操作數(shù)的源指令。如果操作數(shù)具有返回點(diǎn),在附圖標(biāo)記274將返回指令設(shè)置到同一個返回點(diǎn)。在附圖標(biāo)記278加寬返回指令的所需類型。在附圖標(biāo)記280,產(chǎn)生返回點(diǎn)指令應(yīng)被轉(zhuǎn)換的指示。在附圖標(biāo)記282,在返回指令處重新進(jìn)行轉(zhuǎn)換操作。在附圖標(biāo)記284,根據(jù)新的所需類型而轉(zhuǎn)換返回指令。
現(xiàn)在轉(zhuǎn)向圖20,提出了一個流程圖,該流程圖說明了根據(jù)本發(fā)明的一個實(shí)施例來傳播指令優(yōu)化的結(jié)果。在附圖標(biāo)記290,獲得后繼的指令。后繼指令是與當(dāng)前指令處于相同控制路徑上的指令,并且在當(dāng)前指令之后立即出現(xiàn)。本領(lǐng)域普通技術(shù)人員知道單一指令可以是許多控制路徑的一部分。
在附圖標(biāo)記292,判斷后繼指令是否在轉(zhuǎn)換處理中經(jīng)過預(yù)先訪問。如果后繼指令曾經(jīng)被預(yù)先訪問,則在附圖標(biāo)記294將用于后繼指令的轉(zhuǎn)換信息設(shè)置為與當(dāng)前指令的轉(zhuǎn)換信息相等,并在附圖標(biāo)記296產(chǎn)生后繼指令應(yīng)被轉(zhuǎn)換的指示。該轉(zhuǎn)換信息可包括當(dāng)前轉(zhuǎn)換點(diǎn)的運(yùn)行狀態(tài)。例如,由當(dāng)前或先前的指令所生成的數(shù)值尚未被使用。該數(shù)值將被用作控制路徑中后繼指令的操作數(shù)。對于每一個數(shù)值都記錄類型、源指令及返回點(diǎn)。如果后繼路徑已被預(yù)先訪問,在附圖標(biāo)記298,記錄在后繼指令中的先前的轉(zhuǎn)換信息與當(dāng)前的轉(zhuǎn)換信息合并。在附圖標(biāo)記298,判斷該合并信息內(nèi)的數(shù)值是否已在附圖標(biāo)記300被修改。如果數(shù)值已被修改,在附圖標(biāo)記296產(chǎn)生后繼指令應(yīng)被轉(zhuǎn)換的指示。對每一個后繼指令重復(fù)進(jìn)行這一處理。
現(xiàn)在轉(zhuǎn)向圖21,提出了一個流程圖,該流程圖說明了根據(jù)本發(fā)明的一個實(shí)施例來合并不同控制路徑的轉(zhuǎn)換信息。在附圖標(biāo)記310,比較兩個控制路徑的相應(yīng)輸入,在附圖標(biāo)記312,判斷相應(yīng)輸入的類型是否不相同。如果類型不相同,在附圖標(biāo)記314返回具有較小類型的輸入。對每個操作數(shù)重復(fù)進(jìn)行這一處理。
現(xiàn)在轉(zhuǎn)向圖22,提出了一個流程圖,該流程圖說明了根據(jù)本發(fā)明的一個實(shí)施例的指令轉(zhuǎn)換。這表明本發(fā)明適用于可被優(yōu)化的算術(shù)表達(dá)式。圖22A說明了用于JavaTM表達(dá)式的轉(zhuǎn)換處理短整數(shù)c=(short)((short)(a+b)/c)其中數(shù)值a、b和c是短整數(shù)類型。在附圖標(biāo)記316給出了這一表達(dá)式的JavaTM字節(jié)碼序列。
指令轉(zhuǎn)換開始于iload_a指令。與第一個、較小的類型相關(guān)的指令被用于載入指令和加指令。如表1所指定的,加法指令產(chǎn)生可能的溢出,但是在源級經(jīng)顯式(explicit)類型轉(zhuǎn)換成為短整數(shù)類型而消除了溢出的可能性。DIV 330指令受圖2所示的溢出的作用。然而,因為該顯式類型轉(zhuǎn)換,所以不存在可能的溢出。因此,不會有必要“返回”到加法操作以生成一個較大的類型。
為了進(jìn)一步有助于理解本發(fā)明,參考圖10至21,對以上討論的實(shí)施例做更加詳細(xì)的說明。
iload是一個源指令。在附圖標(biāo)記160,“a”操作數(shù)的所需類型是短整數(shù)類型。在附圖標(biāo)記162,操作數(shù)“a”是短整數(shù)類型。在附圖標(biāo)記166,操作數(shù)進(jìn)位不可能溢出,因為它們被直接載入并因此而不會由生成溢出的運(yùn)算所產(chǎn)生。因此,在附圖標(biāo)記167,短整數(shù)類型指令被用于將iload指令轉(zhuǎn)換成sload_a指令。類似地,iload_b指令被轉(zhuǎn)換成sload_b指令。
接下來,處理iadd指令。因為iadd是可產(chǎn)生溢出的指令,在附圖標(biāo)記210進(jìn)行檢查以判斷其操作數(shù)是否可能進(jìn)位溢出。直接載入兩個操作數(shù)以使其進(jìn)位不可能溢出。此后在附圖標(biāo)記220判斷優(yōu)化的結(jié)果類型。在附圖標(biāo)記232,指令類型被設(shè)置為最大操作數(shù)類型。在這個實(shí)例中,最大操作數(shù)類型是短整數(shù)類型,因為操作數(shù)“a”和操作數(shù)“b”是短整數(shù)類型。因為兩個操作數(shù)的類型相同于指令類型,在附圖標(biāo)記238返回作為指令類型的短整數(shù)類型。
接下來,在附圖標(biāo)記222優(yōu)化指令。因為指令類型是短整數(shù)類型,優(yōu)化指令是“sadd”。接下來,在附圖標(biāo)記224判斷結(jié)果類型和溢出指示。在附圖標(biāo)記240,結(jié)果類型被設(shè)置為短整數(shù)類型,該類型為指令類型。此外,根據(jù)表3產(chǎn)生結(jié)果具有可能溢出的指示。因為結(jié)果包含可能的溢出,在附圖標(biāo)記248記錄用于(a+b)結(jié)果的返回點(diǎn)。兩個操作數(shù)都沒有返回點(diǎn)時,使得在附圖標(biāo)記268將用于結(jié)果的返回點(diǎn)設(shè)置為用于操作數(shù)“a”(第一操作數(shù))的源指令。在附圖標(biāo)記250,產(chǎn)生結(jié)果具有可能溢出的指示。
接下來,處理i2s指令。在附圖標(biāo)記176,將操作數(shù)類型(短整數(shù))與目標(biāo)類型相比較(短整數(shù))。因為兩者類型相同,在附圖標(biāo)記178將類型變窄為短整數(shù)類型,消除可能的溢出。
最后,處理istore_c指令。因為所需的類型是短整數(shù)類型并且操作數(shù)進(jìn)位不會溢出,在附圖標(biāo)記187將istore_c指令優(yōu)化到sstore_c指令。在附圖標(biāo)記318給出了所轉(zhuǎn)換的字節(jié)碼。
現(xiàn)在轉(zhuǎn)向圖22B,提出了一個流程圖,該流程圖說明了根據(jù)本發(fā)明的一個實(shí)施例的指令轉(zhuǎn)換。這表明本發(fā)明適用于不可被優(yōu)化的算術(shù)表達(dá)式。經(jīng)轉(zhuǎn)換的代碼與未經(jīng)轉(zhuǎn)換的代碼仍然在語義上相等。圖22說明了用于JavaTM表達(dá)式的轉(zhuǎn)換處理短整數(shù)c=(short)((short)(a+b)/c)其中數(shù)值a、b和c是短整數(shù)類型。在附圖標(biāo)記316給出了該表達(dá)式的JavaTM字節(jié)碼序列。
指令轉(zhuǎn)換開始于iload_a指令,如附圖標(biāo)記322所示。與第一個較小的類型相關(guān)的指令被用于載入指令322、324和加指令326。如表1所指定的,加法指令326產(chǎn)生了可能的溢出,但是不需利用第二個較大的類型。然而,DIV 330指令受溢出的作用,表2表明了這點(diǎn)。因此,必須修正產(chǎn)生溢出問題的指令。通過“返回”到附圖標(biāo)記322并使用第二個較大類型的用于操作數(shù)“a”的指令來解決這個問題。
在附圖標(biāo)記332,第二次進(jìn)行指令轉(zhuǎn)換,直到確定操作數(shù)“b”也必須被轉(zhuǎn)換成較大類型,需要再次返回為止。在附圖標(biāo)記334指令轉(zhuǎn)換隨后第三次進(jìn)行,直到確定用于操作數(shù)“c”的指令必須使用較大的類型為止。第三次執(zhí)行返回,在附圖標(biāo)記336,操作數(shù)“c”的類型被修正并且在繼續(xù)進(jìn)行了第四次轉(zhuǎn)換處理之后,結(jié)束該轉(zhuǎn)換處理。
為了進(jìn)一步有助于理解本發(fā)明,參考附圖10至21,對以上所討論的圖22B的實(shí)例做更加詳細(xì)的說明。
iload_a、iload_b和iadd指令的初始轉(zhuǎn)換如前面實(shí)施例中所描述的進(jìn)行。接下來在附圖標(biāo)記167,iload_c指令被轉(zhuǎn)換成sload_c指令。隨后處理idiv指令。如表2所指定的,idiv是受溢出作用的指令?!癮+b”運(yùn)算符具有溢出可能,因為它是由運(yùn)算符“+”所生成的并且該運(yùn)算符可產(chǎn)生如表1所示的溢出。因為至少一個運(yùn)算符具有溢出可能,在附圖標(biāo)記218執(zhí)行返回到具有溢出的第一操作數(shù)。
在附圖標(biāo)記270,先取得當(dāng)前指令的轉(zhuǎn)換。在附圖標(biāo)記274,溢是與a+b操作數(shù)相關(guān)聯(lián),所以將返回點(diǎn)設(shè)置為a+b操作數(shù)的返回點(diǎn)。在附圖標(biāo)記278,所需的返回指令的類型被從短整數(shù)類型加寬到整數(shù)類型。在附圖標(biāo)記280,產(chǎn)生對返回指令進(jìn)行轉(zhuǎn)換的指示。在附圖標(biāo)記282,在iload_a指令處恢復(fù)轉(zhuǎn)換處理,該iload_a指令在先前被轉(zhuǎn)換成sload_a指令。在附圖標(biāo)記284,轉(zhuǎn)換iload_a指令。
作為返回的結(jié)果,在附圖標(biāo)記338處理iload_a指令。在附圖標(biāo)記124,使結(jié)果類型和所需的類型進(jìn)行匹配。因為結(jié)果類型是短整數(shù)類型而所需類型是整數(shù)類型,類型不匹配。于是,生成S2I指令以將短整數(shù)類型提升為整數(shù)類型。對iload_b指令和iadd指令繼續(xù)進(jìn)行處理。在附圖標(biāo)記210,iadd的操作數(shù)進(jìn)位不可能溢出,所以在附圖標(biāo)記220判斷優(yōu)化的結(jié)果類型。在附圖標(biāo)記234,比較操作數(shù)類型。因為“a”操作數(shù)現(xiàn)在是整數(shù)類型而“b”操作數(shù)仍然是短整數(shù)類型,執(zhí)行“b”操作數(shù)的返回。在附圖標(biāo)記276,返回指令被設(shè)置為iload_b指令340。在附圖標(biāo)記278,所需的指令類型被設(shè)置為整數(shù)。在附圖標(biāo)記280,產(chǎn)生轉(zhuǎn)換當(dāng)前指令的指示。在附圖標(biāo)記283和284,在iload_b指令處恢復(fù)轉(zhuǎn)換處理并且指令被轉(zhuǎn)換。
在附圖標(biāo)記124,使結(jié)果類型和所需類型進(jìn)行匹配。因為結(jié)果類型是短整數(shù)類型而所需類型是整數(shù)類型,類型不匹配。于是生成S2I指令以將短整數(shù)類型提升為整數(shù)類型。
接下來處理iadd指令。在第二次返回之后,沒有一個操作數(shù)具有溢出的可能。因此在附圖標(biāo)記210產(chǎn)生操作數(shù)不可能進(jìn)位溢出的指示并在附圖標(biāo)記220確定優(yōu)化的指令類型。在附圖標(biāo)記232,指令類型被設(shè)置為最大操作數(shù)類型。因為a+b操作數(shù)是整數(shù)類型并且“c”操作數(shù)是短整數(shù)類型,指令類型被設(shè)置為整數(shù)。因為“c”操作數(shù)類型不同于指令類型,在附圖標(biāo)記236處執(zhí)行“c”操作數(shù)的返回。在附圖標(biāo)記278,將返回指令的所需類型從短整數(shù)類型加寬到整數(shù)類型。在iload_c指令342處繼續(xù)轉(zhuǎn)換處理。
在附圖標(biāo)記124,將結(jié)果類型和所需類型進(jìn)行匹配。因為結(jié)果類型是短整數(shù)類型而所需類型是整數(shù)類型,類型不匹配。于是生成S21指令以將短整數(shù)類型提升為整數(shù)類型。
接下來,處理idiv指令。在附圖標(biāo)記238,將優(yōu)化指令類型設(shè)置為整數(shù),因為兩個操作數(shù)都是整數(shù)類型。在附圖標(biāo)記222,選擇整數(shù)類型指令(idiv)。圖22的附圖標(biāo)記344表示最后的指令序列。
盡管以上就整數(shù)類型而對本發(fā)明進(jìn)行了描述,但是本領(lǐng)域普通技術(shù)人員會認(rèn)識到本發(fā)明還可應(yīng)用于浮點(diǎn)算術(shù)表達(dá)式。另外,雖然就JavaCardTM技術(shù)而對本發(fā)明進(jìn)行了說明,但本領(lǐng)域普通技術(shù)人員會認(rèn)識到本發(fā)明還可適用于許多其它平臺。這些平臺包括,舉例來說,K虛擬機(jī)(KVM)技術(shù),在太陽微系統(tǒng)公司(Sun Microsystem,Inc.)1999年6月8日出版的“K虛擬機(jī)(KVM)-白皮書”中描述了KVM技術(shù)。
本發(fā)明還可以用軟件或固件來實(shí)現(xiàn)。它也可用其它處理器以及可編程門陣列設(shè)備、專用集成電路(ASIC)、及其它硬件來實(shí)現(xiàn),這樣就描述了用于算術(shù)表達(dá)式的自適應(yīng)優(yōu)化的新方法。統(tǒng)一類型的指令被轉(zhuǎn)換成語義相等的第二個較小的整數(shù)類型(具有較少的位數(shù))的類型指令,以便在資源受限設(shè)備上執(zhí)行,從而提供了相對高效的堆棧利用率并提高了執(zhí)行速度。盡管顯示并描述了本發(fā)明的實(shí)施例及應(yīng)用,對受益于本說明的本領(lǐng)域普通技術(shù)人員來說顯而易見,在不脫離本發(fā)明基本原理的情況下能夠進(jìn)行比以上所述更多的修改。因此本發(fā)明僅僅為所附權(quán)利要求的精神所限定。
權(quán)利要求
1.一種用于優(yōu)化算術(shù)表達(dá)式的方法,包括接收為為具有第一基數(shù)的第一處理器所定義的第一指令,所述指令包括一個運(yùn)算符和至少一個操作數(shù);當(dāng)所述至少一個操作數(shù)不可能進(jìn)位溢出超出第二基數(shù)時,或當(dāng)所述運(yùn)算符對溢出不敏感時,將所述第一指令轉(zhuǎn)換成為具有該第二基數(shù)的第二處理器所優(yōu)化的第二指令,所述第二基數(shù)小于所述第一基數(shù);當(dāng)所述至少一個操作數(shù)可能進(jìn)位溢出超出所述第二基數(shù)時,并且當(dāng)所述運(yùn)算符對溢出敏感時,轉(zhuǎn)換成更寬基數(shù)的第三指令,該第三指令是與所述至少一個操作數(shù)相關(guān)的可能溢出的源,所述第三指令在先前已被優(yōu)化,所述更寬基數(shù)大于所述第二基數(shù)而小于或等于所述第一基數(shù)。
2.如權(quán)利要求1的方法,其中所述轉(zhuǎn)換成更寬基數(shù)進(jìn)一步包括在所述轉(zhuǎn)換到更寬基數(shù)之前舍棄(discard)所述第三指令的先前轉(zhuǎn)換結(jié)果。
3.如權(quán)利要求1的方法,進(jìn)一步包括拒絕(reject)不能在所述第二處理器上被優(yōu)化為較小基數(shù)的表達(dá)式。
4.如權(quán)利要求1的方法,其中所述轉(zhuǎn)換成更寬基數(shù)進(jìn)一步包括當(dāng)所述第二處理器不支持所述更寬基數(shù)時,拒絕所述第一指令。
5.如權(quán)利要求1的方法,其中所述第一指令是運(yùn)算。
6.如權(quán)利要求1的方法,其中所述第一指令包括一個非運(yùn)算的類型敏感型(rype-sensitive)指令。
7.如權(quán)利要求5的方法,進(jìn)一步包括在對所述第一指令進(jìn)行所述轉(zhuǎn)換之后,返回接收所述第一指令,直到為所述第一處理器所定義的全部指令被轉(zhuǎn)換為止。
8.如權(quán)利要求7的方法,進(jìn)一步包括將每一個指令鏈接到所有控制路徑上的后繼的指令。
9.如權(quán)利要求8的方法,其中對所述第一指令進(jìn)行的所述轉(zhuǎn)換進(jìn)一步包括將每一個指令的結(jié)果鏈接到使用所述結(jié)果的所有指令上;如果所述轉(zhuǎn)換包括生成一個數(shù)值,則將所述數(shù)值鏈接到產(chǎn)生所述數(shù)值的指令;及如果所述數(shù)值可能進(jìn)位溢出,則將所述數(shù)值鏈接到最初導(dǎo)致所述溢出的指令。
10.如權(quán)利要求1的方法,包括所述第一處理器包括JavaTM虛擬機(jī);以及所述第二處理器包括JaVa CardTM虛擬機(jī)。
11.如權(quán)利要求1的方法,包括所述第一基數(shù)被所述第一處理器使用以執(zhí)行至少一個數(shù)據(jù)類型的算術(shù)運(yùn)算,所述至少一個數(shù)據(jù)類型具有比所述第一基數(shù)的長度更小的長度;以及所述第二基數(shù)被第二處理器使用以執(zhí)行至少一個數(shù)據(jù)類型的算術(shù)運(yùn)算,所述第二基數(shù)具有與所述至少一個數(shù)據(jù)類型相同的大小。
12.如權(quán)利要求1的方法,其中所述第一處理器由32位處理器構(gòu)成;以及所述第二處理器由資源受限的(resorce-constrained)16位處理器構(gòu)成。
13.如權(quán)利要求9的方法,其中所述第一基數(shù)被所述第一處理器使用以執(zhí)行至少一個數(shù)據(jù)類型的算術(shù)運(yùn)算,所述至少一個數(shù)據(jù)類型具有比所述第一基數(shù)的長度更小的長度;以及所述第二基數(shù)被所述第二處理器使用以執(zhí)行至少一個數(shù)據(jù)類型的算術(shù)運(yùn)算,所述第二基數(shù)具有比所述至少一個數(shù)據(jù)類型的長度更大的長度。
14.如權(quán)利要求13的方法,其中所述第一處理器由32位處理器構(gòu)成;以及所述第二處理器由資源受限的16位處理器構(gòu)成。
15.一種機(jī)器可讀的程序存儲設(shè)備,具體實(shí)施為可通過機(jī)器執(zhí)行的指令程序,用以執(zhí)行算術(shù)表達(dá)式的優(yōu)化,包括接收為具有第一基數(shù)的第一處理器所定義的第一指令,所述第一指令包括一個運(yùn)算符和至少一個操作數(shù);當(dāng)所述至少一個操作數(shù)不可能進(jìn)位溢出超出第二基數(shù)時,或當(dāng)所述運(yùn)算符對溢出不敏感時,將所述第一指令轉(zhuǎn)換成為具有該第二基數(shù)的第二處理器所優(yōu)化的第二指令,所述第二基數(shù)小于所述第一基數(shù);以及當(dāng)所述至少一個操作數(shù)可能進(jìn)位溢出超出所述第二基數(shù)時,并且當(dāng)所述運(yùn)算符對溢出敏感時,轉(zhuǎn)換成更寬基數(shù)的第三指令,該第三指令是與所述至少一個操作數(shù)相關(guān)的可能溢出的源,所述第三指令在先前已被優(yōu)化,所述更寬基數(shù)大于所述第二基數(shù)而小于或等于所述第一基數(shù)。
16.如權(quán)利要求15的程序存儲設(shè)備,其中所述轉(zhuǎn)換成更寬基數(shù)進(jìn)一步包括在所述轉(zhuǎn)換到更寬基數(shù)之前舍棄所述第三指令的先前轉(zhuǎn)換結(jié)果。
17.如權(quán)利要求15的程序存儲設(shè)備,進(jìn)一步包括拒絕不能在所述第二處理器上被優(yōu)化為較小基數(shù)的表達(dá)式。
18.如權(quán)利要求15的程序存儲設(shè)備,其中所述轉(zhuǎn)換成更寬基數(shù)進(jìn)一步包括當(dāng)所述第二處理器不支持所述更寬基數(shù)時,拒絕所述第一指令。
19.如權(quán)利要求15的程序存儲設(shè)備,其中所述第一指令是運(yùn)算。
20.如權(quán)利要求15的程序存儲設(shè)備,其中所述第一指令包括一個非運(yùn)算的類型敏感型指令。
21.如權(quán)利要求19的程序存儲設(shè)備,進(jìn)一步包括在對所述第一指令進(jìn)行所述轉(zhuǎn)換之后,返回接收所述第一指令,直到為所述第一處理器所定義的全部指令被轉(zhuǎn)換為止。
22.如權(quán)利要求21的程序存儲設(shè)備,進(jìn)一步包括將每一個指令鏈接到所有控制路徑上的后繼的指令。
23.如權(quán)利要求22的程序存儲設(shè)備,其中對所述第一指令進(jìn)行的所述轉(zhuǎn)換進(jìn)一步包括將每一個指令的結(jié)果鏈接到使用所述結(jié)果的所有指令上;如果所述轉(zhuǎn)換包括生成一個數(shù)值,則將所述數(shù)值鏈接到產(chǎn)生所述數(shù)值的指令;及如果所述數(shù)值可能進(jìn)位溢出,則將所述數(shù)值鏈接到最初導(dǎo)致所述溢出的指令。
24.如權(quán)利要求15的程序存儲設(shè)備,其中所述第一處理器包括JavaTM虛擬機(jī);以及所述第二處理器包括Java CardTM虛擬機(jī)。
25.如權(quán)利要求15的程序存儲設(shè)備,其中所述第一基數(shù)被所述第一處理器使用以執(zhí)行至少一個數(shù)據(jù)類型的算術(shù)運(yùn)算,所述至少一個數(shù)據(jù)類型具有比所述第一基數(shù)的長度更小的長度;以及所述第二基數(shù)被第二處理器使用以執(zhí)行至少一個數(shù)據(jù)類型的算術(shù)運(yùn)算,所述第二基數(shù)具有與所述至少一個數(shù)據(jù)類型相同的大小。
26.如權(quán)利要求15的程序存儲設(shè)備,其中所述第一處理器由32位處理器構(gòu)成;以及所述第二處理器由資源受限的16位處理器構(gòu)成。
27.如權(quán)利要求23的程序存儲設(shè)備,其中所述第一基數(shù)被所述第一處理器使用以執(zhí)行至少一個數(shù)據(jù)類型的算術(shù)運(yùn)算,所述至少一個數(shù)據(jù)類型具有比所述第一基數(shù)的長度更小的長度;以及所述第二基數(shù)被所述第二處理器使用以執(zhí)行至少一個數(shù)據(jù)類型的算術(shù)運(yùn)算,所述第二基數(shù)具有比所述至少一個數(shù)據(jù)類型的長度更大的長度。
28.一種用于算術(shù)表達(dá)式優(yōu)化的設(shè)備,包括至少一個具有程序指令的存儲器;以及至少一個處理器,其設(shè)置為使用該程序指令以執(zhí)行以下操作接收為具有第一基數(shù)的第一處理器所定義的第一指令,所述第一指令包括一個運(yùn)算符和至少一個操作數(shù);當(dāng)所述至少一個操作數(shù)不可能進(jìn)位溢出超出第二基數(shù)時,或當(dāng)所述運(yùn)算符對溢出不敏感時,將所述第一指令轉(zhuǎn)換成為具有該第二基數(shù)的第二處理器所優(yōu)化的第二指令,所述第二基數(shù)小于所述第一基數(shù);以及當(dāng)所述至少一個操作數(shù)可能進(jìn)位溢出超出所述第二基數(shù)時,并且當(dāng)所述運(yùn)算符對溢出敏感時,轉(zhuǎn)換成更寬基數(shù)的第三指令,該第三指令是與所述至少一個操作數(shù)相關(guān)的可能溢出的源,所述第三指令在先前已被優(yōu)化,所述更寬基數(shù)大于所述第二基數(shù)而小于或等于所述第一基數(shù)。
29.如權(quán)利要求28的設(shè)備,其中所述至少一個處理器進(jìn)一步被設(shè)置為使用該程序指令以在轉(zhuǎn)換到更寬基數(shù)之前舍棄所述第三指令的先前轉(zhuǎn)換結(jié)果。
30.一種用于算術(shù)表達(dá)式優(yōu)化的設(shè)備,包括裝置,用于接收為具有第一基數(shù)的第一處理器所定義的第一指令,所述第一指令包括一個運(yùn)算符和至少一個操作數(shù);裝置,用于當(dāng)所述至少一個操作數(shù)不可能進(jìn)位溢出超出第二基數(shù)時,或當(dāng)所述運(yùn)算符對溢出不敏感時,將所述第一指令轉(zhuǎn)換成為具有該第二基數(shù)的第二處理器所優(yōu)化的第二指令,所述第二基數(shù)小于所述第一基數(shù);以及裝置,用于當(dāng)所述至少一個操作數(shù)可能進(jìn)位溢出超出所述第二基數(shù)時,并且當(dāng)所述運(yùn)算符對溢出敏感時,轉(zhuǎn)換成更寬基數(shù)的第三指令,該第三指令是與所述至少一個操作數(shù)相關(guān)的可能溢出的源,所述第三指令在先前已被優(yōu)化,所述更寬基數(shù)大于所述第二基數(shù)而小于或等于所述第一基數(shù)。
31.如權(quán)利要求30的設(shè)備,其中用于轉(zhuǎn)換成更寬基數(shù)的裝置進(jìn)一步包括裝置,用于在所述轉(zhuǎn)換到更寬基數(shù)之前舍棄所述第三指令的先前轉(zhuǎn)換結(jié)果。
32.如權(quán)利要求30的設(shè)備,進(jìn)一步包括裝置,用于將每一個指令鏈接到所有控制路徑上的后繼指令。
33.一種使用應(yīng)用軟件程序的方法,該應(yīng)用軟件程序包括對至少一個指令的算術(shù)表達(dá)式進(jìn)行優(yōu)化,該至少一個指令以具有第一基數(shù)的處理器為目標(biāo),所述方法包括在一處理器上接收該軟件程序;以及在該處理器上執(zhí)行所述指令的序列。
34.如權(quán)利要求33的方法,進(jìn)一步包括將至少一個指令存儲在資源受限設(shè)備(resource-constrained device)上。
35.一種具有嵌入其中的微控制器的智能卡,該智能卡包括由微控制器所操作的虛擬機(jī),該虛擬機(jī)執(zhí)行包括多個先前被優(yōu)化的指令的軟件應(yīng)用程序,所述虛擬機(jī)包括用于接收優(yōu)化指令的設(shè)備,該優(yōu)化指令在先前受到優(yōu)化以便在資源受限設(shè)備上執(zhí)行,以及用于執(zhí)行所述指令的設(shè)備。
全文摘要
用于優(yōu)化算術(shù)表達(dá)式的方法,包括接收為具有第一基數(shù)的第一處理器所定義的第一指令(80),第一指令(80)包括一個運(yùn)算符和至少一個操作數(shù),當(dāng)所有操作數(shù)進(jìn)位不可能溢出(82)時或運(yùn)算符對溢出不敏感時,將所述第一指令(80)轉(zhuǎn)換成為具有第二基數(shù)的第二處理器所優(yōu)化的第二指令(88),第二基數(shù)小于第一基數(shù),并且當(dāng)至少一個操作數(shù)可能進(jìn)位溢出并且運(yùn)算符對溢出敏感時,轉(zhuǎn)換成更寬基數(shù)的第三指令(86),第三指令是溢出源。用于對算術(shù)表達(dá)式進(jìn)行優(yōu)化的裝置包括至少一個具有程序指令的存儲器以及至少一個處理器,被設(shè)置為使用程序指令以接收為具有第一基數(shù)的第一處理器所定義的第一指令(80),第一指令(80)包括一個運(yùn)算符和至少一個操作數(shù),當(dāng)所述所有運(yùn)算符進(jìn)位不可能溢出(82)時或當(dāng)運(yùn)算符對溢出不敏感時,將所述第一指令(80)轉(zhuǎn)換成為具有第二基數(shù)的第二處理器所優(yōu)化的第二指令(88),第二基數(shù)小于第一基數(shù),并且當(dāng)至少一個操作數(shù)可能進(jìn)位溢出(84)時并且當(dāng)運(yùn)算符對溢出敏感時,轉(zhuǎn)換成更寬基數(shù)的第三指令(86),第三指令是溢出源。
文檔編號G06F9/45GK1421001SQ00818195
公開日2003年5月28日 申請日期2000年11月10日 優(yōu)先權(quán)日1999年11月12日
發(fā)明者陳志群, J·施瓦貝 申請人:太陽微系統(tǒng)公司