專利名稱:數(shù)據(jù)處理裝置中的寄存器尋址的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及數(shù)據(jù)處理裝置中的寄存器尋址,并且尤其涉及數(shù)字信號處理領(lǐng)域,盡管其應(yīng)用并不限于數(shù)字信號處理。
通常將數(shù)字處理裝置,比如微處理器,安排成將所接收的指令應(yīng)用于從存儲器中讀取的數(shù)據(jù)項。在微處理器中設(shè)置有一個處理器核以處理指令,并且通常該微處理器具有多個寄存器,在處理器核需要數(shù)據(jù)項之前預(yù)先將這些數(shù)據(jù)項裝入這些寄存器中。在微處理器接收到指令時,微處理器在將這些指令傳遞到處理器核進(jìn)行處理之前通常將這些指令送到指令譯碼器。處理器核然后將所譯碼的指令應(yīng)用于從其寄存器中讀出的相關(guān)數(shù)據(jù)項。然后可以將所處理的指令的結(jié)果寫回到一個寄存器中,或者直接提供給存儲器,諸如高速緩存中。
在數(shù)據(jù)處理裝置一種常見的情況是一個特定的數(shù)據(jù)項為多個指令所需要。因此這一數(shù)據(jù)項必須保存在一個寄存器中,直到所有這種指令都已被處理,并且這些指令必須都引用該數(shù)據(jù)項所位于的那個特定寄存器。另外,常見的是,通常要對一個指令范圍(以下稱之為一個指令循環(huán))重復(fù)多次,以及某些數(shù)據(jù)項被該指令循環(huán)中的不同指令反復(fù)使用。在數(shù)字信號處理裝置中一種尤其常見的情況是,諸如塊過濾算法的算法包含需要重復(fù)多次的指令循環(huán),以將這些指令應(yīng)用于一組數(shù)據(jù)項。任一特定的數(shù)據(jù)項可以被該指令循環(huán)中的不同指令多次使用。
指令循環(huán)被大量用于相對復(fù)雜的算法和邏輯操作中,數(shù)字信號處理裝置需要這些算法和操作以經(jīng)常對大量的數(shù)據(jù)進(jìn)行處理,以產(chǎn)生實時輸出數(shù)據(jù)流。數(shù)字信號處理技術(shù)的通常應(yīng)用包括需要在模擬音頻信號和編碼的用于發(fā)送的數(shù)字信號之間進(jìn)行實時變換的移動電話。
一個指令通常包括一個或多個操作數(shù),這些操作數(shù)標(biāo)識包含該指令所要求的數(shù)據(jù)項的寄存器。例如,一個典型的指令可以包括兩個源操作數(shù)和一個目的操作數(shù),它們分別標(biāo)識該指令所要求的兩個數(shù)據(jù)項和該指令的結(jié)果應(yīng)被存放的一個寄存器。在該指令構(gòu)成如上所述要被反復(fù)應(yīng)用于一組數(shù)據(jù)項的一個指令循環(huán)的一部分的情況下,有必要在每次執(zhí)行該指令時使得每一指令的操作數(shù)引用正確的寄存器。這一要求通常意味著在該指令循環(huán)代碼中該同一指令被多次產(chǎn)生以每次引用不同的寄存器。比如,如果將四個數(shù)據(jù)項裝入寄存器中,一個指令作為一個指令循環(huán)的一部分被應(yīng)用于這四個數(shù)據(jù)項的每一個,則該指令在該指令循環(huán)中被產(chǎn)生四次,該指令的操作數(shù)每次引用一個不同的寄存器。很顯然,這對于代碼密度具有不良的影響。
在微處理器設(shè)計中,在某些情況下使用邏輯寄存器引用的概念,并且然后將邏輯寄存器引用映射到實際寄存器引用,已經(jīng)是眾所周知的。比如,超標(biāo)量處理器通常實現(xiàn)寄存器重命名以允許推測和不按順序執(zhí)行指令。該處理器具有的寄存器多于程序員模型所提供的,并且使用一個映射表將邏輯寄存器映射到它們當(dāng)前的物理對等物上。在處理器推測性地執(zhí)行指令時,它分配物理寄存器號以保存該結(jié)果。其他指令也可以推測性地讀取這些結(jié)果。因此幾個可能的指令流可以并行執(zhí)行。在一些點(diǎn)上,該處理器將確定該多個流中的哪一個是正確的,通常這是根據(jù)一個條件分支的結(jié)果。在該映射表被永久性地更新時,任何不正確的寄存器形式被丟棄。進(jìn)行寄存器重命名的目的是增加指令吞吐量,同時對程序員保持完全透明。很顯然,對于上述代碼密度問題它沒有任何幫助。
作為使用邏輯和物理寄存器引用的另一個例子,先進(jìn)微設(shè)備(Advanced Micro Device-AMD)的Am29200微處理器包括了192個通用寄存器。指定這些寄存器中的128個作為局部寄存器,并且還有一個寄存器作為局部寄存器堆棧指針,該堆棧指針寄存器提供到128個局部寄存器的一個偏移量。從而,在任一指令引用一個局部寄存器時,它使用該堆棧指針寄存器的值計算一個絕對寄存器號。因此,比如如果一個指令希望訪問局部寄存器1(該局部寄存器序列開始于局部寄存器0),并且該堆棧指針指向絕對寄存器號131(根據(jù)Am29200的設(shè)計,在128個局部寄存器的序列中這實際是第4個寄存器),該指令實際上將訪問由絕對寄存器號132標(biāo)識的寄存器。
可以在Am29200微處理器上執(zhí)行一個指令以改變堆棧指針寄存器的值,然后該堆棧指針寄存器修改后的值將被用于引用該局部寄存器的任一指令。對于每一個隨后的指令,將使用由該指令所要求的到該128個局部寄存器中的絕對寄存器號的這一寄存器映射,直到執(zhí)行另一指令來改變該堆棧指針寄存器。
因此,可以看出,在一個指令需要對于不同寄存器中的多個不同的數(shù)據(jù)項進(jìn)行重復(fù)時,上述AMD設(shè)計允許某種程度的重映射。因此,每次在一個指令的操作數(shù)標(biāo)識的寄存器映射到一個不同的局部寄存器時,要求發(fā)布一個單獨(dú)的指令以改變堆棧指針寄存器的值。在某些情況下其帶來的開銷是很大的。比如在數(shù)字信號處理裝置中常見的,需要對一個移位的數(shù)據(jù)項組多次重復(fù)一個指令循環(huán)。在該指令循環(huán)只包括很少數(shù)量的指令時,這一開銷變得尤其不可接受,因為在循環(huán)重復(fù)之前,需要一個單獨(dú)的指令來改變堆棧指針寄存器的值。因此,比如需要將一個指令重復(fù)10次以將之應(yīng)用于數(shù)據(jù)項1至10,則在該指令每次執(zhí)行之前,要求一個單獨(dú)的指令來改變該堆棧指針寄存器值。因此一個只包含一個指令的指令循環(huán)實際上變成了具有兩個指令的指令循環(huán),很顯然,該指令循環(huán)的執(zhí)行增加了巨大的開銷。
根據(jù)本發(fā)明,提供了一種數(shù)據(jù)處理裝置,它包括用于存儲要處理的數(shù)據(jù)項的多個寄存器;一個處理器,用于處理要應(yīng)用于在所述多個寄存器中存儲的數(shù)據(jù)項的指令;以及一個寄存器重映射邏輯,用于將一個預(yù)選的指令集中的邏輯寄存器引用轉(zhuǎn)換到標(biāo)識包含由所述處理器處理所需要的數(shù)據(jù)項的寄存器的一個物理寄存器引用。
根據(jù)本發(fā)明,提供寄存器重映射邏輯以對一個預(yù)選的指令集進(jìn)行寄存器重映射。該重映射邏輯最好可由一個重映射指令進(jìn)行配置,該重映射指令在所述預(yù)選指令集之前執(zhí)行??梢栽O(shè)想該重映射指令可以直接標(biāo)識為之進(jìn)行寄存器重映射的該預(yù)選指令集。然而,在較佳實施例中,該由重映射指令配置的寄存器重映射邏輯可以由一個特定的情況在某些較遲的點(diǎn)觸發(fā),比如一個指令循環(huán)的開始。在這種情況下,將從該特定情形確定要對之進(jìn)行寄存器重映射的預(yù)選指令集,比如該預(yù)選指令集可以是該指令循環(huán)中的所有指令。
通過這一方法,為了將該重映射應(yīng)用于一個所需的指令集只需執(zhí)行該重映射指令一次。這與該AMD微處理器的設(shè)計形成對比,其中,在改變堆棧指針寄存器中的值的指令之后,該同一重映射將被應(yīng)用于所有的引用該局部寄存器的后續(xù)指令,并且如果該堆棧指針的值以及由此該重映射要被再次改變,將需要執(zhí)行另一指令。
在較佳實施例中,該數(shù)據(jù)處理裝置還包括用于定義要重復(fù)的一個指令范圍的一個重復(fù)指令,所述指令范圍包括所述預(yù)選指令集;以及用于管理該重復(fù)指令和被安排成周期性地更新該寄存器重映射邏輯的循環(huán)硬件。該循環(huán)硬件通??梢员话才懦稍诿看沃貜?fù)該指令范圍時更新該寄存器重映射邏輯,使得每次重復(fù)該指令范圍時進(jìn)行從邏輯到物理寄存器引用的一個不同的重映射。
在較佳實施例中,該重復(fù)指令包括用于配置該寄存器重映射邏輯的一個或多個重映射參數(shù)。這些重映射參數(shù)最好使得從邏輯寄存器引用到物理寄存器引用的重映射依賴于由該重復(fù)指令定義的指令范圍的特定重復(fù)。以此方式,由該寄存器重映射邏輯執(zhí)行的重映射在每次重復(fù)該指令范圍時被改變,而不要求發(fā)布一個單獨(dú)的重映射指令。對于小的指令循環(huán),這可以產(chǎn)生巨大的性能改進(jìn),這是因為,以前述的只包括一個指令的指令循環(huán)為例,該循環(huán)的每次重復(fù)只需要一個指令而不是使用根據(jù)AMD微處理器的現(xiàn)有方法所要求的兩個指令。
在該重復(fù)指令包括一個或多個上述討論的重映射參數(shù)時,可安排在執(zhí)行該重復(fù)指令之前執(zhí)行一個重映射指令以使用所述一個或多個重映射參數(shù)配置該寄存器重映射邏輯,所述重映射指令并不包括在由該重復(fù)指令定義的所述指令范圍中。通過這一方法,在執(zhí)行該重復(fù)指令之前只需要執(zhí)行該重映射指令一次。然后,在執(zhí)行該重復(fù)指令時,將由該循環(huán)硬件調(diào)用由該重映射指令定義的寄存器重映射邏輯。
該數(shù)據(jù)處理裝置可以具有一個存儲裝置以存儲至少一組預(yù)定義的重映射參數(shù),每一組定義用于所述寄存器重映射邏輯的一個重映射配置。在這種情況下,如果包括在所述重復(fù)指令中的一個或多個重映射參數(shù)對應(yīng)于所述預(yù)定義重映射參數(shù)組中的一組,則在所述較佳實施例中,使用用于該寄存器重映射邏輯的對應(yīng)的重映射配置,而不要求執(zhí)行一個重映射指令。
在較佳實施例中,該第一重映射參數(shù)標(biāo)識由該寄存器重映射邏輯進(jìn)行重映射的所述多個寄存器的若干寄存器,因為常見的情況是最好將重映射功能限制到該微處理器可用的寄存器的某一子集。通過使用該重復(fù)指令中的這一第一重映射參數(shù),可以將該寄存器重映射邏輯限制到所需的寄存器子集。
該寄存器重映射邏輯最好使用一個基指針作為一個偏移值加到該邏輯寄存器引用,并且該重復(fù)指令包括一個第二重映射參數(shù)以標(biāo)識在預(yù)定間隔用于遞增該基指針的一個值,該預(yù)定間隔例如可以是每次重復(fù)的該指令范圍。因此,可以使用該重復(fù)指令中的第二重映射參數(shù)以預(yù)定間隔,例如在每次重復(fù)該指令循環(huán)時,而自動改變由該寄存器重映射邏輯將邏輯寄存器引用映射到物理寄存器引用的方式。該重復(fù)指令最好還包括一個第三重映射參數(shù)以提供一個第一回繞值,并且如果在基指針遞增期間,該基指針等于或超過該第一回繞值(wrap value),遞增該基指針將回繞到一個新的偏移值。這將使得產(chǎn)生該基指針的一個周期模式。
進(jìn)一步,該重復(fù)指令還可以包括一個第四重映射參數(shù)以提供一個第二回繞值,并且如果由基指針和邏輯寄存器引用的相加形成的寄存器引用等于或超過該第二回繞值,則將該寄存器引用回繞到一個新的寄存器引用??梢詫嶋H選擇該第二回繞值使之等于標(biāo)識要進(jìn)行重映射的寄存器個數(shù)的該第一重映射參數(shù),但也可以選擇具有一個不同的值??梢允褂眠@一第二回繞值以確保將該寄存器重映射邏輯限制到所希望的寄存器數(shù)目。
可以以任一適當(dāng)?shù)姆绞浇M織該多個寄存器,但是,在較佳實施例中,該多個寄存器包含多個寄存器組,該寄存器重映射邏輯被設(shè)計成在一個特定的寄存器組中的多個寄存器上進(jìn)行重映射。因此,數(shù)據(jù)項可以存儲在一個寄存器組中,而比如系數(shù)可以存儲在另一個寄存器組中。利用這一方法,可以將該重映射邏輯設(shè)計成對每一寄存器組執(zhí)行一次獨(dú)立的重映射,從而可以比如獨(dú)立于系數(shù)將數(shù)據(jù)項進(jìn)行重映射。
通常一個指令可以包括多個操作數(shù),每一操作數(shù)包括一個邏輯寄存器引用,在這種情況下可以將寄存器重映射邏輯設(shè)計成對于每一操作數(shù)執(zhí)行一次獨(dú)立的重映射。
如較前所提到的,該數(shù)據(jù)處理裝置可以是用于處理數(shù)據(jù)的任一裝置,但是在較佳實施例中,該裝置是一個數(shù)字信號處理裝置。數(shù)字信號處理涉及尤其從使用本發(fā)明中受益的指令循環(huán)的使用,因為對于這種指令循環(huán),可以經(jīng)常顯著地提高代碼密度和性能。
從第二方面看來,本發(fā)明提供了一種操作一個數(shù)據(jù)處理裝置的方法,該方法包括(a)在多個寄存器中存儲要處理的數(shù)據(jù)項;(b)從該多個寄存器中檢索處理一個指令所需要的一個或多個數(shù)據(jù)項;(c)使用所檢索的所述一個或多個數(shù)據(jù)項處理該指令;對于一個預(yù)選的指令集,所述檢索步驟(b)包括一個另外的轉(zhuǎn)換步驟,該轉(zhuǎn)換步驟將所述預(yù)選的指令集中的一個邏輯寄存器引用轉(zhuǎn)換到標(biāo)識包含所述處理步驟(c)所要求的數(shù)據(jù)項的寄存器的一個物理寄存器引用。
下面參照附圖以示例方式描述本發(fā)明的實施例,附圖中
圖1示出數(shù)字信號處理裝置的高層配置;圖2示出協(xié)處理器的寄存器配置的輸入緩沖器;圖3示出通過協(xié)處理器的數(shù)據(jù)路徑;圖4示出從寄存器中讀取高或低位位的多路復(fù)用電路;圖5為示出較佳實施例中的協(xié)處理器所使用的寄存器重新映象邏輯的框圖;圖6更詳細(xì)地示出圖5中所示的寄存器重新映象邏輯;以及圖7為示出塊過濾算法的表。
下面描述的系統(tǒng)是關(guān)于數(shù)字信號處理(DSP)的。DSP可采取許多形式,但一般可以認(rèn)為是需要高速(實時)處理大量數(shù)據(jù)的處理。這一數(shù)據(jù)通常表示某種模擬物理信號。DSP的好的實例便是用在數(shù)字移動電話中的,其中所接收與發(fā)送的無線電信號需要解碼成模擬聲音信號及將模擬聲音信號編碼(通常采用卷積、變換及相關(guān)運(yùn)算)。另一實例是盤驅(qū)動器控制器,其中處理從盤頭恢復(fù)的信號以產(chǎn)生頭跟蹤控制。
在上面的上下文中,下面是對基于與協(xié)處理器合作的微處理器核(在本例中為英國劍橋先進(jìn)RISC機(jī)器有限公司設(shè)計的微處理器范圍內(nèi)的ARM核)的數(shù)字信號處理系統(tǒng)的描述。微處理器與協(xié)處理器的接口及協(xié)處理器體系結(jié)構(gòu)本身是專門為提供DSP功能配置的。微處理器核將被稱作ARM而協(xié)處理器稱作Piccolo。ARM與Piccolo通常制造成包含作為ASIC的一部分的其它元件(如片上DRAM、ROM、D/A與A/D轉(zhuǎn)換器等)的單一集成電路。
Piccolo為ARM協(xié)處理器,因此它執(zhí)行一部分ARM指令集。ARM協(xié)處理器指令允許ARM在Piccolo與存儲器之間傳送數(shù)據(jù)(利用加載協(xié)處理器LDC及存儲協(xié)處理器STC指令),以及向與從Piccolo傳送ARM寄存器(利用傳送到協(xié)處理器MCR及從協(xié)處理器傳送的MRC指令)。觀察ARM與Piccolo的協(xié)作交互作用的一種方式是ARM作為Piccolo數(shù)據(jù)的強(qiáng)有力的地址發(fā)生器工作,而使Piccolo有時間執(zhí)行需要實時處理大量數(shù)據(jù)來產(chǎn)生對應(yīng)的實時結(jié)果的DSP運(yùn)算。
圖1示出ARM2與Piccolo4,ARM2發(fā)布控制信號到Piccolo4來控制向Piccolo4傳送數(shù)據(jù)以及從Piccolo4傳送數(shù)據(jù)字。指令高速緩沖存儲器6存儲Piccolo4所需要的Piccolo程序指令字。單個DRAM存儲器8存儲ARM2與Piccolo4兩者所需要的所有數(shù)據(jù)與指令字。ARM2負(fù)責(zé)尋址存儲器8及控制所有數(shù)據(jù)傳送。只帶單個存儲器8及一組數(shù)據(jù)與地址總線的布置比需要多個存儲器及高總線帶寬的總線的典型DSP方法簡單與低廉。
Piccolo執(zhí)行來自控制Piccolo數(shù)據(jù)路徑的指令高速緩沖存儲器6的第二指令流(數(shù)字信號處理程序指令字)。這些指令中包含諸如乘-累加等數(shù)字信號處理型操作及諸如零開銷循環(huán)指令等控制流指令。這些指令在保持在Piccolo寄存器10(見圖2)中的數(shù)據(jù)上操作。這一數(shù)據(jù)是早先ARM2從存儲器8傳送來的。指令流自指令高速緩沖存儲器6;指令高速緩沖存儲器6作為完全的總線主驅(qū)動數(shù)據(jù)總線。小的Piccolo指令高速緩沖存儲器6為4線、每線16個字的直接映象高速緩沖存儲器(64條指令)。在一些實現(xiàn)中,令指令高速緩沖存儲器更大是值得的。
從而兩個任務(wù)是獨(dú)立運(yùn)行的,ARM加載數(shù)據(jù)而Piccolo處理它。這允許在16位數(shù)據(jù)上持續(xù)的單周期數(shù)據(jù)處理。Piccolo具有使ARM預(yù)取順序數(shù)據(jù),在Piccolo需要它之前加載數(shù)據(jù)的數(shù)據(jù)輸入機(jī)制(示出在圖2中)。Piccolo能以任何次序存取加載的數(shù)據(jù),隨著老數(shù)據(jù)的最后一次使用自動地重新填充其寄存器(所有指令的每一源操作數(shù)都有一位來指示應(yīng)重新填充源寄存器)。這一輸入機(jī)制稱作再定序緩沖器并包括輸入緩沖器12。加載進(jìn)Piccolo的每一個值(見下面通過LDC或MCR)攜帶有指定該值的目的地寄存器的標(biāo)記Rn。標(biāo)記Rn與數(shù)據(jù)字一起存儲在輸入緩沖器中。當(dāng)通過寄存器選擇電路14存取寄存器而指令指定要重新填充該數(shù)據(jù)寄存器時,便通過確立信號E來標(biāo)記該寄存器。然后重新填充電路16用輸入緩沖器12中以該寄存器為目的地的最老的加載值自動重新填充該寄存器。重定序緩沖器保持8個帶標(biāo)記的值。輸入緩沖器12具有類似于FIFO的形式,但除外可從隊列中央抽取數(shù)據(jù)字,而此后較晚存儲的字向前傳遞來填充空位。距離輸入最遠(yuǎn)的數(shù)據(jù)字便相應(yīng)地是最老的,并在輸入緩沖器12保持帶有正確的標(biāo)記Rn的兩個數(shù)據(jù)字時便用它來確定應(yīng)當(dāng)用哪一個數(shù)據(jù)字來重新填充輸入緩沖器12。
如圖3中所示Piccolo通過將數(shù)據(jù)存儲在輸出緩沖器18(FIFO)中輸出它。數(shù)據(jù)是順序地寫入FIFO中的,并由ARM以相同的次序讀出到存儲器8。輸出緩沖器18保持8個32位值。
Piccolo通過協(xié)處理器接口(圖1的CP控制信號)連接在ARM上。在執(zhí)行ARM協(xié)處理器指令時,Piccolo能執(zhí)行該指令;在執(zhí)行該指令之前令A(yù)RM等待直到Piccolo就緒;或拒絕執(zhí)行該指令。在最后一種情況中,ARM將引起未定義的指令異常。
Piccolo執(zhí)行的最普通的協(xié)處理器指令為LDC與STC,它們分別通過數(shù)據(jù)總線向與從存儲器8加載與存儲數(shù)據(jù)字,而ARM生成所有地址。便是這些指令將數(shù)據(jù)加載到重定序緩沖器中并存儲來自輸出緩沖器18的數(shù)據(jù)。如果在LDC上輸入重定序緩沖器中沒有足夠的空間來加載數(shù)據(jù)時,及如果在STC上輸出緩沖器中沒有足夠的數(shù)據(jù)供存儲,即ARM正在期待的數(shù)據(jù)不在輸出緩沖器18中時,Piccolo將阻止ARM。Piccolo還執(zhí)行ARM/協(xié)處理器寄存器傳送使ARM能存取Piccolo的特定寄存器。
Piccolo從存儲器取出其本身的指令來控制圖3中所示的數(shù)據(jù)路徑及從重定序緩沖器到寄存器及從寄存器到輸出緩沖器18傳送數(shù)據(jù)。Piccolo的執(zhí)行這些指令的算術(shù)邏輯單元具有執(zhí)行乘法、加法、減法、乘-累加、邏輯運(yùn)算、移位與循環(huán)的乘法器/加法器電路20。在數(shù)據(jù)路徑中還設(shè)置有累加/累減(decumul ate)電路22及定標(biāo)/飽和電路24。
Piccolo指令是初始時從存儲器加載進(jìn)指令高速緩沖存儲器6中的,其中Piccolo能存取它們而不需要返回去存取主存儲器。
Piccolo不能從存儲器失敗中恢復(fù)。因此,如果在虛擬存儲器系統(tǒng)中使用Piccolo,在整個Piccolo任務(wù)中所有Piccolo數(shù)據(jù)都必須在物理存儲器中。對于諸如實時DSP等Piccolo任務(wù)的實時性質(zhì),這不是重大的限制。如果出現(xiàn)存儲器失敗,Piccolo將停止并在狀態(tài)寄存器S2中設(shè)置標(biāo)志。
圖3示出Piccolo的整體數(shù)據(jù)路徑功能。寄存器組10使用3個讀端口與2個寫端口。利用一個寫端口(L端口)從重定序緩沖器重新填充寄存器。輸出緩沖器18是直接從ALU結(jié)果總線26更新的,從輸出緩沖器18的輸出是在ARM程序控制下的。ARM協(xié)處理器接口執(zhí)行到重定序緩沖器中的LDC(加載協(xié)處理器)指令及從輸出緩沖器18的STC(存儲協(xié)處理器)指令,以及在寄存器組10上的MCR與MRC(傳送ARM寄存器至/自CP寄存器)。
其余寄存器端口用于ALU。兩個讀端口(A與B)驅(qū)動輸入到乘法器/加法器電路20,C讀端口用于驅(qū)動累加器/累減器電路22輸入。其余寫端口W用于將結(jié)果返回給寄存器組10。
乘法器20執(zhí)行16×16帶符號或不帶符號乘法,帶有可選用的48位累加。定標(biāo)器單元24能提供0至31位立即算術(shù)或邏輯右移,后面跟隨可選用的飽和。移位器與邏輯單元20每一周期能執(zhí)行一個移位或邏輯運(yùn)算。
Piccolo具有稱作D0-D15或A0-A3、X0-X3、Y0-Y3、Z0-Z3的16個通用寄存器。第一組四個寄存器(A0-A3)預(yù)定作為累加器并且是48位寬,額外的16位提供在許多連續(xù)的計算中對溢出的保護(hù)。其余寄存器為32位寬。
可將各Piccolo寄存器作為包含兩個獨(dú)立的16位值對待。位0至15包含低的一半,位16至31包含高的一半。指令能指定各寄存器特定的16位的一半作為源操作數(shù),或可指定整個32位寄存器。
Piccolo還提供飽和的運(yùn)算。如果結(jié)果大于目的地寄存器的大小,乘法、加法與減法指令的變型提供飽和的結(jié)果。當(dāng)目的地寄存器為48位累加器時,將值飽和到32位(即無法飽和48位值)。在48位寄存器上沒有溢出檢測。由于會占用至少65536條乘法累加指令才能導(dǎo)致溢出所以這是合理的限制。
各Piccolo寄存器是標(biāo)記為“空”(E標(biāo)志,見圖2)或包含值(不可能有半個寄存器是空的)之一的。初始時,將所有寄存器標(biāo)記為空。在各周期上Piccolo試圖用重新填充控制電路16將來自輸入重定序緩沖器的值填充空的寄存器之一。此外如果將來自ALU的值寫入寄存器便不再將它標(biāo)記為“空”的。如果從ALU寫入寄存器,同時有值等待從重定序緩沖器放置到該寄存器中,則結(jié)果是不確定的。如果對空寄存器進(jìn)行讀取,Piccolo的執(zhí)行單元將停止。
輸入重定序緩沖器(ROB)位于協(xié)處理器接口與Piccolo的寄存器組之間。用ARM協(xié)處理器傳送將數(shù)據(jù)加載進(jìn)ROB中。ROB包含若干32位值,各帶有指示作為該值的目的地的Piccolo寄存器的標(biāo)記。該標(biāo)記還指示該數(shù)據(jù)應(yīng)傳送給整個32位寄存器還是只給32位寄存器的底部16位。如果數(shù)據(jù)的目的地為整個寄存器,則將該項的底部16位傳送給目標(biāo)寄存器的底部一半并將頂部16位傳送給寄存器的頂部一半(如果目標(biāo)寄存器為48位累加器則擴(kuò)展符號)。如果該數(shù)據(jù)的目的地只是寄存器的底部一半(所謂“半寄存器”),首先傳送底部16位。
寄存器標(biāo)記總是參照物理目的地寄存器,不執(zhí)行寄存器重新映射(見下面關(guān)于寄存器重新映射。)在每一個周期上Piccolo試圖如下地將數(shù)據(jù)項從ROB傳送到寄存器組-檢驗ROB中各項并將標(biāo)記與空寄存器比較,確定是否能從一部分或全部項對寄存器進(jìn)行傳送。
-從能進(jìn)行傳送的項組中,選擇最老的項并將其數(shù)據(jù)傳送給寄存器組。
-將該項的標(biāo)記更新為標(biāo)記該項是空的。如果只傳送了該項的一部分,只將傳送的部分標(biāo)記為空的。
例如,如果目標(biāo)寄存器完全是空的且選擇的ROB項包含以整個寄存器為目的地的數(shù)據(jù),便傳送全部32位并標(biāo)記該項為空的。如果目標(biāo)寄存器的底部一半是空的而ROB項包含目的地為寄存器的底部一半的數(shù)據(jù),則將該ROB項的底部16位傳送給目標(biāo)寄存器的底部一半并將ROB的底部一半標(biāo)記為空的。
可以獨(dú)立地傳送任何項中的數(shù)據(jù)的高與低16位。如果沒有項包含能傳送給寄存器組的數(shù)據(jù),該周期中不進(jìn)行傳送。下面的表描述目標(biāo)ROB項與目標(biāo)寄存器狀態(tài)的所有可能組合。
總結(jié)一下,可以獨(dú)立地從ROB重新填充寄存器的兩半,ROB中的數(shù)據(jù)標(biāo)記為以整個寄存器為目的地或以寄存器的底部一半為目的地的兩個16位值。
用ARM協(xié)處理器指令將數(shù)據(jù)加載進(jìn)ROB中。如何在ROB中標(biāo)記數(shù)據(jù)取決于用哪一條協(xié)處理器指令來執(zhí)行傳送。下述ARM指令可用于以數(shù)據(jù)填充ROB<pre listing-type="program-listing"><![CDATA[LDP{<cond>}<16/32><dest>,[Rn]{!},#<size>LDP{<cond>}<16/32>W(wǎng) <dest>,<wrap>,[Rn]{!},#<size>LDP{<cond>}16U<bank>,[Rn]{!}MPR{<cond>} <dest>,RnMRP{<cond>} <dest>,Rn]]></pre>提供了下列ARM指令用于配置ROB<pre listing-type="program-listing"><![CDATA[LDPA<bank list>]]></pre>前三條被匯編為LDC,MPR與MRP被匯編為MCR,LDPA被匯編為CDP指令。
上面<dest>代表Piccolo寄存器(A0-Z3),Rn代表一個ARM寄存器,<size>代表必須是4的非零倍數(shù)的固定字節(jié)數(shù),而<wrap>代表常量(1、2、4、8)。用{}括起的字段為選用的。為了使傳送能符合重定序緩沖器,<size>至多為32。在許多場合中,為了避免死鎖,<size>將小于這一限制。<16/32>字段指示是否應(yīng)將加載的數(shù)據(jù)作為16位數(shù)據(jù)對待并指示要采取的結(jié)尾(endian)特定的動作(見下面),或者是32位數(shù)據(jù)。
注1在下面的正文中,當(dāng)引用LDP或LDPW時它指指令的16位與32位變型兩者。
注2‘字’為來自存儲器的32位塊,它可包含兩個16位數(shù)據(jù)項或一個32位數(shù)據(jù)項。
LDP指令傳送若干數(shù)據(jù)項,將它們指派到一個全寄存器。這一指令將從存儲器中地址Rn加載<size>/4個字,將它們插入ROB中。能傳送的字?jǐn)?shù)受下面的限制-量<size>必須是4的非零倍數(shù);-<size>必須小于或等于特定實現(xiàn)的ROB的大小(在第一版本中為8個字,未來版本中保證不少于此)。
將傳送的第一數(shù)據(jù)項標(biāo)記為指派到<dest>的,第二數(shù)據(jù)項指派到<dest>+1等等(從Z3繞回到A0)。如果指定了!,則此后將寄存器Rn增量<size>。
如果采用LDP16變型,隨著它們從存儲器系統(tǒng)返回,在構(gòu)成32位數(shù)據(jù)項的2個16位半字上執(zhí)行對結(jié)尾(endian)特定的操作。詳情見下面大結(jié)尾(Big Endian)與小結(jié)尾(Little Endian)支持。
LDPW指令傳送若干數(shù)據(jù)項到一組寄存器。將傳送的第一數(shù)據(jù)項標(biāo)記為指派到<dest>,第二到<dest>+1,等等。當(dāng)出現(xiàn)<wrap>傳送時,將下一個傳送的項標(biāo)記為指派到<dest>,等等。<wrap>量是在半字的量指定的。
對于LDPW,適用下述限制-量<size>必須是4的非零倍數(shù);-<size>必須小于或等于特定實現(xiàn)的ROB的大小(在第一版中為8個字,未來版本中保證不小于此);-<dest>可以是{A0、X0、Y0、Z0}之一;
-對于LDP32W,<wrap>可以是{2、4、8}個半字之一,對于LDP16W可以是{1、2、4、8}個半字之一;-量<size>必須大于2*<wrap>,否則不出現(xiàn)回繞而應(yīng)用LDP指令來代替。
例如,指令<pre listing-type="program-listing"><![CDATA[LDP32WX0,2,[R0]!,#8]]></pre>將兩個字加載進(jìn)ROB中,將它們指派給整個寄存器X0。R0將被增量8。指令<pre listing-type="program-listing"><![CDATA[LDP32WX0,4,[R0],#16]]></pre>將四個字加載進(jìn)R0B中,將它們標(biāo)記為指派給X0,X1,X0,X1(按此次序)。R0不受影響。
對于LDP16W,可將<wrap>指定為1、2、4或8。1的回繞將導(dǎo)致所有數(shù)據(jù)標(biāo)記為指派給目的地寄存器<dest>.l的底部一半。這是‘半寄存器’情況。
例如,指令<pre listing-type="program-listing"><![CDATA[LDP16WX0,1,[R0]!,#8]]></pre>將兩個字加載進(jìn)ROB中,將它們標(biāo)記為指派給X0.1的16位數(shù)據(jù)。R0將被增量8。指令<pre listing-type="program-listing"><![CDATA[LDP16WX0,4,[R0],#16]]></pre>的表現(xiàn)類似于LDP32W實例,但是在它從存儲器返回時在數(shù)據(jù)上執(zhí)行對于結(jié)尾特定的操作除外。
LDP指令所有未使用的編碼可為將來擴(kuò)展保留。
LDP16U指令是為支持16位不對齊的數(shù)據(jù)的高效傳送而提供的。LDP16U支持是為寄存器D4至D15(X、Y與Z組)提供的。LDP16U指令將一個32位數(shù)據(jù)字(包含兩個16位數(shù)據(jù)項)從存儲器傳送到Piccolo中。Piccolo將丟棄這一數(shù)據(jù)的底部16位而將頂部16位存儲在保持寄存器中。X、Y與Z組有一保持寄存器。一旦裝填了組中的保持寄存器,如果將數(shù)據(jù)指派給該組中的寄存器,便改變了LDP{W}指令的表現(xiàn)。加載進(jìn)ROB中的數(shù)據(jù)由保持寄存器與正在用LDP指令傳送的數(shù)據(jù)的底部16位的連接構(gòu)成。將正在傳送的數(shù)據(jù)的高16位放入保持寄存器中<pre listing-type="program-listing"><![CDATA[entry<-data.l|holding_registerholding_register<-data.h]]></pre>這一操作模式一直持續(xù)到用LDPA指令關(guān)閉為止。保持寄存器并不記錄目的地寄存器標(biāo)記或大小。這一特征是從提供data.l的下一個值的指令獲得的。
結(jié)尾的特定行為可永遠(yuǎn)出現(xiàn)在存儲器系統(tǒng)返回的數(shù)據(jù)上。由于假定所有32位數(shù)據(jù)項在存儲器中都是字對齊的,不存在等效于LDP16U的非16位指令。
LDPA指令用于關(guān)閉LDP16U指令起動的不對齊操作模式。可以在組X、Y、Z上獨(dú)立關(guān)閉不對齊模式。例如指令,<pre listing-type="program-listing"><![CDATA[LDPA {X,Y}]]></pre>將關(guān)閉組X與Y上的不對齊模式。這些組的保持寄存器中的數(shù)據(jù)將被丟棄。
允許在不處于非對齊模式的組上執(zhí)行LDPA,這將使該組在對齊模式中。
MPR指令將ARM寄存器Rn的內(nèi)容放入ROB中,指派給Piccolo寄存器<dest>。目的地寄存器<dest>可以是范圍A0-Z3中的任何全寄存器。例如指令,<pre listing-type="program-listing"><![CDATA[MPR X0,R3]]></pre>將R3的內(nèi)容傳送到ROB中,將數(shù)據(jù)標(biāo)記為指派給全寄存器X0。
由于ARM是內(nèi)部小結(jié)尾(endian)的,將數(shù)據(jù)從ARM傳送到Piccolo時不出現(xiàn)對結(jié)尾特定的表現(xiàn)。
MPRW指令將ARM寄存器Rn的內(nèi)容放置在ROB中,將其標(biāo)記為指派給16位Piccolo寄存器<dest>.l的兩個16位數(shù)據(jù)項。對<dest>的限制與對LDPW指令的相同(即A0、X0、Y0、Z0)。例如指令,<pre listing-type="program-listing"><![CDATA[MPRWX0,R3]]></pre>將R3的內(nèi)容傳送到ROB中,將數(shù)據(jù)標(biāo)記為指派給X0.l的兩個16位量。應(yīng)指出對于帶有1回繞的LDP16W,只能針對32位寄存器的底部一半。
至于MPR,在數(shù)據(jù)上不作用對于結(jié)尾特定的操作。
將LDP編碼為31 30 2928 27 2625 24 23 22 21 20 19 18 1716 15 14 1312 11 10 9 8 7 6 5 4 3 2 1 0<
其中PICCOLO1為Piccolo的第一協(xié)處理器號(當(dāng)前為8)。N位在LDP32(1)與LDP16(0)之間選擇。
LDPW編碼為31 30 29 28 27 26 25 24 23 22 21 20 19 18 1716 1514 13 12 11 10 9 8 7 6 5 4 3 2 1 0<
其中DEST對于目的地寄存器A0、X0、Y0、Z0為0-3而WRAP對于回繞值1、2、4、8為0-3。PICCOL02為Piccolo的第二協(xié)處理器號(當(dāng)前為9)。N位在LDP32(1)與LDP16(0)之間選擇。
將LDP16U編碼為31 30 29 28 272625 24 23 22 21 20 19 18 1716 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0<
其中DEST對于目的地組X、Y、Z為1-3。將LDPA編碼為31 30 29 28 27 26 25 24 23 22 2120 19 18 17 16 15 14 1312 11 10 9 8 7 6 5 4 3 2 1 0<
其中BANK[3:0]用于在每組的基礎(chǔ)上關(guān)閉不對齊模式。如果設(shè)置了BANK[1],則關(guān)閉組X上的不對齊模式。BANK[2]與BANK[3]分別關(guān)閉組Y與Z上的不對齊模式,如果設(shè)置的話。注意,這是CDP操作。
將MPR編碼為31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 141312 11 10 9 8 7 6 5 4 3 2 1 0
將MPRW編碼為31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
其中DEST對于目的地寄存器X0、Y0、Z0為1-3。
輸出FIFO能保持多達(dá)8個32位值。它們是用下述(ARM)操作碼之一從Piccolo傳送的<pre listing-type="program-listing"><![CDATA[STP{<cond>}<16/32>[Rn]{!},#<size>MRP Rn]]></pre>第一個將來自輸出FIFO的<size>/4個字保存在ARM寄存器Rn給定的地址上,如果!存在,變址Rn。為防止死鎖,<size>不得大于輸出FIFO的大小(本實現(xiàn)中為8項)。如果采用STP16變型,在存儲器系統(tǒng)返回的數(shù)據(jù)上可出現(xiàn)對于結(jié)尾特定的表現(xiàn)。
MRP指令從輸出FIFO中消除一個字并將其放置在ARM寄存器Rn中。對于MPR在數(shù)據(jù)上不作用對于結(jié)尾特定的操作。
STP的ARM編碼為31 30 29 28 27 2625 24 23 22 21 20 19 18 1716 15 14 1312 11 10 9 8 7 6 5 4 3 2 1 0
其中N在STP32(1)與STP16(0)之間選擇。對于P、U與W位的定義,參見ARM資料手冊。
MRP的ARM編碼為31 30 29 28 27 2625 24 23 22 21 20 19 18 1716 15 14 1312 11 10 9 8 7 6 5 4 3 2 1 0
Piccolo指令集內(nèi)部假定小結(jié)尾(little endian)操作。例如,在存取作為兩個16位的32位寄存器時,假定低一半占用位15至0。Piccolo可在帶有大結(jié)尾(big endian)存儲器或外圍設(shè)備的系統(tǒng)中操作,因此必須注意以正確方式加載16位分組數(shù)據(jù)。
諸如ARM(如英國劍橋的先進(jìn)RISC機(jī)器有限公司生產(chǎn)的ARM7微處理器)等Piccolo具有程序員能控制的‘BIGEND’配置管腳,控制可以是用可編程外圍設(shè)備進(jìn)行的。Piccolo利用該管腳來配置輸入重定序緩沖器及輸出FIFO。
當(dāng)ARM將分組的16位數(shù)據(jù)加載到重定序緩沖器中時,它必須用LDP指令的16位格式指示這一點(diǎn)。這一信息與‘BIGEND’配置輸入的狀態(tài)組合以適當(dāng)?shù)拇涡驅(qū)?shù)據(jù)放置在保持鎖存器與重定序緩沖器中。尤其是在大結(jié)尾模式中,保持寄存器存儲加載的字的底部16位,并與下一次加載的頂部16位配對。保持寄存器內(nèi)容永遠(yuǎn)結(jié)束在傳送到重定序緩沖器中的字的底部16位中。
輸出FIFO可包含分組16位或32位數(shù)據(jù)。程序員必須使用STP指令的正確格式以便Piccolo能保證將16位數(shù)據(jù)提供在數(shù)據(jù)總線的正確一半上。當(dāng)配置成大結(jié)尾時,在使用16位格式的STP時,上與下16位兩半互換。
Piccolo具有只能從ARM存取的4個專用寄存器。它們稱作S0-S2。它們只能用MRC與MCR指令存取。操作碼為<pre listing-type="program-listing"><![CDATA[MPSRSn,RmMRPSRm,Sn]]></pre>這些操作碼在ARM寄存器Rm與專用寄存器Sn之間傳送32位值。它們是作為協(xié)處理器寄存器傳送在ARM中編碼的31 3O 29 28 27 26 25 24 23 2221 20 19 18 17 l6 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
其中對于MPSR,L為0而對MRPS,L則為1。寄存器S0包含Piccolo唯一的ID及修訂版本代碼。31 30 29 28 27 26 25 24 23 22 2l 20 19 18 1716 15 14 13 l2 11 10 9 8 7 6 5 43 2 1 0
位[3:0]包含處理器的修訂版本號。
位[15:4]包含以二進(jìn)制編碼的十進(jìn)制格式的3位部件號piccolo為0×500位[23:16]包含體系結(jié)構(gòu)版本0×00=版本1位[31:24]包含實現(xiàn)者商標(biāo)的ASCⅡ碼0×41=A=ARM有限公司寄存器S1為Piccolo狀態(tài)寄存器。31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
一級狀態(tài)碼標(biāo)志(N、Z、C、V)二級狀態(tài)碼標(biāo)志(SN、SZ、SC、SV)E位Piccolo已被ARM禁止并已停止。
U位Piccolo遇到未定義的指令并已停止。
B位Piccolo遇到斷點(diǎn)并已停止。
H位Piccolo遇到停止指令并已停止。
A位Piccolo遇到存儲器失敗(加載、存儲或Piccolo指令)并已停止。
D位Piccolo檢測到死鎖條件并已停止(見下)。
寄存器S2為Piccolo程序計數(shù)器
寫入程序計數(shù)器起動Piccolo在該地址上執(zhí)行程序(如果停止則離開停止?fàn)顟B(tài))。復(fù)位時程序計數(shù)器是無定義的,因為Piccolo總是通過寫入程序計數(shù)器起動的。
執(zhí)行期間,Piccolo監(jiān)視指令的執(zhí)行及協(xié)處理器接口的狀態(tài)。如果它檢測到-Piccolo已停止運(yùn)行等待重新裝填寄存器或等待輸出FIFO具有可利用的項。
-協(xié)處理器接口為忙等待,由于ROB中空間不夠或輸出FIFO中項不夠。
如果檢測到這兩種狀態(tài),Piccolo置位其狀態(tài)寄存器中的D位、停止并拒絕ARM處理器指令,導(dǎo)致ARM進(jìn)入未定義指令陷阱。
死鎖狀態(tài)的檢測允許將系統(tǒng)構(gòu)成為通過讀取ARM與Piccolo程序計數(shù)器及寄存器至少能警告程序員已出現(xiàn)該狀態(tài)及報告精確的故障點(diǎn)。應(yīng)強(qiáng)調(diào)死鎖只能由于不正確的程序或系統(tǒng)的另一部分破壞Piccolo的狀態(tài)引發(fā)。死鎖不能由數(shù)據(jù)不足或‘過載’引發(fā)。
可采用若干種操作從ARM控制Piccolo,它們是由CDP指令提供的。這些CDP指令只在ARM在特權(quán)狀態(tài)中才接受。如果不在該狀態(tài)中Piccolo將拒絕CDP指令而導(dǎo)致ARM處于未定義的指令陷阱。下面為可利用的操作-復(fù)位-進(jìn)入狀態(tài)訪問模式-啟動-禁止Piccolo可用PRESET指令在軟件中復(fù)位。
PRESET;清除piccolo的狀態(tài)將這一指令編碼為31 30 2928 27 26 2524 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
>執(zhí)行這一指令時出現(xiàn)以下情況-將所有寄存器標(biāo)記為空(準(zhǔn)備好重新填充)。
-清除輸入ROB。
-清除輸出FIFO。
-復(fù)位循環(huán)計數(shù)器。
-將Pioccolo置于停止?fàn)顟B(tài)(將置位S2的H位)。
執(zhí)行PRESET指令可占用若干周期來完成(對于本實施例2-3)。在正在執(zhí)行它時,后面要在Piccolo上執(zhí)行的ARM協(xié)處理器指令將處于忙等待。
在狀態(tài)訪問模式中,可使用STC及LDC指令保存與恢復(fù)Piccolo的狀態(tài)(見下面關(guān)于從ARM訪問Piceolo狀態(tài))。為了進(jìn)入狀態(tài)訪問模式,必須首先執(zhí)行PSTATE指令PSTATE進(jìn)入狀態(tài)訪問模式將這一指令編碼為31 30 29 28 27 26 25 24 23 22 2120 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
在執(zhí)行時,PSTATE指令將-停止Piccolo(如果它尚未停止),置位Piccolo的狀態(tài)寄存器中的E位。
-配置Piccolo進(jìn)入其狀態(tài)訪問模式中。
執(zhí)行PSTATE指令可占用若干周期來完成,由于在停止以前Piccolo的指令流水線必須用完。當(dāng)正在執(zhí)行時,后面要在Piccolo上執(zhí)行的ARM協(xié)處理器指令將是忙等待。
將PENABLE與PDISABLE指令用于快速上下文切換。當(dāng)Piccolo被禁止時,只能訪問專用寄存器0與1(ID與狀態(tài)寄存器),并且只是從特權(quán)模式時。訪問任何其它狀態(tài)或從用戶模式的任何訪問將導(dǎo)致ARM未定義指令異常。禁止Piccolo導(dǎo)致它停止執(zhí)行。當(dāng)Piccolo已停止執(zhí)行時,它通過置位狀態(tài)寄存器中的E位來確認(rèn)這一事實。
Piccolo是通過執(zhí)行PENABLE指令啟動的PENABLE; 啟動Piccolo將這一指令編碼為31 30 29 28 27 26 25 24 23 22 21 20 19 18 1716 15 141312 11 10 9 8 7 6 54 3 2 1 0
Picclol是通過執(zhí)行PDISABLE指令禁止的PDISABLE ;禁止Piccolo將這一指令編碼為31 30 29 28 27 26 25 24 23 22 2120 19 18 1716 15 14 13 12 11 10 9 8 7 6 54 3 2 1 0
在執(zhí)行這一指令時,出現(xiàn)以下情況-Piccolo的指令流水線將流完。
-Piccolo將停機(jī)及置位狀態(tài)寄存器中的H位。
Piccolo指令高速緩沖存儲器保持控制Piccolo數(shù)據(jù)路徑的Piccolo指令。如果存在,它保證保持至少64條指令,起始在16個字邊界上。下面的ARM操作碼匯編進(jìn)MCR中。其操作為強(qiáng)制高速緩沖存儲器取出起始在指定地址上(必須是16字邊界)的一行(16條)指令。即使高速緩沖存儲器已保持有關(guān)于這一地址的數(shù)據(jù)也發(fā)生這一取出。
PMIR Rm在能執(zhí)行PMIR之前Piccolo必須停止。
這一操作碼的MCR編碼為
本節(jié)討論控制Piccolo數(shù)據(jù)路徑的Piccolo指令集。各指令為32位長。指令是從Piccolo指令高速緩沖存儲器中讀取的。
解碼指令集是相當(dāng)直觀的。高6位(26至31)給出主操作碼,位22至25為少數(shù)特定指令提供次要操作碼。帶灰色陰影的位當(dāng)前不使用而為擴(kuò)展保留(當(dāng)前它們必須包含指定值)。
有11個主要指令類。這并不完全對應(yīng)于提出在指令中的主操作碼,這是為了便于解碼某些子類。3 3 2 2 2 2 2 2 2 2 2 2 11 1 1 1 1 11 1 1 9 8 7 6 5 4 3 2 1 01 0 9 8 7 6 5 4 3 2 1 0 98 7 6 5 4 32 1 0
<p>上表中的指令具有以下名稱標(biāo)準(zhǔn)數(shù)據(jù)運(yùn)算邏輯運(yùn)算條件加/減未定義移位選擇未定義并行選擇乘累加未定義雙倍乘未定義移動帶符號立即數(shù)未定義重復(fù)重復(fù)寄存器列表操作轉(zhuǎn)移重新命名參數(shù)傳送停止/中斷在下面的節(jié)中詳細(xì)描述各類指令的格式。對于大多數(shù)指令,源與目的地操作數(shù)字段是通用的并在單獨(dú)的節(jié)中詳細(xì)描述,寄存器重新映射也一樣。
大多數(shù)指令需要兩個源操作數(shù);源1與源2。某些例外是飽和絕對值。
源1(SRC1)操作數(shù)具有以下7位格式18 17 1615141312
字段元素具有下述含義-大小-指示要讀的操作數(shù)大小(1=32位,0=16位)。-再填充-規(guī)定讀后應(yīng)將寄存器標(biāo)記為空的并能從ROB再填充。
-寄存器號-編碼要讀取的16個32位寄存器中哪一個。
-高/低-對于16位讀指示讀取32位寄存器的哪一半。對于32位操作數(shù),置位時指示應(yīng)互換兩個16位一半
在匯編程序中通過在寄存器號上加上后綴來指定寄存器大小l為低16位,h為高16位或.x為具有高與低16位交換的32位。
通用的源2(SRC2)具有以下三種12位格式之一11 10 9 87 6 5 43 2 1 0<
圖4示出根據(jù)高/低位與大小位將所選擇的寄存器的適當(dāng)?shù)囊话肭袚Q到Piccolo數(shù)據(jù)路徑上的多路復(fù)用器裝置。如果大小位指示16位,則符號擴(kuò)展電路根據(jù)需要用0或1填充數(shù)據(jù)路徑的高位。
第一種編碼指定源為寄存器,這些字段具有與SRC1說明符相同的編碼。標(biāo)度(SCALE)字段指定要作用在ALU的結(jié)果上的標(biāo)度。
帶有循環(huán)編碼的8位立即數(shù)允許生成可用8位值及2位循環(huán)表示的32位立即數(shù)。下表示出能從8位值XY生成的立即數(shù)值<
6位立即數(shù)編碼允許使用6位不帶符號的立即數(shù)(從0到63),以及作用在ALU的輸出上的標(biāo)度。
通用源2編碼對于大多數(shù)指令變型是通用的。對這一規(guī)則存在一些例外,它們支持源2編碼的有限子集或?qū)⑵渖约有薷?選擇指令。
-移位指令。
-并行操作。
-乘累加指令。
-乘雙倍指令。
選擇指令只支持寄存器或6位不帶符號立即數(shù)的一個操作數(shù)。由于這些位由指令的狀態(tài)字段使用而得使該標(biāo)度不可用。11 10 98765 4 3 2 1 0SRC2 SEL<
移位指令只支持16位寄存器或1與31之間的5位無符號立即數(shù)的一個操作數(shù)。不能得到結(jié)果的標(biāo)度。
在并行操作情況中,如果指定寄存器作為操作數(shù)的源,則必須執(zhí)行32位讀。并行操作的立即數(shù)編碼略為不同。它允許將一個立即數(shù)復(fù)制到32位操作數(shù)的兩個16位一半中。并行操作可利用稍加限制范圍的標(biāo)度。
如果使用6位立即數(shù),則總是將它復(fù)制到32位量的兩個一半上。如果使用8位立即數(shù),只有當(dāng)循環(huán)指示應(yīng)將8位立即數(shù)循環(huán)到32位量的頂部一半上時才復(fù)制。
<p>并行選擇操作不使用標(biāo)度;豁須將這些指令的標(biāo)度字段設(shè)置為0。
乘累加指令不允許指定8位循環(huán)立即數(shù).該字段的位10用來部分地指定使用哪一累加器。源2蘊(yùn)含16位操作數(shù)。11 10 9 8765 4 3 2 1 0SRC2_MZILA
11 10 9 8765 43210SRC2_MULD<
某些指令總是蘊(yùn)含32位操作(如ADDADD),并在這些情況中壓將大小位設(shè)置為l,高/低位用來有選擇地互換32位操作數(shù)的兩個16位一半。某些指令總是蘊(yùn)含16位操作(如MUL)并應(yīng)將大小位設(shè)置為0。而高/低位選擇所使用的寄存器的哪一半(假定清除了失去的大小位)。乘累加指令允許獨(dú)立說明源累加器與目的地寄存器。對于這些指令,大小位用來指示源累加器,而大小位則由指令類型為0來蘊(yùn)含。
當(dāng)讀取16位值時(通過A或B總線)自動進(jìn)行符號擴(kuò)展將其擴(kuò)展成32位量。如果讀取48位寄存器(通過A或B總線),在總線上只出現(xiàn)底部32位。從而在所有情況中都將源1與源2轉(zhuǎn)換成32位值。只有使用總線C的累加指令能存取累加器寄存器的整個48位。
如果置位再填充位,使用后便將該寄存器標(biāo)記為空的并將由通常的再填充機(jī)制從ROB再填充(見關(guān)于ROB的節(jié))。除非在進(jìn)行再填無以前該寄存器再一次用作源操作數(shù),Piccolo不會停止運(yùn)行。在冉填充的數(shù)據(jù)有效以前的最小周期數(shù)(最佳情況一數(shù)據(jù)等待在ROB頭部)為1或2。因此建議在再填充請求后面的指令上不要使用再填充的數(shù)據(jù)。如果能避免在后面兩條指令上使用操作數(shù),應(yīng)當(dāng)這樣做,由于這可防止深層流水線實現(xiàn)上的性能損失。
在匯編程序中通過在寄存器號上加上后綴“^”來指定再填充位。標(biāo)記為空的寄存器段取決于寄存器操作數(shù)??蓪⒏骷拇嫫鞯膬砂霕?biāo)記為獨(dú)立地再填充的(例如X0.l^只標(biāo)記再填充X0的底部一半,X0^則標(biāo)記再填充整個X0)。當(dāng)再填充48位寄存器的頂部“一半”(位47:16)時,將16位數(shù)據(jù)寫入位31:16并符號擴(kuò)展到位47。
如果試圖再填充同一寄存器兩次(如ADD X0,X0^,X0^),只進(jìn)行一次填充。匯編程序只允許語法ADD X1,X0,X0^。
如果在再填充一寄存器之前試圖讀該寄存器,Piccolo停止運(yùn)行等待再填充該寄存器。如果標(biāo)記寄存器為再填充,而在讀取再填充的值之前更新了該寄存器,結(jié)果是不可預(yù)測的(例如ADD X0,X0^,X1是不可預(yù)測的,由于它標(biāo)記X0再填充,然后通過將X0與X1之和放置在其中來再填充)。
4位標(biāo)度字段編碼14種標(biāo)度類型-ASR#0,1,2,3,4,6,8,10-ASR#12至16-LSL#1并行最大/最小指令不提供標(biāo)度,因此不使用源2的6位常量變型(匯編程序設(shè)置為0)。
在重復(fù)指令內(nèi)支持寄存器重新映射,允許重復(fù)指令訪問寄存器的移動‘窗口’而不回繞循環(huán)。下面更詳細(xì)描述這一點(diǎn)。
目的地操作數(shù)具有以下7位格式25 24 2322212019
這一基本編碼有10種變型
寄存器號(DX)指示正在尋址的是16個寄存器中哪一個。高/低位與大小位一起工作來尋址作為一對16位寄存器的各32位寄存器。大小位定義如何設(shè)置指令類型中所定義的適當(dāng)標(biāo)志,不論將結(jié)果是否寫入寄存器組與/或輸出FIFO,這允許構(gòu)成比較及類似指令。帶累加的加法類指令必須將結(jié)果寫回寄存器。
下表示出各編碼的表現(xiàn)<
在所有情況中,任何操作寫回寄存器或插入輸出FIFO之前的結(jié)果為48位量。存在著兩種情況如果寫是16位的,通過選擇底部16位[15:0]將48位量減少到16位量。如果指令飽和,則值將飽和在范圍-2^15至2^15-1中。然后將16位值寫回到指定的寄存器,如果設(shè)置了寫FIFO位,則寫到輸出FIFO。如果將其寫到輸出FIFO,則將其保持到直到寫入下一個16位值將這兩個值配對并作為單一的32位值放入輸出FIFO中時。
對于32位寫,通過選擇底部32位[31:0]將48位量減少到32位量。
對于32位與48位寫兩者,如果指令飽和,便將48位值轉(zhuǎn)換成范圍-2^31-1至2^31中的32位值。接著該飽和-如果執(zhí)行寫回到累加器,則寫入整個48位。
-如果執(zhí)行寫回到32位寄存器,則寫位[31:0]。
-如果指示寫回到FIFO,又一次寫位[31:0].
目的地大小是由匯編程序在寄存器號后面用.l或.h指定的。如果不執(zhí)行寄存器寫回,則寄存器是不重要的,因此省略目的地寄存器來指示不寫到寄存器或使用^來指示只寫入輸出FIFO。例如,SUB,X0,Y0等效于CMP X0,Y0而ADD^,X0,Y0將X0+Y0之值放入輸出FIFO中。
如果輸出FIFO沒有值的空間,Piccolo停止運(yùn)行等待空間成為可利用的。
如果寫出16位值,例如ADD X0.h^,X1,X2,則鎖存該值直到寫第二個16位值。然后將兩個值組合并作為一個32位數(shù)放入輸出FIFO中。寫入的第一個16位值總是出現(xiàn)在32位字的低位一半。將進(jìn)入輸出FIFO的數(shù)據(jù)標(biāo)記為16或32位數(shù)據(jù),以允許在大結(jié)尾系統(tǒng)上校正結(jié)尾。
如果在兩次16位寫之間寫入32位值,則操作是未定義的。
重復(fù)指令內(nèi)支持寄存器重新映射,允許重復(fù)指令訪問寄存器的移動‘窗口’而不回繞循環(huán)。下面更詳細(xì)地描述這一點(diǎn)。
在本發(fā)明的較佳實施例中,重復(fù)指令提供修改在循環(huán)中指定寄存器操作數(shù)的方式的機(jī)制。在這一機(jī)制下,要訪問的寄存器是用指令中的寄存器操作數(shù)及在寄存器組中的編移量的一個函數(shù)來確定的。該偏移量是以可編程方式改變的,最好在各指令循環(huán)的末尾。該機(jī)制可獨(dú)立地在位于X、Y與Z組中的寄存器上操作。在較佳實施例中,這一設(shè)施對于A組中的寄存器不能利用。
可使用邏輯與物理寄存器的概念。指令操作數(shù)為邏輯寄存器引用,然后將其映射到標(biāo)識特定Piccolo寄存器10的物理寄存器引用。包含再填充在內(nèi)的所有操作都在物理寄存器上操作。只在Piccolo指令流一側(cè)出現(xiàn)寄存器重新映射-加載進(jìn)Piccolo的數(shù)據(jù)總是指派給物理寄存器而不執(zhí)行重新映射。
進(jìn)一步參照圖5討論重新映射機(jī)制,圖5為示出Piccolo協(xié)處理器4的若干內(nèi)部部件的方框圖。將ARM核2從存儲器中檢索到的數(shù)據(jù)項放在重定序緩沖器12中,而Piccolo寄存器10則以較早參照圖2描述的方式從重定序緩沖器12再填充。將存儲在高速緩沖存儲器6中的Piccolo指令傳遞給在Piccolo4內(nèi)的指令解碼器50,在那里在將它們傳遞給Piccolo處理器核54之前進(jìn)行解碼。Piccolo處理器核54包含較早參照圖3討論的乘法器/加法器電路20、累加/累減電路22及定標(biāo)/飽和電路24。
如果指令解碼器50正在處理構(gòu)成用重復(fù)指令標(biāo)識的指令循環(huán)的一部分的指令,而該重復(fù)指令指示了應(yīng)進(jìn)行若干寄存器的重新映射,便利用寄存器重新映射邏輯52來執(zhí)行必要的重新映射??蓪⒓拇嫫髦匦掠成溥壿?2認(rèn)為是指令解碼器50的一部分,雖然熟悉本技術(shù)的人員清楚可將寄存器重新映射邏輯設(shè)置成完全與指令解碼器50分開的實體。
指令中通常包含標(biāo)識包含指令所需的數(shù)據(jù)項的寄存器的一個或多個操作數(shù)。例如,典型的指令可包含兩個源操作數(shù)及一個目的地操作數(shù),標(biāo)識包含該指令所需的數(shù)據(jù)項的兩個寄存器及應(yīng)將指令的結(jié)果放入其中的寄存器。寄存器重新映射邏輯52從指令解碼器50接收指令的操作數(shù),這些操作數(shù)標(biāo)識邏輯寄存器引用。根據(jù)邏輯寄存器引用,寄存器重新映射邏輯確定應(yīng)不應(yīng)施加重新映射,然后根據(jù)需要將重新映射作用在物理寄存器引用上。如果確定不應(yīng)施加重新映射,便提供邏輯寄存器引用作為物理寄存器引用。稍后將詳細(xì)討論執(zhí)行重新映射的較佳方式。
將來自寄存器重新映射邏輯的各輸出物理寄存器引用傳遞給Piccolo處理器核54,使得隨后處理器核能將指令作用在由物理寄存器引用標(biāo)識的特定寄存器10中的數(shù)據(jù)項上。
較佳實施例的重新映射機(jī)制允許將各寄存器組分成兩部分,即可以重新映射的寄存器部分及保持它們原來的寄存器引用不重新映射的寄存器部分。較佳實施例中,重新映射部分起始于重新映射的寄存器組的底部。
重新映射機(jī)制采用若干參數(shù),這些參數(shù)將參照圖6詳細(xì)討論,圖6為示出寄存器重新映射邏輯22如何使用各種參數(shù)的方框圖。應(yīng)指出這些參數(shù)是相對于正在重新映射的組內(nèi)的一點(diǎn)的給定值,這一點(diǎn)為例如該組的底部。
可認(rèn)為寄存器重新映射邏輯52包括兩個主要邏輯塊,即重新映射塊56及基更新塊58。寄存器重新映射邏輯52采用提供加在邏輯寄存器引用上的偏移值的基指針,由基更新塊58將這一基指針值提供給重新映射塊56。
可用基起始(BASESTART)信號來定義基指針的初始值,例如這通常是零,雖然一些其它值也可指定。將這一基起始信號傳遞給基更新塊58內(nèi)的多路復(fù)用器60。在指令循環(huán)的第一次重復(fù)中,多路復(fù)用器60將基起始信號傳遞給存儲單元66,而對于循環(huán)的后面的重復(fù),由多路復(fù)用器60將下一基指針值提供給存儲單元66。
將存儲單元66的輸出作為當(dāng)前基指針值傳遞給重新映射邏輯56,并且還傳遞給基更新邏輯58內(nèi)的加法器62的輸入之一。加法器62還接收提供基增量值的基增量(BASEINC)信號。加法器62配置成將存儲單元66所提供的當(dāng)前基指針值增加該基增量值,并將結(jié)果傳遞給模電路64。
這一模電路還接收基環(huán)繞(BASEWRAP)值并將這一值與來自加法器62的輸出基指針信號比較。如果增量后的基指針值等于或大于基環(huán)繞值,便將新基指針繞回到新的偏移值。這時模電路64的輸出便是要存儲在存儲單元66中的下一基指針值。將這一輸出提供給多路復(fù)用器60,并從那里到存儲單元66。
然而,在存儲單元66從管理重復(fù)指令的循環(huán)硬件接收到基更新(BASEUPDATE)信號之前不能將這一下一個基指針值存儲在存儲單元66中。循環(huán)硬件周期性地生成基更新信號,例如每當(dāng)要重復(fù)指令循環(huán)時。當(dāng)存儲單元66接收到基更新信號時,存儲單元便用多路復(fù)用器60提供的下一基指針值改寫前一基指針值。以這一方式,提供給重新映射邏輯58的基指針值將改變成新基指針值。
要在寄存器組的重新映射的部分內(nèi)存取的物理寄存器由包含在指令的操作數(shù)內(nèi)的邏輯寄存器引用與基更新邏輯58提供的基指針值之和確定。這一加法是由加法器68執(zhí)行的并將輸出傳遞給模電路70。在較佳實施例中,模電路70還接收寄存器環(huán)繞值,如果來自加法器68的輸出信號(邏輯寄存器引用與基指針值之和)超過寄存器環(huán)繞值,結(jié)果將環(huán)繞回到重新映射區(qū)的底部。然后將模電路70的輸出提供給多路復(fù)用器72。
將寄存器計數(shù)(REGCOUNT)值提供給重新映射塊56內(nèi)的邏輯74,標(biāo)識組中要重新映射的寄存器的數(shù)目。邏輯74將這一寄存器計數(shù)值與邏輯寄存器引用比較,并根據(jù)比較結(jié)果將控制信號傳遞給多路復(fù)用器72。多路復(fù)用器72作為其兩個輸入接收邏輯寄存器引用及模電路70的輸出(重新映射的寄存器引用)。本發(fā)明的較佳實施例中,如果邏輯寄存器引用小于寄存器計數(shù)值,邏輯74便指令多路復(fù)用器72輸出重新映射的寄存器引用作為物理寄存器引用。然而,如果邏輯寄存器引用大于或等于寄存器計數(shù)值,邏輯74便指令多路復(fù)用器直接輸出邏輯寄存器引用作為物理寄存器引用。
如上所述,在較佳實施例中,重復(fù)指令調(diào)用重新映射機(jī)制。如稍后要詳細(xì)討論的,重復(fù)指令在硬件中提供四個零周期循環(huán)。這些硬件循環(huán)作為指令解碼器50的一部分示出在圖5中。每一次指令解碼器50請求來自高速緩沖存儲器6的指令時,高速緩沖存儲器便將該指令返回給指令解碼器,此時指令解碼器判定返回的指令是否是重復(fù)指令。如果是,便配置硬件循環(huán)之一來處理該重復(fù)指令。
各重復(fù)指令指定循環(huán)中的指令數(shù)及環(huán)繞循環(huán)的次數(shù)(它是常量或讀自Piccolo寄存器)。提供了兩個操作碼‘重復(fù)’(REPEAT)及下一個(NEXT)來定義硬件循環(huán),‘下一個’操作碼只用作分界符并不匯編成指令。重復(fù)從循環(huán)的起點(diǎn)開始,而‘下一個’界定循環(huán)的結(jié)束,允許匯編程序計算循環(huán)體中的指令數(shù)。在較佳實施例中,重復(fù)指令可包含要由寄存器重新映射邏輯52使用的諸如寄存器計數(shù)(REGCOUNT)、基增量(BASEINC)、基環(huán)繞(BASEWRAP)及寄存器環(huán)繞(REGWRAP)參數(shù)等重新映射參數(shù)。
可設(shè)置若干寄存器來存儲寄存器重新映射邏輯所使用的重新映射參數(shù)。在這些寄存器內(nèi),可提供若干組預(yù)定義的重新映射參數(shù),同時保留一些寄存器供存儲用戶定義的重新映射參數(shù)。如果用重復(fù)指令指定的重新映射參數(shù)等于預(yù)定義的重新映射參數(shù)組之一,則采用適當(dāng)?shù)闹貜?fù)編碼,這一編碼導(dǎo)致多路復(fù)用器之類將適當(dāng)?shù)闹匦掠成鋮?shù)直接從寄存器提供給寄存器重新映射邏輯。反之,如果重新映射參數(shù)與任何預(yù)定義的重新映射參數(shù)組都不同,則匯編程序生成重新映射參數(shù)傳送指令(RMOV),它允許配置用戶定義的寄存器重新映射參數(shù),RMOV指令后面是重復(fù)指令。最好RMOV指令將用戶定義的重新映射指令放置在為存儲這種用戶定義的重新映射參數(shù)留出的寄存器中,然后將多路復(fù)用器編程為將這些寄存器的內(nèi)容傳遞給寄存器重新映射邏輯。
在較佳實施例中,寄存器計數(shù)、基增量、基環(huán)繞及寄存器環(huán)繞參數(shù)取下表中確定的值之一
參見圖6,重新映射塊56如何使用各種參數(shù)的示例如下(在本例中,邏輯與物理寄存器值是相對于特定組的)if(邏輯寄存器<REGCOUNT)物理寄存器=(邏輯寄存器+基)MOD REGCOUNTelse物理寄存器=邏輯寄存器end if在循環(huán)結(jié)束處,在循環(huán)的下一次重復(fù)開始前,基更新邏輯58執(zhí)行對基指針的下述更新基=(基+BASEINC)MOD BASEWRAP在重新映射循環(huán)結(jié)束處,關(guān)閉寄存器重新映射,然后作為物理寄存器存取所有寄存器。較佳實施例中,任何一個時間上只有一個重新映射REPEAT(重復(fù))是活躍的。循環(huán)還可嵌套,但在任何特定時刻只有一個循環(huán)能更新重新映射變量。然而如果需要,可以嵌套重新映射重復(fù)。
為了展示作為采用按照本發(fā)明的較佳實施例的重新映射機(jī)制的結(jié)果所達(dá)到的關(guān)于代碼密度的好處,下面討論典型的塊過濾算法。首先參照圖7討論阻塞過濾器算法的原理。如圖7中所示,將累加器寄存器A0配置成累加若干次乘法運(yùn)算的結(jié)果,乘法運(yùn)算為系數(shù)C0乘以數(shù)據(jù)項d0的乘法,系數(shù)c1乘以數(shù)據(jù)項d1的乘法,系數(shù)c2乘以數(shù)據(jù)項d2的乘法等。寄存器A1累加類似的乘法運(yùn)算組的結(jié)果,但這時系數(shù)集合已移位使得c0現(xiàn)在乘以d1,c1乘以d2,c2乘以d3等。類似地,寄存器A2累加數(shù)據(jù)值乘以又向右移位一步的系數(shù)值的結(jié)果,使得c0乘以d2,c1乘以d3,c2乘以d4等。然后重復(fù)這一移位、乘及累加進(jìn)程,將結(jié)果放在寄存器A3中。
如果不采用按照本發(fā)明的較佳實施例的寄存器重新映射,則需要下面的指令循環(huán)來執(zhí)行塊過濾指令;以4個新數(shù)據(jù)值開始ZERO{A0-A3} ;清零累加器REPEAT Z1; Z1=(系數(shù)個數(shù)/4);在第一輪進(jìn)行下面四個系數(shù)<pre listing-type="program-listing"><![CDATA[;a0+=d0*c0+d1*c1+d2*c2+d3*c3;a1+=d1*c0+d2*c1+d3*c2+d4*c3;a2+=d2*c0+d3*c1+d4*c2+d5*c3;a3+=d3*c0+d4*c1+d5*c2+d6*c3MULAA0,X0.1^,Y0.l,A0; a0+=d0*c0,及加載d4MULAA1,X0.h,Y0.l,A1 ;a1+=d1*d0MULAA2, X1.l, Y0.l, A2 ;a2+=d2*c0MULAA3, X1.h, Y0.l^, A3 ;a3+=d3*c0,及加載c4MULAA0, X0.h^, Y0.h, A0 ;a0+=d1*c1,及加載d5MULAA1, X1.l, Y0.h, A1 ;a1+=d2*c1MULAA2, X1.h, Y0.h, A2 ;a2+=d3*c1MULAA3, X0.l, Y0.h^, A3 ;a3+=d4*C1,及加載C5MULAA0, X1.l^, Y1.l, A0 ;a0+=d2*c2,及加載d6MULAA1, X1.h, Y1.l, A1 ;a1+=d3*c2MULAA2, X0.l, Y1.l, A2 ;a2+=d4*c2MULAA3, X0.h, Y1.l^, A3 ;a3+=d5*c2,及加載c6MULAA0, X1.h^, Y1.h, A0 ;a0+=d3*c3,及加載d7MULAA1, X0.l, Y1.h, A1 ;a1+=d4*c3MULAA2, X0.h, Y1.h, A2 ;a2+=d5*c3MULAA3, X1.l, Y1.h^, A3 ;a3+=d6*c3,及加載c7NEXT]]></pre>
在本例中,將數(shù)據(jù)值放在X寄存器組中而將系數(shù)值放在Y寄存器組中。作為第一步,將四個累加器寄存器A0、A1、A2與A3設(shè)置為零。一旦復(fù)位了累加器寄存器,便進(jìn)入指令循環(huán),該循環(huán)是用‘重復(fù)’(REPEAT)及‘下一個’(NEXT)指令定界的。值Z1確定指令循環(huán)應(yīng)重復(fù)的次數(shù),為了下面將要討論的原因,它實際上等于系數(shù)(c0,c1,c2等)的個數(shù)除以4。
指令循環(huán)包括16條乘累加指令(MULA),在第一次通過循環(huán)之后這些提令將導(dǎo)致在寄存器A0,A1,A2,A3中包含上述重復(fù)與第一條MULA指令之間的代碼中所示的計算結(jié)果。為了說明乘累加指令如何操作,我們將考慮前四條MULA指令。第一條指令將X組寄存器0的第一或低16位的數(shù)據(jù)值乘以Y組寄存器0中的低16位,并將結(jié)果加到累加器寄存器A0中。同時用再填充位標(biāo)記X組寄存器0的低16位,這指示該寄存器的該部分現(xiàn)在可用新數(shù)據(jù)值再填充。以這一方式標(biāo)記是因為從圖7中可看出,一旦將數(shù)據(jù)項d0乘以系數(shù)c0(由第一條MULA指令表示),對于其余塊過濾指令d0便不再需要,因此能用新數(shù)據(jù)值取代。
然后第二條MULA指令將X組寄存器0的第二或高16位乘以Y組寄存器0的低16位(這表示圖7中所示的乘法d1×c0)。類似地,第三與第四條MULA指令分別表示乘法d2×c0及d3×c0。從圖7中可見,一旦執(zhí)行過這四個計算,系數(shù)c0便不再需要,因此用再填充位標(biāo)記寄存器Y0.l使它能用另一系數(shù)(c4)改寫。
下面四條MULA指令分別表示計算d1×c1、d2×c1、d3×c1與d4×c1。一旦執(zhí)行過d1×c1,便用再填充位標(biāo)記寄存器x0.h,因為不再需要d1。類似地,一旦執(zhí)行過全部四條指令,便將寄存器Y0.h標(biāo)記為供再填充,因為不再需要系數(shù)c1。類似地,下面四條MULA指令對應(yīng)于計算d2×c2、d3×c2、d4×c2及d5×c2,而最后四條指令則對應(yīng)于計算d3×c3、d4×c3、d5×c3及d6×c3。
在上述實施例中,由于寄存器是不能重新映射的,各乘法運(yùn)算必須用操作數(shù)中指定的所需特定寄存器明顯地再生。一旦執(zhí)行過16條MULA指令,便能為系數(shù)c4至c7及數(shù)據(jù)項d4至d10重復(fù)這一指令循環(huán)。并且由于每一次重復(fù)該循環(huán)在四個系數(shù)值上操作。所以系數(shù)值的數(shù)目必須是4的倍數(shù)并必須計算Z1=系數(shù)數(shù)/4。
通過采用按照本發(fā)明的較佳實施例的重新映射機(jī)制,可以極大地縮小指令循環(huán),使得它只包含4條乘累加指令而不是否則所需要的16條乘累加指令。采用重新映射機(jī)制,將代碼編寫成如下所列;以4個新數(shù)據(jù)值開始ZERO{A0-A3} 清零累加器REPEAT z1,X++n4 w4 r4,Y++n4 w4 r4;Z1=〔系數(shù)的個數(shù)};對X與Y組進(jìn)行重新映射;重新映射這些組中四個16位寄存器;在循環(huán)的每一次重復(fù)上將兩組的基指針遞增。
;當(dāng)基指針到達(dá)該組中第四個寄存器時便繞回。
<pre listing-type="program-listing"><![CDATA[MULAA0, X0.l^, Y0.l, A0 ;a0+=d0*c0,及加載d4MULAA1, X0.h, Y0.l. A1 ;a1+=d1*c0MULAA2, X1.l, Y0.l, A2 ;a2+=d2*c0MULAA3, X1.h, Y0.l^, A3 ;a3+=d3*c0,及加載c4NEXT ;繞回到循環(huán)并進(jìn)行重新映射]]></pre>
如上所述,第一步將四個累加器寄存器A0-A3設(shè)置成0。然后進(jìn)入用‘重復(fù)’與‘下一個’操作碼定界的指令循環(huán)。重復(fù)指令擁有與之關(guān)聯(lián)的若干參數(shù),它們是X++指示對于X寄存器組基增量為“1”。
n4指示寄存器計數(shù)為“4”,因此要重新映射前四個X組寄存器X0.l至X1.hw4指示對于X寄存器組基環(huán)繞為“4”r4指示對于X寄存器組寄存器環(huán)繞為“4”Y++指示對于Y寄存器組基增量為“1”n4指示寄存器計數(shù)為“4”因此要重新映射前4個Y組寄存器Y0.l至Y1.h。
w4指示對于Y寄存器組基環(huán)繞為“4”r4指示對于Y寄存器組寄存器環(huán)繞為“4”還應(yīng)指出,現(xiàn)在值Z1等于系數(shù)數(shù)目而不是先有技術(shù)示例中等于系數(shù)數(shù)目/4。
對于指令循環(huán)的第一次循環(huán),基指針值為0,因此無重新映射。然而下一次執(zhí)行循環(huán)時,對于X與Y組基指針值都將是“1”,因此將操作數(shù)重新映射如下X0.l成為X0.hX0.h成為X1.lX1.l成為X1.hX1.h成為X0.l(由于基環(huán)繞為“4”)Y0.l成為Y0.hY0.h成為Y1.lY1.l成為Y1.hY1.h成為Y0.l(由于基環(huán)繞為“4”)因此,在第二次重復(fù)時可看出,四條MULA指令實際上執(zhí)行較早討論的不包含本發(fā)明的重新映射的示例中用第五至第八條MULA指令所指示的計算。類似地,第三與第四次重復(fù)通過循環(huán)執(zhí)行前面用先有技術(shù)代碼的第九至第12及第13至第16條MULA指令執(zhí)行的計算。
因此可以看出上述代碼執(zhí)行與先有技術(shù)代碼完全相同的塊過濾算法,但將循環(huán)體內(nèi)的代碼密度改進(jìn)了一個因子4,由于只需要提供4條指令而不是先有技術(shù)所需的16條。
通過采用按照本發(fā)明的較佳實施例的寄存器重新映射技術(shù),能實現(xiàn)下述優(yōu)點(diǎn)1.改進(jìn)代碼密度;2.在一定場合中隱藏從標(biāo)記寄存器為空到Piccolo的重定序緩沖器再填充該寄存器的等待時間。這可以以增加代碼大小的代價通過解開循環(huán)來達(dá)到。
3.能存取可變數(shù)目的寄存器-通過改變執(zhí)行的循環(huán)重復(fù)次數(shù),可改變存取的寄存器數(shù)目;以及4.便于算法展開。對于適當(dāng)?shù)乃惴?,程序員可為算法的第n階段生成一段代碼,然后利用寄存器重新映射將公式應(yīng)用在一個滑動數(shù)據(jù)組上。
很明顯可以不脫離本發(fā)明的范圍對上述寄存器重新映射機(jī)制作出某些改變。例如,有可能為寄存器組10提供比程序員在指令操作數(shù)中所能指定的更多的物理寄存器。這些額外的寄存器不能直接存取,而寄存器重新映射機(jī)制能利用這些寄存器。例如,考慮早先討論的X寄存器組具有程序員可利用的4個32位寄存器并因而可用邏輯寄存器引用指定8個16位寄存器的示例。有可能使X寄存器組實際上包含例如6個32位寄存器,在這一情況中將有4個附加的16位寄存器不能由程序員直接存取。然而,這四個額外的寄存器能被重新映射機(jī)制利用,借此為存儲數(shù)據(jù)項提供附加的寄存器。
可使用以下的匯編程序語法>>表示邏輯右移,或者在移位操作數(shù)為負(fù)時左移(見下面<lscale>)。
->>表示算術(shù)右移,或者在移位操作數(shù)為負(fù)時左移(見下面<scale>)。
ROR表示循環(huán)右移SAT(a)表示a的飽和值(取決于目的地寄存器的大小飽和到16或32位)。具體地,為了飽和到16位,任何大于+0x7fff的值用+0x7fff代替,而任何小于-0x8000的值則用-0x8000代替。類似地飽和到32位用極限+0x7fffffff與-0x80000000。如果目的地寄存器為48位,飽和仍然在32位上。
源操作數(shù)1可用下述格式之-<Src1>將用作[Rn|Rn.l|Rn.h|Rn.x][^]的簡寫。換言之,源說明符的所有7位都有效,并作為(可選擇地互換的)32位值或16位符號擴(kuò)展的值讀取寄存器。對于累加器只讀取底部32位。^指示寄存器再填充。
<src1-16>是[Rn.l|Rn.h][^]的簡寫。只能讀取16位值。
<src1_32>是[Rn|Rn.X][^]的簡寫。只能讀取32位值,高與低一半有選擇地互換。
<src_2>(源操作數(shù)2)可以是下述格式之一<src2>是三種選項的簡寫-形式[Rn|Rn.l|Rn.h|Rn.x][^]的源寄存器,加上最終結(jié)果的標(biāo)度(<scale>)。
-可選擇的移位的8位常量(<immed_8>),但無最終結(jié)果的標(biāo)度。
-6位常量(<immed_6>)加上最終結(jié)果的標(biāo)度(<scale>)。
<src2_maxmin>與<src2>相同但不允許定標(biāo)。
<src2_shift>提供<src2>的有限子集的移位指令。見上述詳細(xì)情況。
<src2_par>在<src2_shift>方面對于指定第三操作數(shù)的指令<acc>四個累加器寄存器[A0|A1|A2|A3]中任何一個的簡寫。讀取全部48位。不能指定再填充。
目的地寄存器具有格式<dest>它是[Rn|Rn.l|Rn.h|.l|][^]的簡寫。不帶“.”擴(kuò)展寫入整個寄存器(在累加器情況中為48位)。在不需要寫回到寄存器的情況中,所使用的寄存器是不重要的。匯編程序支持省略目的地寄存器來指示不需要寫回,或用“.l”來指示不需要寫回,但應(yīng)設(shè)置標(biāo)志,猶如結(jié)果為16位量。^表示將值寫到輸出FIFO中。
<scale>表示若干算術(shù)標(biāo)度??梢岳玫挠?4種標(biāo)度ASR#0,1,2,3,4,6,8,10ASR#12至16LSL#1
<immed-8>代表不帶符號的8位立即值。這包含循環(huán)左移0,8,16或24的一個字節(jié)。因此能為任何YZ編碼值0xYZ000000、0x00YZ0000、0x0000YZ00、及0x000000YZ。循環(huán)是作為2位的量編碼的。
<imm_6>代表不帶符號的6位立即數(shù)。
<PARAMS>用來指定寄存器重新映射并具有下述格式<BANK><BASEINC>n<RENUMBER>w<BASEWRAP>
<BANK> 可以是[X|Y|Z]<BASEINC>可以是[++|+1|+2|+4]<RENUMBER> 可以是
<BASEWRAP> 可以是[2|4|8]表達(dá)式<cond>為下述狀態(tài)碼中任何一種。注意編碼與ARM稍有不同,因為不帶符號的LS與HI碼已被更有用的帶符號的上溢/下溢測試所替代。Piccolo上的V與N標(biāo)志的設(shè)置與ARM的不同,因此從狀態(tài)測試到標(biāo)志檢驗的翻譯與ARM也不同。
0000 EQZ=0上一次結(jié)果為0。
0001 NEZ=1上一次結(jié)果非0。
0010 CSC=1在移位/最大操作后使用。
0011 CCC=00100 MI/LT N=1上一次結(jié)果為負(fù)0101 PL/GE N=0上一次結(jié)果為正0110 VSV=1上一次結(jié)果帶符號溢出/飽和0111 VCV=0上一次結(jié)果無溢出/飽和1000 VPV=1&N=0上一次結(jié)果正溢出1001 VNV=1&N=1上一次結(jié)果負(fù)溢出1010 保留1011 保留1100 GTN=0&Z=01101 LEN=1|Z=11110 AL1111 保留由于Piccolo處理帶符號的量,棄掉不帶符號的LS與HI狀態(tài)而用描述任何溢出的方向的VP與VN來代替。由于ALU的結(jié)果為48位寬,MI與LT現(xiàn)在執(zhí)行相同功能,類似地PL與GE。這留下3個空槽供未來擴(kuò)展。
除非另有說明,所有運(yùn)算都是帶符號的。
一級與二級狀態(tài)碼各包含N-負(fù)。
Z-零。
C-進(jìn)位/不帶符號溢出。
V-帶符號溢出。
算術(shù)指令可分成兩類并行與“全寬度”?!叭珜挾取敝噶钪辉O(shè)置一級標(biāo)志,而并行運(yùn)算符根據(jù)結(jié)果的高與低16位一半設(shè)置一級與二級標(biāo)志。
在已施加定標(biāo)但寫到目的地之前,N、Z與V標(biāo)志是根據(jù)整個ALU結(jié)果計算的。ASR將總是減少存儲結(jié)果所需位數(shù),而ASL則增加位數(shù)。為了防止在施加ASL定標(biāo)時Piccolo截尾48位結(jié)果,將位數(shù)限制在必須進(jìn)行零檢測與溢出上。
N標(biāo)志是假設(shè)正在進(jìn)行帶符號算術(shù)運(yùn)算時計算的。這是因為在發(fā)生溢出時,結(jié)果的最高位是C標(biāo)志或N標(biāo)志之一,這取決于輸入操作數(shù)是帶符號還是不帶符號。
V標(biāo)志指示作為將結(jié)果寫到選擇的目的地的結(jié)果是否出現(xiàn)任何精度損失。如果選擇了不寫回,仍然蘊(yùn)含‘大小’,并正確地設(shè)置溢出標(biāo)志。在下述情況中出現(xiàn)溢出-當(dāng)結(jié)果不在范圍-2^15至2^15-1中時寫入16位寄存器。
-當(dāng)結(jié)果不在范圍-2^31至2^31-1中時寫入32位寄存器。
并行加/減指令在結(jié)果的高與低一半上獨(dú)立地設(shè)置N、Z與V標(biāo)志。
當(dāng)寫入累加器時和寫入32位寄存器一樣設(shè)置V標(biāo)志。這是允許飽和指令使用累加器作為32位寄存器。
飽和絕對值指令(SABS)在輸入操作數(shù)的絕對值不符合指定的目的地時也設(shè)置溢出標(biāo)志。
進(jìn)位標(biāo)志由加與減指令設(shè)置并由MAX/MIN、SABS及CLB指令用作‘二進(jìn)制’標(biāo)志。包含乘法運(yùn)算在內(nèi)的所有其它指令保留進(jìn)位標(biāo)志。
對于加與減運(yùn)算,根據(jù)目的地是32還是16位寬,進(jìn)位便是由位31或位15或結(jié)果生成的。
根據(jù)如何設(shè)置標(biāo)志,可將標(biāo)準(zhǔn)算術(shù)指令分成若干類型在加與減指令的情況中,如果N位是置位的則保持所有標(biāo)志。如果N位不置位則將標(biāo)志更新如下如果全48位結(jié)果為0便置位Z。
如果全48位結(jié)果中位47置位(是負(fù)的)則置位N。
如果下述條件之一成立則置位V目的地寄存器為16位而帶符號的結(jié)果放不進(jìn)16位寄存器中(不在范圍-2^15<=x<2^15內(nèi))。
目的地寄存器為32/48位寄存器而帶符號的結(jié)果放不進(jìn)32位中。
如果在求和<src1>與<src2>時從位31有進(jìn)位或者從<src1>減去<src2>時位31不出現(xiàn)借位,則如果<dest>為32或48位寄存器時便置位C標(biāo)志(與ARM上的所期望的相同進(jìn)位值)。如果<dest>為16位寄存器,則如果和的位31進(jìn)位便置位C標(biāo)志。
保留二級標(biāo)志(SZ、SN、SV、SC)。
在從48位寄存器執(zhí)行乘法或累加指令的情況中。
如果全48位結(jié)果為0便置位Z。
如果全48位結(jié)果中位47置位(是負(fù)的),則置位N。
如果(1)目的地寄存器為16位而帶符號的結(jié)果放不進(jìn)16位寄存器(不在范圍-2^15<=x<2^15內(nèi))或(2)目的地寄存器為32/48位寄存器而帶符號的結(jié)果放不進(jìn)32位中,便置位V。
保留C。
保留二級標(biāo)志(SZ、SN、SV、SC)。
下面討論包含邏輯運(yùn)算、并行加與減、最大與最小、移位等在內(nèi)的其它指令。
加與減指令將兩個寄存器相加或相減,定標(biāo)該結(jié)果,然后存儲回到一個寄存器。將操作數(shù)作為帶符號的值對待。對于非飽和變型,標(biāo)志更新是供選用的,并可通過在指令尾部附加一個N來抑制標(biāo)志更新。
OPC指定指令的類型操作(OPC)<pre listing-type="program-listing"><![CDATA[100N0dest=(src1+src2)(->>scale)(,N)110N0dest=(src1-src2)(->>scale)(,N)10001dest=SAT((src1+src2)(->>scale))11001dest=SAT((src1-src2)(->>scale))01110dest=(src2-src1)(->>scale)01111dest=SAT((src2-src1)(->>scale))101N0dest=(src1+src2+Carry)(->>scale)(,N)111N0dest=(src1-src2+Carry-1)(->>scale)(,N)]]></pre>助記符<pre listing-type="program-listing"><![CDATA[100N0ADD{N} <dest>,<src1>,<src2>{,<scale>}110N0SUB{N} <dest>,<src1>,<src2>{,<scale>}10001SADD <dest>,<src1>,<src2>{,<scale>}11001SSUB <dest>,<src1>,<src2>{,<scale>}01110RSB<dest>,<src1>,<src2>{,<scale>}01111SRSB <dest>,<src1>,<src2>{,<scale>)101N0ADC{N} <dest>,<src1>,<src2>{,<scale>}111N0SBC{N} <dest>,<src1>,<src2>{,<scale>}]]></pre>匯編程序支持下述操作碼<pre listing-type="program-listing"><![CDATA[CMP<src1>,<src2>,CMN<src1>,<src2>,]]></pre>CMP為減法,它設(shè)置標(biāo)志并禁止寄存器寫。CMN為加法,它設(shè)置標(biāo)志并禁止寄存器寫。
標(biāo)志上面已討論過。
包含的理由在移位/最大/最小操作之后將進(jìn)位插入寄存器底部ADC是有用的。它也用來進(jìn)行32/32位除法。它也提供擴(kuò)充精度加法。N位加法給出更精密的標(biāo)志控制,特別是進(jìn)位。這使得32/32位除法能在每位2個周期上進(jìn)行。
G.729等需要飽和的加與減。
增量/減量計數(shù)器。RSB對于計算移位是有用的(x=32-x是常用運(yùn)算)。對于飽和的求反(用在G.729中)需要飽和的RSB。
加/減累計指令執(zhí)行帶累計與定標(biāo)/飽和的加法與減法。與乘累加指令不同,不能獨(dú)立于目的地寄存器指定累加器號。目的地寄存器的底部兩位給出要累計到其中的48位累加器號acc。因此ADDA X0,X1,X2,A0與ADDA A3,X1,X2,A3是有效的,而ADDA X1,X1,X2,A0則無效。對于這類指令,必須將結(jié)果寫回寄存器-不允許目的地字段的不寫回編碼。31 30 29 28 27 26 25 24 23 22 21 201918 17 16 15 14 1312 11 10 9 8 7 6 5 4 3 2 1 0<
OPC指定指令的類型。下面的acc為(DEST[1:0])。Sa位指示飽和。
操作(OPC)<pre listing-type="program-listing"><![CDATA
]></pre>助記符<pre listing-type="program-listing"><![CDATA
]></pre>命令前面的S表示飽和。
標(biāo)志見上面。
包含的理由ADDA(加累計)指令對于用累加器每一周期求和整數(shù)數(shù)組的兩個字是有用的(例如找出它們的平均值)。SUBA(減累計)指令在計算差之和(用于相關(guān))中是有用的;它將兩個獨(dú)立的值相減并將差加到第三寄存器中。
帶四舍五入的加法可用與<acc>不同的<dest>進(jìn)行。例如,X0=(X1+X2+16384)>>15可通過將16384保持在A0中而在一個周期中完成。帶四舍五入的常量的加法可用ADDA X0,X1,#16384,A0來完成。
對于((a_i*b_j)>>k)之和(在TrueSpeech中相當(dāng)常用)的位精確實現(xiàn)標(biāo)準(zhǔn)Piccolo代碼為<pre listing-type="program-listing"><![CDATA[MUL t1,a_0,b_0,ASR#KADD ans,ans,t1MUL t2,a_1,b_1,ASR#kADD ans,ans,t2]]></pre>這一代碼有兩個問題它太長以及不是加到48位精度,因此不能用保護(hù)位。較好的解決方法為使用ADDA<pre listing-type="program-listing"><![CDATA[MUL t1,a_0,b_0,ASR#kMUL t2,a_1,b_1,ASR#kADDA ans,t1,t2,ans]]></pre>這提高25%速度并保持48位精度。
并行加/減指令在成對保持在32位寄存器中的兩個帶符號的16位量上執(zhí)行加法與減法。一級狀態(tài)碼標(biāo)志從高16位的結(jié)果設(shè)置,而二級標(biāo)志則從低位一半更新。只能指定32位寄存器作為這些指令的源,雖然這些值是可以半字互換的。將各寄存器的各個一半作為帶符號的值對待。計算與定標(biāo)是不損失精度完成的。因此ADD ADD X0,X1,X2,ASR#1將在X0的高位與低位一半中產(chǎn)生正確的平均值。為必須置位Sa位的各指令提供了選用的飽和。
OPC定義操作操作(OPC)<pre listing-type="program-listing"><![CDATA
]></pre>如果置位了Sa位,各和/差是獨(dú)立飽和的。
助記符<pre listing-type="program-listing"><![CDATA
]></pre>命令前的S表示飽和。
匯編程序還支持<pre listing-type="program-listing"><![CDATA[CMNCMN <dest>,<src1_32>,<src2_32>{,<scale>}CMNCMP <dest>,<src1_32>,<src2_32>{,<scale>}CMPCMN <dest>,<src1_32>,<src2_32>{,<scale>}CMPCMP <dest>,<src1_32>,<src2_32>{,<scale>}]]></pre>它們是不帶寫回的標(biāo)準(zhǔn)指令生成的。
標(biāo)志C如果在相加兩個高16位一半時從位15進(jìn)位,便置位。
Z如果高16位一半之和為0,便置位。
N如果高16位一半之和為負(fù),便置位。
V如果高16位一半的帶符號的17位和不能裝入16位中(定標(biāo)后),便置位。
類似地為低16位一半置位SZ、SN、SV與SC。
包含的理由并行加與減指令對于在保持在單個32位寄存器中的復(fù)數(shù)上執(zhí)行運(yùn)算是有用的。它們用在FFT(快速傅里葉變換)核心中。它對于16位數(shù)據(jù)的簡單矢量加法/減法也是有用的,允許在一個周期中處理兩個元素。
轉(zhuǎn)移(條件)指令允許控制流中的條件改變。Piccolo占用三個周期來執(zhí)行所取的轉(zhuǎn)移。
操作如果根據(jù)一級標(biāo)志<cond>成立,用偏移量轉(zhuǎn)移。
偏移量為帶符號的16位字?jǐn)?shù)。當(dāng)前偏移的范圍限制在-32768至+32767個字。
執(zhí)行的地址計算是目標(biāo)地址=轉(zhuǎn)移指令地址+4+偏移量助記符B<cond><destination label>
標(biāo)志不受影響。
包含的理由在大多數(shù)例程中高度有用。
條件加或減指令有條件地將src1加在src2上或從src1中減去src2。31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0<
OPC指定指令的類型。
操作(OPC)如果(進(jìn)位置位)temp=src1-src2否則temp=src1+src2dest=temp{->>scale}如果(進(jìn)位置位)temp=src1-src2否則temp=src1+src2dest=temp{->>scale}但是如果定標(biāo)是左移位則將(來自src1-src2或src1+src2的)進(jìn)位的新值移位進(jìn)底部中。
助記符<pre listing-type="program-listing"><![CDATA
]></pre>標(biāo)志見上面包含的理由條件加或減指令使高效除法代碼能構(gòu)成。
例1將X0中的32位不帶符號值除以X1中的16位不帶符號值(假設(shè)X0<(X1<<16)及X1.h=0)。
LSL X1,X1,#15 ;上移除數(shù)SUB X1,X1,#0 ;置位進(jìn)位標(biāo)志REPEAT #16CASC X0,X0,X1,LSL#1NEXT在循環(huán)末尾,X0.l保持除法的商。取決于進(jìn)位的值可從X0.h恢復(fù)余數(shù)。
例2將X0中的32位正值除以X1中的32位正值,帶早結(jié)束。
MOVX2,#0 ;清除商LOGZ0,X0 ;X0可移位的位數(shù)LOGZ1,X1 ;X1可移位的位數(shù)SUBS Z0,Z1,Z0;X1向上移位因此1匹配BLTdiv_end ;X1>X0因此答數(shù)為0LSLX1,X1,Z0;匹配前面的1ADDZ0,Z0,#1;進(jìn)行的測試數(shù)SUBS Z0,Z0,#0;置位進(jìn)位REPEAT Z0CASX0,X0,X1,LSL#1ADCN X2,X2,X2NEXTdiv_end在結(jié)束處,X2保持商而余數(shù)可從X0恢復(fù)。
計數(shù)前導(dǎo)位指令使數(shù)據(jù)能正規(guī)化。31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
>操作將dest設(shè)定為為了使位31與位30不同而src1中的值必須左移的位數(shù)。這是范圍0-30中的一個值,但除外src1為-1或0的特殊情況,這時返回31。
助記符CLB<dest>,<src1>
標(biāo)志Z如果結(jié)果為0,便置位。
N是消除的。
C如果src1為-1或0之一,便置位。
V保持。
包含的理由正規(guī)化需要的步驟。
設(shè)置了停止與斷點(diǎn)指令用于停止Piccolo的執(zhí)行
OPC指定指令的類型。
操作(OPC)0 Piccolo執(zhí)行被停止并在Piccolo狀態(tài)寄存器中置位停止位。
1 Piccolo執(zhí)行停止,并在Piccolo狀態(tài)寄存器中置位中斷位,并中斷ARM報告已到達(dá)斷點(diǎn)。
助記符0 HALT1 BREAK標(biāo)志不受影響。
邏輯運(yùn)算指令在32或16位寄存器上執(zhí)行邏輯運(yùn)算。將操作數(shù)作為不帶符號值對待。
OPC編碼要執(zhí)行的邏輯運(yùn)算操作(OPC)<pre listing-type="program-listing"><![CDATA
]></pre>助記符<pre listing-type="program-listing"><![CDATA
]></pre>匯編程序支持下述操作碼。
<pre listing-type="program-listing"><![CDATA[TST<src1>,<src2>TEQ<src1>,<src2>]]></pre>
TST為禁止寄存器寫的“與”。TEQ為禁止寄存器寫的“EOR”。
標(biāo)志Z 如果結(jié)果為全0,便置位N、C、V 保持SZ、SN、SC、SV保持包含的理由話音壓縮算法采用組合位字段來編碼信息。位屏蔽指令協(xié)助抽取/組合這些字段。
Max與Min操作指令執(zhí)行最大與最小值運(yùn)算。31 30 29 28 27 26 25 24 23 22 21 2019 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
OPC指定指令的類型。操作(OPC)<pre listing-type="program-listing"><![CDATA
]></pre>助記符<pre listing-type="program-listing"><![CDATA
]></pre>標(biāo)志Z如果結(jié)果為0,便置位。
N如果結(jié)果為負(fù),便置位。
C對于Max如果src2>=src1(dest=src1情況),置位C對于Min如果src2>=src1(dest=src2情況),置位CV保持包含的理由為了找出信號強(qiáng)度,許多算法掃描樣本來找出樣本的絕對值的最大/最小值。對此,MAX與MIN是無價之寶。取決于要找出信號中第一還是最后的最大值,操作數(shù)src1與src2可以互換。
MAX X0,X0,#0將X0轉(zhuǎn)換成從下面修剪掉的正數(shù)。
MIN X0,X0,#255從上面修剪掉。這對于圖形處理有用。
并行指令中的Max與Min運(yùn)算在并行的16位數(shù)據(jù)上執(zhí)行最大值與最小值運(yùn)算。31 30 2928 27 26 25 24 23 22 212019 18 17 16 15 141312 11 10 9 8 7 6 5 4 3 2 1 0
OPC指定指令的類型。操作(OPC)<pre listing-type="program-listing"><![CDATA[O dest.l=(src1.l<=src2.l) src1.l:src2.ldest.h=(src1.h<=STe2.h) src1.h:Src2.hl dest.l=(sro1.l>src2.l) src1.l:src2.ldest.h=(src1.h>src2.h) src1.h:src2.h]]></pre>助記符<pre listing-type="program-listing"><![CDATA
]></pre>
標(biāo)志Z如果結(jié)果的高16位為0,便置位。
N如果結(jié)果的高16位為負(fù),便置位。
C對于Max如果src2.h>=src1.h(dest=src1情況),置位C對于Min如果src2.h=src1.h(dest=src2情況),置位C。
V保持。
SZ、SN、SC、SV類似地為低16位一半置位。
包含的理由關(guān)于32位Max及Min。
傳送長立即數(shù)操作指令允許將寄存器設(shè)置成任何帶符號的16位、符號延伸的值。兩條這種指令能將32位寄存器設(shè)置成任何值(通過順序存取高位與低位一半)。對于寄存器之間的傳送見選擇操作。
助記符<pre listing-type="program-listing"><![CDATA[MOV <dest>,#<imm_16>]]></pre>匯編程序利用MOV指令提供非互鎖的NOP(空操作)操作,即,NOP等效于MOV,#0。
標(biāo)志標(biāo)志不受影響。
包含的理由初始化寄存器/計數(shù)器。
乘累加運(yùn)算指令執(zhí)行帶符號乘法與累加或累減(de-accumulation),定標(biāo)與飽和。
字段OPC指定指令的類型。
操作(OPC)<pre listing-type="program-listing"><![CDATA
]></pre>在各情況中,如果置位了Sa位,在寫到目的地之前將結(jié)果飽和。
助記符<pre listing-type="program-listing"><![CDATA
]></pre>命令前的S指示飽和。
標(biāo)志見上節(jié)。
包含的理由對于FIR代碼需要單周期持續(xù)的MULA。MULS用在FFT蝶形電路中。對于帶四舍五入的乘法MULA也是有用的。例如通過將16384保持在另一累加器(例如A1)中可在一個周期中完成A0=(X0*X1+6384)>>15。對于FFT核心還需要不同的<dest>與<acc>。
乘雙倍運(yùn)算(Multiply Double Operation)指令執(zhí)行單符號乘法,在累加或累減、定標(biāo)與飽和之前將結(jié)果加倍。31 30 29 28 27 26 25 24 23 22 21 2019 18 17 16 15 141312 1110 9 8 7 6 5 4 3 2 1 0
OPC指定指令的類型。操作(OPC)0 dest=SAT((acc+SAT(2*src1*src2)){->>scale})1 dest=SAT((acc-SAT(2*src1*src2)){->>scale})
助記符<pre listing-type="program-listing"><![CDATA
]></pre>標(biāo)志見上節(jié)。
包含的理由G.729及使用小數(shù)算術(shù)運(yùn)算的其它算法需要MLD指令。大多數(shù)DSP提供能在累加或?qū)懟刂霸诔朔ㄆ鞯妮敵錾献笠埔晃坏男?shù)模式。作為特定的指令支持它提供更大的編程靈活性。等價于某些G系列基本運(yùn)算的名稱為L_msu=>SMLDSL_mac=>SMLDA在左移一位時它們利用乘法器的飽和。如果需要一序列的小數(shù)乘累加而不損失精度,可采用MULA,其和保持在33.14格式中。必要時,可在結(jié)束時利用左移及飽和轉(zhuǎn)換到1.15格式。
乘法運(yùn)算指令執(zhí)行帶符號乘法,及選用的定標(biāo)/飽和。將源寄存器(只是16位)作為帶符號數(shù)對待。
OPC指定指令的類型。操作(OPC)<pre listing-type="program-listing"><![CDATA
]></pre>助記符
<pre listing-type="program-listing"><![CDATA
]></pre>標(biāo)志見上節(jié)。
包含的理由許多處理需要帶符號與飽和的乘法。
寄存器列表操作用來在一組寄存器上執(zhí)行操作。提供了空與零指令用于在例程之前或之間復(fù)位選擇的寄存器。提供了輸出指令將列出的寄存器的內(nèi)容存儲到輸出FIFO中。
OPC指定指令的類型。操作(OPC)000 對于(k=0;k<16;k++)如果置位了寄存器列表的位k,則將寄存器k標(biāo)記為空。001 對于(k=0;k<16;k++)如果置位了寄存器列表的位k,則將寄存器k設(shè)置成包含0。010 未定義011 未定義100 對于(k=0;k<16;k++)如果置位了寄存器列表的位k,則將(寄存器k->>scale)寫到輸出FIFO中。101 對于(k=0;k<16;k++)如果置位了寄存器列表的位k,則將(寄存器k->>scale)寫入到輸出FIFO中并將寄存器k標(biāo)記為空。110 對于(k=0;k<16;k++)如果置位了寄存器列表的位k,則將SAT(寄存器k->>scale)寫到輸出FIFO中。111 對于(k=0;k<16;k++)如果置位了寄存器列表的位k,則將SAT(寄存器k->>scale)寫到輸出FIFO中并將寄存器k標(biāo)記為空。
助記符<pre listing-type="program-listing"><![CDATA
]></pre>標(biāo)志不受影響示例EMPTY{A0,A1,X0-X3}ZERO {Y0-Y3}OUTPUT {X0-Y1}^匯編程序還支持語法<pre listing-type="program-listing"><![CDATA[OUTPUT Rn]]></pre>在這一情況中,利用MOV^,Rn指令輸出一個寄存器。EMPTY指令將停止直到所有要清空的寄存器包含有效數(shù)據(jù)
(即不空)。
寄存器列表操作不得在重新映射REPEAT(重復(fù))循環(huán)內(nèi)使用。
輸出(OUTPUT)指令最多只能指定輸出8個寄存器。
包含的理由例程結(jié)束后,下一個例程期望所有寄存器是空的以便它能從ARM接收數(shù)據(jù)。需要EMPTY指令來做到這一點(diǎn)。在執(zhí)行FIR或過濾器之前,需要將所有累加器及部分結(jié)果清零。ZERO(零)指令協(xié)助做到這一點(diǎn)。通過取代一系列單個寄存器傳送,兩者都設(shè)計成改善代碼密度。包含OUTPUT(輸出)指令通過取代一系列MOV^,Rn指令來改善代碼密度。
提供了重新映射參數(shù)傳送指令RMOV來允許配置用戶定義的寄存器重新映射參數(shù)。
該指令編碼如下
各PARAMS字段包含以下的項6 54 3 21 0
這些項的含義如下
助記符<pre listing-type="program-listing"><![CDATA[RMOV<PARAMS>,{<PARAMS>}]]></pre><PARAMS>字段具有以下格式;<pre listing-type="program-listing"><![CDATA[<PARAMS>∷=<BANK><BASEINC>n<RENUMBER>w<BASEWRAP><BANK> ∷=[X|Y|Z]<BASEINC> ∷=[++|+1|+2|+4]<RENUMBER>∷=
<BASEWRAP>∷=[2|4|8]]]></pre>如果使用RMOV指令同時重新映射是活動的,其行為是UNPREDICTABLE(不可預(yù)測)。
標(biāo)志不受影響重復(fù)指令提供硬件中的4個零周期循環(huán)。重復(fù)指令定義新的硬件循環(huán)。Piccolo為第一條重復(fù)指令利用硬件循環(huán)0,為嵌套在第一重復(fù)指令內(nèi)的重復(fù)指令利用硬件循環(huán)1等等。重復(fù)指令不需要指定正在使用哪一個循環(huán)。重復(fù)循環(huán)必須嚴(yán)格嵌套。如果試圖嵌套循環(huán)到大于4的深度,則行為是不可預(yù)測的。
各重復(fù)指令指定循環(huán)中的指令數(shù)(緊接在重復(fù)指令后面的)及通過循環(huán)的次數(shù)(它是常量或讀自Piccolo寄存器)。
如果循環(huán)中的指令數(shù)較少(1或2)則Piccolo可用額外周期來建立循環(huán)。
如果循環(huán)計數(shù)是寄存器指定的,則蘊(yùn)含32位存取(S1=1),但只認(rèn)為底部16位是有效的并且數(shù)字是不帶符號的。如果循環(huán)計數(shù)為0,則循環(huán)的操作是未定義的。采取循環(huán)計數(shù)的復(fù)制,因此立即可以重用該寄存器(甚至再填充)而不影響循環(huán)。
重復(fù)指令提供修改指定循環(huán)內(nèi)的寄存器操作數(shù)的方式的機(jī)制。細(xì)節(jié)上面已描述過。
帶有寄存器指定的循環(huán)數(shù)的重復(fù)的編碼31 30 29 28 2726 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0<
<p>帶固定的循環(huán)數(shù)的重復(fù)的編碼
RFIELD操作數(shù)指定在循環(huán)內(nèi)使用16種重新映射參數(shù)配置的哪一種。<
>匯編程序提供兩個操作碼REPEAT與NEXT來定義硬件循環(huán),REPEAT在循環(huán)開始時而NEXT界定循環(huán)的結(jié)束,允許匯編程序計算循環(huán)體內(nèi)的指令數(shù)。至于REPEAT,它只須作為常量或寄存器指定循環(huán)次數(shù)。例如<pre listing-type="program-listing"><![CDATA[REPEATX0MULA A0,Y0.l,Z0.l,A0MULA A0,Y0.h^,Z0.h^,A0NEXT]]></pre>這將執(zhí)行兩條MULA指令X0次。同時,<pre listing-type="program-listing"><![CDATA[REPEAT#10MULA A0,X0^,Y0^,A0NEXT]]></pre>將執(zhí)行10次乘累加。
匯編程序支持語法
REPEAT#iterations[,<PAPAMS>]以指定重復(fù)所用的重新映射參數(shù)。如果所需的重新映射參數(shù)等于預(yù)定義的參數(shù)組之一,則使用適當(dāng)?shù)腞EPEAT編碼。如果不是,則匯編程序?qū)⑸蒖MOV來加載用戶定義的參數(shù),后面跟隨REPEAT指令。見上面的節(jié)中的RMOV指令及重新映射參數(shù)格式的細(xì)節(jié)。
如果循環(huán)的重復(fù)次數(shù)為0則REPEAT的操作是不可預(yù)測的。
如果將指令字段的數(shù)字設(shè)置為0則REPEAT的操作是不可預(yù)測的。
循環(huán)只包含一條指令而該指令為轉(zhuǎn)移時,則具有不可預(yù)測的表現(xiàn)。
從REPEAT循環(huán)界內(nèi)轉(zhuǎn)移到該循環(huán)的界外是不可預(yù)測的。
飽和絕對值指令計算源1的飽和的絕對值。31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
操作dest=SAT((src1>=0) src1:-src1)。該值總是飽和的。具體地,0x80000000的絕對值為0x7fffffff而不是0x80000000!助記符<pre listing-type="program-listing"><![CDATA[SABS <dest>,<src1>]]></pre>標(biāo)志Z如果結(jié)果為0,便置位。
N保持。
C如果src1<0(dest=-src1情況),便置位。
V如果出現(xiàn)飽和,便置位。
包含的理由在許多DSP應(yīng)用中有用。
選擇操作(條件傳送)用來有條件地將源1或源2傳送到目的地寄存器中。選擇總是等效于傳送。還有在并行加/減以后使用的并行操作。
注意為了實現(xiàn)的原因,可讀取兩個源操作數(shù),如果其中之一為空,指令將停止,不管該操作數(shù)是否是嚴(yán)格需要的。31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 1312 11 10 9 8 7 6 5 4 3 2 1 0
OPC指定指令的類型。
操作(OPC)00 如果<cond>對一級標(biāo)志成立則dest=src1否則dest=src201 如果<cond>對一級標(biāo)志成立則dest.h=src1.h否則dest.h=src2.h如果<cond>對二極標(biāo)志成立則dest.l=src1.l否則dest.l=src2.l10 如果<cond>對一級標(biāo)志成立則dest.h=src1.h否則dest.h=src2.h如果<cond>對二級標(biāo)志成立則dest.l=src1.l否則dest.l=src2.l11 保留助記符<pre listing-type="program-listing"><![CDATA
]></pre>如果將寄存器標(biāo)記為再填充,無條件將其再填充。匯編程序還提供下列助記符
<pre listing-type="program-listing"><![CDATA[MOV<cond><dest>,<src1>SELFT<cond> <dest>,<src1>,<src2>SELFF<cond> <dest>,<src1>,<src2>]]></pre>MOV<cond>A,B等效于SEL<cond>A,B,A。通過互換src1與src2及使用SELTF、SELTT得到SELFT及SELFF。
標(biāo)志保持所有標(biāo)志以便可以執(zhí)行一序列選擇。
包含的理由用于在線作出簡單決定而無須依靠轉(zhuǎn)移。用于Viterbi算法及在樣本或矢量中掃描最大元素時。
移位操作指令提供邏輯左與右移,算術(shù)右移及循環(huán)指定的量。認(rèn)為移位量是取自寄存器內(nèi)容的低8位的-128與+127之間的帶符號整數(shù)或者在范圍+1至+31中的立即數(shù)。負(fù)數(shù)量的移位導(dǎo)致反方向上移位ABS(移位量)。
將輸入操作數(shù)符號擴(kuò)展到32位;在寫回前將得出的32位輸出符號擴(kuò)展到48位從而寫到48位寄存器表現(xiàn)合理。
OPC指定指令的類型。操作(OPC)<pre listing-type="program-listing"><![CDATA
]></pre>
助記符<pre listing-type="program-listing"><![CDATA
]></pre>標(biāo)志Z如果結(jié)果為0,便置位。
N如果結(jié)果為負(fù),便置位。
V保持C設(shè)置成移位出來的最后一位的值(和在ARM上一樣)寄存器指定的移位的行為為-LSL移位32得出結(jié)果0,C設(shè)置為src1的位0。
-LSL移位32以上得出結(jié)果0,C設(shè)置為0。
-LSR移位32得出結(jié)果0,C設(shè)置為src1的位31。
-LSR移位32以上得出結(jié)果0,C設(shè)置為0。
-ASR移位32或以上得出用src1的位31填充及C設(shè)置為src1的位31。
-ROR移位32具有結(jié)果等于src1并將C設(shè)置成src1的位31。
-ROR移位n位,其中n大于32,給出執(zhí)行ROR移位n-32位相同的結(jié)果;因此從n中重復(fù)減去32直到該量在1至32范圍中為止,見上。
包含的理由用2的冪乘/除。位與字段抽取。串行寄存器。
將未定義的指令在指令集清單中陳述如上。它們的執(zhí)行將導(dǎo)致Piccolo停止執(zhí)行,并置位狀態(tài)寄存器中的U位,及禁止它本身(似乎清除了控制寄存器中的E位)。這允許截獲指令集的任何未來擴(kuò)充并在現(xiàn)有實現(xiàn)上有選擇地仿真。
從ARM訪問Piccolo狀態(tài)如下。狀態(tài)訪問模式用來觀察/修改Piccolo的狀態(tài)。為兩種目的設(shè)置這一機(jī)制-上下文切換。
-調(diào)試。
通過執(zhí)行PSTATE指令將Piccolo置于狀態(tài)訪問模式中。這一模式允許用一序列STC與LDC指令保存及恢復(fù)所有Piccolo狀態(tài)。當(dāng)進(jìn)入狀態(tài)訪問模式時,將Piccolo協(xié)處理器ID PICCOLO1的使用修改成允許訪問Piccolo的狀態(tài)。有7組Piccolo狀態(tài)??梢杂脝我坏腖DC或STC加載與存儲特定組中的所有數(shù)據(jù)。
組0專用寄存器。
-一個32位字,包含Piccolo ID寄存器的值(只讀)。
-一個32位字,包含控制寄存器的狀態(tài)。
-一個32位字,包含狀態(tài)寄存器的狀態(tài)。
-一個32位字,包含程序計數(shù)器的狀態(tài)。
組1通用寄存器(GPR)-16個32位字,包含通用寄存器狀態(tài)。
組2累加器-4個32位字,包含累加器寄存器的高32位(注意,為了恢復(fù)的目的,以GPR狀態(tài)進(jìn)行復(fù)制是必要的-否則會蘊(yùn)含該寄存器組上的另一次寫使能)。
組3寄存器/Picolo ROB/輸出FIFO狀態(tài)。
-一個32位字,指示哪些寄存器標(biāo)記為再填充(每一個32位寄存器2位)。
-8個32位字,包含ROB標(biāo)簽的狀態(tài)(存儲在位7至0中的8個7位項)。
-3個32位字,包含不對齊的ROB鎖存器的狀態(tài)(位17至0)。
-一個32位字,指示輸出移位寄存器中哪些槽包含有效數(shù)據(jù)(位4表示空,位3至0編碼所用項的號碼)。
-一個32位字,包含輸出FIFO保持鎖存器的狀態(tài)(位17至0)。
組4ROB輸入數(shù)據(jù)。
-8個32位數(shù)據(jù)值。
組5輸出FIFO數(shù)據(jù)。
-8個32位數(shù)據(jù)值。
組6循環(huán)硬件。
-4個32位字,包含循環(huán)起始地址。
-4個32位字,包含循環(huán)結(jié)束地址。
-4個32位字,包含循環(huán)計數(shù)(位15至0)。
-一個32位字,包含用戶定義的重新映射參數(shù)及其它重新映射狀態(tài)。
LDC指令用于在Piccolo在狀態(tài)訪問模式中時加載Piccolo狀態(tài)。BANK字段指示正在加載哪一個組。31 30 29 28 27 2625 24 23 22 21 20 19 18 17 16 15 14 1312 11 10 9 8 7 6 5 4 3 2 1 0
以下序列加載來自寄存器R0中的地址的所有Piccolo狀態(tài)。
LDP B0,[R0],#16!;專用寄存器LDP B1,[R0],#64!;加載通用寄存器LDP B2,[R0],#16!;加載累加器LDP B3,[R0],#56!;加載寄存器/ROB/FIFO狀態(tài)LDP B4,[R0],#32!;加載ROB數(shù)據(jù)LDP B5,[R0],#32!;加載輸出FIFO數(shù)據(jù)LDP B6,[R0],#52 !;加載循環(huán)硬件STC指令用于在Piccolo在狀態(tài)訪問模式中時存儲Piccolo狀態(tài)。BANK字段指定正在存儲哪一個組。31 30 29 28 27 2625 24 23 22 21 20 19 18 17 16 15 14 1312 11 10 9 8 7 6 5 4 3 2 1 0
以下序列將所有Piccolo狀態(tài)儲到寄存器R0中的地址。STP B0,[R0],#16!;保存專用寄存器STP B1,[R0],#64!;保存通用寄存器STP B2,[R0],#16!;保存累加器STP B3,[R0],#56!;保存寄存器/R0B/FIFO狀態(tài)STP B4,[R0],#32!;保存ROB數(shù)據(jù)STP B5,[R0],#32!;保存輸出FIFO數(shù)據(jù)
STP B6,[R0],#52!;保存循環(huán)硬件調(diào)試模式-Piccolo需要響應(yīng)與ARM所支持的相同的調(diào)試機(jī)制,即軟件通過Demon與Angel,以及帶有嵌入的ICE的硬件,下面是調(diào)試Piccolo系統(tǒng)的若干機(jī)制-ARM指令斷點(diǎn)。
-數(shù)據(jù)斷點(diǎn)(觀察點(diǎn))。
-Piccolo指令斷點(diǎn)。
-Piccolo軟件斷點(diǎn)。
ARM指令與數(shù)據(jù)斷點(diǎn)是由ARM嵌入的ICE模塊處理的;Piccolo指令斷點(diǎn)是由Piccolo嵌入的ICE模塊處理的;Piccolo軟件斷點(diǎn)是由Piccolo核處理的。
硬件斷點(diǎn)系統(tǒng)可配置成使ARM與Piccolo兩者都有斷點(diǎn)。
軟件斷點(diǎn)由Piccolo指令(停機(jī)或中斷)處理,導(dǎo)致Picccolo停止執(zhí)行,進(jìn)入調(diào)試模式(置位狀態(tài)寄存器中的B位)及禁止本身(似乎已用PDISABLE指令禁止Piccolo)。程序計數(shù)器保持有效,允許恢復(fù)斷點(diǎn)地址。Piccolo不再執(zhí)行指令。
單步進(jìn)Piccolo可通過在Piccolo指令流上設(shè)定一個斷點(diǎn)接一個斷點(diǎn)來完成。
軟件調(diào)試-Piccolo提供的基本功能便是在狀態(tài)訪問模式中通過協(xié)處理器指令加載與保存所有狀態(tài)到存儲器中的能力。這允許調(diào)試程序?qū)⑺袪顟B(tài)保存在存儲器中,讀取與/或更新它及恢復(fù)到Piccolo中。Piccolo存儲狀態(tài)機(jī)制是非破壞性的,即Piccolo的存儲狀態(tài)操作不會破壞任何Piccolo內(nèi)部狀態(tài)。這意味著Piccolo在轉(zhuǎn)儲其狀態(tài)之后不首先再一次恢復(fù)它便能重新起動。
要確定找出Piccolo高速緩沖存儲器的狀態(tài)的機(jī)制。
硬件調(diào)試-硬件調(diào)試由Piccolo的協(xié)處理器接口上的掃描鏈提供。然后可將Piccolo置于狀態(tài)訪問模式中并通過該掃描鏈檢驗/修改其狀態(tài)。
Piccolo狀態(tài)寄存器包含單一的位來指示它已執(zhí)行了斷點(diǎn)指令。在執(zhí)行斷點(diǎn)指令時,Piccolo置位狀態(tài)寄存器中的B位,并停止執(zhí)行。為了能查詢Piccolo,調(diào)試程序必須啟動Piccolo并通過在能出現(xiàn)隨后的存取之前寫入其控制寄存器而將其置于狀態(tài)訪問模式中。
圖4示出響應(yīng)高/低位及大小位將選擇的寄存器的適當(dāng)?shù)囊话肭袚Q到Piccolo數(shù)據(jù)路徑上的多路復(fù)用器配置。如果大小位指示16位,則符號擴(kuò)展電路用適當(dāng)?shù)?或1填充數(shù)據(jù)路徑的高位。
權(quán)利要求
1.一個數(shù)據(jù)處理裝置,包括用于存儲要處理的數(shù)據(jù)項的多個寄存器;一個處理器,用于處理要應(yīng)用于在所述多個寄存器中存儲的數(shù)據(jù)項的指令;以及一個寄存器重映射邏輯,用于將一個預(yù)選的指令集中的邏輯寄存器引用轉(zhuǎn)換到標(biāo)識包含由所述處理器處理所需要的數(shù)據(jù)項的寄存器的一個物理寄存器引用。
2.根據(jù)權(quán)利要求1的數(shù)據(jù)處理裝置,其中該寄存器重映射邏輯由一個重映射指令進(jìn)行配置,該重映射指令被設(shè)計成在所述預(yù)選指令集之前進(jìn)行處理。
3.根據(jù)權(quán)利要求1或2的數(shù)據(jù)處理裝置,還包括用于定義要重復(fù)的一個指令范圍的一個重復(fù)指令,所述指令范圍包括所述預(yù)選指令集;以及用于管理該重復(fù)指令和被安排成周期性地更新該寄存器重映射邏輯的循環(huán)硬件。
4.根據(jù)權(quán)利要求3的數(shù)據(jù)處理裝置,其中該循環(huán)硬件被設(shè)計成在每次重復(fù)該指令范圍時更新該寄存器重映射邏輯。
5.根據(jù)權(quán)利要求3或4的數(shù)據(jù)處理裝置,其中該重復(fù)指令包括用于配置該寄存器重映射邏輯的一個或多個重映射參數(shù)。
6.根據(jù)權(quán)利要求5的數(shù)據(jù)處理裝置,其中在執(zhí)行該重復(fù)指令之前執(zhí)行一個重映射指令以使用所述一個或多個重映射參數(shù)配置該寄存器重映射邏輯,所述重映射指令并不包括在由該重復(fù)指令定義的所述指令范圍中。
7.根據(jù)權(quán)利要求5或6的數(shù)據(jù)處理裝置,其中還包括一個存儲裝置以存儲至少一組預(yù)定義的重映射參數(shù),每一組定義用于所述寄存器重映射邏輯的一個重映射配置,其中如果包括在所述重復(fù)指令中的一個或多個重映射參數(shù)對應(yīng)于所述預(yù)定義重映射參數(shù)組中的一組,則使用用于該寄存器重映射邏輯的對應(yīng)的重映射配置,而不要求執(zhí)行一個重映射指令。
8.根據(jù)權(quán)利要求5至7之一的數(shù)據(jù)處理裝置,其中一個第一重映射參數(shù)標(biāo)識由該寄存器重映射邏輯進(jìn)行重映射的多個所述寄存器的若干寄存器。
9.根據(jù)權(quán)利要求5至8之一的數(shù)據(jù)處理裝置,其中該寄存器重映射邏輯被設(shè)計成在所述多個寄存器的若干寄存器上執(zhí)行重映射,該寄存器重映射邏輯使用一個基指針作為一個偏移值加到該邏輯寄存器引用,該重復(fù)指令包括一個第二重映射參數(shù)以標(biāo)識以預(yù)定間隔用以遞增該基指針的一個值。
10.根據(jù)權(quán)利要求9的數(shù)據(jù)處理裝置,其中該重復(fù)指令包括一個第三重映射參數(shù)以提供一個第一回繞值,并且如果在基指針遞增期間,該基指針等于或超過該第一回繞值,遞增該基指針將回繞到一個新的偏移值。11.根據(jù)權(quán)利要求9或10的數(shù)據(jù)處理裝置,其中該重復(fù)指令包括一個第四重映射參數(shù)以提供一個第二回繞值,并且如果由基指針和邏輯寄存器引用的相加形成的寄存器引用等于或超過該第二回繞值,則將該寄存器引用回繞到一個新的寄存器引用。
12.根據(jù)上述任一權(quán)利要求的數(shù)據(jù)處理裝置,其中該所述多個寄存器包括多個寄存器組,該寄存器重映射邏輯被設(shè)計成在一個特定的寄存器組中的多個寄存器上進(jìn)行重映射。
13.根據(jù)權(quán)利要求12的數(shù)據(jù)處理裝置,其中將該寄存器重映射邏輯設(shè)計成對每一寄存器組執(zhí)行一次獨(dú)立的重映射。
14.根據(jù)上述任一權(quán)利要求的數(shù)據(jù)處理裝置,其中一個指令可以包括多個操作數(shù),每一操作數(shù)包括一個邏輯寄存器引用,該寄存器重映射邏輯設(shè)計成對于每一操作數(shù)執(zhí)行一次獨(dú)立的重映射。
15.根據(jù)上述任一權(quán)利要求的數(shù)據(jù)處理裝置,其中該數(shù)據(jù)處理裝置是一個數(shù)字信號處理裝置。
16.一種操作數(shù)據(jù)處理裝置的方法,該方法包括(a)在多個寄存器中存儲要處理的數(shù)據(jù)項;(b)從該多個寄存器中檢索處理一個指令所需要的一個或多個數(shù)據(jù)項;(c)使用所檢索的所述一個或多個數(shù)據(jù)項處理該指令;對于一個預(yù)選的指令集,所述檢索步驟(b)包括一個另外的轉(zhuǎn)換步驟,該轉(zhuǎn)換步驟將所述預(yù)選的指令集中的一個邏輯寄存器引用轉(zhuǎn)換到標(biāo)識包含所述處理步驟(c)所要求的數(shù)據(jù)項的寄存器的一個物理寄存器引用。
17.根據(jù)權(quán)利要求16的方法,還包括步驟定義要重復(fù)的一個指令范圍,所述指令范圍包括所述預(yù)選指令集;以及利用循環(huán)硬件管理該重復(fù)指令和周期性地更新在所述轉(zhuǎn)換步驟中使用的該寄存器重映射邏輯以將一個邏輯寄存器引用轉(zhuǎn)換成一個物理寄存器引用。
18.根據(jù)權(quán)利要求17的方法,其中該循環(huán)硬件被設(shè)計成在每次重復(fù)該指令范圍時更新該寄存器重映射邏輯。
19.根據(jù)權(quán)利要求17或18的方法,其中定義要重復(fù)的一個指令范圍的步驟包括定義用于配置該寄存器重映射邏輯的一個或多個重映射參數(shù)。
20.根據(jù)權(quán)利要求19的方法,其中一個重映射指令被安排成在執(zhí)行要重復(fù)的該指令范圍之前執(zhí)行以使用所述一個或多個重映射參數(shù)配置該寄存器重映射邏輯。
21.根據(jù)權(quán)利要求19或20的方法,其中還包括以下步驟存儲至少一組預(yù)定義的重映射參數(shù),每一組定義用于所述寄存器重映射邏輯的一個重映射配置;以及如果所述一個或多個重映射參數(shù)對應(yīng)于所述預(yù)定義重映射參數(shù)組中的一組,則使用對應(yīng)的重映射配置用于該寄存器重映射邏輯,而不要求執(zhí)行一個重映射指令。
22.根據(jù)權(quán)利要求16至21的方法,其中該多個寄存器包括多個寄存器組,該方法包括在一個特定的寄存器組中的多個寄存器上進(jìn)行重映射的步驟。
23.根據(jù)權(quán)利要求22的方法,還包括對每一寄存器組執(zhí)行一次獨(dú)立的重映射的步驟。
24.根據(jù)權(quán)利要求16至23的方法,其中一個指令包括多個操作數(shù),每一操作數(shù)包括一個邏輯寄存器引用,該方法還包括對于每一操作數(shù)執(zhí)行一次獨(dú)立的重映射的步驟。
全文摘要
根據(jù)本發(fā)明,提供了一種數(shù)據(jù)處理裝置,它包括:用于存儲要處理的數(shù)據(jù)項的多個寄存器;一個處理器,用于處理要應(yīng)用于在所述多個寄存器中存儲的數(shù)據(jù)項的指令;以及一個寄存器重映射邏輯,用于將一個預(yù)選的指令集中的邏輯寄存器引用轉(zhuǎn)換到標(biāo)識包含由所述處理器處理所需要的數(shù)據(jù)項的寄存器的一個物理寄存器引用。通過這一方法,為了將該重映射應(yīng)用于所需的指令數(shù)目,只需將重映射指令執(zhí)行一次。這與現(xiàn)有技術(shù)形成對比,其中,在重映射指令執(zhí)行之后,該重映射將被應(yīng)用于所有的后續(xù)指令,即不能選擇所需數(shù)目的指令。本發(fā)明尤其有利于用于被設(shè)計成重復(fù)一個指令循環(huán)的裝置中,該指令循環(huán)包括所述預(yù)選指令集。在這種情況下,用于管理該重復(fù)指令的循環(huán)硬件被設(shè)計成在每次重復(fù)該指令循環(huán)時更新該寄存器重映射邏輯,并且因此在執(zhí)行該重復(fù)指令之前又執(zhí)行用于配置該寄存器重映射邏輯的重映射指令一次。
文檔編號G06F9/32GK1231740SQ9719814
公開日1999年10月13日 申請日期1997年8月22日 優(yōu)先權(quán)日1996年9月23日
發(fā)明者R·約克, H·J·弗蘭西斯, D·塞梅斯, S·比勒斯 申請人:Arm有限公司