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顯示了一般的寄存器。
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)
Register pairs
一般的寄存器可以被指定為寄存器對,代表一個64位的寄存器。比如說:
R1:0 = memd(R3) // Load doubleword
R7:6 = valignb(R9:8,R7:6, #2) // Vector align
注意 寄存器對中的第一個寄存器必須始終是奇數,第二個必須是下一個低的寄存器。
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)
注意 當一個控制寄存器被用于寄存器的轉移時,另一個操作數必須是一個普通 寄存器。
别名的寄存器
控制寄存器有數字别名(C0到C31)。表2-3列出了控制寄存器的别名。
Register pairs
控制寄存器可以被指定為寄存器對,代表一個64位的寄存器。指定為對的控制寄存器必須使用它們的數字别名。例如。
注意 一個控制寄存器對中的第一個寄存器必須總是奇數,第二個必須是下一個低的 寄存器。
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的起始位址
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
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
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個狀态結果。
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
2.2.7 User general pointer register
使用者通用指針(UGP)寄存器是一個通用的控制寄存器。比如說:
R9 = UGP // Get UGP
UGP = R3 // Set UGP
注意 UGP通常用于存儲線程本地存儲的位址。
2.2.8 Global pointer
全局指針(GP)用于GP-relative尋址。比如說:
GP = R7 // Set GP
R2 = memw(GP+#200) // GP-relative load
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。
2.2.10 Frame limit register
幀限制寄存器(FRAMELIMIT)存儲了為軟體堆棧保留的記憶體區域的低位址(8.3.1節)。比如說:
R9 = FRAMELIMIT // Get frame limit register
FRAMELIMIT = R3 // Set frame limit register
2.2.11 Frame key register
幀密鑰寄存器(FRAMEKEY)存儲的是密鑰值,當傳回位址存儲在軟體堆棧中時,它被用來進行XOR-竄改(8.3.2節)。比如說
R2 = FRAMEKEY // Get frame key register
FRAMEKEY = R1 // Set frame key register
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位的資料包計數值被遞增。
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。