国产精品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>

      對(duì)狀態(tài)寄存器進(jìn)行重命名的方法和使用該方法的處理器的制作方法

      文檔序號(hào):6563132閱讀:669來源:國知局
      專利名稱:對(duì)狀態(tài)寄存器進(jìn)行重命名的方法和使用該方法的處理器的制作方法
      技術(shù)領(lǐng)域
      本發(fā)明涉及微處理器體系結(jié)構(gòu),具體來說,涉及到一種在具有超 標(biāo)量流水線結(jié)構(gòu)的處理器中對(duì)狀態(tài)寄存器進(jìn)行重命名的方法和使用該 方法的處理器,能夠通過對(duì)寄存器進(jìn)行重命名的方式消除指令執(zhí)行中 出現(xiàn)的數(shù)據(jù)假相關(guān),以提高流水線結(jié)構(gòu)處理器的執(zhí)行效率,且能夠很 方便地實(shí)現(xiàn)標(biāo)志寄存器的重命名機(jī)制,以減少因讀寫標(biāo)志位帶來的流 水線停頓。
      背景技術(shù)
      在現(xiàn)代微處理器設(shè)計(jì)中,指令的吞吐率,即每秒所能執(zhí)行的指令 數(shù)是很重要的一個(gè)指標(biāo),而單位時(shí)間指令數(shù)的方法有多種途徑,最直 接的技術(shù)就是增加處理器運(yùn)行的頻率,然而,頻率的增加會(huì)導(dǎo)致到處 理器功耗以及發(fā)熱量的迅速上升,并因此已經(jīng)受到嚴(yán)重的制約。
      因而,現(xiàn)代處理器更多的是關(guān)注于通過增加單個(gè)時(shí)鐘周期內(nèi)執(zhí)行 的指令數(shù)來提高指令吞吐率,即通過流水線以及超標(biāo)量的結(jié)果來實(shí)現(xiàn)。 流水線技術(shù)把一條指令的執(zhí)行劃分成若干個(gè)階段,每一階段在流水線 中的一級(jí)進(jìn)行處理,且需要占用一個(gè)時(shí)鐘周期,這樣同一時(shí)刻可以有 多條指令位于流水線的不同階段執(zhí)行,從而提高處理器執(zhí)行效率。而 在超標(biāo)量技術(shù)中, 一個(gè)時(shí)鐘周期將發(fā)射不止一條的指令(如同時(shí)發(fā)射 兩條或四條指令),這樣也能提高處理器的效率。
      在現(xiàn)代的處理器中大量的是同時(shí)使用了流水線和超標(biāo)量這兩種 技術(shù)以獲得更高的性能,然而,在實(shí)際中,指令和指令之間可能存在 著某種數(shù)據(jù)的依賴關(guān)系,比如一條指令執(zhí)行所需要讀取的源操作數(shù)可 能就是上一條指令要寫的那個(gè)值,如它們對(duì)應(yīng)的是同一個(gè)寄存器,這 樣,第二條指令就必須等到前面指令執(zhí)行完并寫回結(jié)果到寄存器后才
      能繼續(xù)執(zhí)行。因而,需要有一種方法來有效的檢測出這些相關(guān)性并很 好的進(jìn)行處理,通常,可以采取寄存器重命名的方式來解決這種問題。 所謂的寄存器重命名就是將邏輯寄存器映射到物理寄存器,處理
      器的指令集一般包括數(shù)量有限的可用邏輯寄存器(如x86結(jié)構(gòu)處理器中 包括8個(gè)定點(diǎn)通用寄存器),且數(shù)目小于處理器中實(shí)際可用的物理寄存 器數(shù)目。處理器通過對(duì)邏輯寄存器的重命名可以有效消除WAR(讀后寫) 以及WAW (寫后寫)這樣的假相關(guān),以允許利用同一個(gè)邏輯寄存器的獨(dú) 立指令能同時(shí)發(fā)出,來防止相關(guān)性造成的延遲。
      除了主要用于存儲(chǔ)算術(shù)運(yùn)算結(jié)果的通用寄存器之外,兼容x86架 構(gòu)的處理器還包括一個(gè)稱之為Eflags的標(biāo)志寄存器,其中存儲(chǔ)著有關(guān) cpu的一些信息,包括一些狀態(tài)標(biāo)志、系統(tǒng)標(biāo)志以及控制標(biāo)志位。某些 指令執(zhí)行之后會(huì)修改其中的部分位,而另一些指令的執(zhí)行也可能需要 讀取其中的某個(gè)或某些標(biāo)志位,這樣實(shí)際上標(biāo)志寄存器也會(huì)導(dǎo)致不同 的指令之間出現(xiàn)隱含的依賴關(guān)系,事實(shí)上,在x86指令集中,算術(shù)、邏 輯運(yùn)算指令等都是經(jīng)常修改標(biāo)志位的,而程序中往往大量存在的是這 樣的指令,因而十分有必要對(duì)標(biāo)志位進(jìn)行適當(dāng)?shù)闹孛越档推渌?起的延遲。

      發(fā)明內(nèi)容
      為了克服上述缺陷提出了本發(fā)明,本發(fā)明的目的是提出一種在具 有超標(biāo)量流水線結(jié)構(gòu)的處理器中對(duì)狀態(tài)寄存器進(jìn)行重命名的方法和使 用該方法的處理器,能夠通過對(duì)寄存器進(jìn)行重命名的方式消除指令執(zhí) 行中出現(xiàn)的數(shù)據(jù)假相關(guān),以提高流水線結(jié)構(gòu)處理器的執(zhí)行效率,且能 夠很方便地實(shí)現(xiàn)標(biāo)志寄存器的重命名機(jī)制,以減少標(biāo)志位帶來的流水 線停頓。
      為了實(shí)現(xiàn)上述目的,根據(jù)本發(fā)明,提出了一種在具有超標(biāo)量流水 線結(jié)構(gòu)的處理器中對(duì)狀態(tài)寄存器進(jìn)行重命名的方法,其中所述狀態(tài)寄 存器是由從標(biāo)志寄存器的所有標(biāo)志位中選擇的多個(gè)標(biāo)志位組成的寄存
      器,所述方法包括以下步驟在對(duì)指令譯碼后的微碼到達(dá)所述處理器 的寄存器重命名模塊時(shí),確定所述微碼是否要讀狀態(tài)寄存器;如果確
      定所述微碼要讀狀態(tài)寄存器,則為所述狀態(tài)寄存器分配最近映射到的 物理寄存器;否則,則不為所述狀態(tài)寄存器分配物理寄存器;確定所 述微碼是否要寫狀態(tài)寄存器如果確定所述微碼要寫狀態(tài)寄存器,則 為所述狀態(tài)寄存器分配新的狀態(tài)為空的物理寄存器;否則,則不為所 述拔態(tài)寄存器分配物理寄存器。
      優(yōu)選地,所述多個(gè)標(biāo)志位為會(huì)頻繁受到指令修改的多個(gè)狀態(tài)標(biāo)志位。
      優(yōu)選地,所述多個(gè)狀態(tài)標(biāo)志位包括進(jìn)位標(biāo)志位、奇偶標(biāo)志位、調(diào) 整標(biāo)志位、零標(biāo)志位、符號(hào)標(biāo)志位、以及溢出標(biāo)志位。
      優(yōu)選地,所述最近映射到的物理寄存器根據(jù)用于維護(hù)所述狀態(tài)寄 存器和物理寄存器的動(dòng)態(tài)映射關(guān)系的重命名表來確定。
      優(yōu)選地,所述重命名表包括表示狀態(tài)的域和表示改寫物理寄存器 的指令所在的基本塊的域。
      優(yōu)選地,所述重命名表還包括有效域,用于確定最近映射到的物 理寄存器。
      優(yōu)選地,所述多個(gè)狀態(tài)標(biāo)志位中的一部分狀態(tài)位會(huì)受到屏蔽以防 止對(duì)這一部分狀態(tài)位的修改。
      優(yōu)選地,所述最近映射到的物理寄存器根據(jù)狀態(tài)指針寄存器的值 來確定。
      優(yōu)選地,在對(duì)狀態(tài)寄存器進(jìn)行重命名操作之后,所述微碼進(jìn)入發(fā) 射隊(duì)列并在所分配的物理寄存器準(zhǔn)備就緒之后能夠參與調(diào)度并被發(fā)射 出去。
      根據(jù)本發(fā)明,還提出了一種包括實(shí)現(xiàn)了上述的方法的寄存器重命 名模塊的、具有超標(biāo)量流水線結(jié)構(gòu)的處理器。
      本發(fā)明所涉及的微處理器是采用流水線、多發(fā)射的體系結(jié)構(gòu),為 了減少多指令并發(fā)執(zhí)行中由于讀寫標(biāo)志位導(dǎo)致的隱含依賴關(guān)系,提出 了一種方法和裝置,包括檢測當(dāng)前指令是否需要讀取標(biāo)志寄存器中的 狀態(tài)位,以及需要讀取哪些位,還檢測當(dāng)前指令是否需要改寫狀態(tài)標(biāo) 志位以及改寫的是哪些位,利用寄存器重命名表為需要讀取和改寫狀 態(tài)標(biāo)志位的操作快速高效地分配相應(yīng)的物理重命名寄存器,以減少讀
      寫狀態(tài)位造成的依賴關(guān)系所帶來的流水線停頓,針對(duì)標(biāo)志寄存器的特
      點(diǎn),本發(fā)明對(duì)部分最常讀取和修改的6個(gè)狀態(tài)標(biāo)志位單獨(dú)提取出來作為 一個(gè)邏輯寄存器進(jìn)行重命名,既實(shí)現(xiàn)簡單又很好的減少了大部分由標(biāo) 志位引入的相關(guān)。本發(fā)明詳細(xì)給出了對(duì)這部分標(biāo)志位的重命名方案, 能在不增加過多硬件代價(jià)的前提下很好的降低由于讀寫標(biāo)志位所引起 的流水線阻塞。


      通過參考以下結(jié)合附圖對(duì)所采用的優(yōu)選實(shí)施例的詳細(xì)描述,本發(fā)
      明的上述目的、優(yōu)點(diǎn)和特征將變得顯而易見,其中-
      圖l給出了一個(gè)超標(biāo)量、流水線處理器的內(nèi)部結(jié)構(gòu)框圖; 圖2給出了本發(fā)明的一個(gè)具體實(shí)施例所用的更詳細(xì)的微處理器結(jié)
      構(gòu)框圖3是本發(fā)明所描述的標(biāo)志寄存器的一個(gè)示例; 圖4是一個(gè)狀態(tài)寄存器的實(shí)例圖5所示的是寄存器重命名模塊中狀態(tài)寄存器重命名表的結(jié)構(gòu)
      圖6A表示的是從譯碼模塊出來后微碼所攜帶的部分標(biāo)記信息; 圖6B表示的是微碼經(jīng)過寄存器重命名之后所攜帶的部分標(biāo)記信
      息;
      圖7給出了譯碼模塊生成微碼相關(guān)信息的流程圖;以及 圖8給出了本發(fā)明的一個(gè)實(shí)施例中,重命名模塊進(jìn)行物理寄存器 分配的一個(gè)流程圖。
      具體實(shí)施例方式
      這里所描述的涉及對(duì)標(biāo)志寄存器進(jìn)行重命名的裝置和方法。以用 于解決因隱含的讀寫標(biāo)志寄存器所引起的流水線停頓問題,在下面的 描述中,給出了一些相關(guān)的具體細(xì)節(jié),以提供對(duì)本發(fā)明更好的理解。
      圖l給出了一個(gè)實(shí)現(xiàn)該重命名機(jī)制的處理器的部分結(jié)構(gòu)圖,如圖 所示,結(jié)構(gòu)中主要包括以下一些模塊-
      取指模塊100,根據(jù)給出的pc值取出下一條要執(zhí)行的指令,送到 流水線中執(zhí)行;
      譯碼模塊101,對(duì)取指模塊送入的宏指令進(jìn)行譯碼生成一條或多 條處理器內(nèi)部表示的微碼格式,該宏指令是對(duì)應(yīng)處理器兼容的指令集 格式的,如x86架構(gòu)處理器對(duì)應(yīng)的CICS格式指令,或者諸如PowerPC、 Alpha等RISC架構(gòu)的指令格式,而內(nèi)部微碼格式則一般都是類RISC的格 式的;
      寄存器重命名模塊102,該模塊含有寄存器重命名表,在具體的 實(shí)現(xiàn)中,可對(duì)應(yīng)于不同類型的寄存器分別維護(hù)一張重命名表,如對(duì)定 點(diǎn)寄存器、浮點(diǎn)寄存器以及本發(fā)明中重點(diǎn)討論到的狀態(tài)寄存器各維護(hù) 一份重命名表,記錄著各類邏輯寄存器到物理寄存器的動(dòng)態(tài)映射關(guān)系。
      發(fā)射隊(duì)列模塊103,該模塊負(fù)責(zé)從進(jìn)入到發(fā)射隊(duì)列的微操作中選 出當(dāng)前可以發(fā)射的若干個(gè),并送到功能部件去執(zhí)行。
      圖2給出了一個(gè)更為詳細(xì)的實(shí)現(xiàn)圖,該發(fā)射隊(duì)列共包含定點(diǎn)和浮 點(diǎn)2個(gè)發(fā)射隊(duì)列,從功能部件205可以看出,總共含有5個(gè)獨(dú)立的功能部 件,其中FALU1和FALU2為浮點(diǎn)運(yùn)算部件,執(zhí)行浮點(diǎn)運(yùn)算操作,ALU1和 ALU2為定點(diǎn)運(yùn)算部件,執(zhí)行定點(diǎn)運(yùn)算操作,MEM為訪存部件,執(zhí)行訪存 地址的運(yùn)算。這里面,定點(diǎn)操作以及訪存操作進(jìn)入到定點(diǎn)發(fā)射隊(duì)列進(jìn) 行調(diào)度,浮點(diǎn)相關(guān)操作則進(jìn)入到浮點(diǎn)發(fā)射隊(duì)列進(jìn)行調(diào)度。發(fā)射隊(duì)列模 塊要做的是為每個(gè)可用的功能部件,從兩個(gè)發(fā)射隊(duì)列中選出已經(jīng)準(zhǔn)備 好的操作發(fā)射到相應(yīng)功能部件中去執(zhí)行,注意, 一次只能向一個(gè)功能 部件發(fā)射一條指令。比如這里有兩個(gè)浮點(diǎn)運(yùn)算部件,那么每次可以分 別為FALU1和FALU2各選出一條準(zhǔn)備好的指令發(fā)射出去執(zhí)行。那么,如 何判斷一個(gè)操作是否準(zhǔn)備好呢?看的是它的所有源寄存器中的數(shù)據(jù)是 否已經(jīng)準(zhǔn)備好,即所需要讀取的操作數(shù)已經(jīng)寫回寄存器堆了。當(dāng)然, 如果對(duì)應(yīng)某個(gè)功能部件,發(fā)射隊(duì)列中有多條準(zhǔn)備好的指令,那么則要 從中選擇一條等待時(shí)間最長的發(fā)射出去。對(duì)于已經(jīng)發(fā)射出去的操作, 其相應(yīng)表項(xiàng)在發(fā)射隊(duì)列中將被刪除,以便讓新的微碼進(jìn)來。
      寄存器堆模塊也包含三個(gè)部分定點(diǎn)寄存器堆、浮點(diǎn)寄存器堆以 及狀態(tài)寄存器堆,他們主要是用來提供所需的源操作數(shù)值,微碼從發(fā) 射隊(duì)列發(fā)射出去之后,需要從寄存器堆讀取相應(yīng)源操作數(shù)的值,然后 進(jìn)入各自功能部件執(zhí)行。
      功能部件205共包括五個(gè)獨(dú)立的運(yùn)算部件,分別用來完成定點(diǎn)、 浮點(diǎn)和訪存操作的運(yùn)算,在本發(fā)明所闡述的實(shí)現(xiàn)中,該定點(diǎn)運(yùn)算部件 ALU1和ALU2可以設(shè)計(jì)成完全相同的實(shí)現(xiàn),也可以有所不同,如將一些 較快完成的操作放在ALU1中執(zhí)行,而一些需要比較多個(gè)時(shí)鐘周期的操 作放到ALU2中去執(zhí)行,同時(shí)還有某些操作既可以在ALU1中又可以在 ALU2中完成。同樣,浮點(diǎn)運(yùn)算部件FALU1和FALU2也可以設(shè)計(jì)成完全一 樣,或者完成的操作有所不同。訪存部件MEM用來完成訪存操作地址的 計(jì)算,對(duì)于像x86這樣的復(fù)雜指令集來講,尋址方式可能有很多種而且 會(huì)有相當(dāng)復(fù)雜的,訪存部件MEM可以完成其有效地址或者完整線性地址 的計(jì)算,圖中訪存部件只畫出一個(gè),當(dāng)然如果實(shí)現(xiàn)需要,也可以包含 兩個(gè)甚至更多個(gè)獨(dú)立的訪存地址運(yùn)算部件。
      指令在該結(jié)構(gòu)中的流程為取指模塊根據(jù)給出的pc地址取出對(duì)應(yīng) 的指令,該宏指令經(jīng)過譯碼模塊101之后被翻譯成類RISC的處理器內(nèi)部 微操作(uop),操作均只在寄存器之間進(jìn)行,需要訪存的運(yùn)算需要先 用一條訪存指令將操作數(shù)從內(nèi)存導(dǎo)入到寄存器再進(jìn)行運(yùn)算。從譯碼模 塊出來的uop進(jìn)入到寄存器重命名模塊102,該模塊用來將uop中的邏輯 寄存器映射到實(shí)際的物理寄存器號(hào),并消除WAR,WAW這樣的假相關(guān)現(xiàn) 象,然后經(jīng)過重命名后的uop進(jìn)入到發(fā)射隊(duì)列103等待調(diào)度,如果其所 有的操作數(shù)均己準(zhǔn)備好且被選中,并且功能部件105不忙的話,則將其 發(fā)射到對(duì)應(yīng)的功能部件進(jìn)行執(zhí)行,執(zhí)行完后,結(jié)果從結(jié)果總線110寫回 到寄存器堆104以更新結(jié)果寄存器的值,同時(shí),還需要將寫回的寄存器 號(hào)等信息送到R0B模塊106中,當(dāng)u叩從ROB中提交的時(shí)候還需要用這些 信息來更新寄存器重命名表中的相應(yīng)表項(xiàng)狀態(tài)。這一過程在后面的描 述中會(huì)做更進(jìn)一步的詳細(xì)說明。
      圖3給出了一個(gè)標(biāo)志寄存器Eflags的結(jié)構(gòu)圖,Eflags共有32位, 其中bitl, 3, 5, 15,以及22到31都是保留位,未使用,其余的位包 含一組狀態(tài)標(biāo)志、 一組控制標(biāo)志以及一組系統(tǒng)標(biāo)志。當(dāng)執(zhí)行8086代碼 時(shí)只用到低的16比特,而在執(zhí)行保護(hù)模式代碼時(shí),會(huì)用到整個(gè)的32位。
      Eflags寄存器中6比特的狀態(tài)標(biāo)志位是本發(fā)明關(guān)注的重點(diǎn),也是 本發(fā)明進(jìn)行重命名的對(duì)象,在這里也給出一些簡要的說明,這6個(gè)狀態(tài) 標(biāo)志位包括有
      CF:進(jìn)位標(biāo)志,在算術(shù)運(yùn)算時(shí)如果結(jié)果的最高有效位產(chǎn)生進(jìn)位或 者借位,則將該位置位,否則清零。該標(biāo)志指示著無符號(hào)整數(shù)算術(shù)運(yùn) 算溢出的條件。
      PF:奇偶標(biāo)志,當(dāng)運(yùn)算結(jié)果最低字節(jié)中"1"的個(gè)數(shù)為偶數(shù)時(shí)該
      標(biāo)志位置位,否則清零。
      AF:調(diào)整標(biāo)志,也稱輔助進(jìn)位標(biāo)志,在用BCD碼進(jìn)行算術(shù)運(yùn)算時(shí), 如果運(yùn)算結(jié)果的第3位產(chǎn)生進(jìn)位或者借位,則將該標(biāo)志位置位,否則清零。
      ZF:零標(biāo)志,運(yùn)算結(jié)果為0時(shí)置位該標(biāo)志,否則清零。
      SF:符號(hào)標(biāo)志,該標(biāo)志為等于帶符號(hào)整數(shù)運(yùn)算結(jié)果的最高有效位,
      為0表示整數(shù),l表示負(fù)數(shù)。
      OF:溢出標(biāo)志,如果整形數(shù)結(jié)果大于目標(biāo)操作數(shù)所能表示的最大
      整數(shù),或者小于目標(biāo)操作數(shù)所能表示的最小負(fù)數(shù),則將該標(biāo)志置位, 否則清零。該標(biāo)志位指示著帶符號(hào)整形數(shù)的算術(shù)運(yùn)算的溢出條件。
      另外的幾個(gè)標(biāo)志位中,控制標(biāo)志位為DF,系統(tǒng)標(biāo)志位有TF、 IF、 IOPL、 NT、 RF、 VM、 AC、 VIF、 VIP、 ID。關(guān)于它們的具體含義可以參 見處理器廠商發(fā)布的相關(guān)編程手冊,這里不做詳細(xì)解釋。
      為了消除上面標(biāo)志位導(dǎo)致的指令依賴關(guān)系,有必要對(duì)標(biāo)志位進(jìn)行 重命名,方法之一是對(duì)單個(gè)位進(jìn)行重命名,即分別將CF、 PF、 AF、 ZF、 SF、 0F、 DF等看成是單個(gè)的寄存器然后分別進(jìn)行重命名,但是經(jīng)常出 現(xiàn)某條指令需要修改或讀取的是多于一位的標(biāo)志位,如大部分算術(shù)指 令需要改寫全部的6位狀態(tài)位,而有些條件跳轉(zhuǎn)指令也需要讀取多達(dá)3 位的標(biāo)志位,這樣分別重命名的話會(huì)導(dǎo)致控制邏輯十分復(fù)雜,而且對(duì) 應(yīng)每個(gè)標(biāo)志位都需要l個(gè)檢測邏輯來檢測當(dāng)前微碼中的標(biāo)志位與前面 的各個(gè)微碼是否存在依賴情況,這種實(shí)現(xiàn)將大大影響整個(gè)處理器系統(tǒng) 執(zhí)行的性能。
      另一種處理方法是對(duì)整個(gè)32位的Eflags進(jìn)行整體重命名,即只要
      指令修改某一位或幾位標(biāo)志位,就看成是修改整個(gè)標(biāo)志寄存器,后續(xù) 的需要讀取某一位或幾位標(biāo)志位的指令必須等到前面這條寫標(biāo)志位的 指令寫回之后才能繼續(xù)執(zhí)行,然而,如果前面的指令修改的CF,而后續(xù)
      指令要讀取的是DF,則很明顯他們本來其實(shí)是不存在相關(guān)的,但是在
      整體重命名后出現(xiàn)了相關(guān)性,導(dǎo)致后續(xù)指令被延遲執(zhí)行,,直到前面的
      指令已經(jīng)將標(biāo)志位寫回之后,后續(xù)需要讀DF的指令才能取出相應(yīng)的標(biāo) 志位繼續(xù)執(zhí)行。由此可見這種方法雖然控制十分簡單,但實(shí)現(xiàn)效率并 不高,并會(huì)因此而引出大量的新的相關(guān)。
      通過分析指令的執(zhí)行特性,可以發(fā)現(xiàn),在所有的這些標(biāo)志位中, 6個(gè)狀態(tài)標(biāo)志位是最頻繁被指令修改的(如算術(shù)運(yùn)算指令A(yù)DD,SUB,邏 輯運(yùn)算指令A(yù)ND, 0R, XOR等),而且指令的執(zhí)行修改的一般也都是這幾個(gè) 狀態(tài)標(biāo)志位,極少改寫到控制和系統(tǒng)標(biāo)志位,并且指令對(duì)狀態(tài)位的修 改一般都是全部改寫6個(gè)狀態(tài)位,這就使得可以考慮只對(duì)這6個(gè)狀態(tài)位 進(jìn)行整體的重命名。另外指令讀取狀態(tài)標(biāo)志位的次數(shù)也同樣比讀取其 它標(biāo)志位的情況更多(如Jcc, SETcc, CMOVcc等指令),因而在本發(fā)明 的實(shí)施例中,將Eflags寄存器劃分成兩個(gè)部分6個(gè)狀態(tài)標(biāo)志位,以及 其余的控制和系統(tǒng)標(biāo)志位。第二部分的控制標(biāo)志位和系統(tǒng)標(biāo)志位較少 被指令改寫和讀取到,對(duì)流水線延遲的影響不如6個(gè)狀態(tài)標(biāo)志位,所以 本發(fā)明將其拆開處理,且只對(duì)第一部分進(jìn)行重命名,而不是對(duì)整個(gè)的 32bit的Eflags寄存器整體重命名。這樣既能使得控制邏輯比較簡單, 又能很大限度的處理到指令執(zhí)行中遇到的大多數(shù)由標(biāo)志位引起的相關(guān)
      情況°
      由于因標(biāo)志位引起的相關(guān)與讀寫通用寄存器導(dǎo)致的相關(guān)十分類 似,因此在硬件結(jié)構(gòu)上均采用相似的方法來處理。在寄存器堆模塊中,
      本發(fā)明的實(shí)現(xiàn)添加了實(shí)現(xiàn)6比特狀態(tài)寄存器的硬件結(jié)構(gòu),這里將6比特 標(biāo)志位組成的狀態(tài)寄存器稱為AFG,把宏指令中隱含的對(duì)狀態(tài)標(biāo)志位的 讀寫轉(zhuǎn)化為顯示的對(duì)AFG的讀寫。需要說明的是,在本文中如無特殊說 明,所有提到的"狀態(tài)寄存器"均指的是6bit的狀態(tài)位組成的狀態(tài)寄 存器AFG,而用"標(biāo)志寄存器"來統(tǒng)稱通常所說的32bit的完整Eflags 寄存器。
      圖4給出了一個(gè)狀態(tài)寄存器的描述圖,該寄存器包含了6個(gè)狀態(tài)位 的信息,任何對(duì)狀態(tài)位的讀寫都將被看成是對(duì)該狀態(tài)寄存器的讀寫操 作。
      圖5所示的是寄存器重命名模塊中狀態(tài)寄存器的重命名表結(jié)構(gòu)的
      一個(gè)具體實(shí)施例,整個(gè)表共有若干項(xiàng),,每個(gè)物理狀態(tài)寄存器在表中對(duì)
      應(yīng)一項(xiàng),比如當(dāng)處理器中有16個(gè)標(biāo)志位物理寄存器時(shí),該表就有16個(gè)
      表項(xiàng),表中需要包含到以下兩個(gè)域表示狀態(tài)的域301和表示改寫該物
      理狀態(tài)寄存器的指令所在基本塊的域302。而狀態(tài)位可以根據(jù)處理器的 具體實(shí)現(xiàn)情況劃分為若干個(gè)狀態(tài),比如在一個(gè)實(shí)施例中,可以選用2bit
      的狀態(tài)位包含以下3個(gè)狀態(tài)
      EMPTY:表示這個(gè)物理寄存器空閑。
      MAPPED:表示該物理寄存器已經(jīng)被分配出去,但結(jié)果尚未寫回。
      WRITEBACK:結(jié)果己經(jīng)寫回,但寫該結(jié)果的指令尚未從重排序緩 沖器ROB (reorder buffer)中提交,該狀態(tài)還可以被取消。
      C0應(yīng)IT:提交狀態(tài),表示寫該物理寄存器的指令已經(jīng)從ROB中提 交,且已改寫真正的結(jié)構(gòu)寄存器(architecture register)。
      這樣的實(shí)現(xiàn)中狀態(tài)位只需要2比特表示,當(dāng)然,也可以實(shí)現(xiàn)成其 它的狀態(tài)表示方式,對(duì)應(yīng)的狀態(tài)位的位數(shù)也可能相應(yīng)不同。
      基本塊號(hào)302指明了改寫該寄存器的指令所在的基本塊號(hào),用于
      在分支猜錯(cuò)的時(shí)候判斷是否需要取消該物理寄存器的重命名狀態(tài)。對(duì) 于現(xiàn)代的超標(biāo)量流水線結(jié)構(gòu)的處理器,大量應(yīng)用到亂序執(zhí)行以及分支 猜測技術(shù),對(duì)于分支指令,如果其分支目標(biāo)的判斷依賴于前一條指令 生成的結(jié)果數(shù)據(jù),由于結(jié)果往往要到比較靠后的流水級(jí)里才能生成, 所以導(dǎo)致后續(xù)指令需要等待若干個(gè)時(shí)鐘周期,直到前面分支所依賴的 數(shù)據(jù)已經(jīng)確定之后才能知道下一條要取的指令的地址,這時(shí)再從目標(biāo) 地址中取出正確的指令,這將導(dǎo)致流水線中出現(xiàn)停頓,為了降低這種 停頓開銷,現(xiàn)有處理器均對(duì)分支指令的目標(biāo)地址進(jìn)行預(yù)測,取指部件 從預(yù)測的目標(biāo)地址去取得新的指令繼續(xù)執(zhí)行而不等待前面結(jié)果的寫 回,如果分支預(yù)測是正確的,則很明顯,處理器可以順著當(dāng)前的路徑 繼續(xù)執(zhí)行,不需要額外的開銷,從而節(jié)省了停頓等待的時(shí)間,當(dāng)然,
      如果預(yù)測錯(cuò)誤,則需要從分支指令處將后續(xù)的所有指令取消掉,因?yàn)?它們本來是不應(yīng)該被執(zhí)行的,同時(shí)錯(cuò)誤分支的后續(xù)指令所改寫的其它 機(jī)器狀態(tài)都應(yīng)予以恢復(fù)。在寄存器重命名表中,也需要配套的機(jī)制來 實(shí)現(xiàn)這一目的,當(dāng)分支猜錯(cuò)時(shí),需要將重命名表的狀態(tài)也恢復(fù)到與分 支時(shí)的一致,通過檢測重命名表中各項(xiàng)對(duì)應(yīng)的基本塊號(hào)是否位于分支 猜錯(cuò)指令所在基本塊號(hào)之后,該基本塊號(hào)可用來決定是否需要恢復(fù)重 命名表的狀態(tài)。
      圖5中虛框的有效域valid是不一定需要這樣實(shí)現(xiàn)的,本發(fā)明在下 面將會(huì)具體介紹,而對(duì)于定點(diǎn)寄存器和浮點(diǎn)寄存器的重命名表的構(gòu)造, 由于一般定點(diǎn)和浮點(diǎn)的邏輯寄存器都含有多個(gè),而不像這里的狀態(tài)寄 存器就只僅僅是 一 個(gè),如x86系列中定點(diǎn)邏輯寄存器包含 EAX/EBX/ECX/EDX/ESI/EDI/EBP/ESP,而浮點(diǎn)邏輯寄存器也有8個(gè),分 別被表示為ST0/ST1/ST2/ST3/ST4/ST5/ST6/ST7,因而對(duì)于定點(diǎn)、浮點(diǎn) 寄存器的重命名表所需要的信息將會(huì)比狀態(tài)寄存器更多,需要在同一 張表中分別保存著對(duì)應(yīng)多個(gè)不同的邏輯寄存器到物理寄存器的映射關(guān) 系,但總得來說,定點(diǎn)和浮點(diǎn)寄存器重命名表的構(gòu)造和狀態(tài)寄存器是 類似的,他們不是本發(fā)明討論的重點(diǎn),所以本發(fā)明中暫不做詳細(xì)說明。
      圖6 A說明了當(dāng)指令經(jīng)過譯碼模塊生成微碼后能夠確定的一些信 息,譯碼模塊需要確定指令是否需要讀取狀態(tài)標(biāo)志位以及是否需要改 寫狀態(tài)標(biāo)志位,判斷之后生成相應(yīng)的信息往后傳遞,這樣每條微碼除 了操作碼(opcode)等信息外還會(huì)包括是否需要讀標(biāo)志位,以及是否需 要寫標(biāo)志位的信息,比如,本發(fā)明中分別用讀狀態(tài)寄存器標(biāo)記和寫狀 態(tài)寄存器標(biāo)記來表示。讀狀態(tài)寄存器標(biāo)記指明了該微碼是否需要讀取 狀態(tài)狀態(tài)寄存器AFG,寫狀態(tài)寄存器標(biāo)記表明該微碼是否需要改寫AFG, 讀狀態(tài)寄存器標(biāo)記和寫狀態(tài)寄存器標(biāo)記均為l的話則表明這條微碼的 執(zhí)行既需要讀取AFG,又會(huì)改寫AFG。正如本發(fā)明中前面已講到的,對(duì) 與狀態(tài)位的讀寫都是以整個(gè)的狀態(tài)寄存器為單位來統(tǒng)一進(jìn)行的,也就 是說,如果譯碼模塊根據(jù)微碼判斷出該微碼需要讀取6比特狀態(tài)位中的 某位或多位,則表示其需要讀取狀態(tài)寄存器AFG,并將讀狀態(tài)寄存器標(biāo) 記置l,如果該微碼會(huì)改寫6比特狀態(tài)位中的某位或多位時(shí),則表示其 需要修改狀態(tài)寄存器AFG,并將寫狀態(tài)寄存器標(biāo)記置l。另外,對(duì)于某 些微碼,可能有時(shí)候需要改寫AFG,但是有些時(shí)候可能保留某些狀態(tài)位 不修改,當(dāng)存在這種情況時(shí),可以給微碼附帶上一個(gè)掩碼標(biāo)記,這個(gè) 掩碼指示出這次微碼操作之后是否需要對(duì)修改標(biāo)志位的操作進(jìn)行屏 fe對(duì)于6位的AFG這樣的情況,這個(gè)掩碼可以用6位來表示,每位表示 對(duì)應(yīng)的一個(gè)狀態(tài)位,置位表示不屏蔽對(duì)該位的修改,清零時(shí)表示被屏 蔽對(duì)該位的修改,因而保留其原始值不變,功能部件105在執(zhí)行該微碼 操作時(shí)將根據(jù)該掩碼標(biāo)記信息是否置上來生成相應(yīng)的標(biāo)志位結(jié)果寫回 到狀態(tài)寄存器中。
      微碼帶著這些信息后進(jìn)入寄存器重命名模塊102 (參見圖l)。 這里有一個(gè)地方需要注意的是,由于本發(fā)明中實(shí)現(xiàn)對(duì)6比特的狀 態(tài)標(biāo)志位寄存器AFG整體重命名,這樣6個(gè)狀態(tài)位實(shí)現(xiàn)為一個(gè)單獨(dú)的寄 存器,因此對(duì)AFG的讀寫都是按6比特為單位的,而不只對(duì)部分位讀或 寫。本發(fā)明中前面提到,指令對(duì)狀態(tài)位的修改一般都是6比特全部改寫, 但這并不是絕對(duì)的,仍然還是存在只對(duì)部分位進(jìn)行修改的指令,例如 分析指令可以看出,諸如指令RCL/RCR這樣的只修改OF和CF位,而并不 修改PF,AF, ZF, SF這其余的四個(gè)狀態(tài)位,對(duì)于這種情況,本發(fā)明給出的 解決方法是當(dāng)某條微碼語義本身只需要改寫某一位或幾位狀態(tài)位, 而不是整個(gè)的6位狀態(tài)位時(shí),就需要將AFG的原始值讀入,然后在功能 部件中將不會(huì)改變的狀態(tài)位和新生成的狀態(tài)位進(jìn)行拼接形成新的6比 特狀態(tài)位寫回AFG。因而當(dāng)譯碼器譯出的某條微碼不是修改全部的6個(gè) 狀態(tài)位時(shí),除了要將寫狀態(tài)寄存器標(biāo)記置l外,還會(huì)將讀狀態(tài)寄存器標(biāo) 記置l。
      圖7給出了一個(gè)實(shí)現(xiàn)上述做法的流程圖,具體為如果微碼操作本 身需要讀取狀態(tài)位信息,則讀狀態(tài)寄存器的標(biāo)記一定被置上,如果微 碼本身不需要讀取狀態(tài)位,但是要改寫的狀態(tài)位不是整個(gè)6位,而只是 其中的一部分,則同樣需要置上讀狀態(tài)寄存器的標(biāo)記,以將不需要修 改的狀態(tài)位的原始值讀入,再和新產(chǎn)生的其他狀態(tài)位值進(jìn)行拼接后寫 回,如果這兩種情況都不成立,則不需要讀狀態(tài)寄存器。對(duì)于寫狀態(tài) 寄存器,則要簡單一些,只要微碼操作本身需要改寫狀態(tài)位的話,則
      寫狀態(tài)寄存器的標(biāo)記就需要被置上。
      上述做法實(shí)現(xiàn)起來比較簡單,并且由于改寫部分位的指令畢竟只
      是少數(shù)幾個(gè),大量的指令或者不改寫狀態(tài)位,或者改寫的是整個(gè)6比特, 因而這樣的實(shí)現(xiàn)并不會(huì)引入過多額外的相關(guān)。另外,這種實(shí)現(xiàn)實(shí)際上 還能夠大大減少不必要的流水線停頓,先看如下一個(gè)例.子。假設(shè)某條 微碼uop-x僅需要改寫ZF標(biāo)志位,在微碼u叩l之后有某條微碼uop-y需 要讀取全部6個(gè)標(biāo)志位的值,現(xiàn)考慮當(dāng)u叩-x已經(jīng)在功能部件執(zhí)行完畢 之后但由于還沒有到ROB的隊(duì)列頭而還不能提交時(shí)的處理情況。在現(xiàn)有 公開資料的一種實(shí)現(xiàn)方法中,需要檢測后續(xù)微碼讀取的標(biāo)志位是否是 前面最近一條寫標(biāo)志位微碼所寫的位的子集,如果是則后續(xù)微碼所需 要的標(biāo)志位可從前面微碼通過旁路的方式得到,而不需要等到前面的 微碼提交之后,否則像該示例中給出的情況,微碼uop-y所需讀取的標(biāo) 志位是前面微碼uop-x所寫標(biāo)志位的超集,則微碼uop-x需要停止執(zhí)行, 直到前面微碼提交之后已更新結(jié)構(gòu)寄存器(architecture register), 再從結(jié)構(gòu)寄存器中讀出所需要的值繼續(xù)執(zhí)行。而采用本發(fā)明給出的實(shí) 現(xiàn)方法時(shí),由于uop-x在功能部件中執(zhí)行完畢后己經(jīng)生成了完整的6比 特AFG值并會(huì)馬上寫到寄存器堆中,那么后續(xù)的u叩-y此時(shí)就已經(jīng)無需 等待,可以從發(fā)射隊(duì)列中送出,然后到寄存器堆中讀出6比特標(biāo)志位值 繼續(xù)執(zhí)行,而不用等到微碼u叩-x提交之后。
      微碼經(jīng)過寄存器重命名之后,對(duì)于要讀取狀態(tài)標(biāo)志位的情況,將 被分配到一個(gè)要被讀取的物理狀態(tài)寄存器,當(dāng)要寫入狀態(tài)標(biāo)志位時(shí), 也將被分配到一個(gè)被寫入的物理狀態(tài)寄存器。
      圖6B顯示了微碼經(jīng)過寄存器重命名模塊之后被確定的一些標(biāo)記。
      包括被分配的要讀取的源狀態(tài)寄存器號(hào),微碼等待標(biāo)記以及要改寫的 目的狀態(tài)寄存器號(hào)等,等待標(biāo)記表明當(dāng)前源操作數(shù)是否準(zhǔn)備好了,如 果準(zhǔn)備好了則等待標(biāo)記清0,否則置l 。除此之外,微碼中還包含其它
      實(shí)現(xiàn)微碼操作所需的各種信息,這里就不再詳細(xì)給出。 圖8給出了一個(gè)實(shí)現(xiàn)狀態(tài)寄存器重命名機(jī)制的流程圖。 在微碼到達(dá)寄存器重命名模塊102 (圖l)時(shí),對(duì)于讀狀態(tài)寄存器
      標(biāo)記為l的微碼,它需要讀取AFG,就為其分配一個(gè)最近被改寫的物理
      寄存器(802),但是要如何才能得到最近映射到的物理寄存器是哪一 個(gè)呢?
      方法之一是可以在圖3中的重命名表中增加一項(xiàng)valid域,如圖中 虛框中項(xiàng)所示,該域表明邏輯狀態(tài)寄存器AFG最近映射到的是哪一個(gè)物 理寄存器,即表明在微碼進(jìn)入到重命名模塊時(shí),它所讀的應(yīng)該是哪一 個(gè)物理寄存器內(nèi)的值。因?yàn)閷?duì)應(yīng)x86架構(gòu)中只有一個(gè)程序員可見的邏輯 狀態(tài)寄存器,所以在該重命名表中,只可能有一項(xiàng)的valid是為l的, 表明邏輯狀態(tài)寄存器AFG所最近映射的物理寄存器。
      另一種實(shí)現(xiàn)方法中,也可以不用在每個(gè)表項(xiàng)中都增加一個(gè)域,而 是單獨(dú)使用一個(gè)寄存器指針來保存需要讀取的寄存器是哪一個(gè),本發(fā) 明中稱為狀態(tài)指針寄存器,該指針寄存器能實(shí)現(xiàn)和valid位相同的作 用,即相對(duì)于到達(dá)寄存器重命名模塊的當(dāng)前微碼來說,邏輯狀態(tài)寄存 器映射到的是哪個(gè)物理寄存器。這個(gè)寄存器的大小可以根據(jù)具體的物 理寄存器數(shù)目來定,它需要能表示出最近被改寫的是哪個(gè)物理狀態(tài)寄 存器。采用這樣的實(shí)現(xiàn)方法就不需要在重命名表中逐項(xiàng)査找其valid
      域是否為1來判斷了。該寄存器在開機(jī)或重啟時(shí)需要適當(dāng)初始化以使其 能正常工作。
      當(dāng)找到最近映射的物理寄存器后,記下其寄存器號(hào)到微碼中相應(yīng) 的域,并査看其狀態(tài),如果當(dāng)前狀態(tài)表明數(shù)據(jù)已經(jīng)寫回,并且可用, 即所需讀取的狀態(tài)寄存器是準(zhǔn)備好的,否則,表明產(chǎn)生該數(shù)據(jù)的指令 尚未寫回,數(shù)據(jù)還未準(zhǔn)備好,這時(shí)需要等到前面指令產(chǎn)生的相應(yīng)標(biāo)志 位數(shù)據(jù)寫回后,才能被發(fā)射隊(duì)列調(diào)度發(fā)射。
      為需要讀取狀態(tài)位的微碼分配好了物理寄存器后,到達(dá)804,在 這里需要判斷當(dāng)前讀取的物理寄存器是否已經(jīng)準(zhǔn)備好了,如果準(zhǔn)備好, 則等待標(biāo)記置0,否則置1 (805/806)。置上該等待標(biāo)記表明在發(fā)射隊(duì)列 還不能馬上對(duì)其進(jìn)行調(diào)度并發(fā)射出去,需要等待源操作數(shù)就緒之后才 有可能發(fā)射。
      對(duì)于讀狀態(tài)寄存器標(biāo)記為O的微碼,由于它不需要讀取任何的狀 態(tài)位,應(yīng)該將表示源狀態(tài)寄存器號(hào)的標(biāo)記置為不需要讀取AFG的狀態(tài), 并直接設(shè)置微碼源狀態(tài)寄存器狀態(tài)為準(zhǔn)備就緒,將等待標(biāo)記清零,以
      避免出現(xiàn)錯(cuò)誤的流水線阻塞(803)。
      當(dāng)微碼的寫狀態(tài)寄存器標(biāo)記置為l時(shí),表明它執(zhí)行后需要改寫 AFG,這時(shí)就需要在重命名模塊為其重新分配一個(gè)新的狀態(tài)為空的物理 寄存器,并相應(yīng)修改該表項(xiàng)的狀態(tài),表明已經(jīng)被分配出去了,然后將 要改寫的目標(biāo)狀態(tài)-寄存器號(hào)置為剛分配的物理寄存器號(hào),以消除 WAR,WAW這樣的假相關(guān),這和熟知的通用寄存器的重命名做法是相似 的,在此就不再多做解釋了。
      當(dāng)微碼不需要改寫狀態(tài)位時(shí),就相應(yīng)地將目標(biāo)狀態(tài)寄存器號(hào)置為 空(80S),表示不修改任何的狀態(tài)寄存器。
      微碼根據(jù)是否需要讀寫狀態(tài)位的情況,設(shè)置好相應(yīng)標(biāo)記之后就進(jìn) 入發(fā)射隊(duì)列中去等待調(diào)度執(zhí)行了。
      當(dāng)微碼從寄存器重命名模塊出來進(jìn)入相應(yīng)的發(fā)射隊(duì)列103之后,
      將攜帶一些新的信息,比如微碼需要讀取的狀態(tài)寄存器號(hào),需要寫的 狀態(tài)寄存器號(hào),以及當(dāng)前要讀的狀態(tài)寄存器是否已經(jīng)準(zhǔn)備好,即寄存 器中的數(shù)據(jù)是否可用。如果要讀取的狀態(tài)寄存器尚未準(zhǔn)備就緒,則微 碼需要在發(fā)射隊(duì)列中等待,直到前面的微碼將對(duì)應(yīng)的標(biāo)志位寫回到狀 態(tài)寄存器后才能發(fā)射出去,正如前面所講到的,微碼所需讀取的寄存
      器都準(zhǔn)備好只是發(fā)射的必要條件之一,除此之外,微碼能否發(fā)射出去, 還有其它相關(guān)因素,如還需看功能部件是否空閑,并且如果當(dāng)前對(duì)應(yīng) 某個(gè)功能部件有多條準(zhǔn)備就緒的微碼時(shí),仍需根據(jù)指定的規(guī)則從中進(jìn) 行選擇。微碼發(fā)射到功能部件中執(zhí)行后的結(jié)果送到結(jié)果總線110上,結(jié) 果總線上的內(nèi)容有多個(gè)模塊需要用到,比如ROB、狀態(tài)寄存器堆、寄存 器重命名模塊以及發(fā)射隊(duì)列模塊等。這些模塊接收結(jié)果總線上的數(shù)據(jù) 后進(jìn)行相應(yīng)的處理
      1 ROB:通常,微碼在功能部件中的執(zhí)行是亂序的,為了保持精 確中斷,就需要讓微碼順序的提交,ROB就是實(shí)現(xiàn)這一功能的,因?yàn)檫M(jìn) 入ROB的微碼都是保持原始順序的,可以從對(duì)頭開始逐個(gè)檢測能夠提交 的微碼以保證提交的有序性。為了判斷指令可否提交,ROB需要從結(jié)果 總線110得到指令是否己經(jīng)執(zhí)行完畢的信息。
      2狀態(tài)寄存器堆寄存器堆接受結(jié)果總線上的相關(guān)寫回?cái)?shù)據(jù)信息
      來更新相應(yīng)物理寄存器的值,以保證從發(fā)射隊(duì)列發(fā)出的微碼能從寄存 器堆中讀到正確的值。
      3寄存器重命名模塊寄存器重命名模塊接收該信息用于更新相 應(yīng)物理寄存器項(xiàng)的狀態(tài),如前面所述,當(dāng)微碼需要改寫狀態(tài)寄存器時(shí), 就在該模塊為其分配了一個(gè)新的物理寄存器號(hào),并修改了相應(yīng)重命名 表的項(xiàng)的狀態(tài),如果該微碼已經(jīng)在功能部件中執(zhí)行完,并送到結(jié)果總 線上了 ,則要更新重命名表中寫回的狀態(tài)寄存器號(hào)所對(duì)應(yīng)的項(xiàng)的狀態(tài), 以指示數(shù)據(jù)正被寫回寄存器,接下來可以被后續(xù)微碼使用了。
      4發(fā)射隊(duì)列模塊由于進(jìn)入發(fā)射隊(duì)列103的微碼可能需要讀取的 狀態(tài)寄存器還沒有準(zhǔn)備好,此時(shí)等待標(biāo)記被置上了,它將在發(fā)射隊(duì)列 中進(jìn)行等待,所以也可以讓其偵聽結(jié)果總線,如果發(fā)現(xiàn)結(jié)果總線上出 現(xiàn)了狀態(tài)寄存器號(hào)與某條微碼要讀的源寄存器號(hào)相同的寫回結(jié)果時(shí), 則表明數(shù)據(jù)在下一個(gè)時(shí)鐘周期是可用的了,此時(shí),發(fā)射隊(duì)列中的該微 碼操作數(shù)可以看成是準(zhǔn)備好了,發(fā)射隊(duì)列可以考慮調(diào)度該微碼到功能 部件中去執(zhí)行了。
      如上所述,功能模塊的計(jì)算結(jié)果需要通過結(jié)果總線iio發(fā)送到以
      上的各個(gè)模塊,參見圖l中所示。
      最后,當(dāng)微碼在功能部件中執(zhí)行完,并可以從ROB中提交時(shí),還 需要更新寄存器重命名模塊102中的重命名表(參見圖5),具體做法是, R0B將提交的微碼所改寫的物理狀態(tài)寄存器號(hào)等信息從提交總線111送 給寄存器重命名模塊102,寄存器重命名模塊102接收到該信息后需要
      對(duì)寄存器重命名表中相應(yīng)表項(xiàng)進(jìn)行更新,主要是對(duì)于提交微碼所改寫 的物理寄存器號(hào)對(duì)應(yīng)的狀態(tài)由TOITEBACK改為CO固IT,同時(shí),以前所提
      交的對(duì)應(yīng)同一邏輯寄存器的物理寄存器狀態(tài)重新置為空,以允許其被 重新分配出去。
      根據(jù)本發(fā)明,指令在執(zhí)行過程中,除了需要讀取和修改通用寄存 器之外,也往往暗含要讀取或著修改標(biāo)志寄存器中的某些標(biāo)志位,如 典型的X86指令集就包含這種情況。和通用寄存器導(dǎo)致的數(shù)據(jù)依賴類 似,讀寫標(biāo)記寄存器也可能導(dǎo)致指令之間出現(xiàn)隱含的依賴關(guān)系,為了 降低標(biāo)志寄存器引起的指令依賴關(guān)系,也有必要對(duì)標(biāo)志寄存器進(jìn)行重
      命名,本發(fā)明給出了一種對(duì)標(biāo)志寄存器中使用頻率較高的部分單獨(dú)拿 出來進(jìn)行整體重命名的方法,這樣實(shí)現(xiàn)起來比整個(gè)標(biāo)志寄存器整體重 命名要更為靈活,減少了不必要的相關(guān),同時(shí)又比對(duì)每個(gè)位進(jìn)行單獨(dú) 重命名的硬件代價(jià)要小,且保證了較好的性能,因而,該方法是方便 而又合理的,基于該方法,可以很方便地實(shí)現(xiàn)標(biāo)志寄存器的重命名機(jī) 制,以減少因讀寫標(biāo)志位帶來的流水線停頓。
      盡管以上已經(jīng)結(jié)合本發(fā)明的優(yōu)選實(shí)施例示出了本發(fā)明,但是本領(lǐng) 域的技術(shù)人員將會(huì)理解,在不脫離本發(fā)明的精神和范圍的情況下,可 以對(duì)本發(fā)明進(jìn)行各種修改、替換和改變。因此,本發(fā)明不應(yīng)由上述實(shí) 施例來限定,而應(yīng)由所附權(quán)利要求及其等價(jià)物來限定。
      權(quán)利要求
      1、一種在具有超標(biāo)量流水線結(jié)構(gòu)的處理器中對(duì)狀態(tài)寄存器進(jìn)行重命名的方法,其中所述狀態(tài)寄存器是由從標(biāo)志寄存器的所有標(biāo)志位中選擇的多個(gè)標(biāo)志位組成的寄存器,所述方法包括以下步驟在對(duì)指令譯碼后的微碼到達(dá)所述處理器的寄存器重命名模塊時(shí),確定所述微碼是否要讀狀態(tài)寄存器;如果確定所述微碼要讀狀態(tài)寄存器,則為所述狀態(tài)寄存器分配最近映射到的物理寄存器;否則,則不為所述狀態(tài)寄存器分配物理寄存器;確定所述微碼是否要寫狀態(tài)寄存器;如果確定所述微碼要寫狀態(tài)寄存器,則為所述狀態(tài)寄存器分配新的狀態(tài)為空的物理寄存器;否則,則不為所述狀態(tài)寄存器分配物理寄存器。
      2、 根據(jù)權(quán)利要求l所述的方法,其特征在于所述多個(gè)標(biāo)志位為會(huì) 頻繁受到指令修改的多個(gè)狀態(tài)標(biāo)志位。
      3、 根據(jù)權(quán)利要求2所述的方法,其特征在于所述多個(gè)狀態(tài)標(biāo)志位 包括進(jìn)位標(biāo)志位、奇偶標(biāo)志位、調(diào)整標(biāo)志位、零標(biāo)志位、符號(hào)標(biāo)志位、 以及溢出標(biāo)志位。
      4、 根據(jù)權(quán)利要求l所述的方法,其特征在于所述最近映射到的物 理寄存器根據(jù)用于維護(hù)所述狀態(tài)寄存器和物理寄存器的動(dòng)態(tài)映射關(guān)系 的重命名表來確定。
      5、 根據(jù)權(quán)利要求l所述的方法,其特征在于所述重命名表包括表 示狀態(tài)的域和表示改寫物理寄存器的指令所在的基本塊的域。
      6、 根據(jù)權(quán)利要求5所述的方法,其特征在于所述重命名表還包括 有效域,用于確定最近映射到的物理寄存器。
      7、 根據(jù)權(quán)利要求2所述的方法,其特征在于所述多個(gè)狀態(tài)標(biāo)志位中的一部分狀態(tài)位會(huì)受到屏蔽以防止對(duì)這一部分狀態(tài)位的修改。
      8、 根據(jù)權(quán)利要求l所述的方法,其特征在于所述最近映射到的物 理寄存器根據(jù)狀態(tài)指針寄存器的值來確定。
      9、 根據(jù)權(quán)利要求l所述的方法,其特征在于在對(duì)狀態(tài)寄存器進(jìn)行 重命名操作之后,所述微碼進(jìn)入發(fā)射隊(duì)列并在所分配的物理寄存器準(zhǔn) 備就緒之后能夠參與調(diào)度并被發(fā)射出去。
      10、 一種包括實(shí)現(xiàn)了權(quán)利要求l所述的方法的寄存器重命名模塊 的、具有超標(biāo)量流水線結(jié)構(gòu)的處理器。
      全文摘要
      根據(jù)本發(fā)明,提出了一種在具有超標(biāo)量流水線結(jié)構(gòu)的處理器中對(duì)狀態(tài)寄存器進(jìn)行重命名的方法,其中所述狀態(tài)寄存器是由從標(biāo)志寄存器的所有標(biāo)志位中選擇的多個(gè)標(biāo)志位組成的寄存器,所述方法包括以下步驟在對(duì)指令譯碼后的微碼到達(dá)所述處理器的寄存器重命名模塊時(shí),確定所述微碼是否要讀狀態(tài)寄存器;如果確定所述微碼要讀狀態(tài)寄存器,則為所述狀態(tài)寄存器分配最近映射到的物理寄存器;否則,則不為所述狀態(tài)寄存器分配物理寄存器;確定所述微碼是否要寫狀態(tài)寄存器;如果確定所述微碼要寫狀態(tài)寄存器,則為所述狀態(tài)寄存器分配新的狀態(tài)為空的物理寄存器;否則,則不為所述狀態(tài)寄存器分配物理寄存器。
      文檔編號(hào)G06F9/38GK101169710SQ200610150338
      公開日2008年4月30日 申請(qǐng)日期2006年10月26日 優(yōu)先權(quán)日2006年10月26日
      發(fā)明者葉笑春, 張軍超, 段振中, 范東睿 申請(qǐng)人:中國科學(xué)院計(jì)算技術(shù)研究所
      網(wǎng)友詢問留言 已有0條留言
      • 還沒有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
      1