作者簡介
周文嘉,目前就職于某國產 AI GPU 芯片公司,曾服務于 ARM、阿里巴巴、HTC 等公司,擁有 10 年以上工作經驗,主要從事系統軟件開發,涵蓋系統庫開發、指令集優化、Linux內核開發等,為某些開源社貢獻過一定數量的補丁,擔任 Free time team 創始人,致力于免費教育事業。
邵靖杰,目前就職于某國產大型機 ARM CPU 研究所,主要從事眾核處理器的系統級緩存研發工作。
張健,先后在 SUSE、華為、區塊鏈創業公司、寒武紀等公司工作,擔任工程師、架構師、技術合伙人等,研究方向包括 ARM、Linux 發行版、Linux 內核、RISC-V 和虛擬化。
……
目錄
1.2 AArch64 寄存器堆................................2
1.2.1 通用寄存器 ...................................2
1.2.2 特殊寄存器 ...................................2
1.2.3 系統控制寄存器 ...........................2
1.2.4 處理器狀態 ...................................3
1.2.5 函數調用標準 ...............................4
作為 RISC 架構,AArch64 提供了大量的通用寄存器。除通用寄存器之外,本節還會介紹特殊寄存器、系統控制寄存器、處理器狀態、函數調用標準。
1.2.1 通用寄存器
通用寄存器分為兩類。其中一類寄存器包括 X0~X30,用于普通的指令集,每個寄存器都有 64 位(Xn)和 32 位(Wn)兩種表示形式。其中 32 位的表示形式是 64 位表示形式的低 32位。另一類寄存器包括 V0~V31,用于浮點運算、SIMD、crypto 等領域。每個寄存器長度都是128 位(Qn),它們有 64 位(Dn)、32 位(Sn)、16 位(Hn)、8 位(Bn)這 4 種表示形式。以 X0 和 V0 為例,X0 是 64 位寄存器,它的低 32 位是 W0。V0 也稱為 Q0,Q0 是一個128 位的寄存器,它的低 64 位稱為 D0,它的低 32 位稱為 S0,它的低 16 位稱為 H0,它的低8 位稱為 B0,如圖 1.1 所示。
1.2.2 特殊寄存器
XZR 和 WZR 分別對應 64 位與 32 位的零寄存器。對這些寄存器進行讀操作,將會獲取到0;對這些寄存器進行的寫操作將會被處理器忽略。與 ARM 的 32 位架構不同,PC 寄存器已經不再是一個通用寄存器,無法直接訪問。ARM 指令的長度是 4 字節,因此對于 ARMv8 上的純 ARM 指令來說,PC 寄存器是按字節對齊的。SP 寄存器也不再是一個通用寄存器,SP寄存器強制按 16 字節對齊。
1.2.3 系統控制寄存器
ARM 的系統控制寄存器都以“_ELx”為后綴,其中“x”表示某異常級別(Exception Level,EL)的一個數字,如 SCTLR_EL1。后綴的數字意味著能夠訪問該寄存器的最低異常級別,ARM的系統控制寄存器如表 1.1 所示。
MRS 和 MSR 指令用于讀寫系統控制寄存器,示例代碼如下。
MRS X0, SCTLR_EL1 // X0 = SCTLR_EL1
MSR SCTLR_EL1, X0 // SCTLR_EL1 = X0
常用的系統控制寄存器及其功能如表 1.2 所示。
ARM 的系統控制寄存器數量龐大,詳細的介紹可以參考文檔 DDI0487F_b_ARMv8_arm.pdf。
1.2.4 處理器狀態
AArch64 通過 PSTATE(process state)的標志位來保存處理器的狀態,處理器執行指令的時候,可以讀取和設置這些標志位。這些標志位既可以通過 mrs/msr 指令進行訪問,也可以通過 DAIFSet、DAIFClr、SPSel、PAN、UAO 等指令直接訪問。PSTATE 寄存器的標志位如表 1.3 所示。
1.2.5 函數調用標準
1.AArch64 基本指令集函數調用規則
AArch64 提供了 31 個 64 位的通用寄存器 X0~X30,SP 寄存器已經變成了一個專用寄存器。這些寄存器的描述如表 1.4 所示。
值得注意的是,X16 和 X17 寄存器在動態鏈接的時候,可能會被某些鏈接器用于實現特殊功能。X18 寄存器在 Darwin 和 Windows 平臺上會保留作為平臺寄存器使用。在代碼優化的時候,這 3 個寄存器要謹慎使用。
2.AArch64 NEON
指令集函數調用規則 AArch64 提供了 32 個 128 位的寄存器(V0~31),可以用來進行 SIMD 和浮點運算。其中,V0~V7 這 8 個寄存器用來傳遞參數和函數返回值,V8~V15 這 8 個寄存器需要由被調函數保存(只需要保存這些寄存器的低 64 位即可)。D8~D15 是 V8~V15 寄存器的低 64 位,因此通過如下的代碼片段保存 D8~D15 的內容,就可以在函數中使用 V0~V31 這 32 個寄存器了。
stp d8, d9, [sp, -192]!
stp d10, d11, [sp, 16]
stp d12, d13, [sp, 32]
stpd14,d15,[sp,48]
3.AArch64 SVE
指令集函數調用規則 如果平臺支持 SVE 擴展,那么 AArch64 會提供 32 個可變長的向量寄存器 Z0~Z31。每個寄存器都可以用來進行 SIMD 和浮點運算,其中 Z0~Z7 用來傳遞參數和函數返回值。Z8~Z15 這 8 個寄存器需要由被調函數保存(只需要保存這些寄存器的低 64 位即可)。AArch64 還為 SVE 提供了 16 個斷言寄存器 P0~P15,其中 P0~P3 這 4 個寄存器用來傳遞參數和函數返回值。
審核編輯:湯梓紅
-
處理器
+關注
關注
68文章
19407瀏覽量
231180 -
寄存器
+關注
關注
31文章
5363瀏覽量
121157 -
aarch64
+關注
關注
0文章
7瀏覽量
5068 -
函數調用
+關注
關注
0文章
19瀏覽量
2607
原文標題:1.2.5 函數調用標準 ...............................4
文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論