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

賦予高級(jí)微處理器內(nèi)存儲(chǔ)器數(shù)據(jù)別名的方法和裝置的制作方法

文檔序號(hào):6412639閱讀:196來(lái)源:國(guó)知局
專(zhuān)利名稱(chēng):賦予高級(jí)微處理器內(nèi)存儲(chǔ)器數(shù)據(jù)別名的方法和裝置的制作方法
技術(shù)領(lǐng)域
本發(fā)明涉及計(jì)算機(jī)系統(tǒng),特別是涉及改進(jìn)的微處理器,它采用將經(jīng)常使用的存儲(chǔ)器數(shù)據(jù)存儲(chǔ)在寄存器內(nèi)的方法和裝置以實(shí)現(xiàn)更快的存取速度。
背景技術(shù)
在計(jì)算機(jī)上運(yùn)行著成千上萬(wàn)針對(duì)特定微處理器系列設(shè)計(jì)的應(yīng)用程序。其中為利用“X86”系列微處理器(包括Intel8088、Intel 8086、Intel 80186 Intel80286、i386、i486以及隨后發(fā)展的各種奔騰系列微處理器,它們都是位于加州Santa Clara的Intel公司設(shè)計(jì)和制造)的計(jì)算機(jī)(通常稱(chēng)為“IBM兼容個(gè)人電腦”)而設(shè)計(jì)的程序數(shù)量最多。針對(duì)利用其它系列處理器的計(jì)算機(jī)也設(shè)計(jì)有許多程序。由于運(yùn)行在這些計(jì)算機(jī)上的應(yīng)用程序非常多,所以能夠?yàn)檫@類(lèi)計(jì)算機(jī)(特別是處理X86程序的計(jì)算機(jī))所用的微處理器擁有巨大的市場(chǎng)。微處理器市場(chǎng)不僅容量巨大而且獲利豐厚。
雖然能夠運(yùn)行大量應(yīng)用程序的微處理器市場(chǎng)容量巨大而且獲利豐厚,但是設(shè)計(jì)新的有競(jìng)爭(zhēng)力的微處理器卻不那么容易。例如,雖然X86系列的微處理器已經(jīng)問(wèn)世多年并且在大多數(shù)銷(xiāo)售和使用的計(jì)算機(jī)內(nèi)都包含這些處理器,但是也只有少數(shù)成功的競(jìng)爭(zhēng)者能夠運(yùn)行X86程序。其中的原因是多方面的。
為了取得成功,微處理器必須能在不高于現(xiàn)有微處理器開(kāi)銷(xiāo)的前提下,與現(xiàn)有處理器一樣快地運(yùn)行針對(duì)現(xiàn)有系列處理器設(shè)計(jì)的所有程序(包括操作系統(tǒng)和已有程序)。此外,為了在經(jīng)濟(jì)上取得成功,新的微處理器必須至少在某一方面勝過(guò)現(xiàn)有的處理器,從而使買(mǎi)主有選購(gòu)新微處理器的理由。
要做到使微處理器運(yùn)行速度與現(xiàn)有微處理器一樣快是困難和昂貴的。處理器通過(guò)諸如加載、移位、相加、存儲(chǔ)和類(lèi)似的低層次操作之類(lèi)的基本操作執(zhí)行指令并且在執(zhí)行應(yīng)用程序提供的指令時(shí)僅僅響應(yīng)這類(lèi)基本操作。例如在諸如X86之類(lèi)被設(shè)計(jì)為運(yùn)行復(fù)雜指令集計(jì)算機(jī)(CSIC)的處理器中,指令在較高的級(jí)別上分配待執(zhí)行的過(guò)程,該處理器包含存儲(chǔ)所謂微指令的只讀存儲(chǔ)器(ROM)。每條微指令包含一串基本指令,依照順序執(zhí)行這些基本指令將得到高級(jí)CISC指令所命令的結(jié)果。典型的“A加B”CISC指令經(jīng)過(guò)譯碼后在ROM內(nèi)查找地址,執(zhí)行“A加B”功能指令的微指令就存儲(chǔ)在ROM內(nèi)。微指令加載后,其基本指令按照順序執(zhí)行,從而完成“A加B”指令的執(zhí)行。在這類(lèi)CSIC計(jì)算機(jī)中,微指令內(nèi)基本操作在程序執(zhí)行過(guò)程中絕對(duì)不可能發(fā)生變化。每條CISC指令只能通過(guò)指令譯碼、尋址和提取微指令以及按照微指令提供的順序運(yùn)行基本操作序列完成運(yùn)行過(guò)程。微指令每次運(yùn)行時(shí)都必須遵循同一順序。
當(dāng)今運(yùn)行X86應(yīng)用程序的處理器利用大量的技術(shù),在合理的性?xún)r(jià)比前提下提供最快的處理速度。任何采用已知硬件技術(shù)提高處理器速度的新處理器都必然會(huì)增加處理硬件的復(fù)雜度。這增加了硬件成本。
例如超標(biāo)量微處理器(superscalar),為了同時(shí)執(zhí)行兩個(gè)以上的操作,它使用多條處理通道,對(duì)此需要一系列額外的需求。在最底層級(jí)別上,簡(jiǎn)單的超標(biāo)量微處理器將每條應(yīng)用指令譯碼為執(zhí)行應(yīng)用指令功能的微指令。隨后,如果兩條微指令不需要相同的硬件資源并且一條微指令的執(zhí)行不依賴(lài)于待處理的另一條微指令的結(jié)果,則簡(jiǎn)單超標(biāo)量微處理器將這兩條微指令安排為同時(shí)執(zhí)行。
更加高級(jí)的超標(biāo)量微處理器一般將每條應(yīng)用指令譯碼為一系列的基本指令,從而以最有效率的執(zhí)行次序重新排序和安排這些基本指令的執(zhí)行。這需要每條基本操作都能單獨(dú)尋址和存取。為了完成重新排序,處理器必須確保需要其它基本指令產(chǎn)生數(shù)據(jù)的基本指令在其他指令產(chǎn)生所需數(shù)據(jù)之后執(zhí)行。這類(lèi)超標(biāo)量微處理器必須確保同時(shí)執(zhí)行的兩條基本指令不需要使用同一硬件資源。而且還必須在完成轉(zhuǎn)移操作之前解決條件轉(zhuǎn)移。
因此超標(biāo)量微處理器需要大量的硬件來(lái)比較基本指令之間的相互關(guān)系,重新排序和安排執(zhí)行任何指令的基本指令的順序。隨著處理通道數(shù)的增加,完成這些超標(biāo)量加速技術(shù)的硬件數(shù)量和成本將以二次方的速度增加。所有這些硬件需求都增加所涉及電路系統(tǒng)的復(fù)雜性和成本。在處理微指令過(guò)程中,當(dāng)每次執(zhí)行一條應(yīng)用指令時(shí),超標(biāo)量微處理器都必須使用比較復(fù)雜的尋址和提取硬件來(lái)提取每條基本指令,都必須根據(jù)其它基本指令和硬件使用狀態(tài)重新排序和重新安排這些基本指令,并且隨后還必須執(zhí)行所有重新安排后的基本指令。由于每次執(zhí)行一條應(yīng)用指令時(shí)都必須通過(guò)整個(gè)硬件序列,所以限制了超標(biāo)量處理器能夠執(zhí)行指令的速度。
即使利用各種硬件技術(shù)提高了處理速度,由此帶來(lái)的硬件復(fù)雜性也大大增加了這類(lèi)微處理器的成本。例如,Intel i486 DX4處理器采用大約150萬(wàn)個(gè)晶體管。但是如果要在諸如Intel奔騰之類(lèi)的基本超標(biāo)量處理器中通過(guò)增加硬件來(lái)利用兩條通道完成指令處理所需的依存度檢查和執(zhí)行安排,則需要300多萬(wàn)個(gè)晶體管。在Intel Pentium Pro微處理器中,為了能重新排序源自不同目標(biāo)指令的基本指令,提供預(yù)測(cè)執(zhí)行,完成寄存器更名和提供轉(zhuǎn)移預(yù)測(cè),增加到超過(guò)600多萬(wàn)個(gè)晶體管。由此可見(jiàn),為提高運(yùn)算速度而增加硬件已使最新一代微處理器的晶體管數(shù)量出乎尋常地增加。
即使采用這些已知的技術(shù),但是由于現(xiàn)有微處理器制造商已經(jīng)采用了絕大部分經(jīng)濟(jì)可行的技術(shù)來(lái)提高現(xiàn)有微處理器的運(yùn)行速度,所以也不可能制造出更快的微處理器。這樣,設(shè)計(jì)更快的處理器就成了一項(xiàng)非常困難和費(fèi)錢(qián)的工作。
降低處理器成本也是非常困難的。如上所述,制造具有足夠能力處理器的硬件加速技術(shù)非常昂貴。如果要設(shè)計(jì)一種新的處理器,必須擁有生產(chǎn)硬件的設(shè)備。由于芯片制造商一般不會(huì)投資小批量器件,所以難以獲得這類(lèi)設(shè)備。生產(chǎn)芯片制造設(shè)備所需的資本投資如此巨大,以致于超出了大多數(shù)公司力所能及的范圍。
即使設(shè)計(jì)出的新處理器能夠至少以競(jìng)爭(zhēng)處理器同樣快的速度運(yùn)行所有針對(duì)競(jìng)爭(zhēng)處理器設(shè)計(jì)的應(yīng)用程序,競(jìng)爭(zhēng)處理器在價(jià)格中也包含了足夠的利潤(rùn),從而確保其能面對(duì)競(jìng)爭(zhēng)對(duì)手作大幅度削價(jià)。
雖然通過(guò)增加硬件復(fù)雜度來(lái)設(shè)計(jì)富有競(jìng)爭(zhēng)力的處理器是非常困難的,但是可以有另一種運(yùn)行針對(duì)某一特定系列微處理器(目標(biāo)微處理器)設(shè)計(jì)的應(yīng)用程序(目標(biāo)應(yīng)用程序)的方法,它在另一種更快的微處理器(主微處理器)上用軟件仿真目標(biāo)微處理器。由于這僅僅需要增加一定形式的仿真軟件以在更快的微處理器上運(yùn)行應(yīng)用程序,所以是一種成本日趨低廉的方法。仿真器軟件將針對(duì)目標(biāo)處理器系列編寫(xiě)的應(yīng)用程序目標(biāo)指令改寫(xiě)為能夠被主微處理器執(zhí)行的主指令(hostinstruction)。隨后這些被改寫(xiě)的指令在較快主微處理器上操作系統(tǒng)的控制下運(yùn)行。
有許多種不同的設(shè)計(jì)可以使目標(biāo)應(yīng)用程序運(yùn)行在處理器速度快于目標(biāo)計(jì)算機(jī)處理器的主計(jì)算機(jī)上。由于從理論上講,精簡(jiǎn)指令集(RISC)微處理器更為簡(jiǎn)單而且速度較其它類(lèi)型處理器更快,所以利用仿真軟件執(zhí)行目標(biāo)程序的主計(jì)算機(jī)都采用RISC微處理器。
但是即使利用仿真器軟件的RISC計(jì)算機(jī)系統(tǒng)能夠運(yùn)行X86(或其它)程序,它們的運(yùn)行速度通常也明顯慢于X86計(jì)算機(jī)系統(tǒng)運(yùn)行同一程序的速度。而且這些仿真器程序常常無(wú)法運(yùn)行所有或大量現(xiàn)有的目標(biāo)程序。
仿真器程序無(wú)法象目標(biāo)微處理器那樣快地運(yùn)行目標(biāo)程序的原因相當(dāng)復(fù)雜并且需要對(duì)不同的仿真操作有所了解。

