新四季網

協處理器的數據訪問控制的製作方法

2023-06-03 01:29:56

專利名稱:協處理器的數據訪問控制的製作方法
技術領域:
本發明涉及數據處理系統領域。更具體地,本發明涉及包括一個中央處理單元,一個存儲器和一個協處理器的數據處理系統,其中,在該中央處理單元和該協處理器聯合執行的指令的控制下在該存儲器和該協處理器之間傳送數據字。
提供具有一個中央處理單元,一個存儲器和一個諸如配備有英格蘭劍橋的先進RISC機器公司(Advanced RISC Machines Limited)製造的ARM微處理器的協處理器的處理系統是眾所周知的。在這種公知的系統中,該中央處理單元執行協處理器存儲器訪問指令(諸如一次協處理器加載或者一次協處理器存儲),該指令用於產生用於提供給該存儲器的適當的地址數據以及準備使該協處理器與該存儲器直接進行數據字(數據傳送的單位)的交換。一旦該中央處理單元將該開始地址信息提供給該存儲器,則如果該數據字不經過該中央處理單元傳輸或者不需存儲在該中央處理單元中而直接傳到該協處理器,其效率是最高的。對於到該協處理器的這種直接傳送,最好是該協處理器控制該數據傳送的結束,這樣可以將在每次傳送中具有不同數目的字的不同的協處理器連接到該中央處理單元,而不必修改該中央處理單元。為了控制該數據傳送的結束,該協處理器必須能夠確定根據在該中央處理單元上執行的指令打算傳送多少數據字。
一種可能是使得執行在該中央處理單元上的每個指令只傳送一個數據字。這不論是對於數據存儲器帶寬的使用還是代碼側和指令存儲器帶寬的使用,其效率是十分低的,最好是使用突發模式傳送,在該突發模式傳送中將一個起始地址提供給存儲器,存儲器將一系列相鄰的存儲器單元中的數據字返回。利用這種突發模式傳送,效率提高的同時帶來了相應的困難,因為協處理器需要確定要將多少數據字進行傳送,以便它能執行必要的控制以停止該傳送。
眾所周知,(例如在ARM浮點加速單元中)可以在該中央處理單元上執行的指令中分配一個數據位欄位,將該數據位欄位傳遞給該協處理器,向該協處理器指示要傳送的數據字的數量。然而,在該中央處理單元上執行的指令中可用的位空間是有限的,如果在該指令中的數據位專用於向該協處理器傳遞數據字的數量,則將限制該指令中可用於其他欄位的位空間,這些其它欄位可用於指示有關數據傳送的其他參數,比如在接著該指令的執行之後對在該中央處理單元中的地址指針進行改變。
從本發明的一個方面可以看出,本發明提供的用於處理數據的裝置包括一個中央處理單元,用於執行中央處理單元指令,以執行數據處理操作,所述中央處理單元指令包括協處理器存儲器訪問指令;一個連接到所述中央處理單元用於保存數據字的存儲器;一個連接到所述中央處理單元和所述存儲器的協處理器,在所述中央處理單元執行的所述協處理器存儲器訪問指令的控制下使用多個尋址模式中的一個尋址要由所述協處理器處理的所述存儲器中的數據字;其中,至少一個協處理器存儲器訪問指令包括尋址模式信息,該信息用於控制所述中央處理單元使用所述多個尋址模式中的哪一個來訪問所述存儲器,所述協處理器使用所述尋址模式信息中的至少一部分來控制根據所述至少一個協處理器存儲器訪問指令在所述存儲器和所述協處理器之間傳送多少數據字。
本發明認識到,該多個位欄位(其可以包括寄存器號和立即數)由中央處理單元使用以控制使用多個尋址模式中的哪一個,該多個位欄位也用於向該協處理器指示(可能要結合其他因素,諸如在該指令中的其他欄位,或者在控制寄存器中寫入的值)要傳送的數據字的數量。例如,已經發現,在大量的情況下,由該中央處理單元使用以控制用於該傳送和/或改變地址指針的位欄位信息與(或者可能與)要傳送到該協處理器的數據字的數量有關,並且因此該位欄位可以由該協處理器以及該中央處理單元讀取。在該協處理器存儲器訪問指令中對同一位欄位的重疊使用將在那些協處理器存儲器訪問指令中的位空間釋放用於其他用途。進一步還認識到,在大多數情況下,要傳送的數據字的數量落在少量的範疇內,因此利用本發明獲得的代碼密度和效率的改進帶來的好處超過了提供一個專用的位欄位用於向該協處理器指示要傳送的數據字的數量所帶來的完全的靈活性。
儘管中央處理單元可以以多種不同的方式控制尋址,但是在本發明的較佳實施例中,所述至少一個協處理器存儲器訪問指令引用所述中央處理單元中保存一個地址值的寄存器,以及所述地址方式信息包括一個偏移欄位,其中在執行所述至少一個協處理器存儲器訪問指令時從所述地址值和所述偏移值至少之一中確定所述存儲器中要訪問的一個開始地址。
這種使用保存在該中央處理單元的一個寄存器中的一個地址指針提供了極大的靈活性,並且和該指令中的偏移欄位結合簡化了應用程式的編碼。
在最好以協處理器對一批數據進行操作的時候,對於本發明的較佳實施例就是對所述地址值的所述改變產生一個最終的地址值,該最終的地址值可以選擇存回所述寄存器中。
已經發現,由所述協處理器使用所述偏移欄位的至少一部分來控制在所述存儲器和所述協處理器之間要傳送多少數據字是極其方便的。這種裝置滿足了現實生活中使用一個協處理器來對存儲器中保存的數據執行數據處理操作的大多數要求。
有利的是,該尋址模式信息應該包括一個或者多個標記,所述標記用於控制使用所述多個尋址模式中的哪個模式,以及也用來控制在確定在所述存儲器和所述協處理器之間要傳送多少數據字時所述協處理器是否要使用所述偏移欄位。
根據在該尋址模式信息中的其他標記位選擇性地使用該偏移欄位增加了協處理器可以用來控制所傳送的數據字的數量時所用方式可用的選項數量,並且也使之有可能滿足大量現實情況的要求,同時不要求該協處理器存儲器訪問指令中的其他位空間。
已經發現,要涵蓋大多數所要求的操作的類型,該較佳實施例應該是這樣的在確定在所述存儲器和所述協處理器之間要傳送多少數據字時所述協處理器不使用所述偏移欄位時,在所述存儲器和所述協處理器之間傳送一個固定數量的數據字。
控制該協處理器的一個補充的協處理器存儲器訪問指令模式的集合是所述寄存器存儲一個地址值Rn,一個數據字長度是WL個字節,以及所述偏移值是M,所述一個或者多個標記包括3個或者多個數值位,執行數值位選擇所述至少一個協處理器存儲器訪問指令根據下列情況之一進行操作傳送開始地址寄存器中要傳送的地址值的最終值數據字數量(i) RnRn-(WL*M)(固定數量)(ii) RnRn M(iii)RnRn+(WL*M) M(iv) Rn-(WL*M) Rn M(v) Rn-(WL*M) Rn-(WL*M) M(vi) Rn+(WL*M) Rn (固定數量)(vii)Rn+(WL*M) Rn+(WL*M)(固定數量)有利的是該協處理器存儲器訪問指令也包括多個標記,該多個標記包括(i)一個標記位P,它指示所述開始地址值是否是原先存儲在所述寄存器中的所述地址值或者是由所述偏移欄位所指示要改變的一個地址值;
(ii)一個標記位U,它指示所述改變是否從原先存儲在所述寄存器中的所述地址值中加上或減去在所述偏移欄位中指示的一個值;以及(iii)一個標記位W,它指示在所述地址寄存器中的所述最終值是否應當存回所述寄存器中。
利用這樣一組標記,通過提供這樣一種邏輯可以將該協處理器配置成提供對其操作的快速和簡單的控制,使所述協處理器計算P EOR U以確定是否傳送一個數據字或者M個數據字。
一個另外的可能性是在該基寄存器是ARM程序計數器寄存器(PC或R15)時使傳送的字的數量為1。這將修改確定對於P EOR(U或者(基寄存器是PC))傳送一個字的邏輯電路。
儘管上面所討論的對協處理器與一個中央處理單元和一個存儲器的交互進行控制的特徵可用於許多不同的領域(例如浮點協處理器),數據訪問的相當的規則性使得本發明尤其適用於這樣一些實施例,在這些實施例中,所述中央處理單元和所述協處理器執行數位訊號處理操作,並且在所述存儲器和所述協處理器之間傳送的所述數據字包括來自存儲在所述存儲器中的一組係數值中的多個係數值。
從本發明的另一方面可以看出,本發明提供了一種處理數據的方法,所述方法包括下列步驟以一個中央處理單元執行中央處理單元指令,以執行數據處理操作,所述中央處理單元指令包括協處理器存儲器訪問指令;將數據字保存在連接到所述中央處理單元的存儲器中;在由所述中央處理單元執行的協處理器存儲器訪問指令的控制下,利用所述多個尋址模式之一在所述存儲器中尋址要由連接到所述中央處理單元和所述存儲器的一個協處理器處理的數據字;其中,至少一個所述協處理器存儲器訪問指令包括尋址模式信息,該信息用於控制所述中央處理單元使用所述多個尋址模式中的哪一個來訪問所述存儲器,所述協處理器使用所述尋址模式信息中的至少一部分來控制根據所述至少一個所述協處理器存儲器訪問指令在所述存儲器和所述協處理器之間傳送多少數據字。
現在將參照附圖通過舉例描述本發明的實施例,其中

