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

基于寄存器地址環(huán)繞式處理的提前裝載地址表項(xiàng)目無(wú)效的制作方法

文檔序號(hào):6556259閱讀:274來(lái)源:國(guó)知局
專利名稱:基于寄存器地址環(huán)繞式處理的提前裝載地址表項(xiàng)目無(wú)效的制作方法
技術(shù)領(lǐng)域
本發(fā)明總的涉及計(jì)算機(jī)系統(tǒng)中指令的執(zhí)行和性能優(yōu)化,更具體地,涉及一種提前裝載地址表(ALAT)’用于記錄存儲(chǔ)器地址和對(duì)于不按次序地提前的裝載指令的寄存器目標(biāo)以便達(dá)到改進(jìn)性能,其中在ALAT中的項(xiàng)目根據(jù)寄存器地址環(huán)繞式處理而被無(wú)效。
本專利申請(qǐng)涉及到共同轉(zhuǎn)讓的、1998年10月7日提交的、題目為“Method and Apparatus for Optimizing Instruction Execution(用于指令執(zhí)行優(yōu)化的方法和設(shè)備)”的、美國(guó)專利申請(qǐng)序列號(hào)09/168,040,和2000年3月8日提交的、題目為“Emulated BranchEffected by Trampoline Mechanism(通過(guò)蹦床機(jī)制實(shí)現(xiàn)的仿真分支)”的、美國(guó)專利申請(qǐng)序列號(hào)09/521,160,這兩個(gè)專利在此引用,以供參考。美國(guó)專利申請(qǐng)序列號(hào)09/051,160是美國(guó)專利申請(qǐng)序列號(hào)09/168,040的繼續(xù)部分,后者是1997年10月13日提交的、美國(guó)專利申請(qǐng)序列號(hào)08/953,836的繼續(xù)部分。本專利申請(qǐng)也涉及到共同轉(zhuǎn)讓的、1997年9月30日提交的、題目為“Method and Apparatus forDetecting Address Range Overlaps(用于檢測(cè)地址范圍重疊的方法和設(shè)備)”的、美國(guó)專利申請(qǐng)序列號(hào)08/940,607,和1999年12月31日提交的、題目為“Method and Apparatus for Advancing LoadOperations(用于提前裝載操作的方法和設(shè)備)”的、美國(guó)專利申請(qǐng)序列號(hào)09/476,607。
計(jì)算機(jī)系統(tǒng)包括至少一個(gè)處理器和存儲(chǔ)器。存儲(chǔ)器存儲(chǔ)程序指令,數(shù)據(jù),和操作系統(tǒng)。程序指令可包括用于編譯應(yīng)用程序的編譯器。操作系統(tǒng)控制處理器和存儲(chǔ)器,用于系統(tǒng)操作和用于執(zhí)行程序指令。
“基本塊”是由分支和/或分支目標(biāo)約束的接連的指令組,不包含分支或分支目標(biāo)。這是指,如果基本塊中的任何指令被執(zhí)行,則基本塊中的所有的指令將被執(zhí)行,即,被包含在任何基本塊內(nèi)的指令是按照或者全部或者都沒(méi)有的原則執(zhí)行的。當(dāng)控制被傳遞到基本塊時(shí),通過(guò)瞄準(zhǔn)基本塊的先前的分支,使得在基本塊內(nèi)的指令能夠被執(zhí)行(這里所使用的“瞄準(zhǔn)”包括通過(guò)已取的分支的明顯瞄準(zhǔn)以及通過(guò)未取的分支的隱含的瞄準(zhǔn))。上述的內(nèi)容是指,如果控制被傳遞到基本塊,則基本塊中所有的指令必須被執(zhí)行;如果控制沒(méi)有被傳遞到基本塊,則基本塊中沒(méi)有指令被執(zhí)行。
在控制被傳遞到指令以前,指令的執(zhí)行的行動(dòng),或規(guī)定執(zhí)行指令的行動(dòng),被稱為“推測(cè)”。由處理器在程序執(zhí)行時(shí)間執(zhí)行的推測(cè)被稱為“動(dòng)態(tài)推測(cè)”,而由編譯器規(guī)定的推測(cè)被稱為“靜態(tài)推測(cè)”。雖然大多數(shù)現(xiàn)有技術(shù)不是基于靜態(tài)推測(cè),也不涉及到靜態(tài)推測(cè),但最近對(duì)靜態(tài)推測(cè)的某些參考文獻(xiàn)已開(kāi)始顯露。
當(dāng)一個(gè)指令不需要另一個(gè)指令的結(jié)果時(shí),兩個(gè)指令被稱為“獨(dú)立的”;當(dāng)一個(gè)指令需要另一個(gè)指令的結(jié)果時(shí),這兩個(gè)指令被稱為“相關(guān)的”。獨(dú)立的指令可以并行地被執(zhí)行,而依賴的指令以串行方式被執(zhí)行。通過(guò)識(shí)別獨(dú)立指令和盡可能多地并行執(zhí)行它們,程序性能得以改進(jìn)。經(jīng)驗(yàn)表明,通過(guò)搜索多個(gè)基本塊可以找到的獨(dú)立指令比起通過(guò)只在單個(gè)基本塊內(nèi)搜索可以找到的更多。然而,同時(shí)執(zhí)行來(lái)自多個(gè)基本塊的指令需要推測(cè)。
識(shí)別和調(diào)度獨(dú)立的指令,以及由此提高性能,是編譯器和處理器的主要任務(wù)之一。編譯器和處理器設(shè)計(jì)的趨勢(shì)是在每次連續(xù)地生成時(shí)增加對(duì)于獨(dú)立指令的搜索范圍。在現(xiàn)有技術(shù)指令組中,可能產(chǎn)生異常的指令不能被編譯器推測(cè),因?yàn)槿绻噶钤斐僧惓?,則程序可呈現(xiàn)錯(cuò)誤的行為。這限制編譯器對(duì)于獨(dú)立的指令的搜索的有用的范圍和使得必須由處理器在程序運(yùn)行時(shí)間通過(guò)動(dòng)態(tài)推測(cè)進(jìn)行推測(cè)。然而,動(dòng)態(tài)推測(cè)引起很大的硬件復(fù)雜性,它隨其上施加動(dòng)態(tài)推測(cè)的基本塊的數(shù)目指數(shù)地增加-這在動(dòng)態(tài)推測(cè)的范圍上設(shè)置了實(shí)際的限制。相反,編譯器可以搜索獨(dú)立的指令的范圍大得多,-潛在地為整個(gè)程序。而且,一旦編譯器被設(shè)計(jì)來(lái)對(duì)單個(gè)基本塊邊界進(jìn)行靜態(tài)推測(cè),由靜態(tài)推測(cè)幾個(gè)基本塊邊界,就導(dǎo)致非常小的復(fù)雜性。
在計(jì)算機(jī)系統(tǒng)中需要一種通過(guò)使能并行執(zhí)行盡可能多的獨(dú)立的指令而達(dá)到更高的性能的機(jī)制。這即使在第二指令以及取決于該指令的計(jì)算,有可能作用在取決于第一指令的執(zhí)行的數(shù)據(jù)時(shí),也是希望的。
許多計(jì)算機(jī)系統(tǒng)實(shí)行軟件控制的寄存器重命名。當(dāng)調(diào)用程序過(guò)程調(diào)用被調(diào)用程序過(guò)程時(shí),調(diào)用程序過(guò)程的本地寄存器被自動(dòng)地保存。調(diào)用程序過(guò)程典型地只提供被調(diào)用程序過(guò)程以包含輸入?yún)⒘康募拇嫫?。如果被調(diào)用程序過(guò)程需要它自己的寄存器,則被調(diào)用程序過(guò)程分配更多的寄存器。在返回到調(diào)用程序過(guò)程時(shí),調(diào)用程序過(guò)程的本地寄存器被自動(dòng)地恢復(fù)。
軟件控制的寄存器重命名典型地是在大的物理寄存器庫(kù)上進(jìn)行的。在調(diào)用時(shí),重命名基本指針(即,幀的底部)被加上調(diào)用程序過(guò)程的本地寄存器的數(shù)目。在返回時(shí),重命名基本指針被減去調(diào)用程序過(guò)程的本地寄存器的數(shù)目。
當(dāng)進(jìn)行一系列調(diào)用,和可提供的寄存器的數(shù)目用完時(shí),軟件控制的寄存器重命名只環(huán)繞(wrap around)物理寄存器的底部進(jìn)行處理。當(dāng)請(qǐng)求的物理寄存器比可提供的寄存器多時(shí),寄存器值被溢出到存儲(chǔ)器。這樣,寄存器的軟件可看見(jiàn)的幀被變換到物理寄存器。物理寄存器被概念性地安排在圓圈上,以及當(dāng)執(zhí)行調(diào)用時(shí),寄存器的軟件可看見(jiàn)的幀圍繞物理寄存器的概念性的圓周前進(jìn)。
在計(jì)算機(jī)系統(tǒng)中需要一種機(jī)制,它使得即使在第二指令以及取決于該指令的計(jì)算,有可能作用在取決于第一指令的執(zhí)行的數(shù)據(jù)時(shí),也并行執(zhí)行的獨(dú)立指令的數(shù)目最大化。另外,希望這樣的機(jī)制是與上述的軟件控制的寄存器重命名機(jī)制完全地和有效地兼容的。
本發(fā)明提供一種包括存儲(chǔ)編譯器的存儲(chǔ)器的方法和計(jì)算機(jī)系統(tǒng)。編譯的程序包括存儲(chǔ)指令、被調(diào)度在存儲(chǔ)指令前面的裝載指令、和檢驗(yàn)指令。處理器執(zhí)行編譯器。物理寄存器保存用于編譯的程序的數(shù)據(jù)。一部分物理寄存器形成寄存器堆棧,當(dāng)充滿時(shí)進(jìn)行環(huán)繞式處理。N比特當(dāng)前環(huán)繞處理計(jì)數(shù)狀態(tài),跟蹤導(dǎo)致寄存器堆棧環(huán)繞處理或不環(huán)繞處理的物理寄存器再映射事件。提前裝載地址表(ALAT)具有相應(yīng)于裝載指令的項(xiàng)目,每個(gè)項(xiàng)目具有至少一個(gè)存儲(chǔ)器范圍區(qū),規(guī)定由相應(yīng)的裝載指令存取的存儲(chǔ)器單元的范圍,物理寄存器數(shù)目區(qū),相應(yīng)于在相應(yīng)的裝載指令中存取的物理寄存器,以及N比特寄存器環(huán)繞處理區(qū),它相應(yīng)于對(duì)于相應(yīng)的裝載指令的N比特的當(dāng)前環(huán)繞處理計(jì)數(shù)狀態(tài)。檢驗(yàn)指令存取ALAT,確定被安排在存儲(chǔ)指令之前的存儲(chǔ)指令和裝載指令是否潛在地存取公共的存儲(chǔ)器單元。
在一個(gè)實(shí)施例中,在執(zhí)行存儲(chǔ)指令以后,相應(yīng)于ALAT中的裝載指令的項(xiàng)目不存在表示公共的存儲(chǔ)器單元可能已被存儲(chǔ)和裝載指令存取。在一個(gè)實(shí)施例中,如果存儲(chǔ)指令和裝載指令存取共同的存儲(chǔ)器單元,則存儲(chǔ)指令的執(zhí)行清除ALAT中的相應(yīng)于裝載指令的項(xiàng)目。在一個(gè)實(shí)施例中,如果存儲(chǔ)指令和裝載指令存取存儲(chǔ)器的公共范圍,則存儲(chǔ)指令的執(zhí)行清除ALAT中的相應(yīng)于裝載指令的項(xiàng)目。
在一個(gè)實(shí)施例中,響應(yīng)使寄存器堆棧環(huán)繞處理的調(diào)用再映射事件N比特當(dāng)前環(huán)繞處理計(jì)數(shù)狀態(tài)被增量。處理器然后搜索ALAT找出在其寄存器環(huán)繞處理區(qū)具有與更新的N比特當(dāng)前環(huán)繞處理計(jì)數(shù)狀態(tài)相匹配的環(huán)繞處理計(jì)數(shù)值的項(xiàng)目,并清除ALAT中的在其寄存器環(huán)繞處理區(qū)具有匹配的環(huán)繞處理計(jì)數(shù)值的所有的項(xiàng)目。同樣地,N比特當(dāng)前環(huán)繞處理計(jì)數(shù)狀態(tài)響應(yīng)使寄存器堆棧不環(huán)繞處理的返回再映射事件被減量,然后處理器搜索ALAT找出在其寄存器環(huán)繞處理區(qū)具有與更新的N比特當(dāng)前環(huán)繞處理計(jì)數(shù)狀態(tài)相匹配的環(huán)繞處理計(jì)數(shù)值的項(xiàng)目,以及清除ALAT中的在其寄存器環(huán)繞處理區(qū)具有匹配的環(huán)繞處理計(jì)數(shù)值的所有的項(xiàng)目。
在一個(gè)實(shí)施例中,N比特寄存器環(huán)繞處理區(qū)增大物理寄存器數(shù)目區(qū),以便形成用于相應(yīng)的裝載指令的擴(kuò)展的物理寄存器數(shù)目。在一個(gè)實(shí)施例中,至少一個(gè)存儲(chǔ)器范圍區(qū)包括存儲(chǔ)器地址區(qū)和存儲(chǔ)器存取大小區(qū)。在一個(gè)實(shí)施例中,ALAT中的每個(gè)項(xiàng)目包括寄存器類型區(qū),表示在裝載指令中存取的物理寄存器的類型,例如,在裝載指令中可存取的物理寄存器的類型可以包括通用存儲(chǔ)器和浮點(diǎn)存儲(chǔ)器。在一個(gè)實(shí)施例中,ALAT中的每個(gè)項(xiàng)目還包括表示該項(xiàng)目是否有效的有效比特區(qū)。
在一個(gè)實(shí)施例中,被編譯的程序包括恢復(fù)代碼,當(dāng)檢驗(yàn)指令確定在程序執(zhí)行期間存儲(chǔ)指令和裝載指令已存取公共存儲(chǔ)器單元時(shí)控制被傳遞給它?;謴?fù)代碼包括用于重新執(zhí)行裝載指令的代碼。
在一個(gè)實(shí)施例中,被編譯的程序包括至少一個(gè)取決于由裝載指令讀出的數(shù)據(jù)的計(jì)算指令,其中該至少一個(gè)計(jì)算指令在存儲(chǔ)指令之前被調(diào)度。在一個(gè)實(shí)施例中,被編譯的程序也包括恢復(fù)代碼,當(dāng)檢驗(yàn)指令確定在程序執(zhí)行期間存儲(chǔ)指令和裝載指令已存取公共存儲(chǔ)器單元時(shí)控制被傳遞給它。恢復(fù)代碼包括用于重新執(zhí)行裝載指令和該至少一個(gè)計(jì)算指令的代碼。
按照本發(fā)明的計(jì)算機(jī)系統(tǒng),通過(guò)允許按照本發(fā)明的ALAT記錄在提前裝載時(shí)使用的物理寄存器數(shù)目而由于ALAT中的項(xiàng)目根據(jù)寄存器地址環(huán)繞處理被無(wú)效,不引起過(guò)大的提前裝載恢復(fù)化費(fèi),有效地組合用于實(shí)施改進(jìn)裝載的ALAT機(jī)制和用寄存器的軟件控制的重命名實(shí)行的寄存器堆棧機(jī)制。


