根據指令使用數據的方式, 指令系統可分為堆棧型、累加器型和寄存器型。寄存器型又可以進一步分為寄存器-寄存器型和寄存器-存儲器型。
- 堆棧型。堆棧型指令又稱零地址指令, 其操作數都在棧頂, 在運算指令中不需要指定操作數, 默認對棧頂數據進行運算并將結果壓回棧頂。
- 累加器型。累加器型指令又稱單地址指令, 包含一個隱含操作數——累加器, 另一個操作數在指令中指定, 結果寫回累加器中。
- 寄存器-存儲器型。在這種類型的指令系統中, 每個操作數都由指令顯式指定, 操作數為寄存器和內存單元。
- 寄存器-寄存器型。在這種類型的指令系統中, 每個操作數也由指令顯式指定, 但除了訪存指令外的其他指令的操作數都只能是寄存器。
寄存器-寄存器型指令系統中,運算指令的操作數只能來自寄存器, 不能來自存儲器, 所有的訪存都必須顯式的通過load和store指令來完成, 所以寄存器-寄存器型又被稱為load-store型。使用寄存器的優勢在于, 寄存器的訪問速度快, 便于編譯器的調度優化, 并可以充分利用局部性原理, 大量的操作可以在寄存器中完成。此外, 寄存器-寄存器型的另一個優勢是寄存器之間的相關性容易判斷, 容易實現流水線、多發射和亂序執行等方法。當今的指令系統主要是寄存器-寄存器型。(以上內容摘自《計算機體系結構基礎》)
說了這么多,就是想強調一下在Armv8-A中寄存器的重要性。
在AArch64應用級角度,一個PE(Process Element)具有下列寄存器:
31個通用寄存器, R0 - R30,其中64-bit的寄存器命名為X0 – X30,而32位的寄存器命名為W0 -W30。
零寄存器XZR(64-bit)和WZR(32-bit)。
一個64-bit的堆棧指針(Stack Pointer)寄存器,堆棧指針的最低有效32位可以使用寄存器WSP訪問。
一個64-bit的程序計數器(Program Counter),用于保存當前指令地址。軟件無法直接寫入PC。
32個SIMD(Single Instruction Multiple Data)&FP(Float Point)寄存器,V0 – V31。其中,128-bit的寄存器命名為Q0 -Q31;64-bit的命名為D0 – D31;32-bit的命名為S0 – S31;16-bit的命名為H0 -H31;8-bit的命名為B0 – B31。
一個64-bit的SIMD&FP控制寄存器FPCR。
一個64-bit的SIMD&FP狀態寄存器FPSR。
三十二個可擴展向量寄存器(Scalable Vector registers),Z0 – Z31,寄存器寬度取決于具體實現,在128-1024 bit之間。
十六個可擴展斷言寄存器(Scalable Predicate registers),P0 - P15。
一個專用SVE第一故障寄存器FFR(First Fault Register)。
一個處理器狀態寄存器PSTATE,它是處理器狀態信息的集合,包括條件標記寄存器NZCV,異常屏蔽寄存器DAIF,SP選擇寄存器SPSEL、異常等級寄存器CurrentEL等。下圖是PSTATE的字段定義。
在AArch64下,PSTATE字段使用以下專用(Special-Purpose)寄存器訪問,通過MRS指令直接讀取,通過MSR指令直接寫入。
NZCV寄存器比較簡單,如下圖。N是負數條件標志位,如果最后一個標志設置指令的結果為負,則N=1;Z是0條件標志位,如果最后一個標志設置指令的結果為零,則Z=1,否則Z=0;C是進位條件標志位,如果最后一個標志設置指令導致進位情況發生,則C=1;V是溢出條件標志位,如果最后一個標志設置指令導致溢出情況發生,則V=1。其它位是保留位。
D是處理器狀態調試屏蔽位;A是系統錯誤(SError)中斷屏蔽位;I是IRQ屏蔽位;F是FIQ屏蔽位。其它位是保留位。
CurrentEL是當前異常等級寄存器,
SPSel(Stack Pointer Select)是堆棧指針選擇寄存器,如下圖,只有一個有效位。0b0表示在所有異常級別使用SP_EL0;0b1表示在異常級別ELx使用SP_ELx。
PAN(Privileged Access Never)是特權訪問禁止寄存器。0b0表示特權讀寫不被此機制禁用;0b1表示禁用對EL0級別可訪問地址的特權讀寫訪問。
UAO(User Access Override)是用戶訪問覆蓋寄存器。
DIT(Data Independent Timing)是數據獨立時序寄存器。0b0表示該架構沒有說明任何指令的時序屬性。
SSBS是Speculative Store Bypass Safe(翻譯不出來了)。0b0表示不允許硬件進行推測性load/store。
TCO(Tag Check Override)是標記檢查覆蓋寄存器。改為表示是否允許全局禁用內存標記檢查。0b0表示load/store不受影響;0b1表示load/store不被檢查。
ALLINT(All Interrupt Mask Bit)是全部中斷屏蔽寄存器。
AArch64的專用寄存器除了上述,還有很多其它的。
此外,AArch64中還有大量的系統寄存器(System Registers)。系統寄存器為執行控制、狀態和一般系統配置提供支持。大多數系統寄存器在EL0異常等級時不可訪問。然而,一些系統寄存器可以配置為允許執行在EL0等級的軟件進行訪問。可以從EL0訪問的寄存器包括:
- Cache ID registers
- Debug registers
- Performance Monitors registers
- Activity Monitors registers
- Thread ID registers
- Timer registers
前面講GIC的時候提到過,ARM把一些中斷相關的寄存器從GIC中剝離出來,放到了CPU interface中。在GICv2時,這些寄存器可以設計成系統寄存器,也可以設計成尋址訪問的寄存器,但是到了GICv3,要求這些寄存器必須是系統寄存器。
對于系統寄存器的訪問,也是通過MSR和MRS指令。
本次介紹的寄存器只是AArch64中全部寄存器的冰山一角,實際的寄存器遠遠多于今天提到的這些。ARM專門提供了一篇描述Armv8-A寄存器的文檔,有四千多頁。
-
存儲器
+關注
關注
38文章
7484瀏覽量
163764 -
數據
+關注
關注
8文章
7002瀏覽量
88943 -
累加器
+關注
關注
0文章
50瀏覽量
9447
發布評論請先 登錄
相關推薦
評論