專利名稱:高數(shù)據(jù)密度risc處理器的制作方法
技術領域:
本發(fā)明的背景1.本發(fā)明的領域本發(fā)明是針對微處理器系統(tǒng);特別地,本發(fā)明是針對高性能的簡化指令系統(tǒng)計算機(RISC)結構處理器,它實現(xiàn)指令寬度的高效使用。
2.背景技術的描述處理器指令系統(tǒng)的設計是一門建立良好的技術。大部分指令系統(tǒng)特征本身不是新的??墒?,可以按照促進尖端技術的新而唯一的方式來合并個體特點。特別是當為一個不同于現(xiàn)有指令集的使用而使指令集設計優(yōu)化時,在目標應用程序中使用執(zhí)行該指令集的一個處理器時可以帶來顯著的改善。
指令集設計需要均衡許多競爭目標,包括編碼各個算法所需要的機器代碼的尺寸;用于新的算法和應用程序的指令集的可延展性和適應性;在此類算法上執(zhí)行指令集的處理器的性能和功率消耗;執(zhí)行該指令集的處理器的成本;對于多個處理器設備,該指令集隨時間的適用性;執(zhí)行該指令集的處理器的設計的復雜性;以及指令集作為從高階的程序設計語言中編碼的目標的適用性。
指令集對處理器性能有一個直接影響和兩個間接影響。雖然作為編碼的一個目標,指令集的適用性在這里也同樣是一個因子,但是指令集直接確定IE,IE是實現(xiàn)一個給定算法所需要的指令數(shù)量。處理器性能的另外一個成分是時鐘周期CP和每個指令的平均時鐘CPI。這些首先是指令集實現(xiàn)的屬性,但是指令集特點可能影響設備同時每個時鐘遇見時間以及每個指令目標遇見時鐘的性能。例如,一個編碼選擇可以命令與剩余的指令執(zhí)行連續(xù)的附加邏輯,一個設備將通過增加每個時鐘的時間或者通過增加一個附加管道級來對其編址,這通常將增加每個指令的時鐘。
在八十年代和九十年代,開發(fā)了稱為RISC的一種新指令集結構。它誕生于上述折衷方案的實現(xiàn),即T=IE*CPI*CP在此,T是以秒為單位的程序執(zhí)行時間而其他變量如上所述。RISC指令集讓設備顯著地改善CPI和CP而不必大量增加IE。RISC指令集改進了處理器的性能,降低了設計復雜性,在一個給定的性能水平上提供較低成本的處理器設備,并且非常適于高階的程序設計語言的編碼。
處理器體系結構團體從未就RISC的完全令人滿意的定義達成一致意見,但是它通常包括下列屬性的大部分固定尺寸指令字;在從具有16或者多個寄存器的一個通用寄存器堆中讀出的操作碼上執(zhí)行算術和其他計算運算并且把結果寫到同一寄存器堆中;對于源寄存器字段固定指令字中的位置以便寄存器堆訪問可以與指令解碼并行地發(fā)生;存儲器訪問主要地通過從存儲器到寄存器的加載來完成,并且從寄存器儲存到存儲器(這與在計算指令中具有存儲器操作碼相對);少數(shù)(經(jīng)常為1,通常小于4)方法用于計算存儲器地址;避免那些使得指令的管道執(zhí)行變難的特點(例如,一個給定的指令不止一次地使用一個硬件資源);以及避免需要微代碼或其等價物的那些特點。不是所有被認為是RISC的處理器都包含以上全部要素,但是所有的都包含上面的大部分要素。
然而,早期RISC指令集在產(chǎn)生緊密(compact)機器代碼上不是特別有效。特別是,RISC指令集通常需要比預先RISC指令集更多的位來編碼一個應用程序。在總的解決方案成本中,一個應用程序的機器代碼尺寸經(jīng)常比處理器本身的成本更重要,因為需要大的存儲器來保存該應用程序。在性能是最重要的許多應用程序中,RISC仍然是可接受的,但是具有RISC的優(yōu)點又減小代碼尺寸的指令集在許多其他處理器應用中將是實用的。
一些早期處理器指令集(IBM 7090,CDC 6600,DEC PDP6,GE635)由于它們被設計來由硬件直接執(zhí)行,沒有微代碼,就像RISC一樣,所以它們具有一些RISC特性。由于諸如字(與字節(jié)相對)尋址、有限的地址空間以及運算的特殊組合之類的特點,這些指令集的大部分不是很適合于現(xiàn)代高級語言和應用程序。大部分事實上打算用于匯編語言程序設計。一些還是基于36位數(shù)據(jù)字和指令寬度,并且36位指令對于碼密度不是很好。一些是基于一個累加器和用于計算的存儲器范例,其限制了性能。雖然本發(fā)明的一些個別特點可以被追溯到這幾代機器,但是其中并無一個具有所期望的特性。
執(zhí)行處理器的微代碼的使用使得更復雜的指令集變得可行(IBM360,DEC PDP11,DEC VAX,Intel x86,LLNL S-1,Motorola68000)。因此,下一代處理器含有擁有優(yōu)良碼密度的復雜指令集,部分應歸于復雜可變指令長度編碼??墒?,微代碼處理器和它們的復雜指令集常常不適合于高性能。代替在一個硬件管道中直接的執(zhí)行(其增加CPI),通過一臺微引擎的迭代來執(zhí)行復雜指令。各種不同格式的指令集設計在這個級顯露出具有脫離一兩個累加器而到通用寄存器結構或者堆棧結構的一種趨勢。寄存器或者堆棧的設備成本已經(jīng)變得足夠低以致于指令集能夠使用這些有益的格式。
正如上面所提及的,雖然RISC在性能上有顯著的改善,但是RISC對于碼密度卻是一種阻礙。大多數(shù)RISC指令集基于定長32位的指令,而32位出現(xiàn)比所需要的多。并且,為了獲得最佳碼密度,一些可變長度編碼是必需的。此時盡管具有代碼尺寸優(yōu)勢,堆棧結構由于其低性能而逐漸消失,這表示出一個指令集既達到性能又達到代碼尺寸目標是多么重要。
為了補償RISC的代碼尺寸的缺點,若干處理器設計者引入了他們的指令集的緊密編碼。ARM的Thumb和MIPS的MIPS 16就是例子。兩者都主要使用16位指令同時使用少數(shù)的32位指令。由于僅僅含有8個寄存器(增加IE)、隱含的源寄存器操作碼的使用(增加CP或者CPI)、在指令字中常數(shù)的有限排列(增加IE)以及個別的寄存器操作碼數(shù)目(對于大多數(shù)指令來說兩個或者更少--增加IE),所以16位編碼(它通過把每個指令的位數(shù)對分來提供較小代碼)產(chǎn)生劣質性能。
Hitachi SH指令集類似于RISC,并且把代碼尺寸作為一個目標。它從一個16位指令集開始,但是隨后找到它需要增加32位指令。它具有16個寄存器,但是每個指令仍然具有至多兩個寄存器字段(增加IE),并且具有十分有限的分支偏移。
我們所需要的是這樣一種指令集設計,其提供RISC的性能和其他優(yōu)點,并且也提供小成本有效的機器代碼。為了不用過度的復雜性就簡化高性能的設備,該指令集應該是不用微代碼就可通過一個既簡單又短的管道來直接執(zhí)行。這里應該有一個足夠數(shù)目的通用寄存器來達到優(yōu)良的性能并且成為使編輯器最優(yōu)化的一個適當目標。其他技術可以用來更進一步地簡化代碼尺寸。
本發(fā)明的另外一個目的是提供執(zhí)行指令集的一種處理器,該指令集含有一起協(xié)作工作的指令,以便當使用具有每個指令有限的平均位數(shù)的指令編碼時保持一個較少的用來表示一個程序所需要的指令的靜態(tài)數(shù)量。在一個窄的指令字中提供一種指令常數(shù)的有效編碼是本發(fā)明對現(xiàn)有技術的一部分貢獻。
本發(fā)明的另外一個目的是提供一種處理器,該處理器對于普通的情況正好使用具有較長目標說明符的大多數(shù)實用的比較和形式來使用一種24位指令字編碼比較和分支指令以便實現(xiàn)一種RISC指令集。
本發(fā)明的另外一個目的是提供一種處理器,執(zhí)行具有一個降低開銷循環(huán)性能的一般用途(例如相對于專門的,例如DSP)指令集,該性能減少了表示一個程序所需要的靜態(tài)指令數(shù)量和循環(huán)以及執(zhí)行該程序所需要的指令數(shù)量。
按照本發(fā)明的第一優(yōu)選實施例,通過提供一種執(zhí)行指令集的RISC處理器,實現(xiàn)了上述目的,它除了適合于上述的方程式T=IE*CPI*CP之外,在考慮下列代碼尺寸方程式的情況下進行設計
S=IS*BI在此,S是以位為單位的程序指令的尺寸;IS是表示該程序所需要的靜態(tài)指令數(shù)量(不是如早期那樣一個執(zhí)行所需要的數(shù)目);以及BI是每個指令的平均位數(shù)。
與RISC相比,本發(fā)明在極小地增加CP和CPI的同時既降低了BI又降低了IS。它具有同時增加和減少IE的特點。
利用這樣的認識設計了本發(fā)明的這個方面它必須根據(jù)RISC原理在一個固定長度的高性能編碼中提供優(yōu)良的編碼密度,包括具有加載/存儲結構的一個通用寄存器。為了達到可仿效的編碼密度,該實施例增加了沒有對性能進行折衷的一種簡單的可變長度編碼。這個實施例還使處理器設備的成本最優(yōu)化。
對當前的優(yōu)選實施例的詳細描述一種適于如本發(fā)明的優(yōu)選實施例所述的執(zhí)行指令集的處理器如
圖1所示。通常,該處理器具有232個字節(jié),即,4GB,用于指令和數(shù)據(jù)的虛擬存儲器;一個32位程序計數(shù)器IPC;十六或者更多的的32位的通用寄存器;一個偏移地址寄存器SAR;一個32位循環(huán)開始地址寄存器LBEG,一個32位循環(huán)結束地址寄存器LEND,以及一個32位循環(huán)計數(shù)寄存器LCOUNT,所有這三個被在下面更詳細描述的減少開銷循環(huán)指令所使用。在Tensilica公司1999年“XtensaTM指令集(ISA)參考手冊Rev 1.10”(下文中稱為ISA手冊)中對這種循環(huán)指令和其首選實現(xiàn)方案作了更為詳細的描述。
更具體地,處理器的管道可以被分為五個基本級獲取指令或稱為I級100;對指令進行解碼和訪問寄存器或稱為R級200;執(zhí)行和尋址或稱為E級300;訪問內存或稱為M級400;回寫或稱為W級500。在I級100,從內存中讀取將被執(zhí)行的指令;在R級200,獲取的指令被解碼并存入寄存器;然后在E級300,根據(jù)指令操作數(shù)由處理器的ALU332處理寄存器中的內容并控制解碼的持續(xù)進行;在M級400,做任何必要的內存訪問例如讀取、存儲等;最后指令的執(zhí)行結果由指令操作數(shù)回寫到通用寄存器中。
更明確地說,在I級100,根據(jù)保存在I級程序計數(shù)器IPC 104中的地址從指令緩存102中取出一個字。然后該字與從指令緩存RAMIC 102(與在下面描述的另外一個成分,指令緩存116,形成)中讀取的最后一個字結合,該指令緩存RAM IC 102由排列單元ALIGN 108保存在最后取出寄存器LFETCH 106(last fetch register)中并且儲存在R級指令寄存器RINST 202中。從主程序存儲器通過級寄存器IREFILL 110到緩存RAM IC 102,緩存錯過由存儲器取出來處理并且利用寄存器IMISSA 112和標記緩存RAM ITAG 114相應地調整標記。復用器118選擇緩存RAM IC 102的輸出或者從主存儲器直接取出的指令并且把所選擇的數(shù)據(jù)輸出到排列單元108,排列單元108將其與儲存在最后取出寄存器106中的最后取出字連在一起并選擇它的一個子集,如果必要的話,以便調整指令長度變化。標記比較器122檢測緩存錯過并提供其指示到I級控制器124,其控制該級的整個操作。
應該注意,雖然表示為元件104的整機線路在此被稱為一個程序計數(shù)器,但是I級程序計數(shù)器104實際上不用于計數(shù)要取出的指令;而是用來計數(shù)字的。然而,在優(yōu)選實施例中,諸如R級程序計數(shù)器204之類的后續(xù)程序計數(shù)器計數(shù)實際的指令。此外,本領域的技術人員容易理解,除I級計數(shù)器124之外,相應的R級控制器224、E級控制器324以及M級控制器424每個都控制它們各自級的整個操作。而且,R級狀態(tài)寄存器203、E級狀態(tài)寄存器303、M級狀態(tài)寄存器403以及W級狀態(tài)寄存器503每個都提供與它們各自的管道級中的指令有關的相關狀態(tài)信息到各自的控制器,例如,不管該數(shù)據(jù)是否有效等等。另外,為了易于解釋,諸如從級控制器到它們各自的復用器中運轉的復用器選擇線、時鐘信號、例外向量地址等等之類的某些特點已經(jīng)被省略;可是,它們的布局對于本領域的技術人員來說是很顯然的。
雖然指令被提供給R級指令寄存器202,但是在下一地址產(chǎn)生部分126中的加法器128對當前字地址加1以便指向要被取出的下一字并且將它提供給復用器130,該復用器130把它反饋到指令程序計數(shù)器104。當一個循環(huán)指令(在下面詳細描述)被執(zhí)行時,它把一個開始循環(huán)地址加載入循環(huán)開始寄存器LBEG 132中,然后復用器130把開始地址提供給程序計數(shù)器104。還是使用于循環(huán)指令中,循環(huán)結束寄存器134提供由比較器136將其與當前地址進行比較的一個數(shù)值以便檢測循環(huán)狀態(tài)的結束并對循環(huán)索引寄存器LCOUNT 138減1。當計數(shù)為零時比較器140提供一指示到指令控制器124以便繼續(xù)循環(huán)外的執(zhí)行,否則,由減量器142對LCOUNT 138減1并通過復用器144將其傳遞(還用于加載寄存器)。最后,R級PC選擇復用器146選擇要被提供到E級300的地址值,在下面將詳細對其進行描述。
儲存在R級指令寄存器202中的指令由解碼器201解碼以便析取預確定參數(shù)字段并根據(jù)該指令操作碼對緊鄰的或者常數(shù)的字段進行解碼。已經(jīng)解碼的指令被輸送到E級指令解碼寄存器302用于執(zhí)行。平行于指令解碼操作,把指令中的字段傳送到寄存器堆206經(jīng)加法器208-212來為窗口寄存器操作向其增加一個窗口基礎值,在下面將對其詳細描述。把一個加法器用于兩個源寄存器字段的每一個和可能存在于指令中的一個目標寄存器字段。
在寄存器堆206中的值被讀出并被供給復用器214和216然后供給E級S和T寄存器304和306。復用器214和216可以提供來自寄存器堆206中的值或者,如果所需要的數(shù)據(jù)尚未寫入文件夾206中時,可以使用從E級提供的值(如下所述)。復用器214還可以接收來自指令解碼器204中的一個常量值。
加法器218根據(jù)R級程序計數(shù)器201的內容和來自指令解碼器204中的一個索引常數(shù)來計算一個已索引的目標地址并把結果存儲在E級分支寄存器308中。根據(jù)通過復用器222的指令長度,加法器220通過向R級程序計數(shù)器201中的值加二或三來計算下一個指令地址并且如果不采用一個分支的話則把結果傳給下一個PC寄存器310用于使用。
移到E級300,分路復用器318和320選擇各個功能單元的操作碼(分支326,移位/屏蔽330,ALU 332,AGEN 334,以及存儲排列336)。在R級200中由分路程序塊EBYP 314根據(jù)當前在各個寄存器228、230和232各自的E級300、M級400和W級500中的指令來計算該復用器選擇,并通過EBYP 226將其輸送。當從R級200中產(chǎn)生一個結果時,每個復用器318、320選擇ET寄存器312或者ES寄存器316。復用器318和320的另外一個輸入是來自M級400和W級500。
分支單元326使用來自復用器318和320的兩個操作碼來產(chǎn)生一個條件分支(taken/not-taken)判決,其在I級100和R級200分別被饋給控制器124和224,而且在其中混合選擇。移位/屏蔽(Shift/Mask)單元330根據(jù)復用器328的輸出來執(zhí)行移位和析取指令。它使用來自復用器318和320的兩個操作碼以及來自解碼指令寄存器EINSTD 302的屏蔽(mask)輸入,該屏蔽輸入也饋給M級指令寄存器MINSTD 402。對于常數(shù)移位從EINSTD 302中選擇移位數(shù)目或者對于變量移位從ESAR 322中選擇移位數(shù)目。對于E級300,ESAR 322包含ISA狀態(tài)SAR。
ALU 332執(zhí)行算術和邏輯功能,包括ADD,ADDI,ADDX2,SUB,AND,OR,XOR。根據(jù)復用器338中的指令類型把Shift/Mask單元330和ALU 332的輸出進行復用并將其饋入MALU寄存器406中。地址產(chǎn)生單元AGEN 334計算寄存器操作碼與來自EINSTD 302的解碼指令中的偏移之和。該輸出被發(fā)送給M級虛擬地址寄存器MVA 408。存儲排列單元336把ET復用器318的輸出移位0、8、16或者24個位置以便把存儲數(shù)據(jù)排列入存儲器的適當字節(jié)位置中。該輸出被發(fā)送給M級存儲數(shù)據(jù)寄存器MSD 410。
類似于先前的管道級,ECTL 324處理E級300的控制和在其中執(zhí)行的指令狀態(tài)的更新。E級指令地址程序計數(shù)器EPC 304被向前傳送到M級指令地址程序計數(shù)器MPC 404用于例外處理。
管道的M級400處理下半部分的加載和存儲指令,以及所有級的例外確定。MPC 404的輸出被發(fā)送給WPC寄存器504。如果M級400中的指令被一個例外或者中斷無效掉,則WPC 504的輸出將被加載入一個表示為ISA的例外指令地址寄存器EPC[i](未表示)(不同于E級程序計數(shù)器EPC 304)中。如果必須重操作M級400中的指令(例如,由于一個緩存錯過),則WPC寄存器504的內容被送回到I級100以便重新啟動指令取出。
在此級中,一個移位或ALU指令簡單地把數(shù)據(jù)從MALU 406轉送到WALU 506。在此級,MALU 406的輸出還被提供到分路復用器318和320以便提供一個偏移或者ALU指令的輸出,該輸出在它被寫入寄存器堆以前由一個后續(xù)指令使用。在W級500中的加載指令讀出數(shù)據(jù)緩存RAM和數(shù)據(jù)標記RAM。在W級500中的存儲指令只讀取數(shù)據(jù)標記RAM,數(shù)據(jù)緩存RAM寫被推遲直到完成標記比較為止。非加載指令把任何未定的存儲數(shù)據(jù)寫到數(shù)據(jù)緩存RAM中。加載后跟著的到同一地址的一個存儲需要一個特別的分路,因為該存儲數(shù)據(jù)將不被寫入數(shù)據(jù)緩存RAM中。
在其W級500中的一個加載指令把虛擬地址MVA 408的索引部分發(fā)送給數(shù)據(jù)標記RAM的地址輸入端,并且還通過復用器422發(fā)送給直接映射數(shù)據(jù)緩存RAM DC 434的地址輸出端,平行于DC 434的讀取,把該地址與未定的存儲虛擬索引和STVI 416中的有效位進行比較。如果,基于比較器428的輸出,該讀取是用于未定的存儲的緩存索引,則復用器432選擇該未定的存儲數(shù)據(jù)緩沖器418的結果;否則,就選擇DA讀出數(shù)據(jù)。復用器432饋給加載排列電路436,其根據(jù)虛擬地址的較低兩位來把加載數(shù)據(jù)移位0、8、16或者24,然后對于L8UI和L16UI指令分別從位7或者15伸展到零位,以及對于L16SI指令從比特位置15伸展到符號位。此結果由WLOAD 508鎖住。通過比較器430把數(shù)據(jù)標記RAM的輸出與來自MVA 408中的M級虛擬地址的高排序位進行比較,然后此hit/miss結果被發(fā)送給M級控制邏輯MCTL 424,它處理緩存錯過和例外。最后,在WMA 510中捕獲加載虛擬地址來處理緩存錯過。
加載緩存錯過使管道的I到M級中的指令無效。來自WMA 510中的加載地址被發(fā)送給外存儲器。通過復用器412和STDATA 418使用WMA 510的低排序位把從那個存儲器中讀出的數(shù)據(jù)作為一個地址寫入數(shù)據(jù)緩存RAM 424中。數(shù)據(jù)標記RAM 426通過復用器414被寫而來自WMA 510中所捕獲的高排序錯過地址中的STADDR 420,與DTAG 420一起由MVA 408中的較低有效位進行編址。
在其W級500中的一個存儲指令把存儲地址和數(shù)據(jù)放入STADDR418和STDATA 420中。另外,訪問數(shù)據(jù)標記RAM 426,然后該結果與MVA 408的高排序位進行比較以便確定存儲地址是否是一個不定的。如果該存儲在緩存中發(fā)現(xiàn),那么在第一個非加載周期上,在STDATA 418中儲存的地址處將把STDATA 418的內容寫入數(shù)據(jù)緩存RAM 424中。當緩存錯過再填充完成時,則指令取出單元從錯過的那個加載指令開始再一次來開始取出指令。
這個實施例的數(shù)據(jù)緩存為write-thru,因此還要把存儲地址和數(shù)據(jù)從STADDR 420和STDATA 418發(fā)送到一個寫緩沖器438中,在那里保存它們直到它們被寫給外存儲器為止。
如果此時指令仍然有效,并且它是含有一個運算寄存器結果的一個指令的話,則WALU和WLOAD寄存器506和508的輸出由復用器512來選擇以便將其寫入R級200中的寄存器堆206中。
處理器還具有一個6位位移數(shù)目寄存器,它用于提供傳統(tǒng)的緊鄰的移位,比如邏輯左移、邏輯右移以及算術右移,但是不提供在那里移位數(shù)目為一個寄存器操作碼的單指令移位,因為直接的變量移位可以是一個關鍵的定時路徑,并且簡單的移位不能有效地伸展到較大的寬度。雖然漏斗移位可以被擴展,但是它們需要太多的操作碼。通過在移位數(shù)是從SAR寄存器中產(chǎn)生的時提供一種漏斗移位,如本發(fā)明優(yōu)選實施例所述的處理器解決了這些問題。一個漏斗移位之后,變量移位通過編輯器使用一個指令來合成以便計算通用寄存器中的移位數(shù)中的SAR。SAR值的有效范圍是0到32,不是0到31,因此六個比特被用于寄存器中。
當然,給出在下面詳細描寫的并且在ISA手冊中更詳細描述了的指令集的敘述,對于本領域的技術人員來說,那些遵循本發(fā)明的各種其他處理器體系結構將變得容易明白。這些結構也意指在附加的權利要求的范圍之內。
各種管道構造可以被使用在該處理器之中;然而,指令集的某些特點最好與某些設備類別一起工作,并且一個這樣的類型通常如圖2所示。此類型的結構最好可以與諸如浮點單元和DSP之類的主要計算單元一起使用,并且此管道結構的一個突出點在于在Dcache(圖2中標記為DReg/DALU的位置中)后的此類單元它的布局提供此類單元的指令以便把一種存儲器參考作為一個源操作碼包括在內。這允許每個周期一個數(shù)據(jù)緩存參考與操作而不必需要每個周期的多指令的取出和執(zhí)行。
通用指令集設計考慮許多指令集特點以增加處理器設備成本為代價來改善性能(通過降低IE)和代碼尺寸(通過降低IS)。例如,"自增量"地址方式(其中基地址寄存器被讀取然后被用一個加1地址重寫)需要一個用于加載的第二寄存器堆寫端口。"索引"編址方式(其中,兩個寄存器之和被用來形成虛擬地址)需要三個用于存儲的寄存器堆讀出端口。優(yōu)選實施例是適應于兩個讀取端口、一個寫端口的一個寄存器堆,它是合理的性能所必需的最小量。
優(yōu)選實施例具有增加了設備成本的一些特點,但是卻避免了需要與額外的寄存器堆端口同樣多的增加的那些特點。當設備每個周期執(zhí)行多個指令時這尤其重要,因為端口數(shù)按比例放大處理器的最大執(zhí)行性能(例如,二到8)。
為了保持性能,指令集必須支持至少兩個源寄存器字段和一個不同的目標寄存器字段。否則IE和IS兩個都增加。僅使碼密度最優(yōu)化的通用寄存器指令集有時被設計大約兩個寄存器字段(例如,HitachiSH)一個只用于源的,和一個既用于源又用于目的地的。當通過降低BI,把IS中的增加抵消時,這減少了代碼尺寸,但是卻沒有辦法補償IE的增加。指定較少寄存器的指令集使用較窄的寄存器字段,并從而降低BI,但是由于強加了更多可變的和臨時的數(shù)值存儲在存儲器中從而增加了IE和IS并且因此需要額外的加載和存儲指令。當只有碼密度是一個優(yōu)先級時,對于一個凈存儲,IS的增加可以通過BI的減少所抵消但是當還需要優(yōu)良的性能時,這里沒有辦法補償IE中的增加。
當寄存器數(shù)目增加時,IE和IS中的減少持平。一個指令集應該提供至少足夠的寄存器以便到達收益遞減點,即,以使寄存器計數(shù)中的另外增加不引起IE顯著的相應減少,特別地,用于RISC性能水平,需要至少16個通用寄存器。此外,三個4位寄存器字段需要至少12位來編碼。操作碼和常數(shù)字段的位也是需要的,因此一個由一些處理器使用的16位編碼還不夠。
二十四位編碼大多數(shù)現(xiàn)有技術已經(jīng)不能實現(xiàn)代碼尺寸和性能之間的適當均衡的一個原因是指令集設計者對諸如16和32位之類的某些指令尺寸已感覺不適。使用與處理器的數(shù)據(jù)字寬成簡單比例的指令尺寸的確有優(yōu)勢。可是,稍微放寬一下這個限制具有顯著的優(yōu)點。
作為一個出發(fā)點,優(yōu)選實施例使用一個24位固定長度編碼,24位對于高性能是足夠的同時對于指令還提供將降低IE的延展性和空間。替換實施例可以使用在18-28位范圍內的編碼,但是那些小于24位的將限制延展性并且限制分支范圍。24位編碼表示在BI中的25%的減少,因此代碼尺寸來自大多數(shù)32位的RISC指令集。最后,把24位調節(jié)在具有32數(shù)據(jù)路徑寬度的處理器中十分簡單。
優(yōu)選實施例使用4位寄存器字段,這是可接受的性能所需要的最小值和非常適合于一個24位指令字之中的最大值。許多RISC指令集使用32寄存器(5位寄存器字段)。在三個5位寄存器字段之后,24位指令只留下9位用于操作碼和常數(shù)字段。短的常數(shù)字段可能導致分支、呼叫以及其他PC相對的參考的不適當排列。太少比特的操作碼提供不充分的延伸性。因為這兩個原因,一個具有5位寄存器字段的24位指令字是不理想的。在16和32通用寄存器之間的性能差別(由于IE的不同)(大約6%)不象8和16通用寄存器之間的差別那么大,并且足夠小以致可以引入其他特點來補償損失的性能(例如,復合指令和寄存器窗口--參見下面)。IS中的增加(也大約是6%)大于24位和32位編碼之間的差值的偏移。
應該注意,具有5位寄存器字段的許多指令集不提供32通用寄存器用于編碼。大多數(shù)致力于一個寄存器來保持為零,但是通過提供一些額外的指令操作碼可以很容易地消除對一個零寄存器的需要。此外,其它寄存器經(jīng)常被給定具體的用途,這通過在指令集中包括其他特點可以避免。例如,MIPS使用它的31個通用寄存器的兩個用于例外處理代碼,而一個用于全局區(qū)域指針,因此它實際上只有28個寄存器用于變量和暫時存儲單元,只比一個具有4位寄存器字段和適宜的指令集特點的指令集多12。通過軟件約定的通用寄存器劃分呼叫者和被呼叫者保存寄存器是共同的,并且更進一步降低了大寄存器堆的應用程序優(yōu)選實施例包括避免在下面更詳細描述的這些特征。
復合指令為了降低IS和IE,優(yōu)選實施例還提供單一的指令,其合并了RISC和其他指令系統(tǒng)中典型含有的多個指令的功能。一個簡單的復合指令實例是左移并增/減。HP PA-RISC和DEC Alpha是提供這些運算的指令集的例子。編址算術和小常數(shù)的乘法經(jīng)常使用這些組合,并且提供這些運算,在增加CP的一個潛在成本(由于計算管道級中的附加連續(xù)邏輯)時既降低IE又降低IS??墒牵鞣N設備已經(jīng)證明當把位移限制為0到3時,額外的邏輯不對CP有非常關鍵的約束。反過來,ARM指令系統(tǒng)提供隨機的位移和增加,所以它的設備具有很差的CP。
右移經(jīng)常被用來從一個較大的字中析取一個字段。為了一個未確認字段的析取,通常使用兩個指令(或者左移后面跟著右移,或者右移之后與一個常數(shù)“與”)。優(yōu)選實施例提供單個復合指令,extui,來執(zhí)行此功能。它通過在一個位移之后接著與一個屏蔽(mask)“與”來實現(xiàn),該屏蔽在指令字中以剛好4位的形式被編碼來表示。extui的“與”部分邏輯上太瑣碎以致在指令集中它的包含物不大可能增加設備的CP。這將不適合于一個指令來析取帶符號字段,因此這一點不被包括在內。
大多數(shù)指令集,RISC等等(例如,ARM,DEC PDP11,DEC VAX,Intel x86,Motorola 68000,Sun SPARC,Motorola 88000)都使用一個比較指令,該比較指令設置了條件碼(組),隨后是一個測試該條件碼(組)以便確定控制流向的一個條件分支指令。條件分支由有關大多數(shù)RISC指令集的10-20%的指令構成,并且每一個通常與比較指令配對,因此這種格式的指令集很浪費。即使舊的指令集經(jīng)常是以一種條件轉移的比較跳轉格式為基礎的,但是當分開比較和分支時,這也具有同樣的缺點。
一些指令集(例如,Cray-1,MIPS,DEC Alpha,HP PA-RISC,以及Sun SPARC的新近的V9版本)提供一種復合比較和分支可能性的變化靈活性。Cray和DEC Alpha只提供運算寄存器和零和分支的比較。MIPS提供寄存器-零比較和寄存器-寄存器相等和不相等以及分支。HP PA-RISC提供寄存器-寄存器比較以及分支指令的一個十分完整的系統(tǒng)。
優(yōu)選實施例提供最實用的復合比較與分支指令。選擇正確的設置需要平衡每個比較和分支的應用程序與它所消耗的操作碼空間,尤其是當目標為一種24位(與32位相對)編碼時更是如此。其他指令系統(tǒng)缺乏這個測試。例如,HP PA-RISC提供幾乎沒有用(例如,從來不在加法后上溢)的若干復合比較和分支操作碼,卻省略了若干有用的操作碼。為優(yōu)選實施例選擇的復合比較和分支指令的設置為A==0,A?。?,A<SO,A>=S0,A==B,A?。紹,A<SB,A<UB,A>=SB,A>=UB,(A&B)==0,(A&B)!=0,(~A&B)=0,(~A&B)!=0,A==I,A!=I,A<SI,A<UI,A>=SI,A>=UI,bit B of A==0,bit B of A?。?,bit I of A==0.bit I of A?。?在此,A和B表示寄存器內容,在運算寄存器的一個關系算子上的"U"或者"S"后綴表示分別是無符號或者是帶符號的寄存器內容的"無符號"或者"帶符號"比較;在與零的一個關系算子上的后綴(例如A<SO)表示與零的無符號或者帶符號比較;而I表示一個索引常數(shù)。
與分開的比較和分支指令系統(tǒng)相比較,甚至當與像MIPS以及DEC′Alpha之類的部分比較和分支指令系統(tǒng)相比較時,復合比較和分支降低了IE和IS。優(yōu)選實施例可能需要增加CPI以便執(zhí)行復合比較和分支,但是總的性能作用仍然有一個改善。
分開的比較和分支指令系統(tǒng)的主要優(yōu)點是兩個指令字可用于規(guī)定比較算符,比較操作碼,以及分支目標,其對于每一個提供豐富的字段寬度分配。與此相反,復合比較和分支指令系統(tǒng)必須把所有這些壓緊到單個指令字中,產(chǎn)生較小字段,并且需要機械處理那些不適合的數(shù)值(例如,具有較長范圍的分支)。優(yōu)選實施例把比較操作碼、兩個源寄存器字段以及一個8位PC相對偏移壓緊到一個24位指令字中。8位目標說明符有時候不夠,編輯器或者收集器需要使用圍繞具有一個較長范圍的無條件分支的相反特性的一個條件分支,它由優(yōu)選實施例提供。這個情形當然增加IE和IS,這是所不希望的。由于這個原因,優(yōu)選實施例還提供對零測試的一系列復合比較和分支,其是最普通的情況。這些復合比較和分支指令含有一個12位PC相對補償,其提供比它們的同仁更大的范圍。通過IE和IS中的改善來均衡提供兩種形式的額外復雜性。優(yōu)選實施例不提供對零的所有比較(省略小于等于零的寄存器以及大于零的寄存器),這與MIPS和DEC Alpha不同;此外,優(yōu)選實施例提供對操作碼空間與程序需要進行均衡的指令集。
只使用24位來編碼所有指令的一個結果是指令字中的常數(shù)字段尺寸方面受限制。這能夠潛在地增加IS和IE(雖然增加的IE可能通過把常數(shù)加載入循環(huán)外部的寄存器而被減少)。優(yōu)選實施例以好幾個方式解決這個問題。首先,它提供小的常數(shù)字段以便捕獲最通用的常數(shù)。為了達到窄(例如,4位)常數(shù)字段的最大使用,指令集使用該字段來編碼一個常量值而不是直接表示它。編碼值是選自程序統(tǒng)計學的一個寬排列,作為N(例如,16)最頻繁的常數(shù)。優(yōu)選實施例在addi.n指令中使用此技術,在此,16的值被選擇為-1以及1到15而不是0到15。增加0沒有用(這里有一個單獨的mov.n指令),而增加-1是共同的。beqi,bnei,blti,bgei指令還使用一個4位字段,其編碼各種通用的常數(shù)。bltui和bgeui指令使用一種不同的編碼,因為無符號比較具有一組不同的有用值。
最通用的常數(shù)通常是非常小,并且窄的字段捕獲大部分期望值??墒?,使用于逐位邏輯運算(例如,AND,OR,XOR等等)中的常數(shù)表示各種種類的位屏蔽,并且常常不適合在小的常數(shù)字段中。例如,具有在任何位置設置為一或者在任何位置設置為零的常數(shù)是很普通的。此外由1序列后面跟著0序列組成的位格式,和由0序列后面跟著1序列組成的位格式是很普通的。為此緣故,優(yōu)選實施例具有這樣的指令,其避免對把一個屏蔽直接地放進指令字中的需要。優(yōu)選實施例中的示例是bbci和bbsi指令,其根據(jù)寄存器的說明位是否分別為零或者為一而進行分支。該位被作為一個編號而不是作為一個屏蔽給出。extui指令(早先描述過)完成一個位移,其跟隨由一系列1后面跟著一系列0組成的一個屏蔽,在此1的數(shù)目是指令中的一個常數(shù)字段。
協(xié)處理器布爾寄存器和分支因為復合比較和分支如此壓緊到一個指令字中,不寬于三十二位,上面列出的指令消耗可用指令字的顯著的一部分。由于它們的頻率和所導致的節(jié)省的關系,對于這些分支這是一個優(yōu)良的折衷方案。
除了有關指令集的其他約束之外,設計要求指令集應該是可延伸的(允許增加新的數(shù)據(jù)類型),在嚴格成對的協(xié)處理器中利用一個特點??墒牵粋€短的指令字可能缺乏空間來增加其他數(shù)據(jù)類型的復合比較和分支指令,比如浮點,DSP等等。另外,對于每個協(xié)處理器實現(xiàn)它自己的復合比較和分支多半是不可能的。即使當單獨的復合比較和分支指令的實現(xiàn)是可行的時,這多半也是浪費,因為對于許多應用程序來說,對此類數(shù)據(jù)類型的比較和分支沒有對整數(shù)數(shù)據(jù)的頻繁。
為此緣故,本發(fā)明的優(yōu)選實施例使用一種不同的方法用于協(xié)處理器條件分支。在該優(yōu)選實施例中,指令集包括一個任選的插件,其是任何協(xié)處理器插件的一個必要條件。此插件增加十六個單獨的位布爾寄存器和因此測試這些布爾寄存器和分支的BF(如果為假的分支)與BT(如果為真的分支)指令。然后協(xié)處理器提供例如根據(jù)它們所支持的數(shù)據(jù)類型的比較來設置該布爾寄存器的指令。布爾寄存器和BF與BT指令被所有的協(xié)處理器共享,其使得有效利用了一個短指令字。
這是一個不同的新條件碼--基于在如上所述的許多早先指令集中找到的比較和分支。早先的指令集在處理器與它的協(xié)處理器(例如,PowerPC)之間具有多個共享的多位條件碼并且使用多個預先協(xié)處理器的單一位條件碼(例如MIPS)。本發(fā)明的優(yōu)選實施例使用多個共享的單一位條件碼。
提供用于比較的多個目標(例如,在本發(fā)明的優(yōu)選實施例中,MIPS,PowerPC)允許編輯器更自由地預定代碼并且慮及了對在單個指令產(chǎn)生多個結果中的多個數(shù)據(jù)值進行比較的指令(例如,MIPSMDMX)。
在多個協(xié)處理器(該實施例)之間或者在處理器和它的協(xié)處理器之間(例如在PowerPC中)共享比較結果寄存器節(jié)省了用于測試比較結果所需要的操作碼數(shù)目。這樣還增加了提供在比較結果寄存器上執(zhí)行邏輯運算的指令的可行性(例如在本發(fā)明的優(yōu)選實施例中以及在PowerPC中)。
單比特比較結果寄存器的使用(本發(fā)明的優(yōu)選實施例,MIPS)代替多比特(大多數(shù)其他ISA)增加了所需要的比較操作碼的數(shù)目但是減少了所需要的分支操作碼的數(shù)目。該優(yōu)選實施例使用單比特比較結果(布爾)寄存器,因為分支指令也必須提供一個PC相對目標地址,因此增加分支操作碼是更昂貴的除非那里有大量的協(xié)處理器。
總之,在復合比較和分支成為使代碼尺寸最小化的一個重要技術時,保持小的BI的需要尋找一種適宜用于協(xié)處理器比較和分支的分解方法,因為需要不同的頻率和不同的協(xié)處理器操作碼數(shù)目。在分解比較和分支選擇的范圍之內,使用在協(xié)處理器之間共享的多個單位比較結果寄存器使得操作碼空間被最有效使用。
加載和存儲指令優(yōu)選實施例的加載和存儲指令使用一個具有8位常數(shù)補償?shù)闹噶罡袷?,其從一個寄存器被加到一個基地址。首先,該優(yōu)選實施例充分利用這8個位,其次當這不夠時它提供一個簡單的擴展方法。此外,優(yōu)選實施例的四個加載/存儲補償被零擴展而不是符號擴展(在許多其他指令系統(tǒng)中所通用的),因為數(shù)值128到255比值-128到-1更通用。并且,因為大多數(shù)參考是來自一個排列基址寄存器中的排列地址,所以該偏移被適當?shù)刈笠频絽⒖汲叽?。對?2位加載和存儲的偏移移位為2,對于16位加載和存儲的偏移位移為1而對于8位加載和存儲的偏移不移位。大多數(shù)加載和存儲是32位,因此此技術提供2個附加位的范圍。
當在一個加載/存儲指令(或者一個addi指令)中規(guī)定的8位常數(shù)偏移不夠時,則該優(yōu)選實施例提供addmi指令,其增加左移8位的它的8位常數(shù)。因此一個二指令序列具有16位的范圍,8位來自addmi,而8位來自load/store/addi。另外,沒有由上述的一個方法編碼的常數(shù)必須通過單獨的指令被加載入一個寄存器(此技術不適用于load/store指令,其只采用單個寄存器操作碼,而不是兩個,因此需要上述的addmi解決方案)。優(yōu)選實施例提供兩個方法來把常數(shù)加載入一個寄存器中。第一個是用于此目的的movi(在下面描述的短指令格式中為movi.n)指令。movi在指令字中的一個12位符號擴展對字段中表示它的常數(shù)。并且,向可變的一個寄存器分配一個常量值是獨自通用的。
在32位或者更少的指令格式中,沒有指令可以對一個隨機的32位常數(shù)進行編碼,因此需要其它方法來把運算寄存器設置為一個任意常數(shù)值。在其他指令系統(tǒng)中已經(jīng)使用了至少兩個方法,并且這些方法的任何一個可結合上面的技術來使用提供一個解決方案。第一個解決方案是提供使用每一指令中的多個常數(shù)一同合成一個32位常數(shù)的一對指令(例如,MIPS LUIIADDI,DEC Alpha,IBM PowerPC,在兩個單獨的指令中具有表示高16位和低16位的指令)。第二個解決方案(例如,MIPS浮點常數(shù),MIPS 16,以及ARM Thumb)是提供一種簡單的辦法來與一個加載指令一起從存儲器中讀取常數(shù)。
對參考常數(shù)使用一個加載指令可以提供比使用指令序列更低的IS和IE,如果加載本身只需要單個指令的話。MIPS編輯器,例如,貢獻31個通用寄存器的一個來把一個指針保持到(在其他所有事物之中)一個常數(shù)存儲庫中,在此保存4字節(jié)和8字節(jié)浮點常數(shù)。如果由此寄存器編址的區(qū)域小于64 KB,則該常數(shù)可以被單個加載指令參考因為MIPS具有64 KB的加載的補償范圍。對于一個一旦被參考的常數(shù),32位加載指令加上32位常數(shù)與兩個使用的指令字總的尺寸相同。如果該常數(shù)被引用兩次或多次,則常數(shù)存儲庫提供較小的總尺寸。對于其他指令長度,折衷方案不同,比如優(yōu)選實施例的24位尺寸,在此,對于一對24位指令,常數(shù)存儲庫加上加載為56位比48位)。但是,當一個常數(shù)被使用多次時,則常數(shù)存儲庫幾乎總是一個較好的總尺寸解決方案。
對于本發(fā)明的優(yōu)選實施例和其他實施例來說,致力于運算寄存器編址常數(shù)和其他數(shù)值的MIPS技術不是理想的,因為正如上面提及的,窄指令字通常提供小于32個寄存器,因此每個寄存器更有價值。此外,在窄指令集中的來自運算寄存器的可用偏移是有限的,因此單個寄存器提供只對一個小常數(shù)存儲庫(太小不可能實用)的訪問。優(yōu)選實施例(參見ISA手冊中的L32R)在提供一個PC相對加載中采用許多指令集的解決方案(例如,PDP11,Motorola 68000,MIPS 16,ARMThumb),其可用于訪問一個常數(shù)存儲庫。
用于加載隨機常數(shù)的任何一個技術適用于本發(fā)明。優(yōu)選實施例使用第二種技術,而一個替換實施例將使用多個指令,每一個包含該完整常數(shù)的一部分。一個24位指令字的替換實施例的一個具體例子將使一個指令把一個16位指令常數(shù)放入運算寄存器(16位常數(shù)+4位寄存器目標+4位操作碼=24位)的高部中,并且第二要把一個16位符號常數(shù)加到運算寄存器(16位常數(shù)+4位寄存器源和目的地+4位操作碼=24位)中。
減少開銷循環(huán)指令優(yōu)選實施例還提供在一些數(shù)字信號處理器(DSP)中可找到的一種循環(huán)特點,但是它在RISC處理器中沒有找到。大多數(shù)RISC處理器使用它們現(xiàn)有的條件分支指令來創(chuàng)造循環(huán)而不是通過提供新的特征來實現(xiàn)該循環(huán)。此經(jīng)濟性使得處理器簡單,但是增加了IE和CPI。例如,C循環(huán)for(i=0;i<n;i+=1){body}在優(yōu)選實施例中將被編輯為<pre listing-type="program-listing"> movi.n a3,0 ∥initializei biti a2.1,done//no iterations if n<=0loop body<!-- SIPO <DP n="20"> --><dp n="d20"/>addi.n a3,a3,1//i+=1blt a3,a2.loop //continue if i<n</pre>在每個迭代中有"循環(huán)開銷"的兩個指令,一個增加和一個條件分支。(沒有優(yōu)選實施例的比較和分支特點的話,則將需要三個指令的開銷。)此無疑增加了IE。另外,由于管道以及/或者分支預計,在一些處理器設備中的一個采用條件分支可能需要比其他指令更多的周期來執(zhí)行。從而CPI可能增加。在這種情況下,一些指令集把單個指令加到加1或者減1運算寄存器、比較和分支(例如,DEC PDP6,DECPDP11,IBM PowerPC)中來降低IE。IBM PowerPC指令的設備還把降低CPI作為目標。)當循環(huán)本體較小時循環(huán)開銷的性能影響較高。許多編輯器使用稱為循環(huán)展開的一個優(yōu)化方案,在這種情況下來通過2或者更多迭代來擴展循環(huán)開銷。在C中,例如,上述循環(huán)可以被變換為<pre listing-type="program-listing"> i=0; if(n>0) if((i&amp;1)?。?){bodyi+=1;if(n==1)goto done; }do{bodyi+=1;bodyi+=1; }while(i<n); done;<!-- SIPO <DP n="21"> --><dp n="d21"/> }</pre>有時候bodyi+=1;bodyi+=1;可以被替換為body(i)body(i+i)i+=2;當i+constant能夠被折疊入主體的指令中時(例如,折疊入負載和儲存指令的補償中)所以每個迭代只需要一個增量。
用一個大于2的因子進行的循環(huán)展開是稀松平常的,用4和8也是很普通的(二的乘方具有一些優(yōu)勢)。要注意的是關于即使二展開的因子是所導致的代碼尺寸的增加(在上述的例子中主體發(fā)生三倍)。在RISC處理器中達到性能的此技術的使用與有關代碼尺寸上的性能和簡單性上它們所強調的一致。
許多DSP,以及一些一般用途的處理器已經(jīng)提供了其他辦法來執(zhí)行某些種類的循環(huán)。第一個方法是提供一個指令,其重復第二指令一個固定次數(shù)(例如,TI TMS32OC2x,Intel x86)。這有十分易于實現(xiàn)的優(yōu)點。在它可適用的地方,通過消除重復地取出相同指令的需要,它除去循環(huán)開銷,并且節(jié)省功率消耗。具有撤銷指令的一些指令集要求處理器在循環(huán)期間不使用一個中斷,其成為一個顯著的限制。并且,單指令循環(huán)只有在有限的情況中是實用的,并且只有當重復的指令非常復雜具有多重效果,以使它在每一個迭代上操作在不同的數(shù)據(jù)上。
有關簡單的重復指令的一個改善是能夠以降低的或者零循環(huán)開銷多次迭代指令塊(例如,TI TMS32OC5X)。優(yōu)選實施例提供此性能通過它的循環(huán),loopgtz和loopnez指令。上述的第一個C循環(huán)將被編譯成為下列指令<pre listing-type="program-listing"> movin a3,0 //i=O loopgtz a2,done//goto done if a2<=0,otherwise //set LCOUNT to a2-1,LBEG to loop, //and LEND to DONE,and then fall //into bodyloop body addi.n a3 a3,1 //i+=1 //the processor returns automatically //to loop when it reaches here(LEND)done</pre>優(yōu)選實施例的循環(huán)指令的細節(jié)可以在ISA手冊中找到。LCOUNT,LBEG,以及LEND寄存器在指令集中弄明白以使循環(huán)成為可中斷的。它還允許這些寄存器被與其他指令執(zhí)行并行地讀和寫(如果使用通用寄存器,則將需要增加寄存器堆讀/寫端口)。優(yōu)選實施例規(guī)定在LCOUNT寄存器被測試以便給出影響指令取出的最長時間之后立即把LCOUNT寄存器減1。循環(huán)指令被希望允許優(yōu)選實施例避免采用分支損失,其將與循環(huán)的條件分支編碼相關。
a3(i)的增加不通過循環(huán)指令自動地被執(zhí)行。這被作為一個單獨的指令留下,如上所示,因為許多循環(huán)需要引入變量的不同數(shù)量的增量或者減量,特別是在強度減少最優(yōu)化后。另外,有時候這些增量可以被折疊入?yún)f(xié)處理器地址模式中,比如自增量。最后,增加一個通用寄存器將在通用寄存器堆上需要額外端口(組)。
從上述的例子和討論中可以看到,循環(huán)指令既減少IE又減少IS并且便于實現(xiàn)CPI的降低。當循環(huán)指令避免循環(huán)展開的需要時對IS的影響是最大的,但是甚至在展開情況下是存在的。然而,對于本領域的技術人員來說,很顯然,這里存在附加的處理器設備成本,它是優(yōu)選實施例中的這些指令的存在所需要的(例如,特別的寄存器,專用指令取邏輯)。
不測事件(Hazards)大多數(shù)指令集現(xiàn)在通過管道硬件來執(zhí)行。管道的使用在指令執(zhí)行過程中經(jīng)常引起不測事件,其必須以硬件或者軟件的形式來避免。例如,許多管道在管道的末尾(或者至少在管道的晚期)寫寄存器堆。為了正確的操作,使用被寫寄存器的后續(xù)指令作為一個源操作碼必須或者等著讀取寄存器堆直到值被寫為止,或者被寫的值必須被分路或者發(fā)送到該相關的指令,并且寄存器堆內容被忽略。
大多數(shù)處理器以硬件的形式提供對于它們的通用寄存器堆的相關檢測并且延遲相關的指令直到結果可用然后在它被寫入寄存器堆中以前把它分路到相關的操作中。以軟件的形式延遲指令(通常通過插入NOP)將顯著地增加代碼尺寸(通過增加IS),同時沒有分路將顯著地降低性能。因此檢測,停頓,以及分路硬件是有它的成本的價值的。
可是,對于不同于一般用途的寄存器堆的處理器狀態(tài),折衷方案可能不同,因為這樣的寄存器常常很少被參考。一些指令集(例如,MIPS)因此轉向特別的寄存器不測事件的軟件處理(例如通過插入NOP來從使用中分離出寫)。令人遺憾的是,這一點要求把管道的知識建入指令流中。
一個備選方案是使特別的寄存器寫延遲所有后續(xù)指令以便避免不測事件。雖然這很簡單并解決了問題,但是它也許是效率低的,因為該特別的寄存器寫經(jīng)常成群地發(fā)生(例如在一個關聯(lián)轉換或者中斷后的恢復狀態(tài)),并且那里經(jīng)常沒有理由延遲其他特別的寄存器寫以及它們所依賴的指令。本發(fā)明的優(yōu)選實施例采取一種混合近似法。它提供ISYNC,RSYNC,ESYNC以及DSYNC指令(細節(jié)請參見ISA手冊),軟件必須插入其中以便避免那些沒有被硬件檢測并避免的不測事件。不同的NOP的使用,這些指令停止直到所有特別的寄存器寫完成為止。這允許單個獨立實現(xiàn)的指令來完成什么將另外需要一個潛在大量的特定實現(xiàn)的NOP。它還允許程序設計員把特別的寄存器寫集中在一起而不必停止使性能最佳化。
碼密度選項優(yōu)選實施例的指令系統(tǒng)包括一個核心指令集,其最好存在于指令集的所有設備中,以及一組可選指令插件,其可以或者不可以存在于一個給定的設備中。一個這樣的插件是一個短指令格式,其通過減少BI來提供顯著的代碼尺寸減少,每一指令的平均位。當這些短格式指令存在時,優(yōu)選實施例從一個固定長度(24位)指令集變化為一個具有兩個指令尺寸的指令集(24位和16位)。替換實施例可以選擇一種不同的指令集尺寸。例如,具有與24/16編碼類似的碼密度的一個備選方案是24/12,在此,有以短的形式的兩個寄存器字段而不是三個。
因為短指令形式是可選的,所以為了改進代碼尺寸,單獨地使用這些形式;沒有新的功能存在于這些指令中??梢员痪幋a在16位中的指令集被選擇作為將適合(或者可以被改變來適合,例如,通過減少常數(shù)字段寬度)統(tǒng)計上最頻繁的指令。在大多數(shù)指令集中的最頻繁的指令是加載、存儲、分支、加法以及移動;這里正好有存在于優(yōu)選實施例的16位編碼中的指令。與完全為了降低BI的一個短格式的使用與諸如Motorola 68000、Intel x86和DEC VAX之類的其他可變長度指令集相反,在那些指令集處,每個指令具有一個編碼,其主要取決于操作碼的數(shù)目和操作碼種類,而不是取決于使用的固定頻率。
已知的具有與本發(fā)明類似的一個性質的唯一指令集是SiemensTricore,它具有一個32位基本格式和用于減少BI的一個16位短格式。不同于我們的發(fā)明,該基本格式太長而不能達到典型的BI,并且該短形式不是功能性的,因為它只提供兩個寄存器字段,它強迫源和目標寄存器之一是相同的,或者源或者目標寄存器之一通過操作碼來隱含。正如早先討論的,隱含的源寄存器的使用可能增加設備的CP或者CPI。
早先說明過,一個只有16位的指令集提供不充足的性能和功能。大多數(shù)頻繁的指令的16位編碼避免了這個缺陷。因為只有大多數(shù)頻繁的指令需要短編碼,三個寄存器字段是有效的,并且窄常數(shù)字段可以捕獲使用的一個非常小的部分。在三個4位字段留給寄存器說明符或者常數(shù)之后,表示一個應用程序所需要的大約一半指令可以以一種16位編碼的形式被編碼在可用的十六個操作碼的恰好六個中。
16位編碼密集指令選項的詳細敘述可以在ISA手冊的表26中找到,正如其中所示,可選指令集包括一個132i.n指令(加載32 bits。4位補償);s32i.n(存儲32位,4位補償);mov.n(把一個寄存器的內容移到另外一個);add.n(把兩個寄存器的內容相加);addi.n(把寄存器和緊鄰的相加,在此,緊鄰的是-1或者在1..15范圍中);movi.n(用緊鄰的加載寄存器,在此緊鄰的是在-32...95);nop.n(無操作);break.n(中斷);ret.n,retw.n(ret和retw);beqz.n(如果寄存器為零,則用6位無符號偏移發(fā)送分支);以及bnez.n(如果寄存器為非零,則用6位無符號偏移發(fā)送分支)。
一個替換實施例將使用上面提到的一種12位短格式。一個12位格式除了支持4位主要的操作碼之外,只支持兩個4位字段。這只支持沒有偏移的加載和存儲(有時稱為字段中的寄存器間接尋址),和一個加法指令,在此目的地和一個源寄存器是相同的。這些限制不是象它們在其他情況中一樣是對性能的限制,因為編輯器在適當?shù)臅r候可自由使用更長的三個操作碼格式。該限制防止12位格式象平常一樣被使用,但是它的簡化尺寸部分地進行了補償。在30%的12位和70%的24位處,BI應為20.4位,幾乎與50%的16位和50%的24位所達到的20.0位相同。這里有一些實現(xiàn)簡單化,這是當一個格式是另外一個的一半尺寸時帶來的,但是當指令尺寸和數(shù)據(jù)寬度的最大公約數(shù)(gcd)很小(對于24、12和32為4,而對于24、16和32為8)時這里有一些實現(xiàn)結果。在設備成本上整個兩者大致相等,并且因此優(yōu)選實施例是給出較好的代碼尺寸的一個,它為24/16。
與24/12相比,24/16有一個附加碼尺寸的缺點。分支補償(通過指令地址的一個差值表示目標指令的指令常數(shù))必須是所有指令尺寸的多個gcd。對于24/12是12而對于24/16為8。這個數(shù)字越大,則分支可以達到越長(以位為單位)。超過此范圍的分支需要一個多次的指令序列,其增加了IS。
正如在大多數(shù)RISC中所發(fā)現(xiàn)的,當處理器設備每個周期執(zhí)行多次指令時固定長度指令的最顯著的優(yōu)點出現(xiàn)。在此情形下,通常并行地對指令進行解碼。利用可變長度指令,在第一個指令上必須完成足夠的解碼以便找到第二個的開端,以使解碼可以對其進行在第二個指令上必須完成足夠的解碼以便找到第三個的開端,等等。這樣可能增加CP。為了避免增加CP增加一個管道級將很可能增加CPI。通過解碼每一個潛在的指令開始然后當來自前一指令的解碼中的信息變得可用時選擇現(xiàn)有的指令,一些設備得到一個早的開始。這無疑增加設備的成本。為了挑選出指令而增加一個管道級同樣也增加成本。然而其他可能性,比如預先解碼到指令緩存中還是可能的,但是全部都增加設備成本。
雖然優(yōu)選實施例沒有消除可變長度解碼問題,但是通過首先只使用兩個指令長度,其次通過使用單個指令位來區(qū)分兩個長度,它使其盡可能簡單。這將設備成本和有關CP的任何影響減到最少。最后,通過使短格式可選,當代碼尺寸不是第一優(yōu)先級時優(yōu)選實施例使其能夠消除成本和CP影響。
許多指令集按照低端在前格式或者高端在前格式字節(jié)順序工作。達到此目的的技術例如在Weber等人的美國專利4,959,779中被描述。可是,具有可變尺寸的指令的指令集需要額外注意。MIPS指令集對于高端和低端在前格式字節(jié)順序使用相同的指令格式,其是僅有的工作,因為指令都是一個尺寸。優(yōu)選實施例對于高端和低端在前格式字節(jié)順序規(guī)定不同的指令字以便保持特性確定指令尺寸所必需的位存在于最低數(shù)目編址字節(jié)(優(yōu)選實施例中的最小可編址單元)中。
窗口寄存器選項另外一個可選插件是窗口寄存器選項。它被提供來降低IE和IS。IE的降低的性能提高還補償了由于用16個寄存器代替32個所引起的IE的增加。寄存器窗口在一些其他處理器上得到,比如Sun SPARC。對于該主題的一個完整介紹,參見SPARC文件。名稱"寄存器窗口"描述了典型的設備,在此指令中的寄存器字段規(guī)定當前窗口中的運算寄存器在一個較大的寄存器堆上。通過一個窗口基址寄存器來描述窗口的位置。
寄存器窗口避免了在過程入口和出口處節(jié)省和恢復寄存器的需要(其減小IS和IE)。這通過改變在這些點處的指針來實現(xiàn),它本質上隱藏一些寄存器不被看見而暴露了新的一個。暴露的寄存器通常不包含有效數(shù)據(jù),并且能被直接地使用??墒牵斣摫┞兜募拇嫫靼行?shù)據(jù)(因為窗口已經(jīng)移動太遠以至于它已經(jīng)繞回前一呼叫幀的寄存器),硬件檢測到這一點并在執(zhí)行繼續(xù)之前把該有效寄存器存儲到存儲器中(這通常通過軟件管理者的一個捕獲來完成)。這被稱為寄存器窗口上溢。當一個呼叫返回到一個幀(該幀的寄存器已經(jīng)被儲存到存儲器)時,寄存器窗口下溢已經(jīng)發(fā)生并且處理器最多加載來自存儲器中的值(這通常也通過軟件管理者的一個捕獲來完成)。
以它們的物理寄存器堆的視點來看在呼叫者和被呼叫者之間重疊的寄存器窗口也避免可能在程序的變元在寄存器中傳遞時發(fā)生的變元逐漸移動(變元逐漸移動增加IS和IE)。最后寄存器窗口改變無損失點用于將一個可變的或者臨時的數(shù)值分配到運算寄存器,并從而激勵寄存器使用,其比使用一個存儲位置更快更小(也減少IS和IE)。
在本發(fā)明的寄存器窗口和SPARC的之間主要區(qū)別是(1)SPARC具有窗口指針的一個固定增量16;(2)除窗口寄存器之外SPARC具有全局寄存器而優(yōu)選實施例卻沒有;以及(3)在當前的窗口與上一窗口重疊在一起的條件下SPARC檢測窗口上溢而優(yōu)選實施例在運算寄存器的參考是上一窗口的一部分時檢測窗口上溢。
從一個固定增量到一個可變增量的變化對保持低設備成本來說是重要的。它允許使用一個非常小的物理寄存器堆。例如,許多SunSPARC設備使用136個入口的一個物理寄存器堆,而優(yōu)選實施例可能需要僅僅64個入口的運算寄存器堆來實現(xiàn)類似的窗口性能。對于可變的增量這里存在復雜性的增加,但是處理器設備成本中的差值可以為30%或者更多(這是簡單的固定增量SPARC方法需要的較大寄存器的成本)。優(yōu)選實施例規(guī)定新方法來檢測上溢和下溢,并組織棧幀,如ISA手冊中的詳細描述。
表面上,由于需要連續(xù)地與讀出的寄存器堆相加(雖然是短的一個),寄存器窗口機構似乎增加了CP(或者CPI)。(寄存器寫不是一個問題,因為管道中有一個循環(huán)來完成加法。)可是,按照具有與運算寄存器堆的非窗口寄存器訪問類似的定時的方法來執(zhí)行寄存器窗口訪問是可能的。例如,考慮一個64個寄存器的物理寄存器堆,對任何給定的指令來說一個16的窗口是可見的。在這種情況下,僅僅根據(jù)窗口指針,十六個641 muxes可用于選擇十六個可見的寄存器然后這16個結果被如同一個16入口寄存器堆被訪問。使用十六個641 muxes具有一個高設備成本。為此緣故,優(yōu)選實施例規(guī)定窗口指針被限定為四的倍數(shù),由于4的倍數(shù)減少成本。甚至在選擇使用連續(xù)加法的設備中,這擔保寄存器數(shù)目的兩個位可用于立即開始寄存器堆訪問,在訪問中的一個稍后點處使用慢一點的和位(4位和2位輸入之和)來開始。最后,在這兩個設備之間的混合是可能的,具有中間的設備成本。
對于本領域的技術人員來說優(yōu)選實施例的修改和變化將是顯而易見的。這樣的變化都在附加的權利要求定義的本發(fā)明的范圍之內。
權利要求
1.一種處理器,包括至少十六個一般用途的寄存器;裝置,用于訪問一個存儲器以便與寄存器交換數(shù)據(jù);以及一個運算單元,用于處理來自該存儲器的指令,基本上所有的指令都具有至多二十八位的一個長度;其中,至少一個指令具有一個操作碼字段,指定一個常數(shù)操作數(shù)給該指令的一個字段,能夠把任何一個一般用途的寄存器指定為一個源寄存器的一個源寄存器字段,以及能夠把這些一般用途的寄存器中的任何一個指定為一個目標寄存器的一個目標字段;至少一個指令具有一個操作碼字段、多個源寄存器字段-其每一個都能夠把任何一個一般用途的寄存器指定為源寄存器、以及一個目標字段-其能夠把任何一個一般用途的寄存器指定為一個目標寄存器;這些指令中的至少一個指令使運算單元執(zhí)行多個復合運算,這些運算中的第一個運算是第一算法和一個邏輯運算中的一個,而這些運算中的第二個是一個第二算法運算和一個條件分支運算中的一個。
2.如權利要求1所述的處理器,其中指令包括第一組指令和第二組指令,第一組指令具有一個相同的第一固定指令長度而第二組指令具有一個相同的第二固定指令長度,第二固定指令長度不同于第一固定指令長度;且在一個操作碼字段中對兩個組是共同的一個給定位字段表示了一個組,含有那個位字段的一個指令屬于該組。
3.如權利要求1所述的處理器,其中,第一個運算是在指令內由源寄存器字段表示的寄存器數(shù)值的一個比較,而第二個運算是響應于該比較結果的一個分支運算。
4.如權利要求1所述的處理器,其中第一個運算是由一個源寄存器字段表示的寄存器內容的一個邏輯左移,而第二個運算是有關移位寄存器內容和另一個源寄存器數(shù)值的一個算術運算。
5.如權利要求1所述的處理器,其中第一個運算是由一個源寄存器字段表示的寄存器內容的一個邏輯右移而第二個運算是關于由具有指令常數(shù)字段表示的一個數(shù)值的位移結果的一個邏輯"與"運算。
6.如權利要求1所述的處理器,其中至少一個指令使處理器執(zhí)行起始于第一指令地址的指令直到到達第二指令地址為止,然后繼續(xù)再一次在第一地址處執(zhí)行并通過由指令的一個源寄存器字段表示的一個源寄存器的內容來重復若干次判定。
7.如權利要求1所述的處理器,其中該處理器包括至少一個指令,其具有在一個查詢表中指定一個常量值的一個常數(shù)字段。
8.如權利要求1所述的處理器,進一步包括多個專用寄存器;以及裝置,用于訪問專用寄存器以便與一個協(xié)處理器在那里交換數(shù)據(jù);其中,至少一個指令是一個條件分支,其響應于在專用寄存器中的數(shù)據(jù)為一個預定值。
9.如權利要求8所述的處理器,其中專用寄存器是單比特寄存器;以及用于訪問的裝置進一步用于在單比特寄存器和多個協(xié)處理器之間交換數(shù)據(jù)。
10.如權利要求1所述的處理器,進一步包括一個專用寄存器;以及狀態(tài)指示裝置,用于選擇性地表示向專用寄存器的一個寫執(zhí)行還沒有完成并且所有未定的專用寄存器的寫執(zhí)行已經(jīng)完成;其中,指令集包括一個指令,該指令使運算單元延遲后續(xù)指令的執(zhí)行直到狀態(tài)指示裝置指示所有未定的寫執(zhí)行已經(jīng)完成。
11.一種處理器,包括在其中存儲數(shù)據(jù)的多個寄存器;裝置,用于訪問一個存儲器以便在存儲器和寄存器之間交換數(shù)據(jù);以及運算裝置,用于執(zhí)行來自存儲器中的指令以便處理儲存在寄存器中的數(shù)據(jù);其中,多個指令具有多個寄存器字段,每個寄存器字段是至少四位寬;該指令每一個都包括一個負載、一個存儲、一個關于相等的條件分支、一個關于不相等的條件分支以及一個算術運算中的至少一個,其每一個以至多二十八位的形式被編碼;該運算裝置用于響應于執(zhí)行一個加載指令,相應于由該指令的源寄存器字段和加載指令的常數(shù)字段表示的寄存器的內容和,把數(shù)據(jù)載入到由來自一個存儲位置中的加載指令的目標寄存器字段的內容指定的運算寄存器中;該運算裝置用于響應于執(zhí)行一個存儲指令,在相應于由存儲指令的第二源寄存器字段和存儲指令的常數(shù)字段表示的運算寄存器的內容和的一個存儲位置中存儲來自由存儲指令的第一源寄存器字段的內容來指定的寄存器中的數(shù)據(jù);該運算裝置用于響應于執(zhí)行一個關于相等的條件分支指令,順序地執(zhí)行來自存儲器中的指令,其開始于相應于當由關于不相等的條件分支指令指示的兩個寄存器的內容相等時由關于相等的條件分支指令指示的一個相對偏移數(shù)值的一個位置處;該運算裝置用于響應于執(zhí)行一個關于不相等的條件分支指令,順序地執(zhí)行來自存儲器中的指令,其開始于相應于當由關于不相等的條件分支指令指示的兩個寄存器的內容不相等時由關于不相等的條件分支指令指示的一個相對偏移數(shù)值的一個位置處;以及該運算裝置用于響應于執(zhí)行一個算術指令,執(zhí)行關于由算術指令的各個源寄存器字段指示的多個寄存器的內容的一個算術運算并且把它的結果存儲在由算術指令的目標寄存器字段指示的運算寄存器中。
12.如權利要求11所述的處理器,其中;每一加載、存儲、關于相等的條件分支、關于不相等的條件分支以及算術指令的一個源寄存器字段都在與每個指令的邊界有關的一個相同位置中;且存儲、關于相等的條件分支、關于不相等的條件分支以及算術指令的一個附加的源寄存器字段都在與每個指令的邊界有關的一個附加的相同位置中。
13.如權利要求12所述的處理器,其中運算裝置進一步地用于響應于一次執(zhí)行一個循環(huán)指令而多次執(zhí)行其他指令。
14.如權利要求13所述的處理器,其中以一個相同的第一固定長度來對加載、存儲、關于相等的條件分支、關于不相等的條件分支以及算術指令中的每一個進行編碼;以及運算裝置,響應于以比第一固定長度短的一個相同第二固定長度編碼的每個短加載、短存儲、關于相等的短條件分支、關于不相等的短條件分支以及短算術指令的執(zhí)行,執(zhí)行各個加載、存儲、關于相等的條件分支、關于不相等的條件分支以及算術指令的一個相應運算。
15.如權利要求13所述的處理器,其中運算裝置包括一個窗口基址寄存器,其表示在一個寄存器堆內的一組寄存器;以及運算裝置更進一步用于在寄存器堆中把寄存器組開窗口以使寄存器字段指示與一組寄存器中的一個窗口有關的寄存器。
16.如權利要求1所述的處理器,其中在一個子程序調用指令中通過一個常數(shù)表示窗口基址寄存器的相對增量。
17.一種處理器,包括在其中存儲數(shù)據(jù)的多個寄存器;裝置,用于訪問一個存儲器以便在存儲器和寄存器之間交換數(shù)據(jù);以及運算裝置,用于執(zhí)行來自存儲器中的指令以便處理儲存在寄存器中的數(shù)據(jù);其中每個指令小于三十二位寬并且具有多個源寄存器字段和一個目標寄存器字段的多個指令,每個寄存器字段為至少四位寬;該運算裝置用于響應于執(zhí)行一個加載指令,相應于由該指令的源寄存器字段和加載指令的常數(shù)字段表示的一個運算寄存器的內容和,把數(shù)據(jù)載入到由來自一個存儲位置中的加載指令的目標寄存器字段的一個指定的運算寄存器中;該運算裝置用于響應于執(zhí)行一個存儲指令,在相應于由存儲指令的第二源寄存器字段和由存儲指令的常數(shù)字段表示的運算寄存器的內容和的一個存儲位置中存儲來自由存儲指令的第一源寄存器字段的內容來指定的寄存器中的數(shù)據(jù);以及該運算裝置用于響應于執(zhí)行一個條件分支指令,執(zhí)行一個測試,并且,如果測試結果為真,則順序地執(zhí)行來自存儲器中指令,其開始于一個位置處,該位置對應于當由條件分支指令指示的一個相對偏移數(shù)值,面向第一個組選定的測試包括兩個源寄存器內容相等,兩個源寄存器的內容不相等,兩個源寄存器的位邏輯“與”等于零,兩個源寄存器的位邏輯“與”不等于零,由第二源寄存器的內容指定的第一源寄存器的一位內容為零,由第二源寄存器的內容指定的第一源寄存器的一位內容為一,由該指令的一個字段指定的一個源寄存器的一位內容為零,由該指令的一個字段指定的一個源寄存器的一位內容為一,由該指令的一個字段指定的第一源寄存器的內容是小于第二源寄存器內容的二的補碼,由該指令的一個字段指定的第一源寄存器的內容是大于等于第二源寄存器內容的二的補碼,由該指令的一個字段指定的第一源寄存器的內容無符號小于第二源寄存器內容,由指令的一個字段指定的第一源寄存器的內容無符號大于等于第二源寄存器內容,一個源寄存器的內容和該指令的一個常數(shù)字段相等,一個源寄存器的內容和該指令的一個常數(shù)字段不相等,源寄存器的內容是小于該指令的一個常數(shù)字段的二的補碼,一個源寄存器的內容是大于等于該指令的一個常數(shù)字段的二的補碼,源寄存器的內容無符號小于該指令的一個常數(shù)字段,并且源寄存器的內容無符號大于該指令的一個常數(shù)字段。
18. 如權利要求17所述的處理器,其中,從第一組和第二組的其中之一選出來測試包括一個源寄存器的內容為零;一個源寄存器的內容為非零;一個源寄存器的內容為小于零的二的補碼;并且一個源寄存器的內容為大于零的二的補碼;其中,與零的每個比較表示一個偏移,其指明一個分支目標,該分支目標比把一個源寄存器與一個非零變元相比較的一個相應指令的偏移大。
19.如權利要求18所述的處理器,其中通過參考由字段值表示的查找表格中的一個位置,測試包括一個源寄存器與指令的一個常數(shù)字段的比較而形成該常數(shù)。
20.如權利要求19所述的處理器,其中所有的指令都小于三十二位長。
21.如權利要求20所述的處理器,包括以編碼在較少位中的條件分支在內的并使用比對應的條件分支指令更短的一個相對偏移字段的并且包括作為源寄存器的內容的一個測試在內的指令為零而源寄存器的內容為非零。
全文摘要
一種RISC處理器實施一種指令集,它除了使執(zhí)行一個程序所需要的指令數(shù)量、時鐘周期以及每個指令的平均時鐘數(shù)之間的關系最優(yōu)化之外,還被適當設計以優(yōu)化方程式S=IS
文檔編號G06F9/308GK1348560SQ99815428
公開日2002年5月8日 申請日期1999年11月10日 優(yōu)先權日1998年11月13日
發(fā)明者厄爾·A·基里安, 里卡多·E·岡扎爾斯, 艾什什·B·迪克西特, 莫妮卡·拉姆, 沃爾特·D·利奇頓斯坦, 克里斯托弗·羅文, 約翰·C·拉頓伯格, 羅伯特·P·威爾森 申請人:坦斯利卡公司