專利名稱:在處理器中傳送指令結(jié)果及處理器的編譯方法
技術(shù)領(lǐng)域:
本發(fā)明涉及在處理器中傳送指令結(jié)果并且涉及處理器的編譯方法。特別地,本發(fā)明涉及用于保存處理器(例如微處理器)中的指令結(jié)果的寄存器的分配。
在高性能的計(jì)算中,目標(biāo)機(jī)器(例如,微處理器)通常需要高速率地來執(zhí)行指令。執(zhí)行時(shí)間通常是由應(yīng)用程序中的循環(huán)結(jié)構(gòu)來決定的。為了允許高速地執(zhí)行指令,一個處理器可能包括多個獨(dú)立的執(zhí)行單元,在其它執(zhí)行單元執(zhí)行指令的同時(shí),每一個獨(dú)立的執(zhí)行單元可以執(zhí)行一個或者多個指令。
這樣一個多執(zhí)行單元的結(jié)構(gòu)可以被用于提供所謂的、由多級組成的軟件流水線。每一個軟件流水線級與特定執(zhí)行單元不具有固定的物理聯(lián)系。相反,當(dāng)一個應(yīng)用程序中的一個循環(huán)結(jié)構(gòu)被編譯時(shí),根據(jù)一個軟件流水線規(guī)劃,組成循環(huán)的各個獨(dú)立迭代的機(jī)器指令被安排由不同的執(zhí)行單元來執(zhí)行。這個規(guī)劃被分成連續(xù)的級,并且以這樣一個方法來規(guī)劃指令,以允許通過在連續(xù)迭代發(fā)起之間使用一個被選擇的循環(huán)發(fā)起間隔,由不同的執(zhí)行單元并行執(zhí)行多個迭代。這樣,當(dāng)一個迭代i的第一級結(jié)束時(shí),這個迭代進(jìn)入到第二級,在迭代i+1的第一級中開始對下一迭代的執(zhí)行。這樣,在執(zhí)行迭代i的第二級中指令的同時(shí),執(zhí)行迭代i+1的第一級中的指令。
在這樣的軟件流水線循環(huán)結(jié)構(gòu)中,通常有必須在流水線中的不同指令之間進(jìn)行交換的循環(huán)變量值,即在循環(huán)的每一個不同迭代中必須進(jìn)行重新評估的表達(dá)式。為了處理這樣的循環(huán)變量,可以將它們保存在一個所謂的循環(huán)寄存器文件中。在這個情形下,每一個循環(huán)變量被分配循環(huán)寄存器文件中的一個邏輯寄存器號碼,并且這個邏輯寄存器號碼對不同的迭代是不變的。在這個循環(huán)寄存器文件中,每一個邏輯寄存器號碼被映射到這個寄存器文件中的一個物理寄存器,并且每一次一個新的迭代開始時(shí),這個映射被循環(huán),即,每一次一個流水線邊界是閉合的。所以,不同迭代中的相應(yīng)指令均涉及相同的邏輯寄存器號碼,這使被編譯的指令簡單了,同時(shí)避免了一個迭代所產(chǎn)生的一個值被一個不同迭代的一個隨后執(zhí)行的指令所覆蓋掉。
對前面所考慮的處理器來說,編譯器在將循環(huán)寄存器文件中的寄存器分配到一個循環(huán)計(jì)算中所產(chǎn)生的值中的任務(wù)是復(fù)雜的,這如本發(fā)明的說明書在后面所詳細(xì)描述的。所以,在一個循環(huán)計(jì)算中能夠提供一個機(jī)制來標(biāo)識中間值,包括循環(huán)變量值是非常好,這可以簡化在分配循環(huán)寄存器文件中的寄存器時(shí)編譯器的任務(wù)。另外,給一個處理器提供其中指令是非常緊湊的一個指令集合也是非常可取的。
根據(jù)本發(fā)明的第一方面,提供了一個處理器,包括指令產(chǎn)生裝置,用于以一預(yù)定序列來產(chǎn)生需要被執(zhí)行的指令,所述指令序列包括預(yù)先選擇的、用于產(chǎn)生值的指令,當(dāng)執(zhí)行這個預(yù)先選擇的、用于產(chǎn)生值的指令時(shí),可以產(chǎn)生相應(yīng)的值;指令執(zhí)行裝置,用于執(zhí)行所產(chǎn)生的指令;寄存器裝置,具有多個寄存器,用于保存執(zhí)行指令時(shí)所產(chǎn)生的值;序列號碼分配裝置,用于根據(jù)所述產(chǎn)生值的指令的產(chǎn)生順序來向相應(yīng)產(chǎn)生值的指令所產(chǎn)生的所述值分配相應(yīng)的序列號碼;和寄存器分配裝置,用于給每一個所述被產(chǎn)生的值分配所述寄存器中的一個,用于保存該被產(chǎn)生的值,這與被分配到這個值的序列號碼相關(guān)。
對這樣一個處理器,編譯器在執(zhí)行分配寄存器的任務(wù)時(shí)就簡單了。例如,這個寄存器裝置的形式可以是一個循環(huán)寄存器文件,并且每一次產(chǎn)生預(yù)先選擇的、用于產(chǎn)生值的一個指令時(shí),寄存器可以被重新映射(重新命名)。這樣一個處理器的指令集合也可以變得更緊湊,以使產(chǎn)生值的指令不需要說明任何目的寄存器來保存它們相應(yīng)的被產(chǎn)生值。
根據(jù)本發(fā)明的第二方面,提供了一個編譯方法,用于將一個高級程序指令序列轉(zhuǎn)換為被一個處理器所執(zhí)行的、相應(yīng)的低級指令序列,這個方法包括步驟決定所述相應(yīng)序列中的哪一個所述低級指令是預(yù)先選擇的、用于產(chǎn)生值的指令,并且哪一個是預(yù)先選擇的、需要值的指令,每一個所述產(chǎn)生值的指令是當(dāng)被執(zhí)行時(shí)就會產(chǎn)生一個值的一個指令,并且每一個所述需要值的指令是當(dāng)被執(zhí)行時(shí)就需要前一個產(chǎn)生的、產(chǎn)生值的指令所產(chǎn)生的所述值的一個指令;根據(jù)執(zhí)行期間相應(yīng)產(chǎn)生值的指令被產(chǎn)生的順序來向所述被產(chǎn)生值分配相應(yīng)的序列號碼;和用在執(zhí)行期間所述處理器所使用的信息來給每一個所述需要值的指令進(jìn)行編碼,以標(biāo)識這個指令所需要的所述產(chǎn)生值,這個信息與被分配到這個產(chǎn)生值上的所述序列號碼相關(guān)。
根據(jù)本發(fā)明的第三方面,提供了一個計(jì)算機(jī)程序,其中當(dāng)在一個計(jì)算機(jī)上執(zhí)行這個程序時(shí),這個程序?qū)⒋偈惯@個計(jì)算機(jī)執(zhí)行實(shí)現(xiàn)本發(fā)明前述第二方面的一個編譯方法。
根據(jù)本發(fā)明的第四方面,提供了一個計(jì)算機(jī)程序,其中當(dāng)在一個計(jì)算機(jī)上執(zhí)行這個程序時(shí),這個程序?qū)⒋偈惯@個計(jì)算機(jī)執(zhí)行用于將一個高級程序指令序列轉(zhuǎn)換為被一個處理器所執(zhí)行的、一個相應(yīng)的低級程序指令序列,這個計(jì)算機(jī)程序包括一個決定部分,用于決定所述相應(yīng)序列中的哪一個所述低級指令是預(yù)先選擇的、用于產(chǎn)生值的指令,并且哪一個是預(yù)先選擇的、需要值的指令,每一個所述產(chǎn)生值的指令是當(dāng)被執(zhí)行時(shí)就會產(chǎn)生一個值的一個指令,并且每一個所述需要值的指令是當(dāng)被執(zhí)行時(shí)就需要前一個產(chǎn)生的、產(chǎn)生值的指令所產(chǎn)生的所述值的一個指令;一個分配部分,用于根據(jù)執(zhí)行期間相應(yīng)產(chǎn)生值的指令被產(chǎn)生的順序來向所述被產(chǎn)生值分配相應(yīng)的序列號碼;和一個編碼部分,用在執(zhí)行期間所述處理器所使用的信息來給每一個所述需要值的指令進(jìn)行編碼,以標(biāo)識這個指令所需要的所述產(chǎn)生值,這個信息與被分配到這個產(chǎn)生值上的所述序列號碼相關(guān)。
現(xiàn)在,通過示例來參考附圖,其中
圖1顯示了實(shí)現(xiàn)本發(fā)明的一個處理器的一部分;圖2顯示了描述在一個編譯過程中所使用的一個符號數(shù)據(jù)流圖的一個示意圖;圖3是描述在編譯過程中所使用的、圖2的一個樹型結(jié)構(gòu)內(nèi)部表示的一個示意圖;和圖4提供了一個在解釋一個處理器使用軟件流水線來執(zhí)行指令時(shí)所使用的表;圖5是被包括在一個前面所考慮的處理器中的一個寄存器文件的一部分的一個示意圖表示;圖6(A)和6(B)提供了一個表,以用于解釋前面在圖5中所考慮的處理器在編譯過程中如何指定寄存器;圖7提供了一個表,以用于解釋實(shí)現(xiàn)了本發(fā)明的一個處理器如何使用軟件流水線來執(zhí)行指令;圖8顯示了描述在圖7的執(zhí)行中如何分配寄存器的一個示意圖;圖9顯示了在本發(fā)明的一個實(shí)施方式中,圖1處理器中的一部分;圖10顯示了一個流圖,以用于解釋實(shí)現(xiàn)了本發(fā)明的編譯過程;圖11顯示了在根據(jù)本發(fā)明另一個實(shí)施方式的處理器中的一個模式寄存器的一部分;圖12顯示了包括一個循環(huán)的高級指令的一個示例;和圖13是在執(zhí)行圖12的循環(huán)中所使用的寄存器的一個示意圖表示。
圖1顯示了實(shí)現(xiàn)本發(fā)明的一個處理器的一部分。在這個示例中,這個處理器是一個超長指令字(VLIW)處理器,其硬件能夠支持軟件流水線和循環(huán)寄存器重新命名。這個處理器1包括一個指令產(chǎn)生單元10,一個規(guī)劃存儲單元12,相應(yīng)的第一、第二和第三執(zhí)行單元14,16和18,和一個寄存器文件20。這個指令產(chǎn)生單元10具有分別連接到第一、第二和第三執(zhí)行單元14,16和18的3個產(chǎn)生槽(issue slot)IS1,IS2,IS3。第一總線22將所有這3個執(zhí)行單元14,16和18連接到寄存器文件20。第二總線24將第一單元和第二單元14和16(但是,在這個實(shí)施方式中,不包括第三執(zhí)行單元18)連接到一個存儲器26,在這個示例中,這個存儲器26是一個外部隨機(jī)訪問存儲器(RAM)設(shè)備。替代地,這個存儲器26可以是處理器1內(nèi)部的一個RAM。
順便說說,雖然圖1顯示了用共享的總線22和24將執(zhí)行單元連接到寄存器文件20和存儲器26,但是應(yīng)理解,替代地,每一個執(zhí)行單元可以通過其獨(dú)立的連接連接到寄存器文件和存儲器。
處理器1執(zhí)行一系列處理周期。在每一個處理周期中,指令產(chǎn)生單元10可以在每一個產(chǎn)生槽IS1到IS3產(chǎn)生一個指令。這些指令是根據(jù)被保存在規(guī)劃保存單元12中的一個軟件流水線規(guī)劃(下面將描述)而產(chǎn)生的。
指令執(zhí)行單元10在不同產(chǎn)生槽上所產(chǎn)生的指令被相應(yīng)的執(zhí)行單元14,16和18所執(zhí)行。在這個實(shí)施方式中,每一個執(zhí)行單元可以同時(shí)執(zhí)行比1個指令多的指令,以使一個執(zhí)行單元在完成前一個指令的執(zhí)行前,就可以開始執(zhí)行一個新的指令。
為了執(zhí)行指令,每一個執(zhí)行單元14,16和18能夠經(jīng)過第一總線22訪問寄存器文件20。所以,被保存在寄存器文件20的寄存器中的值可以被執(zhí)行單元14,16和18所讀取和寫入。另外,第一和第二執(zhí)行單元可以經(jīng)過第二總線24訪問外部存儲器26,以使也可以讀取和寫入被保存在外部存儲器26的存儲器位置中的值。第三執(zhí)行單元18不能夠訪問外部存儲器26,所以在這個實(shí)施方式中,僅能夠操作被保存在寄存器文件20中的值。
下面,將更詳細(xì)地描述圖1處理器的操作,并且將參考一個特定的示例來描述用于編譯指令的一個編譯過程。在這個特定的示例中,已經(jīng)假定,以高級語言C所編寫的一個應(yīng)用程序包括下述簡單的循環(huán)1:for(i=0;i<m;i++)2:dy(i)=dy(i)+da*dx(i)在用于執(zhí)行線性代數(shù)的應(yīng)用程序(軟件包)中,很容易發(fā)現(xiàn)這樣一個循環(huán)。在這個循環(huán)中,一個數(shù)組dy的每一個元素dy(i)(i=0,1,…,m-1)之間是以一個常數(shù)值da和另一個數(shù)組dx中一個相應(yīng)元素dx(i)之間乘積來遞增的。
圖1處理器編譯這個循環(huán)的過程從產(chǎn)生如圖2所顯示的一個符號數(shù)據(jù)流圖開始。下一個步驟是執(zhí)行各種優(yōu)化步驟,來將圖2的數(shù)據(jù)流圖轉(zhuǎn)換為更接近圖1處理器的實(shí)際機(jī)器指令的一個形式。在這個優(yōu)化步驟期間,這個編譯器決定在這個循環(huán)中哪一個值將被改變(循環(huán)變量值),并且哪一個值將保持不變。例如,在整個循環(huán)的期間,da的值是不會被改變的。
數(shù)組dx和dy將被保存在外部存儲器26(圖1)的存儲器位置中,所以,在圖2的數(shù)據(jù)流圖中對它們的引用必須被轉(zhuǎn)換為相應(yīng)的存儲器訪問操作。這樣,每一個數(shù)組dx和dy至少需要一個指針來指向外部存儲器26中保存了這個數(shù)組元素的存儲器位置。每一個這樣的指針被保存在寄存器文件20的一個寄存器中。
雖然也可以使用一個類似的、指向存儲器中其保存位置的指針來處理常數(shù)值da,但是,因?yàn)檫@個值是一個不在循環(huán)中發(fā)生改變的值,所以,在執(zhí)行循環(huán)期間,一個更方便和快速的方法是將它直接保存在寄存器文件20的其自己寄存器中。最后,在這個優(yōu)化過程中,這個編譯器考慮這個可以被使用的處理器指令中的任何有利的特征,例如自動增加地址的模式。
圖3顯示了從這個優(yōu)化過程所產(chǎn)生的、表示圖2數(shù)據(jù)流圖的一個內(nèi)部編譯器表示的一個示例。圖3顯示了各機(jī)器指令和它們之間的相關(guān)關(guān)系(從第一指令指向第二指令的一個箭頭表示這第二指令與第一指令的執(zhí)行結(jié)果相關(guān))。圖3中與每一個箭頭相關(guān)聯(lián)的還有一個數(shù),這個數(shù)表示完成對這個箭頭開始點(diǎn)所表示的這個指令的執(zhí)行所需要的處理器周期數(shù)目。
圖3中第一指令I(lǐng)1是一個載入指令“l(fā)d v0,(r1++)”。這個指令被用于將數(shù)組元素dx(i)的值載入到寄存器文件20的一個寄存器v0中。這個值被從外部存儲器26中、由寄存器文件20的另一個寄存器r1所指向的存儲器位置中讀取出來。在指令I(lǐng)1中在“r1”后面的“++”表示在讀取這個寄存器r1所指向的存儲器位置后,寄存器r1的值被增加以指向外部存儲器26中的下一個存儲器位置。這是編譯器利用處理器1自動增加地址模式的優(yōu)點(diǎn)的一個示例。
第二指令I(lǐng)2是一個乘法指令“mul v1,r3,v0”。這個乘法指令被用于將在第一指令中被載入到寄存器v0中的dx(i)的值,乘以被保存在寄存器文件20的另一個寄存器r3中的值da。乘法結(jié)果被保存在寄存器文件20的一個寄存器v1中。
圖3中的第三指令I(lǐng)3是另一個載入指令“l(fā)d v2,(r2++)”。這第二載入指令被用于將被保存在由寄存器文件20的一個寄存器r2所指向的存儲器位置中的數(shù)組元素dy(i)的值載入到寄存器文件20的一個寄存器v2中。這第二載入指令也是一個自動增加地址模式的指令,在完成讀取操作后它自動地增加寄存器r2,以使然后指向剛才讀取的位置后一個存儲器位置。
圖3的第四指令I(lǐng)4是一個加法指令“add v3,v1,v2”。這個指令將被保存在寄存器v1和v2中的相應(yīng)值(即,da*dx(i),和dy(i))加在一起,并且然后將結(jié)果保存在寄存器文件20的另一個寄存器v3中。
圖3中的第五指令I(lǐng)5是一個保存指令“st v3,(r4++)”。這個指令被用于將被保存在寄存器v3中的值保存在外部存儲器26中、由寄存器文件20的另一個寄存器r4所指向的、用于保存dy(i)的存儲器位置中。
在第二載入指令I(lǐng)3中,從其中讀取dy(i)的存儲器位置(寄存器r2所指向的)必須是與保存指令I(lǐng)5中將dy(i)寫入到其中的存儲器位置相同(寄存器r4所指向的)。所以,最好是在第二載入指令I(lǐng)3和保存指令I(lǐng)5中使用一單個寄存器(例如r2)來指向dy(i)。但是,在這個示例中,使用一單個寄存器是不可能的,因?yàn)?這從后面的描述中就會更清楚)軟件流水線導(dǎo)致在下一個迭代中,在執(zhí)行當(dāng)前迭代中的保存指令I(lǐng)5以前執(zhí)行第二載入指令I(lǐng)3。如果保存指令I(lǐng)5將使用與載入指令I(lǐng)3相同的寄存器r2來指向dy(i),則在這個寄存器r2被當(dāng)前迭代中的保存指令I(lǐng)5使用以前,寄存器r2將被下一個迭代的載入指令I(lǐng)3增加。因?yàn)檫@個原因,在圖3中使用兩個寄存器r2和r4來指向dy(i),這兩個寄存器在每一個迭代的開始時(shí)具有相同的值,并且在迭代期間每一個被增加一次,但是r4的增加相對于寄存器r2的增加來說是滯后的。
在圖3中,可以看出,指令I(lǐng)1到I4所產(chǎn)生的結(jié)果均是在循環(huán)中被改變的量,它們是在循環(huán)中隨著每一個迭代而改變的量。因?yàn)檫@個原因,這些中間值被分配了臨時(shí)寄存器標(biāo)識符(號碼)v0到v3。這些不是最后的寄存器分配,而僅僅是這個編譯器所使用的、關(guān)于這些指令結(jié)果的臨時(shí)標(biāo)記(在數(shù)據(jù)流圖上的箭頭)。寄存器r1到r4,在另一方面,被分配了最終的(永久的)寄存器號碼,因?yàn)榈郊拇嫫鱮1到r4的計(jì)算結(jié)果具有不超過一個迭代的延遲和壽命,即,到了r1在一給定迭代中需要被重新寫入的時(shí)間,任何其它迭代不再需要在前一個迭代中被保存在r1中的被產(chǎn)生值。
從原理上說,圖3中所顯示的、執(zhí)行循環(huán)中的一個迭代的過程包括評價(jià)從沒有父親的節(jié)點(diǎn)開始的樹中的節(jié)點(diǎn),并且朝樹的根部方向而工作。在這個情形下,所以,執(zhí)行的順序是從圖3的I1到I5。
編譯過程的下一級是產(chǎn)生一個軟件流水線規(guī)劃。
軟件流水線的第一級包括決定一個循環(huán)開始的間隔(Ⅱ),即,在循環(huán)中連續(xù)迭代開始之間的間隔。這個循環(huán)開始間隔與處理器中可用的資源相關(guān),資源包括需要執(zhí)行的指令數(shù)目和在數(shù)據(jù)流圖中是否出現(xiàn)了任何周期。例如,圖1處理器具有3個指令產(chǎn)生槽IS1到IS3和3個執(zhí)行單元14,16,和18,這3個執(zhí)行單元中僅有執(zhí)行單元14和16能夠訪問外部存儲器26。另外一個可能的情形是,從執(zhí)行單元被優(yōu)化成獨(dú)立地執(zhí)行不同的任務(wù)的意義上來說,執(zhí)行單元可以是“專用單元”。例如,可以是僅特定執(zhí)行單元能夠執(zhí)行特定類型的指令。
在本發(fā)明的示例中,考慮到可以獲取的資源,將假定循環(huán)開始間隔被決定為兩個周期。另外,將假定僅第三執(zhí)行單元18配備了執(zhí)行加法和乘法指令所需要的資源(例如,一個算術(shù)和邏輯單元ALU)。
在這第一級后,下一級是產(chǎn)生服從一個所謂的模規(guī)劃限制的一個規(guī)劃。這個限制與組成一個迭代(即,圖3中指令I(lǐng)1到I5)的指令相關(guān)。對每一個可用的產(chǎn)生槽,一個指令可以被安排成在周期x從相關(guān)的槽產(chǎn)生,如果并且僅當(dāng)如果在周期y沒有從相同的產(chǎn)生槽產(chǎn)生任何指令,其中y模Ⅱ與x相等。這個模限制,如果滿足的話,可以確保每一個產(chǎn)生槽每處理器周期最多僅產(chǎn)生一個指令。
下面的表1提供了與圖3樹形結(jié)構(gòu)相應(yīng)的一個模規(guī)劃表。表1顯示了組成循環(huán)的一個迭代的5個指令I(lǐng)1到I5如何被規(guī)劃的。特別地,表的列3到列5顯示當(dāng)產(chǎn)生每一個指令時(shí)規(guī)劃中的周期,所發(fā)生的軟件流水線級,和產(chǎn)生指令的產(chǎn)生槽(即,執(zhí)行指令的單元)。在表1中,最后的4列表示邏輯寄存器號碼,并且陰影被用于表示值的生命周期,如后面將參考圖5,6(A)和6(B)所詳細(xì)描述的。表1 如表1中所顯示的,因?yàn)槟R?guī)劃限制,沒有兩個指令可以被安排成在相同的產(chǎn)生槽相距2個周期的整數(shù)倍。這樣,一旦這第一載入指令I(lǐng)1已經(jīng)被安排成在周期0從產(chǎn)生槽1產(chǎn)生出來,下一個指令,即在周期2中被產(chǎn)生的乘法指令I(lǐng)2必須被安排成從與產(chǎn)生槽1不同的產(chǎn)生槽產(chǎn)生出來。在這個情形下,是產(chǎn)生槽3。產(chǎn)生槽3之所以被選擇,僅僅是因?yàn)樵谶@個示例中第三執(zhí)行單元18能夠執(zhí)行乘法指令。類似地,一旦第二載入指令I(lǐng)3已經(jīng)被安排成在周期3內(nèi),從產(chǎn)生槽1產(chǎn)生出來,下一個指令,即被安排成在周期5中被產(chǎn)生的加法指令I(lǐng)4必須被從與產(chǎn)生槽1不同的產(chǎn)生槽所產(chǎn)生,在這個情形下,又是這個產(chǎn)生槽3。這第5指令,又是保存指令I(lǐng)5,需要在周期9中被產(chǎn)生。因?yàn)檫@個模限制,這不能夠在產(chǎn)生槽1也不能夠在產(chǎn)生槽3中被產(chǎn)生,并且必須相應(yīng)地被分配到產(chǎn)生槽2。
應(yīng)理解,在表1中的安排僅與一個迭代相關(guān)。每Ⅱ周期,就根據(jù)相同的規(guī)劃來開始另一個迭代。這樣,當(dāng)當(dāng)前的迭代在級1時(shí),這緊前一個迭代將是在級2,在這級以前的級將在級3,在這以前的迭代將在級4,在這以前的迭代在級5。在所有迭代中,指令被安排成從相同的產(chǎn)生槽產(chǎn)生,每一個產(chǎn)生槽每Ⅱ周期產(chǎn)生相同的指令。
圖4顯示了從第一到第6個不同迭代(i=0到i=5)如何相互并行執(zhí)行。在圖4中,符號如下L1表示第一個載入指令I(lǐng)1,M表示乘法指令I(lǐng)2,L2表示第二載入指令I(lǐng)3,A表示加法指令I(lǐng)4,和S表示保存指令I(lǐng)5。
在周期0中,第一個迭代(i=0)從在產(chǎn)生槽1產(chǎn)生第一載入指令L1開始。在周期1中,不產(chǎn)生任何指令。在周期2中,從產(chǎn)生槽1產(chǎn)生載入指令L1開始,開始執(zhí)行第二迭代(i=1)。同時(shí),也從產(chǎn)生槽3產(chǎn)生第一迭代的乘法指令M。在周期3中,僅產(chǎn)生第一迭代的第二載入指令L2。應(yīng)理解,在產(chǎn)生第一迭代的L2時(shí),第二迭代的L1還沒有被完成??梢缘贸鼋Y(jié)論,在這個實(shí)施方式中,圖1處理器中的第一執(zhí)行單元14必須能夠互相平行地同時(shí)執(zhí)行這兩個載入指令。
在周期4中,從槽1產(chǎn)生這個迭代的第一載入指令L1開始,開始執(zhí)行第三迭代(i=2)。同時(shí),從產(chǎn)生槽3產(chǎn)生第二迭代的乘法指令M。
以這個方法來繼續(xù)執(zhí)行,直到已經(jīng)完成了這個迭代的所有操作。
從圖4中可以看出執(zhí)行這個迭代的流水線本質(zhì)。例如,在周期8中,第5個迭代(i=4)是在表1規(guī)劃中的級1,而第四迭代(i=3)在級2上,第三迭代(i=2)在級3,第二迭代(i=1)在級4,第一迭代(i=0)在級5。
如上面所描述的,“v0”到“v3”僅僅是被分配到寄存器的臨時(shí)標(biāo)識符(標(biāo)記)。這些臨時(shí)寄存器標(biāo)識符必須被翻譯成可以被指令所說明的邏輯寄存器標(biāo)識符。這個翻譯任務(wù)是被編譯器來執(zhí)行的,并且考慮了處理器在運(yùn)行時(shí)分配寄存器的方法。
在描述這個任務(wù)如何被實(shí)現(xiàn)本發(fā)明的一個處理器所執(zhí)行以前,首先,將參考圖5,6(A)和6(B)來解釋沒有實(shí)現(xiàn)本發(fā)明的、前面所考慮的一個處理器如何執(zhí)行這個任務(wù)的。
圖5顯示了前面考慮的這個處理器中一個寄存器文件120的一部分的一個示意圖表示。圖5中所顯示的部分120R是被處理器使用來保存循環(huán)變量值的部分。這個寄存器文件120也可以具有另一個來保存循環(huán)不變量值的部分(圖5中沒有顯示)。
如圖5中所顯示的,部分120R包括被安排成寄存器文件20中連續(xù)地址的、多個(在這個示例中16個)寄存器r0到r15。
在寄存器文件120中,在一個指令中被說明的邏輯寄存器標(biāo)識符被使用一個映射偏移OFFSET映射到一個物理寄存器地址。例如,如圖5所顯示的,這個映射偏移OFFSET是10,這意味著一個邏輯寄存器標(biāo)識符s0被映射到物理寄存器r10。邏輯寄存器標(biāo)識符s1被映射到物理寄存器r11,等等。這個映射“繞回(wrap-around)”部分120R,以使例如,當(dāng)OFFSET為10時(shí),邏輯寄存器標(biāo)識符s6被映射到物理寄存器r0。
在前面所考慮的、具有圖5寄存器文件的處理器中,當(dāng)使用了軟件流水線執(zhí)行時(shí),每一次開始執(zhí)行一個新的迭代時(shí),即,每Ⅱ個處理器周期,映射偏移值OFFSET就被改變。改變映射偏移值的效果是改變在指令中所說明的邏輯寄存器標(biāo)識符與寄存器文件20的部分20R中實(shí)際物理寄存器之間的映射關(guān)系。這等效于對這些寄存器進(jìn)行重新命名。
以軟件流水線方式執(zhí)行的這些指令(即,在這個示例中,表1所顯示的5個指令)需要保持相同的邏輯寄存器標(biāo)識符,而與被執(zhí)行的特定迭代無關(guān)。但是,然后,對寄存器的重新命名必須是這樣,以使能夠給在任何給定迭代中所產(chǎn)生的每一個循環(huán)變量值提供其自己的寄存器,并且當(dāng)需要時(shí),能夠被需要這個值的任何其它指令所訪問,只要這個值被需要(即,對這個值的生命周期來說,被表1中的4個最后列中一個相關(guān)列的陰影所顯示的)。
例如,如表1中所顯示的,用于保存周期0中產(chǎn)生的第一載入指令所產(chǎn)生的值的寄存器被分配了臨時(shí)寄存器標(biāo)識符v0,并且相關(guān)的被產(chǎn)生值的最小壽命為3個處理器周期,因?yàn)樵谥芷?中它可以被用作乘法指令中的一個輸入操作數(shù)中。類似地,在周期2中被產(chǎn)生的乘法指令所產(chǎn)生的值被分配了臨時(shí)寄存器標(biāo)識符v1,并且這個被產(chǎn)生值的最小生命周期為4個處理器周期,因?yàn)樵谥芷?中的加法指令需要這個值。
考慮這個值的壽命,并且每隔前面所考慮處理器的Ⅱ周期,對物理寄存器進(jìn)行重新命名,可以得出結(jié)論,對前面所考慮的處理器來說,這個編譯器需要9個不同的邏輯寄存器標(biāo)識符s0到s8來標(biāo)識用于保存本發(fā)明示例中循環(huán)變量值的寄存器。
現(xiàn)在參考圖6(A)和6(B),將解釋對前面所考慮的處理器來說,如表1中所顯示的、這個編譯器將臨時(shí)寄存器標(biāo)識符v0到v3翻譯成邏輯寄存器標(biāo)識符s0到s8的方法。在圖6(A)和6(B)中,已經(jīng)假定,開始時(shí),映射偏移值OFFSET為10。當(dāng)開始第一迭代(i=0)時(shí),第一載入指令需要被分配其中可以保存被載入值的一個物理寄存器。因?yàn)檫@個值是需要一個寄存器的第一值,所以這個寄存器被使用邏輯寄存器標(biāo)識符s0所規(guī)定,這個邏輯寄存器標(biāo)識符s0在寄存器文件20中被映射到物理寄存器r10。
前面所考慮處理器中的寄存器的第一次重新命名在處理器周期2開始時(shí)開始,而其后,OFFSET被減去1,其值變?yōu)?。
在周期2中產(chǎn)生2個指令,第一迭代的乘法指令和第二迭代的第一載入指令。這個乘法指令需要第一迭代中第一載入指令所產(chǎn)生的值。因?yàn)槭窃谥芷?的開始時(shí)才對寄存器進(jìn)行重新命名,所以邏輯寄存器標(biāo)識符s1必須被用于從物理寄存器r10中檢索這個值。第二迭代的第一載入指令中的邏輯寄存器標(biāo)識符必須與第一迭代的第一載入指令中的邏輯寄存器標(biāo)識符一致(s0)。第一迭代中的乘法指令也必須被提供一個寄存器來保存其結(jié)果。在當(dāng)前在使用寄存器r9和r10時(shí),第一空閑寄存器是寄存器r11,這寄存器r11與邏輯寄存器標(biāo)識符s2相應(yīng)。
在周期3中,產(chǎn)生第一迭代的第二載入指令。這個指令需要能夠保存其被載入值的一個寄存器。在寄存器r9到r11已經(jīng)被使用后,第一個空閑寄存器是寄存器r12。但是,因?yàn)楹竺鎸⒁忉尩脑?,這個編譯器必須預(yù)留r12來用于保存一個隨后的迭代所產(chǎn)生的值,所以第一迭代的第二載入指令所產(chǎn)生的被載入值被分配了一個寄存器r13,這需要邏輯寄存器標(biāo)識符s4。
在前面所考慮的處理器中,對寄存器的重新命名發(fā)生在處理器周期4的開始時(shí),而其后,OFFSET再被減去1,其值變?yōu)?。
在周期4中,產(chǎn)生了第二迭代的乘法指令和第三迭代的第一載入指令。這些指令的邏輯寄存器標(biāo)識符與前面乘法和第一載入指令的邏輯寄存器標(biāo)識符相同。物理寄存器r10可以被重新用于保存第二迭代中乘法指令的結(jié)果,當(dāng)在周期2中,被保存在前一個迭代的這個寄存器中的循環(huán)變量值的壽命完成時(shí)。
在周期5中,所產(chǎn)生的指令是第一迭代的加法指令和第二迭代的第二載入指令。加法指令的輸入操作數(shù)被包括在寄存器r11和r13中,需要這個加法指令規(guī)定邏輯寄存器標(biāo)識符s3和s5。寄存器r14,這是在被使用的寄存器r13后的第一個空閑寄存器,被分配來用于保存加法指令的結(jié)果。這個寄存器是由邏輯寄存器標(biāo)識符s6來規(guī)定的。
現(xiàn)在可以看看在第一迭代中必須跳過寄存器r12的原因。被用于分配來保存第二迭代的第二載入指令的結(jié)果的邏輯寄存器標(biāo)識符s4必須與第一迭代的相應(yīng)第二載入指令中所規(guī)定的邏輯寄存器標(biāo)識符相同。如果s4在第一迭代中被映射到r12,s4在第二迭代中將被映射到r11。但是,這是不可能這樣做的,因?yàn)閞11,這是用于保存第一迭代的乘法指令所產(chǎn)生的值的寄存器,在周期5的開始時(shí)仍然被使用。
與圖3中指令I(lǐng)1到I5相應(yīng)的、翻譯指令所產(chǎn)生的指令集合將被顯示在圖6(A)的底部。
從圖6(A)和6(B)中可以看出,編譯器將臨時(shí)寄存器標(biāo)識符v0到v3翻譯成邏輯寄存器標(biāo)識符s0到s8的任務(wù)對前面所考慮的處理器來說是復(fù)雜的。例如,在第一迭代中,很容易獲得的寄存器r12不可以被分配成用于保存第二載入指令所產(chǎn)生的值,因?yàn)檫@將在下一個周期中導(dǎo)致一個碰撞。
下面的表2提供了與表1相應(yīng)的一個模規(guī)劃表,但是是根據(jù)本發(fā)明的一個實(shí)施方式的。
表2
在表2中,每一個獨(dú)立迭代所需要的5個指令被安排在與表1相同的周期和產(chǎn)生槽內(nèi),但是每一個指令的格式已經(jīng)被改變并且被簡化了。
再參考圖3,在一個靜態(tài)安排的處理器中,圖3樹的節(jié)點(diǎn)被評價(jià)的順序被編譯器固定了。利用這些知識,編譯器知道在程序執(zhí)行期間值被產(chǎn)生和需要的確切順序,相對當(dāng)前指令產(chǎn)生時(shí)所達(dá)到的序列號,這個編譯器能夠通過它們的序列號來引用前面計(jì)算出的值。
每一個在執(zhí)行一個軟件流水線循環(huán)規(guī)劃期間被產(chǎn)生的值被編譯器在編譯期間分配一個序列號碼。例如,第一個被產(chǎn)生的值具有序列號0,隨后產(chǎn)生的值的序列號是依次增加的。當(dāng)一個循環(huán)規(guī)劃被軟件流水線化時(shí),這個循環(huán)將同時(shí)有k個迭代被激活,其中k是在進(jìn)行規(guī)劃后軟件流水線級的數(shù)目。這k個迭代被以同時(shí)的方式來執(zhí)行,其中每一個隨后的迭代在前一個迭代開始后Ⅱ個周期才開始。
圖7又提供了前面所描述的、圖4的表,但是對特定指令其數(shù)字被加入到圓括號中,以顯示在編譯期間序列號如何被分配給值的。
在圖7的周期8中,產(chǎn)生了第5迭代(i=1)的第一載入指令L1。這個載入指令是一個產(chǎn)生值的指令,因?yàn)樗a(chǎn)生了這個迭代的隨后乘法指令M所需要的值dx(i)。如圖7所顯示的,假定,這個編譯器給周期8第一載入指令L1所產(chǎn)生的值的序列號是0。
在周期8中,另一個產(chǎn)生值的指令也被指令產(chǎn)生單元10所產(chǎn)生,其產(chǎn)生的同時(shí)也產(chǎn)生了第5迭代的第一載入指令L1。這其它的指令是前一迭代(第四)的乘法指令M。這個同時(shí)被產(chǎn)生的產(chǎn)生值的指令是從產(chǎn)生槽3所產(chǎn)生的,在一預(yù)定產(chǎn)生槽的順序中(1-2-3),這是在產(chǎn)生槽1之后的,所以編譯器給乘法指令所產(chǎn)生的值分配在分配給第一載入指令L1所產(chǎn)生值的序列號碼后面的一個序列號碼,即,序列號碼1。
這樣,盡管在任何給定周期中,可以從不同的產(chǎn)生槽產(chǎn)生兩個或者多個產(chǎn)生值的指令,編譯器可以系統(tǒng)地將不同的序列號碼分配給這些指令所產(chǎn)生的值。通過以同時(shí)產(chǎn)生指令的產(chǎn)生槽的預(yù)定順序來分配序列號碼,可以系統(tǒng)地來進(jìn)行分配(可預(yù)測的)。
在周期9中,產(chǎn)生槽1產(chǎn)生另一個產(chǎn)生值的指令,即,第四迭代的第二載入指令L2。這個指令所產(chǎn)生的值也相應(yīng)地被分配了序列號碼2。類似地,在周期9中,第三迭代的加法指令A(yù)被從產(chǎn)生槽3產(chǎn)生。另外,這個指令也是一個產(chǎn)生值的指令,并且這個指令所產(chǎn)生的值必須被分配一個序列號碼。分配到周期9中加法指令所產(chǎn)生的值的這個序列號碼是3,因?yàn)楫a(chǎn)生所考慮的加法指令的這個產(chǎn)生槽(產(chǎn)生槽3)在產(chǎn)生另一個同時(shí)被產(chǎn)生的、產(chǎn)生值的指令(第四迭代的L2)的產(chǎn)生槽(槽1)的后面。
在周期9中也被產(chǎn)生的第一迭代的保存指令不是一個產(chǎn)生值的指令。實(shí)際上,它是一個需要值的指令。相應(yīng)地,沒有序列號碼被分配到與保存指令相關(guān)的任何值。
在周期10中,指令產(chǎn)生單元10同時(shí)產(chǎn)生了兩個產(chǎn)生值的指令,即,新迭代的第一載入指令L1(第6迭代)和前一個迭代(第5)的乘法指令。L1是從槽1被產(chǎn)生的,所以它所產(chǎn)生的值被分配到下一個序列號碼,4。這個乘法指令是從槽3被產(chǎn)生的,并且其產(chǎn)生的值被分配了序列號碼5。
在處理器在運(yùn)行時(shí)執(zhí)行指令序列的期間,這個處理器根據(jù)將產(chǎn)生這些值的、產(chǎn)生值的指令的產(chǎn)生順序,來將寄存器分配到被產(chǎn)生值,以使在圖7中具有序列號碼0到5的被產(chǎn)生值被分配到圖8中所顯示的寄存器。
現(xiàn)在再參考表2,現(xiàn)在可以解釋在表2中的乘法指令的形式。這個乘法指令具有被規(guī)定為“@5”的第一操作數(shù)和被規(guī)定為“r3”的第二操作數(shù)。這第二操作數(shù)是一個直接操作數(shù),并且簡單地表示為如表1的寄存器r3的內(nèi)容。這個寄存器保存了循環(huán)不變量值da。第一操作數(shù)的參考“@5”指第一操作數(shù)所需要的值是其序列號碼比當(dāng)前序列號碼小5的值。當(dāng)圖7的周期10中的乘法指令被產(chǎn)生時(shí),被分配的序列號碼為5。所以,從這個參考“@5”,這個處理器能夠在進(jìn)行執(zhí)行時(shí)知道它應(yīng)使用其序列號碼比當(dāng)前序列號碼小5的值作為第一操作數(shù),即,在周期8中所產(chǎn)生的第一載入指令L1所產(chǎn)生的值。它也知道,被分配用于保存L1結(jié)果的寄存器將是在寄存器文件20的可重新命名部分中最近被分配寄存器的前5個寄存器,即,其邏輯寄存器標(biāo)識符為5的寄存器。
這樣,一個需要值的指令,例如乘法指令M所需要的每一個輸入值可以由被分配到這個輸入值的序列號碼和在產(chǎn)生這個需要值的指令時(shí)所達(dá)到的序列號碼之間的差異來確切地規(guī)定。這個差異(例如,“@5”)可以被稱作一個序列偏移。
圖9更詳細(xì)地顯示了圖1處理器的部分,在本發(fā)明的一個實(shí)施方式中,圖1處理器執(zhí)行為被產(chǎn)生值分配序列號碼的功能,執(zhí)行寄存器分配和標(biāo)識的功能。
在圖9中,寄存器文件20共有N個寄存器,其中較低號碼的K個寄存器組成了一個靜態(tài)地址區(qū)域20S,而較高號碼的N-K個寄存器組成了一個一個動態(tài)地址(可重新命名)的區(qū)域20R。這個可重新命名的區(qū)域一般與已經(jīng)參考圖5而描述的部分120R類似。靜態(tài)地址區(qū)域20S的寄存器被用于保存循環(huán)不變量的值,而可重新命名區(qū)域20R的寄存器被用于保存循環(huán)變量的值。在這兩個區(qū)域之間的界限是可以被編程的。在表2的示例中,寄存器r1到r4在靜態(tài)地址區(qū)域20S中,并且這樣來對這個界限進(jìn)行編程,以使可重新命名的區(qū)域從r5開始(即,K=5)。
提供了一個檢測產(chǎn)生值指令的單元30,它檢測何時(shí)產(chǎn)生一個產(chǎn)生值的指令。這個檢測產(chǎn)生值指令的單元30被方便地包括在圖1的指令產(chǎn)生單元10中。在檢測到產(chǎn)生這樣一個指令后,這個檢測產(chǎn)生值指令的單元30產(chǎn)生一個重新命名RENAME信號。這個RENAME信號被施加到一個寄存器重新命名單元32。這個寄存器重新命名單元32連接到保存一個映射偏移值OFFSET的一個映射偏移保存單元34。對這個RENAME信號作出響應(yīng),這個寄存器重新命名單元32將被保存在映射偏移保存單元34中的映射偏移值OFFSET減去1。
被保存在映射偏移保存單元34中的映射偏移值OFFSET被施加到一個映射單元36。這個映射單元36也接收一個邏輯寄存器標(biāo)識符(R),并且輸出一個物理寄存器地址(P)。這個邏輯寄存器標(biāo)識符(數(shù)字)是在0到N-1內(nèi)的一個整數(shù)。這個映射單元36實(shí)現(xiàn)從邏輯寄存器標(biāo)識符到物理寄存器地址的一個雙向單映射。每一個物理寄存器地址也是在范圍0到N-1內(nèi)的一個整數(shù),并且直接標(biāo)識一個實(shí)際的硬件寄存器。
如果一個指令規(guī)定了一個邏輯寄存器標(biāo)識符R作為其一個操作數(shù),并且R是在0到K-1并且包括K-1的范圍內(nèi)時(shí),然后,物理寄存器號碼與這個操作數(shù)的邏輯寄存器號碼一致。但是,如果R是在范圍K到N-1內(nèi),然后,這個操作數(shù)的邏輯寄存器號碼有P這樣給出P=K+|R-K+OFFSET|N-K在這個表達(dá)式中,|y|x意味著y對x的模。
當(dāng)產(chǎn)生了一個產(chǎn)生值的指令,并且這個產(chǎn)生值的指令將產(chǎn)生需要被保存在一個可重新命名的寄存器中的值時(shí),在可重新命名區(qū)域20R中的下一個空閑寄存器被自動分配到將被產(chǎn)生的值。簡單地,這個寄存器是具有邏輯寄存器號碼為0的寄存器,即,物理寄存器號碼K+|OFFSET-K|N-K。將執(zhí)行這個指令的執(zhí)行單元被告知所分配寄存器的物理寄存器號碼,以使當(dāng)最后產(chǎn)生這個值時(shí),這個值能夠被保存在相關(guān)的物理寄存器中。然后,根據(jù)檢測單元30所產(chǎn)生的RENAME信號,映射偏移值OFFSET被減去1。
當(dāng)產(chǎn)生一個需要值的指令,這個需要值的指令需要被保存在一個可重新命名寄存器中的一個值時(shí),在指令中,使用其相對最新被分配寄存器的序列偏移值來規(guī)定保存這個被需要值的寄存器。這個序列偏移可以被直接用于提供邏輯寄存器標(biāo)識符R。所以,這個序列偏移被提供到映射單元30,然后,這個映射單元30產(chǎn)生相應(yīng)的物理寄存器號碼P。例如,在圖8中,當(dāng)產(chǎn)生迭代i=4的乘法指令時(shí),最新分配的寄存器是其邏輯寄存器標(biāo)識符R=0的寄存器。這個乘法指令需要被保存在邏輯寄存器標(biāo)識符R=5的寄存器所保存的產(chǎn)生值dx(4)。這樣,序列偏移“@5”直接提供了被需要寄存器的邏輯寄存器標(biāo)識符(5)。
類似地,應(yīng)理解,一個被產(chǎn)生的指令可以同時(shí)是一個產(chǎn)生值的指令和一個需要值的指令。
現(xiàn)在參考圖10,現(xiàn)在將解釋在將高級語言程序指令序列轉(zhuǎn)換為一個被圖1處理器所執(zhí)行的、相應(yīng)的低級語言程序指令序列中所使用的一個編譯方法的一部分。在這個處理器支持軟件流水線執(zhí)行的情形下,這個編譯方法將包括參考圖2,3和表1來描述的、用于產(chǎn)生一個軟件流水線規(guī)劃的步驟。
在圖10的第一步驟S1中,這個編譯器決定相應(yīng)序列的哪一個低級指令是預(yù)選擇的產(chǎn)生值的指令,相應(yīng)序列的哪一個低級指令是預(yù)選擇的需要值的指令。例如,圖3中指令I(lǐng)1到I4均是預(yù)選擇的產(chǎn)生值的指令。另外,指令I(lǐng)2,I4和I5均是預(yù)選擇的、需要值的指令,它們需要前一個被產(chǎn)生的產(chǎn)生值的指令所產(chǎn)生的值。
在步驟S2中,這個編譯器以產(chǎn)生這些指令的順序來給產(chǎn)生值的指令所產(chǎn)生的值來分配序列號碼。被分配的序列號碼必須反映在一個軟件流水線循環(huán)中所有同時(shí)被執(zhí)行的迭代,如前面參考圖7而描述的。
然后,在步驟S3中,每一個需要值的指令被使用信息,例如上面提到的序列偏移,來進(jìn)行編碼,這與被分配到相關(guān)需要值的指令所需要的被產(chǎn)生值的序列號碼相關(guān)。
實(shí)現(xiàn)了本發(fā)明的一個編譯方法可以用根據(jù)一個計(jì)算機(jī)程序而工作的一個通用計(jì)算機(jī)來實(shí)現(xiàn)。這個計(jì)算機(jī)程序可以是被任何合適的承載媒質(zhì),例如一個存儲器媒質(zhì)(例如,軟盤或者CD-ROM)或者一個信號來承載。這樣一個承載信號可以是經(jīng)過一個通信網(wǎng)絡(luò),例如互聯(lián)網(wǎng)而下載的一個信號。后附的計(jì)算機(jī)程序權(quán)利要求應(yīng)被理解為包括了一個計(jì)算機(jī)程序本身或者上述形式中的任何一個形式。
在計(jì)算每一個輸入值的序列偏移時(shí),編譯器的任務(wù)是簡單的,因?yàn)閷σ唤o定需要值的指令來說,這個序列偏移簡單地就是被分配到相關(guān)輸入值的序列號碼和當(dāng)產(chǎn)生指令時(shí)的達(dá)到的被分配序列號碼之間的差異。這使就在寄存器文件的環(huán)型部分(可重新命名部分)中的分配來說,編譯器的任務(wù)更簡單和快速。
另外,與在表1中的其相應(yīng)指令相比,表2中的每一個指令比較短,其差異在于不需要指定目的寄存器。這可以使代碼更緊湊,執(zhí)行速度也更快。
本發(fā)明的另一個實(shí)施方式可以提供具有兩個或者多個寄存器重新命名模式的一個處理器。例如,如圖11所顯示的,這個處理器可以具有一個模式寄存器,這個模式寄存器具有第一和第二模式比特M1和M2來用于記錄當(dāng)前被選擇的寄存器重新命名模式。這個模式寄存器40可以被提供在圖9的寄存器重新命名單元32中,例如。這第一模式比特M1被用于控制是否打開或者關(guān)閉寄存器重新命名。第二模式比特M2是有效的,僅當(dāng)?shù)谝荒J奖忍豈1指出打開了寄存器重新命名功能時(shí)。在這個情形下,第二模式比特M2被用于控制將使用兩個可以使用的寄存器重新命名模式中的哪一個。這兩個可以使用的模式中的一個是參考表2和圖7到9來描述的模式,其中在每一次產(chǎn)生產(chǎn)生值的指令時(shí),就重新命名寄存器。另一個可以使用的寄存器重新命名模式可以是任何其它合適的寄存器重新命名模式。例如,這另一個可以使用的寄存器重新命名模式可以是前面所考慮的、參考圖5,6(A)和6(B)而描述的模式,其中每一次跨越一個軟件流水線界限時(shí),就對寄存器重新命名,即,每隔Ⅱ個處理器周期,其中Ⅱ是上面提到的循環(huán)開始間隔。
當(dāng)然,如果根本不需要提供關(guān)閉寄存器重新命名的能力,可以忽略第一模式比特M1。類似地,如果僅需要根據(jù)是否產(chǎn)生產(chǎn)生值的指令來簡單地打開或者關(guān)閉寄存器重新命名的功能,就可以忽略第二模式比特M2。
在執(zhí)行時(shí),例如在程序的控制下,模式比特或者每一個模式比特可以被自動地改變。
下面,現(xiàn)在將參考圖12和13來描述參考表2和圖7到9來描述的基本寄存器重新命名的一個可選增強(qiáng)項(xiàng)。這個可選增強(qiáng)項(xiàng)是用于克服產(chǎn)生于一個特殊情形的、可能出現(xiàn)的寄存器位置不一致性的缺點(diǎn)的,其中與執(zhí)行一個軟件流水線循環(huán)的一個循環(huán)體一次或者多次的正常情形相比,在這個特殊情形中,根本不執(zhí)行這個循環(huán)體。例如,其中根本不執(zhí)行這個循環(huán)體的這個特殊情形是產(chǎn)生于當(dāng)一個循環(huán)指令建立了一個迭代循環(huán),而一個循環(huán)控制變量被從一個開始值增加到一個結(jié)束值,但是這個結(jié)束值比開始值小,這個結(jié)束值是在執(zhí)行時(shí)循環(huán)指令所遇到的一個變量。這個特殊情形導(dǎo)致寄存器位置與當(dāng)執(zhí)行循環(huán)體一次或者多次時(shí)的寄存器位置不一致,這在下面將被解釋。
考慮具有v個產(chǎn)生值的指令和p個軟件流水線級的一個軟件流水線循環(huán)規(guī)劃。例如,在表2的規(guī)劃中,v=4和p=5。如果這個循環(huán)迭代n次,然后這個寄存器文件將在執(zhí)行循環(huán)時(shí)被環(huán)回v(n+p-1)次。一個編譯器使用這個信息來預(yù)測在這個循環(huán)中被產(chǎn)生值在寄存器文件中的位置,這個值然后在循環(huán)體外被使用。即,它是被循環(huán)的最后迭代所產(chǎn)生的值,并且隨后在循環(huán)體外就被需要。實(shí)際上,每一個被最后迭代所產(chǎn)生的值具有與循環(huán)迭代次數(shù)n無關(guān)的一個位置,并且當(dāng)循環(huán)迭代次數(shù)n大于0時(shí),這個位置是不變的。這個循環(huán)的最后迭代需要這個循環(huán)規(guī)劃被產(chǎn)生p次。所以,在最后迭代的開始和從循環(huán)最后退出之間,存在對循環(huán)的pv個環(huán)回。如果任何值在進(jìn)入循環(huán)時(shí)是有效的,并且在退出循環(huán)時(shí)也是有效的,然后就必須有至少pv個循環(huán)寄存器。
任何在循環(huán)的一個迭代中被產(chǎn)生的、被作為在前一個迭代中其本身的一個函數(shù)而計(jì)算出的值被稱作一個回歸。在進(jìn)入到循環(huán)以前,這樣的回歸被進(jìn)行初始化,然后在完成循環(huán)后被使用。一個循環(huán)的示例被顯示在圖12中。在這個示例中,在進(jìn)入到循環(huán)以前,一個標(biāo)量變量s被進(jìn)行初始化(行1),在循環(huán)體內(nèi)具有一個回歸(行4),并且在完成循環(huán)后(行7)也被使用。所以,其壽命在整個循環(huán)內(nèi)均有效。
如前面所描述的,這個編譯器將這樣安排,在每一個迭代中,行4的代碼將從邏輯寄存器號碼SR讀取在前一個迭代中被產(chǎn)生的值s,并且將在當(dāng)前迭代中所產(chǎn)生的新值s寫入到邏輯寄存器號碼SW。這些寄存器號碼被這樣選擇,以使在環(huán)回寄存器文件v次,在前一個迭代中被寫入到寄存器SW的值現(xiàn)在可以從當(dāng)前迭代中的寄存器SR中獲得。
初始值s,在圖12中的行1被定義的,必須被輸入到一個合適的寄存器S1,并且必須這樣選擇寄存器S1,當(dāng)?shù)谝坏谛?中從SR中進(jìn)行讀取時(shí),在行1中被寫入到S1中的值已經(jīng)被旋轉(zhuǎn)以使現(xiàn)在可以從寄存器SR中訪問它。在第一迭代中行1和行4之間的確切旋轉(zhuǎn)數(shù)目與行4發(fā)生的軟件流水線級和使用s的指令在循環(huán)規(guī)劃中的位置相關(guān)。假設(shè)需要將S1中的值移動到SR所需要的旋轉(zhuǎn)數(shù)目是q。
將s最后一次寫入到邏輯寄存器號碼SW是發(fā)生在循環(huán)的最后迭代的第4行。這個最后被寫入的值是在從循環(huán)退出后,在行7中從邏輯寄存器號碼SE讀取的。假設(shè)需要將SW中的值移動到SE的旋轉(zhuǎn)次數(shù)是t。
這些寄存器S1,SW,SR,和SE之間的關(guān)系被示意性地表示在圖13中。在圖13中,這個圓表示寄存器文件的旋轉(zhuǎn)區(qū)域。旋轉(zhuǎn)區(qū)域的大小(即,圖13的周長)假設(shè)是pv個寄存器,這是當(dāng)至少有在進(jìn)入循環(huán)時(shí)有效、在退出循環(huán)時(shí)也有效的一個值時(shí)才需要的寄存器數(shù)目。在旋轉(zhuǎn)區(qū)域中的獨(dú)立寄存器被沿周長等間隔地劃分。
假設(shè)在軟件流水線級k來讀取s(行4),其中0<=k<=p-1。也假設(shè),當(dāng)在規(guī)劃中旋轉(zhuǎn)了w次后來讀取s(行4),其中0<=w<=v-1。所以,q=kv+w并且t=v(p-k-1)+v-w。從這點(diǎn)可以得出,從行1中s的開始定義到退出循環(huán)后使用s的、需要值的指令能夠發(fā)現(xiàn)這個值的位置的旋轉(zhuǎn)次數(shù)是q+t-v,簡單地,就是v(p-1)。
所以,假定一個初始邏輯寄存器S1,其中在執(zhí)行這個循環(huán)以前將s寫入到邏輯寄存器S1,這個編譯器知道在完成循環(huán)后,將在邏輯寄存器號碼S1+v(p-1)中發(fā)現(xiàn)最后被寫入的s值。但是,這不適合于特殊的情形,其中根本不執(zhí)行這個循環(huán)體,如果在執(zhí)行時(shí),發(fā)現(xiàn)圖12的行2中的循環(huán)控制變量N的值為0或者是負(fù)的,就出現(xiàn)這個特殊情形。在這個特殊情形中,簡單地,將在S1中發(fā)現(xiàn)行7所需要的s值,而不是在寄存器S1+v(p-1)中(與所有其它情形相同)。這個不一致性的不方便處在于,這個編譯器將需要在編譯的代碼中補(bǔ)充特殊的指令來處理在執(zhí)行時(shí)N將是0或者負(fù)的情形。理想的,人們希望能夠避免編譯器來采取這樣的特殊措施。
所以,在上面提到的、對寄存器重新命名方法的增強(qiáng)中,這個處理器被安排成,如果在執(zhí)行時(shí)發(fā)現(xiàn)循環(huán)迭代次數(shù)為0,因此根本不可能執(zhí)行這個循環(huán)體,然后在這個處理器繼續(xù)轉(zhuǎn)到循環(huán)的末尾以前,將寄存器文件旋轉(zhuǎn)v(p-1)次。其效果是產(chǎn)生在退出循環(huán)以后的第一指令以前,跳過v(p-1)個序列號碼。通過產(chǎn)生循環(huán)規(guī)劃指令p-1次而不需要實(shí)際執(zhí)行指令,就可以方便地實(shí)現(xiàn)這點(diǎn)。產(chǎn)生每一個產(chǎn)生值的指令的動作將旋轉(zhuǎn)寄存器文件,以使每一個完整循環(huán)規(guī)劃的產(chǎn)生將寄存器文件旋轉(zhuǎn)v次。使用這樣的方法,當(dāng)循環(huán)迭代次數(shù)是0時(shí),s的初始值可以從邏輯寄存器S1+v(p-1)獲得,如所希望的。
通過有效地直接進(jìn)入到軟件流水線循環(huán)的關(guān)閉模式,并且設(shè)置一個附加的(全程)謂詞錯誤(predicate false)來避免執(zhí)行任何指令,就可以產(chǎn)生指令p-1次。
上面所描述的增強(qiáng)確實(shí)促使處理器在循環(huán)迭代次數(shù)是0的情形下在執(zhí)行行動采取特殊的措施。但是,通常這是不可能發(fā)生的,所以典型的執(zhí)行時(shí)間代價(jià)將非常小。
當(dāng)使用其它寄存器重新命名技術(shù),例如前面所考慮的、參考圖5,6(A)和6(B)而描述的技術(shù)時(shí),也可以采用這個增強(qiáng)選項(xiàng)。在這個情形下,這個處理器被安排成在一個0迭代次數(shù)的下,將寄存器旋轉(zhuǎn)p-1個寄存器。
這樣,本發(fā)明的另一個方面可以提供一個處理器,每一次跨越一個軟件流水線界限時(shí)(而不是每一次產(chǎn)生一個產(chǎn)生值的指令時(shí))這個處理器對可重新命名的寄存器進(jìn)行重新命名,并且在一個0迭代次數(shù)的情形下跳過一個或者多個可重新命名的寄存器。在這樣一個處理器中,被跳過的寄存器數(shù)目與產(chǎn)生值的指令的數(shù)目無關(guān),并且與軟件流水線級的數(shù)目相關(guān)。優(yōu)選地,跳過的寄存器數(shù)目是p-1。
另外,應(yīng)理解,對需要被正確計(jì)算的序列偏移來說,因?yàn)榭深A(yù)測的執(zhí)行而必須被關(guān)閉的指令仍然必須增加值的序列號碼。但是,這決不會增加需要保存一個循環(huán)中的中間值的寄存器的數(shù)目。
假設(shè)回歸值(用在任何前一迭代中其本身的一個函數(shù)來計(jì)算的任何循環(huán)變量值)以正確的順序在循環(huán)外被初始化,就可以聯(lián)系軟件流水線來正確地操作上面所描述的技術(shù)。
包括在每一個需要值的指令中的信息不需要是一個序列偏移。也可能使用其直接分配序列號碼或者相對某參考點(diǎn)而不是目前所達(dá)到的序列號碼的被分配序列號碼來規(guī)定保存所需要值的寄存器的標(biāo)識。類似地,在一個產(chǎn)生值的指令中,與被分配序列號碼相關(guān)的信息可以被規(guī)定成以使寄存器的分配更靈活。例如,一個序列偏移(例如,“@-2”)可以被規(guī)定來表示用于保存被產(chǎn)生值的一個除0之外的邏輯寄存器號碼。另外,這個目的寄存器可以根據(jù)被分配序列號碼來明確地規(guī)定。
應(yīng)理解,被分配到被產(chǎn)生值的序列號碼是有限的,例如255,以使在達(dá)到其限制值后,序列又從0開始。
通過示例,盡管上面的描述涉及能夠進(jìn)行軟件流水線執(zhí)行的一個VLIW處理器,應(yīng)理解,本發(fā)明能夠應(yīng)用于不具有這些特征的處理器。實(shí)現(xiàn)了本發(fā)明的一個處理器可以被作為一個處理器“核心”包括在一個高集成度“單片系統(tǒng)”(SOC)中,以用于多媒體應(yīng)用,網(wǎng)絡(luò)路由器,視頻移動電話,智能機(jī)動車,數(shù)字電視,語音識別,3D游戲,等等。
權(quán)利要求
1.一個處理器,包括指令產(chǎn)生裝置,用于以一預(yù)定序列來產(chǎn)生需要被執(zhí)行的指令,所述指令序列包括預(yù)先選擇的、當(dāng)執(zhí)行時(shí)用于產(chǎn)生相應(yīng)值的指令;指令執(zhí)行裝置,用于執(zhí)行所產(chǎn)生的指令;寄存器裝置,具有多個寄存器,用于保存執(zhí)行指令時(shí)所產(chǎn)生的值;序列號碼分配裝置,用于根據(jù)所述產(chǎn)生值的指令的產(chǎn)生順序來向所述產(chǎn)生值的指令所產(chǎn)生的所述值分配相應(yīng)的序列號碼;和寄存器分配裝置,用于給每一個所述被產(chǎn)生的值分配所述寄存器中的一個,用于保存該被產(chǎn)生的值,這與被分配到這個值的序列號碼相關(guān)。
2.如權(quán)利要求1的處理器,其中所述寄存器分配裝置被用于將其所述寄存器分配給每一個所述被產(chǎn)生值,而與被包括在當(dāng)執(zhí)行時(shí)產(chǎn)生這個值的、產(chǎn)生值的指令中的信息無關(guān)。
3.如權(quán)利要求1或者2的處理器,其中所述指令序列也包括至少一個預(yù)選擇的、需要值的指令,當(dāng)被執(zhí)行時(shí),所述需要值的指令需要所述產(chǎn)生值的指令中前一個被產(chǎn)生的指令所產(chǎn)生的所述值,這個處理器進(jìn)一步包括被分配寄存器標(biāo)識裝置,在執(zhí)行這樣一個需要值的指令期間,所述被分配寄存器標(biāo)識裝置被用于采用包括在需要值的指令中的信息,這與被分配到所述前一個被產(chǎn)生指令的所述產(chǎn)生值的所述序列號碼相關(guān),來標(biāo)識被分配成用于保存這個值的寄存器。
4.如權(quán)利要求3的處理器,其中所述信息是表示在這個點(diǎn)上,以所述預(yù)定序列,產(chǎn)生所述需要值的指令中最近被分配的序列號碼和被分配到所述前一個產(chǎn)生指令的產(chǎn)生值的所述序列號碼之間的差異的一個序列偏移。
5.如前述權(quán)利要求中任何一個的處理器,其中所述寄存器裝置包括一組物理寄存器,可分配成用于保存所述被產(chǎn)生值;映射裝置,用于將被指令執(zhí)行裝置所規(guī)定的邏輯寄存器標(biāo)識符映射到所述集合中相應(yīng)的物理寄存器;和寄存器重新命名裝置,用于在處理器工作期間,動態(tài)地改變在所述邏輯寄存器標(biāo)識符和所述相應(yīng)的物理寄存器之間的所述映射。
6.如權(quán)利要求5的處理器,其中所述寄存器分配裝置被用于將所述物理寄存器中的一個分配給每一個所述產(chǎn)生值的指令所產(chǎn)生的所述值,其中在產(chǎn)生這個產(chǎn)生值的指令的時(shí)刻被應(yīng)用的所述映射中,這個物理寄存器具有一預(yù)定的邏輯寄存器標(biāo)識符。
7.如權(quán)利要求5或者6的處理器,其中所述寄存器重新命名裝置被用于在每一次產(chǎn)生這樣一個產(chǎn)生值的指令時(shí),改變所述映射。
8.如權(quán)利要求7的處理器,其中所述寄存器重新命名裝置可以選擇性地在一個關(guān)閉模式和一個打開模式之間進(jìn)行切換,在一個關(guān)閉模式中,當(dāng)產(chǎn)生這樣一個產(chǎn)生值的指令時(shí)不改變所述映射,而在打開模式中,每一次產(chǎn)生這樣一個產(chǎn)生值的指令時(shí)就改變所述映射。
9.如權(quán)利要求7或者8的處理器,其中所述寄存器重新命名裝置可以選擇性地在一個第一重新命名模式和一第二重新命名模式之間進(jìn)行切換,在第一重新命名模式中,每一次產(chǎn)生這樣一個產(chǎn)生值的指令時(shí)就改變所述映射,第二重新命名模式與所述第一重新命名模式不同。
10.如權(quán)利要求9的處理器,其中在所述第二重新命名模式中,在執(zhí)行一個軟件流水線循環(huán)期間,每一次跨越一個軟件流水線界限,就改變所述映射。
11.如權(quán)利要求8到10的處理器,進(jìn)一步包括一個模式寄存器,所述模式寄存器具有一個或者多個用于規(guī)定所述寄存器重新命名裝置具有哪一個所述模式的模式比特。
12.如權(quán)利要求5到11中任何一個的處理器,其中在一個寄存器文件的一個可重新命名的區(qū)域中,所述集合的物理寄存器被安排成具有連續(xù)的地址,并且一個接一個;和所述映射裝置是用于使用一個映射偏移將一個被規(guī)定的邏輯寄存器標(biāo)識符映射到其相應(yīng)的物理寄存器,所述映射偏移表示這個被規(guī)定邏輯寄存器標(biāo)識符和所述可重新命名區(qū)域中相應(yīng)的物理寄存器的所述地址之間的一個可變差異。
13.如權(quán)利要求12的處理器,其中所述寄存器重新命名裝置被用于通過將所述映射偏移增加或者減少來改變所述映射偏移。
14.當(dāng)權(quán)利要求12或13從屬于權(quán)利要求4時(shí),如權(quán)利要求12或者13的處理器,其中所述邏輯寄存器標(biāo)識符由所述序列偏移直接提供。
15.如前述權(quán)利要求中任何一個的處理器,其中所述指令產(chǎn)生裝置具有多個指令產(chǎn)生槽,并且能夠被用于在不同的相應(yīng)指令產(chǎn)生槽同時(shí)產(chǎn)生多個指令;和所述指令執(zhí)行裝置具有分別與所述指令產(chǎn)生槽相應(yīng)的多個指令執(zhí)行單元,每一個指令執(zhí)行單元可以被用于執(zhí)行在其所述相應(yīng)的指令產(chǎn)生點(diǎn)被產(chǎn)生的指令。
16.如權(quán)利要求15的處理器,其中當(dāng)在不同的相應(yīng)指令產(chǎn)生槽同時(shí)產(chǎn)生兩個或者多個產(chǎn)生值的指令時(shí),所述序列號碼分配裝置可以被用于根據(jù)分配到產(chǎn)生這兩個或者多個產(chǎn)生值的指令的相應(yīng)指令產(chǎn)生槽的一預(yù)定產(chǎn)生槽順序,來向這些指令所產(chǎn)生的產(chǎn)生值分配不同的相應(yīng)序列號碼。
17.如前述權(quán)利要求中任何一個的處理器,可以被用于以一個軟件流水線的方式來執(zhí)行所述序列的指令,其中所述預(yù)選擇的、產(chǎn)生值的指令包括當(dāng)被執(zhí)行時(shí)將產(chǎn)生在循環(huán)中值方式變化的值的指令。
18.如前述權(quán)利要求中任何一個的處理器,進(jìn)一步包括循環(huán)處理裝置,在執(zhí)行所述指令期間發(fā)現(xiàn)一個軟件流水線循環(huán)需要一個0次的迭代時(shí),可以被用于在產(chǎn)生循環(huán)后的第一指令前,促使所述序列號碼分配裝置跳過一個或者多個所述序列號碼。
19.如權(quán)利要求18的處理器,其中被跳過的序列號碼數(shù)目與在所述循環(huán)中每一迭代所產(chǎn)生的所述產(chǎn)生值的指令的數(shù)目相關(guān),并且也與所述循環(huán)中軟件流水線級的數(shù)目相關(guān)。
20.如權(quán)利要求18或者19的處理器,其中所述循環(huán)處理裝置可以被用于在所述事件中促使產(chǎn)生所述循環(huán)的指令,產(chǎn)生的次數(shù)與所述循環(huán)中軟件流水線級的數(shù)目相關(guān),而禁止所述指令執(zhí)行裝置執(zhí)行這些指令,因此所述循環(huán)中每一個所述產(chǎn)生值的指令被產(chǎn)生所述次數(shù)。
21.一個編譯方法,用于將一個高級程序指令序列轉(zhuǎn)換為將要被一個處理器所執(zhí)行的、相應(yīng)的低級指令序列,這個方法包括步驟決定所述相應(yīng)序列中的哪一個所述低級指令是預(yù)先選擇的、用于產(chǎn)生值的指令,并且哪一個是預(yù)先選擇的、需要值的指令,每一個所述產(chǎn)生值的指令是當(dāng)被執(zhí)行時(shí)就會產(chǎn)生一個值的一個指令,并且每一個所述需要值的指令是當(dāng)被執(zhí)行時(shí)就需要前一個產(chǎn)生的、產(chǎn)生值的指令所產(chǎn)生的所述值的一個指令;根據(jù)執(zhí)行期間相應(yīng)產(chǎn)生值的指令被產(chǎn)生的順序來向所述被產(chǎn)生值分配相應(yīng)的序列號碼;和用在執(zhí)行期間所述處理器所使用的信息來給每一個所述需要值的指令進(jìn)行編碼,以標(biāo)識這個指令所需要的所述產(chǎn)生值,這個信息與被分配到這個產(chǎn)生值上的所述序列號碼相關(guān)。
22.如權(quán)利要求21的方法,其中在所述編碼步驟中,所述信息是表示在產(chǎn)生所述需要值的指令時(shí)刻,分配到最近所述產(chǎn)生值的序列號碼與被分配到這個指令所需要的所述產(chǎn)生值的所述序列號碼之間的差異。
23.如權(quán)利要求21或者22的方法,其中在所述編碼步驟中,每一個所述產(chǎn)生值的指令被進(jìn)行編碼,并且不使用處理器使用來標(biāo)識保存所述被產(chǎn)生值的位置的信息。
24.如權(quán)利要求21到23中任何一個的方法,其中所述高級程序指令序列包括一個循環(huán)結(jié)構(gòu),這個方法進(jìn)一步包括步驟分析所述循環(huán)結(jié)構(gòu),以將這個循環(huán)結(jié)構(gòu)的高級程序指令轉(zhuǎn)換為根據(jù)一個軟件流水線級,被處理器迭代執(zhí)行的所述低級指令規(guī)劃;和當(dāng)在所述規(guī)劃中的一個所述指令是這樣一個產(chǎn)生值的指令,其中其所述產(chǎn)生值是一個循環(huán)中被改變的值時(shí),在不同的迭代中向這個指令所產(chǎn)生的值分配不同的序列號碼。
25.一個計(jì)算機(jī)程序,其中當(dāng)在一個計(jì)算機(jī)上執(zhí)行這個程序時(shí),這個程序?qū)⒋偈惯@個計(jì)算機(jī)執(zhí)行實(shí)現(xiàn)本發(fā)明權(quán)利要求21到24中任何一個編譯方法。
26.一個計(jì)算機(jī)程序,其中當(dāng)在一個計(jì)算機(jī)上執(zhí)行這個程序時(shí),這個程序?qū)⒋偈惯@個計(jì)算機(jī)執(zhí)行用于將一個高級程序指令序列轉(zhuǎn)換為被一個處理器所執(zhí)行的、一個相應(yīng)的低級程序指令序列,這個計(jì)算機(jī)程序包括一個決定部分,用于決定所述相應(yīng)序列中的哪一個所述低級指令是預(yù)先選擇的、用于產(chǎn)生值的指令,并且哪一個是預(yù)先選擇的、需要值的指令,每一個所述產(chǎn)生值的指令是當(dāng)被執(zhí)行時(shí)就會產(chǎn)生一個值的一個指令,并且每一個所述需要值的指令是當(dāng)被執(zhí)行時(shí)就需要前一個產(chǎn)生的、產(chǎn)生值的指令所產(chǎn)生的所述值的一個指令;一個分配部分,用于根據(jù)執(zhí)行期間相應(yīng)產(chǎn)生值的指令被產(chǎn)生的順序來向所述被產(chǎn)生值分配相應(yīng)的序列號碼;和一個編碼部分,用在執(zhí)行期間所述處理器所使用的信息來給每一個所述需要值的指令進(jìn)行編碼,以標(biāo)識這個指令所需要的所述產(chǎn)生值,這個信息與被分配到這個產(chǎn)生值上的所述序列號碼相關(guān)。
27.如權(quán)利要求25或者26中的計(jì)算機(jī)程序,是被一個承載媒質(zhì)所承載的。
28.如權(quán)利要求27的計(jì)算機(jī)程序,其中所述承載媒質(zhì)可以是一個存儲媒質(zhì)。
29.如權(quán)利要求27的計(jì)算機(jī)程序,其中所述承載媒質(zhì)可以是一個信號。
全文摘要
一個處理器,能夠支持軟件流水線執(zhí)行,這個處理器的指令產(chǎn)生單元10以一個預(yù)定序列產(chǎn)生需要被執(zhí)行的指令。處理器根據(jù)相應(yīng)產(chǎn)生值的指令的產(chǎn)生順序來給所產(chǎn)生的值分配相應(yīng)的序列號碼。每一個被產(chǎn)生的值被分配寄存器集合中的一個寄存器,該寄存器與分配到這個值的序列號碼相關(guān)。每一次產(chǎn)生一個產(chǎn)生值的指令時(shí),就可以對寄存器進(jìn)行重新命名,從而編譯器對寄存器進(jìn)行分配的工作被簡化,并且指令集合可以更緊湊。
文檔編號G06F9/38GK1308274SQ0110325
公開日2001年8月15日 申請日期2001年2月8日 優(yōu)先權(quán)日2000年2月8日
發(fā)明者尼格爾·皮特·托法姆 申請人:斯羅揚(yáng)有限公司