圖1包括一系列的示意圖,它們表示不同類(lèi)型微處理器執(zhí)行目標(biāo)應(yīng)用程序的方式。
在圖1(a)中,諸如Intel X86微處理器之類(lèi)的典型CISC微處理器運(yùn)行著設(shè)計(jì)在目標(biāo)微處理器運(yùn)行的目標(biāo)應(yīng)用程序。如圖所示,應(yīng)用程序運(yùn)行在利用CISC操作系統(tǒng)(例如X86計(jì)算機(jī)使用的MS DOS、Windows3.1、Windows NT和OS/2)的CISC處理器上,這些操作系統(tǒng)提供了訪(fǎng)問(wèn)計(jì)算機(jī)硬件的接口。典型情況是選擇應(yīng)用程序的指令,只通過(guò)操作系統(tǒng)提供的訪(fǎng)問(wèn)使用計(jì)算機(jī)設(shè)備。因此操作系統(tǒng)處理允許應(yīng)用程序訪(fǎng)問(wèn)計(jì)算機(jī)存儲(chǔ)器和各種輸入/輸出設(shè)備的操作。目標(biāo)計(jì)算機(jī)包含能夠被操作系統(tǒng)識(shí)別的存儲(chǔ)器和硬件,并且目標(biāo)應(yīng)用程序?qū)Σ僮飨到y(tǒng)的調(diào)用使操作系統(tǒng)設(shè)備驅(qū)動(dòng)程序在目標(biāo)計(jì)算機(jī)定義的設(shè)備上產(chǎn)生預(yù)期的操作。應(yīng)用程序的指令在處理器上執(zhí)行,它們被變換為可以被處理器執(zhí)行的操作,這些操作由微代碼或匯編為微代碼的更加基本的操作具體實(shí)現(xiàn)。如上所述,每次執(zhí)行復(fù)雜的目標(biāo)指令時(shí),指令都調(diào)用以微代碼(或同一基本操作組)形式存儲(chǔ)的同一子程序。執(zhí)行的總是同一子程序。如果處理器是超標(biāo)量的,則執(zhí)行目標(biāo)指令的這些基本操作常??梢员惶幚砥饕陨鲜龇绞?,利用各種處理通道進(jìn)行重新排序、重新安排和執(zhí)行;但是子程序仍然被提取和執(zhí)行。
在圖1(b)中,諸如用于蘋(píng)果Macintosh計(jì)算機(jī)中的PowerPC之類(lèi)的典型RISC微處理器運(yùn)行著針對(duì)圖1(a)CISC處理器運(yùn)行設(shè)計(jì)的同一目標(biāo)應(yīng)用程序。如圖所示,目標(biāo)應(yīng)用程序至少借助部分目標(biāo)操作系統(tǒng)運(yùn)行于主處理器上以響應(yīng)目標(biāo)應(yīng)用程序生成的一部分調(diào)用。典型的是對(duì)目標(biāo)操作系統(tǒng)應(yīng)用類(lèi)部分的調(diào)用,用來(lái)在顯示器上提供圖形接口和通常是應(yīng)用類(lèi)程序的小型工具程序。目標(biāo)應(yīng)用程序和目標(biāo)操作系統(tǒng)的這些部分由諸如SoftPC之類(lèi)的軟件仿真器變換,它將目標(biāo)應(yīng)用程序和應(yīng)用類(lèi)目標(biāo)操作系統(tǒng)配備的指令分解為主處理器及其主操作系統(tǒng)能夠執(zhí)行的指令。主操作系統(tǒng)提供了訪(fǎng)問(wèn)RISC計(jì)算機(jī)的存儲(chǔ)器和輸入/輸出硬件的接口。
但是主RISC處理器及其RISC計(jì)算機(jī)中相關(guān)的硬件設(shè)備通常與這樣一些設(shè)備有相當(dāng)大的差異,它們與針對(duì)目標(biāo)應(yīng)用程序而設(shè)計(jì)的處理器相關(guān);并且目標(biāo)應(yīng)用程序提供的各種指令被設(shè)計(jì)為使目標(biāo)操作系統(tǒng)的設(shè)備驅(qū)動(dòng)程序在訪(fǎng)問(wèn)目標(biāo)計(jì)算機(jī)各部分時(shí)協(xié)同工作。因此對(duì)于將目標(biāo)應(yīng)用程序指令變換為主操作系統(tǒng)能夠利用的基本主指令的仿真程序而言,它必須在某種程度上將操縱目標(biāo)計(jì)算機(jī)內(nèi)硬件設(shè)備的操作與主系統(tǒng)硬件設(shè)備能夠?qū)崿F(xiàn)的操作聯(lián)系起來(lái)。由于目標(biāo)設(shè)備并不等同于主計(jì)算機(jī)的設(shè)備,所以通常需要由仿真器軟件生成響應(yīng)目標(biāo)應(yīng)用程序指令的虛擬設(shè)備來(lái)完成主系統(tǒng)無(wú)法實(shí)現(xiàn)的操作。有時(shí)候仿真器需要通過(guò)主操作系統(tǒng)生成從這些虛擬設(shè)備至主硬件設(shè)備的鏈接,這些主硬件設(shè)備雖然是真實(shí)存在,但是要由主操作系統(tǒng)按照不同的方式尋址。
由于眾多的原因,以這種方式運(yùn)行的目標(biāo)程序速度較慢。首先,來(lái)自目標(biāo)應(yīng)用程序和目標(biāo)操作系統(tǒng)的每條目標(biāo)指令都必須由仿真器變換為主處理器使用的主基本功能。如果目標(biāo)應(yīng)用程序是針對(duì)諸如X86之類(lèi)的CSIC機(jī)而設(shè)計(jì)的,則目標(biāo)指令是變長(zhǎng)度的并且相當(dāng)復(fù)雜,因此將它們變換為主基本指令就相當(dāng)費(fèi)事。源目標(biāo)指令首先被譯碼,并確定構(gòu)成目標(biāo)指令的主基本指令序列。隨后確定每串基本主指令序列的地址,提取每串基本主指令序列,并按照順序或者不按照順序執(zhí)行這些基本主指令。每次執(zhí)行指令時(shí)都必須由仿真器將目標(biāo)應(yīng)用程序和操作系統(tǒng)指令變換為主處理器理解的主指令,這需要大量額外的步驟,因此減慢了仿真處理的速度。
其次,許多目標(biāo)指令與由特定硬件設(shè)備執(zhí)行操作有關(guān),這些特定硬件設(shè)備在目標(biāo)計(jì)算機(jī)中起著特殊的作用,但在主計(jì)算機(jī)中卻不存在。為了執(zhí)行該類(lèi)操作,仿真軟件必須通過(guò)已有的主操作系統(tǒng)與主計(jì)算機(jī)的硬件設(shè)備實(shí)現(xiàn)軟件連接或者配備一臺(tái)虛擬硬件設(shè)備。用軟件仿真另一種計(jì)算機(jī)硬件是非常困難的。仿真軟件必須生成各種目標(biāo)應(yīng)用調(diào)用實(shí)際主操作系統(tǒng)的虛擬設(shè)備;并且每臺(tái)虛擬設(shè)備都必須向?qū)嶋H主設(shè)備提供調(diào)用。硬件設(shè)備仿真要求在目標(biāo)指令使用設(shè)備時(shí)從存儲(chǔ)器中提取表示指令所需虛擬設(shè)備代碼并進(jìn)行運(yùn)行以實(shí)現(xiàn)設(shè)備功能。解決問(wèn)題的這些方法在執(zhí)行指令序列時(shí)都額外增加了一系列的操作。
仿真問(wèn)題的復(fù)雜化是目標(biāo)應(yīng)用要解決各種意外事件的結(jié)果,為了使計(jì)算機(jī)系統(tǒng)運(yùn)行,目標(biāo)計(jì)算機(jī)的硬件和目標(biāo)操作系統(tǒng)要對(duì)這些意外事件作出處理。當(dāng)處理目標(biāo)計(jì)算機(jī)運(yùn)行期間的意外事件時(shí),一般必須通過(guò)調(diào)用微代碼序列完成保存發(fā)生意外事件時(shí)刻計(jì)算機(jī)狀態(tài)的操作,必須檢索正確的意外事件句柄(handle),必須妥善發(fā)生意外事件,并且必須找到程序繼續(xù)運(yùn)行下去的正確入口。有時(shí)候這要求程序返回至處理意外事件之處目標(biāo)計(jì)算機(jī)的狀態(tài),而其它時(shí)候進(jìn)入意外事件句柄提供的轉(zhuǎn)移。在任一情況下,都必須在某種程度上對(duì)完成這些操作所需的目標(biāo)計(jì)算機(jī)硬件和軟件進(jìn)行仿真。由于必須在發(fā)生意外事件時(shí)可以得到正確的目標(biāo)狀態(tài)以供適當(dāng)執(zhí)行,仿真器必須始終精確跟蹤該狀態(tài)以準(zhǔn)確響應(yīng)這些意外事件。在現(xiàn)有技術(shù)中,這要求每條指令的執(zhí)行必須按照目標(biāo)應(yīng)用程序提供的順序,因?yàn)橹挥羞@種方式能夠保持正確的目標(biāo)狀態(tài)。
而且現(xiàn)有技術(shù)的仿真器出于其它原因,總是需要保持目標(biāo)應(yīng)用程序的執(zhí)行順序。目標(biāo)指令可以有兩種,一種作用于存儲(chǔ)器而另一種作用于存儲(chǔ)器映射的輸入/輸出(I/O)設(shè)備。如果不執(zhí)行指令是無(wú)法知道操作是作用于存儲(chǔ)器還是存儲(chǔ)器映射I/O設(shè)備的。當(dāng)指令在存儲(chǔ)器上運(yùn)行時(shí),可以作優(yōu)化和重新排序并且這大大有助于提高系統(tǒng)運(yùn)行速度。但是作用于I/O設(shè)備的操作常常必須按照精確的順序進(jìn)行,這些操作必須按照該順序編程而不能省略任何步驟,否則可能對(duì)I/O設(shè)備的操作產(chǎn)生一些不利的影響。例如特殊的I/O操作可能會(huì)清除I/O寄存器的內(nèi)容。如果操作不按照順序進(jìn)行從而清除了寄存器內(nèi)仍然需要的值,則操作結(jié)果可能不同于目標(biāo)指令所命令的那樣。如果沒(méi)有區(qū)分存儲(chǔ)器和存儲(chǔ)器映射I/O的裝置,就需要將所有的指令都象處理作用于存儲(chǔ)器映射I/O的指令那樣處理。這大大限制了優(yōu)化所能達(dá)到的性能。由于現(xiàn)有技術(shù)的仿真器缺少檢測(cè)被尋址存儲(chǔ)器性質(zhì)的裝置和從這類(lèi)故障恢復(fù)的裝置,所以需要順序處理目標(biāo)指令,就好象每條指令都作用于存儲(chǔ)器映射I/O那樣。這極大地制約了主指令的優(yōu)化的可能性。
另一個(gè)限制現(xiàn)有技術(shù)仿真器優(yōu)化主代碼能力的問(wèn)題源于自修改代碼。如果目標(biāo)指令被變換為主指令序列,而主指令序列又被回寫(xiě)從而改變了源目標(biāo)指令,則主指令不再有效。結(jié)果仿真器必須始終作檢驗(yàn)以確定是否有目標(biāo)代碼區(qū)域的存儲(chǔ)。所有這些問(wèn)題都使這種類(lèi)型的仿真比在目標(biāo)處理器上運(yùn)行目標(biāo)應(yīng)用程序慢得多。
圖1(b)所示另一種類(lèi)型的仿真軟件實(shí)例在題為“Talisman快速而精確的多計(jì)算機(jī)模擬”(R.C.Bedichek,麻省理工學(xué)院計(jì)算機(jī)科學(xué)實(shí)驗(yàn)室)的文章中有所論述。這是更為完整的轉(zhuǎn)換實(shí)例,它可以仿真完整的研究系統(tǒng)并運(yùn)行研究目標(biāo)操作系統(tǒng)。Talisman采用主UNIX操作系統(tǒng)。
在圖1(c)中示出了另一種仿真實(shí)例。在該實(shí)例中,用于蘋(píng)果Macintosh計(jì)算機(jī)的PowerPC微處理器正在運(yùn)行針對(duì)莫托羅拉68000系列CISC處理器設(shè)計(jì)的目標(biāo)應(yīng)用程序,后者用于早期的Macintosh計(jì)算機(jī);這樣做的目的是為了使蘋(píng)果原有的程序能夠在帶RISC處理器的Macintosh計(jì)算機(jī)上運(yùn)行。顯而易見(jiàn),目標(biāo)應(yīng)用程序至少借助部分目標(biāo)操作系統(tǒng)運(yùn)行于主處理器上以響應(yīng)目標(biāo)操作系統(tǒng)應(yīng)用類(lèi)部分的調(diào)用。軟件仿真器將目標(biāo)應(yīng)用程序和應(yīng)用類(lèi)目標(biāo)操作系統(tǒng)程序配備的指令分解為主處理器及其主操作系統(tǒng)能夠執(zhí)行的指令。主操作系統(tǒng)提供了訪(fǎng)問(wèn)主計(jì)算機(jī)的存儲(chǔ)器和輸入/輸出硬件的接口。
但是主RISC處理器及其主RISC計(jì)算機(jī)中相關(guān)的硬件設(shè)備與配備莫托羅拉CISC處理器的設(shè)備有相當(dāng)大的差異;并且各種目標(biāo)指令被設(shè)計(jì)為在訪(fǎng)問(wèn)目標(biāo)計(jì)算機(jī)各部分時(shí)與目標(biāo)CSIC操作系統(tǒng)協(xié)同工作。因此仿真程序必須將操縱目標(biāo)計(jì)算機(jī)內(nèi)硬件設(shè)備的操作與主系統(tǒng)硬件設(shè)備能夠?qū)崿F(xiàn)的操作聯(lián)系起來(lái)。這需要由仿真器生成響應(yīng)目標(biāo)應(yīng)用程序指令的軟件虛擬設(shè)備并通過(guò)主操作系統(tǒng)生成從這些虛擬設(shè)備至主硬件設(shè)備的鏈接,這些主硬件設(shè)備雖然是真實(shí)存在,但是要由主操作系統(tǒng)按照不同的方式尋址。
由于與圖1(b)仿真同樣的原因,以這種方式運(yùn)行的目標(biāo)程序運(yùn)行速度較慢。首先,來(lái)自目標(biāo)應(yīng)用程序和目標(biāo)操作系統(tǒng)的每條目標(biāo)指令都必須經(jīng)過(guò)指令提取才能變換;并且每次執(zhí)行指令時(shí)從該指令導(dǎo)出的所有主基本功能都必須按照順序運(yùn)行。其次,仿真軟件必須生成每個(gè)目標(biāo)應(yīng)用程序調(diào)用主操作系統(tǒng)的虛擬設(shè)備;并且每臺(tái)虛擬設(shè)備都必須向?qū)嶋H主設(shè)備提供調(diào)用。第三,仿真器必須象處理直接作用于存儲(chǔ)器映射I/O設(shè)備的指令那樣保守地處理所有指令,否則就有發(fā)生無(wú)法恢復(fù)的意外事件的危險(xiǎn)。最后,仿真器必須始終保持正確的目標(biāo)狀態(tài)并總是要在確定是否存儲(chǔ)目標(biāo)代碼區(qū)域之前檢查存儲(chǔ)操作。所有這些要求都削弱了仿真器對(duì)運(yùn)行在主處理器上代碼作重大優(yōu)化的能力并且使這種仿真的速度遠(yuǎn)遠(yuǎn)慢于目標(biāo)應(yīng)用程序在目標(biāo)處理器上的運(yùn)行速度。在非常樂(lè)觀的情況估計(jì)仿真速度也要低于現(xiàn)有處理器的四分之一。通常情況下,這種仿真軟件在能夠運(yùn)行為另一種處理器設(shè)計(jì)的應(yīng)用程序的能力只是有用而非基本用途的情況下,很難找到它的使用價(jià)值。
在圖1(d)中示出一種在主處理器上仿真目標(biāo)應(yīng)用程序的特殊方法,它為非常少數(shù)的一系列目標(biāo)應(yīng)用程序提供了較好的性能。目標(biāo)應(yīng)用程序?yàn)榉抡嫫魈峁┲噶?,該仿真器將這些指令變換為主處理器和主操作系統(tǒng)的指令。主處理器為數(shù)字設(shè)備公司的Alpha RISC處理器,而主操作系統(tǒng)為微軟的NT。只能在這種系統(tǒng)上運(yùn)行的目標(biāo)應(yīng)用程序是為采用Windows WIN32s兼容操作系統(tǒng)的目標(biāo)X86處理器而設(shè)計(jì)的32位應(yīng)用程序。由于主操作系統(tǒng)和目標(biāo)操作系統(tǒng)幾乎是相同的,它們?cè)O(shè)計(jì)成處理相同的指令,所以仿真器軟件可以非常方便地變換指令。而且主操作系統(tǒng)也已設(shè)計(jì)為響應(yīng)目標(biāo)應(yīng)用程序產(chǎn)生的相同調(diào)用,所以生成的虛擬設(shè)備數(shù)量大大減少。
雖然在技術(shù)上它是一種使目標(biāo)應(yīng)用程序運(yùn)行于主處理器上的仿真系統(tǒng),但卻是一種非常特殊的情況。在這種情況下仿真軟件運(yùn)行于已經(jīng)為運(yùn)行相似應(yīng)用程序而設(shè)計(jì)好的主操作系統(tǒng)上。它使得來(lái)自目標(biāo)應(yīng)用程序的調(diào)用能夠更為簡(jiǎn)單地指向主處理器和主操作系統(tǒng)正確的設(shè)備。更為重要的是,該系統(tǒng)只能運(yùn)行32位Windows應(yīng)用程序,其在所有X86應(yīng)用程序中所占的數(shù)量不到1%。而且該系統(tǒng)只能在一種操作系統(tǒng)上,即Windows NT上運(yùn)行應(yīng)用程序;而X86處理器可運(yùn)行針對(duì)大量操作系統(tǒng)而設(shè)計(jì)的應(yīng)用程序。因此就本說(shuō)明書(shū)前面所表述的含義而言,這樣的系統(tǒng)不具備兼容性。因此運(yùn)行這類(lèi)仿真器的處理器是不能認(rèn)為是富有競(jìng)爭(zhēng)力的X86處理器。
在圖1(e)中示出另一種仿真方法,它利用軟件在識(shí)別不同指令集的計(jì)算機(jī)上運(yùn)行為第一指令集編寫(xiě)的應(yīng)用程序部分。這種形式的仿真軟件一般由程序員使用,他們將一個(gè)應(yīng)用程序從一種計(jì)算機(jī)系統(tǒng)移植到另一種計(jì)算機(jī)系統(tǒng)上。典型的情況是目標(biāo)應(yīng)用程序針對(duì)除運(yùn)行仿真器的主機(jī)以外的一些目標(biāo)計(jì)算機(jī)而設(shè)計(jì)。仿真器軟件分析目標(biāo)指令,將這些指令翻譯為可以在主機(jī)上運(yùn)行的指令,并且將這些主指令存入高速緩沖存儲(chǔ)器內(nèi)供再次使用。這種動(dòng)態(tài)翻譯和高速緩存可以使應(yīng)用程序部分運(yùn)行得非???。這種形式的仿真器一般與軟件跟蹤工具一起使用,該工具提供了正在運(yùn)行的目標(biāo)程序詳細(xì)的運(yùn)行信息。跟蹤工具的輸出又被用來(lái)啟動(dòng)分析程序,對(duì)跟蹤信息進(jìn)行分析。
為了確定代碼實(shí)際上是如何工作的,這種類(lèi)型的仿真器與主機(jī)上的主操作系統(tǒng)協(xié)同運(yùn)行,配備了主操作系統(tǒng)未提供的虛擬硬件,并且將設(shè)計(jì)應(yīng)用軟件的計(jì)算機(jī)的操作映射到主機(jī)硬件資源以執(zhí)行正在運(yùn)行的程序的操作。這種硬件的軟件虛擬化和對(duì)主計(jì)算機(jī)的映射可能非常慢并且很不完善。
而且由于常常需要多條主指令執(zhí)行一條目標(biāo)指令,所以可能產(chǎn)生包括故障和陷井在內(nèi)的意外事件,這需要目標(biāo)操作系統(tǒng)的意外事件句柄,并且使主機(jī)在與目標(biāo)指令邊界無(wú)關(guān)的位置上中止處理主指令。當(dāng)發(fā)生這種情況時(shí),由于主處理器和存儲(chǔ)器的狀態(tài)不正確,所以無(wú)法正確處理意外事件。如果出現(xiàn)這種情況,仿真器必須停止運(yùn)行并重新運(yùn)行并返回跟蹤產(chǎn)生意外事件的操作。因此雖然這種仿真器能夠非??斓剡\(yùn)行目標(biāo)代碼序列,但是卻沒(méi)有辦法從這些意外事件中恢復(fù)過(guò)來(lái),因此無(wú)法快速運(yùn)行應(yīng)用程序中任何相當(dāng)大的一塊。
由于仿真器、跟蹤器和相關(guān)的分析器所完成的功能是直接產(chǎn)生新的程序或者將舊程序移植到另一種機(jī)器上,因而就仿真器軟件運(yùn)行速度而言很少有定論,因此這不是這種形式仿真器固有的問(wèn)題。即,程序員通常對(duì)仿真器生成的代碼在主機(jī)上運(yùn)行得有多快并不感興趣,他們感興趣的是仿真器是否能生成可在為其設(shè)計(jì)的機(jī)器上執(zhí)行并在該機(jī)器上運(yùn)行快速的代碼。因此除了編程目的以外,這種類(lèi)型的仿真軟件不能提供使第一指令集編寫(xiě)的應(yīng)用程序能運(yùn)行在不同類(lèi)型的微處理器上的方法。這種仿真軟件的實(shí)例在題為“ShadeA Fast Instruction-Set Simulatorfor Execution Profiling”(Cmelik和Keppel)的文章中有所論及。
因此需要提供一種具有競(jìng)爭(zhēng)力的微處理器,它比現(xiàn)有技術(shù)的微處理器更快更便宜,但是又與為現(xiàn)有技術(shù)微處理器運(yùn)行各種可用操作系統(tǒng)而設(shè)計(jì)的目標(biāo)應(yīng)用程序完全兼容。
具體而言需要提供一種主處理器,它包含提高處理器功能速度的電路系統(tǒng)。