圖1是其上可實(shí)施本發(fā)明的實(shí)施例的通用計(jì)算機(jī)系統(tǒng)的方框圖。
圖2是圖1的通用計(jì)算機(jī)系統(tǒng)的通用寄存器的一個(gè)實(shí)施例的圖。
圖3是圖1的通用計(jì)算機(jī)系統(tǒng)的浮點(diǎn)寄存器的一個(gè)實(shí)施例的圖。
圖4是圖1的通用計(jì)算機(jī)系統(tǒng)的應(yīng)用寄存器文件的一個(gè)實(shí)施例的圖。
圖5是圖1的通用計(jì)算機(jī)系統(tǒng)的當(dāng)前幀標(biāo)志的一個(gè)實(shí)施例的圖。
圖6描繪了原先的代碼序列,包括存儲(chǔ)器存儲(chǔ)指令后面是存儲(chǔ)器裝載指令。
圖7描繪按照本發(fā)明的一個(gè)實(shí)施例的、由通過(guò)使用靜態(tài)數(shù)據(jù)推測(cè)進(jìn)行裝載指令而安排圖6的原先的代碼序列造成的安排的代碼序列。
圖8是按照本發(fā)明的一個(gè)實(shí)施例的、用于把裝載指令和依賴于它的指令提前到存儲(chǔ)指令前面的處理過(guò)程的流程圖。
圖9描繪按照本發(fā)明的一個(gè)實(shí)施例的、用于在運(yùn)行時(shí)間執(zhí)行提前的裝載指令的處理過(guò)程的流程圖。
圖10描繪按照本發(fā)明的一個(gè)實(shí)施例的、提前的裝載地址表的例子。
在以下的優(yōu)選實(shí)施例的詳細(xì)說(shuō)明中,進(jìn)行參考附圖,它形成優(yōu)選實(shí)施例的一部分,以及其中通過(guò)說(shuō)明來(lái)顯示可實(shí)施本發(fā)明的具體的實(shí)施例。應(yīng)當(dāng)看到,可以利用其它實(shí)施例,以及可以作出結(jié)構(gòu)的和邏輯的改變,而不背離本發(fā)明的范圍。所以,以下的詳細(xì)說(shuō)明不是在限制的意義上給出的,以及本發(fā)明的范圍由附屬權(quán)利要求規(guī)定。
本發(fā)明的一個(gè)實(shí)施例是一種提前裝載地址表(ALAT)用于記錄存儲(chǔ)器地址和寄存器目標(biāo)以不按次序地提前的裝載指令以達(dá)到改進(jìn)性能。按照本發(fā)明的ALAT有效地與軟件控制的寄存器重命名交互,允許ALAT記錄物理寄存器數(shù)目,并通過(guò)根據(jù)被環(huán)繞處理的寄存器地址無(wú)效在按照本發(fā)明的ALAT中的項(xiàng)目,而不引起過(guò)大的提前裝載恢復(fù)的花費(fèi)。本發(fā)明的這些方面可被使用于任何類型的計(jì)算機(jī)系統(tǒng)。這樣的計(jì)算機(jī)系統(tǒng)的一個(gè)例子是圖1所示的通用計(jì)算機(jī)系統(tǒng)50。通用計(jì)算機(jī)系統(tǒng)50包括處理器50、輸入裝置54、輸出裝置56、和存儲(chǔ)器58,它們通過(guò)總線60被連接在一起。存儲(chǔ)器58包括主存儲(chǔ)器62(即,快速易失性存儲(chǔ)器,諸如動(dòng)態(tài)半導(dǎo)體存儲(chǔ)器)和輔助存儲(chǔ)器64(即,非易失性存儲(chǔ)器,諸如閃存儲(chǔ)器和磁盤(pán))。存儲(chǔ)器58存儲(chǔ)在處理器52上執(zhí)行的一個(gè)或多個(gè)程序66。操作系統(tǒng)(OS)68被存儲(chǔ)在存儲(chǔ)器58中,以及控制處理器52和存儲(chǔ)器58,用來(lái)系統(tǒng)操作和用來(lái)執(zhí)行被存儲(chǔ)在存儲(chǔ)器58中的程序66。
程序66在被處理器52執(zhí)行時(shí)控制通用計(jì)算機(jī)系統(tǒng)50。程序可以包括編譯器,其功能在下面結(jié)合圖8進(jìn)行描述。
處理器52包括應(yīng)用寄存器組70和系統(tǒng)寄存器組72。計(jì)算機(jī)系統(tǒng)50的體系結(jié)構(gòu)狀態(tài)由應(yīng)用寄存器組70、系統(tǒng)寄存器組72和存儲(chǔ)器58來(lái)表示。應(yīng)用寄存器組70包括可應(yīng)用于被存儲(chǔ)器存儲(chǔ)器58的應(yīng)用程序的寄存器。系統(tǒng)寄存器組72提供系統(tǒng)寄存器資源,用于處理過(guò)程控制,中斷操縱,保護(hù),診斷,性能監(jiān)視等等。系統(tǒng)寄存器組72通常只對(duì)于操作系統(tǒng)68是可看見(jiàn)的。
在一個(gè)實(shí)施例中,應(yīng)用寄存器組70具體地包括通用寄存器74,浮點(diǎn)(FP)寄存器76,當(dāng)前幀標(biāo)記(CFM)78,和應(yīng)用寄存器文件80??杀话ㄔ趹?yīng)用寄存器組70中的、其它例子的寄存器包括比較結(jié)果寄存器,轉(zhuǎn)移信息寄存器,指令指針,進(jìn)程標(biāo)識(shí)符,和用戶標(biāo)記。
可被包括在系統(tǒng)寄存器組72中的舉例的寄存器包括區(qū)域寄存器,保護(hù)密鑰寄存器,診斷中斷點(diǎn)寄存器,機(jī)器特定的寄存器,處理器狀態(tài)寄存器,轉(zhuǎn)換表后備緩存器(TLB),和控制寄存器。
圖2上總的顯示通用寄存器74的一個(gè)實(shí)施例。在一個(gè)實(shí)施例中,通用寄存器74提供中心資源,用于整數(shù)和整數(shù)多媒體計(jì)算。通用寄存器74被分成靜態(tài)通用寄存器82,包括通用寄存器GRO到GRm,和堆棧通用寄存器84,包括通用寄存器GRm+1到GRn。靜態(tài)通用寄存器82典型地對(duì)于所有過(guò)程是可見(jiàn)的。堆棧通用寄存器84典型地對(duì)每個(gè)過(guò)程是本地的,以及在大小上可以是從零變化到(n-m)個(gè)通用寄存器。計(jì)算機(jī)系統(tǒng)50中的寄存器堆棧機(jī)制通過(guò)對(duì)地址的軟件控制的寄存器重命名而被實(shí)施為程序過(guò)程調(diào)用和返回的副作用。否則寄存器堆棧機(jī)制對(duì)于應(yīng)用程序是看不見(jiàn)的。靜態(tài)通用寄存器82必須按照軟件慣例在程序過(guò)程邊界被保存和被恢復(fù)。堆棧通用寄存器84由寄存器堆棧機(jī)自動(dòng)保存和恢復(fù),而沒(méi)有明顯的軟件干預(yù)。在一個(gè)實(shí)施例中,堆棧通用寄存器84的一部分可被編程地重命名,以便加速循環(huán)。
圖3上總的顯示了浮點(diǎn)寄存器76的一個(gè)實(shí)施例。浮點(diǎn)寄存器76被用于浮點(diǎn)計(jì)算。浮點(diǎn)寄存器76被分成靜態(tài)浮點(diǎn)寄存器86,包括浮點(diǎn)寄存器FPO到FPm和旋轉(zhuǎn)浮點(diǎn)寄存器88,包括FPm+1到FPn。在一個(gè)實(shí)施例中,靜態(tài)浮點(diǎn)寄存器86包括浮點(diǎn)和多媒體寄存器。在一個(gè)實(shí)施例中,旋轉(zhuǎn)浮點(diǎn)通用寄存器88可被編程地重命名,以便加速循環(huán)。
圖4上總的顯示了應(yīng)用寄存器文件80的一個(gè)實(shí)施例。應(yīng)用寄存器文件80包括特定用途的數(shù)據(jù)寄存器和控制寄存器,用于對(duì)于應(yīng)用指令的應(yīng)用可看見(jiàn)的處理器功能。應(yīng)用寄存器文件80具體地包括以前功能狀態(tài)(PFS)寄存器90,具有多個(gè)區(qū),表示在調(diào)用指令下在CFM78自動(dòng)地復(fù)制的數(shù)值,以便加速程序調(diào)用。例如,調(diào)用指令的執(zhí)行包括存儲(chǔ)返回堆棧和其它狀態(tài)信息,諸如存儲(chǔ)CFM 79的當(dāng)前幀標(biāo)記在PFS寄存器90的以前幀標(biāo)記區(qū)(PFS.pfm)92中。
堆棧通用寄存器84通過(guò)分配寄存器堆棧幀包括堆棧通用寄存器84的本地的和輸出的寄存器的可編程的數(shù)目,而對(duì)于存儲(chǔ)器中的程序可用的,這些寄存器對(duì)于更多的程序過(guò)程是可看見(jiàn)的。每個(gè)寄存器堆棧幀與一個(gè)幀標(biāo)記相聯(lián)系。幀標(biāo)記描述堆棧通用寄存器84的狀態(tài)。CFM 78在當(dāng)前工作程序過(guò)程內(nèi)保持當(dāng)前寄存器堆棧幀的狀態(tài)。
幀標(biāo)記包含寄存器堆棧幀的各個(gè)部分的大小和在寄存器旋轉(zhuǎn)時(shí)使用的寄存器重命名的基值。圖5上顯示CFM 78的幀標(biāo)記格式。在圖5所示的實(shí)施例中,幀標(biāo)記格式包括堆棧幀區(qū)(CFM.sof)100的大小,堆棧幀區(qū)的本地部分(CFM.sol)102的大小,堆棧幀區(qū)的旋轉(zhuǎn)部分(CFM.sor)104的大小,用于通用寄存器區(qū)的寄存器重命名基數(shù)(CFM.rrb.gr)106;用于浮點(diǎn)寄存器區(qū)的寄存器重命名基數(shù)(CFM.rrb.fr)108;和用于比較結(jié)果寄存器區(qū)的寄存器重命名基數(shù)(CFM.rrb.cr)110。
在調(diào)用時(shí),CFM 78中的當(dāng)前幀標(biāo)記作為以前的幀標(biāo)記被保存在PFS.pfm區(qū)92。在調(diào)用時(shí),新的數(shù)值被寫(xiě)到CFM 78中,產(chǎn)生新的寄存器堆棧幀,不用本地或旋轉(zhuǎn)寄存器,而是用一組輸出寄存器,它們是調(diào)用者的過(guò)程的輸出寄存器。另外,在調(diào)用時(shí),寄存器重命名基數(shù)區(qū)106,108,和110被設(shè)置為零。在返回時(shí),CFM 78用PFS.pfm區(qū)92中的以前的幀標(biāo)記被恢復(fù)。
用于把堆棧通用寄存器84做成對(duì)于當(dāng)前工作的程序過(guò)程是可用的計(jì)算機(jī)系統(tǒng)的寄存器堆棧機(jī)制的運(yùn)行具體如下。寄存器堆棧幀的被分成兩個(gè)可變大小的區(qū)域,包括本地區(qū)域和輸出區(qū)域。緊接在調(diào)用以后,新的激活的寄存器堆棧幀的本地區(qū)域的大小是零和新的激活的寄存器堆棧幀的輸出區(qū)域的大小等于調(diào)用者過(guò)程的輸出區(qū)域的大小,以及它重疊到調(diào)用者過(guò)程的輸出區(qū)域。在一個(gè)實(shí)施例中,特定的分配指令被用來(lái)通過(guò)指定被用來(lái)確定CFM.sof區(qū)100的幀值的大小和CFM.sol區(qū)102的堆棧幀值本地部分的大小的立即值,而動(dòng)態(tài)地重新定出當(dāng)前寄存器堆棧幀的本地和輸出區(qū)域的大小。CFM.sof區(qū)100的值指定對(duì)于當(dāng)前的程序過(guò)程可見(jiàn)的整個(gè)寄存器堆棧幀的大小。CFM.sol區(qū)102的值指定當(dāng)前的寄存器堆棧幀的本地區(qū)域的大小。當(dāng)前寄存器堆棧幀的輸出區(qū)域的大小由在CFM.sof區(qū)100的值與CFM.sol區(qū)102的值之間的值確定。在一個(gè)實(shí)施例中,讀出在當(dāng)前的寄存器堆棧幀外面的堆棧寄存器,返回一個(gè)未規(guī)定的結(jié)果,以及寫(xiě)入在當(dāng)前的寄存器堆棧幀外面的堆棧寄存器,造成非法操作故障。
當(dāng)執(zhí)行一個(gè)調(diào)用時(shí),在CFM 78中的當(dāng)前幀標(biāo)記的拷貝作為先前的幀標(biāo)記被保存在PFS.pfm區(qū)92中,以及被調(diào)用者的過(guò)程的寄存器堆棧幀如下地被產(chǎn)生。堆棧的通用寄存器84被重命名,以使得在調(diào)用者過(guò)程的輸出區(qū)域中的第一寄存器對(duì)于被調(diào)用者過(guò)程變成為GRm+1。本地區(qū)域的大小對(duì)于被調(diào)用者過(guò)程被設(shè)置為零。被調(diào)用者的過(guò)程的寄存器堆棧幀的大小,正如更新的CFM.sof區(qū)100表示的,被設(shè)置為調(diào)用指令以前的調(diào)用者的過(guò)程的輸出區(qū)域的大小(即調(diào)用者CFM.sof-調(diào)用者CFM.sol)。
在一個(gè)實(shí)施例中,在調(diào)用者過(guò)程的寄存器堆棧幀的輸出區(qū)域中的數(shù)值對(duì)于被調(diào)用者過(guò)程是可見(jiàn)的,它允許在過(guò)程之間傳送的參量與返回值全部在寄存器中發(fā)生。在一個(gè)實(shí)施例中,通過(guò)發(fā)出特定的分配指令,過(guò)程寄存器堆棧幀被動(dòng)態(tài)地重新定大小,它不造成寄存器重命名,但確實(shí)改變寄存器堆棧幀的大小和在寄存器堆棧幀的本地與輸出區(qū)域之間的劃分。當(dāng)執(zhí)行返回指令時(shí),CFM 78用PFS.pfm區(qū)92中的以前的幀標(biāo)記被恢復(fù),以及寄存器重命名被恢復(fù)到調(diào)用者過(guò)程的配置。
應(yīng)當(dāng)理解,圖1的上述的計(jì)算機(jī)系統(tǒng)50僅僅被提供用于說(shuō)明的目的,以及下面描述的本發(fā)明的實(shí)施例可以在各種其它類型和配置的計(jì)算機(jī)系統(tǒng)上實(shí)施。
在一個(gè)實(shí)施例中,計(jì)算機(jī)系統(tǒng)50可從執(zhí)行統(tǒng)計(jì)推測(cè)的指令期間遇到的問(wèn)題中恢復(fù)。計(jì)算機(jī)系統(tǒng)50的一個(gè)實(shí)施例可以執(zhí)行已由編譯器調(diào)度為推測(cè)地執(zhí)行的指令段,驗(yàn)證被推測(cè)地執(zhí)行的指令的執(zhí)行的整體性,以及執(zhí)行糾正問(wèn)題的恢復(fù)代碼,如果檢測(cè)到任何問(wèn)題的話。
指令可被分成兩種類別推測(cè)的和非推測(cè)的。在編譯開(kāi)始時(shí),所有的指令都被初始化為非推測(cè)的。在調(diào)度過(guò)程期間,當(dāng)編譯器調(diào)度在指令的始發(fā)的基本塊外面的指令時(shí),編譯器把該指令標(biāo)記為推測(cè)的。遇到異常條件的非推測(cè)的指令產(chǎn)生一個(gè)異常。遇到異常條件的推測(cè)的指令不產(chǎn)生一個(gè)異常,而是把“延緩的異常標(biāo)記”(DET)寫(xiě)入到它們的目的地。異常條件的存在阻止特定的計(jì)算指令用專門(mén)的操作碼完成,所以,指令的目的地包括DET,而不是正確的結(jié)果。讀DET的非推測(cè)指令把另一個(gè)DET寫(xiě)入到指令的目的地(再次指出,目的地不包含正確的結(jié)果)-這種行為被稱為“傳播”。通過(guò)把非推測(cè)指令放置到特定的推測(cè)指令的始發(fā)的基本塊,和通過(guò)配置非推測(cè)指令來(lái)讀出推測(cè)指令的目的地(或DET可被傳播到的任何位置),由推測(cè)指令產(chǎn)生的DET可以在其中控制被傳送到原先的基本塊的地點(diǎn)被檢測(cè)出。在這個(gè)地點(diǎn),必須重新創(chuàng)建導(dǎo)致DET的原先創(chuàng)建的異常條件,以及用正確的結(jié)果代替所有的先前傳播的DET。這是通過(guò)被稱為“恢復(fù)”的處理過(guò)程完成的?;謴?fù)可能涉及用由編譯器生成的附加的代碼擴(kuò)大程序;該代碼是具有非推測(cè)形式的依賴的推測(cè)指令組的拷貝,這樣,在執(zhí)行后,所有的異常條件產(chǎn)生異常,以及所有的先前被寫(xiě)入的目的地用正確的結(jié)果進(jìn)行改寫(xiě)?;謴?fù)代碼不一定是指令序列的精確的拷貝,但可以是在執(zhí)行時(shí)達(dá)到同一個(gè)結(jié)果的的代碼。而且,在一個(gè)實(shí)施例中,新的指令被規(guī)定為具有特定的目的檢驗(yàn)DCT的存在和在檢測(cè)到DET的情況下激活相關(guān)的恢復(fù)的代碼。
以上討論的實(shí)施例不取決于DET的精確的形式。另外,用于規(guī)定推測(cè)和非推測(cè)指令的替換的實(shí)施例是可能的。例如,某些指令可被規(guī)定為在推斷上與指令是否被調(diào)度在它們的始發(fā)的基本塊以外是無(wú)關(guān)的。
直到現(xiàn)在所述的推測(cè)被稱為“控制推測(cè)”,因?yàn)橹噶钤诳刂苽魉偷剿鼈円郧氨粓?zhí)行。推測(cè)可以導(dǎo)取除了控制推測(cè)以外的其它形式。其中的一個(gè)例子是“數(shù)據(jù)推測(cè)”,由此,按照本發(fā)明的機(jī)制被規(guī)定為允許指令A(yù)(它可能依賴于指令B)在指令B以前執(zhí)行。雖然數(shù)據(jù)推測(cè)可被應(yīng)用到任何種類的指令,但下面討論裝載和存儲(chǔ),來(lái)說(shuō)明按照本發(fā)明的數(shù)據(jù)推測(cè)。在存儲(chǔ)下面的裝載通常不能被調(diào)度在存儲(chǔ)的上面,除非可以證明從裝載讀出的地址決不等于由存儲(chǔ)寫(xiě)入的地址。如果地址相等,則裝載應(yīng)當(dāng)接收存儲(chǔ)的結(jié)果。然而,如果能夠證明從裝載讀出的地址決不等于由存儲(chǔ)寫(xiě)入的地址,則裝載可被安全地調(diào)度在存儲(chǔ)的上面。當(dāng)編譯器調(diào)度裝載在存儲(chǔ)的上面時(shí)當(dāng)不能證明由二者訪問(wèn)的地址將決不相等時(shí),出現(xiàn)數(shù)據(jù)推測(cè)。當(dāng)由二者存取的地址被確定為在運(yùn)行時(shí)間時(shí)相等時(shí),被稱為沖突的錯(cuò)誤條件出現(xiàn)。在沖突的情況下,恢復(fù)機(jī)制可被利用來(lái)校正任何錯(cuò)誤地寫(xiě)入的目的地。在本發(fā)明的一個(gè)實(shí)施例中,即使編譯器確定在兩個(gè)指令之間有沖突,裝載指令和依賴于它的一個(gè)或多個(gè)指令仍被編譯器安排在存儲(chǔ)指令的上面。
本發(fā)明的一個(gè)方面涉及到用于不按次序地提前指令的方法和設(shè)備。這包括調(diào)度第二指令(例如,裝載指令),以及可能地,要在第一指令(例如,存儲(chǔ)指令)之前執(zhí)行的、依賴于它的整個(gè)計(jì)算,它們可能產(chǎn)生被稱為沖突的錯(cuò)誤條件,由于第一和第二指令存取一部分存儲(chǔ)器中的同一個(gè)地址。
為實(shí)施本發(fā)明的某些方面,計(jì)算機(jī)結(jié)構(gòu)體系可被規(guī)定為允許編譯器調(diào)度在它們的始發(fā)的基本塊外面的指令(控制推測(cè)),以及調(diào)度并行執(zhí)行指令,它們可以潛在地存取同一個(gè)存儲(chǔ)器單元(數(shù)據(jù)推測(cè)),所以,是潛在地依賴的。這樣的計(jì)算機(jī)結(jié)構(gòu)體系的一個(gè)例子,在Ross等的、題目為“Computer Architecture for the Deferral ofExceptions on Speculative Instructions(用于延緩?fù)茰y(cè)指令的異常的計(jì)算機(jī)結(jié)構(gòu)體系)”的、美國(guó)專利No.5,915,117中描述,該專利在此引用,以供參考。雖然下面參照這個(gè)結(jié)構(gòu)體系描述了本發(fā)明的這個(gè)方面,但本發(fā)明并不限于使用這種結(jié)構(gòu),以及可以通過(guò)使用其它結(jié)構(gòu)體系特性來(lái)實(shí)現(xiàn),正如下面更詳細(xì)地描述的。
這種新的結(jié)構(gòu)體系規(guī)定一組“推測(cè)性”指令,它們?cè)诔霈F(xiàn)異常條件時(shí)不立即通知一個(gè)異常。而是,通過(guò)把“延緩的異常標(biāo)記”(DET)寫(xiě)入到由指令規(guī)定的目的地,推測(cè)性指令延緩一個(gè)異常。指令組也包含“非推測(cè)性指令”,它們?cè)诔霈F(xiàn)異常條件時(shí)立即通知一個(gè)異常,正如傳統(tǒng)的指令所共有的。
指令異常在限本領(lǐng)域是熟知的,它們包括,但不限于,諸如頁(yè)故障、非法操作數(shù)、特權(quán)違反、被除以零的運(yùn)算、溢出等異常。新的結(jié)構(gòu)體系也提供新的存儲(chǔ)器推測(cè)類型,其中在由編程器規(guī)定的邏輯次序上跟隨在存儲(chǔ)指令后面的裝載指令,根據(jù)這兩個(gè)指令將不存取同一個(gè)存儲(chǔ)器單元的推測(cè),可以在存儲(chǔ)指令以前被執(zhí)行。在本發(fā)明的一個(gè)實(shí)施例中,存儲(chǔ)器推測(cè)檢驗(yàn)存取先進(jìn)裝載地址表(ALAT),諸如在處理器52中的ALAT 98,它包含最新推測(cè)的存儲(chǔ)器存取的記錄,以便確定推測(cè)是否正確。如果推測(cè)正確,則指令被正常地執(zhí)行。如果不正確,則裝載指令以及依賴于裝載的、和被調(diào)度在存儲(chǔ)后面的、任何指令被再次地執(zhí)行,以便檢索由存儲(chǔ)的指令寫(xiě)入的內(nèi)容。
通過(guò)使用被標(biāo)記為推測(cè)性的指令,編譯器可以調(diào)度在它們始發(fā)的基本塊以外的指令,以及可以調(diào)度可能的依賴的存儲(chǔ)器并行存取。如上所述,當(dāng)推測(cè)指令產(chǎn)生一個(gè)異常時(shí),可以把“延緩的異常標(biāo)記”(DET)寫(xiě)入到由指令規(guī)定的目的地。任何檢測(cè)到在任何的源中的DET的推測(cè)性指令復(fù)制該DET到它的目的地。應(yīng)當(dāng)指出,當(dāng)推測(cè)性指令在一個(gè)源中發(fā)現(xiàn)一個(gè)DET時(shí),它不需要執(zhí)行與指令有關(guān)的功能。指令可以只復(fù)制DET到目的地。這樣,DET傳播到推測(cè)性指令塊。因此,在一個(gè)實(shí)施例中,包括計(jì)算結(jié)果的目的地可以被檢驗(yàn)找出DET,而不用檢驗(yàn)在計(jì)算時(shí)所使用的每個(gè)操作數(shù)。
在一個(gè)源中檢測(cè)到DET的任何非推測(cè)性指令可以產(chǎn)生一個(gè)立即的異常。因此,DET以數(shù)據(jù)流的方式傳播到推測(cè)性指令,直至(和如果)它們到達(dá)非推測(cè)性指令為止。
如果程序在運(yùn)行時(shí)間確定據(jù)以執(zhí)行指令的推測(cè)是不正確的(例如,被錯(cuò)誤地預(yù)計(jì)的分支),則程序可僅僅忽略該DET,因?yàn)樵揇ET不會(huì)被程序存取。然而,如果推測(cè)是正確的,則如果,和當(dāng),產(chǎn)生DET的指令的、始發(fā)的基本塊被執(zhí)行時(shí),DET被變換成真實(shí)的異常。在一個(gè)實(shí)施例中,這種變換是由被稱為“推測(cè)檢驗(yàn)”指令(或簡(jiǎn)稱為“chk.s”)的指令執(zhí)行的。chk.s指令讀一個(gè)源,以及如果該源包含一個(gè)DET,則轉(zhuǎn)移到特定的目標(biāo)地址,實(shí)施恢復(fù)代碼。同樣地,在本發(fā)明的一個(gè)實(shí)施例中,存儲(chǔ)器推測(cè)的正確性可以由被稱為“在前檢驗(yàn)”指令(被稱為“chk.a”指令)確定。chk.a確定存儲(chǔ)器單元是否在按順序地被存取,以及如果是的話,則chk.a指令轉(zhuǎn)移到特定的目標(biāo)地址,實(shí)施恢復(fù)代碼。下面將更詳細(xì)地討論chk.a指令。chk.s和chk.a,每個(gè)可以以多種方式來(lái)實(shí)施,這導(dǎo)致被執(zhí)行的指令的流程上的改變。例如,每個(gè)可由條件轉(zhuǎn)移指令實(shí)施。在一個(gè)實(shí)施例中,ch.s指令和/或ch.a指令可由為一個(gè)指令實(shí)施(它產(chǎn)生一個(gè)調(diào)用異常處理程序的異常),諸如蹦床檢驗(yàn)指令,以便通過(guò)蹦床機(jī)制來(lái)實(shí)現(xiàn)控制流改變,諸如在以上引用的、2000年3月8日提交的、題目為“EmulatedBranch Effected by Trampoline Mechanism(通過(guò)蹦床機(jī)制實(shí)現(xiàn)的仿真分支)”的、專利申請(qǐng)序列號(hào)09/521,160中描述的蹦床機(jī)制。
根據(jù)定義,chk.s和chk.a指令總是非推測(cè)性的。通常,如果這些指令檢測(cè)DET或錯(cuò)誤的存儲(chǔ)器推測(cè),則執(zhí)行恢復(fù)代碼,包括違反的指令的非推測(cè)版本。對(duì)于檢測(cè)到DET的chk.s,在執(zhí)行恢復(fù)代碼后,違反的指令的非推測(cè)版本將用正確的結(jié)果代替它的目的地中的DET和/或產(chǎn)生異常。如果任何以后的推測(cè)性指令依賴于違反的指令,則它們也被包括在要被重新執(zhí)行的恢復(fù)代碼中,因?yàn)镈ET被傳播到以后的推測(cè)指令的目的地,所以這些目的地可能包含錯(cuò)誤的結(jié)果。對(duì)于chk.a指令,恢復(fù)代碼必須重新執(zhí)行違反的裝載指令來(lái)從存儲(chǔ)器裝載正確的內(nèi)容。例外,任何依賴于違反的裝載指令的被調(diào)度在裝載所依賴的存儲(chǔ)的上面的指令也被重新執(zhí)行。下面將進(jìn)一步討論依賴于在存儲(chǔ)上面的裝載的數(shù)值的裝載指令和計(jì)算指令的安排。不依賴于違反的指令的任何指令不被重新執(zhí)行,因?yàn)檫@是不必要的和因?yàn)槿绻匦聢?zhí)行的話,其中某些會(huì)不正確地修改程序狀態(tài)。由于編譯器安排推測(cè)指令和推測(cè)檢驗(yàn),編譯器將能夠產(chǎn)生適合于特定的推測(cè)指令組的恢復(fù)代碼。
本發(fā)明的一個(gè)方面可以由具有調(diào)度安排用于推測(cè)執(zhí)行的指令和產(chǎn)生適當(dāng)?shù)幕謴?fù)代碼的編譯器和具有能夠執(zhí)行被標(biāo)記為預(yù)測(cè)性的指令的計(jì)算機(jī)系統(tǒng),諸如實(shí)施上述的結(jié)構(gòu)體系的計(jì)算機(jī)系統(tǒng),來(lái)實(shí)現(xiàn)。
在本發(fā)明的一個(gè)實(shí)施例中,不按次序地被提前到存儲(chǔ)指令之前的裝載指令被使用來(lái)說(shuō)明數(shù)據(jù)推測(cè),以及參照?qǐng)D6-8來(lái)描述這些裝載指令。正如這里使用的,分別參照裝載和存儲(chǔ)指令,表示都和寫(xiě)到存儲(chǔ)器的任何的指令,不管這些指令是否執(zhí)行其它功能。裝載指令典型地比起其它指令,由于存儲(chǔ)器執(zhí)行時(shí)間,需要較長(zhǎng)的執(zhí)行時(shí)間。通過(guò)在執(zhí)行程序時(shí)較早地移動(dòng)裝載指令,提高在計(jì)算機(jī)中執(zhí)行指令的效率。被稱為提前的裝載的這種裝載,允許提高所執(zhí)行的活動(dòng)的并行性,它需要使用存儲(chǔ)器。
正如上面概略地討論的,通常編譯器不能百分之百的確定性檢測(cè)出裝載指令與存儲(chǔ)指令是否將沖突(即,存取共同的存儲(chǔ)器單元)。這給出達(dá)到并行性的障礙,它迫使更保守的指令調(diào)度,以便不重疊裝載執(zhí)行時(shí)間,即,不把裝載移到它可能與之沖突的存儲(chǔ)之前。然而,在這些情況的很大的百分比的情況中,裝載和存儲(chǔ)指令事實(shí)上不沖突。因此,本發(fā)明的一個(gè)實(shí)施例允許裝載指令和依賴于它的計(jì)算在潛在地沖突的存儲(chǔ)指令之前執(zhí)行,作為改進(jìn)單個(gè)或多個(gè)處理器系統(tǒng)中程序執(zhí)行的并行性的一個(gè)方法。
考慮圖6所示的簡(jiǎn)單的原先的代碼30。代碼30包括指令I(lǐng)22,它把寄存器r3的內(nèi)容存儲(chǔ)在由寄存器r1的內(nèi)容變址的存儲(chǔ)器單元;指令I(lǐng)24,它用由寄存器r2的內(nèi)容變址的存儲(chǔ)器單元的內(nèi)容裝載寄存器r4;以及指令I(lǐng)26,它把寄存器r4和r6相加和把結(jié)果寫(xiě)入到寄存器r5。假定當(dāng)編譯器安排代碼30時(shí),它確定當(dāng)指令I(lǐng)22和I24被執(zhí)行時(shí),多半不會(huì)是寄存器r1的內(nèi)容將是與寄存器r2的內(nèi)容相同的,但這不是不可能的。而且,假定編譯器確定,把指令I(lǐng)24和I26安排在指令I(lǐng)22以前(或并行地),是更有效的。對(duì)于安排并行地指令,應(yīng)當(dāng)看到,即使在單個(gè)處理器系統(tǒng)中,單個(gè)處理器將典型地包括多個(gè)執(zhí)行單元,在其上可以并行地執(zhí)行多個(gè)指令。
圖7顯示按照本發(fā)明的一個(gè)實(shí)施例的調(diào)度的代碼40,它們是當(dāng)編譯器安排圖6的原先的代碼30時(shí)被產(chǎn)生的。代碼40包括被安排在指令I(lǐng)22(存儲(chǔ)指令)以前的指令I(lǐng)24和I26。應(yīng)當(dāng)指出,“.a”(表示進(jìn)行的指令)已被附加到裝載指令上,表示這個(gè)裝載指令記錄裝載地址在ALAT 98中。指令I(lǐng)25是chk.a指令,它檢驗(yàn)ALAT 98,確定裝載(I24)和存儲(chǔ)(I22)指令是否存取到同一個(gè)存儲(chǔ)器單元。如果寄存器r1和r2的內(nèi)容不相等,則指令不存取到同一個(gè)存儲(chǔ)器單元,以及chk.a(I22)不采取行動(dòng)。然而,如果寄存器r1和r2的內(nèi)容是相等的,則chk.a指令(I25)檢測(cè)數(shù)據(jù)推測(cè)錯(cuò)誤和轉(zhuǎn)移到在指令I(lǐng)24r開(kāi)始的恢復(fù)代碼。指令I(lǐng)24r重新執(zhí)行裝載指令,造成正確的結(jié)果被裝載到寄存器r4,因?yàn)樵诖鎯?chǔ)指令(I22)以后重新執(zhí)行裝載指令。指令I(lǐng)26r重新執(zhí)行相加指令,它把正確的結(jié)果寫(xiě)入到寄存器r5,以及指令I(lǐng)23r轉(zhuǎn)移到指令I(lǐng)25,它驗(yàn)證沒(méi)有數(shù)據(jù)推測(cè)錯(cuò)誤。
圖8是顯示一個(gè)可被編譯器實(shí)施的、以便產(chǎn)生圖7所示的調(diào)度的代碼改變的、示例性程序的流程圖。這個(gè)流程圖僅僅作為例子被提供,因?yàn)槠渌膶?shí)施方案也是可能的。本發(fā)明并不限于結(jié)合特定的程序語(yǔ)言或計(jì)算機(jī)配置使用,以及可被應(yīng)用到在單個(gè)或多個(gè)處理器系統(tǒng)中使用的編譯器。
圖8的處理從步驟503開(kāi)始,這時(shí),編譯器建立傳統(tǒng)的依賴性圖,代表在還沒(méi)有被編譯器調(diào)度的源計(jì)算機(jī)程序中的指令。本發(fā)明不限于任何特定的類型的圖。依賴性圖可以取幾種形式,包括具有代表一段源計(jì)算機(jī)程序的至少一條路徑和代表這段源計(jì)算機(jī)程序中每個(gè)指令的一個(gè)節(jié)點(diǎn)的圖。用于每個(gè)程序的依賴性圖典型地包括多條路徑,每條路徑帶有多個(gè)節(jié)點(diǎn)。代表一個(gè)指令的節(jié)點(diǎn)可以用與指令有關(guān)的信息進(jìn)行注釋,諸如為執(zhí)行指令所需要的時(shí)鐘周期數(shù)。典型地,圖上的弧線連接的節(jié)點(diǎn)表示指令之間的依賴性。
在步驟506,編譯器檢查該圖,以及確定圖上的哪條路徑包括導(dǎo)致從開(kāi)始到結(jié)束的最長(zhǎng)的總的執(zhí)行時(shí)間的一系列指令。
在步驟509,編譯器試圖使得程序中最長(zhǎng)的路徑的執(zhí)行優(yōu)化,因?yàn)樽铋L(zhǎng)的路徑代表在程序中的、限制指令序列的運(yùn)行時(shí)間的關(guān)鍵部分。傳統(tǒng)的優(yōu)化技術(shù)可被編譯器使用,以及下面描述另一個(gè)優(yōu)化技術(shù),因?yàn)樗鼈兩婕暗教崆暗难b載和它的相關(guān)的計(jì)算。
如上所述,編譯器可以優(yōu)化最長(zhǎng)的關(guān)鍵路徑的一個(gè)方法是通過(guò)數(shù)據(jù)推測(cè)。在本發(fā)明的一個(gè)實(shí)施例中,這可以包括移動(dòng)指令,諸如包括讀操作的裝載指令。在步驟512,編譯器確定裝載指令是否在最長(zhǎng)的關(guān)鍵路徑。如果裝載被包括在最長(zhǎng)的路徑,則編譯器可以提前裝載和依賴于它的指令,作為一個(gè)優(yōu)化的方法,諸如下面進(jìn)一步討論的。
當(dāng)發(fā)現(xiàn)裝載指令在被縮短的路徑上時(shí),編譯器在步驟521接著確定,哪些計(jì)算指令依賴于由裝載指令讀出的數(shù)據(jù)。計(jì)算是依賴的,如果它們需要使用從完成裝載指令得出的數(shù)值。
在步驟524,裝載指令從調(diào)度的指令序列中它的位置被去除。在步驟527,依賴于裝載的計(jì)算(在步驟521中標(biāo)識(shí)的)被提前到跟隨在裝載指令后面,這樣,裝載指令和依賴于裝載指令的計(jì)算被提前,允許指令序列的優(yōu)化。編譯器把被標(biāo)記為“1d.a”的裝載指令提前到其中它的執(zhí)行可以導(dǎo)致程序的總的改進(jìn)的性能的存儲(chǔ)單元之前。
正如上面討論的,存儲(chǔ)指令可能存在于在依賴性圖的路徑上在裝載指令“l(fā)d.a”之前,以及編譯器可能不能夠確定足夠裝載和存儲(chǔ)是否沖突(即,使用同一個(gè)存儲(chǔ)器單元)。在步驟530,編譯器確定是否有裝載與存儲(chǔ)不沖突的絕對(duì)肯定性。
當(dāng)它不能確定裝載與它移動(dòng)到其前面的存儲(chǔ)將不沖突的肯定性時(shí),則在步驟533,把在步驟524被去除的裝載指令用檢驗(yàn)指令代替,諸如以上結(jié)合圖6和7描述的chk.a指令。chk.a指令代替裝載指令,以及如果它沒(méi)有被提前,則它在原先安排裝載的地方被執(zhí)行。
在步驟536,編譯器產(chǎn)生恢復(fù)代碼,用于在步驟527進(jìn)行提前的裝載和依賴于提前裝載的計(jì)算?;謴?fù)代碼將被chk.a指令調(diào)用,如果必要的話,諸如下面描述的。
當(dāng)裝載指令在步驟512在最長(zhǎng)的關(guān)鍵路徑中被找到時(shí),或當(dāng)在步驟530確定編譯器絕對(duì)肯定,裝載指令沒(méi)有被提前到將與其沖突的存儲(chǔ)指令以前(這樣,不需要檢驗(yàn)指令或恢復(fù)代碼),或在步驟536生成恢復(fù)代碼以后,則處理過(guò)程在步驟539繼續(xù)進(jìn)行,其中編譯器確定是否有可被潛在地優(yōu)化的最長(zhǎng)的關(guān)鍵路徑留下。編譯器可以在程序中優(yōu)化每個(gè)下一個(gè)最長(zhǎng)的路徑,直至編譯器盡可能多地優(yōu)化源程序,由此,改進(jìn)了執(zhí)行源程序的并行性。
當(dāng)在步驟539,確定編譯器不能進(jìn)一步優(yōu)化時(shí),程序過(guò)程進(jìn)到步驟542,其中編譯器安排用于執(zhí)行優(yōu)化指令序列。然而,當(dāng)編譯器在步驟539確定留下有可被潛在地優(yōu)化的最長(zhǎng)的關(guān)鍵路徑時(shí),編譯器在步驟506識(shí)別下一個(gè)最長(zhǎng)的路徑。這樣,處理過(guò)程繼續(xù)進(jìn)行,直至圖上可被優(yōu)化的所有的路徑被優(yōu)化為止。
在步驟542,編譯器調(diào)度反映執(zhí)行次序的任何改變的指令的執(zhí)行,正如由上述的優(yōu)化程序過(guò)程所實(shí)行的。編譯器可以以多種方式,潛在地利用并行執(zhí)行單元,來(lái)安排程序中指令的執(zhí)行,以及本發(fā)明并不限于任何特定的調(diào)度機(jī)制。對(duì)于上面在圖6中描述的例子,結(jié)果的優(yōu)化代碼顯示于圖7,恢復(fù)代碼被表示為指令I(lǐng)24,I26,和I23r。
圖9是顯示當(dāng)執(zhí)行通過(guò)技術(shù)(諸如上面結(jié)合圖8描述的技術(shù),包括不按次序地提前裝載指令和依賴的計(jì)算到存儲(chǔ)之前)被優(yōu)化的指令序列時(shí),由計(jì)算機(jī)系統(tǒng),諸如計(jì)算機(jī)系統(tǒng)50,執(zhí)行的程序的流程圖。調(diào)度的指令序列的執(zhí)行在步驟603開(kāi)始。在指令序列執(zhí)行期間,在步驟606,執(zhí)行提前的裝載(例如,圖7上的ld.a)。在提前的裝載指令被執(zhí)行以后,在步驟609,ALAT 98被更新來(lái)記錄由提前的裝載指令讀出的存儲(chǔ)器單元的范圍(例如,在r2中的地址)。在ALAT 98中做出一個(gè)項(xiàng)目,以便允許后面執(zhí)行的存儲(chǔ)指令,諸如步驟618中執(zhí)行的存儲(chǔ)指令,確定提前的裝載和存儲(chǔ)指令是否已存取共同的存儲(chǔ)器單元。ALAT 98可以用處理器52中的任何適當(dāng)?shù)慕Y(jié)構(gòu)或與處理器52相聯(lián)系地來(lái)實(shí)施,以便允許將特定的提前的裝載和它的相應(yīng)的存儲(chǔ)指令的存儲(chǔ)器地址的范圍進(jìn)行比較。
圖10上顯示按照本發(fā)明的ALAT 98的一個(gè)實(shí)施例。ALAT中的一個(gè)項(xiàng)目包括物理存儲(chǔ)器地址區(qū)112和存儲(chǔ)器存取大小區(qū)114,它們合在一起規(guī)定所存取的存儲(chǔ)器單元的范圍。本發(fā)明并不限于這種規(guī)定存儲(chǔ)器單元的范圍的方法,因?yàn)榭梢圆捎迷S多其它技術(shù)。例如,所存取的存儲(chǔ)器范圍可以通過(guò)起始的和結(jié)束的存儲(chǔ)器地址,或通過(guò)存儲(chǔ)器結(jié)束地址和范圍來(lái)規(guī)定。在圖10所示的實(shí)施例中,ALAT 98也包括有效比特區(qū)116,它被使用來(lái)表示項(xiàng)目是否有效。正如下面討論的,在本發(fā)明的一個(gè)實(shí)施例中,有很多次想要無(wú)效ALAT 98中的項(xiàng)目(例如,在兩個(gè)應(yīng)用項(xiàng)之間前后關(guān)系切換)。有效比特區(qū)116給出用于執(zhí)行這樣的無(wú)效的方便的機(jī)制。
在本發(fā)明的一個(gè)實(shí)施例中,同時(shí)有多個(gè)裝載,每個(gè)裝載被提前到相應(yīng)的存儲(chǔ)之前。正如項(xiàng)目討論的,在程序執(zhí)行期間,提供一種用于驗(yàn)證在每對(duì)裝載和存儲(chǔ)之間不發(fā)生沖突的技術(shù)。這樣,在一個(gè)實(shí)施例中,ALAT 98包括唯一地識(shí)別它相應(yīng)于的、提前的裝載指令的信息,這樣,項(xiàng)目可被標(biāo)識(shí)以確定與相應(yīng)的存儲(chǔ)指令的可能的沖突。這個(gè)唯一的標(biāo)識(shí)可以以任何數(shù)目的方式實(shí)現(xiàn),以及ALAT 98不限于任何特定的實(shí)施方案。在圖10所示的ALAT 98的實(shí)施例中,用于特定的提前的裝載的項(xiàng)目是根據(jù)在提前的裝載指令中所使用的寄存器的物理寄存器號(hào)碼和類型(例如,通用的或浮點(diǎn)的)被變址的。用于每個(gè)指令的物理寄存器號(hào)碼由編譯器分配,它確保獨(dú)特的寄存器被使用于每個(gè)提前的裝載指令。
這樣,圖10所示的ALAT 98的實(shí)施例包括項(xiàng)目,這些項(xiàng)目有物理寄存器號(hào)碼區(qū)118,相應(yīng)于在提前裝載指令中存取的實(shí)際的物理寄存器,和寄存器類型區(qū)120,它表示在提前裝載指令中存取的實(shí)際的物理寄存器是通用的,還是浮點(diǎn)寄存器。另外,用于ALAT 98中每個(gè)項(xiàng)目的物理寄存器號(hào)碼區(qū)118擴(kuò)大到相應(yīng)于在提前裝載指令中使用的N比特當(dāng)前環(huán)繞處理計(jì)數(shù)狀態(tài)99(圖1所示的)的寄存器環(huán)繞處理N比特區(qū)122,以便擴(kuò)展用于提前的裝載指令的物理寄存器號(hào)碼,這允許根據(jù)按照本發(fā)明的環(huán)繞處理的寄存器地址有效地?zé)o效ALAT 98中的項(xiàng)目。在下面詳細(xì)地描述利用當(dāng)前環(huán)繞處理計(jì)數(shù)狀態(tài)99和寄存器環(huán)繞處理區(qū)122用于根據(jù)寄存器環(huán)繞處理來(lái)無(wú)效ALAT項(xiàng)目。
參照?qǐng)D9,當(dāng)在步驟606執(zhí)行提前的裝載時(shí)和在作出ALAT 98中的項(xiàng)目以前,ALAT 98通過(guò)使用目標(biāo)寄存器號(hào)碼作為索引被存取,以及ALAT 98被檢驗(yàn),以便確定是否已存在相應(yīng)于由提前的裝載使用的目標(biāo)寄存器號(hào)碼的項(xiàng)目。如果有一個(gè)項(xiàng)目,則把它去除,因?yàn)樗ㄅc本提前的裝載無(wú)關(guān)的信息,以及多半是在執(zhí)行先前的提前裝載期間輸入的。在具有從先前執(zhí)行的提前裝載得出的數(shù)據(jù)的現(xiàn)有的項(xiàng)目被清除以后,或當(dāng)在ALAT 98中找到相應(yīng)于現(xiàn)在的提前裝載的目標(biāo)寄存器號(hào)碼的空的位置時(shí),做出由目標(biāo)寄存器號(hào)碼為下標(biāo)的新的項(xiàng)目,用于現(xiàn)在的提前的裝載指令。
在提前的裝載被執(zhí)行和ALAT 98被更新以后,在步驟612,執(zhí)行依賴于提前裝載指令(例如,I24,I26)的結(jié)果的計(jì)算指令。在以上討論的例子中,依賴的計(jì)算包括相加指令I(lǐng)26,如圖7所示。任何跟隨在提前裝載指令后面的、以及在存儲(chǔ)指令(該裝載被提前到它的前面)前面的其它指令,在步驟615被執(zhí)行。
在步驟618,裝載被提前到它前面的、以及裝載可能與它發(fā)生沖突的、存儲(chǔ)指令(例如,I22)被執(zhí)行。在圖7所示的例子中,存儲(chǔ)指令I(lǐng)24存取地址r1。在執(zhí)行存儲(chǔ)指令I(lǐng)22時(shí),ALAT 98中所有的有效的項(xiàng)目通過(guò)使用由存儲(chǔ)指令寫(xiě)入的存儲(chǔ)器的物理地址和存儲(chǔ)器區(qū)域的大小來(lái)進(jìn)行搜索。這種搜索可以以任何數(shù)目的方式完成,以及本發(fā)明并不限于任何特定的技術(shù)。在本發(fā)明的一個(gè)實(shí)施例中,ALAT 98被安排為全部相關(guān)的內(nèi)容可尋址的存儲(chǔ)器,以使得所有的有效的項(xiàng)目被同時(shí)搜索。這些項(xiàng)目被進(jìn)行搜索,以便確定在存儲(chǔ)指令與任何提前的裝載指令之間是否出現(xiàn)沖突。如果在ALAT 98中找到提前的裝載(例如,I24)的存儲(chǔ)器空間的范圍與用于存儲(chǔ)指令(例如,I22)的存儲(chǔ)器空間的范圍相重疊,則出現(xiàn)一個(gè)沖突。在本發(fā)明的一個(gè)實(shí)施例中,當(dāng)檢測(cè)到?jīng)_突時(shí),ALAT 98中的、用于相應(yīng)于沖突的提前裝載的地址的項(xiàng)目在步驟621被去除,通知該沖突。在步驟621,如果由存儲(chǔ)指令(例如,I22)存入的存儲(chǔ)器空間的范圍與任何提前的裝載指令(例如,I24)不重疊,則ALAT 98中相應(yīng)于特定的提前的裝載指令的項(xiàng)目仍保留在ALAT 98中。
應(yīng)當(dāng)理解,被提前的裝載指令可以被移到多個(gè)存儲(chǔ)指令之前,每個(gè)存儲(chǔ)指令可能潛在地與裝載指令相沖突。在一系列存儲(chǔ)指令后面的單個(gè)檢驗(yàn)指令可被使用來(lái)檢測(cè),多個(gè)存儲(chǔ)指令的任一個(gè)存儲(chǔ)指令是否與裝載指令相沖突,因?yàn)閳?zhí)行每個(gè)存儲(chǔ)指令包括搜索ALAT 98中的所有的項(xiàng)目,來(lái)確定是否出現(xiàn)沖突。這樣,檢驗(yàn)指令是和程序中存儲(chǔ)指令的數(shù)目無(wú)關(guān)的,因?yàn)閱为?dú)的檢驗(yàn)指令代替在步驟533中被提前的每個(gè)裝載指令,以及每個(gè)檢驗(yàn)指令檢查ALAT 98,如下面在步驟623中描述的。
也應(yīng)當(dāng)理解,即使對(duì)于由提前的裝載與存儲(chǔ)指令存取的數(shù)據(jù)的起始地址是不相同,在提前的裝載與存儲(chǔ)之間也會(huì)出現(xiàn)沖突,正如上面討論的。具體地,每個(gè)指令可以存取多個(gè)字節(jié)的數(shù)據(jù)。這樣,如果在由提前的裝載指令讀出的數(shù)據(jù)占用的存儲(chǔ)器地址的范圍與由存儲(chǔ)指令寫(xiě)入的數(shù)據(jù)占用的存儲(chǔ)器地址的范圍之間有沖突,則就會(huì)出現(xiàn)沖突。沖突的檢測(cè)可以以多種方式來(lái)實(shí)行,以及本發(fā)明并不限于任何特定的實(shí)施方案。然而,用硬件實(shí)施全范圍的比較會(huì)是昂貴的。所以,按照本發(fā)明的一個(gè)實(shí)施例,采用一種確定沖突的方法,對(duì)于由提前的裝載和存儲(chǔ)指令存取的數(shù)據(jù)的地址不實(shí)行全范圍比較。
按照本發(fā)明的一個(gè)實(shí)施例,給出一種優(yōu)選的、用于大小上對(duì)準(zhǔn)被存儲(chǔ)在存儲(chǔ)器中的數(shù)據(jù)的方法,以使得用于數(shù)據(jù)塊的起始地址優(yōu)選地是數(shù)據(jù)大小的偶倍數(shù)。例如,包括四字節(jié)的數(shù)據(jù)塊優(yōu)選地被存儲(chǔ)在一個(gè)地址,在該地址中兩個(gè)最低位(LSB)是零,八字節(jié)的數(shù)據(jù)塊優(yōu)選地被存儲(chǔ)在一個(gè)地址,在該地址中三個(gè)最低位(LSB)是零,等等。當(dāng)數(shù)據(jù)在大小上對(duì)準(zhǔn)時(shí),沖突可以通過(guò)只執(zhí)行對(duì)于由提前的裝載與存儲(chǔ)指令存取的數(shù)據(jù)的起始地址的直接相等比較而被檢測(cè)。應(yīng)當(dāng)看到,直接相等比較比起全范圍的比較,在硬件實(shí)施上化費(fèi)少得多。當(dāng)數(shù)據(jù)被錯(cuò)誤對(duì)準(zhǔn)時(shí),如果只有有限量的錯(cuò)誤對(duì)準(zhǔn),以使得誤對(duì)準(zhǔn)的數(shù)據(jù)可以在更大的大小對(duì)準(zhǔn)的數(shù)據(jù)范圍上適配,則在本發(fā)明的一個(gè)實(shí)施例中,硬件處理該存取誤對(duì)準(zhǔn)的數(shù)據(jù)的指令(例如,裝載指令),就好像它正在存取更大的大小對(duì)準(zhǔn)的數(shù)據(jù)范圍一樣。例如,如果裝載指令存取存儲(chǔ)器中八字節(jié)的誤對(duì)準(zhǔn)數(shù)據(jù),但由存儲(chǔ)指令存取的數(shù)據(jù)適合于大小對(duì)準(zhǔn)的32字節(jié)范圍,則裝載指令被當(dāng)作為存取32字節(jié)的數(shù)據(jù)進(jìn)行處理。應(yīng)當(dāng)看到,通過(guò)把指令處理為利用較大的大小對(duì)準(zhǔn)的數(shù)據(jù)塊,可能會(huì)有由提前的裝載和存儲(chǔ)指令存取的數(shù)據(jù)地址出現(xiàn)重疊,但由一個(gè)指令實(shí)際存取的真實(shí)的數(shù)據(jù)(在以上例子中的8字節(jié))沒(méi)有重疊的情形,這導(dǎo)致檢測(cè)到假?zèng)_突。這種性能損失是對(duì)于減小用于檢測(cè)沖突的硬件的復(fù)雜性而付出的代價(jià)。如果數(shù)據(jù)很大地被誤對(duì)準(zhǔn),以及不適合于合理地大的大小對(duì)準(zhǔn)的數(shù)據(jù)范圍,則硬件將不處理裝載或存儲(chǔ)指令。對(duì)于裝載,沒(méi)有項(xiàng)目被插入到ALAT 98中,這導(dǎo)致表示一個(gè)沖突。雖然這可能導(dǎo)致檢測(cè)出假?zèng)_突,但這種性能損失是對(duì)于減小用于檢測(cè)沖突的硬件的復(fù)雜性而付出的代價(jià)。對(duì)于被很大地誤對(duì)準(zhǔn)的存儲(chǔ)指令,指令可被分成一系列更小的存儲(chǔ)指令。在一個(gè)實(shí)施例中,硬件可被使用來(lái)把較大的存儲(chǔ)指令分成該一系列多個(gè)存儲(chǔ)指令。在另一個(gè)實(shí)施例中,不能適合于大小對(duì)準(zhǔn)的數(shù)據(jù)范圍的誤對(duì)準(zhǔn)的存儲(chǔ)可被中斷,以及操作系統(tǒng)通過(guò)把存儲(chǔ)指令分成一系列更小的存儲(chǔ)指令而處理存儲(chǔ)。在處理誤對(duì)準(zhǔn)的存儲(chǔ)指令的兩個(gè)實(shí)施例中,對(duì)于ALAT 98中的有效的項(xiàng)目檢驗(yàn)在序列中的每個(gè)較小的存儲(chǔ)指令,正如在步驟618中描述的。如果對(duì)于任何較小的存儲(chǔ)指令的存儲(chǔ)器空間的范圍與提前的裝載的存儲(chǔ)器空間的范圍相重疊,則表示有沖突,如步驟621中描述的。這樣,執(zhí)行每個(gè)較小的存儲(chǔ)指令,給出了與執(zhí)行單個(gè)較大的存儲(chǔ)指令時(shí)相同的結(jié)果。
在本發(fā)明的另一個(gè)實(shí)施例中,在被利用來(lái)檢測(cè)沖突的硬件中的另一個(gè)節(jié)省是通過(guò)使用由忽略地址的一個(gè)或多個(gè)最高位(MSB)進(jìn)行的用于相等比較的部分地址而達(dá)到的。忽略一個(gè)或多個(gè)MSB,導(dǎo)致ALAT98的大小上和用來(lái)執(zhí)行相等比較的硬件的減小,因?yàn)樵贏LAT 98中較少的比特被存儲(chǔ)用于每個(gè)項(xiàng)目,和較少的比特被比較。例如,對(duì)于64比特?cái)?shù)據(jù)地址,只有裝載的20個(gè)最低位被保存在ALAT 98中,以及在相等比較中被使用。應(yīng)當(dāng)看到,忽略一個(gè)或多個(gè)MSB,可導(dǎo)致檢測(cè)到某些假?zèng)_突。具體地,當(dāng)ALAT 98在執(zhí)行存儲(chǔ)指令時(shí)被搜索時(shí)(例如在步驟618),對(duì)于存儲(chǔ)指令的數(shù)據(jù)和裝載指令的數(shù)據(jù)的完全的起始地址對(duì)于在其上執(zhí)行相等比較的LSB(例如,20個(gè)LSB)可以是相同的,但對(duì)于被忽略的一個(gè)或多個(gè)MSB可以不同的。當(dāng)這種情況發(fā)生時(shí),將例如通過(guò)切換控制流到恢復(fù)代碼,將好像沖突實(shí)際上發(fā)生那樣地執(zhí)行圖9的子程序。應(yīng)當(dāng)看到,由于從事實(shí)上沒(méi)有發(fā)生的沖突中恢復(fù),所以,假檢測(cè)將導(dǎo)致某些性能惡化。這種性能損失是對(duì)于減小用于檢測(cè)沖突的硬件的復(fù)雜性而付出的代價(jià)。當(dāng)確定在檢測(cè)方案中忽略多少個(gè)(如果有的話)MSB時(shí),可以考慮在這些競(jìng)爭(zhēng)的因素之間的平衡。
在步驟623,chk.a指令(例如,I25)被執(zhí)行,用于在步驟606執(zhí)行的提前的裝載指令。在一個(gè)實(shí)施例中,chk.a指令檢查ALAT 98,通過(guò)確定是否有用于提前的裝載指令(例如,I24)的項(xiàng)目,而確定是否出現(xiàn)沖突。通過(guò)使用目標(biāo)寄存器的識(shí)別符作為索引和由在步驟621在ALAT 98中被更新信息的、提前的裝載指令(例如,I24)所使用的寄存器類型,chk.a指令檢查ALAT 98。在步驟624,如果在ALAT 98中找到相應(yīng)于由chk.a指令代替的特定的提前的裝載指令的項(xiàng)目,則chk.a指令認(rèn)識(shí)到,存儲(chǔ)指令(例如,I22)和被提前到存儲(chǔ)前面的裝載指令(例如,I24)沒(méi)有沖突。所以,由存儲(chǔ)指令讀出的數(shù)據(jù)是有效的,以及在步驟630,子程序進(jìn)到結(jié)束執(zhí)行指令序列。
然而,如果在步驟624,chk.a指令檢查ALAT 98,并在ALAT 98中沒(méi)有看到相應(yīng)于由提前的裝載指令(例如,I24)使用的寄存器地址的項(xiàng)目,則chk.a指令(例如,I25)確定,存儲(chǔ)和提前裝載指令可能已存取相同的存儲(chǔ)器空間(即,沖突)。這樣,采取進(jìn)一步的步驟,確保根據(jù)提前裝載指令(例如,I24)而已被執(zhí)行的提前裝載指令和計(jì)算指令的精確度。在一個(gè)實(shí)施例中,當(dāng)檢測(cè)到可能的沖突時(shí),程序的控制流被改變成執(zhí)行恢復(fù)代碼。正如上面討論的,這可以以許多方式(例如,通過(guò)轉(zhuǎn)移或使用異常處理技術(shù))來(lái)完成。應(yīng)當(dāng)看到,ALAT 98可以用多個(gè)項(xiàng)目來(lái)實(shí)施,這些項(xiàng)目不一定足夠支持可被包括在被執(zhí)行的程序中的所有的提前的本地指令。在圖9所示的實(shí)施例中,chk.a在步驟633轉(zhuǎn)移到恢復(fù)代碼?;謴?fù)代碼的例子在圖7上被顯示為指令I(lǐng)24r,I26r和I23r,它們實(shí)質(zhì)上是命令I(lǐng)24,I26和I23的拷貝。
在步驟636,在步驟524被提前的裝載指令(例如,I24)被重新執(zhí)行。在步驟639,依賴于提前的裝載指令(例如,I24)的指令被重新執(zhí)行。在圖7的例子中,顯示了重新執(zhí)行的裝載指令I(lǐng)24r和依賴的相加指令I(lǐng)26r。這些指令在存儲(chǔ)指令以后被重新執(zhí)行,以便提供裝載指令I(lǐng)24r和它的依賴性的計(jì)算I26r的正確的結(jié)果。在一個(gè)實(shí)施例中,恢復(fù)代碼可以是由提供與原先執(zhí)行的裝載相同的結(jié)果的編譯器所確定的指令和依賴的計(jì)算指令的組合。
在步驟642,控制流從恢復(fù)代碼返回到編譯的執(zhí)行安排表。這可以通過(guò)使用轉(zhuǎn)移指令,諸如圖7上的I23,而完成。接著,繼續(xù)執(zhí)行安排的指令,直至程序在步驟630結(jié)束。
例如,在一個(gè)實(shí)施例中,ALAT 98具有用于相應(yīng)于32個(gè)提前的指令的項(xiàng)目的空間。在本例的實(shí)施例中,如果在執(zhí)行的程序中有大于32個(gè)提前的指令,則ALAT 98將沒(méi)有足夠的空間用于與所有的提前的指令有關(guān)的信息。當(dāng)ALAT 98是充分的和新的提前的指令被執(zhí)行時(shí),可以使用代替方案來(lái)取出ALAT 98中的有效的項(xiàng)目,以便為新的指令留出空間。而且,在本發(fā)明的一個(gè)實(shí)施例中,當(dāng)在運(yùn)行時(shí)間執(zhí)行在處理過(guò)程之間(諸如在分開(kāi)的編譯的程序之間)進(jìn)行切換時(shí),在ALAT 98中的項(xiàng)目可被保存用于以后的恢復(fù),或可被無(wú)效。這樣,在某些情況下,chk.a指令可能沒(méi)有找到用于特定的提前的指令的項(xiàng)目,即使大于該指令沒(méi)有出現(xiàn)沖突。
正如上面討論的,本發(fā)明并不限于特定的ALAT結(jié)構(gòu),以及可以包括用于確定在裝載和存儲(chǔ)指令之間是否有沖突的其它的替換實(shí)施例。例如,可以使用其它的數(shù)據(jù)結(jié)構(gòu)或比較電路。另外,所使用的ALAT或其它結(jié)構(gòu)在大小和所使用的區(qū)的數(shù)目上可以變化。此外,分開(kāi)的ALAT或數(shù)據(jù)結(jié)構(gòu)可被使用于每個(gè)多個(gè)寄存器組。例如,在一個(gè)實(shí)施例中,ALAT可被使用于通用的和浮點(diǎn)的寄存器組。
本發(fā)明可被擴(kuò)展到包括一個(gè)既是控制也是數(shù)據(jù)推測(cè)的指令。
控制從chk.s和chk.a指令到恢復(fù)代碼的轉(zhuǎn)移,可以以多種方式被實(shí)施。例如,chk.s和chk.a指令,在恢復(fù)代碼中的第一指令的地址被包含在chk.s和chk.a指令本身的情況下,每個(gè)呈現(xiàn)為轉(zhuǎn)移指令。替換地,chk.s和chk.a指令可以產(chǎn)生特定的異常,以及異常處理程序可以使用在chk.s和chk.a指令中的數(shù)值,來(lái)識(shí)別相應(yīng)的恢復(fù)代碼,然后用蹦床機(jī)制把控制轉(zhuǎn)移到該恢復(fù)代碼,諸如在以上引用的、2000年3月8日提交的、題目為“Emulated Branch Effected byTrampoline Mechanism(通過(guò)蹦床機(jī)制實(shí)現(xiàn)的仿真分支)”的、美國(guó)專利申請(qǐng)序列號(hào)09/521,160中描述的。異常處理器也可以使用chk.s或chk.a指令中的地址,它是指令被存儲(chǔ)的存儲(chǔ)器單元的地址,來(lái)識(shí)別恢復(fù)代碼的位置?;謴?fù)代碼可以是根據(jù)由編譯器產(chǎn)生的表,它包括被編譯器加到編譯的源程序的檢驗(yàn)指令的地址。所以,所執(zhí)行的恢復(fù)代碼由被執(zhí)行的檢驗(yàn)指令識(shí)別。
本發(fā)明允許指令不按次序地被提前,即使當(dāng)編譯器沒(méi)有肯定,被提前的指令將不與后面的指令相沖突時(shí)。正如上面討論的,某些沖突的編譯器可以把多個(gè)裝載指令提前到存儲(chǔ)指令的前面,即使沒(méi)有肯定裝載與存儲(chǔ)將不沖突。在運(yùn)行時(shí)間時(shí),如果有沖突,裝載指令將在編譯的執(zhí)行調(diào)度中有序(in line)地重新執(zhí)行。相反,在本發(fā)明的一個(gè)實(shí)施例中,指令執(zhí)行的優(yōu)化是通過(guò)不單把裝載提前到存儲(chǔ)之前,也提前依賴于它的計(jì)算,而被完成。這使得編譯器和調(diào)度程序能夠最有效地一次使用多個(gè)執(zhí)行單元。而且,代替如果有沖突則只重新執(zhí)行裝載指令,而是執(zhí)行檢驗(yàn)指令,確定是否有沖突,以及控制流程改變?yōu)榛謴?fù)代碼,包括裝載指令和它的依賴的計(jì)算。因此,多個(gè)代碼段可以獨(dú)立地和并行地被執(zhí)行。
按照本發(fā)明的計(jì)算機(jī)系統(tǒng)50有效地組合用于提前的裝載的ALAT機(jī)制和用寄存器的軟件控制的重命名實(shí)施的寄存器堆棧機(jī)制。當(dāng)組合ALAT機(jī)制和寄存器堆棧機(jī)制時(shí),ALAT不一定記錄軟件可見(jiàn)的寄存器數(shù)目。如果ALAT要記錄軟件可看見(jiàn)的寄存器數(shù)目會(huì)遇到的一個(gè)問(wèn)題由以下的實(shí)例I說(shuō)明。
實(shí)例I過(guò)程A執(zhí)行提前的裝載,從存儲(chǔ)器單元X到通用寄存器GRm+1。
過(guò)程A調(diào)用過(guò)程B。
發(fā)生寄存器重命名,其中GRm+1通用寄存器名稱被重新變換到新的物理寄存器。
過(guò)程B進(jìn)行存儲(chǔ)指令到存儲(chǔ)器單元X。
過(guò)程B進(jìn)行提前的裝載,從存儲(chǔ)器單元Y到通用寄存器GRm+1。
過(guò)程B進(jìn)行存儲(chǔ)指令到存儲(chǔ)器單元Z。
過(guò)程B檢驗(yàn)它的提前的裝載到通用寄存器GRm+1以及確定程序過(guò)程B的提前的裝載已成功。
過(guò)程B返回到過(guò)程A。
過(guò)程A檢驗(yàn)它的提前的裝載到通用寄存器GRm+1以及(不正確地)確定過(guò)程A的提前的裝載已成功。
克服以上的例子的問(wèn)題的一個(gè)方法是使得軟件控制的寄存器重命名調(diào)節(jié)ALAT中的所有項(xiàng)目。然而,這種解決辦法在實(shí)施上相當(dāng)復(fù)雜,以及大大地增加ALAT的大小。
為此,按照本發(fā)明的ALAT 98記錄在提前的裝載指令中存取的物理寄存器數(shù)目,諸如被記錄在物理寄存器數(shù)目區(qū)118中。在ALAT 98的物理寄存器數(shù)目區(qū)118中的物理寄存器數(shù)目將與軟件可看見(jiàn)的寄存器相匹配,只要所有的調(diào)用與返回相匹配。在所有的調(diào)用與返回相匹配的情況下,ALAT 98被軟件清除,以避免任何無(wú)效的項(xiàng)目。然而,這種清除機(jī)制不完全解決以上例子的問(wèn)題,因?yàn)楫?dāng)被執(zhí)行的調(diào)用指令的數(shù)目變得足夠高造成當(dāng)前的寄存器堆棧幀環(huán)繞處理物理寄存器的概念性圓周時(shí),物理寄存器被復(fù)用。
在一個(gè)實(shí)施例中,當(dāng)前環(huán)繞處理計(jì)數(shù)狀態(tài)99的比特?cái)?shù)(N)和相應(yīng)的寄存器環(huán)繞處理區(qū)122被設(shè)置到零。在本實(shí)施例中,當(dāng)發(fā)起一個(gè)調(diào)用時(shí),它引起當(dāng)前的寄存器堆棧幀移過(guò)物理寄存器的基本周期中的某個(gè)任意點(diǎn),使得寄存器地址環(huán)繞處理,然后,ALAT 98中所有的項(xiàng)目被清除。在本實(shí)施例中,以上的例子的問(wèn)題被解決,因?yàn)闄z驗(yàn)操作將從未見(jiàn)到被某個(gè)其它的過(guò)程插入的項(xiàng)目。這種解決辦法,其中當(dāng)前環(huán)繞處理計(jì)數(shù)狀態(tài)99的比特?cái)?shù)(N)和相應(yīng)的寄存器環(huán)繞處理區(qū)122等于零,無(wú)論如何,使得性能惡化,因?yàn)檫@種解決辦法造成ALAT 98的過(guò)量的清除,觸發(fā)過(guò)多的提前的裝載恢復(fù)。
在本發(fā)明的優(yōu)選實(shí)施例中,當(dāng)前環(huán)繞處理計(jì)數(shù)狀態(tài)99和相應(yīng)的寄存器環(huán)繞處理區(qū)122包括N比特,其中N大于零。當(dāng)前環(huán)繞處理計(jì)數(shù)狀態(tài)99和相應(yīng)的寄存器環(huán)繞處理區(qū)122的N比特代表N比特計(jì)數(shù)值,它增大ALAT 98的物理寄存器數(shù)目區(qū)118,形成擴(kuò)展的物理寄存器數(shù)目,用于提前的裝載指令。在本發(fā)明的優(yōu)選實(shí)施例中,ALAT 98中的項(xiàng)目實(shí)質(zhì)上表示,物理寄存器比實(shí)際上存在的多(即,ALAT中增大的物理寄存器數(shù)目表示比實(shí)際物理寄存器的數(shù)目多2N倍的物理寄存器)。
當(dāng)調(diào)用再映射事件造成物理寄存器環(huán)繞處理時(shí),N比特當(dāng)前環(huán)繞處理計(jì)數(shù)狀態(tài)99被加增量,以及被使用于以后的提前裝載指令,來(lái)確定寫(xiě)入到相應(yīng)的ALAT項(xiàng)目的寄存器環(huán)繞處理區(qū)122中的N比特環(huán)繞處理計(jì)數(shù)值。調(diào)用再映射事件在這里是指響應(yīng)于被調(diào)用的、造成新的寄存器的分配的程序過(guò)程的任何事件。新的寄存器的分配典型地在程序過(guò)程被調(diào)用后立即被執(zhí)行。在一個(gè)實(shí)施例中,調(diào)用再映射事件包括由調(diào)用程序過(guò)程執(zhí)行調(diào)用指令,后面是由被調(diào)用程序過(guò)程執(zhí)行特定的分配指令,它分配多個(gè)寄存器供被調(diào)用程序過(guò)程使用。在本實(shí)施例中,特定的分配指令可以導(dǎo)致物理寄存器環(huán)繞處理。在使得物理寄存器不環(huán)繞處理的返回再映射事件中,N比特當(dāng)前環(huán)繞處理計(jì)數(shù)狀態(tài)99被減增量,以及被使用于以后的提前裝載指令,確定寫(xiě)入到相應(yīng)的ALAT項(xiàng)目的寄存器環(huán)繞處理區(qū)122中的N比特環(huán)繞處理計(jì)數(shù)值。
當(dāng)調(diào)用再映射事件使得物理寄存器環(huán)繞處理時(shí),N比特當(dāng)前環(huán)繞處理計(jì)數(shù)狀態(tài)99被加增量,然后ALAT 98被搜索,找出它們的寄存器環(huán)繞處理區(qū)122中的環(huán)繞處理計(jì)數(shù)值與更新的環(huán)繞處理計(jì)數(shù)狀態(tài)99相一致的項(xiàng)目,以及在它們的寄存器環(huán)繞處理區(qū)具有匹配的環(huán)繞處理計(jì)數(shù)值的所有的項(xiàng)目被清除。同樣地,當(dāng)返回再映射事件使得物理寄存器不環(huán)繞處理時(shí),N比特當(dāng)前環(huán)繞處理計(jì)數(shù)狀態(tài)99被減增量,然后ALAT 98被搜索,找出它們的寄存器環(huán)繞處理區(qū)122中的環(huán)繞處理計(jì)數(shù)值與更新的環(huán)繞處理計(jì)數(shù)狀態(tài)99相一致的項(xiàng)目,以及在它們的寄存器環(huán)繞處理區(qū)具有匹配的環(huán)繞處理計(jì)數(shù)值的所有的項(xiàng)目被清除。
本發(fā)明通過(guò)允許按照本發(fā)明的ALAT記錄在提前的裝載中使用的物理寄存器數(shù)目而不引起過(guò)量的提前裝載恢復(fù)化費(fèi),允許用于實(shí)施提前的裝載的ALAT機(jī)制和用寄存器的軟件控制的重命名實(shí)施的寄存器堆棧機(jī)制一起有效地工作。
雖然這里為了說(shuō)明優(yōu)選實(shí)施例顯示和描述了具體的實(shí)施例,但本領(lǐng)域技術(shù)人員將會(huì)看到,打算達(dá)到同樣的目的的各種各樣的替換和或等價(jià)的實(shí)施方案可以代替所顯示和描述的具體實(shí)施例,而不背離本發(fā)明的范圍。在化學(xué)、機(jī)械、電-機(jī)械、電氣、和計(jì)算機(jī)技術(shù)領(lǐng)域中的技術(shù)人員將容易看到,本發(fā)明可以以各種各樣的實(shí)施例來(lái)實(shí)施。本申請(qǐng)打算覆蓋這里討論的優(yōu)選實(shí)施例的任何改編和變例。所以,顯然打算本發(fā)明只由權(quán)利要求和它的等價(jià)物限制。
權(quán)利要求
1.一種計(jì)算機(jī)系統(tǒng),包括存儲(chǔ)器(58),存儲(chǔ)編譯的程序(66/40),包括存儲(chǔ)指令(I22);裝載指令(I24),被調(diào)度在存儲(chǔ)指令之前;以及檢驗(yàn)指令(I25);處理器(52),執(zhí)行編譯的程序;物理寄存器(74/76),保存用于編譯的程序的數(shù)據(jù),一部分物理寄存器形成寄存器堆棧(84/88),當(dāng)充滿時(shí)進(jìn)行環(huán)繞式處理;N比特當(dāng)前環(huán)繞處理計(jì)數(shù)狀態(tài)(99),跟蹤導(dǎo)致寄存器堆棧環(huán)繞處理或不環(huán)繞處理的物理寄存器再映射事件;提前裝載地址表(98),具有相應(yīng)于裝載指令的項(xiàng)目,每個(gè)項(xiàng)目具有至少一個(gè)存儲(chǔ)器范圍區(qū)(112,114),規(guī)定由相應(yīng)的裝載指令存取的存儲(chǔ)器單元的范圍,物理寄存器數(shù)目區(qū)(118),相應(yīng)于在相應(yīng)的裝載指令中存取的物理寄存器,以及N比特寄存器環(huán)繞處理區(qū)(122),它相應(yīng)于對(duì)于相應(yīng)的裝載指令的N比特的當(dāng)前環(huán)繞處理計(jì)數(shù)狀態(tài);以及其中檢驗(yàn)指令存取提前裝載地址表,確定存儲(chǔ)指令和裝載指令是否潛在地存取公共的存儲(chǔ)器單元。
2.權(quán)利要求1的計(jì)算機(jī)系統(tǒng),其中在執(zhí)行存儲(chǔ)指令以后,相應(yīng)于提前裝載地址表中的裝載指令的項(xiàng)目不存在,表示公共的存儲(chǔ)器單元可能已被存儲(chǔ)和裝載指令存取。
3.權(quán)利要求1的計(jì)算機(jī)系統(tǒng),其中如果存儲(chǔ)指令和裝載指令存取公共的存儲(chǔ)器單元或公共存儲(chǔ)器范圍,存儲(chǔ)指令的執(zhí)行清除在提前裝載地址表中的相應(yīng)于裝載指令的項(xiàng)目。
4.權(quán)利要求1的計(jì)算機(jī)系統(tǒng),其中N比特寄存器環(huán)繞處理區(qū)增大物理寄存器數(shù)目區(qū),形成擴(kuò)展的物理寄存器數(shù)目,用于相應(yīng)的裝載指令。
5.權(quán)利要求1的計(jì)算機(jī)系統(tǒng),其中響應(yīng)于使得寄存器堆棧環(huán)繞處理的調(diào)用再映射事件,N比特寄存器環(huán)繞處理計(jì)數(shù)狀態(tài)被增大或減小。
6.權(quán)利要求5的計(jì)算機(jī)系統(tǒng),其中在N比特寄存器環(huán)繞處理計(jì)數(shù)狀態(tài)被增大或減小以后,處理器搜索提前裝載地址表,找出在它們的寄存器環(huán)繞處理區(qū)中具有與更新的N比特當(dāng)前環(huán)繞處理計(jì)數(shù)狀態(tài)相匹配的環(huán)繞處理計(jì)數(shù)值的項(xiàng)目,以及清除在提前裝載地址表中的在它們的寄存器環(huán)繞處理區(qū)中具有與更新的N比特當(dāng)前環(huán)繞處理計(jì)數(shù)狀態(tài)相匹配的所有的項(xiàng)目。
7.權(quán)利要求1的計(jì)算機(jī)系統(tǒng),其特征在于,其中至少一個(gè)存儲(chǔ)器范圍區(qū)包括存儲(chǔ)器地址區(qū)和存儲(chǔ)器地址大小區(qū)。
8.一種在計(jì)算機(jī)系統(tǒng)中執(zhí)行指令的方法,方法包括把用于在計(jì)算機(jī)系統(tǒng)中執(zhí)行的程序的數(shù)據(jù)保存在物理寄存器中,其中一部分物理寄存器形成寄存器堆棧,當(dāng)充滿時(shí)進(jìn)行環(huán)繞式處理;執(zhí)行被調(diào)度在存儲(chǔ)指令之前的裝載指令;保持N比特當(dāng)前環(huán)繞處理計(jì)數(shù)狀態(tài),它跟蹤導(dǎo)致寄存器堆棧環(huán)繞處理或不環(huán)繞處理的物理寄存器再映射事件;把相應(yīng)于裝載指令的項(xiàng)目記錄在具有相應(yīng)于裝載指令的項(xiàng)目的提前裝載地址表中,每個(gè)項(xiàng)目具有至少一個(gè)存儲(chǔ)器范圍區(qū),規(guī)定由相應(yīng)的裝載指令存取的存儲(chǔ)器單元的范圍,物理寄存器數(shù)目區(qū),相應(yīng)于在相應(yīng)的裝載指令中存取的物理寄存器,以及N比特寄存器環(huán)繞處理區(qū),它相應(yīng)于對(duì)于相應(yīng)的裝載指令的N比特的當(dāng)前環(huán)繞處理計(jì)數(shù)狀態(tài);執(zhí)行存儲(chǔ)指令;以及執(zhí)行檢驗(yàn)指令,它存取提前裝載地址表,確定存儲(chǔ)指令和裝載指令是否潛在地存取公共的存儲(chǔ)器單元。
9.權(quán)利要求8的方法,其中在執(zhí)行存儲(chǔ)指令以后,相應(yīng)于提前裝載地址表中裝載指令的項(xiàng)目不存在,表示公共的存儲(chǔ)器單元可能已被存儲(chǔ)和裝載指令存取。
10.權(quán)利要求8的方法,其中執(zhí)行存儲(chǔ)指令的步驟包括如果存儲(chǔ)指令和裝載指令存取公共的存儲(chǔ)器單元,則清除在提前裝載地址表中相應(yīng)于裝載指令的項(xiàng)目。
11.權(quán)利要求8的方法,其中N比特寄存器環(huán)繞處理區(qū)增大物理寄存器數(shù)目區(qū),形成擴(kuò)展的物理寄存器數(shù)目,用于相應(yīng)的裝載指令。
12.權(quán)利要求8的方法,還包括響應(yīng)于使得寄存器堆棧環(huán)繞處理的調(diào)用再映射事件,將N比特寄存器環(huán)繞處理計(jì)數(shù)狀態(tài)增大或減小。
13.權(quán)利要求12的方法,其中在執(zhí)行增大或減小的步驟以后,方法執(zhí)行以下步驟搜索提前裝載地址表,找出在它們的寄存器環(huán)繞處理區(qū)中具有與更新的N比特當(dāng)前環(huán)繞處理計(jì)數(shù)狀態(tài)相匹配的環(huán)繞處理計(jì)數(shù)值的項(xiàng)目;以及清除在提前裝載地址表中在它們的寄存器環(huán)繞處理區(qū)中具有與更新的N比特當(dāng)前環(huán)繞處理計(jì)數(shù)狀態(tài)相匹配的所有的項(xiàng)目。
14.權(quán)利要求8的方法,其特征在于,其中至少一個(gè)存儲(chǔ)器范圍區(qū)包括存儲(chǔ)器地址區(qū)和存儲(chǔ)器地址大小區(qū)。
全文摘要
計(jì)算機(jī)系統(tǒng)包括物理寄存器,一部分物理寄存器形成寄存器堆棧,當(dāng)充滿時(shí)進(jìn)行環(huán)繞式處理。N比特當(dāng)前環(huán)繞處理計(jì)數(shù)狀態(tài),跟蹤導(dǎo)致寄存器堆棧環(huán)繞處理或不環(huán)繞處理的物理寄存器再映射事件。提前裝載地址表(ALAT)具有相應(yīng)于裝載指令的項(xiàng)目。檢驗(yàn)指令存取ALAT,確定被安排在存儲(chǔ)指令之前的存儲(chǔ)指令和裝載指令是否潛在地存取公共的存儲(chǔ)器單元。
文檔編號(hào)G06F9/34GK1329304SQ0111794
公開(kāi)日2002年1月2日 申請(qǐng)日期2001年4月27日 優(yōu)先權(quán)日2000年4月27日
發(fā)明者D·C·莫里斯, W·R·布里格, A·H·卡普, W·Y·陳 申請(qǐng)人:顯露結(jié)構(gòu)開(kāi)發(fā)研究所
網(wǎng)友詢問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1
瓦房店市| 武胜县| 三河市| 松溪县| 筠连县| 台山市| 肃宁县| 巨野县| 普定县| 永安市| 綦江县| 依兰县| 简阳市| 都安| 溧水县| 玛曲县| 乐安县| 麻江县| 呼图壁县| 海城市| 汶上县| 高安市| 凤阳县| 孙吴县| 泰和县| 洞头县| 成安县| 华宁县| 锦州市| 特克斯县| 思茅市| 台北市| 广东省| 德化县| 广汉市| 屯门区| 绿春县| 南阳市| 开封市| 墨江| 罗平县|