專利名稱::附有第二預(yù)測(cè)裝置的假想分支目標(biāo)地址高速緩存的制作方法
技術(shù)領(lǐng)域:
:2本發(fā)明涉及微處理器(microprocessor)的分支預(yù)測(cè)(branchprediction)的
技術(shù)領(lǐng)域:
,尤指分支目標(biāo)地址(branchtargetaddress)的快取技術(shù),特別涉及一種附有由第二預(yù)測(cè)裝置依據(jù)分支指令類型進(jìn)行的選擇性覆蓋的假想分支目標(biāo)地址高速緩存。
背景技術(shù):
:3計(jì)算機(jī)指令一般都儲(chǔ)存于內(nèi)存內(nèi)可尋址的相連位置。中央處理單元(CentralProcessingUnit,CPU)或處理器由相連的內(nèi)存位置提取這些指令,并加以執(zhí)行。CPU從內(nèi)存每提取一個(gè)指令,其內(nèi)的程序計(jì)數(shù)器(programcounter,簡(jiǎn)稱PC)或指令指針(instructionpointer,簡(jiǎn)稱IP)就會(huì)遞增,使其內(nèi)含序列(sequence)中下個(gè)指令的地址,此即為下個(gè)循序指令指針(nextsequentialinstructionpointer,簡(jiǎn)稱NSIP)。指令的提取、程序計(jì)數(shù)器的遞增以及指令的執(zhí)行便通過內(nèi)存呈線性持續(xù)進(jìn)行,直到遇到程控指令(programcontrolinstruction)為止。4程控指令也稱為分支指令(branchinstruction),在執(zhí)行時(shí)會(huì)改變程序計(jì)數(shù)器內(nèi)的地址,并改變控制的流程。換言之,分支指令指定了改變程序計(jì)數(shù)器內(nèi)容的條件。因執(zhí)行一分支指令使程序計(jì)數(shù)器的值改變,會(huì)導(dǎo)致指令執(zhí)行順序的中斷。這是數(shù)字計(jì)算機(jī)的一項(xiàng)重要特征,因?yàn)樗峁?duì)程序執(zhí)行流程的控制,以及分支至程序的不同部分的能力。程控指令的例子包括跳轉(zhuǎn)(jump)、條件跳轉(zhuǎn)(conditionaljump)、調(diào)用(call)以及返回(return)。5跳轉(zhuǎn)指令使CPU無條件地將程序計(jì)數(shù)器的內(nèi)容改變至一特定值,這個(gè)值就是程序要繼續(xù)執(zhí)行的指令所在的目標(biāo)地址。條件跳轉(zhuǎn)指令使CPU去測(cè)試一狀態(tài)緩存器(statusregister)的內(nèi)容,或者可能比較兩個(gè)值,而后基于測(cè)試或比較的結(jié)果,不是繼續(xù)循序執(zhí)行就是跳轉(zhuǎn)至一新地址,稱為目標(biāo)地址。調(diào)用指令使CPU無條件地跳轉(zhuǎn)至一新目標(biāo)地址,而且儲(chǔ)存程序計(jì)數(shù)器的值以使CPU可返回至先前離開的程序位置。返回指令使CPU去擷取程序計(jì)數(shù)器于前次調(diào)用指令執(zhí)行時(shí)所存的值,并使程序流程返回至所擷取的指令地址。6對(duì)早期的微處理器而言,程控指令的執(zhí)行并不會(huì)造成處理上顯著的延遲,因?yàn)檫@些微處理器被設(shè)計(jì)為一次只執(zhí)行一個(gè)指令。如果所執(zhí)行的指令是程控指令,在執(zhí)行完畢之前,微處理器會(huì)知道它是否要分支,而如果是的話,它會(huì)知道分支的目標(biāo)地址為何。因此,不論下個(gè)指令是循序的,或是分支的結(jié)果,皆會(huì)被提取和執(zhí)行。7現(xiàn)代的微處理器則非如此單純。相反地,對(duì)現(xiàn)代的微處理器來說,在微處理器的不同區(qū)塊或流水線階段(pipelinestage)內(nèi)同時(shí)處理數(shù)個(gè)指令乃很平常的事。Hennessy與Patterson將流水線化(pipelining)定義為“一種多個(gè)指令得以重迭執(zhí)行的實(shí)作技術(shù)?!?引述自ComputerArchitectureAQuantitativeApproach,2ndedition,byJohnL.HennessyandDavidA.Patterson,MorganKaufmannPublishers,SanFrancisco,CA,1996)作者接著對(duì)流水線化做了下列精彩的說明“一個(gè)流水線就像是條裝配線。在汽車的裝配線上,有許多步驟,每個(gè)步驟對(duì)汽車的制造都有所貢獻(xiàn)。每個(gè)步驟與其它步驟同時(shí)并行,然而是在不同的汽車上進(jìn)行。在一計(jì)算機(jī)流水線中,每個(gè)步驟完成一個(gè)指令的部分,就像裝配線,不同的步驟并行地完成不同指令的不同部分。每個(gè)這些步驟稱為一管道階段(pipestage)或管道區(qū)段(pipesegment)。這些階段一個(gè)連接著下一個(gè),形成一個(gè)管道——指令從一端進(jìn)入,歷經(jīng)這些階段,然后從另一端出去,就像汽車在裝配線上一樣?!?因此,當(dāng)指令被提取時(shí),就被導(dǎo)入流水線的一端。指令于微處理器中歷史流水線階段,直到執(zhí)行完畢。在這種流水線化的微處理器中,一分支指令是否會(huì)改變程序流程,通常都得等它到達(dá)流水線之后期階段才能得知。然而在這之前,微處理器已經(jīng)提取了其它指令,且正于流水線的早期階段執(zhí)行。如果一分支指令改變了程序流程,所有在這分支指令之后進(jìn)入流水線的指令都必須被丟棄。此外,則必須提取此分支指令的目標(biāo)地址上的指令。丟棄已在執(zhí)行中的指令及提取目標(biāo)地址上的指令,會(huì)造成微處理器在處理上的延遲,稱為分支懲罰(branchpenalty)。10為減輕這種延遲問題,許多流水線化的微處理器在流水線的一早期階段使用分支預(yù)測(cè)機(jī)制來預(yù)測(cè)分支指令。分支預(yù)測(cè)機(jī)制預(yù)測(cè)分支指令的結(jié)果或方向,即是否要進(jìn)行分支。分支預(yù)洲機(jī)制也預(yù)測(cè)分支指令的分支目標(biāo)地址,即分支指令所要分支到的指令的地址。處理器接著就分支至所預(yù)測(cè)的分支目標(biāo)地址,即依據(jù)分支預(yù)測(cè)提取后續(xù)的指令,這會(huì)比沒有分支預(yù)測(cè)時(shí)來得早,因而若確定要進(jìn)行分支,因此便降低了懲罰的可能性。11這種用來快取先前所執(zhí)行分支指令的目標(biāo)地址的分支預(yù)測(cè)機(jī)制,稱為分支目標(biāo)地址高速緩存(branchtargetaddresscache,簡(jiǎn)稱BTAC)或者分支目標(biāo)緩沖器(branchtargetbuffer,簡(jiǎn)稱BTB)。在一簡(jiǎn)單的BTAC或BTB中,當(dāng)處理器對(duì)一分支指令進(jìn)行譯碼后,處理器便提供分支指令的地址給BTAC。若該地址命中BTAC且預(yù)測(cè)分支會(huì)進(jìn)行,處理器就可以利用BTAC中的快取目標(biāo)地址開始提取目標(biāo)地址的指令,而非下個(gè)循序(sequential)地址的指令。12相較于只預(yù)測(cè)是否采用分支的預(yù)測(cè)裝置,像是分支歷史表(branchhistorytable,簡(jiǎn)稱BHT),BTAC的好處是除了確定是否遇到一分支指令所需的時(shí)間外,它節(jié)省了計(jì)算目標(biāo)地址所需的時(shí)間。典型的做法是分支預(yù)測(cè)數(shù)據(jù)(例如被采用/不被采用(taken/nottaken))隨著目標(biāo)地址皆儲(chǔ)存于BTAC。BTAC運(yùn)用于流水線的指令譯碼階段,這是因?yàn)樘幚砥鞅仨毾扰袛喾种е噶钍欠翊嬖凇?3處理器使用BTB的一個(gè)例子是IntelPentiumII與PentiumIII處理器?,F(xiàn)請(qǐng)參閱圖1,其繪示PentiumII/III處理器100相關(guān)部分的方塊圖。處理器100包括一BTB134,用來快取分支目標(biāo)地址。處理器100從一指令高速緩存(instructioncache)102提取指令,該指令高速緩存102快取了指令108與前譯碼(pre-decoded)分支預(yù)測(cè)數(shù)據(jù)104。前譯碼分支預(yù)測(cè)數(shù)據(jù)104可能包括像是指令類型或指令長(zhǎng)度這樣的訊息。指令從指令高速緩存102提取,并送到指令譯碼邏輯(instructiondecodelogic)132,由其來譯碼或解譯指令。14一般是從下個(gè)循序提取地址112來提取指令。該下個(gè)循序提取地址112是由遞增裝置(incrementer)118將現(xiàn)行指令高速緩存102的提取地址122直接加上一指令高速緩存102的快取線的大小所得。然而,如果一分支指令已由指令譯碼邏輯132譯碼,接著控制邏輯(controllogic)114便選擇性地控制一多工器(multiplexer)116選取BTB134所提供的分支目標(biāo)地址,作為指令高速緩存102的提取地址122,而非選取下個(gè)循序提取地址112??刂七壿?14根據(jù)指令高速緩存102提供之前譯碼數(shù)據(jù)104以及BTB134預(yù)測(cè)該分支指令是否會(huì)被采用(依用來檢索BTB134的指令指針138而定),來選取指令高速緩存102的提取地址122。15PentiumII/III在檢索BTB134時(shí),并非通過分支指令本身的指令指針,而是利用先于被預(yù)測(cè)的分支指令的指令的指令指針138來進(jìn)行。這使得BTB134在分支指令被譯碼時(shí),就能查詢目標(biāo)地址136。否則,在分支指令譯碼后,處理器100必須再等待BTB134的查詢,才能進(jìn)行分支,這樣便多了此延遲的分支懲罰。一旦分支指令被指令譯碼邏輯132譯碼,且處理器100知道目標(biāo)地址136的產(chǎn)生是基于確定有分支指令的存在,處理器100才會(huì)分支到BTB134根據(jù)指令指針138索引所提供的目標(biāo)地址136。16另一個(gè)使用BTAC的例子是AMDAthlon處理器?,F(xiàn)請(qǐng)參閱圖2,其繪示Athlon處理器200相關(guān)部分的方塊圖。處理器200包括與圖1PentiumII/III編號(hào)類似的組件。Athlon處理器200將其BTAC整合進(jìn)指令高速緩存202中。也就是,指令高速緩存202除了指令數(shù)據(jù)108與前譯碼分支預(yù)測(cè)數(shù)據(jù)104之外,還快取了分支目標(biāo)地址206。對(duì)于每個(gè)指令字節(jié)對(duì)(instructionbytepair),指令高速緩存202保留了兩個(gè)位作為預(yù)測(cè)分支指令的方向之用。指令高速緩存202在一快取線中,相當(dāng)于每16個(gè)字節(jié)的指令即保留兩個(gè)分支目標(biāo)地址的空間。17從圖2可以看出,指令高速緩存202是由提取地址下個(gè)循序提取地址來作索引。因BTAC已整合進(jìn)指令高速緩存202,所以也是由提取地址122來作索引。因此,指令高速緩存202的一快取線若有一命中發(fā)生,就可確定快取分支目標(biāo)地址對(duì)應(yīng)至存在于被檢索的指令高速緩存202快取線中一分支指令。18雖然現(xiàn)有的方法改進(jìn)了分支預(yù)測(cè),但仍有缺點(diǎn)。前述兩種現(xiàn)有方法的一個(gè)缺點(diǎn)是,指令前譯碼數(shù)據(jù)以及Athlon例子中的分支目標(biāo)地址大幅增加了指令高速緩存的大小。據(jù)推測(cè),對(duì)Athlon而言,分支預(yù)測(cè)數(shù)據(jù)可能使指令高速緩存的大小加倍。此外,PentiumII/IIIBTB為每個(gè)分支指令儲(chǔ)存了相當(dāng)大量的分支歷史數(shù)據(jù),用以預(yù)測(cè)分支方向,因而也增加了BTB的大小。19Athlon的整合式BTAC的一個(gè)缺點(diǎn)是,將BTAC整合進(jìn)指令高速緩存會(huì)使空間的使用缺乏效率。也就是,整合式的指令高速緩存/BTAC對(duì)于分支指令以及非分支指令,皆須快取其分支指令數(shù)據(jù),因而占用過多儲(chǔ)存空間。在Athlon指令高速緩存中,許多由額外的分支預(yù)測(cè)數(shù)據(jù)所使用的空間是浪費(fèi)掉的,這是因?yàn)橹噶罡咚倬彺嬷蟹种е噶畹募卸认喈?dāng)?shù)汀@?,一特定的指令快取線中可能未包括任何分支,因此快取線中所有儲(chǔ)存目標(biāo)地址與其它分支預(yù)測(cè)數(shù)據(jù)的空間就沒用到而浪費(fèi)掉了。20Athlon整合式的BTAC的另一個(gè)缺點(diǎn)是,設(shè)計(jì)目標(biāo)間的沖突。也就是,關(guān)于指令高速緩存的大小,除了分支預(yù)測(cè)機(jī)制的設(shè)計(jì)目標(biāo)外,可能有其它不同的設(shè)計(jì)目標(biāo)會(huì)對(duì)此加以規(guī)定。以快取線而論,要求BTAC的大小要與指令高速緩存相同,是Athlon架構(gòu)所固有的,但可能無法理想地達(dá)到兩組設(shè)計(jì)目標(biāo)。例如,可能選定了指令高速緩存的大小,以達(dá)成一特定的快取命中率(cache-hitratio)。然而,情況可能是,用比較小的BTAC,就可能達(dá)成所要的分支目標(biāo)地址預(yù)測(cè)率(predictionrate)。21再者,因?yàn)锽TAC是整合在指令高速緩存中,獲得快取分支目標(biāo)地址所需的數(shù)據(jù)存取時(shí)間必然相同于獲得快取指令字節(jié)。Athlon的例子中,指令高速緩存相當(dāng)大,存取時(shí)間可能會(huì)相當(dāng)長(zhǎng)。較小的、非整合式BTAC的數(shù)據(jù)存取時(shí)間可能比整合式的指令高速緩存/BTAC要明顯減少。22由于PentiumII/IIIBTB并未整合在指令高速緩存中,PentiumII/III的方法不會(huì)遭遇前述Athlon整合式指令高速緩存/BTAC的問題。然而,由于在檢索PentiumII/IIIBTB時(shí),乃利用一已譯碼指令的指令指針,而非指令高速緩存的提取地址,所以PentiumII/III的解決方案于進(jìn)行分支時(shí)可能無法像Athlon解決方案那樣早,因此可能也無法那樣有效地減少分支懲罰。PentiumII/III解決方案處理這個(gè)問題的方式是,使用一先前指令或先前指令群的指令指針,而非物理的分支指令指針,來檢索BTB,如前所述。23然而,PentiumII/III方法的一個(gè)缺點(diǎn)是,使用先前指令的指令指針而非物理的分支指令指針,會(huì)犧牲掉一些分支預(yù)測(cè)的準(zhǔn)確度。準(zhǔn)確度的降低,一部份是由于分支指令在程序中可能經(jīng)由多個(gè)指令路徑遭遇到。也就是,多個(gè)先于分支指令的指令可能因相同的分支指令而快取于BTB中。因此,為了這樣一個(gè)分支指令,必須消耗掉BTB中多個(gè)項(xiàng)目(entry),于是就減少了BTB中可快取的分支指令總數(shù)。所用的先于分支指令的指令數(shù)量愈多,可到達(dá)分支指令的路徑也愈多。24除此之外,由于使用一先前的指令指針造成可能有多個(gè)路徑到達(dá)同一個(gè)分支指令,PentiumII/IIIBTB中的方向預(yù)測(cè)裝置可能需要更長(zhǎng)的時(shí)間來“暖機(jī)”(warmup)。PentiumII/IIIBTB保持著分支歷史數(shù)據(jù),用以預(yù)測(cè)分支的方向。當(dāng)一新的分支指令被引入處理器且快取住,到達(dá)該分支指令的多個(gè)路徑可能會(huì)使分支歷史在更新時(shí),變得比只有單一路徑到達(dá)該分支指令的情形還慢,造成預(yù)測(cè)較不準(zhǔn)確。25因此,我們所需要的是,一種能有效利用芯片固有資源(chiprealestate),又能在流水線早期就提供準(zhǔn)確分支的分支預(yù)測(cè)裝置,以減少分支懲罰。
發(fā)明內(nèi)容26本發(fā)明提供一種分支預(yù)測(cè)方法及裝置,能有效利用芯片固有資源,又能在流水線早期就提供準(zhǔn)確的分支,以減少分支懲罰。于是,為達(dá)到前述目的,本發(fā)明的一項(xiàng)特征是,在一處理器中提供一種分支預(yù)測(cè)裝置(branchpredictionapparatus),該處理器包括地址選擇邏輯(addressselectionlogic),以提供一提取地址至一指令高速緩存,該提取地址用來選取指令高速緩存的快取線。該分支預(yù)測(cè)裝置包括第一與第二分支預(yù)測(cè)裝置(branchpredictor),提供一分支指令的第一與第二目標(biāo)地址預(yù)測(cè)至地址選擇邏輯。該分支預(yù)測(cè)裝置也包括指令譯碼邏輯,以接收并譯碼分支指令,且產(chǎn)生分支指令的一類型。該分支預(yù)測(cè)裝置亦包括分支控制邏輯(branchcontrollogic),以控制地址選擇邏輯選取第一預(yù)測(cè)作為提取地址。第一預(yù)測(cè)選取指令高速緩存一第一快取線。分支控制邏輯接著依據(jù)分支指令的類型,選擇性地控制地址選擇邏輯選取第二預(yù)測(cè)作為提取地址。第二預(yù)測(cè)選取指令高速緩存的一第二快取線。27另一方面,本發(fā)明的一項(xiàng)特征是,在一處理器中提供一種分支預(yù)測(cè)裝置。該分支預(yù)測(cè)裝置包括第一與第二分支預(yù)測(cè)裝置,對(duì)一分支指令作第一與第二預(yù)測(cè)。該分支預(yù)測(cè)裝置也包括比較邏輯(comparisonlogic),對(duì)應(yīng)于第一與第二分支預(yù)測(cè)裝置,提供第一與第二預(yù)測(cè)的比較。該分支預(yù)測(cè)裝置亦包括指令譯碼邏輯,以譯碼分支指令,并產(chǎn)生分支指令的一類型。該分支預(yù)測(cè)裝置亦包括控制邏輯,對(duì)應(yīng)于指令譯碼邏輯,使處理器依第一預(yù)測(cè)進(jìn)行分支??刂七壿嫽诜种е噶畹念愋团c比較的結(jié)果,以第二預(yù)測(cè)選擇性地覆蓋(override)第一預(yù)測(cè)。28另一方面,本發(fā)明的一項(xiàng)特征是,提供一種流水線化處理器。該處理器包括一假想(speculative)分支預(yù)測(cè)裝置,用以對(duì)分支指令作假想預(yù)測(cè)。該處理器亦包括控制邏輯,對(duì)應(yīng)于該假想分支預(yù)測(cè)裝置,依據(jù)該假想預(yù)測(cè)使處理器進(jìn)行分支。該處理器也包括指令譯碼邏輯,以譯碼指令,并產(chǎn)生分支指令的一類型。該處理器也包括一非假想分支預(yù)測(cè)裝置,對(duì)應(yīng)于指令譯碼邏輯,用以對(duì)分支指令作一非假想預(yù)測(cè)??刂七壿嫿又罁?jù)該非假想預(yù)測(cè)與分支指令的類型,選擇性地使處理器進(jìn)行分支。29另一方面,本發(fā)明的一項(xiàng)特征是,提供一種流水線化處理器。該處理器包括一分支目標(biāo)地址高速緩存,用以在譯碼一指令前提供該指令的一假想目標(biāo)地址。該處理器亦包括一目標(biāo)地址計(jì)算器(targetaddresscalculator),用以在譯碼該指令后計(jì)算該指令的一非假想目標(biāo)地址。該處理器也包括一比較器,對(duì)應(yīng)于該分支目標(biāo)地址高速緩存及該目標(biāo)地址計(jì)算器,用于比較假想與非假想目標(biāo)地址。該處理器分支至該假想目標(biāo)地址。若假想與非假想目標(biāo)地址不相匹配,且該指令的類型屬于一第一指令類型集合,則該處理器接著分支至非假想目標(biāo)地址。30另一方面,本發(fā)明的一項(xiàng)特征是,提供一種流水線化處理器。該處理器包括一分支目標(biāo)地址高速緩存,用以提供一假想方向,指出一假設(shè)的條件分支指令是否將被采用。該假想方向是在譯碼該假設(shè)的條件分支指令前便已提供。該處理器亦包括一分支歷史表,以提供該指令的一非假想方向。該非假想方向是在譯碼該假設(shè)的條件分支指令后才提供。該處理器也包括一比較器,對(duì)應(yīng)于該分支目標(biāo)地址高速緩存及該分支歷史表,用以比較假想與非假想方向。若假想與非假想方向不相匹配,處理器便分支至該指令后一下個(gè)循序指令指針(NSIP),如果該非假想方向指出該指令將不被采用的話。31另一方面,本發(fā)明的一項(xiàng)特征是,提供在一流水線化處理器中用以分支的一種方法。此方法包括產(chǎn)生一分支指令的一假想目標(biāo)地址,將處理器分支至該假想目標(biāo)地址,以及在該分支后譯碼該分支指令。此方法亦包括在譯碼后產(chǎn)生該分支指令的一非假想目標(biāo)地址,以及確定該分支指令的一分支類型。此方法也包括確定假想與非假想目標(biāo)地址是否匹配,以及若假想與非假想目標(biāo)地址不相匹配,即依據(jù)該分支類型,選擇性地分支至非假想目標(biāo)地址。32本發(fā)明的一項(xiàng)優(yōu)點(diǎn)是,使早期的假想分支得以進(jìn)行,而不需先譯碼可能的分支指令,同時(shí)也通過使用依對(duì)該指令的分支指令類型的譯碼而產(chǎn)生的更正確的預(yù)測(cè)(基于譯碼的(decoded-based)預(yù)測(cè)一般更為正確),降低了錯(cuò)誤的早期假想分支預(yù)測(cè)的負(fù)面影響。33本發(fā)明的其它特征與優(yōu)點(diǎn),在考察本說明書其余部分與附圖后,將可更加明白。圖1為PentiumII/III處理器先前技術(shù)的相關(guān)部分方塊圖。圖2為Athlon處理器先前技術(shù)的相關(guān)部分方塊圖。圖3為依本發(fā)明的流水線化微處理器的方塊圖。圖4為依本發(fā)明圖3處理器的假想分支預(yù)測(cè)裝置。圖5是圖4的指令高速緩存的方塊圖。圖6為依本發(fā)明圖4分支目標(biāo)地址高速緩存(BTAC)的方塊圖。圖7為依本發(fā)明圖4BTAC的圖6項(xiàng)目的格式的方塊圖。圖8為依本發(fā)明的圖4假想分支預(yù)測(cè)裝置的運(yùn)作的流程圖。圖9為依本發(fā)明的圖4假想分支預(yù)測(cè)裝置使用圖8步驟的一運(yùn)作范例的方塊圖。圖10為依本發(fā)明的圖4假想分支預(yù)測(cè)裝置偵測(cè)與更正錯(cuò)誤的假想分支預(yù)測(cè)的運(yùn)作流程圖。圖11為依本發(fā)明列舉的程序代碼片段及一表格,為說明圖10假想分支預(yù)測(cè)錯(cuò)誤的偵測(cè)與更正的一范例。圖12為依本發(fā)明的圖4分支預(yù)測(cè)裝置包括一混合假想分支方向預(yù)測(cè)裝置(hybridspeculativebranchdirectionpredictor)的另一具體實(shí)施例的方塊圖。圖13為圖4的雙調(diào)用/返回堆棧(dualcall/returnstacks)的運(yùn)作流程圖。圖14為說明圖4的分支預(yù)測(cè)裝置選擇性地以非假想分支預(yù)測(cè)來覆蓋(override)假想分支預(yù)測(cè),用來改進(jìn)本發(fā)明的分支預(yù)測(cè)準(zhǔn)確度的運(yùn)作流程圖。圖15為依本發(fā)明的用以進(jìn)行圖4BTAC中目標(biāo)地址置換工作的裝置的方塊圖。圖16為依本發(fā)明圖15裝置的一運(yùn)作方法的流程圖。圖17為依本發(fā)明的另一具體實(shí)施例繪示圖15裝置的一運(yùn)作方式的流程圖。圖18為依本發(fā)明的另一具體實(shí)施例繪示的用以進(jìn)行圖4BTAC中目標(biāo)地址置換動(dòng)作的裝置方塊圖。圖19為依本發(fā)明的另一具體實(shí)施例繪示的用以進(jìn)行圖4BTAC中目標(biāo)地址置換動(dòng)作的裝置方塊圖。圖號(hào)說明100PentiumII/III處理器102指令高速緩存104前譯碼分支預(yù)測(cè)數(shù)據(jù)108指令數(shù)據(jù)112下個(gè)循序提取地址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ù)測(cè)裝置402假想分支目標(biāo)地址高速緩存(BTAC)404控制邏輯406假想調(diào)用/返回堆棧408預(yù)測(cè)檢查邏輯412非假想分支方向預(yù)測(cè)裝置414非假想調(diào)用/返回堆棧416非假想目標(biāo)地址計(jì)算器418比較器422多工器424儲(chǔ)存多工化/緩存器426遞增裝置428比較器432指令高速緩存434加法器436指令格式化與譯碼邏輯438假想分支(SB)位442更新信號(hào)444非假想分支方向預(yù)測(cè)446BEG位446AA項(xiàng)目的BEG位446BB項(xiàng)目的BEG位448LEN位452命中信號(hào)454假想分支數(shù)據(jù)(SBI)456ERR信號(hào)466下個(gè)循序指令指針(NSIP)468現(xiàn)行指令指針(CIP)472控制信號(hào)474比較器418的輸出476比較器428的輸出478控制信號(hào)481解析分支方向(DIR)482控制信號(hào)483控制信號(hào)484信號(hào)485比較器489的輸出486FULL信號(hào)487比較器497的輸出488返回地址489比較器491假想返回地址492指令譯碼數(shù)據(jù)493指令字節(jié)494指令字節(jié)快取線495提取地址496指令字節(jié)497比較器498儲(chǔ)存多工化/緩存器424的輸出499下個(gè)循序提取地址502轉(zhuǎn)換參照緩沖器(TLB)504標(biāo)志數(shù)組506數(shù)據(jù)數(shù)組508比較器512物理分頁(yè)號(hào)碼514物理標(biāo)志518命中信號(hào)602BTAC402的項(xiàng)目602A項(xiàng)目602的A邊602B項(xiàng)目602的B邊604比較器606路選擇多工器608A/B選擇多工器612數(shù)據(jù)數(shù)組614標(biāo)志數(shù)組616標(biāo)志618控制信號(hào)622A/B選擇信號(hào)624A項(xiàng)目626B項(xiàng)目702VALID位702AA項(xiàng)目的VALID位702BB項(xiàng)目的VALID位704CALL位706RET位708WRAP位712分支方向預(yù)測(cè)數(shù)據(jù)(BDPI)714分支目標(biāo)地址722T/NT字段722AA項(xiàng)目的T/NT字段722BB項(xiàng)目的T/NT字段724SELECT位802--834假想分支的運(yùn)作步驟1002--1054偵測(cè)與更正錯(cuò)誤的假想分支預(yù)測(cè)的步驟1100依本發(fā)明列舉的程序代碼實(shí)例片段及一表格1200混合假想分支方向預(yù)測(cè)裝置1202分支歷史表(BHT)1204異或邏輯1206全域分支歷史緩存器1208多工器1212分支方向結(jié)果1214信號(hào)1216異或邏輯1204的輸出1218更新信號(hào)1222T/NT_A/B位1224T/NT位1302--1326雙調(diào)用/返回堆棧的運(yùn)作步驟1402--1432BTAC402選擇性地以非假想分支預(yù)測(cè)來覆蓋假想分支預(yù)測(cè)的運(yùn)作步驟1502LastWritten緩存器1504A/BLRU位1506多工器1512更新IP1514信號(hào)1516讀/寫控制信號(hào)1602--1646A/B項(xiàng)目置換方法的步驟1716--1726另一實(shí)施例中A/B項(xiàng)目置換方法的衍生步驟1812額外的數(shù)組1902含LastWritten值與LastWrittenPrev值的緩存器1928信號(hào)具體實(shí)施方式53現(xiàn)請(qǐng)參閱圖3,其繪示本發(fā)明的一流水線化微處理器300的方塊圖。處理器流水線300包括階段302至階段332。54第一階段是I-階段302,或稱指令提取階段(instructionfetchstage)。在I-階段302,處理器300提供提取地址至一指令高速緩存432(見圖4),以提取指令供處理器300執(zhí)行。指令高速緩存432在關(guān)于圖4的部分時(shí)會(huì)更加詳細(xì)地說明。在一具體實(shí)施例中,此指令高速緩存432是一雙周期(two-cycle)高速緩存。B-階段304是指令高速緩存432的存取的第二階段。指令高速緩存432提供其數(shù)據(jù)至U-階段306,在此階段數(shù)據(jù)被閂鎖住(latched)。U-階段306提供指令高速緩存的數(shù)據(jù)至V-階段308。55在本發(fā)明中,處理器300還包括一BTAC402(見圖4),在其余圖標(biāo)的部分會(huì)詳細(xì)說明。BTAC402并未整合在指令高速緩存432。然而,在I-階段302,BTAC402是與指令高速緩存432通過使用指令高速緩存432的提取地址495來并行存取的(見圖4),從而致能相當(dāng)快速的分支以減少分支懲罰。BTAC402提供一假想分支目標(biāo)地址352,而該地址則被提供至I-階段302。處理器300選擇性地選取目標(biāo)地址352作為指令高速緩存432提取地址,以達(dá)成分支至假想目標(biāo)地址352,這在其余圖標(biāo)的部分會(huì)詳加說明。56從圖3可以方便地看出,在U-階段306,由BTAC402所提供的分支目標(biāo)地址352能使處理器300在流水線300的相當(dāng)早期就進(jìn)行分支,如此僅產(chǎn)生一雙周期的指令泡沫(instructionbubble)。即,若處理器300分支至假想目標(biāo)地址352,只有兩個(gè)階段的指令必須被清除。換言之,在兩個(gè)周期內(nèi),典型的情況下,于U-階段306就可得知分支的目標(biāo)指令,即,如果這些目標(biāo)指令存在于指令高速緩存432中。57在多數(shù)情況下,雙周期的指令泡沫夠小,可以由一指令緩沖器342、F-階段指令序列344及/或X-階段指令序列346來加以吸收,此將說明于后。因此,在許多情形下,假想BTAC402使處理器300能達(dá)到零懲罰的分支。58處理器300還包括一假想調(diào)用/返回堆棧(speculativecall/returnstack)406(見圖4),在關(guān)于圖4、圖8與圖13的部分有詳細(xì)說明。假想調(diào)用/返回堆棧406與假想BTAC402協(xié)同運(yùn)作,以產(chǎn)生一假想返回地址353,即,提供至I-階段302的返回指令的目標(biāo)地址。處理器300選擇性地選取假想返回地址353作為指令高速緩存432提取地址,以達(dá)成分支至假想返回地址353,就如關(guān)于圖8部分所詳細(xì)說明的。59在V-階段308,指令被寫入指令緩沖器342。指令緩沖器342暫存指令以提供至F-階段312。V-階段308亦包括譯碼邏輯,以提供關(guān)于指令字節(jié)的數(shù)據(jù)給指令緩沖器342,像是x86前置(prefix)與modR/M數(shù)據(jù),以及指令字節(jié)是否為分支運(yùn)算碼值(branchopcodevalue)。60F-階段312,或稱指令格式化階段(instructionformatstage)312,包括指令格式化與譯碼邏輯436(見圖4)以格式化指令。最好(preferably)處理器300是一x86處理器,其指令集(instructionset)可容許不同長(zhǎng)度的指令。指令格式化邏輯436從指令緩沖器342接收指令字節(jié)流(stream),并將該指令字節(jié)流解析成分離的字節(jié)群,每個(gè)群構(gòu)成一x86指令,尤其還提供每個(gè)指令的長(zhǎng)度。61F-階段312也包括分支指令目標(biāo)地址計(jì)算邏輯(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ì)說明的。62F-階段指令序列344接收格式化的指令。格式化指令由F-階段指令序列344送至X-階段314中一指令轉(zhuǎn)換器(instructiontranslator)。63X-階段314,或稱轉(zhuǎn)換階段314,指令轉(zhuǎn)換器將x86巨指令(macroinstruction)轉(zhuǎn)換成微指令(microinstruction),讓其余的流水線階段可加以執(zhí)行。X-階段314將轉(zhuǎn)換過的微指令送至X-階段指令序列346。64X-階段指令序列346將轉(zhuǎn)換過的微指令送至R-階段316,或稱緩存器階段316。R-階段316包括使用者可見(user-visible)的x86緩存器集合,以及非使用者可見的緩存器。微指令的指令操作數(shù)(operand)存于R-階段316緩存器,供流水線300之后續(xù)階段執(zhí)行微指令。65A-階段318,或稱地址階段(addressstage)318,包括地址產(chǎn)生邏輯(addressgenerationlogic),從R-階段316接收操作數(shù)與微指令,并產(chǎn)生微指令所需的地址,像是用以加載/儲(chǔ)存的內(nèi)存地址。66D-階段322,或稱數(shù)據(jù)階段(datastage)322,包括存取數(shù)據(jù)的邏輯,該數(shù)據(jù)由A-階段318產(chǎn)生的地址所指定。特別是,D-階段322包括一數(shù)據(jù)高速緩存,用來快取處理器300內(nèi)從系統(tǒng)內(nèi)存而來的數(shù)據(jù)。在一具體實(shí)施例中,數(shù)據(jù)高速緩存是雙周期高速緩存。G-階段324是數(shù)據(jù)高速緩存存取的第二階段,而在E-階段326,可取得數(shù)據(jù)高速緩存的數(shù)據(jù)。67E-階段326,或稱執(zhí)行階段(executionstage)326,包括執(zhí)行邏輯(executionlogic),像是算數(shù)邏輯單元(arithmeticlogicunit),依據(jù)先前階段提供的數(shù)據(jù)及操作數(shù)執(zhí)行微指令。特別是,E-階段326會(huì)產(chǎn)生BTAC402指出一返回指令可能存在于由提取地址495指定的指令高速緩存432快取線中所有分支指令的解析(resolved)目標(biāo)地址356。即,E-階段326目標(biāo)地址356被認(rèn)為是所有分支指令的正確目標(biāo)地址,所有預(yù)測(cè)的目標(biāo)地址必須與其匹配。此外,E-階段326產(chǎn)生一所有分支指令的解析方向(DIR)481(見圖4)。68S-階段328,或稱儲(chǔ)存階段(storestage)328,從E-階段326接收微指令的執(zhí)行結(jié)果,將其儲(chǔ)存至內(nèi)存。此外,還將E-階段326所計(jì)算的分支指令的目標(biāo)地址356在I-階段302時(shí)從S-階段328送至指令高速緩存432。再者,I-階段302的BTAC402通過從S-階段328而來的分支指令的解析目標(biāo)地址來予以更新。此外,在BTAC402的其它假想分支數(shù)據(jù)(speculativebranchinformation,簡(jiǎn)稱SBI)454(見圖4)亦從S-階段328來更新。假想分支數(shù)據(jù)454包括分支指令長(zhǎng)度,在一指令高速緩存432快取線內(nèi)的位置,分支指令是否涵蓋多條指令高速緩存432快取線,分支是否為—調(diào)用或返回指令,以及用來預(yù)測(cè)分支指令的方向的數(shù)據(jù),如關(guān)于圖7的部分所描述的。69W-階段332,或稱回寫階段(write-backstage),將S-階段328處理的結(jié)果回寫入R-階段316緩存器,用來更新處理器300的狀態(tài)。70指令緩沖器342、F-階段指令序列344以及X-階段指令序列346除了別的功能外,還能將分支對(duì)于處理器300每個(gè)指令值的脈沖所造成的沖擊減至最小。71現(xiàn)請(qǐng)參閱圖4,其繪示依本發(fā)明圖3處理器300的一假想分支預(yù)測(cè)裝置400。處理器300包括指令高速緩存432,以快取來自系統(tǒng)內(nèi)存的指令字節(jié)496。指令高速緩存432由提取地址總線上的提取地址495來尋址,對(duì)指令高速緩存432內(nèi)一快取線作檢索。最好(preferably)提取地址495包括一32位的虛擬地址。即,提取地址495并非指令的物理內(nèi)存地址(physicalmemoryaddress)。在一具體實(shí)施例中,虛擬提取地址495是一x86線性(linear)指令指針。在一具體實(shí)施例中,指令高速緩存432具有32個(gè)字節(jié)的寬度;因此,只用到提取地址495之前27個(gè)位來檢索指令高速緩存432。一選定的指令字節(jié)快取線494則由指令高速緩存432輸出。指令高速緩存432在接下來圖5部分會(huì)更詳細(xì)地說明。72現(xiàn)請(qǐng)參照?qǐng)D5,其繪示圖4指令高速緩存432的一具體實(shí)施例的方塊圖。指令高速緩存432包括用來將圖4的虛擬提取地址495轉(zhuǎn)換成物理地址的邏輯(圖上未顯示)。指令高速緩存432包括一轉(zhuǎn)換參照緩沖器(translationlookasidebuffer,簡(jiǎn)稱TLB)502,以快取先前轉(zhuǎn)換邏輯從虛擬提取地址495轉(zhuǎn)換的物理地址。在一具體實(shí)施例中,TLB502接收虛擬提取地址495的位[3112],當(dāng)虛擬提取地址495命中TLB502時(shí),則輸出一對(duì)應(yīng)的20位的物理分頁(yè)號(hào)碼(physicalpagenumber)512。73指令高速緩存432包括一快取指令字節(jié)的數(shù)據(jù)數(shù)組506。數(shù)據(jù)數(shù)組506配置成數(shù)條快取線,以虛擬提取地址495的一部份來作索引。在一具體實(shí)施例中,數(shù)據(jù)數(shù)組506儲(chǔ)存了64KB的指令字節(jié),其以32個(gè)字節(jié)的快取線來配置。在一具體實(shí)施例中,指令高速緩存432是一四路集合關(guān)聯(lián)高速緩存(4-waysetassociativecache)。因此,數(shù)據(jù)數(shù)組506包括512條指令字節(jié)線(lineofinstructionbytes),以提取地址495的位[135]來作索引。74虛擬提取地址495所選取的指令字節(jié)線494,由指令高速緩存432輸出至指令緩沖器342,如圖4所示。在一具體實(shí)施例中,一次將選定的指令字節(jié)線的一半送至指令緩沖器342,即,分成兩周期,每周期送16個(gè)字節(jié)。在本說明書中,快取線或指令位線可用以指稱由提取地址495于指令高速緩存432內(nèi)所選定的一快取線的部分,像是半快取線(half-cacheline)或其它再細(xì)分的部分。75指令高速緩存432亦包括一快取標(biāo)志的標(biāo)志數(shù)組(tagarray)504。標(biāo)志數(shù)組504,如同數(shù)據(jù)數(shù)組506,皆由虛擬提取地址495的相同位來作索引。物理地址的位取于標(biāo)志數(shù)組5504,作為物理標(biāo)志。由提取地址495位選定的物理標(biāo)志514則送至標(biāo)志數(shù)組504的輸出端。76指令高速緩存432亦包括一比較器(comparator)508,將物理標(biāo)志514與TLB502所提供的物理分頁(yè)號(hào)碼512作比較,以產(chǎn)生一命中信號(hào)(hitsignal)518,指明虛擬提取地址495是否命中指令高速緩存432。命中信號(hào)518真正指出了是否有快取現(xiàn)行的工作指令(taskinstruction),因?yàn)橹噶罡咚倬彺?32將虛擬提取地址495轉(zhuǎn)換為一物理地址,并用此物理地址來測(cè)定是否有命中。77前述指令高速緩存432的運(yùn)作與BTAC402的運(yùn)作成對(duì)比,后者僅依虛擬地址,即提取地址495,來測(cè)定是否命中,而非依據(jù)物理地址。此種運(yùn)作上不同所造成的結(jié)果是,虛擬別名化(virtualaliasing)可能會(huì)發(fā)生,以致于BTAC402產(chǎn)生錯(cuò)誤的目標(biāo)地址352,如下所述。78請(qǐng)?jiān)賲㈤唸D4,圖3的指令緩沖器342從指令高速緩存432接收快取線的指令字節(jié)494并予以緩沖,直至其被格式化與轉(zhuǎn)換為止。如前文關(guān)于圖3的V-階段308所述,指令緩沖器342也儲(chǔ)存了其它分支預(yù)測(cè)的相關(guān)數(shù)據(jù),像是x86前置與modR/M數(shù)據(jù),以及指令字節(jié)是否為分支運(yùn)算碼值。79此外,指令緩沖器342為其內(nèi)所存的每個(gè)指令字節(jié)儲(chǔ)存了一假想分支(speculativelybranched,簡(jiǎn)稱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。在一具體實(shí)施例中,則是針對(duì)SBI454所指出假定的分支指令的運(yùn)算碼字節(jié),設(shè)定其SB位438。80指令譯碼邏輯436從指令緩沖器342接收指令字節(jié)493(包括分支指令字節(jié))以將其譯碼,產(chǎn)生指令譯碼數(shù)據(jù)492。指令譯碼數(shù)據(jù)492用來進(jìn)行分支指令預(yù)測(cè),以及偵測(cè)與更正錯(cuò)誤的假想分支。指令譯碼邏輯436提供指令譯碼數(shù)據(jù)492至流水線300之后段。此外,指令譯碼邏輯436在譯碼現(xiàn)行指令時(shí),會(huì)產(chǎn)生下個(gè)循序指令指針(NSIP)466以及現(xiàn)行指令指針(currentinstructionpointer,CIP)468。此外,指令譯碼邏輯436提供指令譯碼數(shù)據(jù)492至非假想目標(biāo)地址計(jì)算器(non-speculativetargetaddresscalculator)416、非假想調(diào)用/返回堆棧(non-speculativecall/returnstack)414以及非假想分支方向預(yù)測(cè)裝置(non-speculativebranchdirectionpredictor)412。最好(preferably)非假想調(diào)用/返回堆棧414、非假想分支方向預(yù)測(cè)裝置412以及非假想目標(biāo)地址計(jì)算器416屬于流水線300的F-階段312。81非假想分支方向預(yù)測(cè)裝置412產(chǎn)生一分支指令方向的非假想預(yù)測(cè)444,即是否要進(jìn)行分支,以響應(yīng)從指令譯碼邏輯436接收的指令譯碼數(shù)據(jù)492。最好(preferably)非假想分支方向預(yù)測(cè)裝置412包括一個(gè)或更多分支歷史表,以儲(chǔ)存已執(zhí)行的分支指令的解析方向的歷程。最好(preferably)分支歷史表連同由指令譯碼邏輯436提供的分支指令本身的譯碼數(shù)據(jù),用于預(yù)測(cè)條件分支指令的方向。非假想分支方向預(yù)測(cè)裝置412的一個(gè)示范實(shí)施例詳述于美國(guó)專利申請(qǐng)序號(hào)09/434,984HYBRIDBRANCHPREDICTORWITHIMPROVEDSELECTORTABLEUPDATEMECHANISM,具有一共同申請(qǐng)人,通過參考此案可并入本發(fā)明。最好(preferably)最后解析出分支指令方向的邏輯屬于流水線300的E-階段326。82非假想調(diào)用/返回堆棧414產(chǎn)生圖3的非假想返回地址355,以響應(yīng)從指令譯碼邏輯436接收的指令譯碼數(shù)據(jù)492。除了別的以外,指令譯碼數(shù)據(jù)492還指明現(xiàn)行譯碼的指令是否為調(diào)用指令、返回指令或兩者皆否。83此外,如果正由指令譯碼邏輯436譯碼的指令為一調(diào)用指令,指令譯碼數(shù)據(jù)492還會(huì)包括一返回地址488。最好(preferably)返回地址488包括現(xiàn)行譯碼的調(diào)用指令的指令指針加上調(diào)用指令的長(zhǎng)度所得的值。當(dāng)指令譯碼數(shù)據(jù)492顯示現(xiàn)行譯碼的指令為一調(diào)用指令時(shí),返回地址488會(huì)被推入非假想調(diào)用/返回堆棧414,如此在指令譯碼邏輯436進(jìn)行后續(xù)返回指令的譯碼時(shí),返回地址488就能做為非假想返回地址355。84非假想調(diào)用/返回堆棧414的一個(gè)示范實(shí)施例詳述于美國(guó)專利申請(qǐng)序號(hào)09/271,591METHODANDAPPARATUSFORCORRECTINGANINTERNALCALL/RETURNSTACKINAMICROPROCESSORTHATSPECULATIVELYEXECUTESCALLANDRETURNINSTRUCTIONS,具有一共同申請(qǐng)人,通過參考此案可并入本發(fā)明。85非假想目標(biāo)地址計(jì)算器416產(chǎn)生圖3的非假想目標(biāo)地址354,以響應(yīng)從指令譯碼邏輯436接收的指令譯碼數(shù)據(jù)492。最好(preferably)非假想目標(biāo)地址計(jì)算器416包括一算數(shù)邏輯單元,以計(jì)算程序計(jì)數(shù)器相關(guān)(PC-relative,下文稱PC相關(guān))類型或直接類型(directtype)分支指令的分支目標(biāo)地址。最好(preferably)算數(shù)邏輯單元將分支指令的長(zhǎng)度與一指令指針加到內(nèi)含于分支指令的一帶正負(fù)號(hào)的位移量(signedoffset),來計(jì)算PC相關(guān)類型分支指令的目標(biāo)地址。最好(preferably)非假想目標(biāo)地址計(jì)算器416包括一相當(dāng)小的分支目標(biāo)緩沖器(BTB),以快取間接類型(indirecttype)分支指令的分支目標(biāo)地址。非假想目標(biāo)地址計(jì)算器416的一個(gè)示范實(shí)施例詳述于美國(guó)專利申請(qǐng)序號(hào)09/438,907APPARATUSFORPERFORMINGBRANCHTARGETADDRESSCALCULATIONBASEDONBRANCHTYPE,具有一共同申請(qǐng)人,通過參考此案可并入本發(fā)明。86分支預(yù)測(cè)裝置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í)施例中,它們包括不同數(shù)量的快取線。BTAC402與指令高速緩存432概念上的區(qū)別,也在于指令高速緩存432將提取地址495轉(zhuǎn)換成物理地址,以決定指令字節(jié)線的命中與否;BTAC402卻以虛擬提取地址495作為一虛擬地址來作索引,而沒有將其轉(zhuǎn)換為物理地址。87最好(preferably)BTAC402屬于流水線300的I-階段302。BTAC402快取了先前執(zhí)行分支指令的目標(biāo)地址。當(dāng)處理器300執(zhí)行一分支指令時(shí),該分支指令的解析目標(biāo)地址通過更新信號(hào)442快取于BTAC402。該分支指令的指令指針1512(見圖15)用來更新BTAC402,如下文關(guān)于圖15部分所描述的。88為了產(chǎn)生圖3的快取分支目標(biāo)地址352,BTAC402連同指令高速緩存432皆由指令高速緩存432的提取地址495并行檢索。BTAC402響應(yīng)提取地址495而提供假想分支目標(biāo)地址352。最好(preferably)提取地址495的32個(gè)位全都用來從BTAC402選取假想目標(biāo)地址352,如下文將更詳細(xì)敘述的,主要是關(guān)于圖6到圖9的部分。假想分支目標(biāo)地址352被送至包括一多工器422的地址選擇邏輯422。89多工器422從數(shù)個(gè)地址(包括BTAC402目標(biāo)地址352)中選取提取地址495,下文將會(huì)予以討論。多工器422輸出提取地址495至指令高速緩存432與BTAC402。若多工器422選取了BTAC402目標(biāo)地址352,接著處理器300便會(huì)分支到BTAC402目標(biāo)地址352。也就是,處理器300將開始從指令高速緩存432提取位于BTAC402目標(biāo)地址352的指令。90在一具體實(shí)施例中,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快取線中。之所以無法確定一分支指令是否存在于所選取的快取線中,至少有兩個(gè)理由。91無法確定一分支指令是否在提取地址495所檢索的指令高速緩存432快取線中,其第一個(gè)理由是提取地址495是一虛擬地址;因此,虛擬別名化可能會(huì)發(fā)生。也就是,兩個(gè)不同的物理地址可能對(duì)應(yīng)到相同的虛擬提取地址495。一給定的提取地址495,其為虛擬的,可能轉(zhuǎn)換成兩個(gè)不同的物理地址,這兩個(gè)地址關(guān)聯(lián)于一多工(multitasking)處理器(像是處理器300)的兩個(gè)不同行程或工作。指令高速緩存432利用圖5的轉(zhuǎn)換參照緩沖器502執(zhí)行虛擬到物理的轉(zhuǎn)換工作,以提供準(zhǔn)確的指令數(shù)據(jù)。然而,BTAC402依據(jù)虛擬提取地址495執(zhí)行其查詢工作,而沒有執(zhí)行虛擬到物理地址的轉(zhuǎn)換工作。通過BTAC402避免虛擬到物理地址的轉(zhuǎn)換工作是有利的,因?yàn)楸绕鹩袌?zhí)行虛擬到物理地址轉(zhuǎn)換工作的情形,它使假想分支能更快速地執(zhí)行。92執(zhí)行工作轉(zhuǎn)換的操作系統(tǒng),提供了虛擬別名化情形可能會(huì)發(fā)生的一個(gè)例子。在工作轉(zhuǎn)換之后,處理器300會(huì)從指令高速緩存432提取位于關(guān)聯(lián)新行程的虛擬提取地址495的指令,該關(guān)聯(lián)新行程的虛擬提取地址495等同于關(guān)聯(lián)舊行程的虛擬提取地址495,而舊行程則包括一分支指令,其目標(biāo)地址快取于BTAC402。指令高速緩存432會(huì)依據(jù)從虛擬提取地址495轉(zhuǎn)換的物理地址來產(chǎn)生新行程的指令,如上文關(guān)于圖5部分所描述的;然而,BTAC402會(huì)只用虛擬提取地址495以產(chǎn)生舊行程的目標(biāo)地址352,因而造成一錯(cuò)誤的分支。有利的是,錯(cuò)誤的假想分支只會(huì)在新行程的指令第一次執(zhí)行時(shí)發(fā)生,此因在發(fā)現(xiàn)錯(cuò)誤后,BTAC402目標(biāo)地址352將變?yōu)闊o效,如下文關(guān)于圖10部分說明的。93因此,分支到BTAC402目標(biāo)地址352是假想的,乃因在有些情況下,由于分支指令并不存在于指令高速緩存432的提取地址495(例如,因?yàn)樘摂M別名化的關(guān)系),處理器300將分支至BTAC402所產(chǎn)生的不正確的目標(biāo)地址352。相反地,從這方面來看前述圖2的Athlon整合式BTAC/指令高速緩存202以及圖1的PentiumII/III分支目標(biāo)緩沖器134,就是非假想性的。尤其,Athlon的方法因?yàn)樵诜种е噶钭止?jié)108旁并列儲(chǔ)存了圖2的目標(biāo)地址206而假設(shè)虛擬別名化并未發(fā)生,所以是非假想性的。也就是,AthlonBTAC202的查詢工作是基于物理地址來執(zhí)行的。PentiumII/III的方法,則因分支目標(biāo)緩沖器134只在從指令高速緩存102提取分支指令以及指令譯碼邏輯132確定有一分支指令存在后,才產(chǎn)生一分支目標(biāo)地址136。94此外,非假想目標(biāo)地址計(jì)算器416、非假想調(diào)用/返回堆棧414以及非假想分支方向預(yù)測(cè)裝置412也是非假想性的,此因它們只在從指令高速緩存432提取分支指令以及由指令譯碼邏輯436譯碼后,才產(chǎn)生分支預(yù)測(cè),如下文將要說明的。95應(yīng)該了解到,雖然非假想分支方向預(yù)測(cè)裝置412所產(chǎn)生的方向預(yù)測(cè)444是“非假想性的”,即是在一分支指令已由指令譯碼邏輯436譯碼并確定該分支指令存在于現(xiàn)行指令流的情況下產(chǎn)生,非假想方向預(yù)測(cè)444仍是一“預(yù)測(cè)”。也就是,如果分支指令是條件分支指令,像是x86JCC指令,則在分支指令的任何既定的執(zhí)行中,分支可能會(huì)進(jìn)行,也可能不會(huì)。96相類似地,非假想目標(biāo)地址計(jì)算器416所產(chǎn)生的目標(biāo)地址354以及非假想調(diào)用/返回堆棧414所產(chǎn)生的返回地址355也是非假想性的,因?yàn)檫@些地址是在確定有一分支指令存在于現(xiàn)行指令流的情況下而產(chǎn)生;盡管如此,它們?nèi)匀皇穷A(yù)測(cè)。例如,以通過內(nèi)存進(jìn)行的x86間接跳轉(zhuǎn)而言,自前次執(zhí)行間接跳轉(zhuǎn)以來,內(nèi)存內(nèi)容可能已有改變。如此,目標(biāo)地址可能隨的改變。因此,在本說明書中,就分支方向而言,“非假想的”不能與“無條件的”相混淆;就目標(biāo)地址而言,“非假想的”則不能與“確定的”(certain)相混淆。97無法確定一分支指令是否在提取地址495所檢索的指令高速緩存432快取線中,其第二個(gè)理由是自我修改碼(self-modifyingcode)的存在。自我修改碼可能會(huì)改變指令高速緩存432的內(nèi)容,但這改變并不會(huì)反映在BTAC402中。因此,一先前包括分支指令的指令高速緩存432快取線可能命中了BTAC402,但此分支指令已被修改或置換為不同的指令。98分支預(yù)測(cè)裝置400亦包括假想調(diào)用/返回堆棧406。假想調(diào)用/返回堆棧406儲(chǔ)存返回指令的假想目標(biāo)地址。假想調(diào)用/返回堆棧406因應(yīng)控制邏輯404產(chǎn)生的控制信號(hào)483,產(chǎn)生圖3的假想返回地址353。假想返回地址353被送至多工器422的一輸入。當(dāng)多工器422選取了假想調(diào)用/返回堆棧406所產(chǎn)生的假想返回地址353,處理器300便分支至假想返回地址353。99當(dāng)BTAC402指出一返回指令可能存在于由提取地址495指定的指令高速緩存432快取線中時(shí),控制邏輯404會(huì)產(chǎn)生控制信號(hào)483,以控制假想調(diào)用/返回堆棧406來提供假想返回地址353。最好(preferably)當(dāng)所選取的BTAC402項(xiàng)目602的VALID702與RET706位(見圖7)被設(shè)定,且BTAC402命中信號(hào)452顯示已命中BTAC402標(biāo)志數(shù)組614時(shí),則BTAC402指出一返回指令可能存在于由提取地址495指定的指令高速緩存432快取線中。100BTAC402響應(yīng)提取地址495而產(chǎn)生命中信號(hào)452以及假想分支數(shù)據(jù)(SBI)454。命中信號(hào)452顯示提取地址495命中了BTAC402的一快取標(biāo)志,此于下文關(guān)于圖6的部分說明。SBI454也會(huì)在下文關(guān)于圖6部分作更詳盡的說明。101SBI454包括一BEG446信號(hào)(指令高速緩存432一快取線內(nèi)的分支指令起始字節(jié)位移量(beginningbyteoffset))與一LEN448信號(hào)(分支指令長(zhǎng)度)。BEG446的值、LEN448的值與提取地址495由加法器434予以加總,而產(chǎn)生返回地址491。返回地址491由加法器434輸出至假想調(diào)用/返回堆棧406,如此返回地址491就能被推入假想調(diào)用/返回堆棧406。控制邏輯404通過信號(hào)483與BTAC402協(xié)同運(yùn)作,將返回地址491推入假想調(diào)用/返回堆棧406。只有在所選定的BTAC402項(xiàng)目602的VALID702與CALL704位(見圖7)被設(shè)定且命中信號(hào)452顯示已命中BTAC402的標(biāo)志數(shù)組614(見圖6)時(shí),返回地址491才會(huì)被推入堆棧。假想調(diào)用/返回堆棧406的運(yùn)作方式在后文關(guān)于圖8與圖13部分會(huì)更詳細(xì)地說明。102分支預(yù)測(cè)裝置400也包括控制邏輯404??刂七壿?04通過控制信號(hào)478控制多工器422,以選取數(shù)個(gè)地址輸入之一,作為提取地址495。控制邏輯404也通過信號(hào)482設(shè)定指令緩沖器342中的SB位438。103控制邏輯404接收命中信號(hào)452、SBI454、來自非假想分支方向預(yù)測(cè)裝置412的非假想分支方向預(yù)測(cè)444以及來自指令緩沖器342的FULL信號(hào)486。104分支預(yù)測(cè)裝置400亦包括預(yù)測(cè)檢查邏輯(predictionchecklogic)408。預(yù)測(cè)檢查邏輯408產(chǎn)生一ERR信號(hào)456,其被送至控制邏輯404,以指出已依據(jù)—BTAC402的命中而執(zhí)行一錯(cuò)誤的假想分支,如后文關(guān)于圖10部分所描述的。預(yù)測(cè)檢查邏輯408通過信號(hào)484從指令緩沖器342接收SB位438,信號(hào)484亦被送至控制邏輯404。預(yù)測(cè)檢查邏輯408也從BTAC402接收SBI454。預(yù)測(cè)檢查邏輯408也從指令譯碼邏輯436接收指令譯碼數(shù)據(jù)492。預(yù)測(cè)檢查邏輯408也接收?qǐng)D3E-階段326所產(chǎn)生的解析分支方向DIR481。105預(yù)測(cè)檢查邏輯408也接收比較器489的輸出185。比較器489將BTAC402產(chǎn)生的假想目標(biāo)地址352與圖3E-階段產(chǎn)生的解析目標(biāo)地址356作比較。BTAC402產(chǎn)生的假想目標(biāo)地址352被存于緩存器,并順著指令流水線300而下至比較器489。106預(yù)測(cè)檢查邏輯408也接收比較器497的輸出487。比較器497將假想調(diào)用/返回堆棧406產(chǎn)生的假想返回地址353與解析目標(biāo)地址356作比較。假想返回地址353被存于緩存器,并順著指令流水線300而下至比較器497。107BTAC402的假想目標(biāo)地址352被存于緩存器,并順著指令流水線300而下,由比較器428將其與非假想目標(biāo)地址計(jì)算器416的目標(biāo)地址354作比較。比較器428的輸出476被送至控制邏輯404。相類似地,假想調(diào)用/返回堆棧406產(chǎn)生的假想返回地址353也被存于緩存器,并順著指令流水線300而下,由比較器418將其與非假想返回地址355作比較。比較器418的輸出474亦被送至控制邏輯404。108分支預(yù)測(cè)裝置400亦包括一儲(chǔ)存多工化/緩存器(savemultiplexed/register,以下簡(jiǎn)稱savemux/reg)424。savemux/reg424由控制邏輯404所產(chǎn)生的控制信號(hào)472來控制。savemux/reg424的輸出498作為多工器422的一個(gè)輸入。savemux/reg424接收自己的輸出498以及BTAC402的假想目標(biāo)地址352作為輸入。109多工器422亦接收S-階段328的分支地址356作為其輸入。多工器422也接收提取地址495本身作為輸入。多工器422亦接收由遞增裝置426產(chǎn)生的下個(gè)循序提取地址499,遞增裝置426接收提取地址495,并遞增其值至指令高速緩存432的下條循序快取線。110現(xiàn)請(qǐng)參照?qǐng)D6,其為依本發(fā)明繪示的圖4BTAC402的方塊圖。在圖6所示的具體實(shí)施例中,BTAC402包括一四路集合關(guān)聯(lián)高速緩存。BTAC402包括一數(shù)據(jù)數(shù)組612與一標(biāo)志數(shù)組614。數(shù)據(jù)數(shù)組612包括一儲(chǔ)存組件的數(shù)組,以儲(chǔ)存快取分支目標(biāo)地址與假想分支數(shù)據(jù)的項(xiàng)目。標(biāo)志數(shù)組614包括一儲(chǔ)存組件的數(shù)組,以儲(chǔ)存地址標(biāo)志。111數(shù)據(jù)數(shù)組612與標(biāo)志數(shù)組614各自皆配置成四路,圖標(biāo)為路0、路1、路2以及路3。最好(preferably)數(shù)據(jù)數(shù)組612的每一路儲(chǔ)存兩個(gè)快取分支目標(biāo)地址與假想分支數(shù)據(jù)的項(xiàng)目,稱為A與B。由此,每次讀取數(shù)據(jù)數(shù)組612時(shí),就會(huì)產(chǎn)生八個(gè)項(xiàng)目602。此八個(gè)項(xiàng)目602被送至一八對(duì)二路選擇多工器(wayselectmux)606。112數(shù)據(jù)數(shù)組612與標(biāo)志數(shù)組614皆由圖4指令高速緩存432的提取地址495來作索引。提取地址495的較低有效位(significantbit)選定了數(shù)組612與614內(nèi)各一條快取線。在一具體實(shí)施例中,每個(gè)數(shù)組包括了128條快取線。因此,BTAC402能夠快取多達(dá)1024個(gè)目標(biāo)地址(128條快取線的每條具四個(gè)路,每路可儲(chǔ)存兩個(gè)目標(biāo)地址)。最好(preferably)數(shù)組612與614是通過提取地址495的位[115]來作索引。113標(biāo)志數(shù)組614為每路產(chǎn)生一標(biāo)志616。最好(preferably)每個(gè)標(biāo)志616包括虛擬地址的20個(gè)位,且四個(gè)標(biāo)志616的每一個(gè)皆由比較器604將其與提取地址495的位[3112]作比較。比較器604產(chǎn)生圖4的命中信號(hào)452,其依據(jù)是否有一標(biāo)志616與提取地址495的最高有效位相匹配,以指出是否有命中BTAC。命中信號(hào)452被送至圖4的控制邏輯404。114此外,比較器604產(chǎn)生控制信號(hào)618,以控制路選擇多工器606。路選擇多工器606因而在BTAC402產(chǎn)生的快取線中,選取四個(gè)路之一的A項(xiàng)目624與B項(xiàng)目626。將A項(xiàng)目624與B項(xiàng)目626送至A/B選擇多工器608以及控制邏輯404??刂七壿?04因應(yīng)命中信號(hào)452、A項(xiàng)目624與B項(xiàng)目626、提取地址495及其它控制信號(hào)而產(chǎn)生一控制信號(hào)622,來控制A/B選擇多工器608。A/B選擇多工器608便選取A項(xiàng)目624或B項(xiàng)目626兩者之一作為圖3BTAC402的目標(biāo)地址352及圖4的SBI454。115BTAC402最好(preferably)是一單端口(single-ported)高速緩存。單端口高速緩存的優(yōu)點(diǎn)是尺寸上比較小,因而比起雙端口(dual-ported)高速緩存,在同樣大小的空間中能夠快取更多的目標(biāo)地址。然而,雙端口高速緩存的考慮是使同時(shí)地讀寫B(tài)TAC402變得容易。雙端口BTAC402所具備的可同時(shí)讀寫的特征,由于更新寫入的動(dòng)作不需等待讀取動(dòng)作,使得BTAC402的更新能更快速地進(jìn)行。一般而言更快速的更新可得到更正確的預(yù)測(cè),此因BTAC402內(nèi)的數(shù)據(jù)是更為現(xiàn)時(shí)的(current)。116在一具體實(shí)施例中,指令高速緩存432內(nèi)每條快取線包括32個(gè)字節(jié)。然而,指令高速緩存432有時(shí)會(huì)提供指令字節(jié)的半快取線494。在一具體實(shí)施例中,BTAC402的每條快取線儲(chǔ)存了兩個(gè)項(xiàng)目602,因而包括了兩個(gè)目標(biāo)地址714,用于指令高速緩存432的每條半快取線。117現(xiàn)請(qǐng)參閱圖7,其為依本發(fā)明繪示圖4BTAC402的圖6項(xiàng)目602的格式方塊圖。項(xiàng)目602包括了圖4的SBI(假想分支數(shù)據(jù))454與一分支目標(biāo)地址(TA)714。SBI454包括一VALID位702、圖4的BEG446與LEN448、一CALL位704、一RET位706、一WPAP位708以及分支方向預(yù)測(cè)數(shù)據(jù)(BDPI)712。在圖3的流水線300執(zhí)行一分支后,該分支的解析目標(biāo)地址即被快取于TA字段(field)714,而譯碼與執(zhí)行分支指令所得的SBI454則被快取于BTAC402的項(xiàng)目602的SBI454字段中。118VALID位702指出了項(xiàng)目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ù)被快取于項(xiàng)目602時(shí),VALID位702就被設(shè)定。之后,如果BTAC402依據(jù)項(xiàng)目602作了錯(cuò)誤的預(yù)測(cè),VALID位702就被清除,如下文關(guān)于圖10部分所述。119BEG字段446指定了指令高速緩存432的一快取線內(nèi)分支指令的起始字節(jié)位移量。在偵測(cè)到有一調(diào)用指令命中BTAC402時(shí),BEG字段446被用來計(jì)算一返回地址,以儲(chǔ)存于圖4的假想調(diào)用/返回堆棧406。此外,BEG字段446被用來確定所選取BTAC402路的圖6項(xiàng)目A624或項(xiàng)目B626兩者中哪一個(gè)導(dǎo)致了BTAC402的命中,如下文關(guān)于圖8部分所述。最好(preferably)由項(xiàng)目A624與項(xiàng)目B626所指定的分支指令位置,在指令高速緩存432的快取線內(nèi)不需有任何特定的順序。也就是,在指令高速緩存432的快取線中,項(xiàng)目B626的分支指令可能還早于項(xiàng)目A624的分支指令。120LEN448字段指出分支指令字節(jié)的長(zhǎng)度。在偵測(cè)到一調(diào)用指令命中BTAC402時(shí),LEN448字段被用來計(jì)算一返回地址,以儲(chǔ)存于圖4的假想調(diào)用/返回堆棧406。121CALL位704指出所快取的目標(biāo)地址714是否關(guān)聯(lián)到一調(diào)用指令。也就是,如果一調(diào)用指令由處理器300執(zhí)行,且該調(diào)用指令的目標(biāo)地址快取于項(xiàng)目602,則CALL位704將被設(shè)定。122RET位706指出所快取的目標(biāo)地址714是否關(guān)聯(lián)到一返回指令。也就是,如果一返回指令由處理器300執(zhí)行,且該返回指令的目標(biāo)地址快取于項(xiàng)目602,則RET位706將被設(shè)定。123WRAP位708在分支指令字節(jié)橫跨兩條指令高速緩存432的快取線時(shí),會(huì)被設(shè)定。在一具體實(shí)施例中,WRAP位708在分支指令字節(jié)橫跨兩條指令高速緩存432的半快取線時(shí),會(huì)被設(shè)定。124BDPI(分支方向預(yù)測(cè)數(shù)據(jù))字段712包括一T/NT(taken/nottaken,即采用/不采用)字段722與一SELECT位724。T/NT字段722包括分支的方向預(yù)測(cè),即,它指明了分支是預(yù)測(cè)會(huì)采用或不會(huì)采用。最好(preferably)T/NT字段722包括一兩位的上/下數(shù)飽和計(jì)數(shù)器(up/downsaturatingcounter),用以指定四種狀態(tài)極可能采用(stronglytaken)、有可能采用(weaklytaken)、有可能不采用(weaklynottaken)與極可能不采用(strongnottaken)。在另一實(shí)施例中,T/NT字段722包括單一T/NT位。125SELECT位724用來在下列兩者中作一選擇BTAC402T/NT方向預(yù)測(cè)722與由BTAC402之外的分支歷史表(BHT)(見圖12)所做的方向預(yù)測(cè),如關(guān)于圖12部分所述。在一具體實(shí)施例中,如果在分支執(zhí)行后,所選定的預(yù)測(cè)裝置(即,BTAC402或BHT1202)準(zhǔn)確地預(yù)測(cè)了方向,SELECT位724就不會(huì)更新。然而,如果所選定的預(yù)測(cè)裝置沒有準(zhǔn)確地預(yù)測(cè)方向而另一個(gè)預(yù)測(cè)裝置正確地預(yù)測(cè)方向,SELECT位724就會(huì)更新,以指明是非選定的預(yù)測(cè)裝置,而不是所選定的預(yù)測(cè)裝置。126在一具體實(shí)施例中,SELECT位724包括一兩位的上/下數(shù)飽和計(jì)數(shù)器,用以指定四種狀態(tài)極可能是BTAC(stronglyBTAC)、有可能是BTAC(weaklyBTAC)、有可能是BHT(weaklyBHT)與極可能是BHT(strongBHT)。在此實(shí)施例中,如果在分支執(zhí)行后,所選定的預(yù)測(cè)裝置(即,BTAC402或BHT1202)準(zhǔn)確地預(yù)測(cè)了方向,飽和計(jì)數(shù)器即朝所選定的預(yù)測(cè)裝置來計(jì)數(shù)。如果所選定的預(yù)測(cè)裝置沒有準(zhǔn)確地預(yù)測(cè)方向而另一個(gè)預(yù)測(cè)裝置正確地預(yù)測(cè)方向,飽和計(jì)數(shù)器即朝非選定的預(yù)測(cè)裝置來計(jì)數(shù)。127現(xiàn)請(qǐng)參照?qǐng)D8,其為依本發(fā)明繪示的圖4假想分支預(yù)測(cè)裝置400的運(yùn)作流程圖。圖4的BTAC402由圖4的提取地址495作索引。因此,圖6的BTAC402比較器604響應(yīng)圖6的BTAC402標(biāo)志數(shù)組614的虛擬標(biāo)志616,以產(chǎn)生圖4的命中信號(hào)452。在步驟802中,圖4的控制邏輯404檢查命中信號(hào)452,以確定提取地址495是否命中BTAC402。128如果BTAC402的命中并未發(fā)生,則在步驟822中控制邏輯404便不進(jìn)行假想分支。也就是,控制邏輯404通過圖4的控制信號(hào)478控制多工器422,以選取除了BTAC402的目標(biāo)地址352與假想調(diào)用/返回堆棧406的返回地址353外的一個(gè)輸入。129然而,如果BTAC402的命中確實(shí)發(fā)生,在步驟804中,控制邏輯404便會(huì)確定圖6的A項(xiàng)目624是否有效,被看見(seen)與被采用(taken)。130若圖7VALID位702被設(shè)定,控制邏輯404便確定項(xiàng)目624為“有效的”。如果VALID位702被設(shè)定,由提取地址495所選取的指令高速緩存432快取線就被假定為包括一分支指令,而該分支指令的分支預(yù)測(cè)數(shù)據(jù)則已先快取于A項(xiàng)目624;然而,如上文所討論的,并不確定所選取的指令高速緩存432快取線包括有分支指令。131若項(xiàng)目A624的T/NT字段722指出,所假定的分支指令方向預(yù)期會(huì)被采用,則控制邏輯404便確定項(xiàng)目624“被采用”(taken)。在下述圖12的具體實(shí)施例中,若所選取的方向指示裝置(directionindicator)指出,所假定的分支指令方向預(yù)期會(huì)被采用,則控制邏輯404便確定項(xiàng)目624“被采用”。132若圖7的BEG字段446大于或等于提取地址495相對(duì)應(yīng)的最低有效位(leastsignificantbits),則控制邏輯404便確定項(xiàng)目624“被看見”(seen)。也就是,BEG字段446與提取地址495相對(duì)應(yīng)的最低有效位作比較,以決定下個(gè)指令提取的位置是否位在指令高速緩存432中對(duì)應(yīng)于A項(xiàng)目624的分支指令位置之前。例如,假設(shè)A項(xiàng)目624的BEG字段446包括一數(shù)值3,而提取地址495的較低位值為8。在這種情況下,可能就不會(huì)因此提取地址495分支至A項(xiàng)目624的分支指令。因此,控制邏輯404將不會(huì)假想分支至A項(xiàng)目624的目標(biāo)地址714。這在提取地址495是分支指令的目標(biāo)地址時(shí)特別有關(guān)系。133若A項(xiàng)目624是有效的、預(yù)期會(huì)被采用且被看見,在步驟806中,控制邏輯404會(huì)檢查圖6的B項(xiàng)目626是否為有效、被看見與采用??刂七壿?04是以類似于步驟804對(duì)A項(xiàng)目624所用的方式,來決定B項(xiàng)目626是否為有效、被看見與采用。134若A項(xiàng)目624是有效的、預(yù)期會(huì)被采用且被看見,但B項(xiàng)目626不是有效的、預(yù)期不被采用或者不被看見,則在步驟812中,控制邏輯404檢查圖7的RET字段706,以決定A項(xiàng)目624是否已快取返回指令的數(shù)據(jù)。若RET位706未被設(shè)定,則在步驟814中,控制邏輯404控制圖6的A/B多工器608以選取項(xiàng)目A624,并通過控制信號(hào)478控制多工器422,以假想分支至目標(biāo)地址信號(hào)352所提供的BTAC402項(xiàng)目A624的目標(biāo)地址714。相反地,若RET位706指出,在提取地址495所選取的指令高速緩存432快取線中,可能存在一返回指令,則在步驟818中,控制邏輯404通過控制信號(hào)478控制多工器422,以假想分支至圖4假想調(diào)用/返回堆棧406的返回地址353。135在步驟814或步驟818進(jìn)行假想分支后,于步驟816中,控制邏輯404產(chǎn)生一指示于控制信號(hào)482中,表示已響應(yīng)BTAC402而執(zhí)行一假想分支。也就是,不論處理器300假想分支至假想調(diào)用/返回堆棧406的返回地址353,或是BTAC402項(xiàng)目A624的目標(biāo)地址352,控制邏輯404皆會(huì)于控制信號(hào)482中,顯示已執(zhí)行一假想分支。當(dāng)一指令字節(jié)從指令高速緩存432進(jìn)行至圖3的指令緩沖器342時(shí),控制信號(hào)482會(huì)用來設(shè)定SB位438。在一具體實(shí)施例中,控制邏輯404利用項(xiàng)目602的BEG446字段,來設(shè)定指令緩沖器342內(nèi)關(guān)聯(lián)于分支指令的運(yùn)算碼字節(jié)的SB位438。此分支指令的SBI454在提取地址495命中BTAC402時(shí),是假定已快取于BTAC402中。136若A項(xiàng)目624是無效的,或預(yù)期不被采用,或不被看見,如步驟804中所確定的,則控制邏輯404在步驟824中便會(huì)確定B項(xiàng)目626是否為有效、被看見與被采用??刂七壿?04是以類似于步驟804對(duì)A項(xiàng)目624所用的方式,來決定B項(xiàng)目626是否為有效、被看見與采用。137若B項(xiàng)目626是有效的、預(yù)期會(huì)被采用且被看見,則在步驟832中,控制邏輯404檢查RET字段706,以決定B項(xiàng)目626是否已快取返回指令的數(shù)據(jù)。若RET位706未被設(shè)定,則在步驟834中,控制邏輯404控制圖6的A/B多工器608以選取項(xiàng)目B626,并通過控制信號(hào)478控制多工器422,以假想分支至目標(biāo)地址信號(hào)352所提供的BTAC402項(xiàng)目B626的目標(biāo)地址714。相反地,若RET位706指出,在提取地址495所選取的指令高速緩存432快取線中,可能存在一返回指令,則在步驟818中,控制邏輯404通過控制信號(hào)478控制多工器422,以假想分支至假想調(diào)用/返回堆棧406的返回地址353。138在步驟834或步驟818進(jìn)行假想分支后,于步驟816中,控制邏輯404產(chǎn)生一指示于控制信號(hào)482中,表示已響應(yīng)BTAC402而執(zhí)行一假想分支。139若A項(xiàng)目624與B項(xiàng)目626皆是無效的,預(yù)期不被采用,或不被看見,則在步驟822中,控制邏輯404便不會(huì)進(jìn)行假想分支。140若A項(xiàng)目624與B項(xiàng)目626兩者皆為有效的,預(yù)期被采用,且被看見,則在步驟808中,控制邏輯404便會(huì)去確定,在假定的分支指令(其數(shù)據(jù)快取于A項(xiàng)目624與B項(xiàng)目626)中,哪一個(gè)是指令高速緩存432的快取線指令字節(jié)494內(nèi),最先被看見的有效且被采用的分支指令。也就是,如果兩個(gè)假定的分支指令都被看見、有效且被采用,控制邏輯404便通過比較A項(xiàng)目624與B項(xiàng)目626的BEG446字段,來決定哪一個(gè)假定的分支指令具有較小的內(nèi)存地址。若B項(xiàng)目626的BEG446的值比A項(xiàng)目624的BEG446的值還小,則控制邏輯404便進(jìn)行至步驟832,依據(jù)B項(xiàng)目626進(jìn)行假想分支。否則,控制邏輯404便進(jìn)行至步驟812,依據(jù)A項(xiàng)目624進(jìn)行假想分支。141在一具體實(shí)施例中,假想調(diào)用/返回堆棧406并不存在。所以,步驟812、818與832皆未執(zhí)行。142從圖8可以看出,本發(fā)明有利地提供一裝置,用以將多個(gè)分支指令的目標(biāo)地址與假想分支數(shù)據(jù)快取于一分支目標(biāo)地址高速緩存中一特定的指令快取線,而該分支目標(biāo)地址高速緩存并未整合在指令高速緩存內(nèi)。特別是,分支指令的位置數(shù)據(jù)快取于快取線內(nèi)的BEG字段446,有利地使控制邏輯404無需前譯碼快取線,就能夠從快取線內(nèi)可能的多個(gè)分支指令中,決定要假想分支至哪一個(gè)。也就是,BTAC402在慮及可能有兩個(gè)或更多分支指令存在于所選取快取線的情況下,決定目標(biāo)地址,而不用知道有多少分支指令(假若有的話)存在于快取線中。143現(xiàn)請(qǐng)參閱圖9,其為依本發(fā)明繪示的圖4假想分支預(yù)測(cè)裝置400使用圖8步驟選取圖4目標(biāo)地址352的一運(yùn)作范例的方塊圖。此范例顯示一值為0x10000009的提取地址495進(jìn)行指令高速緩存432與BTAC402的檢索,且該提取地址495也被送至圖4的控制邏輯404。為了簡(jiǎn)明起見,關(guān)于指令高速緩存432與BTAC402的多路關(guān)聯(lián)性(multi-wayassociativity)的數(shù)據(jù),像是圖6的多個(gè)路與路多工器606,并未顯示出來。指令高速緩存432的一快取線494由提取地址495選取??烊【€494包括快取于地址0x10000002的一x86條件跳轉(zhuǎn)指令(JCC)與快取于地址0x1000000C的一x86CALL指令。144此范例也顯示了提取地址495所選取的BTAC102快取線內(nèi)A項(xiàng)目602A與B項(xiàng)目602B的一些組成部份。項(xiàng)目A602A包括CALL指令的快取數(shù)據(jù),而項(xiàng)目B602B包括JCC指令的快取數(shù)據(jù)。項(xiàng)目A602A顯示其VALID位702A被設(shè)為1,表示其為一有效的項(xiàng)目A602A,即,圖7相關(guān)聯(lián)的目標(biāo)地址714與SBI454是有效的。項(xiàng)目A602A也顯示出一值為0x0C的BEG字段446A,對(duì)應(yīng)于該CALL指令的指令指針地址的最低有效位。項(xiàng)目A602A也顯示了一值為“被采用”的T/NT字段722A,表示該CALL指令預(yù)期會(huì)被采用。響應(yīng)提取地址495,A項(xiàng)目602A通過圖6的信號(hào)624送至控制邏輯404。145項(xiàng)目B602B顯示其VALID位702B被設(shè)為1,表示其為一有效的項(xiàng)目B602B。項(xiàng)目B602B也顯示出一值為0x02的BEG字段446B,對(duì)應(yīng)于該JCC指令的指令指針地址的最低有效位。項(xiàng)目B602B也顯示了一值為“被采用”的T/NT字段722B,表示該JCC指令預(yù)期會(huì)被采用。響應(yīng)提取地址495,B項(xiàng)目602B通過圖6的信號(hào)626送至控制邏輯404。146此外,BTAC402將命中信號(hào)452設(shè)定為真,以顯示提取地址495命中了BTAC402??刂七壿?04接收項(xiàng)目A602A與項(xiàng)目B602B,并依照?qǐng)D8所述的方法,根據(jù)命中信號(hào)452、提取地址495的值以及602A與602B兩個(gè)項(xiàng)目,產(chǎn)生圖6的A/B選擇信號(hào)622。147在步驟802中,控制邏輯404依據(jù)命中信號(hào)452被設(shè)定為真,而確定BTAC402有一命中發(fā)生。接著于步驟804中,控制邏輯404依據(jù)VALID位702A被設(shè)定,而確定項(xiàng)目A602A是有效的。而因T/NT字段722A顯示為被采用,控制邏輯404也于步驟804確定項(xiàng)目A602A是被采用的。由于BEG字段446A的值0x0C大于或等于提取地址495的值0x09對(duì)應(yīng)的較低位,控制邏輯404亦于步驟804確定項(xiàng)目A602A被看見。既然項(xiàng)目A602A是有效的、被采用與被看見,控制邏輯404便進(jìn)行至步驟806。148于步驟806中,控制邏輯404依據(jù)VALID位702B被設(shè)定,而確定項(xiàng)目B602B是有效的。而因T/NT字段722B顯示為被采用,控制邏輯404也于步驟806確定項(xiàng)目B602B是被采用的。由于BEG字段446B的值0x02小于提取地址495的值0x09對(duì)應(yīng)的較低位,控制邏輯404亦于步驟806確定項(xiàng)目B602B未被看見。既然項(xiàng)目B602B未被看見,控制邏輯404便進(jìn)行至步驟812。149在步驟812中,控制邏輯404通過圖7被清除的RET位706而確定關(guān)聯(lián)于項(xiàng)目A602A所快取的指令不是返回指令,并進(jìn)行至步驟814。在步驟814中,控制邏輯404產(chǎn)生一A/B選擇信號(hào)622的值,以驅(qū)使圖6的A/B多工器608選取信號(hào)624上的項(xiàng)目A602A。這個(gè)選擇的動(dòng)作導(dǎo)致項(xiàng)目A602A的圖7目標(biāo)地址714被選為圖3的目標(biāo)地址352,送至圖4的提取地址495選擇多工器422。150因此,從圖9的范例可以看出,圖4的分支預(yù)測(cè)裝置400有利地運(yùn)作,以選取最先、有效、被看見、被采用的所選定BTAC402快取線的項(xiàng)目602,將處理器300假想分支至其中關(guān)聯(lián)的目標(biāo)地址714。有利的是,即使有多個(gè)分支指令存在于對(duì)應(yīng)的選定的指令高速緩存432快取線494,裝置400仍能在不知快取線494內(nèi)容的情況下,完成假想分支的動(dòng)作。151現(xiàn)請(qǐng)參閱圖10,其為依本發(fā)明繪示的圖4假想分支預(yù)測(cè)裝置400偵測(cè)與更正錯(cuò)誤的假想分支預(yù)測(cè)的運(yùn)作流程圖。從指令緩沖器342接收一指令后,在步驟1002中,圖4的指令譯碼邏輯436便譯碼該指令。尤其,指令譯碼邏輯436將指令字節(jié)流(streamofinstructionbytes)格式化成一不同的x86巨指令,并確定該指令的長(zhǎng)度以及是否為分支指令。152接著,在步驟1004中,圖4的預(yù)測(cè)檢查邏輯408測(cè)定所譯碼指令中,是否有任何指令字節(jié)的SB位438被設(shè)定。也就是,預(yù)測(cè)檢查邏輯408測(cè)定是否先前已基于現(xiàn)行譯碼的指令命中BTAC402,而執(zhí)行一假想分支。若沒有執(zhí)行任何假想分支,則不會(huì)采取行動(dòng)去更正。153若有執(zhí)行一假想分支,則在步驟1012中,預(yù)測(cè)檢查邏輯408會(huì)檢查現(xiàn)行譯碼的指令,以確定該指令是否為非分支指令。最好(preferably)預(yù)測(cè)檢查邏輯408會(huì)測(cè)定該指令是否為x86指令集的非分支指令。154如果該指令不是分支指令,則在步驟1022中,預(yù)測(cè)檢查邏輯408將圖4的ERR信號(hào)456設(shè)定為真,以表示偵測(cè)到一錯(cuò)誤的假想分支。此外,通過圖4的更新信號(hào)442,BTAC402得以更新,而清除圖6對(duì)應(yīng)的BTAC402項(xiàng)目602的圖7VALID位702。再者,圖3的指令緩沖器342會(huì)清除掉因此一錯(cuò)誤的假想分支而從指令高速緩存432誤取的指令。155如果該指令不是分支指令,則在步驟1024中,控制邏輯404接著控制圖4的多工器422,以分支至指令譯碼邏輯436所產(chǎn)生的CIP468,更正該錯(cuò)誤的假想分支。步驟1024中所進(jìn)行的分支,將使得包括該指令的指令高速緩存432快取線重新被提取與作假想預(yù)測(cè)。然而,這次該指令的VALID位702將被清除;因此,該指令將不執(zhí)行任何假想分支,用來更正先前錯(cuò)誤的假想分支。156若在步驟1012中已確定該指令為一有效的分支指令,則在步驟1014中,預(yù)測(cè)檢查邏輯408會(huì)確定在所譯碼指令的指令字節(jié)內(nèi),位于非運(yùn)算碼(non-opcode)字節(jié)位置的指令,有否任何字節(jié)的SB位438被設(shè)定。也就是,雖然一字節(jié)可能包括一處理器300指令集的有效運(yùn)算碼值,該有效運(yùn)算碼值卻可能位于一個(gè)就指令格式而言是無效的字節(jié)位置。對(duì)一x86指令而言,除了前置字節(jié)外,運(yùn)算碼字節(jié)應(yīng)該是指令的第一個(gè)字節(jié)。例如,對(duì)于在指令的立即數(shù)據(jù)(immediatedata)或位移字段(displacementfield)中,或者因虛擬別名化而在一x86指令modR/M或SIB(ScaleIndexBase,比例-索引-基底)字節(jié)中所含的分支運(yùn)算碼值,SB位438可能因之而錯(cuò)誤地被設(shè)定。若分支運(yùn)算碼字節(jié)位于非運(yùn)算碼字節(jié)位置,則執(zhí)行步驟1022與1024以更正錯(cuò)誤的假想預(yù)測(cè)。157若在步驟1012中,預(yù)測(cè)檢查邏輯408確定該指令為一有效的分支指令,且在步驟1014中,確定沒有非運(yùn)算碼字節(jié)的SB位438被設(shè)定,則在步驟1016中,預(yù)測(cè)檢查邏輯408會(huì)確定是否有假想與非假想指令長(zhǎng)度上的不匹配。也就是,預(yù)測(cè)檢查邏輯408將步驟1002中指令譯碼邏輯436產(chǎn)生的非假想指令的長(zhǎng)度與BTAC402產(chǎn)生的圖7假想LEN448字段作一比較。若指令長(zhǎng)度不匹配,則執(zhí)行步驟1022與1024以更正錯(cuò)誤的假想預(yù)測(cè)。158若在步驟1012中,預(yù)測(cè)檢查邏輯408確定該指令為一有效的分支指令,且在步驟1014中,確定只有運(yùn)算碼字節(jié)的SB位438被設(shè)定,以及在步驟1016確定指令長(zhǎng)度匹配,則該指令便順著流水線300而下,直至抵達(dá)圖3的E-階段326。在步驟1032中,E-階段326解析出圖3的正確的分支指令目標(biāo)地址356,并確定圖4的正確的分支方向DIR481。159接著,在步驟1034中,預(yù)測(cè)檢查邏輯408確定BTAC402是否錯(cuò)誤預(yù)測(cè)了分支指令的方向。也就是,預(yù)測(cè)檢查邏輯408將E-階段326所解析的正確方向DIR481與BTAC402產(chǎn)生的圖7預(yù)測(cè)722作比較,以確定是否已執(zhí)行一錯(cuò)誤的假想分支。160若BTAC402預(yù)測(cè)了一錯(cuò)誤的方向,則在步驟1042中,預(yù)測(cè)檢查邏輯408將ERR信號(hào)456設(shè)定為真,以告知控制邏輯404此錯(cuò)誤。因此,控制邏輯404便通過圖4的更新信號(hào)442,來更新圖6對(duì)應(yīng)的BTAC402項(xiàng)目602的BTAC402方向預(yù)測(cè)722。最后,在步驟1042中,控制邏輯404會(huì)清除掉流水線300中因該錯(cuò)誤的假想分支而從指令高速緩存432誤取的指令。接著,在步驟1044中,控制邏輯404驅(qū)使多工器422選取圖4的NSIP466,使處理器300分支至分支指令的下個(gè)指令,以更正該錯(cuò)誤的假想分支。161若在步驟1034中無方向的錯(cuò)誤,則在步驟1036中,預(yù)測(cè)檢查邏輯408會(huì)確定是否BTAC402或假想調(diào)用/返回堆棧406錯(cuò)誤地預(yù)測(cè)了分支指令的目標(biāo)地址。也就是,若處理器300假想分支至BTAC402目標(biāo)地址352,則預(yù)測(cè)檢查邏輯408會(huì)檢查圖4比較器489的結(jié)果485,以確定是否假想目標(biāo)地址352不匹配所解析的正確目標(biāo)地址356。另一種情況是,若處理器300假想分支至假想調(diào)用/返回堆棧406返回地址353,則預(yù)測(cè)檢查邏輯408會(huì)檢查圖4比較器497的結(jié)果487,以確定是否假想返回地址353不匹配所解析的正確目標(biāo)地址356。162若在步驟1036偵測(cè)到一目標(biāo)地址的錯(cuò)誤,則在步驟1052中,預(yù)測(cè)檢查邏輯408將ERR信號(hào)456設(shè)定為真,以顯示偵測(cè)到一錯(cuò)誤的假想分支。此外,控制邏輯404通過更新信號(hào)442,以步驟1032產(chǎn)生的解析目標(biāo)地址356來更新圖6對(duì)應(yīng)的BTAC402項(xiàng)目602。再者,會(huì)清除掉流水線300中因該錯(cuò)誤的假想分支而從指令高速緩存432誤取的指令。接著,在步驟1054中,控制邏輯404控制圖4的多工器422,以分支至解析目標(biāo)地址356,用來更正先前錯(cuò)誤的假想分支。163現(xiàn)請(qǐng)參照?qǐng)D11,為依本發(fā)明列舉的程序代碼實(shí)例片段及一表格1100,為說明圖10假想分支預(yù)測(cè)錯(cuò)誤的偵測(cè)與更正的一范例。程序代碼片段包括一先前程序代碼片段與一現(xiàn)行程序代碼片段。例如,該先前程序代碼片段圖標(biāo)了在圖3處理器300進(jìn)行工作交換(taskswitch)前,圖4指令高速緩存432中位于虛擬地址0x00000010的程序代碼。該現(xiàn)行程序代碼片段則圖標(biāo)了在工作交換后,指令高速緩存432中位于虛擬地址0x00000010的程序代碼,就像在虛擬別名化情形所可能發(fā)生的。164該先前程序代碼序列(codesequence)包括一在0x00000010地址位置的x86JMP(無條件跳轉(zhuǎn))指令。該JMP指令的目標(biāo)地址為0x00001234。該JMP指令已執(zhí)行;所以,在現(xiàn)行程序代碼序列執(zhí)行時(shí),目標(biāo)地址0x00001234已因應(yīng)地址0x00000010而快取于圖4的BTAC402。也就是,目標(biāo)地址714已被快取,VALID位702被設(shè)定,BEG446、LEN448與WRAP708字段寫入適當(dāng)?shù)闹担瑘D7的CALL704與RET706位則被清除。在此范例中,假定T/NT字段722顯示出所快取的分支將被采用,且JMP快取于BTAC402快取線的A項(xiàng)目624中。165現(xiàn)行程序代碼序列包括一位于0x00000010的ADD(算術(shù)加)指令,與先前程序代碼序列中的JMP指令的虛擬地址相同?,F(xiàn)行程序代碼序列中位置0x00001234是SUB(算術(shù)減)指令,位置0x00001236則是INC(算術(shù)遞增)指令。166表格1100包括八行(column)與六列(row)。第一列之后七行代表七個(gè)脈沖周期(clockcycle),從1至7。第一行之后五列代表流水線300最先的五個(gè)階段,即I-階段302、B-階段304、U-階段306、V-階段308與F-階段312。表格1100的其它方格則顯示當(dāng)執(zhí)行現(xiàn)行程序代碼序列時(shí),在不同脈沖周期中每個(gè)階段的內(nèi)容。167在脈沖周期1期間,BTAC402與指令高速緩存432被存取。ADD指令顯示于I-階段302。圖4值為0x00000010的提取地址495檢索BTAC402與指令高速緩存432,依據(jù)圖8的流程決定是否需要進(jìn)行一假想分支。在圖11的范例中,一值為0x00000010的提取地址495會(huì)命中BTAC402,如下所述。168在脈沖周期2期間,ADD指令顯示于B-階段304。這是指令高速緩存432提取周期(fetchcycle)的第二個(gè)脈沖。標(biāo)志數(shù)組614提供標(biāo)志616,而數(shù)據(jù)數(shù)組612提供圖6的項(xiàng)目602,每個(gè)項(xiàng)目602包括圖7的目標(biāo)地址714與SBI454。因?yàn)橄惹俺绦虼a序列的JMP指令在執(zhí)行后已被快取,圖6的比較器604便根據(jù)圖8的步驟802產(chǎn)生一標(biāo)志命中(taghit)于信號(hào)452上。比較器604也通過信號(hào)618控制路多工器606去選取適當(dāng)?shù)穆???刂七壿?04檢查A項(xiàng)目624與B項(xiàng)目626的SBI454,在此例中并選擇A項(xiàng)目624以提供目標(biāo)地址352與SBI454。在此例中,控制邏輯404也依據(jù)步驟804與812來決定項(xiàng)目是有效、被采用、被看見且不是返回指令。169在脈沖周期3期間,ADD指令顯示于U-階段306。ADD指令由指令高速緩存432提供,并閂鎖于U-階段306。因?yàn)閳D8的步驟802至814是在脈沖周期2中執(zhí)行,控制邏輯404便通過控制信號(hào)478控制圖4的多工器422,以選取BTAC402所提供的目標(biāo)地址352。170在脈沖周期4期間,ADD指令進(jìn)行至V-階段308,在此階段被寫入指令緩沖器342。脈沖周期4是假想分支周期。也就是,處理器300依據(jù)圖8的步驟814,開始提取位于值為0x00001234的快取目標(biāo)地址352的指令。即,根據(jù)圖8,提取地址495被改為地址0x00001234,以完成假想分支至該地址的動(dòng)作。因此,位于地址0x00001234的SUB指令,在脈沖周期4是顯示于I-階段302。此外,控制邏輯404通過圖4的信號(hào)482指出,已執(zhí)行一假想分支。所以,根據(jù)圖8的步驟816,指令緩沖器342中一SB位438對(duì)應(yīng)于ADD指令被設(shè)定。171在脈沖周期5期間,偵測(cè)到假想分支中的錯(cuò)誤。ADD指令進(jìn)行到F-階段312。SUB指令進(jìn)行至B-階段304。位于下個(gè)循序指令指針的INC指令,則顯示于I-階段302。圖4的F-階段312指令譯碼邏輯436譯碼ADD指令,并產(chǎn)生圖4的CIP468。預(yù)測(cè)檢查邏輯408依據(jù)步驟1004,通過信號(hào)484偵測(cè)到關(guān)聯(lián)于ADD指令的SB位438被設(shè)定。預(yù)測(cè)檢查邏輯408依據(jù)步驟1012,也偵測(cè)到ADD指令是一非分支指令,并接著依據(jù)步驟1022將圖4的ERR信號(hào)456設(shè)為真,以表示在周期4中已執(zhí)行錯(cuò)誤的假想分支。172在脈沖周期6期間,使錯(cuò)誤的假想分支無效。依據(jù)步驟1022,指令緩沖器342被清空。尤其,ADD指令從指令緩沖器342中清除。此外,依據(jù)步驟1022,導(dǎo)致錯(cuò)誤假想分支的項(xiàng)目602所關(guān)聯(lián)的VALID位702則被清除,以更新BTAC402。再者,控制邏輯404控制多工器422,以選取CIP468作為下個(gè)周期的提取地址495。173在脈沖周期7期間,更正錯(cuò)誤的假想分支。處理器300開始從指令高速緩存432提取位于ADD指令的指令指針的指令,該ADD指令是在脈沖周期5偵測(cè)到錯(cuò)誤時(shí),由指令譯碼邏輯436所譯碼的。也就是,處理器300依據(jù)步驟1024分支至對(duì)應(yīng)于ADD指令的CIP468,用來更正在脈沖周期5所執(zhí)行的錯(cuò)誤的假想分支。因此,ADD指令在脈沖周期7是顯示于I-階段302。這次,ADD指令將順著流水線300而下并執(zhí)行。174現(xiàn)請(qǐng)參閱圖12,其為依本發(fā)明繪示的圖4分支預(yù)測(cè)裝置400包括一混合假想分支方向預(yù)測(cè)裝置1200的另一具體實(shí)施例的方塊圖。簡(jiǎn)單就可以看出,BTAC402的分支方向預(yù)測(cè)愈準(zhǔn)確,假想分支至BTAC402產(chǎn)生的假想目標(biāo)地址352就愈能有效地減少分支延遲懲罰。反過來說,錯(cuò)誤的假想分支愈不常被更正,如關(guān)于圖10部分所述,假想分支至BTAC402產(chǎn)生的假想目標(biāo)地址352就愈能有效地減少處理器300的平均分支延遲懲罰。方向預(yù)測(cè)裝置1200包括圖4的BTAC402、一分支歷史表(BHT)1202、異或邏輯(exclusiveORlogic)1204、全域分支歷史緩存器(globalbranchhistoryregisters)1206與一多工器1208。175全域分支歷史緩存器1206包括一移位緩存器(shiftregister),對(duì)于處理器300所執(zhí)行的所有分支指令,全域分支歷史緩存器1206接收其分支方向結(jié)果1212,而該移位緩存器則儲(chǔ)存分支方向結(jié)果1212的全域歷史。每次處理器300執(zhí)行一分支指令,圖4的DIR位481就被寫入移位緩存器1206,若分支方向被采用,該位值為“設(shè)定”;若分支方向不被采用,該位值為“清除”。由此,最早的(oldest)位就被移出移位緩存器1206。在一具體實(shí)施例中,移位緩存器1206儲(chǔ)存了全域歷史的13個(gè)位。全域分支歷史的儲(chǔ)存,在分支預(yù)測(cè)的
技術(shù)領(lǐng)域:
中是為人熟知的,對(duì)于程序中高度依存于其它分支指令的分支指令,可改良其結(jié)果的預(yù)測(cè)。176全域分支歷史1206通過信號(hào)1214送至異或邏輯1204,以與圖4的提取地址495進(jìn)行一邏輯的異或運(yùn)算。異或邏輯1204的輸出1216作為分支歷史表1202的索引。在分支預(yù)測(cè)的
技術(shù)領(lǐng)域:
中,異或邏輯1204所執(zhí)行的功能一般都稱為gshare運(yùn)算。177分支歷史表1202包括一儲(chǔ)存組件的數(shù)組,以儲(chǔ)存數(shù)個(gè)分支指令的分支方向結(jié)果的歷史。該數(shù)組由異或邏輯1204的輸出1216作為索引。當(dāng)處理器300執(zhí)行一分支指令,由異或邏輯1204的輸出1216所檢索的分支歷史表1202的數(shù)組組件便通過信號(hào)1218選擇性地加以更新,而信號(hào)1218的內(nèi)容則視解析分支方向DIR481而定。178在一具體實(shí)施例中,分支歷史表1202數(shù)組中的每個(gè)儲(chǔ)存組件包括兩個(gè)方向預(yù)測(cè)A與B方向預(yù)測(cè)。最好(preferably)如圖所示,分支歷史表1202產(chǎn)生A與B方向預(yù)測(cè)于T/NT_A/B1222信號(hào)上,針對(duì)BTAC402產(chǎn)生的圖6A項(xiàng)目624與B項(xiàng)目626各指定一方向預(yù)測(cè)以供選取。在一具體實(shí)施例中,分支歷史表1202的儲(chǔ)存組件數(shù)組包括4096個(gè)項(xiàng)目,每個(gè)可儲(chǔ)存兩個(gè)方向預(yù)測(cè)。179在一具體實(shí)施例中,A與B預(yù)測(cè)各包括單一T/NT(taken/nottaken,即采用/不采用)位。在此實(shí)施例中,該T/NT位更新為DIR位481的值。在另一具體實(shí)施例中,A與B預(yù)測(cè)各包括一兩位的上/下數(shù)飽和計(jì)數(shù)器,指定了四種狀態(tài)極可能采用(stronglytaken)、有可能采用(weaklytaken)、有可能不采用(weaklynottaken)與極可能不采用(strongnottaken)。在此實(shí)施例中,飽和計(jì)數(shù)器朝DIR位481指出的方向來計(jì)數(shù)。180多工器1208從分支歷史表1202接收兩個(gè)方向預(yù)測(cè)位T/NTA/B1222,并從BTAC402接收A項(xiàng)目624與B項(xiàng)目626各自的圖7T/NT方向預(yù)測(cè)722。多工器1208亦從BTAC402接收A項(xiàng)目624與B項(xiàng)目626各自的SELECT位724,作為選擇控制信號(hào)。A項(xiàng)目624的SELECT位724從兩個(gè)A輸入中選取一T/NT給A項(xiàng)目624。B項(xiàng)目626的SELECT位724從兩個(gè)B輸入中選取一T/NT給B項(xiàng)目626。所選取的兩個(gè)T/NT位1224被送至控制邏輯404,通過圖4的信號(hào)478,用于控制多工器422。在圖12的實(shí)施例中,所選取的兩個(gè)T/NT位1224分別包括于項(xiàng)目A624與項(xiàng)目B626,被送至控制邏輯404,如圖6所示。181可以看出,若處理器300分支至目標(biāo)地址352,且該地址352是BTAC402依據(jù)(至少部分是)分支歷史表1202所提供的方向預(yù)測(cè)1222而產(chǎn)生,則該分支是以假想的方式進(jìn)行。該分支是假想的,此因雖然命中BTAC402已指出一分支指令先前存在于提取地址495所選取的指令高速緩存432快取線中,但仍無法確定一分支指令位于所選取的指令高速緩存432快取線中,如上所討論的。182也可以看出,比起單單只有BTAC402方向預(yù)測(cè)722,圖12的混合分支方向預(yù)測(cè)裝置1200可能有利地提供一更準(zhǔn)確的分支方向預(yù)測(cè)。尤其,一般而言,對(duì)于高度依存于其它分支歷史的分支而言,分支歷史表1202提供了較準(zhǔn)確的預(yù)測(cè);反的,對(duì)于并非高度依存于其它分支歷史的分支而言,則是BTAC402提供了較準(zhǔn)確的預(yù)測(cè)。就一既定的分支而言,通過SELECT位724能選擇較準(zhǔn)確的預(yù)測(cè)裝置。因此,可以看出,圖12的方向預(yù)測(cè)裝置1200能有利地與BTAC402協(xié)同運(yùn)作,以使用BTAC402所提供的目標(biāo)地址352進(jìn)行更準(zhǔn)確的假想分支。183現(xiàn)請(qǐng)參閱圖13,其為圖4的雙調(diào)用/返回堆棧406與414的運(yùn)作流程圖。計(jì)算機(jī)程序的一項(xiàng)特性是,可能從程序內(nèi)多個(gè)位置來調(diào)用子程序(subroutine)。所以,子程序內(nèi)一返回指令的返回地址可能變來變?nèi)?。因此,可以看出,利用分支目?biāo)地址高速緩存去預(yù)測(cè)返回地址通常很不容易,從而調(diào)用/返回堆棧的出現(xiàn),實(shí)有其必要。本發(fā)明的雙調(diào)用/返回地址堆棧的架構(gòu)提供了本發(fā)明的假想BTAC的好處,像是在流水線300早期即預(yù)測(cè)分支目標(biāo)地址,以減少分支懲罰。除此之外,還廣泛提供了調(diào)用/返回堆棧的優(yōu)點(diǎn),即,比一簡(jiǎn)單的BTAC402更準(zhǔn)確地預(yù)測(cè)返回地址。184在步驟1302中,圖4的BTAC402由圖4的提取地址495作索引,而圖4的控制邏輯404檢查命中信號(hào)452,以確定提取地址495是否命中BTAC402,還檢查SBI454的VALID位702,以確定所選取的BTAC402項(xiàng)目602是否有效。若BTAC402的命中未發(fā)生或VALID位702未被設(shè)定,則控制邏輯404并不會(huì)使處理器300進(jìn)行假想分支。185若在步驟1302期間一有效的BTAC402命中發(fā)生,則在步驟1304中,控制邏輯404會(huì)檢查圖4SBI454的圖7CALL位704,以確定所快取的分支指令假想地或大概地是否為一調(diào)用指令。若CALL位704被設(shè)定,則在步驟1306中,控制邏輯404控制假想調(diào)用/返回堆棧406,以將假想返回地址491推入其中。也就是,該假定的調(diào)用指令的假想返回地址491,其為圖4的提取地址495、BEG446與LEN448的總和,儲(chǔ)存于假想調(diào)用/返回堆棧406。假想返回地址491之所以為假想的,乃因在命中BTAC402的提取地址495所關(guān)聯(lián)的指令高速緩存432快取線中,并不確定真有包括一調(diào)用指令,更別說是BEG446與LEN448因的而被快取于BTAC402的調(diào)用指令了。假想返回地址491,或目標(biāo)地址,在下一次執(zhí)行返回指令時(shí),可由返回地址信號(hào)353提供,以便假想分支至此返回地址491,就如下文關(guān)于步驟1312至1318所述。186若Call位704被設(shè)定,則在步驟1308中,控制邏輯404接著控制多工器422去選取圖3的BTAC402目標(biāo)地址352,以假想分支至目標(biāo)地址352。187若控制邏輯404在步驟1304確定CALL位704未被設(shè)定,則在步驟1312中,控制邏輯404會(huì)檢查SBI454的圖7RET位706,以確定所快取的分支指令假想地或大概地是否為一返回指令。若RET位706被設(shè)定,則在步驟1314中,控制邏輯404控制假想調(diào)用/返回堆棧406,以將圖3的假想返回地址353從堆棧頂端取出。188在取出假想返回地址353后,則在步驟1316中,控制邏輯接著控制多工器422去選取從假想調(diào)用/返回堆棧406取出的假想返回地址353,以假想分支至返回地址353。189返回指令順著流水線300而下,直至抵達(dá)圖3的F-階段312,圖4的指令譯碼邏輯436則譯碼此假定的返回指令。若此假定的返回指令的確是一返回指令,則圖4的非假想調(diào)用/返回堆棧414產(chǎn)生此返回指令的圖3非假想返回地址355。在步驟1318中,圖4的比較器418將假想返回地址353與非假想返回地址355作比較,并將結(jié)果714送至控制邏輯404。190在步驟1318中,控制邏輯404檢查比較器418的結(jié)果474,以確定是否有不匹配發(fā)生。若假想返回地址353與非假想返回地址355不相匹配,則在步驟1326中,控制邏輯404會(huì)控制多工器422選取非假想返回地址355,以使處理器300分支至非假想返回地址355。191若控制邏輯404于步驟1304中確定CALL位704并未設(shè)定,且于步驟1312中確定RET位706也未設(shè)定,則在步驟1322中,控制邏輯404會(huì)控制多工器422假想分支至圖3的BTAC402目標(biāo)地址352,如圖8步驟814或834所描述的。192因此,從圖13可看出,圖4的雙重調(diào)用/返回堆棧的運(yùn)作可減少調(diào)用與返回指令的分支懲罰。這種分支懲罰的減少,是通過將處理器300結(jié)合BTAC402,使調(diào)用與返回指令在流水線更早期就進(jìn)行分支,同時(shí)也克服以下現(xiàn)象由于子程序一般都從一些不同的程序位置來調(diào)用,返回指令因而會(huì)返回至多個(gè)不同的返回地址。193現(xiàn)請(qǐng)參照?qǐng)D14,為說明圖4的分支預(yù)測(cè)裝置400以非假想分支預(yù)測(cè)來選擇性地覆蓋(override)假想分支預(yù)測(cè),用來改進(jìn)本發(fā)明的分支預(yù)測(cè)準(zhǔn)確度的運(yùn)作流程圖。在從指令緩沖器342接收一指令后,在步驟1402中,圖4的指令譯碼邏輯436便譯碼該指令,圖4的非假想目標(biāo)地址計(jì)算器416、非假想調(diào)用/返回堆棧414以及非假想分支方向預(yù)測(cè)裝置412則依圖4的指令譯碼數(shù)據(jù)492產(chǎn)生非假想分支預(yù)測(cè)。指令譯碼邏輯436在步驟1402中,產(chǎn)生該指令的類型數(shù)據(jù)于指令譯碼數(shù)據(jù)492中。194尤其是,指令譯碼邏輯436會(huì)確定該指令是否為分支指令、指令的長(zhǎng)度以及分支指令的類型。最好(preferably)指令譯碼邏輯436會(huì)確定分支指令是否為條件或無條件類型分支指令、PC相關(guān)類型分支指令、返回指令、直接類型分支指令或間接類型分支指令。195若該指令為一分支指令,非假想分支方向預(yù)測(cè)裝置412會(huì)產(chǎn)生圖4的非假想方向預(yù)測(cè)444。此外,非假想目標(biāo)地址計(jì)算器416則計(jì)算圖3的非假想目標(biāo)地址354。最后,若該指令為一返回指令,則非假想調(diào)用/返回堆棧414產(chǎn)生圖3的非假想返回地址355。196在步驟1404中,控制邏輯404會(huì)確定分支指令是否為條件分支指令。也就是,控制邏輯404會(huì)確定該指令是否依靠一條件而被采用或不被采用,該條件像是旗標(biāo)(flag)位是否設(shè)定,如零旗標(biāo)(zeroflag)、進(jìn)位旗標(biāo)(carryflag)等等。在x86指令集中,JCC指令是條件類型的分支指令。相對(duì)地,RET、CALL與JUMP指令,則是無條件分支指令,因?yàn)檫@些指令總會(huì)有一被采用的方向。197若該指令為條件類型的分支指令,則在步驟1412中,控制邏輯404會(huì)確定非假想分支方向預(yù)測(cè)裝置412所預(yù)測(cè)的非假想方向預(yù)測(cè)444以及BTAC402所預(yù)測(cè)SBI454中圖7的假想方向722兩者間,是否不相匹配。198若有方向預(yù)測(cè)上的不匹配,則在步驟1414中,控制邏輯404會(huì)確定非假想方向預(yù)測(cè)444是否要被采用。若非假想方向預(yù)測(cè)444不被采用,則在步驟1414中,控制邏輯404會(huì)控制多工器422選取圖4的NSIP466,以分支至現(xiàn)行分支指令后的指令。也就是,控制邏輯404選擇性地覆蓋假想的BTAC402方向預(yù)測(cè)。假想方向預(yù)測(cè)722之所以被覆蓋,是因非假想方向預(yù)測(cè)444一般比較準(zhǔn)確。199若非假想方向預(yù)測(cè)444被采用,則在步驟1432中,控制邏輯404會(huì)控制多工器422分支至非假想目標(biāo)地址354。同樣地,假想方向預(yù)測(cè)722之所以被覆蓋,是因非假想方向預(yù)測(cè)444一般比較準(zhǔn)確。200若控制邏輯404于步驟1412確定并無方向預(yù)測(cè)上的不匹配,且已執(zhí)行分支指令的假想分支(即,若SB位438被設(shè)定),則在步驟1428中,控制邏輯404會(huì)確定假想目標(biāo)地址352與非假想目標(biāo)地址354間是否不相匹配。若有一條件類型分支的目標(biāo)地址的不匹配,則在步驟1432中,控制邏輯404會(huì)控制多工器422分支至非假想目標(biāo)地址354。假想目標(biāo)地址預(yù)測(cè)352會(huì)被覆蓋,此因非假想目標(biāo)地址預(yù)測(cè)354一般更為準(zhǔn)確。若沒有一條件類型分支的目標(biāo)地址的不匹配,則不會(huì)采取任何行動(dòng)。也就是,允許進(jìn)行假想分支,并接受錯(cuò)誤更正的管制,如關(guān)于圖10部分所述。201若在步驟1404中,控制邏輯404確定該分支指令不是條件類型的分支,則于步驟1406控制邏輯404會(huì)確定該分支指令是否為返回指令。若該分支指令是返回指令,則在步驟1418中,控制邏輯404會(huì)確定假想調(diào)用/返回堆棧406產(chǎn)生的假想返回地址353與非假想調(diào)用/返回堆棧414產(chǎn)生的非假想返回地址355兩者間,是否不相匹配。202若假想返回地址353與非假想返回地址355兩者不相匹配,則在步驟1422中,控制邏輯404會(huì)控制多工器422分支至非假想返回地址355。也就是,控制邏輯404選擇性地覆蓋假想返回地址353。假想返回地址353之所以被覆蓋,是因非假想返回地址355一般比較準(zhǔn)確。若沒有一直接類型分支的目標(biāo)地址的不匹配,則不會(huì)采取任何行動(dòng)。也就是,允許進(jìn)行假想分支,并接受錯(cuò)誤更正的管制,如關(guān)于圖10部分所述。請(qǐng)注意步驟1418與1422分別對(duì)應(yīng)到圖13的步驟1324與1326。203若在步驟1406中,控制邏輯404確定該分支指令不是返回指令,則于步驟1408控制邏輯404會(huì)確定該分支指令是否為PC相關(guān)類型的分支指令。在x86指令集中,PC相關(guān)類型的分支指令所指定的帶正負(fù)號(hào)的位移量會(huì)加上現(xiàn)行程序計(jì)數(shù)器的值,以計(jì)算目標(biāo)地址。204在另一具體實(shí)施例中,控制邏輯404于步驟1408也會(huì)確定該分支指令是否為直接類型的分支指令。在x86指令集中,直接類型的分支指令于自身內(nèi)即指定目標(biāo)地址。直接類型的分支指令也被稱為立即類型(immediatetype)的分支指令,因?yàn)槟繕?biāo)地址被指定于指令的立即字段(immediatefield)。205若該分支指令為PC相關(guān)類型的分支指令,則在步驟1424中,控制邏輯404會(huì)確定假想目標(biāo)地址352與非假想目標(biāo)地址354間是否不相匹配。若有一PC相關(guān)類型分支的目標(biāo)地址的不匹配,則在步驟1426中,控制邏輯404會(huì)控制多工器422分支至非假想目標(biāo)地址354。假想目標(biāo)地址預(yù)測(cè)352會(huì)被覆蓋,此因非假想目標(biāo)地址預(yù)測(cè)354對(duì)PC相關(guān)類型的分支而言一般更為準(zhǔn)確。若沒有一PC相關(guān)類型分支的目標(biāo)地址的不匹配,則不會(huì)采取任何行動(dòng)。也就是,允許進(jìn)行假想分支,并接受錯(cuò)誤更正的管制,如關(guān)于圖10部分所述。206若在步驟1408中,控制邏輯404確定該分支指令不是PC相關(guān)類型的分支指令,則不會(huì)采取任何行動(dòng)。也就是,允許進(jìn)行假想分支,并接受錯(cuò)誤更正的管制,如關(guān)于圖10部分所述。在一具體實(shí)施例中,非假想目標(biāo)地址計(jì)算器416在F-階段312包括一相當(dāng)小的分支目標(biāo)緩沖器(branchtargetbuffer,BTB),僅用來快取間接類型分支指令的分支目標(biāo)地址,如前面關(guān)于圖4部分所述。207可以看出,對(duì)間接類型的分支指令而言,BTAC402的預(yù)測(cè)一般是比相當(dāng)小的F-階段312BTB更為準(zhǔn)確。所以,若確定該分支為一間接類型的分支指令,控制邏輯404不會(huì)覆蓋BTAC402的假想預(yù)測(cè)。也就是,若一間接類型分支指令的假想分支因圖8所述的BTAC402命中而執(zhí)行,則控制邏輯404會(huì)通過分支至間接類型的BTB目標(biāo)地址,而不覆蓋該假想分支。然而,即使在此間接類型的分支中,BTAC402所產(chǎn)生的假想目標(biāo)地址352未被非假想目標(biāo)地址354給覆蓋,在流水線300稍后仍會(huì)于假想目標(biāo)地址352與圖3從S-階段328接收的非假想目標(biāo)地址356兩者間,做一目標(biāo)地址的比較,以執(zhí)行圖10的步驟1036,偵測(cè)錯(cuò)誤的假想分支。208現(xiàn)請(qǐng)參照?qǐng)D15,其為依本發(fā)明繪示的用來置換圖4BTAC402中目標(biāo)地址的裝置的方塊圖。為了簡(jiǎn)明起見,關(guān)于BTAC402的多路關(guān)聯(lián)性的數(shù)據(jù),像是圖6的多路與路多工器606,并未顯示。圖6BTAC402的數(shù)據(jù)數(shù)組612顯示其包括了一選定的BTAC402快取線,其中具有項(xiàng)目A602A與項(xiàng)目B602B,分別通過圖6的信號(hào)624與626送至控制邏輯404。項(xiàng)目A602A與項(xiàng)目B602B各包括其相關(guān)的圖7VALID位702。209該選定的BTAC402快取線亦包括一A/BLRU(leastrecentlyused)位1504,以指出項(xiàng)目A602A與項(xiàng)目B602B兩者中,哪一個(gè)最近最不被使用到。在一具體實(shí)施例中,每次一發(fā)生命中BTAC402的一既定目標(biāo)地址714,A/BLRU位1504就被更新,以指定發(fā)生命中項(xiàng)目的相對(duì)項(xiàng)目。也就是,若控制邏輯404因項(xiàng)目A602A發(fā)生命中而進(jìn)行至圖8的步驟812,則A/BLRU位1504就被更新成顯示項(xiàng)目B602B。相反地,若控制邏輯404因項(xiàng)目B602B發(fā)生命中而進(jìn)行至圖8的步驟832,則A/BLRU位1504就被更新成顯示項(xiàng)目A602A。A/BLRU位1504也被送至控制邏輯404。210此置換裝置也包括一多工器1506。多工器1506接收?qǐng)D4提取地址495與一更新指令指針(IP)作為輸入。多工器1506依據(jù)控制邏輯404提供的讀/寫控制信號(hào)1516來選取其中一輸入。讀/寫控制信號(hào)1516亦被送至BTAC402。當(dāng)讀/寫控制信號(hào)1516顯示為“讀”,則多工器1506選取提取地址495,經(jīng)由信號(hào)1514送至BTAC402,以讀取BTAC402。當(dāng)讀/寫控制信號(hào)1516顯示為“寫”,則多工器1506選取更新IP1512,經(jīng)由信號(hào)1514送至BTAC402,以通過圖4信號(hào)442將一更新目標(biāo)地址714與/或SBI454與/或A/BLRU位1504寫入BTAC402。211當(dāng)一分支指令執(zhí)行且被采用,該分支指令的目標(biāo)地址714以及相關(guān)聯(lián)的SBI454會(huì)被寫入,或快取于,一BTAC402項(xiàng)目602。也就是,用已執(zhí)行的分支指令的新目標(biāo)地址714及相關(guān)聯(lián)的SBI454來更新BTAC402。控制邏輯404必須決定在BTAC402的哪一邊,A或B,來更新由更新IP1512選取的BTAC402快取線與路。也就是,控制邏輯404必須決定是否要置換所選取的快取線與路的項(xiàng)目A602A或項(xiàng)目B602B。控制邏輯404如下表一所示來決定置換哪一邊。ValidAValidBReplace00--LastWritten01A10B11LRU表一212表一為具有兩個(gè)輸入的真值表(truthtable),兩個(gè)輸入為項(xiàng)目A602A的VALID位702與項(xiàng)目B602B的VALID位702。該真值表的輸出用以決定要置換BTAC402的哪一邊。如表一所示,若A項(xiàng)目602A無效且B項(xiàng)目602B有效,則控制邏輯404將A項(xiàng)目602A置換掉。若A項(xiàng)目602A有效且B項(xiàng)目602B無效,則控制邏輯404將B項(xiàng)目602B置換掉。若A項(xiàng)目602A與B項(xiàng)目602B皆有效,則控制邏輯404將最近較少被使用的項(xiàng)目置換掉,而此項(xiàng)目是由更新IP1512所選取BTAC402快取線與路中的A/BLRU位1504來指定。213若A項(xiàng)目602A與B項(xiàng)目602B皆無效,則控制邏輯404必須決定要置換哪一邊。一種解決方式是總是寫到某一邊,如A。然而,這種解決方式會(huì)造成如下程序代碼序列1所示的問題。0x00000010JMP0X000000140x00000014ADDBX,10x00000016CALL0x12345678程序代碼序列1214在程序代碼序列1中,此三個(gè)指令都位在相同的指令高速緩存432的快取線內(nèi),因?yàn)槠渲噶钪羔樀刂烦溯^低的四個(gè)地址位外余皆相同;因此,JMP與CALL指令選取相同的BTAC402快取線與路。假設(shè)此范例中,當(dāng)指令執(zhí)行時(shí),由JMP與CALL指令所選取BTAC402快取線與路內(nèi)的A項(xiàng)目602A與B項(xiàng)目602B皆無效。使用“當(dāng)兩個(gè)項(xiàng)目皆無效時(shí),總是更新A這一邊”的解決方式,JMP指令將見到兩邊皆為無效,且將更新A項(xiàng)目602A。215然而,由于在程序序列中CALL指令相當(dāng)接近JMP指令,若流水線相當(dāng)長(zhǎng),如處理器300,則在A項(xiàng)目602A的VALID位702被更新前,有相當(dāng)多數(shù)量的周期可能會(huì)通過。因此,在BTAC402被已執(zhí)行的JMP指令更新前,特別是在A項(xiàng)目602A的VALID位702與所選取BTAC402快取線的BTAC402路置換狀態(tài)被JMP指令更新之前,CALL指令非常有可能會(huì)選取BTAC402。所以,CALL指令將見到兩邊皆為無效,而且也將依“當(dāng)兩個(gè)項(xiàng)目皆無效時(shí),總是更新A這一邊”的解決方式,來更新A項(xiàng)目602A。這樣做是有問題的,因?yàn)镴MP指令的目標(biāo)地址714將由于一空的即無效的B項(xiàng)目602B可用來快取CALL指令的目標(biāo)地址714而不必要地被取代。216為解決如表一所示的問題,若A項(xiàng)目602A與B項(xiàng)目602B皆無效,則控制邏輯404會(huì)有利地選取存于一全域置換狀態(tài)旗標(biāo)緩存器即LastWritten緩存器1502的一邊或其相反邊。LastWritten緩存器1502包括于置換裝置,并由其來更新。LastWritten緩存器1502儲(chǔ)存一指示,其顯示BTAC402的A邊或B邊是否為最后被寫到一無效的BTAC402項(xiàng)目602。有利地,此方法使用LastWritten緩存器1502以避免前面程序代碼序列1所示的問題,如現(xiàn)在關(guān)于圖16與17部分所要敘述的。217現(xiàn)請(qǐng)參照?qǐng)D16,其為依本發(fā)明圖15裝置的一運(yùn)作方法的流程圖。圖16闡明了上述表一的一具體實(shí)施例。218當(dāng)控制邏輯404需要去更新BTAC402的項(xiàng)目602時(shí),控制邏輯404會(huì)分別檢查所選取的A項(xiàng)目602A與B項(xiàng)目602B的VALID位702。在步驟1602中,控制邏輯404會(huì)確定是否A項(xiàng)目602A與B項(xiàng)目602B兩者皆為有效。若兩個(gè)項(xiàng)目皆有效,則在步驟1604中,控制邏輯404會(huì)檢查A/BLRU位1504以確定A項(xiàng)目602A或B項(xiàng)目602B為最近最少被使用者。若A項(xiàng)目602A為最近最少被使用者,則控制邏輯404于步驟1606將A項(xiàng)目602A置換掉。若B項(xiàng)目602B為最近最少被使用者,則控制邏輯404于步驟1608將B項(xiàng)目602B置換掉。219若控制邏輯404于步驟1602中確定并非兩個(gè)項(xiàng)目都無效,則在步驟1612中,控制邏輯404會(huì)確定是否為A項(xiàng)目602A有效而B項(xiàng)目602B無效。若是,則控制邏輯404于步驟1614將B項(xiàng)目602B置換掉。不然,在步驟1622中,控制邏輯404會(huì)確定是否為A項(xiàng)目602A無效而B項(xiàng)目602B有效。若是,則控制邏輯404于步驟1624將A項(xiàng)目602A置換掉。否則,在步驟1632中,控制邏輯404會(huì)檢查L(zhǎng)astWritten緩存器1502。220若LastWritten緩存器1502顯示BTAC402的A邊并非最后被寫到一選定的快取線與路中,而在此選定的快取線與路中A項(xiàng)目602A與B項(xiàng)目602B皆為無效,則控制邏輯404于步驟1634將A項(xiàng)目602A置換掉??刂七壿?04接著于步驟1636更新LastWritten緩存器1502,以指定BTAC402的A邊為最后被寫到一選定快取線與路的邊,而在此選定的快取線與路中A項(xiàng)目602A與B項(xiàng)目602B皆為無效。221若LastWritten緩存器1502顯示BTAC402的B邊并非最后被寫到一選定的快取線與路中,而在此選定的快取線與路中A項(xiàng)目602A與B項(xiàng)目602B皆為無效,則控制邏輯404于步驟1644將B項(xiàng)目602B置換掉??刂七壿?04接著于步驟1646更新LastWritten緩存器1502,以指定BTAC402的B邊為最后被寫到一選定快取線與路的邊,而在此選定的快取線與路中A項(xiàng)目602A與B項(xiàng)目602B皆為無效。222可以看出,圖16的方法可避免在上述程序代碼序列1中,以CALL指令的目標(biāo)地址覆寫掉JMP指令的目標(biāo)地址。假設(shè)當(dāng)JMP指令執(zhí)行時(shí),LastWritten緩存器1502指定了A邊。既然B邊并不是最后被寫的,控制邏輯404將依據(jù)圖16與表一來更新B項(xiàng)目602B。此外,控制邏輯404將更新LastWritten緩存器1502以指定B邊。因此,當(dāng)CALL指令執(zhí)行時(shí),控制邏輯404將依據(jù)圖16更新A項(xiàng)目602A,此因當(dāng)BTAC402被選取時(shí),兩個(gè)項(xiàng)目皆無效,且LastWritten緩存器1502指明了A邊并不是最后被寫到。因此,有利地,JMP與CALL指令兩者的目標(biāo)地址將快取于BTAC402,供后續(xù)的假想分支使用。223現(xiàn)請(qǐng)參照?qǐng)D17,其為依本發(fā)明的另一具體實(shí)施例繪示圖15裝置的一運(yùn)作方法的流程圖。圖17的步驟除了兩個(gè)額外步驟外,其余皆與圖16的步驟相同。在此另一具體實(shí)施例中,控制邏輯404在置換一無效的項(xiàng)目后,會(huì)更新LastWritten緩存器1502,即使另一項(xiàng)目為有效的。224因此,在圖17,于步驟1614置換了B項(xiàng)目602B后,在步驟1716中,控制邏輯404將更新LastWritten緩存器1502以指定B邊。此外,于步驟1624置換了A項(xiàng)目602A后,在步驟1726中,控制邏輯404將更新LastWritten緩存器1502以指定A邊。225雖然物理的仿真并未看到圖16與17的實(shí)施例在效能上有顯著差別,但可看出圖16實(shí)施例解決了圖17實(shí)施例所無法處理的一個(gè)問題。此問題以下述程序代碼序列2來解說。0x00000010JMP0x123456780x12345678JMP0x000000140x00000014JMP0x20000000程序代碼序列2226位于指令指針0x00000010與0x00000014的兩個(gè)JMP指令都在同一條指令高速緩存432快取線中,并選取BTAC402內(nèi)相同的快取線。位于指令指針0x12345678的JMP指令則在另一條指令高速緩存432快取線中,并選取BTAC402內(nèi)另一條不同的快取線。當(dāng)JMP0x12345678指令執(zhí)行時(shí),假設(shè)有下列情況存在。LastWritten緩存器1502指定了B邊。由JMP0x12345678指令與JMP0x20000000指令的指令指針?biāo)x取BTAC402快取線與路中的A項(xiàng)目602A與B項(xiàng)目602B兩者皆為無效。由JMP0x00000014指令的指令指針?biāo)x取的BTAC402快取線與路則顯示A項(xiàng)目602A有效而B項(xiàng)目602B無效。假設(shè)在JMP0x12345678指令更新BTAC402前,執(zhí)行JMP0x20000000指令。因此,JMP0x12345678與JMP0x20000000指令的指令指針在相同BTAC402快取線中選取相同的路。227依據(jù)圖16與17,當(dāng)JMP0x12345678執(zhí)行時(shí),控制邏輯404將于步驟1634以JMP0x12345678的目標(biāo)地址來置換A項(xiàng)目602A,并在步驟1636更新LastWritten緩存器1502以指定A邊。依據(jù)圖16與17,當(dāng)JMP0x00000014執(zhí)行時(shí),控制邏輯404將于步驟1614以JMP0x00000014的目標(biāo)地址來置換B項(xiàng)目602B。依據(jù)圖17,控制邏輯404將于步驟1716更新LastWritten緩存器1502以指定B邊。然而,依據(jù)圖16,控制邏輯404將不會(huì)更新LastWritten緩存器1502;而是,LastWritten緩存器1502將繼續(xù)指定A邊。因此,當(dāng)JMP0x00000020執(zhí)行時(shí),依據(jù)圖17,控制邏輯404將于步驟1634以JMP0x00000020的目標(biāo)地址來置換A項(xiàng)目602A,用來needlesslyclobberingJMP0x12345678的目標(biāo)地址。相反地,依據(jù)圖16,當(dāng)JMP0x00000020執(zhí)行時(shí),控制邏輯404將于步驟1644置換B項(xiàng)目602B,用來有利地使A項(xiàng)目602A中JMP0x12345678的目標(biāo)地址保持不變。228現(xiàn)請(qǐng)參照?qǐng)D18,其為依本發(fā)明的另一具體實(shí)施例繪示的用以進(jìn)行圖4BTAC402中目標(biāo)地址置換動(dòng)作的裝置方塊圖。圖18的實(shí)施例類似于圖15的實(shí)施例。然而,在圖18的實(shí)施例中,A/BLRU位1504與兩個(gè)項(xiàng)目的T/NT位722,顯示為T/NTA722A與T/NTB722B,儲(chǔ)存于一另外的數(shù)組1812,而非數(shù)據(jù)數(shù)組612。229此額外的數(shù)組1812是雙端口的;而數(shù)據(jù)數(shù)組612卻是單端口。因?yàn)锳/BLRU位1504與T/NT位722比起項(xiàng)目602的其它字段更常被更新,對(duì)較常被更新的字段提供雙端口的存取,可減低在高存取量期間于BTAC402形成瓶頸的可能性。然而,由于雙端口的高速緩存數(shù)組比單端口的高速緩存數(shù)組來得大,且消耗更多功率,較少被存取的字段就儲(chǔ)存在單端口的數(shù)據(jù)數(shù)組612。230現(xiàn)請(qǐng)參照?qǐng)D19,其為依本發(fā)明的另一具體實(shí)施例繪示的用以進(jìn)行圖4BTAC402中目標(biāo)地址置換動(dòng)作的裝置方塊圖。圖19的實(shí)施例類似于圖15的實(shí)施例。然而,圖19的實(shí)施例中,每一BTAC402快取線與路皆包括一第三項(xiàng)目,項(xiàng)目C602C。項(xiàng)目C602C通過信號(hào)1928送至控制邏輯404。有利地,圖19的實(shí)施例支持假想分支至三個(gè)分支指令中任一個(gè)的能力,而此三個(gè)分支指令快取由提取地址495所選取的一對(duì)應(yīng)的指令高速緩存432快取線中;或者,在一實(shí)施例中,支持假想分支至快取于一對(duì)應(yīng)的指令高速緩存432半快取線的三個(gè)分支指令中的任一個(gè)。231除此之外,圖19的實(shí)施例不使用LastWritten緩存器1502,取而代之的是一緩存器1902,其包括一LastWritten值與一LastWrittenPrev值。當(dāng)LastWritten值要更新時(shí),控制邏輯404在更新LastWritten值之前,便將LastWritten值的內(nèi)容復(fù)制到LastWrittenPrev值。LastWritten值與LastWrittenPrev值這兩個(gè)值一起使得控制邏輯404得以確定三個(gè)項(xiàng)目中哪一個(gè)是最近最少被寫到的,如現(xiàn)在于表二及其后的等式所描述的。232表二類似于表一,除了表二有三個(gè)輸入,包括項(xiàng)目C702C的附加的VALID位702。在等式中,“l(fā)w”對(duì)應(yīng)至LastWritten值,“l(fā)wp”LastWrittenPrev值。在一具體實(shí)施例中,只有當(dāng)所有三個(gè)項(xiàng)目皆為無效時(shí),才更新LastWritten與LastWrittenPrev的值,類似于圖16的方法。在另一具體實(shí)施例中,任何時(shí)候控制邏輯404更新了一無效的項(xiàng)目,LastWritten與LastWrittenPrev的值就會(huì)更新,類似于圖17的方法。表二LRW=AOlderThanB?LRWofAandC∶LRWofBandCLRWofAandB=AOlderThanB?A∶BLRWofAandC=AOlderThanC?A∶CLRWofBandC=BOlderThanC?B∶CAOlderThanB=(lw==B)|((lwp==B&(lw?。紸))BOlderThanC=(lw==C)|((lwp==C&(lw?。紹))AOlderThanC=(lw==C)|((lwp==C&(lw?。紸))233雖然本發(fā)明及其目的、特征與優(yōu)點(diǎn)已詳細(xì)敘述了,其它具體實(shí)施例仍涵蓋在本發(fā)明的范圍內(nèi)。例如,BTAC可用任何數(shù)量的高速緩存來配置,包括直接映像(direct-mapped)、完全關(guān)聯(lián)(fullyassociative)或不同數(shù)目的路高速緩存。再者,BTAC的大小可增或減。而且,一提取地址,而不是位于物理包括被預(yù)測(cè)分支指令的快取線的提取地址,可用來檢索BTAC與分支歷史表。例如,先前提取指令的提取地址可用來在分支前減低指令泡沫的大小。此外,儲(chǔ)存于高速緩存的每一路的目標(biāo)地址數(shù)量可能改變。另外,分支歷史表的大小可能改變,且存于其中的位的數(shù)目與方向預(yù)測(cè)數(shù)據(jù)的形式,以及檢索分支歷史表的算法(algorithm)也可能改變。再者,指令高速緩存的大小可能改變,且用以檢索指令高速緩存與BTAC的虛擬提取地址的類型也可能改變。234總之,以上所述僅為本發(fā)明的較佳實(shí)施例而已,當(dāng)不能限定本發(fā)明所實(shí)施的范圍。凡依本發(fā)明權(quán)利要求所作的等效變化與修飾,皆應(yīng)仍屬于本發(fā)明專利涵蓋的范圍內(nèi)。權(quán)利要求1.一種在一處理器中使用的分支預(yù)測(cè)裝置,其特征在于,該處理器包括地址選擇邏輯,以提供一提取地址至一指令高速緩存,該提取地址用來選取該指令高速緩存的數(shù)條快取線,該分支預(yù)測(cè)裝置包括第一與第二分支預(yù)測(cè)裝置,分別提供一分支指令的一第一與一第二目標(biāo)地址預(yù)測(cè)至地址選擇邏輯;指令譯碼邏輯,組態(tài)為接收及譯碼該分支指令,并產(chǎn)生該分支指令的一類型;以及分支控制邏輯,組態(tài)為控制該地址選擇邏輯選取該第一目標(biāo)地址預(yù)測(cè)作為該提取地址,該第一目標(biāo)地址預(yù)測(cè)選取指令高速緩存的一第一快取線;其中該分支控制邏輯更組態(tài)為接著依據(jù)該分支指令類型,選擇性地控制地址選擇邏輯選取該第二目標(biāo)地址預(yù)測(cè)作為該提取地址,該第二目標(biāo)地址預(yù)測(cè)選取指令高速緩存的一第二快取線。2.如權(quán)利要求1所述的裝置,其特征在于,還包括比較邏輯,對(duì)應(yīng)于該第一與第二分支預(yù)測(cè)裝置,將該第一與第二目標(biāo)地址預(yù)測(cè)作比較。3.如權(quán)利要求2所述的裝置,其特征在于,該類型包括一該分支指令是否為返回類型分支指令的說明(specification)。4.如權(quán)利要求3所述的裝置,其特征在于,若該分支指令類型為一返回指令且該第一目標(biāo)地址預(yù)測(cè)與第二目標(biāo)地址預(yù)測(cè)不相匹配,則該分支控制邏輯控制地址選擇邏輯選取該第二目標(biāo)地址預(yù)測(cè)。5.如權(quán)利要求4所述的裝置,其特征在于,該第二分支預(yù)測(cè)裝置包括一調(diào)用/返回堆棧,提供該返回指令的該第二目標(biāo)地址預(yù)測(cè)。6.如權(quán)利要求2所述的裝置,其特征在于,該類型包括一該分支指令是否為程序計(jì)數(shù)器相關(guān)類型分支指令的說明。7.如權(quán)利要求6所述的裝置,其特征在于,若該分支指令類型為一程序計(jì)數(shù)器相關(guān)分支指令且該第一與第二預(yù)測(cè)不相匹配,則該分支控制邏輯控制地址選擇邏輯選取該第二目標(biāo)地址預(yù)測(cè)。8.如權(quán)利要求7所述的裝置,其特征在于,該第二分支預(yù)測(cè)裝置包括一算術(shù)單元(arithmeticunit),以根據(jù)該分支指令的一指令指針計(jì)算該第二目標(biāo)地址預(yù)測(cè)。9.如權(quán)利要求8所述的裝置,其特征在于,該算術(shù)單元使用該分支指令的該指令指針計(jì)算該第二目標(biāo)地址預(yù)測(cè)。10.如權(quán)利要求2所述的裝置,其特征在于,該類型包括一該分支指令是否為直接類型分支指令的說明。11.如權(quán)利要求10所述的裝置,其特征在于,若該分支指令類型為一直接分支指令且該第一目標(biāo)地址預(yù)測(cè)與第二目標(biāo)地址預(yù)測(cè)不相匹配,則該分支控制邏輯控制地址選擇邏輯選取該第二目標(biāo)地址預(yù)測(cè)。12.如權(quán)利要求2所述的裝置,其特征在于,該類型包括一該分支指令是否為閑接類型分支指令的說明。13.如權(quán)利要求12所述的裝置,其特征在于,若該分支指令類型為一閑接分支指令,則該分支控制邏輯控制地址選擇邏輯不去選取該第二目標(biāo)地址預(yù)測(cè)。14.如權(quán)利要求13所述的裝置,其特征在于,該第二分支預(yù)測(cè)裝置包括一分支目標(biāo)緩沖器,以快取先前執(zhí)行的數(shù)個(gè)間接分支指令的數(shù)個(gè)分支目標(biāo)地址。15.如權(quán)利要求2所述的裝置,其特征在于,該類型包括一該分支指令是否為條件類型分支指令的說明。16.如權(quán)利要求15所述的裝置,其特征在于,若該分支指令類型為一條件分支指令且該第一目標(biāo)地址預(yù)測(cè)與第二目標(biāo)地址預(yù)測(cè)不相匹配,則該分支控制邏輯控制地址選擇邏輯選取該第二目標(biāo)地址預(yù)測(cè)。17.如權(quán)利要求15所述的裝置,其特征在于,該第一與第二分支預(yù)測(cè)裝置提供該條件分支指令的一第一與一第二方向預(yù)測(cè)至該分支控制邏輯,以預(yù)測(cè)該條件分支指令是否將被采用。18.如權(quán)利要求17所述的裝置,其特征在于,還包括第二比較邏輯,對(duì)應(yīng)于該第一與第二分支預(yù)測(cè)裝置,用以將該條件分支指令的該第一與第二方向預(yù)測(cè)作比較。19.如權(quán)利要求18所述的裝置,其特征在于,若該第二方向預(yù)測(cè)預(yù)期該條件分支指令將不被采用,則該分支控制邏輯控制地址選擇邏輯選取該條件分支指令的一下個(gè)循序指令的一指令指針,以作為該提取地址。20.如權(quán)利要求19所述的裝置,其特征在于,若該第二方向預(yù)測(cè)預(yù)期該條件分支指令將不被采用且該第一與第二方向預(yù)測(cè)不相匹配,則該分支控制邏輯控制地址選擇邏輯選取該下個(gè)循序指令指針。21.如權(quán)利要求2所述的裝置,其特征在于,若該第一目標(biāo)地址預(yù)測(cè)與第二目標(biāo)地址預(yù)測(cè)不相匹配,則該分支控制邏輯接著根據(jù)該分支指令類型控制地址選擇邏輯,以選取該第二目標(biāo)地址預(yù)測(cè)作為提取地址。22.如權(quán)利要求1所述的裝置,其特征在于,該分支指令類型包括一x86分支指令類型。23.如權(quán)利要求1所述的裝置,其特征在于,該第一分支預(yù)測(cè)裝置接收該指令高速緩存的提取地址,并響應(yīng)該提取地址而提供該第一目標(biāo)地址預(yù)測(cè)。24.如權(quán)利要求23所述的裝置,其特征在于,該第一分支預(yù)測(cè)裝置響應(yīng)該提取地址而提供該第一目標(biāo)地址預(yù)測(cè),不論是否有一分支指令存在于指令高速緩存的一第三快取線中,該第三指令快取線在選取該第一指令快取線后被選取。25.如權(quán)利要求23所述的裝置,其特征在于,該第一分支預(yù)測(cè)裝置在該指令譯碼邏輯譯碼該分支指令前,便提供該第一目標(biāo)地址預(yù)測(cè)。26.如權(quán)利要求1所述的裝置,其特征在于,該第一分支預(yù)測(cè)裝置包括一分支目標(biāo)地址高速緩存,由該指令高速緩存的提取地址作索引。27.如權(quán)利要求1所述的裝置,其特征在于,該第一分支預(yù)測(cè)裝置包括一假想調(diào)用/返回堆棧。28.一種在一處理器中使用的分支預(yù)測(cè)裝置,其特征在于,包括第一與第二分支預(yù)測(cè)裝置,對(duì)一分支指令作第一與第二預(yù)測(cè);比較邏輯,對(duì)應(yīng)于該第一與第二分支預(yù)測(cè)裝置,組態(tài)為提供一該第一與第二預(yù)測(cè)的比較;指令譯碼邏輯,組態(tài)為譯碼該分支指令,并產(chǎn)生該分支指令的一類型;以及控制邏輯,對(duì)應(yīng)于該指令譯碼邏輯,使處理器依該第一預(yù)測(cè)進(jìn)行分支;其中該控制邏輯基于分支指令的該類型與該比較,以該第二預(yù)測(cè)選擇性地覆蓋該第一預(yù)測(cè)。29.如權(quán)利要求28所述的裝置,其特征在于,該指令譯碼邏輯在該第一分支預(yù)測(cè)裝置作第一預(yù)測(cè)后,譯碼該分支指令并產(chǎn)生該分支指令類型。30.如權(quán)利要求28所述的裝置,其特征在于,該第二分支預(yù)測(cè)裝置作第二預(yù)測(cè),以響應(yīng)該指令譯碼邏輯譯碼該分支指令。31.如權(quán)利要求28所述的裝置,其特征在于,該第二分支預(yù)測(cè)裝置包括一分支歷史表,用以在該第二預(yù)測(cè)中提供一方向預(yù)測(cè),該方向預(yù)測(cè)用以預(yù)測(cè)該分支指令是否將被采用。32.如權(quán)利要求28所述的裝置,其特征在于,若該分支類型是一條件分支類型,則該比較邏輯將該第一與第二預(yù)測(cè)中的第一與第二方向預(yù)測(cè)做比較。33.如權(quán)利要求32所述的裝置,其特征在于,若該第一與第二方向預(yù)測(cè)不相匹配,則該控制邏輯以該第二預(yù)測(cè)覆蓋該第一預(yù)測(cè)。34.如權(quán)利要求28所述的裝置,其特征在于,該比較邏輯將該第一與第二預(yù)測(cè)中的第一與第二目標(biāo)地址做比較。35.如權(quán)利要求34所述的裝置,其特征在于,若該第一與第二目標(biāo)地址不相匹配,則該控制邏輯基于分支指令的該類型,通過使處理器分支至該第二目標(biāo)地址,而以該第二預(yù)測(cè)選擇性地覆蓋該第一預(yù)測(cè)。36.一種流水線化處理器,其特征在于,包括一假想分支預(yù)測(cè)裝置,用以對(duì)一分支指令作一假想預(yù)測(cè);控制邏輯,對(duì)應(yīng)于該假想分支預(yù)測(cè)裝置,依據(jù)該假想預(yù)測(cè)使該處理器進(jìn)行分支;指令譯碼邏輯,組態(tài)為譯碼該分支指令,并產(chǎn)生該分支指令的一類型;以及一非假想分支預(yù)測(cè)裝置,對(duì)應(yīng)于該指令譯碼邏輯,用以對(duì)該分支指令作一非假想預(yù)測(cè);其中該控制邏輯接著依據(jù)該非假想預(yù)測(cè)與該分支指令類型,選擇性地使處理器進(jìn)行分支。37.如權(quán)利要求36所述的處理器,其特征在于,還包括一指令高速緩存,對(duì)應(yīng)于一用以接收一提取地址的地址總線(addressbus),該提取地址選取一指令快取線以送至該指令譯碼邏輯。38.如權(quán)利要求37所述的處理器,其特征在于,該假想分支預(yù)測(cè)裝置作該假想預(yù)測(cè),即使有可能并無分支指令存在于該指令快取線中。39.如權(quán)利要求36所述的處理器,其特征在于,該非假想分支預(yù)測(cè)裝置作該非假想預(yù)測(cè),以響應(yīng)指令譯碼邏輯譯碼該分支指令。40.一種流水線化處理器,其特征在于,包括一分支目標(biāo)地址高速緩存,在譯碼一指令前提供該指令的一假想目標(biāo)地址;一目標(biāo)地址計(jì)算器,在該指令的該譯碼后計(jì)算該指令的一非假想目標(biāo)地址;一比較器,對(duì)應(yīng)于該分支目標(biāo)地址高速緩存及該目標(biāo)地址計(jì)算器,用于比較該假想與非假想目標(biāo)地址;其中該處理器分支至該假想目標(biāo)地址,其中若該假想與非假想目標(biāo)地址比較后不相匹配,且該指令的類型屬于一第一指令類型集合,則該處理器接著分支至該非假想目標(biāo)地址。41.如權(quán)利要求40所述的處理器,其特征在于,該第一指令類型集合包括一返回指令類型。42.如權(quán)利要求40所述的處理器,其特征在于,該第一指令類型集合包括一程序計(jì)數(shù)器相關(guān)分支指令類型。43.如權(quán)利要求40所述的處理器,其特征在于,該第一指令類型集合包括一條件分支指令類型。44.一種流水線化處理器,其特征在于,包括一分支目標(biāo)地址高速緩存,提供一假想方向,以指出一假設(shè)的條件分支指令是否將被采用,該假想方向在譯碼該假設(shè)的條件分支指令前便已提供;一分支歷史表,提供該指令的一非假想方向,該非假想方向是在該假設(shè)的條件分支指令的該譯碼后才提供;一比較器,對(duì)應(yīng)于該分支目標(biāo)地址高速緩存及該分支歷史表,用以比較該假想與非假想方向;其中若假想與非假想方向比較后不相匹配,則該處理器便分支至該指令后一下個(gè)循序指令指針,如果該非假想方向指出該指令將不被采用的話。45.一種在一流水線化處理器中用以分支的方法,其特征在于,包括產(chǎn)生一分支指令的一假想目標(biāo)地址;將處理器分支至該假想目標(biāo)地址;在該分支后譯碼該分支指令;在該譯碼后產(chǎn)生該分支指令的一非假想目標(biāo)地址;確定該分支指令的一分支類型;確定該假想與非假想目標(biāo)地址是否匹配;以及若假想與非假想目標(biāo)地址不相匹配,即依據(jù)該分支類型,選擇性地分支至非假想目標(biāo)地址。46.如權(quán)利要求45所述的方法,其特征在于,還包括確定該分支類型是否為一程序計(jì)數(shù)器相關(guān)類型分支指令;其中若假想與非假想目標(biāo)地址不相匹配,且若該分支類型是一程序計(jì)數(shù)器相關(guān)類型分支指令,則該選擇性地分支包括分支至非假想目標(biāo)地址。47.如權(quán)利要求45所述的方法,其特征在于,還包括確定該分支類型是否為一返回類型分支指令;其中若假想與非假想目標(biāo)地址不相匹配,且若該分支類型是一返回類型分支指令,則該選擇性地分支包括分支至非假想目標(biāo)地址。48.如權(quán)利要求45所述的方法,其特征在于,還包括確定該分支類型是否為一條件類型分支指令;其中若假想與非假想目標(biāo)地址不相匹配,且若該分支類型是一條件類型分支指令,則該選擇性地分支包括分支至非假想目標(biāo)地址。49.如權(quán)利要求45所述的方法,其特征在于,還包括確定該分支類型是否為一間接類型分支指令;其中若該分支類型是一間接類型分支指令,則該選擇性地分支包括不分支至非假想目標(biāo)地址。50.如權(quán)利要求45所述的方法,其特征在于,還包括在譯碼該分支指令后產(chǎn)生該分支指令的一非假想方向預(yù)測(cè);若該非假想方向預(yù)測(cè)指出該分支指令將不被采用,則分支至該分支指令后一下個(gè)循序指令指針。全文摘要本發(fā)明涉及一種具有一主要(primary)預(yù)測(cè)裝置與一次要(secondary)預(yù)測(cè)裝置的分支預(yù)測(cè)裝置,該次要預(yù)測(cè)裝置依據(jù)所譯碼分支指令的類型選擇性地覆蓋該主要預(yù)測(cè)裝置。主要預(yù)測(cè)裝置中的分支目標(biāo)地址高速緩存在譯碼指令前,依據(jù)一指令高速緩存的提取地址假想地預(yù)測(cè)一分支目標(biāo)地址與方向,若該假想方向預(yù)測(cè)會(huì)被采用,處理器即分支至該假想目標(biāo)地址。在流水線中稍后,譯碼邏輯譯碼指令并確定分支指令類型,像是分支指令是否為條件分支、返回指令、程序計(jì)數(shù)器相關(guān)類型的分支、間接分支等等。依照分支的類型,若主要與次要預(yù)測(cè)不相匹配,處理器即根據(jù)次要預(yù)測(cè)進(jìn)行分支,而覆蓋掉根據(jù)主要預(yù)測(cè)所采用的分支。文檔編號(hào)G06F9/38GK1397880SQ0211855公開日2003年2月19日申請(qǐng)日期2002年4月27日優(yōu)先權(quán)日2001年5月4日發(fā)明者葛蘭·亨利,湯瑪斯·麥當(dāng)勞申請(qǐng)人:智慧第一公司