專利名稱::產生直接指令的模擬計算機技術的制作方法
技術領域:
:本發(fā)明涉及一種用于模擬一舊微處理器(legacymicroprocessor)指令的方法和設備,更確切而言,涉及一種用于一舊微處理器的模擬系統(tǒng),例如一32位微處理器,其執(zhí)行一編譯的較高階語言,例如C/C++,其中編譯碼被結構化,以使數(shù)據(jù)和指令段被結構化,例如,如同在簡化指令集計算機(RISC)微處理器中,其中盡可能地將舊指令直接映射到主處理器的等效指令,以便改善系統(tǒng)的實時性能。
背景技術:
:已知微處理器配置有不同指令集架構(ISA)。ISA決定一特定微處理器的指令集。應用程序由一微處理器執(zhí)行,通常用一相對高級語言來編寫,其又被編譯成與具體微處理器的指令集兼容的機器指令。由于許多現(xiàn)存微處理器的壽命退化和相應的低速度,常常需要用較新的微處理器(以下稱為主微處理器)來更換陳舊的現(xiàn)存微處理器(以下稱為舊微處理器)。不幸的是,視具體升級不同,多數(shù)情況下主微處理器的指令集與舊微處理器的指令集不兼容。解決該問題的一個方法是在考慮主微處理器的指令集的條件下,重寫現(xiàn)存的應用程序。該技術相對麻煩,且相當昂貴。為了解決指令集的不兼容性,我們已知有軟件系統(tǒng)用來模擬舊微處理器的指令。這樣的系統(tǒng)常常被稱為模擬系統(tǒng)。我們知道,該等模擬系統(tǒng)模擬舊微處理器的指令集,使得用舊微處理器的指令集所編寫的應用程序可由一更新、更快的主微處理器來執(zhí)行。在許多已知的模擬系統(tǒng)中,舊指令(legacyinstruction)由主微處理器來提取,而該主微處理器又使用一查詢表來解譯舊指令。對于該等模擬系統(tǒng),因為必須解譯每個舊指令,所以配備有高速緩沖存儲器的系統(tǒng)的高速緩存未中(cachemiss)的機率會相對較高,此降低了系統(tǒng)的總體流量。為了改善這些模擬系統(tǒng)的流量或速度,已公開的第6,041,402號美國專利揭示了一直接向量舊指令集模擬系統(tǒng)。與提取舊指令并在軟件中解譯指令不同,直接向量舊指令集模擬系統(tǒng)將直接向量提取至模擬舊指令的軟件例行程序。通過提取直接向量,省去了用查詢表來解譯舊指令的需要。由于該系統(tǒng)免除了查詢表訪問,高速緩存未中的機率大大減少,從而提高了系統(tǒng)的流量。不幸的是,對于相對現(xiàn)代的微處理器(例如32位RISC微處理器),直接向量舊指令集模擬需要的運行開銷太多。因此,需要一種模擬舊微處理器的指令的模擬系統(tǒng)和方法,提供比已知模擬系統(tǒng)改進的實時性能。
發(fā)明內容簡言之,本發(fā)明涉及一種用于模擬舊微處理器的指令的系統(tǒng)和方法,這些舊微處理器執(zhí)行一編譯高階語言,例如C/C++,其中編譯碼被結構化,使得數(shù)據(jù)和指令段分離,例如,如同在簡化指令集計算機(RISC)微處理器中。為了改善系統(tǒng)的實時性能,盡可能地將舊指令直接映射到主處理器的等效指令(equivalentinstruction)??梢暻闆r運用其他技術來進一步提高系統(tǒng)的實時性能。當不能達成完全匹配時,使用流向一指令處理程序(handler)的無條件分支指令。該指令處理程序由兩條或更多條主處理器指令組成,該等主處理器指令最終執(zhí)行與被替換的舊指令相同的函數(shù)。對于不能單單用主指令來模擬的舊指令,則由包括數(shù)條主指令并結合使用便箋式寄存器的指令處理程序來模擬這些舊指令。對于涉及到舊微處理器的架構特點、不易以主處理器的匯編語言來處理的舊指令,則自一高級語言(例如C/C++代碼)形成一指令處理程序。通過將舊指令到主指令的直接映射并利用上述模擬技術中的一個或多個技術,根據(jù)本發(fā)明的模擬系統(tǒng)為相對現(xiàn)代的RISC微處理器提供增進的實時性能。附圖簡單說明參照以下說明和本文附圖將不難理解本發(fā)明的這些和其他優(yōu)點。圖1是根據(jù)本發(fā)明的模擬系統(tǒng)的高級方塊圖。圖2是根據(jù)本發(fā)明所使用的指令裂化程序的軟件流程圖。圖3是存儲部分的圖示,其說明根據(jù)本發(fā)明的一個方面的存儲映射。圖4說明例示性舊ADDU(無符號加)指令的操作碼到主ADD指令的直接映射的例示性實例。圖5類似于圖4,但說明了例示性舊LHU(載入無符號半字)指令到主指令的映射。圖6類似于圖4,并說明了例示性舊SRA(右移位代數(shù))指令到主指令的映射。圖7類似于圖4,并說明了例示性舊SYNC指令到主指令的映射。圖8說明用于例示性舊LB(載入字節(jié))指令的主指令處理程序。圖9類似于圖8,但用于例示性舊BEQ(如相等,則分支)指令。圖10說明包括若干直接映射的指令(例如,如圖4至7所示)的指令流,說明流向指令處理程序的無條件分支,該指令處理程序用于無法直接映射到主指令的舊指令。圖11是完全由復數(shù)條主指令模擬的例示性舊指令的模擬實例,其需要便箋式寄存器以用于流向PowerPC處理程序的MISPSLT(如小于,則設置)指令。圖12類似于圖11,只是其說明了例示性MTCl(移向協(xié)處理器1)指令的模擬。圖13A是要求由指令處理程序進行模擬的由高級指令生成的Ring3SYSCALL舊指令的模擬實例。圖13B類似于圖13A,但用于Ring3CFCz舊指令。圖14說明包含各種舊指令的指令流以及相應的處理程序存儲空間。圖15說明根據(jù)本發(fā)明的模擬程序的執(zhí)行。圖16-20說明MIPS型RISC微處理器的各種指令格式。具體實施例方式本發(fā)明涉及一種用來模擬執(zhí)行編譯高階語言(例如C/C++,F(xiàn)ortran或ADA)的特定類別舊微處理器的指令的設備和方法。該編譯代碼通常被結構化,使得數(shù)據(jù)及指令段分離。該編譯代碼也符合描述如過程調用(procedurecalling)、鏈接約定和寄存器使用約定等的其它平臺相關的“應用程序二進制接口”(ABI)。本發(fā)明涉及使用一32位RISC微處理器對另一32位RISC微處理器的模擬。如本文所用,主處理器代表執(zhí)行模擬程序的處理器?!芭f處理器”一詞用于識別正被模擬的處理器。根據(jù)本發(fā)明的模擬技術假設了主處理器與舊處理器之間存在相似性,使舊指令可被歸入下述四類中的一個或多個類別中Ring0——此等舊指令可被執(zhí)行相同函數(shù)的單一主處理器指令所替換。對于此類指令,一般只必需修改指令的操作碼和重新排列指令字段。Ring1——此類舊指令可被執(zhí)行相同函數(shù)的兩條或兩條以上主處理器指令所替換,且無需便箋式寄存器來執(zhí)行該操作。Ring2——此等舊指令可被兩條或更多條執(zhí)行相同函數(shù)的主處理器指令替換,但需要一個或更個便箋式寄存器來執(zhí)行該操作。Ring3——此等舊指令通常涉及舊微處理器的高級架構特點,且還涉及過于復雜而不能僅用主處理器匯編語言來執(zhí)行的指令。此等指令幾乎全部用一高級語言(例如C/C++)進行處理。為了使主處理器能執(zhí)行為舊處理器所編寫的程序,必須將舊處理器的二進制指令以上述四類指令中的一種譯成主處理器二進制指令。所有微處理器都會執(zhí)行的操作有許多,例如簡單算術(即加法、減法、乘法)、邏輯運算(即邏輯與、或、非)以及數(shù)據(jù)移動(即載入和存儲)。在不同品牌和/或型號的RISC微處理器之間,這些指令中的許多十分相似和相同,并常常出現(xiàn)在許多應用程序中。因此,通過盡可能地利用主微處理器與舊微處理器之間的指令集的相似性和利用如在Ring0類中所述的直接映射,將會大大改善系統(tǒng)的實時性能。當無法完全匹配時,則用一流向一由兩條或兩條以上主處理器指令組成的舊指令處理程序的無條件分支指令來替換舊指令,該等主處理器指令最終執(zhí)行與被替換的舊指令相同的函數(shù),例如,對于Ring1和Ring2類的舊指令。無條件分支的使用有助于通過利用主處理器分支預報能力來保持性能。對于涉及舊微處理器的高級特點或不易用主處理器匯編語言進行處理的高級指令,則將Ring3類指令分支出來到較高級語言(例如C/C++),以在較高級別上處理該運算。為了保持Ring0、Ring1和Ring2的性能優(yōu)勢,且因為舊微處理器與主微處理器之間的寄存器使用約定不同,所以將舊寄存器重新映射到對應的功能對等的主寄存器。例如,一PowerPC主微處理器的堆棧指針(stackpointer)為r1,而一MIPSR4400微處理器的堆棧指針為r29。我們知道,已知的模擬器系統(tǒng)可將舊寄存器保存在存儲器中,此需要存儲器存取和額外的主指令來操縱一舊寄存器值,因而大大減低了實時性能。通過將舊寄存器重新映射到主處理器寄存器,實時性能相對于已知模擬系統(tǒng)而言得到了提高?;趯⒂蒑IPS技術公司(MIPSTechnologies,Inc.)(http//www.mips.com)制造的32位R4400RISC微處理器作為舊處理器,以及PowerPC主處理器(http//www.motorola.com/powerpc)來描述本發(fā)明。然而,如上所述,本發(fā)明的原則可適用于任何兼容微處理器,其中一些舊處理器指令可被直接映射到主處理器指令。我們知道,對兼容主/舊處理器組合而言,指令之間1∶1的數(shù)量匹配可能比較高。系統(tǒng)回顧圖1說明了根據(jù)本發(fā)明的模擬系統(tǒng)和方法的高級方塊圖,整體用參考數(shù)字20表示。如上所述,根據(jù)本發(fā)明的模擬系統(tǒng)和方法可適用于其中指令與數(shù)據(jù)分離(如方框22和24所示)的舊微處理器。文件載入程序(fileloader)26找出舊程序的位置,通常以參考數(shù)字28表示。文件載入程序在本
技術領域:
內為人所熟知。文件載入程序26讀取舊文件格式并提取舊二進制文件。如圖1所示,文件載入程序26提取舊指令22以及舊數(shù)據(jù)文件24。這些舊指令22和數(shù)據(jù)文件24可被包含在磁碟、只讀存儲器上或通過網(wǎng)絡被提取。如果舊數(shù)據(jù)24為靜態(tài),則僅將其復制到一與主微處理器程序相關聯(lián)的舊數(shù)據(jù)存儲空間30?;蛘?,可為隨程序運行而動態(tài)創(chuàng)建的數(shù)據(jù)區(qū)(datasection),創(chuàng)建并初始化舊數(shù)據(jù)。數(shù)據(jù)載入程序26將舊指令22提供至一裂化圖目標32。如同下文將詳細論述的,裂化圖目標32特定相關于舊指令集架構和主指令集架構。同樣如同下文將詳細論述的,裂化圖目標32分析每條舊指令22,并根據(jù)上述四種例示性類別(即Ring0、Ring1、Ring2和Ring3)對指令進行分類。如圖1所示,Ring1-3指令被置于獨立于Ring0存儲空間的處理程序存儲空間內。通過裂化圖目標32將Ring0指令直接映射到主處理器存儲空間34。所有其他指令被映射到指令處理程序36。裂化圖目標裂化圖目標32把從文件載入程序26接收的每條舊二進制指令轉換成一條或多條主處理器指令。如上所述,本文所描述和圖示的裂化圖目標32是用于通過PowerPCG3/G4處理器來模擬舊MIPSR4400RISC微處理器的指令。參照圖2,裂化圖目標32在步驟40和42中提取并讀取每條舊指令22。隨后,在步驟44和46中,根據(jù)其操作碼將每條指令解碼。更確切而言,參照下面的表1和表2,將每條舊指令連同其舊操作碼以及其他數(shù)據(jù)字段列于一查詢表中(如下所述)。如下文將詳細論述的,這些查詢表包括每條舊指令22的Ring類型。相應地,裂化圖目標32在步驟48中檢查,以判定指令是否屬于Ring0類。若是,則裂化圖目標32在步驟50中通過翻譯該等操作碼將舊指令22直接映射到一主指令,下文將對此進行詳細論述。然后在步驟52中將翻譯過的主指令寫入應用程序指令流。若舊指令22并非Ring0類,則在步驟54中將指令流中流向下一處理程序的無條件分支指令插入到指令流中。系統(tǒng)隨后在步驟56、58和60中檢查,以判定舊指令是否屬于Ring1類、Ring2類和Ring3類。若在56中判定出舊指令22屬于Ring1類,則在步驟58B中寫入流向指令處理程序36(圖1)的指令,并在步驟60A中將一返回分支指令插入到指令處理程序36的末端。若在步驟58A中判定出指令為一Ring2類指令,則裂化圖目標32將插入指令碼以保存來自便箋式寄存器的數(shù)據(jù),并接著在步驟64中將指令寫入指令處理程序空間36(圖1)。如上所述,Ring2類指令需要復數(shù)條主處理器指令和便箋式寄存器,以便提供一等效于舊指令的函數(shù)。一旦該指令得到模擬,就在步驟66中恢復與Ring2指令相關聯(lián)的便箋式寄存器。系統(tǒng)隨后返回到步驟60A,并在處理器的末端插入一分支以返回到該指令流。若判定出該指令為Ring3類指令,則在步驟60B中,在指令處理程序36中插入指令碼,以保存機器狀態(tài)。接下來在步驟68中,指令處理程序跳到一較高階語言程序(例如C/C++)其向舊指令提供一等效函數(shù)。該較高階語言通過一編譯器來處理至指令處理程序36的返回,其返回至步驟70,在此恢復機器狀態(tài),且通過在處理程序末端插入一返回分支指令,系統(tǒng)返回主指令屏。指令間隔和分支重疊如圖14和15中清晰所示,主處理器程序被示為一指令流,整體以參考數(shù)字72表示,其包括Ring0類指令和流向指令處理程序36的無條件分支(圖1)。將Ring1-3類指令置于獨立于Ring0空間34的處理程序空間36中并利用無條件分支來分支至Ring1-3指令處理程序空間36(圖1)的這一配置被用以保持指令之間的距離。更確切而言,預期每個程序包含跳躍和/或分支指令。如果指令之間的間隔沒有得到保持,跳躍和分支就可能結束在錯誤的位置,因為許多指令以一相對形式運行,即自當前位置向前或向后跳躍一定距離,而非使用一絕對目的地址(destinationaddress)。因此,當無法達成1∶1匹配時,則用一單一無條件分支替代舊指令,正如圖14和15所示。無條件分支指令向量定向(vector)至指令處理程序空間36(圖1)以模擬舊指令。當處理程序完成其函數(shù)時,其返回到跟隨在無條件分支之后的指令,如圖14和15所示。圖3說明一基于相對編址(relativeaddressing)的條件分支轉遞(conditionalbranchforward)的實例。更確切而言,在地址1004處執(zhí)行該指令期間,該程序計數(shù)器指向地址1008處的下一指令。如圖3所示,指令BEQ為一條件分支指令。該條件分支指令如被接受,則會給當前地址加上八(8),到達目的地址1010。若1008或100C處的任一指令都不能被翻譯1∶1,且若在指令行中插入了額外碼,則分支會向量定向至錯誤目的地址。若替代地使用無條件分支來分支至指令處理程式,例如,在指令流72(圖14和15)中插入無條件分支,則距離保持不變。本技術依賴于許多RISC處理器被稱為“分支重疊”的特性,其允許可用處理器將無條件分支從指令流中自動移除,而性能極少或毫不受損。當分支為無條件時,必須予以接受。處理器只是沿著新的路徑開始指令預提取,而與該分支相關聯(lián)的性能損失極少或沒有損失。另一方面,條件分支可造成重大性能損失,因為在已知采用哪條路徑之前,不能進行指令預提取。寄存器映射根據(jù)本發(fā)明的一個方面,使用寄存器映射以防止主處理器與舊處理器之間的沖突。例如,在一MIPSR4400微處理器上,通用寄存器29為堆棧指針。然而在一PowerPC微處理器上,堆棧指針是寄存器1。為防止沖突,將舊指令中的寄存器字段重新映射到主處理器寄存器。在其中將MIPSR4400微處理器指令的舊指令映射到PowerPC指令的實例中,舊指令的寄存器29被重新映射到主處理器的寄存器1,且舊指令的寄存器1被重新映射到主處理器的寄存器29。這可通過將舊寄存器號當作進入一數(shù)組的下標來實現(xiàn),該數(shù)組包含待用于該給定舊寄存器號的主處理器號。指令產生如上所述,舊指令歸為下列四類中的一種Ring0、Ring1、Ring2或Ring3。如上論述,將Ring0舊指令的目標代碼直接映射或轉換到一執(zhí)行相同函數(shù)的單一主指令。本文描述并圖示了舊指令的選擇產生的實例。圖4-7說明了Ring0指令映射。圖8和圖9說明Ring1指令映射的實例。圖11和圖12說明Ring2指令映射的實例,而圖13說明了Ring3指令映射的實例。Ring0指令Ring0指令是可以單一主處理器指令替代的舊處理器指令。多數(shù)時候,需要對舊指令進行二進制重組(即翻譯目標代碼),即使對應的主處理器指令執(zhí)行與舊處理器指令相同的操作。圖4-7說明將數(shù)條32位MIPSR4400RISC處理器指令轉換為32位PowerPCRISC微處理器等效指令的實例。在此例中,MIPS處理器為舊處理器,而PowerPC為主處理器。對于Ring0指令,操作碼(op碼)被改變來與主處理器中合適的指令匹配。在某些情況下,還必須翻譯子操作碼字段。視需要移動寄存器和立即值字段。在某些情況下,主處理器位字段設定為一不活動狀態(tài)。盡管未圖示,也可根據(jù)舊/主處理器組合進行舊寄存器映射。圖4說明最簡單二進制表示的MIPSADDU(無符號加法指令)的實例。為了將ADDU舊指令轉換為一等效主ADD指令,如圖4所示改變操作碼及各種子操作碼字段以及寄存器字段。主指令也有未用于舊指令的2個額外單比特(singlebit)可選字段(optionfield)(即0位和10位)。將這些字段清除即可。參照圖4,ADDU舊指令(將寄存器rs和rt中的值相加,并將結果存儲在寄存器rd中)。如圖所示,舊子操作碼為00000100001,其對應于舊指令的0-10位。二進制值0000010001對應于十進制33。對應的主指令為Add指令。在此情況下,主指令將在其寄存器rA和rB中的值相加,并將結果儲存在寄存器rT中。主處理器指令的格式與對應的舊指令的格式略有不同。此外,主指令包括RC(記錄條件)位和OE(overflowenable,溢出允許)位來充當32位指令的0位和10位。舊MIPS處理器則不具備這些選項。如上所述,將這些位清零即可。將0位和10位清零后,主Add指令的等效子操作碼為100001010。因此,在此情況下,舊操作碼00000100001被翻譯成100001010,且如上所述重新映射寄存器。特別地,將舊寄存器rd映射到主寄存器rT,同時將舊寄存器rs映射到主寄存器rA,最終將舊寄存器rt映射到主寄存器rB。此外,將舊指令的26-31位譯成主指令的合適的操作碼。如圖所示,顯示為000000的26-31位上的操作碼被譯為011111。圖5和圖6說明直接映射的其它實例。例如,圖5說明一舊LHU(載入無符號半字)指令和SRA(右移位代數(shù))指令的直接映射。在LHU指令的情況下,立即數(shù)據(jù)也轉移到主處理器指令。SRA指令包含一立即5位移位計數(shù)字段。最后,圖7說明無自變量的舊Sync指令。類似地,對應的Sync指令沒有自變量。在此情況下,如圖7所示地翻譯操作碼和子操作碼。Ring1指令如上所述,Ring1類舊指令不能直接映射到單一主處理器指令。因此,如上所述,將一無條件分支指令插入到指令流72(圖14、15)中。分支將操作向量定向至指令處理程序,該指令處理程序利用多條主處理指令來模擬被模擬的舊指令的行為。Ring1指令容許可無需便箋式寄存器的足夠簡單的模擬。圖8說明用于舊LB(載入字節(jié))的匯編語言助記和用于LB舊指令的主指令處理程序。舊LB指令被歸類為Ring1指令,是因為該舊指令也執(zhí)行一符號擴展(其根據(jù)所載入字節(jié)的符號來擴展目的寄存器中的符號位)。需要額外主處理器指令來執(zhí)行符號擴展。更確切而言,如圖8所示,需要五個字來處理此指令。第一個字即就是該舊二進制指令。下一個字是指向另一處理程序的指針,該處理程序用于處理具有不同操作數(shù)(operand)的相同指令。這樣做是為了重新利用一已經(jīng)建立的處理程序。該單獨鏈接的列表提供了匹配搜索機制。第三個字開始舊指令的主處理器處理程序??纱嬖谌我鈹?shù)目的主處理器指令。最后,插入主處理器子路徑返回指令,以便回到主指令流。圖9說明了舊BEQ(如為相等指令,則分支)和用于模擬此指令的主指令處理程序。在此情況下,因為舊BEQ指令在一條指令中一并執(zhí)行對比和分支,所以BEQ舊指令被歸類為Ring1指令。主處理器指令不允許在一條指令中進行對比分支。相反,主處理器的指令要求單獨進行對比并將結果存儲在條件碼寄存器中。而后,條件分支使用所儲存的條件碼決定是否分支。在舊目標的情況下,主處理程序也可合并緊隨在該相等指令分支之后的舊指令,因為舊處理器可在計算目的地址的同時對其予以執(zhí)行。盡管沒有在圖中顯示,但是處理程序也能適應上述內容。更具體地參照圖10,其顯示在一具有數(shù)條Ring0指令的指令流中的Ring1指令。每當執(zhí)行Ring1指令時,都利用無條件分支和鏈接指令將執(zhí)行向量定向至由二字頭后的指令開始的指令處理程序。如圖10所示,在該指令處理程序末端,執(zhí)行返回到指令流,且具體而言是返回到緊隨在分支之后的鏈接地址。Ring2指令除了需要一個或多個便箋式寄存器來執(zhí)行操作之外,Ring2指令與Ring1指令類似。這就要求保存出(saveout)這些主處理器寄存器中的一個或多個,并之后在返回舊指令屏之前將其恢復。圖11是Ring2指令的實例。圖11特別說明了舊SLT(如小于則設定的指令)和處理此指令的主指令處理程序。此舊指令執(zhí)行對比,若不相等則儲存零到指定寄存器,若相等則儲存零到指定寄存器。在此情況下,主處理器(PowePC處理器)不具有對應的指令。因此,主處理器代替地執(zhí)行對比,并隨后從條件碼寄存器中取出對比結果。而后,必須將這個值旋轉到正確的位置。這些操作需要便箋式寄存器來運作,所以分配并保存出一個便箋式寄存器,并在完成處理程序時使其恢復。圖12說明連同其對應的主處理器指令處理程序,舊MTC1指令的另一實例。MTC1指令是向協(xié)處理器1指令的移動,其將值從通用寄存器移入浮點寄存器,即舊處理器協(xié)處理器1。在主微處理器(即PowerPC微處理器)的情況下,不存在任何將值直接從通用寄存器移到浮點寄存器的指令。因此,指令處理程序必須利用便箋式寄存器來架構存儲緩沖器的地址。將通用寄存器值儲存在存儲器中,且然后利用浮點載入指令將其轉入浮點寄存器,如圖12所示。據(jù)預料,如果選擇了具有充足寄存器資源的主處理器,那么可避免Ring2指令。在為MIPSR4400舊微處理器和PowerPC主處理器的情況下,其各自具有32位通用寄存器和32位浮點寄存器。這就強制要求通過存儲器來保存寄存器,并在需要一個或多個便箋式寄存器時將其恢復。Ring3指令Ring3指令涉及復雜的操作和不易用主處理器或匯編語言模擬的舊處理器的高級架構特點。因此,替代地用高階語言(例如C/C++)來處理Ring3指令。為了這些指令裝配了主匯編語言處理程序,但其功能是根據(jù)需要調用高階語言分量(Higher-orderlanguagecomponent)。圖13A說明MIPSSYSCALL(系統(tǒng)調用)指令及其主處理程序。如圖所示,在調用高級語言之前保存機器狀態(tài),并在從處理程序返回時返還和恢復。以高階語言調用一函數(shù)的要求在主處理器的應用程序二進制接口(ABI)文獻中有充分記載。這樣的ABI包含必須遵守以確保用于任何給定架構的程序的恰當互動的約定。因此,具體要求由主處理器的選擇決定。因而,Ring3指令的處理程序則為調用高階語言分量所必需的任何代碼。圖13B說明例示性的PowerPC匯編語言和用于一Ring3CFCz指令的例示性處理程序。以PowerPC機器代碼生成指令處理程序。但是,為方便說明,采用的是注釋匯編(commentedassembly)。所模擬的舊指令是CFCz指令,其將32位值從舊協(xié)處理器寄存器移到通用寄存器。舊微處理器(本例中為MIPSRISCR4400微處理器)允許多達4個協(xié)處理器,其中協(xié)處理器1是浮點單元。指令處理程序保存出機器狀態(tài),從處理程序的頂端提取舊指令,且接著取出由協(xié)處理器寄存器號、通用寄存器號和協(xié)處理器號組成的三個自變量。<prelisting-type="program-listing"><![CDATA[//Savethemachinestate.Registersgetsavedonthestack.stwusp,-160(sp)//adjustthestackpointermflrr0//getcurrentlinkregisterstwr0,4(sp)//saveitonthestackstwr0,32(sp)//saveallPowerPCgeneralregisterstothestackstwr1,36(sp)//startingatoffset32...stwr30,152(sp)stwr31,156(sp)//SetuptocalltheC/C++handlercode.ForCFCz,thisinvolvesfetching//thelegacyinstructionfromthetopofthehandler(secondword,just//beforeanyexecutablecode)andextractingtheargumentsfromit.//fetchthelegacyinstructionfromthetopofthehandlersothearguments//canberetrievedbl+4//doalinkingbranchtogettheprogramcounternop//intothelinkregister(can′treaditdirectly)mflrr13//fetchtheprogramcounterfromthelinkregisterlwzr13,-152(r13)//loadthelegacyCFCzinstruction//getthefirstargument-thecontentsofMIPSregisterrdrlwinmr14,r13,23,25,29//extracttherdfieldandmultiplyby2addir14,r14,32//formoffsetintostackforrdlwzxr3,r14,sp//loadthecontentsofrdfromthestack//getthesecondargument-thezfieldrlwinmr4,r13,5,30,31//extractthecoprocessornumber(0-3)//Callthehandlerfunction.TherestwillbehandledinC/C++code.blExecute_CFCz//Execute_CFCzcalledasifitwereaCfunction//thereturnvaluecomesbackinr3-storeitintotheappropriate//registeronthestack-inthenextstageitwillbeplacedintothe//appropriateregisterrlwinmr15,r13,18,25,29//extractthertfieldfromthelegacyinstructionaddir15,r15,32//formoffsetintostackforrdstwxr3,r15,sp//storereturnvalueintoappropriateregister//Restorethemachinestate.Hereallofthenon-volatileregistersare//reloadedandthestackpointerisadjustedback.lwzr0,32(sp)//restorenon-volatileregisterslwzr1,36(sp)lwzr30,152(sp)lwzr31,156(sp)lwzr0,4(sp)//loadtheoriginallinkregistermtlrr0//andrestoreitaddisp,sp,160//restoretheoriginalstackpointerblr//returntotheinstructionstream]]></pre>在設置區(qū)中,將自變量置入主機(即PowerPC)寄存器r3和r4內。這符合用于調用C函數(shù)的PowerPC應用程序二進制接口規(guī)范。對Execute_CFCz的調用是指定的C函數(shù),用于處理CFCz指令。此函數(shù)的實例如下<prelisting-type="program-listing"><![CDATA[#include<CoprocessorControlManager.h>//thereisapointertotheC++classthatmanagestheinteractionwith//upto4MIPScoprocessorsexternCoprocessorControlManager*cp;//wemustgivethisfunctionCstylelanguagenamingsothatitcanbe//calledfromassembly/machinelanguagecodeextern″C″{unsignedlongExecute_CFC(unsignedlongrd,unsignedlongz);};//thiscfunctioncallstheC++objectthatmanagescoprocessor//operations;fortheCTCzinstruction,onlyaregisterreadorwrite//isrequiredbuttheconsequencesofareadorwritearedependenton//thenatureofthecoprocessorunsignedlongExecute_CFC(unsignedlongrd,//passedinPowerPCregisterr3unsignedlongz)//passedinPowerPCregisterr4{returncp->readReg(z,rd);]]></pre>下面是關于處理協(xié)處理器操作的C++類的例示性類說明(classspecification)。<prelisting-type="program-listing"><![CDATA[//thisisanexampleclassspecificationforacoprocessorcontrolobjectclassCoprocessorControlManager{public//thepublicconstructorinitializestheobjectasnecessaryCoprocessorControlManager();//thedestructorperformscleanupwhentheclassisdestroyed-CoprocessorControlManager();//thisfunctionreadsacoprocessorregisterandreturnsitvaluevoidreadReg(unsignedlongz,unsignedlongrd);};]]></pre>下面是一定義于上述類中的協(xié)處理器讀取寄存器函數(shù)的例示性實施例。<prelisting-type="program-listing"><![CDATA[//thisisanexemplaryimplementationofthemethodresponsiblefor//performingreadsfromcoprocessorcontrolregistersunsignedlongCoprocessorControlManager∷readReg(unsignedlongz,unsignedlongrd){//whichcoprocessor?switch(z){//thefloatingpointunitcase0{//whichregistertoreadswitchrd//thisisthecoprocessorimplementationandrevisionregisterwhich//containsinformationaboutthefloatingpointunit(itisreadonly)case0//returntheversionnumberreturn1;//thisisthefloatingpointcontrolandstatusregistercase1//rounding,trapenables,andflagsarestoredhere//CODEOMITTEDbreak;//allotherregisersarereservedforthiscoprocessorsojust//return0;defaultreturn0;}//endcase//noothercaseshandledbydefaultdefaultreturn0;}//endswitch//CODEOMITTED]]></pre>查詢表如上所述,表1和表2代表裂化圖目標32所使用的查詢表,用于為MIPSR4400RISC舊微處理器舊指令識別舊指令,并識別其中每條舊指令的具體Ring類別。表1MIPS32位整數(shù)指令的分類指令操作碼函數(shù)類型RingRSRTRD立即ShamtADD032R10ADDI8I0ADDIU9I0ADDU033R00AND036R00ANDI12I0BC0F16I380BC0FL16I382BC0T16I381BC0TL16I383BC1F17I380BC1FL17I382BC1T17I381BC1TL17I3830BC2F18I380BC2FL18I382BC2T18I3810BC2TL18I383BEQ8I2BEQL20I2BGEZ1I21BGEZAL1I217BGEZALL1I219BGEZL1I23BGTZ7I20BGTZL23I20指令操作碼函數(shù)類型RingRSRTRD立即ShamtBLEZ6I20BLEZL22I20BLTZ1I20BLTZAL1I216BLTZALL1I218BLTZL1I22BNE5I2BNEL21I2BREAK013I0CACHE4713CFC0160R020CFC1170R320CFC2180R320COP016J3upperbitset0COP117J3upperbitset0COP218J3upperbitsetCTC0160R060CTC1170R36CTC2180R360CTC3190R36DIV026R200DIVU027R200ERET1624R316000J2J0JAL3J2JALR09R200JR08R1000LB32I0baseoffsetLBU36I0baseoffsetLH33I0baseoffsetLHU37I0baseoffsetLL48I3baseoffsetLUI15I00LW35I0baseoffsetLWC149I3baseoffsetLWC250I3baseoffsetLWL34I0ba.seoffsetLWR38I0baseoffsetLWU39I0baseoffsetMFC1170R300MFC2180R30MFHI016R1000MFL0018R1000MTC1170R34MTC2180R34MTHI017R2000指令操作碼函數(shù)類型RingRSRTRD立即ShamtMTLO019R2000MULT024R200MULTU025R300NOR039R00OR037R00ORI13I0SB40I0SC56I3baseoffsetSH41I0baseoffsetSLL0OR00SLLV04R00SLT042R20SLTI10I2SLTIU11I2SLTU043R20SRA03R00SRAV07R00SRL02R00SRLV06R00SUB034R10SUBU035R00SW43I0baseoffsetSWC157I3baseoffsetSWC258I3baseoffsetSWL42I0baseoffsetSWR46I0baseoffsetSYNC015R00000SYSCALL012R3codecodecodecodeTEQ052R3codecodeTEQI1I312TGE048R3TGEI1I38TGEIU1I39TGEU049R3codecodeTLBP168R316000TLBR161R316000TLBWI162R316000TLBWR166R316000TLT050R3codecodeTLTI1I310TLTIU1I311TLTU051R3codecodeTNE054R3codecodeTNEI1I314XOR038R00XORI14I0表2MIPS32位浮點指令的分類指令操作碼函數(shù)類型RingFT/底數(shù)(Base)FSFD偏移格式ABS.fmt175R00ADD.fmt170R0C.cond.fmt17FC/condR00CEILLfmt1710R20CEILW.fmt1714R20CVT.D.fmt1733R20CVT.L.fmt1737R20CVT.S.fmt1732R20CVT.W.fmt1736R20DIV.fmt173R0DMFCI170R301FLOOR.Lfmt1711R20FLOOR.W.fmt1715R20MOV.fmt176R00MULfmt172R0NEG.fmt177R00ROUND.Lfmt178R00ROUND.W.fmt1712R00SQRT.fmt174R20TRUNC.Lfmt179R00TRUNC.W.fmt1713R00如圖所示,表1包括例示性十字段。第一字段被識別為指令字段,并識別出每條舊指令的匯編語言“助記”。操作碼字段代表舊指令的操作碼。函數(shù)字段用于整數(shù)指令格式和浮點指令格式指令的寄存器類型指令。例如,圖16-20說明了MIPS微處理器的整數(shù)和浮點二進制指令格式。對于寄存器類型指令,函數(shù)字段被用作子操作碼,并如與圖4實例相關的描述那樣,翻譯成主處理器的函數(shù)字段,例如,0位至10位(參見圖4)。因此,如圖所示,對于ADDU指令,子操作碼(即0位至10位)的十進制值為33。由此,在ADDU指令的情況下,此值33在函數(shù)字段中被識別出來。類型字段與指令類型有關,例如,如圖16-20中所示。表1和表2還包括一Ring字段。Ring字段對應于上文討論的Ring類別。RS、RT和RD字段與舊寄存器有關,并識別與寄存器rs、rt和rd相關聯(lián)的寄存器號。立即字段用于(例如)如圖16所示的立即類型指令。最后,“Shamt”字段與(例如)如圖17所示的舊指令的位移量有關。表2列出了MIPSR4400RISC微處理器的32位浮點指令?!爸噶睢?、“操作碼”、“函數(shù)”、“類型”、“Ring”字段與表1相同?!癋T/底數(shù)”和“偏移”字段用于(例如)如圖19所示的立即類型浮點指令。FT、FS和FD字段是指浮印指令的寄存器號。格式字段表示浮點值的大小和格式。表3說明了用于指定單精度和雙精度IEEE754浮點值以及單字和長字定點值(fixedpointvalue)的有效格式字段代碼。格式字段的其他值雖有可能,但僅用于指令解碼。顯然,根據(jù)前述內容,可對本發(fā)明進行許多更改和變化。因此,應了解,在所附權利要求的范疇內,可以以不同于上文具體描述的方式來實施本發(fā)明。權利要求1.一種用于模擬一具有一主微處理器的舊微處理器的指令的方法,其包括以下步驟(a)將一條或多條舊指令的目標碼轉換為具有等效函數(shù)的定義Ring0指令的一條或多條主處理器指令的目標碼。(b)用所述Ring0指令替換舊指令。2.根據(jù)權利要求1所述的方法,還包括將與所述舊指令相關聯(lián)的寄存器重新映射到相應的主寄存器的步驟。3.根據(jù)權利要求1所述的方法,還包括利用定義Ring1指令的多條主指令來替換一條或多條所述舊指令的步驟,該等主指令共同執(zhí)行與一單一舊指令相同的函數(shù)。4.根據(jù)權利要求3所述的方法,還包括利用利用定義Ring2指令的多條主指令來替換一條或多條所述舊指令的步驟,該等主指令共同執(zhí)行與一單一便箋式寄存器相同的函數(shù),但是需要一個或多個便箋式寄存器。5.根據(jù)權利要求4所述的方法,還包括模擬舊指令的步驟,所述舊指令僅可用一定義一Ring3指令的高級語言來模擬。6.根據(jù)權利要求5所述的方法,還包括為所述Ring1指令提供一指令處理程序。7.根據(jù)權利要求6所述的方法,還包括為所述Ring2指令提供一指令處理程序。8.根據(jù)權利要求7所述的方法,還包括為所述Ring3指令提供一處理程序。9.根據(jù)權利要求8所述的方法,其中,所述指令處理程序被映射到與所述Ring0指令分開的獨立地址空間。10.根據(jù)權利要求9所述的方法,其中,所述被模擬的指令形成一包含Ring0指令和無條件分支指令的指令流,流向用于所述Ring1、Ring2和Ring3指令的指令處理程序。全文摘要一種用于模擬執(zhí)行一編譯高階語言(例如C/C++)的舊微處理器的指令的系統(tǒng)和方法,其中編譯代碼被結構化,使得數(shù)據(jù)及指令段分離。為了改善系統(tǒng)的實時性能,盡可能將舊指令直接映射到主處理器的等效指令??蛇x擇采用其他技術,以進一步提高系統(tǒng)的實時性能。通過利用舊指令到主指令的直接映射,根據(jù)本發(fā)明的模擬系統(tǒng)為相對現(xiàn)代的RISC微處理器提供改進的實時性能。文檔編號G06F9/455GK1538291SQ20041000651公開日2004年10月20日申請日期2004年3月4日優(yōu)先權日2003年3月6日發(fā)明者W·J·坎農,WJ坎農,E·W·茲沃納,茲沃納,T·R·郝瑞格,郝瑞格,P·D·伍德,伍德申請人:諾斯羅普-格魯曼公司