天天看點

Hexagon_V65_Programmers_Reference_Manual(2)2 Registers

BHexagon_V65_Programmers_Reference_Manual(2)

  • 2 Registers
    • 2.1General registers
    • 2.2 Control registers
    • 2.2.1 Program counter
      • 2.2.2 Loop registers
      • 2.2.3 User status register
      • 2.2.4 Modifier registers
      • 2.2.5 Predicate registers
        • 2.2.6 Circular start registers
      • 2.2.7 User general pointer register
      • 2.2.8 Global pointer
      • 2.2.9Cycle count registers
      • 2.2.10 Frame limit register
      • 2.2.11 Frame key register
      • 2.2.12 Packet count registers
      • 2.2.13 Qtimer registers

2 Registers

本章介紹Hexagon處理器的寄存器。

通用寄存器 控制寄存器

通用寄存器用于所有通用計算,包括位址生成和标量及向量算術。

控制寄存器支援特殊用途的處理器功能,如硬體循環和謂詞。

2.1General registers

Hexagon處理器有32個32位通用寄存器(命名為R0至R31)。這些寄存器用于存儲幾乎所有指令中的操作數。

加載/存儲指令的記憶體位址 算術/邏輯指令的資料操作數 矢量指令的矢量操作數

比如說

R1 = memh(R0)

R4 = add(R2,R3)

R28 = vaddh(R11,R10)

圖2-1顯示了一般的寄存器。

Hexagon_V65_Programmers_Reference_Manual(2)2 Registers

Aliased registers

三個通用寄存器–R29到R31–用于支援子程式(7.3.2節)和軟體堆棧(8章)。這些寄存器被子程式和堆棧指令隐含地修改。它們有符号别名,用來訓示這些寄存器何時被作為子程式和堆棧寄存器通路。

比如說:

SP = add(SP, #-8)
   allocframe
   call init
// SP is alias of R29
// Modifies SP (R29) and FP (R30)
// Modifies LR (R31)
           
Hexagon_V65_Programmers_Reference_Manual(2)2 Registers

Register pairs

一般的寄存器可以被指定為寄存器對,代表一個64位的寄存器。比如說:

R1:0 = memd(R3)                   // Load doubleword
   R7:6 = valignb(R9:8,R7:6, #2)     // Vector align
           

注意 寄存器對中的第一個寄存器必須始終是奇數,第二個必須是下一個低的寄存器。

Hexagon_V65_Programmers_Reference_Manual(2)2 Registers

2.2 Control registers

Hexagon處理器包括一組32位控制寄存器,它們提供對處理器功能的通路,如程式計數器、硬體循環和矢量謂詞。

與一般寄存器不同,控制寄存器隻能在以下情況下作為指令操作數使用。

需要特定控制寄存器作為操作數的指令 寄存器轉移指令

列如:

R2 = memw(R0++M1)
   R9 = PC
   LC1 = R3
// Auto-increment addressing mode (M1)
// Get program counter (PC)
// Set hardware loop count (LC1)
           

注意 當一個控制寄存器被用于寄存器的轉移時,另一個操作數必須是一個普通 寄存器。

Hexagon_V65_Programmers_Reference_Manual(2)2 Registers

别名的寄存器

控制寄存器有數字别名(C0到C31)。表2-3列出了控制寄存器的别名。

Register pairs

控制寄存器可以被指定為寄存器對,代表一個64位的寄存器。指定為對的控制寄存器必須使用它們的數字别名。例如。

注意 一個控制寄存器對中的第一個寄存器必須總是奇數,第二個必須是下一個低的 寄存器。

Hexagon_V65_Programmers_Reference_Manual(2)2 Registers

2.2.1 Program counter

程式計數器(PC)寄存器指向要執行的下一個指令包(3.3節)。它被指令的執行隐性地修改,但可以直接讀取。比如說。

注意 PC寄存器是隻讀的:對它的寫入沒有效果。

2.2.2 Loop registers

Hexagon處理器包括兩組循環寄存器以支援嵌套硬體循環(第7.2節)。每個硬體循環都由一對寄存器實作,其中包含循環計數和循環起始位址。循環寄存器由循環指令隐式修改,但也可以直接通路。比如說

loop0(start, R4) // 修改LC0和SA0 (LC0=R4, SA0=&start)

LC1 = R22 // 設定循環1計數

R9 = SA1 // 獲得循環1的起始位址

Hexagon_V65_Programmers_Reference_Manual(2)2 Registers

2.2.3 User status register

使用者狀态寄存器(USR)存儲使用者程式可以通路的處理器狀态和控制位。狀态位包含某些指令的狀态結果,而控制位包含使用者可設定的處理器模式,用于硬體預取。比如說。

R9:8 = vaddw(R9:8, R3:2):sat // Vector add words
R6 = USR // Get saturation status
           

USR存儲以下狀态和控制值。

緩存預取啟用(第5.10.6節)。

緩存預取狀态(第5.10.6節)

浮點模式(第4.3.4節)

浮點狀态(第4.3.4節)

硬體循環配置(第7.2節)

粘性飽和溢出(第4.2.2節)

注意 使用者控制寄存器向USR的轉移不能與浮點指令(第4.3.4節)組合在一個指令包中。

每當向USR的轉移改變了Enable trap位[29:25],在新的異常程式設計生效之前,必須執行isync指令(第5.11節)。

2.2.4 Modifier registers

修改器寄存器(M0-M1)用于以下尋址模式。

間接自動遞增寄存器尋址 循環尋址

位反轉尋址

間接自動遞增

在間接自動遞增寄存器尋址中(第5.8.9節),修改器寄存器存儲了一個有符号的32位值,指定了增量(或減量)值。比如說

M1 = R0               // Set modifier register
   R3 = memw(R2++M1)     // Load word
           

循環

增量 有符号的自動增量值。

在循環尋址中(第5.8.10節),修改器寄存器存儲循環緩沖區長度和相關的 "K "和 "I "值。比如說

M0 = R7                     // Set modifier register
   R0 = memb(R2++#4:circ(M0))  // Load from circ buffer pointed
                               //  to by R2 with size/K vals in M0
   R0 = memb(R7++I:circ(M1))   // Load from circ buffer pointed
                               //  to by R7 with size/K/I vals in M1
           
Hexagon_V65_Programmers_Reference_Manual(2)2 Registers

Bit-reversed

在位反轉尋址中(第5.8.12節),修改器寄存器存儲一個有符号的32位值,指定增量(或減量)值。比如說:

M1 = R7                 // Set modifier register
   R2 = memub(R0++M1:brev) // The address is (R0.H | bitrev(R0.L))
                           // The orginal R0 (not reversed) is added
                           // to M1 and written back to R0
           
Hexagon_V65_Programmers_Reference_Manual(2)2 Registers

2.2.5 Predicate registers

謂詞寄存器(P0-P3)存儲标量和向量比較指令的狀态結果(第6章)。比如說:

P1 = cmp.eq(R2, R3)
if (P1) jump end
R8 = P1
P3:0 = R4
// Scalar compare
// Jump to address (conditional)
// Get compare status (P1 only)
// Set compare status (P0-P3)
           

四個謂詞寄存器可以被指定為一個寄存器四元組(P3:0),代表一個32位的寄存器。

注意 與其他控制寄存器不同,謂詞寄存器隻有8位寬,因為矢量比較最多可傳回8個狀态結果。

Hexagon_V65_Programmers_Reference_Manual(2)2 Registers

2.2.6 Circular start registers

循環起始寄存器(CS0 - CS1)在循環尋址中存儲循環緩沖區的起始位址(5.8.10節)。比如說

CS0 = R5
M0 = R7
R0 = memb(R2++#4:circ(M0))
// Set circ start register
// Set modifier register
// Load from circ buffer pointed
//  to by CS0 with size/K vals in M0
           
Hexagon_V65_Programmers_Reference_Manual(2)2 Registers

2.2.7 User general pointer register

使用者通用指針(UGP)寄存器是一個通用的控制寄存器。比如說:

R9 = UGP // Get UGP
   UGP = R3      // Set UGP
           

注意 UGP通常用于存儲線程本地存儲的位址。

Hexagon_V65_Programmers_Reference_Manual(2)2 Registers

2.2.8 Global pointer

全局指針(GP)用于GP-relative尋址。比如說:

GP = R7 // Set GP
   R2 = memw(GP+#200)     // GP-relative load
           
Hexagon_V65_Programmers_Reference_Manual(2)2 Registers

2.2.9Cycle count registers

循環計數寄存器(UPCYCLELO - UPCYCLEHI)存儲了一個64位的值,其中包含自Hexagon處理器上次複位以來執行的處理器循環數。比如說:

R5 = UPCYCLEHI
R4 = UPCYCLELO
R5:4 = UPCYCLE
// Get cycle count (high)
// Get cycle count (low)
// Get cycle count
           

注意 實時作業系統必須授予通路這些寄存器的權限。如果沒有這個權限,從使用者代碼中讀取這些寄存器總是傳回0。

Hexagon_V65_Programmers_Reference_Manual(2)2 Registers

2.2.10 Frame limit register

幀限制寄存器(FRAMELIMIT)存儲了為軟體堆棧保留的記憶體區域的低位址(8.3.1節)。比如說:

R9 = FRAMELIMIT      // Get frame limit register
   FRAMELIMIT = R3      // Set frame limit register
           
Hexagon_V65_Programmers_Reference_Manual(2)2 Registers

2.2.11 Frame key register

幀密鑰寄存器(FRAMEKEY)存儲的是密鑰值,當傳回位址存儲在軟體堆棧中時,它被用來進行XOR-竄改(8.3.2節)。比如說

R2 = FRAMEKEY      // Get frame key register
   FRAMEKEY = R1      // Set frame key register

           
Hexagon_V65_Programmers_Reference_Manual(2)2 Registers

2.2.12 Packet count registers

資料包計數寄存器(PKTCOUNTLO - PKTCOUNTHI)存儲了一個64位的值,包含了自上次寫入PKTCOUNT寄存器後執行的指令包的目前數量。比如說:

R9 = PKTCOUNTHI
R8 = PKTCOUNTLO
R9:8 = PKTCOUNT
// Get packet count (high)
// Get packet count (low)
// Get packet count
           

資料包計數可以被配置為僅在特定的處理器模式下運作(例如,僅使用者模式,或僅訪客和監控模式)。每個模式的配置由使用者狀态寄存器中的位[12:10]控制(第2.2.3節)。

有例外的資料包不被計算為已送出的資料包。

注意 每個硬體線程都有自己的一組資料包計數寄存器。

實時作業系統必須授予通路這些寄存器的權限。沒有這個權限,從使用者代碼中讀取這些寄存器總是傳回0。

當一個值被寫入PKTCOUNT寄存器時,在該值被存儲到寄存器之前,64位的資料包計數值被遞增。

Hexagon_V65_Programmers_Reference_Manual(2)2 Registers

2.2.13 Qtimer registers

Qtimer寄存器(UTIMERLO - UTIMERHI)提供了對Qtimer全局參考數值的通路。它們使Hexagon軟體能夠讀取64位時間值,而不需要執行昂貴的AHB加載。例如:

R5 = UTIMERHI
R4 = UTIMERLO
R5:4 = UTIMER
// Get Qtimer reference count (high)
// Get Qtimer reference count (low)
// Get Qtimer reference count
           

這些寄存器是隻讀的 - 它們由硬體自動更新,總是包含目前的Qtimer值。

注意 實時作業系統必須授予通路這些寄存器的權限。如果沒有這個權限,從使用者代碼中讀取這些寄存器總是傳回0。

Hexagon_V65_Programmers_Reference_Manual(2)2 Registers

繼續閱讀