一種用于函數(shù)返回地址預(yù)測的裝置及方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明屬于微處理器領(lǐng)域,尤其涉及一種用于函數(shù)返回地址預(yù)測的裝置及方法。
【背景技術(shù)】
[0002]轉(zhuǎn)移指令是處理器的基本指令之一,廣泛存在于程序中。轉(zhuǎn)移指令會引入程序控制流的轉(zhuǎn)移,是處理器的性能殺手之一。進一步,轉(zhuǎn)移指令包括條件轉(zhuǎn)移指令和無條件轉(zhuǎn)移指令以及間接轉(zhuǎn)移指令。其中,函數(shù)返回指令作為間接轉(zhuǎn)移指令的一種,頻繁應(yīng)用于子函數(shù)的程序返回,對處理器的性能有著重大影響。為了加快函數(shù)返回指令的執(zhí)行速度,中高端嵌入式處理器普遍采用了函數(shù)返回地址棧,為函數(shù)返回指令提供返回地址的預(yù)測。其基本原理是在發(fā)生函數(shù)調(diào)用時,將函數(shù)調(diào)用指令的下一條指令的地址視為函數(shù)返回的地址,并緩沖到函數(shù)返回地址棧中;在發(fā)生函數(shù)返回時,從函數(shù)返回地址棧中讀取緩存的地址作為預(yù)測的函數(shù)返回地址并返回。
[0003]由于函數(shù)返回地址棧常位于處理器中的流水線前級,導(dǎo)致函數(shù)返回地址棧在運行過程中由于流水線的原因效率較低。目前對函數(shù)返回地址棧的改進集中于對其性能的改進,根據(jù)函數(shù)調(diào)用與返回指令在流水線中處理的不同節(jié)點設(shè)計多個返回棧指針,包括棧頂指針、檢驗指針、恢復(fù)指針等,用于維護函數(shù)返回地址棧讀取指針的正確性,進一步,也有為在流水線中不同處理節(jié)點設(shè)計多個函數(shù)返回地址棧的方法,使得返回地址棧具有了內(nèi)容糾錯能力。但這兩類方法都是對性能進行優(yōu)化的方法。
[0004]有研宄表明,受限于函數(shù)的大小,函數(shù)調(diào)用的地址偏移大都在IMb范圍以內(nèi),因此函數(shù)返回地址棧中對函數(shù)返回地址的高位進行保存在大多數(shù)情況下是沒有意義的。
【發(fā)明內(nèi)容】
[0005]為了克服已有函數(shù)返回地址棧方式的成本較高、處理器性能受限的不足,本發(fā)明提供了一種有效降低函數(shù)返回地址棧的成本、提升處理器性能的用于函數(shù)返回地址預(yù)測的裝置及方法。
[0006]本發(fā)明解決其技術(shù)問題所采用的技術(shù)方案是:
[0007]一種用于函數(shù)返回地址預(yù)測的裝置,所述裝置包括:
[0008]指令譯碼單元,用于對輸入的指令進行譯碼,產(chǎn)生操作指示符;
[0009]函數(shù)返回地址棧,包含S個表項,用于接受指令譯碼單元的操作指示符,對于譯碼得到的函數(shù)調(diào)用指令,函數(shù)返回地址棧截取并保存函數(shù)調(diào)用指令的下一條指令的地址的低M比特,對于譯碼得到的函數(shù)返回指令,從函數(shù)返回地址棧中彈出最近入棧的表項的M比特地址,拼上函數(shù)返回指令地址的高(N-M)位,封裝產(chǎn)生N比特的目標地址作為函數(shù)返回指令的預(yù)測地址A,并記錄返回地址A對應(yīng)的表項索引X ;
[0010]執(zhí)行單元,用于接受指令譯碼單元的操作指示符以及函數(shù)返回地址棧的預(yù)測地址A與表項索引X,當操作指示符指示為函數(shù)返回指令時,判斷地址A是否預(yù)測正確,產(chǎn)生預(yù)測正確信息與實際跳轉(zhuǎn)地址;
[0011]糾錯單元,用于接受執(zhí)行單元的輸出,在函數(shù)返回地址預(yù)測錯誤時用實際地址B對函數(shù)返回地址棧中表項索引X指向的內(nèi)容進行糾正。
[0012]進一步,所述的函數(shù)返回地址棧中每個表項的內(nèi)容為M比特,預(yù)測地址A與實際地址B為N比特,M、N均為整數(shù),M<No
[0013]所述譯碼單元對函數(shù)調(diào)用和函數(shù)返回指令進行譯碼,并根據(jù)譯碼結(jié)果完成函數(shù)返回地址棧的入棧和出棧操作。
[0014]函數(shù)返回地址棧采用先進后出的堆棧結(jié)構(gòu)。
[0015]再進一步,所述執(zhí)行單元中,計算產(chǎn)生實際函數(shù)返回地址B,并與預(yù)測地址A進行比較,產(chǎn)生預(yù)測正確信息以及實際地址B;所述糾錯單元中,接受執(zhí)行單元的輸出,在函數(shù)返回地址預(yù)測錯誤時用實際地址B的低M比特信息對函數(shù)返回地址棧中表項索引X指向的內(nèi)容進行糾正。
[0016]一種用于函數(shù)返回地址預(yù)測的方法,所述方法包括如下步驟:
[0017]I)對指令進行譯碼,譯出函數(shù)調(diào)用指令和函數(shù)返回指令,并產(chǎn)生操作指示符;
[0018]2)當指令譯碼為函數(shù)調(diào)用指令時,截取下一條指令的地址的低M比特并保存在函數(shù)返回地址棧中;當指令譯碼為函數(shù)返回指令時,從函數(shù)返回地址棧中彈出最近入棧的表項的M位地址,拼接上函數(shù)返回指令的高(N-M)位地址,封裝產(chǎn)生函數(shù)返回指令的預(yù)測地址A,并記錄預(yù)測地址A對應(yīng)的表項索引X ;
[0019]3)當操作指示符指示為函數(shù)返回指令時,判斷地址A是否預(yù)測正確,產(chǎn)生預(yù)測正確信息與實際跳轉(zhuǎn)地址;
[0020]4)在函數(shù)返回地址預(yù)測錯誤時用實際地址B對函數(shù)返回地址棧中表項索引X指向的內(nèi)容進行糾正;
[0021]進一步,所述步驟3)中,計算產(chǎn)生實際函數(shù)返回地址B,并與預(yù)測地址A進行比較,產(chǎn)生預(yù)測正確信息以及實際地址B ;所述步驟4)中,在函數(shù)返回地址預(yù)測錯誤時用實際地址B的低M比特信息對函數(shù)返回地址棧中表項索引X指向的內(nèi)容進行糾正。
[0022]再進一步,所述的函數(shù)返回地址棧包含S個表項,每個表項的內(nèi)容為M比特,預(yù)測地址A與實際地址B為N比特,M、N均為整數(shù),M<No
[0023]更進一步,函數(shù)返回地址棧采用先進后出的堆棧結(jié)構(gòu)。
[0024]本發(fā)明的技術(shù)構(gòu)思為:在保證函數(shù)返回地址棧對函數(shù)返回地址較高預(yù)測準確率的情況下,以減小函數(shù)返回地址棧每個表項內(nèi)數(shù)據(jù)寬度的方法來降低函數(shù)返回地址棧的成本。在此基礎(chǔ)上提出了函數(shù)返回地址棧無需保留全部地址信息而只保留低位地址信息的預(yù)測裝置和方法。
[0025]本發(fā)明的有益效果主要表現(xiàn)在:有效降低函數(shù)返回地址棧的成本、提升處理器性會K。
【附圖說明】
[0026]圖1是一種函數(shù)返回地址預(yù)測裝置的示意圖。
[0027]圖2是函數(shù)返回地址棧原理圖。
[0028]圖3是函數(shù)返回地址棧棧頂指針維護原理圖。
[0029]圖4是糾錯單元原理圖。
[0030]圖5是一種函數(shù)返回地址預(yù)測方法的流程示意圖。
【具體實施方式】
[0031]下面結(jié)合附圖對本發(fā)明作進一步描述。
[0032]實施例1
[0033]參照圖1?圖4,一種函數(shù)返回地址預(yù)測裝置,包括譯碼單元,函數(shù)返回地址棧,執(zhí)行單元和糾錯單元。
[0034]指令譯碼單元對輸入的指令進行譯碼得到操作指示符、寄存器索引等信息。操作指示符包括指令類型、操作數(shù)類型以及操作數(shù)個數(shù)等。指令類型可以有運算類指令、內(nèi)存訪問指令、條件轉(zhuǎn)移指令、無條件轉(zhuǎn)移指令和間接轉(zhuǎn)移指令等。其中間接轉(zhuǎn)移類指令里的函數(shù)調(diào)用和函數(shù)返回指令必須經(jīng)由譯碼單元譯出。寄存器索引信息可以幫助確定函數(shù)返回指令以及為間接轉(zhuǎn)移指令提供地址信息。指令譯碼單元在譯出當前輸入指令為函數(shù)調(diào)用指令時,會將該指令下一條指令的地址連同一根寫控制信號傳遞給函數(shù)返回地址棧。指令譯碼單元在譯出當前輸入指令為函數(shù)返回指令時,會傳遞給函數(shù)返回地址棧當前指令的地址連同一根讀控制信號。同時,指令譯碼單元還會將操作指示符和寄存器索引等信息傳遞給執(zhí)行單元。
[0035]參照圖2所示,為函數(shù)返回地址棧的一種示意圖。函數(shù)返回地址棧共有8個表項,每個表項的數(shù)據(jù)寬度為20比特。函數(shù)返回地址棧采用先進后出的堆棧式結(jié)構(gòu),以棧頂指針P對返回地址棧的寫入和讀取操作進行控制,指針P在復(fù)位時指向表項O的位置。當譯碼單元譯出當前指令為函數(shù)調(diào)用指令時,會將該指令下一條指令的地址連同寫控制信號傳遞給函數(shù)返回地址棧。當譯碼單元譯出其他類型的指令時,該寫控制信號不會被置起。函數(shù)返回地址棧在接收到該寫控制信號后,會截取譯碼單元傳遞來的指令地址的低20比特信息,寫入指針P所指向的函數(shù)返回地址棧的表項,同時指針P執(zhí)行“加一”的操作。當譯碼單元譯出當前指令為函數(shù)返回指令時,會傳遞給函數(shù)返回地址棧當前函數(shù)返回指令的地址連同一讀控制信號。當譯碼單元在譯出其他類型的指令時,該讀控制信號不會被置起。函數(shù)返回地址棧在看到該讀控制信號后,指針P會執(zhí)行“減一”的操作,之后將指針P所指向的函數(shù)返回地址棧表項內(nèi)的信息讀取出來。與此同時,函數(shù)返回地址棧會截取從譯碼單元傳遞過來的指令地址的高12比特信息,拼接上從地址棧表項內(nèi)讀取的20比特信息作為函數(shù)返回的預(yù)測地址A。該預(yù)測地址A以及指針P所指向的表項位置即索引X會被傳遞給執(zhí)行單元用于函數(shù)返回地址正確性的檢驗。
[0036]參照圖3所示,為函數(shù)返回地址棧棧頂指針P的維護示意圖。棧頂指針P以8位獨熱碼表示所指向的表項索引。當函數(shù)返回地址棧接收到的寫控制信號被置起時,執(zhí)行“加一”的操作;當函數(shù)返回地址棧接收到的讀控制信號被置起時,執(zhí)行“減一”的操作。當指針P加到7之后,寫控制信號再次被置起時,指針P變成0,指向函數(shù)返回地址棧O號表項所在的位置;當指針P減到O之后,讀控制信號再次被置起時,指針P變成7,指向函數(shù)返回地址棧7號表項所在的位置。
[0037]執(zhí)行單元在接收到譯碼單元的操作指示符以及寄存器索引等信息表明當前指令為函數(shù)返回指令時,會同時接收從函數(shù)返回地址棧傳遞來的函數(shù)返回預(yù)測地址A以及預(yù)測地址A所對應(yīng)的函數(shù)返回地址棧表項索引X。執(zhí)行單元根據(jù)從譯碼單元傳遞來的寄存器索引去寄存器組讀得相應(yīng)