發(fā)明內(nèi)容
因此本發(fā)明的目標(biāo)是借助加速程序執(zhí)行的裝置提高微處理器的運(yùn)算速度。
在實(shí)現(xiàn)本發(fā)明各種目標(biāo)的裝置和方法中,將已經(jīng)按照經(jīng)常使用的存儲(chǔ)器地址存儲(chǔ)的數(shù)據(jù)存儲(chǔ)在屬于主處理器的寄存器內(nèi)從而在訪(fǎng)問(wèn)存儲(chǔ)器地址時(shí)處理器能更迅速地作出響應(yīng)。
通過(guò)以下附圖對(duì)本發(fā)明的詳細(xì)描述可以更好地理解本發(fā)明的各種目標(biāo)和特點(diǎn),在附圖中相同的單元采用相同的標(biāo)記。
附圖的簡(jiǎn)要說(shuō)明圖1(a)-(e)為按照現(xiàn)有技術(shù)設(shè)計(jì)的微處理器操作方式的示意圖。
圖2為按照本發(fā)明設(shè)計(jì)的微處理器的框圖,該處理器可運(yùn)行針對(duì)不同微處理器設(shè)計(jì)的應(yīng)用程序。
圖3為圖2所示微處理器某一部分的示意圖。
圖4為寄存器文件的框圖,該寄存器文件在按照本發(fā)明設(shè)計(jì)的微處理器中使用。
圖5為按照本發(fā)明設(shè)計(jì)的門(mén)控存儲(chǔ)緩沖器的框圖。
圖6(a)-(c)示出了用于現(xiàn)有技術(shù)各種微處理器和按照本發(fā)明設(shè)計(jì)的微處理器的指令。
圖7示出了按照本發(fā)明設(shè)計(jì)的微處理器軟件部分實(shí)現(xiàn)的方法。
圖8示出了按照本發(fā)明設(shè)計(jì)的微處理器軟件部分實(shí)現(xiàn)的另一種方法。
圖9為改進(jìn)的計(jì)算機(jī)系統(tǒng)的框圖,它包含了本發(fā)明。
圖10為圖3所示微處理器某一部分的框圖。
圖11為圖3微處理器中翻譯查找旁路緩沖器的更為詳細(xì)的框圖。
圖12為按照本發(fā)明的存儲(chǔ)器別名電路系統(tǒng)的框圖。
記號(hào)和術(shù)語(yǔ)以下某些詳細(xì)描述部分將借助對(duì)計(jì)算機(jī)存儲(chǔ)器內(nèi)數(shù)據(jù)位操作所作的符號(hào)化表示。這些描述和表達(dá)形式是數(shù)據(jù)處理領(lǐng)域內(nèi)技術(shù)人員向同行表述其工作內(nèi)容最為有效的方式。這些操作需要對(duì)物理量施行物理操作。雖然并非必要,但是通常情況下這些物理量采用可以存儲(chǔ)、轉(zhuǎn)換、組合、比較和其他處理方式的電學(xué)或磁學(xué)信號(hào)形式。為方便起見(jiàn),主要是通用的原因,這些信號(hào)被稱(chēng)為位、值、元素、符號(hào)、字符、項(xiàng)、數(shù)字等。但是應(yīng)該認(rèn)識(shí)到,所有這些以及相似的術(shù)語(yǔ)都與合適的物理量相聯(lián)系并且僅僅是為方便表示這些物理量而采用的標(biāo)記。
所完成的控制通常用諸如加法或比較之類(lèi)的術(shù)語(yǔ)表示,它們一般與人類(lèi)的智力活動(dòng)有聯(lián)系。在構(gòu)成本發(fā)明的大多數(shù)操作中,人類(lèi)的這種能力并不是必不可少或需要的;這些操作是機(jī)器操作。完成本發(fā)明操作的有用機(jī)器包括通用數(shù)字計(jì)算機(jī)或其它類(lèi)似設(shè)備。在所有情況下,操縱計(jì)算機(jī)的操作方法與計(jì)算方法本身之間應(yīng)視為是有區(qū)別的。本發(fā)明涉及操作計(jì)算機(jī)的方法和裝置,這種計(jì)算機(jī)處理電學(xué)或其它(例如機(jī)械、化學(xué))物理信號(hào)以生成其它所需的物理信號(hào)。
在下面的描述中,由于大多數(shù)的仿真器都運(yùn)行X86應(yīng)用程序,所以為了舉例說(shuō)明操作細(xì)節(jié),在某些情況下將目標(biāo)程序看作為在X86微處理器上執(zhí)行的程序。但是目標(biāo)程序可以為在任意目標(biāo)計(jì)算機(jī)系列上運(yùn)行而設(shè)計(jì)。它們包括目標(biāo)虛擬計(jì)算機(jī),例如Pcode機(jī)、Postscript機(jī)或者Java虛擬機(jī)。
實(shí)施發(fā)明的較佳方式本發(fā)明有助于克服現(xiàn)有技術(shù)存在的問(wèn)題并且提供了一種速度比現(xiàn)有技術(shù)更快的微處理器,它能夠運(yùn)行所有(大量現(xiàn)有技術(shù)微處理器都可以運(yùn)行的)操作系統(tǒng)下的所有軟件,但是價(jià)格又低于現(xiàn)有技術(shù)的微處理器。
與采用更為復(fù)雜的硬件加快運(yùn)算速度的做法不同,本發(fā)明一方面采用結(jié)構(gòu)比現(xiàn)有技術(shù)微處理器簡(jiǎn)單得多的增強(qiáng)硬件處理部分(在本說(shuō)明書(shū)中稱(chēng)為“詞態(tài)(主機(jī)(morph host)”),另一方面采用一種仿真軟件(稱(chēng)為“代碼詞態(tài)化軟件(code morpgingsoftware”),二者結(jié)合成為比已知的競(jìng)爭(zhēng)性微處理器功能更強(qiáng)大的微處理器。具體而言,詞態(tài)主機(jī)是一種包含硬件增強(qiáng)的處理器,當(dāng)發(fā)生意外事件或者錯(cuò)誤時(shí)它立即恢復(fù)為目標(biāo)計(jì)算機(jī)的狀態(tài),而代碼詞態(tài)化軟件將目標(biāo)程序的指令翻譯為詞態(tài)主機(jī)的詞態(tài)主機(jī)指令,并在需要時(shí)用正確的目標(biāo)狀態(tài)代替工作狀態(tài)以響應(yīng)意外事件或錯(cuò)誤,從而進(jìn)行正確的重新翻譯。代碼詞態(tài)化軟件也可以包括提高處理速度的各種進(jìn)程。與所有速度極快的現(xiàn)有技術(shù)微處理器通過(guò)提供硬件來(lái)提高處理速度的做法不同,改進(jìn)的微處理器借助代碼詞態(tài)化軟件在可以選擇的階段運(yùn)用加速增強(qiáng)技術(shù)。假定在代碼詞態(tài)化軟件中運(yùn)用提速技術(shù)使得可以采用復(fù)雜程度較低但運(yùn)行速度比現(xiàn)有技術(shù)微處理器更快而價(jià)格大為降低的硬件實(shí)現(xiàn)詞態(tài)主機(jī)。作為比較,在一個(gè)用包含Pentium Pro微處理器四分之一數(shù)量門(mén)電路的詞態(tài)主機(jī)實(shí)現(xiàn)的本發(fā)明實(shí)施例中,運(yùn)行X86應(yīng)用程序的速度要快于Pentium Pro微處理器或者其它能夠處理這類(lèi)應(yīng)用程序的已知微處理器。
代碼詞態(tài)化軟件采用了某些技術(shù),這些技術(shù)以前只是由程序員在設(shè)計(jì)新軟件或仿真新硬件時(shí)采用過(guò)。詞態(tài)主機(jī)包含硬件增強(qiáng)部分,它特別適合于充分利用代碼詞態(tài)化軟件提供的加速技術(shù)。這些硬件增強(qiáng)部分允許代碼詞態(tài)化軟件在更寬的指令范圍內(nèi)實(shí)現(xiàn)加速技術(shù)。這些硬件增強(qiáng)部分還允許代碼詞態(tài)化軟件實(shí)現(xiàn)其它加速技術(shù),這些技術(shù)在硬件處理器中不具備,且無(wú)法在硬件處理器內(nèi)應(yīng)用,除非花費(fèi)巨額的代價(jià)。與現(xiàn)有技術(shù)微處理器執(zhí)行本有的指令集的情形相比,這些技術(shù)明顯提高了包含本發(fā)明的微處理器的速度。
例如,與增強(qiáng)型詞態(tài)主機(jī)結(jié)合的代碼詞態(tài)化軟件可以采用重新排列與重新安排由目標(biāo)指令序列生成的基本指令的技術(shù)而無(wú)需增加太多的電路。由于可以一起重新排序與重新安排大量目標(biāo)指令,所以可以采用其它的優(yōu)化技術(shù)來(lái)減少處理器執(zhí)行目標(biāo)指令組所需的步驟數(shù),使其少于其它運(yùn)行目標(biāo)應(yīng)用程序的微處理器所需的步驟數(shù)。
與增強(qiáng)型詞態(tài)主機(jī)組合起來(lái)的代碼詞態(tài)化軟件快速將目標(biāo)指令翻譯為詞態(tài)主機(jī)的指令并且將這些主指令高速緩存入存儲(chǔ)器數(shù)據(jù)結(jié)構(gòu)(在本說(shuō)明書(shū)中稱(chēng)為“翻譯緩沖器”)。使用保存翻譯指令的翻譯緩沖器可以再次調(diào)用指令而無(wú)需在每次執(zhí)行每條目標(biāo)指令時(shí),重新運(yùn)行冗長(zhǎng)的進(jìn)程,確定需要哪一條基本指令來(lái)實(shí)現(xiàn)每條目標(biāo)指令,對(duì)每條基本指令作尋址、提取、優(yōu)化基本指令序列,為每條基本指令分配資源,進(jìn)行重新排序并執(zhí)行每一基本指令序列的每個(gè)步驟。目標(biāo)指令一旦被翻譯出來(lái),它就可以從翻譯緩沖器內(nèi)再次調(diào)用并執(zhí)行而無(wú)需再三重復(fù)這些步驟。
現(xiàn)有仿真技術(shù)的主要問(wèn)題是無(wú)法高性能地處理目標(biāo)程序執(zhí)行期間產(chǎn)生的意外事件。如果在運(yùn)行直接指向目標(biāo)操作系統(tǒng)的目標(biāo)應(yīng)用程序時(shí)產(chǎn)生意外事件,情況更是如此,此時(shí)為了正確處理意外事件和執(zhí)行隨后的指令,必須有發(fā)生意外事件時(shí)正確的目標(biāo)狀態(tài)供使用。因此仿真器被迫始終精確跟蹤目標(biāo)狀態(tài)并一直進(jìn)行檢查,以確定是否存儲(chǔ)到目標(biāo)代碼區(qū)域。其它意外事件也會(huì)帶來(lái)類(lèi)似的問(wèn)題。例如仿真器檢測(cè)到已經(jīng)被一些特定主功能替代的特定目標(biāo)操作也可能產(chǎn)生意外事件。特別是目標(biāo)處理器的各種硬件操作可以由仿真器軟件提供的軟件操作代替。此外,執(zhí)行由目標(biāo)指令導(dǎo)出的主指令的主處理器也可能產(chǎn)生意外事件。所有這些意外事件都有可能在仿真器試圖將目標(biāo)指令變換為主指令時(shí)或者在主處理器上執(zhí)行主翻譯時(shí)發(fā)生。高效的仿真必須提供一些從這些意外事件有效恢復(fù)的方式并且能夠正確處理意外事件?,F(xiàn)有技術(shù)均無(wú)法對(duì)所有被仿真的軟件做到這一點(diǎn)。
為了克服現(xiàn)有技術(shù)的這些不足,在增強(qiáng)型詞態(tài)主機(jī)中作了大量的硬件改進(jìn)。這些改進(jìn)包括門(mén)控(gated)存儲(chǔ)緩沖器和許多新增加的處理器寄存器。新增的其中一些寄存器可以重新命名以緩解需要同一硬件資源指令的問(wèn)題。新增的寄存器還可以維護(hù)一組處理主指令的主機(jī)或工作寄存器和一組保存目標(biāo)處理器(它被用于目標(biāo)應(yīng)用程序的生成)正式狀態(tài)的目標(biāo)寄存器。目標(biāo)(或屏蔽)寄存器通過(guò)專(zhuān)用接口與與其等價(jià)的工作寄存器相連,專(zhuān)用接口使得稱(chēng)為“調(diào)撥”的操作將所有工作寄存器的內(nèi)容快速傳遞至正式目標(biāo)寄存器,并使得稱(chēng)為“返還”的操作將所有正式目標(biāo)寄存器的內(nèi)容快速返回到與其等價(jià)的工作寄存器。門(mén)控存儲(chǔ)緩沖器存儲(chǔ)硬件“門(mén)電路”“未調(diào)撥”一側(cè)的工作存儲(chǔ)器狀態(tài)變化,和硬件門(mén)電路“調(diào)撥”一側(cè)的正式存儲(chǔ)器狀態(tài)變化,這些調(diào)撥的存儲(chǔ)結(jié)果“排放”至主存儲(chǔ)器。調(diào)撥操作將門(mén)電路為非調(diào)撥一側(cè)的存儲(chǔ)傳遞至門(mén)電路的調(diào)撥一側(cè)。新增的正式寄存器和門(mén)控存儲(chǔ)緩沖器使存儲(chǔ)器狀態(tài)和目標(biāo)寄存器狀態(tài)在一條或一組目標(biāo)指令被翻譯和運(yùn)行無(wú)誤之后一起更新。
這些更新由代碼詞態(tài)化軟件選擇發(fā)生于完整的目標(biāo)指令邊界。因此,如果構(gòu)成目標(biāo)指令系列翻譯的基本主指令由主處理器運(yùn)行而未發(fā)生意外事件,則這些指令產(chǎn)生存儲(chǔ)器存儲(chǔ)和工作寄存器狀態(tài)被傳遞至正式存儲(chǔ)器和正式目標(biāo)寄存器。這樣,如果意外事件發(fā)生在處理主指令而此時(shí)又不在被翻譯的一條或一組目標(biāo)指令的邊界上時(shí),可以將最近更新(或調(diào)撥)的目標(biāo)寄存器原始狀態(tài)再次調(diào)用至工作寄存器并轉(zhuǎn)儲(chǔ)門(mén)控存儲(chǔ)緩沖器內(nèi)未調(diào)撥的存儲(chǔ)器存儲(chǔ)結(jié)果。如果發(fā)生的意外事件是目標(biāo)意外事件,則可以一次重新翻譯一條引起目標(biāo)意外事件的目標(biāo)指令并象目標(biāo)微處理器執(zhí)行目標(biāo)指令那樣依照順序執(zhí)行目標(biāo)指令。當(dāng)每條目標(biāo)指令被正確無(wú)誤地執(zhí)行時(shí),可以更新目標(biāo)寄存器的狀態(tài);并且存儲(chǔ)緩沖器內(nèi)數(shù)據(jù)向存儲(chǔ)器的傳送受到門(mén)電路的控制。隨后,當(dāng)運(yùn)行主指令時(shí)再次發(fā)生意外事件時(shí),目標(biāo)計(jì)算機(jī)的正確狀態(tài)由詞態(tài)主機(jī)的目標(biāo)寄存器和存儲(chǔ)器保存;并且可以無(wú)延遲地處理操作。由于每條通過(guò)這種糾錯(cuò)翻譯生成的新翻譯結(jié)果是翻譯或者交替轉(zhuǎn)儲(chǔ)(防止一次性或偶爾發(fā)生的諸如頁(yè)面出錯(cuò)事件)完成的,所以可以高速緩存以供后面使用。這使得代碼詞態(tài)化軟件與詞態(tài)主機(jī)組合構(gòu)成的微處理器能夠比原先為其編寫(xiě)軟件的處理器更快地執(zhí)行指令。
應(yīng)該指出的是,在利用本發(fā)明的微處理器執(zhí)行目標(biāo)程序的過(guò)程中,可能會(huì)發(fā)生許多不同類(lèi)型的意外事件,它們需要不同方式處理。例如一些意外事件由產(chǎn)生一件意外事件的目標(biāo)軟件引起,該意外事件使用了目標(biāo)操作系統(tǒng)意外事件句柄。使用這種意外事件句柄要求代碼詞態(tài)化軟件包含仿真整個(gè)意外事件處理進(jìn)程的子程序,包含任何由處理進(jìn)程的目標(biāo)計(jì)算機(jī)提供的硬件。這就需要代碼詞態(tài)化軟件保存目標(biāo)處理器的狀態(tài)從而在處理完意外事件之后繼續(xù)正確執(zhí)行。某些意外事件(例如頁(yè)面出錯(cuò)需要在實(shí)現(xiàn)被翻譯進(jìn)程之前將數(shù)據(jù)送入新的存儲(chǔ)器頁(yè)面中,當(dāng)意外事件處理之后它要求返回至被翻譯進(jìn)程的開(kāi)始之處。其它意外事件實(shí)現(xiàn)了軟件中硬件未提供的特殊操作。這些意外事件都要求意外事件句柄在處理完意外事件之后將操作返回翻譯中的下一步驟。每種不同類(lèi)型的意外事件都可以由本發(fā)明的微處理器有效處理。
此外,有些意外事件由主機(jī)硬件產(chǎn)生并且檢測(cè)各種主機(jī)和目標(biāo)機(jī)狀態(tài)。有些意外事件的表現(xiàn)如同在普通微處理器上一樣,而其它的則被代碼詞態(tài)化軟件用來(lái)檢測(cè)各種預(yù)測(cè)的故障。在這些情況下,采用上述狀態(tài)保存和恢復(fù)機(jī)制的代碼詞態(tài)化軟件將目標(biāo)狀態(tài)恢復(fù)至其最近的正式狀態(tài)并將產(chǎn)生和保存新的翻譯結(jié)果(或者再次使用先前生成的安全的翻譯結(jié)果),這避免了無(wú)效預(yù)測(cè)。隨后執(zhí)行該翻譯結(jié)果。
詞態(tài)主機(jī)包含新增的硬件意外事件檢測(cè)機(jī)構(gòu),它與上述返還和重新翻譯方法結(jié)合可以作進(jìn)一步的優(yōu)化。例如有一種裝置,它將存儲(chǔ)器從存儲(chǔ)器映射I/O區(qū)分開(kāi)來(lái),另有一種裝置,它通過(guò)保護(hù)地址或地址范圍省卻了存儲(chǔ)器參照,由此可以在寄存器內(nèi)保存目標(biāo)變量。
在利用意外事件檢測(cè)其它預(yù)測(cè)失效(例如操作是影響存儲(chǔ)器還是存儲(chǔ)器映射I/O)時(shí),通過(guò)借助不同的存儲(chǔ)器操作和不同的優(yōu)化生成新的翻譯結(jié)果來(lái)完成恢復(fù)工作。
圖2為詞態(tài)主機(jī)硬件的示意圖,它正在運(yùn)行與圖1(a)上CISC處理器相同的應(yīng)用程序。如圖所示,微處理器包含上述代碼詞態(tài)化軟件部分和增強(qiáng)型硬件詞態(tài)主機(jī)部分。目標(biāo)應(yīng)用程序?qū)⒛繕?biāo)指令載入代碼詞態(tài)化軟件以將其翻譯為詞態(tài)主機(jī)能夠執(zhí)行的主機(jī)指令。與此同時(shí),目標(biāo)操作系統(tǒng)接收目標(biāo)應(yīng)用程序的調(diào)用并將調(diào)用轉(zhuǎn)送至代碼詞態(tài)化軟件。在微處理器的較佳實(shí)施例中,詞態(tài)主機(jī)是一種超長(zhǎng)指令字(VLIW)處理器,它設(shè)計(jì)有多條處理通道。圖6(c)示出了這種處理器的總體操作。在圖6(a)-(c)中示出了適用于CISC處理器、RISC處理器和VLIW處理器的指令。顯然CISC指令是變長(zhǎng)度的并且可以包含多條更基本的操作(例如加載和相加)。另一方面,RISC指令是等長(zhǎng)度的并且主要是基本操作。圖示的VLIW處理器的一條超長(zhǎng)指令包括CISC和RISC指定的每個(gè)更為基本的操作(例如加載、存儲(chǔ)、整數(shù)相加、比較、浮點(diǎn)乘法和轉(zhuǎn)移)和。如圖6(c)所示,一起構(gòu)成一條超長(zhǎng)指令字的每條基本指令與其它基本指令并行地載入VLIW處理器其中一條處理通道或者存儲(chǔ)器內(nèi)以供處理通道和存儲(chǔ)器并行處理。并行操作的所有結(jié)果都被轉(zhuǎn)送至多端口寄存器文件。
可作為詞態(tài)主機(jī)基礎(chǔ)的VLIW處理器在結(jié)構(gòu)上比上述其它處理器簡(jiǎn)單得多。它不包含檢測(cè)結(jié)果依存性的電路或者重新排序、優(yōu)化和重新安排基本指令的電路。與運(yùn)行原先為其設(shè)計(jì)目標(biāo)應(yīng)用程序的處理器或者利用仿真程序運(yùn)行目標(biāo)應(yīng)用程序的其它處理器相比,這使得可以在較高的時(shí)鐘頻率有更快的處理速度。但是這并不局限于VLIW處理器,諸如RISC處理器之類(lèi)的任意類(lèi)型處理器都可以實(shí)現(xiàn)同樣的效果。
圖2所示微處理器的代碼詞態(tài)化軟件包括翻譯機(jī)部分,它對(duì)目標(biāo)應(yīng)用程序的指令進(jìn)行譯碼,將目標(biāo)指令轉(zhuǎn)換為詞態(tài)主機(jī)能夠執(zhí)行的基本主指令,優(yōu)化目標(biāo)指令所需的操作,將基本指令重新排序和重新安排為詞態(tài)主機(jī)的VLIW指令(翻譯)并執(zhí)行主VLIW指令。圖7為翻譯機(jī)操作示意圖,它示出了代碼詞態(tài)化軟件主循環(huán)操作。
為了加速包含代碼詞態(tài)化軟件和增強(qiáng)詞態(tài)主硬件的微處理器的運(yùn)行速度,如圖2所示,代碼詞態(tài)化軟件包含翻譯緩沖器。一個(gè)實(shí)施例的翻譯緩沖器是一種可以在存儲(chǔ)器內(nèi)存儲(chǔ)的軟件數(shù)據(jù)結(jié)構(gòu);在特殊的實(shí)施例中也可以采用硬件高速緩存。翻譯緩沖器被用來(lái)存儲(chǔ)主指令,主指令實(shí)現(xiàn)了每一個(gè)目標(biāo)指令的完整翻譯。顯而易見(jiàn),一旦翻譯出單條目標(biāo)指令并對(duì)獲得的主指令進(jìn)行優(yōu)化、重新排序和重新安排,所得到的主指令就被存儲(chǔ)在翻譯緩沖器內(nèi)。構(gòu)成翻譯結(jié)果的主指令隨后由詞態(tài)主機(jī)執(zhí)行。如果主指令的執(zhí)行不發(fā)生意外事件,則無(wú)論何時(shí)需要實(shí)現(xiàn)目標(biāo)指令的操作或需要指令時(shí)都可以再次調(diào)用該主指令。
如圖7所示,由應(yīng)用程序載入目標(biāo)指令地址的微處理器詞態(tài)化軟件的典型操作是首先確定目標(biāo)地址上的目標(biāo)指令是否已經(jīng)翻譯。如果目標(biāo)指令未被翻譯,則提取該目標(biāo)指令以及隨后的目標(biāo)指令,并且將它們譯碼、翻譯并隨后優(yōu)化(可能是)、重新排序和重新安排為新的主翻譯指令,并由翻譯機(jī)將它們存儲(chǔ)在翻譯緩沖器內(nèi)。如下可見(jiàn),優(yōu)化可以達(dá)到不同的程序。在本說(shuō)明書(shū)中術(shù)語(yǔ)“優(yōu)化”常常指的是加速處理的技術(shù)。例如重新排序就是一種優(yōu)化形式,它使得處理更快,因此屬術(shù)該術(shù)語(yǔ)的范疇。許多優(yōu)化方法在現(xiàn)有技術(shù)的編譯器優(yōu)化中都有描述,有些優(yōu)化方法難以在類(lèi)似現(xiàn)有技術(shù)的“超塊”中完成,而在VLIW研究中出現(xiàn)。隨后控制被轉(zhuǎn)移至翻譯以使增強(qiáng)詞態(tài)主硬件重新開(kāi)始執(zhí)行。
當(dāng)在運(yùn)行應(yīng)用程序中下面遇到某一目標(biāo)指令序列時(shí),將在翻譯緩沖器內(nèi)尋找主翻譯指令并立即執(zhí)行而無(wú)需翻譯、優(yōu)化、或者重新安排。利用下述高級(jí)技術(shù),據(jù)估計(jì)對(duì)于每一百萬(wàn)次翻譯執(zhí)行操作而言只有一次需執(zhí)行釋放,而其他均可在翻譯緩沖器中找到目標(biāo)指令的翻譯結(jié)果(曾經(jīng)被完整翻譯過(guò))。因此在第一次翻譯之后,翻譯所需的所有步驟(例如譯碼、提取基本指令,優(yōu)化基本指令,將其重新安排為主翻譯指令并在翻譯緩沖器內(nèi)存儲(chǔ))可以省略。由于為其編寫(xiě)目標(biāo)指令的處理器在每次執(zhí)行指令時(shí)都必須譯碼、提取、重新排序和重新安排每條指令,所以這樣做大大減少了執(zhí)行目標(biāo)指令所需的工作量并提高了改進(jìn)型微處理器的速度。
在省略所有現(xiàn)有技術(shù)處理器執(zhí)行目標(biāo)應(yīng)用程序所需的步驟之后,本發(fā)明的微處理器克服了現(xiàn)有技術(shù)的問(wèn)題,使得這類(lèi)操作可以合理的速度運(yùn)行。例如改進(jìn)型微處理器的某些技術(shù)被用于上述仿真器以將應(yīng)用程序移植到其它系統(tǒng)。但是由于在處理翻譯指令時(shí),引起調(diào)用各種系統(tǒng)意外事件句柄的意外事件發(fā)生在主處理器狀態(tài)與處理同樣指令的目標(biāo)處理器無(wú)關(guān)的操作時(shí)刻,所以一些仿真器無(wú)法運(yùn)行應(yīng)用程序較長(zhǎng)的部分。因此產(chǎn)生這類(lèi)意外事件時(shí)目標(biāo)處理器的狀態(tài)是未知的。這樣,目標(biāo)機(jī)的正確狀態(tài)就無(wú)法確定;操作必須停止,重新啟動(dòng),并在意外事件可以處理和繼續(xù)執(zhí)行之前確認(rèn)正確的狀態(tài)。這使得無(wú)法以主機(jī)速度運(yùn)行應(yīng)用程序。
詞態(tài)主機(jī)硬件包含了解決該問(wèn)題的多個(gè)增強(qiáng)部分。圖3、4和5示出了這些增強(qiáng)部分。為了在發(fā)生錯(cuò)誤時(shí)確定寄存器的正確狀態(tài),增強(qiáng)硬件提供了一組正式目標(biāo)寄存器來(lái)保存為其設(shè)計(jì)源應(yīng)用程序的目標(biāo)處理器的寄存器狀態(tài)。目標(biāo)寄存器可以包含在每個(gè)浮點(diǎn)單元、任何整數(shù)單元和其它執(zhí)行單元內(nèi)。這些正式寄存器連同增加的正常工作寄存器一起被加入詞態(tài)主機(jī)使得包括寄存器重命名的一系列優(yōu)化深以實(shí)現(xiàn)。增強(qiáng)硬件的一個(gè)實(shí)施例在整數(shù)單元內(nèi)包含64個(gè)工作寄存器而在浮點(diǎn)單元內(nèi)包含32個(gè)工作寄存器。實(shí)施例還包含一組增強(qiáng)目標(biāo)寄存器,它們包含所有提供處理器狀態(tài)的經(jīng)常變化的目標(biāo)處理器寄存器;這包括狀態(tài)控制寄存器和其它控制仿真系統(tǒng)所需的寄存器。
值得注意的是,根據(jù)詞態(tài)主機(jī)所用的增強(qiáng)處理硬件類(lèi)型,翻譯指令序列可包含構(gòu)成從源應(yīng)用程序來(lái)的多條目標(biāo)指令的基本操作。例如VLIW微處理器可以如圖6(a)-(c)所示立即執(zhí)行多條CISC指令或者RISC指令。無(wú)論詞態(tài)主機(jī)類(lèi)型如何,除了整體目標(biāo)指令邊界以外詞態(tài)主機(jī)硬件的目標(biāo)寄存器狀態(tài)是不會(huì)改變的;并且隨后所有的目標(biāo)寄存器得到了更新。因此,如果微處理器正在執(zhí)行目標(biāo)指令或已經(jīng)被翻譯為可以重新排序和重新安排為主指令的基本操作序列的指令,則當(dāng)處理器開(kāi)始執(zhí)行已翻譯的指令序列時(shí),正式目標(biāo)寄存器在第一條目標(biāo)指令被尋址時(shí)保存由為其設(shè)計(jì)應(yīng)用程序的目標(biāo)處理器寄存器保存的值。但是在詞態(tài)主機(jī)開(kāi)始執(zhí)行翻譯指令之后,工作寄存器保存由執(zhí)行到該點(diǎn)的翻譯指令基本操作確定的值。因此盡管一些工作寄存器保存的是與正式目標(biāo)寄存器內(nèi)相同的值,但是其它工作寄存器內(nèi)保存的值對(duì)于目標(biāo)處理器毫無(wú)意義。在為了采用高級(jí)加速技術(shù)提供比特定目標(biāo)機(jī)更多寄存器的實(shí)施例中這尤其如此。一旦開(kāi)始執(zhí)行翻譯的主指令,工作寄存器中的值是翻譯的主指令確定寄存器狀態(tài)的任何值。如果執(zhí)行一組翻譯的主指令而未產(chǎn)生意外事件,則在這組指令結(jié)束時(shí)確定的新工作寄存器值就被一起轉(zhuǎn)送至正式目標(biāo)寄存器(可能包括目標(biāo)指令指針寄存器)。在處理器的本實(shí)施例,這種轉(zhuǎn)移發(fā)生于附加的流水線(xiàn)階段內(nèi)的主指令執(zhí)行外部,從而不會(huì)降低詞態(tài)主機(jī)的處理速度。
同樣,圖5所示的門(mén)控存儲(chǔ)緩沖器在改進(jìn)型微處理器的硬件中被用來(lái)控制數(shù)據(jù)轉(zhuǎn)移至存儲(chǔ)器。門(mén)控存儲(chǔ)緩沖器包括多個(gè)單元,每個(gè)可保存存儲(chǔ)器存儲(chǔ)操作的地址和數(shù)據(jù)。這些單元可通過(guò)任意數(shù)量不同的硬件配置實(shí)現(xiàn)(例如先進(jìn)先出緩沖器);所示實(shí)施例利用隨機(jī)存儲(chǔ)器和三個(gè)專(zhuān)用工作寄存器實(shí)現(xiàn)。三個(gè)專(zhuān)用寄存器分別存儲(chǔ)指向存儲(chǔ)器存儲(chǔ)隊(duì)列頭部的指針、指向門(mén)的指針和指向存儲(chǔ)器存儲(chǔ)隊(duì)列尾部的指針。位于隊(duì)列頭部與門(mén)之間的存儲(chǔ)器存儲(chǔ)內(nèi)容已經(jīng)被調(diào)撥入存儲(chǔ)器,而位于隊(duì)列門(mén)與尾部之間的還未調(diào)撥入存儲(chǔ)器。在主指令執(zhí)行期間產(chǎn)生的存儲(chǔ)器存儲(chǔ)內(nèi)容由整數(shù)單元將按照詞態(tài)主機(jī)執(zhí)行主指令的順序放入存儲(chǔ)緩沖器但是在主指令中遇到調(diào)撥操作以前不允許寫(xiě)入存儲(chǔ)器。因此隨著翻譯指令的執(zhí)行,存儲(chǔ)操作被放入隊(duì)列。假定這些是第一次存儲(chǔ)的內(nèi)容因而在門(mén)控存儲(chǔ)緩沖器內(nèi)沒(méi)有其它的存儲(chǔ)內(nèi)容,則頭部和門(mén)指針將指向同一位置。隨著每一存儲(chǔ)內(nèi)容的執(zhí)行,它被放入隊(duì)列中下一位置并且尾部指針增一指向下一位置(在圖中是向上)。這一直持續(xù)到執(zhí)行調(diào)撥指令為止。這通常發(fā)生于完成一組目標(biāo)指令翻譯而未發(fā)生意外事件或者出現(xiàn)錯(cuò)誤退出條件時(shí)。當(dāng)詞態(tài)主機(jī)正確無(wú)誤地執(zhí)行翻譯指令時(shí),執(zhí)行期間生成的存儲(chǔ)緩沖器內(nèi)的存儲(chǔ)器存儲(chǔ)內(nèi)容被一起移動(dòng)通過(guò)存儲(chǔ)緩沖器的門(mén)(調(diào)撥)并隨后寫(xiě)入存儲(chǔ)器。在所示實(shí)施例中,這是通過(guò)將保存尾部指針的寄存器內(nèi)的值復(fù)制到保存門(mén)指針的寄存器內(nèi)完成的。
由此可見(jiàn),寄存器狀態(tài)從工作寄存器轉(zhuǎn)送至正式目標(biāo)寄存器和工作存儲(chǔ)器內(nèi)容轉(zhuǎn)移至正式存儲(chǔ)器是一起發(fā)生的并且只發(fā)生在整個(gè)目標(biāo)指令之間的邊界上從而響應(yīng)明確的調(diào)撥操作。
這使得微處理器可以從發(fā)生于增強(qiáng)詞態(tài)主機(jī)執(zhí)行指令過(guò)程中的目標(biāo)意外事件中幾乎無(wú)延遲地恢復(fù)過(guò)來(lái)。如果在運(yùn)行任何翻譯指令或指令期間產(chǎn)生目標(biāo)意外事件,則由詞態(tài)主機(jī)硬件或軟件檢測(cè)意外事件。為了響應(yīng)檢測(cè)到目標(biāo)意外事件,代碼詞態(tài)化軟件可以將正式寄存器內(nèi)保存的任何值返回工作寄存器并使門(mén)控存儲(chǔ)緩沖器內(nèi)未調(diào)撥的存儲(chǔ)器存儲(chǔ)內(nèi)容轉(zhuǎn)儲(chǔ)(一種稱(chēng)為“轉(zhuǎn)儲(chǔ)”的操作)。圖5門(mén)控存儲(chǔ)緩沖器存儲(chǔ)內(nèi)容的轉(zhuǎn)儲(chǔ)可以通過(guò)將保存門(mén)指針的寄存器內(nèi)的值復(fù)制到保存尾部指針的寄存器內(nèi)實(shí)現(xiàn)。
將目標(biāo)寄存器的值放入工作寄存器可以使發(fā)生意外事件的第一條運(yùn)行的目標(biāo)指令的地址放入工作指針寄存器內(nèi)。從工作寄存器內(nèi)目標(biāo)處理器的正式狀態(tài)開(kāi)始,發(fā)生意外事件時(shí)正在運(yùn)行的目標(biāo)指令被按照串行順序重新翻譯而不進(jìn)行重新排序或其它優(yōu)化。在將每條目標(biāo)指令重新譯碼和翻譯為新的主指令之后,代表目標(biāo)指令的翻譯后的主指令由詞態(tài)主機(jī)執(zhí)行并且可能引起意外事件(如果詞態(tài)主機(jī)是VLIW處理器以外的處理器,則主翻譯指令的每條基本操作按照順序執(zhí)行。如果在主翻譯指令執(zhí)行時(shí)沒(méi)有產(chǎn)生意外事件,則運(yùn)行下一基本功能)。這一直延續(xù)到發(fā)生意外事件為止或者單條目標(biāo)指令被翻譯和執(zhí)行為止。在一個(gè)實(shí)施例中,如果在執(zhí)行目標(biāo)指令翻譯時(shí)沒(méi)有產(chǎn)生意外事件,則工作寄存器的狀態(tài)被轉(zhuǎn)移至目標(biāo)寄存器并且門(mén)控存儲(chǔ)緩沖器內(nèi)的數(shù)據(jù)被調(diào)撥從而可以轉(zhuǎn)移至存儲(chǔ)器。但是如果在翻譯指令運(yùn)行期間再次發(fā)生意外事件,則目標(biāo)寄存器和存儲(chǔ)器的狀態(tài)未變化而是與發(fā)生意外事件時(shí)目標(biāo)計(jì)算機(jī)內(nèi)產(chǎn)生的狀態(tài)一致。因此當(dāng)產(chǎn)生目標(biāo)意外事件時(shí),意外事件將由目標(biāo)操作系統(tǒng)正確處理。
同樣,一旦指令系列在翻譯時(shí)產(chǎn)生意外事件的第一條目標(biāo)指令執(zhí)行時(shí)未發(fā)生意外事件,則目標(biāo)指令指針指向下一目標(biāo)指令。這第二條目標(biāo)指令與第一條指令的處理方式一樣,只作譯碼和重新翻譯而不進(jìn)行優(yōu)化或重新排序。隨著詞態(tài)主機(jī)處理單條目標(biāo)指令的每條主指令,當(dāng)目標(biāo)寄存器和存儲(chǔ)器的狀態(tài)與目標(biāo)計(jì)算機(jī)內(nèi)發(fā)生的狀態(tài)一致時(shí)將產(chǎn)生意外事件。因此意外事件得到立即而正確的處理。這些新的翻譯指令可以存儲(chǔ)在翻譯緩沖器內(nèi)作為目標(biāo)應(yīng)用程序內(nèi)指令序列的正確翻譯結(jié)果,并在指令再次執(zhí)行時(shí)被調(diào)用。
完成與圖5門(mén)控存儲(chǔ)緩沖器同樣結(jié)果的其它實(shí)施例包括這樣的方案,它將存儲(chǔ)內(nèi)容直接轉(zhuǎn)移至存儲(chǔ)器而與此同時(shí)記錄足夠的數(shù)據(jù)以在執(zhí)行翻譯結(jié)果引起意外事件或者錯(cuò)誤(由此需要轉(zhuǎn)儲(chǔ))時(shí)恢復(fù)目標(biāo)計(jì)算機(jī)的狀態(tài)。在這種情況下,任何在翻譯和執(zhí)行期間發(fā)生的存儲(chǔ)器存儲(chǔ)內(nèi)容的影響都不得不逆轉(zhuǎn)過(guò)來(lái)并且恢復(fù)翻譯開(kāi)始時(shí)存儲(chǔ)器的狀態(tài);與此同時(shí)工作寄存器必須以上述方式接收正式目標(biāo)寄存器內(nèi)保存的數(shù)據(jù)。在實(shí)現(xiàn)這項(xiàng)操作的一個(gè)實(shí)施例中,維持一個(gè)分立的目標(biāo)存儲(chǔ)器保存原始的存儲(chǔ)器狀態(tài),如果需要轉(zhuǎn)儲(chǔ),則該狀態(tài)被用來(lái)代替覆蓋的存儲(chǔ)器內(nèi)容。在實(shí)現(xiàn)存儲(chǔ)器轉(zhuǎn)儲(chǔ)的另一實(shí)施例中,在每條存儲(chǔ)和存儲(chǔ)器數(shù)據(jù)被替換時(shí)對(duì)它們進(jìn)行登錄并在需要轉(zhuǎn)儲(chǔ)時(shí)使存儲(chǔ)進(jìn)程逆向進(jìn)行。
代碼詞態(tài)軟件提供了一項(xiàng)新增的操作,它大大加快了被翻譯的處理程序的速度。除了簡(jiǎn)單翻譯指令、優(yōu)化、重新排序、重新安排、高速緩存和執(zhí)行每條翻譯指令從而可以在需要執(zhí)行該組指令時(shí)再次運(yùn)行以外,翻譯器還鏈接不同的翻譯結(jié)果以在絕大多數(shù)情況下避免返回翻譯進(jìn)程的主循環(huán)。圖8示出了完成鏈接進(jìn)程的代碼詞態(tài)化軟件翻譯器部分所執(zhí)行的步驟。對(duì)于本領(lǐng)域內(nèi)的普通技術(shù)人員來(lái)說(shuō),顯而易見(jiàn)的是這種鏈接操作基本上在大多數(shù)指令翻譯時(shí)避免了返回主循環(huán),這節(jié)約了開(kāi)銷(xiāo)。
為了闡述方便,運(yùn)行的目標(biāo)程序由X86指令組成。當(dāng)翻譯目標(biāo)指令序列并且重新排序和重新安排基本主指令時(shí),兩條基本主指令可能在每條主翻譯指令結(jié)束處發(fā)生。第一條是更新目標(biāo)處理器的指令指針(或類(lèi)似的指針)的值;該指令用來(lái)將下一目標(biāo)指令的正確地址放入目標(biāo)指令指針寄存器。該基本指令之后是一條轉(zhuǎn)移指令,它包含轉(zhuǎn)移的兩種可能目標(biāo)地址。處理轉(zhuǎn)移指令的基本指令可以更新目標(biāo)處理器的指令指針值,其方式是測(cè)試在條件代碼寄存器內(nèi)的條件代碼,并隨后確定控制轉(zhuǎn)移的條件所指示的兩個(gè)轉(zhuǎn)移地址的其中一個(gè)是否存入翻譯緩沖器內(nèi)。第一次翻譯目標(biāo)指令序列時(shí),主指令的兩個(gè)轉(zhuǎn)移目標(biāo)都保存翻譯機(jī)軟件主循環(huán)的同一主處理器地址。
當(dāng)主指令經(jīng)過(guò)翻譯,存儲(chǔ)在翻譯緩沖器并第一次執(zhí)行時(shí),目標(biāo)指令指針寄存器(作為其余目標(biāo)寄存器)內(nèi)的指令指針得到更新;并且操作轉(zhuǎn)移返回主循環(huán)。在主循環(huán)內(nèi),翻譯器軟件在目標(biāo)指令指針寄存器內(nèi)查找指向下一目標(biāo)指令的指令指針。隨后尋址下一目標(biāo)指令序列。假定該目標(biāo)指令序列還未被翻譯,因此在翻譯緩沖器內(nèi)未駐留翻譯指令,則從存儲(chǔ)器提取下一組目標(biāo)指令,對(duì)其譯碼、翻譯、優(yōu)化、重新排序、重新安排、高速緩存入翻譯緩沖器并予以執(zhí)行。由于第二組目標(biāo)指令跟隨在第一組目標(biāo)指令之后,所以第一組目標(biāo)指令的主翻譯結(jié)束處的基本轉(zhuǎn)移指令就被自動(dòng)更新替代為第二組目標(biāo)指令的主翻譯指令地址成為控制轉(zhuǎn)移的特定條件轉(zhuǎn)移地址。
如果這樣,則第二主翻譯主指令循環(huán)返回到第一條翻譯的主指令,第二翻譯指令結(jié)束處的轉(zhuǎn)移操作包含主循環(huán)地址和第一條翻譯指令的X86地址作為轉(zhuǎn)移兩種可能的目標(biāo)。在測(cè)試轉(zhuǎn)移狀態(tài)及決定循環(huán)回到第一翻譯指令前更新指令指針基本操作并將目標(biāo)指令指針更新為第一條翻譯指令的X86地址。這使得翻譯器在翻譯緩沖器內(nèi)查詢(xún)以確定是否有X86地址。第一條翻譯指令的地址被找到,并且它在主機(jī)存儲(chǔ)器空間內(nèi)的值被第二條主翻譯指令結(jié)束處轉(zhuǎn)移中的X86地址上的值替換。隨后第二主翻譯指令被高速緩存和執(zhí)行。這使得循環(huán)延續(xù)下去直到從第一條翻譯指令轉(zhuǎn)移到第二條翻譯指令的條件失敗,并且轉(zhuǎn)移取道返回主循環(huán)。當(dāng)發(fā)生這種情況時(shí),第一條翻譯主指令返回主循環(huán),從而在翻譯緩沖器內(nèi)搜索目標(biāo)指令指針指定的下一組目標(biāo)指令,主指令從高速緩存中提取;或者在翻譯緩沖器內(nèi)找不到,則從存儲(chǔ)器內(nèi)提取該目標(biāo)指令并進(jìn)行翻譯。當(dāng)該經(jīng)過(guò)翻譯的主指令高速緩存入翻譯緩沖器內(nèi)時(shí),其地址代替了結(jié)束循環(huán)的轉(zhuǎn)移指令內(nèi)的主循環(huán)地址。
這樣,各種翻譯主指令被互相串接起來(lái),因此只有在這種串接不存在時(shí)才需要?dú)v經(jīng)通過(guò)翻譯器主循環(huán)的長(zhǎng)路徑。最終,主指令轉(zhuǎn)移指令內(nèi)主循環(huán)參考地址幾乎可以完全省略。當(dāng)達(dá)到該條件時(shí),在運(yùn)行任何主指令之前提取目標(biāo)指令、譯碼目標(biāo)指令、提取構(gòu)成目標(biāo)指令的基本指令、優(yōu)化這些基本操作、重新排序基本操作和重新安排這些基本操作所需的時(shí)間可以省去。因此與所有每次執(zhí)行應(yīng)用程序指令時(shí)必須執(zhí)行這些步驟的每一步的所有現(xiàn)有技術(shù)微處理器相反,利用改進(jìn)型微處理器在第一條指令執(zhí)行之后運(yùn)行任意目標(biāo)指令組所需的工作量大為減少。當(dāng)每組翻譯的主指令與其它組翻譯主指令都鏈接起來(lái)的,工作量可進(jìn)一步減少。實(shí)際上,據(jù)估計(jì)在應(yīng)用程序運(yùn)行期間一百萬(wàn)條翻譯指令需要執(zhí)行的翻譯次數(shù)不超過(guò)一次。
本領(lǐng)域內(nèi)技術(shù)人員將會(huì)發(fā)現(xiàn),由于為了避免再次翻譯,被翻譯的每組指令都被高速緩存,所以微處理器需要大量的翻譯緩沖器。針對(duì)不同系統(tǒng)編程的應(yīng)用程序功能而設(shè)計(jì)的翻譯機(jī)將根據(jù)支持的緩沖存儲(chǔ)器不同而有所不同。但是針對(duì)運(yùn)行X86程序設(shè)計(jì)的微處理器實(shí)施例采用2Mb的隨機(jī)存儲(chǔ)器作為翻譯緩沖器。
兩種新增的硬件增強(qiáng)手段有助于提高本發(fā)明微處理器處理應(yīng)用程序的速度。第一種手段是與每條地址翻譯指令一起存儲(chǔ)在翻譯指令后備緩沖器(TLB)(參見(jiàn)圖3)中的異常/正常(A/N)比特,在上述緩沖器中首先查詢(xún)目標(biāo)指令的物理地址。翻譯指令的目標(biāo)存儲(chǔ)器操作可以分為兩類(lèi),一種是對(duì)存儲(chǔ)器操作(正常操作)而另一種是對(duì)存儲(chǔ)器映射I/O設(shè)備操作(異常操作)。
作用于存儲(chǔ)器的正常存取以正常方式完成。當(dāng)指令在存儲(chǔ)器上操作時(shí),指令的優(yōu)化和重新排序是有益的并且大大加快了利用本發(fā)明微處理器的系統(tǒng)的操作。另一方面,作用于I/O設(shè)備的異常存取操作必須按照這些操作編程時(shí)的精確順序進(jìn)行而不能省略任何步驟,否則對(duì)I/O設(shè)備有不利的影響。例如某一特定的I/O操作可能是清除I/O寄存器;如果基本操作順序出錯(cuò),則操作結(jié)果可能會(huì)不同于目標(biāo)指令要求的操作。由于沒(méi)有區(qū)分存儲(chǔ)器和存儲(chǔ)器映射I/O的裝置,所以在翻譯指令時(shí)需要將所有的存儲(chǔ)操作按照是作用于存儲(chǔ)器映射I/O指令的保守假設(shè)進(jìn)行處理。這大大限制了優(yōu)化所能達(dá)到的性能。由于現(xiàn)有技術(shù)仿真器沒(méi)有檢測(cè)被尋址存儲(chǔ)器性質(zhì)預(yù)測(cè)失效的裝置和從這類(lèi)失效中恢復(fù)過(guò)來(lái)的裝置,所以其性能受到限制。
在圖11所示的微處理器實(shí)施例中,A/N比特可以在翻譯后備緩沖器內(nèi)設(shè)定以指示是存儲(chǔ)器頁(yè)面還是存儲(chǔ)映射I/O。翻譯后備緩沖器存儲(chǔ)用于存儲(chǔ)器存取的頁(yè)面表輸入項(xiàng)。每條輸入項(xiàng)包括被存取的虛擬地址和可以用以找到數(shù)據(jù)的物理地址以及其它有關(guān)輸入項(xiàng)的信息。在本發(fā)明中,A/N比特屬于其它信息部分并且表示物理地址是存儲(chǔ)器地址還是存儲(chǔ)器映射I/O地址。盡管作用于存儲(chǔ)器的操作似乎屬于存儲(chǔ)器操作,但是實(shí)際上該操作的翻譯是預(yù)測(cè)其作用于存儲(chǔ)器。在一個(gè)實(shí)施例中,當(dāng)代碼詞態(tài)化軟件首先執(zhí)行需要訪(fǎng)問(wèn)存儲(chǔ)器或存儲(chǔ)器映射I/O設(shè)備的指令翻譯時(shí),它假定該存取是存儲(chǔ)器存取。在另一實(shí)施例中,軟件可能假定目標(biāo)指令需要進(jìn)行I/O存取。假定在此之前未對(duì)該地址進(jìn)行過(guò)訪(fǎng)問(wèn),則在翻譯后備緩沖器中將沒(méi)有相應(yīng)的輸入項(xiàng);并且在翻譯后備緩沖器中的存取失敗。這種失敗使得軟件進(jìn)行頁(yè)面表查詢(xún)并將頁(yè)面表輸入項(xiàng)填入翻譯后備緩沖器的存儲(chǔ)位置以向虛擬地址提供正確的物理地址翻譯結(jié)果。此后,軟件將物理地址的A/N比特輸入翻譯后備緩沖器內(nèi)。隨后假定訪(fǎng)問(wèn)的是存儲(chǔ)器地址,則試圖進(jìn)行再一次的存取。當(dāng)試圖進(jìn)行存取時(shí),通過(guò)將預(yù)先假定的存取類(lèi)型(正?;虍惓?與TLB頁(yè)面表輸入項(xiàng)內(nèi)的A/N保護(hù)比特比較,檢驗(yàn)?zāi)繕?biāo)存儲(chǔ)器的參考地址。當(dāng)存取類(lèi)型與A/N保護(hù)不一致時(shí),發(fā)生意外事件。如果操作實(shí)際上作用于存儲(chǔ)器,則在翻譯期間可以正確應(yīng)用上述優(yōu)化、重新排序和重新安排技術(shù)。如果與TLB中A/N比特的比較表明操作作用于I/O設(shè)備,則操作的執(zhí)行導(dǎo)致意外事件;并且翻譯器一次產(chǎn)生一條目標(biāo)指令的新翻譯結(jié)果而不進(jìn)行優(yōu)化、記錄或者重新安排等。同樣,如果翻譯時(shí)錯(cuò)誤地將作用于存儲(chǔ)器的操作假定為I/O操作,則操作的執(zhí)行導(dǎo)致意外事件;并且利用優(yōu)化、重新排序和重新安排技術(shù)重新翻譯目標(biāo)指令。這樣處理器可以出乎尋常地提高性能。
本領(lǐng)域內(nèi)的技術(shù)人員將會(huì)發(fā)現(xiàn),利用A/N比特來(lái)確定有關(guān)存儲(chǔ)器訪(fǎng)問(wèn)還是存儲(chǔ)器映射I/O設(shè)備訪(fǎng)問(wèn)的預(yù)測(cè)是否失敗的技術(shù)也可以用來(lái)預(yù)測(cè)存儲(chǔ)器映射地址的其它性質(zhì)。例如可以利用這種正常/異常比特來(lái)區(qū)分不同類(lèi)型的存儲(chǔ)器。本領(lǐng)域內(nèi)技術(shù)人員還可以找到區(qū)分存儲(chǔ)器性質(zhì)的其它類(lèi)似用途。
改進(jìn)型微處理器預(yù)測(cè)最多的是翻譯內(nèi)是否發(fā)生目標(biāo)意外事件。這使得與現(xiàn)有技術(shù)相比作了明顯的優(yōu)化。首先,目標(biāo)狀態(tài)不必在每條目標(biāo)指令邊界上更新而只需在發(fā)生在翻譯邊界的目標(biāo)指令邊界上更新。這省略了在每條目標(biāo)指令邊界上保存目標(biāo)狀態(tài)所需的指令。原先無(wú)法對(duì)安排和去除冗余操作所作的優(yōu)化現(xiàn)在也變得可行起來(lái)。
改進(jìn)的微處理器適于選擇合適的翻譯進(jìn)程。按照上述翻譯方法,盡管一組指令是作用于存儲(chǔ)器的,但是仍然可以先進(jìn)行翻譯。當(dāng)優(yōu)化、重新排序和重新安排主指令執(zhí)行時(shí),利用翻譯后備緩沖器內(nèi)提供的A/N比特狀態(tài)可能發(fā)現(xiàn)是I/O設(shè)備的地址。A/N比特與表示I/O操作的翻譯指令地址進(jìn)行比較后產(chǎn)生錯(cuò)誤意外事件,啟動(dòng)軟件初始化轉(zhuǎn)儲(chǔ)程序,引起未調(diào)撥的存儲(chǔ)器存儲(chǔ)內(nèi)容轉(zhuǎn)儲(chǔ)并將目標(biāo)寄存器內(nèi)的值放回到工作寄存器。隨后一次對(duì)一條目標(biāo)指令進(jìn)行翻譯而不進(jìn)行優(yōu)化、重新排序或者重新安排。這種重新翻譯適合于對(duì)I/O設(shè)備進(jìn)行主翻譯。
同樣,存儲(chǔ)器操作也可能被錯(cuò)誤地翻譯為I/O操作。產(chǎn)生的錯(cuò)誤可以用來(lái)引發(fā)正確的重新翻譯,對(duì)指令進(jìn)行優(yōu)化、重新排序和重新安排以提供更快的操作。
現(xiàn)有技術(shù)仿真器對(duì)稱(chēng)為自修改代碼的問(wèn)題一直比較棘手。即使目標(biāo)程序應(yīng)該向包含目標(biāo)指令的存儲(chǔ)器寫(xiě)入內(nèi)容,這將導(dǎo)致目標(biāo)指令已有的翻譯結(jié)果“過(guò)時(shí)”并不再有效。當(dāng)這些存儲(chǔ)器內(nèi)容動(dòng)態(tài)發(fā)生時(shí)需要對(duì)它們進(jìn)行檢測(cè)。在現(xiàn)有技術(shù)中,這種檢測(cè)需要借助對(duì)每條存儲(chǔ)使用額外指令完成。這個(gè)問(wèn)題的影響要超出程序自修改本身。任何能夠向存儲(chǔ)器寫(xiě)入內(nèi)容的機(jī)構(gòu),例如第二處理器或DMA設(shè)備,也可能引起這個(gè)問(wèn)題。
本發(fā)明通過(guò)另外的增強(qiáng)詞態(tài)主機(jī)的性能解決這個(gè)問(wèn)題??梢杂靡泊鎯?chǔ)在翻譯后備緩沖器內(nèi)的翻譯比特(T比特)來(lái)表示已存在翻譯結(jié)果的目標(biāo)存儲(chǔ)器頁(yè)面。T比特可表示特定目標(biāo)存儲(chǔ)器頁(yè)面包含已被翻譯目標(biāo)指令,如果這些目標(biāo)指令被覆蓋則它們將過(guò)時(shí)。如果試圖向存儲(chǔ)器內(nèi)被保護(hù)的頁(yè)面寫(xiě)入內(nèi)容,則翻譯比特的存的將引起意外事件,當(dāng)代碼詞態(tài)化軟件進(jìn)行處理時(shí)將使正確的翻譯結(jié)果無(wú)效或者從翻譯緩沖器內(nèi)去除。T比特還可以用來(lái)標(biāo)記其它保護(hù)翻譯結(jié)果不被覆蓋的目標(biāo)頁(yè)面。
借助圖3可以理解這一點(diǎn),它示出了本發(fā)明微處理器總體功能單元的框圖。當(dāng)詞態(tài)主機(jī)執(zhí)行目標(biāo)程序時(shí),實(shí)際上它運(yùn)行的是代碼詞態(tài)化軟件的翻譯器部分,它僅僅包括有效運(yùn)行在詞態(tài)主機(jī)上的初始未翻譯主指令。圖中右邊是存儲(chǔ)器,它被劃分為包含翻譯器和翻譯緩沖器的主機(jī)部分和包含目標(biāo)指令和數(shù)據(jù)(包括目標(biāo)操作操作系統(tǒng))的目標(biāo)部分。詞態(tài)主機(jī)硬件開(kāi)始執(zhí)行翻譯器時(shí)從存儲(chǔ)器內(nèi)提取主指令并將其放入指令高速緩存內(nèi)。翻譯器指令產(chǎn)生對(duì)存儲(chǔ)在存儲(chǔ)器目標(biāo)部分內(nèi)的第一條目標(biāo)指令的提取指令。目標(biāo)提取指令使整數(shù)單元在正式目標(biāo)指令指針寄存器內(nèi)查找目標(biāo)指令的開(kāi)始地址。隨后將開(kāi)始地址放入存儲(chǔ)器管理單元的翻譯后備緩沖器內(nèi)。存儲(chǔ)器管理單元包括頁(yè)面查找硬件并提供TLB的存儲(chǔ)器映射手段。假定TLB被正確映射從而保存了目標(biāo)存儲(chǔ)器正確頁(yè)面的查找數(shù)據(jù),則目標(biāo)指令指針值被翻譯為目標(biāo)指令的物理地址。此時(shí),對(duì)表示目標(biāo)指令是否完成翻譯的比特(T比特)狀態(tài)進(jìn)行檢測(cè);但是訪(fǎng)問(wèn)是讀操作,并且不會(huì)發(fā)生T比特意外事件。還檢測(cè)了表示是對(duì)存儲(chǔ)器還是存儲(chǔ)器映射I/O訪(fǎng)問(wèn)的A/N比特的狀態(tài)。假定后面提及的比特表示存儲(chǔ)位置,則由于不存在翻譯結(jié)果,所以在目標(biāo)存儲(chǔ)器內(nèi)訪(fǎng)問(wèn)目標(biāo)指令。目標(biāo)指令和后續(xù)目標(biāo)指令作為數(shù)據(jù)被轉(zhuǎn)移至詞態(tài)主機(jī)計(jì)算單元并在指令高速緩存內(nèi)存儲(chǔ)的翻譯器指令的控制下進(jìn)行翻譯。翻譯器指令采用重新排序、優(yōu)化和重新安排技術(shù),就好象處理作用于存儲(chǔ)器的目標(biāo)指令一樣。隨后將包含主指令序列的最終翻譯結(jié)果存儲(chǔ)在主存儲(chǔ)器的翻譯緩沖器內(nèi)。翻譯結(jié)果經(jīng)門(mén)控存儲(chǔ)緩沖器被直接轉(zhuǎn)送至主存儲(chǔ)器的翻譯緩沖器內(nèi)。一旦將翻譯結(jié)果存儲(chǔ)在主存儲(chǔ)器內(nèi)之后,翻譯器轉(zhuǎn)入隨后執(zhí)行的翻譯。所執(zhí)行的操作(以及后續(xù)操作)確定翻譯是否對(duì)意外事件和存儲(chǔ)器作出了正確的假設(shè)。在執(zhí)行翻譯之前,對(duì)包含已翻譯目標(biāo)指令的目標(biāo)頁(yè)面的T比特進(jìn)行設(shè)定。該指示提醒指令已經(jīng)翻譯;并且如果試圖向目標(biāo)地址寫(xiě)入內(nèi)容,則將導(dǎo)致意外事件,可能使得翻譯結(jié)果無(wú)效或者被除去。
如果試圖向用T比特標(biāo)記的目標(biāo)頁(yè)面寫(xiě)入內(nèi)容,則產(chǎn)生意外事件并中止寫(xiě)入。在意外事件的響應(yīng)確認(rèn)對(duì)寫(xiě)入目標(biāo)存儲(chǔ)器地址的指令翻譯是無(wú)效的或者受到保護(hù)的,直到它們被適當(dāng)更新之后,寫(xiě)入操作才可以繼續(xù)。由于翻譯不起作用,所以有些寫(xiě)入操作實(shí)際上不需要做。其它的寫(xiě)入操作則需要,做一條或更多與尋址的目標(biāo)存儲(chǔ)器(相關(guān)的翻譯被適當(dāng)標(biāo)記或者去除)。圖11示出了翻譯后備緩沖器的實(shí)施例,包含保存T比特指示的每條輸入項(xiàng)的存儲(chǔ)位置。
新增的加強(qiáng)詞態(tài)主機(jī)性能的硬件電路可以使正常存儲(chǔ)在存儲(chǔ)器內(nèi)但經(jīng)常用于操作執(zhí)行的數(shù)據(jù)在執(zhí)行單元寄存器內(nèi)被復(fù)制(或者“別名”)以便節(jié)省從存儲(chǔ)器內(nèi)提取或存入存儲(chǔ)器內(nèi)的時(shí)間。例如如果存儲(chǔ)器內(nèi)的數(shù)據(jù)在代碼序列執(zhí)行期間經(jīng)常被復(fù)用,則在每次使用該數(shù)據(jù)時(shí)一般從存儲(chǔ)器內(nèi)將其調(diào)出并載入執(zhí)行單元內(nèi)的寄存器。為了減少這種頻繁的存儲(chǔ)器訪(fǎng)問(wèn)所需的時(shí)間,按照本發(fā)明,在代碼序列執(zhí)行期間,數(shù)據(jù)可以在代碼序列開(kāi)始時(shí)一次從存儲(chǔ)器載入執(zhí)行單元寄存器。該指定的寄存器在代碼序列繼續(xù)執(zhí)行期間起著代替存儲(chǔ)器的作用一旦這樣,每條將數(shù)據(jù)從指定的存儲(chǔ)器地址載入寄存器的加載操作就變?yōu)榧拇嫫髦g的復(fù)制操作,這使處理加快了許多;而且即使是復(fù)制操作,也可以經(jīng)常通過(guò)進(jìn)一步的優(yōu)化而省略。
同樣,在執(zhí)行代碼序列期間代碼序列的執(zhí)行常常需要將數(shù)據(jù)寫(xiě)入存儲(chǔ)器地址。為了減少頻繁地將存儲(chǔ)器內(nèi)容數(shù)據(jù)寫(xiě)入同一地址所需的時(shí)間,按照本發(fā)明,在執(zhí)行代碼序列期間,每次將數(shù)據(jù)寫(xiě)入存儲(chǔ)器地址時(shí),都可以將其轉(zhuǎn)送至指定功能的執(zhí)行單元寄存器而不是存儲(chǔ)在存儲(chǔ)器內(nèi)。一旦指定了執(zhí)行單元寄存器,則每次數(shù)據(jù)更改都只需進(jìn)行簡(jiǎn)單的寄存器之間的傳送操作,這比存入存儲(chǔ)器地址要快得多。
為了完成這些別名操作,本發(fā)明提供了獨(dú)特的技術(shù)。在圖10所示的實(shí)施例中,詞態(tài)主機(jī)被設(shè)計(jì)為響應(yīng)針對(duì)指定存儲(chǔ)器地址的“加載和保護(hù)”命令,該地址在執(zhí)行代碼序列時(shí)頻繁地被使用。詞態(tài)主機(jī)對(duì)執(zhí)行單元110內(nèi)保存存儲(chǔ)器數(shù)據(jù)的工作寄存器111進(jìn)行分配并將存儲(chǔ)器地址存入存儲(chǔ)器控制單元的特殊寄存器112內(nèi)。執(zhí)行單元內(nèi)為此分配的工作寄存器111數(shù)量沒(méi)有限制(例如圖4為8個(gè)工作寄存器)。
當(dāng)采用本發(fā)明避免從存儲(chǔ)器地址將數(shù)據(jù)加載入執(zhí)行單元時(shí),存儲(chǔ)器地址上的數(shù)據(jù)首先被載入寄存器111而存儲(chǔ)器地址則被放入寄存器112。隨后,利用寄存器111內(nèi)的數(shù)據(jù)加速執(zhí)行代碼序列。在此期間,通常需要從保存在寄存器112內(nèi)的存儲(chǔ)器地址加載數(shù)據(jù)的每條操作被從寄存器111內(nèi)復(fù)制數(shù)據(jù)取代。這種操作一直延續(xù)到代碼序列執(zhí)行結(jié)束(或者以某種方式終止)并且去除存儲(chǔ)器空間保護(hù)為止。
同樣,為了加快執(zhí)行常常將數(shù)據(jù)從執(zhí)行單元110存到同一存儲(chǔ)器地址的代碼序列,可以采用類(lèi)似的別名處理?!凹虞d和保護(hù)”命令使存儲(chǔ)器地址放入寄存器112并將通常存儲(chǔ)在存儲(chǔ)器地址上的數(shù)據(jù)轉(zhuǎn)移至工作寄存器111。例如在循環(huán)執(zhí)行通常將一系列數(shù)值存儲(chǔ)在同一存儲(chǔ)器地址上的計(jì)算中,通過(guò)分配保存數(shù)據(jù)的寄存器111并在寄存器112內(nèi)保存存儲(chǔ)器地址可以使存儲(chǔ)過(guò)程變?yōu)閳?zhí)行單元內(nèi)部的寄存器之間的數(shù)據(jù)轉(zhuǎn)移。這種操作一直延續(xù)到代碼序列執(zhí)行結(jié)束(或者以某種方式終止),存儲(chǔ)空間被重新,并且去除存儲(chǔ)器空間保護(hù)為止。
雖然這些別名技術(shù)都大大提高了某些代碼序列的執(zhí)行速度,但是這些減少存儲(chǔ)器訪(fǎng)問(wèn)的操作會(huì)引起相當(dāng)多的問(wèn)題。如果主處理器操作的基本部分涉及目標(biāo)指令集與主指令集之間的指令翻譯時(shí)情況尤其如此。所有這些問(wèn)題都涉及到需要確保指令執(zhí)行時(shí)使用的數(shù)據(jù)在使用時(shí)是有效的。
因存儲(chǔ)在存儲(chǔ)器地址上的數(shù)據(jù)與存儲(chǔ)在執(zhí)行單元寄存器內(nèi)的數(shù)據(jù)不同而造成其中之一在某一時(shí)刻失效的例子很多。例如,如果工作寄存器111被用來(lái)保存代碼序列執(zhí)行期間經(jīng)常從存儲(chǔ)器加載到寄存器的數(shù)據(jù),則指令可以在完成利用執(zhí)行單元寄存器內(nèi)數(shù)據(jù)的代碼序列執(zhí)行完成以前寫(xiě)入存儲(chǔ)器地址。在這種情況下,代碼序列所使用的執(zhí)行單元寄存器內(nèi)數(shù)據(jù)將會(huì)過(guò)時(shí)并且必須更新。
作為另一個(gè)實(shí)例,如果工作寄存器被用來(lái)保存代碼序列執(zhí)行期間經(jīng)常存入存儲(chǔ)器地址上的數(shù)據(jù),則可以在完成利用執(zhí)行單元寄存器代替存儲(chǔ)器的代碼序列的執(zhí)行前將一條指令寫(xiě)入存儲(chǔ)器地址。如果主處理器處于只在代碼序列執(zhí)行結(jié)束時(shí)正常更新存儲(chǔ)器地址上數(shù)據(jù)的功能模式(回寫(xiě)模式),則執(zhí)行單元寄存器內(nèi)的數(shù)據(jù)將會(huì)過(guò)時(shí)并且必須用寫(xiě)入存儲(chǔ)器地址的數(shù)據(jù)更新。當(dāng)然,如果主處理器處于每次將數(shù)據(jù)寫(xiě)入執(zhí)行單元寄存器時(shí)正常更新存儲(chǔ)器地址上數(shù)據(jù)的功能模式(寫(xiě)入模式),則寄存器與存儲(chǔ)器是一致的。
作為另一個(gè)實(shí)例,如果工作寄存器被用來(lái)保存代碼序列執(zhí)行期間經(jīng)常存入存儲(chǔ)器地址上的數(shù)據(jù),則指令可以在完成將數(shù)據(jù)轉(zhuǎn)移至寄存器111的代碼序列之前從存儲(chǔ)器地址上讀取數(shù)據(jù)。如果主處理器處于只在代碼序列執(zhí)行結(jié)束時(shí)正常更新存儲(chǔ)器地址上數(shù)據(jù)的功能模式(回寫(xiě)模式),則存儲(chǔ)器內(nèi)的數(shù)據(jù)將會(huì)過(guò)時(shí)并且在讀取之前必須用執(zhí)行單元寄存器內(nèi)數(shù)據(jù)更新。如上例所述,如果主處理器處于每次將數(shù)據(jù)寫(xiě)入執(zhí)行單元寄存器時(shí)正常更新存儲(chǔ)器地址上數(shù)據(jù)的功能模式(寫(xiě)入模式),則寄存器與存儲(chǔ)器是一致的。
由于詞態(tài)主機(jī)與代碼詞態(tài)化軟件組合形成的微處理器適于記錄并重新安排以加快執(zhí)行速度,所以存儲(chǔ)器和別名寄存器內(nèi)保存的數(shù)據(jù)可能不一致。從下面代碼序列的各種實(shí)例可見(jiàn),存儲(chǔ)器數(shù)據(jù)一旦在執(zhí)行單元寄存器內(nèi)被賦予別名以用于代碼序列的執(zhí)行,則執(zhí)行單元寄存器內(nèi)數(shù)據(jù)就可以復(fù)制到其它寄存器內(nèi)并且可能對(duì)指令進(jìn)行重新排序和重新安排處理。如果有重新排序和重新安排處理,則代碼序列中的指令可能被寫(xiě)入賦予別名的存儲(chǔ)器地址從而在進(jìn)一步使用之前必須更新執(zhí)行單元寄存器內(nèi)的數(shù)據(jù)。但是,如果執(zhí)行單元寄存器111內(nèi)剛剛過(guò)時(shí)的數(shù)據(jù)已經(jīng)被復(fù)制到其它寄存器內(nèi)并且利用這些寄存器的指令的代碼序列已經(jīng)變動(dòng),則被復(fù)制的寄存器內(nèi)過(guò)時(shí)數(shù)據(jù)可能會(huì)在代碼序列執(zhí)行時(shí)使用。因此可能發(fā)生第二次不一致。
為了保證不在未確認(rèn)存儲(chǔ)器地址上數(shù)據(jù)與寄存器111內(nèi)數(shù)據(jù)一致之前對(duì)受保護(hù)的存儲(chǔ)器地址進(jìn)行加載和存儲(chǔ)操作,存儲(chǔ)器控制單元內(nèi)的比較器113與地址寄存器112相連。在翻譯期間,比較器113從存儲(chǔ)器接收加載地址并存儲(chǔ)到指向存儲(chǔ)器的門(mén)控存儲(chǔ)緩沖器。如果加載或存儲(chǔ)的存儲(chǔ)器地址與寄存器112(或者根據(jù)實(shí)施情況不同而是其它寄存器)內(nèi)的地址進(jìn)行比較,則根據(jù)模式的不同產(chǎn)生一定的意外事件。代碼詞態(tài)化軟件響應(yīng)意外事件,確保存儲(chǔ)器地址與執(zhí)行單元寄存器111保存同一正確數(shù)據(jù)。這可以糾正上述不一致。
代碼詞態(tài)化軟件作出響應(yīng)的方式取決于特定的意外事件。如果是數(shù)據(jù)不一致,則在實(shí)施例中是重新翻譯并不用執(zhí)行單元寄存器內(nèi)的“別名”數(shù)據(jù)重新執(zhí)行。這種解決方案可以糾正存儲(chǔ)器與執(zhí)行單元寄存器數(shù)據(jù)的不一致和存儲(chǔ)器與在代碼序列重新排序和重新安排之前就被從執(zhí)行單元寄存器111復(fù)制到其它寄存器的數(shù)據(jù)的不一致。解決這個(gè)問(wèn)題的其它可行方法是用最近的存儲(chǔ)器數(shù)據(jù)更新執(zhí)行單元寄存器或者用最近的加載數(shù)據(jù)更新存儲(chǔ)器。
在存儲(chǔ)器地址被賦予別名以避免從存取地址加載數(shù)據(jù)期間,由于執(zhí)行單元寄存器111內(nèi)的數(shù)據(jù)可能在新數(shù)據(jù)寫(xiě)入存儲(chǔ)器地址時(shí)過(guò)時(shí),所以比較器監(jiān)視存儲(chǔ)器地址的寫(xiě)入操作。在這種情況下,比較器113監(jiān)視受保護(hù)的存儲(chǔ)器地址的寫(xiě)入操作;并且如果有這種操作就產(chǎn)生意外事件。意外事件使得寄存器數(shù)據(jù)此使用之前將存儲(chǔ)器內(nèi)的數(shù)據(jù)寫(xiě)入寄存器111以更新寄存器,或者導(dǎo)致不使用執(zhí)行單元寄存器的代碼返回并執(zhí)行以完成別名優(yōu)化。這可能涉及目標(biāo)代碼的重新翻譯。
在存儲(chǔ)器地址被賦予別名以使順序存儲(chǔ)操作利用寄存器111表示存儲(chǔ)器地址期間,由于將電路系統(tǒng)置于未檢查別名就從寄存器111將數(shù)據(jù)存入存儲(chǔ)器地址從而使寄存器的數(shù)據(jù)重復(fù)寫(xiě)入受保護(hù)的存儲(chǔ)器地址的模式(寫(xiě)入模式)中,所以禁止產(chǎn)生存儲(chǔ)數(shù)據(jù)到存儲(chǔ)地址的意外事件。
另一方面,在存儲(chǔ)器地址被賦予別名允許利用寄存器111表示存儲(chǔ)器地址的存儲(chǔ)操作期間,電路系統(tǒng)可以處于存儲(chǔ)器地址上數(shù)據(jù)直到代碼序列執(zhí)行完畢或以其他方式終止時(shí)才更新的模式(回寫(xiě)模式)中。在這種模式下,寫(xiě)入存儲(chǔ)器地址的指令可能需要更新保存在執(zhí)行單元寄存器內(nèi)的數(shù)據(jù)使與新數(shù)據(jù)一致。另一方面,在這種模式下,讀取存儲(chǔ)器地址的操作要求產(chǎn)生意外事件,從而可以在讀取之前使存儲(chǔ)器內(nèi)保存的數(shù)據(jù)更新為與執(zhí)行單元寄存器內(nèi)新數(shù)據(jù)一致。
圖12示出了包含本發(fā)明實(shí)施例的比較器120的別名電路,用來(lái)檢測(cè)和控制對(duì)受保護(hù)存儲(chǔ)器的數(shù)據(jù)加載和存儲(chǔ)操作。比較器120包括多個(gè)諸如接內(nèi)容可尋址存儲(chǔ)器的存儲(chǔ)單元122(圖中只示出了一個(gè)),用于存放受保護(hù)存儲(chǔ)器地址的輸入項(xiàng)。例如可以有8個(gè)存儲(chǔ)單元用于輸入項(xiàng)。每個(gè)輸入項(xiàng)包含足夠多數(shù)量的比特位置(例如32個(gè))來(lái)存儲(chǔ)存儲(chǔ)器單元的物理地址、字節(jié)屏蔽和各種屬性比特。在屬性比特中有表示受保護(hù)存儲(chǔ)器大小的比特和表示存儲(chǔ)器地址是正常還是異常的比特。應(yīng)該指出的是,比較器120中輸入項(xiàng)的存儲(chǔ)單元與圖10所示寄存器112等價(jià),從而使得比較器120擔(dān)負(fù)起圖10的寄存器112和比較器113的功能。
別名電路還包括別名使能寄存器124、屏蔽別名使能寄存器的寄存器125、別名出錯(cuò)寄存器126、存儲(chǔ)別名電路使能指示(例如一個(gè)比特)的寄存器127以及存儲(chǔ)模式比特的寄存器128。
在操作中,受保護(hù)的物理地址連同字節(jié)屏蔽(表示哪些位置的字節(jié)受保護(hù)的比特)一起存儲(chǔ)在輸入項(xiàng)的其中一個(gè)存儲(chǔ)單元內(nèi)。這種物理地址可以尋址64比特的數(shù)據(jù),字節(jié)屏蔽的每個(gè)比特表示該地址上數(shù)據(jù)的一個(gè)字節(jié)。受保護(hù)的特定輸入項(xiàng)通過(guò)設(shè)定硬件使能寄存器124的特定比特表示。在翻譯重新開(kāi)始期間,寄存器125屏蔽調(diào)撥時(shí)刻寄存器124內(nèi)的值。在所示實(shí)施例中,使能寄存器124和屏蔽使能寄存器被分配為存儲(chǔ)單元122的屬性比特。
當(dāng)寄存器127指示別名使能時(shí),根據(jù)寄存器128指示的設(shè)定模式,比較器保存物理存儲(chǔ)器地址和字節(jié)屏蔽并用來(lái)檢測(cè)存儲(chǔ)器加載和存儲(chǔ)操作的地址。如果模式設(shè)定為寫(xiě)入狀態(tài),則持續(xù)用執(zhí)行單元寄存器保存的受保護(hù)存儲(chǔ)器地址的數(shù)據(jù)更新存儲(chǔ)器,因此從該存儲(chǔ)器地址加載其它地址的數(shù)據(jù)一直是最新的數(shù)據(jù)并且無(wú)需檢驗(yàn)。但是將數(shù)據(jù)存入存儲(chǔ)器地址可能使執(zhí)行單元寄存器112內(nèi)的數(shù)據(jù)無(wú)效,因此必須測(cè)試存儲(chǔ)數(shù)據(jù)。如果將數(shù)據(jù)存儲(chǔ)在受保護(hù)的地址上并且字節(jié)屏蔽表明數(shù)據(jù)存儲(chǔ)在比較器120保存的存儲(chǔ)器地址的受保護(hù)字節(jié)上,則比較器產(chǎn)生別名意外事件以檢測(cè)寫(xiě)入模式下的存儲(chǔ)操作。
另一方面,如果模式設(shè)定為回寫(xiě)模式狀態(tài),則只有當(dāng)別名硬件釋放或者發(fā)生意外事件時(shí)才更新存儲(chǔ)器地址。因此存儲(chǔ)器地址上的數(shù)據(jù)可能過(guò)時(shí),因此在別名硬件處于使能狀態(tài)時(shí)必須檢測(cè)加載和存儲(chǔ)操作。為此,如果加載或存儲(chǔ)指向受保護(hù)地址并且字節(jié)屏蔽表明被訪(fǎng)問(wèn)的數(shù)據(jù)位于比較器120保存的存儲(chǔ)器地址的受保護(hù)字節(jié)上,則比較器產(chǎn)生別名意外事件。
兩種模式下發(fā)生的意外事件都在別名出錯(cuò)寄存器126內(nèi)設(shè)定合適的比特以表示引起意外事件的地址。根據(jù)代碼詞態(tài)化軟件特定意外事件的句柄,特定的意外事件可以修復(fù)或者返回以解決這種問(wèn)題。問(wèn)題的解決使得最新的數(shù)據(jù)被放入作用于執(zhí)行單元數(shù)據(jù)寄存器和存儲(chǔ)器地址的特定字節(jié)上;這包括返回寄存器125所保存狀態(tài)的使能寄存器124的狀態(tài)。
以上描述了采用別名檢測(cè)硬件可以進(jìn)行減少加載和存儲(chǔ)操作的優(yōu)化并且可以在加載和存儲(chǔ)操作減少的基礎(chǔ)上重新排序和安排操作。重新排序有利于在諸如超標(biāo)量或VLIW機(jī)之類(lèi)并行執(zhí)行資源的機(jī)器上更好地安排操作。
這種方法也可以在不減少加載和存儲(chǔ)操作的情形下,根據(jù)加載和存儲(chǔ)的情況安全地重新排序操作。這改善了安排性能并且適用于不重復(fù)加載或存儲(chǔ)操作的代碼。
本領(lǐng)域內(nèi)的技術(shù)人員將會(huì)發(fā)現(xiàn),微處理器可以通過(guò)電路形式與典型的計(jì)算機(jī)單元連接從而構(gòu)成諸如圖9所示的計(jì)算機(jī)。顯而易見(jiàn),當(dāng)微處理器用于現(xiàn)代X86計(jì)算機(jī)時(shí),它可以通過(guò)處理器總線(xiàn)與存儲(chǔ)器和總線(xiàn)控制電路連接。存儲(chǔ)器和總線(xiàn)控制電路提供了對(duì)主存儲(chǔ)器的訪(fǎng)問(wèn),也提供了對(duì)與微處理器一起使用的高速緩存的訪(fǎng)問(wèn)。存儲(chǔ)器和總線(xiàn)控制線(xiàn)路還提供了對(duì)諸如PCI或其它局部總線(xiàn)的訪(fǎng)問(wèn),通過(guò)這些總線(xiàn)對(duì)I/O設(shè)備進(jìn)行訪(fǎng)問(wèn)。特定的計(jì)算機(jī)系統(tǒng)取決于由本發(fā)明微處理器所替代的典型微處理器一起使用的電路。
為了描述處理器的操作和加快執(zhí)行速度的方法,這里的實(shí)例是將少量X86目標(biāo)代碼翻譯為主基本指令。實(shí)例涉及了將X86目標(biāo)指令翻譯為詞態(tài)主機(jī)指令的過(guò)程,包括本發(fā)明微處理器所作的優(yōu)化、重新排序和重新安排各種步驟。通過(guò)以下描述的過(guò)程,本領(lǐng)域內(nèi)技術(shù)人員將會(huì)理解利用目標(biāo)處理器執(zhí)行源指令所需的操作與主處理器上執(zhí)行翻譯所需操作之間的差別。
用C語(yǔ)言源代碼編寫(xiě)的源指令描述了一個(gè)非常簡(jiǎn)單的循環(huán)操作。當(dāng)每次循環(huán)后都減一的變量“n”大于“0”時(shí),數(shù)值“c”存儲(chǔ)在指針“*s”表示的地址內(nèi),每次循環(huán)之后該指針都增一。
<pre listing-type="program-listing"><![CDATA[  Original C code  while((n--)>0){   *s++=c  }=====================================================================================  Win32 x86 instructions produced by a compiler compiling this C code.  mov%ecx,[%ebp+0xc]// load c from memory address into the ?。cx  mov%eax,[%ebp+0x8]// load s from memory address into the ?。ax  mov[%eax],%ecx// store c into memory address s held in  %eax  add%eax,#4 // increment s by 4.  mov[%ebp+0x8],%eax// store(s+4)back into memory  mov%eax,[%ebp+0x10] // load n from memory address into the ?。ax  lea%ecx,[%eax-1] // decrement n and store the result in ?。cx  mov[%ebp+0x10],%ecx // store (n-1) into memory  and%eax,%eax // test n to set the condition codes  jg .-0x1b// branch to the top of this section if  “n>0”]]></pre>令用匯編語(yǔ)言操作助記符列示,后面跟著涉及特定基本操作的參數(shù)。每條指令的注釋對(duì)操作作了解釋。雖然所示的執(zhí)行順序可以由目標(biāo)處理器改變,但是每次執(zhí)行目標(biāo)C語(yǔ)言指令的循環(huán)時(shí)每條匯編語(yǔ)言指令都必須執(zhí)行。因此,如果循環(huán)執(zhí)行100次,則所示的每條指令也必須執(zhí)行100次。
<pre listing-type="program-listing"><![CDATA[Shows each X86 Instruction shown above followed by the host instructions necessary toimplement the X86 Instruction.mov %ecx, [%ebp+0xc]//load c from memory address into ecxadd R0,Rebp,0xc ;form the memory address and put it in R0ld Recx,[R0] ;load c from memory address in R0 intoRecxmov %eax,[%ebp+0x8] //load s from memory address into %eaxadd R2,Rebp,0x8 ;form the memory address and put it in R2ld Reax,[R2] ;load s from memory address in R2 intoRecxmov [%eax],%ecx // store c into memory address s held in %eaxst[Reax],Recx; store c into memory address s held inReaxadd %eax,#4 // increment s by 4add Reax,Reax,4 ; increment S by 4mov [%ebp+0x8],%eax // store (s+4) back into memoryadd R5,Rebp,0x8 ; form the memory address and put it in R5st[R5],Reax ; store (s+4) back into memorymov %eax,[%ebp+0x10] // load n from memory address into %eaxadd R7,Rebp,0x10 ; form the memory address and put it in R7ldReax,[R7] ; load n from memory address into the Reaxlea %ecx,[%eax-1]// decrement n and store the result in%ecxsub Recx,Reax,1 ; decrement n and store the result in Recxmov [%ebp+0x10],%ecx // store.(n-1) into memoryadd R9,Rebp,0x10 ; form the memory address and put it in R9st[R9],Recx ; store (n-1) into memoryand %eax,%eax// test n to set the condition codesandcc R11,Reax,Reax ; test n to set the condition codesjg.-0x1b // branch to the top of this section if“n>0”jgmainloop,mainloop ; jump to the main loopHost Instruction key   ld=loadadd=ADD st=store   sub=subtract jg=j(luò)ump if condition codes indicate   greater   andcc=and set the condition codes]]></pre>下一實(shí)例描述了執(zhí)行C語(yǔ)言指令的同一目標(biāo)基本指令。但是在每條基本目標(biāo)指令之后列出了在微處理器特定實(shí)施例中完成同一操作所需的基本主指令,其中詞態(tài)主機(jī)為針對(duì)上述方式設(shè)計(jì)的VLIW處理器。值得注意的是,正式目標(biāo)寄存器屏蔽的主寄存器用X86寄存器名的前面加“R”表示,因此例如Reax表示與EAX正式目標(biāo)寄存器相關(guān)的工作寄存器。
<pre listing-type="program-listing"><![CDATA[ mov %ecx, [%ebp+0xc] // load c add R0,Rebp,0xc ; form logical address into R0 chkl R0,Rss_limit ;Check the logical address against segment lower limit chku R0,R_FFFFFFFF ;Check the logical address against segment upper limit add R1,R0,Rss_base ; add the segment base to form the linear address ldRecx,[R1]; load c from memory address in R1 into Recx mov %eax,[%ebp+0x8]// load s add R2,Rebp,0x8 ; form logical address into R0 chkl R2,Rss_limit ;Check the logical address against segment lower limit chku R2,R_FFFFFFFF ;Check the logical address against segment upper limit add R3,R2,Rss_base ; add the segment base to form the linear address ldReax,[R3]; load s from memory address in R3 into Ra mov [%eax],%ecx// store c into [s] chku Reax, Rds_limit;Check the logical address against segment upper limit add R4,Reax,Rds_base; add the segment base to form the linear address st[R4],Recx; store c into memory address s add %eax,#4 // increment s by 4 addcc Reax,Reax,4 ; increment s by 4 mov [%ebp+0x8],%eax// store (s+4) to memory add R5,Rebp, 0x8; form logical address into R5 chkl R5,Rss_limit ;Check the logical address against segment lower limit chku R5,R_FFFFFFFF ;Check the logical address against segment upper limit add R6,R5,Rss_base ; add the segment base to form the linear address st[R6],Reax; store (s+4) to memory address in R6 mov %eax,[%ebp+0x10] // load n add R7,Rebp,0x10; form logical address into R7 chkl R7,Rss_limit ;Check the logical address against segmentlower limitchku R7,R_FFFFFFFF ; Check the logical address against segmentupper limitadd R8,R7,Rss_base ;add the segment base to form the linearaddressldReax,[R8] ;load n from memory address in R8 intoReaxlea %ecx,[%eax-1] //decrement nsub Recx,Reax,1 ;decrement nmov [%ebp+0x10],%ecx// store (n-1)add R9,Rebp,0x10 ; form logical address into R9chkl R9,Rss_limit ; Check the logical address against segmentlower limitchku R9,R_FFFFFFFF ; Check the logical address against segmentupper limitadd R10,R9,Rss_base ;add the segment base to form the linearaddressst[R10],Recx;store n-1 in Recx into memory usingaddress in R10and %eax,%eax //test n to set the condition codesandcc R11,Reax,Reax;test n to set the condition codesjg.-0x1b //branch to the top of this section if“n>0”jgmainloop,mainloop ;jump to the main loopHost Instruction key   chkl+check lower limit   chku=check upper limit]]></pre>下一實(shí)例表示每條基本目標(biāo)指令的主基本指令加法,代碼詞態(tài)化軟件可以利用其產(chǎn)生目標(biāo)操作所需的地址。值得注意的是,主地址生成指令只是在采用代碼詞態(tài)化軟件而非地址生成硬件來(lái)生成地址的微處理器實(shí)施例中才需要。在諸如X86微處理器之類(lèi)的目標(biāo)處理器中,地址是利用地址生成硬件生成的。在這里的實(shí)施例中,無(wú)論何時(shí)產(chǎn)生地址,都完成了計(jì)算;并且還加入主基本指令以檢查地址值從而確定計(jì)算的地址是否在合適的X86段邊界內(nèi)。
<pre listing-type="program-listing"><![CDATA[Adds instructions to maintain the target X86 instruction pointer “eip” andthe commit instructions that use the special morph host hardware to update X86 state.mov%ecx,[%ebp+0xc]// load caddR0,Rebp,0xcchkl R0,Rss_limitchku R0,R_FFFFFFFFaddR1,R0,Rss_baseld Recx, [R1]addReip,Reip,3 ; add X86 instruction length to eipin Reipcommit ; commits working state to officialstatemov%eax,[%ebp+0x8]// load saddR2,Rebp, 0x8chkl R2,Rss_limitchku R2,R_FFFFFFFFadd R3,R2,Rss_baseldReax,[R3]add Reip,Reip,3 ; add X86 instruction length to eipin Reipcommit ; commits working state to officialstatemov [%eax],%ecx // store c into [s]chku Reax,Rds_limitadd R4,Reax,Rds_basest[R4],Recxadd Reip,Reip,2 ; add X86 instruction length to eipin Reipcommit ; commits working state to officialstateadd %eax,#4 // increment s by 4addcc Reax,Reax,4add Reip,Reip,5 ; add X86 instruction length to eipin Reipcommit ; commits working state to officialstatemov [%ebp+0x8],%eax // store (s+4)add R5,Rebp,0x8chkl R5,Rss_limitchku R5,R_FFFFFFFFadd R6,R5,Rss_basest[R6],Reaxadd Reip,Reip,3 ; add X86 instruction length to eipin Reipcommit ; commits working state to officialstatemov %eax,[%ebp+0x10] // load n add R7,Rebp,0x10 chkl R7,Rss_limit chku R7,R_FFFFFFFF add R8,R7,Rss_base ldReax,[R8] add Reip,Reip,3; add X86 instruction length to eip in Reip commit ; commits working state to official state lea %ecx,[%eax-1] // decrement n subRecx,Reax,1 addReip,Reip,3 ; add X86 instruction length to eip in Reip commit ; commits working state to official state mov[%ebp+0x10],%ecx // store (n-1) addR9,Rebp,0x10 chkl R9,Rss_limit chku R9,R_FFFFFFFF addR10,Rg,Rss_base st [R10],Recx addReip,Reip,3 add X86 instruction length to eip in Reip commit ; commits working state to official state and%eax,%eax// test n andcc R11,Reax,Reax addReip,Reip,3 commit ; commits working state to official state jg .-0x1b // branch“n>0” addRseq,Reip,Length(jg) ldcRtarg,EIP(target) selcc Reip,Rseq,Rtarg commit ; commits working state to official state jg mainloop,mainloop Host Instruction keycommit=copy the contents of the working registers to the  official target registers and send working stores to memory]]></pre>
本實(shí)例示出了每組基本主指令的兩步相加,在執(zhí)行了完成每條基本指令所需的主指令后更新正式目標(biāo)寄存器并將門(mén)控存儲(chǔ)緩沖器內(nèi)未動(dòng)用的值調(diào)撥入存儲(chǔ)器。顯而易見(jiàn),在每種情況下,目標(biāo)指令的長(zhǎng)度與工作指令指針寄存器(Reip)內(nèi)的值相加。隨后執(zhí)行調(diào)撥指令。在實(shí)施例中,調(diào)撥指令對(duì)屏蔽在相關(guān)正式目標(biāo)寄存器的工作寄存器的當(dāng)前值進(jìn)行復(fù)制并將指定門(mén)控存儲(chǔ)緩沖器位置的指針值從緊靠未調(diào)撥存儲(chǔ)數(shù)據(jù)之前移動(dòng)至緊靠這些存儲(chǔ)數(shù)據(jù)之后從而將它們放入存儲(chǔ)器。
顯而易見(jiàn)的是上面最后示出的指令清單都是構(gòu)成源目標(biāo)匯編語(yǔ)言指令的主指令翻譯所需的指令。如果翻譯操作在該處停止,則基本主指令的數(shù)量將遠(yuǎn)遠(yuǎn)大于目標(biāo)指令數(shù)量(大約是6倍),并且執(zhí)行時(shí)間將超過(guò)目標(biāo)處理器。但是此時(shí)尚未對(duì)指令進(jìn)行過(guò)重新排序、優(yōu)化和重新安排。
如果指令得到了運(yùn)行但只是一次,則完成指令進(jìn)一步重新排序和其它優(yōu)化所需的時(shí)間可能超過(guò)此時(shí)執(zhí)行翻譯的時(shí)間。如果這樣,微處理器實(shí)施例將在此處停止翻譯,存儲(chǔ)翻譯結(jié)果,隨后執(zhí)行翻譯指令以確定是否發(fā)生意外事件或錯(cuò)誤。在本實(shí)施例中,重新排序其它優(yōu)化步驟僅僅發(fā)生在經(jīng)確定某一翻譯操作將進(jìn)行多次或者需要優(yōu)化時(shí)。例如通過(guò)在每條翻譯指令內(nèi)放入對(duì)翻譯執(zhí)行進(jìn)行計(jì)數(shù)并在計(jì)數(shù)值達(dá)到某一數(shù)值時(shí)產(chǎn)生意外事件(或轉(zhuǎn)移)的主指令來(lái)實(shí)現(xiàn)。意外事件(或轉(zhuǎn)移)將操作轉(zhuǎn)移至代碼詞態(tài)化軟件,由其進(jìn)行下述部分或所有優(yōu)化以及任何適于該翻譯操作的其它優(yōu)化。第二種確定翻譯指令執(zhí)行次數(shù)和是否需要優(yōu)化的方法是以一定的頻度或者根據(jù)一些統(tǒng)計(jì)依據(jù)中斷翻譯指令的執(zhí)行,并優(yōu)化該時(shí)刻運(yùn)行的任何翻譯指令。這最終使得最經(jīng)常運(yùn)行的指令得到了優(yōu)化。另一種方案是對(duì)每一條特定類(lèi)型的主指令進(jìn)行優(yōu)化,例如生成循環(huán)的主指令或者運(yùn)行次數(shù)可能最多的主指令。
<pre listing-type="program-listing"><![CDATA[Assumes 32 bit flat address space which allows the elimination of segment base additionsand some limit checks.   Win32 uses Flat 32b segmentation   Record Assumptions   Rss_base==O   Rss_limit==O   Rds_base==O   Rds_limit==FFFFFFFF   SS and DS protection checkmov %ecx,[%ebp+0xc] // load c add R0,Rebp,0xc chkuR0,R_FFFFFFFF ld Recx,[R0] add Reip,Reip,3 commit mov %eax,[%ebp+0x8] // load s add R2,Rebp,0x8 chkuR2,R_FFFFFFFF ld Reax,[R2] add Reip,Reip,3 commit mov [%eax],%ecx // store c into [s] chkuReax,R_FFFFFFFF st [Reax],Recx add Reip,Reip,2 commit add %eax,#4 // increment s by 4 addcc Reax,Reax,4 add Reip,Reip,5 commit mov [%ebp+0x8],%eax // store (s+4) add R5,Rebp,0x8 chkuR5,R_FFFFFFFF st [R5],Reax add Reip,Reip,3 commit mov %eax,[%ebp+0x10]// load naddR7,Rebp,0x10 chku R7,R_FFFFFFFF id Reax,[R7] addReip,Reip,3 commit lea%ecx,[%eax-1]// decrement n subRecx,Reax,1 addReip,Reip,3 commit mov[%ebp+0x10],%ecx // store (n-1) addR9,Rebp,0x10 chku R9,R_FFFFFFFF st [R9],Recx addReip,Reip,3 commit and%eax,%eax// test n andcc R11,Reax,Reax addReip,Reip,3 commit jg .-0x1b // branch“n>0” addRseq,Reip,Length(jg) ldcRtarg,EIP(target) selcc Reip,Rseq,Rtarg commit jg mainloop,mainloop]]></pre>本實(shí)例示出了可以利用改進(jìn)型微處理器實(shí)現(xiàn)的優(yōu)化步驟的第一步。在優(yōu)化階段,就象代碼詞態(tài)化軟件的許多其它操作一樣,假定是有優(yōu)化結(jié)果的。特定的優(yōu)化操作假定作為為X86系列處理器普通存儲(chǔ)器模型編寫(xiě)的目標(biāo)應(yīng)用程序作為32位程序?qū)⒗^續(xù)保持原樣。將會(huì)注意到是,這種假設(shè)只針對(duì)X86系列而對(duì)其它被仿真的處理器系列并非必要。
如果假設(shè)成立,則在X86應(yīng)用程序中所有的段都被映射至相同的地址空間。這使得可以減少X86分段處理所需的基本主指令。顯而易見(jiàn),段值開(kāi)始時(shí)被設(shè)定為零。隨后,數(shù)據(jù)基點(diǎn)也被設(shè)定為零,并且上限被設(shè)定為最大可用存儲(chǔ)空間。隨后在執(zhí)行目標(biāo)基本指令的每組基本主指令中,都省略了分段所需的對(duì)段基點(diǎn)值的檢查和段基點(diǎn)地址的計(jì)算。這減少了用于需要尋址功能的每條目標(biāo)基本指令的兩條主基本指令執(zhí)行循環(huán)的次數(shù)。此時(shí)仍然需要主指令檢查存儲(chǔ)空間上限。
值得注意的是,這種優(yōu)化需要對(duì)應(yīng)用程序是否采用32位普通存儲(chǔ)器模型作出預(yù)測(cè)。如果不是這樣的情況,則由于主循環(huán)要實(shí)現(xiàn)的目的地址的控制轉(zhuǎn)移并檢查出源地址假設(shè)與目的地址假設(shè)不匹配,所以將會(huì)發(fā)現(xiàn)錯(cuò)誤。隨后將進(jìn)行新的翻譯操作。這種技術(shù)非常常用并且被應(yīng)用于各種分段操作和其它不經(jīng)常變化的“模式化”情況,諸如調(diào)試、系統(tǒng)管理模式或“實(shí)”模式之類(lèi)的“模式”。
<pre listing-type="program-listing"><![CDATA[mov%ecx,[%ebp+0xc]// load c  addR0,Rebp,0xc  ld Recx,[R0]  addReip,Reip,3  commit  mov%eax,[%ebp+0x8]// load s  addR2,Rebp,0x8  ld Reax,[R2]  addReip,Reip,3  commit  mov[%eax],%ecx// store c into [s]  st [Reax],Recx  addReip,Reip,2  commit  add%eax,#4 // increment s by 4  addcc Reax,Reax,4  addReip,Reip,5  commit  mov[%ebp+0x8],%eax// store (s+4)  addR5,Rebp,0x8  st [R5],Reax  addReip,Reip,3  commit  mov%eax,[%ebp+0x10] // load nadd R7,Rebp,0x10  ldReax,[R7]  add Reip,Reip,3  commit  lea %ecx,[%eax-1]// decrement n  sub Recx,Reax,1  add Reip,Reip,3  commit  mov [%ebp+0x10],%ecx // store (n-1)  add R9,Rebp,0x10  st[R9],Recx  add Reip,Reip,3  commit  and %eax,%eax// test n  andcc R11,Reax,Reax  add Reip,Reip,3  commit  jg.-0x1b // branch“n>0”  add Rseq,Reip,Length(jg)  ldc Rtarg,EIP(target)  selcc Reip,Rseq,Rtarg  commit  jgmainloop,mainloop  Host Instruction key   selcc=Select one of the source registers and copy its contents   to the destination register based on the condition codes.]]></pre>上述實(shí)例示出了優(yōu)化步驟的下一階段,其中的預(yù)測(cè)翻譯操作避免了存儲(chǔ)上限邊界的檢查,這只對(duì)于穿越位于存儲(chǔ)器地址空間頂部的存儲(chǔ)器參考位置的未定位頁(yè)面才需要。這種假設(shè)的失效由硬件或軟件定位工具檢查。這減少了對(duì)需要尋址的每條目標(biāo)基本指令用另一主基本指令翻譯的量。這種優(yōu)化需要以前所作的假定,應(yīng)用程序使用32位普通存儲(chǔ)器模型并且預(yù)測(cè)到指令得到了定位。如果上述假設(shè)和預(yù)測(cè)都得不到滿(mǎn)足,則當(dāng)執(zhí)行翻譯指令時(shí)將會(huì)失效;并且需要重新翻譯。
<pre listing-type="program-listing"><![CDATA[Detect and eliminate redundant address calculations. The example shows the code aftereliminating the redundant operations.mov %ecx,[%ebp+0xc]// load cmovadd R0,Rebp,0xc ld Recx,[R0]add Reip,Reip,3commitmov %eax,[%ebp+0x8]// load sadd R2,Rebp,0x8ld Reax,[R2]add Reip,Reip,3commitmov [%eax],%ecx// store c into [s]st [Reax],Recxadd Reip,Reip,2commitadd %eax,#4// increment s by 4addcc Reax,Reax,4add Reip,Reip,5commitmov [%ebp+0x8],%eax// store (s+4)st [R2],Reaxadd Reip,Reip,3commitmov %eax,[%ebp+0x10] // load nadd R7,Rebp,0x10ld Reax,[R7]add Reip,Reip,3commitlea %ecx,[%eax-1] // decrement nsub Recx,Reax,1add Reip,Reip,3commitmov [%ebp+0x10],%ecx // store (n-1)st [R7],Recxadd Reip,Reip,3commitand %eax,%eax // test nandcc R11,Reax,Reaxadd Reip,Reip,3commitjg .-0x1b // branch“n>0” addRseq,Reip,Length(jg) ldcRtarg,EIP(target) selcc Reip,Rseq,Rtarg commit jg mainloop,mainloop]]></pre>本實(shí)例示出了下一步優(yōu)化,其中省略了共用的主指令表達(dá)方式。具體而言,在翻譯第二條目標(biāo)基本指令時(shí),工作寄存器Rebp(表示X86處理器堆?;c(diǎn)寄存器的工作寄存器)內(nèi)的值與偏移值0x8相加并放入主工作寄存器R2。將會(huì)注意到的是,除了將加法結(jié)果放入工作寄存器R5以外,在前面的實(shí)例中,翻譯目標(biāo)基本指令5時(shí)進(jìn)行的是同一操作。因此當(dāng)主基本指令5執(zhí)行期間工作寄存器R5內(nèi)放入的值已經(jīng)存在于工作寄存器R2。這樣在翻譯目標(biāo)基本指令5時(shí)可以省略主加法指令;將工作寄存器R2的值復(fù)制到工作寄存器R5內(nèi)。同樣,由于在翻譯目標(biāo)基本指令6時(shí)已經(jīng)完成了將工作寄存器Rebp的值與偏移值0x10相加的步驟并且結(jié)果駐留在寄存器R7內(nèi),所以在翻譯目標(biāo)基本指令8時(shí)可以省略該步驟。值得注意的是這種優(yōu)化不依賴(lài)于預(yù)測(cè),因此不會(huì)失效或者需要重新翻譯。
<pre listing-type="program-listing"><![CDATA[Assume that target exceptions will not occur within the translation so delay updating eipand target state.mov%ecx,[%ebp+0xc] // load caddR0,Rebp,0xcld Recx,[R0]mov%eax,[%ebp+0x8] // load saddR2,Rebp,0x8ld Reax,[R2]mov[%eax],%ecx // store c into [s]st [Reax],Recxadd%eax,#4 // increment s by 4addReax, Reax, 4mov[%ebp+0x8],%eax // store (s+4)st [R2],Reaxmov%eax,[%ebp+0x10] // load naddR7,Rebp,0x10ld Reax,[R7]lea%ecx,[%eax-1]// decrement nsubRecx,Reax,1mov[%ebp+0x10],%ecx // store (n-1)st [R7],Recxand%eax,%eax// test nandcc R11,Reax,Reaxjg .-0x1b // branch“n>0”addRseq,Reip,Length(block)ldcRtarg,EIP(target)selcc Reip,Rseq,Rtargcommitjg mainloop,mainloop]]></pre>上述實(shí)例示出了一種優(yōu)化步驟,它預(yù)測(cè)構(gòu)成整個(gè)翻譯操作的基本目標(biāo)指令的翻譯能夠不發(fā)生意外事件就完成。如果符合預(yù)測(cè)情況,則無(wú)需在執(zhí)行一條目標(biāo)基本指令的每一主基本指令序列結(jié)束時(shí)更新正式目標(biāo)寄存器或者調(diào)撥存儲(chǔ)緩沖器內(nèi)的未動(dòng)用存儲(chǔ)結(jié)果。如果預(yù)測(cè)為真,則只需在目標(biāo)基本指令序列結(jié)束時(shí)更新正式目標(biāo)寄存器并且存儲(chǔ)內(nèi)容只需被調(diào)撥一次。這可以省略?xún)蓷l執(zhí)行每一基本目標(biāo)指令的基本主指令。它們被一條更新正式目標(biāo)寄存器并將未動(dòng)用存儲(chǔ)內(nèi)容調(diào)撥入存儲(chǔ)器的主基本指令代替。
顯而易見(jiàn)的是,其它的預(yù)測(cè)操作也極有可能是正確的預(yù)測(cè)。如果預(yù)測(cè)保持為真值,那么該步驟與現(xiàn)有仿真技術(shù)比就有極大的優(yōu)勢(shì)。它使所有執(zhí)行目標(biāo)基本指令的基本主指令歸類(lèi)為一個(gè)序列從而可以對(duì)所有主基本指令逐條優(yōu)化。這有利于在得益于超長(zhǎng)指令字技術(shù)的詞態(tài)主機(jī)上并行運(yùn)行大量的操作。由于有更多的優(yōu)化選擇,所以可以采用其它大量的優(yōu)化。但是如果預(yù)測(cè)情況失真并且在執(zhí)行循環(huán)時(shí)發(fā)生意外事件,則由于直到實(shí)際執(zhí)行主指令序列后才發(fā)生調(diào)撥操作,所以正式目標(biāo)寄存器和存儲(chǔ)器保存的是目標(biāo)基本指令序列開(kāi)始時(shí)的正式目標(biāo)狀態(tài)。從意外事件恢復(fù)所需的操作是轉(zhuǎn)儲(chǔ)未動(dòng)用的存儲(chǔ)內(nèi)容,使正式寄存器返回工作寄存器并在序列開(kāi)始時(shí)重新翻譯目標(biāo)基本指令。這種重新翻譯一次翻譯一條目標(biāo)指令,并且在代表每條目標(biāo)基本指令的主序列翻譯之后才更新正式狀態(tài)。隨后執(zhí)行翻譯。當(dāng)該重新翻譯過(guò)程中出現(xiàn)意外事件時(shí),立即使用正式目標(biāo)寄存器和存儲(chǔ)器的正確目標(biāo)狀態(tài)來(lái)執(zhí)行意外事件。
<pre listing-type="program-listing"><![CDATA[In summary add R0,Rebp,0xc   ldRecx,[R0]   add R2,Rebp,0x8   ldReax,[R2]   st[Reax],Recx   add Reax,Reax,4   st[R2],Reax   add R7,Rebp,0x10   ldReax,[R7] // Live out   sub Recx,Reax,1// Live out   st[R7],Recx   andcc R11,Reax,Reax   add Rseq,Reip,Length(block)   ldc Rtarg,EIP(target)   selcc Reip,Rseq,Rtarg   commit   jgmainloop,mainloopThe comment “Live Out”refers to the need to actually maintain Reax andRecx correctly prior to the commit. Otherwise further optimizationmight be possible.]]></pre>上述總結(jié)示出了優(yōu)化過(guò)程中處于該位置時(shí)保留的主基本指令序列。雖然本實(shí)例示出了目標(biāo)指令指針(EIP)串列的維護(hù),但是也可以使翻譯時(shí)轉(zhuǎn)移的指針EIP保持不一致,這將省去實(shí)例中本步驟和后續(xù)步驟中更新序列的指針EIP。
<pre listing-type="program-listing"><![CDATA[Renaming to reduce register resource dependencies. This will allow subsequentscheduling to be more effective. From this point on,the original target X86 code is omittedas the relationship between individual target X86 instructions and host instructionsbecomes increasingly blurred.   add R0,Rebp,0xc   ldR1,[R0]   add R2,Rebp,0x8   ldR3,[R2]   st[R3],R1addR4,R3,4   st [R2],R4   addR7,Rebp,0x10   ld Reax,[R7] // Live out   subRecx,Reax,1// Live out   st [R7],Recx   andcc R11,Reax,Reax   addRseq,Reip,Length(block)   ldcRtarg,EIP(target)   selcc Reip,Rseq,Rtarg   commit   jg mainloop,mainloop]]></pre>本實(shí)例示出了通常稱(chēng)為寄存器更名的下一優(yōu)化步驟,其中需要使用在主基本指令系列中用于多個(gè)操作的工作寄存器的操作改為采用不同的未使用工作寄存器以防止兩條主指令要求使用同一硬件。因此,例如在上述兩例中的第二條主基本指令采用代表正式目標(biāo)寄存器ECX的工作寄存器Recx。第十條主基本指令也使用工作寄存器Recx。通過(guò)改變第二主基本指令中的操作從而使R0內(nèi)地址所指向的值存儲(chǔ)在工作寄存器R1而不是寄存器Recx,兩條主指令就不會(huì)使用同一寄存器。同樣,第四、第五和第六條主基本指令在前面實(shí)例中都使用工作寄存器Reax;通過(guò)使第四主基本指令使用前面未使用的工作寄存器R3而第六主基本指令使用前面未使用的工作寄存器R4,避免了它們使用同一硬件。
<pre listing-type="program-listing"><![CDATA[After the scheduling process which organizes the primitive host operations as multipleoperations that can execute in the parallel on the host VLIW hardware. Each line showsthe parallel operations that the VLIW machine executes,and the“&amp;”indicates theparallelism.   add R2,Rebp,0x8 &amp; add R0,Rebp,0xc   nop &amp; add R7,Rebp,0x10   ldR3,[R2] &amp; add Rseq,Reip,Length(block)   ldR1,[R0] &amp; add R4,R3,4   st[R3],R1 &amp; ldc Rtarg,EIP(target)   ldReax,[R7]&amp; nop   st[R2],R4 &amp; sub Recx,Reax,1   st[R7],Recx&amp; andcc R11,Reax,Reax   selcc Reip,Rseq,Rtarg &amp; jg mainloop,mainloop &amp; commitHost Instruction key   nop=no operation]]></pre>上述實(shí)例示出了在詞態(tài)主機(jī)上執(zhí)行的主基本指令的安排。在該實(shí)例中,假定詞態(tài)主機(jī)為VLIW處理器,除了用于協(xié)調(diào)詞態(tài)化軟件的硬件增強(qiáng)部分以外,詞態(tài)主機(jī)還包括其它處理單元中的兩個(gè)算術(shù)和邏輯(ALU)單元。第一行表示兩個(gè)單獨(dú)的相加指令,它們盡管安排在詞態(tài)主機(jī)上一起運(yùn)行。顯而易見(jiàn),在前述實(shí)例中它們是第三和第八條基本主指令。第二行包括NOP指令(無(wú)操作但是進(jìn)入下一指令)和另一加法操作。NOP指令表示即使在經(jīng)過(guò)某些安排優(yōu)化之后也不一定是兩條指令放在一起運(yùn)行。在任何情況下,該實(shí)例示出了此時(shí)只剩下9組基本主指令來(lái)執(zhí)行原先10條目標(biāo)指令。
<pre listing-type="program-listing"><![CDATA[Resolve host branch targets and chain stored trarslations   add R2,Rebp,0x8 &amp; add R0,Rebp,0xc   nop &amp; add R7,Rebp,0x10   ldR3,[R2] &amp; add Rseq,Reip,Length(block)   ldR1,[R0] &amp; add R4,R3,4   st[R3],R1 &amp; ldc Rtarg,EIP(target)   ldReax,[R7]&amp;nop   st[R2],R4 &amp; sub Recx,Reax,1   st[R7],Recx&amp; andcc R11,Reax,Reax   selcc Reip,Rseq,Rtarg &amp; jg Sequential,Target &amp; commit]]></pre>本實(shí)例除了指令現(xiàn)在被存儲(chǔ)于翻譯緩沖器內(nèi)并且執(zhí)行一次以上(由于最后的跳轉(zhuǎn)(jg)指令現(xiàn)在指向?qū)⒘硪环g指令序列串接起來(lái)的跳轉(zhuǎn)地址)以外基本上是同一組主基本指令。串接過(guò)程使指令序列跳出了翻譯器主循環(huán)從而完成了序列的翻譯。
<pre listing-type="program-listing"><![CDATA[ Advanced Optimizations,Backward Code Motion This and subsequent examples start with the code prior to scheduling. This optimization first depends on detecting that the code is a loop. Then invariant operations can be moved out of the loop body and executed once before entering the loop body. entry   addR0,Rebp,0xc   addR2,Rebp,0x8   addR7,Rebp,0x10   addRseq,Reip,Length(block)   ldcRtarg,EIP(target) Loop   ld R1,[R0]   ld R3,[R2]   st [R3],R1   addR4,R3,4   st [R2],R4   ld Reax,[R7]   subRecx,Reax,1   st [R7],Recx   andcc R11,Reax,Reax   selcc Reip,Rseq,Rtarg   commit   jg mainloop,Loop]]></pre>
上述實(shí)例示出了通常只與大量重復(fù)的序列一起使用的高級(jí)優(yōu)化步驟。該進(jìn)程首先檢測(cè)構(gòu)成循環(huán)的翻譯,并檢查單條基本主指令以確定循環(huán)體內(nèi)哪條指令產(chǎn)生不變結(jié)果。這些指令從循環(huán)內(nèi)去除并且只執(zhí)行一次,將值被放入寄存器內(nèi);從此,存儲(chǔ)在寄存器內(nèi)的值被重復(fù)使用而不是重新運(yùn)行指令。
<pre listing-type="program-listing"><![CDATA[Schedule the loop body after backward code motion. For example purposes,onlythe code in the loop body is shown scheduledEntry  addR0,Rebp,0xc  addR2,Rebp,0x8  addR7,Rebp,0x10  addRseq,Reip,Length(block)  ldcRtarg,EIP(target)Loop  ld R3,[R2] &amp; nop  ld R1,[R0] &amp; add R4,R3,4  st [R3],R1 &amp; nop  ld Reax,[R7] &amp; nop  st [R2],R4 &amp; sub Recx,Reax,1]]></pre>當(dāng)這些不重復(fù)的指令從循環(huán)中去除并且對(duì)序列進(jìn)行安排之后,它們與上述實(shí)例中的指令相同。由此可見(jiàn),在循環(huán)第一次迭代期間完成初始化指令但是只執(zhí)行一次,此后在循環(huán)期間只執(zhí)行所示7個(gè)時(shí)鐘間隔內(nèi)剩余的主基本指令。這樣執(zhí)行時(shí)間從10條指令間隔縮短為7個(gè)指令間隔就能執(zhí)行基本目標(biāo)指令。
顯而易見(jiàn),從循環(huán)中去除的步驟是地址生成步驟。這樣在改進(jìn)型微處理器內(nèi)只需在循環(huán)開(kāi)始時(shí)生成一次地址;即,地址只需生成一次。另一方面,X86目標(biāo)處理器的地址生成硬件必須在每次執(zhí)行循環(huán)時(shí)生成地址。如果循環(huán)執(zhí)行100次,則改進(jìn)型微處理器只生成一次地址而目標(biāo)處理器要生成100次的地址。
<pre listing-type="program-listing"><![CDATA[After Backward Code MotionTarget   add R0,Rebp,0xc   add R2,Rebp,0x8   add R7,Rebp,0x10   add Rseq,Reip,Length(block)   ldc Rtarg,EIP(target)Loopld R1,[R0]ld R3,[R2]st [R3],R1addR4,R3,4st [R2],R4ld Reax, [R7]//Live outsubRecx,Reax,1 //Live outst [R7],Recxandcc R11,Reax,Reaxselcc Reip,Rseq,Rtargcommitjg mainloop,LoopRegister AllocationThis shows the use of register alias detection hardware of the morphhost that allows variables to be safely moved from memory intoregisters.The starting point is the code after“backward code motion”.This shows the optimization that can eliminate loads.First the loads are performed. The address is protected by the aliashardware,such that should a store to the address occur,an“alias”exception is raised. The loads in the loop body are then replaced withcopies. After the main body of the loop,the alias hardware is freed.Entry   add R0,Rebp,0xc   add R2,Rebp,0x8   add R7,Rebp,0x10   add Rseq,Reip,Length(block)   ldc Rtarg,EIP(target)   ldRc,[R0] ;First do the load of the variable frommemory   prot [R0],Aliasl ;Then protect the memory location fromstores   ldRs,[R2]   prot [R2],Alias2   ldRn,[R7]   prot [R7],Alias3Loop   copy R1,Rc   copy R3,Rs   st[R3],R1   add R4,Rs,4   copy Rs,R4   st[R2],Rs,NoAliasCheck   copy Reax,Rn //Live out   sub Recx,Reax,1//Live out   copy Rn,RecxEpilog  FAAlias1 Free the alias detection hardware  FAAlias2 Free the alias detection hardware  FAAlias3 Free the alias detection hardware  j SequentialHost Instruction key   protect=protect address from loads FA=free alias   copy=copy j=j(luò)ump]]></pre>本實(shí)例示出由本發(fā)明微處理器實(shí)現(xiàn)的更為高級(jí)的優(yōu)化步驟。參見(jiàn)本實(shí)例前的第二個(gè)實(shí)例就會(huì)注意到堆棧內(nèi)涉及地址計(jì)算的前3條相加指令。這些地址在主操作序列執(zhí)行期間不會(huì)變化。因此這些地址上存儲(chǔ)的值可以從存儲(chǔ)器內(nèi)查找出來(lái)并載入寄存器以供立即使用。顯而易見(jiàn),在主基本指令6、8和10中都是這樣做的。在指令7、9和11中,每個(gè)存儲(chǔ)器地址被特殊的主別名硬件加上保護(hù)標(biāo)記并且寄存器被表示為這些存儲(chǔ)器地址的別名,所以如果試圖改變數(shù)據(jù)就會(huì)引發(fā)意外事件。此時(shí),每條涉及從堆棧存儲(chǔ)器地址移動(dòng)數(shù)據(jù)的加載操作都變?yōu)楹?jiǎn)單的寄存器之間的復(fù)制操作,這比從存儲(chǔ)器地址加載數(shù)據(jù)要快許多。值得注意的是,一旦循環(huán)執(zhí)行到n=0,則必須去除每個(gè)存儲(chǔ)器地址上的保護(hù)從而可以使用別名寄存器。
<pre listing-type="program-listing"><![CDATA[Copy PropagationAfter using the alias hardware to turn loads within the loop body intocopies,copy propagation allows the elimination of some copies.Entry  add R0,Rebp,0xc  add R2,Rebp,0x8  add R7,Rebp,0x10  add Rseq, Reip,Length(block)  ldc Rtarg,EIP(target)  ldRc,[R0]  prot [R0],Alias1  ldRs,[R2]  prot [R2],Alias2  ldRecx,[R7]  prot [R7],Alias3Loop   st[Rs],Rc   add Rs,Rs,4   st[R2],Rs,NoAliasCheck   copy Reax,Recx //Live out   sub Recx,Reax,1 //Live out   st[R7],Recx,NoAliasCheck   andcc R11,Reax,Reax   selcc Reip,Rseq,Rtarg   commit   jgEpilog,LoopEpilog   FAAlias1   FAAlias2   FAAlias3   j Sequential]]></pre>本實(shí)例示出了下一優(yōu)化步驟,其中大多數(shù)代替上一實(shí)例中優(yōu)化的加載指令的復(fù)制指令并非必要并且可以省略。即,如果進(jìn)行寄存器之間的復(fù)制,則在復(fù)制數(shù)據(jù)的寄存器的操作前數(shù)據(jù)已經(jīng)存在。如果是這樣,可以在第一寄存器內(nèi)訪(fǎng)問(wèn)數(shù)據(jù)而不是在復(fù)制數(shù)據(jù)的寄存器內(nèi),因此可以省略復(fù)制操作。顯而易見(jiàn),這省略了上一實(shí)例循環(huán)中所示的第一、第二、第五和第九基本主指令。此外,其它主基本指令中所用的寄存器也可以改為反映正確的寄存器數(shù)據(jù)內(nèi)容。這樣,例如當(dāng)省略第一和第二復(fù)制指令時(shí),第三存儲(chǔ)指令必須從實(shí)際存在數(shù)據(jù)的工作寄存器Rc(而不是寄存器R1)復(fù)制數(shù)據(jù)并放入實(shí)際存在地址的工作寄存器Rs(而非寄存器R3)表示的地址上。
<pre listing-type="program-listing"><![CDATA[Example illustrating scheduling of the loop body only.Entry   add R0,Rebp,0xc   add R2,Rebp,0x8   add R7,Rebp,0xl0   add Rseq,Reip,Length(block)   ldc Rtarg,EIP(target)   ldRc,[R0]   prot [R0],Aliasl   ldRs,[R2]   prot [R2],Alias2   ldRecx,[R7]   prot [R7],Alias3Loopst [Rs],Rc, &amp; add Rs,Rs,4 &amp; copy Reax,Recx   st [R2],Rs,NAC&amp; sub Recx,Reax,1   st [R7],Recx,NAC &amp; andcc R11,Reax,Reax   selcc Reip,Rseq,Rtarg &amp; jg Epilog,Loop &amp; commitEpilog   FA Alias1   FA Alias2   FA Alias3   j Sequential]]></pre>上述實(shí)例示出了安排后的主指令。將會(huì)看到,在執(zhí)行該循環(huán)時(shí),序列所需的時(shí)鐘數(shù)要少于從源代碼得到的基本目標(biāo)指令所需的時(shí)鐘數(shù)。因此除了所有其它加速技術(shù)以外,所運(yùn)行聯(lián)合的操作的總數(shù)也少于執(zhí)行源目標(biāo)碼所需的操作數(shù)量。
<pre listing-type="program-listing"><![CDATA[Store Elimination by use of the alias hardware.Entry   add R0,Rebp,0xc   add R2,Rebp,0x8   add R7,Rebp,0x10   add Rseq,Reip,Length(block)   ldc Rtarg,EIP(target)   ldRc,[R0]   prot [R0],Alias1 ;protect the address from loads andstores   ldRs, [R2]   prot [R2],Alias2 ;protect the address from loads andstores  ldRecx,[R7]   prot [R7],Alias3 ;protect the address from loads andstoresLoop   st[Rs],Rc, &amp; add Rs,Rs,4 &amp; copy Reax,Recx   sub Recx,Reax,1&amp; andcc R11,Reax,Reax   selcc Reip,Rseq,Rtarg&amp; jg Epilog,Loop &amp; commitEpilog   FAAlias1   FAAlias2   FAAlias3   st[R2],Rs ;writeback the final value of Rs   st[R7],Recx ;writeback the final value of Recx   j Sequential]]></pre>
本實(shí)例所示的最后優(yōu)化用于別名硬件以節(jié)省存儲(chǔ)。這節(jié)省了循環(huán)體內(nèi)的存儲(chǔ)并且只在循環(huán)結(jié)束部分施行。與最初10條目標(biāo)指令相比,這將循環(huán)體內(nèi)主指令的數(shù)量減少到3條。
雖然以上借助實(shí)施例描述了本發(fā)明,但是本領(lǐng)域內(nèi)技術(shù)人員可以在不偏離本發(fā)明范圍和精神的前提下對(duì)本發(fā)明作出各種修改和變動(dòng)。例如雖然本發(fā)明描述的是X86處理器的仿真,但是它也可以應(yīng)用于針對(duì)其它處理器結(jié)構(gòu)設(shè)計(jì)的應(yīng)用程序上,也可以用于運(yùn)行在虛擬機(jī)上的程序,例如P code、Postscript或Java程序等。因此本發(fā)明由下面所附權(quán)利要求限定。
權(quán)利要求
1.一種與微處理器一起使用的存儲(chǔ)控制器,微處理器包括含多個(gè)寄存器的執(zhí)行單元,所述存儲(chǔ)控制器的特征在于包含將執(zhí)行單元執(zhí)行代碼序列期間經(jīng)常訪(fǎng)問(wèn)的存儲(chǔ)器數(shù)據(jù)存儲(chǔ)在執(zhí)行單元的第一寄存器內(nèi)的裝置;在執(zhí)行單元執(zhí)行所述代碼序列期間將執(zhí)行單元第一寄存器內(nèi)數(shù)據(jù)的存儲(chǔ)器地址保存在執(zhí)行單元第二寄存器內(nèi)的裝置;在代碼序列執(zhí)行期間對(duì)存儲(chǔ)器地址的訪(fǎng)問(wèn)進(jìn)行檢查的裝置;以及在代碼序列執(zhí)行期間保證第一寄存器內(nèi)數(shù)據(jù)與存儲(chǔ)器內(nèi)數(shù)據(jù)一致和有效的裝置。
2.如權(quán)利要求1所述的存儲(chǔ)控制器,其特征在于在代碼序列執(zhí)行期間對(duì)存儲(chǔ)器地址的訪(fǎng)問(wèn)進(jìn)行檢查的裝置包含比較器,用于將訪(fǎng)問(wèn)地址與第二寄存器內(nèi)的存儲(chǔ)器地址進(jìn)行比較并根據(jù)比較結(jié)果產(chǎn)生意外事件。
3.如權(quán)利要求2所述的存儲(chǔ)控制器,其特征在于在代碼序列執(zhí)行期間保證第一寄存器內(nèi)數(shù)據(jù)與存儲(chǔ)器內(nèi)數(shù)據(jù)一致和有效的裝置包含軟件實(shí)現(xiàn)裝置,用于響應(yīng)意外事件,用寫(xiě)入的有效數(shù)據(jù)代替過(guò)時(shí)數(shù)據(jù)。
4.如權(quán)利要求2所述的存儲(chǔ)控制器,其特征在于在代碼序列執(zhí)行期間保證第一寄存器內(nèi)數(shù)據(jù)與存儲(chǔ)器內(nèi)數(shù)據(jù)一致和有效的裝置包含軟件實(shí)現(xiàn)裝置,用于響應(yīng)意外事件,將代碼序列重新翻譯為新的代碼序列但不將存儲(chǔ)器數(shù)據(jù)存儲(chǔ)在執(zhí)行單元執(zhí)行代碼序列期間經(jīng)常使用的第一寄存器內(nèi),并執(zhí)行新的代碼序列。
5.如權(quán)利要求2所述的存儲(chǔ)控制器,其特征在于比較器包含產(chǎn)生意外事件的裝置,當(dāng)執(zhí)行代碼序列期間第一寄存器內(nèi)的數(shù)據(jù)(而不是存儲(chǔ)地址內(nèi)的數(shù)據(jù))被使用時(shí),如果試圖向存儲(chǔ)器地址寫(xiě)入數(shù)據(jù),則產(chǎn)生意外事件;并且代碼序列執(zhí)行期間保證第一寄存器內(nèi)數(shù)據(jù)與存儲(chǔ)器內(nèi)數(shù)據(jù)一致和有效的裝置包含用寫(xiě)入存儲(chǔ)器地址的數(shù)據(jù)更新第一寄存器內(nèi)數(shù)據(jù)的裝置。
6.如權(quán)利要求2所述的存儲(chǔ)控制器,其特征在于比較器包含產(chǎn)生意外事件的裝置,當(dāng)執(zhí)行代碼序列期間向第一寄存器(以替代向存儲(chǔ)器地址)內(nèi)加載數(shù)據(jù)時(shí),如果試圖向存儲(chǔ)器地址寫(xiě)入數(shù)據(jù),則產(chǎn)生意外事件;并且代碼序列執(zhí)行期間保證第一寄存器內(nèi)數(shù)據(jù)與存儲(chǔ)器內(nèi)數(shù)據(jù)一致和有效的裝置包含用第一寄存器內(nèi)數(shù)據(jù)更新存儲(chǔ)器地址的數(shù)據(jù)的裝置。
7.一種計(jì)算機(jī)系統(tǒng),其特征在于包含針對(duì)執(zhí)行主指令集指令設(shè)計(jì)的主處理器,所述主處理器包括含多個(gè)寄存器的執(zhí)行單元;將目標(biāo)指令集的指令翻譯為主指令集指令的軟件;存儲(chǔ)被翻譯程序的目標(biāo)指令的存儲(chǔ)器;以及將執(zhí)行代碼序列期間主處理器經(jīng)常使用的存儲(chǔ)器數(shù)據(jù)存儲(chǔ)在執(zhí)行單元的第一寄存器內(nèi)的存儲(chǔ)控制器;保存第一寄存器內(nèi)存儲(chǔ)器數(shù)據(jù)的存儲(chǔ)器地址的第二寄存器;以及選擇代碼序列執(zhí)行期間被主處理器經(jīng)常使用的數(shù)據(jù),將其存儲(chǔ)在第二寄存器內(nèi)的裝置。
8.如權(quán)利要求7所述的計(jì)算機(jī)系統(tǒng),其特征在于進(jìn)一步包括保證第一寄存器內(nèi)數(shù)據(jù)與存儲(chǔ)器內(nèi)數(shù)據(jù)一致的裝置。
9.如權(quán)利要求8所述的計(jì)算機(jī)系統(tǒng),其特征在于保證第一寄存器內(nèi)數(shù)據(jù)與存儲(chǔ)器內(nèi)數(shù)據(jù)一致的裝置包含比較器,用于將訪(fǎng)問(wèn)地址與第二寄存器內(nèi)的存儲(chǔ)器地址進(jìn)行比較,并根據(jù)比較結(jié)果產(chǎn)生意外事件。
10.如權(quán)利要求9所述的計(jì)算機(jī)系統(tǒng),其特征在于保證第一寄存器內(nèi)數(shù)據(jù)與存儲(chǔ)器內(nèi)數(shù)據(jù)一致的裝置進(jìn)一步包含軟件實(shí)現(xiàn)裝置,用于響應(yīng)由比較器產(chǎn)生的意外事件,用寫(xiě)入的有效數(shù)據(jù)代替過(guò)時(shí)數(shù)據(jù)。
11.如權(quán)利要求9所述的計(jì)算機(jī)系統(tǒng),其特征在于保證第一寄存器內(nèi)數(shù)據(jù)與存儲(chǔ)器內(nèi)數(shù)據(jù)一致的裝置包含軟件實(shí)現(xiàn)裝置,用于響應(yīng)比較器產(chǎn)生的意外事件,將代碼序列重新翻譯為新的代碼序列,但不將存儲(chǔ)器數(shù)據(jù)存儲(chǔ)在執(zhí)行單元執(zhí)行代碼序列期間經(jīng)常使用的第一寄存器內(nèi),并執(zhí)行新的代碼序列。
12.如權(quán)利要求9所述的計(jì)算機(jī)系統(tǒng),其特征在于進(jìn)一步包含響應(yīng)意外事件的裝置(該意外事件是在向存儲(chǔ)器地址作寫(xiě)訪(fǎng)問(wèn)時(shí)產(chǎn)生的),用正在寫(xiě)入存儲(chǔ)器地址的數(shù)據(jù)更新第一寄存器存儲(chǔ)的數(shù)據(jù)。
13.如權(quán)利要求9所述的計(jì)算機(jī)系統(tǒng),其特征在于進(jìn)一步包含響應(yīng)意外事件的裝置(該意外事件是在向存儲(chǔ)器作讀訪(fǎng)問(wèn)時(shí)產(chǎn)生的),用存儲(chǔ)在第一寄存器的數(shù)據(jù)更新在存儲(chǔ)器存儲(chǔ)的數(shù)據(jù)。
14.一種提高處理器速度的方法,其特征在于包含以下步驟將執(zhí)行單元執(zhí)行代碼序列期間經(jīng)常訪(fǎng)問(wèn)的存儲(chǔ)器數(shù)據(jù)存儲(chǔ)在執(zhí)行單元的第一寄存器內(nèi);在執(zhí)行單元執(zhí)行所述代碼序列期間將執(zhí)行單元第一寄存器內(nèi)數(shù)據(jù)的存儲(chǔ)器地址保存在執(zhí)行單元第二寄存器;在代碼序列執(zhí)行期間對(duì)存儲(chǔ)器地址的訪(fǎng)問(wèn)進(jìn)行檢查;以及在代碼序列執(zhí)行期間保證第一寄存器內(nèi)數(shù)據(jù)與存儲(chǔ)器地址內(nèi)數(shù)據(jù)一致和有效。
15.如權(quán)利要求14所述的方法,其特征在于在代碼序列執(zhí)行期間對(duì)存儲(chǔ)器地址的訪(fǎng)問(wèn)進(jìn)行檢查的步驟包含以下步驟將訪(fǎng)問(wèn)地址與第二寄存器內(nèi)的存儲(chǔ)器地址進(jìn)行比較;并根據(jù)比較結(jié)果產(chǎn)生意外事件。
16.如權(quán)利要求15所述的方法,其特征在于在代碼序列執(zhí)行期間保證第一寄存器內(nèi)數(shù)據(jù)與存儲(chǔ)器內(nèi)數(shù)據(jù)一致和有效的步驟進(jìn)一步包括以下步驟響應(yīng)意外事件,用寫(xiě)入的有效數(shù)據(jù)代替過(guò)時(shí)數(shù)據(jù)。
17.如權(quán)利要求15所述的方法,其特征在于在代碼序列執(zhí)行期間保證第一寄存器內(nèi)數(shù)據(jù)與存儲(chǔ)器內(nèi)數(shù)據(jù)一致和有效的步驟進(jìn)一步包含以下步驟響應(yīng)意外事件,將代碼序列重新翻譯為新的代碼序列但不將存儲(chǔ)器數(shù)據(jù)存儲(chǔ)在執(zhí)行單元執(zhí)行代碼序列期間經(jīng)常使用的第一寄存器內(nèi),并執(zhí)行新的代碼序列。
18.如權(quán)利要求15所述的方法,其特征在于響應(yīng)比較結(jié)果產(chǎn)生意外事件的步驟包含當(dāng)執(zhí)行代碼序列期間第一寄存器內(nèi)的數(shù)據(jù)被復(fù)制到另一個(gè)寄存器時(shí),如果試圖向存儲(chǔ)器地址寫(xiě)入數(shù)據(jù)進(jìn)行代替,則產(chǎn)生意外事件;并且代碼序列執(zhí)行期間保證第一寄存器內(nèi)數(shù)據(jù)與存儲(chǔ)器內(nèi)數(shù)據(jù)一致和有效的步驟包含以下步驟用寫(xiě)入存儲(chǔ)器地址的數(shù)據(jù)更新第一寄存器內(nèi)數(shù)據(jù)。
19.如權(quán)利要求15所述的方法,其特征在于響應(yīng)比較結(jié)果產(chǎn)生意外事件包含以下步驟當(dāng)執(zhí)行代碼序列期間向第一寄存器內(nèi)復(fù)制數(shù)據(jù)時(shí),如果試圖讀存儲(chǔ)器地址數(shù)據(jù),則產(chǎn)生意外事件;并且代碼序列執(zhí)行期間保證第一寄存器內(nèi)數(shù)據(jù)與存儲(chǔ)器內(nèi)數(shù)據(jù)一致和有效的步驟包含以下步驟用第一寄存器內(nèi)數(shù)據(jù)更新存儲(chǔ)器地址的數(shù)據(jù)。
20.一種微處理器,其特征在于包含能夠執(zhí)行第一指令集的主處理器;代碼詞態(tài)化軟件,它將為具有不同的第二指令集的目標(biāo)處理器編寫(xiě)的程序翻譯為主處理器能夠執(zhí)行的第一指令集;以及存儲(chǔ)控制器,它包含存儲(chǔ)處理單元執(zhí)行代碼序列期間經(jīng)常使用的存儲(chǔ)器數(shù)據(jù)的第一寄存器;保存第一寄存器內(nèi)存儲(chǔ)器數(shù)據(jù)的存儲(chǔ)器地址的第二寄存器;以及選擇代碼序列執(zhí)行期間被處理單元經(jīng)常使用的數(shù)據(jù)存儲(chǔ)在第一寄存器內(nèi)的優(yōu)化裝置。
21.如權(quán)利要求20所述的微處理器,其特征在于進(jìn)一步包括保證第一寄存器內(nèi)數(shù)據(jù)與存儲(chǔ)器內(nèi)數(shù)據(jù)一致的裝置。
22.如權(quán)利要求21所述的微處理器,其特征在于保證第一寄存器內(nèi)數(shù)據(jù)與存儲(chǔ)器內(nèi)數(shù)據(jù)一致的裝置包含比較器,用于將存儲(chǔ)器訪(fǎng)問(wèn)地址與第二寄存器內(nèi)的存儲(chǔ)器地址進(jìn)行比較并根據(jù)比較結(jié)果產(chǎn)生意外事件。
23.如權(quán)利要求22所述的微處理器,其特征在于保證第一寄存器內(nèi)數(shù)據(jù)與存儲(chǔ)器內(nèi)數(shù)據(jù)一致的裝置進(jìn)一步包含軟件實(shí)現(xiàn)裝置,用于響應(yīng)比較器產(chǎn)生的意外事件,將寫(xiě)入的有效數(shù)據(jù)代替過(guò)時(shí)數(shù)據(jù)。
24.如權(quán)利要求22所述的微處理器,其特征在于保證第一寄存器內(nèi)數(shù)據(jù)與存儲(chǔ)器內(nèi)數(shù)據(jù)一致的裝置包含軟件實(shí)現(xiàn)裝置,用于響應(yīng)比較器產(chǎn)生的意外事件,將代碼序列重新翻譯為新的代碼序列但不將存儲(chǔ)器數(shù)據(jù)存儲(chǔ)在執(zhí)行單元執(zhí)行代碼序列期間主處理器經(jīng)常使用的第一寄存器內(nèi),并進(jìn)行新的代碼序列。
25.如權(quán)利要求22所述的微處理器,其特征在于進(jìn)一步包含對(duì)在寫(xiě)入訪(fǎng)問(wèn)存儲(chǔ)器地址期間產(chǎn)生的意外事件作出響應(yīng)的裝置,用于將寫(xiě)入存儲(chǔ)器地址的數(shù)據(jù)更新第一寄存器內(nèi)存儲(chǔ)的數(shù)據(jù)。
26.如權(quán)利要求22所述的微處理器,其特征在于進(jìn)一步包含對(duì)在讀取訪(fǎng)問(wèn)存儲(chǔ)器地址期間產(chǎn)生的意外事件作出響應(yīng)的裝置,用于將存儲(chǔ)在第一寄存器內(nèi)的數(shù)據(jù)更新存儲(chǔ)器地址上的數(shù)據(jù)。
27.一種存儲(chǔ)控制器,其特征在于包含存儲(chǔ)處理單元執(zhí)行代碼序列期間經(jīng)常使用的存儲(chǔ)器數(shù)據(jù)的第一寄存器;保存第一寄存器內(nèi)存儲(chǔ)器數(shù)據(jù)的存儲(chǔ)器地址的第二寄存器;以及選擇將代碼序列執(zhí)行期間被處理單元經(jīng)常使用的數(shù)據(jù)存儲(chǔ)在第二寄存器內(nèi)的裝置;以及保證第一寄存器內(nèi)數(shù)據(jù)與存儲(chǔ)器內(nèi)數(shù)據(jù)一致的裝置。
28.如權(quán)利要求27所述的存儲(chǔ)控制器,其特征在于保證第一寄存器內(nèi)數(shù)據(jù)與存儲(chǔ)器內(nèi)數(shù)據(jù)一致的裝置包含比較器,用于將訪(fǎng)問(wèn)地址與第二寄存器內(nèi)的存儲(chǔ)器地址進(jìn)行比較并根據(jù)比較結(jié)果產(chǎn)生意外事件。
29.如權(quán)利要求28所述的存儲(chǔ)控制器,其特征在于保證第一寄存器內(nèi)數(shù)據(jù)與存儲(chǔ)器內(nèi)數(shù)據(jù)一致的裝置進(jìn)一步包含對(duì)比較器產(chǎn)生的意外事件作出響應(yīng)的裝置,它將寫(xiě)入的有效數(shù)據(jù)代替過(guò)時(shí)數(shù)據(jù)。
30.如權(quán)利要求28所述的存儲(chǔ)控制器,其特征在于保證第一寄存器內(nèi)數(shù)據(jù)與存儲(chǔ)器內(nèi)數(shù)據(jù)一致的裝置包含對(duì)比較器產(chǎn)生的意外事件作出響應(yīng)的裝置,它將代碼序列重新翻譯為新的代碼序列但不將存儲(chǔ)器數(shù)據(jù)存儲(chǔ)在執(zhí)行單元執(zhí)行代碼序列期間主處理器經(jīng)常使用的第一寄存器內(nèi),并進(jìn)行新的代碼序列。
31.如權(quán)利要求28所述的存儲(chǔ)控制器,其特征在于進(jìn)一步包含對(duì)在寫(xiě)入訪(fǎng)問(wèn)存儲(chǔ)器地址期間產(chǎn)生的意外事件作出響應(yīng)的裝置,用于將寫(xiě)入存儲(chǔ)器地址的數(shù)據(jù)更新第一寄存器內(nèi)存儲(chǔ)的數(shù)據(jù)。
32.如權(quán)利要求28所述的存儲(chǔ)控制器,其特征在于進(jìn)一步包含對(duì)在讀取訪(fǎng)問(wèn)存儲(chǔ)器地址期間產(chǎn)生的意外事件作出響應(yīng)的裝置,用于將存儲(chǔ)在第一寄存器內(nèi)的數(shù)據(jù)更新存儲(chǔ)器地址上的數(shù)據(jù)。
全文摘要
一種裝置和方法,它將已經(jīng)存儲(chǔ)在經(jīng)常使用的存儲(chǔ)器地址上的數(shù)據(jù)存儲(chǔ)在主處理器本地寄存器內(nèi)并使寄存器與存儲(chǔ)器的數(shù)據(jù)一致從而使得處理器在尋址存儲(chǔ)器地址時(shí)可以更快地響應(yīng)。
文檔編號(hào)G06F9/318GK1241272SQ97180027
公開(kāi)日2000年1月12日 申請(qǐng)日期1997年9月22日 優(yōu)先權(quán)日1996年9月26日
發(fā)明者M·J·溫, E·J·凱利 申請(qǐng)人:全斯美達(dá)有限公司
網(wǎng)友詢(xún)問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1
康保县| 许昌县| 宁远县| 奉新县| 阳泉市| 铜川市| 宜春市| 噶尔县| 依安县| 宁城县| 广安市| 噶尔县| 修武县| 阜新| 和田县| 襄汾县| 崇明县| 夏河县| 万山特区| 和顺县| 天峨县| 湟源县| 西乌珠穆沁旗| 墨玉县| 临洮县| 巴青县| 新河县| 敖汉旗| 彰武县| 高安市| 新巴尔虎右旗| 金阳县| 富源县| 乐昌市| 灵寿县| 巴彦县| 武乡县| 繁峙县| 武陟县| 饶平县| 利辛县|