本發(fā)明涉及硬件結(jié)構(gòu),尤其涉及一種指令分派方法和解釋器。
背景技術(shù):
虛擬機(jī)(virtualmachine,簡稱vm)主要通過軟件,或者輔以少量硬件支持的方法來虛擬出一臺計算機(jī),虛擬的計算機(jī)中通常有一套自己的指令集,稱為虛擬機(jī)指令集。虛擬機(jī)通常通過解釋器對給定的虛擬機(jī)指令序列在本地物理機(jī)器上進(jìn)行解釋執(zhí)行。解釋器對虛擬機(jī)指令進(jìn)行解釋并模擬執(zhí)行的效率往往決定了虛擬機(jī)系統(tǒng)的啟動性能和響應(yīng)速度。因此,對解釋器進(jìn)行深入分析和優(yōu)化,對于優(yōu)化虛擬機(jī)的設(shè)計、提升系統(tǒng)的性能具有重要意義。
現(xiàn)有的解釋器對虛擬機(jī)指令進(jìn)行解釋執(zhí)行的基本流程主要包括:取指令、指令分派、取操作數(shù)和執(zhí)行等四個步驟。解釋器的取指令用于接收虛擬機(jī)指令,解釋器接收到的每條虛擬機(jī)指令均對應(yīng)一個指令模板,每個指令模板對應(yīng)一條或多條本地機(jī)器指令。解釋器對一條虛擬機(jī)指令進(jìn)行解釋執(zhí)行時,需要跳轉(zhuǎn)到該虛擬機(jī)指令對應(yīng)的指令模板的地址,然后執(zhí)行指令模板的地址中對應(yīng)的本地機(jī)器指令。當(dāng)解釋器解釋執(zhí)行完一個指令模板地址中的本地機(jī)器指令時,需要跳轉(zhuǎn)到下一條虛擬機(jī)指令所對應(yīng)的指令模板的地址,以繼續(xù)執(zhí)行虛擬機(jī)指令的解釋。解釋器由一個指令模板的地址跳轉(zhuǎn)到另一個指令模板的地址的過程,稱為解釋器的指令分派過程。為實(shí)現(xiàn)指令分派,需要確定各虛擬機(jī)指令對應(yīng)的指令模板的地址,現(xiàn)有方法通常根據(jù)指令模板與虛擬機(jī)指令的對應(yīng)關(guān)系,建立指令分派表。指令分派表中按照指令模板對應(yīng)的虛擬機(jī)指令的輸出類型和操作碼的不同,存儲所有的指令模板的地址。
現(xiàn)有技術(shù)中,通常在實(shí)現(xiàn)每一次指令分派過程中,解釋器首先根據(jù)當(dāng)前虛擬機(jī)指令的上一條虛擬機(jī)指令的輸出類型,獲取當(dāng)前虛擬機(jī)指令在指令分派中對應(yīng)的行首地址,然后根據(jù)當(dāng)前虛擬機(jī)指令的操作碼,獲取當(dāng)前虛擬機(jī)指令在指令分派表中的列偏移,最后根據(jù)行首地址和列偏移在指令分派表中獲取與當(dāng)前虛擬機(jī)指令對應(yīng)的指令模板的地址,解釋器跳轉(zhuǎn)到該指令模板的 地址,從而完成一次指令分派。由于現(xiàn)有解釋器工作過程中,每次指令分派均需獲取一次行首地址,而為獲取行首地址,以常用的64位的無內(nèi)部互鎖流水級的微處理器(microprocessorwithoutinterlockedpipedstages,簡稱mips)精簡指令集計算機(jī)為例,需執(zhí)行6條機(jī)器指令實(shí)時計算出行首地址,而一次指令分派共需執(zhí)行11條機(jī)器指令。因此,現(xiàn)有指令分派方法中行首地址的獲取開銷極大,導(dǎo)致指令模板的地址加載速度慢,降低了指令分派的效率,進(jìn)而導(dǎo)致解釋器和虛擬機(jī)的執(zhí)行效率較低。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明實(shí)施例提供一種指令分派方法和解釋器,用以解決現(xiàn)有指令分派過程中由于指令模板的地址加載速度慢,而導(dǎo)致指令分派效率低下的問題。
本發(fā)明實(shí)施例一方面提供一種指令分派方法,包括:
在接收到第一虛擬機(jī)指令后,根據(jù)第二虛擬機(jī)指令的輸出類型,獲取所述第一虛擬機(jī)指令在所述指令分派表上的列偏移,所述第二虛擬機(jī)指令為所述第一虛擬機(jī)指令的上一條虛擬機(jī)指令;以及,根據(jù)所述第一虛擬機(jī)指令的操作碼,獲取所述第一虛擬機(jī)指令在所述指令分派表上的行偏移,將所述行偏移存儲在行索引寄存器中;
將存儲所述指令分派表的首地址的基址寄存器、所述行索引寄存器和所述列偏移編碼在訪存指令中;
在所述訪存指令執(zhí)行時,在由所述首地址、所述行偏移和所述列偏移所確定的地址處,獲取所述第一虛擬機(jī)指令執(zhí)行所需的指令模板的地址,跳轉(zhuǎn)到所述指令模板的地址完成指令分派。
本發(fā)明實(shí)施例另一方面提供一種解釋器,包括:
列偏移獲取模塊,用于在接收到第一虛擬機(jī)指令后,根據(jù)第二虛擬機(jī)指令的輸出類型,獲取所述第一虛擬機(jī)指令在所述指令分派表上的列偏移,所述第二虛擬機(jī)指令為所述第一虛擬機(jī)指令的上一條虛擬機(jī)指令;
行偏移獲取模塊,用于根據(jù)所述第一虛擬機(jī)指令的操作碼,獲取所述第一虛擬機(jī)指令在所述指令分派表上的行偏移,將所述行偏移存儲在行索引寄存器中;
編碼模塊,用于將存儲所述指令分派表的首地址的基址寄存器、所述行 索引寄存器和所述列偏移編碼在訪存指令中;
執(zhí)行模塊,用于在所述訪存指令執(zhí)行時,在由所述首地址、所述行偏移和所述列偏移所確定的地址處,獲取所述第一虛擬機(jī)指令執(zhí)行所需的指令模板的地址,跳轉(zhuǎn)到所述指令模板的地址完成指令分派。
本發(fā)明實(shí)施例提供的指令分派方法和解釋器,通過采用行中按照虛擬機(jī)指令的操作碼、列中按照虛擬機(jī)指令的輸出類型存儲的指令分派表,并將該指令分派表的首地址存儲在高速訪存部件中,同時在現(xiàn)有的mips指令集中擴(kuò)展了支持“基址+索引+偏移”尋址方式的訪存指令,將待解釋執(zhí)行的虛擬機(jī)指令對應(yīng)的存儲指令分派表首地址的基址寄存器、行索引寄存器和列偏移編碼在該訪存指令中,使得指令分派過程中避免了行首地址的獲取,且提高了指令模板的地址的加載速度,減少了需要執(zhí)行的機(jī)器指令,提高了指令分派的效率,進(jìn)而提高了解釋器和虛擬機(jī)的執(zhí)行效率。
附圖說明
為了更清楚地說明本發(fā)明實(shí)施例的技術(shù)方案,下面將對實(shí)施例描述中所需要使用的附圖作一簡單地介紹,顯而易見地,下面描述中的附圖是本發(fā)明的一些實(shí)施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動性的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
圖1為現(xiàn)有的指令分派表的結(jié)構(gòu)示意圖;
圖2為本發(fā)明指令分派方法實(shí)施例一的流程示意圖;
圖3為本發(fā)明指令分派方法實(shí)施例一的指令分派表的結(jié)構(gòu)示意圖;
圖4為本發(fā)明解釋器實(shí)施例一的結(jié)構(gòu)示意圖。
具體實(shí)施方式
為使本發(fā)明實(shí)施例的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒有作出創(chuàng)造性勞動前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。
解釋器在初始化時建立指令分派表,用于存儲所有虛擬機(jī)指令對應(yīng)的指 令模板的地址?,F(xiàn)有的指令分派方法中所采用的指令分派表,按照指令模板對應(yīng)的虛擬機(jī)指令的操作碼的不同,將指令模板的地址存儲在指令分派表的不同的列中,按照指令模板對應(yīng)的虛擬機(jī)指令的輸出類型的不同,將指令模板的地址存儲在指令分派表的不同的行中。圖1為現(xiàn)有指令分派表的結(jié)構(gòu)示意圖。如圖1所示,指令分派表的行根據(jù)虛擬機(jī)指令的輸出類型,劃分為代表不同類型的9行,輸出類型包括:btos(字節(jié)類型)、ctos(字符類型)、stos(短整數(shù)類型)、itos(整數(shù)類型)、ltos(長整數(shù)類型)、ftos(單精度浮點(diǎn)類型)、dtos(雙精度浮點(diǎn)類型)、atos(引用類型數(shù)據(jù))、vtos(無輸出類型)。指令分派表的列根據(jù)計算機(jī)指令系統(tǒng)的規(guī)模,按照虛擬機(jī)指令的操作碼劃分為256列。指令操作碼包括:加、減、左移、右移、讀、寫等。
為減少指令分派過程中的機(jī)器指令數(shù)量,考慮到現(xiàn)有指令分派過程中獲取行首地址所占開銷最大,本發(fā)明實(shí)施例提出一種新的指令分派方法,在初始化解釋器時,將虛擬機(jī)指令在如圖1所示的指令分派表中的行首地址存儲在寄存器中,一共需要9個寄存器存儲不同輸出類型對應(yīng)的行首地址。從而使得每次指令分派過程中,無需耗費(fèi)機(jī)器指令去實(shí)時計算獲取行首地址,僅在需要用到行首地址時,根據(jù)虛擬機(jī)指令的輸出類型,在對應(yīng)的寄存器中讀取該輸出類型的行首地址即可,以常用的64位的mips精簡指令集計算機(jī)為例,可節(jié)約6條機(jī)器指令,大幅提高指令分派過程的效率。上述改進(jìn)可明顯提高指令分派過程的效率,但是由于需要占用9個寄存器,而由于計算機(jī)系統(tǒng)中該類高速訪存寄存器數(shù)量通常較少,導(dǎo)致該方法占用資源較多,影響了該方法的廣泛使用。
為避免上述問題,本發(fā)明實(shí)施例提出一種指令分派方法,該方法中僅將指令分派表的首地址存儲在寄存器中,該寄存器稱為基址寄存器,此時,一個指令模板的地址在指令分派表中的位置則采用“首地址+行偏移+列偏移”的方式描述。而常用的mips等精簡指令集的處理器僅支持“基址+偏移”的尋址方式,故需要至少兩條機(jī)器指令以訪問采用“首地址+行偏移+列偏移”方式描述的指令分派表中的位置。且現(xiàn)有的指令分派方法中,在獲取到行首地址與列偏移后,也需先將行首地址與列偏移先加和得到指令分派表中的一個位置,再由訪存指令加載存儲在該位置中的指令模板的地址,故也需要至少兩條機(jī)器指令訪問指令分派表中的位置。
本發(fā)明實(shí)施例中為進(jìn)一步提高指令分派表的訪問速度,在現(xiàn)有處理器的mips指令集架構(gòu)基礎(chǔ)上,對訪存指令進(jìn)行了擴(kuò)展,新引入了支持“基址+索引+偏移”的尋址方式的訪存指令,其中,“基址”即為指令分派表的首地址,“索引”與“偏移”可用于表示虛擬機(jī)指令在指令分派表中的行偏移與列偏移。從而可使得對指令模板的地址的加載操作不需要再執(zhí)行加法指令,僅由一條訪存指令即可完成,直接提高指令分派時對內(nèi)存地址“基址+行偏移+列偏移”的訪問速度。
但是,在現(xiàn)有處理器所采用的mips精簡指令集架構(gòu)中,指令編碼長度通常固定為32位。訪存指令最大僅支持16位的偏移量,用于編碼“行偏移”和“列偏移”。而本實(shí)施例為了提高訪問速度,對訪存指令進(jìn)行擴(kuò)展,該擴(kuò)展的訪存指令中需要額外使用5位用于對存儲行偏移的行索引寄存器進(jìn)行編碼,故無論擴(kuò)展的訪存指令如何設(shè)計,其所支持的偏移量最大不能超過11位(即16位-5位)。虛擬機(jī)指令的列偏移在編碼進(jìn)訪存指令中時,需在11位的編碼偏移量內(nèi)。
若仍采用現(xiàn)有的指令分派表,示例性的,當(dāng)操作碼的取值范圍是0至255時,虛擬機(jī)指令的輸出類型的取值范圍是0至8時,由于虛擬機(jī)指令的行偏移的范圍為[0,8×256×addresslength],列偏移的范圍為[0,255×addresslength],其中,addresslength為預(yù)設(shè)數(shù)值,表示當(dāng)前處理器的地址長度,該地址長度的單位為字節(jié),其取值通常為4或8。當(dāng)addresslength為8時,行偏移的范圍為[0,214],列偏移的范圍為[0,211-8],故將范圍較大的行偏移存儲在索引寄存器中,但偏移量相對較少的列偏移也依然要求訪存指令中用于編碼列偏移的偏移量不少于12位,大于擴(kuò)展的訪存指令所能提供的11位的編碼偏移量。因此,無法采用現(xiàn)有的指令分派表,實(shí)現(xiàn)減少機(jī)器指令,提高指令分派效率的方法。
故在本發(fā)明實(shí)施例提供的指令分派方法中,還對原有指令分派表的行和列進(jìn)行轉(zhuǎn)置。轉(zhuǎn)置后,指令模板的地址按照對應(yīng)的虛擬機(jī)指令的操作碼的不同,存儲在指令分派表的不同的行中,指令模板的地址按照對應(yīng)的虛擬機(jī)指令的輸出類型的不同,存儲在指令分派表的不同的列中。此時,虛擬機(jī)指令在指令分派表的列偏移取決于虛擬機(jī)指令的輸出類型,而輸出類型共9種,相比較256種的操作碼,大大降低了列偏移的位數(shù),當(dāng)addresslength為8 時,列偏移的范圍為[0,26],此時對列偏移進(jìn)行編碼時最多只需要7位編碼偏移量即可。
因此,綜合上述分析可知,本發(fā)明實(shí)施例提供的指令分派方法,通過將指令分派表的首地址存儲在基址寄存器中,在現(xiàn)有的mips指令集中新引入支持“基址+索引+偏移”尋址方式的訪存指令的同時,將現(xiàn)有的指令分派表的行和列進(jìn)行轉(zhuǎn)置,可避免在每次指令分派的過程中均獲取一次行首地址,且提高了對指令分派表中的地址的訪問速度,進(jìn)而提高了指令分派效率。下面采用具體的實(shí)施例,對本發(fā)明實(shí)施例提供的指令分派方法進(jìn)行詳細(xì)說明。
圖2為本發(fā)明指令分派方法實(shí)施例一的流程示意圖。圖3為本發(fā)明指令分派方法實(shí)施例一的指令分派表的結(jié)構(gòu)示意圖。本發(fā)明提供的方法實(shí)施例可以由指令分派裝置執(zhí)行,該裝置可以通過軟件和/或硬件實(shí)現(xiàn),該裝置還可以嵌入到終端中的解釋器中實(shí)現(xiàn)。終端可以為包含處理器的設(shè)備,如計算機(jī)、手機(jī)等。如圖2所示,本發(fā)明實(shí)施例中的指令分派方法,包括:
步驟201、在接收到第一虛擬機(jī)指令后,根據(jù)第二虛擬機(jī)指令的輸出類型,獲取第一虛擬機(jī)指令在指令分派表上的列偏移,其中,第二虛擬機(jī)指令為第一虛擬機(jī)指令的上一條虛擬機(jī)指令;以及,根據(jù)第一虛擬機(jī)指令的操作碼,獲取第一虛擬機(jī)指令在指令分派表上的行偏移,將行偏移存儲在行索引寄存器中;
步驟202、將存儲指令分派表的首地址的基址寄存器、行索引寄存器和列偏移編碼在訪存指令中;
步驟203、在訪存指令執(zhí)行時,在由所述首地址、所述行偏移和所述列偏移所確定的地址處,獲取第一虛擬機(jī)指令執(zhí)行所需的指令模板的地址,跳轉(zhuǎn)到指令模板的地址完成指令分派。
其中,指令分派表中存儲有所有與虛擬機(jī)指令對應(yīng)的指令模板的地址,如圖3所示,指令模板的地址按照對應(yīng)的虛擬機(jī)指令的操作碼的不同,存儲在指令分派表的不同的行中,指令模板的地址按照對應(yīng)的虛擬機(jī)指令的輸出類型的不同,存儲在指令分派表的不同的列中。
上述步驟201中的獲取列偏移與獲取行偏移沒有先后執(zhí)行順序,可以先獲取列偏移,也可以先獲取行偏移,也可同時并行執(zhí)行獲取列偏移和行偏移的過程。在具體實(shí)現(xiàn)步驟201時,根據(jù)第二虛擬機(jī)指令的輸出類型,獲取第 一虛擬機(jī)指令在指令分派表上的列偏移,虛擬機(jī)指令的輸出類型與列偏移為一一對應(yīng)的關(guān)系。第二虛擬機(jī)指令為第一虛擬機(jī)指令的上一條虛擬機(jī)指令,且第一虛擬機(jī)指令為待執(zhí)行的虛擬機(jī)指令。由于上一條虛擬機(jī)指令的輸出數(shù)據(jù)是下一條虛擬機(jī)指令的輸入或操作對象,因此,根據(jù)上一條虛擬機(jī)指令的輸出類型,來獲取當(dāng)前虛擬機(jī)指令的列偏移。由于虛擬機(jī)指令與指令模板具有一一對應(yīng)關(guān)系,因此虛擬機(jī)指令在指令分派表中的位置即為指令模板的地址在指令分派表中的存儲位置,虛擬機(jī)指令在指令分派表中的行偏移、列偏移即為指令模板的地址在指令分派表的存儲位置的行偏移、列偏移。
示例性的,在獲取列偏移過程中,首先獲取第二虛擬機(jī)指令的輸出類型在指令分派表中所占的列的序號;然后,根據(jù)序號與表示處理器地址長度的預(yù)設(shè)數(shù)值的乘積,得到第一虛擬機(jī)指令在指令分派表上的列偏移。具體的,列偏移的計算公式可以為:列偏移=序號×預(yù)設(shè)數(shù)值。
同時,根據(jù)第一虛擬機(jī)指令的操作碼,獲取第一虛擬機(jī)指令在指令分派表上的行偏移,由于表示行偏移的位數(shù)較多,因而將行偏移存儲在行索引寄存器中。
示例性的,在獲取行偏移過程中,首先獲取第一虛擬機(jī)指令的操作碼;然后,根據(jù)指令分派表的總列數(shù)、操作碼與表示處理器地址長度的預(yù)設(shè)數(shù)值的乘積,得到第一虛擬機(jī)指令在指令分派表上的行偏移。具體的,行偏移的計算公式可以為:行偏移=總列數(shù)×操作碼×預(yù)設(shè)數(shù)值。
具體的,在步驟202中,將存儲指令分派表的首地址的基址寄存器、行索引寄存器和列偏移編碼在支持“基址+索引+偏移”的尋址方式的訪存指令中,其中存儲指令分派表的首地址的基址寄存器對應(yīng)“基址”,存儲有行偏移的行索引寄存器對應(yīng)“索引”,列偏移對應(yīng)“偏移”。然后在步驟203中,在訪存指令執(zhí)行時,訪存指令可直接訪問指令中編碼的“基址+行偏移+列偏移”所確定的地址,并獲取存儲在該地址處的對第一虛擬機(jī)指令進(jìn)行解釋執(zhí)行所需的指令模板的地址,解釋器跳轉(zhuǎn)到該指令模板的地址,完成本次指令分派過程。
其中,指令分派表的首地址在解釋器初始化時即存儲在基址寄存器中,可選的,還可將首地址存儲在其他高速訪存部件中,如內(nèi)容可尋址存儲器(contentaddressablememory,簡稱cam)表等。
本發(fā)明實(shí)施例提供的指令分派方法,通過采用行中按照虛擬機(jī)指令的操作碼、列中按照虛擬機(jī)指令的輸出類型存儲的指令分派表,并將該指令分派表的首地址存儲在高速訪存部件中,同時在現(xiàn)有的mips指令集中擴(kuò)展了支持“基址+索引+偏移”尋址方式的訪存指令,將待解釋執(zhí)行的虛擬機(jī)指令對應(yīng)的存儲指令分派表首地址的基址寄存器、行索引寄存器和列偏移編碼在該訪存指令中,使得指令分派過程中避免了行首地址的獲取,且提高了指令模板的地址的加載速度,減少了需要執(zhí)行的機(jī)器指令,提高了指令分派的效率,進(jìn)而提高了解釋器和虛擬機(jī)的執(zhí)行效率。
為提高指令分派效率,可在上述實(shí)施例的基礎(chǔ)上,進(jìn)一步對指令分派表進(jìn)行優(yōu)化。
具體的,如圖3所示,虛擬機(jī)指令的輸出類型包括:整數(shù)類型、長整數(shù)類型、單精度浮點(diǎn)類型、雙精度浮點(diǎn)類型、引用類型和無輸出類型。示例性的,由于btos、ctos和stos輸出類型的指令模板地址和itos類型的指令模板地址相同,因此將圖1中的指令分派表結(jié)構(gòu)在轉(zhuǎn)置為圖3所示的指令分派表結(jié)構(gòu)時,刪除了btos、ctos和stos相關(guān)的表項(xiàng),以減少對內(nèi)存等資源的消耗。
可選的,由于現(xiàn)有技術(shù)中的行偏移采用總列數(shù)×操作碼×預(yù)設(shè)數(shù)值的方式獲得,而行偏移計算過程中的乘法運(yùn)算較為復(fù)雜,消耗較高,為簡化行偏移的計算,可為指令分派表增加至少一列填充表項(xiàng),填充表項(xiàng)中存儲的內(nèi)容為空,通過增加填充表項(xiàng)的列數(shù),使指令分派表的列數(shù)為2的冪次方。示例性的,如圖3所示,在指令分派表的列數(shù)為6列時,增加兩列填充表項(xiàng),將指令分派表的總列數(shù)擴(kuò)充為8列,8為2的4次方。即如圖3所示在指令分派表的最后添加兩列填充表項(xiàng)。
在將將指令分派表的總列數(shù)擴(kuò)充為2的指數(shù)冪的基礎(chǔ)上,在獲取第一虛擬機(jī)指令在指令分派表上的行偏移時,可首先根據(jù)指令分派表的列數(shù)與表示處理器地址長度的預(yù)設(shè)數(shù)值,獲取偏移位數(shù);再將第一虛擬機(jī)指令的操作碼向左移動該偏移位數(shù),即可得到第一虛擬機(jī)指令在指令分派表上的行偏移。具體的,先獲取指令分派表的列數(shù)與處理器地址長度的預(yù)設(shè)數(shù)值的乘積,然后對乘積進(jìn)行以2為底的對數(shù)運(yùn)算,獲取偏移位數(shù);然后,將第一虛擬機(jī)指令的操作碼向左移動該偏移位數(shù),得到第一虛擬機(jī)指令在指令分派表上的行偏移。通過擴(kuò)展指令分派表的總列數(shù),將乘法操作改為位移操作,從而大大 提高了指令分派效率。
本領(lǐng)域技術(shù)人員均清楚,圖3僅示例性的示出了一種列排列方法,而不是對本發(fā)明指令分派表的限定。圖3僅示例性的示出了在指令分派表的表項(xiàng)進(jìn)行精簡去冗余后的填充表項(xiàng)填充方法,本領(lǐng)域技術(shù)人員均清楚也可直接在將圖1中所示的指令分派表行列轉(zhuǎn)置后,直接增加填充表項(xiàng),即增加7列填充表項(xiàng),以使指令分派表的列數(shù)達(dá)到16列,即2的4次方。
例如,若需讀取如圖3所示的指令分派表中的標(biāo)號為15行、15列的預(yù)設(shè)位置處存儲的指令模板的地址時,該預(yù)設(shè)位置由“基址+行偏移+列偏移”描述,基址為指令分派表的首地址,也為指令分派表中標(biāo)號為0行、0列的位置的地址,預(yù)設(shè)位置的行偏移表示預(yù)設(shè)位置所在的行相對于首地址的距離,由于指令分派表在實(shí)際存儲時,存儲方式為按照行號由小到大的順序,將所有的行連接為一行,因此,預(yù)設(shè)位置相對于首地址的行偏移=15×指令分派表的總列數(shù)×預(yù)設(shè)數(shù)值。預(yù)設(shè)數(shù)值通常為8,在沒有增加填充列時,行偏移=15×6×8,此時需調(diào)用二進(jìn)制乘法器獲取行偏移,由于二進(jìn)制乘法器結(jié)構(gòu)復(fù)雜,運(yùn)算速度較慢,因此會影響行偏移的計算效率,進(jìn)而影響指令分派的效率。在增加填充列以后,行偏移=15×8×8,此時,在獲取行偏移時,考慮到8×8在二進(jìn)制計算的乘法運(yùn)算中其實(shí)現(xiàn)的功能即為將15左移6位,而位移運(yùn)算在實(shí)現(xiàn)過程中,速度較快且占用資源較少,因此,在增加填充列之后,只需將預(yù)設(shè)位置所在的行,即預(yù)設(shè)位置對應(yīng)的第一虛擬機(jī)指令的操作碼(即15)向左移動偏移位數(shù)即可。
進(jìn)一步地,在上述任一實(shí)施例的基礎(chǔ)上,還可將指令分派過程中訪問概率較高的輸出類型安排在指令分派表的相鄰位置,以增強(qiáng)訪存的局部性,提高訪存效率。在指令分派表的4個連續(xù)的列中,存儲無輸出類型、整數(shù)類型、引用類型和單精度浮點(diǎn)類型的虛擬機(jī)指令對應(yīng)的指令模板的地址。示例性的,指令分派表的訪問集中在對vtos、itos、atos和ftos輸出類型的查詢,因此在設(shè)計指令分派表時,如圖3所示,將vtos、itos、atos和ftos這四類表項(xiàng)安排在四個相鄰列中。
下面以具體的機(jī)器指令代碼為例對本發(fā)明提供的指令分派方法能夠減少機(jī)器指令進(jìn)行詳細(xì)說明。
在現(xiàn)有mips指令集計算機(jī)中,現(xiàn)有技術(shù)的指令分派過程共需執(zhí)行如下 11條機(jī)器指令:
其中,機(jī)器指令1-6表示將待執(zhí)行虛擬機(jī)指令所在的指令分派表的行首地址加載到寄存器t3;機(jī)器指令7表示計算待執(zhí)行虛擬機(jī)指令的列偏移并將列偏移存儲在寄存器t2中,機(jī)器指令8表示將行首地址與列偏移進(jìn)行相加,得到待執(zhí)行虛擬機(jī)指令對應(yīng)的指令模板的地址在指令分派表中的存儲地址entry;機(jī)器指令9表示訪存指令獲取指令分派表中的entry中存儲的值,將該值,即指令模板的地址存儲到寄存器t3中;機(jī)器指令10表示解釋器跳轉(zhuǎn)到寄存器t3中存儲的指令模板的地址,完成指令分派。
采用本發(fā)明實(shí)施例提供的指令分派方法的指令分派過程如下所示,共需執(zhí)行4條機(jī)器指令:
其中,機(jī)器指令2為支持“基址+索引+偏移”尋址方式的訪存指令,gpr為存儲指令分派表的首地址的基址寄存器,t2寄存器為存儲有行偏移的行索引寄存器,col_offset為列偏移,由于列偏移對應(yīng)虛擬機(jī)指令的輸出類型,其 數(shù)量較少,且為一較小的立即數(shù),故可在解釋器初始化時確定,而現(xiàn)有技術(shù)中的列偏移對應(yīng)虛擬機(jī)指令的操作碼,其數(shù)量較多,且取值范圍較大,無法在解釋器初始化時確定。訪存指令gsldx可直接訪問指令中編碼的“基址+行偏移+列偏移”所確定的entry,并加載entry中存儲的值,即指令模板的地址到寄存器t3中。
通過上述具體的機(jī)器指令代碼的示例性對比說明,可發(fā)現(xiàn)本發(fā)明實(shí)施例提供的指令分派方法,通過將指令分派表的首地址存儲在高速訪存部件gpr中,節(jié)約了6條機(jī)器指令(現(xiàn)有技術(shù)中的機(jī)器指令1至6);通過在現(xiàn)有的mips指令集中擴(kuò)展了支持“基址+索引+偏移”尋址方式的訪存指令gsldx,使得entry的加載由兩條機(jī)器(現(xiàn)有技術(shù)中的機(jī)器指令8和9)指令縮減為1條(本發(fā)明中的機(jī)器指令2)。由于解釋器工作期間指令分派的次數(shù)通常高達(dá)數(shù)百億次,因此通過本發(fā)明實(shí)施例可減少千億條數(shù)量級機(jī)器指令的執(zhí)行,大幅提高解釋器的效率。本發(fā)明實(shí)施例通過減少了需要執(zhí)行的機(jī)器指令,提高了指令分派的效率,進(jìn)而提高了解釋器和虛擬機(jī)的執(zhí)行效率。
本發(fā)明實(shí)施例另一方面提供一種解釋器,用于執(zhí)行如上所述的指令分派方法。圖4為本發(fā)明解釋器實(shí)施例一的結(jié)構(gòu)示意圖。如圖4所示,包括:
列偏移獲取模塊401,用于在接收到第一虛擬機(jī)指令后,根據(jù)第二虛擬機(jī)指令的輸出類型,獲取第一虛擬機(jī)指令在指令分派表上的列偏移,第二虛擬機(jī)指令為第一虛擬機(jī)指令的上一條虛擬機(jī)指令;
行偏移獲取模塊402,用于根據(jù)第一虛擬機(jī)指令的操作碼,獲取第一虛擬機(jī)指令在指令分派表上的行偏移,將行偏移存儲在行索引寄存器中;
編碼模塊403,用于將存儲指令分派表的首地址的基址寄存器、行索引寄存器和列偏移編碼在訪存指令中;
執(zhí)行模塊404,用于在訪存指令執(zhí)行時,在由首地址、行偏移和列偏移所確定的地址處,獲取第一虛擬機(jī)指令執(zhí)行所需的指令模板的地址,跳轉(zhuǎn)到指令模板的地址完成指令分派。
其中,列偏移獲取模塊401和行偏移獲取模塊402沒有嚴(yán)格的執(zhí)行順序。
進(jìn)一步地,指令分派表中存儲有所有與虛擬機(jī)指令對應(yīng)的指令模板的地址,指令模板的地址按照對應(yīng)的虛擬機(jī)指令的操作碼的不同,存儲在指令分派表的不同的行中,指令模板的地址按照對應(yīng)的虛擬機(jī)指令的輸出類型的不 同,存儲在指令分派表的不同的列中。
進(jìn)一步地,指令分派表中增加有至少一列填充表項(xiàng),填充表項(xiàng)中存儲的內(nèi)容為空;通過增加填充表項(xiàng)的列數(shù),使指令分派表的列數(shù)為2的冪次方。
進(jìn)一步地,行偏移獲取模塊402具體用于,根據(jù)指令分派表的列數(shù)與表示處理器地址長度的預(yù)設(shè)數(shù)值,獲取偏移位數(shù);將第一虛擬機(jī)指令的操作碼向左移動偏移位數(shù),得到第一虛擬機(jī)指令在指令分派表上的行偏移,將行偏移存儲在行索引寄存器中。
進(jìn)一步地,列偏移獲取模塊401具體用于,獲取第二虛擬機(jī)指令的輸出類型在指令分派表中所占的列的序號;根據(jù)序號與表示處理器地址長度的預(yù)設(shè)數(shù)值,得到第一虛擬機(jī)指令在指令分派表上的列偏移。
進(jìn)一步地,在指令分派表的4個連續(xù)的列中,存儲無輸出類型、整數(shù)類型、引用類型和單精度浮點(diǎn)類型的虛擬機(jī)指令對應(yīng)的指令模板的地址。
進(jìn)一步地,虛擬機(jī)指令的輸出類型為如下中的一種:整數(shù)類型、長整數(shù)類型、單精度浮點(diǎn)類型、雙精度浮點(diǎn)類型、引用類型和無輸出類型。
本發(fā)明實(shí)施例提供的解釋器,通過采用行中按照虛擬機(jī)指令的操作碼、列中按照虛擬機(jī)指令的輸出類型存儲的指令分派表,并將該指令分派表的首地址存儲在高速訪存部件中,同時在現(xiàn)有的mips指令集中擴(kuò)展了支持“基址+索引+偏移”尋址方式的訪存指令,將待解釋執(zhí)行的虛擬機(jī)指令對應(yīng)的存儲指令分派表首地址的基址寄存器、行索引寄存器和列偏移編碼在該訪存指令中,使得指令分派過程中避免了行首地址的獲取,且提高了指令模板的地址的加載速度,減少了需要執(zhí)行的機(jī)器指令,提高了指令分派的效率,進(jìn)而提高了解釋器和虛擬機(jī)的執(zhí)行效率。
最后應(yīng)說明的是:以上各實(shí)施例僅用以說明本發(fā)明的技術(shù)方案,而非對其限制;盡管參照前述各實(shí)施例對本發(fā)明進(jìn)行了詳細(xì)的說明,本領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)理解:其依然可以對前述各實(shí)施例所記載的技術(shù)方案進(jìn)行修改,或者對其中部分或者全部技術(shù)特征進(jìn)行等同替換;而這些修改或者替換,并不使相應(yīng)技術(shù)方案的本質(zhì)脫離本發(fā)明各實(shí)施例技術(shù)方案的范圍。