適用於微處理器的裝置及方法
2023-07-24 07:30:41
專利名稱::適用於微處理器的裝置及方法
技術領域:
:本發明是有關微處理器領域,特別是關於從一種具有可變長度指令的指令集架構的微處理器的指令字節串流中取得指令。
背景技術:
:微處理器包含一或多個執行單元,用以進行實際的指令執行。超純量(superscalar)微處理器可於每一時鐘周期內發出多個指令至各個執行單元,因而得以增進總處理能力或增進每一時鐘周期內的平均指令。然而,微處理器管線上端的指令提取及解碼功能必須以有效率的速度來提供一指令串流給執行單元,藉以有效地使用執行單元及增進總處理能力。x86架構由於其指令長度並非固定,因此使得此工作更加困難,在此架構下,其每一指令的長度是變動的,此將於以下詳述。因此,x86微處理器必須包含很多的邏輯電路以處理進來的指令字節串流,以決定指令的開始及結束位置。因此,必須增進x86微處理器解析指令字節串流以得到各個指令的處理速率。
發明內容根據本發明特徵之一,本發明提供一種適用於微處理器的裝置,該微處理器的指令集架構包含可變數目的前置字節,該裝置用以有效地自一指令字節串流中提取指令。該裝置包含一解碼邏輯單元,用以對該指令字節串流中多個指令的每一指令判斷其操作碼字節,其中該操作碼字節為相應的該指令的第一非前置字節,該解碼邏輯單元還累積該多個指令的每一指令的前置消息至相應的該操作碼字節;一隊列,耦接至該解碼邏輯單元,用以暫存該指令字節串流及該累積前置消息;及一提取邏輯單元,耦接至該隊列,用以於一時鐘周期內,自該隊列提取該多個指令,其不受該多個指令的每一指令中的前置字節數目所影響。根據本發明特徵之一,本發明提供一種適用於微處理器的方法,該微處理器的指令集架構包含可變數目的前置字節,該方法用以有效地自一指令字節串流中提取指令。該方法包含對於該指令字節串流中多個指令的每一指令,判斷其操作碼字節,其中該操作碼字節為相應的該指令的第一非前置字節;對於該多個指令的每一指令,累積其前置消息至相應的該指令的該操作字節;及於一時鐘周期內,自一隊列提取該多個指令,其不受該多個指令的每一指令中的前置字節數目所影響。圖1顯示本發明實施例的微處理器的方塊圖。圖2顯示圖1的指令格式器的L級的方塊圖。圖3顯示圖2的累積前置消息238。圖4顯示圖1的微處理器的操作。圖5顯示圖1的指令格式器的部分L級和M級方塊圖。圖6顯示圖5所示的微處理器元件的操作流程圖,用以自指令字節串流中取出指令(在一實施例中最多可取出三指令),其不會產生時間延遲且與指令中的前置字節數目無關。圖7顯示圖1的指令格式器的一部分的方塊圖。圖8a和圖8b顯示圖7的部分指令格式器的操作流程圖。圖9顯示圖5的多工隊列的詳細方塊圖。圖10顯示圖1的指令格式器的部分M級的方塊圖。圖11顯示圖5的M級控制邏輯單元的方塊圖。圖12顯示圖1的指令格式器的部分M級的操作流程圖。圖13顯示圖5的多工隊列於連續兩個時鐘周期的內容,以例示M級的操作。圖14顯示圖5的多工隊列於連續兩個時鐘周期的內容,以例示M級的操作。圖15顯示圖14中指令格式器於一時鐘周期內,將含有最多四十個指令字節的三個指令取得並傳送出去。圖16顯示圖1的BTAC作了不良預測因而造成微處理器的分支錯誤,亦即,圖1的分支發生指示為邏輯真值但非為指令的操作碼。圖17顯示漣波邏輯單元輸出的組成信號。圖18顯示圖1的微處理器的操作流程圖。圖19顯示圖2的長度解碼器的詳細方塊圖。圖20顯示十六個長度解碼器的配置。圖21顯示圖20的長度解碼器的操作流程圖。[主要元件標號說明]100微處理器102指令高速緩存104x86指令字節隊列106指令格式器108格式化指令隊列112指令轉譯器114轉譯指令隊列116暫存器別名表118保留站122執行單元124引退單元126提取單元128分支目標地址高速緩存132指令字節134指令字節136x86指令串流142目前提取地址144加法器146預測目標地址148執行目標地址152下一個連續提取地址154分支發生指示202長度解碼器204漣波邏輯單元208控制邏輯單元212長度解碼器的輸出214漣波邏輯單元的輸出218操作數及地址尺寸222指令長度224解碼任一前置指示付226解碼LMP指示符228受LMP影響指示符229前置消息232開始位234結束位236有效位238累積前置消息252預設操作數及地址尺寸3020S304AS306REX出現308REX.ff312REX.R314REX.X316REX.B318REP322REPNE324LOCK326片段超出出現328編碼段超出[2:0]332任一前置出現402-414步驟502多工隊列50411多工器50612多工器50813多工器512M級控制邏輯單元514控制信號516控制信號518控制信號524第一指令11526第二指令12528第三指令13534,536,538有效指示符602-608步驟702XIBQ控制邏輯單元802-824步驟1002累積前置陣列1004指令字節陣列1102減法器1104部分LEN1106剩餘LEW1108位元組位置END11112位元組位置END01114多工器1116加法器1118暫存器1122指令長度LEW1201-1222步驟1702不良BTAC位1802-1816步驟1902可編程邏輯陣列(PLA)1904加法器1906多工器1912eaLen1914控制信號1916immLen值1918eaLeniM.2102-2116步驟具體實施例方式圖1顯示本發明實施例的微處理器100的方塊圖。微處理器100包含由多級或多個功能單元所組成的管線(pipeline),其包含四級指令高速緩存(four-stageinstructioncache)102、x86指令字節隊列(x86instructionbytequeue,XIBQ)104、指令格式器(instructionformatter)106(其包含三級L、M及F)、格式化指令隊列(formattedinstructionqueue)108、才旨令轉i華器(instructiontranslator)112、轉i華才旨令隊歹lj(translatedinstructionqueue)114、暫存器另lj名@(registeraliastable)116、{呆留站(reservationstation)118、執行單元(executionunits)122及弓|退單元(retireunit)124。微處理器100還包含提取單元(fetchunit)126,其提供目前提取地址142給指令高速緩存102,用以選擇一指令字節(byte)132快取列至XIBQ104。微處理器100還包含加法器144,其增加目前提取地址142以產生下一個連續提取地址152,再反饋至提取單元126。提取單元126還從分支目標地址高速緩存(branchtargetaddresscache,BTAC)128接收預測目標地址146。最後,提取單元126從執行單元122接收執行目標地址(executedtargetaddress)148。XIBQ104的隊列含有多個項目(entry),每一個項目包含來自指令高速緩存102的十六字節數據。再者,XIBQ104的每一個項目包含數據字節相關的預解碼(pre-decoded)消息。預解碼消息為當數據字節從指令高速緩存102流至XIBQ104時所產生的。來自XIBQ104的快取數據為指令字節134串流,其形式為多個十六字節區塊,然而並不知道串流內或區塊內的x86指令的開始或結束位置。指令格式器106即用以決定串流內每一指令的開始及結束字節,從而將字節串流分離為x86指令串流136,其再饋至並儲存于格式化指令隊列108,以待微處理器100管線的其它部分進行處理。當發生重置或執行/預測到流量控制指令(例如跳越(jump)指令、子例程呼叫(subroutinecall)指令或自子例程返回指令)時,則提供重置地址或分支目標地址給指令格式器106作為指令指針(pointer),用以致能指令格式器106,使其決定出指令串流的目前的十六字節區塊內的第一有效指令的第一字節。因此,指令格式器106即可根據第一目標指令的開始位置加上第一目標指令的長度,以決定下一指令的開始位置。指令格式器106重複上述程序,直到執行或預測到另一流量控制指令。BTAC128還提供分支發生(taken)指示154給XIBQ104。指令高速緩存102提供給XIBQ104的每一指令字節132對應有一個分支發生指示154。分支發生指示154用以表示BTAC128預測提供給XIBQ104的指令字節132列是否具有分支指令;如果為是,則提取單元126將會選取BTAC128所提供的預測目標地址146。詳而言之,BTAC128對於分支指令的第一字節(即使該第一字節為前置字節)會相應輸出邏輯真值的分支發生指示154,但對於指令的其它字節則會輸出邏輯假值的分支發生指示154。微處理器100為x86架構的微處理器100。當微處理器可正確地執行專為x86微處理器所執行的大部分應用程式時,則該微處理器即可視為x86架構的微處理器。當可以得到預期結果時,則該應用程式即可視為可正確地執行。X86架構的特徵之一為其指令集架構中的指令長度是可變的,而非像一些指令集架構中的指令長度是固定的。再者,對於某一x86操作碼(opcode),可能會因為操作碼之前是否具有前置(prefix)而影響指令的長度。此外,一些指令的長度可能為微處理器100操作模式下的預設操作數(operand)及/或地址尺寸的函數(例如碼段描述符(codesegmentdescriptor)的D位,或者微處理器100是否操作於IA_32e或64位模式)。最後,於預設地址/操作數尺寸之外,指令還可包含一長度修改前置(length-modifyingprefix),用以選擇地址/操作數尺寸。例如,可使用操作數尺寸(operandsize,OS)前置(0x66)、地址尺寸(AS)前置(0x67)及REX前置(0x4x)的REX.W位(位3)以改變預設的地址/操作數尺寸。英特爾(Intel)公司稱這些為長度改變前置(length-changingprefix,LCP),然而在本說明書中則稱為長度修改前置(length-modifyingprefix,LMP)。X86指令的格式及長度為大家所熟知,細節可參考IA-32英特爾架構軟體開發手冊(IA-32IntelArchitectureSoftwareDeveloper,sManual),第2k集的第二章指令集參考(InstructionSetReference),A_M,公元2006年六月。根據英特爾64及IA-32架構最佳化參考手冊(Intel64andIA-32ArchitecturesOptimizationReferenceManual),^712009^Hi^,M3-21M3-23(可自下列網頁下載http//www.intel.com/Assets/PDF/manual/248966.pdf)「當預解碼器於提取列中遇到LCP,則必須使用較慢的長度解碼算法。當使用較慢的長度解碼算法時,預解碼器於六個周期內進行解碼,而非一般的一個周期。於機器管線內的隊列(queuing)一般是無法避免LCP造成的延遲。」圖2顯示圖1的指令格式器106的L級的方塊圖。指令格式器106包含多個長度解碼器202,其輸出212分別耦接至多個漣波(ripple)邏輯單元204,漣波邏輯單元204的輸出214耦接至控制邏輯單元208並提供給指令格式器106的M級。在一實施例中,長度解碼器202於微處理器100的二相位時鐘信號的第一相位期間產生輸出212,而漣波邏輯單元204於二相位時鐘信號的第二相位期間產生輸出214。長度解碼器202從XIBQ104接收指令字節134。在一實施例中,XIBQ104的每一項目寬度為十六字節,因而相應有十六個長度解碼器202,如圖2所示的0至15。每一個長度解碼器202自XIBQ104的底部項目接收並解碼相應的指令字節。此外,每一個長度解碼器202接收並解碼接下來的三個相鄰指令字節。對於最後三個長度解碼器202,其自XIBQ104的底部倒數第二個項目接收一或多個指令字節(如果XIBQ104的底部倒數第二個項目為無效,則最後三個長度解碼器202必須等待下一個時鐘周期中產生有效輸出)。長度解碼器202的細節將於圖19說明。藉此,使得長度解碼器202可以決定及輸出XIBQ104的底部項目中的指令的指令長度222。在一實施例中,指令長度222表示該指令除了前置字節以外的字節數目。換句話說,指令長度222表示指令當中,從操作碼至最後一個字節的字節數目。具體來說,由對應於指令的第一指令字節的長度解碼器202所輸出的指令長度為指令長度222。為了產生指令長度222,長度解碼器202還使用接收自控制邏輯單元208的操作數及地址尺寸218。控制邏輯單元208對於每一指令字節134會輸出操作數及地址尺寸218。控制邏輯單元208根據目前微處理器100的預設操作數及地址尺寸252和漣波邏輯單元204的輸出214以決定操作數及地址尺寸218。如果漣波邏輯單元204的輸出214表示指令中無LMP,則控制邏輯單元208對於每一指令字節會輸出預設操作數及地址尺寸給相應的長度解碼器202。然而,如果漣波邏輯單元204的輸出214表示指令中有一或多個LMP,則控制邏輯單元208對於每一指令字節會修改預設操作數及地址尺寸252而輸出操作數及地址尺寸218給相應的長度解碼器202,其中控制邏輯單元208根據0S302、AS304及REX.W308位的值修改預設操作數及地址尺寸252,這些位包含於漣波邏輯單元204的輸出214的累積前置消息238中,如圖3所示。如圖2所示,每一長度解碼器202的輸出212包含指令字節134、指令長度222、解碼任一前置指示符(decodedanyprefixindicator)224、解碼LMP指示符(decodedLMPindicator)226、受LMP影響指示符(susceptibletoLMPindicator)228及前置消息229。當長度解碼器202所解碼的字節對應到任一x86前置(無論其是否為LMP),則解碼任一前置指示符224為邏輯真值;否則,為邏輯假值。8當長度解碼器202所解碼的字節對應到任一X86LMP,亦即OS前置(0x66)、AS前置(0x67)或REX.W前置(0x48-0x4F),則解碼LMP指示符226為邏輯真值;否則,為邏輯假值。當長度解碼器202所解碼的字節是操作碼字節,其中操作碼的指令長度不受LMP影響(例如,OS前置對於一些SIMD指令為強制的,因此不能改變其長度),則受LMP影響指示符228為邏輯假值;否則,為邏輯真值。前置消息229包含多個位(bit),用以表示指令字節是否具有各種x86前置其中之一。這些位類似於圖3所示的累積前置消息238。然而,長度解碼器202輸出的前置消息229僅表示單一前置,亦即,受長度解碼器202解碼的單一對應的指令字節的前置值。相反的,由於漣波邏輯單元204將所有長度解碼器202提供的前置消息229予以累積,因此累積前置消息238則表示指令中的所有前置。如圖2所示,每一漣波邏輯單元204的輸出214包含指令字節134、開始位232、結束位234、有效位236及累積前置消息238。每一漣波邏輯單元204的輸出214還饋至下一相鄰的漣波邏輯單元204。在一實施例中,十六個漣波邏輯單元204組織成四個邏輯區塊,每一區塊處理四個指令字節及其相關消息。每一漣波邏輯單元區塊204還輸出相應的指令字節。當漣波邏輯單元204所處理的字節為指令的操作碼字節時(例如指令的第一字節非為前置字節),則開始位232為邏輯真值。指令格式器106增加一指標,其指向所有前置字節,使得當指針指向一非前置字節時,該指針將會指向指令的操作數字節。當漣波邏輯單元204所處理的字節為指令的最後字節時,則結束位234為邏輯真值;否則,為邏輯假值。從漣波邏輯單元204輸出的十六個有效位236的第一個開始,直到出現第一個未處理的LMP為止,每一有效位236為邏輯真值。累積前置消息238顯示於圖3並討論如上。控制邏輯單元208使用累積前置消息238並配合有效位236,以決定是否使用預設操作數及地址尺寸252或對其進行修改。值得注意的是,長度解碼器202的輸出212屬於一種試驗性質。換句話說,其產生輸出時並不知道相關指令字節在指令內的地址。尤其是,與前置相關的指示符224/226/228/229是在假設該字節為有效前置的前提下所產生的,而此假設可能是一個錯誤的假設。因此,該字節可能恰巧具有一前置的值,但該字節其實是具有與LMP相同的值的位移(displacement)字節。例如,0x67為AS前置的值,其為LMP。然而,地址位移字節或立即數據值(immediatedatavalue)字節或ModR/M字節或指令的SIB字節皆不是前置字節,但可能具有0x67值。僅當指令字節的目前區塊中的所有LMP都已處理,才能確定相應於區塊中所有字節的輸出212及214都為正確。如果在目前時鐘周期內,XIBQ104項目中的所有指令字節並未被解碼出任何LMP,則L級會在單一時鐘周期內產生整個項目的漣波邏輯單元204輸出214(特別是開始位232和結束位234)。如果XIBQ104目前的項目中被解碼出一或多個LMP,則產生具正確開始位232和結束位234的漣波邏輯單元204輸出214所需的時鐘周期數為N+1,其中N為XIBQ104目前的項目中具有至少一LMP的指令的數目。無論項目中的任一指令的前置數目為多少,L級均可執行上述工作,此顯示於圖4的流程圖中。控制邏輯單元208包含一狀態,用以表示指令字節的目前區塊中的哪些字節已被處理過,哪些尚未處理。該狀態使得控制邏輯單元208可針對每一指令字節產生有效位236及操作數及地址尺寸218。由於具有含LMP的指令的指令字節區塊的處理具有迭代(iterative)特性,即使於第一時鐘周期時,含LMP的第一指令的指令長度222、開始位232和結束位234可能並不正確;然而,於下一時鐘周期時,第一指令和任一不含LMP的相鄰指令的指令長度222、開始位232和結束位234則會變為正確;且於接續時鐘周期中,第一指令的下一含LMP的指令及其相鄰不含LMP的指令的指令長度222、開始位232和結束位234均會正確。在一實施例中,該狀態包含十六位暫存器,用以表示相關指令字節是否已被處理。[針對含有LMP的指令標示出開始及結束字節]圖4顯示圖1的微處理器100的操作,該流程始於步驟402。於步驟402,控制邏輯單元208輸出預設操作數及地址尺寸218給長度解碼器202。接著,流程進入步驟404。於步驟404,於時鐘周期的第一相位,長度解碼器202根據控制邏輯單元208提供的操作數及地址尺寸218,以解碼XIBQ104的底部項目的指令字節並產生其輸出212。如前所述,對於XIBQ104的底部項目的每一指令字節,長度解碼器202的輸出212包含指令長度222及與前置相關的指示符224/226/228/229(圖2)。接著,流程進入步驟406。於步驟406,於時鐘周期的第二相位,漣波邏輯單元204根據長度解碼器202的輸出212以產生輸出214。如前所述,漣波邏輯單元204的輸出214包含開始位232、結束位234、有效位236及累積前置消息238(圖3)。接著,流程進入步驟408。於步驟408,控制邏輯單元208檢視(examine)漣波邏輯單元204的輸出214,以判斷XIBQ104的底部項目中是否還有任何指令包含未處理的LMP(長度修改前置符)。如果為是,則進入步驟412否則,進入步驟414。於步驟412,控制邏輯單元208根據漣波邏輯單元204提供的累積前置消息238,以更新內部狀態及操作數及地址尺寸。接著,流程返回步驟404,依據新的操作數尺寸及地址尺寸,再次處理底部項目的指令字節。於步驟414,控制邏輯單元208判斷底部項目的指令字節已完全處理完,因而將其自XIBQ104移出,並將其連同每一指令字節134相應的漣波邏輯單元204的輸出214—起送至M級。特別的是,如前所述,由於漣波邏輯單元204的輸出214包含開始位232及結束位234,其表示出指令高速緩存102所提供的指令串流當中每一指令的邊界,因而使得指令格式器106的M級和F級得以進一步處理指令串流,並將個別指令置入FIQ(格式化指令隊列)108,讓指令轉譯器112進行處理。流程結束於步驟414。根據前述,如果指令字節中未含有LMP(長度修改前置符),則L級可於單一時鐘周期中針對XIBQ(x86位元組字隊列)104的整個項目以產生開始位232及結束位234;如果XIBQ104的項目中有一個或更多指令具有LMP(長度修改前置符),則產生開始位232及結束位234所需的時鐘周期數變為N+1,其中N為XIBQ104項目中含有至少一LMP(長度修改前置符)的指令數目,且無論指令中含有的前置數目為何,L級都可以進行。[累積前置以有效地處理含多個前置字節的指令]x86架構允許指令含有0至14個前置字節。此造成管線(pipeline)前端於處理指令字節串流時的困難。以往於處理含相當數目的前置字節的指令時,會遭遇時間的延10遲。根據英特爾64及IA-32架構最佳化參考手冊(Intel64andIA-32ArchitecturesOptimizationReferenceManual),公元2009年三月,頁12_5,英特爾針對ATOM微架構提到「含三個以上前置的指令會產生MSR0M轉移,造成前端的二個時鐘周期延遲。」根據另一研究文獻-英特爾及AMD中央處理器的微架構(ThemicroarchitectureofIntelandAMDCPU's),作者AgnerFog,CopenhagenUniversityCollegeofEnginerring,公元2009年5月5日最後一次更新,頁93(可於以下網頁下載www.agner.org/optimize/microarchitecture,pdf),其提到「含多個前置的指令需要額外時間以進行解碼。P4的指令解碼器於一時鐘周期內僅可處理一前置。於P4上,含多個前置的指令其每一個前置需花費一時鐘周期解碼」,且「P4E的指令解碼器可於一時鐘周期處理二個前置。因此,單一時鐘周期內可解碼含有至多二前置的指令,而含三或四個前置的指令則需於二時鐘周期內進行解碼。P4E的所以增加此功能,乃因為在64位模式下,很多指令都含有二前置(例如操作數尺寸前置及REX前置)。」然而,本發明實施例在不需增加時間延遲的條件下,可處理一個指令中架構所允許的所有(至多14個)前置字節,無論前置字節的數量為何(只要該前置非為LMP(長度修改前置符),若該前置為LMP,則含一或多個前置的每一指令會額外增加一時鐘周期的處理時間,如前所述)。本發明實施例的所以能夠達成此目的,是因為長度解碼器202產生前置消息229,而漣波邏輯單元204則累積前置消息229以產生累積前置消息238給指令的操作碼字節,此將於以下詳述。圖5顯示圖1的指令格式器106的部分L級和M級(多工級)方塊圖。M級包含多工隊列(muxqueue)502。在一實施例中,多工隊列502包含四個項目,每一項目儲存十六字節。多工隊列502的下一空白項目接收相應漣波邏輯單元204的輸出214(圖2),其包含指令字節134、開始位232、結束位234及累積前置消息238。M級還包含M級控制邏輯單元512,其自多工隊列502的底部項目接收開始/結束位232/234,且(在一實施例中)接收多工隊列502的底部倒數第二項目(next-to-bottomentry,NTBE)的前十字節。根據開始/結束位232/234,M級控制邏輯單元512控制三組多工邏輯單元,分別為II多工器504、12多工器506及13多工器508。II多工器504輸出第一指令11524至指令格式器106的F級;12多工器506輸出第二指令12526至F級;13多工器508輸出第三指令13528至F級。此外,M級控制邏輯單元512輸出三個有效指示符534/536/538,用以表示相應的第一、第二、第三指令524/526/528是否有效。藉此,M級得以從指令串流中最多取出(extract)三個格式化指令,並在單一時鐘周期內將其提供給F級。在其它實施例中,M級可在單一時鐘周期內取出並提供多於三個格式化指令給F級。三個指令524/526/528中的每一指令包含相應指令字節134,並且其前置字節被置換為相應的累積前置消息238。換句話說,每一指令524/526/528包含操作碼字節及指令字節的其它部分以及累積前置消息238。每一多工器504/506/508自多工隊列502的相應底部項目分別接收消息214(但開始位232、結束位234除外),且(在一實施例中)自多工隊列502的相應NTBE接收前十字節,用以個別選取及輸出指令524/526/528。圖6顯示圖5所示的微處理器100元件的操作流程圖,用以自指令字節串流中取出指令(在一實施例中最多可取出三指令),其不會產生時間延遲且與指令中的前置字節數目無關。如前所述,漣波邏輯單元204會累積前置消息229以產生累積前置消息238給指令的操作碼字節。所示流程始於步驟602。於步驟602,於時鐘周期的第一相位,長度解碼器202解碼指令字節134串流以產生輸出212(圖2),特別是前置消息229,此和步驟404的操作類似。接著,進入步驟604。於步驟604,於時鐘周期的第二相位,漣波邏輯單元204依據前置消息229以決定串流的每一個指令中哪一字節為操作碼字節(亦即第一非前置字節)。再者,漣波邏輯單元204針對指令中的所有(最多為十四個)前置字節累積其前置消息229,以產生累積前置消息238給指令的操作碼字節。特別的是,漣波邏輯單元204自指令的第一前置字節開始累積前置消息229,並且逐一累積每個字節的前置消息229,直到其檢測到操作碼字節為止。屆時,漣波邏輯單元204停止前置消息的累積,使得目前指令的累積前置消息238不會繼續累積到下一指令去。漣波邏輯單元204自下一指令的第一前置字節開始進行前置消息229的累積,並停止於操作碼字節。對於串流中的每一指令,重複此程序。漣波邏輯單元204使用長度解碼器202的另一輸出212以完成前置消息的累積。例如,如前所述,漣波邏輯單元204使用指令長度222以決定每一指令的第一字節,其可能為前置字節,用以開始前置消息的累積程序。漣波邏輯單元204還使用其它消息224/226/228以決定操作碼字節的位置,其為不含前置的指令的第一字節(由開始位232表示),並決定指令最後字節的位置(由結束位234表示)。接著,流程進入步驟606。於步驟606,指令字節134及相應的開始/結束位232/234、累積前置消息238被加載多工隊列502的下一可用項目中。在一實施例中,步驟602、604、606所示的步驟被於單一時鐘周期內執行(假設指令不含有LMP(長度修改前置符))。接著,進入步驟608。於步驟608,在下一時鐘周期,M級控制邏輯單元512控制多工器504/506/508,使其至多可取出三個指令。換句話說,不管前置字節的數量為何,M級不需增加時間延遲而能夠取得指令。經多工(muxed)後,指令524/526/528可各個饋至F級。特別的是,M級隨著累積前置消息238可取出每一指令的操作碼字節及後續字節。F級依據指令型態、一些可能的例外情形、可配對性(pairability)及其它特性以解碼指令524/526/528,以開始指令524/526/528的轉譯。F級和指令轉譯器112可利用累積前置消息238。流程結束於步驟608。本實施例不同於傳統的設計。如前所述,漣波邏輯單元204較傳統來得複雜,其所產生的開始位232是指向指令的操作碼字節,而非如傳統般指向指令的第一字節(其可能為前置字節),且產生累積前置消息238,因此,無論前置字節的數量為何均可取得指令且不會造成時間延遲(除非是LMP(長度修改前置),已如前述)。相反地,傳統的作法是指出指令實際的第一字節為第一字節,如果指令含有前置字節,則該前置字節被表示為第一指令。當指令含有多個前置字節時,為了除去前置字節,傳統的多工邏輯因此會造成時間延遲。[當指令部分出現時,以開始/結束標示使得快取數據能儘快釋放]圖7顯示圖1的指令格式器106的一部分的方塊圖。在圖1中,指令高速緩存102提供指令字節132至XIBQ104。在一實施例中,指令格式器106包含預解碼(pre-decode)邏輯單元(未顯示於圖式中),用以對來自指令高速緩存102的指令字節132進行預解碼,而經預解碼消息則連同指令字節132—並載至XIBQ104。指令格式器106包含XIBQ控制邏輯單元702,其控制XIBQ104的項目加載及移出。12長度解碼器202及漣波邏輯單元204(圖2)自XIBQ104接收指令字節134並產生輸出214,用以提供給圖5的多工隊列502及指令格式器106的M級控制邏輯單元512。M級控制邏輯單元512控制多工隊列502的項目加載及移出。多工隊列502自其項目中提供消息214給多工器504/506/508和M級控制邏輯單元512,M級控制邏輯單元512又控制多工器504/506/508,如前所述。當以下情形時會產生問題(1)XIBQ104的底部項目包含有效指令字節但是NTBE則未包含;(2)只有部分的指令(例如指令的第一或第二字節)在底部項目;(3)部分的指令未提供足夠消息讓長度解碼器202/漣波邏輯單元204決定指令長度222(及開始/結束位232/234),亦即,指令還有一些字節位於NTBE。例如,假設在XIBQ104底部項目的字節15(亦即最後字節)的開始位232為邏輯真值,且該字節的值為OxOF。在x86的指令中,第一非前置字節的值為OxOF表示一具延伸的操作碼,因此需要根據其後續字節以決定指令型態。換句話說,無法只從OxOF字節以決定指令長度(在一些情形下,可能需要至多到第五字節以決定指令長度)。然而,等到指令高速緩存102提供下一列快取數據給XIBQ104時,將需要一段時間,例如,可能發生指令高速緩存102的失誤(miss),或指令轉譯尋找緩衝器(translationlookasidebuffer,TLB)的失誤,因此,需要一種不等待其它指令字節而逕行處理的方案。再者,在一些情形下,微處理器100必須得到未知長度指令之前的指令,因此如果這些指令未進行處理,則微處理器100就要一直等待。因此,需要一種逕行處理的方式。圖8顯示圖7的部分指令格式器106的操作流程圖。此流程始於步驟802。於步驟802,XIBQ控制邏輯單元702檢測到XIBQ104的底部項目終端的指令跨至指令快取數據串流的另一列,而XIBQ104底部項目中的指令不足以讓長度解碼器202/漣波邏輯單元204決定指令長度(及開始/結束位232/234),而決定指令長度所需的後續指令字節尚未置於XIBQ104NTBE中,亦即,XIBQ104NTBE為無效或空白的。接著,流程進入步驟804。於步驟804,M級控制邏輯單元512將相應於XIBQ104底部項目所產生的漣波邏輯單元204的輸出214載至多工隊列502。然而,M級控制邏輯單元512並不將XIBQ104的底部項目移出,因為仍需要決定出未知長度指令的結束位234。換句話說,對於未知長度的指令,其位於XIBQ104底部項目的字節必須保留,當指令的其它字節來到XIBQ104時,得以決定出指令長度及結束位。接著,流程進入步驟806。於步驟806,前一步驟804所載入的輸出214到達多工隊列502的底部項目。此時,M級控制邏輯單元512取出所有指令並將其傳至F級,但不傳送未知長度的指令。然而,M級控制邏輯單元512並不移出多工隊列502的底部項目,因為未知長度的指令的結束位234還未得知,且指令的其餘字節尚未可得。M級控制邏輯單元512知道未知長度指令的存在,因為該指令不具有效結束位234。換句話說,已具有效開始位232指向指令的第一字節,但是不具有效結束位234指向多工隊列502的底部項目的字節且NTBE為無效。接著,流程進入808。於步驟808,M級控制邏輯單元512停止(stall)多工隊列502,直到NTBE填入有效輸出214。接著,流程進入步驟812。於步驟812,XIBQ104終於自指令高速緩存102接收到一列的指令字節132,其被載至NTBE中。該列的指令字節132包含未知長度指令的其餘字節。接著,流程進入步驟814。於步驟814,長度解碼器202/漣波邏輯單元204針對未知長度指令產生指令長度222及開始/結束位232/234。在一實施例中,XIBQ控制邏輯單元702依據指令長度222以計算未知長度指令的其餘字節數量(其位於步驟812載至XIBQ104的NTBE中)。該其餘字節數量於接下來的步驟818中是用以決定結束位234的位置。接著,流程進入步驟816。於步驟816,XIBQ控制邏輯單元702將底部項目移出。然而,M級控制邏輯單元512並不將相應底部項目的漣波邏輯單元204的輸出214加載,因為其根據步驟804已置於多工隊列502中。接著,流程進入步驟818。於步驟818,長度解碼器202/漣波邏輯單元204處理新的XIBQ104底部項目(亦即,於步驟812所接收的快取數據),且M級控制邏輯單元512將漣波邏輯單元204的輸出214(其包含未知長度指令的結束位234)載至多工隊列502的NTBE中。接著,流程進入步驟822。於步驟822,M級控制邏輯單元512自多工隊列502的底部項目及NTBE取出未知長度指令(以及其它可取出的指令),並傳送至F級。接著,流程進入步驟824。於步驟824,M級控制邏輯單元512將多工隊列502的底部項目移出。流程結束於步驟824。根據上述,本實施例的指令格式器106即使在XIBQ(x86指令字節隊列)104底部項目的相關消息尚未可用的情況下,對於具有可用消息的指令,通過讓消息(指令字節、開始/結束位及累積前置消息)儘快從L級釋出,因而得以解決了前述問題。[通過前置累積以增進指令的取得]圖9顯示圖5的多工隊列502的詳細方塊圖。在圖9的實施例中,多工隊列502包含四個項目,分別為底部項目(bottomentry,BE)、NTBE、底部倒數第三項目(second-from-bottomentry,SFBE)及底部倒數第四項目(third-from-bottomentry,TFBE)。多工隊列502的每一項目含有十六個字節,每一字節存放一個指令字節及其開始位232、結束位234及累積前置消息238。如圖所示,BE分別標示為0至15。NTBE分別標示為16至31。這些標號也顯示於圖10。SFBE分別標示為32至47。圖10顯示圖1的指令格式器106的部分M級的方塊圖。圖10顯示多工隊列502的累積前置陣列(accumulatedprefixarray)1002及指令字節陣列(instructionbytearray)1004。累積前置陣列1002及指令字節陣列1004的消息實際上是儲存於多工隊列502的BE和NTBE。然而,多工隊列502消息的提供是通過導線至選擇電路(在一實施例中,其為動態邏輯單元),其包含圖5的多工器504/506/508。圖10僅顯示出II多工器504,然而12多工器506及13多工器508所接收的輸入也如同II多工器504。指令多工器504/506/508為16:1多工器。如圖10所示,II多工器504的輸入分別標示為0至15。每一個II多工器504的輸入接收十一個指令字節及累積前置消息238,其中累積前置消息238相應於所接收十一個指令字節的最低位(lowestorder)字節。該最低位字節為指令字節陣列1004的字節號碼,其對應至II多工器504的輸入號碼。例如,II多工器504的輸入8接收多工隊列502的字節8至18(亦即BE的字節8-15及NTBE的字節16-18)及相應字節8的累積前置消息238。II多工器504接收十一個指令字節的理由為雖然x86指令允許最多十五字節,然非前置字節最多為十一字節,前述實施例僅取得並傳送非前置字節至管線的其餘部14分(亦即,去除前置字節並以累積前置消息238置換前置字節),因而可以大量減少管線後續級的解碼工作量並讓微處理器100實現各種好處。圖11顯示圖5的M級控制邏輯單元512的方塊圖。M級控制邏輯單元512包含2:1多工器1114,用以產生指令長度LEW1122,其為通過指令格式器106的指令串流的一指令(圖5的第一指令11524)的指令長度。指令長度LEW1122連同第一指令11524繼續通過管線傳送並被處理。多工器1114根據前一時鐘周期中是否有部分長度的情形存在,以選擇減法器1102的輸出或加法器1116的輸出。多工器1114受控於暫存器1118,其儲存一位用以表示前一時鐘周期是否存在有部分長度的情形,此將於圖12至圖14詳述。如果有部分長度情形發生,多工器1114選擇加法器1116的輸出;否則,多工器1114選擇減法器1102的輸出。加法器1116的第一輸入為指令剩餘長度,標示為剩餘LEmil06,其將於圖12至圖14詳述。M級控制邏輯單元512還包含其它邏輯單元(未顯示於圖式中),其依據第一指令I1524的結束位234(其是由多工隊列502提供給M級控制邏輯單元512)以計算剩餘LEW1106。加法器1116的第二輸入為目前指令的部分長度,標示為部分LEN1104,其是由前一時鐘周期加載的暫存器所提供,將於圖12詳述。減法器1102以前一指令的結束位234在多工隊列502中的字節位置(END01112)減去第一指令11524的結束位234在多工隊列502中的字節位置(END11108)。值得注意的是,雖然M級控制邏輯單元512執行如圖11所示的數學運算,然而M級控制邏輯單元512不能使用傳統加法器/減法器,而是以組合邏輯單元來實施。例如,在一實施例中,位是以解碼形式來執行的;例如,減法運算可使用布爾(Boolean)AND-0R運算。第二指令12526和第三指令13528的長度計算所使用的減法器(未顯示於圖式中)類似於第一指令II524的減法器,但是分別為END1減去END2以及END2減去END3。最後,多工隊列502項目的目前偏移(offset)的決定是選擇來自多工器504/506/508的最後指令最後字節的後一字節。圖12顯示圖1的指令格式器106的部分M級的操作流程圖。此流程始於步驟1201。於步驟1201,新時鐘周期開始,且M級控制邏輯單元512檢視多工隊列502的BE及NTBE(圖9)。接著,流程進入步驟1202。於步驟1202,M級控制邏輯單元512控制多工器504/506/508,將多工隊列502的BE及NTBE(可能的話)的指令傳送至指令格式器106的F級。如前所述,在一實施例中,M級可於一時鐘周期內取得三指令。由於x86指令的長度可為零至十五字節,因此多工隊列502的底部項目可能存有一至十六個x86指令。因此,需要多個時鐘周期以取得多工隊列502的BE的所有指令。再者,依據BE的最後字節究竟為前置字節、結束字節或其它類型字節,指令可能跨越BE和NTBE,因此,M級控制邏輯單元512在取得指令及移出多工隊列502的BE時,其操作方式會有不同,此將於以下詳述。再者,M級控制邏輯單元512計算每一取得/傳送指令的長度,特別是使用圖11的邏輯以計算第一指令II524(圖11的指令長度LEN11122)。如果為前一時鐘周期的部分長度(此將於步驟1212詳述),則M級控制邏輯單元512使用儲存的部分LEmi04以計算指令長度LEW1122;否則,M級控制邏輯單元512使用減法器1102(圖11)以計算指令長度LEW1122。接著,流程進入步驟1204。於步驟1204,M級控制邏輯單元512判定是否結束於BE的所有指令都已傳送至F級。在一實施例中,於一時鐘周期內,M級最多可取得及傳送三個指令給F級。因此,如果M級自底部項目取得三指令,且尚有至少另一指令的開始位232在底部項目中,則另一指令必須於下一時鐘周期取得。如果結束於BE的所有指令都已傳送至F級,則流程進入步驟1206;否則,流程進入步驟1205。於步驟1205,M級控制邏輯單元512不移出BE,使得於下一時鐘周期時,M級控制邏輯單元512可以自BE取得及傳送更多的指令。流程返回至步驟1201,以進行下一時鐘周期的程序。於步驟1206,M級控制邏輯單元512判定BE的最後字節究竟為前置或者為非前置字節。如果BE的最後字節為非前置字節,則流程進入步驟1216;如果BE的最後字節為前置字節,則流程進入步驟1212。於步驟1212,M級控制邏輯單元512計算位於BE最後包含前置字節的指令的部分長度,亦即,從前一指令的結束字節一直到BE的最後字節15之間的前置字節數目,該計算是由M級控制邏輯單元512的數學邏輯單元(未顯示於圖式中)執行。例如,於圖13的例子中,指令b的部分長度為14。位於結束字節和開始字節之間的前置字節是處於「三不管地帶」(no-man’sland),而前置字節於多工隊列502中事實上為多餘的,因為其內容已經存在於累積前置消息238,其和指令的操作碼字節儲存於多工隊列502內。藉此,如果BE的最後為前置字節且在BE中的所有其它指令於該時鐘周期皆已取得,則M級控制邏輯單元512即可將BE(1214)移出(步驟1214),因為,這些前置字節是存在的(其將於接下來的十六字節列當中累積於操作碼字節)且M級控制邏輯單元512將前置字節數目儲存起來(儲存至圖11的部分長度暫存器1104)並自多工隊列502移出。另一方面,如果BE的最後為非前置字節且其尚未被取得或傳送,則M級控制邏輯單元512不能將其自多工隊列502移出(參閱步驟1222)。接著,流程進入步驟1214。於步驟1214,M級控制邏輯單元512控制多工隊列502以移出BE。流程返回至步驟1201,以進行下一時鐘周期的程序。於步驟1216,M級控制邏輯單元512判定BE的最後字節是否為指令的結束字節,亦即,結束位234是否為邏輯真值。如果為是,則流程進入步驟1214;否則,流程進入步驟1218。於步驟1218,M級控制邏輯單元512判定NTBE是否為有效。當取得的最後指令的結束字節位於BE的最後字節(亦即字節15),或者最後字節跨至NTBE且其為有效,則M級控制邏輯單元512移出BE;否則,M級控制邏輯單元512維持BE直到下一時鐘周期。如果NTBE為有效,流程進入步驟1214;否則,流程進入步驟1222。於步驟1222,M級控制邏輯單元512不移出BE。此乃因為指令的實際字節(亦即,非前置字節)跨越BE和NTBE,且NTBE為無效。在此情形,M級控制邏輯單元512無法決定指令長度,因為指令的結束位234無法自無效的NTBE得知。流程返回至步驟1201,進行下一時鐘周期的程序,以等待NTBE填滿有效數據。圖13顯示圖5的多工隊列502於連續兩個時鐘周期的內容,以例示M級的操作。第一個多工隊列502內容處於第一時鐘周期0,而第二個多工隊列502內容處於第二時鐘周期1。圖式僅顯示出底部的三個項目。於圖13中,「S」表示開始字節(亦即,開始位232為邏輯真值),「E」表示結束字節(亦即,結束位234為邏輯真值),「P」表示前置字節(亦即,累積前置消息238所表示)。4個指令分別以a、b、c、d來表示,並顯示其開始、結束及前置字節。所示字節數目對應至圖9,例如字節0至47,其位於多工隊列502的BE、NTBE及16SFBEo在周期0的一開始,BE的字節1包含有指令a的結束字節Ea,且BE的字節2至15包含有十四個指令b的前置字節Pb。因為指令b開始於BE,但其開始字節是位於NTBE而不是BE,其部分長度計算為十四字節。NTBE及SFBE的內容為無效的,亦即X86指令字節隊列104和長度解碼器202/漣波邏輯單元204尚未提供指令串流的快取數據及其相關消息(例如開始位232、結束位234以及累積前置消息238)至除了BE之外的其它項目。於周期0時,M級控制邏輯單元512檢視BE和NTBE的內容(圖12的步驟1201)並傳送指令a至F級(步驟1202)。再者,M級控制邏輯單元512計算指令a的長度,其等於指令a的結束字節位置和前一指令的結束字節位置之間的差值。最後,由於結束於BE的所有指令(指令a)已傳送(步驟1204)且BE的最後一字節(字節15)為前置字節(步驟1206),M級控制邏輯單元512計算指令b的部分長度為十四字節,將其儲存於部分LEN1104暫存器(步驟1212)。最後,M級控制邏輯單元512從多工隊列502將BE移出(步驟1214)。由於步驟1214於周期0進行了移出且移入另外十六字節列的漣波邏輯單元204輸出214,因而開始周期1,此時BE包含位於字節0的指令b的開始字節(Sb)及結束字節(Eb)(亦即,指令b的非前置字節僅有單一字節);位於字節1至5的指令c的五個前置字節(Pc);位於字節6的指令c的開始字節(Sc);位於字節8的指令c的結束字節(Ec);位於字節9的指令d的開始字節(Sd);及位於字節15的指令d的結束字節(Ed)。於周期1時,M級控制邏輯單元512檢視BE和NTBE的內容(步驟1201)且傳送指令b、c及d至F級(步驟1202)。再者,M級控制邏輯單元512計算以下各項指令b的長度(LEW1122)(步驟1202)(在此例子中為十五字節),其等於部分LEN1104(在此例子中為十四字節)加上指令b的剩餘長度(在此例子中為一字節);指令c的長度(在此例子中為八字節),其等於指令c的結束字節位置和指令b的結束字節位置兩者的差值;及指令d的長度(在此例子中為七字節),其等於指令d的結束字節位置和指令c的結束字節位置兩者的差值。再者,由於所有結束於BE的指令(指令b,c,d)都已傳送(步驟1204)且BE的最後字節(字節15)為非前置字節(步驟1206)且BE的最後字節為結束字節(步驟1216),因此M級控制邏輯單元512從多工隊列502將BE移出(步驟1214)。根據圖13所示的實施例,通過累積指令b的累積前置消息238至其操作碼且儲存指令b的部分LEN1104,使得指令格式器106可將含有指令b的前置字節的BE移出,並於下一時鐘周期從多工隊列502取得及傳送最多三個指令。如果沒有累積前置消息238及儲存部分LEN1104,這將是不可能的(亦即,指令c和d無法與指令b在相同周期內取得及傳送,而是必須於下一時鐘周期進行)。通過使得微處理器的功能單元具足夠指令可處理,可減少微處理器100資源的使用。圖14顯示圖5的多工隊列502於連續兩個時鐘周期的內容,以例示M級的操作。圖14的例子類似於圖13的例子;然而,指令的位置及多工隊列502的進入及離開時序則有差異。於周期0的一開始,BE位於字節1包含有指令a的結束字節(Ea),且位於字節2至15包含有指令b的十四個前置字節(Pb)。另外,由於指令b開始於BE,但是其開始字節卻是位於NTBE,因此部分LEN1104計算為14。NTBE包含位於字節16的指令b的開始字節(Sb)及指令b的結束字節(Eb)(亦即,指令b除了前置字節外,僅為單一字節);位於字節17-21的指令c的五個前置字節(Pc);位於字節22的指令c的開始字節(Sc);位於字節27的指令c的結束字節(Ec);位於字節28-30的指令d的三個前置字節(Pd);及位於字節31的指令d的開始字節(Sd)。SFBE包含位於字節41的指令d的結束字節(Ed),及位於字節42的指令e的開始字節(Se)。於周期0時,M級控制邏輯單元512檢視BE和NTBE的內容(圖12的步驟1201)並傳送指令a至F級(步驟1202)。再者,M級控制邏輯單元512計算指令a的長度,其等於指令a的結束字節位置和前一指令的結束字節位置之間的差值。最後,由於結束於BE的所有指令(指令a)已傳送(步驟1204)且BE的最後一字節(字節15)為前置字節(步驟1206),M級控制邏輯單元512計算指令b的部分長度為十四字節,將其儲存於部分LEmi04暫存器(步驟1212)。最後,M級控制邏輯單元512從多工隊列502將BE移出(步驟1214)。由於步驟1214於周期0進行了移出,因而開始周期1,此時BE包含周期0時的NTBE的內容,而NTBE包含周期0時的SFBE的內容。於周期1時,M級控制邏輯單元512檢視BE和NTBE的內容(步驟1201)且傳送指令b、c及d至F級(步驟1202)。再者,M級控制邏輯單元512計算以下各項指令b的長度(LEW1122)(步驟1202)(在此例子中為十五字節),其等於部分LEN1104(在此例子中為十四字節)加上指令b的剩餘長度(在此例子中為一字節);指令c的長度(在此例子中為十一字節),其等於指令c的結束字節位置和指令b的結束字節位置兩者的差值;及指令d的長度(在此例子中為十四字節),其等於指令d的結束字節位置和指令c的結束字節位置兩者的差值。再者,由於所有結束於BE的指令(指令b、c、d)都已傳送(步驟1204)且BE的最後字節(字節15)為非前置字節(步驟1206)且BE的最後字節非為結束字節(步驟1216)且NTBE為有效(步驟1218),因此M級控制邏輯單元512從多工隊列502將BE移出(步驟1214)。根據圖14所示的實施例,指令格式器106可於一時鐘周期內,將含有最多四十個指令字節的三個指令取得並傳送出去,如圖15所示。[不良分支預測的檢測、標示及累積,用以快速處理指令串流]再參閱圖1,當提取單元126輸出目前提取地址142用以自指令高速緩存102提取一指令字節列並提供給XIBQ104時,BTAC128也同時得到該目前提取地址142。如果目前提取地址142命中(hit)BTAC128,則表示先前在此提取地址有一分支指令曾被執行過;因此,BTAC128可預測是否有分支指令發生(taken),如果為是,則BTAC128也預測了預測目標地址146。特別的是,BTAC128是在微處理器100從指令字節串流取得或解碼分支指令之前即進行預測。因此,BTAC128所預測的分支指令可能並未存在於取出的指令字節的高速緩存列中,亦即,BTAC128作了不良的預測,造成微處理器100分支錯誤。值得注意的是,此不良預測並不等同於不正確預測。由於程序執行具動態性質,例如分支指令的狀態碼或狀態數據的值的改變,因此所有分支預測器於本質上都有可能會預測錯誤。然而,此處的不良預測表示BTAC128所預測的高速緩存列不同,或者高速緩存列相同但高速緩存列內的內容已經改變。之所以發生這些情形的理由,如美國專利7,134,005所描述,理由有下列幾種由於BTAC128僅儲存部分的地址標籤(tag)而非完整地址標籤,因而造成標籤混淆(aliasing);由於BTAC128僅儲存虛擬(virtual)地址標籤而非物理地址,因而造成虛擬混淆;及自發性修改碼(self-modifyingcode)。當此情形發生時,微處理器100必須確定未將不良預測指令及後續因為不良預測指令而錯誤取得的錯誤指令傳送出去。如果對於一指令字節其分支發生指示154(圖1)為邏輯真值但是事實上並非為指令的第一字節,如圖16所示,即表示BTAC128作了不良預測因而造成微處理器100的分支錯誤。如前所述,BTAC128所提供的真值分支發生指示154表示BTAC128認為該指令字節為分支指令的第一字節(亦即操作碼),且提取單元126根據BTAC128所預測的預測目標地址146進行分支。不良BTAC預測的決定方法系等待,直到個別的指令從指令字節串流中取得且長度為已知,並掃描每一指令的非第一字節以檢視其分支發生指示154是否為真。然而,此種檢查方法太慢,因為其需要很多的屏蔽(masking)及移出,且需將每一字節的結果經由邏輯或(OR)運算,因此會造成時序問題。為了避免時序問題,本發明實施例累積分支發生指示154所提供的消息,其為漣波邏輯單元204執行程序的一部分,且於M級取得指令後,使用這些累積消息。特別的是,漣波邏輯單元204檢測狀態並將指示符傳遞下去直到指令的最後字節,其檢視單一字節,亦即指令的最後字節。當從M級取得指令時,決定一指令是否為不良指令,亦即,該指令是否要被涵蓋於指令串流並繼續沿著管線傳送下去。圖17顯示漣波邏輯單元204輸出214的組成信號。圖17所示的漣波邏輯單元204輸出信號類似於圖2所示,但對於每一指令字節額外增加了不良BTAC位1702,其將於以下詳述。此外,漣波邏輯單元204輸出包含一信號,當其為邏輯真值時,表示相應的指令字節為BTAC128所預測的分支指令的第一字節,然而BTAC128所預測的分支指令將不會發生;及另一信號,其表示前一字節為指令的結束字節。圖18顯示圖1的微處理器100的操作流程圖。此流程始於步驟1802。於步驟1802,BTAC(分支目標地址高速緩存)128預測於提取單元126所提供的目前提取地址142所指的高速緩存列中,存在一分支指令,且該分支指令將會發生。BTAC(分支目標地址高速緩存)128還預測分支指令的預測目標地址146。因此,XIBQ104於目前提取地址142所指處的指令高速緩存102接收十六指令字節當中的第一列,且接著於預測目標地址146所指處的指令高速緩存102接收十六指令字節當中的第二列。接著,流程進入步驟1804。於步驟1804,XIBQ104儲存每一分支發生指示154(圖1)連同於步驟1802所接收的二列相應的指令字節。接著,流程進入步驟1806。於步驟1806,長度解碼器202和漣波邏輯單元204處理指令字節的第一列,並檢測指令字節含有邏輯真值的分支發生指示154但該字節並非指令的第一字節的情形,如圖16所示的錯誤情形。換句話說,漣波邏輯單元204知道指令字節的十六組列中哪一字節為第一字節,用以設定結束位234。據此,相應每個指令的第一非前置字節的漣波邏輯單元204檢視分支發生指示154的邏輯真值及檢測該情形。接著,流程進入步驟1808。於步驟1808,當檢測到指令的非第一字節的真值分支發生指示154為邏輯真值,漣波邏輯單元204設定該指令字節的不良BTAC位1702為邏輯真值。此外,漣波邏輯單元204將真值的不良BTAC位1702從其字節位置傳遞至十六字節列的其餘字節。再者,如果指令的結束字節未出現於指令字節的第一列,則漣波邏輯單元204更新狀態(例如正反器)19(未顯示於圖式中),用以表示目前列中對一指令發生不良的BTAC(分支目標地址高速緩存)128預測。接著,當漣波邏輯單元204處理指令字節的第二列時,由於狀態為真,漣波邏輯單元204對於指令字節第二列的所有字節設定其不良BTAC位1702。接著,流程進入步驟1812。於步驟1812,對於指令字節的第一及第二列,多工隊列502儲存漣波邏輯單元204的輸出214,包含不良BTAC位1702,並連同各個的指令字節一起儲存。接著,流程進入步驟1814。於步驟1814,M級控制邏輯單元512發現相應於指令字節的不良BTAC位1702為邏輯真值且該指令字節的結束位234也為邏輯真值(亦即,檢測到不良BTAC(分支目標地址高速緩存)128預測的情形)。因此,M級控制邏輯單元512通過清除相應的有效位534/536/538而放棄傳送發生不良情形的指令及其後續指令至F級。然而,如果在發生不良情形的指令之前有一指令,則該指令為有效且被傳送至F級。如前所述,真值的不良BTAC位1702傳遞至發生不良情形的指令的結束字節,將使得M級控制邏輯單元512得以只檢視單一字節,亦即,結束位234所指的字節,因而明顯減少時序的限制。接著,流程進入1816。於步驟1816,微處理器100讓BTAC(分支目標地址高速緩存)128的錯誤項目變為無效。此外,微處理器100清除XIBQ104及多工隊列502的所有內容並讓提取單元126更新目前提取地址142,用以自BTAC(分支目標地址高速緩存)128產生不良預測處重新取得指令字節。於重新取得時,BTAC(分支目標地址高速緩存)128不會產生不良預測,因為不良項目已被清除,亦即,於重新取得時,BTAC(分支目標地址高速緩存)128將預測分支不會發生。在一實施例中,步驟1816執行於指令格式器106的F級,及/或指令轉譯器112。流程結束於步驟1816。[x86指令長度的有效決定]決定X86指令長度是非常複雜的,其描述於英特爾IA-32架構軟體開發手冊(IntelIA-32ArchitectureSoftwareDeveloper'sManual),第2A集的第二章指令集參考(InstructionSetReference),A-M。指令總長度係為下列之和前置字節的數目(如果有的話)、操作字節的數目(1、2或3)、ModR/M字節出現與否、SIB字節出現與否、地址位移(displacement)長度(如果有的話)及立即(immediate)數據的長度(如果有的話)。以下為x86指令的特性或要求,其足以影響長度(前置除外)的決定操作碼字節的數目為3,如果前二字節為OF38/3A2,如果第一字字節為0F,且第二字字節不為38/3A1,其它情形ModR/M字節是否出現決定於操作碼,如下如果為三字節操作碼,則ModR/M為強制的如果為一字節或二字節操作碼,則檢視操作碼字節SIB字節是否出現決定於ModR/M字節。位移是否出現決定於ModR/M字節。位移尺寸決定於ModR/M字節及目前地址尺寸(AS)。立即數據是否出現決定於操作碼字節。立即數據的尺寸決定於操作碼字節、目前操作碼尺寸(OS)、目前AS及REX.W前置;特別的是,ModR/M字節不會影響立即數據尺寸。如果沒有ModR/M字節,則沒有SIB、位移或立即數據。當決定指令長度時,指令操作碼及ModR/M字節僅有五種形式操作碼0F+操作碼操作碼+ModR/M0F+操作碼+ModR/M0F+38/3A+操作碼+ModR/M圖19顯示圖2的長度解碼器202的詳細方塊圖。圖2顯示了十六個長度解碼器202。圖19顯示一代表性長度解碼器202,標示為n。如圖2所示,每一長度解碼器202對應至指令字節串流134的一個字節。換句話說,長度解碼器0對應至指令字節0,長度解碼器1對應至指令字節1,一直到長度解碼器15對應至指令字節15。長度解碼器202包含可編程邏輯陣列(ProgrammableLogicArray,PLA)1902,4:1多工器1906及加法器1904。PLA1902接收圖2所示的地址尺寸(AS)、操作數尺寸(0S)及REX.W值218。AS代表地址尺寸、0S代表操作數尺寸,且REX.W值表示REX.W前置的出現。PLA1902還接收相應的指令字節134(其標示以n)及高一階的指令字節134(其標示以n+1)。例如,PLA31902接收指令字節3及4。PLA1902產生i謹Len值1916,其提供給加法器1904的第一輸入。i謹Len值1916介於1和9(含)之間,其值為下列之和操作碼字節數目及立即數據的尺寸(0、1、2、4、8)。PLA1902於決定immLen值1916時,是假設該二指令字節134為指令的前二操作碼字節,並依據二操作碼字節(如果不是0F則為一操作碼字節)、地址尺寸(AS)、操作數尺寸(0S)及REX.W值218以產生immLen值1916。PLA1902產生eaLen值1912,其提供給三個低階長度解碼器202的多工器1906。eaLen值1912介於1和6(含)之間,其值為下列之和:ModR/M字節數目(PLA假設ModR/M字節的存在)、SIB字節數目(0或1)及位移尺寸(0、1、2、4)。PLA1902於決定eaLen值1912時,是假設第一指令字節134為ModR/M字節,並依據ModR/M字節和地址尺寸(AS)218以產生eaLen值1912。多工器1906的其中一個輸入接收零值。多工器1906的其它三個輸入接收來自三個高階PLA1902的eaLen值1912。多工器1906選擇其中一個輸入用以提供eaLen值1918作為輸出,其再提供給加法器1904的第二輸入。在一實施例中,為了減少傳遞延遲,可不使用前述的多工器1906,各個eaLen值1912被輸入至加法器1904,其中eaLen值1912為三態線或(tri-statewired-OR)信號。加法器1904將immLen值1916及被選到的eaLen值1918加總以產生圖2所示的最終指令長度222。PLA1902產生控制信號1914以控制多工器1906,其根據前述五種形式進行檢測如下1.對於以下所示的不具ModR/M字節的指令形式,則選擇零值僅操作碼,或0F+操作碼2.對於以下指令形式,則選擇PLAn+1操作碼+ModR/M3.對於以下指令形式,則選擇PLAn+20F+操作碼+ModR/M4.對於以下指令形式,則選擇PLAn+30F+38/3A+操作碼+ModR/M圖20顯示十六個長度解碼器202的配置。PLA15(可編程邏輯陣列)1902接收指令字節15及前一列的指令字節0,而多工器151906接收三個PLA1902(圖未示)的eaLen值1912,其中該三個PLA1902分別檢視前一列的指令字節0/1、1/2及2/3。前述每一PLA1902每一次檢視二字節的好處在於可大量減少所需的全及項(minterm)數目,因而得以減小晶圓上的邏輯電路的尺寸。此設計提供總全及項數目的減少和時序要求所允許的延遲兩者之間的平衡選擇。圖21顯示圖20的長度解碼器202的操作流程圖。此流程始於步驟2102。於步驟2102,對於來自XIBQ104的每一指令字節134,相應的PLA1902檢視二指令字節134,亦即相應的指令字節134及下一指令字節134。例如,PLA3(可編程邏輯陣列)1902檢視指令字節3和4。接著,流程同時進入步驟2104和2106。於步驟2104,每一PLA1902假設二指令字節134為指令的前二操作碼字節,且依據該二指令字節134、操作數尺寸(OS)、地址尺寸(AS)、及REX.W值以產生immLen值1916。詳而言之,immLen值1916為下列之和操作碼字節的數目(1、2或3)和立即數據的尺寸(0、1、2、4或8)。接著,流程進入步驟2114。於步驟2106,每一PLA1902假設第一指令字節134為ModR/M字節,且依據ModR/M字節及地址尺寸(AS)以產生eaLen值1918,並提供eaLen值1918給次三個低階多工器1906。詳而言之,eaLen值1918為下列之和ModR/M字節數目(1)、SIB字節(0或1)和位移的尺寸(0、1、2、4)。接著,流程進入步驟2108。於步驟2108,每一多工器1906接收零輸入及自三高階PLA1902接收的eaLen值1912。例如,PLA3(可編程邏輯陣列)1902自PLA4、5、6(可編程邏輯陣列)1902接收eaLen值1912。接著,流程進入步驟2112。於步驟2112,每一PLA1902產生控制信號1914至相應的多工器1906,並依據前述五種形式以選擇其中一輸入。接著,流程進入步驟2114。於步驟2114,每一加法器1904將immLen值1916加至多工器1906所選擇的eaLen值1918,以產生指令長度222。接著,流程進入步驟2116。於步驟2116,如果出現有LMP,則L級對於含有LMP的每一指令花費額外的一個時鐘周期,如前述圖式所示,特別是圖1至圖4。以上所述僅為本發明的實施例而已,並非用以限定本發明的權利要求範圍。熟悉計算機領域的人士在未脫離發明所揭示的精神下所完成的等效改變或修飾,均應包含在上述的權利要求範圍內。例如,可使用軟體以啟動功能、製造、建立模型、仿真、描述及/或測試所揭露的裝置及方法。其達成可使用程序語言(例如C、c++)、硬體描述語言(HDL),其包含VerilogHDL、VHDL及其它程序。該軟體可置於計算機可使用媒體,例如半導體、磁碟或光22盤(例如⑶-R0M、DVD-R0M)。所揭露的裝置及方法實施例可包含於智慧財產權核心(IPcore),例如微處理器核心(例如置於HDL)並轉換為硬體以製成集成電路。再者,所揭露的裝置及方法實施例可使用硬體和軟體的組合來實施。因此,本發明範圍不限定於任何例示實施例,而應以權利要求範圍及其等效範圍來定義。詳而言之,本發明可實施於微處理器裝置內,該微處理器可用於一般計算機內。最後,本領域技術人員可使用所揭露的概念及特定實施例作為基礎以設計或修改成其它架構,用以實現相同目的,其仍未脫離本發明的權利要求範圍。權利要求一種適用於微處理器的裝置,該微處理器的指令集架構包含可變數目的前置字節,該裝置用以有效地自一指令字節串流中提取指令,該裝置包含一解碼邏輯單元,用以對該指令字節串流中多個指令的每一指令判斷其操作碼字節,其中該操作碼字節為相應的該指令的第一非前置字節,該解碼邏輯單元還累積該多個指令的每一指令的前置消息至相應的該操作碼字節;一隊列,耦接至該解碼邏輯單元,用以暫存該指令字節串流及該累積前置消息;及一提取邏輯單元,耦接至該隊列,用以於一時鐘周期內,自該隊列提取該多個指令,其不受該多個指令的每一指令中的前置字節數目所影響。2.根據權利要求1所述的裝置,其中上述的提取邏輯單元於提取該多個指令時,提取該累積前置消息,而非提取每一指令的前置字節。3.根據權利要求1所述的裝置,其中上述的累積前置消息包含一出現/未出現指示符,用以表示該指令集架構所支持類型的前置字節是否出現。4.根據權利要求1所述的裝置,其中上述隊列的每一項目暫存至少十六指令字節,藉此,該提取邏輯單元可於一時鐘周期內提取該多個指令字節。5.根據權利要求1所述的裝置,其中上述的解碼邏輯單元於同一時鐘周期內執行上述判斷該操作碼字節、累積該前置消息至相應的該操作碼字節且將該指令字節及該累積前置消息加載該隊列。6.根據權利要求5所述的裝置,於該解碼邏輯單元執行上述判斷該操作碼字節、累積該前置消息至相應的該操作碼字節及加載該指令字節及該累積前置消息至該隊列的時鐘周期的下一個時鐘周期內,上述的提取邏輯單元自該隊列提取該多個指令。7.根據權利要求1所述的裝置,其中上述的提取邏輯單元包含多個多工器,分別對應至該多個指令,每一該多工器接收該指令字節串流;及一控制邏輯單元,耦接至該多個多工器,該控制邏輯單元針對該多個指令的每一指令自該隊列接收相應的操作碼字節指示符,該控制邏輯單元還根據該操作碼字節指示符,以控制該多個多工器,用以自該指令字節串流中選擇一適當字節。8.一種適用於微處理器的方法,該微處理器的指令集架構包含可變數目的前置字節,該方法用以有效地自一指令字節串流中提取指令,該方法包含對於該指令字節串流中多個指令的每一指令,判斷其操作碼字節,其中該操作碼字節為相應的該指令的第一非前置字節;對於該多個指令的每一指令,累積其前置消息至相應的該指令的該操作字節;及於一時鐘周期內,自一隊列提取該多個指令,其不受該多個指令的每一指令中的前置字節數目所影響。9.根據權利要求8所述的方法,其中上述的提取該多個指令時,提取該累積前置消息,而非提取每一指令的前置字節。10.根據權利要求8所述的方法,其中上述的累積前置消息至相應的該指令的該操作字節包含連同該操作碼字節,提供一出現/未出現指示符,用以表示該指令集架構所支持類型的前置字節是否出現。11.根據權利要求8所述的方法,其中上述的提取該多個指令包含自該隊列的一項目提取該多個指令,該項目暫存至少十六指令字節。12.根據權利要求8所述的方法,還包含於上述的提取該多個指令之前,將該指令字節及該累積前置消息加載該隊列,其中上述判斷該操作碼字節、累積該前置消息至相應的該指令的操作碼字節,並將該指令字節及該累積前置消息加載該隊列於同一時鐘周期內執行。13.根據權利要求12所述的方法,於執行上述判斷該操作碼字節、累積該前置消息至相應的該指令的操作碼字節及加載該指令字節及該累積前置消息至該隊列的時鐘周期的下一個時鐘周期內,執行上述自該隊列提取該多個指令。全文摘要一種適用於微處理器的裝置和方法,其中該微處理器的指令集架構包含可變數目的前置字節,該裝置用以有效地自一指令字節串流中提取指令,該裝置包含一解碼邏輯單元,用以對該指令字節串流中多個指令的每一指令判斷其操作碼字節,其中該操作碼字節為相應的該指令的第一非前置字節,該解碼邏輯單元還累積該多個指令的每一指令的前置消息至相應的該操作碼字節;一隊列,耦接至該解碼邏輯單元,用以暫存該指令字節串流及該累積前置消息;及一提取邏輯單元,耦接至該隊列,用以於一時鐘周期內,自該隊列提取該多個指令,其不受該多個指令的每一指令中的前置字節數目所影響。文檔編號G06F9/38GK101853148SQ20101018566公開日2010年10月6日申請日期2010年5月19日優先權日2009年5月19日發明者湯瑪斯·C·麥當勞,約翰·L·唐肯申請人:威盛電子股份有限公司