亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

針對(duì)C*core處理器寄存器分配的編譯方法及編譯器的制作方法

文檔序號(hào):6373275閱讀:266來(lái)源:國(guó)知局
專利名稱:針對(duì)C*core處理器寄存器分配的編譯方法及編譯器的制作方法
技術(shù)領(lǐng)域
本發(fā)明屬于計(jì)算機(jī)領(lǐng)域,涉及嵌入式系統(tǒng),尤其是涉及一種針對(duì)Ocore處理器的優(yōu)化寄存器分配的編譯方法及編譯器。
背景技術(shù)
寄存器分配,是通過(guò)將程序變量盡可能地分配到寄存器,從而提高程序執(zhí)行速度的一種方法。寄存器是編譯器優(yōu)化中最為重要的問(wèn)題之一(好的寄存器分配能夠提高程序執(zhí)行速度超過(guò)250%);也是編譯器理論中最熱點(diǎn)的研究領(lǐng)域之一。寄存器是位于處理器(CPU)內(nèi)部的少量的高速存儲(chǔ)單元。寄存器與內(nèi)存有很大的不同首先,寄存器數(shù)量很少很少,一個(gè)寄存器可以用幾個(gè)比特直接定位,這樣就可以在指令中直接指定某一個(gè)寄存器;而內(nèi)存空間很大,內(nèi)存的定位一般是通過(guò)間接的“尋址方式” 來(lái)實(shí)現(xiàn)的,在這個(gè)過(guò)程中可能包含一個(gè)或多個(gè)對(duì)寄存器的使用;其次,寄存器訪問(wèn)速度很快,在一個(gè)周期內(nèi),處理器可以分別讀兩個(gè)寄存器,同時(shí)寫第三個(gè)寄存器;而內(nèi)存的訪問(wèn)則要慢些,一次訪問(wèn)就需要幾個(gè)周期。正是因?yàn)榧拇嫫鞯膫€(gè)數(shù)受限和它的高速度,它們成為大多數(shù)計(jì)算機(jī)體系結(jié)構(gòu)中的關(guān)鍵資源之一。這也使得寄存器分配的方法變得更加重要。一種比較簡(jiǎn)單的情況,計(jì)算機(jī)所要執(zhí)行的每條指令的操作數(shù)要放在寄存器里,在復(fù)雜表達(dá)式的計(jì)算過(guò)程中產(chǎn)生的中間結(jié)果也要在寄存器里;稍微復(fù)雜的情況是編譯器會(huì)把經(jīng)常使用的變量放在寄存器里,避免反復(fù)地存??;而如果是帶有優(yōu)化功能的編譯器,它會(huì)把編譯過(guò)程中的公共子表達(dá)式消除或循環(huán)變量更新以后的值,放入寄存器中。可靠的分配器必要能很好地對(duì)付復(fù)雜的程序和稀少的寄存器的情況,而實(shí)現(xiàn)好的寄存器分配總是很困難的,即使是最簡(jiǎn)單的實(shí)現(xiàn)也會(huì)因?yàn)闄C(jī)器的特殊細(xì)節(jié)變得復(fù)雜。圖著色(graph coloring)方法是解決寄存器分配問(wèn)題最常用的方法。利用相交圖(interference graph)來(lái)表示程序變量的生命期是否相交,將寄存器分配給變量的問(wèn)題,可以近似地看成是給相交圖著色相交圖中,相交的節(jié)點(diǎn)不能著同一顏色;每一種顏色對(duì)應(yīng)一個(gè)寄存器。Chaitin等人最早提出了基于圖著色的寄存器分配方法其著色思路采用了 Kempe的著色方法,即,任意一個(gè)鄰居節(jié)點(diǎn)數(shù)目少于k的節(jié)點(diǎn),都能夠被k著色。但是,寄存器分配不僅僅是圖著色的問(wèn)題。當(dāng)寄存器數(shù)目不足以分配某些變量時(shí),就必須將這些變量溢出到內(nèi)存中,該過(guò)程稱為拋出(spill)。要想提高編譯器編譯出來(lái)的代碼的效率,就必須減少拋出的發(fā)生。

