高性能指令緩存系統(tǒng)和方法【專利摘要】一種高性能指令緩存系統(tǒng)和方法,應用于處理器領域時能在處理器核執(zhí)行指令前,將所述指令填充到所述處理器核能直接訪問的高速存儲器中,幾乎使所述處理器核每次都能在所述高速存儲器中獲取到需要的指令,達到極高的緩存命中率?!緦@f明】高性能指令緩存系統(tǒng)和方法【
技術領域:
】[0001]本發(fā)明涉及計算機,通訊及集成電路領域?!?br>背景技術:
】[0002]通常緩存的作用是將更低級存儲器中的部分內(nèi)容復制在其中,使這些內(nèi)容能被更高級存儲器或處理器核快速存取,以保證流水線的持續(xù)運行。[0003]現(xiàn)行緩存的尋址都基于以下方式,用地址中的索引段尋址讀出標簽存儲器中的標簽與地址中的標簽段進行匹配;用地址中索引段與塊內(nèi)位移段共同尋址讀出緩存中的內(nèi)容。如果從標簽存儲器中讀出的標簽與地址中的標簽段相同,那么從緩存中讀出的內(nèi)容有效,稱為緩存命中。否則,如果從標簽存儲器中讀出的標簽與地址中的標簽段不相同,稱為緩存缺失,從緩存中讀出的內(nèi)容無效。對于多路組相聯(lián)的緩存,同時對各個路組并行進行上述操作,以檢測哪個路組緩存命中。命中路組對應的讀出內(nèi)容為有效內(nèi)容。若所有路組都為缺失,則所有讀出內(nèi)容都無效。緩存缺失之后,緩存控制邏輯將低級存儲媒介中的內(nèi)容填充到緩存中。[0004]緩存缺失可分為三類狀況:強制缺失、沖突缺失和容量缺失。在現(xiàn)有緩存結(jié)構(gòu)中,除了預取成功的小部分內(nèi)容外,強制缺失是不可避免的。但是,現(xiàn)有的預取操作會帶來不小的代價。此外,雖然多路組相聯(lián)緩存可以降低沖突缺失,但受制于功耗及速度限制(如因為多路組相聯(lián)緩存結(jié)構(gòu)要求將所有路組由同一索引尋址的內(nèi)容及標簽同時讀出并比較),路組數(shù)難以超過一定數(shù)目。[0005]現(xiàn)代的緩存系統(tǒng)通常由多路組相連的多層次緩存構(gòu)成。新的緩存結(jié)構(gòu),如:犧牲緩存、跟蹤緩存以及預取等都是基于上述基本緩存結(jié)構(gòu)并改善上述結(jié)構(gòu)。然而,隨著日漸擴大的處理器/存儲器速度鴻溝,現(xiàn)行體系結(jié)構(gòu),特別是多種緩存缺失,已成為是制約現(xiàn)代處理器性能提升的最嚴重瓶頸。[0006]本發(fā)明提出的方法與系統(tǒng)裝置能直接解決上述或其他的一個或多個困難?!?br/>發(fā)明內(nèi)容】[0007]本發(fā)明提出一種用于輔助處理器核運行的方法,所述處理器核連接一個包含可執(zhí)行指令的第一存儲器、一個比第一存儲器速度更快的第二存儲器和一個比第二存儲器速度更快的第三存儲器。所述方法包括:對正被從第二存儲器填充到第三存儲器的指令進行審查,從而提取出至少包括分支信息的指令信息;根據(jù)提取出的指令信息建立復數(shù)條軌道;根據(jù)復數(shù)條指令軌道中的一條或多條軌道將至少一條或多條指令可能被處理器核執(zhí)行的指令從第一存儲器填充到第二存儲器;根據(jù)復數(shù)條指令軌道中的一條或多條軌道將至少一條或多條指令在被處理器核執(zhí)行前從第二存儲器填充到第三存儲器,使得處理器核能從第三存儲器獲取所述至少一條或多條指令。[0008]對于本領域?qū)I(yè)人士,還可以在本發(fā)明的說明、權利要求和附圖的啟發(fā)下,理解、領會本發(fā)明所包含其他方面內(nèi)容。[0009]有益效果[0010]本發(fā)明所述系統(tǒng)和方法可以為數(shù)字系統(tǒng)使用的緩存結(jié)構(gòu)提供基本的解決方案。與傳統(tǒng)緩存系統(tǒng)僅在緩存缺失后才填充的機制不同,本發(fā)明所述的系統(tǒng)和方法在處理器執(zhí)行一條指令之前就對指令緩存進行填充,可以避免或充分地隱藏強制缺失。本發(fā)明所述系統(tǒng)和方法在本質(zhì)上提供了一個全相聯(lián)的緩存結(jié)構(gòu),避免了或充分隱藏了沖突缺失和容量缺失。此外,本發(fā)明所述的系統(tǒng)和方法避免了在讀取緩存的時延關鍵路徑上的標簽匹配,所以能運行在較高的時鐘頻率;由于本發(fā)明所述的系統(tǒng)和方法需要的匹配操作次數(shù)較少,并且缺失率較低,因此功耗也比傳統(tǒng)緩存系統(tǒng)顯著降低。對于本領域?qū)I(yè)人士而言,本發(fā)明的其他優(yōu)點和應用是顯見的?!緦@綀D】【附圖說明】[0011]圖1是本發(fā)明所述的指令預取的處理器環(huán)境。[0012]圖2A是本發(fā)明所述主動表的實施例。[0013]圖2B是本發(fā)明所述主動表的另一個實施例。[0014]圖3A是本發(fā)明所述指令存儲器的實施例。[0015]圖3B是本發(fā)明所述指令行、指令塊及相應存儲單元之間關系的實施例。[0016]圖4A是本發(fā)明所述掃描器的一個實施例。[0017]圖4B是本發(fā)明所述掃描器的另一個實施例。[0018]圖4C是本發(fā)明所述掃描器對產(chǎn)生的地址進行篩選的一個實施例。[0019]圖4D是本發(fā)明所述掃描器中目標地址判斷的實施例。[0020]圖4E是本發(fā)明所述判斷邏輯的一個改進實施例。[0021]圖5A是本發(fā)明所述軌跡點格式的實施例。[0022]圖5B是根據(jù)本發(fā)明技術方案使用軌道表建立新軌道的方法的一個實施例。[0023]圖5C是本發(fā)明所述軌道表的一個實施例。[0024]圖是確定基地址寄存器值更新指令位置的實施例。[0025]圖5E是本發(fā)明所述通過寄存器額外的讀端口獲得基地址寄存器值的實施例。[0026]圖5F是本發(fā)明所述采用時分復用的方式獲得基地址寄存器值的實施例。[0027]圖5G是本發(fā)明所述通過旁路路徑獲得基地址寄存器值的實施例。[0028]圖5H是本發(fā)明所述通過專供數(shù)據(jù)預取使用的額外寄存器堆獲得基地址寄存器值的實施例。[0029]圖51是本發(fā)明所述包含微型主動表的軌道表實施例。[0030]圖6A是本發(fā)明所述循跡器讀指針移動的實施例。[0031]圖6B是本發(fā)明所述確定計算間接分支目標地址的時間點的一個實施例。[0032]圖7A是本發(fā)明所述相關表的一個實施例。[0033]圖7B是本發(fā)明所述相關表的一個實施例。[0034]圖8A是本發(fā)明所述指令讀緩沖與指令存儲器、軌道表等配合為處理器核提供指令的一個實施例。[0035]圖SB是本發(fā)明所述指令讀緩沖與指令存儲器、軌道表等配合為處理器核提供指令的一個改進實施例。[0036]圖SC是本發(fā)明所述指令讀緩沖與指令存儲器、軌道表等配合為處理器核提供指令的又一個改進實施例。[0037]圖9A是本發(fā)明所述同時為處理器核提供下一指令及分支目標指令的一個實施例。[0038]圖9B是本發(fā)明所述同時為處理器核提供下一指令及分支目標指令的另一個實施例。[0039]圖10是本發(fā)明所述包含用于存儲特定程序的存儲單元的指令存儲器的實施例。[0040]圖1lA是本發(fā)明所述用于選擇指令塊的匹配器的實施例。[0041]圖1lB是本發(fā)明所述用于選擇指令塊的匹配器的另一個實施例。[0042]圖12A是根據(jù)本發(fā)明所述技術方案進行指令預取的實施例。[0043]圖12B是根據(jù)本發(fā)明技術方案對指令塊操作的一個實施例?!揪唧w實施方式】[0044]以下結(jié)合附圖和具體實施例對本發(fā)明提出的高性能緩存系統(tǒng)和方法作進一步詳細說明。根據(jù)下面說明和權利要求書,本發(fā)明的優(yōu)點和特征將更清楚。需說明的是,附圖均采用非常簡化的形式且均使用非精準的比例,僅用以方便、明晰地輔助說明本發(fā)明實施例的目的。[0045]需說明的是,為了清楚地說明本發(fā)明的內(nèi)容,本發(fā)明特舉多個實施例以進一步闡釋本發(fā)明的不同實現(xiàn)方式,其中,該多個實施例是列舉式并非窮舉式。此外,為了說明的簡潔,前實施例中已提及的內(nèi)容往往在后實施例中予以省略,因此,后實施例中未提及的內(nèi)容可相應參考前實施例。[0046]雖然該發(fā)明可以以多種形式的修改和替換來擴展,說明書中也列出了一些具體的實施圖例并進行詳細闡述。應當理解的是,【發(fā)明者】的出發(fā)點不是將該發(fā)明限于所闡述的特定實施例,正相反,【發(fā)明者】的出發(fā)點在于保護所有基于由本權利聲明定義的精神或范圍內(nèi)進行的改進、等效轉(zhuǎn)換和修改。同樣的元器件號碼可能被用于所有附圖以代表相同的或類似的部分。[0047]此外,在本說明書中以包含處理器核的緩存系統(tǒng)為例進行說明,但本發(fā)明技術方案也可以被應用于包含任何合適的處理器(Processor)的緩存系統(tǒng)。例如,所述處理器可以是通用處理器(GeneralProcessor)中央處理器(CPU)、微控制器(MCU)、數(shù)字信號處理器(DSP)、圖象處理器(GPU)、片上系統(tǒng)(SOC)、專用集成電路(ASIC)等。[0048]圖1是本發(fā)明所述的指令預取的處理器環(huán)境100。如圖1所示,處理器環(huán)境100包含一個填充器102、一個主動表(Activelist)104、一個掃描器108、一個軌道表(Tracktable)110、一個循跡器(Tracker)114、一個指令存儲器(InstructionMemory)106、一個指令讀緩沖(InstructionReadBuffer)112和一個處理器核116(CPUCore)。應當理解的是,這里列出各種部件的目的是為了便于描述,還可以包含其他部件,而某些部件可以被省略。這里的各種部件可以分布在多個系統(tǒng)中,可以是物理上存在的或是虛擬的,可以是硬件實現(xiàn)(如:集成電路)、軟件實現(xiàn)或由硬件和軟件組合實現(xiàn)。[0049]指令存儲器106和指令讀緩沖112可以包含任何合適的存儲設備,如:寄存器(register)或寄存器堆(registerfile)、靜態(tài)存儲器(SRAM)、動態(tài)存儲器(DRAM)、閃存存儲器(flashmemory)、硬盤、固態(tài)磁盤(SolidStateDisk)以及任何一種合適的存儲器件或未來的新形態(tài)存儲器。指令存儲器106可以作為系統(tǒng)的一個緩存工作,或當有其他緩存存在時作為一級緩存工作;且可以被分割成復數(shù)個被稱為存儲塊(MemoryBlock)的存儲片段的用于存儲處理器核116要訪問的數(shù)據(jù),如在指令塊(InstructionBlock)中的指令。[0050]當處理器核116執(zhí)行一條指令時,處理器核116首先需要從更低層次的存儲器中讀入指令。在這里,存儲器的層次指的是存儲器與處理器核116之間的接近程度。越接近處理器核116的層次越高。此外,一個高層次的存儲器通常比低層次的存儲器速度快但容量小。[0051]填充器102根據(jù)主動表104提供的地址從更低層次的存儲器獲取指令或指令塊并填充到指令存儲器106中,以備處理器核116讀取。在這里,術語“填充(Fill)”表示將指令從較低層次的存儲器移動到較高層次的存儲器中,術語“存儲器訪問”(MemoryAccess)表示處理器核116從存儲器(指令存儲器106或指令緩沖)中讀取指令。[0052]本發(fā)明所述的指令地址(InstructionAddress)指的是指令在主存儲器中的存儲地址,即可以根據(jù)該地址在主存儲器中找到這條指令;而數(shù)據(jù)地址(DataAddress)指的是數(shù)據(jù)在主存儲器中的存儲地址,即可以根據(jù)該地址在主存儲器中找到這個數(shù)據(jù)。在此為簡單明了起見,均假設虛擬地址等于物理地址,對于需要進行地址映射的情況,本發(fā)明所述方法也可適用。主動表104中的表項與指令存儲器106中的存儲行(MemoryLine)一一對應。主動表104中的每個表項存儲了一個指令行地址(InstructionLineAddress)與一個行號(LineNumber,LN)的匹配對,指明了該指令行地址對應的指令行存儲在指令存儲器106中的哪個存儲行中。本發(fā)明所述的行號指的就是存儲行在指令存儲器106中的位置??梢酝ㄟ^將掃描器108審查、計算得到的分支目標指令地址與主動表104中存儲的指令行地址匹配確定該分支目標指令是否已經(jīng)存儲在指令存儲器106中。如果分支目標信息所在的指令行尚未被填充到指令存儲器106中,那么在將該指令行填充到指令存儲器106中的同時,在主動表104中建立相應的指令行地址與行號碼的匹配對。本發(fā)明所述的匹配(Match),指的是對兩個值進行比較,當兩者相同或相等時為‘匹配成功(Match)’,否則為‘匹配不成功(NotMatch),。[0053]在本發(fā)明中,分支指令(BranchInstrutrion)或分支點(BranchPoint)指的是任何適當?shù)哪軐е绿幚砥骱?16改變執(zhí)行流(ExecutionFlow)(如:非按順序執(zhí)行一條指令)的指令形式。分支指令或分支源(BranchSource)指一條進行分支操作的指令,分支源地址(BranchSouceAddress)可以是分支指令本身的指令地址;分支目標(BranchTarget)指的是分支指令造成的分支轉(zhuǎn)移所轉(zhuǎn)向的目標指令,分支目標地址(BranchTargetAddress)可以指當分支指令的分支轉(zhuǎn)移成功發(fā)生時轉(zhuǎn)移進入的地址,也就是分支目標指令的指令地址;當前指令可以指當前正在被處理器核執(zhí)行或獲取的指令;當前指令塊可以指含有當前正被處理器執(zhí)行的指令的指令塊。[0054]掃描器108可以對從指令存儲器106填充到指令讀緩沖112的每一條指令進行審查,并提取出某些信息,如:指令類型、指令源地址和分支指令的分支增量(BranchOffset),并基于這些信息計算出分支目標地址。例如,指令類型可以包括條件分支指令、無條件分支指令和其他指令等。指令類別還可以包括條件分支指令的子類別,如相等時分支轉(zhuǎn)移、大于時分支轉(zhuǎn)移等。在某些情況下,可以認為無條件分支指令是條件分支指令的一種特例,即條件總是成立。此外,還可以包括其他信息。掃描器108也將上述信息及地址送到其他模塊,如主動表104和軌道表110。[0055]指令讀緩沖112中存儲了至少一個包含當前指令在內(nèi)的一段連續(xù)指令的指令塊(InstructionBlock)。每一個指令塊有一個塊號BNX(BlockNumber)。指令塊與指令存儲器116的指令行可以含有相同數(shù)目或不同數(shù)目條指令。如果指令塊含有與存儲器指令行同樣數(shù)目的指令,即一個指令塊等于一個指令行,則塊號與行號相同。如果一個存儲器指令行含有復數(shù)個指令塊,則塊號BNX是在行號LN比最低位(Lsb)再低一位的位置處(lesssignificant)加上至少一個地址位;此地址位指出該指令塊在一個指令行中的位置,也即同一行中的塊地址。例如一個行號LN為‘111’的指令行含有兩個指令塊,其中占據(jù)低位地址的指令塊的塊號BNX為‘1110’;占據(jù)高位地址的指令塊的塊號BNX為‘1111’。若指令讀緩沖112中存儲了多個指令塊,則指令讀緩沖112中除了存儲了當前指令塊之外,還可存儲當前指令塊按順序地址的下一指令塊。[0056]軌道表110含有復數(shù)個軌跡點(TrackPoint)。一個軌跡點是軌道表中的一個表項,可含有至少一條指令的信息,比如指令類別信息、分支目標地址等。在本發(fā)明中軌跡點本身的軌跡表地址與該軌跡點所代表指令的指令地址相關(Correspond);而分支指令軌跡點中含有分支目標的軌跡表地址,且該軌跡表地址與分支目標指令地址相關。與指令緩沖中112—系列連續(xù)指令所構(gòu)成的一個指令塊相對應的復數(shù)個連續(xù)的軌跡點稱為一條軌道。該指令塊與相應的軌道由同一個塊號指示。軌道表含有至少一條軌道。一條軌道中的總的軌跡點數(shù)可以等于軌道表110中一行中的表項總數(shù)。軌道表110也可以有其它的組織形式。[0057]可以用第一地址(BNX)和第二地址(BNY)來表示軌跡點(指令)在軌道表中的位置信息;其中第一地址表示該軌跡點對應指令的塊號(指向軌道表中一條軌道及指令緩沖器中相應的一個指令塊),第二地址表示該軌跡點(及對應指令)在該軌道(存儲塊)中的相對位置(偏移量,AdressOffset)。一套第一地址及第二地址對應軌道表中的一個軌跡點,即可以根據(jù)一套第一地址及第二地址從軌道表中找到對應的軌跡點。如果該軌跡點的類型代表一條分支指令,可以根據(jù)內(nèi)容中含的第一地址(目標塊號)確定分支目標的軌道,并根據(jù)第二地址(偏移量)確定目標軌道中的一個特定的軌跡點(表項)。這樣,軌道表就成為一個以軌道表項地址對應分支源地址、表項內(nèi)容對應分支目標地址來代表一條分支指令的表。[0058]相應地,掃描器108將提取出存儲到指令讀緩沖112中指令的指令信息,并將這些信息存儲到軌道表110由這些指令對應的第一地址指出的軌道中由第二地址指出的表項。如果該指令是分支指令時則計算其中分支指令的分支目標指令地址送到主動表104匹配以得到分支目標指令所在存儲行的行號(LN)。如果分支目標地址未與存在主動表104中的任何地址匹配,則該分支目標地址被送到填充器102從低層存儲器讀出指令行。同時主動表中的存儲行替換邏輯分配一個存儲行號(LN)給該指令行;該指令地址高位被存進主動表104中該行號指示的表項,填充器102取得的指令行被填充到該行號指示的存儲行,并將該行號產(chǎn)生的第一地址及從指令地址抽取的第二地址寫進軌道表。[0059]軌道表110中的軌道和指令讀緩沖112中的存儲塊一一對應,且都由同一指針指向。處理器核116將要執(zhí)行的任何指令,都可以在執(zhí)行前被填充到指令讀緩沖112中。為了在一條軌道中建立與下一條軌道的聯(lián)系,在每條軌道代表最后一條指令的軌跡點后再設一個結(jié)束軌跡點,其中存放順序執(zhí)行下一條軌道(指令塊)的第一地址。如果指令讀緩沖112中可以存儲多個指令塊,在當前指令塊被執(zhí)行時,把順序執(zhí)行下一個指令塊也取到指令讀緩沖中以備處理器核106讀取執(zhí)行。下一指令塊的指令地址可以用當前指令塊的指令地址加上一個指令塊的地址長度來求得。該地址如前述被送到主動表104匹配,獲得的指令塊被填進指令緩沖112由指令緩沖112替換邏輯所指示的指令塊;且該指令塊及相應的軌道由匹配獲得的BNX標示。同時該BNX被存進當前軌道的結(jié)束軌跡點。新存進指令讀緩沖112的下一指令塊中的指令也被掃描108掃描,提取信息填充由該BNX指出的軌道如前所述。[0060]循跡器114的讀指針指向軌道表110中當前指令所在軌道中位于當前指令之后的第一個分支指令軌跡點;或在該軌道上當前指令后沒有分支軌跡點的情況下指向該軌道的結(jié)束軌跡點。循跡器114的讀指針由第一地址指針和第二地址指針組成,其中第一地址指針的值為當前指令所在指令塊的塊號,第二指針指向該軌道上當前指令后的第一個分支指令軌跡點或結(jié)束軌跡點。由該讀指針指示的軌跡點內(nèi)容中的分支目標第一地址被用于對指令存儲器106尋址,讀出包含該分支目標指令在內(nèi)的指令塊,送到掃描器108進行審查。掃描器108對從指令存儲器106送來的指令塊進行審查,提取出相應指令信息、計算分支指令的分支目標地址并暫存。指令緩沖替換邏輯指定一個指令塊及相應的軌道以備分支目標指令塊填充。[0061]若循跡器114指向的分支指令沒有發(fā)生分支轉(zhuǎn)移,則循跡器114的讀指針指向該分支指令后的第一個分支指令軌跡點,或在該分支指令后的軌跡點中沒有分支指令軌跡點的情況下指向該軌道的結(jié)束軌跡點。處理器核讀取分支指令后的順序指令執(zhí)行。[0062]若循跡器114指向的分支指令成功發(fā)生分支轉(zhuǎn)移,則將上述從指令存儲器106讀出的分支目標指令塊存儲到指令讀緩沖112中緩沖替換邏輯指定的指令塊中,并在軌道表110的相應軌道中填入掃描器108已產(chǎn)生的新軌道信息。此時上述分支目標第一地址和第二地址成為新的循跡器地址指針,指向軌道表中的分支目標對應的軌跡點。該新循跡器地址指針也指向新填充的分支指令塊,使其成為新的當前指令塊。處理器核從新的當前指令塊中用指令地址(PC)選出需要的指令。此后循跡器114移動讀指針指向新的當前指令塊對應軌道中該分支目標指令之后的第一個分支指令軌跡點,或在該分支目標指令后的軌跡點中沒有分支指令軌跡點的情況下指向該軌道的結(jié)束軌跡點。[0063]若循跡器114指向的是軌道中的結(jié)束軌跡點,循跡器114的讀指針更新為該最后軌跡點中的位置內(nèi)容值,即指向下一軌道的第一個軌跡點,從而指向新的當前指令塊。之后循跡器114移動讀指針指向新的當前指令塊對應軌道中的第一個分支指令軌跡點,或在該軌道沒有分支指令軌跡點的情況下指向該軌道的結(jié)束軌跡點。依次重復上述過程,即可在處理器核116執(zhí)行指令前將該指令填充到指令讀緩沖112中,使得處理器核116在對該指令進行取指時不需要等待,從而提高處理器性能。[0064]圖2A是本發(fā)明所述主動表的實施例。在本實施例中主動表的主體部分由數(shù)據(jù)地址尋址器202構(gòu)成。[0065]數(shù)據(jù)地址尋址器202中包含多個表項(entry)204。每個表項204包含一個存儲器、標志位V位220、標志位A位222、標志位U位224和一個比較器。所有比較結(jié)果被送入編碼器206產(chǎn)生匹配表項號,即塊號??刂凭€214用于輸入讀寫狀態(tài)控制信號。所有V位220初始值均為零。所有A位222的值由外部激活(Active)信號通過A位信號輸入線228寫入。[0066]寫地址指針(WritePointer)210指向的表項地址由循環(huán)自增裝置(WrapAroundIncrement)218產(chǎn)生,循環(huán)自增裝置218的輸出最大值為最大表項號,輸出為此值時再自增一次則輸出為零,循環(huán)自增繼續(xù)。如果寫地址指針210當前指向表項的V位和A位的值均為零,則表示該表項可以被新數(shù)據(jù)寫入,待寫入完成后,循環(huán)自增裝置218的輸出值增加一,寫地址指針210指向下一個表項;如果這兩個值中至少有一個為一,則表示該表項當前不能被新數(shù)據(jù)寫入,此時寫入循環(huán)自增裝置218的輸出值增加一,寫地址指針210指向下一個表項,繼續(xù)進行判斷。[0067]寫入時,通過寫入數(shù)據(jù)總線208輸入的寫入數(shù)據(jù)先與所有表項所存儲的數(shù)據(jù)進行比較,如有匹配,則從匹配表項號輸出線216輸出匹配表項號,且不進行寫入操作;如沒有匹配,則寫入數(shù)據(jù)被寫入由寫地址指針210指向的表項,同時該表項中V位值被置為‘0’,該表項的表項號通過匹配表項號輸出線216輸出,寫地址指針210指向下一個表項;讀出時,讀地址線212指向的表項的內(nèi)容通過讀出數(shù)據(jù)總線230被讀出,表項號通過匹配表項號輸出線216輸出,同時該表項中V位也被置為‘I’。[0068]標志位U位224表示使用情況。當寫地址指針210指向一個表項204時,該表項U位224被置零。當一個表項204被讀取時,其U位224被置一。循環(huán)自增裝置218產(chǎn)生的寫地址指針210指向一個新的表項時,U位會先被讀取,若此時U位為零,則該表項可被替換,寫地址指針210停在該表項以備寫入數(shù)據(jù),若U位為一,則將寫地址指針210指向下一個表項。一種置換方法是另增一窗口指針226負責將U位置零,所述窗口指針226所指表項比寫地址指針210提前N個表項。通過寫地址指針210的值模加N即可得到窗口指針226的值。這N個表項即成為一個窗口,該窗口指向?qū)懙刂分羔?10與窗口指針226間的表項。在寫地址指針210移動N個表項時間內(nèi)所經(jīng)過的未被讀取之表項可被置換。改變N值即改變窗口大小,從而改變替換率。另外一個置換方法是U位為復數(shù)位。寫地址指針210或窗口指針226將表項置零,每次讀取給表項U位加一。每次寫之前將U位讀出與預設值做比較,若小于所述預設值,則該表項可被置換;若大于或等于所述預設值,則將寫地址指針210移向下一個表項。[0069]圖2B是本發(fā)明所述主動表的另一個實施例250。根據(jù)本發(fā)明技術方案,可以將指令行地址與主動表中存儲的行地址進行匹配,從而得到與該行地址匹配成功的行的行號。在本實施例中,該匹配被分為兩部分進行,即主動表104由兩部分組成。主動表104的第一部分258用于匹配指令行地址252中的高位254,第二部分260用于匹配指令行地址252中的低位256。這兩部分都由內(nèi)容尋址存儲器構(gòu)成。[0070]主動表第一部分258的表項數(shù)目與主動表第二部分260的存儲塊數(shù)目相等,兩者一一對應。主動表第二部分260的每個存儲塊包含若干個表項,每個表項對應一個指令行。行地址的高位部分存儲在主動表第一部分258中,行地址的低位部分存儲在主動表第二部分260中。當該完整行地址與輸入行地址相同時,才匹配成功。此外,將主動表第一部分258匹配輸出的表項號與第二部分260匹配輸出的表項號拼接,就可以得到與指令行地址對應行號。[0071]在本實施例中,假設主動表第一部分258包含4個表項,那么主動表第二部分260中包含4個存儲塊,每個存儲塊與主動表第一部分258中的一個表項對應。對于主動表第一部分258包含其他數(shù)目的表項的情況也與此類似。此外,根據(jù)本發(fā)明技術方案,主動表第二部分260中的存儲塊與指令讀緩沖106中的存儲塊一一對應,且對應存儲塊中的表項也--對應。[0072]當掃描器108計算得到分支目標地址或下一指令塊地址時,相應的行地址252被送到主動表104進行匹配。首先將行地址高位254與主動表第一部分258中存儲的行地址高位進行匹配。若在主動表第一部分258中匹配不成功,則表示該行地址對應的指令行尚未存儲在指令存儲器106中,因此根據(jù)圖2A所述替換算法分配一個表項,并在主動表第二部分260中該表項對應的存儲塊中也根據(jù)圖2A所述替換算法分配一個表項。將輸入的行地址高位254存儲到主動表第一部分258的所述表項中,并將輸入的行地址低位256存儲到主動表第二部分260的所述表項中,輸出行號262送往軌道表110。同時,該行地址被送到填充器102進行指令行預取。等到取到該指令行后,將該指令行存儲到指令存儲器106中與主動表第二部分260所述表項對應的存儲行中,完成指令填充。[0073]若在主動表第一部分258中匹配成功,則將該行地址的低位送到主動表第二部分260中與該匹配成功的第一部分表項對應的存儲塊中進行匹配。若主動表第二部分260中匹配不成功,則表示該行地址對應的指令行尚未存儲在指令存儲器106中,因此根據(jù)圖2A所述替換算法分配一個表項,并將輸入的行地址低位256存儲到主動表第二部分260的所述表項中,輸出行號262送往軌道表110。同時,該行地址被送到填充器102進行指令行預取。等到取到該指令行后,將該指令行存儲到指令存儲器106中與主動表第二部分260所述表項對應的存儲行中,完成指令填充。若在主動表第二部分260中也匹配成功,則表示該行地址對應的指令行已經(jīng)存儲在指令存儲器106中,因此直接輸出行號262送往軌道表110。[0074]根據(jù)本發(fā)明技術方案,當循跡器`114讀指針指向一個分支軌跡點時,該分支軌跡點的分支目標指令塊號(第一地址)被讀出。與該塊號對應的行號264被送到指令存儲器106。行號264中與主動表第二部分260對應的行號部分266被用于從指令存儲器106的各個存儲塊中尋址以選出對應的指令行,行號264中與主動表第一部分258對應的行號部分268被用于從各個存儲塊輸出的指令行中選出對應的指令行270。指令行270就是與輸入行號264對應的指令行。[0075]在具體實現(xiàn)中,也可以先由行號264中與主動表第一部分258對應的行號部分268將指令存儲器106中對應的存儲塊激活,再由行號264中與主動表第二部分260對應的行號部分266從該存儲塊中選出指令行270,這樣就不需要同時訪問指令存儲器106中的所有存儲塊,從而降低功耗。[0076]為便于描述,此后實施例的主動表中均以圖2A實施例中的主動表為例進行說明。需要說明的是,將這些實施例中的主動表替換成圖2B實施例中的主動表,也可以實現(xiàn)同樣的功能。[0077]回到圖1,當從掃描器108送來的地址在主動表104中匹配不成功時,該地址被送到填充器102等待從更低層次存儲器取得該地址對應的指令行,同時在主動表104中分配一個表項存儲該指令行對應的行地址,從而形成一個塊號/地址對。本發(fā)明所述的指令行的行地址指的是該指令行起始指令的地址。本發(fā)明所述的指令存儲器在邏輯上被分為復數(shù)個存儲塊,每個存儲塊對應主動表中的一個表項,存儲了該表項中行地址對應的指令行。當該行地址對應的指令行被取來后,填充器102將其送到指令存儲器106寫入以該行地址對應的塊號索引的存儲塊中。[0078]圖3A是本發(fā)明所述指令存儲器的實施例300。在本實施例中指令存儲器由指令存儲單元302和輸出寄存器304構(gòu)成。當填充器102對指令存儲單元302進行寫操作時,從主動表104來的行號被送到寫地址端口310用來索引被寫入的存儲行,指令行通過寫端口306寫入該存儲行。循跡器114讀指針指向的分支軌跡點中存儲的分支目標軌跡點的第一地址(即塊號)被送到指令存儲單元302的讀地址端口作為讀地址,將對應存儲行中的指令行中的一個指令塊從讀端口(Readport)308讀出,該指令塊即分支目標軌跡點對應指令所在的指令塊。該指令塊被存儲在輸出寄存器304中以供處理器核116訪問。此時,指令存儲單元302可以被指令循跡器114送來的其他塊號進行索引。此時,指令存儲單元302可以根據(jù)新的地址(可以是隨機地址)進行尋址以找到對應的指令塊,而輸出寄存器304則可以根據(jù)順序地址尋址,依次輸出存儲在其中的指令塊中的指令。對于處理器核116送來的尋址地址而言,除了發(fā)生分支轉(zhuǎn)移的情況下,下一指令的地址均是當前指令地址的順序后一地址,因此采用圖3A實施例的結(jié)構(gòu)(一個單端口存儲器配合一個能容納一個指令塊的輸出寄存器)可以同時輸出分支目標指令和順序執(zhí)行的下一指令,從而實現(xiàn)雙端口存儲器的功能。[0079]根據(jù)本發(fā)明技術方案,由于一個指令行至少包含一個指令塊,因此指令存儲單元302中的存儲行的容量也可以比輸出寄存器304的容量大,而指令讀緩沖112中的存儲塊的容量與輸出寄存器304的容量一致。[0080]圖3B是本發(fā)明所述指令行、指令塊及相應存儲單元之間關系的實施例350。在圖3B中,假設指令地址352的長度為32位,即最高位為第31位,最低位為第O位,且每一個指令地址對應一個字節(jié)(Byte)。因此,指令地址352的最低兩位354(即第1、0位)對應一個指令字(InstructionWord)中的4個字節(jié)。在假設本實施例中,一個指令塊包含了4條指令,因此偏移量356表示對應指令在指令塊中的位置。這樣,指令地址的高位358(即第31到第4位)表示了指令塊的起始地址,即指令塊地址。[0081]為了便于說明,本實施例中一個指令行對應2個連續(xù)的指令塊。這樣,除去指令塊地址358最低位362得到的指令塊地址高位(即第31到第5位)就是指令行地址360,指令塊地址358中的最低位362則可以表示該指令塊位于對應指令行中的位置。[0082]根據(jù)本發(fā)明技術方案,可以建立指令塊地址與塊號(BNX)、指令行地址與行號(LNX)的映射關系。在本實施例中,假設主動表中可以容納64個行號,那么對應的行號364共有6位,即圖中行號364顯示的第10到第5位。需要注意的是,行號364的值并不一定等于指令地址352中第10到第5位的值。又因為64個指令行對應128個指令塊,因此對應的塊號368共有7位(即圖中塊號368顯示的第10到第4位,其中第10到第5位的值與行號364的值相同)。在此,由于一個指令行中的兩個指令塊是連續(xù)的,因此一個行號對應的兩個塊號(即第一地址)也相應連續(xù)。這樣,塊號366的最低位368的值就是對應指令塊地址358中的最低位362。同樣地,本發(fā)明所述的第二地址370就是指令在指令塊中的塊內(nèi)偏移量356,兩者的值相同。[0083]這樣,由于每次從指令存儲器106輸出的指令塊可以填滿指令讀緩沖112的一個存儲塊,因此當指令讀緩沖112中包含某個指令塊時,并不需要同時包含該指令塊對應的整個指令行。即指令讀緩沖112中可以包含對應于同一個指令行的兩個指令塊,也可以只包含其中的一個指令塊,因此在存儲空間方面具有更好的靈活性。此外,還可以將主動表104的容量減小至原來的1/2。對于一個指令行包含更多指令塊的情況,也可以據(jù)此類推。[0084]回到圖1,掃描器108可以對從指令存儲器106送來的每一條指令進行審查,并提取出某些信息,如:指令類型、指令地址、分支指令的分支目標信息。舉例而言,指令類型可以包括條件分支指令、無條件分支指令和其他指令等。具體地,可以認為無條件分支指令是條件分支指令的一種特例,即條件總是成立。因此,指令類型可以分為分支指令和其他指令等。分支源地址可以指分支指令本身的地址,分支目標地址可以指當分支指令的分支轉(zhuǎn)移成功發(fā)生時將轉(zhuǎn)移進入的地址。此外,還可以包括其他信息。[0085]在本實施例中,從指令存儲器106輸出的所有指令都被掃描器108審查,提取出指令類型并輸出到軌道表110,同時計算出分支指令的分支目標地址。所述目標地址可以由包含該分支指令的指令塊起始地址加上該分支指令的偏移量,并再加上分支轉(zhuǎn)移到目標指令的距離得到。該目標地址的高位部分(如:圖3A中指令塊地址358)被用于與主動表104中的內(nèi)容匹配以獲得該分支目標指令對應軌跡點的行號,并通過拼接指令塊地址的最低位(如:圖3A中指令塊地址最低位362)形成第一地址或塊號,低位部分(如:圖3A中塊內(nèi)偏移量354)就是該分支目標指令對應軌跡點的第二地址,即該分支目標指令在其行中的偏移量。[0086]對于結(jié)束軌跡點,則只需要將指令塊地址加上指令塊長度,就可以得到下一指令塊的指令塊地址,之后可以將該下一指令塊地址視為目標地址按同樣方法進行匹配。[0087]如果該目標地址的高位部分在主動表104中匹配成功,那么主動表104輸出該高位地址對應的塊號到軌道表110;如果該目標地址的高位部分在主動表104中匹配不成功,那么主動表104就把這個值通過總線144送到填充器102以實現(xiàn)填充操作,同時分配一個塊號給該高位地址,并輸出到軌道表110。[0088]在本發(fā)明中,掃描器108解析從指令存儲器106輸出的指令塊,若判斷所述指令塊中包含分支指令,則計算該分支指令的目標地址,產(chǎn)生地址。具體的,所述掃描器108通過如下過程解析所述指令塊:所述掃描器108獲取指令塊中的OP(指令類型信息,標示指令為分支指令還是非分支指令),得出是否包含分支指令的信息。若判斷得到(或者說經(jīng)過上述解析得出)所述指令塊中包含分支指令,則計算該分支指令的目標地址。[0089]此外,所述掃描器108還可以獲取從指令存儲器106輸出的指令塊的地址,在所述指令塊的地址上增加一偏移量,產(chǎn)生地址。在此,所述偏移量為一固定值,優(yōu)選的,其為相鄰兩個指令塊的地址偏差量。由此,所述掃描器108所產(chǎn)生的地址將為與所述指令塊相鄰地址的指令塊,特別的,為所述指令塊下一地址的指令塊。[0090]這樣,所述掃描器108產(chǎn)生的地址包括:所述掃描器108解析從指令存儲器106輸出的指令塊,若判斷所述指令塊中包含分支指令,則計算該分支指令的目標地址,產(chǎn)生一地址(其中用語“一”指代一個、一些或者一部分);及所述掃描器108獲取所述指令塊的地址,在所述指令塊的地址上增加一偏移量,產(chǎn)生另一地址。[0091]接下去,將提供實現(xiàn)上述多種方式產(chǎn)生地址的掃描器的具體實現(xiàn)方式。如圖4A所示,所述掃描器具體通過如下方式產(chǎn)生地址:所述掃描器通過譯碼器判斷當前指令為分支指令還是非分支指令,若判斷得到所述指令為分支指令,則通過一加法器將當前指令地址加上分支轉(zhuǎn)移距離,得到分支指令的目標地址;所述掃描器通過一加法器將當前指令所在的塊地址加上塊偏移量(即相鄰兩個信息塊的地址偏差量),得到當前指令塊的相鄰指令塊的地址。[0092]圖4B是本發(fā)明所述掃描器的一個實施例400。在本實施例中,掃描器108對接收到的指令塊404進行審查,提取出其中各條指令的指令類型并計算分支目標地址。為了便于說明,在此以一個指令塊包含兩條指令為例,即指令塊404中包含指令406(對應較低的指令地址)和指令408(對應較高的指令地址)。一個指令塊包含更多指令的情況也類似。掃描器108的主體部分402包含譯碼器410、412和加法器414、416。其中譯碼器410和加法器414對應指令406,譯碼器412和加法器416對應指令408。譯碼器對輸入的指令進行譯碼,輸出指令類型(如:指令類型432、434)和分支轉(zhuǎn)移距離(BranchOffset)(如:分支轉(zhuǎn)移距離420、422),其中指令類型被直接送往軌道表110寫入相應位置,而分支指令對應的分支轉(zhuǎn)移距離則被送到加法器進行加法操作。假設指令406和408都是分支指令,則以加法器414為例,其輸入包括分支轉(zhuǎn)移距離420、當前指令塊地址418和常數(shù)‘O’。根據(jù)本發(fā)明技術方案,分支指令的分支目標地址等于該指令所在指令塊的塊地址、該指令在指令塊中的偏移量和分支轉(zhuǎn)移距離三者之和。而分支指令406是指令塊中的第一條指令,其在指令塊中的偏移量為‘0’,因此加法器414對這三個輸入相加得到的輸出結(jié)果就是對應分支指令406的分支目標地址424。同理,分支指令408是指令塊中的第二條指令,且如圖3B實施例所述,兩條相鄰指令間的地址相隔‘4’,因此加法器416的輸入包括分支轉(zhuǎn)移距離422、當前指令塊地址418和常數(shù)‘4’,其輸出就是對應分支指令408的分支目標地址426。分支目標地址424和426被送到選擇器428經(jīng)選擇后依次送往主動表104進行匹配,從而得到對應的塊號并通過總線430送往軌道表110依次寫入相應位置。[0093]在本實施例中用到的指令塊地址418是從主動表104中讀出并被直接送往掃描器108中加法器的。也可以在掃描器108中增加用于存儲當前指令塊地址的寄存器,這樣就主動表104就不需要實時地送出指令塊地址。[0094]根據(jù)本發(fā)明技術方案,可以由掃描器108對從指令存儲器106輸出的指令掃描,得到指令的類型和分支指令的分支目標地址??梢宰鲆粋€簡單判斷,以確定分支目標是否位于分支指令(分支源)本身所處的指令塊或相鄰的指令塊(這些指令塊的塊號已知),從而減少主動表104的匹配次數(shù)。[0095]根據(jù)本發(fā)明技術方案,當?shù)玫揭恢噶顗K地址(獲取指令塊時,便可很容易的得到該指令塊的地址,關于此點,本說明書不再贅述)時,該指令塊中每條指令的地址、該指令塊的長度(即首條指令與末條指令之間地址偏差量)都是易于得到的。那么確認指令地址(在此,也就是產(chǎn)生的地址,或者更進一步的,指分支目標地址和下一指令塊地址)是否指向被比對指令塊(在此,也就是當前指令塊和下一指令塊)時,即可通過指令中的偏移量是否落入指令塊中的長度來確定;也可通過指令中的地址是否為被比對指令塊中的指令的地址來確定。當然,在本申請的其他實施例中還可通過其他方式予以確定,本申請不再贅述。[0096]接下去,將提供實現(xiàn)上述多種方式產(chǎn)生地址的掃描器的具體實現(xiàn)方式。如圖4C所示,所述掃描器通過如下方式進行篩選:所述掃描器通過一加法器將當前指令的塊內(nèi)偏移量(即當前指令地址相對于當前指令所在的塊的地址的偏移量)加上分支指令的分支轉(zhuǎn)移距離,得出一總偏移量,根據(jù)該總偏移量判斷得到的分支指令目標地址是否指向當前指令塊或者當前指令塊的下一指令塊,從而對產(chǎn)生的地址予以篩選。[0097]此外,還可以與除當前指令塊和下一指令塊以外更多的指令塊進行對比,從而對產(chǎn)生的地址進一步篩選。其方法是根據(jù)分支偏移量(BranchOffset)與分支源的第二地址(BNY)相加得到的和來選取寄存在容易讀取的寄存器中的已知指令塊塊號。原理如下:將分支轉(zhuǎn)移距離與第二地址之和中與第二地址等長的低位部分舍棄(truncate),剩余的高位部分就是分支目標所在指令塊與當前指令塊(分支源所在指令塊)之間以塊的數(shù)目為單位的距離。如高位為0,則分支目標在當前指令塊;如高位為+1,則分支目標在當前指令塊順序后一指令塊;如高位為-1,則分支目標在當前指令塊順序前一指令塊;如此類推。在此當前指令塊表示掃描正在掃描的指令塊;順序后一指令塊表示一個指令塊其指令地址比當前指令塊的地址大一個指令塊地址長度的地址;順序前一指令塊表示一個指令塊其地址比當前指令塊的地址小一個指令塊地址長度的地址。[0098]圖4D是本發(fā)明所述掃描器中目標地址判斷的實施例440。在圖4D中,為了便于描述,掃描器108中只顯示了與本實施例說明相關的內(nèi)容,省略了其他部分或部件。在本實施例中,與圖4B相同,假設掃描器108—次對輸入的指令塊404中的兩條指令進行審查,因此一次最多可能計算得到兩個分支目標地址,這兩個分支目標地址被分別送到兩個相同的判斷邏輯442和444中進行判斷。本實施例中掃描器108的模塊402與圖4B實施例中的模塊402相同,輸出的指令類型被直接送往軌道表110寫入相應位置,在圖4D中沒有顯示。在此,僅對分支目標地址是否位于含當前指令塊的連續(xù)三個指令塊中的判斷舉例進行說明,對分支目標地址是否位于包含當前指令塊在內(nèi)的連續(xù)更多個指令塊中的判斷的方法也類似。[0099]在圖4D中,寄存器448存儲了當前指令塊對應的塊號,寄存器446存儲了當前指令塊之前的一個指令塊對應的塊號,寄存器450存儲了當前指令塊之后的一個指令塊對應的塊號,塊號本身不一定是連續(xù)的但相應指令塊的地址是連續(xù)的。這樣,只要掃描器108計算得到的分支目標地址位于這三個連續(xù)指令塊的起止地址之間,就可以不需要訪問主動表104,直接從寄存器446,448,與450得到對應的塊號,而不在該起止地址之間的分支目標地址則需要被送到主動表104進行匹配操作。[0100]以判斷邏輯442為例,計算模塊452的輸入包括分支目標地址424和當前指令塊的塊地址418,輸出為選擇信號458。計算模塊452可以由一個減法器實現(xiàn)。分支目標地址減去當前指令塊塊地址后得到的差值就是分支目標地址與當前指令塊第一條指令之間間隔的地址差值。將該差值與第二地址等長的低位部分舍棄,以剩余的高位作為選擇信號458控制選擇器460來選擇寄存在寄存器中的指令塊塊號。其連接方式是高位為-1選擇寄存器446中的塊號;高位為O選擇寄存器448中的塊號;高位為+1選擇寄存器450中的塊號;高位非以上的值則將分支目標地址經(jīng)選擇器446送往主動表104查找相應塊號,同時選擇器460選擇主動表輸出。選擇器460輸出的塊號462被填充到軌道表中由分支源地址指定的軌跡點(表項)。[0101]在本實施例中,假設主動表104每次只能對一個分支目標地址進行匹配,因此,如果掃描器108—次審查發(fā)現(xiàn)兩條分支指令,且這兩條分支指令的分支目標指令都不在上述連續(xù)三個指令塊中,則需要通過選擇器428選擇,依次將分支目標地址送到主動表104匹配。而主動表104將匹配得到或分配的塊號430依次送到這兩個判斷邏輯中的選擇器460供選擇。[0102]需要注意的是,本實施例僅是根據(jù)本發(fā)明技術方案給出的分支目標地址歸類的一種具體實現(xiàn)方式,判斷邏輯442、444也可以由其他方式實現(xiàn)。例如,可以將分支目標地址計算功能也在計算模塊中實現(xiàn),如圖4E所示。[0103]圖4E是本發(fā)明所述判斷邏輯的一個改進實施例470。在本實施例中,主動表104、寄存器446、448、450與圖4D實施例相同,也假設包含兩個相同的歸類邏輯472和474。以歸類邏輯472為例,計算模塊472的輸入包括當前指令塊的塊地址418、分支指令在該指令塊內(nèi)的偏移量478和該分支指令分支轉(zhuǎn)移到目標指令的距離420。[0104]與之前實施例所述相同,在計算模塊476中,將當前指令塊塊地址418、當前分支指令在指令塊中的地址偏移量(BNY)478和該分支指令分支轉(zhuǎn)移到目標指令的距離(BranchOffset)420三者相加就可以得到分支目標地址424。將當前分支指令在指令塊中的地址偏移量478和該分支指令分支轉(zhuǎn)移到目標指令的距離420兩者相加就可以得到圖4D實施例中所述的地址差值。地址差值依前舍棄低位后作為選擇信號458用于選擇適當?shù)闹噶顗K塊號作為塊號462輸出。其余操作與上例同。[0105]在圖4D實施例中,寄存器446、448和450是移位寄存器。當指令循跡器第一地址指針指向一個新的當前指令塊時,寄存器的內(nèi)容必須從一個寄存器搬到另一個寄存器??梢杂靡粋€有多個表項的循環(huán)緩沖(circularbuffer)實現(xiàn)本實施例中的存儲器480,并增加一個當前指令塊指針478、一個起點指針和一個終點指針。當前指令塊指針478指向的表項含有當前指令塊。當前指令塊的位置改變時,各表項存儲的內(nèi)容不移動,而是指針478在移動。起點指針及終點指針指示地址連續(xù)的單數(shù)個或復數(shù)個指令塊的起點與終點。[0106]現(xiàn)假定循環(huán)緩沖480中的表項446,指針地址為‘_1’,存儲了前一指令塊塊號;表項448,指針地址為‘0’,存儲了當前指令塊塊號;表項450,指針地址為‘+1’,存儲了下一指令塊塊號?,F(xiàn)當前指令塊指針478數(shù)值為0,指向表項448;起點指針數(shù)值為‘-1’,指向表項446;終點指針數(shù)值為‘+I’,指向表項450。在這個時刻,表項448含的指令塊號代表的指令塊被掃描。如果判斷邏輯472判斷器所檢測的分支指令的目標在當前指令塊(選擇信號458為‘0’),控制選擇器選擇表項448的內(nèi)容作為塊號462輸出。在下一時刻,假設此時表項450含的指令塊號代表的指令塊被掃描,則當前指令塊指針478數(shù)值為‘+I’,指向表項450;如果判斷邏輯472判斷器所檢測的分支指令的目標在當前指令塊(選擇信號458應該為‘0’),這時選擇器460會仍如前選擇表項448的內(nèi)容作為塊號462輸出;但這是錯的,因為現(xiàn)在當前塊是由表項450代表,與前一時刻相比有了一個表項的偏差。將當前指令塊指針478的值加到原來的選擇器460的控制信號上就可以補償這個偏差。即現(xiàn)在控制信號458是當前分支指令在指令塊中的地址偏移量‘0’和該分支指令分支轉(zhuǎn)移到目標指令的距離420兩者相加所得的地址差值舍棄低位后,再在高位上加上當前指令塊指針478數(shù)值作為選擇信號458。選擇信號458的值經(jīng)上述補償后為‘0+1’,即等于‘1’,該值選擇表項450中的指令塊塊號作為塊號462輸出。此后當前指令塊的下一個指令塊的塊號被填進表項446,終點指針指向新的終點表項446。由于起點指針原指向的表項的內(nèi)容被替換成下一指令塊的塊號,因此起點指針下移一個表項指向起點表項448。在其他的例子中,若起點指針原指向的表項的內(nèi)容沒有被替換,則可以保持起點指針不變。[0107]假如當前指令塊指針的移動距離或移動方向與上例不同,只要沒有出起點指針及終點指針指示的范圍(起點指針值<當前指令塊指針478值<終點指針值),都可以依上例從循環(huán)緩沖480中獲得需要的指令塊塊號作為塊號462輸出。如果超出了范圍,則超范圍檢測邏輯(為明了起見圖上未顯現(xiàn))會控制將指令塊地址424送往主動表104查找相應的指令塊塊號;選擇器460也會被控制將主動表104的輸出作為塊號462送往軌道表存儲。[0108]根據(jù)本發(fā)明所述技術方案,可以將目標指令塊暫存在指令存儲器106的輸出寄存器304中,當分支轉(zhuǎn)移成功發(fā)生、該目標指令塊成為當前指令塊時才將其填充到指令讀緩沖112中;同樣地,可以將掃描器108提取出的指令信息及主動表104輸出的塊號信息暫存在寄存器中,當分支轉(zhuǎn)移成功發(fā)生時才將這些信息填充到軌道表110中。[0109]當新軌道被建立時,可以將新建軌道放置在軌道表中的一個可被替換的行中。如果所述新軌道包含一個分支軌跡點(對應一條分支源指令),那么在所述行中的一個表項內(nèi)建立一個分支軌跡點??梢愿鶕?jù)分支源地址確定所述分支點在軌道表110中的行及表項的位置。舉例而言,可以根據(jù)分支源地址的高位地址確定行,并根據(jù)分支源地址的偏移量確定該行中的一個表項。[0110]此外,行中的每個表項或軌跡點可以包含一種內(nèi)容格式,所述格式包括類型區(qū)域、第一地址(XADDR)區(qū)域和第二地址(YADDR)區(qū)域。此外還可以包含其他區(qū)域。類型區(qū)域可以表示軌跡點對應的指令的類型。如之前所述,指令類型可以包括條件分支指令、無條件分支指令和其他指令。XADDR區(qū)域也被稱為第一維地址或簡稱為第一地址。YADDR區(qū)域也被稱為第二維地址或簡稱為第二地址。[0111]此外,新軌跡點的內(nèi)容可以對應分支目標指令。換句話說,分支軌跡點的內(nèi)容存儲了分支目標地址信息。舉例而言,軌道表110中的對應與一條分支目標指令的特定的行的相應塊號被作為第一地址存儲到所述分支軌跡點的內(nèi)容中。此外,所述分支目標的在其所在的指令塊中的偏移量被作為第二地址存儲到所述分支軌跡點的內(nèi)容中。所述偏移量可以根據(jù)分支源指令地址和分支轉(zhuǎn)移位移(距離)計算得到。[0112]軌道表中所有軌道的結(jié)束軌跡點都被標記為一個特殊的軌跡點,其內(nèi)容包含了一個必定分支轉(zhuǎn)移的類別信息,以及按順序執(zhí)行指令時的下一指令所在的下一軌道的位置信息。由于該下一指令對應于下一軌道的第一個軌跡點,因此該特殊軌跡點的內(nèi)容可以只包含類型區(qū)域和第一地址(XADDR)信息,或除了包含類型區(qū)域和第一地址(XADDR)信息,還包含一個常數(shù)(如:‘O’)。[0113]圖5A是本發(fā)明所述軌跡點格式的實施例500。在本實施例中,對于非結(jié)束軌跡點,其軌跡點格式可以包括指令類型502、第一地址504和第二地址506,其中一條軌道的至少兩個軌跡點的指令類型能被同時讀出。因此,在實際存儲時,可以將軌道中所有非結(jié)束軌跡點的指令類型存儲在一起,而將這些非結(jié)束軌跡點的第一地址和第二地址存儲在一起。對于結(jié)束軌跡點,其軌跡點格式可以包括指令類型502、第一地址504和值為‘0’的常數(shù)508。同樣地,結(jié)束軌跡點的指令類型502也可以和非結(jié)束軌跡點的指令類型存儲在一起,而第一地址504和常數(shù)508則可以存儲在該軌道所有非結(jié)束軌跡點的第一地址、第二地址之后。此外,由于結(jié)束軌跡點的第二地址就是常數(shù)508的值‘0’,因此可以不存儲該常數(shù),當循跡器114指向結(jié)束軌跡點時直接產(chǎn)生第二地址‘0’。[0114]圖5B是根據(jù)本發(fā)明技術方案使用軌道表建立新軌道的方法的一個實施例。在本實施例中,BNX代表指令塊所在存儲塊的塊號。由于指令讀緩沖112是指令存儲器106的一個子集,而軌道表110中的軌道與指令讀緩沖112中的存儲塊一一對應,軌道表110中各個塊號代表的指令塊也是指令存儲器106的子集,因此內(nèi)容尋址存儲器(CAM)536包含了每條軌道對應的塊號信息。通過將塊號在內(nèi)容尋址存儲器536中進行匹配就可以確定該塊號對應的軌道號,從而在軌道表110中找到對應的軌道。[0115]如圖5B所示,一個已建立的軌道522(用塊號BNXO表示)可以包含三條分支指令或分支點524、526和528。當審查分支點524時,主動表中匹配得到或分配的目標塊號是BNX7,那么一條對應BNX7的新軌道530在下一個可用行被建立起來用于存儲分支點524的目標指令,且軌道表110中的該塊號(即塊號BNX7)被記錄在分支點524中作為第一地址。類似地,當審查分支點526時,主動表中匹配得到或分配的目標塊號是BNX9,那么在軌道表110中另一條對應BNX9的新軌道532在下一個可用行被建立起來,且該塊號(即塊號BNX9)被記錄在分支點526中;當審查分支點528時,主動表中匹配得到或分配的目標塊號是BNX1,那么在軌道表110中又一條對應BNXl的新軌道534在下一個可用行被建立起來,且該塊號(即塊號BNX1)被記錄在分支點528中。這樣,單條軌道中對應全部分支點的新軌道可以被建立起來。[0116]根據(jù)本發(fā)明技術方案,每條分支指令的軌跡點中存儲的第二地址就是該分支指令的分支目標指令在該分支目標指令所在指令塊中的偏移量。[0117]圖5C是本發(fā)明所述軌道表的一個實施例。在圖5C中,省略了與本實施例說明內(nèi)容無關的部分或部件。假設掃描器108可以一次對一個指令塊中的全部指令進行審查以提取出指令類型554,但主動表104無法一次對所有分支指令的分支目標地址進行匹配,即無法將所有匹配得到或分配的目標塊號552—起送到軌道表110內(nèi)存儲目標塊號的存儲器548中。為了減少對軌道表110中存儲器的寫次數(shù),可以不將這些信息直接寫入軌道表110內(nèi)存儲指令類型的存儲器550和存儲目標塊號的存儲器548中,而是先存儲到臨時寄存器542中。臨時寄存器542的容量與軌道表110中一行(即一條軌道,包含存儲器550與548的一行)的容量相同,等到臨時寄存器542中內(nèi)容寫滿后再一起寫入軌道表110內(nèi)的存儲器550和548中。[0118]在圖5C中,從掃描器108來的指令塊中所有指令的指令類型554被同時寫入臨時寄存器542中,目標塊號552被依次寫入臨時寄存器542中。當該指令塊全部指令的相關信息都被寫入臨時寄存器542后,再被一起寫入存儲器550和548中。根據(jù)本發(fā)明技術方案,若當前產(chǎn)生的是間接尋址分支指令的分支目標地址對應的塊號,則該塊號不需要被存儲到軌道表110中,而是可以被直接旁路作為選擇器544的輸出。除此以外,如果循跡器114讀指針的第一地址指針指向的塊號所對應的軌道已經(jīng)被存儲在存儲器550和548中,那么選擇器546和選擇器544分別選擇存儲器550和548輸出的指令類型和目標塊號送到循跡器114;否則選擇器546和選擇器544分別選擇臨時寄存器542輸出的指令類型和目標塊號送至IJ循跡器114。這樣,在一條軌道中的全部軌跡點的內(nèi)容尚未寫滿時就可以根據(jù)需要讀出其中的內(nèi)容。[0119]需要注意的是,在圖5C中,存儲器550和存儲器548可以是完全獨立的兩個存儲器,也可以是屬于同一個物理存儲器中的邏輯意義上的兩個不同存儲器。類似地,在具體實現(xiàn)中,臨時寄存器542也可以與上述兩個存儲器一起位于在同一物理存儲器中。此外,將臨時寄存器542放置在軌道表110之內(nèi),僅僅是為了便于說明。在邏輯布局或物理實現(xiàn)上,臨時寄存器542也可以被放置在軌道表110之外。這是本領域?qū)I(yè)人士,在本發(fā)明的說明、權利要求和附圖的啟發(fā)下,能夠理解、領會的。[0120]上述各個實施例采用直接尋址的方式計算分支目標地址并實現(xiàn)指令預取。然而,也可以使用間接尋址的方式。當采用間接尋址方式時,需要首先確定寄存器值(如:基地址寄存器值),從而計算分支目標地址。由于寄存器的值是因指令執(zhí)行的結(jié)果而改變的,因此對于一條間接尋址分支指令來說,在最后更新其基地址寄存器值的指令已計算得到新值、但尚未將該值寫入基地址寄存器時可以根據(jù)需要通過旁路(bypass)路徑取得該新值進行目標地址的計算及后續(xù)操作。圖是確定基地址寄存器值更新指令位置的實施例560。[0121]在圖中,軌道562包含了由掃描器108和主動表104送來的信息所構(gòu)成的一系列軌跡點。在本實施例中,一條軌道由16個軌跡點組成。一個軌跡點對應一條指令。假設第6號軌跡點566和第14號軌跡點574各對應一條直接尋址分支指令,第10號軌跡點570對應一條以BPl寄存器為基地址寄存器的間接尋址分支指令。在掃描器108對該指令塊指令審查時,可以找到該指令塊中所有更新BPl寄存器值的指令,即第3號軌跡點564、第8號軌跡點568和第12號軌跡點572對應的指令。因此可以確定在間接尋址分支指令570之前最后更新基地址寄存器BPl的指令對應軌跡點568,該軌跡點568與間接尋址分支指令570相隔兩個軌跡點,即相隔兩條指令。這樣,可以將該相隔指令的條數(shù)(即數(shù)值‘_2’)記錄在間接尋址分支軌跡點570的內(nèi)容中。[0122]根據(jù)本發(fā)明所述技術方案,當軌跡點566對應的分支指令未發(fā)生分支轉(zhuǎn)移時,循跡器114的第二地址讀指針指向軌跡點570。此時讀出軌跡點570的內(nèi)容,其中包含了相隔指令的條數(shù)‘2’。這樣,當處理器當前執(zhí)行的指令在該軌道中的位置值(即程序計數(shù)器PC的低位地址偏移量)比循跡器114的第二地址讀指針的值小于等于‘2’時,該基地址寄存器的值被更新,此時可以從處理器核116中取得基地址寄存器BPl的值,進行分支目標地址計算及后續(xù)操作。[0123]根據(jù)本發(fā)明技術方案,可以通過多種途徑獲得該基地址寄存器值,如:通過處理器核116中寄存器額外的讀端口獲得、采用時分復用讀口的方式從處理器核116中寄存器獲得、通過處理器核116中的旁路路徑獲得、或通過一個專供數(shù)據(jù)預取使用的額外寄存器堆獲得。[0124]現(xiàn)有處理器體系結(jié)構(gòu)中一般由運算單元計算產(chǎn)生基地址寄存器值。在通常結(jié)構(gòu)中,寄存器堆中存儲了包含基地址寄存器在內(nèi)的各個寄存器的值。寄存器堆輸出的寄存器值或其他來源的數(shù)值構(gòu)成處理器核中運算單元的一個輸入值,而寄存器堆輸出的寄存器值或其他來源的數(shù)值構(gòu)成運算單元的一個輸入值。運算單元對兩個輸入值進行運算并將結(jié)果寫回寄存器堆。為了便于說明,本實施例以運算單元有兩個輸入和一個輸出為例,對于更多或更少輸入及更多輸出的情況也類似。在這里,寄存器堆輸出的兩個寄存器值可以是同一個寄存器的值,也可以是不同寄存器的值。而運算結(jié)果可以寫回與這兩個寄存器值來源相同的寄存器,也可以寫回不同的寄存器。[0125]圖5E是本發(fā)明所述通過寄存器額外的讀端口獲得基地址寄存器值的實施例。在本實施例中,運算單元575對輸入值577和579進行運算并將結(jié)果581寫回寄存器堆587的過程與通常處理器體系結(jié)構(gòu)相同。不同的是,寄存器堆587比通常體系結(jié)構(gòu)中的寄存器堆多一個讀端口589,這樣,當?shù)竭_計算數(shù)據(jù)尋址地址的時間點時就可以通過該額外的讀端口將對應的基地址寄存器值經(jīng)讀端口589讀出,以計算數(shù)據(jù)尋址地址。[0126]圖5F是本發(fā)明所述采用時分復用的方式獲得基地址寄存器值的實施例。在本實施例中,運算單元575對輸入值577和579進行運算并將結(jié)果581寫回寄存器堆的過程與通常處理器體系結(jié)構(gòu)相同。不同的是,寄存器堆的輸出577、579還被送到選擇器591經(jīng)選擇后作為基地址寄存器值593輸出。這樣,當基地址寄存器值更新完成后,若運算單元575對應之后指令的操作數(shù)輸入中至少有一個非來源于寄存器堆,則由輸入值對應的寄存器讀端口輸出該基地址寄存器值,或若至少有一個輸入就是該基地址寄存器的值,則寄存器值583或585就是該基地址寄存器的值。可以經(jīng)選擇器591選擇該基地址寄存器值作為輸出593,以計算數(shù)據(jù)尋址地址。[0127]圖5G是本發(fā)明所述通過旁路路徑獲得基地址寄存器值的實施例。在本實施例中,運算單元575對輸入值577和579進行運算并將結(jié)果581寫回寄存器堆的過程與通常處理器體系結(jié)構(gòu)相同。不同的是,運算結(jié)果581不但被寫回寄存器堆,還被通過旁路路徑595送出。這樣,當運算單元575當前正在進行更新基地址寄存器值的運算時,其運算結(jié)果就是更新后的基地址寄存器值,因此通過旁路路徑595送出的值就是所需的基地址寄存器值,從而用于計算數(shù)據(jù)尋址地址。此旁路方法需要知道運算結(jié)果581出現(xiàn)的正確時間點。這個時間點可以由圖實施例中的指令間隔數(shù)確定。以圖所述情況為例,指令間隔數(shù)為‘_2’,那么當處理器核116執(zhí)行到該數(shù)據(jù)訪問指令之前2條指令時,運算單元575輸出的運算結(jié)果就是所需的基地址寄存器值。[0128]圖5H是本發(fā)明所述通過專供數(shù)據(jù)預取使用的額外寄存器堆獲得基地址寄存器值的實施例。在本實施例中,運算單元575對輸入值577和579進行運算并將結(jié)果581寫回寄存器堆的過程與通常處理器體系結(jié)構(gòu)相同。不同的是,本實施例中增加了一個額外的寄存器堆597。寄存器堆597中包含了原有寄存器堆中全部基地址寄存器的值,是原有寄存器堆的影子(shadow)寄存器堆。所有對原有寄存器堆中基地址寄存器的寫入值都會被同時寫入寄存器堆597的對應寄存器中。這樣,凡是對原有寄存器堆中基地址寄存器的更新操作都會反映到寄存器堆597中。因此,當?shù)竭_計算數(shù)據(jù)尋址地址的時間點時,可以從寄存器堆597中讀出該基地址寄存器值599,以計算數(shù)據(jù)尋址地址。在物理實現(xiàn)上,寄存器堆597可以位于處理器核內(nèi)或處理器核外的任何合適的位置。[0129]為改善訪問主動表104的瓶頸并降低功耗,可將最近被使用過的指令塊地址與對應的指令塊號成對存儲在被稱為微型主動表(MiniActiveList)的小型快速存儲中。微型主動表含有的所述匹配對是主動表104中的指令行地址與行號匹配對的子集。當掃描器108計算出需要匹配的分支目標地址時,可以先到微型主動表中進行匹配,若匹配不成功再到主動表104中進行匹配,從而減少主動表104的訪問次數(shù)。微型主動表由內(nèi)容匹配尋址器與數(shù)據(jù)存儲器對組成。指令塊地址存在內(nèi)容匹配尋址器中,與其相應的指令塊號存在同一行的數(shù)據(jù)存儲器中。輸入的指令塊地址與微型主動表內(nèi)容匹配尋址器存儲的復數(shù)個指令塊地址匹配,如果結(jié)果是‘匹配不成功’則微型主動表將輸入的指令塊地址送至主動表104匹配;如果結(jié)果是‘匹配成功’則從相應的數(shù)據(jù)存儲器中讀出并輸出指令塊號。微型主動表也可與主動表并行工作,同時提供多個地址匹配服務。[0130]微型主動表可以是一個獨立的單元,也可以與軌道表110或指令緩沖112的匹配器合并因為兩者有相似的結(jié)構(gòu)與存儲數(shù)據(jù)。此時的微型主動表的指令塊地址存儲部分以及指令塊號存儲部分都是內(nèi)容匹配尋址器結(jié)構(gòu),且互為對方的數(shù)據(jù)存儲器。此時含有微型主動表的匹配器是一個雙向?qū)ぶ菲?,即輸入指令地址塊地址可輸出相應的指令塊號;輸入指令地址塊號地址可輸出相應的指令地址塊地址。這樣,含有微型主動表的匹配器可以提供以下功能:從掃描器提供的指令地址塊地址查找指令塊號做為軌道表內(nèi)容,以及從循跡器提供的指令塊號匹配相應的軌道、指令塊、從當前指令塊查找相應的指令塊地址,該指令塊地址的下一個指令塊地址做為下一順序執(zhí)行指令塊的塊地址以及從上述塊地址查找相應的軌道/指令塊。[0131]圖5E是本發(fā)明所述包含微型主動表的軌道表實施例。[0132]根據(jù)本發(fā)明所述技術方案,軌道表110與指令緩沖112都需要存儲指令塊號。軌道表110中還可以包含每條軌道對應的指令塊的塊地址,因此,軌道表110中的每個塊號及其對應地址就構(gòu)成了一個指令塊地址與塊號的匹配對,這樣,在軌道表110中就構(gòu)成了一個微型主動表。在圖5E中,省略了與本實施例說明內(nèi)容無關的部分或部件。軌道表110的主體部分,即存儲指令類型和分支目標塊號及塊內(nèi)偏移量的存儲器584與之前實施例所述相同,存儲器584中可以包含或不包含臨時寄存器。不同的是還增加了一個內(nèi)容尋址存儲器588用于存儲每條軌道對應的塊地址,而內(nèi)容尋址存儲器586中存儲了這些塊地址對應的塊號。這樣,內(nèi)容尋址存儲器586和內(nèi)容尋址存儲器588的相應行就形成了指令塊地址與塊號的匹配對。[0133]當掃描器108計算出需要匹配的分支目標地址時,先將該目標地址通過總線590送到內(nèi)容尋址存儲器588進行匹配。若匹配成功,則以匹配成功的項為索引在內(nèi)容尋址存儲器586中的相應行內(nèi)容(即該目標地址對應的塊號)通過總線592輸出到選擇器598,經(jīng)選擇器598選擇后寫入軌道表主體部分存儲器584中;若匹配不成功,則將該目標地址送到主動表104進行匹配,由主動表104將匹配得到或分配的塊號通過總線596送到選擇器598,此時選擇器598選擇從主動表104來的塊號寫入軌道表主體部分存儲器584中。[0134]當執(zhí)行分支指令時該分支指令成功發(fā)生分支轉(zhuǎn)移時,指令循跡器114將分支軌跡點中包含的分支目標塊號通過總線594送到內(nèi)容尋址存儲器586中進行匹配。若匹配成功,則分支目標指令塊對應的軌道已經(jīng)建立,即分支目標指令塊已經(jīng)被存儲在指令讀緩沖112中,不需要進行填充操作;若匹配不成功,則分支目標指令塊對應的軌道尚未建立,即分支目標指令塊尚未存儲在指令讀緩沖112中,則需要將該分支目標塊號通過總線594送到指令存儲器106進行尋址,從指令存儲器106中輸出該目標指令塊,再按之前實施例所述方法進行后續(xù)操作。[0135]圖6A是本發(fā)明所述循跡器讀指針移動的實施例600。在本實施例中,循跡器讀指針越過軌道表中的非分支指令,移動到軌道表中下一分支點并等待處理器核116分支判斷結(jié)果。為便于說明,圖6A中省略了與本實施例說明內(nèi)容無關的部分或部件。在本實施例中,假設存儲器550中存儲的指令類型及存儲器548中存儲的指令信息均按指令地址從小到大從左到右排列,即當按順序執(zhí)行這些指令時,各個指令信息及相應指令類型的訪問順序為從左向右。另假設550中指令類型為‘0’代表548中相應的指令為非分支指令,指令類型為‘I’代表相應的指令為分支指令。任一時刻可以讀出存儲器548中由第一地址614(塊號,BNX)指出的一條軌道中中由第二地址616(塊內(nèi)地址偏移量,BNY)指出的代表指令的表項。任一時刻可以讀出存儲器550中由第一地址614指出的一條軌道中代表指令類型的復數(shù)個表項甚至所有表項。其中如果軌道表中軌道數(shù)與第一地址所代表的總軌道數(shù)相等,則將第一地址譯碼尋址就可指向相應軌道。如果不等,貝1J可以用內(nèi)容尋址(ContentAdress)的方法將軌道的軌道號存放在匹配器536中的存儲器中,第一地址與匹配器536中的所有軌道號做并行比較,軌道號與第一地址匹配的軌道即為要選擇的軌道。匹配器536、存儲器550和548共同構(gòu)成軌道表110。[0136]在存儲器550和548中每一行中指令地址最大的一條指令的表項的右方再增設一個結(jié)束表項以存放順序執(zhí)行下一條指令的地址。結(jié)束表項的指令類型總是被設定為‘I’。結(jié)束表項中指令信息的第一地址是下一條指令的指令塊號,第二地址(BNY)恒定為零,指向該指令軌道的第一項。結(jié)束表項被定義為等同于一個無條件分支指令。當循跡器指向一個結(jié)束表項時總會產(chǎn)生一個內(nèi)部控制信號使選擇器608選擇存儲器548的輸出630;也會產(chǎn)生一個內(nèi)部控制信號使寄存器610更新。該內(nèi)部信號可以由存儲器550或存儲器548中結(jié)束表項中含有的特殊位觸發(fā);也可以由第二地址616指向結(jié)束表項來觸發(fā)。[0137]在圖6A中,循跡器114中主要包括了移位器602、前導零計數(shù)器604、加法器606、選擇器608和寄存器610。其中移位器602將從存儲器550讀出的代表復數(shù)條指令的復數(shù)個指令類型618向左移位,其移動位數(shù)由寄存器610輸出的第二地址指針616決定。移位器602輸出的移位后指令類型624的最左邊一位是步進位(STEPBit)。該步進位的信號與從處理器核來的BRANCH信號共同決定寄存器610的更新。選擇器608由控制信號TAKEN控制,其輸出632為下一地址(NextAddress),其中含有第一地址部分及第二地址部分。當TAKEN為‘I’(分支成功)時,選擇器608選擇存儲器548的輸出630(含有分支目標的第一地址及第二地址)做為輸出632。當TAKEN為‘0’(分支不成功)時,選擇器608選擇現(xiàn)第一地址614作為輸出632第一地址部分,加法器輸出628做為輸出632第二地址部分。指令類型624被送到前導零計數(shù)器604以計算下一個‘I’指令類型(代表相應指令為分支指令)前有多少個‘0’指令類型(代表相應指令為非分支指令),其中不管步進位是‘0’或‘I’都被計算為一位‘O’。得出的前導‘0’的數(shù)目626(步進數(shù)STEPNumber)則被送到加法器606與寄存器610輸出的第二地址616相加以得出下一分支源地址(NextBranchAddress)628。請注意此下一分支源地址就是當前指令下一條分支指令的第二地址,而在此之前的非分支指令則會被循跡器114跳(Skip)過。[0138]當?shù)诙刂分赶虼硪粭l指令的表項時,受第二地址控制的移位器也將存儲器548輸出的復數(shù)條指令類型統(tǒng)一向左移位。此時代表存儲器550所讀出指令的指令類型被移位到指令類型624中的最左面的步進位。移位指令類型624被送入前導零計數(shù)器計算下一條分支指令之前指令的條數(shù)。此時前導零計數(shù)器604的輸出626即是循跡器應該前進的步長。此步長與第二地址616由加法器606相加后即得出下一分支指令地址628。[0139]當移位后指令類型624中的步進位信號為‘0’時,這表示第二地址616所指向的存儲器550中的表項為非分支指令,此時該步進位信號控制寄存器610更新,而選擇器608在為‘0’的TAKEN信號622控制下選擇下一分支源地址628成為第二地址616,第一地址614保持不變。此時新的第一第二地址指向同一軌道中的下一條分支指令,此分支指令前的非分支指令均被越過。新的第二地址控制移位器616將指令類型618移位,使代表此分支指令的指令類型位落到624的步進位上供下一步操作。[0140]當移位后指令類型624中的步進位信號為‘I’時,這表示第二地址所指向的存儲器550中的表項代表分支指令。此時該步進位信號不影響寄存器610更新,寄存器610由處理器核來的BRANCH信號634控制更新。此時加法器輸出628是當前分支指令同一軌道上的下一條分支指令的地址,同時存儲器輸出630是當前分支指令的目標地址。[0141]當BRANCH信號為‘I’時,選擇器608的輸出632更新寄存器610。如果此時處理器核來的TAKEN信號622為‘0’時,代表處理器核決定在這個分支點選擇順序執(zhí)行,此時選擇器608選擇下一分支源地址628。此時寄存器610輸出的第一地址614不變,下一分支源地址628成為新的第二地址616。此時新的第一第二地址指向同一軌道中的下一條分支指令。新的第二地址控制移位器616將指令類型618移位,使代表此分支指令的指令類型位落到624的步進位上供下一步操作。[0142]如果此時處理器核來的TAKEN信號622為‘I’時,代表處理器核決定在這個分支點選擇程序跳轉(zhuǎn)到分支目標,此時選擇器選擇從存儲器548中讀出的分支目標地址630成為由寄存器610輸出的第一地址614及未來第二地址626。此時BRANCH信號634控制寄存器610鎖存上述第一第二地址成為新的第一第二地址。該新的第一第二地址指向可能不在同一軌道上的分支目標地址。新的第二地址控制移位器616將指令類型618移位,使代表此分支指令的指令類型位落到624的步進位上供下一步操作。[0143]當?shù)诙刂分赶蜍壽E表結(jié)束表項(下一行表項)時,如前所述內(nèi)部控制信號控制選擇器608選擇存儲器548的輸出530,并更新寄存器610。此時新的第一地址614為存儲器548的結(jié)束表項中記載的下一軌道的第一地址,第二地址為零。此時第二地址控制控制移位器616將指令類型618移零位,開始下一步操作。如此周而復始,循跡器114與軌道表110配合,會跳過軌道表中的非分支指令而總是指向分支指令。[0144]圖6B是本發(fā)明所述確定計算間接分支目標地址的時間點的一個實施例650。在本實施例中,軌道表Iio輸出循跡器114的第二地址讀指針616指向的間接分支軌跡點中存儲的指令間隔數(shù)666送到加法器654。加法器654的另一個輸入就是循跡器114的第二地址讀指針616的值,即該間接分支指令所在的位置。加法器654對指令間隔數(shù)666和間接分支指令所在的位置相加就可以得到最后更新該基地址寄存器的指令的位置668。該位置668被送到比較器656。比較器656的另一個輸入是處理器核116輸出的指令地址670,其比較結(jié)果被送的到寄存器660以控制其值的更新。[0145]此外,指令讀緩沖112輸出數(shù)據(jù)循跡器114的第二地址讀指針616指向的指令中的地址偏移量674和基地址寄存器號672。該基地址寄存器號被送到處理器核116獲取對應的寄存器值676,并將獲取到寄存器值676送到加法器662;而該地址偏移量674被直接送到加法器662。這樣,加法器662可以計算產(chǎn)生間接分支目標地址。[0146]當位置668的值與處理器核116輸出的指令地址670相等時,表示對應基地址寄存器的值正在(或已經(jīng))被更新,此時加法器662計算結(jié)果就是該間接分支指令對應的間接分支目標地址并被存儲到寄存器660中,該間接分支目標地址即可被送往主動表104進行匹配操作。[0147]此外,由于事先計算了基地址寄存器值更新的時間點,并由指令讀緩沖112事先提供了基地址寄存器號和地址偏移量,該時間提前量有可能比較大,即在處理器核116實際執(zhí)行到對應間接分支指令之前,有可能已經(jīng)對多條即將執(zhí)行的間接分支指令都計算了上述時間點并提供了上述基地址寄存器號和地址偏移量。因此可以增加一個緩沖658,用于暫存上述時間點、基地址寄存器號和地址偏移量等信息,依次在到達各條間接分支指令對應基地址寄存器值更新的時間點上計算間接分支目標地址。[0148]根據(jù)本發(fā)明所述技術方案,當主動表104表項已滿且需要建立新的行地址/行號匹配對時,需要對主動表104進行替換,即從主動表104中移除一個已有的行地址/行號匹配對,代以新的行地址/行號匹配對;從指令存儲器106中移除相應的指令塊,代以新的指令塊。軌道表110中每個分支軌跡點的內(nèi)容包含了其分支目標軌跡點的塊號(即第一地址)和塊內(nèi)偏移量(即第二地址)。如果尚在軌道表110中存儲的分支目標軌跡點的塊號對應的主動表104中匹配對及相應的指令緩存塊被替換,則會產(chǎn)生塊號未變、但塊號所代表的存儲內(nèi)容已改變的情況,導致該軌跡點將指向錯誤的指令塊。可以增加一個相關表(correlationtable),記錄主動表104中每個匹配對是否在軌道表中作為軌跡點中分支目標的相關信息。[0149]圖7A是本發(fā)明所述相關表的一個實施例700。為便于說明,圖7A中的相關表在邏輯上被歸入主動表104。此外,圖7A中還省略了與本實施例說明內(nèi)容無關的部分或部件。[0150]在本實施例中,主動表104除了包含數(shù)據(jù)地址尋址器202外,還包含一個相關表702。相關表702的表項數(shù)與數(shù)據(jù)地址尋址器202中的表項數(shù)相同,兩者形成一一對應的關系。相關表702中每一個表項表示了與其相應的數(shù)據(jù)地址尋址器202匹配對中的行號在軌道表110中被引用(即作為目標塊號出現(xiàn))的次數(shù)。根據(jù)具體實現(xiàn)的不同,該次數(shù)可以是在軌道表110中以所述塊號為目標塊號的軌跡點的個數(shù),也可以是包含這種軌跡點的軌道的條數(shù)。相關表702中每一個表項的初始值都為‘O’。[0151]根據(jù)本發(fā)明所述技術方案,主動表104(或微型主動表)一旦匹配得到或分配得到一個塊號,則可以將此塊號作為索引708從相關表702中讀出對應表項的值送到運算單元704,并輸出表示該塊號是有效塊號的控制信號710到運算單元704,使得運算單元704對該值進行加‘I’操作,并將結(jié)果送回相關表702中的對應行,從而將該表項的值(即對應塊號被引用的次數(shù))增‘I’。根據(jù)本發(fā)明技術方案,控制信號710可以是如圖2A實施例中的有效位220,也可以是其他存儲在主動表104中的合適的信號。每當一條軌道被替換出軌道表110時,退出單元706對該軌道進行掃描,提取出所有目標塊號,并以這些塊號為索引712從相關表702中讀出對應表項的值送到運算單元704,并輸出控制信號714到運算單元704,使得運算單元704對該值進行減‘I’操作,并將結(jié)果送回相關表702中的對應行,從而將該表項的值(即對應塊號被引用的次數(shù))減少‘I’。如此,相關表702中值為‘0’的表項表示數(shù)據(jù)地址尋址器202中對應的匹配對未被軌道表110引用,所以這些匹配對可以被新的行地址/行號匹配對替換而不致產(chǎn)生錯誤。主動表(或指令存儲器)替換邏輯只替換相關表中為‘0’的相應表項。[0152]圖7B是本發(fā)明所述相關表的一個實施例750。為便于說明,圖7B中的相關表在邏輯上也被歸入主動表104。此外,圖7B中還省略了與本實施例說明內(nèi)容無關的部分或部件。[0153]在本實施例中,主動表104除了包含數(shù)據(jù)地址尋址器202外,還包含一個相關表752。相關表752的每個表項只包含一個標志位,對應數(shù)據(jù)地址尋址器202中的一個匹配對。該標志位為‘I’表示對應匹配對中的塊號被軌道表110引用;該標志位為‘0’表示對應匹配對中的行(塊)號沒有被軌道表110引用。[0154]此外,增加了一個掃描器754,其讀指針758依次掃描軌道表110中每條軌道中的每個軌跡點。一旦讀指針758指向了一個含有目標塊號的軌跡點(如分支軌跡點或結(jié)束軌跡點),則將該目標塊號讀出并作為地址760對相關表752中的對應標志位進行置位操作(即將該標志位的值置為‘I’)。另有一循環(huán)指針756以比掃描器754讀指針758更慢的移動速度依次移過相關表752中的每個標志位,并對移過的標志位進行清零操作(即將該標志位的值清為‘0’)。這樣,只要讀指針758的移動速度遠大于循環(huán)指針756的移動速度,就可以將被軌道表110引用的塊號對應的標志位全部置為‘I’,而沒有被軌道表110引用的塊號對應的標志位則被全部置為‘O’。標志位值為‘0’的匹配對可以被替換以容納新的行地址/行號匹配對。[0155]根據(jù)本發(fā)明所述技術方案,指令讀緩沖112中存儲了處理器核116將要執(zhí)行的指令,使得處理器核116能以最少等待時間獲取指令。圖8A是本發(fā)明所述指令讀緩沖與指令存儲器、軌道表等配合為處理器核提供指令的一個實施例800。[0156]在本實施例中指令讀緩沖112由寄存器組802構(gòu)成,該寄存器組的容量與一個指令塊大小相同,含有處理器正在執(zhí)行的當前指令塊。為便于說明,假設一個指令塊只有兩條指令,即寄存器組802只包含了能存放兩條指令的寄存器。包含更多指令的情況與此類似。[0157]在本實施例中,包含處理器核116將要執(zhí)行的指令在內(nèi)的當前指令塊都會被存儲到寄存器組802中。也就是說,一旦處理器核即將執(zhí)行的指令不在當前指令塊中,則根據(jù)循跡器114的第一地址指針614將該指令所在的指令塊從指令存儲器106中讀出并存儲到寄存器組802中,同時將掃描器108提取的指令信息以及主動表104輸出的塊號信息存儲到軌道表110中以建立對應這個指令塊的軌道。由于軌道表110中的軌道與指令讀緩沖112中的指令塊一一對應,因此本實施例的軌道表110中只有一條軌道,而循跡器114按之前實施例所述方式更新讀指針。[0158]當處理器核116正在執(zhí)行的當前指令不是指令塊的最后一條指令且處理器核116對順序下一條指令取指時,該下一條指令已經(jīng)存儲在寄存器組802中。因此選擇器804和806選擇來源于寄存器組802的輸入,而選擇器808根據(jù)程序計數(shù)器的低位810(即該下一條指令在指令塊中的偏移量)從送來的指令塊中選出處理器核116所需指令。這樣,處理器核116就能以最少等待時間獲取指令。[0159]當處理器核116正在執(zhí)行的當前指令是指令塊的最后一條指令且處理器核116對順序下一條指令取指時,由于該指令位于下一指令塊,因此尚未存儲在寄存器組802中。根據(jù)本發(fā)明技術方案及之前實施例所述,該下一指令塊正在被預取,或已經(jīng)被預取并存儲在指令存儲器106中。若該指令塊已存儲在指令存儲器106中,則可以由循跡器114的第一地址指針614(即該指令塊的塊號)索引到該指令塊,該指令塊被讀出,并由選擇器804和806選擇輸出到選擇器808。選擇器808再根據(jù)程序計數(shù)器的低位810(即該下一條指令在指令塊中的偏移量,也就是第一條指令)從送來的指令塊中選出處理器核116所需指令。若該指令塊正在預取中,則等待該指令塊被取到并寫入指令存儲器106后,再按上述方法將處理器核116所需指令選出。此外,也可以在指令存儲器106處設置旁路徑,使得一旦該指令塊被預取進來就能選出所需指令。[0160]當處理器核116執(zhí)行分支指令發(fā)生分支轉(zhuǎn)移、需對分支目標指令取指時,若該分支目標指令就在當前指令塊中,則選擇器804和806選擇來源于寄存器組802的輸入,而選擇器808根據(jù)程序計數(shù)器的低位810(即該分支目標指令在指令塊中的偏移量)從送來的指令塊中選出處理器核116所需指令。[0161]若該分支目標指令不在當前指令塊中,則根據(jù)本發(fā)明技術方案及之前實施例所述,包含該分支目標指令的指令塊已經(jīng)被預取并存儲在指令存儲器106中,或正在預取中。那么,若該指令塊已存儲在指令存儲器106中,則可以由循跡器114的第一地址指針614(即該指令塊的塊號)索引、讀出該指令塊,并由選擇器804和806選擇輸出到選擇器808。選擇器808再根據(jù)程序計數(shù)器的低位810(即該分支目標指令在指令塊中的偏移量)從送來的指令塊中選出處理器核116所需指令。若該指令塊正在預取中,則等待該指令塊被取到并寫入指令存儲器106后,再按上述方法將處理器核116所需指令選出。此外,也可以在指令存儲器106處設置旁路徑,使得一旦該指令塊被預取進行就能選出所需指令。[0162]圖SB是本發(fā)明所述指令讀緩沖與指令存儲器、軌道表等配合為處理器核提供指令的一個改進實施例830。在本實施例中,主動表104、指令存儲器106、掃描器108和循跡器114與圖8A實施例相同,不同之處在于指令讀緩沖112中包含一個存儲器832,而非一個寄存器組。存儲器832能夠容納至少兩個指令塊。相應地,軌道表110中也容納了相應數(shù)目的軌道,這些軌道與存儲器832中的指令塊一一對應。[0163]在本實施例中,一旦處理器核116執(zhí)行到一個新的指令塊,循跡器114就將該指令塊對應軌道中結(jié)束軌跡點的內(nèi)容(即順序執(zhí)行時的下一指令塊的塊號)讀出,并通過第一地址指針614送到軌道表110和指令存儲器106。該塊號在軌道表110中與每條軌道對應的塊號匹配,若匹配成功,則說明該下一指令塊已經(jīng)存儲在存儲器832中;若匹配不成功,則說明該下一指令塊尚未存儲在存儲器832中,需要將其寫入存儲器832。[0164]根據(jù)本發(fā)明技術方案及之前實施例所述,該下一指令塊已經(jīng)被預取并存儲在指令存儲器106中,或正在預取中。那么,若該下一指令塊已存儲在指令存儲器106中,則可以由循跡器114的第一地址指針614(即該下一指令塊的塊號)索引、讀出該指令塊,并存儲到指令讀緩沖112的存儲器832中。若該下一指令塊正在預取中,則等待該指令塊被取到并寫入指令存儲器106后,再按上述方法將其存儲到存儲器832中。若存儲器832已滿,則可以使用替換算法(如最近最少訪問替換算法LRU或最少頻繁訪問替換算法LFU等)以該下一指令塊覆蓋一個已有指令塊。同樣地,在將該下一指令塊寫入存儲器832的同時在軌道表110的相應位置建立對應軌道。[0165]這樣,當前指令塊和下一指令塊都被存儲在指令讀緩沖112中。無論處理器核116執(zhí)行的當前指令的下一條指令是在同一指令塊(即當前指令塊),還是在下一指令塊,都可以由循跡器114的第一地址指針614的值(即該下一條指令所在指令塊對應的塊號)經(jīng)軌道表110中對應每條軌道的塊號匹配后,根據(jù)匹配結(jié)果834在指令讀緩沖112的存儲器832中找到對應的指令塊。之后,選擇器804和806選擇來源于存儲器832的指令塊,選擇器808根據(jù)程序計數(shù)器的低位810(即該下一條指令在指令塊中的偏移量)從送來的指令塊中選出處理器核116所需指令。[0166]當處理器核116執(zhí)行分支指令發(fā)生分支轉(zhuǎn)移、需對分支目標指令取指時,循跡器114將第一地址讀指針614的值(即該分支指令的分支目標塊號)送到軌道表110中與每條軌道的塊號匹配。若匹配成功,則說明該分支目標指令所在的指令塊已經(jīng)存儲在存儲器832中,可以在存儲器832中由匹配結(jié)果834索引,讀出該指令塊。之后,選擇器804和806選擇來源于存儲器832的該指令塊,選擇器808根據(jù)程序計數(shù)器的低位(即該分支目標指令在指令塊中的偏移量)從送來的指令塊中選出處理器核116所需指令。[0167]若匹配不成功,則說明該分支目標指令所在的指令塊尚未存儲在存儲器832中。根據(jù)本發(fā)明技術方案及之前實施例所述,該分支目標指令所在的目標指令塊已經(jīng)被預取并存儲在指令存儲器106中,或正在預取中。那么,若該目標指令塊已存儲在指令存儲器106中,則可以由循跡器114的第一地址指針614(即該目標指令塊的塊號)索引、讀出該指令塊。選擇器804和806選擇存儲器832輸出的該指令塊到選擇器808。選擇器808再根據(jù)程序計數(shù)器的低位810(即該分支目標指令在指令塊中的偏移量)從送來的指令塊中選出處理器核116所需指令。若該指令塊正在預取中,則等待該指令塊被取到并寫入指令存儲器106后,再按上述方法將處理器核116所需指令選出。此外,也可以在指令存儲器106處設置旁路徑,使得一旦該指令塊被預取進來就能選出所需指令。[0168]圖SC是本發(fā)明所述指令讀緩沖與指令存儲器、軌道表等配合為處理器核提供指令的又一個改進實施例860。在本實施例中,主動表104、指令存儲器106、掃描器108和循跡器114與圖SB實施例相同,不同之處在于指令讀緩沖112除了包含存儲器832,還包含一個輸出寄存器組862。輸出寄存器組862的容量與一個指令塊大小相同,包含了處理器正在執(zhí)行的當前指令塊。為便于說明,假設一個指令塊只有兩條指令,即寄存器組862只包含了能存放兩條指令的寄存器。包含更多指令的情況與此類似。這樣,當處理器核116從輸出寄存器組862獲取當前指令的同時,存儲器832的端口可以被用于提供分支目標指令或不在當前指令塊內(nèi)的下一條指令。如此,單端口(port)的存儲器結(jié)合寄存器可同時提供兩條相互獨立的指令。[0169]具體來說,與之前實施例所述情況類似,輸出寄存器組862可以直接提供當前指令塊;存儲器832可以根據(jù)循跡器114第一地址指針614在軌道表中的匹配結(jié)果834提供下一指令塊或分支目標指令塊;指令存儲器106可以根據(jù)循跡器114第一地址指針614提供分支目標指令塊。選擇器864和866根據(jù)處理器核116所需指令所在的指令塊在上述三個存儲單元中的匹配結(jié)果進行選擇。若該指令塊在輸出寄存器組862中(即該指令塊就是當前指令塊),則選擇器864和866選擇輸出寄存器組862輸出的指令塊送到選擇器808;否則,若該指令塊在存儲器832中(即該指令塊是下一指令塊,或是已存儲在存儲器832中的分支目標指令塊),則選擇器864和866選擇存儲器832輸出的指令塊送到選擇器808;否則,選擇器864和866選擇指令存儲器106輸出的指令塊,或預取完成后指令存儲器106輸出(或旁路輸出)的指令塊送到選擇器808。選擇器808按之前實施例所述方法根據(jù)程序計數(shù)器的低位810從送來的指令塊中選出處理器核116所需指令。[0170]根據(jù)本發(fā)明所述技術方案,對上述實施例進行改進,可以在處理器核116取得分支指令的下一次取指時,同時向處理器核116輸出該分支指令順序執(zhí)行的下一指令以及分支目標指令。圖9A是本發(fā)明所述同時為處理器核提供下一指令及分支目標指令的一個實施例900。處理器核在同時取到分支指令之后順序執(zhí)行的下一指令和分支目標指令后,可以用兩條流水線前若干流水線段(如:取指段、譯碼段)并行對這兩條指令進行取指、譯碼等操作,等到分支轉(zhuǎn)移是否發(fā)生確定后,再選擇其中一條流水線的中間結(jié)果繼續(xù)運行,完成之后的流水線段操作,從而提高處理器核的吞吐率,實現(xiàn)分支轉(zhuǎn)移的零等待。[0171]在本實施例中,主動表104、指令存儲器106、掃描器108和循跡器114與圖8C實施例相同,不同之處在于指令讀緩沖112除了包含存儲器832、輸出寄存器組862外,還包含兩套選擇結(jié)構(gòu)。選擇器904、906和908用于選擇輸出下一指令902,選擇器910、912和914用于選擇輸出分支目標指令916。[0172]在本實施例中,輸出寄存器組862可以提供當前指令塊與相鄰的下一指令塊;存儲器832可以根據(jù)循跡器114第一地址指針614在軌道表中的匹配結(jié)果834提供下一指令塊或分支目標指令塊;指令存儲器106可以根據(jù)循跡器114的第一地址指針614提供分支目標指令塊。選擇器908受程序計數(shù)器810控制,從當前指令塊內(nèi)選出下一指令902;選擇器910受從軌道表讀出的分支軌跡點內(nèi)容中的第二地址(即分支目標地址630中的第二地址)控制,從目標指令塊中選出目標指令916。[0173]若處理器核116當前執(zhí)行的不是分支指令,且下一指令在當前指令塊內(nèi),那么選擇器904和906選擇輸出寄存器組862輸出的指令塊送到選擇器908,再由選擇器908按之前實施例所述方法根據(jù)程序計數(shù)器的低位810從送來的指令塊中選出處理器核116所需的下一指令902。[0174]若處理器核116當前執(zhí)行的不是分支指令,且下一指令在下一指令塊內(nèi)(當前指令是指令塊最后一條指令),那么由循跡器114的第一地址指針614的值(即該下一條指令所在的下一指令塊對應的塊號)經(jīng)軌道表110中對應每條軌道的塊號匹配后,根據(jù)匹配結(jié)果834在指令讀緩沖112的存儲器832中找到對應的下一指令塊。選擇器904和906選擇存儲器832輸出的指令塊送到選擇器908,再由選擇器908按之前實施例所述方法根據(jù)程序計數(shù)器的低位810從送來的指令塊中選出處理器核116所需的下一指令902。[0175]若處理器核116當前執(zhí)行的是分支指令,則在按上述方法輸出下一指令902的同時,由選擇器910和912對來源于指令存儲器106和存儲器832的指令塊進行選擇,以選出分支目標指令塊。此時,若下一指令在當前指令塊內(nèi),則選擇器910和912優(yōu)先選擇來源于存儲器832的分支目標指令塊(不對指令存儲器106進行讀操作以節(jié)省功耗),僅當分支目標指令塊不在832中時,才選擇來源于指令存儲器106的分支目標指令塊;若下一指令在下一指令塊內(nèi)(當前指令是指令塊最后一條指令)則選擇器910和912選擇來源于指令存儲器106的分支目標指令塊。選擇器908如前實施例所述方法根據(jù)分支目標地址的低位(即分支目標指令在分支目標指令塊中的偏移量)從送來的指令塊中選出處理器核116所需的分支目標指令916。[0176]圖9B是本發(fā)明所述同時為處理器核提供下一指令及分支目標指令的另一個實施例950。在本實施例中,主動表104、指令存儲器106、掃描器108、循跡器114、輸出寄存器組862和選擇器904、906、908、910、912、914都與圖9A實施例相同,不同之處在于用一個雙輸出端口存儲器952代替了圖9A的單輸出端口存儲器832。存儲器952的兩個輸出端口954和956可以根據(jù)不同的尋址958和834,分別輸出下一指令塊和分支目標指令塊。[0177]因此,輸出寄存器組862可以直接提供當前指令塊;存儲器952可以同時提供下一指令塊以及分支目標指令塊;指令存儲器106可以提供分支目標指令塊。[0178]若下一指令所在的指令塊就在輸出寄存器組862中(即該指令塊就是當前指令塊),則選擇器904和906選擇輸出寄存器組862輸出的指令塊送到選擇器908;否則,選擇器904和906選擇存儲器952輸出端口954輸出的下一指令塊送到選擇器908。選擇器908按之前實施例所述方法根據(jù)程序計數(shù)器的低位810從送來的指令塊中選出該下一指令902送到處理器核116。[0179]若分支目標指令所在的指令塊在存儲器952中,則選擇器910和912選擇存儲器952輸出端口956輸出的分支目標指令塊送到選擇器914;否則,選擇器910和912選擇指令存儲器106輸出的分支目標指令塊,或預取完成后指令存儲器106輸出(或旁路輸出)的分支目標指令塊送到選擇器914。選擇器914按之前實施例所述方法根據(jù)分支目標地址的低位從送來的指令塊中選出該分支目標指令916送到處理器核116。[0180]采用雙輸出端口存儲器952同時提供下一指令塊和分支目標指令塊,能降低指令存儲器106的訪問次數(shù),從而降低功耗。[0181]根據(jù)本發(fā)明技術方案,可以將經(jīng)常被執(zhí)行到的特定程序固定存儲在指令存儲器106中的指定位置,并在主動表104中的特定位置建立對應的指令行地址/行號匹配對,以減少指令行替換次數(shù)。也可以在指令存儲器106中增加至少一個額外的存儲單元,用于存儲這種特定程序,且所述存儲單元存儲特定的程序。也就是說,所述存儲單元對應的指令的起始地址是特定的,不需要在主動表104中匹配,可以減小主動表104的容量。圖10是本發(fā)明所述包含用于存儲特定程序的存儲單元的指令存儲器的實施例1000。為便于說明,圖10中未顯示指令存儲器106中的寄存器304,且以一個額外的存儲單元1002進行說明。對應包含更多額外存儲單元的情況,也與此類似。[0182]在圖10中,指令存儲器106中除了包含指令存儲單元302以外(本實施例中未顯示),還包含一個存儲單元1002,用于存儲特定的程序,如:異常處理程序(ExceptionHandlingProgram)等。主動表104中的匹配對與指令存儲單元302中的指令行--對應,而存儲單元1002中的指令行是特定的,且對應特定的行號,因此不需要在主動表104中建立相應的匹配對。這些特定的行號與匹配對中的行號互不沖突。此外,存儲單元1002中的每個存儲行都有一個相應的有效位1004,用于表示對應的特定指令行是否已經(jīng)存儲在該存儲行中。根據(jù)本發(fā)明技術方案,當處理器核116啟動后,有效位1004均被設置為無效,填充器102利用取指的空閑時間,獲取這些特定的指令行,寫入存儲器1002并將相應的有效位設置為有效[0183]在本實施例中,掃描器除按之前實施例所述操作外,還優(yōu)先將分支目標地址或下一指令塊的地址與存儲單元1002中指令行對應的地址進行匹配并檢查對應的有效位,一旦匹配成功且該指令行有效,則表示所需指令行已經(jīng)存儲在存儲單元1002中,不需要再到主動表104中進行匹配,即可直接輸出上述特定行號。此外,當需要將指令塊從指令存儲器106填充到指令讀緩沖112中時,若該指令塊是這些特定行號對應的指令行所包含的指令塊,則選擇器1008受控制信號1006控制選擇來源于存儲單元1002的指令塊送往指令讀緩沖112;否則選擇器1008受控制信號1006控制選擇來源于指令存儲單元302的指令塊送往指令讀緩沖112。[0184]圖1lA是本發(fā)明所述用于選擇指令塊的匹配器的實施例1100。為了便于說明,假設本實施例中指令行、指令塊、行號、塊號之間的關系與圖3B實施例相同。這樣,指令塊號(第一地址,BNX)比存儲器塊號多一位。指令塊號的高位就是該指令塊在存儲器中的存儲器塊號。再假設指令塊號的低位等同于32位指令地址的第4位,用以分辨同一存儲器塊中的兩個不同指令塊。這樣,第二地址(BNY)就是32位指令地址的第3位至第2位,用于在指令塊中對指令尋址,而第I位和第O位表示一條指令中的不同字節(jié)。[0185]在本實施例中,如圖3B實施例所述,假設指令存儲器106中的一個指令行對應指令讀緩沖112中的兩個指令塊且以指令地址中的第4位區(qū)分同一指令行中的不同指令塊。根據(jù)本發(fā)明技術方案,指令讀緩沖112中的每個指令塊均有一個對應的匹配器。為了便于說明,在圖1lA中只顯示了兩個匹配器:匹配器1102和匹配器1122。以匹配器1102為例,匹配器1102中的寄存器1104存儲了一個指令塊號(BNX),與指令讀緩沖112中的一個指令塊及軌道表中的一條軌道相對應。匹配器1102中的比較器1110用于將寄存器1104中的塊號與循跡器114輸出的第一地址614進行比較,并輸出比較結(jié)果(‘匹配成功’或‘匹配不成功’)。寄存器1108的寫使能受處理器核116輸出的BRANCH信號634控制,當BRANCH信號634有效時,更新寄存器1108的值。寄存器1108的值和比較器1104的輸出被送到或門1107進行邏輯或操作。匹配器1102中的比較器1106用于比較處理器核116輸出的指令地址值中的第4位1119與存儲在寄存器1104中的指令塊號的第4位,其比較結(jié)果與或門1107的輸出值一起送到與門1114中進行邏輯與操作。若該比較結(jié)果為‘匹配’且或門1107輸出的值為‘有效’,則與門1114輸出‘有效’,表示指令讀緩沖112中對應的指令塊是處理器核116所需的指令塊,否則,與門1114輸出‘無效’,表示指令讀緩沖112中對應的指令塊不是處理器核116所需的指令塊。這樣,就可以指出處理器核116所需的指令塊。此夕卜,比較器1110的輸出也被送到軌道表110用以指出當前軌道,該當前軌道被用于指令循跡器114讀指針移動的相關操作。[0186]匹配器1222中的寄存器1124、比較器1126、寄存器1128、比較器1130、或門1127、與門1134分別與匹配器1102中的寄存器1104、比較器1106、寄存器1108、比較器1110、或門1107、與門1114對應,執(zhí)行類似的操作。[0187]以下通過一個具體的例子對匹配器進行說明。為便于說明,在本實施例中,假設目標指令塊已經(jīng)被預取到指令存儲器106中,且該目標指令塊及其相鄰的下一指令塊均尚未被寫入指令讀緩沖112中。對于其他的情況,也可以參照之前實施例的說明進行類似操作,在此不再說明。本實施例中循跡器114的讀指針停止在處理器核116正在執(zhí)行的當前指令之后的第二個分支軌跡點處(結(jié)束軌跡點也被視為分支軌跡點)。此外,為清晰起見,在圖1lA中省略了掃描器108和主動表104。[0188]假設當前分支指令的分支轉(zhuǎn)移成功發(fā)生,則可以用從軌道表110中讀出的分支軌跡點內(nèi)容630中的第一地址(即塊號)在指令存儲器106中尋址,通過總線1117讀出分支目標指令塊。處理器核116接收并選擇來源于總線1117的目標指令塊中的指令作為下一步將被執(zhí)行的指令。[0189]按之前實施例所述技術方案,此時軌道表110和指令讀緩沖112中的替換邏輯已經(jīng)指出可以被替換的軌道(如:軌道1116)和指令塊(如:指令塊1118)。與軌道1116及指令塊1118對應的匹配器是匹配器1102。[0190]因此,經(jīng)掃描器108審查、提取得到的指令類型及經(jīng)主動表104匹配或分配產(chǎn)生的塊號等指令信息被存儲到軌道表110的軌道1116中,同時軌跡點內(nèi)容630中的第一地址被存儲到匹配器1102中的寄存器1104中,且總線1117上的目標指令塊被存儲到指令讀緩沖112的指令塊1118中。[0191]之后,軌道表110和指令讀緩沖112中的替換邏輯指向下一個可被替換的軌道(如:軌道1120)和指令塊(如:指令塊1138)。與軌道1120及指令塊1138對應的匹配器是匹配器1122。[0192]與此同時,可以計算出指令塊1118相鄰的下一個指令塊的地址,從而在主動表104中匹配得到該下一指令塊對應的塊號,該塊號(即第一地址)被存儲在軌道1116的結(jié)束軌跡點中,并被送到指令存儲器106尋址,通過總線1117從指令存儲器106中讀出指令塊1118相鄰的下一指令塊。類似地,該下一指令塊經(jīng)掃描器108審查、提取得到的指令類型及經(jīng)主動表104匹配或分配產(chǎn)生的塊號等指令信息被存儲到軌道表110的軌道1120中,同時軌跡點內(nèi)容630中的第一地址(即該下一指令塊對應的塊號)被存儲到匹配器1122中的寄存器1124中,且總線1117上的指令塊(即該下一指令塊)被存儲到指令讀緩沖112的指令塊1138中。[0193]由于上述分支指令的分支轉(zhuǎn)移成功發(fā)生,選擇器608受TAKEN信號622控制選擇來自總線630的該分支指令的分支目標軌跡點位置信息作為輸出,而寄存器610的值受BRANCH信號634控制更新為該分支目標軌跡點的第一地址和第二地址。各個匹配器中的相應寄存器(如匹配器1102中的寄存器1108、匹配器1122中的寄存器1128)的值也都受BRANCH信號634控制得以更新,將之前比較器(如匹配器1102中的比較器1110、匹配器1122中的比較器1130)的輸出寫入這些寄存器中。[0194]當寄存器610的值更新完畢后,新的第一地址讀指針614的值(即當前軌道的塊號)被送到各個匹配器中與存儲在寄存器(如寄存器1104、1124等)中的塊號進行匹配,其中匹配器1102中的比較器1110輸出匹配成功的比較結(jié)果,其他匹配器中的比較器均輸出匹配不成功的比較結(jié)果,因此,比較器1110的輸出選中軌道1116,使得軌道1116成為當前軌道。而新的第二地址讀指針616則從軌道1116上與寄存器610中存儲的第二地址相對應的軌跡點開始移動,直到停留在下一個分支軌跡點并通過總線630讀出該分支軌跡點的內(nèi)容。[0195]此時,匹配器1102中的或門1107的兩個輸入中,來自比較器1110的輸入為‘1’,來自寄存器1108的輸入為‘0’,因此或門1107的輸出為‘I’。而其他匹配器中的相應或門(如:匹配器1122中的或門1127等)的兩個輸入均為‘0’,其輸出均為‘O’。由于處理器核116所需執(zhí)行的指令在軌道1116對應的指令塊內(nèi),如圖3B實施例所述,處理器核116送出的指令地址的第4位1119與存儲在寄存器1104中的塊號最低位相同,因此比較器1106輸出‘匹配成功’的結(jié)果(即輸出‘I’),使得與門1114的兩個輸入均為‘1’,其輸出也為‘1’,從而選中指令塊1118作為當前指令塊通過總線1115送往處理器核116。其他匹配器中的相應與門(如:匹配器1122中的與門1127等)的來自或門的輸入均為‘0’,其輸出也均為‘0’,因此不會選中其他指令塊。[0196]接下來假設當前軌道中沒有分支軌跡點或有分支軌跡點但分支轉(zhuǎn)移均不發(fā)生,則循跡器114的讀指針繼續(xù)移動直到結(jié)束軌跡點,通過總線630讀出存儲在該結(jié)束軌跡點中的下一軌道塊號信息。[0197]由于結(jié)束軌跡點被視為分支轉(zhuǎn)移一定發(fā)生的分支軌跡點,因此TAKEN信號622選擇來自總線630的下一軌道信息作為選擇器608的輸出,BRANCH信號634控制寄存器610的值更新為下一軌道的第一個軌跡點的第一地址和第二地址。與此同時,BRANCH信號634還控制各個匹配器中的相應寄存器(如:寄存器1108、1128等)值的更新,將比較器(如:比較器1110、1130等)原來的輸出存儲到這些寄存器中,從而保存了比較器的上一次比較結(jié)果。[0198]當寄存器610的值更新完畢后,新的第一地址讀指針614的值(即下一軌道的塊號)被送到各個匹配器中與存儲在寄存器(如寄存器1104、1124等)中的塊號進行匹配,其中匹配器1122中的比較器1130輸出匹配成功的比較結(jié)果,其他匹配器中的比較器均輸出匹配不成功的比較結(jié)果,因此,比較器1130的輸出選中軌道1120,使得軌道1120成為供循跡器114讀指針移動的軌道。而新的第二地址讀指針616則從軌道1120上與寄存器610中存儲的第二地址相對應的軌跡點開始移動,直到停留在下一個分支軌跡點并通過總線630讀出該分支軌跡點的內(nèi)容。[0199]此時,匹配器1102中的或門1107的兩個輸入中,來自比較器1110的輸入為‘0’,來自寄存器1108的輸入為‘I’,因此或門1107的輸出為‘I’;匹配器1122中的或門1127的兩個輸入中,來自比較器1130的輸入為‘I’,來自寄存器1128的輸入為‘0’,因此或門1127的輸出也為‘I’。這樣,匹配器1102對應的指令塊1118和匹配器1122對應的指令塊1138均為可能被選中的指令塊。而其他匹配器中的相應或門的兩個輸入均為‘0’,其輸出均為‘0’。由于指令塊1118和指令塊1138是指令地址相鄰的兩個指令塊,如圖3B實施例所述,這兩個指令塊的塊地址(及塊號)最低位的值相反,因此,根據(jù)處理器核116所需執(zhí)行的指令的指令地址的第4位1119可以使比較器1106和比較器1126中的一個輸出‘匹配成功’的結(jié)果(即輸出‘I’),從而使得與門1114和與門1134中的一個輸出‘I’,從指令塊1118或指令塊1138中選出一個指令塊通過總線1115送往處理器核116,該指令塊包含了處理器核所需執(zhí)行的指令。這樣,循跡器114讀指針的移動與處理器核116的取指可以不必同步發(fā)生,即循跡器114讀指針指向的軌道與處理器核116取指時讀出的指令塊可以不相互對應。[0200]在后續(xù)的運行過程中,當寄存器610的值再次被更新且指向另外一條軌道(該軌道非軌道1116或軌道1120之一)時,BRANCH信號634控制匹配器中相應寄存器(如:寄存器1108、1128等)值的更新,將比較器(如:比較器1110、1130等)原來的輸出存儲到這些寄存器中,并在寄存器610的值更新完畢后,將新的第一地址讀指針614的值(即上述新軌道的塊號)被送到各個匹配器中與存儲在寄存器(如寄存器1104、1124等)中的塊號進行匹配。這樣,比較器1110的輸出結(jié)果為‘匹配不成功’,且寄存器1108存儲的值為‘0’,使得或門1107和與門1114的輸出均為‘0’,即指令塊1118不再是可能被選中的指令塊。比較器1130的輸出結(jié)果為‘匹配不成功’,但寄存器1128存儲的值為‘I’,使得或門1127的輸出為‘1’,即指令塊1138依然是可能被選中的指令塊。如之前所述,各個匹配器對第一地址讀指針614的值(塊號)匹配后,可以找到與該塊號對應的一條軌道和一個可能被選中的指令塊。同樣地,可以根據(jù)處理器核116送出的指令地址第4位1119從這兩個可能被選中的指令塊中選出包含處理器核所需執(zhí)行的指令在內(nèi)的一個指令塊。[0201]圖1lB是本發(fā)明所述用于選擇指令塊的匹配器的另一個實施例。在本實施例中,指令讀緩沖是雙端口存儲器,除第一端口1115外,還增加了第二端口1192。以匹配器1152為例,其中的寄存器1104、比較器1106、寄存器1108、或門1107和與門1114與圖1lA實施例中的相同。不同的是,匹配器1152中的比較器1110被稱為第一比較器,此外還增加了一個第二比較器1150。其中,第二比較器1150用于對匹配器1152中存儲的塊號和通過總線630輸入的目標塊號進行比較,并以其輸出作為字線對指令讀緩沖112的第二端口進行尋址,從而通過總線1190讀出目標指令段。此外,第二比較器1150的輸出還指向了軌道表110中的目標軌道。[0202]以下通過一個具體的例子對匹配器進行說明。為便于說明,在本實施例中,假設目標指令塊已經(jīng)被預取到指令存儲器106中。對于其他的情況,也可以參照之前實施例的說明進行類似操作,在此不再說明。本實施例中循跡器114的讀指針停止在處理器核116正在執(zhí)行的當前指令之后的第二個分支軌跡點處(結(jié)束軌跡點也被視為分支軌跡點)。此外,為清晰起見,在圖1lB中省略了掃描器108和主動表104。[0203]假設當前循跡器114的讀指針指向一個分支軌跡點,則可以用從軌道表110中讀出的分支軌跡點內(nèi)容630中的第一地址(即塊號)在各個匹配器的相應第二比較器(如:第二比較器1150、1160、1180等)中進行匹配。若匹配不成功,則按之前實施例所述方法,將該塊號送到指令存儲器106尋址,通過總線1194讀出分支目標指令塊,并由選擇器1190選擇后作為輸出經(jīng)總線1117送往處理器核116。若匹配成功,則可以根據(jù)這些第二比較器的匹配結(jié)果,從指令讀緩沖112中通過總線1192從第二端口讀出一個指令塊(即分支目標指令塊),并由選擇器1190選擇后作為輸出經(jīng)總線1117送往處理器核116。此外,與圖1lA實施例所述相同,當前指令塊經(jīng)總線1115被送往處理器核116。[0204]若該分支軌跡點的分支轉(zhuǎn)移沒有發(fā)生,則處理器核116執(zhí)行來源于總線1115的該分支指令順序執(zhí)行的后一條指令。循跡器114的讀指針繼續(xù)移動直到下一個分支軌跡點,讀出該分支軌跡點的內(nèi)容630中的第一地址(即塊號)在各個匹配器的相應比較器中進行匹配,并按之前所述方法進行后續(xù)操作。[0205]若該分支軌跡點的分支轉(zhuǎn)移成功發(fā)生,則處理器核116執(zhí)行來源于總線1117的該分支指令的分支目標指令。與圖1IA所述實施例相同,選擇器608受TAKEN信號622控制選擇來自總線630的該分支指令的分支目標軌跡點位置信息作為輸出,而寄存器610的值受BRANCH信號634控制更新為該分支目標軌跡點的第一地址和第二地址。各個匹配器中的相應寄存器的值也都受BRANCH信號634控制得以更新,將之前第一比較器的輸出寫入這些寄存器中。當寄存器610的值更新完畢后,新的第一地址讀指針614的值被送到各個匹配器中的第一比較器與存儲在寄存器中的塊號進行匹配。根據(jù)匹配結(jié)果,可以按圖1lA實施例所述方法確定兩個可能被選中的指令塊,并根據(jù)處理器核116送出的指令地址第4位1119從這兩個可能被選中的指令塊中選出包含處理器核所需執(zhí)行的指令在內(nèi)的一個指令塊作為新的當前指令塊通過總線1115送往處理器核116。之后的操作與之前實施例所述相同,在此不再說明。[0206]圖12A是根據(jù)本發(fā)明所述技術方案進行指令預取的實施例1200。在本實施例中,填充器102、掃描器108、主動表104、微型主動表1202、指令存儲器106、指令讀緩沖112和處理器核116與之前實施例相同。不同的是,循跡器114中增加了寄存器1206、選擇器1226和選擇器1228。[0207]寄存器1206保存了當前指令之后的第一個分支軌跡點的分支目標軌跡點位置信息,使得循跡器114的讀指針可以繼續(xù)移動以指向第二個分支軌跡點。[0208]選擇器1228由表示循跡器114第二地址讀指針616是否指向結(jié)束軌跡點的END信號1222控制,當?shù)诙刂纷x指針616指向結(jié)束軌跡點時,選擇器1228選擇來源于軌道表110的結(jié)束軌跡點內(nèi)容(即下一軌道的塊號)作為輸出,否則,選擇器1228選擇來源于加法器606的加法結(jié)果作為輸出。這樣當?shù)诙刂纷x指針616移動到軌道的結(jié)束軌跡點時,下一軌道的塊號可以在不影響寄存器1206中存儲的第一個分支點的分支目標軌跡點位置信息的情況下被旁路寫入寄存器610中,使得循跡器114的讀指針能移動到下一軌道,進而指向第二個分支點。[0209]選擇器1226則受循跡器114讀指針指向的分支指令類型控制。當該分支指令為間接分支指令時,選擇器1226選擇第一地址讀指針614的值作為輸出1224,否則選擇器1226選擇存儲在寄存器1206中的第一個分支點的分支目標軌跡點信息630作為輸出1224。這樣,當該分支指令是間接分支指令時,所述分支目標軌跡點信息630被強制置為該間接分支指令的軌跡點位置信息,從而使指令讀緩沖112能輸出該間接分支指令的基地址寄存器號和地址偏移量。這里的地址偏移量可以是間接分支指令用于計算分支目標地址的偏移量。[0210]此外,為了便于顯示,在本實施例中省略了圖6B中用于判斷基地址寄存器值更新時間點的模塊。[0211]在本實施例中,指令存儲器106的每個存儲塊含有2個地址連續(xù)的指令塊;其中每個指令塊包含8條指令(8instructions),每條指令含4個字節(jié)(Byte)。指令讀緩沖112包含了復數(shù)個獨立的指令塊;它們的指令地址可以是連續(xù)的,或不連續(xù)的;每一塊都與軌道表110中的一條軌道相對應。軌道表110由匹配器536、指令類型存儲器550和軌跡點存儲單元548構(gòu)成。其中,軌跡點存儲單元548存儲的軌跡點包含了分支指令相關的信息,如:分支目標第一地址和分支目標第二地址。[0212]在本實施例中,處理器核116同時獲取順序執(zhí)行下一指令1115和分支目標指令1117,且匹配器536的結(jié)構(gòu)與圖1lB中的匹配器相同。處理器核116可以根據(jù)分支指令執(zhí)行結(jié)果從順序執(zhí)行下一指令1115和分支目標指令1117中選擇正確的指令作為后續(xù)執(zhí)行的指令。[0213]在本實施例中,指令讀緩沖112是具有雙輸出端口的存儲器。指令讀緩沖112根據(jù)循跡器114的第一地址讀指針614尋址找到一個指令塊(即當前指令塊),并根據(jù)處理器核116輸出的指令地址的低位1218從該指令塊中選擇至少一條指令,作為第一輸出端口1115的輸出送往處理器核116;指令讀緩沖112還根據(jù)來源于選擇器1226的軌跡點信息1224尋址找到對應指令塊通過第二輸出端口1117送往處理器核116。當該分支指令是間接分支指令時,所述軌跡點信息1224就是該間接分支指令本身的軌跡點信息,因此指令讀緩沖112的第二輸出端口1117可以輸出該間接分支指令的基地址寄存器號和地址偏移量;否則,所述軌跡點信息1224就是分支目標軌跡點信息630,因此指令讀緩沖112的第二輸出端口1117輸出的就是分支目標指令塊。[0214]下面將以圖12B為例進行具體說明。圖12B是根據(jù)本發(fā)明技術方案對指令塊操作的一個實施例1250。在圖12B中顯示了存儲在軌道表110中的兩條軌道、存儲在指令讀緩沖112中的對應的兩個指令塊以及存儲在指令類型存儲器548中的對應指令類型。[0215]軌道1260對應的軌道號為‘0’(即ΒΝΧ0),其第2個軌跡點是一條直接分支指令,結(jié)束軌跡點1264中存儲的順序執(zhí)行下一指令塊對應的軌道號為‘3’(即BNX3)。相應地,在指令類型行1252中,第2條指令的對應指令類型為‘10’,表示這是一條分支指令(在本實施例中該分支指令的分支目標指令對應第7號軌道的第2個軌跡點),其他位置的指令類型為‘00’,表示這些都不是分支指令(為簡明起見,,在本實施例中沒有顯示指令類型中的‘00,)。[0216]軌道1262對應的軌道號為‘3’(即BNX3),其第2個軌跡點是一條間接分支指令,結(jié)束軌跡點1264中存儲了順序執(zhí)行下一指令塊對應的軌道號。軌道1262對應的指令塊1270中的第2條指令可以提供對應的間接分支指令用到的基地址寄存器號和偏移量。相應地,在指令類型行1254中,第2條指令的對應指令類型為‘11’,表示這是一條間接分支指令,其他位置的指令類型為‘00’,表示這些都不是分支指令。[0217]這樣,在軌道表110、指令類型存儲器550和指令讀緩沖112中都存儲了相應的信息,且指令塊1268順序執(zhí)行的下一指令塊就是指令塊1270。下面將在圖12A實施例中根據(jù)圖12B中的例子對相關操作進行說明。本實施例中當前指令之后的第一個分支軌跡點的分支目標信息被存儲在寄存器1206中,而循跡器114的讀指針指向第二個分支軌跡點處,并等待第一個分支軌跡點的執(zhí)行結(jié)果。[0218]循跡器114從軌跡點‘00’(即第O號軌道的第O號軌跡點,此時第一地址讀指針614值為‘0’,第二地址讀指針616的值為‘0’)開始運行,循跡器114移動第二地址讀指針616指向并停止在軌跡點‘02’(即第O號軌道的第2號軌跡點,此時第一地址讀指針614值為‘0’,第二地址讀指針616的值為‘2’)。根據(jù)循跡器114讀指針的尋址,從軌道表中讀出分支目標指令軌跡點位置‘75’(即第7號軌道的第5個軌跡點)并存儲在寄存器1206中,同時以該軌跡點位置‘75’對指令讀緩沖112進行尋址,從而將第7號軌道對應的指令塊從指令讀緩沖112的第二輸出端口1117中讀出。[0219]然后,循跡器114繼續(xù)移動直至位于位置‘08’(即第O號軌道的結(jié)束軌跡點,此時第一地址讀指針614值為‘0’,第二地址讀指針614值為‘8’)的結(jié)束軌跡點,根據(jù)讀出的軌道號‘3’直接將循跡器114的讀指針指向軌跡點‘30’(即第3號軌道的第O號軌跡點,此時第一地址讀指針614值為‘3’,第二地址讀指針616的值為‘0’)。之后循跡器114進一步移動讀指針停止在軌跡點‘32’(即第3號軌道的第2號軌跡點,此時第一地址讀指針614值為‘3’,第二地址讀指針616的值為‘2’)。[0220]如果軌跡點‘02’對應的分支轉(zhuǎn)移成功發(fā)生,那么處理器核116選擇來源于第二輸出端口1117的分支目標指令作為下一執(zhí)行的指令。寄存器1206中存儲的內(nèi)容被更新到寄存器610中。此時,第一地址讀指針614值為‘7’,第二地址讀指針616的值為‘5’,循跡器114開始在第7號軌道上移動并從第5個軌跡點開始尋找下一個分支軌跡點(為簡明起見,在圖12B中未顯示第7號軌道)。[0221]如果軌跡點‘02’對應的分支轉(zhuǎn)移不成功,循跡器114的第一讀指針614和第二讀指針616繼續(xù)停留并指向分支軌跡點‘32’。此時,由于指令類型‘11’表示該指令是一條間接分支指令,選擇器1226選擇第一地址讀指針614的值作為輸出1224送到匹配器536匹配后,從軌道表110中可以讀出指令間隔數(shù)‘-1’。此外還可以從指令讀緩沖112的第二輸出端口1117中讀出基地址寄存器號和間接分支偏移量。其中,基地址寄存器號被送到處理器核116以獲取基地址寄存器值,間接分支偏移量被送到加法器1236。當程序計數(shù)器到達軌跡點‘31’(該軌跡點位置值由循跡器讀指針616的值‘32’與指令間隔數(shù)‘-1’相加得到)對應的指令時,將處理器核116送出的基地址寄存器值1234作為加法器1236的另一個輸入,計算產(chǎn)生間接分支的分支目標地址1238。[0222]該分支目標地址1238被送到主動表104進行匹配。需要說明的是,選擇器1242僅在此時選擇分支目標地址1238作為輸出送往主動表(或微型主動表)進行匹配(通過對指令類型存儲器550中讀出的類型值進行譯碼,即可判斷出該時間點),其他時間均選擇來自掃描器108的分支目標地址作為輸出送往主動表(或微型主動表)。若在主動表104中匹配不成功(即對應指令塊尚未存儲在指令存儲器106中),則由主動表104分配一個新的塊號(BNX),并將該分支目標地址1238送到填充器102,從外部存儲器獲取該指令塊并根據(jù)上述分配的塊號填充指令存儲器106。若在主動表104中匹配成功,則從主動表104中讀出該地址對應的塊號。[0223]若該分支指令的分支轉(zhuǎn)移沒有發(fā)生,則循跡器114的讀指針沿第3號軌道繼續(xù)尋找下一個分支點。[0224]若該分支指令的分支轉(zhuǎn)移成功發(fā)生,前述塊號不被填入軌道表110,而直接被旁路寫入寄存器610中以更新循跡器114的讀指針。該塊號也被送到匹配器536中進行匹配,若在匹配器536中匹配成功,則該塊號對應的軌道已在軌道表110,指令塊已在指令讀緩沖112中。若在匹配器536中匹配不成功,貝U表不軌道表110中尚未建立該塊號對應的軌道,需要將該塊號對應的指令從指令存儲器106填充到指令讀緩沖112中,并在軌道表110中建立該分支目標指令塊對應的軌道。由循跡器114第一地址讀指針614指出的該軌道中的由第二地址讀指針616指出的指令軌跡點被從軌道表110中讀出。循跡器114的讀指針由此點出發(fā)移向下一個分支點。[0225]后續(xù)操作與之前實施例所述相同,在此不再說明。[0226]需要注意的是,圖12A及圖12B的相關說明只是為了闡述本發(fā)明技術方案的一個具體實施例。除此以外,根據(jù)本發(fā)明的技術方案和構(gòu)思,可以對該具體實施例作出相應的改動。例如??梢詫⒔Y(jié)束軌跡點視為分支轉(zhuǎn)移必定發(fā)生的分支軌跡點,且當結(jié)束軌跡點是當前指令之后的第二個分支軌跡點時,循跡器114的讀指針可以停留并指向該結(jié)束軌跡點,直至第一個分支軌跡點執(zhí)行完畢為止。根據(jù)本發(fā)明技術方案和構(gòu)思,還可以有其他任何合適的改動。對于本領域普通技術人員來說,所有這些替換、調(diào)整和改進都應屬于本發(fā)明所附權利要求的保護范圍?!緳嗬蟆?.一種用于輔助處理器核運行的方法,所述處理器核連接一個包含可執(zhí)行指令的第一存儲器、一個比第一存儲器速度更快的第二存儲器和一個比第二存儲器速度更快的第三存儲器;所述方法包括:對正被從第二存儲器填充到第三存儲器的指令進行審查,從而提取出至少包括分支信息的指令信息;根據(jù)提取出的指令信息建立復數(shù)條軌道;根據(jù)復數(shù)條指令軌道中的一條或多條軌道將至少一條或多條指令可能被處理器核執(zhí)行的指令從第一存儲器填充到第二存儲器;根據(jù)復數(shù)條指令軌道中的一條或多條軌道將至少一條或多條指令在被處理器核執(zhí)行前從第二存儲器填充到第三存儲器,使得處理器核能從第三存儲器獲取所述至少一條或多條指令。2.根據(jù)權利要求1所述方法,其特征在于將所述軌道與第三存儲器中的指令塊一一對應。3.根據(jù)權利要求1所述方法,其特征在于第二存儲器和第三存儲器均可以有輸出寄存器,使得在保持輸出值不變的情況下能進行新的存儲器尋址。4.根據(jù)權利要求1所述方法,其特征在于可以由掃描器對目標指令的地址進行判斷,從而確定該目標指令是否屬于第三存儲器中的某個指令塊。5.根據(jù)權利要求1所述方法,其特征在于軌道表表項的格式包括指令類型、第一地址和第二地址,結(jié)束軌跡點對應的表項格式包括指令類型、第一地址,結(jié)束軌跡點對應的第二地址為常數(shù)。6.根據(jù)權利要求1所述方法,其特征在于可以在軌道表外增加一個臨時寄存器行用于存放正被建立的軌道的信息,使得整條軌道可以在建立完成后被一起寫入軌道表。7.根據(jù)權利要求1所述方法,其特征在于同一條軌道中的所有指令類型可以被一次讀出。8.根據(jù)權利要求7所述方法,其特征在于循跡器根據(jù)讀出軌道中的指令類型,將讀指針移動到當前指令后的第一條分支指令對應的軌跡點。9.根據(jù)權利要求1所述方法,其特征在于將最后更新間接分支指令中基地址寄存器值的指令與該間接分支指令之間的距離記錄在軌道表中該間接分支指令對應的表項中,以確定該基地址寄存器更新完畢的時間點。10.根據(jù)權利要求1所述方法,其特征在于可以有一個對應軌道表中軌道塊號與指令讀緩沖中指令塊地址的微型主動表。11.根據(jù)權利要求1所述方法,其特征在于可以用計數(shù)器記錄主動表中塊號被軌道表引用的次數(shù),使得當前被軌道表引用的塊號不會被替換出主動表。12.根據(jù)權利要求1所述方法,其特征在于可以對軌道表進行掃描,一旦發(fā)現(xiàn)有對主動表塊號的引用就將主動表對應塊號的標志位置位;同時依次將主動表中各個塊號的標志位復位,從而用已置位的標志位表示當前被軌道表引用的塊號,使之不會被替換出主動表。13.根據(jù)權利要求1所述方法,其特征在于可以由第三存儲器提供當前指令塊。14.根據(jù)權利要求1所述方法,其特征在于可以由第三存儲器提供下一指令塊。15.根據(jù)權利要求1所述方法,其特征在于可以由第三存儲器或第二存儲器提供目標指令塊。16.根據(jù)權利要求1所述方法,其特征在于可以由第三存儲器提供當前指令塊,且同時由第二存儲器提供目標指令塊17.根據(jù)權利要求1所述方法,其特征在于可以通過匹配,在第三存儲器中同時找到當前指令塊和下一指令塊。18.根據(jù)權利要求1所述方法,其特征在于可以通過匹配,在第三存儲器中同時找到當前指令塊、下一指令塊和目標指令塊。19.根據(jù)權利要求17所述方法,其特征在于可以根據(jù)指令地址的部分位,從當前指令塊和下一指令塊中找到所需指令。`【文檔編號】G06F9/38GK103513958SQ201210228129【公開日】2014年1月15日申請日期:2012年6月27日優(yōu)先權日:2012年6月27日【發(fā)明者】林正浩申請人:上海芯豪微電子有限公司