專利名稱:有限游程轉(zhuǎn)移預(yù)測(cè)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明一般涉及流水線計(jì)算機(jī)系統(tǒng),特別涉及一種計(jì)算機(jī)系統(tǒng)所采用的用于預(yù)測(cè)條件轉(zhuǎn)移指令的方向的轉(zhuǎn)移預(yù)測(cè)方法。
背景技術(shù):
執(zhí)行條件轉(zhuǎn)移所需的時(shí)間嚴(yán)重地限制了流水線處理器的性能。處理器一般是以順序方式取出和執(zhí)行指令的;即,在從地址n取出的指令Ei之后立即執(zhí)行的指令Ei+1(Ei的后繼指令)的地址是通過把Ei的長度加n而找到的。無條件轉(zhuǎn)移是一個(gè)其執(zhí)行使得控制轉(zhuǎn)移到一個(gè)位于非順序地址的指令的指令。因此一個(gè)轉(zhuǎn)移B的后繼者是從一個(gè)任意目標(biāo)地址取出的。在一些計(jì)算機(jī)中,轉(zhuǎn)移指令B的目標(biāo)地址包含在該指令中,而在其它的計(jì)算機(jī)中目標(biāo)地址是由包含在指令B中的補(bǔ)償值加上指令B本身的取出地址形成的。
根據(jù)對(duì)一些數(shù)據(jù)段的測(cè)試,一個(gè)條件轉(zhuǎn)移指令有條件地造成一個(gè)控制的轉(zhuǎn)移。與目標(biāo)地址的說明一起,這樣一個(gè)指令包含一個(gè)待測(cè)試的條件。這個(gè)條件一般是一個(gè)數(shù)的一小組代數(shù)特性之一該數(shù)是或不是零,該數(shù)是或不是正的,該數(shù)是或不是負(fù)的,等等。如果滿足了條件,則進(jìn)行轉(zhuǎn)移即,從轉(zhuǎn)移的目標(biāo)地址取出后繼指令。如果條件不滿足,則后繼指令是按順序的下一個(gè)指令,就象非轉(zhuǎn)移指令一樣。
流水線計(jì)算機(jī)通過一個(gè)由數(shù)個(gè)處理階段——一般至少五個(gè)——構(gòu)成的流水線傳遞每個(gè)指令。在每個(gè)時(shí)鐘周期中可以把一條新的指令輸入到流水線中。結(jié)果,一臺(tái)流水線計(jì)算機(jī)可以同時(shí)具有在不同執(zhí)行階段的幾個(gè)指令,因此在每個(gè)階段最大地利用了硬件資源。
當(dāng)轉(zhuǎn)移指令是在待測(cè)試的數(shù)據(jù)代數(shù)條件確定之前取出時(shí),會(huì)出現(xiàn)流水線計(jì)算機(jī)中產(chǎn)生由條件轉(zhuǎn)移引起的性能降低。在那些由轉(zhuǎn)移指令本身指明待測(cè)試數(shù)據(jù)存儲(chǔ)單元的計(jì)算機(jī)中這種現(xiàn)象是最不利的。對(duì)代數(shù)條件的評(píng)估只是在經(jīng)過幾個(gè)流水線階段之后才能進(jìn)行。由于在取出轉(zhuǎn)移指令以前不能開始對(duì)代數(shù)條件的評(píng)估,因此轉(zhuǎn)移指令取出后的數(shù)個(gè)時(shí)鐘周期之后才能知道待測(cè)試的條件。因?yàn)橹挥性跍y(cè)試了數(shù)據(jù)之后才能肯定地確定待取出的下一個(gè)指令的存儲(chǔ)單元,所以有數(shù)個(gè)時(shí)鐘周期不能取出指令。
轉(zhuǎn)移預(yù)測(cè)是要在取出一個(gè)條件轉(zhuǎn)移時(shí)立即預(yù)測(cè)是否要執(zhí)行該轉(zhuǎn)移,而不必等待測(cè)試結(jié)果的確定。以這種方式,能夠以滿速率連續(xù)取出指令。如果預(yù)測(cè)出轉(zhuǎn)移,則需要確認(rèn)該預(yù)測(cè),并且需要收回錯(cuò)誤的預(yù)測(cè)。如果預(yù)測(cè)是不正確的,那么在錯(cuò)誤地預(yù)測(cè)的(“壞的”)轉(zhuǎn)移之后取出的所有指令都是錯(cuò)誤的指令,因此必須逆向恢復(fù)它們的執(zhí)行結(jié)果。記錄,確認(rèn)和修正預(yù)測(cè)轉(zhuǎn)移的技術(shù)不是本發(fā)明的主題。
由于必須放棄在一個(gè)壞的轉(zhuǎn)移之后取出的所有指令,所以它們代表了浪費(fèi)的效率。因此機(jī)器的性能是直接與轉(zhuǎn)移預(yù)測(cè)的精確性相關(guān)的。
轉(zhuǎn)移預(yù)測(cè)方案可以是靜態(tài)的或是動(dòng)態(tài)的。在一種靜態(tài)方案中,轉(zhuǎn)移指令本身包含著預(yù)測(cè);這一般是由產(chǎn)生了該程序的編譯程序提供的,其基礎(chǔ)是編譯程序已經(jīng)執(zhí)行了一個(gè)典型數(shù)據(jù)集的程序。只有在計(jì)算機(jī)的指令系統(tǒng)是考慮到這一點(diǎn)而設(shè)計(jì)的時(shí)候,靜態(tài)預(yù)測(cè)才是可能的。大多數(shù)商業(yè)上成功的指令系統(tǒng)并不提供允許靜態(tài)轉(zhuǎn)移預(yù)測(cè)的功能。
動(dòng)態(tài)轉(zhuǎn)移預(yù)測(cè)使用在程序執(zhí)行過程中硬件收集的有關(guān)轉(zhuǎn)移的信息。硬件只能“知道”一個(gè)給定轉(zhuǎn)移指令的過去的執(zhí)行模式,并因此必須使其動(dòng)態(tài)預(yù)測(cè)基于這種信息。由于條件轉(zhuǎn)移是相當(dāng)頻繁的(其密度達(dá)到每五個(gè)指令就有一個(gè)),因此如果不使用很大的存儲(chǔ)容量,對(duì)每個(gè)條件轉(zhuǎn)移的可以存儲(chǔ)的執(zhí)行歷史的量不可能很大。一般在一個(gè)程序中轉(zhuǎn)移預(yù)測(cè)信息僅保存在一個(gè)小的——但卻是不定的——轉(zhuǎn)移的子集中。
在一個(gè)程序的執(zhí)行過程中的任何一個(gè)時(shí)刻的一個(gè)給定的轉(zhuǎn)移指令的正確執(zhí)行歷史可以用二進(jìn)制符號(hào)1和0的一個(gè)序列代表。這個(gè)序列指出該轉(zhuǎn)移指令是執(zhí)行了(1)或是沒有執(zhí)行(0)。每次執(zhí)行一個(gè)轉(zhuǎn)移指令時(shí),根據(jù)轉(zhuǎn)移的正確的(不必是預(yù)測(cè)的)執(zhí)行是否發(fā)生了,在這個(gè)轉(zhuǎn)移歷史的終點(diǎn)加上一個(gè)1或0使轉(zhuǎn)移歷史延長。
可以把一個(gè)轉(zhuǎn)移指令的執(zhí)行歷史劃分為多個(gè)游程。一個(gè)轉(zhuǎn)移游程是一個(gè)前后各有一個(gè)1的連續(xù)的0的序列,或是相反。也就是說,在該歷史中的每個(gè)符號(hào)完全在一個(gè)游程中,并且每個(gè)游程是全部由0或全部由1組成的。一個(gè)游程的長度是其中符號(hào)的數(shù)量。
現(xiàn)有技術(shù)的動(dòng)態(tài)轉(zhuǎn)移預(yù)測(cè)機(jī)構(gòu)利用了這樣一個(gè)觀察結(jié)果,對(duì)于一個(gè)程序中的許多轉(zhuǎn)移,所有的或是幾乎所有的0的游程的長度都是1。這些通常是結(jié)束循環(huán)的轉(zhuǎn)移。一個(gè)循環(huán)一般是通過將一個(gè)條件轉(zhuǎn)移放置在構(gòu)成循環(huán)體的指令序列的終點(diǎn)來實(shí)現(xiàn)的。該條件轉(zhuǎn)移測(cè)試循環(huán)結(jié)束的條件,并且如果條件為假時(shí)轉(zhuǎn)移到成為循環(huán)體的序列中的第一指令。如果該轉(zhuǎn)移沒有執(zhí)行,循環(huán)被終止。下一次執(zhí)行的轉(zhuǎn)移將在循環(huán)下一次激活中第一個(gè)被執(zhí)行,除非這次激活在一次追蹤后終止。因此存在著一個(gè)由一個(gè)代表循環(huán)終止的單一的0構(gòu)成的游程。(一些編譯程序把條件轉(zhuǎn)移放在循環(huán)體的開始而不是末尾構(gòu)造循環(huán)。通過執(zhí)行轉(zhuǎn)移終止這樣一個(gè)循環(huán)。這種循環(huán)構(gòu)造導(dǎo)致具有由一個(gè)單一的1構(gòu)成的游程的執(zhí)行歷史。)現(xiàn)有技術(shù)轉(zhuǎn)移預(yù)測(cè)將每次預(yù)測(cè)建立在每個(gè)轉(zhuǎn)移的兩比特的存儲(chǔ)歷史上。這些比特是一個(gè)四-態(tài)狀態(tài)機(jī)的狀態(tài)(圖1)。這個(gè)狀態(tài)機(jī)的作用是要預(yù)測(cè)轉(zhuǎn)移將具有與上一個(gè)長度大于1的游程相同的結(jié)果。因此在一個(gè)總是被不止一次追蹤的,因而其執(zhí)行歷史沒有兩個(gè)或更多0的游程的循環(huán)的場(chǎng)合,預(yù)測(cè)將是恒定的。
這種現(xiàn)有的狀態(tài)機(jī)的預(yù)測(cè)精度與1的游程的長度直接相關(guān)。如果平均游程長度是n,那么每n次正確的預(yù)測(cè)中有一次錯(cuò)誤的預(yù)測(cè)。因此對(duì)于較短的游程效率較差。本發(fā)明的目的是要改進(jìn)對(duì)于短游程長度轉(zhuǎn)移的預(yù)測(cè)精度。
發(fā)明內(nèi)容
許多轉(zhuǎn)移具有恒定或緩慢變化游程長度,也就是說,幾個(gè)連續(xù)的1的游程有同樣的長度。本發(fā)明通過增加兩個(gè)小計(jì)數(shù)器,一個(gè)上計(jì)數(shù)器和一個(gè)下計(jì)數(shù)器來增強(qiáng)為每個(gè)轉(zhuǎn)移所存儲(chǔ)的歷史。這兩個(gè)計(jì)數(shù)器與現(xiàn)有技術(shù)的狀態(tài)機(jī)轉(zhuǎn)移預(yù)測(cè)器協(xié)同工作。
上計(jì)數(shù)器計(jì)算當(dāng)前游程的長度。如果游程在計(jì)數(shù)器溢出之前終止,該上計(jì)數(shù)器的值被復(fù)制到下計(jì)數(shù)器中,并把上計(jì)數(shù)器重新初始化為零。然后下計(jì)數(shù)器在接下來的游程中遞減計(jì)數(shù)。在下計(jì)數(shù)器達(dá)到零之前,使用的預(yù)測(cè)是狀態(tài)機(jī)作出的。在下計(jì)數(shù)器為零的第一執(zhí)行時(shí),對(duì)狀態(tài)機(jī)的預(yù)測(cè)進(jìn)行求補(bǔ)。如果當(dāng)前游程的長度與前面的游程的長度相等,那么預(yù)測(cè)將是正確的。只要游程長度保持恒定,本發(fā)明的預(yù)測(cè)精度是100%。如果游程長于可能計(jì)算的長度,計(jì)數(shù)器失效,預(yù)測(cè)依賴狀態(tài)機(jī)獨(dú)自進(jìn)行。
每次發(fā)布任何條件轉(zhuǎn)移指令B,都要檢查它的預(yù)測(cè)歷史,以確定是否將該轉(zhuǎn)移預(yù)測(cè)為被執(zhí)行的轉(zhuǎn)移或是未執(zhí)行的轉(zhuǎn)移,并且立即部分地根據(jù)該預(yù)測(cè)更新歷史。該更新還依賴于這是否是B的再發(fā)布。只有當(dāng)B的任何執(zhí)行BE被錯(cuò)誤地預(yù)測(cè),此時(shí)還不知道正確的方向,并且知道沒有任何BE之前的轉(zhuǎn)移的執(zhí)行是被錯(cuò)誤地預(yù)測(cè)的時(shí)候才發(fā)生B的再發(fā)布。在這種場(chǎng)合,發(fā)生對(duì)BE的轉(zhuǎn)移修正放棄BE和所有任何后續(xù)指令的執(zhí)行,并再發(fā)布B。
更新計(jì)數(shù)器的算法是建立在狀態(tài)機(jī)預(yù)測(cè)器總是預(yù)測(cè)相同方向的假設(shè)的基礎(chǔ)上的。因此,一個(gè)游程的終點(diǎn)是僅由計(jì)數(shù)器預(yù)測(cè)的。一個(gè)再發(fā)布意味著錯(cuò)誤地預(yù)測(cè)了游程長度沒有作出對(duì)游程長度的預(yù)測(cè),或是把游程長度預(yù)測(cè)的過短或過長。如果因?yàn)榍懊娴挠纬烫L而不能計(jì)數(shù),而根本沒有作出游程長度的預(yù)測(cè),則把上計(jì)數(shù)器設(shè)置為0,以防萬一新開始的游程是短的足以進(jìn)行計(jì)數(shù),并且將下計(jì)數(shù)器置位為使預(yù)測(cè)器失效的-1。如果由于游程比預(yù)計(jì)提前結(jié)束而使再發(fā)布轉(zhuǎn)移預(yù)測(cè)錯(cuò)誤,則將新的,較短的長度從上計(jì)數(shù)器復(fù)制到下計(jì)數(shù)器,并把上計(jì)數(shù)器復(fù)位為0。如果預(yù)測(cè)的游程長度太短,上計(jì)數(shù)器繼續(xù)遞增,以計(jì)算出正確的較長的長度,并且當(dāng)知道不能正確地預(yù)測(cè)出這個(gè)較長的游程的終點(diǎn)時(shí),將下計(jì)數(shù)器置位為-1。
對(duì)于任何一個(gè)不是再發(fā)布的轉(zhuǎn)移的發(fā)布,如果上計(jì)數(shù)器已經(jīng)到達(dá)其最大計(jì)數(shù)時(shí),該計(jì)數(shù)器停留在該計(jì)數(shù)上,并把下計(jì)數(shù)器置位為-1,防止任何游程長度預(yù)測(cè)。否則,如果下計(jì)數(shù)器不是0,就遞增上計(jì)數(shù)器的值,指出游程的預(yù)測(cè)終點(diǎn);在這種場(chǎng)合,把上計(jì)數(shù)器復(fù)制到下計(jì)數(shù)器,并隨后把上計(jì)數(shù)器復(fù)位為0。如果上計(jì)數(shù)器沒有在其最大值,下計(jì)數(shù)器沒被禁止,那么如果下計(jì)數(shù)器還沒有到0,就遞減下計(jì)數(shù)器值。
使用本發(fā)明而增加的對(duì)每個(gè)轉(zhuǎn)移必須存儲(chǔ)的狀態(tài)信息量是很大的。所幸的是,少量的比特就能給出高的性能增益。三比特計(jì)數(shù)器可以正確地預(yù)測(cè)所有小于7的恒定游程長度。不能正確預(yù)測(cè)的最短游程長度,7,具有從狀態(tài)機(jī)預(yù)測(cè)器獨(dú)自獲得的87%的精度。四比特計(jì)數(shù)器給出至少93%的精度。
圖1示出了現(xiàn)有技術(shù)中的轉(zhuǎn)移預(yù)測(cè)機(jī)構(gòu)的狀態(tài)機(jī)圖;圖2示出了本發(fā)明的一個(gè)實(shí)施例的轉(zhuǎn)移預(yù)測(cè)機(jī)構(gòu)的框圖;圖3示出了圖2中的預(yù)測(cè)模塊的電路圖;圖4示出了圖2中的更新模塊運(yùn)行的算法的流程圖;圖5說明了用于根據(jù)本發(fā)明的采用具有恒定游程長度的條件轉(zhuǎn)移指令的一組指令的移動(dòng)預(yù)測(cè)機(jī)構(gòu)的運(yùn)行;圖6說明了用于根據(jù)本發(fā)明的采用具有變量游程長度的條件轉(zhuǎn)移指令的一組指令的移動(dòng)預(yù)測(cè)機(jī)構(gòu)的運(yùn)行。
具體實(shí)施例方式
本發(fā)明的優(yōu)選實(shí)施例與一種超標(biāo)量處理器(superscalarprocessor)有關(guān)。一個(gè)超標(biāo)量處理器每時(shí)鐘周期取出并向流水線發(fā)布多個(gè)——在本例中多達(dá)四個(gè)——指令。由于并不是所有的處理器元件都與本發(fā)明相關(guān),因此這些元件中的某些元件沒有包括在本發(fā)明的說明中。Popescu等1990年12月5日申請(qǐng)的題為“處理器構(gòu)造(ProcessorArchitecture)”序列號(hào)為07/622,893的美國專利申請(qǐng)中對(duì)此有所描述。
關(guān)于轉(zhuǎn)移指令的預(yù)測(cè)和本發(fā)明,所有轉(zhuǎn)移的執(zhí)行歷史存儲(chǔ)在兩種結(jié)構(gòu)中,一個(gè)轉(zhuǎn)移預(yù)測(cè)RAM 10和一個(gè)處理器中的轉(zhuǎn)移儲(chǔ)層(shelf)20。轉(zhuǎn)移預(yù)測(cè)RAM 10存儲(chǔ)直到最老的未決預(yù)測(cè)轉(zhuǎn)移,但并不包括這個(gè)最老的未決預(yù)測(cè)轉(zhuǎn)移本身的全部轉(zhuǎn)移執(zhí)行的歷史。轉(zhuǎn)移儲(chǔ)層20保持是一個(gè)未決預(yù)測(cè)轉(zhuǎn)移或是在一個(gè)未決預(yù)測(cè)轉(zhuǎn)移后面的所有轉(zhuǎn)移執(zhí)行的歷史。
在本優(yōu)選實(shí)施例中,轉(zhuǎn)移預(yù)測(cè)RAM 10是由1K(1024)字構(gòu)成的。為讀取轉(zhuǎn)移預(yù)測(cè)RAM 10,處理器的程序計(jì)數(shù)器寄存器11經(jīng)過地址總線13用一個(gè)值PC給RAM 10編址。PC是處理器中的下一次取出的指令的存儲(chǔ)器地址。轉(zhuǎn)移預(yù)測(cè)RAM 10有四個(gè)分別連接于輸出線14A-14D的輸出數(shù)據(jù)端口,Dout0-Dout3。通過這四個(gè)端口輸出分別位于四個(gè)地址PC,PC+1,PC+2和PC+3的指令的轉(zhuǎn)移預(yù)測(cè)狀態(tài),以適應(yīng)處理器的超標(biāo)量性質(zhì)。當(dāng)然,應(yīng)當(dāng)理解本發(fā)明同樣適用于簡單標(biāo)量處理。
轉(zhuǎn)移預(yù)測(cè)RAM 10是雙字編址的。即,忽略經(jīng)過地址總線13的最不重要的PC比特。因此,必須從轉(zhuǎn)移預(yù)測(cè)RAM 10給兩個(gè)連續(xù)的指令——一個(gè)為偶數(shù)PC值,另一個(gè)為緊接其后的較高的奇數(shù)PC值——賦予相同的預(yù)測(cè)歷史。假設(shè)兩個(gè)連續(xù)的轉(zhuǎn)移指令極少出現(xiàn),以這種方式,1K深(deep)RAM 10可以存儲(chǔ)達(dá)2K的指令的唯一的預(yù)測(cè)歷史。
轉(zhuǎn)移預(yù)測(cè)RAM 10不是超高速緩沖存儲(chǔ)器。它的內(nèi)容可以或可以不嚴(yán)格地反映一個(gè)給定轉(zhuǎn)移指令的預(yù)測(cè)狀態(tài)。例如,兩個(gè)PC值嚴(yán)格相差2K倍數(shù)的指令將產(chǎn)生混疊。兩個(gè)指令的歷史都將以相同的RAM字存儲(chǔ),并因此可能引起破壞性的干擾。由于轉(zhuǎn)移預(yù)測(cè)RAM 10只是一種預(yù)測(cè)機(jī)構(gòu),這種情況是允許的;以后將對(duì)每個(gè)轉(zhuǎn)移預(yù)測(cè)進(jìn)行校驗(yàn),如果有錯(cuò)誤,將對(duì)其進(jìn)行修復(fù)。因此,破壞性的混疊僅在預(yù)測(cè)精度上和性能上造成潛在的降低;轉(zhuǎn)移預(yù)測(cè)RAM 10的大小是與性能降低相平衡的。
轉(zhuǎn)移儲(chǔ)層20是一種存儲(chǔ)所有推測(cè)的轉(zhuǎn)移指令的預(yù)測(cè)歷史的12深(deep)的內(nèi)容定址先進(jìn)先出(FIFO)結(jié)構(gòu)。是一個(gè)其正確方向尚不為所知的預(yù)測(cè)轉(zhuǎn)移執(zhí)行的,或是跟隨其后的所有的指令執(zhí)行都是推測(cè)執(zhí)行。轉(zhuǎn)移儲(chǔ)層20具有一個(gè)連接于地址總線13的搜索端口,一個(gè)連接于三條線37B,39和40——下面將對(duì)它們進(jìn)行說明——的輸入端口,和一個(gè)連接于轉(zhuǎn)移預(yù)測(cè)RAM 10的更新端口。
轉(zhuǎn)移儲(chǔ)層20按它們發(fā)布的順序存儲(chǔ)推測(cè)的轉(zhuǎn)移執(zhí)行的轉(zhuǎn)移預(yù)測(cè)歷史。每個(gè)存儲(chǔ)在轉(zhuǎn)移儲(chǔ)層20中的項(xiàng)目具有兩個(gè)與本發(fā)明相關(guān)的部分一個(gè)條件轉(zhuǎn)移指令的預(yù)測(cè)歷史和該指令的地址。在每個(gè)時(shí)鐘周期當(dāng)增加項(xiàng)目信號(hào)40為真時(shí),即,是邏輯“1”時(shí),經(jīng)過輸入端口把一個(gè)新項(xiàng)目加到轉(zhuǎn)移儲(chǔ)層20中。
轉(zhuǎn)移儲(chǔ)層20象個(gè)有多個(gè)格層的堆棧那樣操作。把每個(gè)項(xiàng)目寫入“最底層”的空單元??梢越?jīng)過更新端口把最底層單元移動(dòng)到轉(zhuǎn)移預(yù)測(cè)RAM 10中。更新端口有三條線路一個(gè)用于轉(zhuǎn)移轉(zhuǎn)移儲(chǔ)層20的最底層單元中的條件轉(zhuǎn)移指令的預(yù)測(cè)歷史數(shù)據(jù)的數(shù)據(jù)總線19A,一個(gè)用于轉(zhuǎn)移最底層單元中的條件轉(zhuǎn)移指令的地址的地址總線19B,和一個(gè)用于向要執(zhí)行寫入操作的轉(zhuǎn)移預(yù)測(cè)RAM 10發(fā)送信號(hào)的允寫控制線19C。當(dāng)發(fā)生這種移動(dòng)時(shí),所有轉(zhuǎn)移儲(chǔ)層20中的項(xiàng)目向下移動(dòng)一格。轉(zhuǎn)移修復(fù)包括刪除發(fā)現(xiàn)錯(cuò)誤預(yù)測(cè)的轉(zhuǎn)移執(zhí)行的項(xiàng)目,以及其上方的所有項(xiàng)目。在這種方法中,將轉(zhuǎn)移儲(chǔ)層20中全部有效項(xiàng)目以它們進(jìn)入的順序從最底層項(xiàng)目起相鄰存儲(chǔ)。
當(dāng)把一個(gè)PC值經(jīng)過地址總線13施加到轉(zhuǎn)移儲(chǔ)層20的搜索端口時(shí),PC,PC+1,PC+2和PC+3地址同時(shí)與每個(gè)存儲(chǔ)的轉(zhuǎn)移指令地址比較,并且如果增加項(xiàng)目信號(hào)為真時(shí),與在輸入端口的地址比較。把這些比較的結(jié)果從轉(zhuǎn)移儲(chǔ)層20的四個(gè)數(shù)據(jù)輸出端口,Bout0-Bout3,送出。轉(zhuǎn)移儲(chǔ)層20的每個(gè)數(shù)據(jù)輸出端口有兩個(gè)部分,并且連接于兩組線路。一組是分別用于每個(gè)端口Bout0-Bout3的一比特匹配線22A-22D。另一組是分別用于每個(gè)端口Bout0-Bout3的數(shù)據(jù)總線21A-21D,用于每個(gè)存儲(chǔ)的轉(zhuǎn)移指令地址的預(yù)測(cè)歷史數(shù)據(jù)。當(dāng)且僅當(dāng)存在至少一個(gè)分別匹配于PC,PC+1,PC+2或PC+3的存儲(chǔ)地址時(shí),在這些輸出端口上的匹配線22A-22D帶有一個(gè)邏輯“1”。對(duì)于其匹配線22A-22D是邏輯“1”的任何端口,在這個(gè)端口的對(duì)應(yīng)的預(yù)測(cè)歷史數(shù)據(jù)是存儲(chǔ)在最頂層的(最近輸入的)地址匹配的項(xiàng)目中的預(yù)測(cè)歷史數(shù)據(jù)(在此把位于輸入端口的值考慮為最頂層)。
匹配線路22A-22D分別連接于并且控制二線一線多路復(fù)用器15A-15D。對(duì)于每個(gè)具有匹配線22A-22D是邏輯1的數(shù)據(jù)輸出端口Bout0-Bout3,其對(duì)應(yīng)的多路復(fù)用器15A-15D選擇來自轉(zhuǎn)移儲(chǔ)層20的數(shù)據(jù)總線21A-21D。選擇來自那個(gè)端口的預(yù)測(cè)歷史數(shù)據(jù)作為對(duì)那個(gè)多路復(fù)用器15A-15D的輸出。如果數(shù)據(jù)輸出端口匹配線22A-22D是邏輯“0”,對(duì)應(yīng)多路復(fù)用器15A-15D的輸出在總線14A-14D上選擇來自轉(zhuǎn)移預(yù)測(cè)RAM 10的對(duì)應(yīng)數(shù)據(jù)輸出端口Dout0-Dout3的預(yù)測(cè)歷史數(shù)據(jù)。
利用這種安排,四個(gè)多路復(fù)用器15A-15D的輸出是對(duì)于在PC,PC+1,PC+2和PC+3的任何轉(zhuǎn)移的最近預(yù)測(cè)歷史。在任何時(shí)刻,如果在PC+i——此處i=0,1,2,3——有轉(zhuǎn)移指令B,那么有兩種可能性沒有B的推測(cè)執(zhí)行存在,或是有一個(gè)或更多的推測(cè)執(zhí)行存在。在前一種場(chǎng)合,來自轉(zhuǎn)移儲(chǔ)層20的對(duì)應(yīng)于PC+1的匹配線22A-22D是邏輯“0”,因此多路復(fù)用器15A-15D的輸出來自對(duì)應(yīng)數(shù)據(jù)輸出總線14A-14D上的轉(zhuǎn)移預(yù)測(cè)RAM 10。來自多路復(fù)用器15A-15D的輸出信號(hào)代表上溯至其最近執(zhí)行的——在這種場(chǎng)合是非推測(cè)的——轉(zhuǎn)移指令B的歷史。
如果有一個(gè)B的推測(cè)執(zhí)行,那么來自輸出端口Bout0-Bout3之一的一個(gè)匹配線22A-22D載有一個(gè)邏輯1信號(hào),并且該端口的預(yù)測(cè)歷史輸出是B的最近推測(cè)執(zhí)行之后的輸出。由于所有推測(cè)執(zhí)行比所有非推測(cè)執(zhí)行更為新近,因此這是最新的執(zhí)行,并被對(duì)應(yīng)的多路復(fù)用器15A-15D選作輸出。
每個(gè)多路復(fù)用器15A-15D的輸出總線是四個(gè)相同的預(yù)測(cè)模塊16A-16D之一的輸入總線。圖3中所示的每個(gè)預(yù)測(cè)模塊16A-16D檢驗(yàn)來自其對(duì)應(yīng)多路復(fù)用器15A-15D的預(yù)測(cè)歷史數(shù)據(jù),以確定對(duì)轉(zhuǎn)移指令的當(dāng)前執(zhí)行的預(yù)測(cè)。預(yù)測(cè)歷史數(shù)據(jù)有8比特,包括一個(gè)2比特預(yù)測(cè)狀態(tài),一個(gè)3比特上計(jì)數(shù)器值,和一個(gè)3比特下計(jì)數(shù)器值。預(yù)測(cè)歷史數(shù)據(jù)由形成每個(gè)多路復(fù)用器15A-15D的輸出總線的八條總線線路攜帶。
每個(gè)預(yù)測(cè)模塊16A-16D有一個(gè)“或非”門23和一個(gè)“異或”門24?!盎蚍恰遍T23接收下計(jì)數(shù)器的3比特作為輸入,并且連接“或非”門23的輸出作為“異或”門24的一個(gè)輸入。至“異或”門24的第二個(gè)輸入是意義更為重要的預(yù)測(cè)狀態(tài)比特的預(yù)測(cè)狀態(tài),狀態(tài)[1]的比特。如圖3所示,次要的比特,狀態(tài)
,以及上計(jì)數(shù)器的3比特從預(yù)測(cè)模塊16A-16D通過,而沒有連接于“或非”門23和“異或”門24。
可以看到,狀態(tài)機(jī)給出的預(yù)測(cè)等于最重要的狀態(tài)比特,狀態(tài)[1]。為零的下計(jì)數(shù)器值(三個(gè)比特全部等于邏輯0)使“或非”門23產(chǎn)生一個(gè)輸出邏輯1,該輸出邏輯1接著又使“異或”門24對(duì)狀態(tài)[1]的值求補(bǔ)。如果下計(jì)數(shù)器為非零,那么“或非”門23有一個(gè)邏輯0的輸出,該邏輯0輸出致使“異或”門24輸出狀態(tài)[1]的值?!爱惢颉遍T24的輸出就是預(yù)測(cè)值。
預(yù)測(cè)模塊16A-16D的輸出——預(yù)測(cè)歷史數(shù)據(jù)的8比特加上對(duì)在PC+i,i=0至3,的四個(gè)指令中每個(gè)的當(dāng)前預(yù)測(cè)——分別連接于一個(gè)指令解碼FIFO 25的輸入端口26A-26D。FIFO 25有五個(gè)指令深,并且存儲(chǔ)從它們自指令超高速緩沖存儲(chǔ)器(未示出)中取出時(shí)直到他們能夠發(fā)布到處理器的流水線的執(zhí)行階段的指令。每個(gè)時(shí)鐘周期可以在輸入端口26A-26D增加高達(dá)四個(gè)指令的預(yù)測(cè)歷史數(shù)據(jù)。預(yù)測(cè)歷史數(shù)據(jù)是按照從最底層空單元遞增的地址增加的。即,通過輸入端口26A——其接收在PC的指令的預(yù)測(cè)歷史——的數(shù)據(jù),進(jìn)入FIFO 25的最底層的空項(xiàng)目。通過輸入端口26B的數(shù)據(jù)進(jìn)入正好在其上方的項(xiàng)目,等等。
在把指令的預(yù)測(cè)歷史提供給輸入端口26A的同時(shí),由總線13通過FIFO 25的一個(gè)地址輸入端口30供給指令的地址,PC。指令解碼FIFO 25包含邏輯電路,該邏輯電路將存儲(chǔ)在其內(nèi)的指令與取出該指令的地址結(jié)合在一起。
指令發(fā)布邏輯電路50檢驗(yàn)在指令解碼FIFO 25中的四個(gè)最底層指令。指令發(fā)布邏輯電路50的主要任務(wù)是要?jiǎng)偤迷谥噶羁梢员弧鞍l(fā)布”時(shí),即,在處理器流水線中的后續(xù)階段之前,對(duì)指令解碼FIFO 25中的每個(gè)指令進(jìn)行測(cè)定。指令發(fā)布邏輯電路必須執(zhí)行的兩個(gè)任務(wù)是(1)跟蹤每個(gè)發(fā)布的指令的結(jié)果的可用性和位置,和(2)確定指令解碼FIFO25中的每個(gè)指令與先前發(fā)布的指令的關(guān)系。如何執(zhí)行這些任務(wù)的具體細(xì)節(jié)與本發(fā)明無關(guān)。
當(dāng)指令發(fā)布邏輯電路向后續(xù)流水線階段發(fā)布指令時(shí),它將那些指令從指令解碼FIFO 25的底層移出。在本優(yōu)選實(shí)施例中,一個(gè)指令只有當(dāng)在它“之下”的所有指令也被發(fā)布之后才能發(fā)布;因此本指令解碼FIFO是真正的先進(jìn)先出。
如果指令解碼FIFO 25包含轉(zhuǎn)移指令,指令發(fā)布邏輯電路50檢驗(yàn)最底層的這種指令。如果是個(gè)無條件執(zhí)行轉(zhuǎn)移,那么指令發(fā)布邏輯電路執(zhí)行兩個(gè)特定步驟(1)它遵照轉(zhuǎn)移指令改變程序計(jì)數(shù)器寄存器11,以便替換取出指令的序列。(2)它從指令解碼FIFO 25的“頂層”清除那些跟隨在不應(yīng)當(dāng)執(zhí)行的轉(zhuǎn)移之后的指令。
如果在指令解碼FIFO 25中的最底層轉(zhuǎn)移指令是一個(gè)條件轉(zhuǎn)移,那么指令發(fā)布邏輯電路50以上述的方法確定(1)這個(gè)轉(zhuǎn)移依賴于先前發(fā)布的一個(gè)或一些指令,和(2)那些前面的指令的結(jié)果是否可用,如果可用,那些結(jié)果的值是什么。如果知道了該轉(zhuǎn)移依賴的所有結(jié)果,那么指令發(fā)布邏輯電路50評(píng)估它們以確定是否應(yīng)當(dāng)執(zhí)行或不執(zhí)行該轉(zhuǎn)移指令。如果要執(zhí)行該轉(zhuǎn)移指令,那么指令發(fā)布邏輯電路執(zhí)行上述的兩個(gè)步驟,替換程序計(jì)數(shù)器寄存器11的步驟,和從指令解碼FIFO 25移出任何隨后的放棄的指令。
如果在指令解碼FIFO 25中的最底層轉(zhuǎn)移指令是一個(gè)條件轉(zhuǎn)移,并且它所從屬的結(jié)果是不可用的,那么指令發(fā)布邏輯電路50使用一個(gè)預(yù)測(cè)來確定該轉(zhuǎn)移的配置。那個(gè)預(yù)測(cè)是由一個(gè)預(yù)測(cè)模塊16A-16D產(chǎn)生的,并且是用轉(zhuǎn)移指令經(jīng)過一個(gè)輸入端口26A-26D寫入指令解碼FIFO的。如果轉(zhuǎn)移被預(yù)測(cè)執(zhí)行,則替換程序計(jì)數(shù)寄存器11的內(nèi)容,并且從FIFO 25放棄在該轉(zhuǎn)移之后的指令。
控制轉(zhuǎn)移儲(chǔ)層20的寫入的指令發(fā)布邏輯電路50產(chǎn)生有三個(gè)控制信號(hào)輸出。在發(fā)布,即從FIFO 25的底層移出,一個(gè)條件轉(zhuǎn)移指令的每個(gè)時(shí)鐘周期的加項(xiàng)目信號(hào)40是一個(gè)邏輯1。每當(dāng)加項(xiàng)目信號(hào)40是邏輯1時(shí),二比特選擇轉(zhuǎn)移信號(hào)35是被發(fā)布的轉(zhuǎn)移指令的FIFO中的標(biāo)志,和如果執(zhí)行了轉(zhuǎn)移,執(zhí)行信號(hào)41是邏輯1,如果轉(zhuǎn)移未執(zhí)行,執(zhí)行信號(hào)41是邏輯0。
指令解碼FIFO 25有四個(gè)輸出端口Fout0-Fout3,數(shù)據(jù)總線31A-31D和地址總線32A-32D分別連接于四個(gè)輸出端口。這些輸出端口Fout0-Fout3中的每個(gè)產(chǎn)生兩段信息在數(shù)據(jù)總線31A-31D之一上的一個(gè)存儲(chǔ)在FIFO 25中的預(yù)測(cè)歷史,和在對(duì)應(yīng)的地址總線32A-32D上的相關(guān)的指令地址。這四個(gè)輸出端口Fout0-Fout3輸出指令FIFO 25中的最底層的四個(gè)項(xiàng)目。
數(shù)據(jù)總線31A-31D和地址總線32A-32D連接于一個(gè)多路復(fù)用器36的輸入端,該多路復(fù)用器36有兩個(gè)選擇控制線35。指令發(fā)布邏輯電路50在控制線35上產(chǎn)生的選擇轉(zhuǎn)移控制信號(hào)是指令解碼FIFO 25的四個(gè)輸出中的最老的條件轉(zhuǎn)移——如果有的話——的標(biāo)志。這個(gè)控制信號(hào)使多路復(fù)用器36從輸出端口Fout0-Fout3之一中選出那個(gè)最老的轉(zhuǎn)移的地址和預(yù)測(cè)狀態(tài)信息,分別作為對(duì)一個(gè)地址總線37B和一個(gè)數(shù)據(jù)總線37A的輸出。地址總線37B直接連接于轉(zhuǎn)移儲(chǔ)層20的輸入端口18B。
數(shù)據(jù)總線37A上的預(yù)測(cè)狀態(tài)信息傳送到一個(gè)更新模塊38。模塊38如下文所述那樣“更新”預(yù)測(cè)狀態(tài),并將數(shù)據(jù)送到連接于轉(zhuǎn)移儲(chǔ)層20的輸入端口18A的線路39上。來自指令發(fā)布邏輯電路50的控制線40上的加項(xiàng)目信號(hào)使輸入端口18A和18B上的地址和更新的狀態(tài)信息剛好在指令解碼FIFO 25中的一個(gè)條件轉(zhuǎn)移指令被發(fā)布時(shí)寫入到轉(zhuǎn)移儲(chǔ)層20中。
更新模塊38——它可以在一個(gè)隨機(jī)邏輯存儲(chǔ)器或只讀型存儲(chǔ)器中使用——產(chǎn)生用于四狀態(tài)轉(zhuǎn)移預(yù)測(cè)器和上、下計(jì)數(shù)器的新值。如圖1的狀態(tài)圖中所示,計(jì)算轉(zhuǎn)移預(yù)測(cè)器的新值。輸入到狀態(tài)機(jī)的信號(hào)是指令發(fā)布邏輯電路50產(chǎn)生的執(zhí)行信號(hào)41。如果轉(zhuǎn)移被執(zhí)行,它的值是邏輯1,如果轉(zhuǎn)移未被執(zhí)行,它的值是邏輯0。
圖4顯示了更新模塊38計(jì)算用于上、下計(jì)數(shù)器的新值的算法。模塊38首先通過步驟101來確定是否已經(jīng)知道預(yù)測(cè)的轉(zhuǎn)移方向錯(cuò)誤的。這需要知道轉(zhuǎn)移所依賴的數(shù)據(jù),和需要由一個(gè)預(yù)測(cè)模塊16A-16D產(chǎn)生的并且存儲(chǔ)在指令解碼FIFO 25中的預(yù)測(cè)的方向不是正確的方向。
如果不知道預(yù)測(cè)是錯(cuò)誤的,沿路徑202進(jìn)行,并通過步驟102檢驗(yàn)上計(jì)數(shù)器以確定它是否已經(jīng)達(dá)到它的最大值。如果是,那么顯然轉(zhuǎn)移游程長度過長而不能用這些計(jì)數(shù)器跟蹤。沿路徑203進(jìn)行,并通過步驟103把下計(jì)數(shù)器設(shè)置為最大值(在本發(fā)明的這個(gè)實(shí)施例中是7)。其結(jié)果是禁止進(jìn)行轉(zhuǎn)移游程預(yù)測(cè),由于下計(jì)數(shù)器將不減值,因此永遠(yuǎn)不會(huì)達(dá)到零。由于上計(jì)數(shù)器已經(jīng)達(dá)到最大值,因此它保持不變。
如果上計(jì)數(shù)器還沒有到達(dá)其最大值,那么沿路徑204進(jìn)行。通過步驟104和105檢驗(yàn)下計(jì)數(shù)器看其是否在最大值,零,或一個(gè)中間值。如果計(jì)數(shù)器在一個(gè)中間值(在步驟104和105之后分別沿路徑205和206進(jìn)行),這意味著還未禁止對(duì)這個(gè)轉(zhuǎn)移的轉(zhuǎn)移游程預(yù)測(cè),和該轉(zhuǎn)移游程尚未到達(dá)預(yù)測(cè)的游程的終點(diǎn)。因此,由于它現(xiàn)在是一個(gè)更為接近預(yù)測(cè)的游程終點(diǎn)的轉(zhuǎn)移執(zhí)行,下計(jì)數(shù)器通過步驟107減1。
如果步驟104確定下計(jì)數(shù)器在其最大值,或步驟104和105確定它是一個(gè)中間值,那么步驟108使上計(jì)數(shù)器增加1。因此當(dāng)前游程長度總是保持在上計(jì)數(shù)器中(直到計(jì)數(shù)器到達(dá)最大值),即使轉(zhuǎn)移游程預(yù)測(cè)器被禁止(在步驟104后沿路徑207進(jìn)行)。
如果步驟105確定下計(jì)數(shù)器是零,那么沿路徑208進(jìn)行。步驟109為下計(jì)數(shù)器重新裝載上計(jì)數(shù)器的當(dāng)前值,并由步驟110把上計(jì)數(shù)器重新初始化為零。下計(jì)數(shù)器為零表示預(yù)測(cè)的游程的終點(diǎn),即,該第一轉(zhuǎn)移在相反的方向行進(jìn)。把上計(jì)數(shù)器復(fù)制到下計(jì)數(shù)器預(yù)示下一個(gè)游程與剛剛結(jié)束的游程將有相同的長度。把上計(jì)數(shù)器設(shè)置為0預(yù)示在這個(gè)相反的轉(zhuǎn)移之后的下一個(gè)轉(zhuǎn)移將是新游程中的第一個(gè)。因此,一個(gè)具有恒定長度(小于最大計(jì)數(shù)器值)游程的,被相反方向單一轉(zhuǎn)移隔開的轉(zhuǎn)移,將總是被正確地預(yù)測(cè)。
回到步驟101,如果知道轉(zhuǎn)移預(yù)測(cè)是錯(cuò)誤的,沿路徑210進(jìn)行。步驟111檢測(cè)上計(jì)數(shù)器以確定它是否在最大值。如果該計(jì)數(shù)器已經(jīng)達(dá)到最大值,那么剛剛完成的當(dāng)前游程(如被錯(cuò)誤預(yù)測(cè)指示的)對(duì)于計(jì)數(shù)器來說太長,但下一個(gè)游程可能足夠短。沿路徑211進(jìn)行,通過步驟112把下計(jì)數(shù)器設(shè)置為最大值以禁止轉(zhuǎn)移游程預(yù)測(cè)器工作,但步驟110將上計(jì)數(shù)器重新初始化為零。
如果步驟111確定上計(jì)數(shù)器還沒有到達(dá)其最大值,那么沿路徑212進(jìn)行。步驟113檢驗(yàn)下計(jì)數(shù)器是否為零。如果下計(jì)數(shù)器是零,那么當(dāng)前游程被錯(cuò)誤地預(yù)測(cè)為已經(jīng)結(jié)束,即預(yù)測(cè)的長度太短。在這種場(chǎng)合,上計(jì)數(shù)器一直計(jì)算這個(gè)游程的實(shí)際長度,并應(yīng)繼續(xù)計(jì)數(shù)。流程沿路徑213進(jìn)行,步驟114將下計(jì)數(shù)器設(shè)置為最大值,以防止在當(dāng)前游程中進(jìn)行任何預(yù)測(cè),步驟108使上計(jì)數(shù)器的值遞增。
如果步驟113確定下計(jì)數(shù)器不是零,那么錯(cuò)誤地預(yù)測(cè)了當(dāng)前游程還尚未結(jié)束;即預(yù)測(cè)的長度太長。流程沿路徑216進(jìn)行。步驟109將保持當(dāng)前游程實(shí)際長度的上計(jì)數(shù)器復(fù)制到下計(jì)數(shù)器,以預(yù)測(cè)下一個(gè)游程是同樣長度的游程。接著步驟110把上計(jì)數(shù)器重新初始化為零。
圖5顯示了在一個(gè)恒定游程長度是3的轉(zhuǎn)移上的轉(zhuǎn)移預(yù)測(cè)器的穩(wěn)態(tài)行為。最左邊的列指示轉(zhuǎn)移預(yù)測(cè)器的狀態(tài),“上”列指出上計(jì)數(shù)器的值,“下”列是下計(jì)數(shù)器的值,“預(yù)測(cè)”列是來自轉(zhuǎn)移預(yù)測(cè)器的預(yù)測(cè)比特。最右邊的列顯示了轉(zhuǎn)移的實(shí)際方向,其中1表示執(zhí)行的轉(zhuǎn)移,0表示未執(zhí)行的轉(zhuǎn)移(不過顛倒這些值也可獲得同樣的行為)。這一列顯示了一個(gè)0后面跟隨著三個(gè)1的反復(fù)模式。在這個(gè)場(chǎng)合,由于主要的方向是1,所以該四狀態(tài)預(yù)測(cè)器總是預(yù)測(cè)1。它的預(yù)測(cè)是該狀態(tài)的最重要的比特;由于相反的0的游程不長于1,所以只有這個(gè)狀態(tài)機(jī)的狀態(tài)的最不重要的比特不斷變化。
如圖5的第一行所示,下計(jì)數(shù)器是0,上計(jì)數(shù)器等于游程的長度,3。下計(jì)數(shù)器的零值使得轉(zhuǎn)移預(yù)測(cè)器狀態(tài)機(jī)給出的預(yù)測(cè)——它的預(yù)測(cè)是1——要由預(yù)測(cè)模塊 16A-16D進(jìn)行求補(bǔ)。當(dāng)這個(gè)0轉(zhuǎn)移被發(fā)布并寫入轉(zhuǎn)移儲(chǔ)層20中時(shí),更新模塊38,響應(yīng)上計(jì)數(shù)器小于最大值和下計(jì)數(shù)器是零的事實(shí),在步驟109把上計(jì)數(shù)器復(fù)制到下計(jì)數(shù)器,并在步驟110把上計(jì)數(shù)器復(fù)位為零。
下一次取出這個(gè)轉(zhuǎn)移時(shí),從轉(zhuǎn)移儲(chǔ)層20或轉(zhuǎn)移預(yù)測(cè)RAM 10讀取圖5的第二行中給出的值。這次預(yù)測(cè)模塊16A-16D將看到一個(gè)非零下計(jì)數(shù)器值,并因此恢復(fù)1的不變更狀態(tài)機(jī)預(yù)測(cè)。當(dāng)發(fā)布這個(gè)轉(zhuǎn)移時(shí),更新模塊38見到小于最大值的上計(jì)數(shù)器,和在零與最大值之間的中間值的下計(jì)數(shù)器。因此,該模塊只是在步驟107簡單遞減下計(jì)數(shù)器的值,和在步驟108增加上計(jì)數(shù)器的值。在下兩次取出和發(fā)布轉(zhuǎn)移時(shí)重復(fù)這種相同的行為。如圖5的行5所示,在這個(gè)1的游程的終點(diǎn),下計(jì)數(shù)器再次達(dá)到零,并因此再次對(duì)預(yù)測(cè)求補(bǔ)和再初始化計(jì)數(shù)器,以便為下一個(gè)游程計(jì)數(shù)。
圖6顯示了當(dāng)一個(gè)長度為3的游程后面緊跟著一個(gè)較短的游程時(shí)的行為,在長度為2的場(chǎng)合,它后面又跟隨著一個(gè)長度為4的較長的游程。在圖6的行1所示的狀態(tài)中,已經(jīng)正確地預(yù)測(cè)了前面的長度為3的游程的終點(diǎn),如圖5中所示。在假設(shè)下一個(gè)游程也是長度3的基礎(chǔ)上重新初始化兩個(gè)計(jì)數(shù)器(行2)。通過行3和4遞增上計(jì)數(shù)器的值和遞減下計(jì)數(shù)器的值。在行4中,由于預(yù)測(cè)的游程尚未完成,所以預(yù)測(cè)仍然是1,但實(shí)際方向是0。
在一個(gè)后續(xù)的時(shí)間,在行4中發(fā)布的轉(zhuǎn)移的正確方向成為已知。轉(zhuǎn)移修復(fù)機(jī)構(gòu)放棄該轉(zhuǎn)移和它后面的所有指令的效果。然后將重新取出和再發(fā)布該轉(zhuǎn)移。重新取出的狀態(tài)機(jī)和計(jì)數(shù)器的值(行4’所示)與它們的原始取出值(行4所示)相同。這是正確的,因?yàn)檗D(zhuǎn)移修復(fù)機(jī)構(gòu)已經(jīng)清除了包括對(duì)轉(zhuǎn)移儲(chǔ)層20的任何修改在內(nèi)的原始發(fā)布的效果;由于該轉(zhuǎn)移尚未被分辨,所以那些修改決不會(huì)寫入轉(zhuǎn)移預(yù)測(cè)RAM10中。
當(dāng)修復(fù)后再發(fā)布轉(zhuǎn)移時(shí),更新模塊38把再次成為1的預(yù)測(cè)與已知的0的正確方向相比較,以確定預(yù)測(cè)是錯(cuò)誤的。在步驟101后沿路徑210進(jìn)行。由于上計(jì)數(shù)器小于最大值和下計(jì)數(shù)器不為零,更新模塊38把上計(jì)數(shù)器值復(fù)制到下計(jì)數(shù)器,并把上計(jì)數(shù)器復(fù)位到0,如圖6的行5所示。因此設(shè)定轉(zhuǎn)移游程預(yù)測(cè)器以預(yù)測(cè)下一個(gè)游程應(yīng)當(dāng)是長度2。
上和下計(jì)數(shù)器計(jì)算出在行6和7中的一個(gè)預(yù)測(cè)為2的游程長度。由于下計(jì)數(shù)器是零,因此預(yù)測(cè)出在行7中發(fā)布的轉(zhuǎn)移是游程的終點(diǎn)。因而預(yù)測(cè)被改變?yōu)?。以后發(fā)現(xiàn)這是一個(gè)不正確的預(yù)測(cè),因此用與預(yù)測(cè)器相同的值再發(fā)布轉(zhuǎn)移,如行7’所示。這次更新模塊38在步驟101確定預(yù)測(cè)是錯(cuò)誤的,并再次沿路徑210進(jìn)行。當(dāng)步驟111確定上計(jì)數(shù)器不是最大值后,后續(xù)的步驟113確定下計(jì)數(shù)器是零。在這種場(chǎng)合,仍然不知道游程的實(shí)際長度,所以不能預(yù)測(cè)其終點(diǎn)。因此,步驟114把下計(jì)數(shù)器設(shè)置為最大值,以防止任何預(yù)測(cè)游程終點(diǎn)的企圖。步驟108繼續(xù)遞增上計(jì)數(shù)器的值,以計(jì)算當(dāng)前游程的長度。
由于下計(jì)數(shù)器被禁止,行8和9中的預(yù)測(cè)是直接從狀態(tài)機(jī)預(yù)測(cè)器取得的。在行9中發(fā)布的轉(zhuǎn)移預(yù)測(cè)是1,但發(fā)現(xiàn)是0,這指示一個(gè)長度為4的游程的終點(diǎn)(行5,6,7和8)。當(dāng)再發(fā)布這個(gè)轉(zhuǎn)移時(shí)(行9’),在步驟101更新模塊38再次確定預(yù)測(cè)是錯(cuò)誤的。在步驟111和路徑212之后,步驟113確定下計(jì)數(shù)器不是零,因此步驟109把上計(jì)數(shù)器復(fù)制到下計(jì)數(shù)器,和步驟110重新將上計(jì)數(shù)器初始化為零。因此,在行10,設(shè)置轉(zhuǎn)移游程預(yù)測(cè)器以預(yù)測(cè)下一個(gè)游程將是長度4。
如果沒有轉(zhuǎn)移游程預(yù)測(cè)器,圖6中所示的例子中的所有轉(zhuǎn)移都會(huì)被預(yù)測(cè)為1。因此,行4和9中的轉(zhuǎn)移會(huì)被不正確地預(yù)測(cè),但行7中的轉(zhuǎn)移會(huì)被正確地預(yù)測(cè)。也就是說,每當(dāng)一個(gè)比7短的游程后面跟隨著一個(gè)較長的游程時(shí),產(chǎn)生一個(gè)額外的轉(zhuǎn)移修復(fù)。當(dāng)一個(gè)長度為7或比7小的長度的游程后面跟隨著一個(gè)較短的游程時(shí),如行4中的例子,有或沒有轉(zhuǎn)移游程預(yù)測(cè)器都會(huì)發(fā)生一個(gè)修復(fù)。每當(dāng)一個(gè)短的游程后面跟隨著一個(gè)同樣長度的游程時(shí),轉(zhuǎn)移游程預(yù)測(cè)器避開一個(gè)轉(zhuǎn)移修復(fù)。
通過利用本發(fā)明,可以顯著地改善對(duì)于恒定或緩變游程長度的轉(zhuǎn)移的轉(zhuǎn)移預(yù)測(cè)速率。速變游程長度的轉(zhuǎn)移可能有較壞的性能,這取決于游程長度的恰當(dāng)分布。
盡管以上是對(duì)本發(fā)明的優(yōu)選實(shí)施例的完整的說明,但也可以使用各種不同的替代,更改和等同物。顯而易見,通過對(duì)上述實(shí)施例進(jìn)行適當(dāng)?shù)男薷?,本發(fā)明也同樣適用。因此,上述的說明不應(yīng)限制權(quán)利要求所定義的本發(fā)明的范圍。
權(quán)利要求
1.一種在計(jì)算機(jī)中預(yù)測(cè)條件轉(zhuǎn)移指令方向的方法,包括確定達(dá)到預(yù)定限度的所述轉(zhuǎn)移指令的第一游程的長度;計(jì)算所述條件轉(zhuǎn)移指令的下一個(gè)游程的長度;和預(yù)測(cè)假設(shè)所述下一個(gè)游程長度與所述第一游程長度相同,除非所述下一個(gè)游程長度在等于所述第一游程長度之前結(jié)束或超過所述第一游程長度;如果所述下一個(gè)游程長度超過所述第一游程長度,那么預(yù)測(cè)所述下一個(gè)游程長度無限地繼續(xù);和由此提高了正確地預(yù)測(cè)的條件轉(zhuǎn)移指令的發(fā)生率。
2.根據(jù)權(quán)利要求1所述的方法,還包括如果所述下一個(gè)游程長度在等于所述第一游程長度之前結(jié)束,那么確定所述轉(zhuǎn)移指令的所述下一個(gè)游程的長度;計(jì)算跟隨在所述下一個(gè)游程之后的所述條件轉(zhuǎn)移指令的游程長度;和預(yù)測(cè)所述跟隨在所述下一個(gè)游程長度之后的游程與所述下一個(gè)游程長度相同,除非所述跟隨在所述下一個(gè)游程之后的所述游程在等于所述下一個(gè)游程長度之前結(jié)束或超過所述下一個(gè)游程長度。
3.一種在計(jì)算機(jī)中預(yù)測(cè)條件轉(zhuǎn)移指令方向的方法,包括確定達(dá)到預(yù)定包括七個(gè)限度的所述轉(zhuǎn)移指令的第一游程的長度;計(jì)算所述條件轉(zhuǎn)移指令的下一個(gè)游程的長度;和預(yù)測(cè)假設(shè)所述下一個(gè)游程長度與所述第一游程長度相同,除非所述下一個(gè)游程長度在等于所述第一游程長度之前結(jié)束或超過所述第一游程長度;由此提高了正確地預(yù)測(cè)的條件轉(zhuǎn)移指令的發(fā)生率。
4.一種在計(jì)算機(jī)系統(tǒng)中預(yù)測(cè)控制轉(zhuǎn)移指令的條件的結(jié)果的方法,包括確定所述控制條件在轉(zhuǎn)變?yōu)榈诙顟B(tài)前處于第一狀態(tài)的有限的次數(shù);和預(yù)測(cè)在轉(zhuǎn)變?yōu)樗龅诙顟B(tài)之前所述控制條件保留在所述第一狀態(tài)相同的次數(shù);根據(jù)所述預(yù)測(cè)步驟執(zhí)行所述轉(zhuǎn)移指令,包括根據(jù)所述控制條件的所述次數(shù)的第一狀態(tài)執(zhí)行所述轉(zhuǎn)移指令;和根據(jù)所述控制條件的所述第二狀態(tài)不執(zhí)行所述轉(zhuǎn)移指令。
5.根據(jù)權(quán)利要求4所述的方法,其中所述的確定步驟包括維持所述條件轉(zhuǎn)移指令的當(dāng)前游程長度的第一計(jì)數(shù);和維持響應(yīng)于所述第一計(jì)數(shù)和所述條件轉(zhuǎn)移指令的最近完成的游程長度的第二計(jì)數(shù)。
6.根據(jù)權(quán)利要求5所述的方法,其中所述第一計(jì)數(shù)是通過在每次正確地執(zhí)行了所述推測(cè)的轉(zhuǎn)移指令時(shí)遞增所述第一計(jì)數(shù)而保留的。
7.根據(jù)權(quán)利要求5所述的方法,其中所述第二計(jì)數(shù)是通過在每次正確地執(zhí)行了所述條件轉(zhuǎn)移時(shí),遞減所述最近完成的游程長度的計(jì)數(shù)而保留的。
8.根據(jù)權(quán)利要求4所述的方法,其中所述確定步驟包括通過在每次正確地執(zhí)行了所述推測(cè)的轉(zhuǎn)移指令時(shí)遞增所述第一計(jì)數(shù)維持所述推測(cè)的轉(zhuǎn)移指令的當(dāng)前游程長度的第一計(jì)數(shù);和通過在每次正確地執(zhí)行了所述條件轉(zhuǎn)移指令時(shí)遞減最近完成的所述條件轉(zhuǎn)移指令的游程長度的計(jì)數(shù)保留響應(yīng)于所述第一計(jì)數(shù)和所述最近完成的所述條件轉(zhuǎn)移指令的游程長度的第二計(jì)數(shù);其中所述第二狀態(tài)執(zhí)行步驟是在所述第二計(jì)數(shù)達(dá)到零時(shí)進(jìn)行的。
9.根據(jù)權(quán)利要求8所述的方法,其中所述的預(yù)測(cè)步驟還包括如果當(dāng)錯(cuò)誤地預(yù)測(cè)了所述執(zhí)行的轉(zhuǎn)移指令時(shí)所述當(dāng)前游程長度超過了預(yù)定的限度,重新開始所述第一計(jì)數(shù);和把所述第二計(jì)數(shù)設(shè)置為用于所述條件轉(zhuǎn)移指令的所述最近完成的游程長度的所述先前第一計(jì)數(shù)。
10.根據(jù)權(quán)利要求8所述的方法還包括如果所述當(dāng)前游程長度短于所述最近完成的游程長度,把用于所述條件轉(zhuǎn)移指令的所述最近完成的游程長度的所述第一計(jì)數(shù)復(fù)制為所述第二計(jì)數(shù);和重新開始所述第一計(jì)數(shù)。
11.根據(jù)權(quán)利要求4所述的方法,其中所述的預(yù)測(cè)步驟包括如果所述控制條件保持在所述第一狀態(tài)超過了所述限定的次數(shù),預(yù)測(cè)所述控制條件保持在所述第一狀態(tài)。
12.根據(jù)權(quán)利要求4所述的方法,其中在所述的確定步驟中的次數(shù)被限定為七次。
全文摘要
本發(fā)明提供了一種可以提高正確地預(yù)測(cè)一個(gè)條件轉(zhuǎn)移指令的方向的可能性的轉(zhuǎn)移預(yù)測(cè)技術(shù)。本技術(shù)基于觀察到許多轉(zhuǎn)移都具有恒定的或緩變的游程長度,即幾個(gè)連續(xù)的1的游程的長度是相同的這種事實(shí)。本技術(shù)利用每個(gè)轉(zhuǎn)移的存儲(chǔ)歷史,兩個(gè)小計(jì)數(shù)器(102,113),一個(gè)上計(jì)數(shù)器(102)和一個(gè)下計(jì)數(shù)器(113)增強(qiáng)了該歷史。為了很準(zhǔn)確的預(yù)測(cè),這兩個(gè)計(jì)數(shù)器(102,113)與一個(gè)現(xiàn)有技術(shù)的狀態(tài)機(jī)轉(zhuǎn)移預(yù)測(cè)器(101)協(xié)同操作。
文檔編號(hào)G06F9/38GK1619488SQ20031012429
公開日2005年5月25日 申請(qǐng)日期1995年11月20日 優(yōu)先權(quán)日1994年12月2日
發(fā)明者戴維·L·伊薩曼 申請(qǐng)人:現(xiàn)代電子美國公司, 美塔福路技術(shù)公司