国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      多指令集的指令預(yù)解碼的制作方法

      文檔序號(hào):6480708閱讀:289來(lái)源:國(guó)知局
      專(zhuān)利名稱(chēng):多指令集的指令預(yù)解碼的制作方法
      技術(shù)領(lǐng)域
      本發(fā)明涉及用來(lái)對(duì)指令進(jìn)行預(yù)解碼的數(shù)據(jù)處理設(shè)備和方法,其中預(yù) 解碼的指令被放置在高速緩存中以便后續(xù)解碼以及由處理電路使用。
      背景技術(shù)
      在典型的數(shù)椐處理設(shè)備中,大量功率消耗在處理電路的執(zhí)行流水線(xiàn)
      (pipeline)內(nèi)執(zhí)行指令之前對(duì)指令的解碼上。在支持多指令集的處理 電路中,由于通常需要提供多個(gè)單獨(dú)的解碼器對(duì)來(lái)自各個(gè)指令集的指令 進(jìn)行解碼,所以這個(gè)問(wèn)題變得尤成問(wèn)題。舉例來(lái)說(shuō),在一些實(shí)施方式
      中,大約15%的處理器功率可能會(huì)被指令解碼器消耗掉。
      通常的情況是,在數(shù)據(jù)處理設(shè)備中提供一個(gè)或多個(gè)高速緩存以緩存 處理電路所需的指令和數(shù)據(jù)。在高速緩存層級(jí)中的任一特定等級(jí),可以 提供單獨(dú)的指令高速緩存和數(shù)椐高速緩存(通常稱(chēng)作哈佛(Harvard) 體系架構(gòu)),或者可選地,可以提供統(tǒng)一的高速緩存以存儲(chǔ)指令和數(shù)據(jù) (通常稱(chēng)作馮諾伊曼(Von Neumann)體系架構(gòu))。當(dāng)指令從存儲(chǔ)器中 取出以存儲(chǔ)在高速緩存中的時(shí)候,由于性能方面的原因, 一些已知系統(tǒng) 采用了預(yù)解碼機(jī)制。根據(jù)這類(lèi)機(jī)制,指令在存儲(chǔ)在高速緩存之前被預(yù)解 碼,在這種情況下,高速緩存然后通常以比存儲(chǔ)在主存儲(chǔ)器中的指令更 寬的格式存儲(chǔ)指令,以容納由預(yù)解碼過(guò)程產(chǎn)生的附加信息。為了在指令 稍后被解碼和執(zhí)行時(shí)幫助改善性能,在存儲(chǔ)在高速緩存中的預(yù)解碼的指
      令中提供的額外信息已用來(lái)識(shí)別分支指令,識(shí)別指令類(lèi)別(例如,加栽 /存儲(chǔ)指令,協(xié)處理器指令等)以便稍后協(xié)助多發(fā)射(multi-issue)電 路給具體的執(zhí)行流水線(xiàn)分派具體指令,從而識(shí)別可變長(zhǎng)度指令集中的指 令邊界。
      例如,發(fā)表于1994年10月 IEEE Transactions on Computers, Vol. 43, No. 10第1140-1150頁(yè)的G Intrater等人的文章"Performance Evaluation of a Decoded Instruction Cache for Variable Instruction Length Computers"討論了將預(yù)解碼的指令存儲(chǔ)在高速緩 存中。Lawrence Livermore Nat ional Laboratory的L. Curt is Widdoes,Jr.于1979年12月11日發(fā)表的文章"The S-l Project: Developing High-performance Digital Computers"描述了 SI Mark IIA計(jì)算機(jī), 文中解碼的指令高速緩存將36位的指令字?jǐn)U展到56位的指令高速緩存 格式,以減少指令解碼時(shí)間(還可以參見(jiàn)網(wǎng)站 http: //www, cs. clems on. edu/ ~mark/sl. html上的論文"Li vermore S-l Supercomputer-A Short History")。而且,采用預(yù)解碼的機(jī)制來(lái)預(yù) 先識(shí)別分支以及預(yù)先識(shí)別指令邊界的思想在AMD K5 Processor Data sheet (公開(kāi)號(hào)為18522E-0, 1996年9月,第4. 5節(jié)的Innovative x86 Instruction Predecoding,第6頁(yè))中討論過(guò),其中討論了給每個(gè)指 令字節(jié)增加4位,以識(shí)別開(kāi)始、結(jié)束、操作碼位置,以及各個(gè)x86指令 以后翻譯所需的Rop (RISC操作)的數(shù)量。
      降低與解碼電路相關(guān)的開(kāi)銷(xiāo)是有利的,解碼電路用來(lái)對(duì)預(yù)解碼的指 令進(jìn)行解碼以生成控制信號(hào)來(lái)控制處理電路。降低此解碼電路的門(mén)數(shù)降 低了設(shè)備的復(fù)雜性、成本和功耗。
      從US-A-5, 568, 646中可知提供了支持多于一個(gè)指令集的處理器,并 且使用指令流水線(xiàn)的解碼階段中的可編程邏輯陣列將第一指令集的指 令中的至少一些位映射到第二指令集內(nèi)的相應(yīng)位。第一指令集的指令至 少部分被映射到第二指令集的指令,并且映射的版本然后用來(lái)生成至少 一些控制信號(hào)以控制其它流水線(xiàn)階段。

      發(fā)明內(nèi)容
      從本發(fā)明的一方面看,提供了一種用于處理數(shù)據(jù)的設(shè)備,包括 預(yù)解碼電路,其響應(yīng)于從存儲(chǔ)器中取出的程序指令來(lái)對(duì)所述程序指
      令執(zhí)行預(yù)解碼操作,以形成預(yù)解碼的指令;
      高速緩沖存儲(chǔ)器,其耦合到所述預(yù)解碼電路,以存儲(chǔ)所迷預(yù)解碼的
      指令;
      解碼電路,其響應(yīng)于從所述高速緩沖存儲(chǔ)器中讀取的預(yù)解碼的指令 來(lái)生成控制信號(hào);和
      處理電路,其響應(yīng)于所述控制信號(hào)以執(zhí)行由所迷預(yù)解碼的指令指定 的處理操作;其中
      所述程序指令來(lái)自多個(gè)不同的指令集;
      所述預(yù)解碼電路將來(lái)自第一指令集的程序指令和來(lái)自第二指令集的程序指令映射到預(yù)解碼的指令,該預(yù)解碼的指令具有共享格式來(lái)表示共
      享功能性;和
      所述解碼電路的共享部分生成所述控制信號(hào)以關(guān)于所述共享功能性 控制所述處理電路。
      本發(fā)明的技術(shù)認(rèn)識(shí)到預(yù)解碼電路采用表示共享功能性的共享格式提 供了將來(lái)自不同指令集的指令映射到預(yù)解碼的指令中的機(jī)會(huì)。這促進(jìn)了 使用解碼電路的共享部分來(lái)由預(yù)解碼的指令生成控制信號(hào)。這樣,由于 解碼電路的至少一部分由不同的指令集共享,所以與解碼電路相關(guān)的開(kāi) 銷(xiāo)可以被降低。而且,由于預(yù)解碼的指令通常是從指令高速緩存中多次 取出的,所以在預(yù)解碼階段執(zhí)行該到共享格式的映射允許在執(zhí)行該映射 中耗費(fèi)的能量分?jǐn)偟綄?duì)預(yù)解碼指令的多次使用上。并且,在預(yù)解碼階段 執(zhí)行該映射避免了在解碼階段的額外處理,該額外處理使得更難滿(mǎn)足定 時(shí)約束。
      盡管會(huì)理解來(lái)自多指令集的所有指令的全部功能性可以被共享,但 不同的指令集更可能具有某些不被共享的功能性,因此在一些實(shí)施例 中,預(yù)解碼的指令包括一個(gè)或多個(gè)位字段,用來(lái)表示不被來(lái)自第一指令 集和第二指令集的程序指令共享的功能性。
      可能不共享的功能性的一個(gè)例子是在第二指令集不包括條件碼時(shí), 第一指令集使用條件碼。響應(yīng)于條件碼的附加功能性可以由該一個(gè)或多
      個(gè)位字段來(lái)提供,該一個(gè)或多個(gè)位字段表示用于基于先前的處理活動(dòng)的 結(jié)杲來(lái)選通(gate)執(zhí)行或不執(zhí)行的非重疊功能性。
      盡管指令集可以全部是固定長(zhǎng)度,但在一些實(shí)施例中,第二指令集
      的指令是可變長(zhǎng)度的指令,包括具有高位(order)部分和低位部分的 至少一些程序指令。在這個(gè)上下文,該一個(gè)或多個(gè)位字段可以用來(lái)識(shí)別 這類(lèi)指令的高位部分和低位部分,以便促進(jìn)由解碼電路對(duì)它們進(jìn)行解 碼。
      上述技術(shù)的局限性在于預(yù)解碼的指令中可以用來(lái)表示由來(lái)自第一指 令集和第二指令集的指令提供的各種不同類(lèi)型的功能性的可用的指令
      位空間。在一些實(shí)施例中,第二指令集的至少一些程序指令可以被定義 為具有不可預(yù)知的行為,并且由于第二指令集不會(huì)有效地使用預(yù)解碼的 指令中的該指令位空間來(lái)表示其自己的具有可預(yù)知行為的指令,所以相 應(yīng)的預(yù)解碼的指令可以用來(lái)表示第一指令集中具有與第二指令集的任
      8何程序指令不共享的功能性的程序指令。
      不被不同指令集共享的功能性的例子是對(duì)指定為數(shù)值的操作數(shù)的支 持,該數(shù)值存儲(chǔ)在第一寄存器內(nèi),所述第一寄存器移位了第二寄存器中 指定的量。在這個(gè)上下文中,指定第二寄存器的字段可以位于預(yù)解碼的
      指令內(nèi)與一立即/f直(immediate value)對(duì)應(yīng)的位置處,該立即值指定 表示不同指令集的指令的不可預(yù)知變體的預(yù)解碼的指令內(nèi)的移位量,所 述不可預(yù)知變體使用存儲(chǔ)在第三寄存器內(nèi)的數(shù)值作為操作數(shù),該第三寄 存器移位了由正被再使用的所述立即值指定的量。
      至少其中一個(gè)指令集中可能有一些指令不可能共用解碼電路,因此 可以使用預(yù)解碼的指令內(nèi)的位字段以便選擇使用解碼電路的不共享部 分,從而對(duì)該不共享的功能性進(jìn)行解碼。
      在第三指令集內(nèi)的相鄰指令被識(shí)別為具有與第二指令集的一個(gè)指令 對(duì)應(yīng)的組合功能時(shí),預(yù)解碼電路也可以被用來(lái)通過(guò)執(zhí)行第三指令集的程 序指令之間的映射來(lái)降低能耗。在此情況中,預(yù)解碼電路可以生成與第 二指令集的該一個(gè)指令對(duì)應(yīng)的預(yù)解碼的指令,來(lái)取代第一指令集中指定 的相鄰指令。該一個(gè)指令然后可以代替這兩個(gè)之前的指令被執(zhí)行,以節(jié) 約時(shí)間和能量。
      預(yù)解碼電路還可以通過(guò)響應(yīng)于檢測(cè)到對(duì)應(yīng)于程序流的重定向的程序 指令以便終止當(dāng)前的程序指令流的預(yù)解碼來(lái)節(jié)約能量。在程序流的重定 向發(fā)生時(shí),由于程序流會(huì)被重定向到不同點(diǎn),并且那些預(yù)解碼的指令不 會(huì)被使用,所以對(duì)指令流中隨后的指令進(jìn)行預(yù)解碼所消耗的能量很可能 會(huì)被浪費(fèi)掉。
      從本發(fā)明的另一方面看,提供了一種用來(lái)處理數(shù)據(jù)的設(shè)備,包括 預(yù)解碼裝置,用來(lái)對(duì)從存儲(chǔ)器中取出的所述程序指令執(zhí)行預(yù)解碼操 作,以形成預(yù)解碼的指令;
      高速緩存裝置,其耦合到所述預(yù)解碼電路,以存儲(chǔ)所述預(yù)解碼的指
      令;
      解碼裝置,其用來(lái)響應(yīng)于從所述高速緩沖存儲(chǔ)器中讀取的預(yù)解碼的
      指令生成控制信號(hào);和
      處理電路,其用來(lái)響應(yīng)于所述控制信號(hào),執(zhí)行由所述預(yù)解碼的指令 指定的處理操作;其中
      所述程序指令來(lái)自多個(gè)不同的指令集;所述預(yù)解碼裝置將來(lái)自第 一指令集的程序指令和來(lái)自第二指令集的 程序指令映射到預(yù)解碼的指令,該預(yù)解碼的指令具有共享格式來(lái)表示共
      享的功能性;和
      所迷解碼裝置的共享部分生成所述控制信號(hào)以關(guān)于所述共享功能性 控制所述處理電路。
      從本發(fā)明的再一方面看,提供了一種用來(lái)處理數(shù)據(jù)的方法,包括以 下步驟
      對(duì)從存儲(chǔ)器中取出的程序指令執(zhí)行預(yù)解碼操作,以形成預(yù)解碼的指
      令;
      將所迷預(yù)解碼的指令存儲(chǔ)在高速緩沖存儲(chǔ)器中; 響應(yīng)于從所述高速緩沖存儲(chǔ)器中讀取的預(yù)解碼的指令來(lái)生成控制信
      號(hào);和
      響應(yīng)于所述控制信號(hào),執(zhí)行由所述預(yù)解碼的指令指定的處理操作;
      其中
      所述程序指令來(lái)自多個(gè)不同的指令集;
      執(zhí)行預(yù)解碼操作的所述步驟將來(lái)自第一指令集的程序指令和來(lái)自第 二指令集的程序指令映射到預(yù)解碼的指令,該預(yù)解碼的指令具有共享格
      式來(lái)表示共享功能性;和
      生成所述控制信號(hào)的所述步驟使用解碼電路的共享部分來(lái)生成所述 控制信號(hào),從而關(guān)于所述共享功能性控制所述處理電路。


      只作為例子,參考附圖中圖解說(shuō)明的實(shí)施例進(jìn)一步描述本發(fā)明,圖

      圖1示意性地圖解說(shuō)明了根據(jù)一個(gè)實(shí)施例的數(shù)據(jù)處理設(shè)備; 圖2是圖解說(shuō)明由根據(jù)一個(gè)實(shí)施例的數(shù)據(jù)處理設(shè)備執(zhí)行的一系列步 驟的流程圖3是更詳細(xì)地圖解說(shuō)明在提供異常指示符時(shí),由預(yù)解碼電路執(zhí)行 的一系列步驟的流程圖4是圖解說(shuō)明在取出和執(zhí)行指令時(shí)由處理電路執(zhí)行的一系列步驟 的流程圖5圖解說(shuō)明數(shù)據(jù)處理設(shè)備的一個(gè)具體示例性實(shí)施例;圖6圖解說(shuō)明在預(yù)解碼發(fā)生之前的兩種指令格式; 圖7圖解說(shuō)明表示程序指令的數(shù)據(jù)是如何被存儲(chǔ)在存儲(chǔ)空間中的; 圖8A-圖8D圖解說(shuō)明了可能產(chǎn)生預(yù)解碼誤差的幾種可能情況; 圖9圖解說(shuō)明根據(jù)一個(gè)實(shí)施例的在預(yù)解碼之后的兩個(gè)示例性指令的 格式;
      圖10是列出預(yù)解碼誤差可能出現(xiàn)或可能不出現(xiàn)的情況的表格; 圖11是圖解說(shuō)明一些實(shí)施例中的數(shù)據(jù)處理系統(tǒng)的操作的流程圖; 圖12圖解說(shuō)明根椐一個(gè)實(shí)施例的預(yù)解碼的Thumb 32指令內(nèi)的不完 整字段的使用;
      圖13圖解說(shuō)明根據(jù)一個(gè)實(shí)施例的跨越高速緩存行(cache line)邊 界的Thumb 32指令通過(guò)數(shù)據(jù)處理設(shè)備的兩種可能路線(xiàn);
      圖14是圖解說(shuō)明根據(jù)一個(gè)實(shí)施例的預(yù)解碼操作序列的流程圖; 圖15圖解說(shuō)明根據(jù)一個(gè)實(shí)施例的在預(yù)解碼之后的兩個(gè)示例性指令 的格式;
      圖16是更加詳細(xì)地圖解說(shuō)明根據(jù)一個(gè)實(shí)施例的為實(shí)現(xiàn)圖11的步驟 202而執(zhí)行的步驟的流程圖17圖解說(shuō)明根據(jù)一個(gè)實(shí)施例在指令高速緩存中提供的部件;
      圖18圖解說(shuō)明根據(jù) 一 個(gè)實(shí)施例的高速緩存的標(biāo)記R A M的每個(gè)條目是
      如何被擴(kuò)展為存儲(chǔ)推測(cè)的處理器狀態(tài)的;
      圖19示意性地圖解說(shuō)明在一個(gè)實(shí)施例中使用的雙通道成組相關(guān)式 (two-way set associative )指令高速緩存的構(gòu)造;
      圖20是圖解說(shuō)明根據(jù)一個(gè)實(shí)施例的預(yù)解碼操作的流程圖21圖解說(shuō)明根椐一個(gè)實(shí)施例的高速緩存查找程序;
      圖22圖解說(shuō)明數(shù)據(jù)處理設(shè)備內(nèi)的預(yù)解碼器電路與組合的二級(jí)高速
      緩存關(guān)聯(lián)的一個(gè)實(shí)施例;
      圖23圖解說(shuō)明與圖22中組合的二級(jí)高速緩存中的每個(gè)高速緩存行
      關(guān)聯(lián)的附加指令/數(shù)據(jù)標(biāo)識(shí)符值的使用;
      圖24示意性地圖解說(shuō)明具有解碼電路的處理流水線(xiàn)的一部分,所述
      解碼電路包括用來(lái)解碼與不同指令集中的指令對(duì)應(yīng)的預(yù)解碼的指令的
      共享部分;
      圖25圖解說(shuō)明ARM指令的不同部分是如何可以被預(yù)解碼為與Thumb 32指令具有共享格式的預(yù)解碼指令的;圖26圖解說(shuō)明Thumb 32和ARM指令是如何被分別預(yù)解碼為具有表 示共享功能性的共享格式的預(yù)解碼指令的;
      圖27圖解說(shuō)明ARM指令是如何可以被預(yù)解碼為與Thumb 32指令位 空間中未使用部分對(duì)應(yīng)的預(yù)解碼指令的;
      圖28圖解說(shuō)明兩個(gè)相鄰的Thumb 16指令是如何被連接并預(yù)解碼成 與單個(gè)Thumb 32指令對(duì)應(yīng)的預(yù)解碼指令的;
      圖29是示意性地圖解說(shuō)明ARM指令到Thumb 32指令的重新映射的 流程圖30圖解說(shuō)明在預(yù)解碼成過(guò)程中,兩個(gè)Thumb 16指令是如何可以 被重新映射到與單個(gè)Thumb 32指令對(duì)應(yīng)的預(yù)解碼指令的;和
      圖31是示意性地圖解說(shuō)明在預(yù)解碼過(guò)程中分支指令是如何被識(shí)別 的,并用來(lái)觸發(fā)預(yù)解碼的提前終止的流程圖。
      具體實(shí)施例方式
      圖1示意性地圖解說(shuō)明了根椐一個(gè)實(shí)施例的數(shù)據(jù)處理系統(tǒng)1。數(shù)據(jù) 處理系統(tǒng)l包括處理器系統(tǒng)接口 5,其包含用來(lái)從存儲(chǔ)器(未顯示)中 取出表示程序指令的數(shù)據(jù)的指令取出電路。處理器系統(tǒng)接口 5將從存儲(chǔ) 器中取出的指令傳遞到預(yù)解碼電路10。預(yù)解碼電路IO對(duì)指令執(zhí)行預(yù)解 碼操作以生成預(yù)解碼的指令,預(yù)解碼的指令被傳遞到行填充 (line-fill)緩沖器15并被存儲(chǔ)在指令高速緩存20中。存儲(chǔ)在指令 高速緩存20中的指令被處理電路25執(zhí)行。處理電路25包括用來(lái)由預(yù) 解碼的指令生成控制信號(hào)的解碼電路30,所述控制信號(hào)控制處理電路, 以便執(zhí)行處理操作。誤差檢測(cè)電路35用來(lái)檢測(cè)預(yù)解碼的指令中出現(xiàn)的 某些誤差,并使相關(guān)指令或包含那些指令的高速緩存行在被提供到處理 電路25之前重新通過(guò)預(yù)解碼電路10 (或者直接地,或者通過(guò)行填充操 作的啟動(dòng))。在檢測(cè)到這類(lèi)誤差的情況下,從誤差檢測(cè)電路35發(fā)送誤 差信號(hào)到處理電路25以使解碼電路30中斷可能關(guān)于已經(jīng)檢測(cè)到誤差的 這類(lèi)預(yù)解碼的指令已經(jīng)開(kāi)始的任何解碼,處理電路25相反等待藉由重 新通過(guò)預(yù)解碼電路10而獲得的預(yù)解碼指令。
      在將指令存儲(chǔ)在指令高速緩存之前對(duì)指令進(jìn)行預(yù)解碼是一種以前已 經(jīng)用來(lái)提高數(shù)據(jù)處理設(shè)備的性能的技術(shù)。然而,因?yàn)橛深A(yù)解碼操作產(chǎn)生 的長(zhǎng)度更長(zhǎng)的預(yù)解碼的指令,所以以這種方式對(duì)指令預(yù)解碼獲得的性能益處通常是以后來(lái)從指令高速緩存中取出那些指令以便執(zhí)行時(shí)的更大 的功耗為代價(jià)的。然而,由于與從指令高速緩存中取出高速緩存行相比, 從主存儲(chǔ)器中取出高速緩存行通常是罕見(jiàn)事件,所以已經(jīng)認(rèn)識(shí)到預(yù)解碼 器通常對(duì)給定指令的操作遠(yuǎn)遠(yuǎn)少于后面的解碼器對(duì)給定指令的操作,因 此存在實(shí)現(xiàn)數(shù)據(jù)處理設(shè)備的功率節(jié)省的可能。然而還認(rèn)識(shí)到如果能識(shí)別 指令的特征,對(duì)于該指令通過(guò)訪問(wèn)較寬指令高速緩存所消耗的功率比通
      能降低總體功耗??? 、'、— , '、 . 。
      如上文指出的,指令預(yù)解碼通常實(shí)現(xiàn)為性能增強(qiáng)技術(shù),所增加的功 耗被視作值得為性能益處付出的代價(jià)。不過(guò),已經(jīng)發(fā)現(xiàn)在指令高速緩存 之后在解碼階段識(shí)別異常指令所需的解碼電路可能對(duì)解碼器的總門(mén)數(shù) 貢獻(xiàn)很大。這在安全數(shù)據(jù)處理設(shè)備中尤其如此,原因是異常指令必須以 一致的確定的方式被解碼,使得不管處理器處于何種條件,并且不管其 最近執(zhí)行過(guò)什么指令,它總是對(duì)特定的異常指令表現(xiàn)相同。因?yàn)楫惓V?令必須以一致、確定的方式解碼,所以更多的門(mén)必須被置于解碼器中,
      以處理指令集體系架構(gòu)中的邊緣情況(corner case)。通過(guò)將該識(shí)別 移到預(yù)解碼階段,并提供與預(yù)解碼的指令有關(guān)的異常指令標(biāo)識(shí)符,已經(jīng) 發(fā)現(xiàn)此配置所增加的功耗被不必在解碼階段識(shí)別異常指令的功率節(jié)省 所超過(guò)。
      圖2示意性地圖解說(shuō)明根據(jù)一個(gè)實(shí)施例的在執(zhí)行預(yù)解碼操作時(shí)由數(shù) 據(jù)數(shù)據(jù)設(shè)備1執(zhí)行的一系列步驟。流程開(kāi)始于預(yù)解碼電路10內(nèi)的步驟 300,已經(jīng)(通過(guò)處理器系統(tǒng)接口 5)從存儲(chǔ)器中檢索到指令。在步驟 302,確定指令是否是異常的。在一個(gè)實(shí)施例中,異常指令被定義為是 未定義的,或者是不可預(yù)知的指令。未定義指令是指令空間中的一個(gè)指 令,卻不是指令集的一部分。由于在(例如)32位指令空間中,有232 (超過(guò)四十億)個(gè)可能的編碼,所以顯然可以有大量的這類(lèi)未定義指令。 另一方面,不可預(yù)知的指令是被定義的指令,但是其使用方式使得它不 會(huì)在數(shù)據(jù)處理設(shè)備中產(chǎn)生意義明確的結(jié)果,例如試圖執(zhí)行基址寄存器寫(xiě) 回(writeback)的加栽或存儲(chǔ)指令,其中基址被設(shè)置為程序計(jì)數(shù)寄存 器。
      如果指令被識(shí)別為異常,則在步驟304,預(yù)解碼電路IO提供識(shí)別該 指令為異常的標(biāo)識(shí)符。該標(biāo)識(shí)符與預(yù)解碼電路10生成的預(yù)解碼的指令
      13有關(guān),在一個(gè)實(shí)施例中,在預(yù)解碼的指令中的邊帶位(side band bit) 用作標(biāo)識(shí)符。
      然而如果在步驟302,指令被識(shí)別為不是異常的,則步驟304被省 略。流程前進(jìn)到步驟306,在步驟306預(yù)解碼電路IO執(zhí)行任何其它的(在 說(shuō)明書(shū)稍后部分會(huì)給出其它預(yù)解碼步驟的例子)預(yù)解碼步驟。最后,在 步驟308,預(yù)解碼的指令被存儲(chǔ)在指令高速緩存20中(通過(guò)行填充緩沖 器15)。
      圖3示意性地更加詳細(xì)地圖解說(shuō)明在一個(gè)實(shí)施例中由預(yù)解碼電路10 執(zhí)行的圖2的步驟304中的一系列步驟。首先,在步驟320,檢查預(yù)解 碼電路IO當(dāng)前是否被配置為將所有異常指令轉(zhuǎn)換為預(yù)定的未定義指令。 如果是,則流程前進(jìn)到步驟324,在步驟324中,進(jìn)行該轉(zhuǎn)換。在本發(fā) 明的實(shí)施例中,預(yù)解碼電路被配置為執(zhí)行此操作,由于只有一個(gè)具體的 未定義指令會(huì)被處理電路接收,并且對(duì)于所有異常指令其響應(yīng)(例如調(diào) 用專(zhuān)用異常例程)是明確定義并且可預(yù)知的,所以這允許處理電路中用 來(lái)處理異常指令的機(jī)制特別簡(jiǎn)單。流程從步驟324繼續(xù)到圖2中的步驟 306。因此在這個(gè)實(shí)施例中,預(yù)定的未定義指令本身的使用提供異常指 令的"指示符"。
      否則流程前進(jìn)到步驟326,在步驟326中,檢查預(yù)解碼電路10當(dāng)前 是否被配置成將所有的異常指令都標(biāo)記為未定義的。由于之后處理所有 異常指令就好像它們是未定義指令,且對(duì)于所有異常指令處理電路的響 應(yīng)是明確定義的且可預(yù)知的(例如,這類(lèi)指令可能觸發(fā)異常事件 (exception),或可選地可能是NOP (空操作)處理的,通過(guò)處理電路 而結(jié)果不會(huì)對(duì)處理電路的內(nèi)部狀態(tài)有任何影響),所以預(yù)解碼電路10 的這種配置也簡(jiǎn)化了處理異常指令的下游機(jī)制。如果所有的異常指令都 應(yīng)該被標(biāo)記為未定義的,則流程前進(jìn)到步驟330,在步驟330,生成相 應(yīng)的指示符,在此情況下,給預(yù)解碼的指令增加邊帶位表明該指令是未 定義的。
      如果預(yù)解碼電路10當(dāng)前未被配置為將所有異常指令標(biāo)記為未定義 的,則流程前進(jìn)到步驟328,在步驟328,檢查所識(shí)別的異常指令是否 是未定義指令。如果是,則流程前進(jìn)到步驟330,并且邊帶位被添加到 預(yù)解碼的指令,表明該指令是未定義的。如果異常指令不是未定義的, 則在此實(shí)施例中,其一定是不可預(yù)知的,并且在步驟3M,邊帶位被添加到預(yù)解碼的指令,表明該指令是不可預(yù)知的。通過(guò)圖3的所有路徑最 終合并,前進(jìn)到圖2的步驟306。
      圖4圖解說(shuō)明了在取出并執(zhí)行指令時(shí)由處理電路25執(zhí)行的一系列步
      驟,所述指令可能具有相關(guān)的指示符以標(biāo)記預(yù)解碼的指令為異常的。在 步驟350,從指令高速緩存20中取出預(yù)解碼的指令送到處理電路25中。 接下來(lái),在步驟352,借助于相關(guān)的指示符,檢查預(yù)解碼的指令以 確定其是否已經(jīng)被標(biāo)記為異常的。如果預(yù)解碼的指令沒(méi)有被標(biāo)記為異 常,則在步驟354,正常執(zhí)行該指令(如果需要之前由解碼電路30進(jìn)行 進(jìn)一步的解碼)。
      另一方面,如果指令是異常的,則處理電路25以預(yù)定方式執(zhí)行指令 (步驟356 )。在此實(shí)施例中,處理電路被配置成以?xún)煞N方式中的一種 方式執(zhí)行此操作。首先,在步驟358,如果處理電路被配置為NOP該指 令(不對(duì)該指令進(jìn)行操作),則在步驟360該指令被執(zhí)行為NOP,通過(guò) 處理電路而結(jié)果不改變處理電路的任何狀態(tài)??蛇x地,如果處理電路被 配置為響應(yīng)于異常指令而觸發(fā)異常事件,則在步驟362,適當(dāng)?shù)漠惓J?件-波調(diào)用。
      因此,根據(jù)上述實(shí)施例,提供處理數(shù)據(jù)設(shè)備,其中通過(guò)在預(yù)解碼階 段識(shí)別異常指令來(lái)實(shí)現(xiàn)功率節(jié)省。通過(guò)生成表明指令是異常的標(biāo)識(shí)符, 在稍后從指令高速緩存中檢索預(yù)解碼的指令時(shí),處理電路可以更迅速地 處理異常指令。而且,早期識(shí)別異常指令使得能夠提供以可預(yù)知、明確 定義的方式對(duì)否則會(huì)危害裝置的操作和安全性的指令作出反應(yīng)的數(shù)椐 處理設(shè)備。
      數(shù)據(jù)處理系統(tǒng)1處理來(lái)自一個(gè)或多個(gè)指令集的指令。例如,由劍橋 的ARM有限公司生產(chǎn)的一些處理器可以執(zhí)行來(lái)自ARM指令集的指令,以 及來(lái)自混合長(zhǎng)度Thumb 2指令集的指令。Thumb 2指令長(zhǎng)度可以是16位 或32位。因此,解碼電路30可以包括用于每個(gè)指令集的解碼器。圖5 顯示了數(shù)椐處理設(shè)備l的例子,其中解碼電路30包括ARM解碼器40, Thumb-32解碼器45和Thumb-16解碼器50。解碼器40, 45, 50用來(lái)對(duì) 存儲(chǔ)在指令高速緩存20中的預(yù)解碼的指令進(jìn)行解碼。解碼器40, 45, 50從預(yù)解碼的指令中生成控制信號(hào),所述控制信號(hào)控制處理電路,以便 執(zhí)行處理操作。多路轉(zhuǎn)接器(multiplexer) 65根據(jù)處理器狀態(tài)選擇使 用解碼器40, 45, 50中的哪一個(gè)。圖6顯示了預(yù)解碼之前的Thumb-l6( Tl6 )指令1 00和Thumb-32( T32 ) 指令I(lǐng)IO。 T16指令100由16位搡作碼(包括所有字段)組成。T32指 令110由兩部分組成。第一部分T32a由16位組成。T32指令110的第 一部分T32a中的位[15: 13]被設(shè)置成Obl 11 。第一部分T32a的位[12: 0]存儲(chǔ)T32操作碼的前13位。T32指令110的第二部分T32b含有包括 T32操作碼的后半部分的16位。對(duì)于T16指令和T32指令,T32的兩部 分長(zhǎng)度彼此相同,且與T16的長(zhǎng)度相同。不過(guò)對(duì)于所有混合長(zhǎng)度的指令 集來(lái)說(shuō),不總是這種情況。
      圖7顯示了表示程序指令的數(shù)據(jù)是如何被存儲(chǔ)在存儲(chǔ)空間150中的。 數(shù)據(jù)被排列在塊170中,每個(gè)塊表示程序指令的一部分。例如,每個(gè)塊 可以表示T16指令,T32指令的第一部分T32a或T32指令的第二部分 T32b。各個(gè)塊被排列在高速緩存行160中。為了簡(jiǎn)單,在圖7中,高速 緩存行160被描繪為包含四個(gè)塊,但應(yīng)認(rèn)識(shí)到高速緩存行160可以存儲(chǔ) 其它數(shù)量( 一般很大)的塊170。 T32指令可以跨越兩個(gè)高速緩存行160 之間的邊界,使得一個(gè)高速緩存行的最后一塊表示T32a,下一個(gè)高速緩 存行的第一塊表示T32b。
      當(dāng)程序被執(zhí)行時(shí),如果可能,處理電路執(zhí)行存儲(chǔ)在指令高速緩存20 中的指令。如杲指令不在指令高速緩存20中,則發(fā)生高速緩存未命中 (cache miss),并且表示指令的數(shù)椐塊從存儲(chǔ)器中被取出。處理器系 統(tǒng)接口 5內(nèi)的取出電路從存儲(chǔ)器中取出包括表示所需指令的一塊或多個(gè) 塊的高速緩存行160。取出的塊在被放置到指令高速緩存20中以便進(jìn)一 步解碼之前,由預(yù)解碼電路10進(jìn)行預(yù)解碼。不過(guò),當(dāng)塊被取出時(shí),預(yù) 解碼電路10不能毫無(wú)疑問(wèn)地確定塊表示指令的哪一部分。因此,預(yù)解 碼電路10對(duì)取出的塊表示指令的哪一部分進(jìn)行推測(cè)性識(shí)別。
      指令塊中可以有一些位表示塊很可能代表哪一部分。例如,在混合 長(zhǎng)度的Thumb2指令中,表示T32指令的第一部分T32a的塊的位[15: 13]被設(shè)置成OblU。根據(jù)預(yù)解碼電路IO作出的識(shí)別,在塊上執(zhí)行預(yù)解 碼操作。例如,異常指令標(biāo)識(shí)符可以被添加到塊中,以指示該塊是否是 異常指令。不過(guò)根據(jù)該指令的操作碼的值,T32指令的第二部分TMb可 能也出現(xiàn)相同的位模式。因此,推測(cè)性識(shí)別可能是不正確的。如果對(duì)塊 的識(shí)別不正確,則預(yù)解碼電路IO可能在該塊上執(zhí)行錯(cuò)誤的預(yù)解碼操作, 導(dǎo)致預(yù)解碼誤差。
      16圖8A到圖8D圖解說(shuō)明了幾種可能出現(xiàn)誤差的情況。圖8A顯示了當(dāng) 處理器分支到高速緩存行的中間時(shí),可能出現(xiàn)的誤差。如果出現(xiàn)高速緩 存未命中,則處理器系統(tǒng)接口從存儲(chǔ)器中取出高速緩存行。預(yù)解碼電路 IO從程序分支的那一點(diǎn)起開(kāi)始預(yù)解碼,使得處理器可以盡可能快地不停 止(unstall)。預(yù)解碼電路10然后繼續(xù)預(yù)解碼塊直到高速緩存行的末 端。預(yù)解碼電路10然后返回到高速緩存行的開(kāi)始,對(duì)高速緩存行中第 一塊表示哪一部分作出推測(cè)性識(shí)別,并對(duì)高達(dá)緩存行中剩下的塊進(jìn)行預(yù) 解碼 高速緩存行中第一塊的推測(cè)性識(shí)別可能是不正確的,引起預(yù)解碼 誤差。例如,在圖8A中,高速緩存行的第一塊實(shí)際上表示T3卩b部分, 但根據(jù)塊的位[15: 13]的值,可能被錯(cuò)誤地識(shí)別為是T32a部分或T16 部分。
      在出現(xiàn)分支錯(cuò)誤預(yù)測(cè)時(shí)可能出現(xiàn)另 一種類(lèi)型的誤差,使程序流錯(cuò)誤 地分支到T32指令的中間,如圖8B所示的。在這種情況下,預(yù)解碼電 路10可能不正確地將接下來(lái)的T32b部分識(shí)別為T(mén)16指令或T32a。隨后 的塊也可能被誤識(shí)別。例如,如果分支點(diǎn)的塊實(shí)際上表示T32b部分, 但被錯(cuò)誤地識(shí)別為T(mén)32a,則接下來(lái)的塊會(huì)被識(shí)別為T(mén)32b。這可能引起 進(jìn)一步的誤差。
      如圖8C中所示的,如果T32指令跨越高速緩存行邊界,則在預(yù)解碼 電路10對(duì)第二高速緩存行解碼時(shí)可能會(huì)出現(xiàn)誤差。TMb部分可能被識(shí) 別為T(mén)16指令或識(shí)別為T(mén)32a。
      圖8D圖解說(shuō)明在高速緩存行包含不表示程序指令(文字)的數(shù)據(jù)時(shí) 可能出現(xiàn)的誤差。在這種情況下,預(yù)解碼電路10可能將該文字解釋為 指令部分。這可能在后續(xù)塊的識(shí)別中引起連鎖(knock on)效應(yīng)。例如, 如果預(yù)解碼電路IO將該文字識(shí)別為T(mén)32a部分,則它會(huì)將下一個(gè)塊預(yù)解 碼為T(mén)32指令的T32b部分。
      這樣,存在可能引起預(yù)解碼誤差的幾種情況。因此,在一些實(shí)施例 中,數(shù)據(jù)處理系統(tǒng)1配備有誤差檢測(cè)電路35,該誤差檢測(cè)電路35可檢 測(cè)由預(yù)解碼電路IO作出的推測(cè)性識(shí)別是否是正確的,如果是不正確的, 則用信號(hào)通知預(yù)解碼誤差,并校正高速緩存20中的誤差指令。通過(guò)將 已經(jīng)檢測(cè)到誤差的至少一部分預(yù)解碼指令發(fā)送回預(yù)解碼電路10以被再 次預(yù)解碼可以校正預(yù)解碼誤差。在一些情況下,預(yù)解碼電路10可能能 夠從預(yù)解碼的塊中重新生成原始指令塊。校正誤差的一種可選方法是使高速緩存20中含有誤差的高速緩存行無(wú)效,并使該.高速緩存行從存儲(chǔ)器中重新取出并再次預(yù)解碼。
      為了使誤差檢測(cè)電路能夠檢測(cè)預(yù)解碼電路10推測(cè)性地識(shí)別塊的哪一部分,預(yù)解碼電路用指令部分標(biāo)識(shí)符對(duì)每個(gè)塊作標(biāo)記,所迷指令部分標(biāo)識(shí)符表明已經(jīng)識(shí)別了塊的哪一部分。該指令部分標(biāo)識(shí)符作為一個(gè)或多個(gè)附加位被添加到塊中。
      在一個(gè)實(shí)施例中,執(zhí)行預(yù)解碼操作,以便將異常指令標(biāo)識(shí)符添加到T32指令,以表明該指令是否是異常的。該異常指令標(biāo)識(shí)符以邊帶(sideband)信息的形式^皮添加到T32指令的第一部分T32a。在這個(gè)實(shí)施例中,沒(méi)有邊帶信息被添加到T32指令的第二部分T32b或T16指令。
      因此,T16操作碼和T32操作碼的后半部分不會(huì)被預(yù)解碼電路10更改。這表明由于操作碼不會(huì)被更改因此不管作出的識(shí)別如何,存儲(chǔ)在指令高速緩存2 0中的塊是相同的,所以預(yù)解碼電路10如果錯(cuò)誤地將表示T16指令的塊識(shí)別為T(mén)32指令的第二部分T32b是無(wú)關(guān)緊要的。類(lèi)似地,如果預(yù)解碼電路IO將實(shí)際表示T32b的塊識(shí)別為T(mén)16,也是無(wú)關(guān)緊要的。此外,不正確的識(shí)別不會(huì)產(chǎn)生預(yù)解碼誤差。這意味著出現(xiàn)預(yù)解碼誤差的數(shù)量可以被減小。如果出現(xiàn)的預(yù)解碼誤差越少,則誤差檢測(cè)電路35需要校正的誤差越少,預(yù)解碼電路10不必不止一次地預(yù)解碼一樣多的指令。因此,數(shù)據(jù)處理系統(tǒng)1消耗的功率會(huì)被降低。
      由于塊是被識(shí)別為T(mén)16還是T32b是無(wú)關(guān)緊要的,所以對(duì)每種情況,預(yù)解碼電路10將相同的指令部分標(biāo)識(shí)符添加到塊中。因此,指令部分標(biāo)識(shí)符只需要識(shí)別塊是否表示T32指令的第一部分T32a。這意味著指令部分標(biāo)識(shí)符只需要一位,所以指令不需要被不適當(dāng)?shù)財(cái)U(kuò)展。這意味著將預(yù)解碼的指令存儲(chǔ)在高速緩存20中所消耗的功率較小。在一個(gè)實(shí)施例中,當(dāng)塊被識(shí)別為表示T32a時(shí),指令部分標(biāo)識(shí)符被設(shè)置為"1",當(dāng)塊表示T32b或T16指令時(shí),指令部分標(biāo)識(shí)符被設(shè)置為"0"。
      圖9顯示在一個(gè)示例性實(shí)施例中預(yù)解碼之后的T16指令和T32指令的格式。如果塊被識(shí)別為表示T32指令的第一部分T32a,則預(yù)解碼電路10在位[16]添加指令部分標(biāo)識(shí)符(ID位),并將指令部分標(biāo)識(shí)符設(shè)置為"1"。插入邊帶信息,表明指令是否是異常指令。由于位[16]的指令部分標(biāo)識(shí)符現(xiàn)在表明該塊表示T32指令的T32a部分,所以位[15: 13]對(duì)于識(shí)別該塊是冗余的。因此,邊帶信息可以被插入這些位中,而不會(huì)
      18丟失信息。進(jìn)行此操作的一種方式是在T32a部分的位[15: 14]插入邊帶位, 一位表示指令是否是未定義的, 一位表示指令是否是不可預(yù)知的。因此,邊帶信息可以被添加到塊中,而不擴(kuò)展塊的長(zhǎng)度,降低了將指令存儲(chǔ)在高速緩存20中所消耗的功率。
      由于T32指令的邊帶信息只被添加到指令的第一部分T32a,所以這允許在第二部分T32b上執(zhí)行的預(yù)解碼操作與在T16指令上執(zhí)行的操作一樣,使得出現(xiàn)誤差的數(shù)量可以被減小。如果塊被識(shí)別為表示T16指令,則預(yù)解碼電路10在位[16]添加指令部分標(biāo)識(shí)符(ID位),并將指令部分標(biāo)識(shí)符設(shè)置為0。位[15: 0]中的T16操作碼不被更改。如果塊被識(shí)別為表示T32指令的第二部分,則對(duì)該塊執(zhí)行與T16指令相同的預(yù)解碼操作。T32指令的位[33〗(對(duì)應(yīng)于表示T32指令的第二部分T32b的位[16])被設(shè)置成0。 T32操作碼的后半段的剩余部分不被修改。
      因此,在T16已經(jīng)被識(shí)別為T(mén)32b或T32b已經(jīng)被識(shí)別為T(mén)16時(shí),預(yù)解碼電路不需要檢測(cè)誤差,所以要檢測(cè)的誤差更少。唯一需要被檢測(cè)的誤差是在T32b部分被不正確地推測(cè)識(shí)別為T(mén)32a部分時(shí),在兩個(gè)連續(xù)塊被標(biāo)記為T(mén)32a部分時(shí)(這在T32指令跨越高速緩存行邊界時(shí)會(huì)出現(xiàn)),或者在T32a部分被錯(cuò)誤地識(shí)別為T(mén)32b部分(由來(lái)自前一塊的錯(cuò)誤標(biāo)識(shí)的連鎖效應(yīng)引起的)。圖10的表列出了可能出現(xiàn)誤差或可能不出現(xiàn)誤差的情況。歹ij本》也指令;^ (Native Instruction Stream)顯示高速纟復(fù)存行中的塊序列實(shí)際表示哪一部分。列預(yù)解碼推測(cè)(Pre-decodeSpeculation)顯示預(yù)解碼電路已推測(cè)性地識(shí)別塊的哪一部分。在分支誤預(yù)測(cè)出現(xiàn)時(shí)可能出現(xiàn)一些預(yù)解碼誤差,導(dǎo)致程序流分支到T32指令的中間。在程序流從前一高速緩存行繼續(xù)時(shí),可能出現(xiàn)其它誤差。
      應(yīng)認(rèn)識(shí)到本技術(shù)不局限于Thumb2指令集中的指令,而是可應(yīng)用于任
      何可變長(zhǎng)度指令集中的指令,或者可應(yīng)用于不同長(zhǎng)度的指令集中的指令。通過(guò)確保對(duì)于來(lái)自第一指令集的指令的至少一個(gè)部分和來(lái)自第二指令集的指令的至少一個(gè)部分,不管預(yù)解碼電路10識(shí)別塊的哪一部分,在該塊上執(zhí)行的預(yù)解碼操作是相同的。因此,系統(tǒng)消耗的功率可以被降低。
      圖11顯示了圖解說(shuō)明一些實(shí)施例中數(shù)據(jù)處理系統(tǒng)1的搡作的流程圖。首先,在步驟200,處理器系統(tǒng)接口 5中的指令取出電路從存儲(chǔ)器中取出包括表示程序指令的多個(gè)數(shù)據(jù)塊的高速緩存行。接下來(lái),在步驟202,數(shù)據(jù)塊被傳遞到預(yù)解碼電路10,預(yù)解碼電路IO通過(guò)對(duì)所述塊執(zhí)行預(yù)解碼操作來(lái)對(duì)塊進(jìn)行預(yù)解碼,并生成預(yù)解碼的塊。預(yù)解碼操作將參考圖15進(jìn)行更加詳細(xì)描述。在步驟204中,由預(yù)解碼的塊組成的預(yù)解碼的指令被存儲(chǔ)在指令高速緩存20中。隨后,在步驟206中,誤差檢測(cè)電路35檢查存儲(chǔ)在高速緩存20中的預(yù)解碼的塊中的誤差。在步驟208,誤差檢測(cè)電路35識(shí)別是否已經(jīng)檢測(cè)到任何預(yù)解碼誤差。
      如果在步驟208中,誤差檢測(cè)電路35識(shí)別到已經(jīng)檢測(cè)到預(yù)解碼誤差,則誤差檢測(cè)電路35用來(lái)校正該預(yù)解碼誤差。在一個(gè)實(shí)施例中,在步驟210中,誤差檢測(cè)電路35將任何不正確預(yù)解碼的塊的至少一部分發(fā)送回預(yù)解碼電路IO。流程然后返回步驟202,在步驟202中,預(yù)解碼電路再次對(duì)不正確預(yù)解碼的塊進(jìn)行預(yù)解碼。
      作為步驟210的可選方案,誤差檢測(cè)電路35相反可以執(zhí)行步驟212。在步驟212,誤差檢測(cè)電路35使指令高速緩存20中包含不正確預(yù)解碼的指令的高速緩存行無(wú)效。流程然后返回步驟200,在步驟200中,包含不正確預(yù)解碼指令的高速緩存行從存儲(chǔ)器中被重新取出。
      另一方面,如果誤差檢測(cè)電路35在步驟208中識(shí)別沒(méi)有檢測(cè)到誤差,則流程轉(zhuǎn)到步驟216。在步驟216中,處理電路25中的解碼電路30對(duì)預(yù)解碼的指令進(jìn)行解碼,并生成控制信號(hào)。接下來(lái),在步驟220,處理電路響應(yīng)于控制信號(hào)執(zhí)行處理操作。然后過(guò)程結(jié)束。
      可能會(huì)出現(xiàn)因此應(yīng)該被識(shí)別的另一個(gè)預(yù)解碼誤差是在Thumb32指令跨過(guò)高速緩存行邊界時(shí),并且在執(zhí)行預(yù)解碼操作時(shí)第二半字(secondhalf-word)不可用于預(yù)解碼電路。在正常操作中,只要預(yù)解碼器有來(lái)自前一高速緩存行的第一半字(first half-word)和來(lái)自新高速緩存行的第二半字,預(yù)解碼器就可以正確地對(duì)跨過(guò)高速緩存行邊界的Thumb-32指令進(jìn)行預(yù)解碼。不過(guò),在Thumb-32指令跨過(guò)高速緩存行邊界,且在正執(zhí)行預(yù)解碼操作時(shí)還沒(méi)有取出新的高速緩存行時(shí),預(yù)解碼操作是不完整的,因此邊帶信號(hào)不能被正確地預(yù)解碼。
      為了使處理電路稍后能確定在從指令高速緩存讀取預(yù)解碼的指令時(shí)預(yù)解碼操作是不完整的,在一個(gè)實(shí)施例中,不完整字段被添加到預(yù)解碼的指令以形成不完整的預(yù)解碼標(biāo)識(shí)符,如果在執(zhí)行預(yù)解碼操作時(shí)預(yù)解碼電路不能訪問(wèn)Thumb-32指令的兩個(gè)部分,則設(shè)置該字段,并且在一個(gè)具體實(shí)施例中,預(yù)解碼的Thumb-32指令可以被表示為圖12中所示的那樣。具體地,比較圖12和之前討論的圖9,可以看出每個(gè)預(yù)解碼的指令部分已經(jīng)從17位擴(kuò)展到18位,使得位0-17表示第一預(yù)解碼的指令部分,位18-35表示第二預(yù)解碼的指令部分。第一預(yù)解碼的指令部分的位0-16與之前討論的圖9是一樣的,邊帶信號(hào)(識(shí)別異常指令的存在)被插入到位位置14和15之間,并且指令部分標(biāo)識(shí)符被插入在位位置16。而且,位位置17用來(lái)提供不完整字段,如果在執(zhí)行預(yù)解碼操作時(shí),預(yù)解碼電路不能訪問(wèn)Thumb-32指令的后半段,則該位被設(shè)置,因此表明位位置14和15中的邊帶信號(hào)不能被信賴(lài),并且實(shí)際上可能是不正確的。
      考慮預(yù)解碼指令的后半段,位17-34與之前描述的圖9中所示的實(shí)施例的位16-33相同。添加位位置35,以便使第二預(yù)解碼的指令部分與第一預(yù)解碼的指令部分的長(zhǎng)度相同,并且在一個(gè)實(shí)施例中,位35被設(shè)置為等于0。不過(guò),正如本文后面更詳細(xì)描述的,在可選實(shí)施例中,位位置35可以用于另一目的。
      在可選實(shí)施例中,不是在位位置17使用不完整字段,而是在執(zhí)行預(yù)解碼操作時(shí)只能訪問(wèn)Thumb-32指令的第一半字的情況下,預(yù)解碼電路可以被布置為設(shè)置位位置16中的指令部分標(biāo)識(shí)符,以識(shí)別第一預(yù)解碼的指令部分與Thumb 16指令相關(guān),即通過(guò)將位位置16設(shè)置為邏輯值0。如果稍后從指令高速緩存中取出這種預(yù)解碼的指令部分,則誤差檢測(cè)電路35會(huì)觀察到該指令部分其實(shí)是已被不正確地標(biāo)記為T(mén)humb 16指令的一部分Thumb 32指令,因此用信號(hào)通知誤差,防止可能被破壞的預(yù)解碼指令被處理電路才丸行。因此,通過(guò)這種才幾制,可以防止處理電路使用不完整預(yù)解碼的指令,而不需要如圖12中顯示的單獨(dú)的不完整位。
      作為圖12中所示的實(shí)施例的另一可選實(shí)施例,不完整的預(yù)解碼標(biāo)識(shí)符可以被存儲(chǔ)在與特定高速緩存行的標(biāo)記RAM入口 (entry)相關(guān)的高速緩存中。當(dāng)這種標(biāo)識(shí)符被設(shè)置時(shí)(優(yōu)選地這被提供為單個(gè)位字段),這會(huì)標(biāo)明出現(xiàn)在高速緩存行末端的預(yù)解碼的指令部分會(huì)受到不完整的預(yù)解碼操作,因此,不能認(rèn)為是被正確預(yù)解碼的。
      在一些實(shí)施例中,提供與每個(gè)標(biāo)記RAM入口相關(guān)的該單個(gè)標(biāo)識(shí)位而不是試圖在每個(gè)預(yù)解碼的指令中容納該額外信息可能是更加空間有效的。
      圖13圖解說(shuō)明跨過(guò)高速緩存行邊界的Thumb 32指令通過(guò)數(shù)據(jù)處理設(shè)備可能采用的兩種可能路徑。如圖13中所示,提供緩沖器380以存儲(chǔ)通過(guò)處理器系統(tǒng)接口 5從存儲(chǔ)器系統(tǒng)中取出的特定高速緩存行的最后半字(last half word),如果該最后半字是Thumb 32指令的第一半字,則使用該緩沖的信息。如果處理器正不斷地從存儲(chǔ)器中取出連續(xù)的高速緩存行,則通過(guò)緩存該最后的指令部分,預(yù)解碼電路10可以等待下一個(gè)高速緩存行以經(jīng)過(guò)處理器系統(tǒng)接口 5和多路轉(zhuǎn)接器60從存儲(chǔ)器路由到預(yù)解碼電路10,并且在那點(diǎn)可以通過(guò)使用跨越高速緩存行邊界的指令的兩個(gè)半字執(zhí)行完整的預(yù)解碼操作,并生成適當(dāng)?shù)倪厧盘?hào)。結(jié)果,在預(yù)解碼的指令稍后通過(guò)行填充緩沖器15進(jìn)入指令高速緩存20中時(shí),預(yù)解碼的指令隨后可以從指令高速緩存中讀取,并直接通過(guò)解碼電路30,正如圖13中的路徑"A"示意性表示的那樣。
      不過(guò),如果處理器不是連續(xù)取出連續(xù)高速緩存行,則與跨過(guò)高速緩存行邊界的Thumb 32指令的前半段對(duì)應(yīng)的預(yù)解碼的指令部分會(huì)受到不完整的預(yù)解碼操作,因此需要使用上述三種可行技術(shù)中的任何一種技術(shù)來(lái)設(shè)置不完整的預(yù)解碼標(biāo)識(shí)符。在這種實(shí)例中,在包括這種第一預(yù)解碼的指令部分的Thumb 32指令從指令高速緩存20中讀取時(shí),預(yù)解碼誤差檢測(cè)電路35會(huì)檢測(cè)不完整的預(yù)解碼標(biāo)識(shí)符的設(shè)置,并且在一個(gè)實(shí)施例中使整個(gè)Thumb 32指令通過(guò)多路轉(zhuǎn)接器60重新路由回到預(yù)解碼電路10中,正如圖13中路徑"B"示意性表示的那樣。具體地,控制信號(hào)通過(guò)路徑3 7從預(yù)解碼誤差檢測(cè)電路3 5路由回到多路轉(zhuǎn)接器6 0 ,以使多路轉(zhuǎn)接器選擇回送(loopback)路徑39上呈現(xiàn)的指令數(shù)據(jù)。在本發(fā)明的實(shí)施例中,由于在產(chǎn)生預(yù)解碼的指令時(shí),由預(yù)解碼操作產(chǎn)生的信息被添加到指令中的方式,所以這是可能的。具體地,由于一旦指令部分標(biāo)識(shí)符被插入在位位置16時(shí)位位置15和14變成冗余的,所以邊帶信號(hào)被添加到位位置15和14中。結(jié)果,原始指令可以容易地從預(yù)解碼的指令中重新產(chǎn)生,因此,不需要從存儲(chǔ)器中重新取出指令就可以使指令重新路由通過(guò)預(yù)解碼電路10。
      在可選實(shí)施例中,如果不能從預(yù)解碼的指令中重新產(chǎn)生原始指令,則預(yù)解碼誤差檢測(cè)電路35可以被設(shè)置為使指令高速緩存中相關(guān)的兩個(gè)相鄰高速緩存行無(wú)效,并且執(zhí)行行填充操作,以使那兩個(gè)高速緩存行從存儲(chǔ)器中被順序地重新取出,并通過(guò)預(yù)解碼電路。
      應(yīng)認(rèn)識(shí)到在檢測(cè)誤差,以及指令重新通過(guò)預(yù)解碼電路之后,指令會(huì)沿著路徑a,并且在處理電路需要時(shí)可被檢索到解碼電路30中。圖14示意性地圖解說(shuō)明了根據(jù)上迷技術(shù)的預(yù)解碼電路的操作。預(yù)解碼操作開(kāi)始于步驟400,并在步驟402確定指令是否是Thumb 32指令。如果是,則在步驟404中檢測(cè)該Thumb 32指令是否跨過(guò)高速緩存行邊界,如果是,則在步驟406中確定處理器是否正從順序高速緩存行中取出。
      如果處理器正從順序高速緩存行中取出,則在步驟410中出現(xiàn)在高速緩存行末端的Thumb 32指令的第一指令部分被緩存在寄存器380中,之后在步驟412,預(yù)解碼電路10等待從處理器系統(tǒng)接口 5接收下一高速緩存行。一旦下一高速緩存行可用,則在步驟414中以正常方式在Thumb32指令上執(zhí)行預(yù)解碼操作。如果在步驟402檢測(cè)到指令不是Thumb 32指令,則過(guò)程會(huì)直接前進(jìn)到步驟414,因?yàn)樵诒景l(fā)明的一個(gè)實(shí)施例中,由處理器執(zhí)行的任何其它指令集的指令與高速緩存行邊界對(duì)齊。類(lèi)似地,如果指令是Thumb 32指令,但在步驟404確定Thumb 32指令沒(méi)有跨過(guò)高速緩存行邊界,則處理器再次直接前進(jìn)到步驟"4。
      如果在步驟406中,確定處理器不從順序高速緩存行中取出,則過(guò)程前進(jìn)到步驟408,在步驟408,關(guān)于Thumb 32指令的第一半字,執(zhí)行不完整的預(yù)解碼操作,并且不完整字段被設(shè)置成識(shí)別已經(jīng)通過(guò)使用不完整的預(yù)解碼操作生成添加到預(yù)解碼的指令部分中的邊帶信號(hào)。
      從上述描述可以看出,通過(guò)提供與一個(gè)或多個(gè)預(yù)解碼的指令部分相關(guān)的這類(lèi)不完整的預(yù)解碼指示,如果包括這種預(yù)解碼的指令部分的預(yù)解碼的指令稍后由處理電路從高速緩存中讀取,則該指示將向處理電路標(biāo)明,預(yù)解碼的指令可能被破壞,允許處理電路采取適當(dāng)動(dòng)作。因此,由于執(zhí)行沒(méi)有被完整預(yù)解碼的指令而產(chǎn)生的不正確操作可以被避免,而不會(huì)對(duì)設(shè)計(jì)產(chǎn)生大的附加花費(fèi)和復(fù)雜性。
      在上面討論的實(shí)施例中,異常指令標(biāo)識(shí)符僅被添加到T32指令。例如,這可以通過(guò)將邊帶信息添加到T32指令的第一部分T32a來(lái)完成。異常指令標(biāo)識(shí)符不被添加到T16指令。在某種程度上,這是可接受的,因?yàn)門(mén)16指令集小得足以使得可以比T32指令更容易地解碼異常指令,因此解碼電路對(duì)這些異常指令進(jìn)行解碼所消耗的功率較小。
      不過(guò),在一個(gè)實(shí)施例中,當(dāng)不完整的預(yù)解碼標(biāo)識(shí)符被添加時(shí),T32指令的第一部分T32a被擴(kuò)展。為了更好地利用可用的存儲(chǔ)空間,兩個(gè)T16指令應(yīng)該與一個(gè)T32指令(或者ARM指令)的長(zhǎng)度相同。因此,在
      23T32指令的第一部分已經(jīng)被擴(kuò)展成容納不完整的預(yù)解碼標(biāo)識(shí)符時(shí),在預(yù) 解碼過(guò)程中,附加位也可以被添加到T16指令。這個(gè)位可以用來(lái)存儲(chǔ)異 常指令標(biāo)識(shí)符。例如,該位可以包含邊帶信息,該邊帶信息表明指令是 否是未定義指令。這樣,在對(duì)未定義的指令進(jìn)行解碼時(shí)所消耗的功率可 以;故降j氐。
      T32指令的第二部分T32b不需要異常指令標(biāo)識(shí)符,因?yàn)樵撔畔?huì)被 包含在第一部分T32a中。不過(guò)重要的是,由預(yù)解碼電路10在T32b部 分上執(zhí)行的預(yù)解碼操作與在T16指令上執(zhí)行的操作相同。因此,如果塊 被推測(cè)性地識(shí)別為表示T32b部分,則預(yù)解碼電路10添加異常指令標(biāo)識(shí) 符,表明在臨時(shí)假設(shè)(與推測(cè)相對(duì))該塊表示T16指令的情況下該T16 指令是否是異常的。因此,不管是識(shí)別為T(mén)16指令還是識(shí)別為T(mén)32b部 分,在塊上執(zhí)行的操作是相同的。如果預(yù)解碼電路1Q錯(cuò)誤地將T16指 令識(shí)別為T(mén)32b部分,則由于異常指令標(biāo)識(shí)符無(wú)論如何都被添加到該塊 所以該錯(cuò)誤識(shí)別并不重要,并且因此預(yù)解碼誤差不會(huì)發(fā)生。如果推測(cè)是 正確的,則T32b部分中的異常指令標(biāo)識(shí)符可以被忽略。
      圖15顯示根據(jù)至少一些實(shí)施例的一旦預(yù)解碼操作已經(jīng)在T16指令和 T32指令上執(zhí)行,T16指令和T32指令的格式。對(duì)于推測(cè)性地被識(shí)別為 T16指令的塊而言,指令部分標(biāo)識(shí)符被添加在位[16],并被設(shè)置為"0", 并且邊帶位被添加在位[17],表明指令是否是異常的。位U5: O]中的 T16操作碼未被更改。相同的操作在被推測(cè)性地識(shí)別為表示T32指令的 第二部分T32b上執(zhí)行。指令部分標(biāo)識(shí)符被添加在位[34],并設(shè)置為"0", 并且邊帶位被添加在位[35],表明在臨時(shí)將該塊識(shí)別為T(mén)16指令時(shí),該 T16指令是否是異常的。在位[33: 18]中的T32操作碼的后半段是未被 更改的。
      對(duì)于推測(cè)性地被識(shí)別為T(mén)32指令的第一部分T32a的塊,預(yù)解碼電路 10將邊帶信息添加到該塊的位[15: 14]。指令部分標(biāo)識(shí)符被添加在位U6] 并設(shè)置為"1",并且不完整的預(yù)解碼標(biāo)識(shí)符被添加在位[17],表明T32
      指令是否跨越高速緩存行邊界。
      因此,不管塊是被識(shí)別為T(mén)16指令,還是被識(shí)別為T(mén)32b部分,都對(duì)
      該塊執(zhí)行相同的預(yù)解碼操作。用于指令的抗錯(cuò)預(yù)解碼格式也一致采用可 用來(lái)傳達(dá)(convey)異常指令標(biāo)識(shí)符的額外位。
      將參考圖16更加詳細(xì)地描述圖11的步驟202的過(guò)程,在該過(guò)程中,
      24塊是由預(yù)解碼電路IO預(yù)解碼的。在步驟25Q中,預(yù)解碼電路10推測(cè)性 地識(shí)別塊表示哪一指令部分。在步驟254,預(yù)解碼電路IO檢測(cè)該塊是否 已經(jīng)被識(shí)別為T(mén)32指令的第一部分T32a。
      如果預(yù)解碼電路10將該塊識(shí)別為T(mén)32指令的第一部分T32a,則流 程前進(jìn)到步驟260,在步驟260中,預(yù)解碼電路IO檢測(cè)T32指令是否是 異常指令。在步驟262中,預(yù)解碼電路IO根據(jù)該T32指令是否是異常 指令將連帶信息添加到該塊中。在步驟264中,預(yù)解碼電路10以ID位 的形式添加指令部分標(biāo)識(shí)符,該指令部分標(biāo)識(shí)符被添加在該塊的位 [16],并被設(shè)置為"1"。
      另一方面,如果在步驟254中,預(yù)解碼電路IO沒(méi)有將塊識(shí)別為T(mén)32a 部分,則流程前進(jìn)到步驟270。預(yù)解碼電路10臨時(shí)假設(shè)該塊表示T16指 令,并檢測(cè)該T16指令是否是異常指令。然后,在步驟272中,不管該 塊是T16指令,還是T32指令的第二部分T32b,預(yù)解碼電路10都將邊 帶信息添加到該塊中,表明T32是否是異常指令。在步驟274,預(yù)解碼 電路10然后以ID位的形式添加指令部分標(biāo)識(shí)符,該指令部分標(biāo)識(shí)符祐: 添加在塊的位[16]并被設(shè)置為0。
      對(duì)于通過(guò)圖16的流程圖的兩條路徑,流程然后前進(jìn)到步驟280,在 步驟28Q中,由預(yù)解碼電路10 4丸行任何進(jìn)一步的預(yù)解碼操作。這可以 包括例如添加關(guān)于圖14討論的操作以添加不完整的指令標(biāo)識(shí)符。 一旦 任何進(jìn)一步的預(yù)解碼操作完成,在步驟284預(yù)解碼的塊然后被傳遞到高 速緩存20。流程然后返回圖11中的步驟204。
      在使用預(yù)解碼電路時(shí)數(shù)椐處理設(shè)備內(nèi)可能出現(xiàn)的另 一個(gè)問(wèn)題是當(dāng)特 定的高速緩存行內(nèi)存在混合的指令狀態(tài)時(shí)。舉一個(gè)具體例子,ARM處理 器可能能夠執(zhí)行由英國(guó)的ARM有限公司開(kāi)發(fā)的ARM, Thumb, ThumbEE或 Jazelle指令集的指令,并且一個(gè)高速緩存行可能包括來(lái)自多于一個(gè)指 令集的指令。
      在任一特定時(shí)間點(diǎn),根據(jù)當(dāng)前正被執(zhí)行的指令屬于哪個(gè)指令集,處 理電路可以處在特定的處理器狀態(tài)。因此,在一個(gè)時(shí)間點(diǎn),處理電路可 以處在ARM處理器狀態(tài),而在隨后的時(shí)間點(diǎn)其可以分支到Thumb指令序 列,并因此進(jìn)入Thumb處理器狀態(tài)。
      在預(yù)解碼指令時(shí),預(yù)解碼電路在執(zhí)行預(yù)解碼時(shí)需要假設(shè)推測(cè)的處理 器狀態(tài),并且該選擇的推測(cè)的處理器狀態(tài)之后一般會(huì)用于預(yù)解碼通過(guò)處理器系統(tǒng)接口 5接收的整個(gè)高速緩存行的指令。在一個(gè)具體實(shí)施例中,
      狀態(tài)。應(yīng)認(rèn)iJ到如果例如所選擇的推測(cè)的處理器狀態(tài)對(duì);高速緩存:中 的所有指令不是適當(dāng)?shù)奶幚砥鳡顟B(tài),則指令高速緩存20可以存儲(chǔ)已經(jīng) 被破壞的預(yù)解碼的指令。例如,如果在對(duì)特定的高速緩存行執(zhí)行預(yù)解碼 操作時(shí),處理器處在Thumb狀態(tài),而高速緩存行混合ARM指令和Thumb 指令,則應(yīng)認(rèn)識(shí)到,ARM指令可能被不正確地預(yù)解碼,對(duì)這些ARM指令 產(chǎn)生被破壞的預(yù)解碼指令。實(shí)際上,如果在一個(gè)高速緩存行中的最后指 令是狀態(tài)改變分支指令,并且下一高速緩存行已經(jīng)受到預(yù)解碼電路的預(yù) 解碼操作,則整個(gè)高速緩存行也可能是在錯(cuò)誤的狀態(tài)下被預(yù)解碼的。
      盡管對(duì)經(jīng)過(guò)預(yù)解碼的每個(gè)半字作標(biāo)記以表明用于該預(yù)解碼的推測(cè)的 處理器狀態(tài)是可行的,但這會(huì)消耗指令高速緩存的指令數(shù)據(jù)RAM中的大 量區(qū)域。由于高速緩存行混合狀態(tài)的情況是罕見(jiàn)的,在一個(gè)實(shí)施例中, 用高速緩存行被預(yù)解碼時(shí)處理器所處的狀態(tài)標(biāo)記高速緩存行,這經(jīng)證明 是區(qū)域更有效的(area efficient )。因此,在一個(gè)實(shí)施例中,高速緩 存的指令標(biāo)記RAM中的每個(gè)條目(entry)可以被擴(kuò)展為存儲(chǔ)如圖18中 示意性顯示的推測(cè)的處理器狀態(tài)。本領(lǐng)域技術(shù)人員應(yīng)理解,指令標(biāo)記RAM 中的每個(gè)條目一般存儲(chǔ)地址部分480,并且通常存儲(chǔ)一個(gè)或多個(gè)其它控 制位,例如表明相關(guān)的高速緩存行是否是有效的有效位。如圖18所示, 對(duì)每個(gè)條目可以提供附加的兩個(gè)位,以識(shí)別在對(duì)指令數(shù)據(jù)RAM中相應(yīng)的 高速緩存行上執(zhí)行預(yù)解碼操作時(shí)使用的推測(cè)的處理器狀態(tài)485 。
      圖17更加詳細(xì)地圖解說(shuō)明在指令標(biāo)記RAM中使用這種擴(kuò)展的標(biāo)記 RAM條目時(shí),指令高速緩存20中提供的部件。如圖17所示,當(dāng)特定的 高速緩存行的預(yù)解碼的指令被存儲(chǔ)在指令高速緩存的指令數(shù)據(jù)RAM 450 的該高速緩存行中時(shí),相關(guān)指令標(biāo)記RAM 460中的相應(yīng)條目被填充已經(jīng) 由預(yù)解碼電路IO輸出的推測(cè)的處理器狀態(tài)信息485和地址部分480。
      在處理器隨后發(fā)出訪問(wèn)請(qǐng)求,想要從指令高速緩存20讀取指令時(shí), 高速緩存使用地址比較電路464、狀態(tài)比較電路468和命中/未命中 (hit/miss)電路470執(zhí)行查找操作。具體地,地址比較電路464確定 由訪問(wèn)請(qǐng)求指定的地址是否與所選擇的指令標(biāo)記RAM 460內(nèi)的條目中存 儲(chǔ)的任何地址部分匹配。在一個(gè)實(shí)施例中,指令高速緩存20被設(shè)置為 n-通道成組相關(guān)式高速緩存,并且在一個(gè)具體實(shí)施例中采用如圖19中所示的雙通道成組相關(guān)式高速緩存形式。因此,在這種實(shí)施例中,存在
      兩個(gè)標(biāo)記RAM 460-0和460-l,和相關(guān)聯(lián)的兩個(gè)數(shù)據(jù)RAM 450-0和450-1 。 對(duì)于每個(gè)高速緩存行492,在相關(guān)聯(lián)的標(biāo)記RAM中存在相應(yīng)的條目490 以存儲(chǔ)在圖18中示意性顯示的信息。
      本領(lǐng)域技術(shù)人員應(yīng)理解在處理電路發(fā)出訪問(wèn)請(qǐng)求時(shí),地址的索引部 分被用來(lái)識(shí)別指令高速緩存中的特定組(set),每個(gè)組包括每通道的 一個(gè)高速緩存行,因此對(duì)于圖19的例子,每個(gè)組包括兩個(gè)高速緩存行。 訪問(wèn)請(qǐng)求中指定的地址的標(biāo)記部分然后與存儲(chǔ)在每個(gè)標(biāo)記RAM中相應(yīng)條 目的地址部分480進(jìn)行比較,并且相應(yīng)地對(duì)于圖19的例子,地址比較 邏輯464會(huì)執(zhí)行兩個(gè)地址比較,即比較地址的標(biāo)記部分和來(lái)自與地址的 索引部分指定的組相關(guān)的每個(gè)標(biāo)記RAM中的條目的地址部分480。
      而且,除了使用地址比較電路464執(zhí)行地址比較之外,狀態(tài)比較電 路468還對(duì)當(dāng)前處理器狀態(tài)和標(biāo)記RAM中那些被訪問(wèn)的條目中存儲(chǔ)的推 測(cè)的處理器狀態(tài)485進(jìn)行比較。命中/未命中電路470被設(shè)置成如果地 址比較電路464識(shí)別到匹配,并且狀態(tài)比較電路468也識(shí)別到匹配,則 只檢測(cè)命中條件,即如果想要訪問(wèn)的指令存在于指令高速緩存中,并且 用來(lái)預(yù)解碼該指令的推測(cè)的處理器狀態(tài)與當(dāng)前的處理器狀態(tài)匹配,則才 檢測(cè)命中條件。
      如果發(fā)生命中條件,使多路轉(zhuǎn)接器472輸出從指令高速緩存的適當(dāng) 通道的數(shù)據(jù)RAM 450讀出的指令,該指令由此被提供給解碼電路30。
      如果沒(méi)有檢測(cè)到命中條件,則未命中信號(hào)通過(guò)路徑474發(fā)出,使得 從處理器系統(tǒng)接口 5發(fā)出行填充請(qǐng)求。結(jié)果,指令的相關(guān)高速緩存行從 存儲(chǔ)器中被取出,并傳遞通過(guò)預(yù)解碼電路10。
      應(yīng)認(rèn)識(shí)到存在兩種類(lèi)型的未命中條件。第一個(gè)條件是典型的條件, 其中想要訪問(wèn)的指令目前不在指令高速緩存中,在這種情況中,來(lái)自預(yù) 解碼電路10的輸出可以以正常方式被分配給指令高速緩存。對(duì)于之前 討論的雙通道成組相關(guān)式高速緩存的例子,這會(huì)涉及到在其中一個(gè)通道 清除并使無(wú)效高速緩存行的內(nèi)容,并將新預(yù)解碼的指令分配給該高速緩 存行。不過(guò)目前可能會(huì)產(chǎn)生的另一未命中條件是在地址比較電路464檢 測(cè)到匹配時(shí),即指令存在于高速緩存中,但狀態(tài)比較電路468沒(méi)有檢測(cè) 到匹配,因此,識(shí)別為相關(guān)的指令已經(jīng)在假設(shè)錯(cuò)誤的處理器狀態(tài)下被預(yù) 解碼。在此情況中,高速緩存未命中造成從存儲(chǔ)器中重新取出高速緩存
      27行,并將取出的指令重新傳遞通過(guò)預(yù)解碼電路。盡管在一個(gè)實(shí)施例中, 在這種情況下來(lái)自預(yù)解碼電路10的輸出會(huì)以與如上所述的完全相同方
      式被分配,但在可選實(shí)施例中,來(lái)自預(yù)解碼電路10的輸出會(huì)被優(yōu)先分 配給不同的通道(way)。這可以避免在高速緩存行包含來(lái)自多于一個(gè) 指令集的指令的情況下可能出現(xiàn)的潛在"系統(tǒng)失效(thrashing)"問(wèn) 題。
      為了說(shuō)明此系統(tǒng)失效問(wèn)題,考慮這樣一個(gè)例子,其中高速緩存行的 第一部分包含Thumb指令,高速緩存行的第二部分包含ARM指令, 一開(kāi) 始假設(shè)Thumb處理器的狀態(tài)對(duì)整個(gè)高速緩存行進(jìn)行預(yù)解碼。應(yīng)認(rèn)識(shí)到, 如果在處理電路處于ARM處理器狀態(tài)時(shí),訪問(wèn)ARM指令中的一個(gè)指令, 則狀態(tài)比較電路468會(huì)檢測(cè)到推測(cè)的處理器狀態(tài)(即Thumb狀態(tài))與當(dāng) 前的處理器狀態(tài)(即,ARM狀態(tài))不匹配,因此,將執(zhí)行上迷的重新取 出過(guò)程。這次,假設(shè)ARM處理器狀態(tài)對(duì)整個(gè)高速緩存行進(jìn)行預(yù)解碼,這 現(xiàn)在提供是訪問(wèn)請(qǐng)求對(duì)象的正確的預(yù)解碼ARM指令。不過(guò),如果來(lái)自預(yù) 解碼電路的這個(gè)輸出用于重寫(xiě)以前的高速緩存行內(nèi)容,則如果在稍后階 段,處于Thumb處理器狀態(tài)的處理電路想要訪問(wèn)高速緩存行第一部分中 的其中一個(gè)Thumb指令,則可以看到由于狀態(tài)比較電路468會(huì)再次識(shí)別 到推測(cè)的處理器狀態(tài)和當(dāng)前的處理器狀態(tài)不匹配而再次檢測(cè)到未命中 條件。
      在這種情況下,通過(guò)將來(lái)自預(yù)解碼電路10的輸出分配給不同的高速 緩存行,可以避免該問(wèn)題,原因是它允許兩種形式共存于高速緩存中。 因此,考慮之前的例子,形成特定高速緩存行的預(yù)解碼指令的相同指令 集將作為在假設(shè)為T(mén)humb處理器狀態(tài)下被預(yù)解碼的一系列預(yù)解碼的指令 被存儲(chǔ)在一個(gè)高速緩存行中,并作為在假設(shè)為ARM處理器狀態(tài)下被預(yù)解 碼的一系列預(yù)解碼的指令在不同的通道被存儲(chǔ)在另一高速緩存行中。
      盡管這會(huì)避免上迷系統(tǒng)失效問(wèn)題,但在清除和使無(wú)效高速緩存時(shí), 如果由于上述過(guò)程,每個(gè)物理地址處的指令已經(jīng)被存儲(chǔ)在多個(gè)高速緩存 行中,則清除和使無(wú)效操作需要在該物理地址的多個(gè)高速緩存行上操 作。
      圖20圖解說(shuō)明一個(gè)實(shí)施例的上述預(yù)解碼操作。在步驟500,預(yù)解碼 操作開(kāi)始,之后在步驟504,處理電路的當(dāng)前處理器狀態(tài)被確定,并被 設(shè)置為推測(cè)的處理器狀態(tài)。之后,在步驟508,預(yù)解碼操作由預(yù)解碼電路10使用推測(cè)的處理器狀態(tài)來(lái)執(zhí)行。然后在步驟510每個(gè)預(yù)解碼的指 令連同推測(cè)的處理器狀態(tài)的指示一起被存儲(chǔ)在高速緩存20中。
      圖21示意性地圖解說(shuō)明了在接收到來(lái)自處理電路的訪問(wèn)請(qǐng)求時(shí),由 指令高速緩存20執(zhí)行的過(guò)程。在步驟550,等待來(lái)自處理電路的訪問(wèn)請(qǐng) 求,并且在接收到這種訪問(wèn)請(qǐng)求時(shí),在步驟554中,使用由該訪問(wèn)請(qǐng)求 指定的地址,在高速緩存中執(zhí)行查找程序。
      在步驟558中,確定地址比較電路464是否已經(jīng)檢測(cè)到地址匹配, 如果沒(méi)有,則在步驟570中命中/未命中電路470生成未命中條件,使 行填充操作發(fā)生。
      如果在步驟558中檢測(cè)到地址匹配,則在步驟560中確定狀態(tài)比較 電路468是否已經(jīng)檢測(cè)到當(dāng)前處理器狀態(tài)和存儲(chǔ)在相關(guān)指令標(biāo)記RAM條 目中的推測(cè)的處理器狀態(tài)之間的匹配。如果匹配,則命中/未命中電路 470生成命中信號(hào),使匹配的預(yù)解碼指令從相關(guān)的數(shù)據(jù)指令RAM 450通 過(guò)多路轉(zhuǎn)接器472輸出到處理電路25的解碼電路30。不過(guò)如果在步驟 560中確定當(dāng)前處理器狀態(tài)與推測(cè)的處理器狀態(tài)不匹配,則在步驟568 中生成未命中條件,使行填充操作在與地址比較電路464檢測(cè)的地址匹 配的高速緩存通道不同的高速緩存通道(cache way)中進(jìn)行。
      通常用來(lái)觸發(fā)處理器狀態(tài)變化的狀態(tài)改變指令會(huì)引起到新地址(因 此不同高速緩存行)的分支,該新地址包含在新的處理器狀態(tài)下執(zhí)行的 第一指令。不過(guò)在可選實(shí)施例中,可能不是這種情況,因此,在狀態(tài)改 變指令后,待執(zhí)行的下一指令可以是相同的高速緩存行中的下一指令。 在這種情況下,在從指令高速緩存的取出包含多于一個(gè)的指令,并且在 該取出中的一個(gè)指令(不是最后一個(gè)指令)是狀態(tài)改變指令時(shí)可能會(huì)出 現(xiàn)問(wèn)題。在這種情況下,對(duì)于該取出會(huì)正確地出現(xiàn)"命中",但在指令 高速緩存含有只在一個(gè)狀態(tài)下被預(yù)解碼的高速緩存行的情況下,狀態(tài)改 變指令之后的所有指令將會(huì)被不正確地預(yù)解碼。為了解決該問(wèn)題,在一 個(gè)實(shí)施例中,誤差檢測(cè)電路35被設(shè)置成偵察這種情況,以對(duì)狀態(tài)改變 指令之后的連續(xù)指令觸發(fā)"狀態(tài)誤差",并啟動(dòng)行填充或回送通過(guò)預(yù)解 碼過(guò)程。
      在ARM指令集和Thumb指令集之間的過(guò)渡中,由于狀態(tài)改變指令是 分支到新的高速緩存行的BLX類(lèi)型的指令,所以該潛在問(wèn)題不會(huì)出現(xiàn)。 然而,在Thumb指令集和ThumbEE指令集之間的過(guò)渡中,由于狀態(tài)改變指令(ENTERX/LEAVEX )不使用分支,因此從新地址的取出不會(huì)被狀態(tài) 改變指令觸發(fā),所以會(huì)出現(xiàn)該問(wèn)題。在這種情況下,上述的誤差檢測(cè)機(jī) 制可以用來(lái)識(shí)別狀態(tài)改變指令,對(duì)狀態(tài)改變指令之后的連續(xù)指令觸發(fā) "狀態(tài)誤差",然后啟動(dòng)從緊接在狀態(tài)改變指令之后的存儲(chǔ)器地址中的 新的取出。
      盡管在上述實(shí)施例中,預(yù)解碼器電路已經(jīng)與用來(lái)直接給處理電路25 提供指令的一級(jí)指令高速緩存相關(guān)聯(lián),但在圖22所示的可選實(shí)施例中, 預(yù)解碼電路10可以與存儲(chǔ)指令和數(shù)據(jù)兩者的組合高速緩存關(guān)聯(lián),例如 二級(jí)高速緩存605。如此圖中所示的,處理器系統(tǒng)接口 5實(shí)際上與組合 的二級(jí)高速緩存605通信,而不是直接與存儲(chǔ)器通信,并且為了完整性, 除了之前討論的指令高速緩存20之外, 一級(jí)數(shù)據(jù)高速緩存615也被示 出。在這個(gè)實(shí)施例中,來(lái)自存儲(chǔ)器的指令可以被路由通過(guò)預(yù)解碼電路10, 從而產(chǎn)生預(yù)解碼的指令,以存儲(chǔ)在組合的二級(jí)高速緩存605中。不過(guò), 從存儲(chǔ)器中檢索到二級(jí)高速緩存,或者從二級(jí)高速緩存寫(xiě)回到存儲(chǔ)器中 的數(shù)據(jù)會(huì)繞過(guò)預(yù)解碼電路10。
      如圖23所示,附加標(biāo)識(shí)符630可以與每個(gè)高速緩存行關(guān)聯(lián)以識(shí)別高 速緩存行存儲(chǔ)的是指令還是數(shù)據(jù)。除了每個(gè)標(biāo)記RAM條目625中的推測(cè) 的處理器狀態(tài)位635和地址部分640之外,附加標(biāo)識(shí)符也^皮添加,因此 為相應(yīng)的高速緩存行650識(shí)別該高速緩存行的內(nèi)容是否是預(yù)解碼的指 令,或者是在執(zhí)行那些指令時(shí)由處理電路使用的數(shù)據(jù)值。通過(guò)這種方法, 指令/數(shù)據(jù)標(biāo)識(shí)符630使已經(jīng)經(jīng)過(guò)預(yù)解碼的那些高速緩存行能夠被清楚 地識(shí)別。因此,當(dāng)在高速緩存中執(zhí)行查找程序時(shí),可以確定是否需要在 查找程序期間對(duì)著當(dāng)前的處理器狀態(tài)檢查推測(cè)的處理器狀態(tài),特別是這 類(lèi)檢查僅對(duì)于存儲(chǔ)預(yù)解碼的指令的那些高速緩存行是必需的。
      從上迷描述可以看出,通過(guò)在高速緩存中存儲(chǔ)推測(cè)的處理器狀態(tài), 稍后可能檢測(cè)到預(yù)解碼電路作出的推測(cè)的處理器狀態(tài)的假設(shè)是錯(cuò)誤的, 并且因此,從高速緩存中讀取的預(yù)解碼的指令不應(yīng)當(dāng)被處理電路使用。 這提供了 一種對(duì)已經(jīng)被預(yù)解碼過(guò)程破壞的指令的某些情況進(jìn)行檢測(cè)的 既簡(jiǎn)單、有效又節(jié)省功率的機(jī)制。
      圖24圖解說(shuō)明了具有類(lèi)似于以前描述的那些的形式的指令流水線(xiàn)。 該指令流水線(xiàn)支持對(duì)應(yīng)于三種不同指令集(即ARM指令,Thumb 32指令 和Thumb 16指令)的指令的預(yù)解碼和隨后的處理操作的執(zhí)行。已經(jīng)認(rèn)
      30識(shí)到許多常見(jiàn)的ARM指令共享或具有與同樣存在于Thumb 32指令中的 指令密切對(duì)應(yīng)的功能性。通過(guò)使用ARM指令由預(yù)解碼電路10預(yù)解碼以 形成存儲(chǔ)在指令高速緩存20中的預(yù)解碼的指令的系統(tǒng),并使用共享格 式來(lái)表示與相應(yīng)的Thumb 32指令共享的功能性,可以利用該認(rèn)知。因 此,在存儲(chǔ)于指令高速緩存20內(nèi)的解碼指令中,對(duì)應(yīng)于ARM指令或Thumb 32指令的各個(gè)預(yù)解碼的指令將共享相同的格式來(lái)表示相同的功能性。由 預(yù)解碼電路10在ARM指令上執(zhí)行的重新映射表示在預(yù)解碼階段的附加 活動(dòng),該重新映射力圖將ARM指令重新映射成以與Thumb 32指令相同 的方式在預(yù)解碼的指令中表示的形式,但是在指令被加載到指令高速緩 存20中時(shí)該活動(dòng)將被執(zhí)行,而已經(jīng)以這種方式被重新映射的預(yù)解碼的 指令一般從指令高速緩存20中被多次讀取,并由系統(tǒng)的剩余部分執(zhí)行。 因此,重新映射所消耗的附加活動(dòng)(能量)被分?jǐn)傇谥匦掠成涞闹噶畹?多次使用上。
      從圖24中顯然可見(jiàn),ARM指令重新映射成類(lèi)似于預(yù)解碼形式的Thumb 32指令的形式使得Thumb 32解碼電路45能夠?yàn)榇蠖鄶?shù)解碼操作重新使 用,關(guān)于最初是ARM指令的那些指令需要執(zhí)行所述解碼操作。這節(jié)省了 解碼電路中的門(mén)數(shù),因此節(jié)省了能量。
      存在一些ARM指令,它們不與任何Thumb 32指令共享足夠接近的功 能性使得它們能夠被重新映射為共享格式,對(duì)于該ARM指令解碼電路可 能已經(jīng)提供在Thumb 32解碼電路45中。關(guān)于這些僅ARM ( ARM-only ) 指令,附加解碼電路46被提供,并在識(shí)別這類(lèi)僅ARM ( ARM-only )指令 時(shí)被切換使用。該僅ARM ( ARM-only)解碼電路46比傳統(tǒng)的多指令集系 統(tǒng)中所需的全部A詣解碼電路塊小得多。
      如之前描述的,預(yù)解碼的指令長(zhǎng)度為36位。原始ARM指令為32位 指令。因此,預(yù)解碼的指令中的附加位可以用來(lái)表示之前描述的如圖25 中所示的邊帶信號(hào)。對(duì)ARM指令以及其它指令提供相同的邊帶信號(hào)促進(jìn) 在解碼電路45, 50, 46內(nèi)進(jìn)行更有效的解碼。預(yù)解碼的指令中的一位 用來(lái)對(duì)僅ARM (ARM-only)指令作標(biāo)記,對(duì)于該僅ARM (ARM-only)指 令沒(méi)有等價(jià)的Thumb 32指令,并且使用僅ARM (ARM-only)解碼電路 46為其進(jìn)行解碼,并由此生成適當(dāng)?shù)目刂菩盘?hào)。該僅ARM (ARM-only) 位被選擇為在所有Thumb 32指令內(nèi)具有固定值的那一位,并且在對(duì)應(yīng) 于ARM-only指令的預(yù)解碼的指令內(nèi)該ARM-only位;陂設(shè)置為相反值。ARM指令集的一個(gè)特征是每個(gè)指令都包括4位條件碼,即代碼N, C, Z和V。如圖25所示,給這些條件碼分配預(yù)解碼的指令內(nèi)與位位置16, 17, 34和35對(duì)應(yīng)的位置。這些位位置在與Thumb 32指令對(duì)應(yīng)的預(yù)解碼 的指令中通常用于其它目的,即識(shí)別位,不完整位和邊帶信號(hào)。假定ARM 指令在存儲(chǔ)器中被存儲(chǔ)為32位對(duì)齊的字,則在預(yù)解碼的指令內(nèi)ARM指 令不需要識(shí)別位和不完整位,只需要邊帶位的一個(gè)區(qū)域,從而為ARM指 令釋放預(yù)解碼的指令內(nèi)的位空間,以便表示條件碼N, C, Z和V。 Thumb 32解碼電路45可以容易被更改以響應(yīng)于ARM指令的預(yù)解碼的指令內(nèi)的 這些條件碼,響應(yīng)方式是根據(jù)關(guān)聯(lián)的條件碼值選通(gate)執(zhí)行那些預(yù) 解碼的指令。如果與ARM指令對(duì)應(yīng)的預(yù)解碼的指令滿(mǎn)足其條件碼,則預(yù) 解碼的指令會(huì)被執(zhí)行,并且會(huì)由此生成適當(dāng)?shù)目刂菩盘?hào)。如果預(yù)解碼的 指令不滿(mǎn)足其條件碼,則預(yù)解碼的指令不會(huì)被執(zhí)行。
      圖26圖解說(shuō)明都被解碼為預(yù)解碼的指令形式的Thumb 32 ADC指令 和ARM ADC指令的例子,其中共享功能性是以共享格式表示的。Thumb 32 指令和ARM指令內(nèi)對(duì)應(yīng)的字段已經(jīng)被賦予相同的名稱(chēng)??梢钥闯?,雖然 原始Thumb 32指令的格式和原始ARM指令的格式大不相同,然而它們 還是包含幾乎所有的相同字段,因此,在Thumb 32指令被預(yù)解碼時(shí), 將ARM指令內(nèi)的字段重新映射到預(yù)解碼的指令內(nèi)與那些字段的相同位置 對(duì)應(yīng)的位置是相對(duì)簡(jiǎn)單高效的。這種重新映射是由圖24中所示的預(yù)解 碼電路IO執(zhí)行的。
      ARM指令包括在位位置[31: 28]的4個(gè)條件碼位。如之前討論的, 這些條件碼被映射到預(yù)解碼的指令內(nèi)與ARM指令對(duì)應(yīng)的位位置35, 34, 17和16。與ARM指令對(duì)應(yīng)的預(yù)解碼的指令仍包含在位位置[15: 14]的 邊帶信號(hào),但由于ARM指令在存儲(chǔ)器中是32位對(duì)齊的,因而這些邊帶 信號(hào)將適用于全部的36位預(yù)解碼的指令,并且由于高速緩存行是字對(duì) 齊的,所以與跨越高速緩存行邊界的指令相關(guān)的問(wèn)題對(duì)ARM指令不會(huì)出 現(xiàn)。同時(shí)注意到圖26中預(yù)解碼的指令內(nèi)的位位置33。對(duì)于與Thumb 32 指令和ARM指令對(duì)應(yīng)的兩個(gè)預(yù)解碼的指令,該位位置33都示出為具有 "應(yīng)該為0"的值。該"應(yīng)該為0"的值對(duì)應(yīng)于Thumb 32指令內(nèi)的位31。 如果Thumb 32指令內(nèi)的31位不是0,則這被定義為具有不可預(yù)知的行 為。
      圖27圖解說(shuō)明與預(yù)解碼的指令內(nèi)"應(yīng)該為0"的值被設(shè)置為1相關(guān)聯(lián)的不可預(yù)知的行為是如何可以用來(lái)在預(yù)解碼的指令內(nèi)提供指令位空
      間,以表示不被任何Thumb 32指令共享的A詣指令的功能性。在圖27 的例子中,沒(méi)有等價(jià)的Thumb 32指令的ARM指令是寄存器移位的寄存 器變體(variant)中的ADC指令。在這個(gè)變體中,在ARM指令的位[U: 8]指定的移位寄存器Rs存儲(chǔ)表示移位量的值,該移位量會(huì)被應(yīng)用到存 儲(chǔ)在兩個(gè)輸入源寄存器Rm, Rn中其中一個(gè)值。Thumb 32指令沒(méi)有它們 的ADC指令的寄存器移位的寄存器變體。圖27的ARM指令內(nèi)的剩余字 段類(lèi)似于圖26中顯示的那些字段。不過(guò),ARM指令的寄存器移位的寄存 器變體不包括立即(immediate)字段。對(duì)于圖26的Thumb 32指令和 ARM指令該立即字段被映射到預(yù)解碼的指令內(nèi)的位[32: 30]和[23: 22]。 預(yù)解碼的指令內(nèi)的這個(gè)位空間可以被重新用來(lái)表示寄存器的寄存器標(biāo) 識(shí)符Rs,所述寄存器存儲(chǔ)圖27的預(yù)解碼的指令形式的ARM指令的寄存 器移位的寄存器版本內(nèi)的移位值。解碼電路45被配置為通過(guò)在表示寄 存器移位的寄存器變體ARM指令的ADC的預(yù)解碼的指令中將"應(yīng)該為0" 的位33設(shè)置為值"I"來(lái)辨別(recognise)提供給其的預(yù)解碼的指令 具有該特定形式。
      這種行為可與在位位置13使用僅ARM (ARM-only)位進(jìn)行對(duì)比,憑 借這種行為對(duì)應(yīng)于Thumb 32指令的不可預(yù)知的行為的位空間被重新用 來(lái)表示〗又ARM ( ARM-only )變體指令。對(duì)于與任何Thumb 32指令相似性 很少的并且為其提供僅ARM (ARM-only )解碼電路46的指令,可以保留 位位置13處的^f又ARM (ARM-only)位。重新4吏用Thumb 32指令中對(duì)應(yīng) 于不可預(yù)知行為的位空間不僅保護(hù)了預(yù)解碼的指令內(nèi)的指令位空間,而 且促進(jìn)了重新使用解碼電路45的共享部分內(nèi)的相同的門(mén)。
      圖28圖解說(shuō)明預(yù)解碼電路10可以提供的另一特征。已經(jīng)認(rèn)識(shí)到 Thumb 16指令序列可以包括指定與單個(gè)Thumb 32指令對(duì)應(yīng)的組合功能 性的相鄰指令。預(yù)解碼電路可以通過(guò)將相鄰的Thumb 16指令預(yù)解碼為 與等價(jià)的Thumb 32指令對(duì)應(yīng)的單個(gè)預(yù)解碼的指令對(duì)此進(jìn)行識(shí)別。與 Thumb 32指令對(duì)應(yīng)的單個(gè)預(yù)解碼的指令會(huì)作為單個(gè)實(shí)體被發(fā)布到執(zhí)行流 水線(xiàn),從而比兩個(gè)單獨(dú)的Thumb 16指令更加快速高效地執(zhí)行。預(yù)解碼 電路10可以集中于數(shù)量相對(duì)少的普通情況,在這些情況下,兩個(gè)相鄰 的Thumb 16指令可以被重新映射到Thumb 32指令的相應(yīng)的預(yù)解碼形式, 以便平衡提供識(shí)別這種機(jī)會(huì)的附加電路的益處和代價(jià)。圖29是示意性地圖解說(shuō)明在預(yù)解碼電路內(nèi)將ARM指令重新映射到 Thumb 32指令的流程圖。在步驟700,從存儲(chǔ)器中取出高速緩存行。在 步驟702,對(duì)要解碼的第一指令是否來(lái)自ARM指令集作出確定。如果要 被預(yù)解碼的指令不是來(lái)自ARM指令集,則處理前進(jìn)到步驟704,在步驟 704執(zhí)行根據(jù)Thumb 16指令或Thumb 32指令的預(yù)解碼。
      如果在步驟702確定要解碼的指令是ARM指令,則步驟706確定ARM 指令是否可以被映射到T32格式的預(yù)解碼的指令,以便用解碼器的共享 部分進(jìn)行解碼。如果ARM指令可以通過(guò)這種方式映射,則處理前進(jìn)通過(guò) 步驟707。如果ARM指令不能以這種方式被映射,則步驟709將ARM指 令預(yù)解碼為帶僅ARM (ARM-only)位設(shè)置的預(yù)解碼的指令,使得解碼器 的非共享部分將被使用。然后步驟708將預(yù)解碼的指令存儲(chǔ)在高速緩沖 存儲(chǔ)器20中。步驟710確定在取出的高速緩存行填充中是否有更多的 指令需要預(yù)解碼。如果有更多的這類(lèi)指令,則處理返回步驟702,否則 處理暫停(halt )。
      圖30是示意性地圖解說(shuō)明兩個(gè)Thumb 16指令是如何可以被重新映 射到與單個(gè)Thumb 32指令對(duì)應(yīng)的預(yù)解碼的指令的流程圖。在步驟712, 從存儲(chǔ)器中取出高速緩存行。在步驟714,對(duì)要解碼的第一指令是否是 Thumb 16指令作出確定。如果該指令不是Thumb 16指令,則處理前進(jìn) 到步驟716,在步驟716,根據(jù)ARM指令或Thumb 32指令的適當(dāng)行為執(zhí) 行預(yù)解碼。
      如果在步驟714確定取出的指令是Thumb 16指令,則步驟718讀取 下一個(gè)Thumb 16指令,并且步驟720識(shí)別這兩個(gè)相鄰的Thumb 16指令 是否對(duì)應(yīng)于一個(gè)Thumb 32指令。
      如果在步驟720確定這兩個(gè)相鄰的Thumb 16指令不與一個(gè)Thumb 32 指令對(duì)應(yīng),則步驟722為兩個(gè)單獨(dú)的Thumb 16指令生成預(yù)解碼的指令。 不過(guò),如果在步驟720確定這兩個(gè)相鄰的Thumb 16指令確實(shí)與一個(gè) Thumb 32指令對(duì)應(yīng),則步驟724生成與等價(jià)的Thumb 32指令對(duì)應(yīng)的預(yù) 解碼的指令,這與步驟722生成的兩個(gè)單獨(dú)的Thumb 16指令相反。
      步驟726將預(yù)解碼的指令存儲(chǔ)到指令高速緩存20中。然后步驟728 確定被取出的高速緩存行中是否有更多的指令需要預(yù)解碼。如果有更多 的這類(lèi)指令,則處理返回步驟714。
      圖31圖解說(shuō)明與可以在預(yù)解碼電路10內(nèi)執(zhí)行以識(shí)別分支指令,并
      34提前終止預(yù)解碼操作的處理對(duì)應(yīng)的流程圖。如果遇到將采納(taken) 或預(yù)測(cè)會(huì)采納的分支指令,則由于該分支(或預(yù)測(cè)的采納分支)之后的 指令很可能不被執(zhí)行,花費(fèi)在這種預(yù)解碼上的能量會(huì)被浪費(fèi),所以提前 終止預(yù)解碼會(huì)是能量有效的。在步驟730,從存儲(chǔ)器中取出高速緩存行。 在步驟732,預(yù)解碼電路10識(shí)別正被預(yù)解碼的指令是否是采納分支 (taken branch)。如果被預(yù)解碼的指令是采納分支(例如,無(wú)條件分 支(跳轉(zhuǎn))),則處理終止。如果在步驟732確定指令不是采納分支, 則在步驟734中預(yù)解碼該指令。然后步驟736將預(yù)解碼的指令存儲(chǔ)在指 令高速緩存20中,并且步驟738確定高速緩存行中是否有更多的指令 需要預(yù)解碼。如果有更多的這類(lèi)指令,則處理返回步驟732。
      應(yīng)認(rèn)識(shí)到,由圖29,圖30和圖31的流程圖所示的過(guò)程被示出為順 序的、相對(duì)于彼此是獨(dú)立的過(guò)程。本領(lǐng)域技術(shù)人員會(huì)認(rèn)識(shí)到在使用預(yù)解 碼電路IO執(zhí)行這些過(guò)程時(shí),這些過(guò)程可以以不同的步驟次序發(fā)生或某 些步驟可以并行執(zhí)行。而且,單獨(dú)在圖29,圖30和圖31中圖解說(shuō)明的 過(guò)程在實(shí)際中很可能至少部分是并行執(zhí)行的。本技術(shù)包括所有這些各種 各樣的可選方案。
      盡管本文已經(jīng)描述了具體的實(shí)施例,但顯然本發(fā)明并不局限于此, 在本發(fā)明的范圍內(nèi)可以作出許多修改和增加。例如,在不偏離本發(fā)明的 范圍的情況下,可以將所附從屬權(quán)利要求的特征和獨(dú)立權(quán)利要求的特征 進(jìn)行各種組合。
      權(quán)利要求
      1.用于處理數(shù)據(jù)的設(shè)備,包括預(yù)解碼電路,其響應(yīng)于從存儲(chǔ)器中取出的程序指令來(lái)對(duì)所述程序指令執(zhí)行預(yù)解碼處理,從而形成預(yù)解碼的指令;高速緩沖存儲(chǔ)器,其耦合到所述預(yù)解碼電路,以存儲(chǔ)所述預(yù)解碼的指令;解碼電路,其響應(yīng)于從所述高速緩沖存儲(chǔ)器中讀取的預(yù)解碼的指令來(lái)生成控制信號(hào);和處理電路,其響應(yīng)于所述控制信號(hào)以執(zhí)行由所述預(yù)解碼的指令指定的處理操作;其中所述程序指令來(lái)自多個(gè)不同的指令集;所述預(yù)解碼電路將來(lái)自第一指令集的程序指令和來(lái)自第二指令集的程序指令映射到具有共享格式以表示共享功能性的預(yù)解碼的指令;和所述解碼電路的共享部分生成所述控制信號(hào)以關(guān)于所述共享功能性控制所述處理電路。
      2. 根據(jù)權(quán)利要求1所述的設(shè)備,其中所述預(yù)解碼的指令包括一個(gè)或 多個(gè)位字段,該一個(gè)或多個(gè)位字段用來(lái)表示不被來(lái)自所述第一指令集和 所述第二指令集的程序指令共享的功能性。
      3. 根據(jù)權(quán)利要求2所述的設(shè)備,其中來(lái)自所迷第一指令集的程序指 令包括條件碼,來(lái)自所述第二指令集的程序指令不包括條件碼,并且所 述一個(gè)或多個(gè)位字段用來(lái)表示來(lái)自所述第一程序指令集的程序指令的 條件碼。
      4. 根據(jù)權(quán)利要求2所述的設(shè)備,其中來(lái)自所述第一指令集的程序指 令是固定長(zhǎng)度的指令,來(lái)自所述第二指令集的程序指令是可變長(zhǎng)度的指 令,其包括具有高位部分和低位部分的至少一些程序指令,并且所迷一 個(gè)或多個(gè)位字段用來(lái)識(shí)別來(lái)自所述第二指令集的至少一些程序指令的 高位部分和低位部分。
      5. 根據(jù)權(quán)利要求1所述的設(shè)備,其中所述第二指令集的至少一些程 序指令具有不可預(yù)知的行為,并且相應(yīng)的預(yù)解碼的指令用來(lái)表示具有不與所述第二指令集的任何程序指令共享的功能性的所述第一指令集的程序指令。
      6. 根據(jù)權(quán)利要求5所述的設(shè)備,其中不與所述第二指令集的任何程序指令共享的所述功能性包括對(duì)指定為數(shù)值的操作數(shù)的支持,所述數(shù)值 被存儲(chǔ)在移位了第二寄存器中指定的量的第一寄存器內(nèi)。
      7. 根據(jù)權(quán)利要求6所述的設(shè)備,其中在預(yù)解碼的指令內(nèi)指定所述第 二寄存器的字段位于與立即值對(duì)應(yīng)的位置處,該立即值指定表示所迷第 二指令集的指令的不可預(yù)知變體的預(yù)解碼的指令內(nèi)的移位量,所述不可 預(yù)知變體使用被指定為存儲(chǔ)在第三寄存器內(nèi)的數(shù)值的操作數(shù),該第三寄 存器移位了由所述立即值指定的量。
      8. 根據(jù)權(quán)利要求1所述的設(shè)備,其中預(yù)解碼的指令內(nèi)與所述第一指 令集中的為其不使用所述解碼電路的所述共享部分的指令對(duì)應(yīng)的位字 段被設(shè)置成預(yù)定值,以便選擇使用所迷解碼電路的不共享部分。
      9. 根據(jù)權(quán)利要求1所述的設(shè)備,其中所述多個(gè)指令集包括第三指令 集,并且所述預(yù)解碼電路響應(yīng)于具有與所述第二指令集的一個(gè)組合指令 對(duì)應(yīng)的組合功能的所述第三指令集的相鄰取出的程序指令來(lái)生成與所 述組合指令對(duì)應(yīng)的預(yù)解碼的指令。
      10. 根椐權(quán)利要求1所述的設(shè)備,其中所述預(yù)解碼電路響應(yīng)于與重 定向程序流對(duì)應(yīng)的程序指令的檢測(cè),來(lái)終止當(dāng)前的程序指令流的預(yù)解 碼。
      11. 用于處理數(shù)椐的設(shè)備,包括預(yù)解碼裝置,其用來(lái)對(duì)從存儲(chǔ)器中取出的所述程序指令執(zhí)行預(yù)解碼 操作,以形成預(yù)解碼的指令;高速緩存裝置,其耦合到所述預(yù)解碼電路,以存儲(chǔ)所迷預(yù)解碼的指令;解碼裝置,其用來(lái)響應(yīng)于從所述高速緩沖存儲(chǔ)器中讀取的預(yù)解碼的指令生成控制信號(hào);和處理電路,其用來(lái)響應(yīng)于所述控制信號(hào),執(zhí)行由所述預(yù)解碼的指令 指定的處理操作;其中所述程序指令來(lái)自多個(gè)不同的指令集;所述預(yù)解碼裝置將來(lái)自第一指令集的程序指令和來(lái)自第二指令集的 程序指令映射到具有共享格式來(lái)表示共享功能性的預(yù)解碼的指令;和所述解碼裝置的共享部分生成所述控制信號(hào)以關(guān)于所述共享功能性 控制所述處理電路。
      12. —種處理數(shù)據(jù)的方法,包括以下步驟對(duì)從存儲(chǔ)器中取出的程序指令執(zhí)行預(yù)解碼操作,以形成預(yù)解碼的指令;將所述預(yù)解碼的指令存儲(chǔ)在高速緩沖存儲(chǔ)器中; 響應(yīng)于從所述高速緩沖存儲(chǔ)器中讀取的預(yù)解碼的指令來(lái)生成控制信 號(hào);和響應(yīng)于所述控制信號(hào),執(zhí)行由所述預(yù)解碼的指令指定的處理操作;其中所述程序指令來(lái)自多個(gè)不同的指令集;執(zhí)行預(yù)解碼操作的所述步驟將來(lái)自第一指令集的程序指令和來(lái)自第 二指令集的程序指令映射到具有共享的格式來(lái)表示共享功能性的預(yù)解 碼的指令;和生成所述控制信號(hào)的所述步驟使用解碼電路的共享部分來(lái)生成所述 控制信號(hào),從而關(guān)于所述共享功能性控制所述處理電路。
      13. 根據(jù)權(quán)利要求12所迷的方法,其中所述預(yù)解碼的指令包括一個(gè) 或多個(gè)位字段,該一個(gè)或多個(gè)位字段用來(lái)表示不被來(lái)自所述第一指令集 和所述第二指令集的程序指令共享的功能性。
      14. 根據(jù)權(quán)利要求13所述的方法,其中來(lái)自所述第一指令集的程序 指令包括條件碼,來(lái)自所述第二指令集的程序指令不包括條件碼,并且 所述一個(gè)或多個(gè)位字段用來(lái)表示來(lái)自所迷第一指令集的程序指令的條件碼。
      15. 根據(jù)權(quán)利要求13所述的方法,其中來(lái)自所述第一指令集的程序 指令是固定長(zhǎng)度的指令,來(lái)自所述第二指令集的程序指令是可變長(zhǎng)度的 指令,其包括具有高位部分和低位部分的至少一些程序指令,并且所述 一個(gè)或多個(gè)位字段用來(lái)識(shí)別來(lái)自所述第二指令集的至少一些程序指令 的高位部分和低位部分。
      16. 根椐權(quán)利要求12所述的方法,其中所述第二指令集的至少一些 程序指令具有不可預(yù)知的行為,并且相應(yīng)的預(yù)解碼的指令用來(lái)表示具有 不與所述第二指令集的任何程序指令共享的功能性的所述第一指令集 的程序指令。
      17. 根據(jù)權(quán)利要求16所述的方法,其中不與所述第二指令集的任何 程序指令共享的所述功能性包括對(duì)指定為數(shù)值的操作數(shù)的支持,所述數(shù) 值被存儲(chǔ)在移位了第二寄存器中指定的量的第一寄存器內(nèi)。
      18. 根據(jù)權(quán)利要求17所述的方法,其中在預(yù)解碼的指令內(nèi)指定所述 第二寄存器的字段位于與立即值對(duì)應(yīng)的位置處,該立即值指定表示所述 第二指令集的指令的不可預(yù)知變體的預(yù)解碼的指令內(nèi)的移位量,所述不 可預(yù)知變體使用被指定為存儲(chǔ)在第三寄存器內(nèi)的數(shù)值的操作數(shù),該第三 寄存器移位了由所述立即值指定的量。
      19. 根據(jù)權(quán)利要求12所述的方法,其中預(yù)解碼的指令內(nèi)與所迷第一 指令集中的為其不使用所述解碼電路的所述共享部分的指令對(duì)應(yīng)的位 字段被設(shè)置成預(yù)定值,以便選擇使用所迷解碼電路的不共享部分。
      20. 根據(jù)權(quán)利要求12所述的方法,其中所述多個(gè)指令集包括第三指 令集,并且所述預(yù)解碼電路響應(yīng)于具有與所述第二指令集的一個(gè)組合指 令對(duì)應(yīng)的組合功能的所述第三指令集的相鄰取出的程序指令來(lái)生成與 所述組合指令對(duì)應(yīng)的預(yù)解碼的指令。
      21. 根據(jù)權(quán)利要求12所述的方法,其中所述預(yù)解碼步驟響應(yīng)于與重 定向程序流對(duì)應(yīng)的程序指令的檢測(cè),來(lái)終止當(dāng)前的程序指令流的預(yù)解 碼。
      全文摘要
      本發(fā)明涉及多指令集的指令預(yù)解碼。提供了一種數(shù)據(jù)處理設(shè)備,其具有用來(lái)生成預(yù)解碼的指令的預(yù)解碼電路10,預(yù)解碼的指令被存儲(chǔ)在指令高速緩存20中。來(lái)自指令高速緩存20的預(yù)解碼的指令被解碼電路45,50,46讀取,并用來(lái)形成控制與預(yù)解碼的指令對(duì)應(yīng)的處理操作的控制信號(hào)。最初取出的程序指令可以屬于多個(gè)指令集中的各個(gè)指令集。來(lái)自一個(gè)指令集的指令被預(yù)解碼電路10預(yù)解碼成預(yù)解碼的指令,預(yù)解碼的指令具有共享格式以表示與從另一個(gè)指令集中取得的相應(yīng)指令共享的功能性。通過(guò)這種方式,解碼電路的共享部分可以關(guān)于來(lái)自這兩個(gè)不同指令集中的指令的共享功能性生成控制信號(hào)。
      文檔編號(hào)G06F9/38GK101493762SQ20091000611
      公開(kāi)日2009年7月29日 申請(qǐng)日期2009年1月23日 優(yōu)先權(quán)日2008年1月23日
      發(fā)明者A·C·羅斯, P·R·格林哈爾格, S·J·克拉斯克 申請(qǐng)人:Arm有限公司
      網(wǎng)友詢(xún)問(wèn)留言 已有0條留言
      • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
      1