專利名稱:針對(duì)sse2指令的二進(jìn)制浮點(diǎn)翻譯方法
技術(shù)領(lǐng)域:
本發(fā)明涉及的是一種動(dòng)態(tài)二進(jìn)制翻譯技術(shù)領(lǐng)域的方法,具體是一種針對(duì)SSE2指 令的二進(jìn)制浮點(diǎn)翻譯方法。
背景技術(shù):
動(dòng)態(tài)二進(jìn)制翻譯技術(shù)是當(dāng)前計(jì)算機(jī)領(lǐng)域的一個(gè)重要研究方向,是一種可以直接將 二進(jìn)制可執(zhí)行文件翻譯的技術(shù),從而解決軟件移植的問題。 一般來說,不同的處理器支持不 同的指令集體系結(jié)構(gòu)(ISA),譬如Intel x86,MIPS,P0WERPC等多種體系結(jié)構(gòu)。針對(duì)某個(gè)結(jié) 構(gòu)開發(fā)的應(yīng)用程序無法運(yùn)行在另一個(gè)體系結(jié)構(gòu)上,這樣限制了軟件的應(yīng)用和推廣。如果采 用硬件技術(shù),即在處理器上增加相應(yīng)的單元與其他處理器兼容,在增加功耗的同時(shí)大大降 低了效率;而如果采用二進(jìn)制這種軟件翻譯技術(shù),可以在兼容軟件的同時(shí),保持硬件結(jié)構(gòu)的 穩(wěn)定,擴(kuò)大了軟硬件的適用范圍。 浮點(diǎn)數(shù)是計(jì)算機(jī)近似地表示任意某個(gè)實(shí)數(shù),這種表示方法類似于基數(shù)為10的科 學(xué)計(jì)數(shù)法。浮點(diǎn)計(jì)算是指浮點(diǎn)數(shù)參與的運(yùn)算,這種運(yùn)算通常伴隨著因?yàn)闊o法精確表示而進(jìn) 行的近似或舍入。具有強(qiáng)大浮點(diǎn)運(yùn)算功能的CPU,可以使電腦運(yùn)算更加精確、電腦圖像更加 逼真生動(dòng)。與相同位數(shù)的整數(shù)相比,浮點(diǎn)數(shù)的表示范圍更廣,精度更高。可以說,浮點(diǎn)運(yùn)算 能力是關(guān)系到CPU的多媒體,3D圖形處理的一個(gè)重要指標(biāo)。因此,在動(dòng)態(tài)二進(jìn)制翻譯領(lǐng)域, 出于功能和性能考慮,需要對(duì)浮點(diǎn)指令進(jìn)行有效正確的翻譯,實(shí)現(xiàn)某體系架構(gòu)下的浮點(diǎn)指 令集運(yùn)行于另一個(gè)不同體系架構(gòu)平臺(tái)上。 SSE(Streaming SIMD Extensions)是英特爾針對(duì)浮點(diǎn)指令在其IA32架構(gòu)的計(jì)算 機(jī)芯片Pentium III中引入的指令集,是匪x的超集。AMD后來在Athlon xP中加入了對(duì)這 個(gè)指令集的支持。這個(gè)指令集增加了對(duì)8個(gè)128位寄存器x匪0-x匪7的支持,每個(gè)寄存器 可以存儲(chǔ)4個(gè)單精度浮點(diǎn)數(shù)。使用這些寄存器的程序必須使用FxSAVE和FxRSTR指令來保 持和恢復(fù)狀態(tài)。在SSE指令集的基礎(chǔ)上,SSE2 (Streaming SMD Extensions 2)使用了 144 個(gè)新增指令,擴(kuò)展了匪x技術(shù)和SSE技術(shù),這些指令提高了廣大應(yīng)用程序的運(yùn)行性能。隨 匪x技術(shù)引進(jìn)的SMD整數(shù)指令從64位擴(kuò)展到了 128位,使SMD整數(shù)類型操作的有效執(zhí)行 率成倍提高。雙倍精度浮點(diǎn)SIMD指令允許以SIMD格式同時(shí)執(zhí)行兩個(gè)浮點(diǎn)操作,提供雙倍 精度操作支持有助于加速內(nèi)容創(chuàng)建、財(cái)務(wù)、工程和科學(xué)應(yīng)用。除SSE2指令之外,最初的SSE 指令也得到增強(qiáng),通過支持多種數(shù)據(jù)類型(例如,雙字和四字)的算術(shù)運(yùn)算,支持靈活并且 動(dòng)態(tài)范圍更廣的計(jì)算功能。SSE2指令可讓軟件開發(fā)員更加靈活地實(shí)施方法,并在運(yùn)行諸如 MPEG-2、MP3、3D圖形等之類的軟件時(shí)增強(qiáng)性能。Intel是從Willamette核心的Pentium 4 開始支持SSE2指令集的,而AMD則是從K8架構(gòu)的SledgeHammer核心的Opteron開始才支 持SSE2指令集的。 x86是現(xiàn)今最為常見的PC機(jī)體系結(jié)構(gòu),因此讓其他通用體系結(jié)構(gòu)(例如MIPS, POWERPC,ARM等)的應(yīng)用程序運(yùn)行在x86結(jié)構(gòu)上具有很強(qiáng)的應(yīng)用性。其中浮點(diǎn)處理是應(yīng)用 程序的一個(gè)重要部分。在x86機(jī)器上,通常使用x87指令進(jìn)行浮點(diǎn)運(yùn)算,x87指令使用的寄存器以棧的形式組織。 經(jīng)對(duì)現(xiàn)有文獻(xiàn)檢索發(fā)現(xiàn),美國專利號(hào)為712222,名稱為HANDLING FLOATING POINTOPERATIONS(浮點(diǎn)指令的操作),該技術(shù)的動(dòng)態(tài)二進(jìn)制翻譯系統(tǒng)中,X86結(jié)構(gòu)的浮點(diǎn)指 令處理普遍使用x87 FPU指令,數(shù)據(jù)從內(nèi)存中壓入push進(jìn)棧,通過pop指令彈棧返回內(nèi)存。 與浮點(diǎn)操作相關(guān)的指令將兩個(gè)源操作數(shù)統(tǒng)一從棧內(nèi)彈出,進(jìn)行操作,得到的結(jié)果壓入棧頂。 這種方式有著指令豐富的優(yōu)點(diǎn),但是浮點(diǎn)寄存器的棧式組織形式給寄存器的操作帶來很大 的不便,給編程人員帶來了很大挑戰(zhàn)。 經(jīng)檢索還發(fā)現(xiàn),在一些三相動(dòng)態(tài)二進(jìn)制翻譯系統(tǒng)中,采用了簡化處理方法,以加法 指令為例,該技術(shù)先將兩個(gè)加法源操作數(shù)壓入浮點(diǎn)寄存器棧,即把操作數(shù)數(shù)值分別裝載到 ST(O), ST(1),然后進(jìn)行這兩個(gè)寄存器數(shù)值的加法操作(有的加法指令包含運(yùn)算后彈棧操 作,有的則沒有,這里采用包含彈棧操作的指令),得到的結(jié)果存儲(chǔ)在ST(O), ST(l)已經(jīng)在 運(yùn)算指令中彈出,接下來再把ST(O)存入對(duì)應(yīng)的內(nèi)存,并彈棧,此時(shí)寄存器棧清空,下一條 浮點(diǎn)指令過程繼續(xù)這一過程,但是該技術(shù)效率差,每次浮點(diǎn)運(yùn)算都會(huì)包含三次訪存操作,開 銷較大;另外浮點(diǎn)寄存器的使用效率也較低下,沒有得到充分利用。
發(fā)明內(nèi)容
本發(fā)明的目的是克服現(xiàn)有技術(shù)中的上述不足,提供一種針對(duì)SSE2指令的二進(jìn)制 浮點(diǎn)翻譯方法。本發(fā)明是利用IA32體系的高效浮點(diǎn)指令集SSE2來實(shí)現(xiàn)x86為后端的浮點(diǎn) 翻譯方法,通過讓后端的寄存器分配可控可改,進(jìn)而改善性能,使得編程人員能夠完全支配 寄存器的映射,保證源機(jī)器平臺(tái)程序在x86結(jié)構(gòu)下正確運(yùn)行的同時(shí),提高執(zhí)行性能。
本發(fā)明是通過以下技術(shù)方案實(shí)現(xiàn)的,包括步驟如下
第一步,構(gòu)建針對(duì)SSE2指令的中間浮點(diǎn)指令集。 所述的中間浮點(diǎn)指令集包括內(nèi)存訪問指令、數(shù)據(jù)運(yùn)算指令、數(shù)據(jù)移動(dòng)指令和寄 存器狀態(tài)映射指令,其中內(nèi)存訪問指令包括將數(shù)據(jù)從內(nèi)存加載到寄存器FLD和將數(shù)據(jù) 從寄存器存儲(chǔ)到內(nèi)存FST ;數(shù)據(jù)指令包括單精度浮點(diǎn)的加法FSADDS、雙精度浮點(diǎn)的加法 FSADDD、單精度浮點(diǎn)的減法FSSUBS、雙精度浮點(diǎn)的減法FSSUBD、單精度浮點(diǎn)的乘法FSMULS、 雙精度浮點(diǎn)的乘法FSMULD、單精度浮點(diǎn)的除法FSDIVS、雙精度浮點(diǎn)的除法FSDIVD、單精度 浮點(diǎn)的開方FSSQRTS和雙精度浮點(diǎn)的開方FSSQRTD ;數(shù)據(jù)移動(dòng)指令是將數(shù)據(jù)在寄存器間進(jìn) 行移動(dòng)FM0V ;寄存器狀態(tài)映射指令包括將單精度浮點(diǎn)從虛擬寄存器映射到浮點(diǎn)寄存器 FSPUTS、將雙精度浮點(diǎn)從虛擬寄存器映射到浮點(diǎn)寄存器FSPUTD、將單精度浮點(diǎn)從浮點(diǎn)寄存 器映射到虛擬寄存器FSGETS和將雙精度浮點(diǎn)從浮點(diǎn)寄存器映射到虛擬寄存器FSGETD。
第二步,以基本塊為單位,將前端源機(jī)器浮點(diǎn)指令翻譯為中間浮點(diǎn)指令,并通過寄 存器狀態(tài)映射指令,將位于前端浮點(diǎn)寄存器中的指令操作數(shù)映射到由內(nèi)存虛擬的虛擬寄存 器中。 第三步,根據(jù)中間浮點(diǎn)指令的操作碼和操作類型,得到每條中間浮點(diǎn)指令的操作 數(shù)個(gè)數(shù)和操作數(shù)類型,將虛擬寄存器中的所有操作數(shù)通過寄存器映射函數(shù)映射到后端浮點(diǎn) 寄存器中 所述的寄存器映射函數(shù)采用簡化的圖染色方法。所述的操作類型包括狀態(tài)映射0PK_STATEMAP、內(nèi)存訪問0PK—MEM0RYACCESS、數(shù)據(jù)移動(dòng)0PK_DATAM0VEMENT和數(shù)據(jù)計(jì)算0PK_C0MPUTATI0N。 第四步,根據(jù)中間浮點(diǎn)指令的操作碼及操作數(shù),將后端浮點(diǎn)寄存器中的中間浮點(diǎn) 指令翻譯成x86體系的SSE2指令,該SSE2指令與整形操作指令組成若干基本塊存放在 Tcache中。 與現(xiàn)有技術(shù)相比,本發(fā)明的有益效果是利用了后端X86結(jié)構(gòu)的高效浮點(diǎn)處理指 令集SSE2,減少了前后端浮點(diǎn)體系的耦合性,相對(duì)于目前一些動(dòng)態(tài)二進(jìn)制翻譯系統(tǒng)中采用 的X86下的X87翻譯模式,更有效地實(shí)現(xiàn)了目標(biāo)端寄存器的分配替換,減少了因此帶來的訪 存開銷,使得編程人員能夠完全支配寄存器的映射,適用于多源單目標(biāo)平臺(tái)的三相動(dòng)態(tài)二 進(jìn)制翻譯系統(tǒng)。
具體實(shí)施例方式
以下對(duì)本發(fā)明的方法作進(jìn)一步描述本實(shí)施例在以本發(fā)明技術(shù)方案為前提下進(jìn)行 實(shí)施,給出了詳細(xì)的實(shí)施方式和具體的操作過程,但本發(fā)明的保護(hù)范圍不限于下述的實(shí)施 例。 實(shí)施例 本實(shí)施例用于將MIPS體系結(jié)構(gòu)下單精度浮點(diǎn)指令A(yù)DD. S fd,fs,ft翻譯為X86體 系結(jié)構(gòu)下的SSE2指令A(yù)DDSD(xmml, xmm2),包括步驟如下
第一步,構(gòu)建針對(duì)SSE2指令的中間浮點(diǎn)指令集。 所述的中間浮點(diǎn)指令集包括內(nèi)存訪問指令、數(shù)據(jù)運(yùn)算指令、數(shù)據(jù)移動(dòng)指令和寄 存器狀態(tài)映射指令,其中內(nèi)存訪問指令包括將數(shù)據(jù)從內(nèi)存加載到寄存器FLD和將數(shù)據(jù) 從寄存器存儲(chǔ)到內(nèi)存FST ;數(shù)據(jù)指令包括單精度浮點(diǎn)的加法FSADDS、雙精度浮點(diǎn)的加法 FSADDD、單精度浮點(diǎn)的減法FSSUBS、雙精度浮點(diǎn)的減法FSSUBD、單精度浮點(diǎn)的乘法FSMULS、 雙精度浮點(diǎn)的乘法FSMULD、單精度浮點(diǎn)的除法FSDIVS、雙精度浮點(diǎn)的除法FSDIVD、單精度 浮點(diǎn)的開方FSSQRTS和雙精度浮點(diǎn)的開方FSSQRTD ;數(shù)據(jù)移動(dòng)指令是將數(shù)據(jù)在寄存器間進(jìn) 行移動(dòng)FM0V ;寄存器狀態(tài)映射指令包括將單精度浮點(diǎn)從虛擬寄存器映射到浮點(diǎn)寄存器 FSPUTS、將雙精度浮點(diǎn)從虛擬寄存器映射到浮點(diǎn)寄存器FSPUTD、將單精度浮點(diǎn)從浮點(diǎn)寄存 器映射到虛擬寄存器FSGETS和將雙精度浮點(diǎn)從浮點(diǎn)寄存器映射到虛擬寄存器FSGETD。
本實(shí)施例中單精度浮點(diǎn)的加法指令FSADDS的定義包括該指令的操作數(shù)、操作 數(shù)寄存器的使用狀態(tài)、該指令的操作碼和操作類型,其中,操作數(shù)包括源操作數(shù)oprl、源 操作數(shù)opr2和目的操作數(shù)opr3,兩個(gè)源操作數(shù)的寄存器狀態(tài)都定義為FREG_USE,目的 操作數(shù)的寄存器狀態(tài)定義為FREG_DEF,該指令的操作碼是0P_FSADDS,操作類型為0PK_ COMPUTATION 第二步,將前端源機(jī)器浮點(diǎn)指令A(yù)DD. S fd,fs,ft翻譯為中間浮點(diǎn)指令FSADDS,并 通過寄存器狀態(tài)映射指令,將位于前端浮點(diǎn)寄存器中的指令操作數(shù)映射到由內(nèi)存虛擬的虛 擬寄存器中。 本實(shí)例中所述的前端源機(jī)器浮點(diǎn)指令A(yù)DD.S被翻譯為四條中間指令,其中第一 條寄存器狀態(tài)映射指令FSGETS和第二條寄存器狀態(tài)映射指令FSGETS的作用是分別將加法 操作中的兩個(gè)源操作數(shù)fs和ft映射到內(nèi)存模擬的虛擬寄存器srcl和src2中,第三條單 精度加法中間浮點(diǎn)指令FSADDS是將得到的源操作數(shù)進(jìn)行相加,第四條寄存器狀態(tài)映射指
5令FSPUTS是將得到的結(jié)果由虛擬寄存器dst映射回MIPS前端浮點(diǎn)寄存器。 第三步,根據(jù)中間浮點(diǎn)指令的操作碼和操作類型,得到每條中間浮點(diǎn)指令的操作
數(shù)個(gè)數(shù)和操作數(shù)類型,將虛擬寄存器中的所有操作數(shù)通過寄存器映射函數(shù)映射到后端目標(biāo)
寄存器中。 本實(shí)例中單精度加法指令FSADDS的三個(gè)操作數(shù)分別是oprl、 opr2和opr3,三個(gè)操作數(shù)所在的虛擬寄存器分別為srcl、 src2和dst,通過簡化的圖染色方法建立虛擬寄存器和后端目標(biāo)寄存器的映射關(guān)系,三個(gè)操作數(shù)對(duì)應(yīng)的后端目標(biāo)寄存器分別為Tsrcl、 Tsrc2和Tdst。 第四步,根據(jù)中間浮點(diǎn)指令的操作碼及操作數(shù),將后端浮點(diǎn)寄存器中的中間浮點(diǎn)指令翻譯成x86體系的SSE2指令,這些指令與其他整形操作指令組織成一個(gè)個(gè)基本塊,存放在Tcache中。 本實(shí)例單精度加法指令FSADDS操作碼是0P_FSADDS,共有三個(gè)操作數(shù)oprl、 opr2和opr3,所在的虛擬寄存器分別為srcl、 src2和dst,所在的目標(biāo)寄存器號(hào)分別為Tsrcl、Tsrc2和Tdst : 1)如果寄存器srcl與dst相同,即oprl和opr3對(duì)應(yīng)同一個(gè)目標(biāo)寄存器,中間浮點(diǎn)指令FSADDS翻譯為SSE2指令A(yù)DDSD (Tsrc2, Tdst); 2)如果寄存器src2和dst相同,即opr2和opr3對(duì)應(yīng)同一個(gè)目標(biāo)寄存器,中間浮點(diǎn)指令FSADDS翻譯為SSE2指令A(yù)DDSD (Tsrcl, Tdst); 3)如果三個(gè)操作數(shù)對(duì)應(yīng)的目標(biāo)寄存器都不相同,則先通過寄存器遷移函數(shù)fpMovdRegToReg (Tsrc 1 , Tdst)將Tsrc 1的數(shù)值移至寄存器Tds,再將中間浮點(diǎn)指令FSADDS翻譯為SSE2指令A(yù)DDSD(Tsrc2, Tdst)。 本實(shí)例針對(duì)MIPS體系結(jié)構(gòu)到X86結(jié)構(gòu)的單精度加法指令的翻譯,利用高效浮點(diǎn)指令集SSE2中的ADDSD指令,使得后端目標(biāo)寄存器按照?qǐng)D染色方法進(jìn)行分配,更為合理,與后端X87浮點(diǎn)棧翻譯模式相比,減少了棧式管理的寄存器替換次數(shù),從而減少了訪存開銷,獲得性能提升。
權(quán)利要求
一種針對(duì)SSE2指令的二進(jìn)制浮點(diǎn)翻譯方法,其特征在于,包括如下步驟第一步,構(gòu)建針對(duì)SSE2指令的中間浮點(diǎn)指令集;第二步,以基本塊為單位,將前端源機(jī)器浮點(diǎn)指令翻譯為中間浮點(diǎn)指令,并通過寄存器狀態(tài)映射指令,將位于前端浮點(diǎn)寄存器中的指令操作數(shù)映射到由內(nèi)存虛擬的虛擬寄存器中;第三步,根據(jù)中間浮點(diǎn)指令的操作碼和操作類型,得到每條中間浮點(diǎn)指令的操作數(shù)個(gè)數(shù)和操作數(shù)類型,將虛擬寄存器中的所有操作數(shù)通過寄存器映射函數(shù)映射到后端浮點(diǎn)寄存器中;第四步,根據(jù)中間浮點(diǎn)指令的操作碼及操作數(shù),將后端浮點(diǎn)寄存器中的中間浮點(diǎn)指令翻譯成x86體系的SSE2指令,該SSE2指令與整形操作指令組成若干基本塊存放在Tcache中。
2. 根據(jù)權(quán)利要求1所述的針對(duì)SSE2指令的二進(jìn)制浮點(diǎn)翻譯方法,其特征是,所述的 中間浮點(diǎn)指令集包括內(nèi)存訪問指令、數(shù)據(jù)運(yùn)算指令、數(shù)據(jù)移動(dòng)指令和寄存器狀態(tài)映射指 令,其中內(nèi)存訪問指令包括將數(shù)據(jù)從內(nèi)存加載到寄存器FLD和將數(shù)據(jù)從寄存器存儲(chǔ)到內(nèi) 存FST ;數(shù)據(jù)指令包括單精度浮點(diǎn)的加法FSADDS、雙精度浮點(diǎn)的加法FSADDD、單精度浮點(diǎn) 的減法FSSUBS、雙精度浮點(diǎn)的減法FSSUBD、單精度浮點(diǎn)的乘法FSMULS、雙精度浮點(diǎn)的乘法 FSMULD、單精度浮點(diǎn)的除法FSDIVS、雙精度浮點(diǎn)的除法FSDIVD、單精度浮點(diǎn)的開方FSSQRTS 和雙精度浮點(diǎn)的開方FSSQRTD ;數(shù)據(jù)移動(dòng)指令是將數(shù)據(jù)在寄存器間進(jìn)行移動(dòng)FM0V ;寄存器 狀態(tài)映射指令包括將單精度浮點(diǎn)從虛擬寄存器映射到浮點(diǎn)寄存器FSPUTS、將雙精度浮點(diǎn) 從虛擬寄存器映射到浮點(diǎn)寄存器FSPUTD、將單精度浮點(diǎn)從浮點(diǎn)寄存器 映射到虛擬寄存器 FSGETS和將雙精度浮點(diǎn)從浮點(diǎn)寄存器映射到虛擬寄存器FSGETD。
3. 根據(jù)權(quán)利要求1所述的針對(duì)SSE2指令的二進(jìn)制浮點(diǎn)翻譯方法,其特征是,所述的寄 存器映射函數(shù)采用簡化的圖染色方法。
4. 根據(jù)權(quán)利要求1所述的針對(duì)SSE2指令的二進(jìn)制浮點(diǎn)翻譯方法,其特征是,所述 的操作類型包括狀態(tài)映射0PK_STATEMAP、內(nèi)存訪問0PK_MEM0RYACCESS、數(shù)據(jù)移動(dòng)0PK_ DATAMOVEMENT和數(shù)據(jù)計(jì)算0PK_C0MPUTATI0N。
全文摘要
一種動(dòng)態(tài)二進(jìn)制翻譯技術(shù)領(lǐng)域的針對(duì)SSE2指令的二進(jìn)制浮點(diǎn)翻譯方法,包括以下步驟構(gòu)建針對(duì)SSE2指令的中間浮點(diǎn)指令集;將前端源機(jī)器浮點(diǎn)指令翻譯為中間浮點(diǎn)指令,并將位于前端浮點(diǎn)寄存器中的指令操作數(shù)映射到由內(nèi)存虛擬的虛擬寄存器中;根據(jù)中間浮點(diǎn)指令的操作碼和操作類型,得到每條中間浮點(diǎn)指令的操作數(shù)個(gè)數(shù)和操作數(shù)類型,將虛擬寄存器中的操作數(shù)通過寄存器映射函數(shù)映射到后端浮點(diǎn)寄存器中;根據(jù)中間浮點(diǎn)指令的操作碼及操作數(shù),將后端浮點(diǎn)寄存器中的中間浮點(diǎn)指令翻譯成x86體系的SSE2指令,存放在Tcache中。本發(fā)明減少了前后端浮點(diǎn)體系的耦合性,實(shí)現(xiàn)了目標(biāo)端寄存器的分配替換,減少了訪存開銷,適用于多源單目標(biāo)平臺(tái)的三相動(dòng)態(tài)二進(jìn)制翻譯系統(tǒng)。
文檔編號(hào)G06F9/45GK101739238SQ201010300269
公開日2010年6月16日 申請(qǐng)日期2010年1月14日 優(yōu)先權(quán)日2010年1月14日
發(fā)明者劉博 , 梁阿磊, 汪嘯, 管海兵, 蔡戰(zhàn)舉 申請(qǐng)人:上海交通大學(xué)