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