專利名稱:生成用于程序代碼轉(zhuǎn)換的中間表示的體系結(jié)構(gòu)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明一般地涉及計(jì)算機(jī)和計(jì)算機(jī)軟件的領(lǐng)域,更具體地說(shuō),涉及用于例如代碼轉(zhuǎn)換器、仿真器(emulator)和加速器(accelerator)的程序代碼轉(zhuǎn)換方法與裝置。
背景技術(shù):
在嵌入式和非嵌入式CPU的市場(chǎng)上,人們尋找占優(yōu)勢(shì)的指令集體系結(jié)構(gòu)(ISA,Instruction Set Architecture),其中存在著大的軟件體,這些軟件體在性能上可以被“加速”,或者被“轉(zhuǎn)換”為能提供較好的性能/價(jià)格比的多種可能的處理器,只要這些處理器能透明地訪問(wèn)相關(guān)的軟件。人們還尋找占優(yōu)勢(shì)的CPU體系結(jié)構(gòu),后者在時(shí)間上被鎖定于它們的ISA,因而無(wú)法在性能或者市場(chǎng)范圍方面取得進(jìn)展,也不能得益于“合成CPU”共同體系結(jié)構(gòu)。
人們通常希望把為第一類型的計(jì)算機(jī)處理器(“源”處理器)編寫(xiě)的程序代碼運(yùn)行于第二類型的處理器(“目標(biāo)”處理器)上。這里,使用一個(gè)仿真器或轉(zhuǎn)換器來(lái)執(zhí)行程序代碼轉(zhuǎn)換,使得源程序能在目標(biāo)處理器上運(yùn)行。仿真器提供一種虛擬環(huán)境,通過(guò)仿真源處理器,仿佛源程序以本地方式運(yùn)行于源處理器之上。
以往,正如在題為“Program Code Conversion”的(專利公報(bào))WO 00/22521并結(jié)合本申請(qǐng)書(shū)的圖1至圖5所描述的那樣,在使用所謂的基本結(jié)點(diǎn)的運(yùn)行時(shí)間轉(zhuǎn)換期間,將源代碼轉(zhuǎn)換為計(jì)算機(jī)程序的中間表示。中間表示(IR,intermediate representation)是一個(gè)在計(jì)算機(jī)行業(yè)中廣泛使用的術(shù)語(yǔ),它指的是抽象計(jì)算機(jī)語(yǔ)言的各種形式,在其中,一段程序可以被表達(dá),但是不專用于任何特定的處理器,也不打算在任何特定的處理器上直接執(zhí)行。使用中間表示的、有助于這樣的加速、轉(zhuǎn)換和共同體系結(jié)構(gòu)能力的程序代碼轉(zhuǎn)換方法與裝置是,例如,在上述公報(bào)WO 00/22521中所講述的那樣。
發(fā)明內(nèi)容
根據(jù)本發(fā)明,提供了如在所附的權(quán)利要求書(shū)中所陳述的裝置與方法。從各項(xiàng)從屬權(quán)利要求以及隨后的敘述中,本發(fā)明的優(yōu)選的特征將是顯而易見(jiàn)的。
下面是根據(jù)本發(fā)明的各個(gè)方面的概括以及根據(jù)用于程序代碼轉(zhuǎn)換的改進(jìn)的體系結(jié)構(gòu)的不同實(shí)施例的可實(shí)現(xiàn)的優(yōu)點(diǎn)。它作為一個(gè)簡(jiǎn)介而提供,以幫助本領(lǐng)域的技術(shù)人員更快地認(rèn)同隨后的本發(fā)明的詳細(xì)討論,并且不去限制、也不打算以任何方式去限制所附的權(quán)利要求書(shū)的范圍。
以下所描述的各個(gè)實(shí)施例涉及用于程序代碼轉(zhuǎn)換裝置的改進(jìn)的體系結(jié)構(gòu)以及相關(guān)方法,用于把可以在源計(jì)算環(huán)境中執(zhí)行的源代碼(subject code)轉(zhuǎn)換為可以在目標(biāo)計(jì)算環(huán)境中執(zhí)行的目標(biāo)代碼。所述程序代碼轉(zhuǎn)換裝置生成源代碼的中間表示(“IR”),然后可以針對(duì)目標(biāo)計(jì)算環(huán)境對(duì)它進(jìn)行優(yōu)化,以便更有效地生成目標(biāo)代碼。根據(jù)在轉(zhuǎn)換中所涉及的特定的源和目標(biāo)計(jì)算環(huán)境的體系結(jié)構(gòu),一個(gè)實(shí)施例的程序代碼轉(zhuǎn)換裝置確定在中間表示中將生成下列類型的IR結(jié)點(diǎn)中的哪一種基本結(jié)點(diǎn)、復(fù)雜結(jié)點(diǎn)、多形結(jié)點(diǎn)和體系結(jié)構(gòu)專用結(jié)點(diǎn)。程序代碼轉(zhuǎn)換體系結(jié)構(gòu)在生成中間表示時(shí),將通過(guò)默認(rèn)來(lái)生成基本結(jié)點(diǎn),除非已經(jīng)確定另一種類型的結(jié)點(diǎn)更加適用于正在實(shí)現(xiàn)的特定轉(zhuǎn)換。
基本結(jié)點(diǎn)提供為表達(dá)運(yùn)行源代碼的任何源體系結(jié)構(gòu)的語(yǔ)義所需的最小結(jié)點(diǎn)(即,抽象表達(dá)式)集,因此,基本結(jié)點(diǎn)提供一種類似于精簡(jiǎn)指令集計(jì)算機(jī)(RISC,Reduced Instruction Set Computer)的功能。復(fù)雜結(jié)點(diǎn)是以比基本結(jié)點(diǎn)更加緊湊的表達(dá)方式來(lái)表達(dá)運(yùn)行源代碼的任何源體系結(jié)構(gòu)的語(yǔ)義的類似于復(fù)雜指令集計(jì)算機(jī)(CISC,Complex Instruction Set Computer)的通用結(jié)點(diǎn)。同時(shí)所有復(fù)雜結(jié)點(diǎn)都可以被分解為具有相同語(yǔ)義的基本結(jié)點(diǎn)表示,復(fù)雜結(jié)點(diǎn)保留在單個(gè)IR結(jié)點(diǎn)中的復(fù)雜指令的語(yǔ)義,以便改進(jìn)轉(zhuǎn)換器的性能。復(fù)雜結(jié)點(diǎn)實(shí)質(zhì)上擴(kuò)大了在源代碼中用于類似于CISC指令的基本結(jié)點(diǎn)集?;窘Y(jié)點(diǎn)和復(fù)雜結(jié)點(diǎn)二者都通用于寬范圍的可能的源和目標(biāo)體系結(jié)構(gòu),因此,允許在含有基本結(jié)點(diǎn)和復(fù)雜結(jié)點(diǎn)的相應(yīng)的IR樹(shù)上進(jìn)行一般的優(yōu)化。
如果被實(shí)現(xiàn)為通用IR結(jié)點(diǎn),目標(biāo)計(jì)算環(huán)境的特征可能導(dǎo)致特定的源指令的語(yǔ)義丟失時(shí),程序代碼轉(zhuǎn)換裝置將在中間表示中利用多形結(jié)點(diǎn)。多形結(jié)點(diǎn)含有一個(gè)函數(shù)指針,它指向?qū)S糜谠创a中的特定源指令的目標(biāo)計(jì)算環(huán)境的函數(shù),程序代碼轉(zhuǎn)換裝置還利用體系結(jié)構(gòu)專用結(jié)點(diǎn)來(lái)提供目標(biāo)專用的轉(zhuǎn)換部件,以便為某些目標(biāo)計(jì)算環(huán)境執(zhí)行專門(mén)化的代碼生成功能。
下面描述的改進(jìn)的IR生成方法允許程序代碼轉(zhuǎn)換裝置被配置成任何源和目標(biāo)處理器體系結(jié)構(gòu)對(duì),同時(shí)保持最佳的性能水平,并使轉(zhuǎn)換速度最大化。
為了更好地理解本發(fā)明,以及為了表示如何去實(shí)行本發(fā)明的實(shí)施例,現(xiàn)在借助于實(shí)例并引用附圖來(lái)加以說(shuō)明,在附圖中圖1表示包括源和目標(biāo)計(jì)算環(huán)境的一個(gè)示例性的計(jì)算環(huán)境;圖2表示一個(gè)優(yōu)選的程序代碼轉(zhuǎn)換裝置;圖3是表示源代碼到目標(biāo)代碼的轉(zhuǎn)換的說(shuō)明性計(jì)算環(huán)境的示意圖;圖4是根據(jù)本發(fā)明的一個(gè)優(yōu)選實(shí)施例,由程序代碼轉(zhuǎn)換裝置實(shí)現(xiàn)的各種中間表示的一個(gè)示意性的圖解;圖5是一個(gè)優(yōu)選的程序代碼轉(zhuǎn)換裝置的詳細(xì)示意圖;
圖6表示使用基本結(jié)點(diǎn)和復(fù)雜結(jié)點(diǎn)產(chǎn)生的中間表示樹(shù)的實(shí)例;圖7是表示在一個(gè)加速器中用于實(shí)施本發(fā)明的ASN生成的實(shí)例的示意圖;圖8是表示在一個(gè)轉(zhuǎn)換器中用于實(shí)施本發(fā)明的ASN生成的實(shí)例的示意圖;圖9是當(dāng)使用按照本發(fā)明的一個(gè)優(yōu)選實(shí)施例的ASN時(shí),所述轉(zhuǎn)換過(guò)程的操作流程圖;圖10是說(shuō)明轉(zhuǎn)換過(guò)程和在所述過(guò)程中生成的相應(yīng)的中間表示(IR)的一個(gè)實(shí)例的示意圖;圖11是說(shuō)明轉(zhuǎn)換過(guò)程和在所述過(guò)程中產(chǎn)生的相應(yīng)中間表示的另一個(gè)實(shí)例的示意圖;圖12是說(shuō)明轉(zhuǎn)換過(guò)程和在所述過(guò)程中產(chǎn)生的相應(yīng)中間表示的一個(gè)進(jìn)一步的實(shí)例的示意圖。
具體實(shí)施例方式
提供以下的說(shuō)明是為了使本領(lǐng)域的任何技術(shù)人員都能實(shí)行和使用本發(fā)明,并且陳述本發(fā)明人所設(shè)想的關(guān)于如何實(shí)施他們的發(fā)明的最佳方式。然而,由于在這里已經(jīng)專門(mén)地規(guī)定了本發(fā)明的一般原理,以便為程序代碼轉(zhuǎn)換裝置提供一種改進(jìn)的體系結(jié)構(gòu),所以各種修改對(duì)本領(lǐng)域的技術(shù)人員來(lái)說(shuō)仍然是顯而易見(jiàn)的。
引用圖1,圖中表示包括源計(jì)算環(huán)境1和目標(biāo)計(jì)算環(huán)境2的一個(gè)示例性的計(jì)算環(huán)境。在源計(jì)算環(huán)境1中,源代碼10是可以以本地方式在一個(gè)源處理器12上執(zhí)行的代碼。源處理器12包括一組源寄存器14。在這里,正如本領(lǐng)域的技術(shù)人員所熟知的那樣,可以用具有介于源代碼10和源處理器12之間的中間層(例如,編譯器)的任何適當(dāng)?shù)恼Z(yǔ)言來(lái)表示源代碼10。
人們希望在目標(biāo)計(jì)算環(huán)境2中運(yùn)行源代碼10,目標(biāo)計(jì)算環(huán)境2提供一個(gè)目標(biāo)處理器22,它使用一組目標(biāo)寄存器24。這兩個(gè)處理器12和22可以是內(nèi)在地不兼容的,因而,這兩個(gè)處理器使用不同的指令集。由此,在目標(biāo)計(jì)算環(huán)境2中提供一種程序代碼轉(zhuǎn)換體系結(jié)構(gòu)30,以便在所述不兼容的環(huán)境中運(yùn)行源代碼10。程序代碼轉(zhuǎn)換體系結(jié)構(gòu)30可以包括轉(zhuǎn)換器、仿真器、加速器,或者任何其它適于將為一種處理器類型設(shè)計(jì)的程序代碼轉(zhuǎn)換為可以在另一種類型的處理器上執(zhí)行的程序代碼的體系結(jié)構(gòu)。為了對(duì)本發(fā)明進(jìn)行討論的目的,在下文中,程序代碼轉(zhuǎn)換體系結(jié)構(gòu)30將被稱為“轉(zhuǎn)換器30”。應(yīng)當(dāng)注意的是,兩個(gè)處理器12和22也可以屬于相同類型的體系結(jié)構(gòu),諸如在加速器的情況下。
轉(zhuǎn)換器30對(duì)源代碼10進(jìn)行轉(zhuǎn)換處理,并且提供已轉(zhuǎn)換的目標(biāo)代碼20,以便由目標(biāo)處理器22執(zhí)行。適當(dāng)?shù)兀D(zhuǎn)換器30執(zhí)行二進(jìn)制轉(zhuǎn)換,其中,采取適用于源處理器12的可執(zhí)行的二進(jìn)制代碼形式的源代碼10被轉(zhuǎn)換為適用于目標(biāo)處理器22的可執(zhí)行的二進(jìn)制代碼。轉(zhuǎn)換可以靜態(tài)地或動(dòng)態(tài)地進(jìn)行。在靜態(tài)轉(zhuǎn)換中,在已轉(zhuǎn)換的程序在目標(biāo)處理器上執(zhí)行之前,對(duì)整個(gè)程序進(jìn)行轉(zhuǎn)換。這將引起明顯的延時(shí)。因此,轉(zhuǎn)換器30最好是動(dòng)態(tài)地轉(zhuǎn)換源代碼10的若干小段,以便在目標(biāo)處理器22上立即執(zhí)行。由于大段的源代碼10在實(shí)際上不被使用或者僅僅偶爾地被使用,所以這是更加有效的。
現(xiàn)在引用圖2,圖中更詳細(xì)地圖示轉(zhuǎn)換器30的一個(gè)優(yōu)選實(shí)施例,轉(zhuǎn)換器30包括一個(gè)前端31,一個(gè)內(nèi)核32和一個(gè)后端33。前端31被配置專用于與源代碼相關(guān)的源處理器12。前端31取出源代碼10的預(yù)定的段,并且提供通用的中間表示塊(“IR塊”)。內(nèi)核32通過(guò)使用優(yōu)化技術(shù)來(lái)優(yōu)化由前端31生成的每一個(gè)IR塊,正如本領(lǐng)域的技術(shù)人員容易知道的那樣。后端33從內(nèi)核32取出已優(yōu)化的IR塊,并且生成可以在目標(biāo)處理器22上執(zhí)行的目標(biāo)代碼20。
適當(dāng)?shù)?,前?1將源代碼10分為基本塊,其中,每一個(gè)基本塊都是在唯一入口點(diǎn)的第一指令和在唯一出口點(diǎn)的最后指令之間的順序指令集(諸如跳轉(zhuǎn)、調(diào)用或分支指令)。內(nèi)核32可以選擇含有準(zhǔn)備作為單個(gè)單元一起處理的兩個(gè)或多個(gè)基本塊的一組塊。還有,前端31可以形成表示不同入口條件下源代碼的同一基本塊的相同塊。在使用中,源代碼10的第一預(yù)定段(諸如一個(gè)基本塊)被識(shí)別,并且被在目標(biāo)處理器22上運(yùn)行于轉(zhuǎn)換方式的轉(zhuǎn)換器30進(jìn)行轉(zhuǎn)換。然后,目標(biāo)處理器22執(zhí)行目標(biāo)代碼20的相應(yīng)已優(yōu)化和已轉(zhuǎn)換的塊。
轉(zhuǎn)換器30包括多個(gè)在內(nèi)核32中適當(dāng)提供的抽象寄存器34,它表示將在源處理器12內(nèi)使用以執(zhí)行源代碼10的物理的源寄存器14。抽象寄存器34規(guī)定源處理器12的狀態(tài),所述狀態(tài)是通過(guò)表示源處理器寄存器上的源代碼指令的預(yù)期效果來(lái)進(jìn)行仿真的。
使用這樣一種實(shí)施方式的結(jié)構(gòu)示于圖3。如圖所示,已編譯的本地源代碼被顯示為駐留在適當(dāng)?shù)挠?jì)算機(jī)存儲(chǔ)器存儲(chǔ)介質(zhì)100中,特定的和可替代的存儲(chǔ)器存儲(chǔ)機(jī)制是本領(lǐng)域的技術(shù)人員所熟知的。軟件組成包括待轉(zhuǎn)換的本地源代碼、轉(zhuǎn)換器代碼和操作系統(tǒng)。轉(zhuǎn)換器代碼,即,用于實(shí)現(xiàn)轉(zhuǎn)換器的源代碼的編譯版本,也類似地駐留在適當(dāng)?shù)挠?jì)算機(jī)存儲(chǔ)器存儲(chǔ)介質(zhì)102上。轉(zhuǎn)換器與存儲(chǔ)在存儲(chǔ)器中的操作系統(tǒng)104(諸如,運(yùn)行于目標(biāo)處理器106上的UNIX,上述處理器典型地是一個(gè)微處理器或者其它適當(dāng)?shù)挠?jì)算機(jī))結(jié)合在一起運(yùn)行。人們將理解,圖3所示的結(jié)構(gòu)僅僅是示例性的,并且,例如,根據(jù)本發(fā)明的方法和處理過(guò)程可以用駐留于操作系統(tǒng)中或者在操作系統(tǒng)下的代碼實(shí)現(xiàn)。已轉(zhuǎn)換的代碼被示出駐留在一種適當(dāng)?shù)挠?jì)算機(jī)存儲(chǔ)器存儲(chǔ)介質(zhì)108中。源代碼、轉(zhuǎn)換器代碼、操作系統(tǒng)、已轉(zhuǎn)換的代碼和存儲(chǔ)機(jī)制可以是本領(lǐng)域的技術(shù)人員所熟知的多種類型中的任何一種。
在本發(fā)明的一個(gè)優(yōu)選實(shí)施例中,在運(yùn)行時(shí)間動(dòng)態(tài)地執(zhí)行程序代碼轉(zhuǎn)換,同時(shí)已轉(zhuǎn)換的程序在目標(biāo)計(jì)算環(huán)境中運(yùn)行。轉(zhuǎn)換器30與已轉(zhuǎn)換的程序直接插入運(yùn)行。已轉(zhuǎn)換的程序的執(zhí)行路徑是一個(gè)控制環(huán)路,包括下列各步驟執(zhí)行轉(zhuǎn)換器代碼,該代碼將源代碼塊轉(zhuǎn)換為已轉(zhuǎn)換代碼,然后執(zhí)行所述已轉(zhuǎn)換代碼塊,每個(gè)已轉(zhuǎn)換代碼塊的結(jié)尾含有將控制返回到轉(zhuǎn)換器代碼的指令。換句話說(shuō),轉(zhuǎn)換和隨后執(zhí)行源代碼的步驟被交織在一起,因此,每次僅轉(zhuǎn)換源程序的一些部分。
轉(zhuǎn)換器30的基本轉(zhuǎn)換單元是基本塊,這意味著轉(zhuǎn)換器30每次僅轉(zhuǎn)換一個(gè)基本塊的源代碼。一個(gè)基本塊被正式地定義為精確地具有一個(gè)入口點(diǎn)和精確地具有一個(gè)出口點(diǎn)的一段代碼,它把代碼塊限制到單個(gè)控制路徑。為此,基本塊是控制流程的基本單元。
中間表示(IR)樹(shù)在生成已轉(zhuǎn)換代碼的過(guò)程中,根據(jù)源指令序列來(lái)生成中間表示(“IR”)樹(shù)。IR樹(shù)包括作為由源程序計(jì)算的表達(dá)式和執(zhí)行的操作的抽象表示的各個(gè)結(jié)點(diǎn)。然后,根據(jù)IR樹(shù)來(lái)生成已轉(zhuǎn)換代碼。在這里所描述的IR結(jié)點(diǎn)的集合在口語(yǔ)上被稱為“樹(shù)”。我們注意到,正式地說(shuō),這樣的結(jié)構(gòu)事實(shí)上是有向非循環(huán)圖(DAG,directed acyclic graph),而不是樹(shù)。樹(shù)的正式定義要求每一個(gè)結(jié)點(diǎn)具有至多一個(gè)父輩。由于所描述的實(shí)施例在IR生成過(guò)程中使用共同的子表達(dá)式消除,所以各結(jié)點(diǎn)通常具有多個(gè)父輩。例如,標(biāo)志影響指令結(jié)果的IR可以由兩個(gè)抽象寄存器(即對(duì)應(yīng)于目標(biāo)源寄存器和標(biāo)志結(jié)果參數(shù)的寄存器)給出。
例如,源指令(add %r1,%r2,%r3)對(duì)源寄存器%r2和%r3的內(nèi)容進(jìn)行加法運(yùn)算,并且將結(jié)果存儲(chǔ)在源寄存器%r1中。因此,這條指令對(duì)應(yīng)于抽象表達(dá)式“%r1=%r2+%r3”。這個(gè)實(shí)例含有抽象寄存器%r1的定義,它采用一個(gè)加法表達(dá)式,后者含有表示所述指令操作數(shù)%r2和%r3的兩個(gè)子表達(dá)式。在源程序的上下文中,這些子表達(dá)式可以對(duì)應(yīng)于其它先前的源指令,或者它們可以表示當(dāng)前指令的細(xì)節(jié),諸如中間常數(shù)值。
當(dāng)“加法”指令被解析時(shí),產(chǎn)生一個(gè)對(duì)應(yīng)于用于加法的抽象數(shù)學(xué)運(yùn)算符的新的“Y”型IR結(jié)點(diǎn)。所述“Y”型IR結(jié)點(diǎn)存儲(chǔ)著表示操作數(shù)(保存在源寄存器中,被表示為子表達(dá)式樹(shù))的其它IR結(jié)點(diǎn)的引用?!癥”型結(jié)點(diǎn)本身由適當(dāng)?shù)脑醇拇嫫鞫x(用于%r1的抽象寄存器,所述指令的目標(biāo)寄存器)引用。正如本領(lǐng)域的技術(shù)人員可以理解的那樣,在一個(gè)實(shí)施例中,使用面向?qū)ο蟮木幊陶Z(yǔ)言(諸如C++)來(lái)實(shí)現(xiàn)所述轉(zhuǎn)換器。例如,一個(gè)IR結(jié)點(diǎn)被實(shí)現(xiàn)為一個(gè)C++對(duì)象,同時(shí)對(duì)于其它結(jié)點(diǎn)的引用被實(shí)現(xiàn)為對(duì)于對(duì)應(yīng)于那些其它結(jié)點(diǎn)的C++對(duì)象的引用。因此,一棵IR樹(shù)被實(shí)現(xiàn)為各IR結(jié)點(diǎn)對(duì)象的一個(gè)集合,其中含有彼此之間的各種引用。
抽象寄存器(abstract register)還有,在所討論的實(shí)施例中,使用一組抽象寄存器34來(lái)生成IR。這些抽象寄存器34對(duì)應(yīng)于源體系結(jié)構(gòu)的特定特征。例如,對(duì)于源體系結(jié)構(gòu)12上的每一個(gè)物理寄存器14來(lái)說(shuō),存在唯一的抽象寄存器34。在IR生成過(guò)程中,抽象寄存器34用作IR樹(shù)的占位符。例如,位于源指令序列中的給定點(diǎn)的源寄存器%r2的值由一個(gè)特定IR表達(dá)式樹(shù)來(lái)表示,上述IR表達(dá)式樹(shù)與用于源寄存器%r2的抽象寄存器34有關(guān)。在一個(gè)實(shí)施例中,抽象寄存器34被實(shí)現(xiàn)為C++對(duì)象,后者經(jīng)由至所述樹(shù)的根結(jié)點(diǎn)對(duì)象的C++引用與特定的IR樹(shù)建立相關(guān)聯(lián)。
在上述指令序列的實(shí)例中,轉(zhuǎn)換器30在解析“加法”指令之前的源指令的同時(shí),已經(jīng)生成對(duì)應(yīng)于%r2和%r3的值的IR樹(shù)。換句話說(shuō),計(jì)算%r2和%r3的值的子表達(dá)式已經(jīng)被表示為IR樹(shù)。當(dāng)生成用于“add %r1,%r2,%r3”指令的IR樹(shù)時(shí),新的“Y”型結(jié)點(diǎn)含有對(duì)于%r2和%r3的IR子樹(shù)的引用。
在轉(zhuǎn)換器30和已轉(zhuǎn)換代碼中的組成之間劃分抽象寄存器34的實(shí)施方式。在轉(zhuǎn)換器的上下文中,抽象寄存器是在IR生成過(guò)程中使用的占位符,因此,抽象寄存器34與用于計(jì)算對(duì)應(yīng)于特定抽象寄存器34的源寄存器14的值的IR樹(shù)相關(guān)聯(lián)。如此,轉(zhuǎn)換器中的抽象寄存器34可以被實(shí)現(xiàn)為一個(gè)C++對(duì)象,它含有對(duì)于IR結(jié)點(diǎn)對(duì)象(即,IR樹(shù))的引用。在已轉(zhuǎn)換代碼的上下文中,抽象寄存器34是抽象寄存器庫(kù)內(nèi)的一個(gè)特定位置,源寄存器14的值與實(shí)際的目標(biāo)寄存器24是通過(guò)進(jìn)/出上述抽象寄存器庫(kù)來(lái)同步的??商娲?,當(dāng)已經(jīng)從抽象寄存器庫(kù)加載一個(gè)值時(shí),在已轉(zhuǎn)換的代碼中的抽象寄存器34可以被理解為目標(biāo)寄存器26,后者在執(zhí)行已轉(zhuǎn)換的代碼的過(guò)程中,在被回存到寄存器庫(kù)之前,暫時(shí)地保存源寄存器值。
如上所述的程序轉(zhuǎn)換的一個(gè)實(shí)例示于圖4。圖4表示x86指令的兩個(gè)基本塊的轉(zhuǎn)換,以及在轉(zhuǎn)換過(guò)程中產(chǎn)生的相應(yīng)IR樹(shù)。圖4左側(cè)表示在轉(zhuǎn)換過(guò)程中仿真器的執(zhí)行路徑。轉(zhuǎn)換器30將源代碼的第一基本塊153轉(zhuǎn)換(151)為目標(biāo)代碼,隨后執(zhí)行(155)所述目標(biāo)代碼。當(dāng)目標(biāo)代碼完成執(zhí)行時(shí),控制返回到仿真器157。然后,轉(zhuǎn)換器30將源代碼的下一個(gè)基本塊159轉(zhuǎn)換(157)為目標(biāo)代碼,隨后執(zhí)行(161)所述目標(biāo)代碼,等等。
在將源代碼的第一基本塊153轉(zhuǎn)換(151)為目標(biāo)代碼的過(guò)程中,轉(zhuǎn)換器30根據(jù)所述基本塊生成IR樹(shù)163。在本例中,從作為標(biāo)志影響指令的源指令“add%ecx,%edx”產(chǎn)生IR樹(shù)163。在產(chǎn)生IR樹(shù)163的過(guò)程中,由這條指令定義4個(gè)抽象寄存器目標(biāo)源寄存器%ecx167,第一標(biāo)志影響指令參數(shù)169,第二標(biāo)志影響指令參數(shù)171,以及標(biāo)志影響指令結(jié)果173。對(duì)應(yīng)于“加法”指令的IR樹(shù)是一個(gè)簡(jiǎn)單的“Y”型(算術(shù)加法)運(yùn)算符175,其操作數(shù)是源寄存器%ecx 177和%edx179。
第一基本塊的仿真通過(guò)存儲(chǔ)標(biāo)志影響指令的各項(xiàng)參數(shù)和結(jié)果,將各項(xiàng)標(biāo)志置為掛起狀態(tài)。標(biāo)志影響指令為“add%ecx,%edx”。該指令的參數(shù)是仿真的源寄存器%ecx 177和%edx 179的當(dāng)前值。在源寄存器前面的“@”符號(hào)使用177和179來(lái)表示源寄存器的值是從全局寄存器庫(kù)里面分別對(duì)應(yīng)于%ecx和%edx的位置檢索的,因?yàn)檫@些特定的源寄存器事先沒(méi)有被當(dāng)前基本塊加載。然后,這些參數(shù)被存儲(chǔ)在第一(169)和第二(171)標(biāo)志參數(shù)抽象寄存器中。加法運(yùn)算的結(jié)果175被存儲(chǔ)在標(biāo)志結(jié)果抽象寄存器173中。
在生成IR樹(shù)之后,根據(jù)所述IR來(lái)生成相應(yīng)的目標(biāo)代碼。從一個(gè)通用的IR生成目標(biāo)代碼的過(guò)程在本領(lǐng)域是眾所周知的。目標(biāo)代碼被插入到已轉(zhuǎn)換的塊的尾部,以便將抽象寄存器,包括用于標(biāo)志結(jié)果173和標(biāo)志參數(shù)169、171的抽象寄存器,保存到全局寄存器庫(kù)中。在生成目標(biāo)代碼之后,執(zhí)行步驟155。
在轉(zhuǎn)換源代碼的第二基本塊(159)的過(guò)程(157)中,轉(zhuǎn)換器30根據(jù)所述基本塊生成IR樹(shù)165。從源指令“pushf”生成IR樹(shù)165,這是一條標(biāo)志使用指令。指令“pushf”的語(yǔ)義是將所有狀態(tài)標(biāo)志的值存入堆棧,這要求明確地計(jì)算每一個(gè)標(biāo)志。如此,在生成IR的過(guò)程中,定義對(duì)應(yīng)于4個(gè)狀態(tài)標(biāo)志值的抽象寄存器零標(biāo)志(“ZF”)181,符號(hào)標(biāo)志(“S17”)183,進(jìn)位標(biāo)志(“CF”)185,以及溢出標(biāo)志(“OF”)187。結(jié)點(diǎn)195是算術(shù)比較運(yùn)算符“無(wú)符號(hào)小于”。根據(jù)來(lái)自先前的標(biāo)志影響指令的信息(在本例中為來(lái)自第一基本塊153的指令“add%ecx,%edx”)來(lái)進(jìn)行狀態(tài)標(biāo)志的計(jì)算。計(jì)算狀態(tài)標(biāo)志值的IR是根據(jù)標(biāo)志影響指令的結(jié)果189和參數(shù)191、193。如上所述,在標(biāo)志參數(shù)標(biāo)號(hào)前面的符號(hào)“@”表示仿真器插入目標(biāo)代碼,以便在使用它們之前,從全局寄存器庫(kù)加載那些數(shù)值。
因此,第二基本塊迫使標(biāo)志值歸一化。在計(jì)算和使用各標(biāo)志數(shù)值之后(通過(guò)仿真“pushf”指令的目標(biāo)代碼),它們將被存儲(chǔ)到全局寄存器庫(kù)中。與此同時(shí),掛起的標(biāo)志抽象寄存器(各項(xiàng)參數(shù)和結(jié)果)被置為一種未定義狀態(tài),以反映這樣一個(gè)事實(shí)各個(gè)標(biāo)志數(shù)值被明確地存儲(chǔ)(即,各個(gè)標(biāo)志已經(jīng)被歸一化)。
圖5表示根據(jù)本發(fā)明的一個(gè)優(yōu)選實(shí)施例而形成的轉(zhuǎn)換器30,它能生成幾種可以用于轉(zhuǎn)換的不同類型的IR結(jié)點(diǎn),以及說(shuō)明這些不同類型的IR結(jié)點(diǎn)的實(shí)施方式如何在轉(zhuǎn)換器30的前端31、內(nèi)核32和后端33等組成中進(jìn)行分配。術(shù)語(yǔ)“實(shí)現(xiàn)”指的是IR生成,當(dāng)源代碼10的源指令被解碼(即,被解析)時(shí),在前端31中進(jìn)行IR生成。術(shù)語(yǔ)“種植”指的是目標(biāo)代碼生成,后者在后端33中進(jìn)行。
要注意的是,當(dāng)下面用單個(gè)源指令來(lái)描述轉(zhuǎn)換過(guò)程時(shí),如上所述,這些操作實(shí)際上對(duì)于源指令的整個(gè)基本塊立即發(fā)生。換句話說(shuō),整個(gè)基本塊被初始地解碼,以生成一個(gè)IR森林,然后,內(nèi)核32對(duì)整個(gè)IR森林進(jìn)行優(yōu)化。最后,后端33以每次一個(gè)結(jié)點(diǎn)的方式對(duì)于已優(yōu)化的IR森林進(jìn)行目標(biāo)代碼生成。
當(dāng)為一個(gè)基本塊生成一個(gè)IR森林時(shí),轉(zhuǎn)換器30可以根據(jù)所預(yù)期的轉(zhuǎn)換性能以及源處理器和目標(biāo)處理器對(duì)的特定體系結(jié)構(gòu),生成基本結(jié)點(diǎn)、復(fù)雜結(jié)點(diǎn)、多形結(jié)點(diǎn)或者體系結(jié)構(gòu)專用結(jié)點(diǎn)(ASN)其中之一,或者它們的任何組合。
基本結(jié)點(diǎn)基本結(jié)點(diǎn)是任何源體系結(jié)構(gòu)的語(yǔ)義(即,表達(dá)式、計(jì)算和運(yùn)算)的抽象表示,并且提供為表達(dá)源體系結(jié)構(gòu)的語(yǔ)義所需的標(biāo)準(zhǔn)或基本結(jié)點(diǎn)的最小集。如此,基本結(jié)點(diǎn)提供簡(jiǎn)單的類似于精簡(jiǎn)指令集計(jì)算機(jī)(RISC,Reduced Instruction Set Computer)的功能,例如,“加法”運(yùn)算。與其它類型的結(jié)點(diǎn)相對(duì)比,每一個(gè)基本結(jié)點(diǎn)都是不可縮減的,這意味著它不能被進(jìn)一步地分解為其它IR結(jié)點(diǎn)。由于它們的簡(jiǎn)單性,基本結(jié)點(diǎn)也可以在所有后端33(即,目標(biāo)體系結(jié)構(gòu))上容易地被轉(zhuǎn)換器30轉(zhuǎn)換為目標(biāo)指令。
當(dāng)僅使用基本IR結(jié)點(diǎn)時(shí),轉(zhuǎn)換過(guò)程完全在圖5的頂部(即,穿越“基本IR”塊204的路徑)發(fā)生。在解碼塊200中,前端31對(duì)來(lái)自源程序代碼10的源指令進(jìn)行解碼,并且在實(shí)現(xiàn)塊202中實(shí)現(xiàn)(生成)由基本結(jié)點(diǎn)構(gòu)成的相應(yīng)IR樹(shù)。然后,所述IR樹(shù)從前端31被送往內(nèi)核32中的基本IR塊204,在這里,對(duì)整個(gè)IR森林實(shí)行優(yōu)化。由于IR森林被僅含有基本結(jié)點(diǎn)的基本IR塊204優(yōu)化,這對(duì)任何處理器體系結(jié)構(gòu)來(lái)說(shuō)都是完全通用的。然后,已優(yōu)化的IR森林從內(nèi)核32中的基本IR塊204被送往后端33,后者在種植塊206中為每一個(gè)IR結(jié)點(diǎn)種植(生成)相應(yīng)的目標(biāo)代碼指令。隨后,由編碼塊208對(duì)目標(biāo)代碼指令進(jìn)行編碼,以便由目標(biāo)處理器執(zhí)行。
如上所述,在所有后端33上,基本結(jié)點(diǎn)容易地被轉(zhuǎn)換為目標(biāo)指令,并且典型地可以完全通過(guò)基本結(jié)點(diǎn)的排他利用來(lái)生成已轉(zhuǎn)換的代碼。當(dāng)基本結(jié)點(diǎn)的排他利用很快實(shí)現(xiàn)用于轉(zhuǎn)換器30時(shí),它將在已轉(zhuǎn)換的代碼中產(chǎn)生次最佳性能。為了提高已轉(zhuǎn)換的代碼的性能,可以通過(guò)使用IR結(jié)點(diǎn)的替代類型,諸如復(fù)雜結(jié)點(diǎn)、多形態(tài)結(jié)點(diǎn)和體系結(jié)構(gòu)專用結(jié)點(diǎn)(ASN)來(lái)使轉(zhuǎn)換器30專門(mén)化,以便使用目標(biāo)處理器體系結(jié)構(gòu)的特征。
復(fù)雜結(jié)點(diǎn)復(fù)雜結(jié)點(diǎn)是以一種比基本結(jié)點(diǎn)更緊湊的表達(dá)方式來(lái)表達(dá)源體系結(jié)構(gòu)的語(yǔ)義的通用結(jié)點(diǎn)。復(fù)雜結(jié)點(diǎn)提供一種類似于復(fù)雜指令集計(jì)算機(jī)(CISC,Complex Instruction Set Computer)的功能,例如“add_imm”(寄存器與立即常數(shù)相加)。具體地說(shuō),復(fù)雜結(jié)點(diǎn)典型地表示具有立即常數(shù)字段的指令。立即類型(immediate-type)指令是這樣的指令,在其中,一個(gè)常數(shù)操作數(shù)值被編碼到所述指令本身的一個(gè)“立即數(shù)(immediate)”字段中。對(duì)于那些小到足以置入立即數(shù)字段中的常數(shù)值來(lái)說(shuō),這樣的指令避免了使用寄存器來(lái)保存所述常數(shù)。對(duì)于復(fù)雜指令來(lái)說(shuō),復(fù)雜結(jié)點(diǎn)可以通過(guò)遠(yuǎn)少于表征相同語(yǔ)義的等效基本結(jié)點(diǎn)的結(jié)點(diǎn)來(lái)表示復(fù)雜指令的語(yǔ)義。盡管復(fù)雜結(jié)點(diǎn)實(shí)質(zhì)上可以被分解為具有相同語(yǔ)義的基本結(jié)點(diǎn)表示,復(fù)雜結(jié)點(diǎn)在把立即型指令的語(yǔ)義保留在單個(gè)IR結(jié)點(diǎn)中是有用的,由此改進(jìn)了轉(zhuǎn)換器30的性能。而且,在某些情況下,通過(guò)以基本結(jié)點(diǎn)的形式來(lái)表示復(fù)雜指令,可能使復(fù)雜指令的語(yǔ)義失去,并且因此,復(fù)雜結(jié)點(diǎn)實(shí)質(zhì)上擴(kuò)大了基本結(jié)點(diǎn)集,以包括用于這樣的“類似于CISC的”指令的IR結(jié)點(diǎn)。
引用圖6,現(xiàn)在來(lái)說(shuō)明通過(guò)使用一個(gè)與基本結(jié)點(diǎn)相比較的復(fù)雜結(jié)點(diǎn)來(lái)實(shí)現(xiàn)的效率的一個(gè)實(shí)例。例如,MIPS的加立即數(shù)指令“addi r1,#10”的語(yǔ)義將保存在寄存器r1中的數(shù)值加上10。取代把常數(shù)數(shù)值(10)加載到寄存器中,然后將兩個(gè)寄存器(的內(nèi)容)相加,指令addi簡(jiǎn)單地將常數(shù)值10直接編碼到所述指令字段本身中,由此避免了使用第二寄存器的需求。當(dāng)生成一個(gè)嚴(yán)格地使用基本結(jié)點(diǎn)的這些語(yǔ)義的立即表示時(shí),針對(duì)這條指令的基本結(jié)點(diǎn)表示將首先把來(lái)自const(#10)結(jié)點(diǎn)60的常數(shù)值加載到一個(gè)寄存器結(jié)點(diǎn)r(x)61中,然后,使用加法(add)結(jié)點(diǎn)來(lái)進(jìn)行寄存器結(jié)點(diǎn)r1 62和寄存器結(jié)點(diǎn)r(x)61的加法運(yùn)算。所述復(fù)雜結(jié)點(diǎn)表示包括單個(gè)“加立即數(shù)”IR結(jié)點(diǎn)70,它含有在結(jié)點(diǎn)70的一部分72的常數(shù)值10以及對(duì)寄存器r1 74的引用。在基本結(jié)點(diǎn)的情形中,后端33可能需要執(zhí)行能夠識(shí)別圖6所示的4結(jié)點(diǎn)圖案的慣用語(yǔ)法識(shí)別,以便識(shí)別并生長(zhǎng)一條“加立即數(shù)”目標(biāo)指令。在沒(méi)有慣用語(yǔ)法識(shí)別的情況下,后端33將在執(zhí)行寄存器—寄存器加法運(yùn)算之前,發(fā)出一條額外指令,以便把常數(shù)值10加載到寄存器中。
由于復(fù)雜結(jié)點(diǎn)含有比它們的基本結(jié)點(diǎn)等價(jià)物更多的語(yǔ)義信息,所以復(fù)雜結(jié)點(diǎn)降低了在后端33中進(jìn)行慣用語(yǔ)法識(shí)別的要求。具體地說(shuō),復(fù)雜結(jié)點(diǎn)避免了由后端33來(lái)進(jìn)行常數(shù)操作數(shù)的慣用語(yǔ)法識(shí)別的需求。通過(guò)比較,如果立即型源指令被分解為多個(gè)基本結(jié)點(diǎn)(并且所述目標(biāo)體系結(jié)構(gòu)也含有立即型指令),則轉(zhuǎn)換器30可能需要昂貴的后端33的慣用語(yǔ)法識(shí)別,以便把多結(jié)點(diǎn)簇識(shí)別為一個(gè)立即指令的候選者,或者產(chǎn)生低效能的目標(biāo)代碼(即,多于實(shí)際需要的指令,使用多于實(shí)際需要的寄存器)。換句話說(shuō),通過(guò)單獨(dú)地使用基本結(jié)點(diǎn),無(wú)論在轉(zhuǎn)換器30中(通過(guò)慣用語(yǔ)法識(shí)別),還是在已轉(zhuǎn)換代碼中(通過(guò)額外生成的代碼,不用慣用語(yǔ)法識(shí)別),都會(huì)使性能下降。更一般地說(shuō),由于復(fù)雜結(jié)點(diǎn)是語(yǔ)義信息的一種更加緊湊的表達(dá)方式,所以它們減少了轉(zhuǎn)換器30必須生成、遍歷和刪除的IR結(jié)點(diǎn)的數(shù)目。
立即型指令對(duì)多種體系結(jié)構(gòu)來(lái)說(shuō)是共同的。因此,復(fù)雜結(jié)點(diǎn)之所以是通用的是由于它們?cè)谝欢ǚ秶捏w系結(jié)構(gòu)中是可以重復(fù)使用的。然而,并不是每一個(gè)復(fù)雜結(jié)點(diǎn)都存在于每一個(gè)轉(zhuǎn)換器的IR結(jié)點(diǎn)集中。轉(zhuǎn)換器的某些共同的特征是可配置的,這意味著當(dāng)為一個(gè)特定的源和目標(biāo)體系結(jié)構(gòu)的對(duì)編譯轉(zhuǎn)換器時(shí),沒(méi)有被應(yīng)用于所述轉(zhuǎn)換器配置的那些特征可以從編譯中被排除。例如,在一個(gè)MIPS—MIPS(MIPS到MIPS)轉(zhuǎn)換器中,與任何MIPS指令的語(yǔ)義都不匹配的復(fù)雜結(jié)點(diǎn)將從IR結(jié)點(diǎn)集中被排除,因?yàn)樗鼈儗⒂肋h(yuǎn)用不上。
使用一種順序遍歷,復(fù)雜結(jié)點(diǎn)還可以進(jìn)一步改進(jìn)所生成的目標(biāo)代碼的性能。順序遍歷是幾種可替代的IR遍歷算法之一,用于決定IR樹(shù)內(nèi)的各IR結(jié)點(diǎn)被生成為目標(biāo)代碼的順序。具體地說(shuō),當(dāng)它被第一次遍歷時(shí),順序遍歷生成每一個(gè)IR結(jié)點(diǎn),由于沒(méi)有單獨(dú)的優(yōu)化越過(guò)整個(gè)IR樹(shù),排除了后端33的慣用語(yǔ)法識(shí)別。與基本結(jié)點(diǎn)相比,復(fù)雜結(jié)點(diǎn)每個(gè)結(jié)點(diǎn)表達(dá)更多的語(yǔ)義信息,并且因此,慣用語(yǔ)法識(shí)別的某些工作被隱含在復(fù)雜結(jié)點(diǎn)本身內(nèi)。這允許轉(zhuǎn)換器30使用順序遍歷,而不會(huì)如單獨(dú)使用基本結(jié)點(diǎn)那樣在目標(biāo)代碼性能方面受到更多的損失。
當(dāng)轉(zhuǎn)換器30生成復(fù)雜結(jié)點(diǎn)(即,所述路徑穿越圖5中的復(fù)雜IR塊210)時(shí),所述轉(zhuǎn)換過(guò)程類似于前面針對(duì)基本結(jié)點(diǎn)而敘述的轉(zhuǎn)換過(guò)程。唯一的差別在于,與一個(gè)復(fù)雜結(jié)點(diǎn)的語(yǔ)義相匹配的源指令被實(shí)現(xiàn)為實(shí)現(xiàn)塊202中的復(fù)雜結(jié)點(diǎn),而不是基本結(jié)點(diǎn)(如分隔實(shí)現(xiàn)塊202的虛線所示)。復(fù)雜結(jié)點(diǎn)在寬范圍的體系結(jié)構(gòu)中仍然是通用的,這使得內(nèi)核32的優(yōu)化仍然可以施加于整個(gè)IR森林。而且,在CISC類型的目標(biāo)體系結(jié)構(gòu)上為復(fù)雜結(jié)點(diǎn)生成目標(biāo)代碼可能比基本結(jié)點(diǎn)等價(jià)物更為有效。
多形結(jié)點(diǎn)如圖5所示的轉(zhuǎn)換器30的一個(gè)優(yōu)選實(shí)施例還可以利用多形中間表示。多形中間表示是一種機(jī)制,借助于這種機(jī)制,后端33可以提供專門(mén)化的代碼生成,以便有效地將目標(biāo)體系結(jié)構(gòu)特征應(yīng)用于特定的、性能重要的源指令。多形機(jī)制被實(shí)現(xiàn)為一個(gè)通用的多形結(jié)點(diǎn),它含有指向后端33代碼生成函數(shù)的函數(shù)指針。每一個(gè)函數(shù)指針都被專用于特定源指令。多形機(jī)制預(yù)先取得標(biāo)準(zhǔn)的前端31 IR生成機(jī)制,否則,上述機(jī)制將把源指令解碼為基本或復(fù)雜結(jié)點(diǎn)。在后端33中,如果沒(méi)有多形機(jī)制,這些基本結(jié)點(diǎn)的生成可能導(dǎo)致次最佳的目標(biāo)代碼,或者需要昂貴的慣用語(yǔ)法識(shí)別來(lái)重構(gòu)源指令的語(yǔ)義。
每一個(gè)多形函數(shù)專用于特定的源指令和目標(biāo)體系結(jié)構(gòu)函數(shù)對(duì)。多形結(jié)點(diǎn)向內(nèi)核32暴露關(guān)于它們的函數(shù)的最少信息。多形結(jié)點(diǎn)能夠參加正常的內(nèi)核32優(yōu)化,諸如表達(dá)式共享和表達(dá)式合并。內(nèi)核32可以使用函數(shù)指針來(lái)決定兩個(gè)多形結(jié)點(diǎn)是否相同。多形結(jié)點(diǎn)不保留源指令的任何語(yǔ)義信息,但是可以從函數(shù)指針推斷這樣的語(yǔ)義信息。
多形結(jié)點(diǎn)被用于源指令,后者可以被表示為一系列的精心選擇的目標(biāo)指令,這樣就排除了由內(nèi)核32確定最佳的目標(biāo)指令處于運(yùn)行時(shí)間的需求。當(dāng)多形結(jié)點(diǎn)不是由使用基本結(jié)點(diǎn)的前端31來(lái)實(shí)現(xiàn)時(shí),內(nèi)核32可以選擇把這些結(jié)點(diǎn)實(shí)現(xiàn)為多形結(jié)點(diǎn)。
而且,多形結(jié)點(diǎn)可以含有寄存器分配線索。由于目標(biāo)指令已知,所以在CISC體系結(jié)構(gòu)上所需的各個(gè)寄存器也可能是已知的。多形結(jié)點(diǎn)允許它們的操作數(shù)和結(jié)果出現(xiàn)在構(gòu)建IR時(shí)所選擇的寄存器中。
為了讓轉(zhuǎn)換器30利用多形結(jié)點(diǎn)(即,在圖5中穿越多形IR塊212的路徑),后端33向前端31提供源指令—目標(biāo)函數(shù)指針對(duì)的列表。在所提供的列表上的各項(xiàng)源指令被實(shí)現(xiàn)為含有相應(yīng)的后端33函數(shù)指針的多形結(jié)點(diǎn)。不在所提供的列表上的源指令被實(shí)現(xiàn)為如上所述的復(fù)雜或基本IR樹(shù)。在圖5中,由箭頭214反映的從后端33到前端31的路徑表示向位于前端31的實(shí)現(xiàn)塊215提供源指令—目標(biāo)函數(shù)指針對(duì)的列表。當(dāng)前端31執(zhí)行在實(shí)現(xiàn)塊215中的實(shí)現(xiàn)功能(即,將源指令映射到IR結(jié)點(diǎn))時(shí),根據(jù)從后端33通過(guò)路徑214接收的信息來(lái)修改處理過(guò)程。
在內(nèi)核32的多形IR塊212中,由于內(nèi)核32可以從每一個(gè)結(jié)點(diǎn)中的函數(shù)指針推斷它們的語(yǔ)義,多形結(jié)點(diǎn)仍然可以參加一般的優(yōu)化。在后端33中,指向目標(biāo)代碼生成函數(shù)的目標(biāo)函數(shù)指針被簡(jiǎn)單地去除引用并執(zhí)行。這種情況不同于基本結(jié)點(diǎn)和復(fù)雜結(jié)點(diǎn)情況,在后兩種情況下,后端33將特定IR結(jié)點(diǎn)映射到特定代碼生成函數(shù)。采用多形結(jié)點(diǎn),多形函數(shù)在結(jié)點(diǎn)本身被直接地編碼,因此,后端33將執(zhí)行較少的計(jì)算。在圖5中,這種差別通過(guò)下列事實(shí)表現(xiàn)出來(lái)多形種植塊216與多形IR塊212和后端33相鄰(即,在多形IR塊212和多形種植塊216之間,沒(méi)有指定非平凡計(jì)算的箭頭)。
實(shí)例1多形的IR實(shí)例為了圖解優(yōu)化轉(zhuǎn)換器30以便在IR中利用多形結(jié)點(diǎn)的過(guò)程,以下的實(shí)例說(shuō)明一個(gè)PPC P4(PowerPC至奔騰4)轉(zhuǎn)換器中所需的PPC(PowerPC“SHL 64”)指令(左移64位)的轉(zhuǎn)換,上述轉(zhuǎn)換首先使用基本結(jié)點(diǎn),然后使用多形結(jié)點(diǎn)。
不優(yōu)化轉(zhuǎn)換器以實(shí)現(xiàn)多形結(jié)點(diǎn),則PPC SHL 64指令的轉(zhuǎn)換將僅使用基本結(jié)點(diǎn)
PPC SHL 64=>基本IR多結(jié)點(diǎn)=>P4多指令未經(jīng)優(yōu)化的轉(zhuǎn)換器的前端解碼器200對(duì)當(dāng)前塊進(jìn)行解碼,并且遇到PPC SHL 64指令。其次,前端實(shí)現(xiàn)塊202指令內(nèi)核32去構(gòu)建一個(gè)含有多個(gè)基本結(jié)點(diǎn)的IR。然后,內(nèi)核32優(yōu)化IR森林(從指令的當(dāng)前塊生成),并且執(zhí)行一次順序遍歷,以決定在基本IR塊204中代碼生成的順序。接著,內(nèi)核32順序地為每一個(gè)IR結(jié)點(diǎn)進(jìn)行代碼生成,指令后端33去種植適當(dāng)?shù)腞ISC類型指令。最后,后端33在種植塊206中種植代碼,并且在編碼塊208中,用一條或多條目標(biāo)體系結(jié)構(gòu)指令來(lái)編碼每一條RISC型指令。
當(dāng)通過(guò)前端31和后端33的專門(mén)化來(lái)優(yōu)化特定的目標(biāo)體系結(jié)構(gòu)以優(yōu)化對(duì)性能有重要影響的指令時(shí)PPC SHL 64>多個(gè)IR單結(jié)點(diǎn)>P4單/少數(shù)指令所述已經(jīng)優(yōu)化的轉(zhuǎn)換器的前端解碼器200對(duì)當(dāng)前塊進(jìn)行解碼,并且遇到PPC SHL 64指令。其次,前端實(shí)現(xiàn)塊202指令內(nèi)核32去構(gòu)建一個(gè)含有單個(gè)多形IR結(jié)點(diǎn)的IR。當(dāng)生成所述單個(gè)多形結(jié)點(diǎn)時(shí),后端33知道SHL 64的移位操作數(shù)必須處于特定的寄存器(P4上的%ecx)中。此項(xiàng)要求在多形結(jié)點(diǎn)中被編碼。然后,內(nèi)核32為當(dāng)前塊優(yōu)化IR森林,并且執(zhí)行順序遍歷,以固定多形IR塊212中的代碼生成順序。再次,內(nèi)核32為每一個(gè)結(jié)點(diǎn)進(jìn)行代碼生成,指令后端33去種植適當(dāng)?shù)腞ISC類型指令。然而,在代碼生成過(guò)程中,以不同于基本結(jié)點(diǎn)的方式來(lái)處理多形結(jié)點(diǎn)。每一個(gè)多形結(jié)點(diǎn)都引起駐留在后端33中的專門(mén)化的代碼生成器的調(diào)用。后端33專門(mén)化的代碼生成器函數(shù)在種植塊216中種植代碼,并且在編碼塊208中,用一條或多條目標(biāo)體系結(jié)構(gòu)指令來(lái)編碼每一條源體系結(jié)構(gòu)指令。在生成階段的寄存器分配過(guò)程中,特定的寄存器信息被用來(lái)分配正確的寄存器。這樣就減少了由后端33進(jìn)行的計(jì)算,如果已經(jīng)分配了不適當(dāng)?shù)募拇嫫?,將要求進(jìn)行這樣的計(jì)算。代碼生成可能涉及用于暫時(shí)寄存器的寄存器分配。
實(shí)例2困難指令下面的實(shí)例說(shuō)明將由本發(fā)明的轉(zhuǎn)換器30執(zhí)行的PPC MFFS指令(將32位FPU控制寄存器移動(dòng)到64位通用FPU寄存器)的轉(zhuǎn)換和優(yōu)化。這條源指令是如此復(fù)雜,以至于無(wú)法用基本結(jié)點(diǎn)來(lái)表示。
在未經(jīng)優(yōu)化的情況下,將使用一個(gè)置換函數(shù)來(lái)轉(zhuǎn)換這條指令。對(duì)于使用標(biāo)準(zhǔn)的轉(zhuǎn)換方案特別難以轉(zhuǎn)換的源指令的特例來(lái)說(shuō),置換函數(shù)是明顯的轉(zhuǎn)換。置換函數(shù)轉(zhuǎn)換作為執(zhí)行源指令的語(yǔ)義的目標(biāo)代碼函數(shù)來(lái)實(shí)現(xiàn)。它們承受比基于標(biāo)準(zhǔn)的IR指令的轉(zhuǎn)換方案更高的執(zhí)行成本。用于這條指令的未經(jīng)優(yōu)化的轉(zhuǎn)換方案是這樣的PPC MFFS指令=>基本IR置換函數(shù)=>P4置換函數(shù)在一個(gè)使用多形IR的轉(zhuǎn)換器30中,使用多形結(jié)點(diǎn)來(lái)轉(zhuǎn)換這樣的特殊情況指令。多形結(jié)點(diǎn)的函數(shù)指針為后端33提供了一種更加有效的機(jī)制,即,為困難的源指令提供一種定制的轉(zhuǎn)換。用于相同指令的優(yōu)化的轉(zhuǎn)換方案是這樣的PPC MFFS指令=>單個(gè)多形IR結(jié)點(diǎn)=>P4 SSE2指令體系結(jié)構(gòu)專用結(jié)點(diǎn)在本發(fā)明的轉(zhuǎn)換器30的另一個(gè)優(yōu)選實(shí)施例中,轉(zhuǎn)換器30可以利用如圖5所示的體系結(jié)構(gòu)專用結(jié)點(diǎn)(ASN),后者專用于特定的體系結(jié)構(gòu)(即,一個(gè)特定的源體系結(jié)構(gòu)—目標(biāo)體系結(jié)構(gòu)的組合)。每一個(gè)體系結(jié)構(gòu)專用結(jié)點(diǎn)(ASN)都是針對(duì)特定指令而專門(mén)地定做的,由此得出專用于特定體系結(jié)構(gòu)的ASN。當(dāng)使用ASN機(jī)制時(shí),可以實(shí)行體系結(jié)構(gòu)專用的優(yōu)化,理解ASN的語(yǔ)義并且因此能夠在ASN之上進(jìn)行工作。
IR結(jié)點(diǎn)可以包括多達(dá)3個(gè)部件數(shù)據(jù)部件,實(shí)施部件和轉(zhuǎn)換部件。數(shù)據(jù)部件保存不是結(jié)點(diǎn)本身固有的任何語(yǔ)義信息(例如,一個(gè)常數(shù)立即指令字段的值)。實(shí)施部件執(zhí)行代碼生成,并且因此,專門(mén)地涉及一種特定的體系結(jié)構(gòu)。轉(zhuǎn)換部件將所述結(jié)點(diǎn)轉(zhuǎn)換為一種不同類型的IR結(jié)點(diǎn),即ASN結(jié)點(diǎn)或基本結(jié)點(diǎn)。在本發(fā)明的一種給定的實(shí)施方式的轉(zhuǎn)換器中,在所生成的IR中的每一個(gè)基本結(jié)點(diǎn)和ASN中,都包括轉(zhuǎn)換部件或者實(shí)施部件,但不同時(shí)包括二者。
每一個(gè)基本結(jié)點(diǎn)都具有一個(gè)專用于目標(biāo)體系結(jié)構(gòu)的實(shí)施部件?;窘Y(jié)點(diǎn)沒(méi)有轉(zhuǎn)換部件,由于在IR結(jié)點(diǎn)層次結(jié)構(gòu)中,基本結(jié)點(diǎn)僅對(duì)可能的最小語(yǔ)義信息量進(jìn)行編碼,因此,把基本結(jié)點(diǎn)轉(zhuǎn)換為其它類型的IR結(jié)點(diǎn)不會(huì)帶來(lái)任何好處。將基本結(jié)點(diǎn)轉(zhuǎn)換為其它類型的IR結(jié)點(diǎn)將要求通過(guò)慣用語(yǔ)法識(shí)別來(lái)重新收集語(yǔ)義信息。
ASN的實(shí)施部件專用于所述結(jié)點(diǎn)的體系結(jié)構(gòu),因此,它生成對(duì)應(yīng)于所述ASN的體系結(jié)構(gòu)專用指令。例如,MIPSLoad ASN的實(shí)施部件生成MIPS“l(fā)d”(加載)指令。當(dāng)使用具有相同的源和目標(biāo)體系結(jié)構(gòu)的本發(fā)明的轉(zhuǎn)換器(即,作為一個(gè)加速器)時(shí),各源ASN將具有實(shí)施部件。當(dāng)使用具有不同源和目標(biāo)體系結(jié)構(gòu)的轉(zhuǎn)換器時(shí),各源ASN將具有轉(zhuǎn)換部件。
例如,圖7表示當(dāng)在MIPS—MIPS加速器中使用本發(fā)明的實(shí)施例時(shí),用于MIPS指令的ASN。前端31對(duì)MIPS“addi”(立即數(shù)相加)指令701進(jìn)行解碼,并產(chǎn)生一個(gè)IR以包含相應(yīng)的ASN,MIPS_ADDI703。對(duì)加速器來(lái)說(shuō),源和目標(biāo)體系結(jié)構(gòu)是相同的,并且因此轉(zhuǎn)換部件“CVT”707未定義。定義實(shí)施部件“IMPL”705以生成相同的MIPS“addi”指令709,經(jīng)受代碼生成過(guò)程中的寄存器分配差異。
圖8表示當(dāng)在MIPS x86轉(zhuǎn)換器中使用本發(fā)明的實(shí)施例時(shí),在用于相同的MIPS指令的IR中的各ASN。前端31對(duì)MIPS“addi”源指令進(jìn)行解碼,并且生成一個(gè)相應(yīng)的源ASN,MIPS_ADDI 801。對(duì)這個(gè)加速器來(lái)說(shuō),源和目標(biāo)體系結(jié)構(gòu)是不同的,并且因此源ASN 801的實(shí)施部件803未定義。MIPS_ADDI的轉(zhuǎn)換部件805是一個(gè)專門(mén)化的轉(zhuǎn)換部件,它把源ASN 801轉(zhuǎn)換為目標(biāo)ASN 807。通過(guò)比較,一個(gè)通用的轉(zhuǎn)換部件將源ASN 801轉(zhuǎn)換為基本結(jié)點(diǎn)表示。MIPS_ADDI結(jié)點(diǎn)801的目標(biāo)ASN表示是單個(gè)x86 ADDI結(jié)點(diǎn)807。目標(biāo)ASN 807的轉(zhuǎn)換部件811未定義。目標(biāo)ASN 807的實(shí)施部件809生成一條目標(biāo)指令813,在本例中為x86指令“ADD $EAX#10”。
當(dāng)轉(zhuǎn)換器30正在使用各ASN時(shí),所有源指令都被實(shí)現(xiàn)為源專用ASN。在圖5中,前端解碼塊200、ASN實(shí)現(xiàn)塊218以及源ASN塊220互相鄰接這個(gè)事實(shí)表示下列事實(shí),即,由前端31定義各ASN,并且由于在源指令類型和源ASN類型之間存在一一對(duì)應(yīng)關(guān)系,所以所述實(shí)現(xiàn)方法是尋常的。前端31含有理解各源ASN的語(yǔ)義并在其上進(jìn)行工作的源專用優(yōu)化。換句話說(shuō),所述源代碼被初始地實(shí)現(xiàn)為含有全部源ASN的一個(gè)IR森林,然后對(duì)其施加源專用優(yōu)化。
通過(guò)默認(rèn),源ASN具有一個(gè)通用轉(zhuǎn)換部件,它生成基本結(jié)點(diǎn)的IR樹(shù)。這允許使用通用的IR結(jié)點(diǎn)來(lái)支持一種新的源體系結(jié)構(gòu)被快速實(shí)施。在圖5中,源ASN被實(shí)現(xiàn)為通過(guò)穿越ASN基本IR塊222和種植塊206延伸的路徑的基本結(jié)點(diǎn),它以相同于已在前面詳細(xì)說(shuō)明的其它基本結(jié)點(diǎn)的方式,被轉(zhuǎn)換為目標(biāo)代碼。
對(duì)于那些對(duì)性能有顯著影響的源指令來(lái)說(shuō),相應(yīng)的源ASN結(jié)點(diǎn)提供專門(mén)化的轉(zhuǎn)換部件,其生成目標(biāo)ASN結(jié)點(diǎn)的IR樹(shù)。考慮是否實(shí)現(xiàn)一個(gè)專門(mén)化的轉(zhuǎn)換部件的因素包括(1)為特定的有效轉(zhuǎn)換提供的目標(biāo)體系結(jié)構(gòu)特征是否會(huì)在基本結(jié)點(diǎn)轉(zhuǎn)換中丟失;(2)源指令是否出現(xiàn)得如此頻繁,以至于它對(duì)性能產(chǎn)生顯著的影響。這些專門(mén)化的轉(zhuǎn)換部件是專用于源—目標(biāo)體系結(jié)構(gòu)對(duì)的。目標(biāo)ASN(根據(jù)定義,它具有與目標(biāo)相同的體系結(jié)構(gòu))包括實(shí)施部件。
當(dāng)實(shí)現(xiàn)專門(mén)化的轉(zhuǎn)換部件時(shí),相應(yīng)的源ASN結(jié)點(diǎn)提供目標(biāo)專用的轉(zhuǎn)換部件,其通過(guò)目標(biāo)ASN塊224將源ASN轉(zhuǎn)換為目標(biāo)ASN。然后,目標(biāo)ASN的實(shí)施部件被調(diào)用,以便在目標(biāo)ASN種植塊226中執(zhí)行代碼生成。每一個(gè)目標(biāo)ASN對(duì)應(yīng)于一條特定的目標(biāo)指令,因此,由一個(gè)目標(biāo)ASN生成的代碼簡(jiǎn)單地是所述ASN編碼的相應(yīng)目標(biāo)指令。如此,使用目標(biāo)ASN的代碼生成在計(jì)算上是最少的(在圖5中被反映為,目標(biāo)ASN種植塊226與后端33中的目標(biāo)ASN塊224和編碼塊208二者相鄰,在這些部件之間,沒(méi)有示出指定非尋常的計(jì)算的箭頭)。而且,IR遍歷、轉(zhuǎn)換和代碼生成過(guò)程全都受到內(nèi)核32的控制。
圖9表示根據(jù)本發(fā)明的、利用ASN機(jī)制的轉(zhuǎn)換器的一個(gè)優(yōu)選實(shí)施例而執(zhí)行的所述轉(zhuǎn)換過(guò)程。在前端31中,在步驟903,轉(zhuǎn)換器將源代碼901解碼為源ASN 904。在步驟905,轉(zhuǎn)換器對(duì)由源ASN構(gòu)成的IR樹(shù)進(jìn)行源專用優(yōu)化。然后,在步驟907,通過(guò)調(diào)用源ASN的轉(zhuǎn)換部件,將每一個(gè)源ASN 904轉(zhuǎn)換為目標(biāo)兼容的IR結(jié)點(diǎn)(目標(biāo)ASN911)。通過(guò)默認(rèn),具有通用轉(zhuǎn)換部件的源ASN結(jié)點(diǎn)被轉(zhuǎn)換為基本結(jié)點(diǎn)909。如同由后端925所提供的那樣,具有專門(mén)化的轉(zhuǎn)換部件的各源ASN結(jié)點(diǎn)被轉(zhuǎn)換為各目標(biāo)ASN 911。轉(zhuǎn)換由此產(chǎn)生一個(gè)混合的IR森林913,它含有基本結(jié)點(diǎn)909和目標(biāo)ASN 911。在步驟915,在內(nèi)核32中,所述轉(zhuǎn)換器對(duì)混合IR森林913中的各基本結(jié)點(diǎn)進(jìn)行一般優(yōu)化。隨后,在步驟916,轉(zhuǎn)換器對(duì)混合IR森林913中的各目標(biāo)ASN進(jìn)行目標(biāo)專用優(yōu)化。最后,在步驟917,代碼生成調(diào)用混合樹(shù)中的每一個(gè)結(jié)點(diǎn)的實(shí)施部件(基本結(jié)點(diǎn)和目標(biāo)ASN結(jié)點(diǎn)二者都具有實(shí)施部件),接著生成目標(biāo)代碼919。
在代碼加速器的特例中,源和目標(biāo)體系結(jié)構(gòu)二者相同。在這個(gè)情形,在整個(gè)轉(zhuǎn)換過(guò)程中,各源ASN持續(xù)。在前端31,通過(guò)解碼生成來(lái)自各源指令的各源ASN。在內(nèi)核32,各源ASN通過(guò)體系結(jié)構(gòu)專用優(yōu)化。代碼生成調(diào)用各源ASN的實(shí)施部件生成相應(yīng)的指令。如此,在代碼加速器中ASN的使用避免了代碼激增,其方法是通過(guò)保證1∶1的源對(duì)目標(biāo)指令的最小轉(zhuǎn)換比,通過(guò)優(yōu)化可以增加這個(gè)比值。
本發(fā)明的轉(zhuǎn)換器的各個(gè)實(shí)施例都可以為特定的轉(zhuǎn)換器應(yīng)用(即,特定的源體系結(jié)構(gòu)—目標(biāo)體系結(jié)構(gòu)對(duì))而進(jìn)行配置。如此,本發(fā)明的轉(zhuǎn)換器可以被配置成這樣,將被設(shè)計(jì)在任何源體系結(jié)構(gòu)上運(yùn)行的源代碼轉(zhuǎn)換為可以在任何目標(biāo)體系結(jié)構(gòu)上執(zhí)行的目標(biāo)代碼。在多種轉(zhuǎn)換器應(yīng)用中,每一個(gè)基本結(jié)點(diǎn)都具有多個(gè)實(shí)施部件,其中的每一個(gè)都支持目標(biāo)體系結(jié)構(gòu)。正在進(jìn)行的特定配置(即,條件編譯)決定哪些IR結(jié)點(diǎn)和這些結(jié)點(diǎn)的哪些部件包括在特定的轉(zhuǎn)換器應(yīng)用中。
在本發(fā)明的一個(gè)優(yōu)選實(shí)施例中,ASN的使用提供了多種有利的效益。首先,使用源指令的通用IR實(shí)施方式可以快速地開(kāi)發(fā)從頭建立的轉(zhuǎn)換器產(chǎn)品。其次,通過(guò)實(shí)現(xiàn)用于那些對(duì)性能具有重要影響的源指令的目標(biāo)專用轉(zhuǎn)換部件(正如事先知道的或者正如由經(jīng)驗(yàn)決定的),現(xiàn)有的轉(zhuǎn)換器產(chǎn)品可以以增量方式被擴(kuò)充。第三,隨著更多的轉(zhuǎn)換器產(chǎn)品被開(kāi)發(fā),ASN結(jié)點(diǎn)的庫(kù)(以及所實(shí)現(xiàn)的功能)與時(shí)俱增,因此未來(lái)的轉(zhuǎn)換器產(chǎn)品可以快速地被實(shí)現(xiàn)或者被優(yōu)化。
本發(fā)明的這個(gè)實(shí)施例的后端實(shí)施方式檢出和選擇哪些源指令值得優(yōu)化(通過(guò)定義目標(biāo)專用的轉(zhuǎn)換部件)。通用的轉(zhuǎn)換部件允許快速地開(kāi)發(fā)基于ASN的轉(zhuǎn)換器,同時(shí)專用的轉(zhuǎn)換部件允許對(duì)性能有重要影響的指令有選擇地和增量地被優(yōu)化。
實(shí)例3使用ASN的困難指令回到前面實(shí)例2的PowerPC SHL 64指令,使用ASN的轉(zhuǎn)換器30執(zhí)行下列各步驟前端解碼器200對(duì)當(dāng)前塊進(jìn)行解碼,并且遇到PowerPC SHL 64指令。隨后,前端31實(shí)現(xiàn)針對(duì)所述指令(即,SHL64 PPC P4)的單個(gè)ASN。其次,內(nèi)核32優(yōu)化用于指令的當(dāng)前塊的IR,并且在準(zhǔn)備代碼生成的過(guò)程中執(zhí)行IR的順序遍歷。再次,內(nèi)核32通過(guò)調(diào)用每一個(gè)特定ASN結(jié)點(diǎn)的代碼生成器函數(shù)(它是實(shí)施部件的一個(gè)元件),為所述ASN結(jié)點(diǎn)執(zhí)行代碼生成。最后,后端33將源體系結(jié)構(gòu)(PPC)指令編碼為一條或多條目標(biāo)體系結(jié)構(gòu)(P4)指令。
MIPS實(shí)例現(xiàn)在引用圖10、11和12,圖中示出了分別使用基本IR結(jié)點(diǎn)、MIPS—MIPS ASN IR結(jié)點(diǎn)和MIPS—x86 ASN IR結(jié)點(diǎn),從相同的MIPS指令序列生成的不同IR樹(shù)。示例性的MIPS源指令序列的語(yǔ)義(加載立即數(shù)的高位,然后對(duì)立即數(shù)進(jìn)行按位或運(yùn)算)是將32位常數(shù)數(shù)值Ox12345678裝入源寄存器“a1”。
在圖10中,二進(jìn)制解碼器300是轉(zhuǎn)換器30的前端部件31,它把源代碼解碼(解析)為具體的源指令。在源指令被解碼之后,它們被實(shí)現(xiàn)為基本結(jié)點(diǎn)302,并且被添加到用于指令的當(dāng)前塊的正在工作的IR森林。IR管理器304是在IR生成過(guò)程中保持正在工作的IR森林的轉(zhuǎn)換器30的一部分。IR管理器304包括抽象寄存器和它們的相關(guān)IR樹(shù)(IR森林的根是各抽象寄存器)。例如,在圖10中,抽象寄存器“a V 306”是5個(gè)結(jié)點(diǎn)的IR樹(shù)308的根,這棵樹(shù)是當(dāng)前塊的正在工作的IR森林的一部分。在用C++實(shí)現(xiàn)的轉(zhuǎn)換器30中,IR管理器304可以被實(shí)現(xiàn)為一個(gè)C++對(duì)象,其包括一組抽象寄存器對(duì)象(或者對(duì)于IR結(jié)點(diǎn)對(duì)象的引用)。
圖10說(shuō)明由僅使用基本結(jié)點(diǎn)由MIPS至x86轉(zhuǎn)換器產(chǎn)生的IR樹(shù)308。MIPS_LUI指令310實(shí)現(xiàn)具有兩個(gè)操作數(shù)結(jié)點(diǎn)316和318(在本例中為兩個(gè)常數(shù))的“SHL”(左移)基本結(jié)點(diǎn)314。MIPS_LUI指令310的語(yǔ)義是將一個(gè)常數(shù)值(Ox1234)向左移動(dòng)一個(gè)恒定數(shù)目的位(16)。MIPS_ORI指令312實(shí)現(xiàn)具有兩個(gè)操作數(shù)結(jié)點(diǎn)314和322(即,SHL結(jié)點(diǎn)314的結(jié)果和一個(gè)常數(shù)值)的“ORI”(對(duì)立即數(shù)進(jìn)行按位或運(yùn)算)基本結(jié)點(diǎn)320。MIPS_ORI指令312的語(yǔ)義是將現(xiàn)有的寄存器內(nèi)容與一個(gè)常數(shù)值(Ox5678)進(jìn)行按位或運(yùn)算。
在一個(gè)未經(jīng)優(yōu)化的代碼生成器中,基本結(jié)點(diǎn)不包括除裝載立即數(shù)以外的立即數(shù)型運(yùn)算符,這樣,每一個(gè)常數(shù)結(jié)點(diǎn)都導(dǎo)致生成一條加載立即數(shù)的指令。因此,對(duì)這個(gè)源指令序列來(lái)說(shuō),未經(jīng)優(yōu)化的基本結(jié)點(diǎn)轉(zhuǎn)換器需要5項(xiàng)RISC型操作(加載、加載、移位、加載、或)。后端33的慣用語(yǔ)法識(shí)別通過(guò)將常數(shù)結(jié)點(diǎn)與它們的父輩結(jié)點(diǎn)合并,能將這個(gè)數(shù)目從5減少到2,以便生成立即數(shù)型目標(biāo)指令(即,對(duì)立即數(shù)進(jìn)行移位以及對(duì)立即數(shù)進(jìn)行或運(yùn)算)。這樣就把目標(biāo)指令的數(shù)目減少到2,但是在代碼生成器中,在執(zhí)行慣用語(yǔ)法識(shí)別時(shí)增加了轉(zhuǎn)換成本。
在IR中使用復(fù)雜結(jié)點(diǎn)可以實(shí)現(xiàn)立即數(shù)型IR結(jié)點(diǎn),這樣就消除了在后端33中進(jìn)行慣用語(yǔ)法識(shí)別的需求,并降低代碼生成器的轉(zhuǎn)換成本。復(fù)雜結(jié)點(diǎn)保留原始源指令的更多語(yǔ)義,并且,隨著被實(shí)現(xiàn)的IR結(jié)點(diǎn)更少,當(dāng)使用復(fù)雜結(jié)點(diǎn)時(shí),結(jié)點(diǎn)生成的轉(zhuǎn)換成本也被降低。
圖11說(shuō)明使用ASN由MIPS—X86(MIPS至X86)轉(zhuǎn)換器生成的IR樹(shù)。在源指令被二進(jìn)制解碼器300解碼之后,他們被實(shí)現(xiàn)為MIPS_X86 ASN結(jié)點(diǎn)330,隨后被添加到用于當(dāng)前塊的工作IR森林。首先,由ASN的轉(zhuǎn)換部件將MIPS_X86_LUI ASN結(jié)點(diǎn)轉(zhuǎn)換為一個(gè)X86 32位常數(shù)結(jié)點(diǎn)332。其次,MIPS_X86_ORI ASN結(jié)點(diǎn)產(chǎn)生一個(gè)X86 ORI結(jié)點(diǎn),它被立即與先前的X86常數(shù)結(jié)點(diǎn)合并在一起(常數(shù)合并),結(jié)果得到單個(gè)X86 32位常數(shù)結(jié)點(diǎn)334。所述結(jié)點(diǎn)334被編碼為單個(gè)X86加載常數(shù)指令“mov%eax,$Ox12345678”。如同可以看到的那樣,ASN結(jié)點(diǎn)導(dǎo)致比基本結(jié)點(diǎn)實(shí)例更少的結(jié)點(diǎn),由此降低了轉(zhuǎn)換成本,同時(shí)提供較好的目標(biāo)代碼。
圖12說(shuō)明由MIPS—MIPS轉(zhuǎn)換器(即,MIPS加速器)使用ASN生成的IR樹(shù)。在源指令310、312被二進(jìn)制解碼器300解碼之后,他們被實(shí)現(xiàn)為MIPS_MIPS ASN結(jié)點(diǎn)340,隨后,上述結(jié)點(diǎn)被添加到用于當(dāng)前塊工作IR森林。由于對(duì)MIPS—MIPS轉(zhuǎn)換器來(lái)說(shuō),源和目標(biāo)體系結(jié)構(gòu)是相同的,所以MIPS_MIPS_LUI和MIPS_MIPS_ORI_ASN結(jié)點(diǎn)340具有空(未經(jīng)定義的)轉(zhuǎn)換部件。如此,在源指令和用于生成代碼的最后IR結(jié)點(diǎn)之間存在一種直接對(duì)應(yīng)關(guān)系。這保證了即使在施行任何優(yōu)化之前,1∶1的源對(duì)目標(biāo)指令的轉(zhuǎn)換比。換句話說(shuō),ASN結(jié)點(diǎn)消除了用于相同—相同轉(zhuǎn)換器(加速器)的代碼激增。ASN結(jié)點(diǎn)還允許16位常數(shù)結(jié)點(diǎn)被共享,這對(duì)于在MIPS平臺(tái)上的相鄰存儲(chǔ)器存取的有效轉(zhuǎn)換來(lái)說(shuō)是有用的。
以每次轉(zhuǎn)換一條源指令的方式來(lái)轉(zhuǎn)換指令的基本塊。每一條源指令導(dǎo)致形成(實(shí)現(xiàn))一棵IR樹(shù)。在生成針對(duì)一條給定指令的IR樹(shù)之后,它被整合到針對(duì)當(dāng)前塊的工作IR森林中。工作IR森林的根是抽象寄存器,后者對(duì)應(yīng)于源寄存器和源體系結(jié)構(gòu)的其它特征。當(dāng)最后一條源指令已經(jīng)被解碼、實(shí)現(xiàn),并且它的IR樹(shù)被整合到工作IR森林之后,針對(duì)所述塊的IR森林完成。
在圖12中,第一源指令310是“l(fā)ui al Ox1234”。這條指令310的語(yǔ)義是將常數(shù)值Ox1234加載到源寄存器“al”342的高16位。這條指令310實(shí)現(xiàn)了具有一個(gè)立即數(shù)字段常數(shù)值Ox1234的MIPS_MIPS_LUI結(jié)點(diǎn)344。轉(zhuǎn)換器通過(guò)設(shè)置抽象寄存器“al”342(源指令的目標(biāo)寄存器),使之指向MIPS_MIPS_LUI IR結(jié)點(diǎn)344,來(lái)把這個(gè)結(jié)點(diǎn)添加到工作IR森林。
在圖12所示的同一實(shí)例中,第二源指令312為“ori al,al,Ox5678”。這條指令312的語(yǔ)義是執(zhí)行常數(shù)值Ox5678和源寄存器“al”342的當(dāng)前內(nèi)容的按位或運(yùn)算,并且將結(jié)果存儲(chǔ)在源寄存器“al”346之中。這條指令312實(shí)現(xiàn)了具有一個(gè)立即數(shù)字段常數(shù)數(shù)值Ox5678的MIPS_MIPS_ORI結(jié)點(diǎn)348。轉(zhuǎn)換器通過(guò)首先設(shè)置ORI結(jié)點(diǎn),使之指向由抽象寄存器“al”342(源指令的源寄存器)當(dāng)前所指向的IR樹(shù),并且,隨后設(shè)置抽象寄存器“al”346(源指令的目標(biāo)寄存器),使之指向ORI結(jié)點(diǎn)348,把這個(gè)結(jié)點(diǎn)添加到工作IR森林。換句話說(shuō),以抽象寄存器342(即,LUI結(jié)點(diǎn))為根的現(xiàn)有的“al”樹(shù)變?yōu)镺RI結(jié)點(diǎn)348的子樹(shù)350,并且隨后ORI結(jié)點(diǎn)348變?yōu)樾碌腶l樹(shù)。舊的“al”樹(shù)(在LUI之后,但是在ORI之前)以抽象寄存器342為根,并且被表示為被線345鏈接,而當(dāng)前的“al”樹(shù)(在ORI之后)以抽象寄存器346為根。
正如從上面可以看到的那樣,根據(jù)本發(fā)明形成的一個(gè)改進(jìn)的程序代碼轉(zhuǎn)換裝置可以被配置用于任何源和目標(biāo)處理器體系結(jié)構(gòu)對(duì),同時(shí)保持最佳的性能水平,并且在轉(zhuǎn)換速度和已轉(zhuǎn)換目標(biāo)代碼的效率之間取得平衡。而且,根據(jù)在轉(zhuǎn)換中涉及的源和目標(biāo)計(jì)算環(huán)境的特定的體系結(jié)構(gòu),通過(guò)利用在其中間表示中的基本結(jié)點(diǎn)、復(fù)雜結(jié)點(diǎn)、多形結(jié)點(diǎn)和體系結(jié)構(gòu)專用結(jié)點(diǎn)的組合,本發(fā)明的程序代碼轉(zhuǎn)換裝置可以被設(shè)計(jì)成具有通用和專用轉(zhuǎn)換特征的混合設(shè)計(jì)。
在上述每一個(gè)實(shí)施例中,單獨(dú)地描述了根據(jù)本發(fā)明的改進(jìn)的程序代碼轉(zhuǎn)換裝置的不同結(jié)構(gòu)。然而,本發(fā)明的發(fā)明人充分注意到,這里所描述的每一個(gè)實(shí)施例的各個(gè)單獨(dú)的方面可以與這里所描述的其它實(shí)施例相結(jié)合。例如,根據(jù)本發(fā)明而構(gòu)成的轉(zhuǎn)換器可以包括各種IR類型的混合優(yōu)化。本領(lǐng)域的技術(shù)人員將理解,在不離開(kāi)本發(fā)明的范圍和精神實(shí)質(zhì)的前提下,可以配置對(duì)剛剛描述的優(yōu)選實(shí)施例的調(diào)適和修改。因此,需要理解的是,在所附的權(quán)利要求書(shū)的范圍內(nèi),可以以不同于在這里專門(mén)地描述的方式來(lái)實(shí)施本發(fā)明。
雖然已經(jīng)展示和描述幾個(gè)優(yōu)選實(shí)施例,但是,本領(lǐng)域的技術(shù)人員將理解,在不離開(kāi)如所附的權(quán)利要求書(shū)所規(guī)定的本發(fā)明的范圍的前提下,可以作出各種各樣的變更和修改。
注意到與本說(shuō)明書(shū)(結(jié)合本申請(qǐng)書(shū))同時(shí)或在這之前申請(qǐng)的、對(duì)公眾公開(kāi)的所有論文和文獻(xiàn),并且所有這些論文和文獻(xiàn)的內(nèi)容在此通過(guò)參考而并入。
在本說(shuō)明書(shū)中(包括任何附帶的權(quán)利要求書(shū)、摘要和附圖)所公開(kāi)的所有特征,和/或所公開(kāi)的任何方法或工藝的所有步驟,都可以以任何組合方式加以組合,但是在其中至少某些這樣的特征和/或步驟互相排斥的組合除外。
在本說(shuō)明書(shū)中(包括任何附帶的權(quán)利要求書(shū)、摘要和附圖)所公開(kāi)的每一項(xiàng)特征,除非另有特別的說(shuō)明,都可以被為此服務(wù)的可替代的特征、等價(jià)物或者類似的用途所替代。因此,除非另有特別的說(shuō)明,所公開(kāi)的每一項(xiàng)特征僅僅是等價(jià)物或者類似特征的一般系列中的一個(gè)實(shí)例。
本發(fā)明并不局限于上述(各)實(shí)施例的細(xì)節(jié)。本發(fā)明可以擴(kuò)展到在本說(shuō)明書(shū)(包括任何附帶的權(quán)利要求書(shū)、摘要和附圖)中所公開(kāi)的各項(xiàng)特征中的任何新的一種,或者任何新的組合,或者擴(kuò)展到所公開(kāi)的任何方法或工藝的各步驟的任何新的一種,或者任何新的組合。
權(quán)利要求
1.一種將源體系結(jié)構(gòu)的源代碼轉(zhuǎn)換為目標(biāo)體系結(jié)構(gòu)的目標(biāo)代碼的方法,包括計(jì)算機(jī)實(shí)施的下列步驟解碼所述源代碼,并生成包括專用于源體系結(jié)構(gòu)的多個(gè)源體系結(jié)構(gòu)專用結(jié)點(diǎn)的中間表示;將所述源體系結(jié)構(gòu)專用結(jié)點(diǎn)轉(zhuǎn)換為專用于目標(biāo)體系結(jié)構(gòu)的目標(biāo)體系結(jié)構(gòu)專用結(jié)點(diǎn);以及從所述中間表示生成目標(biāo)代碼,包括從所述目標(biāo)體系結(jié)構(gòu)專用結(jié)點(diǎn)生成目標(biāo)代碼指令。
2.根據(jù)權(quán)利要求1所述方法,其中,所述源體系結(jié)構(gòu)專用結(jié)點(diǎn)的至少一個(gè)包括專門(mén)化的轉(zhuǎn)換部件,生成一個(gè)或多個(gè)相應(yīng)的目標(biāo)體系結(jié)構(gòu)專用結(jié)點(diǎn),其中,所述專門(mén)化的轉(zhuǎn)換部件專用于源體系結(jié)構(gòu)目標(biāo)體系結(jié)構(gòu)對(duì)。
3.根據(jù)權(quán)利要求1所述方法,其中,所述目標(biāo)體系結(jié)構(gòu)專用結(jié)點(diǎn)的至少一個(gè)包括實(shí)施部件,調(diào)用所述實(shí)施部件以便從所述目標(biāo)體系結(jié)構(gòu)專用結(jié)點(diǎn)生成目標(biāo)代碼指令。
4.根據(jù)權(quán)利要求1所述方法,其中,所述多個(gè)源體系結(jié)構(gòu)專用結(jié)點(diǎn)的每一個(gè)與源體系結(jié)構(gòu)中的各自的指令類型相關(guān)聯(lián)。
5.根據(jù)權(quán)利要求1所述方法,其中,所述目標(biāo)體系結(jié)構(gòu)專用結(jié)點(diǎn)的每一個(gè)與目標(biāo)體系結(jié)構(gòu)中的特定指令類型相關(guān)聯(lián)。
6.根據(jù)權(quán)利要求1所述方法,其中,生成目標(biāo)代碼的步驟包括從每一個(gè)各自的目標(biāo)體系結(jié)構(gòu)專用結(jié)點(diǎn)生成一個(gè)目標(biāo)代碼指令。
7.根據(jù)權(quán)利要求2所述方法,其中,所述多個(gè)源體系結(jié)構(gòu)專用結(jié)點(diǎn)的至少一個(gè)進(jìn)一步包括表示各自的源代碼指令的語(yǔ)義的數(shù)據(jù)部件。
8.根據(jù)權(quán)利要求3的方法,其中,所述目標(biāo)體系結(jié)構(gòu)專用指令的至少一個(gè)進(jìn)一步包括表示各自的目標(biāo)代碼指令的語(yǔ)義的數(shù)據(jù)部件。
9.根據(jù)權(quán)利要求1的方法,其中,生成中間表示的步驟進(jìn)一步包括生成通用于源體系結(jié)構(gòu)和目標(biāo)體系結(jié)構(gòu)的至少一個(gè)基本結(jié)點(diǎn)。
10.根據(jù)權(quán)利要求1的方法,其中,所述轉(zhuǎn)換步驟進(jìn)一步包括將所述源體系結(jié)構(gòu)專用結(jié)點(diǎn)的至少一個(gè)轉(zhuǎn)換為通用于源體系結(jié)構(gòu)和目標(biāo)體系結(jié)構(gòu)的一個(gè)或多個(gè)基本結(jié)點(diǎn);以及生成目標(biāo)代碼的步驟進(jìn)一步包括從所述一個(gè)或多個(gè)基本結(jié)點(diǎn)生成目標(biāo)代碼指令。
11.根據(jù)權(quán)利要求10的方法,其中,所述源體系結(jié)構(gòu)專用結(jié)點(diǎn)的至少一個(gè)包括生成一個(gè)或多個(gè)基本結(jié)點(diǎn)的通用轉(zhuǎn)換部件。
12.根據(jù)權(quán)利要求1的方法,還包括下列步驟執(zhí)行所述多個(gè)源體系結(jié)構(gòu)專用結(jié)點(diǎn)的源體系結(jié)構(gòu)專用優(yōu)化。
13.根據(jù)權(quán)利要求1的方法,還包括下列步驟執(zhí)行所述目標(biāo)體系結(jié)構(gòu)專用結(jié)點(diǎn)的目標(biāo)體系結(jié)構(gòu)專用優(yōu)化。
14.一種計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),具有駐留于其上的計(jì)算機(jī)可讀代碼形式的轉(zhuǎn)換器軟件,所述軟件可由計(jì)算機(jī)執(zhí)行以便執(zhí)行下列步驟解碼所述源代碼,并生成包括專用于源體系結(jié)構(gòu)的多個(gè)源體系結(jié)構(gòu)專用結(jié)點(diǎn)的中間表示;將所述源體系結(jié)構(gòu)專用結(jié)點(diǎn)轉(zhuǎn)換為專用于目標(biāo)體系結(jié)構(gòu)的目標(biāo)體系結(jié)構(gòu)專用結(jié)點(diǎn);以及從所述中間表示生成目標(biāo)代碼,包括從所述目標(biāo)體系結(jié)構(gòu)專用結(jié)點(diǎn)生成目標(biāo)代碼指令。
15.一種用于目標(biāo)計(jì)算環(huán)境的轉(zhuǎn)換器裝置,它具有處理器和連接到所述處理器的存儲(chǔ)器,用于將能夠在源體系結(jié)構(gòu)上執(zhí)行的源代碼轉(zhuǎn)換為能夠在目標(biāo)計(jì)算環(huán)境的目標(biāo)體系結(jié)構(gòu)上執(zhí)行的目標(biāo)程序代碼,其中,所述轉(zhuǎn)換器裝置包括解碼器單元,用于解碼所述源代碼,并生成包括專用于源體系結(jié)構(gòu)的多個(gè)源體系結(jié)構(gòu)專用結(jié)點(diǎn)的中間表示;轉(zhuǎn)換器單元,用于所述源體系結(jié)構(gòu)專用結(jié)點(diǎn)轉(zhuǎn)換為專用于目標(biāo)體系結(jié)構(gòu)的目標(biāo)體系結(jié)構(gòu)專用結(jié)點(diǎn);以及生成器單元,用于從所述中間表示生成目標(biāo)代碼,包括從所述目標(biāo)體系結(jié)構(gòu)專用結(jié)點(diǎn)生成目標(biāo)代碼指令。
全文摘要
一種用于程序代碼轉(zhuǎn)換裝置的改進(jìn)的體系結(jié)構(gòu)和生成用于程序代碼轉(zhuǎn)換的中間表示的方法。所述程序代碼轉(zhuǎn)換裝置確定在待轉(zhuǎn)換的源代碼的中間表示中,生成哪一種類型的IR結(jié)點(diǎn)。根據(jù)轉(zhuǎn)換中所涉及的特定源和目標(biāo)計(jì)算環(huán)境,程序代碼轉(zhuǎn)換裝置在生成中間表示的過(guò)程中,使用基本結(jié)點(diǎn)、復(fù)雜結(jié)點(diǎn)、多形結(jié)點(diǎn)和體系結(jié)構(gòu)專用結(jié)點(diǎn),或者它們的某種組合。
文檔編號(hào)G06F9/45GK1975674SQ200610171108
公開(kāi)日2007年6月6日 申請(qǐng)日期2004年4月28日 優(yōu)先權(quán)日2003年5月2日
發(fā)明者丹尼爾·歐文, 強(qiáng)納森·J.·安德魯斯, 麥爾斯·P.·豪森, 大衛(wèi)·??四?申請(qǐng)人:可遞有限公司