專利名稱::假想分支目標(biāo)地址高速緩存分支的裝置、系統(tǒng)及方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及微處理器(microprocessor)的分支預(yù)測(branchprediction)的
技術(shù)領(lǐng)域:
,尤指分支目標(biāo)地址(branchtargetaddress)的快取技術(shù),特別涉及一種假想混合分支方向預(yù)測裝置。
背景技術(shù):
:計算機指令一般都儲存于內(nèi)存內(nèi)可尋址的相連位置。中央處理單元(CentralProcessingUnit,CPU)或處理器由相連的內(nèi)存位置提取這些指令,并加以執(zhí)行。CPU從內(nèi)存每提取一個指令,其內(nèi)的程序計數(shù)器(programcounter,簡稱PC)或指令指針(instructionpointer,簡稱IP)就會遞增,使其內(nèi)含序列(sequence)中下個指令的地址,此即為下個循序指令指針(nextsequentialinstructionpointer,簡稱NSIP)。指令的提取、程序計數(shù)器的遞增以及指令的執(zhí)行便通過內(nèi)存呈線性持續(xù)進(jìn)行,直到遇到程控指令(programcontrolinstruction)為止。程控指令也稱為分支指令(branchinstruction),在執(zhí)行時會改變程序計數(shù)器內(nèi)的地址,并改變控制的流程。換言之,分支指令指定了改變程序計數(shù)器內(nèi)容的條件。因執(zhí)行一分支指令使程序計數(shù)器的值改變,會導(dǎo)致指令執(zhí)行順序的中斷。這是數(shù)字計算機的一項重要特征,因為它提供對程序執(zhí)行流程的控制,以及分支至程序的不同部分的能力。程控指令的例子包括跳轉(zhuǎn)(jump)、條件跳轉(zhuǎn)(conditionaljump)、調(diào)用(call)以及返回(return)。跳轉(zhuǎn)指令使CPU無條件地將程序計數(shù)器的內(nèi)容改變至一特定值,這個值就是程序要繼續(xù)執(zhí)行的指令所在的目標(biāo)地址。條件跳轉(zhuǎn)指令使CPU去測試一狀態(tài)緩存器(statusregister)的內(nèi)容,或者可能比較兩個值,而后基于測試或比較的結(jié)果,不是繼續(xù)循序執(zhí)行就是跳轉(zhuǎn)至一新地址,稱為目標(biāo)地址。調(diào)用指令使CPU無條件地跳轉(zhuǎn)至一新目標(biāo)地址,而且儲存程序計數(shù)器的值以使CPU可返回至先前離開的程序位置。返回指令使CPU去擷取程序計數(shù)器于前次調(diào)用指令執(zhí)行時所存的值,并使程序流程返回至所擷取的指令地址。對早期的微處理器而言,程控指令的執(zhí)行并不會造成處理上顯著的延遲,因為這些微處理器被設(shè)計為一次只執(zhí)行一個指令。如果所執(zhí)行的指令是程控指令,在執(zhí)行完畢之前,微處理器會知道它是否要分支,而如果是的話,它會知道分支的目標(biāo)地址為何。因此,不論下個指令是循序的,或是分支的結(jié)果,皆會被提取和執(zhí)行?,F(xiàn)代的微處理器則非如此單純。相反地,對現(xiàn)代的微處理器來說,在微處理器的不同區(qū)塊或流水線階段(pipelinestage)內(nèi)同時處理數(shù)個指令乃很平常的事。Hennessy與Patterson將流水線化(pipelining)定義為“一種多個指令得以重疊執(zhí)行的實作技術(shù)?!?引述自ComputerArchitectureAQuantitativeApproach,2ndedition,byJohnL.HennessyandDavidA.Patterson,MorganKaufmannPublishers,SanFrancisco,CA,1996)作者接著對流水線化做了下列精彩的說明“一個流水線就像是條裝配線。在汽車的裝配線上,有許多步驟,每個步驟對汽車的制造都有所貢獻(xiàn)。每個步驟與其它步驟同時并行,然而是在不同的汽車上進(jìn)行。在一計算機流水線中,每個步驟完成一個指令的部分,就像裝配線,不同的步驟并行地完成不同指令的不同部分。每個這些步驟稱為一管道階段(pipestage)或管道區(qū)段(pipesegment)。這些階段一個連接著下一個,形成一個管道——指令從一端進(jìn)入,歷經(jīng)這些階段,然后從另一端出去,就像汽車在裝配線上一樣。”因此,當(dāng)指令被提取時,就被導(dǎo)入流水線的一端。指令于微處理器中歷史流水線階段,直到執(zhí)行完畢。在這種流水線化的微處理器中,一分支指令是否會改變程序流程,通常都得等它到達(dá)流水線的后期階段才能得知。然而在這之前,微處理器已經(jīng)提取了其它指令,且正于流水線的早期階段執(zhí)行。如果一分支指令改變了程序流程,所有在這分支指令之后進(jìn)入流水線的指令都必須被丟棄。此外,則必須提取此分支指令的目標(biāo)地址上的指令。丟棄已在執(zhí)行中的指令及提取目標(biāo)地址上的指令,會造成微處理器在處理上的延遲,稱為分支懲罰(branchpenalty)。為減輕這種延遲問題,許多流水線化的微處理器在流水線的一早期階段使用分支預(yù)測機制來預(yù)測分支指令。分支預(yù)測機制預(yù)測分支指令的結(jié)果或方向,即是否要進(jìn)行分支。分支預(yù)測機制也預(yù)測分支指令的分支目標(biāo)地址,即分支指令所要分支到的指令的地址。處理器接著就分支至所預(yù)測的分支目標(biāo)地址,即依據(jù)分支預(yù)測提取后續(xù)的指令,這會比沒有分支預(yù)測時來得早,因而若確定要進(jìn)行分支,因此便降低了懲罰的可能性。這種用來快取先前所執(zhí)行分支指令的目標(biāo)地址的分支預(yù)測機制,稱為分支目標(biāo)地址高速緩存(branchtargetaddresscache,簡稱BTAC)或者分支目標(biāo)緩沖器(branchtargetbuffer,簡稱BTB)。在一簡單的BTAC或BTB中,當(dāng)處理器對一分支指令進(jìn)行譯碼后,處理器便提供分支指令的地址給BTAC。若該地址命中BTAC且預(yù)測分支會進(jìn)行,處理器就可以利用BTAC中的快取目標(biāo)地址開始提取目標(biāo)地址的指令,而非下個循序(sequential)地址的指令。相較于只預(yù)測是否采用分支的預(yù)測裝置,像是分支歷史表(branchhistorytable,簡稱BHT),BTAC的好處是除了確定是否遇到一分支指令所需的時間外,它節(jié)省了計算目標(biāo)地址所需的時間。典型的做法是分支預(yù)測數(shù)據(jù)(例如被采用/不被采用(taken/nottaken))隨著目標(biāo)地址皆儲存于BTAC。BTAC運用于流水線的指令譯碼階段,這是因為處理器必須先判斷分支指令是否存在。處理器使用BTB的一個例子是IntelPentiumII與PentiumIII處理器?,F(xiàn)請參閱圖1,其繪示PentiumII/III處理器100相關(guān)部分的方塊圖。處理器100包括一BTB134,用來快取分支目標(biāo)地址。處理器100從一指令高速緩存(instructioncache)102提取指令,該指令高速緩存102快取了指令108與前譯碼(pre-decoded)分支預(yù)測數(shù)據(jù)104。前譯碼分支預(yù)測數(shù)據(jù)104可能包括像是指令類型或指令長度這樣的訊息。指令從指令高速緩存102提取,并送到指令譯碼邏輯(instructiondecodelogic)132,由其來譯碼或解譯指令。一般是從下個循序提取地址112來提取指令。該下個循序提取地址112是由遞增裝置(incrementer)118將現(xiàn)行指令高速緩存102的提取地址122直接加上一指令高速緩存102的快取線的大小所得。然而,如果一分支指令已由指令譯碼邏輯132譯碼,接著控制邏輯(controllogic)114便選擇性地控制一多工器(multiplexer)116選取BTB134所提供的分支目標(biāo)地址,作為指令高速緩存102的提取地址122,而非選取下個循序提取地址112??刂七壿?14根據(jù)指令高速緩存102提供的前譯碼數(shù)據(jù)104以及BTB134預(yù)測該分支指令是否會被采用(依用來檢索BTB134的指令指針138而定),來選取指令高速緩存102的提取地址122。PentiumII/III在檢索BTB134時,并非通過分支指令本身的指令指針,而是利用先于被預(yù)測的分支指令的指令的指令指針138來進(jìn)行。這使得BTB134在分支指令被譯碼的時,就能查詢目標(biāo)地址136。否則,在分支指令譯碼后,處理器100必須再等待BTB134的查詢,才能進(jìn)行分支,這樣便多了此延遲的分支懲罰。一旦分支指令被指令譯碼邏輯132譯碼,且處理器100知道目標(biāo)地址136的產(chǎn)生是基于確定有分支指令的存在,處理器100才會分支到BTB134根據(jù)指令指針138索引所提供的目標(biāo)地址136。另一個使用BTAC的例子是AMDAthlon處理器?,F(xiàn)請參閱圖2,其繪示Athlon處理器200相關(guān)部分的方塊圖。處理器200包括與圖1PentiumII/III編號類似的組件。Athlon處理器200將其BTAC整合進(jìn)指令高速緩存202中。也就是,指令高速緩存202除了指令資料108與前譯碼分支預(yù)測數(shù)據(jù)104的外,還快取了分支目標(biāo)地址206。對于每個指令字節(jié)對(instructionbytepair),指令高速緩存202保留了兩個位作為預(yù)測分支指令的方向的用。指令高速緩存202在一快取線中,相當(dāng)于每16個字節(jié)的指令即保留兩個分支目標(biāo)地址的空間。從圖2可以看出,指令高速緩存202是由提取地址下個循序提取地址來作索引。因BTAC已整合進(jìn)指令高速緩存202,所以也是由提取地址122來作索引。因此,指令高速緩存202的一快取線若有一命中發(fā)生,就可確定快取分支目標(biāo)地址對應(yīng)至存在于被檢索的指令高速緩存202快取線中一分支指令。雖然現(xiàn)有的方法改進(jìn)了分支預(yù)測,但仍有缺點。前述兩種現(xiàn)有方法的一個缺點是,指令前譯碼數(shù)據(jù)以及Athlon例子中的分支目標(biāo)地址大幅增加了指令高速緩存的大小。據(jù)推測,對Athlon而言,分支預(yù)測數(shù)據(jù)可能使指令高速緩存的大小加倍。此外,PentiumII/IIIBTB為每個分支指令儲存了相當(dāng)大量的分支歷史數(shù)據(jù),用以預(yù)測分支方向,因而也增加了BTB的大小。Athlon的整合式BTAC的一個缺點是,將BTAC整合進(jìn)指令高速緩存會使空間的使用缺乏效率。也就是,整合式的指令高速緩存/BTAC對于分支指令以及非分支指令,皆須快取其分支指令數(shù)據(jù),因而占用過多儲存空間。在Athlon指令高速緩存中,許多由額外的分支預(yù)測數(shù)據(jù)所使用的空間是浪費掉的,這是因為指令高速緩存中分支指令的集中度相當(dāng)?shù)?。例如,一特定的指令快取線中可能未包括任何分支,因此快取線中所有儲存目標(biāo)地址與其它分支預(yù)測數(shù)據(jù)的空間就沒用到而浪費掉了。Athlon整合式的BTAC的另一個缺點是,設(shè)計目標(biāo)間的沖突。也就是,關(guān)于指令高速緩存的大小,除了分支預(yù)測機制的設(shè)計目標(biāo)外,可能有其它不同的設(shè)計目標(biāo)會對此加以規(guī)定。以快取線而論,要求BTAC的大小要與指令高速緩存相同,是Athlon架構(gòu)所固有的,但可能無法理想地達(dá)到兩組設(shè)計目標(biāo)。例如,可能選定了指令高速緩存的大小,以達(dá)成一特定的快取命中率(cache-hitratio)。然而,情況可能是,用比較小的BTAC,就可能達(dá)成所要的分支目標(biāo)地址預(yù)測率(predictionrate)。再者,因為BTAC是整合在指令高速緩存中,獲得快取分支目標(biāo)地址所需的資料存取時間必然相同于獲得快取指令字節(jié)。Athlon的例子中,指令高速緩存相當(dāng)大,存取時間可能會相當(dāng)長。較小的、非整合式BTAC的資料存取時間可能比整合式的指令高速緩存/BTAC要明顯減少。由于PentiumII/IIIBTB并未整合在指令高速緩存中,PentiumII/III的方法不會遭遇前述Athlon整合式指令高速緩存/BTAC的問題。然而,由于在檢索PentiumII/IIIBTB時,乃利用一已譯碼指令的指令指針,而非指令高速緩存的提取地址,所以PentiumII/III的解決方案于進(jìn)行分支時可能無法像Athlon解決方案那樣早,因此可能也無法那樣有效地減少分支懲罰。PentiumII/III解決方案處理這個問題的方式是,使用一先前指令或先前指令群的指令指針,而非實際的分支指令指針,來檢索BTB,如前所述。然而,PentiumII/III方法的一個缺點是,使用先前指令的指令指針而非實際的分支指令指針,會犧牲掉一些分支預(yù)測的準(zhǔn)確度。準(zhǔn)確度的降低,一部份是由于分支指令在程序中可能經(jīng)由多個指令路徑遭遇到。也就是,多個先于分支指令的指令可能因相同的分支指令而快取于BTB中。因此,為了這樣一個分支指令,必須消耗掉BTB中多個項目(entry),于是就減少了BTB中可快取的分支指令總數(shù)。所用的先于分支指令的指令數(shù)量愈多,可到達(dá)分支指令的路徑也愈多。除此之外,由于使用一先前的指令指針造成可能有多個路徑到達(dá)同一個分支指令,PentiumII/IIIBTB中的方向預(yù)測裝置可能需要更長的時間來“暖機”(warmup)。PentiumII/IIIBTB保持著分支歷史數(shù)據(jù),用以預(yù)測分支的方向。當(dāng)一新的分支指令被引入處理器且快取住,到達(dá)該分支指令的多個路徑可能會使分支歷史在更新時,變得比只有單路徑到達(dá)該分支指令的情形還慢,造成預(yù)測較不準(zhǔn)確。因此,我們所需要的是,一種能有效利用芯片固有資源(chiprealestate),又能在流水線早期就提供準(zhǔn)確分支的分支預(yù)測裝置,以減少分支懲罰。
發(fā)明內(nèi)容本發(fā)明的目的在于提供一種分支預(yù)測方法及裝置,能有效利用芯片固有資源,又能在流水線早期就提供準(zhǔn)確的分支,以減少分支懲罰。于是,為達(dá)到前述目的,本發(fā)明的一項特征是,在一微處理器中提供一種分支裝置,利用一提取地址選取一指令高速緩存的一快取線。該裝置亦使用該提取地址假想預(yù)測一分支指令是否將被采用(taken)。該分支指令可能潛在地(potentially)存在于該指令快取線中。該裝置包括一第一預(yù)測裝置(predictor),對應(yīng)至該提取地址,以依據(jù)該提取地址預(yù)測該分支指令是否將被采用。該裝置亦包括一邏輯,對應(yīng)至該提取地址,以提供該提取地址與一全域分支歷史(globalbranchhistory)的一二進(jìn)制函數(shù)(binaryfunction)于此邏輯的一輸出端。該裝置亦包括一第二預(yù)測裝置,對應(yīng)至該邏輯的輸出端,以依據(jù)該邏輯輸出預(yù)測該分支指令是否將被采用。該裝置亦包括一選擇器(selector),對應(yīng)至該提取地址,以依據(jù)該提取地址選取該第一與第二預(yù)測裝置其中之一。另一方面,本發(fā)明的一項特征是,在一具有一指令高速緩存的流水線化微處理器中提供一種假想分支預(yù)測裝置。該指令高速緩存接收一地址總線(addressbus)上的一提取地址,以選取該指令高速緩存的一快取線。一分支指令被假定存在于該快取線中。該裝置包括一假想分支歷史表(BHT),提供該分支指令的一第一方向預(yù)測。該裝置亦包括一分支目標(biāo)地址高速緩存(BTAC),對應(yīng)至該地址總線,提供該分支指令的一第二方向預(yù)測,并提供一選擇預(yù)測,用以在第一與第二方向預(yù)測間作選擇。該裝置亦包括一多工器,對應(yīng)至該BHT與該BTAC,依據(jù)該選擇預(yù)測選取第一與第二方向預(yù)測其中之一。第二方向預(yù)測系響應(yīng)該提取地址而提供,即使該分支指令可能并不存在于該指令快取線中。另一方面,本發(fā)明的一項特征是,在一微處理器中提供一假想分支目標(biāo)地址高速緩存(BTAC)。該BTAC包括一數(shù)組(array),以儲存分支指令的方向預(yù)測。該BTAC亦包括一輸入,對應(yīng)至該數(shù)組,接收一指令高速緩存的提取地址。該提取地址檢索該數(shù)組以選取方向預(yù)測其中之一。該BTAC亦包括一輸出,對應(yīng)至該數(shù)組,提供所選取的方向預(yù)測至分支控制邏輯(branchcontrollogic)。若所選取的方向預(yù)測指定一采用方向,則不管是否有一分支指令存在于提取地址所檢索的指令高速緩存的一快取線中,該分支控制邏輯皆使微處理器進(jìn)行假想分支。另一方面,本發(fā)明的一項特征是,提供一種用于假想分支的微處理器。該微處理器包括一指令高速緩存,以提供一地址總線上的一提取地址所選取的一指令字節(jié)線(lineofinstructionbytes)。該微處理器亦包括一假想分支歷史表(BHT),對應(yīng)至該地址總線,提供一分支指令是否將被采用的一第一預(yù)測,該分支指令被假定存在于該指令快取線。該第一預(yù)測系依據(jù)該提取地址與一全域分支歷史的組合而提供。該微處理器亦包括一假想分支目標(biāo)地址高速緩存(BTAC),對應(yīng)至該地址總線,以提供該假定的分支指令的一第二預(yù)測,并提供一選擇器。該微處理器亦包括控制邏輯,對應(yīng)至該BHT與BTAC,若選擇器所選取的第一與第二預(yù)測其中之一預(yù)測該假定的分支指令將被采用,則使微處理器進(jìn)行假想分支。另一方面,本發(fā)明的一項特征是,提供一種在一微處理器中進(jìn)行假想分支的方法。該方法包括產(chǎn)生一指令的數(shù)個假想分支方向預(yù)測,選取該數(shù)個假想分支方向預(yù)測的一作為一最后(final)方向預(yù)測,以及若該最后方向預(yù)測指出該指令將被采用,則使微處理器進(jìn)行假想分支。該產(chǎn)生、選取以及假想分支的動作皆在譯碼該指令之前執(zhí)行。另一方面,本發(fā)明的一項特征是,提供一種在一微處理器中進(jìn)行假想分支的方法。該方法包括產(chǎn)生一分支指令是否將被采用的第一與第二預(yù)測,以響應(yīng)于一指令高速緩存提取地址的第一與第二二進(jìn)制函數(shù)。該方法亦包括選取該第一與第二預(yù)測其中之一作為一最后預(yù)測。該選取的動作是響應(yīng)該提取地址的一第三二進(jìn)制函數(shù)而執(zhí)行。該方法亦包括若該最后預(yù)測指出該分支指令將被采用,則微處理器即進(jìn)行假想分支。不論該分支指令是否存在于該提取地址所選取的一指令快取線中,該產(chǎn)生、選取以及假想分支的動作皆被執(zhí)行。本發(fā)明的一項優(yōu)點是,提供一種混合的方式,以對于混雜高度不相依(independent)與高度相依(dependent)的分支,假想地預(yù)測其分支方向,以改進(jìn)假想分支的方向預(yù)測的準(zhǔn)確性,用來降低整體的分支懲罰。本發(fā)明的其它特征與優(yōu)點,在考察本說明書其余部分與附圖后,將可更加明白。圖1為PentiumII/III處理器先前技術(shù)的相關(guān)部分方塊圖。圖2為Athlon處理器先前技術(shù)的相關(guān)部分方塊圖。圖3為依本發(fā)明的流水線化微處理器的方塊圖。圖4為依本發(fā)明圖3處理器的假想分支預(yù)測裝置。圖5為圖4的指令高速緩存的方塊圖。圖6為依本發(fā)明圖4分支目標(biāo)地址高速緩存(BTAC)的方塊圖。圖7為依本發(fā)明圖4BTAC的圖6項目的格式的方塊圖。圖8為依本發(fā)明的圖4假想分支預(yù)測裝置的運作的流程圖。圖9為依本發(fā)明的圖4假想分支預(yù)測裝置使用圖8步驟的一運作范例的方塊圖。圖10為依本發(fā)明的圖4假想分支預(yù)測裝置偵測與更正錯誤的假想分支預(yù)測的運作流程圖。圖11為依本發(fā)明列舉的程序代碼片段及一表格,為說明圖10假想分支預(yù)測錯誤的偵測與更正的一范例。圖12為依本發(fā)明的圖4分支預(yù)測裝置包括一混合假想分支方向預(yù)測裝置(hybridspeculativebranchdirectionpredictor)的另一具體實施例的方塊圖。圖13為圖4的雙調(diào)用/返回堆棧(dualcall/returnstacks)的運作流程圖。圖14為說明圖4分支預(yù)測裝置選擇性地以非假想分支預(yù)測來覆蓋(override)假想分支預(yù)測,用來改進(jìn)本發(fā)明的分支預(yù)測準(zhǔn)確度的運作流程圖。圖15為本發(fā)明用以進(jìn)行圖4BTAC中目標(biāo)地址置換工作裝置的方塊圖。圖16為依本發(fā)明圖15裝置的一運作方法的流程圖。圖17為本發(fā)明另一具體實施例繪示圖15裝置的一運作方式流程圖。圖18為依本發(fā)明的另一具體實施例繪示的用以進(jìn)行圖4BTAC中目標(biāo)地址置換動作的裝置方塊圖。圖19為依本發(fā)明的另一具體實施例繪示的用以進(jìn)行圖4BTAC中目標(biāo)地址置換動作的裝置方塊圖。圖號說明100PentiumII/III處理器102指令高速緩存104前譯碼分支預(yù)測數(shù)據(jù)108指令資料112下個循序提取地址114控制邏輯116多工器118遞增裝置122提取地址132指令譯碼邏輯134分支目標(biāo)緩沖器136分支目標(biāo)地址138指令指針200Athlon處理器202指令高速緩存206快取分支目標(biāo)地址300流水線化微處理器302I-階段304B-階段306U-階段308V-階段312F-階段314X-階段316R-階段318A-階段322D-階段324G-階段326E-階段328S-階段332W-階段342指令緩沖器344F-階段指令序列346X-階段指令序列352假想分支目標(biāo)地址353假想返回地址354非假想分支目標(biāo)地址355非假想返回地址356解析目標(biāo)地址400假想分支預(yù)測裝置402假想分支目標(biāo)地址高速緩存(BTAC)404控制邏輯406假想調(diào)用/返回堆棧408預(yù)測檢查邏輯412非假想分支方向預(yù)測裝置414非假想調(diào)用/返回堆棧416非假想目標(biāo)地址計算器418比較器422多工器424儲存多工化/緩存器426遞增裝置428比較器432指令高速緩存434加法器436指令格式化與譯碼邏輯438假想分支(SB)位442更新信號444非假想分支方向預(yù)測446BEG位446AA項目的BEG位446BB項目的BEG位448LEN位452命中信號454假想分支數(shù)據(jù)(SBI)456ERR信號466下個循序指令指針(NSIP)468現(xiàn)行指令指針(CIP)472控制信號474比較器418的輸出476比較器428的輸出478控制信號481解析分支方向(DIR)482控制信號483控制信號484信號485比較器489的輸出486FULL信號487比較器497的輸出488返回地址489比較器491假想返回地址492指令譯碼數(shù)據(jù)493指令字節(jié)494指令字節(jié)快取線495提取地址496指令字節(jié)497比較器498儲存多工化/緩存器424的輸出499下個循序提取地址502轉(zhuǎn)換參照緩沖器(TLB)504標(biāo)志數(shù)組506數(shù)據(jù)數(shù)組508比較器512實際分頁號碼514實際標(biāo)志518命中信號602BTAC402的項目602A項目602的A邊602B項目602的B邊604比較器606路選擇多工器608A/B選擇多工器612數(shù)據(jù)數(shù)組614標(biāo)志數(shù)組616標(biāo)志618控制信號622A/B選擇信號624A項目626B項目702VALID位702AA項目的VALID位702BB項目的VALID位704CALL位706RET位708WRAP位712分支方向預(yù)測數(shù)據(jù)(BDPI)714分支目標(biāo)地址722T/NT字段722AA項目的T/NT字段722BB項目的T/NT字段724SELECT位802-834假想分支的運作步驟1002--1054偵測與更正錯誤的假想分支預(yù)測的步驟1100依本發(fā)明列舉的程序代碼實例片段及一表格1200混合假想分支方向預(yù)測裝置1202分支歷史表(BHT)1204異或邏輯1206全域分支歷史緩存器1208多工器1212分支方向結(jié)果1214信號1216異或邏輯1204的輸出1218更新信號1222T/NT_A/B位1224T/NT位1302--1326雙調(diào)用/返回堆棧的運作步驟1402--1432BTAC402選擇性地以非假想分支預(yù)測來覆蓋假想分支預(yù)測的運作步驟1502LastWritten緩存器1504A/BLRU位1506多工器1512更新IP1514信號1516讀/寫控制信號1602--1646A/B項目置換方法的步驟1716--1726另一實施例中A/B項目置換方法的衍生步驟1812額外的數(shù)組1902含LastWritten值與LastWrittenPrev值的緩存器1928信號具體實施例方式現(xiàn)請參閱圖3,其繪示本發(fā)明的一流水線化微處理器300的方塊圖。處理器流水線300包括階段302至階段332。第一階段是I-階段302,或稱指令提取階段(instructionfetchstage)。在I-階段302,處理器300提供提取地址至一指令高速緩存432(見圖4),以提取指令供處理器300執(zhí)行。指令高速緩存432在關(guān)于圖4的部分時會更加詳細(xì)地說明。在一具體實施例中,此指令高速緩存432是一雙周期(two-cycle)高速緩存。B-階段304是指令高速緩存432的存取的第二階段。指令高速緩存432提供其資料至U-階段306,在此階段資料被閂鎖住(latched)。U-階段306提供指令高速緩存的資料至V-階段308。在本發(fā)明中,處理器300還包括一BTAC402(見圖4),在其余圖標(biāo)的部分會詳細(xì)說明。BTAC402并未整合在指令高速緩存432。然而,在I-階段302,BTAC402是與指令高速緩存432通過使用指令高速緩存432的提取地址495來平行地(inparallel)存取的(見圖4),從而致能相當(dāng)快速的分支以減少分支懲罰。BTAC402提供一假想分支目標(biāo)地址352,而該地址則被提供至I-階段302。處理器300選擇性地選取目標(biāo)地址352作為指令高速緩存432提取地址,以達(dá)成分支至假想目標(biāo)地址352,這在其余圖標(biāo)的部分會詳加說明。有利地,從圖3可以看出,在U-階段306,由BTAC402所提供的分支目標(biāo)地址352能使處理器300在流水線300的相當(dāng)早期就進(jìn)行分支,如此僅產(chǎn)生一雙周期的指令泡沫(instructionbubble)。即,若處理器300分支至假想目標(biāo)地址352,只有兩個階段的指令必須被清除。換言之,在兩個周期內(nèi),典型的情況下,于U-階段306就可得知分支的目標(biāo)指令,即,如果這些目標(biāo)指令存在于指令高速緩存432中。有利地,在多數(shù)情況下,雙周期的指令泡沫夠小,可以由一指令緩沖器342、F-階段指令序列344及/或X-階段指令序列346來加以吸收,此將說明于后。因此,在許多情形下,假想BTAC402使處理器300能達(dá)到零懲罰的分支。處理器300還包括一假想調(diào)用/返回堆棧406(見圖4),在關(guān)于圖4、圖8與圖13的部分有詳細(xì)說明。假想調(diào)用/返回堆棧406與假想BTAC402協(xié)同運作,以產(chǎn)生一假想返回地址353,即,提供至I-階段302的返回指令的目標(biāo)地址。處理器300選擇性地選取假想返回地址353作為指令高速緩存432提取地址,以達(dá)成分支至假想返回地址353,就如關(guān)于圖8部分所詳細(xì)說明的。在V-階段308,指令被寫入指令緩沖器342。指令緩沖器342暫存指令以提供至F-階段312。V-階段308亦包括譯碼邏輯,以提供關(guān)于指令字節(jié)的數(shù)據(jù)給指令緩沖器342,像是x86前置(prefix)與modR/M數(shù)據(jù),以及指令字節(jié)是否為分支運算碼值(branchopcodevalue)。F-階段312,或稱指令格式化階段(instructionformatstage)312,包括指令格式化與譯碼邏輯436(見圖4)以格式化指令。最好(preferably)處理器300是一x86處理器,其指令集(instructionset)可容許不同長度的指令。指令格式化邏輯436從指令緩沖器342接收指令字節(jié)流(stream),并將該指令字節(jié)流解析成分離的字節(jié)群,每個群構(gòu)成一x86指令,尤其還提供每個指令的長度。F-階段312也包括分支指令目標(biāo)地址計算邏輯(branchinstructiontargetaddresscalculationlogic)416,依據(jù)一指令譯碼產(chǎn)生一非假想分支目標(biāo)地址354,而不是假想地依據(jù)指令高速緩存432提取地址來產(chǎn)生,如在I-階段302BTAC402所作的。F-階段312亦包括一調(diào)用/返回堆棧414(見圖4),依據(jù)一指令譯碼產(chǎn)生一非假想返回地址355,而不是假想地依據(jù)指令高速緩存432提取地址來產(chǎn)生,如在I-階段302BTAC402所作的。F-階段312非假想地址354與355被送至I-階段302。處理器300選擇性地選取F-階段312非假想地址354或355作為指令高速緩存432提取地址,以達(dá)成分支至地址354或355兩者之一,就如下文所詳細(xì)說明的。F-階段指令序列344接收格式化的指令。格式化指令由F-階段指令序列344送至X-階段314中一指令轉(zhuǎn)換器(instructiontranslator)。X-階段314,或稱轉(zhuǎn)換階段314,指令轉(zhuǎn)換器將x86巨指令(macroinstruction)轉(zhuǎn)換成微指令(microinstruction),讓其余的流水線階段可加以執(zhí)行。X-階段314將轉(zhuǎn)換過的微指令送至X-階段指令序列346。X-階段指令序列346將轉(zhuǎn)換過的微指令送至R-階段316,或稱緩存器階段316。R-階段316包括使用者可見(user-visible)的x86緩存器集合,以及非使用者可見的緩存器。微指令的指令操作數(shù)(operand)存于R-階段316緩存器,供流水線300的后續(xù)階段執(zhí)行微指令。A-階段318,或稱地址階段(addressstage)318,包括地址產(chǎn)生邏輯(addressgenerationlogic),從R-階段316接收操作數(shù)與微指令,并產(chǎn)生微指令所需的地址,像是用以加載/儲存的內(nèi)存地址。D-階段322,或稱資料階段(datastage)322,包括存取資料的邏輯,該資料由A-階段318產(chǎn)生的地址所指定。特別是,D-階段322包括一資料高速緩存,用來快取處理器300內(nèi)從系統(tǒng)內(nèi)存而來的數(shù)據(jù)。在一具體實施例中,數(shù)據(jù)高速緩存是雙周期高速緩存。G-階段324是資料高速緩存存取的第二階段,而在E-階段326,可取得資料高速緩存的資料。E-階段326,或稱執(zhí)行階段(executionstage)326,包括執(zhí)行邏輯(executionlogic),像是算數(shù)邏輯單元(arithmeticlogicunit),依據(jù)先前階段提供的資料及操作數(shù)執(zhí)行微指令。特別是,E-階段326會產(chǎn)生BTAC402指出一返回指令可能存在于由提取地址495指定的指令高速緩存432快取線中所有分支指令的解析(resolved)目標(biāo)地址356。即,E-階段326目標(biāo)地址356被認(rèn)為是所有分支指令的正確目標(biāo)地址,所有預(yù)測的目標(biāo)地址必須與其匹配。此外,E-階段326產(chǎn)生一所有分支指令的解析方向(DIR)481(見圖4)。S-階段328,或稱儲存階段(storestage)328,從E-階段326接收微指令的執(zhí)行結(jié)果,將其儲存至內(nèi)存。此外,還將E-階段326所計算的分支指令的目標(biāo)地址356在I-階段302時從S-階段328送至指令高速緩存432。再者,I-階段302的BTAC402通過從S-階段328而來的分支指令的解析目標(biāo)地址來予以更新。此外,在BTAC402的其它假想分支數(shù)據(jù)(speculativebranchinformation,簡稱SBI)454(見圖4)亦從S-階段328來更新。假想分支數(shù)據(jù)454包括分支指令長度,在一指令高速緩存432快取線內(nèi)的位置,分支指令是否涵蓋多條指令高速緩存432快取線,分支是否為一調(diào)用或返回指令,以及用來預(yù)測分支指令的方向的數(shù)據(jù),如關(guān)于圖7的部分所描述的。W-階段332,或稱回寫階段(write-backstage),將S-階段328處理的結(jié)果回寫入R-階段316緩存器,用來更新處理器300的狀態(tài)。指令緩沖器342、F-階段指令序列344以及X-階段指令序列346除了別的功能外,還能將分支對于處理器300每個指令值的脈沖所造成的沖擊減至最小?,F(xiàn)請參閱圖4,其繪示依本發(fā)明圖3處理器300的一假想分支預(yù)測裝置400。處理器300包括指令高速緩存432,以快取來自系統(tǒng)內(nèi)存的指令字節(jié)496。指令高速緩存432由提取地址總線上的提取地址495來尋址,對指令高速緩存432內(nèi)一快取線作檢索。最好(preferably)提取地址495包括一32位的虛擬地址。即,提取地址495并非指令的物理內(nèi)存地址(physicalmemoryaddress)。在一具體實施例中,虛擬提取地址495是一x86線性(linear)指令指針。在一具體實施例中,指令高速緩存432具有32個字節(jié)的寬度;因此,只用到提取地址495之前27個位來檢索指令高速緩存432。一選定的指令字節(jié)快取線494則由指令高速緩存432輸出。指令高速緩存432在接下來圖5部分會更詳細(xì)地說明?,F(xiàn)請參照圖5,其繪示圖4指令高速緩存432的一具體實施例的方塊圖。指令高速緩存432包括用來將圖4的虛擬提取地址495轉(zhuǎn)換成實際地址的邏輯(圖上未顯示)。指令高速緩存432包括一轉(zhuǎn)換參照緩沖器(translationlookasidebuffer,簡稱TLB)502,以快取先前轉(zhuǎn)換邏輯從虛擬提取地址495轉(zhuǎn)換的實際地址。在一具體實施例中,TLB502接收虛擬提取地址495的位[3112],當(dāng)虛擬提取地址495命中TLB502時,則輸出一對應(yīng)的20位的實際分頁號碼(physicalpagenumber)512。指令高速緩存432包括一快取指令字節(jié)的數(shù)據(jù)數(shù)組506。資料數(shù)組506配置成數(shù)條快取線,以虛擬提取地址495的一部份來作索引。在一具體實施例中,數(shù)據(jù)數(shù)組506儲存了64KB的指令字節(jié),其以32個字節(jié)的快取線來配置。在一具體實施例中,指令高速緩存432是一四路集合關(guān)聯(lián)高速緩存(4-waysetassociativecache)。因此,資料數(shù)組506包括512條指令字節(jié)線,以提取地址495的位[135]來作索引。虛擬提取地址495所選取的指令字節(jié)線494,由指令高速緩存432輸出至指令緩沖器342,如圖4所示。在一具體實施例中,一次將選定的指令字節(jié)線的一半送至指令緩沖器342,即,分成兩周期,每周期送16個字節(jié)。在本說明書中,快取線或指令位線可用以指稱由提取地址495于指令高速緩存432內(nèi)所選定的一快取線的部分,像是半快取線(half-cacheline)或其它再細(xì)分的部分。指令高速緩存432亦包括一快取標(biāo)志的標(biāo)志數(shù)組(tagarray)504。標(biāo)志數(shù)組504,如同數(shù)據(jù)數(shù)組506,皆由虛擬提取地址495的相同位來作索引。實際地址的位快取于標(biāo)志數(shù)組504,作為實際標(biāo)志。由提取地址495位選定的實際標(biāo)志514則送至標(biāo)志數(shù)組504的輸出端。指令高速緩存432亦包括一比較器508,將實際標(biāo)志514與TLB502所提供的實際分頁號碼512作比較,以產(chǎn)生一命中信號(hitsignal)518,指明虛擬提取地址495是否命中指令高速緩存432。命中信號518真正指出了是否有快取現(xiàn)行的工作指令(taskinstruction),因為指令高速緩存432將虛擬提取地址495轉(zhuǎn)換為一實際地址,并用此實際地址來測定是否有命中。前述指令高速緩存432的運作與BTAC402的運作成對比,后者僅依虛擬地址,即提取地址495,來測定是否命中,而非依據(jù)實際地址。此種運作上不同所造成的結(jié)果是,虛擬別名化(virtualaliasing)可能會發(fā)生,以致于BTAC402產(chǎn)生錯誤的目標(biāo)地址352,如下所述。請再參閱圖4,圖3的指令緩沖器342從指令高速緩存432接收快取線的指令字節(jié)494并予以緩沖,直至其被格式化與轉(zhuǎn)換為止。如前文關(guān)于圖3的V-階段308所述,指令緩沖器342也儲存了其它分支預(yù)測的相關(guān)數(shù)據(jù),像是x86前置與modR/M數(shù)據(jù),以及指令字節(jié)是否為分支運算碼值。此外,指令緩沖器342為其內(nèi)所存的每個指令字節(jié)儲存了一假想分支(speculativelybranched,簡稱SB)位。如果處理器300假想地分支至BTAC402所提供的假想目標(biāo)地址352或假想返回地址353,其由假想調(diào)用/返回堆棧406依據(jù)快取于BTAC402中的SBI454所提供,則設(shè)定SBI454所指出的指令字節(jié)的SB位438。也就是,如果處理器300進(jìn)行假想分支是基于如下假設(shè)在指令高速緩存432提供的指令字節(jié)線494中有一分支指令存在,而其SBI454快取于BTAC402中,則設(shè)定存于指令緩沖器342的指令字節(jié)494其中之一的SB位438。在一具體實施例中,則是針對SBI454所指出假定的分支指令的運算碼字節(jié),設(shè)定其SB位438。指令譯碼邏輯436從指令緩沖器342接收指令字節(jié)493(包括分支指令字節(jié))以將其譯碼,產(chǎn)生指令譯碼數(shù)據(jù)492。指令譯碼數(shù)據(jù)492用來進(jìn)行分支指令預(yù)測,以及偵測與更正錯誤的假想分支。指令譯碼邏輯436提供指令譯碼數(shù)據(jù)492至流水線300的后段。此外,指令譯碼邏輯436在譯碼現(xiàn)行指令時,會產(chǎn)生下個循序指令指針(NSIP)466以及現(xiàn)行指令指針(currentinstructionpointer,CIP)468。此外,指令譯碼邏輯436提供指令譯碼數(shù)據(jù)492至非假想目標(biāo)地址計算器(non-speculativetargetaddresscalculator)416、非假想調(diào)用/返回堆棧414以及非假想分支方向預(yù)測裝置(non-speculativebranchdirectionpredictor)412。最好(preferably)非假想調(diào)用/返回堆棧414、非假想分支方向預(yù)測裝置412以及非假想目標(biāo)地址計算器416屬于流水線300的F-階段312。非假想分支方向預(yù)測裝置412產(chǎn)生一分支指令方向的非假想預(yù)測444,即是否要進(jìn)行分支,以響應(yīng)從指令譯碼邏輯436接收的指令譯碼數(shù)據(jù)492。最好(preferably)非假想分支方向預(yù)測裝置412包括一個或更多分支歷史表,以儲存已執(zhí)行的分支指令的解析方向的歷程。最好(preferably)分支歷史表連同由指令譯碼邏輯436提供的分支指令本身的譯碼數(shù)據(jù),用于預(yù)測條件分支指令的方向。非假想分支方向預(yù)測裝置412的一個示范實施例詳述于美國專利申請序號09/434,984HYBRIDBRANCHPREDICTORWITHIMPROVEDSELECTORTABLEUPDATEMECHANISM,具有一共同申請人,通過參考此案可并入本發(fā)明。最好(preferably)最后解析出分支指令方向的邏輯屬于流水線300的E-階段326。非假想調(diào)用/返回堆棧414產(chǎn)生圖3的非假想返回地址355,以響應(yīng)從指令譯碼邏輯436接收的指令譯碼數(shù)據(jù)492。除了別的以外,指令譯碼數(shù)據(jù)492還指明現(xiàn)行譯碼的指令是否為調(diào)用指令、返回指令或兩者皆否。此外,如果正由指令譯碼邏輯436譯碼的指令為一調(diào)用指令,指令譯碼數(shù)據(jù)492還會包括一返回地址488。最好(preferably)返回地址488包括現(xiàn)行譯碼的調(diào)用指令的指令指針加上調(diào)用指令的長度所得的值。當(dāng)指令譯碼數(shù)據(jù)492顯示現(xiàn)行譯碼的指令為一調(diào)用指令時,返回地址488會被推入非假想調(diào)用/返回堆棧414,如此在指令譯碼邏輯436進(jìn)行后續(xù)返回指令的譯碼時,返回地址488就能做為非假想返回地址355。非假想調(diào)用/返回堆棧414的一個示范實施例詳述于美國專利申請序號09/271,591METHODANDAPPARATUSFORCORRECTINGANINTERNALCALL/RETURNSTACKINAMICROPROCESSORTHATSPECULATIVELYEXECUTESCALLANDRETURNINSTRUCTIONS,具有一共同申請人,通過參考此案可并入本發(fā)明。非假想目標(biāo)地址計算器416產(chǎn)生圖3的非假想目標(biāo)地址354,以響應(yīng)從指令譯碼邏輯436接收的指令譯碼數(shù)據(jù)492。最好(preferably)非假想目標(biāo)地址計算器416包括一算數(shù)邏輯單元,以計算程序計數(shù)器相關(guān)(PC-relative,下文稱PC相關(guān))類型或直接類型(directtype)分支指令的分支目標(biāo)地址。最好(preferably)算數(shù)邏輯單元將分支指令的長度與一指令指針加到內(nèi)含于分支指令的一帶正負(fù)號的位移量(signedoffset),來計算PC相關(guān)類型分支指令的目標(biāo)地址。最好(preferably)非假想目標(biāo)地址計算器416包括一相當(dāng)小的分支目標(biāo)緩沖器(BTB),以快取間接類型(indirecttype)分支指令的分支目標(biāo)地址。非假想目標(biāo)地址計算器416的一個示范實施例詳述于美國專利申請序號09/438,907APPARATUSFORPERFORMINGBRANCHTARGETADDRESSCALCULATIONBASEDONBRANCHTYPE,具有一共同申請人,通過參考此案可并入本發(fā)明。分支預(yù)測裝置400包括假想分支目標(biāo)地址高速緩存(BTAC)402。BTAC402通過提取地址總線上的提取地址495進(jìn)行尋址,檢索BTAC402內(nèi)一快取線。BTAC402并未整合在指令高速緩存432,而是分離且不同于指令高速緩存432,如圖所示。也就是,BTAC402與指令高速緩存432在實際上與概念上皆有所區(qū)別。BTAC402與指令高速緩存432實際上的區(qū)別,在于兩者在處理器300內(nèi)處于不同的空間位置。BTAC402與指令高速緩存432概念上的區(qū)別,在于兩者具有不同的大小,即在一具體實施例中,它們包括不同數(shù)量的快取線。BTAC402與指令高速緩存432概念上的區(qū)別,也在于指令高速緩存432將提取地址495轉(zhuǎn)換成實際地址,以決定指令字節(jié)線的命中與否;BTAC402卻以虛擬提取地址495作為一虛擬地址來作索引,而沒有將其轉(zhuǎn)換為實際地址。最好(preferably)BTAC402屬于流水線300的I-階段302。BTAC402快取了先前執(zhí)行分支指令的目標(biāo)地址。當(dāng)處理器300執(zhí)行一分支指令時,該分支指令的解析目標(biāo)地址通過更新信號442快取于BTAC402。該分支指令的指令指針1512(見圖15)用來更新BTAC402,如下文關(guān)于圖15部分所描述的。為了產(chǎn)生圖3的快取分支目標(biāo)地址352,BTAC402連同指令高速緩存432皆由指令高速緩存432的提取地址495平行地(inparallel)檢索。BTAC402響應(yīng)提取地址495而提供假想分支目標(biāo)地址352。最好(preferably)提取地址495的32個位全都用來從BTAC402選取假想目標(biāo)地址352,如下文將更詳細(xì)敘述的,主要是關(guān)于圖6到圖9的部分。假想分支目標(biāo)地址352被送至包括一多工器422的地址選擇邏輯422。多工器422從數(shù)個地址(包括BTAC402目標(biāo)地址352)中選取提取地址495,下文將會予以討論。多工器422輸出提取地址495至指令高速緩存432與BTAC402。若多工器422選取了BTAC402目標(biāo)地址352,接著處理器300便會分支到BTAC402目標(biāo)地址352。也就是,處理器300將開始從指令高速緩存432提取位于BTAC402目標(biāo)地址352的指令。在一具體實施例中,BTAC402比指令高速緩存432還小。特別是,BTAC402快取目標(biāo)地址所用的快取線數(shù)量比指令高速緩存432所含的還少。BTAC402未整合在指令高速緩存432的結(jié)果是(雖然使用指令高速緩存432的提取地址495作為索引),若處理器300分支至BTAC402所產(chǎn)生的目標(biāo)地址352,它是以假想方式進(jìn)行的。此分支是假想的,乃因根本無法確定在所選定的指令高速緩存432快取線中,是否有一分支指令存在,更別說是目標(biāo)地址352因的而被快取的分支指令了。命中BTAC402僅表示一分支指令先前存在于提取地址495所選取的指令高速緩存432快取線中。之所以無法確定一分支指令是否存在于所選取的快取線中,至少有兩個理由。無法確定一分支指令是否在提取地址495所檢索的指令高速緩存432快取線中,其第一個理由是提取地址495是一虛擬地址;因此,虛擬別名化可能會發(fā)生。也就是,兩個不同的實際地址可能對應(yīng)到相同的虛擬提取地址495。一給定的提取地址495,其為虛擬的,可能轉(zhuǎn)換成兩個不同的實際地址,這兩個地址關(guān)聯(lián)于一多工(multitasking)處理器(像是處理器300)的兩個不同行程或工作。指令高速緩存432利用圖5的轉(zhuǎn)換參照緩沖器502執(zhí)行虛擬到實際的轉(zhuǎn)換工作,以提供準(zhǔn)確的指令資料。然而,BTAC402依據(jù)虛擬提取地址495執(zhí)行其查詢工作,而沒有執(zhí)行虛擬到實際地址的轉(zhuǎn)換工作。通過BTAC402避免虛擬到實際地址的轉(zhuǎn)換工作是有利的,因為比起有執(zhí)行虛擬到實際地址轉(zhuǎn)換工作的情形,它使假想分支能更快速地執(zhí)行。執(zhí)行工作轉(zhuǎn)換的操作系統(tǒng),提供了虛擬別名化情形可能會發(fā)生的一個例子。在工作轉(zhuǎn)換之后,處理器300會從指令高速緩存432提取位于關(guān)聯(lián)新行程的虛擬提取地址495的指令,該關(guān)聯(lián)新行程的虛擬提取地址495等同于關(guān)聯(lián)舊行程的虛擬提取地址495,而舊行程則包括一分支指令,其目標(biāo)地址快取于BTAC402。指令高速緩存432會依據(jù)從虛擬提取地址495轉(zhuǎn)換的實際地址來產(chǎn)生新行程的指令,如上文關(guān)于圖5部分所描述的;然而,BTAC402會只用虛擬提取地址495以產(chǎn)生舊行程的目標(biāo)地址352,因而造成一錯誤的分支。有利的是,錯誤的假想分支只會在新行程的指令第一次執(zhí)行時發(fā)生,此因在發(fā)現(xiàn)錯誤后,BTAC402目標(biāo)地址352將變?yōu)闊o效,如下文關(guān)于圖10部分說明的。因此,分支到BTAC402目標(biāo)地址352是假想的,乃因在有些情況下,由于分支指令并不存在于指令高速緩存432的提取地址495(例如,因為虛擬別名化的關(guān)系),處理器300將分支至BTAC402所產(chǎn)生的不正確的目標(biāo)地址352。相反地,從這方面來看前述圖2的Athlon整合式BTAC/指令高速緩存202以及圖1的PentiumII/III分支目標(biāo)緩沖器134,就是非假想性的。尤其,Athlon的方法因為在分支指令字節(jié)108旁并列儲存了圖2的目標(biāo)地址206而假設(shè)虛擬別名化并未發(fā)生,所以是非假想性的。也就是,AthlonBTAC202的查詢工作是基于實際地址來執(zhí)行的。PentiumII/III的方法,則因分支目標(biāo)緩沖器134只在從指令高速緩存102提取分支指令以及指令譯碼邏輯132確定有一分支指令存在后,才產(chǎn)生一分支目標(biāo)地址136。此外,非假想目標(biāo)地址計算器416、非假想調(diào)用/返回堆棧414以及非假想分支方向預(yù)測裝置412也是非假想性的,此因它們只在從指令高速緩存432提取分支指令以及由指令譯碼邏輯436譯碼后,才產(chǎn)生分支預(yù)測,如下文將要說明的。應(yīng)該了解到,雖然非假想分支方向預(yù)測裝置412所產(chǎn)生的方向預(yù)測444是“非假想性的”,即是在一分支指令已由指令譯碼邏輯436譯碼并確定該分支指令存在于現(xiàn)行指令流的情況下產(chǎn)生,非假想方向預(yù)測444仍是一“預(yù)測”。也就是,如果分支指令是條件分支指令,像是x86JCC指令,則在分支指令的任何既定的執(zhí)行中,分支可能會進(jìn)行,也可能不會。相類似地,非假想目標(biāo)地址計算器416所產(chǎn)生的目標(biāo)地址354以及非假想調(diào)用/返回堆棧414所產(chǎn)生的返回地址355也是非假想性的,因為這些地址是在確定有一分支指令存在于現(xiàn)行指令流的情況下而產(chǎn)生;盡管如此,它們?nèi)匀皇穷A(yù)測。例如,以通過內(nèi)存進(jìn)行的x86間接跳轉(zhuǎn)而言,自前次執(zhí)行間接跳轉(zhuǎn)以來,內(nèi)存內(nèi)容可能已有改變。如此,目標(biāo)地址可能隨的改變。因此,在本說明書中,就分支方向而言,“非假想的”不能與“無條件的”相混淆;就目標(biāo)地址而言,“非假想的”則不能與“確定的”(certain)相混淆。無法確定一分支指令是否在提取地址495所檢索的指令高速緩存432快取線中,其第二個理由是自我修改碼(self-modifyingcode)的存在。自我修改碼可能會改變指令高速緩存432的內(nèi)容,但這改變并不會反映在BTAC402中。因此,一先前包括分支指令的指令高速緩存432快取線可能命中了BTAC402,但此分支指令已被修改或置換為不同的指令。分支預(yù)測裝置400亦包括假想調(diào)用/返回堆棧406。假想調(diào)用/返回堆棧406儲存返回指令的假想目標(biāo)地址。假想調(diào)用/返回堆棧406因應(yīng)控制邏輯404產(chǎn)生的控制信號483,產(chǎn)生圖3的假想返回地址353。假想返回地址353被送至多工器422的一輸入。當(dāng)多工器422選取了假想調(diào)用/返回堆棧406所產(chǎn)生的假想返回地址353,處理器300便分支至假想返回地址353。當(dāng)BTAC402指出一返回指令可能存在于由提取地址495指定的指令高速緩存432快取線中時,控制邏輯404會產(chǎn)生控制信號483,以控制假想調(diào)用/返回堆棧406來提供假想返回地址353。最好(preferably)當(dāng)所選取的BTAC402項目602的VALID702與RET706位(見圖7)被設(shè)定,且BTAC402命中信號452顯示已命中BTAC402標(biāo)志數(shù)組614時,則BTAC402指出一返回指令可能存在于由提取地址495指定的指令高速緩存432快取線中。BTAC402響應(yīng)提取地址495而產(chǎn)生命中信號452以及假想分支數(shù)據(jù)(SBI)454。命中信號452顯示提取地址495命中了BTAC402的一快取標(biāo)志,此于下文關(guān)于圖6的部分說明。SBI454也會在下文關(guān)于圖6部分作更詳盡的說明。SBI454包括一BEG446信號(指令高速緩存432一快取線內(nèi)的分支指令起始字節(jié)位移量(beginningbyteoffset))與一LEN448信號(分支指令長度)。BEG446的值、LEN448的值與提取地址495由加法器434予以加總,而產(chǎn)生返回地址491。返回地址491由加法器434輸出至假想調(diào)用/返回堆棧406,如此返回地址491就能被推入假想調(diào)用/返回堆棧406??刂七壿?04通過信號483與BTAC402協(xié)同運作,將返回地址491推入假想調(diào)用/返回堆棧406。只有在所選定的BTAC402項目602的VALID702與CALL704位(見圖7)被設(shè)定且命中信號452顯示已命中BTAC402的標(biāo)志數(shù)組614(見圖6)時,返回地址491才會被推入堆棧。假想調(diào)用/返回堆棧406的運作方式在后文關(guān)于圖8與圖13部分會更詳細(xì)地說明。分支預(yù)測裝置400也包括控制邏輯404??刂七壿?04通過控制信號478控制多工器422,以選取數(shù)個地址輸入之一,作為提取地址495??刂七壿?04也通過信號482設(shè)定指令緩沖器342中的SB位438??刂七壿?04接收命中信號452、SBI454、來自非假想分支方向預(yù)測裝置412的非假想分支方向預(yù)測444以及來自指令緩沖器342的FULL信號486。分支預(yù)測裝置400亦包括預(yù)測檢查邏輯408。預(yù)測檢查邏輯408產(chǎn)生一ERR信號456,其被送至控制邏輯404,以指出已依據(jù)一BTAC402的命中而執(zhí)行一錯誤的假想分支,如后文關(guān)于圖10部分所描述的。預(yù)測檢查邏輯408通過信號484從指令緩沖器342接收SB位438,信號484亦被送至控制邏輯404。預(yù)測檢查邏輯408也從BTAC402接收SBI454。預(yù)測檢查邏輯408也從指令譯碼邏輯436接收指令譯碼數(shù)據(jù)492。預(yù)測檢查邏輯408也接收圖3E-階段326所產(chǎn)生的解析分支方向DIR481。預(yù)測檢查邏輯408也接收比較器489的輸出485。比較器489將BTAC402產(chǎn)生的假想目標(biāo)地址352與圖3E-階段產(chǎn)生的解析目標(biāo)地址356作比較。BTAC402產(chǎn)生的假想目標(biāo)地址352被存于緩存器,并順著指令流水線300而下至比較器489。預(yù)測檢查邏輯408也接收比較器497的輸出487。比較器497將假想調(diào)用/返回堆棧406產(chǎn)生的假想返回地址353與解析目標(biāo)地址356作比較。假想返回地址353被存于緩存器,并順著指令流水線300而下至比較器497。BTAC402的假想目標(biāo)地址352被存于緩存器,并順著指令流水線300而下,由比較器428將其與非假想目標(biāo)地址計算器416的目標(biāo)地址354作比較。比較器428的輸出476被送至控制邏輯404。相類似地,假想調(diào)用/返回堆棧406產(chǎn)生的假想返回地址353也被存于緩存器,并順著指令流水線300而下,由比較器418將其與非假想返回地址355作比較。比較器418的輸出474亦被送至控制邏輯404。分支預(yù)測裝置400亦包括一儲存多工化/緩存器(savemultiplexed/register,以下簡稱savemux/reg)424。savemux/reg424由控制邏輯404所產(chǎn)生的控制信號472來控制。savemux/reg424的輸出498作為多工器422的一個輸入。savemux/reg424接收自己的輸出498以及BTAC402的假想目標(biāo)地址352作為輸入。多工器422亦接收S-階段328的分支地址356作為其輸入。多工器422也接收提取地址495本身作為輸入。多工器422亦接收由遞增裝置426產(chǎn)生的下個循序提取地址499,遞增裝置426接收提取地址495,并遞增其值至指令高速緩存432的下條循序快取線?,F(xiàn)請參照圖6,其為依本發(fā)明繪示的圖4BTAC402的方塊圖。在圖6所示的具體實施例中,BTAC402包括一四路集合關(guān)聯(lián)高速緩存。BTAC402包括一數(shù)據(jù)數(shù)組612與一標(biāo)志數(shù)組614。資料數(shù)組612包括儲存組件的數(shù)組,以儲存快取分支目標(biāo)地址與假想分支數(shù)據(jù)的項目。標(biāo)志數(shù)組614包括一儲存組件的數(shù)組,以儲存地址標(biāo)志。數(shù)據(jù)數(shù)組612與標(biāo)志數(shù)組614各自皆配置成四路,圖標(biāo)為路0、路1、路2以及路3。最好(preferably)數(shù)據(jù)數(shù)組612的每一路儲存兩個快取分支目標(biāo)地址與假想分支數(shù)據(jù)的項目,稱為A與B。由此,每次讀取資料數(shù)組612時,就會產(chǎn)生八個項目602。此八個項目602被送至一八對二路選擇多工器(wayselectmux)606。數(shù)據(jù)數(shù)組612與標(biāo)志數(shù)組614皆由圖4指令高速緩存432的提取地址495來作索引。提取地址495的較低有效位(significantbit)選定了數(shù)組612與614內(nèi)各一條快取線。在一具體實施例中,每個數(shù)組包括了128條快取線。因此,BTAC402能夠快取多達(dá)1024個目標(biāo)地址(128條快取線的每條具四個路,每路可儲存兩個目標(biāo)地址)。最好(preferably)數(shù)組612與614是通過提取地址495的位[115]來作索引。標(biāo)志數(shù)組614為每路產(chǎn)生一標(biāo)志616。最好(preferably)每個標(biāo)志616包括虛擬地址的20個位,且四個標(biāo)志616的每一個皆由比較器604將其與提取地址495的位[3112]作比較。比較器604產(chǎn)生圖4的命中信號452,其依據(jù)是否有一標(biāo)志616與提取地址495的最高有效位相匹配,以指出是否有命中BTAC。命中信號452被送至圖4的控制邏輯404。此外,比較器604產(chǎn)生控制信號618,以控制路選擇多工器606。路選擇多工器606因而在BTAC402產(chǎn)生的快取線中,選取四個路之一的A項目624與B項目626。將A項目624與B項目626送至A/B選擇多工器608以及控制邏輯404。控制邏輯404因應(yīng)命中信號452、A項目624與B項目626、提取地址495及其它控制信號而產(chǎn)生一控制信號622,來控制A/B選擇多工器608。A/B選擇多工器608便選取A項目624或B項目626兩者之一作為圖3BTAC402的目標(biāo)地址352及圖4的SBI454。BTAC402最好(preferably)是一單端口(single-ported)高速緩存。單端口高速緩存的優(yōu)點是尺寸上比較小,因而比起雙端口(dual-ported)高速緩存,在同樣大小的空間中能夠快取更多的目標(biāo)地址。然而,雙端口高速緩存的考慮是使同時地讀寫B(tài)TAC402變得容易。雙端口BTAC402所具備的可同時讀寫的特征,由于更新寫入的動作不需等待讀取動作,使得BTAC402的更新能更快速地進(jìn)行。一般而言更快速的更新可得到更正確的預(yù)測,此因BTAC402內(nèi)的數(shù)據(jù)是更為現(xiàn)時的(current)。在一具體實施例中,指令高速緩存432內(nèi)每條快取線包括32個字節(jié)。然而,指令高速緩存432有時會提供指令字節(jié)的半快取線494。在一具體實施例中,BTAC402的每條快取線儲存了兩個項目602,因而包括了兩個目標(biāo)地址714,用于指令高速緩存432的每條半快取線。現(xiàn)請參閱圖7,其為依本發(fā)明繪示圖4BTAC402的圖6項目602的格式方塊圖。項目602包括了圖4的SBI(假想分支數(shù)據(jù))454與一分支目標(biāo)地址(TA)714。SBI454包括一VALID位702、圖4的BEG446與LEN448、一CALL位704、一RET位706、一WRAP位708以及分支方向預(yù)測數(shù)據(jù)(BDPI)712。在圖3的流水線300執(zhí)行一分支后,該分支的解析目標(biāo)地址即被快取于TA字段(field)714,而譯碼與執(zhí)行分支指令所得的SBI454則被快取于BTAC402的項目602的SBI454字段中。VALID位702指出了項目602是否可用于將處理器300假想分支至關(guān)聯(lián)的目標(biāo)地址714。特別是,VALID位702最初是處于清除狀態(tài),此因BTAC402由于未快取任何有效的目標(biāo)地址而是空的。當(dāng)處理器300執(zhí)行一分支指令,且與該分支指令關(guān)聯(lián)的解析目標(biāo)地址與假想分支數(shù)據(jù)被快取于項目602時,VALID位702就被設(shè)定。之后,如果BTAC402依據(jù)項目602作了錯誤的預(yù)測,VALID位702就被清除,如下文關(guān)于圖10部分所述。BEG字段446指定了指令高速緩存432的一快取線內(nèi)分支指令的起始字節(jié)位移量。在偵測到有一調(diào)用指令命中BTAC402時,BEG字段446被用來計算一返回地址,以儲存于圖4的假想調(diào)用/返回堆棧406。此外,BEG字段446被用來確定所選取BTAC402路的圖6項目A624或項目B626兩者中哪一個導(dǎo)致了BTAC402的命中,如下文關(guān)于圖8部分所述。最好(preferably)由項目A624與項目B626所指定的分支指令位置,在指令高速緩存432的快取線內(nèi)不需有任何特定的順序。也就是,在指令高速緩存432的快取線中,項目B626的分支指令可能還早于項目A624的分支指令。LEN448字段指出分支指令字節(jié)的長度。在偵測到一調(diào)用指令命中BTAC402時,LEN448字段被用來計算一返回地址,以儲存于圖4的假想調(diào)用/返回堆棧406。CALL位704指出所快取的目標(biāo)地址714是否關(guān)聯(lián)到一調(diào)用指令。也就是,如果一調(diào)用指令由處理器300執(zhí)行,且該調(diào)用指令的目標(biāo)地址快取于項目602,則CALL位704將被設(shè)定。RET位706指出所快取的目標(biāo)地址714是否關(guān)聯(lián)到一返回指令。也就是,如果一返回指令由處理器300執(zhí)行,且該返回指令的目標(biāo)地址快取于項目602,則RET位706將被設(shè)定。WRAP位708在分支指令字節(jié)橫跨兩條指令高速緩存432的快取線時,會被設(shè)定。在一具體實施例中,WRAP位708在分支指令字節(jié)橫跨兩條指令高速緩存432的半快取線時,會被設(shè)定。BDPI(分支方向預(yù)測數(shù)據(jù))字段712包括一T/NT(taken/nottaken,即采用/不采用)字段722與一SELECT位724。T/NT字段722包括分支的方向預(yù)測,即,它指明了分支是預(yù)測會采用或不會采用。最好(preferably)T/NT字段722包括一兩位的上/下數(shù)飽和計數(shù)器(up/downsaturatingcounter),用以指定四種狀態(tài)極可能采用(stronglytaken)、有可能采用(weaklytaken)、有可能不采用(weaklynottaken)與極可能不采用(strongnottaken)。在另一實施例中,T/NT字段722包括單一T/NT位。SELECT位724用來在下列兩者中作一選擇BTAC402T/NT方向預(yù)測722與由BTAC402的外的分支歷史表(BHT)(見圖12)所做的方向預(yù)測,如關(guān)于圖12部分所述。在一具體實施例中,如果在分支執(zhí)行后,所選定的預(yù)測裝置(即,BTAC402或BHT1202)準(zhǔn)確地預(yù)測了方向,SELECT位724就不會更新。然而,如果所選定的預(yù)測裝置沒有準(zhǔn)確地預(yù)測方向而另一個預(yù)測裝置正確地預(yù)測方向,SELECT位724就會更新,以指明是非選定的預(yù)測裝置,而不是所選定的預(yù)測裝置。在一具體實施例中,SELECT位724包括一兩位的上/下數(shù)飽和計數(shù)器,用以指定四種狀態(tài)極可能是BTAC(stronglyBTAC)、有可能是BTAC(weaklyBTAC)、有可能是BHT(weaklyBHT)與極可能是BHT(strongBHT)。在此實施例中,如果在分支執(zhí)行后,所選定的預(yù)測裝置(即,BTAC402或BHT1202)準(zhǔn)確地預(yù)測了方向,飽和計數(shù)器即朝所選定的預(yù)測裝置來計數(shù)。如果所選定的預(yù)測裝置沒有準(zhǔn)確地預(yù)測方向而另一個預(yù)測裝置正確地預(yù)測方向,飽和計數(shù)器即朝非選定的預(yù)測裝置來計數(shù)。現(xiàn)請參照圖8,其為依本發(fā)明繪示的圖4假想分支預(yù)測裝置400的運作流程圖。圖4的BTAC402由圖4的提取地址495作索引。因此,圖6的BTAC402比較器604響應(yīng)圖6的BTAC402標(biāo)志數(shù)組614的虛擬標(biāo)志616,以產(chǎn)生圖4的命中信號452。在步驟802中,圖4的控制邏輯404檢查命中信號452,以確定提取地址495是否命中BTAC402。如果BTAC402的命中并未發(fā)生,則在步驟822中控制邏輯404便不進(jìn)行假想分支。也就是,控制邏輯404通過圖4的控制信號478控制多工器422,以選取除了BTAC402的目標(biāo)地址352與假想調(diào)用/返回堆棧406的返回地址353外的一個輸入。然而,如果BTAC402的命中確實發(fā)生,在步驟804中,控制邏輯404便會確定圖6的A項目624是否有效,被看見(seen)與被采用(taken)。若圖7VALID位702被設(shè)定,控制邏輯404便確定項目624為“有效的”。如果VALID位702被設(shè)定,由提取地址495所選取的指令高速緩存432快取線就被假定為包括一分支指令,而該分支指令的分支預(yù)測數(shù)據(jù)則已先快取于A項目624;然而,如上文所討論的,并不確定所選取的指令高速緩存432快取線包括有分支指令。若項目A624的T/NT字段722指出,所假定的分支指令方向預(yù)期會被采用,則控制邏輯404便確定項目624“被采用”(taken)。在下述圖12的具體實施例中,若所選取的方向指示裝置(directionindicator)指出,所假定的分支指令方向預(yù)期會被采用,則控制邏輯404便確定項目624“被采用”。若圖7的BEG字段446大于或等于提取地址495相對應(yīng)的最低有效位(leastsignificantbits),則控制邏輯404便確定項目624“被看見”(seen)。也就是,BEG字段446與提取地址495相對應(yīng)的最低有效位作比較,以決定下個指令提取的位置是否位在指令高速緩存432中對應(yīng)于A項目624的分支指令位置之前。例如,假設(shè)A項目624的BEG字段446包括一數(shù)值3,而提取地址495的較低位值為8。在這種情況下,可能就不會因此提取地址495分支至A項目624的分支指令。因此,控制邏輯404將不會假想分支至A項目624的目標(biāo)地址714。這在提取地址495是分支指令的目標(biāo)地址時特別有關(guān)系。若A項目624是有效的、預(yù)期會被采用且被看見,在步驟806中,控制邏輯404會檢查圖6的B項目626是否為有效、被看見與采用。控制邏輯404是以類似于步驟804對A項目624所用的方式,來決定B項目626是否為有效、被看見與采用。若A項目624是有效的、預(yù)期會被采用且被看見,但B項目626不是有效的、預(yù)期不被采用或者不被看見,則在步驟812中,控制邏輯404檢查圖7的RET字段706,以決定A項目624是否已快取返回指令的數(shù)據(jù)。若RET位706未被設(shè)定,則在步驟814中,控制邏輯404控制圖6的A/B多工器608以選取項目A624,并通過控制信號48控制多工器422,以假想分支至目標(biāo)地址信號352所提供的BTAC402項目A624的目標(biāo)地址714。相反地,若RET位706指出,在提取地址495所選取的指令高速緩存432快取線中,可能存在一返回指令,則在步驟818中,控制邏輯404通過控制信號478控制多工器422,以假想分支至圖4假想調(diào)用/返回堆棧406的返回地址353。在步驟814或步驟818進(jìn)行假想分支后,于步驟816中,控制邏輯404產(chǎn)生一指示于控制信號482中,表示已響應(yīng)BTAC402而執(zhí)行一假想分支。也就是,不論處理器300假想分支至假想調(diào)用/返回堆棧406的返回地址353,或是BTAC402項目A624的目標(biāo)地址352,控制邏輯404皆會于控制信號482中,顯示已執(zhí)行一假想分支。當(dāng)一指令字節(jié)從指令高速緩存432進(jìn)行至圖3的指令緩沖器342時,控制信號482會用來設(shè)定SB位438。在一具體實施例中,控制邏輯404利用項目602的BEG446字段,來設(shè)定指令緩沖器342內(nèi)關(guān)聯(lián)于分支指令的運算碼字節(jié)的SB位438。此分支指令的SBI454在提取地址495命中BTAC402時,是假定已快取于BTAC402中。若A項目624是無效的,或預(yù)期不被采用,或不被看見,如步驟804中所確定的,則控制邏輯404在步驟824中便會確定B項目626是否為有效、被看見與被采用。控制邏輯404是以類似于步驟804對A項目624所用的方式,來決定B項目626是否為有效、被看見與采用。若B項目626是有效的、預(yù)期會被采用且被看見,則在步驟832中,控制邏輯404檢查RET字段706,以決定B項目626是否已快取返回指令的數(shù)據(jù)。若RET位706未被設(shè)定,則在步驟834中,控制邏輯404控制圖6的A/B多工器608以選取項目B626,并通過控制信號478控制多工器422,以假想分支至目標(biāo)地址信號352所提供的BTAC402項目B626的目標(biāo)地址714。相反地,若RET位706指出,在提取地址495所選取的指令高速緩存432快取線中,可能存在一返回指令,則在步驟818中,控制邏輯404通過控制信號478控制多工器422,以假想分支至假想調(diào)用/返回堆棧406的返回地址353。在步驟834或步驟818進(jìn)行假想分支后,于步驟816中,控制邏輯404產(chǎn)生一指示于控制信號482中,表示已響應(yīng)BTAC402而執(zhí)行一假想分支。若A項目624與B項目626皆是無效的,預(yù)期不被采用,或不被看見,則在步驟822中,控制邏輯404便不會進(jìn)行假想分支。若A項目624與B項目626兩者皆為有效的,預(yù)期被采用,且被看見,則在步驟808中,控制邏輯404便會去確定,在假定的分支指令(其數(shù)據(jù)快取于A項目624與B項目626)中,哪一個是指令高速緩存432的快取線指令字節(jié)494內(nèi),最先被看見的有效且被采用的分支指令。也就是,如果兩個假定的分支指令都被看見、有效且被采用,控制邏輯404便通過比較A項目624與B項目626的BEG446字段,來決定哪一個假定的分支指令具有較小的內(nèi)存地址。若B項目626的BEG446的值比A項目624的BEG446的值還小,則控制邏輯404便進(jìn)行至步驟832,依據(jù)B項目626進(jìn)行假想分支。否則,控制邏輯404便進(jìn)行至步驟812,依據(jù)A項目624進(jìn)行假想分支。在一具體實施例中,假想調(diào)用/返回堆棧406并不存在。所以,步驟812、818與832皆未執(zhí)行。從圖8可以看出,本發(fā)明有利地提供一裝置,用以將多個分支指令的目標(biāo)地址與假想分支數(shù)據(jù)快取于一分支目標(biāo)地址高速緩存中一特定的指令快取線,而該分支目標(biāo)地址高速緩存并未整合在指令高速緩存內(nèi)。特別是,分支指令的位置數(shù)據(jù)快取于快取線內(nèi)的BEG字段446,有利地使控制邏輯404無需前譯碼快取線,就能夠從快取線內(nèi)可能的多個分支指令中,決定要假想分支至哪一個。也就是,BTAC402在慮及可能有兩個或更多分支指令存在于所選取快取線的情況下,決定目標(biāo)地址,而不用知道有多少分支指令(假若有的話)存在于快取線中?,F(xiàn)請參閱圖9,其為依本發(fā)明繪示的圖4假想分支預(yù)測裝置400使用圖8步驟選取圖4目標(biāo)地址352的一運作范例的方塊圖。此范例顯示一值為0x10000009的提取地址495進(jìn)行指令高速緩存432與BTAC402的檢索,且該提取地址495也被送至圖4的控制邏輯404。為了簡明起見,關(guān)于指令高速緩存432與BTAC402的多路關(guān)聯(lián)性(multi-wayassociativity)的數(shù)據(jù),像是圖6的多個路與路多工器606,并未顯示出來。指令高速緩存432的一快取線494由提取地址495選取??烊【€494包括快取于地址0x10000002的一x86條件跳轉(zhuǎn)指令(JCC)與快取于地址0x1000000C的一x86CALL指令。此范例也顯示了提取地址495所選取的BTAC402快取線內(nèi)A項目602A與B項目602B的一些組成部份。項目A602A包括CALL指令的快取數(shù)據(jù),而項目B602B包括JCC指令的快取數(shù)據(jù)。項目A602A顯示其VALID位702A被設(shè)為1,表示其為一有效的項目A602A,即,圖7相關(guān)聯(lián)的目標(biāo)地址714與SBI454是有效的。項目A602A也顯示出一值為0x0C的BEG字段446A,對應(yīng)于該CALL指令的指令指針地址的最低有效位。項目A602A也顯示了一值為“被采用”的T/NT字段722A,表示該CALL指令預(yù)期會被采用。響應(yīng)提取地址495,A項目602A通過圖6的信號624送至控制邏輯404。項目B602B顯示其VALID位702B被設(shè)為1,表示其為一有效的項目B602B。項目B602B也顯示出一值為0x02的BEG字段446B,對應(yīng)于該JCC指令的指令指針地址的最低有效位。項目B602B也顯示了一值為“被采用”的T/NT字段722B,表示該JCC指令預(yù)期會被采用。響應(yīng)提取地址495,B項目602B通過圖6的信號626送至控制邏輯404。此外,BTAC402將命中信號452設(shè)定為真,以顯示提取地址495命中了BTAC402??刂七壿?04接收項目A602A與項目B602B,并依照圖8所述的方法,根據(jù)命中信號452、提取地址495的值以及602A與602B兩個項目,產(chǎn)生圖6的A/B選擇信號622。在步驟802中,控制邏輯404依據(jù)命中信號452被設(shè)定為真,而確定BTAC402有一命中發(fā)生。接著于步驟804中,控制邏輯404依據(jù)VALID位702A被設(shè)定,而確定項目A602A是有效的。而因T/NT字段722A顯示為被采用,控制邏輯404也于步驟804確定項目A602A是被采用的。由于BEG字段446A的值0x0C大于或等于提取地址195的值0x09對應(yīng)的較低位,控制邏輯404亦于步驟804確定項目A602A被看見。既然項目A602A是有效的、被采用與被看見,控制邏輯404便進(jìn)行至步驟806。于步驟806中,控制邏輯404依據(jù)VALID位702B被設(shè)定,而確定項目B602B是有效的。而因T/NT字段722B顯示為被采用,控制邏輯404也于步驟806確定項目B602B是被采用的。由于BEG字段446B的值0x02小于提取地址495的值0x09對應(yīng)的較低位,控制邏輯404亦于步驟806確定項目B602B未被看見。既然項目B602B未被看見,控制邏輯404便進(jìn)行至步驟812。在步驟812中,控制邏輯404通過圖7被清除的RET位706而確定關(guān)聯(lián)于項目A602A所快取的指令不是返回指令,并進(jìn)行至步驟814。在步驟814中,控制邏輯404產(chǎn)生一A/B選擇信號622的值,以驅(qū)使圖6的A/B多工器608選取信號624上的項目A602A。這個選擇的動作導(dǎo)致項目A602A的圖7目標(biāo)地址714被選為圖3的目標(biāo)地址352,送至圖4的提取地址495選擇多工器422。因此,從圖9的范例可以看出,圖4的分支預(yù)測裝置400有利地運作,以選取最先、有效、被看見、被采用的所選定BTAC402快取線的項目602,將處理器300假想分支至其中關(guān)聯(lián)的目標(biāo)地址714。有利的是,即使有多個分支指令存在于對應(yīng)的選定的指令高速緩存432快取線494,裝置400仍能在不知快取線494內(nèi)容的情況下,完成假想分支的動作?,F(xiàn)請參閱圖10,其為依本發(fā)明繪示的圖4假想分支預(yù)測裝置400偵測與更正錯誤的假想分支預(yù)測的運作流程圖。從指令緩沖器342接收一指令后,在步驟1002中,圖4的指令譯碼邏輯436便譯碼該指令。尤其,指令譯碼邏輯436將指令字節(jié)流(streamofinstructionbytes)格式化成一不同的x86巨指令,并確定該指令的長度以及是否為分支指令。接著,在步驟1004中,圖4的預(yù)測檢查邏輯408測定所譯碼指令中,是否有任何指令字節(jié)的SB位438被設(shè)定。也就是,預(yù)測檢查邏輯408測定是否先前已基于現(xiàn)行譯碼的指令命中BTAC402,而執(zhí)行一假想分支。若沒有執(zhí)行任何假想分支,則不會采取行動去更正。若有執(zhí)行一假想分支,則在步驟1012中,預(yù)測檢查邏輯408會檢查現(xiàn)行譯碼的指令,以確定該指令是否為非分支指令。最好(preferably)預(yù)測檢查邏輯408會測定該指令是否為x86指令集的非分支指令。如果該指令不是分支指令,則在步驟1022中,預(yù)測檢查邏輯408將圖4的ERR信號456設(shè)定為真,以表示偵測到一錯誤的假想分支。此外,通過圖4的更新信號442,BTAC402得以更新,而清除圖6對應(yīng)的BTAC402項目602的圖7VALID位702。再者,圖3的指令緩沖器342會清除掉因此一錯誤的假想分支而從指令高速緩存432誤取的指令。如果該指令不是分支指令,則在步驟1024中,控制邏輯404接著控制圖4的多工器422,以分支至指令譯碼邏輯436所產(chǎn)生的CIP468,更正該錯誤的假想分支。步驟1024中所進(jìn)行的分支,將使得包括該指令的指令高速緩存432快取線重新被提取與作假想預(yù)測。然而,這次該指令的VALID位702將被清除;因此,該指令將不執(zhí)行任何假想分支,用來更正先前錯誤的假想分支。若在步驟1012中已確定該指令為一有效的分支指令,則在步驟1014中,預(yù)測檢查邏輯408會確定在所譯碼指令的指令字節(jié)內(nèi),位于非運算碼(non-opcode)字節(jié)位置的指令,有否任何字節(jié)的SB位438被設(shè)定。也就是,雖然一字節(jié)可能包括一處理器300指令集的有效運算碼值,該有效運算碼值卻可能位于一個就指令格式而言是無效的字節(jié)位置。對一x86指令而言,除了前置字節(jié)外,運算碼字節(jié)應(yīng)該是指令的第一個字節(jié)。例如,對于在指令的立即資料(immediatedata)或位移字段(displacementfield)中,或者因虛擬別名化而在一x86指令modR/M或SIB(ScaleIndexBase,比例-索引-基底)字節(jié)中所含的分支運算碼值,SB位438可能因的而錯誤地被設(shè)定。若分支運算碼字節(jié)位于非運算碼字節(jié)位置,則執(zhí)行步驟1022與1024以更正錯誤的假想預(yù)測。若在步驟1012中,預(yù)測檢查邏輯408確定該指令為一有效的分支指令,且在步驟1014中,確定沒有非運算碼字節(jié)的SB位438被設(shè)定,則在步驟1016中,預(yù)測檢查邏輯408會確定是否有假想與非假想指令長度上的不匹配。也就是,預(yù)測檢查邏輯408將步驟1002中指令譯碼邏輯436產(chǎn)生的非假想指令的長度與BTAC402產(chǎn)生的圖7假想LEN448字段作一比較。若指令長度不匹配,則執(zhí)行步驟1022與1024以更正錯誤的假想預(yù)測。若在步驟1012中,預(yù)測檢查邏輯408確定該指令為一有效的分支指令,且在步驟1014中,確定只有運算碼字節(jié)的SB位438被設(shè)定,以及在步驟1016確定指令長度匹配,則該指令便順著流水線300而下,直至抵達(dá)圖3的E-階段326。在步驟1032中,E-階段326解析出圖3的正確的分支指令目標(biāo)地址356,并確定圖4的正確的分支方向DIR481。接著,在步驟1034中,預(yù)測檢查邏輯408確定BTAC402是否錯誤預(yù)測了分支指令的方向。也就是,預(yù)測檢查邏輯408將E-階段326所解析的正確方向DIR481與BTAC402產(chǎn)生的圖7預(yù)測722作比較,以確定是否已執(zhí)行一錯誤的假想分支。若BTAC402預(yù)測了一錯誤的方向,則在步驟1042中,預(yù)測檢查邏輯408將ERR信號456設(shè)定為真,以告知控制邏輯404此錯誤。因此,控制邏輯404便通過圖4的更新信號442,來更新圖6對應(yīng)的BTAC402項目602的BTAC402方向預(yù)測722。最后,在步驟1042中,控制邏輯404會清除掉流水線300中因該錯誤的假想分支而從指令高速緩存432誤取的指令。接著,在步驟1044中,控制邏輯404驅(qū)使多工器422選取圖4的NSIP466,使處理器300分支至分支指令的下個指令,以更正該錯誤的假想分支。若在步驟1034中無方向的錯誤,則在步驟1036中,預(yù)測檢查邏輯408會確定是否BTAC402或假想調(diào)用/返回堆棧406錯誤地預(yù)測了分支指令的目標(biāo)地址。也就是,若處理器300假想分支至BTAC402目標(biāo)地址352,則預(yù)測檢查邏輯408會檢查圖4比較器489的結(jié)果485,以確定是否假想目標(biāo)地址352不匹配所解析的正確目標(biāo)地址356。另一種情況是,若處理器300假想分支至假想調(diào)用/返回堆棧406返回地址353,則預(yù)測檢查邏輯408會檢查圖4比較器497的結(jié)果487,以確定是否假想返回地址353不匹配所解析的正確目標(biāo)地址356。若在步驟1036偵測到一目標(biāo)地址的錯誤,則在步驟1052中,預(yù)測檢查邏輯408將ERR信號456設(shè)定為真,以顯示偵測到一錯誤的假想分支。此外,控制邏輯404通過更新信號442,以步驟1032產(chǎn)生的解析目標(biāo)地址356來更新圖6對應(yīng)的BTAC402項目602。再者,會清除掉流水線300中因該錯誤的假想分支而從指令高速緩存432誤取的指令。接著,在步驟1054中,控制邏輯404控制圖4的多工器422,以分支至解析目標(biāo)地址356,用來更正先前錯誤的假想分支?,F(xiàn)請參照圖11,為依本發(fā)明列舉的程序代碼實例片段及一表格1100,為說明圖10假想分支預(yù)測錯誤的偵測與更正的一范例。程序代碼片段包括一先前程序代碼片段與一現(xiàn)行程序代碼片段。例如,該先前程序代碼片段圖標(biāo)了在圖3處理器300進(jìn)行工作交換(taskswitch)前,圖4指令高速緩存432中位于虛擬地址0x00000010的程序代碼。該現(xiàn)行程序代碼片段則圖標(biāo)了在工作交換后,指令高速緩存432中位于虛擬地址0x00000010的程序代碼,就像在虛擬別名化情形所可能發(fā)生的。該先前程序代碼序列(codesequence)包括一在0x00000010地址位置的x86JMP(無條件跳轉(zhuǎn))指令。該JMP指令的目標(biāo)地址為0x00001234。該JMP指令已執(zhí)行;所以,在現(xiàn)行程序代碼序列執(zhí)行時,目標(biāo)地址0x00001234已因應(yīng)地址0x00000010而快取于圖4的BTAC402。也就是,目標(biāo)地址714已被快取,VALID位702被設(shè)定,BEG446、LEN448與WRAP708字段寫入適當(dāng)?shù)闹?,圖7的CALL704與RET706位則被清除。在此范例中,假定T/NT字段722顯示出所快取的分支將被采用,且JMP快取于BTAC402快取線的A項目624中?,F(xiàn)行程序代碼序列包括一位于0x00000010的ADD(算術(shù)加)指令,與先前程序代碼序列中的JMP指令的虛擬地址相同?,F(xiàn)行程序代碼序列中位置0x00001234是SUB(算術(shù)減)指令,位置0x00001236則是INC(算術(shù)遞增)指令。表格1100包括八行(column)與六列(row)。第一列之后七行代表七個脈沖周期(clockcycle),從1至7。第一行之后五列代表流水線300最先的五個階段,即I-階段302、B-階段304、U-階段306、V-階段308與F-階段312。表格1100的其它方格則顯示當(dāng)執(zhí)行現(xiàn)行程序代碼序列時,在不同脈沖周期中每個階段的內(nèi)容。在脈沖周期1期間,BTAC402與指令高速緩存432被存取。ADD指令顯示于I-階段302。圖4值為0x00000010的提取地址495檢索BTAC402與指令高速緩存432,依據(jù)圖8的流程決定是否需要進(jìn)行一假想分支。在圖11的范例中,一值為0x00000010的提取地址495會命中BTAC402,如下所述。在脈沖周期2期間,ADD指令顯示于B-階段304。這是指令高速緩存432提取周期(fetchcycle)的第二個脈沖。標(biāo)志數(shù)組614提供標(biāo)志616,而資料數(shù)組612提供圖6的項目602,每個項目602包括圖7的目標(biāo)地址714與SBI454。因為先前程序代碼序列的JMP指令在執(zhí)行后已被快取,圖6的比較器604便根據(jù)圖8的步驟802產(chǎn)生一標(biāo)志命中(taghit)于信號452上。比較器604也通過信號618控制路多工器606去選取適當(dāng)?shù)穆?。控制邏?04檢查A項目624與B項目626的SBI454,在此例中并選擇A項目624以提供目標(biāo)地址352與SBI454。在此例中,控制邏輯404也依據(jù)步驟804與812來決定項目是有效、被采用、被看見且不是返回指令。在脈沖周期3期間,ADD指令顯示于U-階段306。ADD指令由指令高速緩存432提供,并閂鎖于U-階段306。因為圖8的步驟802至814是在脈沖周期2中執(zhí)行,控制邏輯404便通過控制信號478控制圖4的多工器422,以選取BTAC402所提供的目標(biāo)地址352。在脈沖周期4期間,ADD指令進(jìn)行至V-階段308,在此階段被寫入指令緩沖器342。脈沖周期4是假想分支周期。也就是,處理器300依據(jù)圖8的步驟814,開始提取位于值為0x00001234的快取目標(biāo)地址352的指令。即,根據(jù)圖8,提取地址495被改為地址0x00001234,以完成假想分支至該地址的動作。因此,位于地址0x00001234的SUB指令,在脈沖周期4是顯示于I-階段302。此外,控制邏輯404通過圖4的信號482指出,已執(zhí)行一假想分支。所以,根據(jù)圖8的步驟816,指令緩沖器342中一SB位438對應(yīng)于ADD指令被設(shè)定。在脈沖周期5期間,偵測到假想分支中的錯誤。ADD指令進(jìn)行到F-階段312。SUB指令進(jìn)行至B-階段304。位于下個循序指令指針的INC指令,則顯示于I-階段302。圖4的F-階段312指令譯碼邏輯436譯碼ADD指令,并產(chǎn)生圖4的CIP468。預(yù)測檢查邏輯408依據(jù)步驟1004,通過信號484偵測到關(guān)聯(lián)于ADD指令的SB位438被設(shè)定。預(yù)測檢查邏輯408依據(jù)步驟1012,也偵測到ADD指令是一非分支指令,并接著依據(jù)步驟1022將圖4的ERR信號456設(shè)為真,以表示在周期4中已執(zhí)行錯誤的假想分支。在脈沖周期6期間,使錯誤的假想分支無效。依據(jù)步驟1022,指令緩沖器342被清空。尤其,ADD指令從指令緩沖器342中清除。此外,依據(jù)步驟1022,導(dǎo)致錯誤假想分支的項目602所關(guān)聯(lián)的VALID位702則被清除,以更新BTAC402。再者,控制邏輯404控制多工器422,以選取CIP468作為下個周期的提取地址495。在脈沖周期7期間,更正錯誤的假想分支。處理器300開始從指令高速緩存432提取位于ADD指令的指令指針的指令,該ADD指令是在脈沖周期5偵測到錯誤時,由指令譯碼邏輯436所譯碼的。也就是,處理器300依據(jù)步驟1024分支至對應(yīng)于ADD指令的CIP468,用來更正在脈沖周期5所執(zhí)行的錯誤的假想分支。因此,ADD指令在脈沖周期7是顯示于I-階段302。這次,ADD指令將順著流水線300而下并執(zhí)行?,F(xiàn)請參閱圖12,其為依本發(fā)明繪示的圖4分支預(yù)測裝置400包括一混合假想分支方向預(yù)測裝置1200的另一具體實施例的方塊圖。簡單就可以看出,BTAC402的分支方向預(yù)測愈準(zhǔn)確,假想分支至BTAC402產(chǎn)生的假想目標(biāo)地址352就愈能有效地減少分支延遲懲罰。反過來說,錯誤的假想分支愈不常被更正,如關(guān)于圖10部分所述,假想分支至BTAC402產(chǎn)生的假想目標(biāo)地址352就愈能有效地減少處理器300的平均分支延遲懲罰。方向預(yù)測裝置1200包括圖4的BTAC402、一分支歷史表(BHT)1202、異或邏輯(exclusive0Rlogic)1204、全域分支歷史緩存器(globalbranchhistoryregisters)1206與一多工器1208。全域分支歷史緩存器1206包括一移位緩存器(shiftregister),對于處理器300所執(zhí)行的所有分支指令,全域分支歷史緩存器1206接收其分支指令方向結(jié)果(branchinstructiondirectionoutcomes)1212,而該移位緩存器則儲存分支指令方向結(jié)果1212的全域歷史。每次處理器300執(zhí)行一分支指令,圖4的DIR位481就被寫入移位緩存器1206,若分支方向被采用,該位值為“設(shè)定”;若分支方向不被采用,該位值為“清除”。由此,最早的(oldest)位就被移出移位緩存器1206。在一具體實施例中,移位緩存器1206儲存了全域歷史的13個位。全域分支歷史的儲存,在分支預(yù)測的
技術(shù)領(lǐng)域:
中是為人熟知的,對于程序中高度依存于其它分支指令的分支指令,可改良其結(jié)果的預(yù)測。全域分支歷史1206通過信號1214送至異或邏輯1204,以與圖4的提取地址495進(jìn)行一邏輯的異或運算。異或邏輯1204的輸出1216作為分支歷史表1202的索引。在分支預(yù)測的
技術(shù)領(lǐng)域:
中,異或邏輯1204所執(zhí)行的功能一般都稱為gshare運算。分支歷史表1202包括一儲存組件的數(shù)組,以儲存數(shù)個分支指令的分支方向結(jié)果的歷史。該數(shù)組由異或邏輯1204的輸出1216作為索引。當(dāng)處理器300執(zhí)行一分支指令,由異或邏輯1204的輸出1216所檢索的分支歷史表1202的數(shù)組組件便通過信號1218選擇性地加以更新,而信號1218的內(nèi)容則視解析分支方向DIR481而定。在一具體實施例中,分支歷史表1202數(shù)組中的每個儲存組件包括兩個方向預(yù)測A與B方向預(yù)測。最好(preferably),如圖所示,分支歷史表1202產(chǎn)生A與B方向預(yù)測于T/NT_A/B1222信號上,針對BTAC402產(chǎn)生的圖6A項目624與B項目626各指定一方向預(yù)測以供選取。在一具體實施例中,分支歷史表1202的儲存組件數(shù)組包括4096個項目,每個可儲存兩個方向預(yù)測。在一具體實施例中,A與B預(yù)測各包括單一T/NT(taken/nottaken,即采用/不采用)位。在此實施例中,該T/NT位更新為DIR位481的值。在另一具體實施例中,A與B預(yù)測各包括一兩位的上/下數(shù)飽和計數(shù)器,指定了四種狀態(tài)極可能采用(stronglytaken)、有可能采用(weaklytaken)、有可能不采用(weaklynottaken)與極可能不采用(strongnottaken)。在此實施例中,飽和計數(shù)器朝DIR位481指出的方向來計數(shù)。多工器1208從分支歷史表1202接收兩個方向預(yù)測位T/NT_A/B1222,并從BTAC402接收A項目624與B項目626各自的圖7T/NT方向預(yù)測722。多工器1208亦從BTAC402接收A項目624與B項目626各自的SELECT位724,作為選擇控制信號。A項目624的SELECT位724從兩個A輸入中選取一T/NT給A項目624。B項目626的SELECT位724從兩個B輸入中選取一T/NT給B項目626。所選取的兩個T/NT位1224被送至控制邏輯404,通過圖4的信號478,用于控制多工器422。在圖12的實施例中,所選取的兩個T/NT位1224分別包括于項目A624與項目B626,被送至控制邏輯404,如圖6所示。可以看出,若處理器300分支至目標(biāo)地址352,且該地址352是BTAC402依據(jù)(至少部分是)分支歷史表1202所提供的方向預(yù)測1222而產(chǎn)生,則該分支是以假想的方式進(jìn)行。該分支是假想的,此因雖然命中BTAC402已指出一分支指令先前存在于提取地址495所選取的指令高速緩存432快取線中,但仍無法確定一分支指令位于所選取的指令高速緩存432快取線中,如上所討論的。也可以看出,比起單單只有BTAC402方向預(yù)測722,圖12的混合分支方向預(yù)測裝置1200可能有利地提供一更準(zhǔn)確的分支方向預(yù)測。尤其,一般而言,對于高度依存于其它分支歷史的分支而言,分支歷史表1202提供了較準(zhǔn)確的預(yù)測;反的,對于并非高度依存于其它分支歷史的分支而言,則是BTAC402提供了較準(zhǔn)確的預(yù)測。就一既定的分支而言,通過SELECT位724能選擇較準(zhǔn)確的預(yù)測裝置。因此,可以看出,圖12的方向預(yù)測裝置1200能有利地與BTAC402協(xié)同運作,以使用BTAC402所提供的目標(biāo)地址352進(jìn)行更準(zhǔn)確的假想分支?,F(xiàn)請參閱圖13,其為圖4的雙調(diào)用/返回堆棧406與414的運作流程圖。計算機程序的一項特性是,可能從程序內(nèi)多個位置來調(diào)用子程序(subroutine)。所以,子程序內(nèi)—返回指令的返回地址可能變來變?nèi)?。因此,可以看出,利用分支目?biāo)地址高速緩存去預(yù)測返回地址通常很不容易,從而調(diào)用/返回堆棧的出現(xiàn),實有其必要。本發(fā)明的雙調(diào)用/返回地址堆棧的架構(gòu)提供了本發(fā)明的假想BTAC的好處,像是在流水線300早期即預(yù)測分支目標(biāo)地址,以減少分支懲罰。除此之外,還廣泛提供了調(diào)用/返回堆棧的優(yōu)點,即,比一簡單的BTAC402更準(zhǔn)確地預(yù)測返回地址。在步驟1302中,圖4的BTAC402由圖4的提取地址495作索引,而圖4的控制邏輯404檢查命中信號452,以確定提取地址495是否命中BTAC402,還檢查SBI454的VALID位702,以確定所選取的BTAC402項目602是否有效。若BTAC402的命中未發(fā)生或VALID位702未被設(shè)定,則控制邏輯404并不會使處理器300進(jìn)行假想分支。若在步驟1302期間一有效的BTAC402命中發(fā)生,則在步驟1304中,控制邏輯404會檢查圖4SBI454的圖7CALL位704,以確定所快取的分支指令假想地或大概地是否為一調(diào)用指令。若CALL位704被設(shè)定,則在步驟1306中,控制邏輯404控制假想調(diào)用/返回堆棧406,以將假想返回地址491推入其中。也就是,該假定的調(diào)用指令的假想返回地址491,其為圖4的提取地址495、BEG446與LEN448的總和,儲存于假想調(diào)用/返回堆棧406。假想返回地址491之所以為假想的,乃因在命中BTAC402的提取地址495所關(guān)聯(lián)的指令高速緩存432快取線中,并不確定真有包括一調(diào)用指令,更別說是BEG446與LEN448因的而被快取于BTAC402的調(diào)用指令了。假想返回地址491,或目標(biāo)地址,在下一次執(zhí)行返回指令時,可由返回地址信號353提供,以便假想分支至此返回地址491,就如下文關(guān)于步驟1312至1318所述。若Call位704被設(shè)定,則在步驟1308中,控制邏輯404接著控制多工器422去選取圖3的BTAC402目標(biāo)地址352,以假想分支至目標(biāo)地址352。若控制邏輯404在步驟1304確定CALL位704未被設(shè)定,則在步驟1312中,控制邏輯404會檢查SBI454的圖7RET位706,以確定所快取的分支指令假想地或大概地是否為一返回指令。若RET位706被設(shè)定,則在步驟1314中,控制邏輯404控制假想調(diào)用/返回堆棧406,以將圖3的假想返回地址353從堆棧頂端取出。在取出假想返回地址353后,則在步驟1316中,控制邏輯接著控制多工器422去選取從假想調(diào)用/返回堆棧406取出的假想返回地址353,以假想分支至返回地址353。返回指令順著流水線300而下,直至抵達(dá)圖3的F-階段312,圖4的指令譯碼邏輯436則譯碼此假定的返回指令。若此假定的返回指令的確是一返回指令,則圖4的非假想調(diào)用/返回堆棧414產(chǎn)生此返回指令的圖3非假想返回地址355。在步驟1318中,圖4的比較器418將假想返回地址353與非假想返回地址355作比較,并將結(jié)果714送至控制邏輯404。在步驟1318中,控制邏輯404檢查比較器418的結(jié)果474,以確定是否有不匹配發(fā)生。若假想返回地址353與非假想返回地址355不相匹配,則在步驟1326中,控制邏輯404會控制多工器422選取非假想返回地址355,以使處理器300分支至非假想返回地址355。若控制邏輯404于步驟1304中確定CALL位704并未設(shè)定,且于步驟1312中確定RET位706也未設(shè)定,則在步驟1322中,控制邏輯404會控制多工器422假想分支至圖3的BTAC402目標(biāo)地址352,如圖8步驟814或834所描述的。因此,從圖13可看出,圖4的雙重調(diào)用/返回堆棧的運作可減少調(diào)用與返回指令的分支懲罰。這種分支懲罰的減少,是通過將處理器300結(jié)合BTAC402,使調(diào)用與返回指令在流水線更早期就進(jìn)行分支,同時也克服以下現(xiàn)象由于子程序一般都從一些不同的程序位置來調(diào)用,返回指令因而會返回至多個不同的返回地址?,F(xiàn)請參照圖14,為說明圖4的分支預(yù)測裝置400以非假想分支預(yù)測來選擇性地覆蓋(override)假想分支預(yù)測,用來改進(jìn)本發(fā)明的分支預(yù)測準(zhǔn)確度的運作流程圖。在從指令緩沖器342接收一指令后,在步驟1402中,圖4的指令譯碼邏輯436便譯碼該指令,圖4的非假想目標(biāo)地址計算器416、非假想調(diào)用/返回堆棧414以及非假想分支方向預(yù)測裝置412則依圖4的指令譯碼數(shù)據(jù)492產(chǎn)生非假想分支預(yù)測。指令譯碼邏輯436在步驟1402中,產(chǎn)生該指令的類型數(shù)據(jù)于指令譯碼數(shù)據(jù)492中。尤其,指令譯碼邏輯436會確定該指令是否為分支指令、指令的長度以及分支指令的類型。最好(preferably)指令譯碼邏輯436會確定分支指令是否為條件或無條件類型分支指令、PC相關(guān)類型分支指令、返回指令、直接類型分支指令或間接類型分支指令。若該指令為一分支指令,非假想分支方向預(yù)測裝置412會產(chǎn)生圖4的非假想方向預(yù)測444。此外,非假想目標(biāo)地址計算器416則計算圖3的非假想目標(biāo)地址354。最后,若該指令為一返回指令,則非假想調(diào)用/返回堆棧414產(chǎn)生圖3的非假想返回地址355。在步驟1404中,控制邏輯404會確定分支指令是否為條件分支指令。也就是,控制邏輯404會確定該指令是否依靠一條件而被采用或不被采用,該條件像是旗標(biāo)(flag)位是否設(shè)定,如零旗標(biāo)(zeroflag)、進(jìn)位旗標(biāo)(carryflag)等等。在x86指令集中,JCC指令是條件類型的分支指令。相對地,RET、CALL與JUMP指令,則是無條件分支指令,因為這些指令總會有一被采用的方向。若該指令為條件類型的分支指令,則在步驟1412中,控制邏輯404會確定非假想分支方向預(yù)測裝置412所預(yù)測的非假想方向預(yù)測444以及BTAC402所預(yù)測SBI454中圖7的假想方向722兩者間,是否不相匹配。若有方向預(yù)測上的不匹配,則在步驟1414中,控制邏輯404會確定非假想方向預(yù)測444是否要被采用。若非假想方向預(yù)測444不被采用,則在步驟1414中,控制邏輯404會控制多工器422選取圖4的NSIP466,以分支至現(xiàn)行分支指令后的指令。也就是,控制邏輯404選擇性地覆蓋假想的BTAC402方向預(yù)測。假想方向預(yù)測722之所以被覆蓋,是因非假想方向預(yù)測444一般比較準(zhǔn)確。若非假想方向預(yù)測444被采用,則在步驟1432中,控制邏輯404會控制多工器422分支至非假想目標(biāo)地址354。同樣地,假想方向預(yù)測722之所以被覆蓋,是因非假想方向預(yù)測444一般比較準(zhǔn)確。若控制邏輯404于步驟1412確定并無方向預(yù)測上的不匹配,且已執(zhí)行分支指令的假想分支(即,若SB位438被設(shè)定),則在步驟1428中,控制邏輯404會確定假想目標(biāo)地址352與非假想目標(biāo)地址354間是否不相匹配。若有一條件類型分支的目標(biāo)地址的不匹配,則在步驟1432中,控制邏輯404會控制多工器422分支至非假想目標(biāo)地址354。假想目標(biāo)地址預(yù)測352會被覆蓋,此因非假想目標(biāo)地址預(yù)測354一般更為準(zhǔn)確。若沒有一條件類型分支的目標(biāo)地址的不匹配,則不會采取任何行動。也就是,允許進(jìn)行假想分支,并接受錯誤更正的管制,如關(guān)于圖10部分所述。若在步驟1404中,控制邏輯404確定該分支指令不是條件類型的分支,則于步驟1406控制邏輯404會確定該分支指令是否為返回指令。若該分支指令是返回指令,則在步驟1418中,控制邏輯404會確定假想調(diào)用/返回堆棧406產(chǎn)生的假想返回地址353與非假想調(diào)用/返回堆棧414產(chǎn)生的非假想返回地址355兩者間,是否不相匹配。若假想返回地址353與非假想返回地址355兩者不相匹配,則在步驟1422中,控制邏輯404會控制多工器422分支至非假想返回地址355。也就是,控制邏輯404選擇性地覆蓋假想返回地址353。假想返回地址353之所以被覆蓋,是因非假想返回地址355一般比較準(zhǔn)確。若沒有一直接類型分支的目標(biāo)地址的不匹配,則不會采取任何行動。也就是,允許進(jìn)行假想分支,并接受錯誤更正的管制,如關(guān)于圖10部分所述。請注意步驟1418與1422分別對應(yīng)到圖13的步驟1324與1326。若在步驟1406中,控制邏輯404確定該分支指令不是返回指令,則于步驟1408控制邏輯404會確定該分支指令是否為PC相關(guān)類型的分支指令。在x86指令集中,PC相關(guān)類型的分支指令所指定的帶正負(fù)號的位移量會加上現(xiàn)行程序計數(shù)器的值,以計算目標(biāo)地址。在另一具體實施例中,控制邏輯404于步驟1408也會確定該分支指令是否為直接類型的分支指令。在x86指令集中,直接類型的分支指令于自身內(nèi)即指定目標(biāo)地址。直接類型的分支指令也被稱為立即類型(immediatetype)的分支指令,因為目標(biāo)地址被指定于指令的立即字段(immediatefield)。若該分支指令為PC相關(guān)類型的分支指令,則在步驟1424中,控制邏輯404會確定假想目標(biāo)地址352與非假想目標(biāo)地址354間是否不相匹配。若有一PC相關(guān)類型分支的目標(biāo)地址的不匹配,則在步驟1426中,控制邏輯404會控制多工器422分支至非假想目標(biāo)地址354。假想目標(biāo)地址預(yù)測352會被覆蓋,此因非假想目標(biāo)地址預(yù)測354對PC相關(guān)類型的分支而言一般更為準(zhǔn)確。若沒有一PC相關(guān)類型分支的目標(biāo)地址的不匹配,則不會采取任何行動。也就是,允許進(jìn)行假想分支,并接受錯誤更正的管制,如關(guān)于圖10部分所述。若在步驟1408中,控制邏輯404確定該分支指令不是PC相關(guān)類型的分支指令,則不會采取任何行動。也就是,允許進(jìn)行假想分支,并接受錯誤更正的管制,如關(guān)于圖10部分所述。在一具體實施例中,非假想目標(biāo)地址計算器416在F-階段312包括一相當(dāng)小的分支目標(biāo)緩沖器(branchtargetbuffer,BTB),僅用來快取間接類型分支指令的分支目標(biāo)地址,如前面關(guān)于圖4部分所述。可以看出,對間接類型的分支指令而言,BTAC402的預(yù)測一般是比相當(dāng)小的F-階段312BTB更為準(zhǔn)確。所以,若確定該分支為一間接類型的分支指令,控制邏輯404不會覆蓋BTAC402的假想預(yù)測。也就是,若一間接類型分支指令的假想分支因圖8所述的BTAC402命中而執(zhí)行,則控制邏輯404會通過分支至間接類型的BTB目標(biāo)地址,而不覆蓋該假想分支。然而,即使在此間接類型的分支中,BTAC402所產(chǎn)生的假想目標(biāo)地址352未被非假想目標(biāo)地址354給覆蓋,在流水線300稍后仍會于假想目標(biāo)地址352與圖3從S-階段328接收的非假想目標(biāo)地址356兩者間,做一目標(biāo)地址的比較,以執(zhí)行圖10的步驟1036,偵測錯誤的假想分支?,F(xiàn)請參照圖15,其為依本發(fā)明繪示的用來置換圖4BTAC402中目標(biāo)地址的裝置的方塊圖。為了簡明起見,關(guān)于BTAC402的多路關(guān)聯(lián)性的數(shù)據(jù),像是圖6的多路與路多工器606,并未顯示。圖6BTAC402的數(shù)據(jù)數(shù)組612顯示其包括了一選定的BTAC402快取線,其中具有項目A602A與項目B602B,分別通過圖6的信號624與626送至控制邏輯404。項目A602A與項目B602B各包括其相關(guān)的圖7VALID位702。該選定的BTAC402快取線亦包括一A/BLRU(leastrecentlyused)位1504,以指出項目A602A與項目B602B兩者中,哪一個最近最少被使用到。在一具體實施例中,每次一發(fā)生命中BTAC402的一既定目標(biāo)地址714,A/BLRU位1504就被更新,以指定發(fā)生命中項目的相對項目。也就是,若控制邏輯404因項目A602A發(fā)生命中而進(jìn)行至圖8的步驟812,則A/BLRU位1504就被更新成顯示項目B602B。相反地,若控制邏輯404因項目B602B發(fā)生命中而進(jìn)行至圖8的步驟832,則A/BLRU位1504就被更新成顯示項目A602A。A/BLRU位1504也被送至控制邏輯404。此置換裝置也包括一多工器1506。多工器1506接收圖4提取地址495與一更新指令指針(IP)作為輸入。多工器1506依據(jù)控制邏輯404提供的讀/寫控制信號1516來選取其中一輸入。讀/寫控制信號1516亦被送至BTAC402。當(dāng)讀/寫控制信號1516顯示為“讀”,則多工器1506選取提取地址495,經(jīng)由信號1514送至BTAC402,以讀取BTAC402。當(dāng)讀/寫控制信號1516顯示為“寫”,則多工器1506選取更新IP1512,經(jīng)由信號1514送至BTAC402,以通過圖4信號442將一更新目標(biāo)地址714與/或SBI454與/或A/BLRU位1504寫入BTAC402。當(dāng)一分支指令執(zhí)行且被采用,該分支指令的目標(biāo)地址714以及相關(guān)聯(lián)的SBI454會被寫入,或快取于,一BTAC402項目602。也就是,用已執(zhí)行的分支指令的新目標(biāo)地址714及相關(guān)聯(lián)的SBI454來更新BTAC402??刂七壿?04必須決定在BTAC402的哪一邊,A或B,來更新由更新IP1512選取的BTAC402快取線與路。也就是,控制邏輯404必須決定是否要置換所選取的快取線與路的項目A602A或項目B602B??刂七壿?04如下表一所示來決定置換哪一邊。ValidAValidBReplace00--LastWritten01A10B11LRU表一表一為具有兩個輸入的真值表(truthtable),兩個輸入為項目A602A的VALID位702與項目B602B的VALID位702。該真值表的輸出用以決定要置換BTAC402的哪一邊。如表一所示,若A項目602A無效且B項目602B有效,則控制邏輯404將A項目602A置換掉。若A項目602A有效且B項目602B無效,則控制邏輯404將B項目602B置換掉。若A項目602A與B項目602B皆有效,則控制邏輯404將最近較少被使用的項目置換掉,而此項目是由更新IP1512所選取BTAC402快取線與路中的A/BLRU位1504來指定。若A項目602A與B項目602B皆無效,則控制邏輯404必須決定要置換哪一邊。一種解決方式是總是寫到某一邊,如A。然而,這種解決方式會造成如下程序代碼序列1所示的問題。0x00000010JMP0X000000140x00000014ADDBX,10x00000016CALL0x12345678程序代碼序列1在程序代碼序列1中,此三個指令都位在相同的指令高速緩存432的快取線內(nèi),因為其指令指針地址除了較低的四個地址位外余皆相同;因此,JMP與CALL指令選取相同的BTAC402快取線與路。假設(shè)此范例中,當(dāng)指令執(zhí)行時,由JMP與CALL指令所選取BTAC402快取線與路內(nèi)的A項目602A與B項目602B皆無效。使用“當(dāng)兩個項目皆無效時,總是更新A這一邊”的解決方式,JMP指令將見到兩邊皆為無效,且將更新A項目602A。然而,由于在程序序列中CALL指令相當(dāng)接近JMP指令,若流水線相當(dāng)長,如處理器300,則在A項目602A的VALID位702被更新前,有相當(dāng)多數(shù)量的周期可能會通過。因此,在BTAC402被已執(zhí)行的JMP指令更新前,特別是在A項目602A的VALID位702與所選取BTAC402快取線的BTAC402路置換狀態(tài)被JMP指令更新之前,CALL指令非常有可能會選取BTAC402。所以,CALL指令將見到兩邊皆為無效,而且也將依“當(dāng)兩個項目皆無效時,總是更新A這一邊”的解決方式,來更新A項目602A。這樣做是有問題的,因為JMP指令的目標(biāo)地址714將由于一空的即無效的B項目602B可用來快取CALL指令的目標(biāo)地址714而不必要地被取代。為解決如表一所示的問題,若A項目602A與B項目602B皆無效,則控制邏輯404最好選取存于一全域置換狀態(tài)旗標(biāo)緩存器即LastWritten1502的一邊或其相反邊。LastWritten緩存器1502包括于置換裝置,并由其來更新。LastWritten緩存器1502儲存一指示,其顯示就BTAC402整體而言,其A邊或B邊是否為最后被寫到一無效的BTAC402項目602。有利地,此方法使用LastWritten緩存器1502以避免前面程序代碼序列1所示的問題,如現(xiàn)在關(guān)于圖16與17部分所要敘述的。現(xiàn)請參照圖16,其為依本發(fā)明圖15裝置的一運作方法的流程圖。圖16闡明了上述表一的一具體實施例。當(dāng)控制邏輯404需要去更新BTAC402的項目602時,控制邏輯404會分別檢查所選取的A項目602A與B項目602B的VALID位702。在步驟1602中,控制邏輯404會確定是否A項目602A與B項目602B兩者皆為有效。若兩個項目皆有效,則在步驟1604中,控制邏輯404會檢查A/BLRU位1504以確定A項目602A或B項目602B為最近最少被使用者。若A項目602A為最近最少被使用者,則控制邏輯404于步驟1606將A項目602A置換掉。若B項目602B為最近最少被使用者,則控制邏輯404于步驟1608將B項目602B置換掉。若控制邏輯404于步驟1602中確定并非兩個項目都無效,則在步驟1612中,控制邏輯404會確定是否為A項目602A有效而B項目602B無效。若是,則控制邏輯404于步驟1614將B項目602B置換掉。不然,在步驟1622中,控制邏輯404會確定是否為A項目602A無效而B項目602B有效。若是,則控制邏輯404于步驟1624將A項目602A置換掉。否則,在步驟1632中,控制邏輯404會檢查LastWritten緩存器1502。若LastWritten緩存器1502顯示BTAC402的A邊并非最后被寫到一選定的快取線與路中,而在此選定的快取線與路中A項目602A與B項目602B皆為無效,則控制邏輯404于步驟1634將A項目602A置換掉。控制邏輯404接著于步驟1636更新LastWritten緩存器1502,以指定BTAC402的A邊為最后被寫到一選定快取線與路的邊,而在此選定的快取線與路中A項目602A與B項目602B皆為無效。若LastWritten緩存器1502顯示BTAC402的B邊并非最后被寫到一選定的快取線與路中,而在此選定的快取線與路中A項目602A與B項目602B皆為無效,則控制邏輯404于步驟1644將B項目602B置換掉??刂七壿?04接著于步驟1646更新LastWritten緩存器1502,以指定BTAC402的B邊為最后被寫到一選定快取線與路的邊,而在此選定的快取線與路中A項目602A與B項目602B皆為無效。可以看出,圖16的方法可避免在上述程序代碼序列1中,以CALL指令的目標(biāo)地址覆寫掉JMP指令的目標(biāo)地址。假設(shè)當(dāng)JMP指令執(zhí)行時,LastWritten緩存器1502指定了A邊。既然B邊并不是最后被寫的,控制邏輯404將依據(jù)圖16與表一來更新B項目602B。此外,控制邏輯404將更新LastWritten緩存器1502以指定B邊。因此,當(dāng)CALL指令執(zhí)行時,控制邏輯404將依據(jù)圖16更新A項目602A,此因當(dāng)BTAC402被選取時,兩個項目皆無效,且LastWritten緩存器1502指明了A邊并不是最后被寫到。因此,有利地,JMP與CALL指令兩者的目標(biāo)地址將快取于BTAC402,供后續(xù)的假想分支使用。現(xiàn)請參照圖17,其為依本發(fā)明的另一具體實施例繪示圖15裝置的一運作方法的流程圖。圖17的步驟除了兩個額外步驟外,其余皆與圖16的步驟相同。在此另一具體實施例中,控制邏輯404在置換一無效的項目后,會更新LastWritten緩存器1502,即使另一項目為有效的。因此,在圖17,于步驟1614置換了B項目602B后,在步驟1716中,控制邏輯404將更新LastWritten緩存器1502以指定B邊。此外,于步驟1624置換了A項目602A后,在步驟1726中,控制邏輯404將更新LastWritten緩存器1502以指定A邊。雖然實際的仿真并未看到圖16與17的實施例在效能上有顯著差別,但可看出圖16實施例解決了圖17實施例所無法處理的一個問題。此問題以下述程序代碼序列2來解說。0x00000010JMP0x123456780x12345678JMP0x000000140x00000014JMP0x20000000程序代碼序列2位于指令指針0x00000010與0x00000014的兩個JMP指令都在同一條指令高速緩存432快取線中,并選取BTAC402內(nèi)相同的快取線。位于指令指針0x12345678的JMP指令則在另一條指令高速緩存432快取線中,并選取BTAC402內(nèi)另一條不同的快取線。當(dāng)JMP0x12345678指令執(zhí)行時,假設(shè)有下列情況存在。LastWritten緩存器152指定了B邊。由JMP0x12345678指令與JMP0x20000000指令的指令指針?biāo)x取BTAC402快取線與路中的A項目602A與B項目602B兩者皆為無效。由JMP0x00000014指令的指令指針?biāo)x取的BTAC402快取線與路則顯示A項目602A有效而B項目602B無效。假設(shè)在JMP0x12345678指令更新BTAC402前,執(zhí)行JMP0x20000000指令。因此,JMP0x12345678與JMP0x20000000指令的指令指針在相同BTAC402快取線中選取相同的路。依據(jù)圖16與17,當(dāng)JMP0x12345678執(zhí)行時,控制邏輯404將于步驟1634以JMP0x12345678的目標(biāo)地址來置換A項目602A,并在步驟1636更新LastWritten緩存器1502以指定A邊。依據(jù)圖16與17,當(dāng)JMP0x00000014執(zhí)行時,控制邏輯404將于步驟1614以JMP0x00000014的目標(biāo)地址來置換B項目602B。依據(jù)圖17,控制邏輯404將于步驟1716更新LastWritten緩存器1502以指定B邊。然而,依據(jù)圖16,控制邏輯404將不會更新LastWritten緩存器1502;而是,LastWritten緩存器1502將繼續(xù)指定A邊。因此,當(dāng)JMP0x00000020執(zhí)行時,依據(jù)圖17,控制邏輯404將于步驟1634以JMP0x00000020的目標(biāo)地址來置換A項目602A,用來needlesslyclobberingJMP0x12345678的目標(biāo)地址。相反地,依據(jù)圖16,當(dāng)JMP0x00000020執(zhí)行時,控制邏輯404將于步驟1644置換B項目602B,用來有利地使A項目602A中JMP0x12345678的目標(biāo)地址保持不變?,F(xiàn)請參照圖18,其為依本發(fā)明的另一具體實施例繪示的用以進(jìn)行圖4BTAC402中目標(biāo)地址置換動作的裝置方塊圖。圖18的實施例類似于圖15的實施例。然而,在圖18的實施例中,A/BLRU位1504與兩個項目的T/NT位722,顯示為T/NTA722A與T/NTB722B,儲存于一另外的數(shù)組1812,而非數(shù)據(jù)數(shù)組612。此額外的數(shù)組1812是雙端口的;而數(shù)據(jù)數(shù)組612卻是單端口。因為A/BLRU位1504與T/NT位722比起項目602的其它字段更常被更新,對較常被更新的字段提供雙端口的存取,可減低在高存取量期間于BTAC402形成瓶頸的可能性。然而,由于雙端口的高速緩存數(shù)組比單端口的高速緩存數(shù)組來得大,且消耗更多功率,較少被存取的字段就儲存在單端口的資料數(shù)組612?,F(xiàn)請參照圖19,其為依本發(fā)明的另一具體實施例繪示的用以進(jìn)行圖4BTAC402中目標(biāo)地址置換動作的裝置方塊圖。圖19的實施例類似于圖15的實施例。然而,圖19的實施例中,每一BTAC402快取線與路皆包括一第三項目,項目C602C。項目C602C通過信號1928送至控制邏輯404。有利地,圖19的實施例支持假想分支至三個分支指令中任一個的能力,而此三個分支指令快取由提取地址495所選取的一對應(yīng)的指令高速緩存432快取線中;或者,在一實施例中,支持假想分支至快取于一對應(yīng)的指令高速緩存432半快取線的三個分支指令中的任一個。除此之外,圖19的實施例不使用LastWritten緩存器1502,取而代之的是一緩存器1902,其包括一LastWritten值與一LastWrittenPrev值。當(dāng)LastWritten值要更新時,控制邏輯404在更新LastWritten值之前,便將LastWritten值的內(nèi)容復(fù)制到LastWrittenPrev值。LastWritten值與LastWrittenPrev值這兩個值一起使得控制邏輯404得以確定三個項目中哪一個是最近最少被寫到的,如現(xiàn)在于表二及其后的等式所描述的。表二類似于表一,除了表二有三個輸入,包括項目C602C的附加的VALID位702。在等式中,“l(fā)w”對應(yīng)至LastWritten值,“l(fā)wp”LastWrittenPrev值。在一具體實施例中,只有當(dāng)所有三個項目皆為無效時,才更新LastWritten與LastWrittenPrev的值,類似于圖16的方法。在另一具體實施例中,任何時候控制邏輯404更新了一無效的項目,LastWritten與LastWrittenPrev的值就會更新,類似于圖17的方法。表二LRW=AOlderThanB?LRWofAandCLRWofBandCLRWofAandB=AOlderThanB?ABLRWofAandC=AOlderThanC?ACLRWofBandC=BOlderThanC?BCAOlderThanB=(lw==B)|((lwp==B&(lw?。紸))BOlderThanC=(lw==C)|((lwp==C&(lw?。紹))AOlderThanC=(lw==C)|((lwp==C&(lw?。紸))雖然本發(fā)明及其目的、特征與優(yōu)點已詳細(xì)敘述了,其它具體實施例仍涵蓋在本發(fā)明的范圍內(nèi)。例如,BTAC可用任何數(shù)量的高速緩存來配置,包括直接映像(direct-mapped)、完全關(guān)聯(lián)(fullyassociative)或不同數(shù)目的路高速緩存。再者,BTAC的大小可增或減。而且,一提取地址,而不是位于實際包括被預(yù)測分支指令的快取線的提取地址,可用來檢索BTAC與分支歷史表。例如,先前提取指令的提取地址可用來在分支前減低指令泡沫的大小。此外,儲存于高速緩存的每一路的目標(biāo)地址數(shù)量可能改變。另外,分支歷史表的大小可能改變,且存于其中的位的數(shù)目與方向預(yù)測數(shù)據(jù)的形式,以及檢索分支歷史表的算法(algorithm)也可能改變。再者,指令高速緩存的大小可能改變,且用以檢索指令高速緩存與BTAC的虛擬提取地址的類型也可能改變??傊陨纤鰞H為本發(fā)明的較佳實施例而已,當(dāng)不能限定本發(fā)明所實施的范圍。凡是依本發(fā)明權(quán)利要求所作的等效變化與修飾,皆應(yīng)仍屬于本發(fā)明專利涵蓋的范圍內(nèi)。LRWofAandC=AOlderThanC?ACLRWofBandC=BOlderThanC?BCAOlderThanB=(lw==B)|((lwp==B&(lw!=A))BOlderThanC=(lw==C)|((lwp==C&(lw?。紹))AOlderThanC=(lw==C)|((lwp==C&(lw?。紸))238表二類似于表一,除了表二有三個輸入,包括項目C702C的附加的VALID位702。在等式中,「lw」對應(yīng)至LastWritten值,「lwp」LastWrittenPrev值。在一具體實施例中,只有當(dāng)所有三個項目皆為無效時,才更新LastWritten與LastWrittenPrev的值,類似于圖16的方法。在另一具體實施例中,任何時候控制邏輯404更新了一無效的項目,LastWritten與LastWrittenPrev的值就會更新,類似于圖17的方法。239雖然本發(fā)明及其目的、特征與優(yōu)點已詳細(xì)敘述了,其它具體實施例仍涵蓋在本發(fā)明的范圍內(nèi)。例如,BTAC可用任何數(shù)量的高速緩存來配置,包括直接映像(direct-mapped)、完全關(guān)聯(lián)(fullyassociative)或不同數(shù)目的路高速緩存。再者,BTAC的大小可增或減。而且,一提取地址,而不是位于物理包括被預(yù)測分支指令的快取線的提取地址,可用來檢索BTAC與分支歷史表。例如,先前提取指令的提取地址可用來在分支前減低指令泡沫的大小。此外,儲存于高速緩存的每一路的目標(biāo)地址數(shù)量可能改變。另外,分支歷史表的大小可能改變,且存于其中的位的數(shù)目與方向預(yù)測數(shù)據(jù)的形式,以及檢索分支歷史表的算法(algorithm)也可能改變。再者,指令高速緩存的大小可能改變,且用以檢索指令高速緩存與BTAC的虛擬提取地址的類型也可能改變。240總之,以上所述僅為本發(fā)明的較佳實施例而已,當(dāng)不能以的限定本發(fā)明所實施的范圍。凡是依本發(fā)明權(quán)利要求所作的均等變化與修飾,皆應(yīng)仍屬于本發(fā)明專利涵蓋的范圍內(nèi)。權(quán)利要求1.一種用于一微處理器內(nèi)的分支裝置,該裝置利用一提取地址選取一指令高速緩存中的一快取線,該裝置亦使用該提取地址來假想預(yù)測一分支指令是否將被采用,該分支指令可能潛在地(potentially)存在于該指令快取線中,其特征在于,該裝置包括一第一預(yù)測裝置,對應(yīng)至該提取地址,依據(jù)該提取地址預(yù)測該分支指令是否將被采用;一邏輯,對應(yīng)至該提取地址,提供該提取地址與一全域分支歷史的一二進(jìn)制函數(shù)于該邏輯的一輸出端;一第二預(yù)測裝置,對應(yīng)至該邏輯的輸出端,依據(jù)該輸出預(yù)測該分支指令是否將被采用;一選擇器,對應(yīng)至該提取地址,依據(jù)該提取地址選取該第一與第二預(yù)測裝置其中之一。2.如權(quán)利要求1所述的裝置,其特征在于,該二進(jìn)制函數(shù)包括至少一部份該提取地址與該全域分支歷史的一異或運算。3.如權(quán)利要求1所述的裝置,其特征在于,該第一預(yù)測裝置由該提取地址所檢索的一分支目標(biāo)地址高速緩存所提供。4.如權(quán)利要求1所述的裝置,其特征在于,該第二預(yù)測裝置由提取地址與該全域分支歷史的該二進(jìn)制函數(shù)所檢索的一分支歷史表所提供。5.如權(quán)利要求1所述的裝置,其特征在于,該選擇器由該提取地址所檢索的一分支目標(biāo)地址高速緩存所提供。6.如權(quán)利要求1所述的裝置,其特征在于,該選擇器包括一位,用以在該第一與第二預(yù)測間做選擇。7.如權(quán)利要求1所述的裝置,其特征在于,每一該第一與第二預(yù)測裝置包括數(shù)個預(yù)測該分支指令是否將被采用的預(yù)測器,其中該選擇器包括數(shù)個對應(yīng)于該數(shù)個預(yù)測器的位,用以在所對應(yīng)的該數(shù)個第一與第二預(yù)測器間做選擇。8.如權(quán)利要求1所述的裝置,其特征在于,該選擇器包括一飽和上/下數(shù)計數(shù)器。9.如權(quán)利要求8所述的裝置,其特征在于,該飽和上/下數(shù)計數(shù)器從下列情形的一儲存一選取值(selectionvalue)極可能是第一預(yù)測裝置(stronglyfirstpredictor)、有可能是第一預(yù)測裝置(weaklyfirstpredictor)、有可能是第二預(yù)測裝置(weaklysecondpredictor)以及極可能是第二預(yù)測裝置(stronglysecondpredictor)。10.如權(quán)利要求1所述的裝置,其特征在于,還包括一緩存器,對應(yīng)至該第二預(yù)測裝置,儲存該全域分支歷史。11.如權(quán)利要求10所述的裝置,其特征在于,該緩存器包括一N位移位緩存器,以儲存微處理器所執(zhí)行的分支指令是否被采用的N個先前結(jié)果。12.一種假想分支預(yù)測裝置,位在具有一指令高速緩存的一流水線化微處理器中,該指令高速緩存接收一地址總線上的一提取地址,以選取該指令高速緩存的一快取線,一分支指令被假定存在于該快取線中,其特征在于,該裝置包括一假想分支歷史表(BHT),提供該分支指令的一第一方向預(yù)測;一分支目標(biāo)地址高速緩存(BTAC),對應(yīng)至該地址總線,提供該分支指令的一第二方向預(yù)測,并提供一選擇預(yù)測,用以在該第一與第二方向預(yù)測間作選擇;以及一多工器,對應(yīng)至該BHT與該BTAC,依據(jù)該選擇預(yù)測選取該第一與第二方向預(yù)測其中之一;其中該第二方向預(yù)測系響應(yīng)該提取地址而提供,即使該分支指令可能并不存在于該指令快取線中。13.如權(quán)利要求12所述的裝置,其特征在于,還包括一全域分支歷史緩存器,對應(yīng)至該BHT,儲存微處理器先前所執(zhí)行數(shù)個分支指令的方向的一全域歷史。14.如權(quán)利要求13所述的裝置,其特征在于,BHT響應(yīng)該指令高速緩存提取地址與存于該全域分支歷史緩存器的全域歷史的一函數(shù),而提供該第一方向預(yù)測。15.如權(quán)利要求14所述的裝置,其特征在于,該函數(shù)包括存于該全域分支歷史緩存器的全域歷史與一部份該指令高速緩存提取地址的一邏輯的異或運算。16.如權(quán)利要求14所述的裝置,其特征在于,BHT包括一具數(shù)個儲存組件的數(shù)組,以儲存數(shù)個方向預(yù)測,其中該數(shù)組由指令高速緩存提取地址與該全域歷史的該函數(shù)作索引。17.如權(quán)利要求16所述的裝置,其特征在于,每一該些儲存組件被組態(tài)為儲存數(shù)個方向預(yù)測,以供選取作為該第一方向預(yù)測。18.如權(quán)利要求12所述的裝置,其特征在于,該第一方向預(yù)測、該第二方向預(yù)測以及該選擇預(yù)測的每一個皆包括數(shù)個預(yù)測。19.如權(quán)利要求18所述的裝置,其特征在于,該多工器為每一該第一與第二方向預(yù)測選取該數(shù)個預(yù)測之一,以響應(yīng)一對應(yīng)的其中一該數(shù)個選擇預(yù)測。20.在如權(quán)利要求19所述的裝置,其特征在于,還包括一控制邏輯,對應(yīng)至該多工器,從該多工器接收每一該第一與第二方向預(yù)測的所選取的其中一該數(shù)個預(yù)測,該控制邏輯組態(tài)為依據(jù)所選取的其中一該數(shù)個預(yù)測,使微處理器選擇性地進(jìn)行假想分支或不分支。21.如權(quán)利要求20所述的裝置,其特征在于,該控制邏輯被組態(tài)為使微處理器選擇性地假想分支至該BTAC響應(yīng)提取地址所提供的一假想分支目標(biāo)地址。22.一種用在一微處理器中的假想分支目標(biāo)地址高速緩存(BTAC),其特征在于,該BTAC包括一數(shù)組,組態(tài)為儲存數(shù)個分支指令的方向預(yù)測;一輸入,對應(yīng)至該數(shù)組,組態(tài)為接收一指令高速緩存的提取地址,該提取地址檢索該數(shù)組,以選取該數(shù)個方向預(yù)測其中之一;以及一輸出,對應(yīng)至該數(shù)組,提供所選取的方向預(yù)測至一分支控制邏輯;其中若所選取的方向預(yù)測指定一采用方向,則不管是否有一分支指令存在于該提取地址所檢索的指令高速緩存的一快取線中,該分支控制邏輯皆使微處理器進(jìn)行假想分支。23.一種用于假想分支的微處理器,其特征在于,包括一指令高速緩存,提供一地址總線上的一提取地址所選取的一指令字節(jié)線;一假想分支歷史表(BHT),對應(yīng)至該地址總線,提供一分支指令是否將被采用的一第一預(yù)測,該分支指令被假定存在于該指令快取線,該第一預(yù)測系依據(jù)該提取地址與一全域分支歷史的一組合而提供;一假想分支目標(biāo)地址高速緩存(BTAC),對應(yīng)至該地址總線,提供該假定的分支指令的一第二預(yù)測,并提供一選擇器;以及一控制邏輯,對應(yīng)至該BHT與BTAC,若該選擇器所選取的該第一與第二預(yù)測其中之一預(yù)測該假定的分支指令將被采用,則該控制邏輯使微處理器進(jìn)行假想分支。24.如權(quán)利要求23所述的微處理器,其特征在于,該控制邏輯使微處理器假想分支至BTAC依據(jù)該提取地址而提供的一假想分支目標(biāo)地址。25.如權(quán)利要求23所述的微處理器,其特征在于,還包括一假想調(diào)用/返回堆棧,對應(yīng)至BTAC,儲存數(shù)個假想返回地址;其中該控制邏輯使微處理器假想分支至該假想調(diào)用/返回堆棧依據(jù)該提取地址而提供的其中一該數(shù)個假想返回地址。26.如權(quán)利要求25所述的微處理器,其特征在于,BTAC被組態(tài)為提供一指示,以指出該假定的分支指令是否為返回指令。27.如權(quán)利要求26所述的微處理器,其特征在于,只有在該指示指出該假定的分支指令是返回指令時,該控制邏輯才使微處理器假想分支至該假想調(diào)用/返回堆棧所提供的假想返回地址。28.如權(quán)利要求27所述的微處理器,其特征在于,BTAC被組態(tài)為提供一指示,以指出該假定的分支指令是否為調(diào)用指令。29.如權(quán)利要求28所述的微處理器,其特征在于,若該指示指出該假定的分支指令是調(diào)用指令,則該控制邏輯使該假想調(diào)用/返回堆棧所提供的假想返回地址被推入該假想調(diào)用/返回堆棧中。30.如權(quán)利要求23所述的微處理器,其特征在于,該選擇器系響應(yīng)該假定分支指令是否會被采用的一解析方向而更新。31.如權(quán)利要求30所述的微處理器,其特征在于,若該第一與第二預(yù)測中一被選取的預(yù)測是不正確的,且若該第一與第二預(yù)測中一未被選取的預(yù)測是正確的,則該選擇器系響應(yīng)該解析方向而更新。32.如權(quán)利要求31所述的微處理器,其特征在于,該選擇器系通過切換(toggling)該選擇器而更新。33.如權(quán)利要求31所述的微處理器,其特征在于,該選擇器系通過使選擇器朝該未被選取的預(yù)測計數(shù)而更新。34.如權(quán)利要求23所述的微處理器,其特征在于,該BHT包括一具數(shù)個儲存組件的數(shù)組,用來為數(shù)個分支指令的每一個儲存一分支歷史。35.如權(quán)利要求34所述的微處理器,其特征在于,為該數(shù)個分支指令的每一個所儲存的該分支歷史包括一被采用/不被采用(taken/nottaken)位。36.如權(quán)利要求34所述的微處理器,其特征在于,為該數(shù)個分支指令的每一個所儲存的該分支歷史包括一飽和上/下數(shù)計數(shù)器。37.一種在一微處理器中進(jìn)行假想分支的方法,其特征在于,該方法包括產(chǎn)生一指令的數(shù)個假想分支方向預(yù)測;選取該數(shù)個假想分支方向預(yù)測的一作為一最后方向預(yù)測;以及若該最后方向預(yù)測指出該指令將被采用,則使微處理器進(jìn)行假想分支;其中該產(chǎn)生、選取以及假想分支的動作皆在譯碼該指令之前執(zhí)行。38.如權(quán)利要求37所述的方法,其特征在于,還包括在該假想分支的動作之后,偵測該最后方向錯誤地指出該指令將被采用。39.如權(quán)利要求38所述的方法,其特征在于,還包括因應(yīng)該偵測動作,分支至一正確目標(biāo)地址。40.一種在一微處理器中進(jìn)行假想分支的方法,其特征在于,該方法包括產(chǎn)生一分支指令是否將被采用的第一與第二預(yù)測,以響應(yīng)于一指令高速緩存提取地址的第一與第二二進(jìn)制函數(shù);選取該第一與第二預(yù)測其中之一作為一最后預(yù)測,該選取的動作系響應(yīng)該提取地址的一第三二進(jìn)制函數(shù)而執(zhí)行;以及若該最后預(yù)測指出該分支指令將被采用,則微處理器進(jìn)行假想分支其中不論該分支指令是否存在于該提取地址所選取的一指令快取線中,該產(chǎn)生、選取以及假想分支的動作皆被執(zhí)行。41.如權(quán)利要求40所述的方法,其特征在于,該第一與第二函數(shù)系不同的函數(shù)。42.如權(quán)利要求40所述的方法,其特征在于,該第二二進(jìn)制函數(shù)包括該提取地址與一全域分支歷史的一二進(jìn)制函數(shù)。43.如權(quán)利要求42所述的方法,其特征在于,該第二二進(jìn)制函數(shù)包括至少一部分該提取地址與該全域分支歷史的一異或運算。44.如權(quán)利要求40所述的方法,其特征在于,該第一與第三二進(jìn)制函數(shù)系相同的函數(shù)。45.如權(quán)利要求44所述的方法,其特征在于,該第一與第三二進(jìn)制函數(shù)包括一預(yù)先決定(predetermined)數(shù)量的該提取地址的最低有效位。45.如權(quán)利要求16所述的微處理器,其特征在于,該假想BTAC與該指令高速緩存實質(zhì)上被并行存取。46.一種用以從錯誤地分支至一假想目標(biāo)地址的情況回復(fù)的方法,其特征在于,包括為一分支指令產(chǎn)生一假想目標(biāo)地址,該分支指令被假定存在于一提取地址所選取的一指令快取線中;分支至該假想目標(biāo)地址,不論該假定的分支指令是否存在于該指令快取線中;在產(chǎn)生該假想目標(biāo)地址后,產(chǎn)生該假定的分支指令的一正確目標(biāo)地址;確定該假想目標(biāo)地址是否匹配該正確目標(biāo)地址;以及若假想目標(biāo)地址不匹配該正確目標(biāo)地址,則分支至該正確目標(biāo)地址。47.如權(quán)利要求46所述的方法,其特征在于,還包括在該確定動作之前,儲存一指示,以指出該分支至假想目標(biāo)地址的動作是否發(fā)生;以及只有在該指示指出該分支至假想目標(biāo)地址的動作發(fā)生時,才進(jìn)行該分支至該正確目標(biāo)地址的動作。48.如權(quán)利要求46所述的方法,其特征在于,該產(chǎn)生正確目標(biāo)地址的動作包括使用假定的分支指令的數(shù)個指令字節(jié)來計算該正確目標(biāo)地址。49.如權(quán)利要求46所述的方法,其特征在于,還包括若該假想目標(biāo)地址不匹配該正確目標(biāo)地址,則以該正確目標(biāo)地址更新一分支目標(biāo)地址高速緩存中的一包括該假想目標(biāo)地址的項目。50.一種用以從錯誤地分支至一分支指令的一假想目標(biāo)地址的情況回復(fù)的方法,該分支指令被假定存在于一指令快取線中,該指令快取線由一指令高速緩存響應(yīng)一提取地址而提供,該假想目標(biāo)地址由一分支目標(biāo)地址高速緩存(BTAC)響應(yīng)該提取地址而假想地產(chǎn)生,其特征在于,該方法包括在BTAC假想地產(chǎn)生該假想目標(biāo)地址后,譯碼該假定的分支指令;因應(yīng)該譯碼動作,確定該假定的分支指令是否為一非分支指令;以及若該假定的分支指令為一非分支指令,則分支至該假定的分支指令的一指令指針。51.如權(quán)利要求50所述的方法,其特征在于,還包括因應(yīng)該譯碼動作,計算該假定的分支指令的該指令指針。52.如權(quán)利要求50所述的方法,其特征在于,還包括若該假定的分支指令為一非分支指令,則使BTAC中一包括該假想目標(biāo)地址的項目無效。53.如權(quán)利要求52所述的方法,其特征在于,使該項目無效的動作先于該分支至該指令指針的動作而執(zhí)行。54.一種用以從錯誤地分支至一假想目標(biāo)地址的情況回復(fù)的方法,該假想目標(biāo)地址關(guān)聯(lián)于假定存在于一提取地址所選取一快取線中的一分支指令,該假想目標(biāo)地址由一分支目標(biāo)地址高速緩存(BTAC)響應(yīng)該提取地址而提供,其特征在于,該方法包括在BTAC提供該假想目標(biāo)地址后,譯碼該假定的分支指令;確定該假定的分支指令的一長度;以及若假定的分支指令的該長度與分支目標(biāo)地址高速緩存所假想提供的一指令長度不相匹配,則分支至該假定的分支指令的一指令指針。55.如權(quán)利要求54所述的方法,其特征在于,還包括若假定的分支指令的該長度與分支目標(biāo)地址高速緩存所假想提供的該指令長度不相匹配,則使BTAC中一包括該假想目標(biāo)地址的項目無效。56.如權(quán)利要求55所述的方法,其特征在于,使該項目無效的動作先于該分支至該指令指針的動作而執(zhí)行。57.一種用以從錯誤地分支至一假想目標(biāo)地址的情況回復(fù)的方法,其特征在于,包括產(chǎn)生一分支指令的一假想目標(biāo)地址,該分支指令被假定存在于一提取地址所選取一指令快取線中;產(chǎn)生該假定的分支指令的一假想方向預(yù)測;分支至該假想目標(biāo)地址,不論該假定的分支指令是否存在于該指令快取線中;在產(chǎn)生該假想方向預(yù)測后,產(chǎn)生該假定的分支指令的一正確方向;確定該正確方向是否不被采用;以及若該正確方向不被采用,則分支至假定的分支指令的下個指令的一指令指針。58.如權(quán)利要求57所述的方法,其特征在于,還包括若該正確方向不被采用,則響應(yīng)該正確方向而更新一分支目標(biāo)地址高速緩存中的該假想方向預(yù)測。59.一種用于一微處理器中的裝置,用以偵測是否錯誤地分支至一假想調(diào)用/返回堆棧所提供的一假想返回地址,其特征在于,該裝置包括一儲存組件,儲存一指示,以指出該微處理器是否在不知關(guān)聯(lián)于該指示的一指令是否為分支指令的情況下,分支至該假想返回地址;一指令譯碼邏輯,組態(tài)為在微處理器分支至該假想返回地址后接收并譯碼該指令;一預(yù)測檢查邏輯,對應(yīng)至該指令譯碼邏輯,用以告知分支控制邏輯,若指令譯碼邏輯指出該指令不是分支指令且該指示顯示微處理器分支至假想返回地址,則微處理器已錯誤地分支至假想返回地址。60.一種微處理器,用以偵測及更正一錯誤的假想分支,其特征在于,包括一指令高速緩存,提供一提取地址所選取的一指令字節(jié)線;一假想調(diào)用/返回堆棧,因應(yīng)該提取地址而提供一先前執(zhí)行的分支指令的一假想返回地址,不論該先前執(zhí)行的分支指令是否存在于該指令字節(jié)線中;一控制邏輯,對應(yīng)至該假想調(diào)用/返回堆棧,組態(tài)為控制一多工器在一第一周期選取該假想返回地址作為提取地址;以及一預(yù)測檢查邏輯,對應(yīng)至該控制邏輯,用以偵測控制邏輯是否控制該多工器錯誤地選取了該假想返回地址;其中該控制邏輯更組態(tài)為控制該多工器在一第二周期選取一正確地址作為提取地址,控制邏輯選取該正確地址,以響應(yīng)預(yù)測檢查邏輯偵測到控制邏輯控制該多工器錯誤地選取了該假想返回地址。61.一種用于一微處理器中的方法,用以從錯誤地分支至一假定分支指令的一假想目標(biāo)地址的情況回復(fù),其特征在于,該方法包括因應(yīng)一指令高速緩存的提取地址而提供一假想目標(biāo)地址;因應(yīng)該指令高速緩存的提取地址而產(chǎn)生一指令快取線;在提供該假想目標(biāo)地址后從該指令快取線譯碼一指令;其中該微處理器為第一次執(zhí)行該指令的譯碼;在該譯碼動作前分支至該假想目標(biāo)地址;以及在該分支至假想目標(biāo)地址的動作后,響應(yīng)該譯碼動作分支至該指令的一正確的目標(biāo)地址。62.一種用以從錯誤地分支至一假想目標(biāo)地址的情況回復(fù)的方法,其特征在于,包括提供一分支指令的一假想目標(biāo)地址,該分支指令被假定存在于一提取地址所選取一指令快取線中;分支至該假想目標(biāo)地址,不論該假定的分支指令是否存在于該指令快取線中;以及若該假定的分支指令不存在于該指令快取線中,則更正一錯誤的分支。63.一種用于一微處理器中的分支裝置,用以偵測該微處理器何時錯誤地分支至一假想目標(biāo)地址,該假想目標(biāo)地址由一分支目標(biāo)地址高速緩存(BTAC)所提供,其特征在于,該裝置包括一分支命中指示,用以指出該微處理器何時分支至該假想目標(biāo)地址,不論關(guān)聯(lián)于該分支命中指示的一指令是否為分支指令,皆提供該分支命中指示;一指令譯碼邏輯,組態(tài)為接收及譯碼該指令,并指出該指令是否為分支指令;一預(yù)測檢查邏輯,對應(yīng)至該指令譯碼邏輯,用以確定該微處理器錯誤地分支至該假想目標(biāo)地址;其中當(dāng)指令譯碼邏輯指出該指令不是分支指令,以及該分支命中指示顯示該微處理器分支至該假想目標(biāo)地址時,該微理器即為錯誤地分支至該假想目標(biāo)地址。全文摘要本發(fā)明涉及一種裝置,用以偵測由一流水線化微處理器所作的錯誤的假想分支,以及更正該錯誤的假想分支。一分支目標(biāo)地址高速緩存(BTAC)快取已執(zhí)行的分支指令的目標(biāo)地址。在流水線初期,于譯碼一指令前,基于一指令高速緩存的提取地址命中BTAC而執(zhí)行一假想分支至一快取目標(biāo)地址。當(dāng)該假想分支執(zhí)行時,一命中位被設(shè)定。稍后在流水線中,該假定的分支指令被譯碼和執(zhí)行。若該命中位因該指令而被設(shè)定,則檢查該已譯碼的指令,并將正確的目標(biāo)地址及方向與假想的版本做一比較,以確定該假想分支是否錯誤。若偵測到錯誤,該分支目標(biāo)地址高速緩存就會更新或無效化,且處理器會分支至適當(dāng)?shù)刂芬愿e誤。文檔編號G06F9/38GK1397879SQ0211855公開日2003年2月19日申請日期2002年4月27日優(yōu)先權(quán)日2001年5月4日發(fā)明者葛蘭·亨利,湯瑪斯·麥當(dāng)勞,泰瑞·派克斯申請人:智慧第一公司