發(fā)明內(nèi)容
為解決上述技術(shù)問(wèn)題,本發(fā)明采用的技術(shù)方案是一針對(duì)Ocore處理器的寄存器分配的編譯方法,包括對(duì)前端生成的中間代碼的進(jìn)一步處理,其特征在于該方法還包括第一步驟判斷源程序是否存在函數(shù)調(diào)用;第二步驟如果存在函數(shù)調(diào)用,則檢測(cè)程序中的函數(shù)調(diào)用所用的參數(shù),并得出參數(shù)的數(shù)據(jù);如果沒(méi)有,則直接生成最終匯編語(yǔ)言;
第三步驟根據(jù)第二步驟的結(jié)果和寄存器的個(gè)數(shù)進(jìn)行初次分配,如果參數(shù)與變量的數(shù)量總數(shù)不大于寄存器的個(gè)數(shù),則寄存器分配結(jié)束,如果參數(shù)與變量的數(shù)量總數(shù)大于寄存器的個(gè)數(shù),則轉(zhuǎn)入下一步驟;第四步驟根據(jù)第二步驟所檢測(cè)的結(jié)果,按照非同一生命期的相同類型的變量可分配在一個(gè)寄存器的規(guī)則對(duì)第三步驟初次分配的結(jié)果進(jìn)行優(yōu)化;第五步驟根據(jù)第四步驟的優(yōu)化分配方法,如果寄存器的個(gè)數(shù)滿足優(yōu)化后變量的數(shù)目要求,則進(jìn)入下一步驟;如果寄存器的個(gè)數(shù)仍不能滿足優(yōu)化后變量的數(shù)目要求,則根據(jù)第二步驟中所得到的函數(shù)中參數(shù)的數(shù)據(jù)來(lái)重新調(diào)整寄存器分配比例;第六步驟根據(jù)以上步驟生成最后的匯編指令。進(jìn)一步的,所述的第二步驟中檢測(cè)程序中的函數(shù)調(diào)用所用的參數(shù),并得出參數(shù)的數(shù)據(jù)是指包括參數(shù)的類型、數(shù)量、生命期。更進(jìn)一步的,一種所述的針對(duì)Ocore處理器的寄存器分配的編譯器,包括編譯器 前端,其特征在于所述的編譯器還包括用于判斷是否有函數(shù)調(diào)用操作的函數(shù)調(diào)用檢測(cè)單元和用于對(duì)函數(shù)調(diào)用進(jìn)行分析,提取參數(shù)傳遞信息的函數(shù)傳參處理單元。由于采用上述技術(shù)方案,使得在編譯過(guò)程中進(jìn)行寄存器分配時(shí),盡量的減少拋出行為,這樣即可使處理器減少壓棧出棧的次數(shù),又提高處理器執(zhí)行代碼的效率。


