欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

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

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

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


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