圖1示出數位訊號處理裝置的高層配置;圖2示出協處理器的輸入緩衝器和寄存器配置;圖3示出通過協處理器的數據路徑;圖4示出從寄存器中讀取高或低位位的多路復用電路;圖5為示出較佳實施例中的協處理器所使用的寄存器重新映射邏輯的框圖;圖6更詳細地示出圖5中所示的寄存器重新映射邏輯;
圖7為示出塊過濾算法的表;圖8圖示了一個包括一個中央處理單元,一個存儲器和一個用於執行協處理器存儲器訪問指令的系統;以及圖9是對應於圖8的系統的操作流程圖。
在下列的描述中,第一節描述了這樣一個系統,該系統包括一個中央處理單元,一個存儲器和一個協處理器,該協處理器被設計成提供高速的數位訊號處理功能。第二節描述了對第一節的系統的改進,其中將在第一節中的協處理器存儲器訪問指令進行了修改以增強該協處理器對要傳送的數據字的數量進行容易的控制。第一節下面描述的系統是關於數位訊號處理(DSP)的。DSP可採取許多形式,但一般可以認為是需要高速(實時)處理大量數據的處理。這一數據通常表示某種模擬物理信號。DSP的好的實例便是用在數字行動電話中的,其中所接收與發送的無線電信號需要解碼成模擬聲音信號及將模擬聲音信號編碼(通常採用卷積、變換及相關運算)。另一實例是盤驅動器控制器,其中處理從盤頭恢復的信號以產生頭跟蹤控制。
在上面的上下文中,下面是對基於與協處理器合作的微處理器核(在本例中為英國劍橋先進RISC機器有限公司設計的微處理器範圍內的ARM核)的數位訊號處理系統的描述。微處理器與協處理器的接口及協處理器體系結構本身是專門為提供DSP功能配置的。微處理器核將被稱作ARM而協處理器稱作Piccolo。ARM與Piccolo通常製造成包含作為ASIC的一部分的其它元件(如片上DRAM、ROM、D/A與A/D轉換器等)的單一集成電路。
Piccolo為ARM協處理器,因此它執行一部分ARM指令集。ARM協處理器指令允許ARM在Piccolo與存儲器之間傳送數據(利用加載協處理器LDC及存儲協處理器STC指令),以及向與從Piccolo傳送ARM寄存器(利用傳送到協處理器MCR及從協處理器傳送的MRC指令)。觀察ARM與Piccolo的協作交互作用的一種方式是ARM作為Piccolo數據的強有力的地址發生器工作,而使Piccolo有時間執行需要實時處理大量數據來產生對應的實時結果的DSP運算。
圖1示出ARM 2與Piccolo 4,ARM 2發布控制信號到Piccolo 4來控制向Piccolo 4傳送數據以及從Piccolo 4傳送數據字。指令高速緩衝存儲器6存儲Piccolo 4所需要的Piccolo程序指令字。單個DRAM存儲器8存儲ARM 2與Piccolo 4兩者所需要的所有數據與指令字。ARM 2負責尋址存儲器8及控制所有數據傳送。只帶單個存儲器8及一組數據與地址總線的布置比需要多個存儲器及高總線帶寬的總線的典型DSP方法簡單與低廉。
Piccolo執行來自控制Piccolo數據路徑的指令高速緩衝存儲器6的第二指令流(數位訊號處理程序指令字)。這些指令中包含諸如乘-累加等數位訊號處理型操作及諸如零開銷循環指令等控制流指令。這些指令在保持在Piccolo寄存器10(見圖2)中的數據上操作。這一數據是早先ARM2從存儲器8傳送來的。指令流自指令高速緩衝存儲器6;指令高速緩衝存儲器6作為完全的總線主驅動數據總線。小的Piccolo指令高速緩衝存儲器6為4線、每線16個字的直接映象高速緩衝存儲器(64條指令)。在一些實現中,令指令高速緩衝存儲器更大是值得的。
從而兩個任務是獨立運行的,ARM加載數據而Piccolo處理它。這允許在16位數據上持續的單周期數據處理。Piccolo具有使ARM預取順序數據,在Piccolo需要它之前加載數據的數據輸入機制(示出在圖2中)。Piccolo能以任何次序存取加載的數據,隨著老數據的最後一次使用自動地重新填充其寄存器(所有指令的每一源操作數都有一位來指示應重新填充源寄存器)。這一輸入機制稱作再定序緩衝器並包括輸入緩衝器12。加載進Piccolo的每一個值(見下面通過LDC或MCR)攜帶有指定該值的目的地寄存器的標記Rn。標記Rn與數據字一起存儲在輸入緩衝器中。當通過寄存器選擇電路14存取寄存器而指令指定要重新填充該數據寄存器時,便通過確立信號E來標記該寄存器。然後重新填充電路16用輸入緩衝器12中以該寄存器為目的地的最老的加載值自動重新填充該寄存器。重定序緩衝器保持8個帶標記的值。輸入緩衝器12具有類似於FIFO的形式,但除外可從隊列中央抽取數據字,而此後較晚存儲的字向前傳遞來填充空位。距離輸入最遠的數據字便相應地是最老的,並在輸入緩衝器12保持帶有正確的標記Rn的兩個數據字時便用它來確定應當用哪一個數據字來重新填充輸入緩衝器12。
如圖3中所示Piccolo通過將數據存儲在輸出緩衝器18(FIFO)中輸出它。數據是順序地寫入FIFO中的,並由ARM以相同的次序讀出到存儲器8。輸出緩衝器18保持8個32位值。
Piccolo通過協處理器接口(圖1的CP控制信號)連接在ARM上。在執行ARM協處理器指令時,Piccolo能執行該指令;在執行該指令之前令ARM等待直到Piccolo就緒;或拒絕執行該指令。在最後一種情況中,ARM將引起未定義的指令異常。
Piccolo執行的最普通的協處理器指令為LDC與STC,它們分別通過數據總線向與從存儲器8加載與存儲數據字,而ARM生成所有地址。便是這些指令將數據加載到重定序緩衝器中並存儲來自輸出緩衝器18的數據。如果在LDC上輸入重定序緩衝器中沒有足夠的空間來加載數據時,及如果在STC上輸出緩衝器中沒有足夠的數據供存儲,即ARM正在期待的數據不在輸出緩衝器18中時,Piccolo將阻止ARM。Piccolo還執行ARM/協處理器寄存器傳送使ARM能存取Piccolo的特定寄存器。
Piccolo從存儲器取出其本身的指令來控制圖3中所示的數據路徑及從重定序緩衝器到寄存器及從寄存器到輸出緩衝器18傳送數據。Piccolo的執行這些指令的算術邏輯單元具有執行乘法、加法、減法、乘-累加、邏輯運算、移位與循環的乘法器/加法器電路20。在數據路徑中還設置有累加/累減(decumulate)電路22及定標/飽和電路24。
Piccolo指令是初始時從存儲器加載進指令高速緩衝存儲器6中的,其中Piccolo能存取它們而不需要返回去存取主存儲器。
Piccolo不能從存儲器失敗中恢復。因此,如果在虛擬存儲器系統中使用Piccolo,在整個Piccolo任務中所有Piccolo數據都必須在物理存儲器中。對於諸如實時DSP等Piccolo任務的實時性質,這不是重大的限制。如果出現存儲器失敗,Piccolo將停止並在狀態寄存器S2中設置標誌。
圖3示出Piccolo的整體數據路徑功能。寄存器組10使用3個讀埠與2個寫埠。利用一個寫埠(L埠)從重定序緩衝器重新填充寄存器。輸出緩衝器18是直接從ALU結果總線26更新的,從輸出緩衝器18的輸出是在ARM程序控制下的。ARM協處理器接口執行到重定序緩衝器中的LDC(加載協處理器)指令及從輸出緩衝器18的STC(存儲協處理器)指令,以及在寄存器組10上的MCR與MRC(傳送ARM寄存器至/自CP寄存器)。
其餘寄存器埠用於ALU。兩個讀埠(A與B)驅動輸入到乘法器/加法器電路20,C讀埠用於驅動累加器/累減器電路22輸入。其餘寫埠W用於將結果返回給寄存器組10。
乘法器20執行16×16帶符號或不帶符號乘法,帶有可選用的48位累加。定標器單元24能提供0至31位立即算術或邏輯右移,後面跟隨可選用的飽和。移位器與邏輯單元20每一周期能執行一個移位或邏輯運算。
Piccolo具有稱作D0-D15或A0-A3、X0-X3、Y0-Y3、Z0-Z3的16個通用寄存器。第一組四個寄存器(A0-A3)預定作為累加器並且是48位寬,額外的16位提供在許多連續的計算中對溢出的保護。其餘寄存器為32位寬。
可將各Piccolo寄存器作為包含兩個獨立的16位值對待。位0至15包含低的一半,位16至31包含高的一半。指令能指定各寄存器特定的16位的一半作為源操作數,或可指定整個32位寄存器。
Piccolo還提供飽和的運算。如果結果大於目的地寄存器的大小,乘法、加法與減法指令的變型提供飽和的結果。當目的地寄存器為48位累加器時,將值飽和到32位(即無法飽和48位值)。在48位寄存器上沒有溢出檢測。由於會佔用至少65536條乘法累加指令才能導致溢出所以這是合理的限制。
各Piccolo寄存器是標記為「空」(E標誌,見圖2)或包含值(不可能有半個寄存器是空的)之一的。初始時,將所有寄存器標記為空。在各周期上Piccolo試圖用重新填充控制電路16將來自輸入重定序緩衝器的值填充空的寄存器之一。此外如果將來自ALU的值寫入寄存器便不再將它標記為「空」的。如果從ALU寫入寄存器,同時有值等待從重定序緩衝器放置到該寄存器中,則結果是不確定的。如果對空寄存器進行讀取,Piccolo的執行單元將停止。
輸入重定序緩衝器(ROB)位於協處理器接口與Piccolo的寄存器組之間。用ARM協處理器傳送將數據加載進ROB中。ROB包含若干32位值,各帶有指示作為該值的目的地的Piccolo寄存器的標記。該標記還指示該數據應傳送給整個32位寄存器還是只給32位寄存器的底部16位。如果數據的目的地為整個寄存器,則將該項的底部16位傳送給目標寄存器的底部一半並將頂部16位傳送給寄存器的頂部一半(如果目標寄存器為48位累加器則擴展符號)。如果該數據的目的地只是寄存器的底部一半(所謂「半寄存器」),首先傳送底部16位。
寄存器標記總是參照物理目的地寄存器,不執行寄存器重新映射(見下面關於寄存器重新映射。)在每一個周期上Piccolo試圖如下地將數據項從ROB傳送到寄存器組-檢驗ROB中各項並將標記與空寄存器比較,確定是否能從一部分或全部項對寄存器進行傳送。
-從能進行傳送的項組中,選擇最老的項並將其數據傳送給寄存器組。
-將該項的標記更新為標記該項是空的。如果只傳送了該項的一部分,只將傳送的部分標記為空的。
例如,如果目標寄存器完全是空的且選擇的ROB項包含以整個寄存器為目的地的數據,便傳送全部32位並標記該項為空的。如果目標寄存器的底部一半是空的而ROB項包含目的地為寄存器的底部一半的數據,則將該ROB項的底部16位傳送給目標寄存器的底部一半並將ROB的底部一半標記為空的。
可以獨立地傳送任何項中的數據的高與低16位。如果沒有項包含能傳送給寄存器組的數據,該周期中不進行傳送。下面的表描述目標ROB項與目標寄存器狀態的所有可能組合。
總結一下,可以獨立地從ROB重新填充寄存器的兩半,ROB中的數據標記為以整個寄存器為目的地或以寄存器的底部一半為目的地的兩個16位值。
用ARM協處理器指令將數據加載進ROB中。如何在ROB中標記數據取決於用哪一條協處理器指令來執行傳送。下述ARM指令可用於以數據填充ROBLDP{cond}16/32 dest,[Rn]{!},#sizeLDP{cond}16/32W dest,wrap,[Rn]{!},#sizeLDP{cond}16U bank,[Rn]{!}MPR{cond} dest,RnMRP{cond} dest,Rn提供了下列ARM指令用於配置ROBLDPAbank list
前三條被彙編為LDC,MPR與MRP被彙編為MCR,LDPA被彙編為CDP指令。
上面dest代表Piccolo寄存器(A0-Z3),Rn代表一個ARM寄存器,size代表必須是4的非零倍數的固定字節數,而wrap代表常量(1、2、4、8)。用{}括起的欄位為選用的。為了使傳送能符合重定序緩衝器,size至多為32。在許多場合中,為了避免死鎖,size將小於這一限制。16/32欄位指示是否應將加載的數據作為16位數據對待並指示要採取的結尾(endian)特定的動作(見下面),或者是32位數據。
注1在下面的正文中,當引用LDP或LDPW時它指指令的16位與32位變型兩者。
注2『字』為來自存儲器的32位塊,它可包含兩個16位數據項或一個32位數據項。
LDP指令傳送若干數據項,將它們指派到一個全寄存器。這一指令將從存儲器中地址Rn加載size/4個字,將它們插入ROB中。能傳送的字數受下面的限制-量size必須是4的非零倍數;-size必須小於或等於特定實現的ROB的大小(在第一版本中為8個字,未來版本中保證不少於此)。
將傳送的第一數據項標記為指派到dest的,第二數據項指派到dest+1等等(從Z3繞回到A0)。如果指定了!,則此後將寄存器Rn增量size。
如果採用LDP16變型,隨著它們從存儲器系統返回,在構成32位數據項的2個16位半字上執行對結尾(endian)特定的操作。詳情見下面大結尾(Big Endian)與小結尾(Little Endian)支持。
LDPW指令傳送若干數據項到一組寄存器。將傳送的第一數據項標記為指派到dest,第二到dest+1,等等。當出現wrap傳送時,將下一個傳送的項標記為指派到dest,等等。wrap量是在半字的量指定的。
對於LDPW,適用下述限制-量size必須是4的非零倍數;-size必須小於或等於特定實現的ROB的大小(在第一版中為8個字,未來版本中保證不小於此);-dest可以是{A0、X0、Y0、Z0}之一;
-對於LDP32W,wrap可以是{2、4、8}個半字之一,對於LDP16W可以是{1、2、4、8}個半字之一;-量size必須大於2*wrap,否則不出現迴繞而應用LDP指令來代替。
例如,指令LDP32WX0, 2, [R0]!,#8將兩個字加載進ROB中,將它們指派給整個寄存器X0。R0將被增量8。指令LDP32WX0, 4, [R0], #16將四個字加載進ROB中,將它們標記為指派給X0,X1,X0,X1(按此次序)。R0不受影響。
對於LDP16W,可將wrap指定為1、2、4或8。1的迴繞將導致所有數據標記為指派給目的地寄存器dest.l的底部一半。這是『半寄存器』情況。
例如,指令LDP16WX0, 1, [R0]!,#8將兩個字加載進ROB中,將它們標記為指派給X0.l的16位數據。R0將被增量8。指令LDP16WX0, 4, [R0], #16的表現類似於LDP32W實例,但是在它從存儲器返回時在數據上執行對於結尾特定的操作除外。
LDP指令所有未使用的編碼可為將來擴展保留。
LDP16U指令是為支持16位不對齊的數據的高效傳送而提供的。LDP16U支持是為寄存器D4至D15(X、Y與Z組)提供的。LDP16U指令將一個32位數據字(包含兩個16位數據項)從存儲器傳送到Piccolo中。Piccolo將丟棄這一數據的底部16位而將頂部16位存儲在保持寄存器中。X、Y與Z組有一保持寄存器。一旦裝填了組中的保持寄存器,如果將數據指派給該組中的寄存器,便改變了LDP{W}指令的表現。加載進ROB中的數據由保持寄存器與正在用LDP指令傳送的數據的底部16位的連接構成。將正在傳送的數據的高16位放入保持寄存器中entry-data.l|holding_register
holding_register-data.h這一操作模式一直持續到用LDPA指令關閉為止。保持寄存器並不記錄目的地寄存器標記或大小。這一特徵是從提供data.l的下一個值的指令獲得的。
結尾的特定行為可永遠出現在存儲器系統返回的數據上。由於假定所有32位數據項在存儲器中都是字對齊的,不存在等效於LDP16U的非16位指令。
LDPA指令用於關閉LDP16U指令起動的不對齊操作模式。可以在組X、Y、Z上獨立關閉不對齊模式。例如指令,LDPA{X,Y}將關閉組X與Y上的不對齊模式。這些組的保持寄存器中的數據將被丟棄。
允許在不處於非對齊模式的組上執行LDPA,這將使該組在對齊模式中。
MPR指令將ARM寄存器Rn的內容放入ROB中,指派給Piccolo寄存器dest。目的地寄存器dest可以是範圍A0-Z3中的任何全寄存器。例如指令,MPRX0,R3將R3的內容傳送到ROB中,將數據標記為指派給全寄存器X0。
由於ARM是內部小結尾(endian)的,將數據從ARM傳送到Piccolo時不出現對結尾特定的表現。
MPRW指令將ARM寄存器Rn的內容放置在ROB中,將其標記為指派給16位Piccolo寄存器dest.l的兩個16位數據項。對dest的限制與對LDPW指令的相同(即A0、X0、Y0、Z0)。例如指令,MPRWX0, R3將R3的內容傳送到ROB中,將數據標記為指派給X0.l的兩個16位量。應指出對於帶有1迴繞的LDP16W,只能針對32位寄存器的底部一半。
至於MPR,在數據上不作用對於結尾特定的操作。
將LDP編碼為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
其中PICCOLO1為Piccolo的第一協處理器號(當前為8)。N位在LDP32(1)與LDP16(0)之間選擇。
LDPW編碼為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對於目的地寄存器A0、X0、Y0、Z0為0-3而WRAP對於迴繞值1、2、4、8為0-3。PICCOLO2為Piccolo的第二協處理器號(當前為9)。N位在LDP32(1)與LDP16(0)之間選擇。
將LDP16U編碼為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對於目的地組X、Y、Z為1-3。
將LDPA編碼為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<
其中BANK[30]用於在每組的基礎上關閉不對齊模式。如果設置了BANK[1],則關閉組X上的不對齊模式。BANK[2]與BANK[3]分別關閉組Y與Z上的不對齊模式,如果設置的話。注意,這是CDP操作。
將MPR編碼為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
將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能保持多達8個32位值。它們是用下述(ARM)操作碼之一從Piccolo傳送的STP{cond}16/32[Rn]{!}, #size
MRPRn第一個將來自輸出FIFO的size/4個字保存在ARM寄存器Rn給定的地址上,如果!存在,變址Rn。為防止死鎖,size不得大於輸出FIFO的大小(本實現中為8項)。如果採用STP16變型,在存儲器系統返回的數據上可出現對於結尾特定的表現。
MRP指令從輸出FIFO中消除一個字並將其放置在ARM寄存器Rn中。對於MPR在數據上不作用對於結尾特定的操作。
STP的ARM編碼為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<
其中N在STP32(1)與STP16(0)之間選擇。對於P、U與W位的定義,參見ARM資料手冊。
MRP的ARM編碼為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<
Piccolo指令集內部假定小結尾(little endian)操作。例如,在存取作為兩個16位的32位寄存器時,假定低一半佔用位15至0。Piccolo可在帶有大結尾(big endian)存儲器或外圍設備的系統中操作,因此必須注意以正確方式加載16位分組數據。
諸如ARM(如英國劍橋的先進RISC機器有限公司生產的ARM7微處理器)等Piccolo具有程式設計師能控制的『BIGEND』配置管腳,控制可以是用可編程外圍設備進行的。Piccolo利用該管腳來配置輸入重定序緩衝器及輸出FIFO。
當ARM將分組的16位數據加載到重定序緩衝器中時,它必須用LDP指令的16位格式指示這一點。這一信息與『BIGEND』配置輸入的狀態組合以適當的次序將數據放置在保持鎖存器與重定序緩衝器中。尤其是在大結尾模式中,保持寄存器存儲加載的字的底部16位,並與下一次加載的頂部16位配對。保持寄存器內容永遠結束在傳送到重定序緩衝器中的字的底部16位中。
輸出FIFO可包含分組16位或32位數據。程式設計師必須使用STP指令的正確格式以便Piccolo能保證將16位數據提供在數據總線的正確一半上。當配置成大結尾時,在使用16位格式的STP時,上與下16位兩半互換。
Piccolo具有只能從ARM存取的4個專用寄存器。它們稱作S0-S2。它們只能用MRC與MCR指令存取。操作碼為MPSRSn,RmMRPSRm,Sn這些操作碼在ARM寄存器Rm與專用寄存器Sn之間傳送32位值。它們是作為協處理器寄存器傳送在ARM中編碼的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
其中對於MPSR,L為0而對MRPS,L則為1。
寄存器S0包含Piccolo唯一的ID及修訂版本代碼。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
位[30]包含處理器的修訂版本號。
位[154]包含以二進位編碼的十進位格式的3位部件號piccolo為0×500位[2316]包含體系結構版本0×00=版本1位[3124]包含實現者商標的ASCII碼0×41=A=ARM有限公司寄存器S1為Piccolo狀態寄存器。
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
一級狀態碼標誌(N、Z、C、V)二級狀態碼標誌(SN、SZ、SC、SV)E位Piccolo已被ARM禁止並已停止。
U位Piccolo遇到未定義的指令並已停止。
B位Piccolo遇到斷點並已停止。
H位Piccolo遇到停止指令並已停止。
A位Piccolo遇到存儲器失敗(加載、存儲或Piccolo指令)並已停止。
D位Piccolo檢測到死鎖條件並已停止(見下)。
寄存器S2為Piccolo程序計數器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<
寫入程序計數器起動Piccolo在該地址上執行程序(如果停止則離開停止狀態)。復位時程序計數器是無定義的,因為Piccolo總是通過寫入程序計數器起動的。
執行期間,Piccolo監視指令的執行及協處理器接口的狀態。如果它檢測到-Piccolo已停止運行等待重新裝填寄存器或等待輸出FIFO具有可利用的項。
-協處理器接口為忙等待,由於ROB中空間不夠或輸出FIFO中項不夠。
如果檢測到這兩種狀態,Piccolo置位其狀態寄存器中的D位、停止並拒絕ARM處理器指令,導致ARM進入未定義指令陷阱。
死鎖狀態的檢測允許將系統構成為通過讀取ARM與Piccolo程序計數器及寄存器至少能警告程式設計師已出現該狀態及報告精確的故障點。應強調死鎖只能由於不正確的程序或系統的另一部分破壞Piccolo的狀態引發。死鎖不能由數據不足或『過載』引發。
可採用若干種操作從ARM控制Piccolo,它們是由CDP指令提供的。這些CDP指令只在ARM在特權狀態中才接受。如果不在該狀態中Piccolo將拒絕CDP指令而導致ARM處於未定義的指令陷阱。下面為可利用的操作-復位-進入狀態訪問模式-啟動-禁止Piccolo可用PRESET指令在軟體中復位。
PRESET;清除piccolo的狀態將這一指令編碼為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
執行這一指令時出現以下情況-將所有寄存器標記為空(準備好重新填充)。
-清除輸入ROB。
-清除輸出FIFO。
-復位循環計數器。
-將Pioccolo置於停止狀態(將置位S2的H位)。
執行PRESET指令可佔用若干周期來完成(對於本實施例2-3)。在正在執行它時,後面要在Piccolo上執行的ARM協處理器指令將處於忙等待。
在狀態訪問模式中,可使用STC及LDC指令保存與恢復Piccolo的狀態(見下面關於從ARM訪問Piccolo狀態)。為了進入狀態訪問模式,必須首先執行PSTATE指令PSTATE進入狀態訪問模式將這一指令編碼為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
在執行時,PSTATE指令將-停止Piccolo(如果它尚未停止),置位Piccolo的狀態寄存器中的E位。
-配置Piccolo進入其狀態訪問模式中。
執行PSTATE指令可佔用若干周期來完成,由於在停止以前Piccolo的指令流水線必須用完。當正在執行時,後面要在Piccolo上執行的ARM協處理器指令將是忙等待。
將PENABLE與PDISABLE指令用於快速上下文切換。當Piccolo被禁止時,只能訪問專用寄存器0與1(ID與狀態寄存器),並且只是從特權模式時。訪問任何其它狀態或從用戶模式的任何訪問將導致ARM未定義指令異常。禁止Piccolo導致它停止執行。當Piccolo已停止執行時,它通過置位狀態寄存器中的E位來確認這一事實。
Piccolo是通過執行PENABLE指令啟動的PENABLE;啟動Piccolo將這一指令編碼為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
Picclol是通過執行PDISABLE指令禁止的PDISABLE;禁止Piccolo將這一指令編碼為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
在執行這一指令時,出現以下情況-Piccolo的指令流水線將流完。
-Piccolo將停機及置位狀態寄存器中的H位。
Piccolo指令高速緩衝存儲器保持控制Piccolo數據路徑的Piccolo指令。如果存在,它保證保持至少64條指令,起始在16個字邊界上。下面的ARM操作碼彙編進MCR中。其操作為強制高速緩衝存儲器取出起始在指定地址上(必須是16字邊界)的一行(16條)指令。即使高速緩衝存儲器已保持有關於這一地址的數據也發生這一取出。
PMIRRm在能執行PMIR之前Piccolo必須停止。
這一操作碼的MCR編碼為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
本節討論控制Piccolo數據路徑的Piccolo指令集。各指令為32位長。指令是從Piccolo指令高速緩衝存儲器中讀取的。
解碼指令集是相當直觀的。高6位(26至31)給出主操作碼,位22至25為少數特定指令提供次要操作碼。帶灰色陰影的位當前不使用而為擴展保留(當前它們必須包含指定值)。
有11個主要指令類。這並不完全對應於提出在指令中的主操作碼,這是為了便於解碼某些子類。3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 9 8 7 6 5 4 3 2 1 01 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
上表中的指令具有以下名稱標準數據運算邏輯運算條件加/減未定義移位選擇未定義並行選擇乘累加未定義雙倍乘未定義移動帶符號立即數未定義重複重複寄存器列表操作轉移重新命名參數傳送停止/中斷在下面的節中詳細描述各類指令的格式。對於大多數指令,源與目的地操作數欄位是通用的並在單獨的節中詳細描述,寄存器重新映射也一樣。
大多數指令需要兩個源操作數;源1與源2。某些例外是飽和絕對值。
源1(SRC1)操作數具有以下7位格式18 17 16151413 12
欄位元素具有下述含義-大小-指示要讀的操作數大小(1=32位,0=16位)。
-再填充-規定讀後應將寄存器標記為空的並能從ROB再填充。
-寄存器號-編碼要讀取的16個32位寄存器中哪一個。
-高/低-對於16位讀指示讀取32位寄存器的哪一半。對於32位操作數,置位時指示應互換兩個16位一半。<
>在彙編程序中通過在寄存器號上加上後綴來指定寄存器大小1為低16位,h為高16位或.x為具有高與低16位交換的32位。
通用的源2(SRC2)具有以下三種12位格式之一1110 9 8 76 54 3 2 1 0<
>圖4示出根據高/低位與大小位將所選擇的寄存器的適當的一半切換到Piccolo數據路徑上的多路復用器裝置。如果大小位指示16位,則符號擴展電路根據需要用0或1填充數據路徑的高位。
第一種編碼指定源為寄存器,這些欄位具有與SRC1說明符相同的編碼。標度(SCALE)欄位指定要作用在ALU的結果上的標度。
帶有循環編碼的8位立即數允許生成可用8位值及2位循環表示的32位立即數。下表示出能從8位值XY生成的立即數值
6位立即數編碼允許使用6位不帶符號的立即數(從0到63),以及作用在ALU的輸出上的標度。
通用源2編碼對於大多數指令變型是通用的。對這一規則存在一些例外,它們支持源2編碼的有限子集或將其稍加修改-選擇指令。
-移位指令。
-並行操作。
-乘累加指令。
-乘雙倍指令。
選擇指令只支持寄存器或6位不帶符號立即數的一個操作數。由於這些位由指令的狀態欄位使用而得使該標度不可用。
11 10 98 7 6 5 4 3 2 1 0
SRC2_SEL移位指令只支持16位寄存器或1與31之間的5位無符號立即數的一個操作數。不能得到結果的標度。
11 10 9 876 5 43 2 1 0
SRC2_SHIFT在並行操作情況中,如果指定寄存器作為操作數的源,則必須執行32位讀。並行操作的立即數編碼略為不同。它允許將一個立即數複製到32位操作數的兩個16位一半中。並行操作可利用稍加限制範圍的標度。
11109 8 7 6 5 4 3 2 1 0
SRC2_PARALLEL如果使用6位立即數,則總是將它複製到32位量的兩個一半上。如果使用8位立即數,只有當循環指示應將8位立即數循環到32位量的頂部一半上時才複製。<
並行選擇操作不使用標度;必須將這些指令的標度欄位設置為0。
乘累加指令不允許指定8位循環立即數。該欄位的位10用來部分地指定使用哪一累加器。源2蘊含16位操作數。
11 10 98 7 6 54 3 2 1 0
SRC2_MULA乘雙倍指令不允許使用常量。只能指定一個16位寄存器。該欄位的位10用來部分地指定使用哪一個累加器。
11 10 9 8 7 6 5 4 3 2 1 0
SRC2_MULD某些指令總是蘊含32位操作(如ADDADD),並在這些情況中應將大小位設置為1,高/低位用來有選擇地互換32位操作數的兩個16位一半。某些指令總是蘊含16位操作(如MUL)並應將大小位設置為0。而高/低位選擇所使用的寄存器的哪一半(假定清除了失去的大小位)。乘累加指令允許獨立說明源累加器與目的地寄存器。對於這些指令,大小位用來指示源累加器,而大小位則由指令類型為0來蘊含。
當讀取16位值時(通過A或B總線)自動進行符號擴展將其擴展成32位量。如果讀取48位寄存器(通過A或B總線),在總線上只出現底部32位。從而在所有情況中都將源1與源2轉換成32位值。只有使用總線C的累加指令能存取累加器寄存器的整個48位。
如果置位再填充位,使用後便將該寄存器標記為空的並將由通常的再填充機制從ROB再填充(見關於ROB的節)。除非在進行再填充以前該寄存器再一次用作源操作數,Piccolo不會停止運行。在再填無的數據有效以前的最小周期數(最佳情況 數據等待在ROB頭部)為1或2。因此建議在再填充請求後面的指令上不要使用再填充的數據。如果能避免在後面兩條指令上使用操作數,應當這樣做,由於這可防止深層流水線實現上的性能損失。
在彙編程序中通過在寄存器號上加上後綴「^」來指定再填充位。標記為空的寄存器段取決於寄存器操作數。可將各寄存器的兩半標記為獨立地再填充的(例如X0.l^只標記再填充X0的底部一半,X0^則標記再填充整個X0)。當再填充48位寄存器的頂部「一半」(位4716)時,將16位數據寫入位3116並符號擴展到位47。
如果試圖再填充同一寄存器兩次(如ADD X0,X0^,X0^),只進行一次填充。彙編程序只允許語法ADD X1,X0,X0^。
如果在再填充一寄存器之前試圖讀該寄存器,Piccolo停止運行等待再填充該寄存器。如果標記寄存器為再填充,而在讀取再填充的值之前更新了該寄存器,結果是不可預測的(例如ADD X0,X0^,X1是不可預測的,由於它標記X0再填充,然後通過將X0與X1之和放置在其中來再填充)。
4位標度欄位編碼14種標度類型-ASR #0, 1, 2, 3, 4, 6, 8, 10-ASR #12至16-LSL #1並行最大/最小指令不提供標度,因此不使用源2的6位常量變型(彙編程序設置為0)。
在重複指令內支持寄存器重新映射,允許重複指令訪問寄存器的移動『窗口』而不迴繞循環。下面更詳細描述這一點。
目的地操作數具有以下7位格式
252423 22 212019
這一基本編碼有10種變型彙編程序助記符 25 24 23 22 21 20 19
寄存器號(DX)指示正在尋址的是16個寄存器中哪一個。高/低位與大小位一起工作來尋址作為一對16位寄存器的各32位寄存器。大小位定義如何設置指令類型中所定義的適當標誌,不論將結果是否寫入寄存器組與/或輸出FIFO,這允許構成比較及類似指令。帶累加的加法類指令必須將結果寫回寄存器。
下表示出各編碼的表現<
在所有情況中,任何操作寫回寄存器或插入輸出FIFO之前的結果為48位量。存在著兩種情況如果寫是16位的,通過選擇底部16位[150]將48位量減少到16位量。如果指令飽和,則值將飽和在範圍-2^15至2^15-1中。然後將16位值寫回到指定的寄存器,如果設置了寫FIFO位,則寫到輸出FIFO。如果將其寫到輸出FIFO,則將其保持到直到寫入下一個16位值將這兩個值配對並作為單一的32位值放入輸出FIFO中時。
對於32位寫,通過選擇底部32位[310]將48位量減少到32位量。
對於32位與48位寫兩者,如果指令飽和,便將48位值轉換成範圍-2^31-1至2^31中的32位值。接著該飽和-如果執行寫回到累加器,則寫入整個48位。
-如果執行寫回到32位寄存器,則寫位[310].
-如果指示寫回到FIFO,又一次寫位[310].
目的地大小是由彙編程序在寄存器號後面用.l或.h指定的。如果不執行寄存器寫回,則寄存器是不重要的,因此省略目的地寄存器來指示不寫到寄存器或使用^來指示只寫入輸出FIFO。例如,SUB,X0,Y0等效於CMP X0,Y0而ADD^,X0,Y0將X0+Y0之值放入輸出FIFO中。
如果輸出FIFO沒有值的空間,Piccolo停止運行等待空間成為可利用的。
如果寫出16位值,例如ADD X0.h^,X1,X2,則鎖存該值直到寫第二個16位值。然後將兩個值組合併作為一個32位數放入輸出FIFO中。寫入的第一個16位值總是出現在32位字的低位一半。將進入輸出FIFO的數據標記為16或32位數據,以允許在大結尾系統上校正結尾。
如果在兩次16位寫之間寫入32位值,則操作是未定義的。
重複指令內支持寄存器重新映射,允許重複指令訪問寄存器的移動『窗口』而不迴繞循環。下面更詳細地描述這一點。
在本發明的較佳實施例中,重複指令提供修改在循環中指定寄存器操作數的方式的機制。在這一機制下,要訪問的寄存器是用指令中的寄存器操作數及在寄存器組中的編移量的一個函數來確定的。該偏移量是以可編程方式改變的,最好在各指令循環的末尾。該機制可獨立地在位於X、Y與Z組中的寄存器上操作。在較佳實施例中,這一設施對於A組中的寄存器不能利用。
可使用邏輯與物理寄存器的概念。指令操作數為邏輯寄存器引用,然後將其映射到標識特定Piccolo寄存器10的物理寄存器引用。包含再填充在內的所有操作都在物理寄存器上操作。只在Piccolo指令流一側出現寄存器重新映射-加載進Piccolo的數據總是指派給物理寄存器而不執行重新映射。
進一步參照圖5討論重新映射機制,圖5為示出Piccolo協處理器4的若干內部部件的方框圖。將ARM核2從存儲器中檢索到的數據項放在重定序緩衝器12中,而Piccolo寄存器10則以較早參照圖2描述的方式從重定序緩衝器12再填充。將存儲在高速緩衝存儲器6中的Piccolo指令傳遞給在Piccolo 4內的指令解碼器50,在那裡在將它們傳遞給Piccolo處理器核54之前進行解碼。Piccolo處理器核54包含較早參照圖3討論的乘法器/加法器電路20、累加/累減電路22及定標/飽和電路24。
如果指令解碼器50正在處理構成用重複指令標識的指令循環的一部分的指令,而該重複指令指示了應進行若干寄存器的重新映射,便利用寄存器重新映射邏輯52來執行必要的重新映射。可將寄存器重新映射邏輯52認為是指令解碼器50的一部分,雖然熟悉本技術的人員清楚可將寄存器重新映射邏輯設置成完全與指令解碼器50分開的實體。
指令中通常包含標識包含指令所需的數據項的寄存器的一個或多個操作數。例如,典型的指令可包含兩個源操作數及一個目的地操作數,標識包含該指令所需的數據項的兩個寄存器及應將指令的結果放入其中的寄存器。寄存器重新映射邏輯52從指令解碼器50接收指令的操作數,這些操作數標識邏輯寄存器引用。根據邏輯寄存器引用,寄存器重新映射邏輯確定應不應施加重新映射,然後根據需要將重新映射作用在物理寄存器引用上。如果確定不應施加重新映射,便提供邏輯寄存器引用作為物理寄存器引用。稍後將詳細討論執行重新映射的較佳方式。
將來自寄存器重新映射邏輯的各輸出物理寄存器引用傳遞給Piccolo處理器核54,使得隨後處理器核能將指令作用在由物理寄存器引用標識的特定寄存器10中的數據項上。
較佳實施例的重新映射機制允許將各寄存器組分成兩部分,即可以重新映射的寄存器部分及保持它們原來的寄存器引用不重新映射的寄存器部分。較佳實施例中,重新映射部分起始於重新映射的寄存器組的底部。
重新映射機制採用若干參數,這些參數將參照圖6詳細討論,圖6為示出寄存器重新映射邏輯22如何使用各種參數的方框圖。應指出這些參數是相對於正在重新映射的組內的一點的給定值,這一點為例如該組的底部。
可認為寄存器重新映射邏輯52包括兩個主要邏輯塊,即重新映射塊56及基更新塊58。寄存器重新映射邏輯52採用提供加在邏輯寄存器引用上的偏移值的基指針,由基更新決58將這一基指針值提供給重新映射塊56。
可用基起始(BASESTART)信號來定義基指針的初始值,例如這通常是零,雖然一些其它值也可指定。將這一基起始信號傳遞給基更新塊58內的多路復用器60。在指令循環的第一次重複中,多路復用器60將基起始信號傳遞給存儲單元66,而對於循環的後面的重複,由多路復用器60將下一基指針值提供給存儲單元66。
將存儲單元66的輸出作為當前基指針值傳遞給重新映射邏輯56,並且還傳遞給基更新邏輯58內的加法器62的輸入之一。加法器62還接收提供基增量值的基增量(BASEINC)信號。加法器62配置成將存儲單元66所提供的當前基指針值增加該基增量值,並將結果傳遞給模電路64。
這一模電路還接收基環繞(BASEWRAP)值並將這一值與來自加法器62的輸出基指針信號比較。如果增量後的基指針值等於或大於基環繞值,便將新基指針繞回到新的偏移值。這時模電路64的輸出便是要存儲在存儲單元66中的下一基指針值。將這一輸出提供給多路復用器60,並從那裡到存儲單元66。
然而,在存儲單元66從管理重複指令的循環硬體接收到基更新(BASEUPDATE)信號之前不能將這一下一個基指針值存儲在存儲單元66中。循環硬體周期性地生成基更新信號,例如每當要重複指令循環時。當存儲單元66接收到基更新信號時,存儲單元便用多路復用器60提供的下一基指針值改寫前一基指針值。以這一方式,提供給重新映射邏輯58的基指針值將改變成新基指針值。
要在寄存器組的重新映射的部分內存取的物理寄存器由包含在指令的操作數內的邏輯寄存器引用與基更新邏輯58提供的基指針值之和確定。這一加法是由加法器68執行的並將輸出傳遞給模電路70。在較佳實施例中,模電路70還接收寄存器環繞值,如果來自加法器68的輸出信號(邏輯寄存器引用與基指針值之和)超過寄存器環繞值,結果將環繞回到重新映射區的底部。然後將模電路70的輸出提供給多路復用器72。
將寄存器計數(REGCOUNT)值提供給重新映射塊56內的邏輯74,標識組中要重新映射的寄存器的數目。邏輯74將這一寄存器計數值與邏輯寄存器引用比較,並根據比較結果將控制信號傳遞給多路復用器72。多路復用器72作為其兩個輸入接收邏輯寄存器引用及模電路70的輸出(重新映射的寄存器引用)。本發明的較佳實施例中,如果邏輯寄存器引用小於寄存器計數值,邏輯74便指令多路復用器72輸出重新映射的寄存器引用作為物理寄存器引用。然而,如果邏輯寄存器引用大於或等於寄存器計數值,邏輯74便指令多路復用器直接輸出邏輯寄存器引用作為物理寄存器引用。
如上所述,在較佳實施例中,重複指令調用重新映射機制。如稍後要詳細討論的,重複指令在硬體中提供四個零周期循環。這些硬體循環作為指令解碼器50的一部分示出在圖5中。每一次指令解碼器50請求來自高速緩衝存儲器6的指令時,高速緩衝存儲器便將該指令返回給指令解碼器,此時指令解碼器判定返回的指令是否是重複指令。如果是,便配置硬體循環之一來處理該重複指令。
各重複指令指定循環中的指令數及環繞循環的次數(它是常量或讀自Piccolo寄存器)。提供了兩個操作碼『重複』(REPEAT)及下一個(NEXT)來定義硬體循環,『下一個』操作碼只用作分界符並不彙編成指令。重複從循環的起點開始,而『下一個』界定循環的結束,允許彙編程序計算循環體中的指令數。在較佳實施例中,重複指令可包含要由寄存器重新映射邏輯52使用的諸如寄存器計數(REGCOUNT)、基增量(BASEINC)、基環繞(BASEWRAP)及寄存器環繞(REGWRAP)參數等重新映射參數。
可設置若干寄存器來存儲寄存器重新映射邏輯所使用的重新映射參數。在這些寄存器內,可提供若干組預定義的重新映射參數,同時保留一些寄存器供存儲用戶定義的重新映射參數。如果用重複指令指定的重新映射參數等於預定義的重新映射參數組之一,則採用適當的重複編碼,這一編碼導致多路復用器之類將適當的重新映射參數直接從寄存器提供給寄存器重新映射邏輯。反之,如果重新映射參數與任何預定義的重新映射參數組都不同,則彙編程序生成重新映射參數傳送指令(RMOV),它允許配置用戶定義的寄存器重新映射參數,RMOV指令後面是重複指令。最好RMOV指令將用戶定義的重新映射指令放置在為存儲這種用戶定義的重新映射參數留出的寄存器中,然後將多路復用器編程為將這些寄存器的內容傳遞給寄存器重新映射邏輯。
在較佳實施例中,寄存器計數、基增量、基環繞及寄存器環繞參數取下表中確定的值之一
參見圖6,重新映射塊56如何使用各種參數的示例如下(在本例中,邏輯與物理寄存器值是相對於特定組的)if(邏輯寄存器<REGCOUNT)物理寄存器=(邏輯寄存器+基)MOD REGCOUNTelse物理寄存器=邏輯寄存器end if在循環結束處,在循環的下一次重複開始前,基更新邏輯58執行對基指針的下述更新基=(基+BASEINC)MOD BASEWRAP在重新映射循環結束處,關閉寄存器重新映射,然後作為物理寄存器存取所有寄存器。較佳實施例中,任何一個時間上只有一個重新映射REPEAT(重複)是活躍的。循環還可嵌套,但在任何特定時刻只有一個循環能更新重新映射變量。然而如果需要,可以嵌套重新映射重複。
為了展示作為採用按照本發明的較佳實施例的重新映射機制的結果所達到的關於代碼密度的好處,下面討論典型的塊過濾算法。首先參照圖7討論阻塞過濾器算法的原理。如圖7中所示,將累加器寄存器A0配置成累加若干次乘法運算的結果,乘法運算為係數C0乘以數據項d0的乘法,係數c1乘以數據項d1的乘法,係數c2乘以數據項d2的乘法等。寄存器A1累加類似的乘法運算組的結果,但這時係數集合已移位使得c0現在乘以d1,c1乘以d2,c2乘以d3等。類似地,寄存器A2累加數據值乘以又向右移位一步的係數值的結果,使得c0乘以d2,c1乘以d3,c2乘以d4等。然後重複這一移位、乘及累加進程,將結果放在寄存器A3中。
如果不採用按照本發明的較佳實施例的寄存器重新映射,則需要下面的指令循環來執行塊過濾指令;以4個新數據值開始ZERO{A0-A3};清零累加器REPEAT Z1 ;Z1=(係數個數/4);在第一輪進行下面四個係數; 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*c3MULA A0,X0.l^,Y0.l,A0; a0 += d0*c0,及加載d4MULA A1,X0 h, Y0.l,A1; a1 += d1*c0MULAA2, 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.1^, 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
在本例中,將數據值放在X寄存器組中而將係數值放在Y寄存器組中。作為第一步,將四個累加器寄存器A0、A1、A2與A3設置為零。一旦復位了累加器寄存器,便進入指令循環,該循環是用『重複』(REPEAT)及『下一個』(NEXT)指令定界的。值Z1確定指令循環應重複的次數,為了下面將要討論的原因,它實際上等於係數(c0,c1,c2等)的個數除以4。
指令循環包括16條乘累加指令(MULA),在第一次通過循環之後這些提令將導致在寄存器A0,A1,A2,A3中包含上述重複與第一條MULA指令之間的代碼中所示的計算結果。為了說明乘累加指令如何操作,我們將考慮前四條MULA指令。第一條指令將X組寄存器0的第一或低16位的數據值乘以Y組寄存器0中的低16位,並將結果加到累加器寄存器A0中。同時用再填充位標記X組寄存器0的低16位,這指示該寄存器的該部分現在可用新數據值再填充。以這一方式標記是因為從圖7中可看出,一旦將數據項d0乘以係數c0(由第一條MULA指令表示),對於其餘塊過濾指令d0便不再需要,因此能用新數據值取代。
然後第二條MULA指令將X組寄存器0的第二或高16位乘以Y組寄存器0的低16位(這表示圖7中所示的乘法d1×c0)。類似地,第三與第四條MULA指令分別表示乘法d2×c0及d3×c0。從圖7中可見,一旦執行過這四個計算,係數c0便不再需要,因此用再填充位標記寄存器Y0.l使它能用另一係數(c4)改寫。
下面四條MULA指令分別表示計算d1×c1、d2×c1、d3×c1與d4×c1。一旦執行過d1×c1,使用再填充位標記寄存器x0.h,因為不再需要d1。類似地,一旦執行過全部四條指令,便將寄存器Y0.h標記為供再填充,因為不再需要係數c1。類似地,下面四條MULA指令對應於計算d2×c2、d3×c2、d4×c2及d5×c2,而最後四條指令則對應於計算d3×c3、d4×c3、d5×c3及d6×c3。
在上述實施例中,由於寄存器是不能重新映射的,各乘法運算必須用操作數中指定的所需特定寄存器明顯地再生。一旦執行過16條MULA指令,便能為係數c4至c7及數據項d4至d10重複這一指令循環。並且由於每一次重複該循環在四個係數值上操作。所以係數值的數目必須是4的倍數並必須計算Z1=係數數/4。
通過採用按照本發明的較佳實施例的重新映射機制,可以極大地縮小指令循環,使得它只包含4條乘累加指令而不是否則所需要的16條乘累加指令。採用重新映射機制,將代碼編寫成如下所列;以4個新數據值開始ZERO{A0-A3};清零累加器REPEAT Z1,X++ n4 w4 r4,Y++ n4 w4 r4 ;Z1=(係數的個數);對X與Y組進行重新映射;重新映射這些組中四個16位寄存器;在循環的每一次重複上將兩組的基指針遞增。
;當基指針到達該組中第四個寄存器時便繞回。
MULA A0,X0.l^,Y0.l, A0; a0 += d0*c0,及加載d4MULA A1,X0 h, Y0.l, A1; a1 += d1*c0MULA A2,X1.l, Y0.l, A2; a2 += d2*c0MULA A3,X1.h, Y0.l^, A3; a3 += d3*c0,及加載c4NEXT ;繞回到循環並進行重新映射如上所述,第一步將四個累加器寄存器A0-A3設置成0。然後進入用『重複』與『下一個』操作碼定界的指令循環。重複指令擁有與之關聯的若干參數,它們是X++指示對於X寄存器組基增量為「1」。
n4指示寄存器計數為「4」,因此要重新映射前四個X組寄存器X0.l至X1.hw4指示對於X寄存器組基環繞為「4」r4指示對於X寄存器組寄存器環繞為「4」Y++指示對於Y寄存器組基增量為「1」n4指示寄存器計數為「4」因此要重新映射前4個Y組寄存器Y0.l至Y1.h。
w4指示對於Y寄存器組基環繞為「4」r4指示對於Y寄存器組寄存器環繞為「4」還應指出,現在值Z1等於係數數目而不是先有技術示例中等於係數數目/4。
對於指令循環的第一次循環,基指針值為0,因此無重新映射。然而下一次執行循環時,對於X與Y組基指針值都將是「1」,因此將操作數重新映射如下X0.l成為X0.hX0.h成為X1.lX1.l成為X1.hX1.h成為X0.l(由於基環繞為「4」)Y0.l成為Y0.hY0.h成為Y1.lY1.l成為Y1.hY1.h成為Y0.l(由於基環繞為「4」)因此,在第二次重複時可看出,四條MULA指令實際上執行較早討論的不包含本發明的重新映射的示例中用第五至第八條MULA指令所指示的計算。類似地,第三與第四次重複通過循環執行前面用先有技術代碼的第九至第12及第13至第16條MULA指令執行的計算。
因此可以看出上述代碼執行與先有技術代碼完全相同的塊過濾算法,但將循環體內的代碼密度改進了一個因子4,由於只需要提供4條指令而不是先有技術所需的16條。
通過採用按照本發明的較佳實施例的寄存器重新映射技術,能實現下述優點1.改進代碼密度;2.在一定場合中隱藏從標記寄存器為空到Piccolo的重定序緩衝器再填充該寄存器的等待時間。這可以以增加代碼大小的代價通過解開循環來達到。
3.能存取可變數目的寄存器-通過改變執行的循環重複次數,可改變存取的寄存器數目;以及4.便於算法展開。對於適當的算法,程式設計師可為算法的第n階段生成一段代碼,然後利用寄存器重新映射將公式應用在一個滑動數據組上。
很明顯可以不脫離本發明的範圍對上述寄存器重新映射機製作出某些改變。例如,有可能為寄存器組10提供比程式設計師在指令操作數中所能指定的更多的物理寄存器。這些額外的寄存器不能直接存取,而寄存器重新映射機制能利用這些寄存器。例如,考慮早先討論的X寄存器組具有程式設計師可利用的4個32位寄存器並因而可用邏輯寄存器引用指定8個16位寄存器的示例。有可能使X寄存器組實際上包含例如6個32位寄存器,在這一情況中將有4個附加的16位寄存器不能由程式設計師直接存取。然而,這四個額外的寄存器能被重新映射機制利用,藉此為存儲數據項提供附加的寄存器。
可使用以下的彙編程序語法>>表示邏輯右移,或者在移位操作數為負時左移(見下面lscale)。
->>表示算術右移,或者在移位操作數為負時左移(見下面scale)。
ROR表示循環右移SAT(a)表示a的飽和值(取決於目的地寄存器的大小飽和到16或32位)。具體地,為了飽和到16位,任何大於+0x7fff的值用+0x7fff代替,而任何小於-0x8000的值則用-0x8000代替。類似地飽和到32位用極限+0x7fffffff與-0x80000000。如果目的地寄存器為48位,飽和仍然在32位上。
源操作數1可用下述格式之一Src1將用作[Rn|Rn.l|Rn.h|Rn.x][^]的簡寫。換言之,源說明符的所有7位都有效,並作為(可選擇地互換的)32位值或16位符號擴展的值讀取寄存器。對於累加器只讀取底部32位。^指示寄存器再填充。
src1_16是[Rn.l|Rn.h][^]的簡寫。只能讀取16位值。
src1_32是[Rn|Rn.X][^]的簡寫。只能讀取32位值,高與低一半有選擇地互換。
src_2(源操作數2)可以是下述格式之一src2是三種選項的簡寫-形式[Rn|Rn.l|Rn.h|Rn.x][^]的源寄存器,加上最終結果的標度(scale)。
-可選擇的移位的8位常量(immed_8),但無最終結果的標度。
-6位常量(immed_6)加上最終結果的標度(scale)。
src2_maxmin與src2相同但不允許定標。
src2_shift提供src2的有限子集的移位指令。見上述詳細情況。
src2_par在src2_shift方面對於指定第三操作數的指令acc四個累加器寄存器[A0|A1|A2|A3]中任何一個的簡寫。讀取全部48位。不能指定再填充。
目的地寄存器具有格式dest它是[Rn| Rn.l|Rn.h|.l|][^]的簡寫。不帶「.」擴展寫入整個寄存器(在累加器情況中為48位)。在不需要寫回到寄存器的情況中,所使用的寄存器是不重要的。彙編程序支持省略目的地寄存器來指示不需要寫回,或用「.l」來指示不需要寫回,但應設置標誌,猶如結果為16位量。^表示將值寫到輸出FIFO中。
scale表示若干算術標度。可以利用的有14種標度ASR #0,1,2,3,4,6,8,10ASR #12至16LSL #1
immed-8代表不帶符號的8位立即值。這包含循環左移0,8,16或24的一個字節。因此能為任何YZ編碼值0xYZ000000、0x00YZ0000、0x0000YZ00、及0x000000YZ。循環是作為2位的量編碼的。
imm_6代表不帶符號的6位立即數。
PARAMS用來指定寄存器重新映射並具有下述格式RANKBASEINCnRENUMBERwBASEWRAPBANK 可以是[X|Y|Z]BASEINC可以是[++|+1|+2|+4]RENUMBER 可以是
BASEWRAP 可以是[2|4|8]表達式cond為下述狀態碼中任何一種。注意編碼與ARM稍有不同,因為不帶符號的LS與HI碼已被更有用的帶符號的上溢/下溢測試所替代。Piccolo上的V與N標誌的設置與ARM的不同,因此從狀態測試到標誌檢驗的翻譯與ARM也不同。0000 EQ Z=0 上一次結果為0.0001 NE Z=1 上一次結果非0。0010 CS C=1 在移位/最大操作後使用。0011 CC C=00100 MI/LTN=1上一次結果為負0101 PL/GEN=0上一次結果為正0110 VS V=1 上一次結果帶符號溢出/飽和0111 VC V=0 上一次結果無溢出/飽和1000 VP V=1N=0上一次結果正溢出1001 VN V=1N=1上一次結果負溢出1010 保留1011 保留1100 GT N=0Z=01101 LE N=1|Z=11110 AL1111 保留由於Piccolo處理帶符號的量,棄掉不帶符號的LS與HI狀態而用描述任何溢出的方向的VP與VN來代替。由於ALU的結果為48位寬,MI與LT現在執行相同功能,類似地PL與GE。這留下3個空槽供未來擴展。
除非另有說明,所有運算都是帶符號的。
一級與二級狀態碼各包含N-負。
Z-零。
C-進位/不帶符號溢出。
V-帶符號溢出。
算術指令可分成兩類並行與「全寬度」。「全寬度」指令只設置一級標誌,而並行運算符根據結果的高與低16位一半設置一級與二級標誌。
在已施加定標但寫到目的地之前,N、Z與V標誌是根據整個ALU結果計算的。ASR將總是減少存儲結果所需位數,而ASL則增加位數。為了防止在施加ASL定標時Piccolo截尾48位結果,將位數限制在必須進行零檢測與溢出上。
N標誌是假設正在進行帶符號算術運算時計算的。這是因為在發生溢出時,結果的最高位是C標誌或N標誌之一,這取決於輸入操作數是帶符號還是不帶符號的。
V標誌指示作為將結果寫到選擇的目的地的結果是否出現任何精度損失。如果選擇了不寫回,仍然蘊含『大小』,並正確地設置溢出標誌。在下述情況中出現溢出-當結果不在範圍-2^15至2^15-1中時寫入16位寄存器。
-當結果不在範圍-2^31至2^31-1中時寫入32位寄存器。
並行加/減指令在結果的高與低一半上獨立地設置N、Z與V標誌。
當寫入累加器時和寫入32位寄存器一樣設置V標誌。這是允許飽和指令使用累加器作為32位寄存器。
飽和絕對值指令(SABS)在輸入操作數的絕對值不符合指定的目的地時也設置溢出標誌。
進位標誌由加與減指令設置並由MAX/MIN、SABS及CLB指令用作『二進位』標誌。包含乘法運算在內的所有其它指令保留進位標誌。
對於加與減運算,根據目的地是32還是16位寬,進位便是由位31或位15或結果生成的。
根據如何設置標誌,可將標準算術指令分成若干類型在加與減指令的情況中,如果N位是置位的則保持所有標誌。如果N位不置位則將標誌更新如下如果全48位結果為0便置位Z。
如果全48位結果中位47置位(是負的)則置位N。
如果下述條件之一成立則置位V目的地寄存器為16位而帶符號的結果放不進16位寄存器中(不在範圍-2^15<=x<2^15內)。
目的地寄存器為32/48位寄存器而帶符號的結果放不進32位中。
如果在求和src1與src2時從位31有進位或者從src1減去src2時位31不出現借位,則如果dest為32或48位寄存器時便置位C標誌(與ARM上的所期望的相同進位值)。如果dest為16位寄存器,別如果和的位31進位便置位C標誌。
保留二級標誌(SZ、SN、SV、SC)。
在從48位寄存器執行乘法或累加指令的情況中。
如果全48位結果為0便置位Z。
如果全48位結果中位47置位(是負的),則置位N。
如果(1)目的地寄存器為16位而帶符號的結果放不進16位寄存器(不在範圍-2^15<=x<2^15內)或(2)目的地寄存器為32/48位寄存器而帶符號的結果放不進32位中,便置位V。
保留C。
保留二級標誌(SZ、SN、SV、SC)。
下面討論包含邏輯運算、並行加與減、最大與最小、移位等在內的其它指令。
加與減指令將兩個寄存器相加或相減,定標該結果,然後存儲回到一個寄存器。將操作數作為帶符號的值對待。對於非飽和變型,標誌更新是供選用的,並可通過在指令尾部附加一個N來抑制標誌更新。
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)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)助記符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}彙編程序支持下述操作碼CMPsrc1,src2,CMNsrc1,src2,CMP為減法,它設置標誌並禁止寄存器寫。CMN為加法,它設置標誌並禁止寄存器寫。
標誌上面已討論過。
包含的理由在移位/最大/最小操作之後將進位插入寄存器底部ADC是有用的。它也用來進行32/32位除法。它也提供擴充精度加法。N位加法給出更精密的標誌控制,特別是進位。這使得32/32位除法能在每位2個周期上進行。
G.729等需要飽和的加與減。
增量/減量計數器。RSB對於計算移位是有用的(x=32-x是常用運算)。對於飽和的求反(用在G.729中)需要飽和的RSB。
加/減累計指令執行帶累計與定標/飽和的加法與減法。與乘累加指令不同,不能獨立於目的地寄存器指定累加器號。目的地寄存器的底部兩位給出要累計到其中的48位累加器號acc。因此ADDA X0,X1,X2,A0與ADDA A3,X1,X2,A3是有效的,而ADDA X1,X1,X2,A0則無效。對於這類指令,必須將結果寫回寄存器-不允許目的地欄位的不寫回編碼。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指定指令的類型。下面的acc為(DEST[10])。Sa位指示飽和。
操作(OPC)0dest={SAT}(acc+(src1+src2)){->>scale}1dest={SAT}(acc+(src1-src2)){->>scale}助記符0{S}ADDAdest、src1,src2、acc{,scale}1{S}SUBAdest、src1、src2、acc{,scale
命令前面的S表示飽和。
標誌見上面。
包含的理由ADDA(加累計)指令對於用累加器每一周期求和整數數組的兩個字是有用的(例如找出它們的平均值)。SUBA(減累計)指令在計算差之和(用於相關)中是有用的;它將兩個獨立的值相減並將差加到第三寄存器中。
帶四捨五入的加法可用與acc不同的dest進行。例如,X0=(X1+X2+16384)>>15可通過將16384保持在A0中而在一個周期中完成。帶四捨五入的常量的加法可用ADDA X0,X1,#16384,A0來完成。
對於((a_i*b_j)>>k)之和(在TrueSpeech中相當常用)的位精確實現標準Piccolo代碼為MUL t1,a_0,b_0,ASR#KADD ans,ans,t1MUL t2,a_1,b_1,ASR#kADD ans,ans,t2這一代碼有兩個問題它太長以及不是加到48位精度,因此不能用保護位。較好的解決方法為使用ADDAMUL t1,a_0,b_0,ASR#kMUL t2,a_1,b_1,ASR#kADDA ans,t1,t2,ans這提高25%速度並保持48位精度。
並行加/減指令在成對保持在32位寄存器中的兩個帶符號的16位量上執行加法與減法。一級狀態碼標誌從高16位的結果設置,而二級標誌則從低位一半更新。只能指定32位寄存器作為這些指令的源,雖然這些值是可以半字互換的。將各寄存器的各個一半作為帶符號的值對待。計算與定標是不損失精度完成的。因此ADD ADD X0,X1,X2,ASR#1將在X0的高位與低位一半中產生正確的平均值。為必須置位Sa位的各指令提供了選用的飽和。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)000 dest.h=(src1.h+src2.h)->>{scale},dest.l=(src1.l+src2.l)->>{scale}001 dest.h=(src1.h+src2.h)->>{scale},dest.l=(src1.l-src2.l)->>{scale}100 dest.h=(src1.h-src2.h)->>{scale},dest.l=(src1.l+src2.l)->>{scale}101 dest.h=(src1.h-src2.h)->>{scale},dest.l=(src1.l-src2.l)->>{scale}如果置位了Sa位,各和/差是獨立飽和的。助記符000 {S}ADDADDdest,src1_32,src2_32{,scale}001 {S}ADDSUBdest,src1_32,src2_32{,scale}100 {S}SUBADDdest,src1_32,src2_32{,scale}101 {S}SUBSUBdest,src1_32,src2_32{,scale}命令前的S表示飽和。彙編程序還支持CMNCMNdest,src1_32,src2_32{,scale}CMNCMPdest,src1_32,src2_32{,scale}CMPCMNdest,src1_32,src2_32{,scale}CMPCMPdest,src1_32,src2_32{,scale}它們是不帶寫回的標準指令生成的。
標誌C如果在相加兩個高16位一半時從位15進位,便置位。
Z如果高16位一半之和為0,便置位。
N如果高16位一半之和為負,便置位。
V如果高16位一半的帶符號的17位和不能裝入16位中(定標後),便置位。
類似地為低16位一半置位SZ、SN、SV與SC。
包含的理由並行加與減指令對於在保持在單個32位寄存器中的複數上執行運算是有用的。它們用在FFT(快速傅立葉變換)核心中。它對於16位數據的簡單矢量加法/減法也是有用的,允許在一個周期中處理兩個元素。
轉移(條件)指令允許控制流中的條件改變。Piccolo佔用三個周期來執行所取的轉移。
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
操作如果根據一級標誌cond成立,用偏移量轉移。
偏移量為帶符號的16位字數。當前偏移的範圍限制在-32768至+32767個字。
執行的地址計算是目標地址=轉移指令地址+4+偏移量助記符Bconddestination_label
標誌不受影響。
包含的理由在大多數例程中高度有用。
條件加或減指令有條件地將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)如果(進位置位)temp=src1-src2否則temp=src1+src2dest=temp{->>scale}如果(進位置位)temp=src1-src2否則temp=src1+src2dest=temp{->>scale}但是如果定標是左移位則將(來自src1-src2或src1+src2的)進位的新值移位進底部中。
助記符0 CAS dest,src1,src2,{,scale}1 CASC dest,src1,src2,{,scale}標誌見上面包含的理由條件加或減指令使高效除法代碼能構成。
例1將X0中的32位不帶符號值除以X1中的16位不帶符號值(假設X0<(X1<<1 6)及X1.h=0)。
LSL X1,X1,#15; 上移除數SUB X1,X1,#0 ; 置位進位標誌REPEAT#16CASC X0,X0,X1,LSL#1NEXT在循環末尾,X0.l保持除法的商。取決於進位的值可從X0.h恢復餘數。
例2將X0中的32位正值除以X1中的32位正值,帶早結束。
MOVX2,#0 ;清除商LOGZ0,X0 ;X0可移位的位數LOGZ1,X1 ;X1可移位的位數SUBS Z0,Z1,Z0 ;X1向上移位因此1匹配BLTdiv end;X1>X0因此答數為0LSLX1,X1,Z0 ;匹配前面的1ADDZ0,Z0,#1 ;進行的測試數SUBS Z0,Z0,#0 ;置位進位REPEAT Z0CASX0,X0,X1,LSL#1ADCN X2,X2,X2NEXTdiv_end在結束處,X2保持商而餘數可從X0恢復。
計數前導位指令使數據能正規化。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設定為為了使位31與位30不同而src1中的值必須左移的位數。這是範圍0-30中的一個值,但除外src1為-1或0的特殊情況,這時返回31。
助記符CLB dest,src1
標誌Z 如果結果為0,便置位。
N 是消除的。
C 如果src1為-1或0之一,便置位。
V 保持。
包含的理由正規化需要的步驟。
設置了停止與斷點指令用於停止Piccolo的執行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)0 Piccolo執行被停止並在Piccolo狀態寄存器中置位停止位。
1 Piccolo執行停止,並在Piccolo狀態寄存器中置位中斷位,並中斷ARM報告已到達斷點。
助記符0 HALT1 BREAK標誌不受影響。
邏輯運算指令在32或16位寄存器上執行邏輯運算。將操作數作為不帶符號值對待。
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)00 dest=(src1src2){->>scale}01 dest=(src1|src2){->>scale}10 dest=(src1-src2){->>scale}11 dest=(src1^src2){->>scale}助記符00AND dest,src1,src2{,scale}01ORR dest,src1,src2{,scale}10BIC dest,src1,src2{,scale}11EOR dest,src1,src2{,scale}彙編程序支持下述操作碼TSTsrc1,src2
TEQsrc1,src2
TST為禁止寄存器寫的「與」。TEQ為禁止寄存器寫的「EOR」。
標誌Z如果結果為全0,便置位N、C、V 保持SZ、SN、SC、SV 保持包含的理由話音壓縮算法採用組合位欄位來編碼信息。位屏蔽指令協助抽取/組合這些欄位。
Max與Min操作指令執行最大與最小值運算。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)0 dest=(src1<=src2)?src1src21 dest=(src1>src2)?src1src2助記符0MINdest,src1,src2
1MAXdest,src1,src2
標誌Z如果結果為0,便置位。
N如果結果為負,便置位。
C對於Max如果src2>=src1(dest=src1情況),置位C對於Min如果src2>=src1(dest=src2情況),置位CV保持包含的理由為了找出信號強度,許多算法掃描樣本來找出樣本的絕對值的最大/最小值。對此,MAX與MIN是無價之寶。取決於要找出信號中第一還是最後的最大值,操作數src1與src2可以互換。
MAX X0,X0,#0將X0轉換成從下面修剪掉的正數。
MIN X0,X0,#255從上面修剪掉。這對於圖形處理有用。
並行指令中的Max與Min運算在並行的16位數據上執行最大值與最小值運算。
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)0 dest.l=(src1.l<=src2.l)?src1.lsrc2.ldest.h=(src1.h<=src2.h)?src1.hsrc2.h1 dest.l=(src1.l>src2.l)?src1.lsrc2.ldest.h=(src1.h>src2.h)?src1.hsrc2.h助記符0MINMIN dest,src1,src2
1MAXMAX dest,src1,src2
標誌Z 如果結果的高16位為0,便置位。
N 如果結果的高16位為負,便置位。
C 對於Max如果src2.h>=src1.h(dest=src1情況),置位C對於Min如果src2.h=src1.h(dest=src2情況),置位C。
V保持。
SZ、SN、SC、SV類似地為低16位一半置位。
包含的理由關於32位Max及Min。
傳送長立即數操作指令允許將寄存器設置成任何帶符號的16位、符號延伸的值。兩條這種指令能將32位寄存器設置成任何值(通過順序存取高位與低位一半)。對於寄存器之間的傳送見選擇操作。
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 432 1 0
助記符MOV dest,#imm_16
彙編程序利用MOV指令提供非互鎖的NOP(空操作)操作,即,NOP等效於MOV,#0。
標誌標誌不受影響。
包含的理由初始化寄存器/計數器。
乘累加運算指令執行帶符號乘法與累加或累減(de-accumulation),定標與飽和。
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)00 dest=(acc+(src1*src2)){->>scale}01 dest=(acc-(src1*src2)){->>scale}在各情況中,如果置位了Sa位,在寫到目的地之前將結果飽和。
助記符00{S}MULAdest,src1_16,src2_16,acc{,scale}01{S}MULSdest,src1_16,src2_16,acc{,scale}命令前的S指示飽和。
標誌見上節。
包含的理由對於FIR代碼需要單周期持續的MULA。MULS用在FFT蝶形電路中。對於帶四捨五入的乘法MULA也是有用的。例如通過將16384保持在另一累加器(例如A1)中可在一個周期中完成A0=(X0*X1+16384)>>15。對於FFT核心還需要不同的dest與acc。
乘雙倍運算(Multiply Double Operation)指令執行單符號乘法,在累加或累減、定標與飽和之前將結果加倍。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)0 dest=SAT((acc+SAT(2*src1*src2)){->>scale})1 dest=SAT((acc-SAT(2*src1*src2)){->>scale})
助記符0SMLDAdest,src1_16,src2_16,acc{,scale}1SMLDSdest,src1_16,src2_16,acc{,scale}標誌見上節。
包含的理由G.729及使用小數算術運算的其它算法需要MLD指令。大多數DSP提供能在累加或寫回之前在乘法器的輸出上左移一位的小數模式。作為特定的指令支持它提供更大的編程靈活性。等價於某些G系列基本運算的名稱為L_msu=>SMLDSL_mac=>SMLDA在左移一位時它們利用乘法器的飽和。如果需要一序列的小數乘累加而不損失精度,可採用MULA,其和保持在33.14格式中。必要時,可在結束時利用左移及飽和轉換到1.15格式。
乘法運算指令執行帶符號乘法,及選用的定標/飽和。將源寄存器(只是16位)作為帶符號數對待。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)0 dest=(src1*src2){->>scale}1 dest=SAT((src1*src2){->>scale})助記符
0MULdest,src1_16,src2{,scale}1SMULdest,src1_16,src2{,scale}標誌見上節。
包含的理由許多處理需要帶符號與飽和的乘法。
寄存器列表操作用來在一組寄存器上執行操作。提供了空與零指令用於在例程之前或之間復位選擇的寄存器。提供了輸出指令將列出的寄存器的內容存儲到輸出FIFO中。
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 4 3 2 1 0
OPC指定指令的類型。
操作(OPC)000 對於(k=0;k<16;k++)如果置位了寄存器列表的位k,則將寄存器k標記為空。
001 對於(k=0;k<16;k++)如果置位了寄存器列表的位k,則將寄存器k設置成包含0。
010 未定義011 未定義100 對於(k=0;k<16;k++)如果置位了寄存器列表的位k,則將(寄存器k->>scale)寫到輸出FIFO中。
101 對於(k=0;k<16;k++)如果置位了寄存器列表的位k,則將(寄存器k->>scale)寫入到輸出FIFO中並將寄存器k標記為空。
110 對於(k=0;k<16;k++)如果置位了寄存器列表的位k,則將SAT(寄存器k->>scale)寫到輸出FIFO中。
111 對於(k=0;k<16;k++)如果置位了寄存器列表的位k,則將SAT(寄存器k->>scale)寫到輸出FIFO中並將寄存器k標記為空。助記符000EMPTY register_list
001ZERO register_list
010Unused011Unused100OUTPUTregister_list{,scale}101OUTPUTregister_list^{,scale}110SOUTPUT register_list{,scale}111SOUTPUT register_list^{,scale}標誌不受影響示例EMPTY {A0,A1,X0-X3}ZERO {Y0-Y3}OUTPUT{X0-Y1}^彙編程序還支持語法OUTPUT Rn在這一情況中,利用MOV^,Rn指令輸出一個寄存器。EMPTY指令將停止直到所有要清空的寄存器包含有效數據
(即不空)。
寄存器列表操作不得在重新映射REPEAT(重複)循環內使用。
輸出(OUTPUT)指令最多只能指定輸出8個寄存器。
包含的理由例程結束後,下一個例程期望所有寄存器是空的以便它能從ARM接收數據。需要EMPTY指令來做到這一點。在執行FIR或過濾器之前,需要將所有累加器及部分結果清零。ZERO(零)指令協助做到這一點。通過取代一系列單個寄存器傳送,兩者都設計成改善代碼密度。包含OUTPUT(輸出)指令通過取代一系列MOV^,Rn指令來改善代碼密度。
提供了重新映射參數傳送指令RMOV來允許配置用戶定義的寄存器重新映射參數。
該指令編碼如下
各PARAMS欄位包含以下的項6 5 4 3 21 0
這些項的含義如下
助記符RMOVPARAMS,[PARAMS]PARAMS欄位具有以下格式PARAMS∷=BANKBASEINCnRENUMBERwBASEWRAP
BANK ∷=[X|Y|Z]BASEINC∷=[-|+1|+2|+4]R ENUMBER ∷=
BASEWRAP ∷=[2|4|8]如果使用RMOV指令同時重新映射是活動的,其行為是UNPREDICTABLE(不可預測)。
標誌不受影響重複指令提供硬體中的4個零周期循環。重複指令定義新的硬體循環。Piccolo為第一條重複指令利用硬體循環0,為嵌套在第一重複指令內的重複指令利用硬體循環1等等。重複指令不需要指定正在使用哪一個循環。重複循環必須嚴格嵌套。如果試圖嵌套循環到大於4的深度,則行為是不可預測的。
各重複指令指定循環中的指令數(緊接在重複指令後面的)及通過循環的次數(它是常量或讀自Piccolo寄存器)。
如果循環中的指令數較少(1或2)則Piccolo可用額外周期來建立循環。
如果循環計數是寄存器指定的,則蘊含32位存取(S1=1),但只認為底部16位是有效的並且數字是不帶符號的。如果循環計數為0,則循環的操作是未定義的。採取循環計數的複製,因此立即可以重用該寄存器(甚至再填充)而不影響循環。
重複指令提供修改指定循環內的寄存器操作數的方式的機制。細節上面已描述過。
帶有寄存器指定的循環數的重複的編碼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<
帶固定的循環數的重複的編碼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
>RFIELD操作數指定在循環內使用16種重新映射參數配置的哪一種。<
>彙編程序提供兩個操作碼REPEAT與NEXT來定義硬體循環,REPEAT在循環開始時而NEXT界定循環的結束,允許彙編程序計算循環體內的指令數。至於REPEAT,它只須作為常量或寄存器指定循環次數。例如REPEATX0MULA A0,Y0.l,Z0.l,A0MULA A0,Y0.h^,Z0.h^,A0NEXT這將執行兩條MULA指令X0次。同時,REPEAT#10MULA A0,X0^,Y0^,A0NEXT將執行10次乘累加。彙編程序支持語法
REPEAT#iterations[,PARAMS]以指定重複所用的重新映射參數。如果所需的重新映射參數等於預定義的參數組之一,則使用適當的REPEAT編碼。如果不是,則彙編程序將生成RMOV來加載用戶定義的參數,後面跟隨REPEAT指令。見上面的節中的RMOV指令及重新映射參數格式的細節。
如果循環的重複次數為0則REPEAT的操作是不可預測的。
如果將指令欄位的數字設置為0則REPEAT的操作是不可預測的。
循環只包含一條指令而該指令為轉移時,則具有不可預測的表現。
從REPEAT循環界內轉移到該循環的界外是不可預測的。
飽和絕對值指令計算源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 !助記符SABSdest,src1
標誌Z 如果結果為0,便置位。
N 保持。
C 如果src1<0(dest=-src1情況),便置位。
V 如果出現飽和,便置位。
包含的理由在許多DSP應用中有用。
選擇操作(條件傳送)用來有條件地將源1或源2傳送到目的地寄存器中。選擇總是等效於傳送。還有在並行加/減以後使用的並行操作。
注意為了實現的原因,可讀取兩個源操作數,如果其中之一為空,指令將停止,不管該操作數是否是嚴格需要的。
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)00 如果cond對一級標誌成立則dest=src1否則dest=src201 如果cond對一級標誌成立 則 dest.h=src1.h否則dest.h=src2.h如果cond對二極標誌成立則dest.l=src1.l否則dest.l=src2.l10 如果cond對一級標誌成立則dest.h=src1.h否則dest.h=src2.h如果cond對二級標誌成立 則 dest.l=src1.l否則dest.l=src2.l11 保留助記符00 SELcond dest,src1,src2
01 SELTTconddest,src1,src2
10 SELTFconddest,src1,src2
11不用如果將寄存器標記為再填充,無條件將其再填充。彙編程序還提供下列助記符
MOVcond dest,src1
SELFTconddest,src1,src2
SELFFconddest,src1,src2
MOVcondA,B等效於SELcondA,B,A。通過互換src1與src2及使用SELTF、SELTT得到SELFT及SELFF。
標誌保持所有標誌以便可以執行一序列選擇。
包含的理由用於在線作出簡單決定而無須依靠轉移。用於Viterbi算法及在樣本或矢量中掃描最大元素時。
移位操作指令提供邏輯左與右移,算術右移及循環指定的量。認為移位量是取自寄存器內容的低8位的-128與+127之間的帶符號整數或者在範圍+1至+31中的立即數。負數量的移位導致反方向上移位ABS(移位量)。
將輸入操作數符號擴展到32位;在寫回前將得出的32位輸出符號擴展到48位從而寫到48位寄存器表現合理。
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)00dest=(src2>=0)?src1<<src2src1>>-src201dest=(src2>=0)?src1>>src2src1<<-src210dest=(src2>=0)?src1->>src2src1<<-src211dest=(src2>=0)?src1 ROR src2src1 ROL -src2
助記符00 ASLdest,src1,src2_16
01 LSRdest,src1,src2_16
10 ASRdest,src1,src2_16
11 RORdest,src1,src2_16
標誌Z 如果結果為0,便置位。
N 如果結果為負,便置位。
V 保持C 設置成移位出來的最後一位的值(和在ARM上一樣)寄存器指定的移位的行為為-LSL移位32得出結果0,C設置為src1的位0。
-LSL移位32以上得出結果0,C設置為0。
-LSR移位32得出結果0,C設置為src1的位31。
-LSR移位32以上得出結果0,C設置為0。
-ASR移位32或以上得出用src1的位31填充及C設置為src1的位31。
-ROR移位32具有結果等於src1並將C設置成src1的位31。
-ROR移位n位,其中n大於32,給出執行ROR移位n-32位相同的結果;因此從n中重複減去32直到該量在1至32範圍中為止,見上。
包含的理由用2的冪乘/除。位與欄位抽取。串行寄存器。
將未定義的指令在指令集清單中陳述如上。它們的執行將導致Piccolo停止執行,並置位狀態寄存器中的U位,及禁止它本身(似乎清除了控制寄存器中的E位)。這允許截獲指令集的任何未來擴充並在現有實現上有選擇地仿真。
從ARM訪問Piccolo狀態如下。狀態訪問模式用來觀察/修改Piccolo的狀態。為兩種目的設置這一機制-上下文切換。
-調試。
通過執行PSTATE指令將Piccolo置於狀態訪問模式中。這一模式允許用一序列STC與LDC指令保存及恢復所有Piccolo狀態。當進入狀態訪問模式時,將Piccolo協處理器ID PICCOLO1的使用修改成允許訪問Piccolo的狀態。有7組Piccolo狀態。可以用單一的LDC或STC加載與存儲特定組中的所有數據。
組0專用寄存器。
-一個32位字,包含Piccolo ID寄存器的值(只讀)。
-一個32位字,包含控制寄存器的狀態。
-一個32位字,包含狀態寄存器的狀態。
-一個32位字,包含程序計數器的狀態。
組1通用寄存器(GPR)-16個32位字,包含通用寄存器狀態。
組2累加器-4個32位字,包含累加器寄存器的高32位(注意,為了恢復的目的,以GPR狀態進行複製是必要的-否則會蘊含該寄存器組上的另一次寫使能)。
組3寄存器/Piccolo ROB/輸出FIFO狀態。
-一個32位字,指示哪些寄存器標記為再填充(每一個32位寄存器2位)。
-8個32位字,包含ROB標籤的狀態(存儲在位7至0中的8個7位項)。
-3個32位字,包含不對齊的ROB鎖存器的狀態(位17至0)。
-一個32位字,指示輸出移位寄存器中哪些槽包含有效數據(位4表示空,位3至0編碼所用項的號碼)。
-一個32位字,包含輸出FIFO保持鎖存器的狀態(位17至0)。
組4ROB輸入數據。
-8個32位數據值。
組5輸出FIFO數據。
-8個32位數據值。
組6循環硬體。
-4個32位字,包含循環起始地址。
-4個32位字,包含循環結束地址。
-4個32位字,包含循環計數(位15至0)。
-一個32位字,包含用戶定義的重新映射參數及其它重新映射狀態。
LDC指令用於在Piccolo在狀態訪問模式中時加載Piccolo狀態。BANK欄位指示正在加載哪一個組。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
以下序列加載來自寄存器R0中的地址的所有Piccolo狀態。
LDP B0,[R0],#16 !;專用寄存器LDP B1,[R0],#64 !;加載通用寄存器LDP B2,[R0],#16 !;加載累加器LDP B3,[R0],#56 !;加載寄存器/ROB/FIFO狀態LDP B4,[R0],#32 !;加載ROB數據LDP B5,[R0],#32 !;加載輸出FIFO數據LDP B6,[R0],#52 !;加載循環硬體STC指令用於在Piccolo在狀態訪問模式中時存儲Piccolo狀態。BANK欄位指定正在存儲哪一個組。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
以下序列將所有Piccolo狀態存儲到寄存器R0中的地址。
STP B0,[R0],#16 !;保存專用寄存器STP B1,[R0],#64 !;保存通用寄存器STP B2,[R0],#16 !;保存累加器STP B3,[R0],#56 !;保存寄存器/ROB/FIFO狀態STP B4,[R0],#32 !;保存ROB數據STP B5,[R0],#32 !;保存輸出FIFO數據
STP B6,[R0],#52 !;保存循環硬體調試模式-Piccolo需要響應與ARM所支持的相同的調試機制,即軟體通過Demon與Angel,以及帶有嵌入的ICE的硬體,下面是調試Piccolo系統的若干機制-ARM指令斷點。
-數據斷點(觀察點)。
-Piccolo指令斷點。
-Piccolo軟體斷點。
ARM指令與數據斷點是由ARM嵌入的ICE模塊處理的;Piccolo指令斷點是由Piccolo嵌入的ICE模塊處理的;Piccolo軟體斷點是由Piccolo核處理的。
硬體斷點系統可配置成使ARM與Piccolo兩者都有斷點。
軟體斷點由Piccolo指令(停機或中斷)處理,導致Piccolo停止執行,進入調試模式(置位狀態寄存器中的B位)及禁止本身(似乎已用PDISABLE指令禁止Piccolo)。程序計數器保持有效,允許恢復斷點地址。Piccolo不再執行指令。
單步進Piccolo可通過在Piccolo指令流上設定一個斷點接一個斷點來完成。
軟體調試-Piccolo提供的基本功能便是在狀態訪問模式中通過協處理器指令加載與保存所有狀態到存儲器中的能力。這允許調試程序將所有狀態保存在存儲器中,讀取與/或更新它及恢復到Piccolo中。Piccolo存儲狀態機制是非破壞性的,即Piccolo的存儲狀態操作不會破壞任何Piccolo內部狀態。這意味著Piccolo在轉儲其狀態之後不首先再一次恢復它便能重新起動。
要確定找出Piccolo高速緩衝存儲器的狀態的機制。
硬體調試-硬體調試由Piccolo的協處理器接口上的掃描鏈提供。然後可將Piccolo置於狀態訪問模式中並通過該掃描鏈檢驗/修改其狀態。
Piccolo狀態寄存器包含單一的位來指示它已執行了斷點指令。在執行斷點指令時,Piccolo置位狀態寄存器中的B位,並停止執行。為了能查詢Piccolo,調試程序必須啟動Piccolo並通過在能出現隨後的存取之前寫入其控制寄存器而將其置於狀態訪問模式中。
圖4示出響應高/低位及大小位將選擇的寄存器的適當的一半切換到Piccolo數據路徑上的多路復用器配置。如果大小位指示16位,則符號擴展電路用適當的0或1填充數據路徑的高位。第二節圖8示出圖1的系統的一個修改和擴展的版本。該中央處理單元核2包括一個指令解碼器80,一個指令流水線82,一個寄存器組84和一個存儲器控制器86。在操作中,由存儲器控制器86從存儲器8中檢索CPU指令,並且提供給指令流水線82。指令沿著指令流水線82前進,直到它們到達接近該指令解碼器80的那一級。在該級,完成該指令的解碼用於執行。該指令解碼器80使用邏輯電路響應在該指令中的位欄位,以提供控制信號,用於配置和驅動該中央處理單元核2的其他部分以執行該所需要的數據處理操作。在實際上,該中央處理單元核2包括許多功能塊,諸如一個算術邏輯單元,一個乘法器,一個高速緩存和一個存儲器管理單元。
在當前的情況下,在該指令解碼器80解碼一條協處理器存儲器訪問指令時,就在該寄存器組84中指定一個寄存器,該寄存器保存一個地址值,該地址值用作該存儲器8中的一個存儲單元的地址指針。通過該存儲器控制器將該地址值驅動到至存儲器8的地址總線上,以啟動突發模式的傳送。被傳送的數據不用於中央處理單元核2,而是用於協處理器4。相應地,除了產生存儲器8的適當的地址,該中央處理單元核2不響應在該存儲器8和協處理器4之間的數據總線上確立的數據字。該指令解碼器80也產生協處理器控制信號(CP Control),該信號被傳遞到協處理器4。這些協處理器控制信號向協處理器4指示一個協處理器存儲器訪問指令正在被執行,並且相應地該協處理器4應當採取適當的動作將數據驅動到數據總線上,或者從該數據總線上讀取數據。傳遞到該協處理器4的協處理器控制信號包括正在執行的協處理器存儲器訪問指令中的尋址方式信息的至少一部分。更具體地說,至少將P標記,U標記和偏移值M傳遞到該協處理器4。
該協處理器4通過對這些位執行一個異或(EOR)操作解碼P標記和U標記。根據這一異或操作的執行結果,協處理器確定在當前突發模式中要傳送的數據字的數量是否由傳遞到它並且存儲在該寄存器88中的偏移值M確定,或者是一個數據字的預設值。該協處理器傳送控制器90響應該寄存器88的輸出和該異或操作的結果,以對在該數據總線上接收到的數據字進行計數,並且在接收到指定數量的數據字時,確立一個突發傳送結束信號(be),該信號返回給該存儲器8和該中央處理單元核2以終結由所執行的該協處理器存儲器訪問指令啟動的傳送。該協處理器4從該數據總線接收到的任何數據字被加載進該重定序緩衝區12,然後由該協處理器核92進行處理。作為一種替換,該協處理器4可將該突髮長度直接提供給該存儲器8(對於一些存儲器,例如同步DRAM,這是有用的)。
圖9示意了上述的一個協處理器存儲器訪問指令的操作。
該過程從步驟94開始,然後前進到步驟96,在該步驟中央處理單元讀取嵌在該協處理器存儲器訪問指令中的尋址方式信息,而同時該協處理器讀取這一同樣的尋址方式的至少一部分,以從中確定在該次傳送中的數據字的數量。
在步驟98,該CPU產生尋址開始地址,該地址被提供給存儲器8。在步驟100,進行該存儲器8和該協處理器4之間的直接的數據字的傳送。在每次傳送一個數據字時,該協處理器4在步驟102確定由該協處理器存儲器訪問指令指定的所有數據字是否已經被傳送。
如果該傳送沒有完成,則該操作繼續,在步驟104該中央處理單元核2執行任何對該地址的任何必要的更新,並且該流程返回到步驟100。
如果該次數據傳送結束,則該系統前進到步驟106,在該步驟,協處理器通過確立該突髮結束信號(be)終止該次傳送,該信號被傳遞到存儲器8和中央處理單元核2。在步驟108,中央處理單元核2通過該協處理器存儲器訪問指令指定的方式更新地址指針(這也可以在該過程中的另一點進行)。該過程在步驟110結束。
為了改進性能,該傳送可以以一種更加並行的方式進行,例如該協處理器甚至在傳送第一個字開始之前將向該中央處理單元指示是否要傳送第二個數據字。
下面根據本發明的一個實施例詳細描述各種協處理器存儲器訪問指令操作的細節。從控制傳送的數據字的數量的角度來看,根據P標記和U標記的解碼這些指令的所有操作可以總結成下面的地址傳送模式中的一種。
傳送開始 在地址寄存器中 所傳送的數據字地址值 的最後值的數量(i) Rn Rn-(WL*M) 1(ii) Rn Rn M(iii)Rn Rn+(WL*M) M(iv) Rn-(WL*M) Rn M(v) Rn-(WL*M) Rn-(WL*M) M(vi) Rn+(WL*M) Rn 1(vii)Rn+(WL*M) Rn+(WL*M) 1另外的一個可能性是在該基寄存器是ARM程序計數器寄存器(PC或R15)時使傳送數據字的數量為1。這將修改對於P EOR(U或(基寄存器是PC))確定傳送一個數據字的邏輯。將存儲器的數據加載進該重定序緩衝區格式總結提供了用於以存儲器的數據填充該重定序緩衝區的兩個主要的指令格式-LDP-LPM這兩種指令格式都被編碼為ARM LDC指令。該LDP指令類總是從存儲器傳送一個32位的數據字。該LPM指令類可用於傳送多個數據字。在該指令位模式的層次上,用所使用的尋址方式位區別LDP和LPM;對於LDP和LPM彙編程序語法使用不同的助記符,幫助人們編寫或者閱讀關於指向一個或多個字傳送的代碼。下列的格式可用於該兩類指令LDP{cond}[32|16]dest,addressLDP{cond}16Ubank,addressLPM{cond}[A|D][32|16]Rn{!},[Rlist]{,#wordcount}LPM{cond}[A|D]16 Rn{!},bank0.l,#wordcount其中{} 指示一個選項欄位。cond 該ARM指令條件代碼欄位。32|16指示該被加載的數據是否作為16位的數據,以及所採取的結尾特定的動作(見較早的有關STP 16和STP 32的描述),或者作為32位的數據。dest 指定Piccolo目的寄存器(A0-Z3)address可以是[Rn][Rn,#+ve_offset]{!}[Rn],#-ve_offsetRn是計算有效的ARM寄存器號的表達式。!指示該所計算的地址應被回寫到基寄存器。#+ve_offset是一個計算一個偏移值的表達式,該表達式可以表示為+8_bit_offset*4。這一偏移加值到該基寄存器上以形成該加載地址,即該地址被預變址。#-ve_offset是一個計算一個偏移值的表達式,該表達式可以表示為-8_bit_offset*4。該加載地址是基寄存器Rn的值,從Rn中減去該偏移值,並且將該結果回寫到Rnbank 指示該3個非累加器Piccolo組之一(X|Y|Z)。A|D指示先增(遞增)或者後減(遞減)尋址方式。RlistPiccolo寄存器號的一個遞增表,用′{}′括起,例如{X0,X1}。 對於Piccolo的第一個版本,最多可指定8個寄存器。該表可以通過該寄存器組的頂部而迴繞。例如{Y2,Y3,A0,A1}是一個有效的寄存器表。bank0.l 指示4個16位Piccolo寄存器(A0.l|X0.1|Y0.l|Z0.l)中的一個。Wordcount用於在一個所選定的寄存器範圍內進行迴繞加載,其指示傳送的數據項的總數量。對於Piccolo的第一個版本,在一個LPM指令中可以傳送不超過8個數據項。
在使用該list格式時,用list指定的寄存器表必須以(A0,X0,Y0,Z0)中的一個開始,並且該寄存器表可以指示1,2或者4個寄存器,即{X0}{x0,x1}{X0,X1,X2,X3}是X寄存器組的有效的list組合,wordcount必須大於(Rlist)的長度。LPM的指令的這一格式將傳送總共wordcount個數據項,在到達Rlist的結尾時,對於在Rlist中的每個寄存器依次標記它們以迴繞到該Rlist的開始。在使用bank0.l格式時,對於Piccolo的第一個版本,wordcount可以在範圍(1-8)。LPM指令的這一格式將加載2*wordcount個16位的數據項,標記寄存器bank0.l的所有數據。例子LDPNE32 A1,[R0] ;如果Z標記=0,以mem(R0)加載A1,;將數據作為32位對待。LDP16 X0,[R0,#16]! ;以mem(R0+16(字節)))加載X0,;回寫R0+16到 R0。將數據;作為壓縮的16位對待。LDP32 Y2,[R0],#-4 ;以mem(R0)加載Y2,;回寫(R0-#4)至R0。LDP16U X,[R0,#4];以mem(R0+#4(字節))填充X組非對齊鎖存器。LPMEQA32 R0 !,{X2,X3,Y0,Y1} ;如果Z標記=1,則在;存儲器中從[R0]以上升;的順序加載4個字,將它;們標記為寄存器X2,X3,;Y0,Y1。回寫到R0。LPMA16 Ri!,{X0,X1},#8 ;在存儲器從[R1]以上升的順序;加載8個字的壓縮的16位數據,;將它們標記為寄存器X0,X1,;X0,X1,X0,X1,X0,X1指令編碼LDP指令LDP指令從存儲器傳送一個32位的字。這些指令中的一些執行回寫,但是,根據彙編程序的語法,不用「!」進行標記,因為後變址總是隱含著回寫。有兩種變化LDP{cond}[32|16] dest,[Rn],#-ve_offsetLDP{cond}[32|16] dest,[Rn,#+ve_offset]{!}該尋址方式由P,U和W位確定。在該指令中這些位分別是位24,23,和21。
使用組合P=0,U=0和W=1來編碼下列格式的指令LDP{cond}[32|16]dest,[Rn],#-ve_offset從地址[Rn]只傳送一個字。在傳送開始以後,將該基寄存器減少8_bit_offset*4。該N位指示LDP32(1)或者LDP16(0)。8_bit_offset編碼mod(#-ve_offset)/4。對於向後經過數據結構每次提取一個特定的字,這一特殊的指令是有用的。類似的所希望的功能由其他的指令相配。3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 11 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0+-------+-----+---+-+---+-------+-------+-------+---------------+| cond |1 1 0|0 0|N|1 1| Rn | dest | pic_1 | 8_bit_offset |+-------+-----+---+-+---+-------+-------+-------+---------------+組合P=1,U=1用於編碼下列形式的指令LDP{cond}[32|16)dest,[Rn,#+ve_offset]{!}從地址[Rn+#+ve_offset]只傳送一個字。如果該W位被設置,該基寄存器就遞增8_bit_offset*4,即具有由所存在的可選項「!」指示的回寫的形式。如果W=0,則不發生回寫,「!」不存在。該N位指示LDP32(1)或者LDP16(0)。8_bit_offset編碼#+ve_offset/4。Pic_1(和後面引用的Pic_2)是標識該協處理器是一個Piccolo協處理器的標識數字。Piccolo具有兩個標識數字,它們根據所考慮的指令被使用。3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 11 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0+-------+-----+---+-+-+-+-------+-------+-------+---------------+| cond |1 1 0|1 1|N|W|1| Rn|dest | pic_1 | 8_bit_offset |+-------+-----+---+-+-+-+-------+-------+-------+---------------+LDP16ULDP16U指令用來填充3個非對齊保持鎖存器中的一個。它具有下列變化LDP{cond}U16 bank,[Rn],#-ve_offsetLDP{cond}U16 bank,[Rn,#+ve_offset]{!}該尋址方式由P和U位確定。組合P=0,U=0 and W=1用來編碼下列形式的指令LDP{cond}U16 dest,[Rn],#-ve_offset從地址[Rn]只傳送一個字。在該傳送之後,用#-ve_offset修改該基寄存器。3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 11 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0+-------+-----+---+-+-+-+-------+---+---+-------+---------------+| cond |1 1 0|0 0|0|1|1| Rn |bnk|0 0| pic_2 | 8_bit_offset |+-------+-----+---+-+-+-+-------+---+---+-------+---------------+bnk指示要開啟非對齊方式的組。對於組X,Y或Z,它可取1-3。組合P=1和U=1用來編碼下列形式的指令LDP{cond}U16dest, [Rn, #+ve_offset]{!}從地址[Rn+#+ve_offset]只傳送一個字。如果設置了W位,用#+ve_offset修改該基寄存器。如果W=0,則沒有回寫。3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 11 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0+-------+-----+---+-+-+-+-------+---+---+-------+---------------+| cond |1 1 0|1 1|0|W|1| Rn |bnk|0 0| pic_2 | 8_bit_offset |+-------+-----+---+-+-+-+-------+---+---+-------+---------------+bnk指示要開啟非對齊方式的組。對於組X,Y或Z,它可取值1-3。LPM指令LPM指令從存儲器傳送多個字。該指令具有下列變形LPM{cond}[A|D][32|16]Rn{!}, [RList]LPM{cond}[A|D][32|16]Rn{!}, [Rlist], #wordcountLPM{cond}[A|D]16 Rn{!}, bank0.l, #wordcount對於LPMA變形P=0,U=1,該指令被編碼為3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 11 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0+-------+-----+---+-+-+-+-------+-------+-------+---------------+| cond |1 1 0|0 1|N|W|1| Rn |basereg| pic_1 | 8_bit_offset |+-------+-----+---+-+-+-+-------+-------+-------+---------------+其中該N位指定LPMA32(1)或者LPMA16(0)。
如果W=1,該W位指示basereg=offset*4向該基寄存器的回寫。basereg指示在Rlist中的第一個Piccolo。8_bit_offset指示傳送的寄存器的數量。對於LPMD變形P=1,U=0,該指令編碼為3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 11 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0+-------+-----+---+-+-+-+-------+-------+-------+---------------+| cond |1 1 0|1 0|N|W|1| Rn |basereg| pic_1 | 8_bit_offset |+-------+-----+---+-+-+-+-------+-------+-------+---------------+LPM{cond}[A|D][32|16] Rn{!}, Rlist, #wordcount
對於LPMA變形P=0,U=1,該指令(在這一實例中以及以後,使用該pic_2,bnk,和wrp格式)編碼為3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 11 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0+-------+-----+---+-+-+-+-------+---+---+-------+---------------+|cond |1 1 0|0 1|N|W|1| Rn |bnk|wrp| pic_2 | 8_bit_offset |+-------+-----+---+-+-+-+-------+---+---+-------+---------------+其中該N位指示LPMD32(1)或LPMD16(0)。
如果W=1,該W位指示basereg+offset*4向該基寄存器的回寫。
bnk指示Rlist中的第一個寄存器,該寄存器必須位於一個組的一個基寄存器(即A0,X0,Y0或Z0)。其取值0-3以分別指示組A-Z。wrp指示迴繞點,其可以取1-3,以分別表示一個2,4或8個16位寄存器的迴繞值。8_bit_offset指示傳送的數據項的數量。其可以取值wordcount/4。對於LPMD變形P=1,U=0,該指令編碼為3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 11 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0+-------+-----+---+-+-+-+-------+---+---+-------+---------------+| cond |1 1 0|1 0|N|W|1| Rn |bnk|wrp| pic_2 | 8_bit_offset |+-------+-----+---+-+-+-+-------+---+---+-------+---------------+LPM{cond}{A| D}16 Rn{!},bank0.l,#wordcount對於LPMA變形P=0,U=1,該編碼為3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 11 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0+-------+-----+---+-+-+-+-------+---+---+-------+---------------+| cond |1 1 0|0 1|0|W|1| Rn |bnk|0 1| pic_2 | 8_bit offset |+-------+-----+---+-+-+-+-------+---+---+-------+---------------+其中W位指示向基寄存器(1)的回寫。bnk指示傳送到的Piccolo組。其取值0-3以分別表示A,X,Y或Z組。8_bit_offset指示傳送的數據項的數量。其取值wordcount/4。對於LPMD變形P=0,U=1,該編碼為3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 11 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0+-------+-----+---+-+-+-+-------+---+---+-------+---------------+| cond |1 1 0|0 1|0|W|1| Rn |bnk|0 1| pic_2 | 8_bit_offset |+-------+-----+---+-+-+-+-------+---+---+-------+---------------+以ARM寄存器的數據加載該重定序緩衝區格式總結提供該MPR指令格式以從一個ARM寄存器向該Piccolo重定序緩衝器傳送一個數據字。下列格式可用於MPR指令MPR{cond} dest, RnMPR{cond}W dest, Rn其中{} 指示一個選項欄位。cond是該ARM指令條件代碼欄位。dest指示Piccolo目標寄存器(A0-Z3)。Rn 是一個計算一個有效的ARM寄存器號的表達式。W 指示應當將從該ARM寄存器傳送的數據作為兩個16位的值處理,並且標記為Piccolo寄存器dest0.l。指令編碼將MPR指令編碼為一個ARM MCR指令。MPR{cond} dest, Rn3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 11 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0+-------+-------+-------+-------+-------+-------+-----+-+-------+| cond |1 1 1 0|0 0 1 0| dest | Rn | pic_1 |0 0 0|1|0 0 0 0|+-------+-------+-------+-------+-------+-------+-----+-+-------+MPR{cond}W dest, Rn3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 11 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0+-------+-------+-------+-------+-------+-------+-----+-+-------+| cond |1 1 1 0|0 0 1 0| dest | Rn | pic_2 |0 0 0|1|0 0 0 0|+-------+-------+-------+-------+-------+-------+-----+-+-------+從輸出FIFO向存儲器存儲數據格式的總結提供兩個主要的指令格式以從輸出FIFO向存儲器存儲數據項。-STP-SPM將兩個指令格式編碼為ARM STC指令。該STP指令類總是從輸出FIFO向存儲器存儲一個32位的數據字。該SPM指令類可以用於向存儲器存儲多個字。下列格式可用於該兩個指令STP{cond}[32|16] 地址SPM{cond}[A|D][32|16]Rn{!},#wordcount其中{} 指示一個選項欄位。Cond是該ARM指令條件代碼欄位。32|16 指示正在存儲的數據是否作為16位數據處理,以及所採取的結尾特定的動作(見前面的描述),或者作為32位的數據。地址可以是[Rn][Rn,#+ve_offset]{!}[Rn],#-ve_offsetRn 是一個計算一個有效的ARM寄存器號的表達式。! 指示所計算的地址是否回寫到該基寄存器。#+ve_offset是一個計算一個偏移值的表達式,該偏移值可以表示為+8_bit_offset*4。將這一偏移值加到該基寄存器上以形成該存儲地址。#-ve_offset 是一個計算一個偏移值的表達式,該偏移值可以表示為-8_bit_offset*4。將這一偏移值從該基寄存器上減去以形成該後存儲地址。A|D 指示先增(增加)或者後減(減少)尋址方式。wordcount指示傳送的數據項的總數量。對於Piccolo的第一個版本,在一個SPM指令中可傳送不超過8個數據項。指令編碼STP指令STP指令向存儲器傳送一個32位的字。其有兩種變形STP{cond}[32|16]dest, [Rn], #-ve_offsetSTP{cond}[32|16]dest, [Rn, #+ve_offset]{!}該尋址方式由P和U位確定。STP{cond}[32|16][Rn], #-ve_offset (P=0|U=0|W=1)組合P=0,U=0和W=1用於編碼下列形式的指令STP{cond}[32|16] [Rn], #-ve_offset向地址[Rn]只傳送一個字。在該傳送發生後,將該基寄存器減少8_bit_offset*4。該N位指示STP32(1)或STP16(0)。不允許W=0的編碼。8_bit_offset編碼mod(#-ve_offset)/4。3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 11 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0+-------+-----+---+-+---+-------+-------+-------+---------------+| cond |1 1 0|0 0|N|1 0| Rn |0 0 0 0| pic_1 | 8_bit_offset |+-------+-----+---+-+---+-------+-------+-------+---------------+STP{cond}[32|16]dest,[Rn,#+ve_offset]{!} (P=1|U=1)組合P=1和U=1用於編碼下列形式的指令STP{cond}[32|16] dest,[Rn,#+ve_offset]{!)只傳送一個字到地址[Rn+#+ve_offset]。如果設置了W位,將該基寄存器增加8_bit_offset*4。該N位指示STP32(1)或者STP16(0)。8_bit_offset編碼#+ve_offset/4。3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 11 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0+-------+-----+---+-+-+-+-------+-------+-------+---------------+| cond |1 1 0|1 1|N|W|0| Rn |0 0 0 0| pic_1 | 8_bit_offset |+-------+-----+---+-+-+-+-------+-------+-------+---------------+SPM指令SPM指令從存儲器傳送多個字。其具有下列變形SPM{cond}[A|D][32|16]Rn{!},#wordcountSPM{cond}[A|D][32|16]Rn{!},#wordcount對於SPMA變形P=0,U=1,該指令編碼為3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 11 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0+-------+-----+---+-+-+-+-------+-------+-------+---------------+| cond |1 1 0|0 1|N|W|0| Rn |0 0 0 0| pic_1 | 8_bit offset |+-------+-----+---+-+-+-+-------+-------+-------+---------------+其中該N位指示SPMA32(1)或SPMA16(0)。該W位指示向基寄存器(1)的回寫。8_bit_offset指示傳送的數據項的數量。
對於LPMD變形P=1,U=0,該指令編碼為3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 11 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0+-------+-----+---+-+-+-+-------+---+---+-------+---------------+| cond |1 1 0|1 0|N|W|0| Rn |0 0 0 0| pic_1 | 8_bit_offset |+-------+-----+---+-+-+-+-------+---+---+-------+---------------+其中該N位指示SPMD32(1)或SPMD16(0)。從輸出FIFO向ARM傳送數據格式的總結提供該MRP指令以從輸出FIFO向一個ARM寄存器傳送一個數據字。下列格式可用於該MRP指令MRP{cond}Rn其中{} 指示一個選項欄位。cond是該ARM指令條件代碼欄位。Rn是計算一個有效的ARM寄存器號的表達式。指令編碼該MRP指令編碼為一個ARM MRC指令。MRP{cond}Rn3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 13 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0+-------+-------+-------+-------+-------+-------+-----+-+-------+| cond |1 1 1 0|0 0 1 1| dest | Rn | pic_1 |0 0 0|1|0 0 0 0|+-------+-------+-------+-------+-------+-------+-----+-+-------+保留的選項在一個全面的層次上,將會注意到編碼P=0,U=0和W=0是上述情況所不允許的,並且保留供將來使用。
權利要求
1.一種用於處理數據的裝置,該裝置包括一個中央處理單元,用於執行中央處理單元指令,以執行數據處理操作,所述中央處理單元指令包括協處理器存儲器訪問指令;一個連接到所述中央處理單元用於保存數據字的存儲器;一個連接到所述中央處理單元和所述存儲器的協處理器,在所述中央處理單元執行的所述協處理器存儲器訪問指令的控制下使用多個尋址方式中的一個尋址要由所述協處理器處理的所述存儲器中的數據字;其中,至少一個協處理器存儲器訪問指令包括尋址方式信息,該信息用於控制所述中央處理單元使用所述多個尋址方式中的哪一個來訪問所述存儲器,所述協處理器使用所述尋址方式信息中的至少一部分來控制根據所述至少一個協處理器存儲器訪問指令在所述存儲器和所述協處理器之間傳送多少數據字。
2.根據權利要求1的裝置,其中所述至少一個協處理器存儲器訪問指令引用所述中央處理單元中保存一個地址值的寄存器,以及所述地址方式信息包括一個偏移欄位,其中在執行所述至少一個協處理器存儲器訪問指令時從所述地址值和所述偏移值至少之一中確定所述存儲器中要訪問的一個開始地址。
3.根據權利要求2的裝置,其中對所述地址值的所述改變產生一個最終地址值,該最終地址值存回所述寄存器。
4.根據權利要求2或3的裝置,其中所述協處理器使用所述偏移欄位的至少一部分,以控制在所述存儲器和所述協處理器之間傳送多少數據字。
5.根據權利要求4的裝置,其中所述尋址方式信息包括一個或者多個標記,所述標記用於控制使用所述多個尋址方式中的哪個方式,以及也用來控制在確定在所述存儲器和所述協處理器之間要傳送多少數據字時所述協處理器是否要使用所述偏移欄位。
6.根據權利要求5的裝置,其中在確定在所述存儲器和所述協處理器之間要傳送多少數據字時所述協處理器不使用所述偏移欄位時,在所述存儲器和所述協處理器之間傳送一個固定數目的數據字。
7.根據權利要求5的裝置,其中所述寄存器存儲一個地址值Rn,一個數據字長度是WL個字節,以及所述偏移值是M,所述一個或者多個標記包括3個或者多個數值位,該數值位選擇所述至少一個協處理器存儲器訪問指令以根據下列情況之一進行操作傳送開始 地址寄存器要傳送的地址值中的最終值數據字數量(i) Rn Rn-(WL*M)(固定數量)(ii) Rn RnM(iii)Rn Rn+(WL*M)M(iv)Rn-(WL*M) RnM(v) Rn-(WL*M)Rn-(WL*M)M(vi)Rn+(WL*M) Rn(固定數量)(vii) Rn+(WL*M)Rn+(WL*M)(固定數量)
8.根據權利要求7的裝置,其中所述多個標記包括(i)一個標記位P,它指示所述開始地址值是否是原先存儲在所述寄存器中的所述地址值或者是由所述偏移欄位指示所改變的一個地址值;(ii)一個標記位U,它指示所述改變是否是從原先存儲在所述寄存器中的所述地址值加上或減去在所述偏移欄位中指示的一個值;以及(iii)一個標記位W,它指示在所述地址寄存器中的所述最終值是否應當存回所述寄存器中。
9.根據權利要求8的裝置,其中所述協處理器計算P EOR U以確定是傳送一個數據字還是M個數據字。
10.根據權利要求8的裝置,其中所述寄存器可以是所述中央處理單元的一個程序計數寄存器PC,所述協處理器計算P EOR(U OR(寄存器是PC))以確定是傳送一個數據字還是M個數據字。
11.根據上述任一權利要求的裝置,所述中央處理單元和所述協處理器執行數位訊號處理操作,並且在所述存儲器和所述協處理器之間傳送的所述數據字包括來自存儲在所述存儲器中的一組係數值的多個係數值。
12.根據權利要求6或7-11之一的裝置,其中所述固定數目的數據字包括僅一個數據字。
13.一種處理數據的方法,所述方法包括下列步驟以一個中央處理單元執行中央處理單元指令,以執行數據處理操作,所述中央處理單元指令包括協處理器存儲器訪問指令;將數據字保存在連接到所述中央處理單元的存儲器中;在由所述中央處理單元執行的協處理器存儲器訪問指令的控制下,利用所述多個尋址方式之一在所述存儲器中尋址要由連接到所述中央處理單元和所述存儲器的一個協處理器處理的數據字;其中,至少一個所述協處理器存儲器訪問指令包括尋址方式信息,該信息用於控制所述中央處理單元使用所述多個尋址方式中的哪一個來訪問所述存儲器,所述協處理器使用所述尋址方式信息中的至少一部分來控制根據所述至少一個協處理器存儲器訪問指令在所述存儲器和所述協處理器之間傳送多少數據字。
全文摘要
一個數位訊號處理系統包括一個中央處理單元核(2),一個存儲器(8)和一個協處理器(4),該協處理器使用協處理器存儲器訪問指令(例如LDC,STC)進行操作。在這些協處理器存儲器訪問指令(P,U,W,偏移值)中的該尋址方式信息不僅控制該中央處理單元核(2)所使用的尋址方式,還由該協處理器(4)使用以確定在所指示的傳送中數據字的數量,使得協處理器(4)可以在適當的時候終止該傳送。在一些總線系統中事先知道在一次傳送中的數據字的數量也是有利的,諸如那些可以具有同步DRAM的總線系統。在該指令中的偏移欄位可用於指示在由該中央處理單元核(2)在執行一個特定的指令時所提供的值中所進行的改變,並且也指示在該傳送中的字的數量。這種裝置可很好地適用於對諸如數位訊號處理操作中的一個規則的數據組。如果不使用該偏移欄位,則要傳送的數據字的數量可預設定為1。
文檔編號G06F9/355GK1260054SQ98806108
公開日2000年7月12日 申請日期1998年1月12日 優先權日1997年6月10日
發明者R·約克, D·J·西爾, D·賽姆斯 申請人:Arm有限公司

同类文章

一種新型多功能組合攝影箱的製作方法

一種新型多功能組合攝影箱的製作方法【專利摘要】本實用新型公開了一種新型多功能組合攝影箱,包括敞開式箱體和前攝影蓋,在箱體頂部設有移動式光源盒,在箱體底部設有LED脫影板,LED脫影板放置在底板上;移動式光源盒包括上蓋,上蓋內設有光源,上蓋部設有磨沙透光片,磨沙透光片將光源封閉在上蓋內;所述LED脫影

壓縮模式圖樣重疊檢測方法與裝置與流程

本發明涉及通信領域,特別涉及一種壓縮模式圖樣重疊檢測方法與裝置。背景技術:在寬帶碼分多址(WCDMA,WidebandCodeDivisionMultipleAccess)系統頻分復用(FDD,FrequencyDivisionDuplex)模式下,為了進行異頻硬切換、FDD到時分復用(TDD,Ti

個性化檯曆的製作方法

專利名稱::個性化檯曆的製作方法技術領域::本實用新型涉及一種檯曆,尤其涉及一種既顯示月曆、又能插入照片的個性化檯曆,屬於生活文化藝術用品領域。背景技術::公知的立式檯曆每頁皆由月曆和畫面兩部分構成,這兩部分都是事先印刷好,固定而不能更換的。畫面或為風景,或為模特、明星。功能單一局限性較大。特別是畫

一種實現縮放的視頻解碼方法

專利名稱:一種實現縮放的視頻解碼方法技術領域:本發明涉及視頻信號處理領域,特別是一種實現縮放的視頻解碼方法。背景技術: Mpeg標準是由運動圖像專家組(Moving Picture Expert Group,MPEG)開發的用於視頻和音頻壓縮的一系列演進的標準。按照Mpeg標準,視頻圖像壓縮編碼後包

基於加熱模壓的纖維增強PBT複合材料成型工藝的製作方法

本發明涉及一種基於加熱模壓的纖維增強pbt複合材料成型工藝。背景技術:熱塑性複合材料與傳統熱固性複合材料相比其具有較好的韌性和抗衝擊性能,此外其還具有可回收利用等優點。熱塑性塑料在液態時流動能力差,使得其與纖維結合浸潤困難。環狀對苯二甲酸丁二醇酯(cbt)是一種環狀預聚物,該材料力學性能差不適合做纖

一種pe滾塑儲槽的製作方法

專利名稱:一種pe滾塑儲槽的製作方法技術領域:一種PE滾塑儲槽一、 技術領域 本實用新型涉及一種PE滾塑儲槽,主要用於化工、染料、醫藥、農藥、冶金、稀土、機械、電子、電力、環保、紡織、釀造、釀造、食品、給水、排水等行業儲存液體使用。二、 背景技術 目前,化工液體耐腐蝕貯運設備,普遍使用傳統的玻璃鋼容

釘的製作方法

專利名稱:釘的製作方法技術領域:本實用新型涉及一種釘,尤其涉及一種可提供方便拔除的鐵(鋼)釘。背景技術:考慮到廢木材回收後再加工利用作業的方便性與安全性,根據環保規定,廢木材的回收是必須將釘於廢木材上的鐵(鋼)釘拔除。如圖1、圖2所示,目前用以釘入木材的鐵(鋼)釘10主要是在一釘體11的一端形成一尖

直流氧噴裝置的製作方法

專利名稱:直流氧噴裝置的製作方法技術領域:本實用新型涉及ー種醫療器械,具體地說是ー種直流氧噴裝置。背景技術:臨床上的放療過程極易造成患者的局部皮膚損傷和炎症,被稱為「放射性皮炎」。目前對於放射性皮炎的主要治療措施是塗抹藥膏,而放射性皮炎患者多伴有局部疼痛,對於止痛,多是通過ロ服或靜脈注射進行止痛治療

新型熱網閥門操作手輪的製作方法

專利名稱:新型熱網閥門操作手輪的製作方法技術領域:新型熱網閥門操作手輪技術領域:本實用新型涉及一種新型熱網閥門操作手輪,屬於機械領域。背景技術::閥門作為流體控制裝置應用廣泛,手輪傳動的閥門使用比例佔90%以上。國家標準中提及手輪所起作用為傳動功能,不作為閥門的運輸、起吊裝置,不承受軸向力。現有閥門

用來自動讀取管狀容器所載識別碼的裝置的製作方法

專利名稱:用來自動讀取管狀容器所載識別碼的裝置的製作方法背景技術:1-本發明所屬領域本發明涉及一種用來自動讀取管狀容器所載識別碼的裝置,其中的管狀容器被放在循環於配送鏈上的文檔匣或託架裝置中。本發明特別適用於,然而並非僅僅專用於,對引入自動分析系統的血液樣本試管之類的自動識別。本發明還涉及專為實現讀