專利名稱::微處理器中的有效子程序返回的制作方法
技術領域:
:本發(fā)明涉及微處理器中的子程序返回操作。
背景技術:
:程序通常以執(zhí)行特定任務的子例行程序為特征。在執(zhí)行任務之后,程序流從子例行程序返回到主程序。一種用于執(zhí)行子例行程序返回的常見機制涉及有條件地或無條件地將返回地址寄存器的內(nèi)容移動到程序計數(shù)器中且接著繼續(xù)程序執(zhí)行。也可用可代表布爾值的恒定文字更新返回值寄存器。另一種用于子程序返回的方法是從堆棧"彈出"返回地址并將其輸入到程序計數(shù)器中,且從那點繼續(xù)程序執(zhí)行。此操作還可將任何假脫機輸出寄存器文件內(nèi)容從堆棧彈出到寄存器文件中。這些用于執(zhí)行子例行程序返回的方法采用若干循環(huán)來執(zhí)行。在圖l中,當在典型管線型CPU中執(zhí)行傳統(tǒng)的返回("RET")指令時,需要五個循環(huán)IO來執(zhí)行所述指令。在圖2中,典型的管線型CPU含有程序計數(shù)器("PC")42和指令存儲器44。所述CPU具有分離不同管線級的四個不同管線寄存器46、52、56和60。(寄存器46與52之間的)指令解碼級含有用于對當前指令解碼且產(chǎn)生控制信號的控制/解碼單元("CU")48以及寄存器文件50兩者。(寄存器52與56之間的)執(zhí)行級含有算術邏輯單元("ALU")54。(寄存器56與60之間的)存儲器級含有數(shù)據(jù)存儲器58。繼續(xù)參看圖l,在循環(huán)1期間,在指令獲取("IF")級12中,獲取RET指令(方框22)。在循環(huán)2中,在指令解碼("ID")級14中,產(chǎn)生正確的控制信號且從寄存器文件讀取返回地址寄存器(方框24)。在循環(huán)3中,在執(zhí)行("EX")級16中,通過算術邏輯單元("ALU")無變化地寫入返回地址寄存器內(nèi)容(方框26)。在循環(huán)4期間,在存儲器("MEM")級中,經(jīng)過數(shù)據(jù)存儲器寫入返回地址寄存器內(nèi)容。最后,在循環(huán)5中,在回寫("WB")20級中,將返回地址寄存器內(nèi)容寫入到程序計數(shù)器("PC")且清洗管線(方框30)。一旦管線得以清洗,管線便不會含有任何指令,直到從程序存儲器讀取返回地址處的指令為止。因此,在管線清洗過程中浪費了若干個時鐘循環(huán)。對于從存儲器中的堆棧彈出返回地址寄存器的返回指令("RETMEM")來說存在類似問題。如圖3所示,在循環(huán)1中,在IF級中,獲取RETMEM指令(方框32)。在循環(huán)2期間,在ID級中,產(chǎn)生正確的控制信號。在循環(huán)3中,在EX級期間,經(jīng)過ALU將控制信號路由到數(shù)據(jù)存儲器(方框36)。在循環(huán)4中,在MEM級中,從數(shù)據(jù)存儲器讀取返回地址(方框38)。最后,在循環(huán)5中,在WB級中,將從存儲器讀取的返回地址寫入到PC且清洗管線(方框40)。如同圖1中所論述的返回指令,在管線清洗之后浪費了若干個循環(huán)。提供一種較為有效的子例行程序返回操作將是有利的。
發(fā)明內(nèi)容在示范性實施例中,獲取需要返回操作且基于返回值寄存器的內(nèi)容設置狀態(tài)旗標的指令。與用以處理返回指令所需的至少一個其它操作并行地設置狀態(tài)旗標。在以下情況之一發(fā)生之前設置狀態(tài)旗標i)返回地址寄存器的內(nèi)容移動到程序計數(shù)器中;ii)返回地址從堆棧處彈出并進入程序計數(shù)器中。在另一實施例中,處理器可讀存儲媒體促使處理器執(zhí)行此子例行程序返回操作。在本發(fā)明的又一示范性實施例中,子例行程序返回操作將返回地址放置到程序計數(shù)器中。對返回值寄存器執(zhí)行測試操作;與用以處理返回操作所需的至少一個其它操作并行地執(zhí)行所述測試操作。程序流改變?yōu)槟繕说刂贰m憫趩蝹€指令來執(zhí)行上文提到的歩驟中的每一者。在一個實施例中,處理器可讀存儲媒體存儲促使處理器執(zhí)行此子例行程庁-返回操作的指令。圖1是展示如何在現(xiàn)有技術中執(zhí)行返回指令的圖。圖2是現(xiàn)有技術中的管線型CPU的方框圖。圖3是展示如何在現(xiàn)有技術中執(zhí)行從存儲器中的堆棧彈出返回地址寄存器的返回指令的圖。圖4是本發(fā)明示范性實施例中的管線型CPU的方框圖。圖5是展示本發(fā)明實施例中返回指令的示范性執(zhí)行的圖。圖6是展示在本發(fā)明實施例中執(zhí)行從存儲器中的堆棧彈出返回地址寄存器的返回指令的示范性執(zhí)行的圖。具體實施例方式提供一種更有效的子例行程序返回操作,其中在子例行程序返回操作期間根據(jù)返回值寄存器的測試(在處理器的狀態(tài)寄存器中)更新狀態(tài)旗標。(在現(xiàn)有技術中,響應于單獨的指令執(zhí)行測試操作,例如對返回值寄存器的測試。)在一個實施例中,與用以執(zhí)行單個指令(例如條件返回指令)以及并入有返回操作的單個指令的操作并行地設置狀態(tài)旗標。所述指令存儲在處理器可讀媒體中,所述媒體包括可存儲或傳送信息的任何媒體,例如電子電路、半導體存儲器裝置、ROM、快閃存儲器、軟盤、致密盤、光盤等。這些指令可由現(xiàn)有硬件執(zhí)行。在圖4中,用于執(zhí)行這些指令的示范性CPU包括PC62和指令存儲器64。所述CPU含有分離不同級的四個管線寄存器(IF/ID66、ID/EX70、EX/MEM74和MEM/WB78)。寄存器66與70之間的ID級含有用于對當前指令解碼且產(chǎn)生正確的控制信號的控制/解碼單元68。ID級還含有寄存器文件132。寄存器70與74之間的EX級含有ALU72和旗標寄存器84。寄存器74與78之間的MEM級含有數(shù)據(jù)存儲器76。當?shù)刂芬呀?jīng)達到WB級(在寄存器78之后)時,管線已經(jīng)被清洗且獲取地址被寫入到PC62。多路復用器118確定將哪個地址寫入到寄存器文件或程序計數(shù)器(這在下文中更詳細地論述)中。在其它實施例中,處理器可具有不同特征,例如數(shù)據(jù)轉(zhuǎn)發(fā);如上文提到的,圖4中所描述的CPU是示范性的,且不是可執(zhí)行本文所描述的更有效子例行程序返回操作的唯一處理器。在本發(fā)明的一個實施例中,在用更有效子例行程序返回操作執(zhí)行指令期間與其它操作并行地執(zhí)行測試操作。在一個實施例中,圖5所示,當執(zhí)行返回("return—With_test")指令時,在循環(huán)1期間在IF級中,獲取return—with_test指令(方框86)。在循環(huán)2中,return—with—test已經(jīng)進入ID級;產(chǎn)生iH確的控制信號且從寄存器文件讀取返回地址寄存器(方框88)。在循環(huán)3中,將return—withjest保持在ID級中并持續(xù)額外的循環(huán)(在一個實施例中,這可在解碼級中通過將指令分成兩個"微操作"來完成一個微操作執(zhí)行測試操作,另一個微操作執(zhí)行返回操作);在此第二循環(huán)中,從寄存器文件讀取返回值寄存器且產(chǎn)生用以指示ALU執(zhí)行測試操作的控制信號(方框90)。在循環(huán)3中在EX級中,通過ALU無變化地寫入返回地址內(nèi)容(方框92)。在循環(huán)4期間在EX級中,ALU對應于值寄存器的測試來設置旗標(方框94)。(在此實施例中,根據(jù)返回值寄存器內(nèi)容與零的比較來設置狀態(tài)旗標。此實施例中所使用的狀態(tài)旗標指示溢出("V")、負值("N")、零結(jié)果("Z")和算術或邏輯操作之后的進位("C")。可在其它實施例中使用不同狀態(tài)旗標且/或在其它實施例中可以不同方式設置狀態(tài)旗標。)在循環(huán)4期間在MEM級中,經(jīng)過數(shù)據(jù)存儲器寫入返回地址寄存器內(nèi)容(方框96)。在循環(huán)5期間在WB級中,將返回地址寄存器內(nèi)容寫入到PC且清洗管線(方框98)。已經(jīng)使用原本將由于管線清洗而不被使用的循環(huán)來執(zhí)行測試操作。在另一實施例中,可在執(zhí)行從存儲器中的堆棧處彈出返回地址寄存器的返回指令("pop—with—test")期間執(zhí)行測試操作。在圖6中,在循環(huán)1中在IF級中,獲取pop—with—test指令(方框100)。在循環(huán)2期間在ID級中,產(chǎn)生TH確的控制信號(方框102)。在循環(huán)3中,將pop—with—test保持在ID中持續(xù)一額外的循環(huán)(在一個實施例中,在ID級中將所述指令解碼成兩個微操作(子例行程序返回操作和測試操作));從寄存器文件中讀取返回值寄存器,且產(chǎn)生用以指示ALU執(zhí)行測試操作的控制信號(方框104)。在循環(huán)3中在EX級中,經(jīng)過ALU將控制信號路由到數(shù)據(jù)存儲器(方框106)。在循環(huán)4中在EX級中,ALU設置對應于返回值寄存器的測試的旗標(方框108)。在相同循環(huán)期間,在MEM級中,從數(shù)據(jù)存儲器讀取返回地址(方框110)。在循環(huán)5中在WB級中,將從存儲器讀取的返回地址寫入PC且清洗管線(方框112)。本發(fā)明的其它實施例可不同于上文論述的實施例。這些實施例可能需要較少或額外的時鐘循環(huán)來執(zhí)行指令。其它實施例可能需要不同硬件來執(zhí)行指令。其它實施例可并入不同子程序返回操作和指令中。圖5禾Q6分別是"return—with—test"禾卩"pop_with—test"指令的示范性實施例。在"return—with—test"指令中,連同測試返回值寄存器中的值一起執(zhí)行"返回"。"測試"測試指定的寄存器且相應地設置條件碼旗標。"pop—withJest"指令連同測試返回值寄存器中的值一起執(zhí)行"彈出"(將字從堆棧加載到指定寄存器或程序計數(shù)器中;彈出到PC清洗管線且開始從自堆棧加載的地址中獲取指令)。從控制/解碼單元要求各種信號?;氐綀D4,在一個實施例中需要以下信號pCmUX_sd114——用以選擇將用順序程序地址還是用返回指令給出的地址來更新程序計數(shù)器的選擇器信號。wbmUX_Sel116——回寫級用以確定將把哪個地址寫入到寄存器文件或程序計數(shù)器中的選擇器信號。如果信號是邏輯"0",那么地址來自來自EX/MEM管線級的ALU結(jié)果。如果信號是邏輯"l",那么地址來自數(shù)據(jù)存儲器。as—Ctrl120——用于選擇ALU中的加法器將對來自寄存器文件的操作數(shù)執(zhí)行減法還是加法的控制信號。zeromux_sel122——用以將ALU的輸入操作數(shù)B迫使為整數(shù)值零的信號。readregl124——針對操作數(shù)1的寄存器文件寄存器編號。readreg2126——針對操作數(shù)2的寄存器文件寄存器。loadflag128——用以允許狀態(tài)寄存器更新旗標設定的控制信號。writeaddr130—一針對其中寫回結(jié)果的寄存器的寄存器文件寄存器編號。以下表格列舉了在RET指令的循環(huán)中來自控制/解碼單元的示范性輸出。在所述表格中識別以下寄存器R12—一返回值寄存器。對此寄存器執(zhí)行測試操作。LR—一鏈接寄存器。在完成子程序之后保持地址返回。LR還可被稱為返回地址寄存器(RAR)。PC—一程序計數(shù)器。保持當前執(zhí)行的指令的地址。以下表格列舉了在return_with_test指令的循環(huán)中來自控制/解碼單元的示范性輸出。<table>tableseeoriginaldocumentpage9</column></row><table>"return—with—test"禾B"pop—with—test"指令可執(zhí)行作為其它指令的一部分。舉例來說,"return—withjest"指令可執(zhí)行作為條件返回指令的一部分,其中如果指定條件為真,那么存在從子例行程序的返回。將值移動到返回寄存器中,測試返回值,且設置旗標。此指令的特定實例是ATMELAVR32指令組中的"ret{Cond4}"指令。以下偽碼描述ret(cond4》指令(SP是堆棧指針寄存器)操作I.If(cond4)If(Rs!={LR,SP,PC})R12—Rs;elseif(Rs==LR)R12—-1;elseif(Rs==SP)R12—0;elseR12—1;TestR12andsetflags;PC—LR;語法I.ret{cond4}Rs操作數(shù)I.cond4e{eq,ne,cc/hs,cs/lo,ge,It,mi,pi,Is,gt,le,hi,vs,vc,qs,al}sg{0,1,...,15}狀態(tài)旗標設置旗標作為操作CPR12,0的結(jié)果。V:V—0N:N—RES[31]Z:Z—(RES[31:0]==0)C:C—0以下表格解釋上文所使用的一些助記符和針對"加載多個寄存器"指令的偽碼'下文中<table>tableseeoriginaldocumentpage10</column></row><table><table>tableseeoriginaldocumentpage11</column></row><table>操作CPR12,0是沒有運算的比較或減法操作。在此特定情況下,操作結(jié)果=R12-0。其中可采用"retum_with—test"操作的另一指令是來自AVR32指令組的"加載多個寄存器"指令。此指令將由寄存器指針指向的連續(xù)字加載到所述指令中所指定的寄存器中。可加載PC,從而導致跳躍到所加載的目標地址。如果PC被加載,那么測試R12中的返回值,且更新旗標。視情況可將返回值設置為-l、0或1。以下偽碼描述此指令(SP是堆棧指針)I.Loadaddress—Rp;ifReglistl6[PC]==1thenifRp==PCthenLoadaddress—SP;PC—*(Loadaddress++);ifRp==PCthenifReglistlS[LR,R12]==B'OOR12—0;elseifReglistl6[LR,R12]==B'01R12—1;elseR12—1;TestR12andupdateflags;elseTestR12andupdateflags;ifReglistl6[LR]==1LR—*(Loadaddress++);ifReglistl6[SP]==1SP—*(Loadaddress++);ifReglistl6[R12]==1R12—*(Loadaddress++》elseifReglistl6[LR]==1LR—*(Loadaddress++);ifReglistl6[SP]==1SP—*(Loadaddress++);ifReglistl6[R12]==1R12—*(Loadaddress++);for(i=11to0)ifReglistl6[i]==1thenRi—*(Loadaddress++);ifOpcode[+十〗==1thenifRp==PCthenSP—Loadaddress;elseRp—Loadaddress;語法I.1dmRp{++},RegUstl6操作數(shù)I.Reglist16e{RO,R1,R2,…,R12,LR,SP,PC}pe{0,1,…,15}狀態(tài)旗標僅當Reglistl6[PC]==1時才更新旗標。將其設置作為操作CPR12,0的結(jié)果。V:V—0N:N—RES[31]Z:Z—(RES[31:0]==0)C:C—0可采用采用"pop—with—test"操作的類似指令,其中將SP所指向的字加載到所述指令中所指定的寄存器中。其中可采用"pop—With_test"操作的指令是來自AVR32指令組的從堆棧彈出多個寄存器("POPM")指令。此指令將SP所指向的連續(xù)字加載到所述指令中所指定的寄存器中。盡管上文已經(jīng)引用展示可如何在不同指令中采用子例行程序返回操作的特定實例,但其它實施例可將子例行程序操作并入不同指令中。所述更有效子例行程序返回操作的一個優(yōu)點是代碼大小的減小,因為由于可由返回操作隱含地執(zhí)行測試操作而可消除明確的"測試返回寄存器"指令。另一個優(yōu)點是執(zhí)行時間得以減少,因為并行地執(zhí)行返回寄存器測試與程序?qū)⒎祷氐闹噶畹墨@取??稍赗ISC和CISC機器兩者中采用上文描述的指令和操作。盡管己經(jīng)依據(jù)特定示范性實施例描述了本發(fā)明,但所屬領域的技術人員將認識到,可在不脫離本發(fā)明原理的情況下對所述實施例作出變化和增添。舉例來說,返回操作可能需要更多或更少的循環(huán)來執(zhí)行,或者返回操作可以是不同指令的一部分,或者執(zhí)行返回操作的處理器可能具有不同結(jié)構(gòu)。在另一實施例中,可添加更多硬件,因而返回操作可在一個循環(huán)中完成(即,在一個循環(huán)中完成響應于單個指令而執(zhí)行的兩個微操作)。權利要求1.一種用于執(zhí)行子例行程序返回操作的方法,所述方法包含a)獲取需要所述返回操作的指令;以及b)與處理所述返回操作所需的至少一個其它操作并行地基于返回值寄存器的內(nèi)容來設置狀態(tài)旗標,在以下之一者發(fā)生之前設置所述狀態(tài)旗標i)將返回地址寄存器的內(nèi)容移動到程序計數(shù)器中;或ii)從堆棧彈出返回地址并將其進入所述程序計數(shù)器中。2.根據(jù)權利要求1所述的方法,其中僅當測試操作確定滿足返回條件時,才將所述返回地址寄存器的所述內(nèi)容移動到所述程序計數(shù)器中,或從所述堆棧彈出返回地址并使其進入所述程序計數(shù)器中。3.根據(jù)權利要求1所述的方法,其中將所述返回操作分成兩個微操作,一個微操作用于執(zhí)行所述返回操作,另一個微操作用于執(zhí)行測試操作。4.根據(jù)權利要求1所述的方法,其中與通過微處理器的算術邏輯單元寫入返回地址寄存器的內(nèi)容并行地設置所述狀態(tài)旗標。5.根據(jù)權利要求1所述的方法,其中與經(jīng)過所述微處理器的算術邏輯單元將控制信號路山到所述微處理器的數(shù)據(jù)存儲器并行地設置所述狀態(tài)旗標。6.根據(jù)權利要求1所述的方法,其中響應于單個指令來執(zhí)行歩驟a)和b)。7.—種處理器可讀存儲媒體,其存儲在由處理器執(zhí)行時促使所述處理器執(zhí)行用于執(zhí)行子例行程序返回操作的方法的指令,所述方法包含a)獲取需要所述返回操作的指令;以及b)與處理所述返回指令所需的至少一個其它操作并行地基于返回值寄存器的內(nèi)容設置狀態(tài)旗標,在以下之一者發(fā)生之前設置所述狀態(tài)旗標i)將返回地址寄存器的內(nèi)容移動到程序計數(shù)器中;或ii)從堆棧彈出返回地址并將其彈入所述程序計數(shù)器中。8.根據(jù)權利要求7所述的處理器可讀存儲媒體,其中僅當測試操作確定滿足返回條件時,才將所述返回地址寄存器的所述內(nèi)容移動到所述程序計數(shù)器中,或從所述堆棧彈出返回地址并使其進入所述程序計數(shù)器中。9.根據(jù)權利要求7所述的處理器可讀存儲媒體,其中將所述返回操作分成兩個微操作,一個微操作用于執(zhí)行所述返回操作,另一個微操作用于執(zhí)行測試操作。10.根據(jù)權利要求7所述的處理器可讀存儲媒體,其中與通過微處理器的算術邏輯單元寫入返回地址寄存器的內(nèi)容并行地設置所述狀態(tài)旗標。11.根據(jù)權利要求7所述的處理器可讀存儲媒體,其中與經(jīng)過所述微處理器的所述算術邏輯單元將控制信號路由到所述微處理器的數(shù)據(jù)存儲器并行地設置所述狀態(tài)旗標。12.根據(jù)權利要求7所述的處理器可讀存儲媒體,所述方法進一步包含在將所述返回地址寄存器的所述內(nèi)容或所述返回地址寫入所述程序計數(shù)器中之前清除管線。13.根據(jù)權利要求7所述的處理器可讀存儲媒體,其中響應于單個指令來執(zhí)行步驟a)和b)。14.一種用于執(zhí)行子例行程序返回操作的方法,其包含a)將返回地址放置到程序計數(shù)器中;b)對返回值寄存器執(zhí)行測試操作,與處理返回操作所需的至少一個其它操作并行地執(zhí)行所述測試操作;c)將程序流改變?yōu)槟繕说刂罚灰约癲)響應于單個指令執(zhí)行歩驟a)、b)和c)。15.根據(jù)權利要求14所述的方法,其中僅在所述測試操作確定滿足返回條件的情況下才執(zhí)行所述改變所述程序流的步驟。16.根據(jù)權利要求14所述的方法,其中在指令解碼級中保持所述子例行程序返回操作持續(xù)一額外的循環(huán)。17.根據(jù)權利要求14所述的方法,其中與通過微處理器的算術邏輯單元寫入返回地址寄存器的內(nèi)容并行地設置所述測試操作的狀態(tài)旗標。18.根據(jù)權利要求14所述的方法,其中與將控制信號路由到微處理器的位于所述微處理器的算術邏輯單元的下游處的數(shù)據(jù)存儲器并行地設置所述測試操作的狀態(tài)旗標。19.根據(jù)權利要求14所述的方法,其進一步包含加載多個寄存器。20.根據(jù)權利要求14所述的方法,其進一步包含在返回值寄存器中設置返回值。21.—種處理器可讀存儲媒體,其存儲由處理器執(zhí)行時促使所述處理器執(zhí)行用于執(zhí)行子例行程序返回操作的方法的指令,所述方法包含a)將返回地址放置到程序計數(shù)器中;b)對返回值寄存器執(zhí)行測試操作,與處理返回操作所需的至少一個其它操作并行地執(zhí)行所述測試操作;c)將程序流改變?yōu)槟繕说刂?;以及d)響應于單個指令執(zhí)行步驟a)、b)和c)。22.根據(jù)權利要求21所述的處理器可讀存儲媒體,其中僅在所述測試操作確定滿足返回條件的情況下才執(zhí)行所述改變所述程序流的步驟。23.根據(jù)權利要求21所述的處理器可讀存儲媒體,其中在指令解碼級中保持所述返回操作持續(xù)一額外的循環(huán)。24.根據(jù)權利要求21所述的處理器可讀存儲媒體,其中與通過微處理器的算術邏輯單元寫入返回地址寄存器的內(nèi)容并行地設置所述測試操作的狀態(tài)旗標。25.根據(jù)權利要求21所述的處理器可讀存儲媒體,其中與將控制信號路由到所述微處理器的位于所述微處理器的算術邏輯單元的下游處的數(shù)據(jù)存儲器并行地設置所述測試操作的狀態(tài)旗標。26.根據(jù)權利要求23所述的處理器可讀存儲媒體,所述方法進一歩包含加載多個寄存器。27.根據(jù)權利要求23所述的處理器可讀存儲媒體,所述方法進一步包含在返回值寄存器中設置返回值。全文摘要本發(fā)明提供一種用于執(zhí)行子例行程序返回操作的方法和媒體。與返回操作(98)中的其它操作(92、94)并行地執(zhí)行測試操作(88、90)。響應于單個指令(86)來執(zhí)行這些測試操作(88、90)和所述返回操作(96、98)。文檔編號G06F9/44GK101194228SQ200680020713公開日2008年6月4日申請日期2006年5月25日優(yōu)先權日2005年6月10日發(fā)明者厄于溫·斯特倫,埃里克·K·雷諾,莫滕·W·倫斯申請人:愛特梅爾公司