圖I是本發(fā)明的流程圖;圖2是本發(fā)明一個(gè)實(shí)施例的變量圖著色示意圖;圖3是本發(fā)明一個(gè)實(shí)施例的變量周期圖;圖4是本發(fā)明中對(duì)寄存器優(yōu)化的流程圖;圖5是本發(fā)明實(shí)例的兩種編譯方法結(jié)果對(duì)比具體實(shí)施例方式下面結(jié)合附圖和實(shí)例對(duì)本發(fā)明做進(jìn)一步的闡述,如圖I所示,本發(fā)明采用的方法與現(xiàn)有技術(shù)的區(qū)別在于在對(duì)程序進(jìn)行完前端處理以后,加入了對(duì)程序中是否存在函數(shù)調(diào)用進(jìn)行檢測(cè),如果不存在函數(shù)調(diào)用,則直接輸出匯編指令,如果存在函數(shù)調(diào)用,則需要根據(jù)檢測(cè)結(jié)果對(duì)函數(shù)進(jìn)行處理,并根據(jù)處理結(jié)果來(lái)確定寄存器的分配,最后輸出匯編指令。以函數(shù)
funl (argl, arg2, arg3)
{
varl, var2, var3; varl = argl + arg2;
var2 = argl 氺 arg2 + arg3; var3 = (argl * arg3) * arg2; return varl + var2 + var3;
}為例
編譯器對(duì)該段函數(shù)進(jìn)行完前端處理之后,函數(shù)調(diào)用檢測(cè)單元對(duì)程序中是否存在函數(shù)調(diào)用進(jìn)行檢測(cè),當(dāng)檢測(cè)到該函數(shù)存在時(shí),則由函數(shù)傳參處理單元對(duì)函數(shù)調(diào)用進(jìn)行分析。并對(duì)參數(shù)的(該參數(shù)是整型、字符型、指針或是其它類型變量)、數(shù)量(此函數(shù)所傳遞參數(shù)的個(gè)數(shù)為一個(gè)、兩個(gè)或是多個(gè))及生命期進(jìn)行分析,分析的目的是為了下一步驟來(lái)針對(duì)寄存器的存儲(chǔ)情況對(duì)變量進(jìn)行合理的分配。根據(jù)上一步驟的結(jié)果對(duì)寄存器進(jìn)行初次的分配,該次分配主要保證參數(shù)傳遞過(guò)程能過(guò)順利進(jìn)行,而不必進(jìn)行壓棧、出棧操作。這種分配必須基于可用來(lái)分配的寄存器的數(shù)量大于或者等于變量的數(shù)量。根據(jù)圖著色理論,當(dāng)變量的個(gè)數(shù)大于用于分配的寄存器的數(shù)目時(shí),就會(huì)發(fā)生拋出行為。對(duì)本實(shí)例中的函數(shù)來(lái)說(shuō),其著色圖如圖2所示。首先,根據(jù)參數(shù)和變量的總和與預(yù)分配的寄存器的個(gè)數(shù)進(jìn)行比較,如果參數(shù)和變量的總和小于或者等于預(yù)分配的寄存器的個(gè)數(shù),則可以直接生成匯編代碼;如果寄存器的個(gè)數(shù)無(wú)法滿足函數(shù)中變量與參數(shù)的個(gè)數(shù)需求時(shí),在此函數(shù)中,如果寄存器只有2個(gè)參數(shù)傳遞寄存器和14個(gè)函數(shù)調(diào)用寄存器,無(wú)法滿足該函數(shù)的需求時(shí),編譯器就會(huì)對(duì)函數(shù)的參數(shù)進(jìn)行壓棧,從而降低所產(chǎn)生的匯編代碼的效率。一般來(lái)說(shuō),如果兩個(gè)同一類型的變量的生命期 在函數(shù)的某一點(diǎn)是同時(shí)活躍(live)的,它們就相互沖突,不能占有同一個(gè)寄存器,由圖3可以看出,程序變量argl, arg2和arg3會(huì)同時(shí)使用,所以不可以把它們都指派給同一個(gè)寄存器。但是,一個(gè)變量的最后一次引用在另一個(gè)變量的第一次引用之前,那么它們可以被分配給同一寄存器。根據(jù)這樣的原則對(duì)預(yù)分配的寄存器分配進(jìn)行調(diào)整,能夠使寄存器盡量減少拋出行為。如果根據(jù)上述方法仍然沒(méi)有足夠的寄存器個(gè)數(shù)來(lái)滿足該函數(shù)的需求時(shí),會(huì)根據(jù)以前對(duì)該函數(shù)分析的結(jié)果,即類型,數(shù)量,生命期。編譯器會(huì)將生命期較短的參數(shù)和變量拋出,以達(dá)到要使壓棧、出棧(load/store)指令的動(dòng)態(tài)開銷最小的目的。以上述函數(shù)為例,若采用固定參數(shù)傳遞寄存器的方法,假設(shè)參數(shù)傳遞寄存器的個(gè)數(shù)為2,則明顯寄存器的個(gè)數(shù)不滿足所傳參數(shù)的個(gè)數(shù),此時(shí),編譯器就會(huì)對(duì)參數(shù)進(jìn)行壓棧(將arg3進(jìn)行壓棧,當(dāng)使用arg3時(shí)就必須產(chǎn)生一條Idw指令),從而產(chǎn)生執(zhí)行效率很低的ld/st存取存儲(chǔ)器的指令,從而降低最終產(chǎn)生的可執(zhí)行匯編代碼的效率。而在本發(fā)明中,通過(guò)對(duì)函數(shù)所傳遞的參數(shù)的個(gè)數(shù)和類型進(jìn)行分析,最終確定寄存器分配比例的方法,這樣可以使本例中的參數(shù)傳遞寄存器的個(gè)數(shù)為4,從而滿足函數(shù)參數(shù)傳遞的要求(給argl,arg2和arg3各分配一個(gè)寄存器),使函數(shù)參數(shù)傳遞過(guò)程不必進(jìn)行壓棧操作,同時(shí),對(duì)變量的寄存器分配也進(jìn)行評(píng)估(給varl,Var2,Var3及var2t各分配一個(gè)寄存器),看其是否會(huì)產(chǎn)生更多的ld/st指令,如果沒(méi)有導(dǎo)致變量分配寄存器時(shí)產(chǎn)生的ld/st指令數(shù)增加,則采用當(dāng)前寄存器分配比例。由圖5可以看出,調(diào)整后的寄存器分配方案比調(diào)整前少了一條Irw指令,而Irw指令在匯編中是執(zhí)行速度較慢的指令,這樣一來(lái),執(zhí)行效率低的指令減少了就可以增加匯編代碼的執(zhí)行效率,進(jìn)而增加處理器的效率;如果導(dǎo)致ld/st數(shù)目增加,則重新進(jìn)行評(píng)估,比較減少參數(shù)傳遞壓棧操作和增加的ld/st操作的動(dòng)態(tài)開銷,如果所帶來(lái)的動(dòng)態(tài)開銷要小于增加ld/st增加的開銷,則同樣確定為此時(shí)的寄存器分配比例。如此方法,則可以最大限度的利用有限的寄存器資源,使產(chǎn)生的匯編代碼效率更高。以上對(duì)本發(fā)明的一個(gè)實(shí)施例進(jìn)行了詳細(xì)說(shuō)明,但所述內(nèi)容僅為本發(fā)明的較佳實(shí)施例,不能被認(rèn)為用于限定本發(fā)明的實(shí)施范圍。凡依本發(fā)明申請(qǐng)范圍所作的均等變化與改進(jìn)等,均應(yīng)仍歸屬于本發(fā)明的專利涵蓋范圍 之內(nèi)。
權(quán)利要求
1.一種針對(duì)c*core處理器的寄存器分配的編譯方法,包括前端處理生成的中間代碼,其特征在于該方法還包括 第一步驟判斷源程序是否存在函數(shù)調(diào)用; 第二步驟如果存在函數(shù)調(diào)用,則檢測(cè)程序中的函數(shù)調(diào)用所用的參數(shù),并得出參數(shù)的數(shù)據(jù);如果沒(méi)有,則直接生成最終匯編語(yǔ)言; 第三步驟根據(jù)第二步驟的結(jié)果和寄存器的個(gè)數(shù)進(jìn)行初次分配,如果參數(shù)與變量的數(shù)量總數(shù)不大于寄存器的個(gè)數(shù),則寄存器分配結(jié)束,如果參數(shù)與變量的數(shù)量總數(shù)大于寄存器的個(gè)數(shù),則轉(zhuǎn)入下一步驟; 第四步驟根據(jù)第二步驟所檢測(cè)的結(jié)果,按照非同一生命期的相同類型的變量可分配在一個(gè)寄存器的規(guī)則對(duì)第三步驟初次分配的結(jié)果進(jìn)行優(yōu)化; 第五步驟根據(jù)第四步驟的優(yōu)化分配方法,如果寄存器的個(gè)數(shù)滿足優(yōu)化后變量的數(shù)目要求,則進(jìn)入下一步驟;如果寄存器的個(gè)數(shù)仍不能滿足優(yōu)化后變量的數(shù)目要求,則根據(jù)第二步驟中所得到的函數(shù)中參數(shù)的數(shù)據(jù)來(lái)重新調(diào)整寄存器分配比例; 第六步驟根據(jù)以上步驟生成最后的匯編指令。
2.根據(jù)權(quán)利要求I所述的編譯方法,其特征在于所述的第二步驟中檢測(cè)程序中的函數(shù)調(diào)用所用的參數(shù),并得出參數(shù)的數(shù)據(jù),包括參數(shù)的類型、數(shù)量、生命期。
3.一種根據(jù)權(quán)利要求I所述的針對(duì)Ocore處理器的寄存器分配的編譯器,包括編譯器前端,其特征在于所述的編譯器還包括用于判斷是否有函數(shù)調(diào)用操作的函數(shù)調(diào)用檢測(cè)單元以及用于對(duì)函數(shù)調(diào)用進(jìn)行分析,提取參數(shù)傳遞信息的函數(shù)傳參處理單元。
全文摘要
本發(fā)明提供一種針對(duì)C*core處理器的優(yōu)化寄存器分配的編譯方法,包括對(duì)包括對(duì)前端生成的中間代碼的進(jìn)一步處理,并根據(jù)函數(shù)中變量的類型、數(shù)量及生命期特征,對(duì)寄存器的分配進(jìn)行優(yōu)化。并提供了一種針對(duì)此種方法的編譯器,由于采用上述技術(shù)方案,使得在編譯過(guò)程中進(jìn)行寄存器分配時(shí)可盡量的減少拋出行為,可使處理器減少壓棧出棧的次數(shù),提高處理器執(zhí)行代碼的效率。
文檔編號(hào)G06F9/45GK102831005SQ201210243250
公開日2012年12月19日 申請(qǐng)日期2012年7月13日 優(yōu)先權(quán)日2012年7月13日
發(fā)明者蘭光洋, 王忠海, 肖佐楠, 鄭茳 申請(qǐng)人:天津國(guó)芯科技有限公司
網(wǎng)友詢問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1