ARMV8/ARMV9指令集概述(翻译)
快速鏈接:
.
👉👉👉 個人博客筆記導讀目錄(全部) 👈👈👈
目錄
- 1 前言
- 為什么要寫這篇文檔
- 我們要學習什么?
- 推薦序
- 2 簡介
- 3 A64概述
- 3.1 32位和64位之類的區別
- 3.2 條件指令
- 3.3 尋址功能
- 3.3.1 寄存器變址尋址
- 3.3.2 PC 相對尋址
- 3.4 程序計數器 (PC)
- 3.5 內存加載-存儲
- 3.5.1 批量傳輸
- 3.5.2 獨占訪問
- 3.5.3 Load-Acquire, Store-Release
- 3.6 整數乘法/除法
- 3.7 浮點數
- 3.8 高級 SIMD
- 4 A64匯編語言
- 4.1 基本結構
- 4.2 指令助記符
- 4.3 條件代碼
- 4.4 寄存器名稱
- 4.4.1 通用寄存器
- 4.4.2 FP/SIMD 寄存器
- 4.5 加載/存儲尋址模式
- 5 A64指令集
- 5.1 控制流程
- 5.1.1 條件分支
- 5.1.2 無條件分支(立即數)
- 5.1.3 無條件分支(寄存器)
- 5.2 內存訪問
- 5.2.1 加載-存儲單個寄存器
- 5.2.2 加載-存儲單個寄存器(未縮放的偏移量)
- 5.2.3 加載單個寄存器(pc-relative,literal load)
- 5.2.4 加載-存儲一對寄存器
- 5.2.5 加載-存儲Non-temporal Pair
- 5.2.6 加載-存儲非特權
- 5.2.7 加載存儲獨占
- 5.2.8 Load-Acquire / Store-Release
- 5.2.8.1 Non-exclusive
- 5.2.8.2 Exclusive
- 5.2.9 預取內存
- 5.3 數據處理(立即數)
- 5.3.1 算術(立即數)
- 5.3.2 邏輯(立即數)
- 5.3.3 Move (wide immediate)
- 5.3.3.1 Move (immediate)
- 5.3.4 地址生成(Address Generation)
- 5.3.5 位域操作
- 5.3.6 提取(立即數)-- Extract (immediate)
- 5.3.7 Shift(立即數)
- 5.3.8 符號/零擴展
- 5.4 數據處理(寄存器)
- 5.4.1 算術(移位寄存器)
- 5.4.2 算術(擴展寄存器)
- 5.4.3 邏輯(移位寄存器)
- 5.4.4 變體位(Variable Shift)
- 5.4.5 位運算
- 5.4.6 條件數據處理
- 5.4.7 條件比較
- 5.5 整數乘法/除法
- 5.5.1 乘法
- 5.5.2 除法
- 5.6 標量浮點
- 5.6.1 浮點/SIMD 標量內存訪問
- 5.6.2 浮點移動(寄存器)
- 5.6.3 浮點移動(立即)
- 5.6.4 浮點轉換
- 5.6.5 浮點四舍五入到積分
- 5.6.6 浮點算術(1 個來源)
- 5.6.7 浮點算術(2 個來源)
- 5.6.8 浮點最小值/最大值
- 5.6.9 浮點乘加
- 5.6.10 浮點比較
- 5.6.11 浮點條件選擇
- 5.7 高級SIMD
- 5.7.1 概述
- 5.7.2 高級 SIMD 助記符
- 5.7.3 數據移動
- 5.7.4 向量算術
- 5.7.5 標量算術
- 5.7.6 向量加寬/收窄算法
- 5.7.7 標量加寬/收窄算法
- 5.7.8 向量一元算術
- 5.7.9 標量一元算術
- 5.7.10 逐元素算術
- 5.7.11 標量逐元素算術
- 5.7.12 向量置換
- 5.7.13 向量立即數
- 5.7.14 向量移位(立即)
- 5.7.15 標量移位(立即)
- 5.7.16 向量浮點/整數轉換
- 5.7.17 標量浮點/整數轉換
- 5.7.18 向量縮減(跨車道)
- 5.7.19 向量成對算術
- 5.7.20 標量歸約(成對)
- 5.7.21 向量表查找
- 5.7.22 向量加載存儲結構
- 5.7.23 AArch32 等效高級 SIMD 助記符
- 5.7.24 加密擴展
- 5.8 系統說明
- 5.8.1 異常的產生和返回
- 5.8.1.1 Non-debug exceptions
- 5.8.1.2 Debug exceptions
- 5.8.2 系統寄存器訪問
- 5.8.3 系統管理
- 5.8.4 hints
- 5.8.5 Barriers和CLREX
- 6 A32和T32指令集
- 6.1 部分棄用 的之類
- 6.2 加載-獲取/存儲-釋放
- 6.2.1 非排他性
- 6.2.2 獨占
- 6.3 VFP 標量浮點
- 6.3.1 浮點條件選擇
- 6.3.2 浮點minNum/maxNum
- 6.3.3 浮點轉換(浮點到整數)
- 6.3.4 浮點轉換(半精度到/從雙精度)
- 6.3.5 浮點取整
- 6.4 高級 SIMD 浮點
- 6.4.1 浮點minNum/maxNum
- 6.4.2 浮點轉換
- 6.4.3 浮點取整到積分
- 6.5 加密擴展
- 6.6 系統說明
- 6.6.1 停止調試
- 6.6.2 Barriers 和 Hints
1 前言
為什么要寫這篇文檔
ARMV8都出來10年了,可是一本中文的手冊都沒用。真的很好奇,為什么沒有人翻譯這類文檔呢。
(不過最近好像有相關中文的文檔了).
本文僅僅是翻譯ARM的一篇官方的指令集文檔,僅僅是指令集文檔哦,不會介紹架構等知識。說實話,你不理解的是匯編嗎?你是看不懂指令嗎? 不你的瓶頸是硬件架構知識吧
(本文大多數都是直譯吧,翻譯的也不是太好,浪費時間。另外遺留了一些章節沒有翻譯,懶得弄了。如果你有興趣可聯系我,我給你markdown原文,一起補充下剩余的章節吧)
我們要學習什么?
這些指令,咋一看,真簡單,也不多嗎,大幾十個? 但是算上變體等,那就有數百個甚至好幾千個了。很多指令有和具體的feature和架構相關,很難去記住。
所以呢,我們可以學習一些基本的指令集,其余的使用的時候再查閱即可。如下列舉了指令的分類,我們只要對著這個分類,學習一些基礎的指令即可。
推薦序
TODO
(聯系方式)
2 簡介
本文檔概述了 ARMv8 指令集。大部分文檔描述了處理器在 AArch64 寄存器寬度狀態下運行時使用的新 A64 指令集,并定義了其首選的
架構匯編語言。
下面的第 6 節列出了 ARMv8 對 A32 和 T32 指令集(在 ARMv7 中分別稱為 ARM 和 Thumb 指令集)引入的擴展,這些擴展在處理器在
AArch32 寄存器寬度狀態下運行時可用。 A32 和 T32 匯編語言語法與 ARMv7 相同。
在下面的語法描述中,使用了以下約定:
- UPPER UPPER?CASE文本是固定的,而小寫文本是可變的。所以寄存器名 Xn 表示‘X’是必需的,后跟可變寄存器編號,例如 X29。
- <> 由 < > 括起來的任何項目都是對用戶在該位置提供的值類型的簡短描述。項目的較長描述通常由后續文本提供
- { } 任何用花括號 { }括起來的項目都是可選的。項目的描述以及它的存在或不存在如何影響指令通常由后續文本提供。在某些情
況下,花括號是語法中的實際符號,例如圍繞一個寄存器列表,并且這種情況將在周圍的文本中被調用 - [ ] 替代字符列表可以用 [ ]括起來。可以在該位置使用單個字符,隨后的文本將描述替代的含義。在某些情況下,符號 [ 和 ] 是
語法本身的一部分,例如尋址模式和向量元素,這些情況將在周圍的文本中被調用 - a | b 替代詞由豎線分隔 |并且可以用括號括起來以分隔它們,例如 U(ADD|SUB)W 表示 UADDW 或 USUBW。
- +/- 這表示可選的 + 或 ? 符號。如果兩者都沒有編碼,則假定為 +
3 A64概述
A64 指令集提供與 AArch32 或 ARMv7 中的 A32 和 T32 指令集類似的功能。然而,正如在 T32 指令集中添加 32 位指令使一些 ARM ISA 行為合理化一樣,A64 指令集包括進一步的合理化。新指令集的亮點如下:
- 清晰、固定長度的指令集 指令為 32 位寬
- 訪問一個更大的通用寄存器文件,其中包含 31 個未分組的寄存器 (0?30),每個寄存器擴展為 64 位。通用寄存器被編碼為 5 位字段,其中寄存器編號 31 (0b11111) 是一種特殊情況:
(1) 表示零寄存器XZR:在大多數情況下,當用作源寄存器時,寄存器編號 31 讀取為零,并且用作目標寄存器時丟棄結果
(2) 表示棧寄存器SP:當用作加載/存儲基址寄存器時,以及在少量算術指令中,31 號寄存器提供對當前堆棧指針的訪問 - PC 永遠不能作為命名寄存器訪問。它的使用隱含在某些指令中,例如 PC相對加載和地址生成。唯一會導致 PC 發生非順序更改的指令是指定的控制流指令(參見第 5.1 節)和異常。不能將 PC 指定為數據處理指令或加載指令的目標。
- 鏈接寄存器(LR) 是unbanked的通用寄存器X30, 異常鏈接寄存器ELR是系統寄存器
- 標量加載/存儲尋址模式在標量整數、浮點和向量寄存器的所有大小和符號上都是統一的
- 加載/存儲立即偏移量可以根據訪問大小縮放,增加其有效偏移量范圍。
- 反映加載/存儲尋址模式的地址生成算法指令,見3.3
- PC相對的加載/存儲和生成范圍為±4GiB的地址只需要兩條指令就可以實現,而不需要從文字池中加載偏移量。
- 對于文字池訪問和大多數條件分支,pc相對偏移量被擴展為±1MiB,對于無條件分支和調用,pc相對偏移量被擴展為±128MiB
- 沒有多寄存器 LDM、STM、PUSH 和 POP 指令,但可以加載存儲不連續的一對寄存器。
- 大多數加載和存儲都允許未對齊的地址,包括配對寄存器訪問、浮點和SIMD 寄存器,但排他和有序訪問除外(請參閱第3.5.2 節)。
- 減少條件。 更少的指令可以設置條件標志。 只有條件分支和少數數據處理指令讀取條件標志。 沒有提供條件或謂詞執行,也沒有等效于 T32 的 IT 指令(參見第 3.2 節)。
- 數據處理指令的最后一個寄存器操作數的移位選項可用:
(1) 僅立即換班(如 T32 中)。
(2) ADD/SUB 沒有 RRX 移位,也沒有 ROR 移位。
(3) ADD/SUB/CMP 指令可以先對最后一個寄存器操作數中的一個字節、半字或字進行符號或零擴展,然后是可選的 1 到 4 位左移 - 立即生成將 A32 的旋轉 8 位立即數替換為特定于操作的編碼:
(1) 算術指令有一個簡單的 12 位立即數,可選擇左移 12。
(2) 邏輯指令提供復雜的復制位掩碼生成。
(3) 其他立即數可以在 16 位“塊”中內聯構造,擴展 AArch32 的 MOVW 和 MOVT 指令。 - 浮點支持類似于 AArch32 VFP,但有一些擴展,如 §3.6 中所述。
- 浮點和高級 SIMD 處理共享一個寄存器文件,以類似于 AArch32 的方式,但擴展到 32 個 128 位寄存器。 較小的寄存器不再打包到較大的寄存器中,而是一對一映射到 128 位寄存器的低位,如 4.4.2 中所述。
- 沒有對通用寄存器進行操作的 SIMD 或飽和算術指令,此類操作僅作為高級 SIMD 處理的一部分可用,如第 5.7 節所述。
- 無法將 CPSR 作為單個寄存器訪問,但新的系統指令提供了以原子方式修改各個處理器狀態字段的能力,請參閱第 5.8.2 節。
- 從架構中刪除了“協處理器”的概念。 5.8 中描述的一組系統指令提供:
(1)System register access
(2)Cache/TLB management
(3)VA<—>PA address translation
(4)Barriers and CLREX
(5)Architectural hints (WFI, etc)
(6)Debug
3.1 32位和64位之類的區別
A64 指令集中的大多數整數指令有兩種形式,它們對 64 位通用寄存器文件中的 32 位或 64 位值進行操作。在選擇 32 位指令形式的情況下,以下情況成立:
- 源寄存器的高 32 位被忽略;
- 目標寄存器的高 32 位設置為零;
- 在第 31 位而不是第 63 位右移/旋轉注入;
- 由指令設置的條件標志是從低 32 位計算的。
即使當 32 位指令形式的結果與由等效 64 位指令形式計算的低 32 位無法區分時,這種區別也適用。例如,可以使用 64 位 ORR 執行 32 位按位 ORR,并簡單地忽略結果的前 32 位。但是 A64 指令集包括單獨的 32 位和 64 位形式的 ORR 指令。
基本原理:C/C++ LP64 和 LLP64 數據模型——預計將是 AArch64 上最常用的——都將常用的 int、short 和 char 類型定義為 32 位或更少。通過在指令集中維護此語義信息,實現可以利用此信息來避免消耗能量或周期來計算、轉發和存儲此類數據類型的未使用的高 32 位。實現可以自由地以他們選擇的任何方式來利用這種自由來節省能源
除了不同的符號/零擴展指令外,A64 指令集還提供擴展和移位 ADD、SUB 或 CMP 指令的最終源寄存器以及加載/存儲指令的索引寄存器的能力。這允許有效實現涉及 64 位數組指針和 32 位數組索引的數組索引計算。
匯編語言符號旨在允許將保存 32 位值的寄存器與保存 64 位值的寄存器區分開來。除了提高可讀性外,工具還可以使用它來執行有限的類型檢查,以識別因寄存器大小變化而導致的編程錯誤。
3.2 條件指令
A64 指令集不包括謂詞或條件執行的概念。基準測試表明,現代分支預測器工作得很好,以至于指令的預測執行并沒有提供足夠的好處來證明它對操作碼空間的大量使用以及它在高級實現中的實現成本。
提供了一組非常小的“條件數據處理”指令。這些指令是無條件執行的,但使用條件標志作為指令的額外輸入。該集合已被證明在條件分支預測不佳或效率低下的情況下是有益的。
條件指令類型有:
- 條件分支:傳統的ARM 條件分支,連同比較和寄存器零/非零分支,以及測試寄存器中的單個位和零/非零分支——所有這些都增加了位移。
- 進位加/減:傳統的 ARM 指令,用于多精度算術、校驗和等。
- 帶遞增、取反或取反的條件選擇:有條件地在一個源寄存器和第二個遞增/取反/取反/未修改的源寄存器之間進行選擇。基準測試顯示這些是單個條件指令的最高頻率使用,例如用于計數、絕對值等。這些指令還實現:
(1) 條件選擇(移動):將目標設置為兩個源寄存器之一,由條件標志選擇。短條件序列可以用無條件指令替換,然后是條件選擇。
(2) 條件集:有條件地在 0 和 1 或 -1 之間選擇,例如將條件標志物化為通用寄存器中的布爾值或掩碼。 - 條件比較:如果原始條件為真,則將條件標志設置為比較結果,否則設置為立即值。允許在不使用條件分支或在通用寄存器中執行布爾運算的情況下扁平化嵌套條件表達式。
3.3 尋址功能
64 位架構的主要動機是訪問更大的虛擬地址空間。 AArch64 內存轉換系統支持 49 位虛擬地址(每個轉換表 48 位)。 虛擬地址從 49 位符號擴展,并存儲在 64 位指針中。 可選地,在系統寄存器的控制下,64 位指針的最高有效 8 位可以保存一個“標記”,當用作加載/存儲地址或間接分支的目標時,該標記將被忽略。
3.3.1 寄存器變址尋址
A64 指令集擴展了 32 位 T32 尋址模式,允許將 64 位索引寄存器添加到 64 位基址寄存器,并可以根據訪問大小對索引進行可選縮放。此外,它還提供了索引寄存器中 32 位值的符號或零擴展,同樣具有可選的縮放比例。
如果可以在單個周期內執行這些寄存器索引尋址模式,它們將提供有用的性能增益,并且相信至少一些實現將能夠做到這一點。但是,根據 AArch32 的實現經驗,預計其他實現將需要一個額外的周期來執行此類尋址模式。
基本原理:架構師希望實現可以自由地微調每個實現中的性能權衡,并注意提供在某些實現中需要兩個周期的指令比要求在一個可以在單個周期內執行此地址算術的實現。
3.3.2 PC 相對尋址
改進了對位置無關代碼和數據尋址的支持:
- PC 相關文字負載的偏移范圍為 ±1MiB。 這允許更少的文字池,并在函數之間更多地共享文字數據——減少 I-cache 和 TLB 污染。
- 大多數條件分支的范圍為 ±1MiB,預計足以滿足在單個函數中發生的大多數條件分支。
- 無條件分支,包括分支和鏈接,范圍為 ±128MiB。 預計足以跨越大多數可執行加載模塊和共享對象的靜態代碼段,而不需要鏈接器插入的蹦床或“膠合板”。
- PC 相關的加載/存儲和范圍為 ±4GiB 的地址生成可以僅使用兩條指令內聯執行,即無需從文字池加載偏移量。
3.4 程序計數器 (PC)
當前的程序計數器 (PC) 不能像通用寄存器文件的一部分一樣通過數字來引用,因此不能用作算術指令的源或目標,也不能用作加載/存儲指令的基址、索引或傳輸寄存器。 讀取 PC 的唯一指令是那些功能是計算 PC 相對地址(ADR、ADRP、文字加載和直接分支)的指令,以及將其存儲在鏈接寄存器中的分支和鏈接指令(BL 和 BLR)。 修改程序計數器的唯一方法是使用顯式控制流指令:條件分支、無條件分支、異常生成和異常返回指令。
如果指令讀取 PC 以計算 PC 相對地址,那么它的值就是指令的地址,即與 A32 和 T32 不同,沒有隱含的 4 或 8 個字節的偏移量。
3.5 內存加載-存儲
3.5.1 批量傳輸
A64 中不存在 LDM、STM、PUSH 和 POP 指令,但是可以使用 LDP 和 STP 指令構建批量傳輸,這些指令從連續的內存位置加載和存儲一對獨立的寄存器,并且在訪問普通內存時支持未對齊的地址 . LDNP 和 STNP 指令還提供“流”或“非臨時”提示,表明數據不需要保留在緩存中。 PRFM(預取存儲器)指令還包括“流式”或“非臨時”訪問的提示,并允許將預取定位到特定的緩存級別。
3.5.2 獨占訪問
字節、半字、字和雙字的獨占加載存儲。 對一對雙字的獨占訪問允許對一對指針進行原子更新,例如循環列表插入。 所有獨占訪問必須自然對齊,并且獨占對訪問必須對齊到兩倍的數據大小(即 64 位對的 16 個字節)。
3.5.3 Load-Acquire, Store-Release
顯式同步加載和存儲指令實現了釋放一致性 (RCsc) 內存模型,減少了對顯式內存屏障的需求,并為共享內存的新興語言標準提供了良好的匹配。 這些指令以排他和非排他的形式存在,并且需要自然地址對齊。 有關詳細信息,請參閱第 5.2.8 節。
3.6 整數乘法/除法
3.7 浮點數
AArch64 在任何需要浮點運算的地方都強制使用硬件浮點——AArch64 過程調用標準 (PCS) 沒有“軟浮點”變體。
浮點功能類似于 AArch32 VFP,但有以下變化:
- 刪除了VFP 已棄用的“小向量”功能。
- 有32 個S 寄存器和32 個D 寄存器。 S 寄存器不打包到 D 寄存器中,而是占用相應 D 寄存器的低 32 位。例如 S31=D31<31:0>,而不是 D15<63:32>。
- 加載/存儲尋址模式與整數加載/存儲相同。
- 加載/存儲一對浮點寄存器。
- 浮點FCSEL 和FCCMP 等效于整數CSEL 和CCMP。
- 浮點FCMP 和FCCMP 指令直接設置整數條件標志,不修改FPSR 中的條件標志。
- 所有浮點乘加和乘減指令都是“融合”的。
- 在 64 位整數和浮點之間轉換。
- 將FP 轉換為具有明確舍入方向的整數(朝向零、朝向+Inf、朝向-Inf、到最接近的關系到偶數,以及最接近的關系以及遠離零的關系)。
- 使用明確的舍入方向(如上)將 FP 舍入到最接近的整數 FP。
- 半精度和雙精度之間的直接轉換。
- FMINNM 和FMAXNM 實現IEEE754-2008 minNum() 和maxNum() 操作,如果其中一個操作數是安靜的NaN,則返回數值。
3.8 高級 SIMD
詳見下面5.7的詳細描述
4 A64匯編語言
字母 W 是 32 位字的簡寫,X 是 64 位擴展字的簡寫。使用字母 X(擴展)而不是 D(雙精度),因為 D 與其用于浮點和 SIMD“雙精度”寄存器以及 T32 加載/存儲“雙寄存器”指令(例如 LDRD)的使用相沖突。
A64 匯編器將識別指令助記符和寄存器名稱的大寫和小寫變體,但不能識別大小寫混合。 A64 反匯編程序可以輸出大寫或小寫的助記符和寄存器名稱。程序和數據標簽的情況很重要。
基本語句格式和操作數順序遵循 AArch32 UAL 匯編器和反匯編器使用的,即每個源代碼行一個語句,由一個或多個可選程序標簽組成,后跟指令助記符,然后是目標寄存器和一個或多個源操作數被逗號隔開。
{label:*} {opcode {dest{, source1{, source2{, source3}}}}}
與 AArch32 UAL 一樣,存儲指令的 dest/source 順序是相反的。 A64 匯編語言不需要“#”符號來引入立即值,盡管匯編器必須允許它。為了便于閱讀,A64 反匯編程序應始終在立即值之前輸出“#”。
如果用戶定義的符號或標簽與預定義的寄存器名稱(例如“X0”)相同,那么如果在其解釋不明確的上下文中使用它 - 例如在可以接受寄存器名稱的操作數位置或立即表達式——然后匯編器必須將其解釋為寄存器名稱。可以通過在表達式上下文中使用符號來消除歧義,即將其放在括號內和/或在其前面加上顯式的“#”符號。
在下面的示例中,序列“//”用作注釋前導符,但 A64 匯編器也應支持其舊版 ARM 注釋語法
4.1 基本結構
A64指令形式可以通過以下屬性組合來識別:
- 指示指令語義的operation name(例如 ADD)。
- operand container,通常是寄存器類型。 一條指令寫入整個container,但如果它不是同類中最大的,則該類中最大container的其余部分設置為零。
- operand data subtype,其中一些操作數與主container的大小不同。
- final source operand type,可以是寄存器或立即數。
operand container是以下之一:
operand data subtype是以下之一:
4.2 指令助記符
這些屬性以匯編語言符號組合在一起,以標識特定的指令形式。為了保持與現有 ARM 匯編語言的緊密外觀,采用了以下格式:
<name>{<subtype>} <container>
換句話說,操作名稱和子類型由指令助記符描述,容器大小由操作數名稱描述。省略子類型的地方,它是從容器繼承的。
通過這種方式,匯編程序員可以編寫指令而無需記住大量新的助記符;反匯編清單的讀者可以直接閱讀一條指令,一眼就能看出每個操作數的類型和大小。
這意味著A64匯編語言重載了指令助記符,并根據操作數寄存器名稱來區分指令的不同形式。例如,下面的 ADD 指令都有不同的操作碼,但程序員只需記住一個助記符,匯編器會根據操作數自動選擇正確的操作碼——反匯編器則相反。
4.3 條件代碼
在 AArch32 匯編語言中,條件執行指令通過直接將條件附加到助記符來表示,沒有分隔符。這會導致一些歧義,從而使匯編代碼難以解析:例如,ADCS、BICS、LSLS 和 TEQ 乍一看就像條件指令。
A64 ISA 設置或測試條件代碼的指令要少得多。那些這樣做的人將被識別如下:
為了提高可移植性,A64 匯編器還可以提供舊的 UAL 條件助記符,只要它們在 A64 ISA 中具有直接等效項。但是,UAL 助記符不會由 A64 反匯編程序生成——在 64 位匯編代碼中不推薦使用它們,如果程序員沒有明確要求向后兼容,可能會導致警告或錯誤。
條件代碼的完整列表如下:
?條件代碼 NV 的存在僅用于提供對“1111b”編碼的有效反匯編,否則其行為與 AL 相同。
4.4 寄存器名稱
4.4.1 通用寄存器
general purpose registers組中的 31 個通用寄存器命名為 R0 到 R30,特殊寄存器編號 31 具有不同的名稱,具體取決于使用它的上下文。但是,當寄存器以特定指令形式使用時,它們必須進一步限定以指示操作數數據大小(32 位或 64 位),從而指示指令的數據大小。
通用寄存器的限定名稱如下,其中“n”是寄存器編號 0 到 30:
其中寄存器編號 31 表示讀取零或丟棄結果(又名“零寄存器”):
其中寄存器號 31 表示堆棧指針:
更詳細地說:
- 名稱Xn 和Wn 指的是相同的架構寄存器。
- 沒有名為W31 或X31 的寄存器。
- 對于寄存器31 被解釋為64 位堆棧指針的指令操作數,它由名稱SP 表示。對于不將寄存器 31 解釋為 64 位堆棧指針的操作數,此名稱將導致匯編錯誤。
- WSP 名稱將寄存器 31 表示為 32 位上下文中的堆棧指針。提供它只是為了允許有效的反匯編,并且不應在行為正確的 64 位代碼中看到。
- 對于將寄存器 31 解釋為零寄存器的指令操作數,它在 64 位上下文中由名稱 XZR 表示,在 32 位上下文中由名稱 WZR 表示。在不將寄存器 31 解釋為零寄存器的操作數位置中,這些名稱將導致匯編錯誤。
- 如果助記符過載(即可以根據數據大小生成不同的指令編碼),則匯編程序應根據第一個寄存器操作數的大小確定指令的精確形式。通常其他操作數寄存器應該與第一個操作數的大小相匹配,但在某些情況下,一個寄存器可能有不同的大小(例如,地址基址寄存器總是 64 位),如果源寄存器包含被指令擴展為 64 位的字、半字或字節。
- 該體系結構沒有為寄存器 30 定義一個特殊名稱,以反映其作為過程調用中的鏈接寄存器的特殊作用。此類軟件名稱可以定義為過程調用標準的一部分。
4.4.2 FP/SIMD 寄存器
FP/SIMD 寄存器組中名為 V0 到 V31 的 32 個寄存器用于保存標量浮點指令的浮點操作數,以及高級 SIMD 指令的標量和向量操作數。 與通用整數寄存器一樣,當它們以特定指令形式使用時,必須進一步限定名稱以指示其中保存的數據形狀(即數據元素大小和元素或通道數)。
但是請注意,數據類型,即每個寄存器或向量元素中的位解釋——整數(有符號、無符號或不相關)、浮點、多項式或加密哈希——不是由寄存器名稱描述的,而是由指令助記符描述的 對它們進行操作。 有關更多詳細信息,請參閱第 5.7 節中的高級 SIMD 描述。
4.5 加載/存儲尋址模式
A64 指令集中的加載/存儲尋址模式大致遵循 T32,包括一個 64 位基址寄存器(Xn 或 SP)加上一個立即數或寄存器偏移量。
- 立即偏移量以各種方式編碼,具體取決于加載/存儲指令的類型:
- 在立即偏移量被縮放的地方,它被編碼為數據訪問大小的倍數(PCrelative 加載除外,它總是一個字倍數)。匯編器總是接受一個字節偏移量,它被轉換成縮放的偏移量進行編碼,反匯編器解碼縮放的偏移量編碼并將其顯示為字節偏移量。因此,支持的字節偏移范圍根據加載/存儲指令的類型和數據訪問大小而有所不同。
- “后索引”形式意味著內存地址是基址寄存器的值,然后基址加偏移量被寫回基址寄存器。
- “預索引”形式意味著內存地址是基址寄存器值加上偏移量,然后計算的地址被寫回基址寄存器。
- “寄存器偏移”意味著內存地址是基址寄存器值加上 64 位變址寄存器 Xm 的值,可以選擇按訪問大小(以字節為單位)縮放,即左移 log2(size)。
- “擴展寄存器偏移”意味著存儲器地址是基址寄存器值加上 32 位變址寄存器 Wm 的值,符號或零擴展為 64 位,然后可以根據訪問大小進行縮放。
- 匯編器應接受 Xm 作為擴展變址寄存器,但首選 Wm。
- 前/后索引表格不適用于寄存器偏移。
- 沒有“向下”選項,因此從基址寄存器中減法需要負符號立即偏移(二進制補碼)或索引寄存器中的負值。
- 當基址寄存器為 SP 時,堆棧指針需要在地址計算和回寫之前進行四字(16 字節,128 位)對齊 - 未對齊將導致堆棧對齊錯誤。堆棧指針不能用作索引寄存器。
- 使用程序計數器 (PC) 作為基址寄存器隱含在文字加載指令中,并且不允許在其他加載或存儲指令中使用。文字加載不包括字節和半字形式。標簽的定義見下文第 5 節。
5 A64指令集
5.1 控制流程
5.1.1 條件分支
- B.cond label 跳轉指令:如果cond 為真,則有條件地跳轉到程序相關標簽。
- CBNZ Wn, label 比較和非零分支:如果 Wn 不等于零,則有條件地跳轉到程序相關標簽。
- CBNZ Xn, label 比較和非零分支(擴展):如果 Xn 不等于零,有條件地跳轉到標簽。
- CBZ Wn, label 比較和分支零:如果 Wn 等于零,有條件地跳轉到標簽。
- CBZ Xn, label 比較和分支零(擴展):如果 Xn 等于零,有條件地跳轉到標簽。
- TBNZ Xn|Wn, #uimm6, label 測試和非零分支:如果寄存器 Xn 中的位號 uimm6 不為零,則有條件地跳轉到標簽。位號表示寄存器的寬度,如果 uimm 小于 32,則可以寫入并反匯編為 Wn。限制在 ±32KiB 的分支偏移范圍內。
- TBZ Xn|Wn, #uimm6, label 測試和分支零:如果寄存器 Xn 中的位號 uimm6 為零,則有條件地跳轉到標簽。位號表示寄存器的寬度,如果 uimm6 小于 32,則可以寫入并反匯編為 Wn。限制在 ±32KiB 的分支偏移范圍內。
5.1.2 無條件分支(立即數)
無條件跳轉支持 ±128MiB 的立即分支偏移范圍。
- B label 跳轉:無條件跳轉到pc-relative label。
- BL label 鏈接跳轉:無條件跳轉到pc相對標簽,將下一條順序指令的地址寫入X30寄存器。
5.1.3 無條件分支(寄存器)
- BLR Xm 跳轉鏈接寄存器:無條件跳轉到Xm中的地址,將下一條連續指令的地址寫入X30寄存器。
- BR Xm 分支寄存器:跳轉到Xm 中的地址,提示CPU 這不是子程序返回。
- RET {Xm} 返回:跳轉到寄存器Xm,提示CPU這是一個子程序返回。 如果省略 Xm,匯編器將默認注冊 X30。
5.2 內存訪問
除了排他和顯式排序的加載和存儲之外,地址可能具有任意對齊,除非啟用了嚴格的對齊檢查 (SCTLR.A==1)。 但是,如果 SP 用作基址寄存器,則在添加任何偏移之前的堆棧指針的值必須是四字(16 字節)對齊,否則將產生堆棧對齊異常。
由與傳輸大小對齊的單個通用寄存器的加載或存儲生成的內存讀取或寫入是原子的。 由一對與寄存器大小對齊的通用寄存器的非獨占加載或存儲產生的內存讀取或寫入被視為兩個原子訪問,每個寄存器一個。 在所有其他情況下,除非另有說明,否則沒有原子性保證。
5.2.1 加載-存儲單個寄存器
最通用的加載存儲形式支持多種尋址模式,包括基址寄存器 Xn 或 SP,以及以下之一:
- 縮放的 12 位無符號立即偏移量,沒有索引前和索引后選項。
- 未縮放的 9 位有符號立即偏移量,帶有索引前或索引后寫回。
- 縮放或未縮放的 64 位寄存器偏移量。
- 縮放或未縮放的 32 位擴展寄存器偏移量。
如果 Load 指令指定寫回,并且正在加載的寄存器也是基址寄存器,則可能發生以下行為之一:
- 指令未分配
- 該指令被視為 NOP
- 指令使用指定的尋址模式執行加載,基址寄存器變為 UNKNOWN。此外,如果在此類指令期間發生異常,則基地址可能會被破壞,從而無法重復該指令。
如果 Store 指令執行回寫并且正在存儲的寄存器也是基址寄存器,則可能會發生以下行為之一:
- 指令未分配
- 該指令被視為 NOP
- 指令執行使用指定尋址模式指定的寄存器的存儲,但存儲的值是 UNKNOWN
- LDR Wt, addr
加載寄存器:從 addr 尋址的內存中加載一個字到 Wt。 - LDR Xt, addr
加載寄存器(擴展):從 addr 尋址的內存中加載一個雙字到 Xt。 - LDRB Wt, addr
加載字節:從 addr 尋址的內存中加載一個字節,然后將其零擴展至 Wt。 - LDRSB Wt, addr
加載有符號字節:從 addr 尋址的內存中加載一個字節,然后將其符號擴展到 Wt 中。 - LDRSB Xt, addr
加載有符號字節(擴展):從 addr 尋址的內存中加載一個字節,然后將其符號擴展到 Xt 中。 - LDRH Wt, addr
加載半字:從 addr 尋址的內存中加載半字,然后將其零擴展為 Wt。 - LDRSH Wt, addr
Load Signed Halfword:從 addr 尋址的內存中加載一個半字,然后將其符號擴展為 Wt。 - LDRSH Xt, addr
加載有符號半字(擴展):從 addr 尋址的內存中加載一個半字,然后將其符號擴展到 Xt 中。 - LDRSW Xt, addr
加載帶符號的字(擴展):從 addr 尋址的內存中加載一個字,然后將其符號擴展到 Xt 中。 - STR Wt, addr
存儲寄存器:將字從 Wt 存儲到由 addr 尋址的存儲器。 - STR Xt, addr
存儲寄存器(擴展):將雙字從 Xt 存儲到由 addr 尋址的內存。 - STRB Wt, addr
存儲字節:將來自 Wt 的字節存儲到由 addr 尋址的內存中。 - STRH Wt, addr
存儲半字:將半字從 Wt 存儲到由 addr 尋址的內存中。
5.2.2 加載-存儲單個寄存器(未縮放的偏移量)
加載-存儲單寄存器(未縮放偏移)指令支持基址寄存器 Xn 或 SP 的尋址模式,此外:
- 未縮放、9 位、有符號立即偏移量,沒有索引前和索引后選項
這些指令使用獨特的助記符將它們與正常的加載存儲指令區分開來,因為當偏移為正且自然對齊時,功能與縮放的 12 位無符號立即偏移尋址模式重疊。
當立即偏移量明確時,即當它為負數或未對齊時,對程序員友好的匯編程序可以生成這些指令以響應標準 LDR/STR 助記符。 類似地,當編碼的立即數為負數或未對齊時,反匯編程序可以使用標準 LDR/STR 助記符顯示這些指令。 然而,架構匯編語言不需要這種行為。
- LDUR Wt, [base,#simm9]
加載(未縮放)寄存器:將一個字從由 base+simm9 尋址的內存加載到 Wt。 - LDUR Xt, [base,#simm9]
加載(未縮放)寄存器(擴展):將一個雙字從由 base+simm9 尋址的內存加載到 Xt。 - LDURB Wt, [base,#simm9]
加載(未縮放)字節:從內存中加載一個字節,地址為 base+simm9,然后將其零擴展為 Wt。 - LDURSB Wt, [base,#simm9]
加載(未縮放)有符號字節:從由 base+simm9 尋址的內存中加載一個字節,然后將其符號擴展為 Wt。 - LDURSB Xt, [base,#simm9]
Load (Unscaled) Signed Byte (extended):從base+simm9尋址的內存中加載一個字節,然后將其符號擴展到Xt中。 - LDURH Wt, [base,#simm9]
加載(未縮放)半字:從 base+simm9 尋址的內存中加載半字,然后將其零擴展為 Wt。 - LDURSH Wt, [base,#simm9]
Load (Unscaled) Signed Halfword:從 base+simm9 尋址的內存中加載一個半字,然后將其符號擴展為 Wt。 - LDURSH Xt, [base,#simm9]
加載(未縮放)有符號半字(擴展):從 base+simm9 尋址的內存中加載一個半字,然后將其符號擴展為 Xt。 - LDURSW Xt, [base,#simm9]
加載(未縮放)有符號字(擴展):從內存中加載一個由 base+simm9 尋址的字,然后將其符號擴展為 Xt。 - STUR Wt, [base,#simm9]
存儲(未縮放)寄存器:將字從 Wt 存儲到由 base+simm9 尋址的存儲器。 - STUR Xt, [base,#simm9]
存儲(未縮放)寄存器(擴展):將雙字從 Xt 存儲到由 base+simm9 尋址的內存。 - STURB Wt, [base,#simm9]
存儲(未縮放)字節:將字節從 Wt 存儲到由 base+simm9 尋址的內存。 - STURH Wt, [base,#simm9]
存儲(未縮放)半字:將半字從 Wt 存儲到由 base+simm9 尋址的內存。
5.2.3 加載單個寄存器(pc-relative,literal load)
用于加載的 pc 相對地址被編碼為 19 位有符號字偏移量,該偏移量左移 2 并添加到程序計數器,從而可以訪問 PC 的 ±1MiB 內的任何字對齊位置。
為方便起見,匯編程序通常允許符號“=value”與相對 pc 的文字加載指令一起自動將立即值或符號地址放置在附近的文字池中,并生成引用它的隱藏標簽。但是該語法不是架構的,并且永遠不會出現在反匯編中。 A64 有其他指令可以在寄存器中構造立即值(第 5.3.3 節)和地址(第 5.3.4 節),這可能比從文字池中加載它們更好。
- LDR Wt, label | =價值
加載文字寄存器(32 位):從標簽尋址的內存中加載一個字到 Wt。 - LDR Xt,標簽 | =價值
加載文字寄存器(64 位):從標簽尋址的內存中加載一個雙字到 Xt。 - LDRSW Xt, 標簽 | =價值
Load Literal Signed Word (extended):從內存中加載一個按標簽尋址的單詞,然后將其符號擴展到 Xt 中。
5.2.4 加載-存儲一對寄存器
加載-存儲對指令支持由基址寄存器 Xn 或 SP 組成的尋址模式,以及:
- 縮放的 7 位有符號立即偏移量,具有索引前和索引后寫回選項
如果加載對指令為正在加載的兩個寄存器指定相同的寄存器,則其中一個
可能會出現以下行為:
- 指令未分配
- 該指令被視為 NOP
- 該指令使用指定的尋址模式執行所有加載,并且正在加載的寄存器采用 UNKNOWN 值
如果加載對指令指定回寫并且正在加載的寄存器之一也是基址寄存器,則
可能會出現以下行為之一:
- 指令未分配
- 該指令被視為 NOP
- 該指令使用指定的尋址模式執行所有加載,并且基址寄存器變為 UNKNOWN。此外,如果在此類指令期間發生異常,則基地址可能會被破壞,從而無法重復該指令。
如果存儲對指令執行回寫并且正在存儲的寄存器之一也是基址寄存器,則可能發生以下行為之一:
- 指令未分配
- 該指令被視為 NOP
- 該指令執行所有使用指定尋址模式指定的寄存器的存儲,但為基址寄存器存儲的值是 UNKNOWN
- LDP Wt1, Wt2, addr
加載對寄存器:將兩個字從 addr 尋址的存儲器加載到 Wt1 和 Wt2。 - LDP Xt1, Xt2, addr
加載對寄存器(擴展):從 addr 尋址的內存中加載兩個雙字到 Xt1 和 Xt2。 - LDPSW Xt1, Xt2, addr
Load Pair Signed Words (extended) 從 addr 尋址的內存中加載兩個字,然后將它們符號擴展為 Xt1 和 Xt2。 - STP Wt1, Wt2, addr
存儲對寄存器:將兩個字從 Wt1 和 Wt2 存儲到由 addr 尋址的存儲器。 - STP Xt1, Xt2, addr
存儲對寄存器(擴展):將兩個雙字從 Xt1 和 Xt2 存儲到由 addr 尋址的內存中。
5.2.5 加載-存儲Non-temporal Pair
LDNP 和 STNP 非時間對指令向內存系統提供了一個提示,即訪問是“非時間”或“流式”的,并且不太可能在不久的將來再次訪問,因此不需要保留在數據緩存中。但是,根據內存類型,它們可能允許預加載內存讀取并收集內存寫入,以加速大容量內存傳輸。
此外,作為正常內存排序規則的一個特殊例外,其中兩次內存讀取之間存在地址依賴性,并且第二次讀取是由 Load Non-temporal Pair 指令生成的,那么在沒有任何其他屏障機制來實現順序的情況下,在被訪問的內存地址的可共享域內,其他觀察者可以以任何順序觀察這些內存訪問。
LDNP 和 STNP 指令支持基址寄存器 Xn 或 SP 的尋址模式,此外:
- 縮放的 7 位有符號立即偏移量,沒有索引前和索引后選項
如果 Load Non-temporal Pair 指令為正在加載的兩個寄存器指定相同的寄存器,則
可能會出現以下行為之一:
- 指令未分配
- 該指令被視為 NOP
- 該指令使用指定的尋址模式執行所有加載,并且正在加載的寄存器采用 UNKNOWN 值
- LDNP Wt1, Wt2, [base,#imm]
Load Non-temporal Pair:從內存中通過 base+imm 尋址的兩個字加載到 Wt1 和 Wt2,并帶有非時間提示。 - LDNP Xt1, Xt2, [base,#imm]
Load Non-temporal Pair (extended):將兩個雙字從 base+imm 尋址的內存中加載到 Xt1 和 Xt2,并帶有非臨時提示。 - STNP Wt1, Wt2, [base,#imm]
存儲非時間對:將 Wt1 和 Wt2 中的兩個單詞存儲到由 base+imm 尋址的內存中,并帶有非時間提示。 - STNP Xt1, Xt2, [base,#imm]
存儲非時間對(擴展):將兩個雙字從 Xt1 和 Xt2 存儲到由 base+imm 尋址的內存中,并帶有非時間提示。
5.2.6 加載-存儲非特權
當處理器處于 EL1 異常級別時,可以使用加載-存儲非特權指令來執行內存訪問,就像它處于 EL0(非特權)異常級別一樣。 如果處理器處于任何其他異常級別,則執行該級別的正常內存訪問。 (這些助記符中的字母“T”基于歷史上的 ARM 約定,該約定將對非特權虛擬地址的訪問描述為“翻譯”)。 加載-存儲非特權指令支持基址寄存器 Xn 或 SP 的尋址模式,此外:
- 未縮放、9 位、有符號立即偏移量,沒有索引前和索引后選項
- LDTR Wt, [base,#simm9]
加載非特權寄存器:在 EL1 時使用 EL0 特權將由 base+simm9 尋址的內存中的字加載到 Wt。 - LDTR Xt, [base,#simm9]
加載非特權寄存器(擴展):將雙字從由 base+simm9 尋址的內存加載到 Xt,在 EL1 時使用 EL0 特權。 - LDTRB Wt, [base,#simm9]
加載非特權字節:從 base+simm9 尋址的內存中加載一個字節,然后將其零擴展為 Wt,在 EL1 時使用 EL0 特權。 - LDTRSB Wt, [base,#simm9]
Load Unprivileged Signed Byte:從base+simm9尋址的內存中加載一個字節,然后將其符號擴展到Wt,在EL1時使用EL0權限。 - LDTRSB Xt, [base,#simm9]
Load Unprivileged Signed Byte (extended):從內存中加載一個由 base+simm9 尋址的字節,然后在 EL1 時使用 EL0 權限將其符號擴展到 Xt。 - LDTRH Wt, [base,#simm9]
Load Unprivileged Halfword:從base+simm9尋址的內存中加載一個半字,然后將其零擴展為Wt,在EL1時使用EL0權限。 - LDTRSH Wt, [base,#simm9]
Load Unprivileged Signed Halfword:從 base+simm9 尋址的內存中加載一個半字,然后將其符號擴展為 Wt,在 EL1 時使用 EL0 權限。 - LDTRSH Xt, [base,#simm9]
Load Unprivileged Signed Halfword (extended):從內存中加載一個由 base+simm9 尋址的半字,然后在 EL1 時使用 EL0 權限將其符號擴展到 Xt 中。 - LDTRSW Xt, [base,#simm9]
Load Unprivileged Signed Word (extended):從內存中加載一個由 base+simm9 尋址的字,然后在 EL1 時使用 EL0 權限將其符號擴展到 Xt。 - STTR Wt, [base,#simm9]
存儲非特權寄存器:將 Wt 中的一個字存儲到由 base+simm9 尋址的內存中,在 EL1 時使用 EL0 特權。 - STTR Xt, [base,#simm9]
存儲非特權寄存器(擴展):將雙字從 Xt 存儲到由 base+simm9 尋址的內存,在 EL1 時使用 EL0 特權。 - STTRB Wt, [base,#simm9]
存儲非特權字節:將一個字節從 Wt 存儲到由 base+simm9 尋址的內存中,在 EL1 時使用 EL0 特權。 - STTRH Wt, [base,#simm9]
Store Unprivileged Halfword:將一個半字從 Wt 存儲到由 base+simm9 尋址的內存中,使用
在 EL1 時的 EL0 特權
5.2.7 加載存儲獨占
加載獨占指令將訪問的物理地址標記為獨占訪問,由存儲獨占檢查,允許對共享內存變量、信號量、互斥鎖、自旋鎖等進行“原子”讀-修改-寫操作。
加載-存儲獨占指令僅支持基址寄存器 Xn 或 SP 的簡單尋址模式。 #0 的可選偏移量必須被匯編器接受,但在反匯編時可以省略。
需要自然對齊:未對齊的地址將導致對齊錯誤。 由加載獨占對或存儲獨占對生成的內存訪問必須與對的大小對齊,并且當存儲獨占對成功時,將導致整個內存位置的單副本原子更新。
- LDXR Wt, [base{,#0}]
加載獨占寄存器:從基址尋址的內存中加載一個字到 Wt。將物理地址記錄為獨占訪問。 - LDXR Xt, [base{,#0}]
加載獨占寄存器(擴展):從基址尋址的內存中加載一個雙字到 Xt。將物理地址記錄為獨占訪問。 - LDXRB Wt, [base{,#0}]
加載獨占字節:從基址尋址的內存中加載一個字節,然后將其零擴展為 Wt。將物理地址記錄為獨占訪問。 - LDXRH Wt, [base{,#0}]
加載獨占半字:從基址尋址的內存中加載半字,然后將其零擴展為 Wt。將物理地址記錄為獨占訪問。 - LDXP Wt, Wt2, [base{,#0}]
加載獨占對寄存器:從基址尋址的內存中加載兩個字,并將其加載到 Wt 和 Wt2。將物理地址記錄為獨占訪問。 - LDXP Xt, Xt2, [base{,#0}]
Load Exclusive Pair Registers (extended):從基址尋址的內存中加載兩個雙字到 Xt 和 Xt2。將物理地址記錄為獨占訪問。 - STXR Ws, Wt, [base{,#0}]
存儲獨占寄存器:將字從 Wt 存儲到由基址尋址的內存中,并將 Ws 設置為返回的獨占訪問狀態。 - STXR Ws, Xt, [base{,#0}]
存儲獨占寄存器(擴展):將雙字從 Xt 存儲到由基址尋址的內存中,并將 Ws 設置為返回的獨占訪問狀態。 - STXRB Ws, Wt, [base{,#0}]
存儲獨占字節:將字節從 Wt 存儲到由基址尋址的內存中,并將 Ws 設置為返回的獨占訪問狀態。 - STXRH Ws, Wt, [base{,#0}]
存儲獨占半字:將半字從 Xt 存儲到由基址尋址的內存中,并將 Ws 設置為返回的獨占訪問狀態。 - STXP Ws, Wt, Wt2, [base{,#0}]
Store Exclusive Pair:將 Wt 和 Wt2 兩個字存儲到由基址尋址的內存中,并將 Ws 設置為返回的獨占訪問狀態。 - STXP Ws, Xt, Xt2, [base{,#0}]
Store Exclusive Pair (extended):將Xt和Xt2的兩個雙字存儲到由基址尋址的內存中,并將Ws設置為返回的獨占訪問狀態
5.2.8 Load-Acquire / Store-Release
加載獲取是一種加載,它保證在加載獲取之后按程序順序出現的所有加載和存儲將在該觀察者觀察到加載獲取之后被每個觀察者觀察到,但是對于加載和存儲之前出現的加載和存儲只字未提。獲得。
在每個觀察者觀察到在 store-release 之前按程序順序出現的任何加載或存儲之后,每個觀察者都會觀察到 store-release,但對于在 store-release 之后出現的加載和存儲只字不提。此外,每個觀察者將按程序順序觀察存儲釋放和加載獲取。
進一步的考慮是所有的 store-release 操作必須是多副本原子的:也就是說,如果一個 agent 已經看到了 store-release,那么所有的 agent 都已經看到了 store-release。普通 store 不需要多副本原子。
load-acquire 和 store-release 指令僅支持基址寄存器 Xn 或 SP 的簡單尋址模式。 #0 的可選偏移量必須被匯編器接受,但在反匯編時可以省略
需要自然對齊:未對齊的地址將導致對齊錯誤。
5.2.8.1 Non-exclusive
- LDAR Wt, [base{,#0}]
Load-Acquire Register:將一個字從由base尋址的內存加載到Wt。 - LDAR Xt, [base{,#0}]
Load-Acquire Register (extended):從基址尋址的內存中加載一個雙字到 Xt。 - LDARB Wt, [base{,#0}]
Load-Acquire Byte:從基址尋址的內存中加載一個字節,然后將其零擴展為 Wt。 - LDARH Wt, [base{,#0}]
Load-Acquire Halfword:從基址尋址的內存中加載一個半字,然后將其零擴展為 Wt。 - STLR Wt, [base{,#0}]
存儲釋放寄存器:將一個字從 Wt 存儲到由基址尋址的內存中。 - STLR Xt, [base{,#0}]
存儲釋放寄存器(擴展):將一個雙字從 Xt 存儲到由基址尋址的內存中。 - STLRB Wt, [base{,#0}]
Store-Release Byte:將一個字節從 Wt 存儲到由基址尋址的內存中。 - STLRH Wt, [base{,#0}]
Store-Release Halfword:將一個半字從 Wt 存儲到由基址尋址的內存中。
5.2.8.2 Exclusive
- LDAXR Wt, [base{,#0}]
Load-Acquire Exclusive Register:將字從由base尋址的內存加載到Wt。將物理地址記錄為獨占訪問。 - LDAXR Xt, [base{,#0}]
Load-Acquire Exclusive Register (extended):將雙字從由基址尋址的內存加載到 Xt。將物理地址記錄為獨占訪問。 - LDAXRB Wt, [base{,#0}]
Load-Acquire Exclusive Byte:從基址尋址的內存中加載字節,然后將其零擴展為 Wt。將物理地址記錄為獨占訪問。 - LDAXRH Wt, [base{,#0}]
Load-Acquire Exclusive Halfword:從基址尋址的內存中加載半字,然后將其零擴展為 Wt。將物理地址記錄為獨占訪問。 - LDAXP Wt, Wt2, [base{,#0}]
Load-Acquire Exclusive Pair Registers:從基址尋址的存儲器中加載兩個字到 Wt 和 Wt2。將物理地址記錄為獨占訪問。 - LDAXP Xt, Xt2, [base{,#0}]
Load-Acquire Exclusive Pair Registers (extended):從基址尋址的內存中加載兩個雙字到 Xt 和 Xt2。將物理地址記錄為獨占訪問。 - STLXR Ws, Wt, [base{,#0}]
Store-Release Exclusive Register:將字從 Wt 存儲到由基址尋址的內存中,并將 Ws 設置為返回的獨占訪問狀態。 - STLXR Ws, Xt, [base{,#0}]
Store-Release Exclusive Register (extended):將雙字從 Xt 存儲到由基址尋址的內存中,并將 Ws 設置為返回的獨占訪問狀態。 - STLXRB Ws, Wt, [base{,#0}]
Store-Release Exclusive Byte:將字節從 Wt 存儲到由 base 尋址的內存中,并將 Ws 設置為返回的獨占訪問狀態。 - STLXRH Ws, Xt|Wt, [base{,#0}]
Store-Release Exclusive Halfword:將來自Wt的半字存儲到由base尋址的內存中,并將Ws設置為返回的獨占訪問狀態。 - STLXP Ws, Wt, Wt2, [base{,#0}]
Store-Release Exclusive Pair:將 Wt 和 Wt2 兩個字存儲到 base 尋址的內存中,并將 Ws 設置為返回的獨占訪問狀態。 - STLXP Ws, Xt, Xt2, [base{,#0}]
Store-Release Exclusive Pair (extended):將 Xt 和 Xt2 中的兩個雙字存儲到由基址尋址的內存中,并將 Ws 設置為返回的獨占訪問狀態。
5.2.9 預取內存
預取存儲器指令向存儲器系統發出信號,表明在不久的將來可能會從指定地址訪問存儲器。 內存系統可以通過采取預期在內存訪問確實發生時加快內存訪問的動作來做出響應,例如將指定地址預加載到一個或多個高速緩存中。 由于這些只是提示,因此 CPU 將任何或所有預取指令視為無操作是有效的。
預取指令支持多種尋址模式,包括基址寄存器 Xn 或 SP,以及以下之一:
- 縮放的 12 位無符號立即偏移量,沒有索引前和索引后選項。
- 未縮放、9 位、有符號立即偏移量,沒有索引前和索引后選項。
- 縮放或未縮放的 64 位寄存器偏移量。
- 縮放或未縮放的 32 位擴展寄存器偏移量。
此外:
- 相對于 PC 的地址或標簽,在當前 PC 的 ±1MB 范圍內。
- 如果偏移量被縮放,就好像訪問大小為 8 字節。
PRFM <prfop>, addr|label
預取內存,使用 提示,其中 是以下之一:
PLDL1KEEP, PLDL1STRM, PLDL2KEEP, PLDL2STRM, PLDL3KEEP, PLDL3STRM
PSTL1KEEP, PSTL1STRM, PSTL2KEEP, PSTL2STRM, PSTL3KEEP, PSTL3STRM
<prfop> ::= <type><target><policy> | #uimm5
::= “PLD” (prefetch for load) | “PST” (prefetch for store)
::= “L1” (L1 cache) | “L2” (L2 cache) | “L3” (L3 cache)
::= “KEEP” (retained or temporal prefetch, i.e. allocate in cache normally)
|“STRM” (streaming or non-temporal prefetch, i.e. memory used only once)
#uimm5 ::= represents the unallocated hint encodings as a 5-bit immediate
5.3 數據處理(立即數)
數據處理(立即數)支持以下指令組:
- 算術(立即)
- 邏輯(立即)
- 移動(立即)
- 位域(操作)
- 班次(立即)
- 符號/零擴展
5.3.1 算術(立即數)
這些指令接受顯示為aimm的算術立即數,它被編碼為左移0或12位的12位無符號立即數。 在匯編語言中,這可以寫成:
- #uimm12,LSL #sh
12 位無符號立即數,顯式左移 0 或 12。 - #uimm24
24 位無符號立即數。 匯編器應確定 uimm12 的適當值,并以 0 或 12 的最低可能移位來生成請求的值; 如果該值在 bits<23:12> 和 bits<11:0> 中包含非零位,則將產生錯誤。 - #nimm25
“對程序員友好”的匯編器可以接受介于 -(224-1) 和 -1 之間的負立即數,導致它將請求的 ADD 操作轉換為 SUB,反之亦然,然后將立即數的絕對值編碼為 對于 uimm24。 然而,架構匯編語言不需要這種行為。
反匯編程序通常應該使用 uimm24 形式輸出算術立即數,除非編碼的移位量不是可以使用的最低可能移位(例如,#0,LSL #12 不能使用 uimm24 形式輸出)。
不設置條件標志的算術指令可以讀取和/或寫入當前堆棧指針,例如在函數序言或結尾調整堆棧指針; 標志設置指令可以讀取堆棧指針,但不能寫入。
- ADD Wd|WSP, Wn|WSP, #aimm
Add (immediate): Wd|WSP = Wn|WSP + aimm. - ADD Xd|SP, Xn|SP, #aimm
Add (extended immediate): Xd|SP = Xn|SP + aimm. - ADDS Wd, Wn|WSP, #aimm
Add and set flags (immediate): Wd = Wn|WSP + aimm, setting the condition flags. - ADDS Xd, Xn|SP, #aimm
Add and set flags (extended immediate): Xd = Xn|SP + aimm, setting the condition flags. - SUB Wd|WSP, Wn|WSP, #aimm
Subtract (immediate): Wd|WSP = Wn|WSP - aimm. - SUB Xd|SP, Xn|SP, #aimm
Subtract (extended immediate): Xd|SP = Xn|SP - aimm. - SUBS Wd, Wn|WSP, #aimm
Subtract and set flags (immediate): Wd = Wn|WSP - aimm, setting the condition flags. - SUBS Xd, Xn|SP, #aimm
Subtract and set flags (extended immediate): Xd = Xn|SP - aimm, setting the condition flags. - CMP Wn|WSP, #aimm
Compare (immediate): alias for SUBS WZR,Wn|WSP,#aimm. - CMP Xn|SP, #aimm
Compare (extended immediate): alias for SUBS XZR,Xn|SP,#aimm. - CMN Wn|WSP, #aimm
Compare negative (immediate): alias for ADDS WZR,Wn|WSP,#aimm. - CMN Xn|SP, #aimm
Compare negative (extended immediate): alias for ADDS XZR,Xn|SP,#aimm. - MOV Wd|WSP, Wn|WSP
Move (register): alias for ADD Wd|WSP,Wn|WSP,#0, but only when one or other of the registers is WSP. In other cases the ORR Wd,WZR,Wn instruction is used. - MOV Xd|SP, Xn|SP
Move (extended register): alias for ADD Xd|SP,Xn|SP,#0, but only when one or other of the registers is SP. In other cases the ORR Xd,XZR,Xn instruction is used
5.3.2 邏輯(立即數)
邏輯立即數指令接受位掩碼立即數 bimm32 或 bimm64。 這樣的立即數包括在 2、4、8、16、32 或 64 位的元素內具有至少一個非零位和至少一個零位的單個連續序列; 然后元素被復制到整個寄存器寬度,或者這個值的按位反轉。 全零和全一的立即數可能不會被編碼為位掩碼立即數,因此匯編程序必須為具有這種立即數的邏輯指令生成錯誤,或者程序員友好的匯編程序可以將其轉換為其他指令 這達到了預期的結果。
邏輯(立即)指令可以寫入當前堆棧指針,例如在函數序言中對齊堆棧指針。
注意:除 ANDS 外,邏輯立即數指令不設置條件標志,但“有趣”的結果通常可以直接控制 CBZ、CBNZ、TBZ 或 TBNZ 條件分支。
- AND Wd|WSP, Wn, #bimm32
Bitwise AND (immediate): Wd|WSP = Wn AND bimm32. - AND Xd|SP, Xn, #bimm64
Bitwise AND (extended immediate): Xd|SP = Xn AND bimm64. - - ANDS Wd, Wn, #bimm32
Bitwise AND and Set Flags (immediate): Wd = Wn AND bimm32, setting N & Z condition flags based on the result and clearing the C & V flags.
ANDS Xd, Xn, #bimm64
Bitwise AND and Set Flags (extended immediate): Xd = Xn AND bimm64, setting N & Z condition flags based on the result and clearing the C & V flags. - EOR Wd|WSP, Wn, #bimm32
Bitwise exclusive OR (immediate): Wd|WSP = Wn EOR bimm32. - EOR Xd|SP, Xn, #bimm64
Bitwise exclusive OR (extended immediate): Xd|SP = Xn EOR bimm64. - ORR Wd|WSP, Wn, #bimm32
Bitwise inclusive OR (immediate): Wd|WSP = Wn OR bimm32. - ORR Xd|SP, Xn, #bimm64
Bitwise inclusive OR (extended immediate): Xd|SP = Xn OR bimm64. - MOVI Wd, #bimm32
Move bitmask (immediate): alias for ORR Wd,WZR,#bimm32, but may disassemble as MOV, see below. - MOVI Xd, #bimm64
Move bitmask (extended immediate): alias for ORR Xd,XZR,#bimm64, but may disassemble as MOV, see below. - TST Wn, #bimm32
Bitwise test (immediate): alias for ANDS WZR,Wn,#bimm32. - TST Xn, #bimm64
Bitwise test (extended immediate): alias for ANDS XZR,Xn,#bimm64
5.3.3 Move (wide immediate)
這些指令將 16 位立即數(或反轉立即數)插入目標寄存器中的 16 位對齊位置,其他目標寄存器位的值取決于所使用的變體。 移位量pos可以是寄存器大小的16的任意倍數。 省略“LSL #pos”意味著偏移 0。
- MOVZ Wt, #uimm16{, LSL #pos}
Move with Zero (immediate): Wt = LSL(uimm16, pos).Usually disassembled as MOV, see below. - MOVZ Xt, #uimm16{, LSL #pos}
Move with Zero (extended immediate): Xt = LSL(uimm16, pos). Usually disassembled as MOV, see below. - MOVN Wt, #uimm16{, LSL #pos}
Move with NOT (immediate): Wt = NOT(LSL(uimm16, pos)). Usually disassembled as MOV, see below. - MOVN Xt, #uimm16{, LSL #pos}
Move with NOT (extended immediate): Xt = NOT(LSL(uimm16, pos)). Usually disassembled as MOV, see below. - MOVK Wt, #uimm16{, LSL #pos}
Move with Keep (immediate): Wtpos+15:pos = uimm16 - MOVK Xt, #uimm16{, LSL #pos}
Move with Keep (extended immediate): Xtpos+15:pos = uimm16.
5.3.3.1 Move (immediate)
- MOV Wd, #simm32
生成單個 MOVZ、MOVN 或 MOVI 指令的合成匯編指令,將 32 位立即值加載到寄存器 Wd 中。 如果這些指令中的一條指令不能創建立即數,則將導致匯編程序錯誤。 如果有選擇,那么為了確保可逆性,匯編器必須優先選擇 MOVZ 而不是 MOVN,以及 MOVZ 或 MOVN 而不是 MOVI。 反匯編程序可以將 MOVI、MOVZ 和 MOVN 作為 MOV 助記符輸出,除非 MOVI 具有可由 MOVZ 或 MOVN 指令生成的立即數,或 MOVN 具有可由 MOVZ 編碼的立即數,或 MOVZ/MOVN #0 具有除 LSL #0 以外的移位量,在這種情況下必須使用機器指令助記符。 - MOV Xd, #simm64
與 MOV 相同,但用于將 64 位立即數加載到寄存器 Xd 中。
5.3.4 地址生成(Address Generation)
- ADRP Xd, label
頁面地址:符號擴展了一個 21 位偏移量,將其左移 12 位并將其與 PC 的值相加,并清除其低 12 位,將結果寫入寄存器 Xd。 這將計算包含標簽的 4KiB 對齊內存區域的基地址,并設計用于與提供標簽地址的低 12 位的加載、存儲或添加指令結合使用。 這允許使用兩條指令對 PC 的 ±4GiB 內的任何位置進行與位置無關的尋址,前提是動態重定位以 4KiB 的最小粒度完成(即標簽地址的底部 12 位不受重定位的影響)。 術語“頁面”是 4KiB 重定位粒度的簡寫,不一定與虛擬內存頁面大小有關。 - ADR Xd, label
地址:將 21 位有符號字節偏移量添加到程序計數器,將結果寫入寄存器 Xd。 用于計算 PC 的 ±1MiB 內任何位置的有效地址
5.3.5 位域操作
- BFM Wd, Wn, #r, #s
Bitfield Move: if s>=r then Wds-r:0 = Wn<s:r>, else Wd<32+s-r,32-r> = Wn<s:0>.
保持 Wd 中的其他位不變。 - BFM Xd, Xn, #r, #s
Bitfield Move: if s>=r then Xds-r:0 = Xn<s:r>, else Xd<64+s-r,64-r> = Xn<s:0>.
保持 Xd 中的其他位不變。 - SBFM Wd, Wn, #r, #s
Signed Bitfield Move: if s>=r then Wds-r:0 = Wn<s:r>, else Wd<32+s-r,32-r> = Wn<s:0>.
將目標位域左側的位設置為其最左側位的副本,并將右側的位設置為零。 - SBFM Xd, Xn, #r, #s
Signed Bitfield Move: if s>=r then Xds-r:0 = Xn<s:r>, else Xd<64+s-r,64-r> = Xn<s:0>.
將目標位域左側的位設置為其最左側位的副本,并將右側的位設置為零。 - UBFM Wd, Wn, #r, #s
Unsigned Bitfield Move: if s>=r then Wds-r:0 = Wn<s:r>, else Wd<32+s-r,32-r> = Wn<s:0>.
將目標位域左側和右側的位設置為零。 - UBFM Xd, Xn, #r, #s
Unsigned Bitfield Move: if s>=r then Xds-r:0 = Xn<s:r>, else Xd<32+s-r,32-r> = Xn<s:0>.
將目標位域左側和右側的位設置為零。
以下別名提供了更熟悉的位域插入和提取助記符,具有常規位域 lsb 和寬度操作數,必須滿足約束 lsb >= 0 && width >= 1 && lsb+width <= reg.size
- BFI Wd, Wn, #lsb, #width
Bitfield Insert: alias for BFM Wd,Wn,#((32-lsb)&31),#(width-1).
Preferred for disassembly when s < r. - BFI Xd, Xn, #lsb, #width
Bitfield Insert (extended): alias for BFM Xd,Xn,#((64-lsb)&63),#(width-1).
Preferred for disassembly when s < r. - BFXIL Wd, Wn, #lsb, #width
Bitfield Extract and Insert Low: alias for BFM Wd,Wn,#lsb,#(lsb+width-1).
Preferred for disassembly when s >= r. - BFXIL Xd, Xn, #lsb, #width
Bitfield Extract and Insert Low (extended): alias for BFM Xd,Xn,#lsb,#(lsb+width-1).
Preferred for disassembly when s >= r. - SBFIZ Wd, Wn, #lsb, #width
Signed Bitfield Insert in Zero: alias for) SBFM Wd,Wn,#((32-lsb)&31),#(width-1).
Preferred for disassembly when s < r. - SBFIZ Xd, Xn, #lsb, #width
Signed Bitfield Insert in Zero (extended): alias for SBFM Xd,Xn,#((64-lsb)&63),#(width-1).
Preferred for disassembly when s < r. - SBFX Wd, Wn, #lsb, #width
Signed Bitfield Extract: alias for SBFM Wd,Wn,#lsb,#(lsb+width-1).
Preferred for disassembly when s >= r. - SBFX Xd, Xn, #lsb, #width
Signed Bitfield Extract (extended): alias for SBFM Xd,Xn,#lsb,#(lsb+width-1).
Preferred for disassembly when s >= r. - UBFIZ Wd, Wn, #lsb, #width
Unsigned Bitfield Insert in Zero: alias for UBFM Wd,Wn,#((32-lsb)&31),#(width-1).
Preferred for disassembly when s < r. - UBFIZ Xd, Xn, #lsb, #width
Unsigned Bitfield Insert in Zero (extended): alias for UBFM Xd,Xn,#((64-lsb)&63),#(width-1).
Preferred for disassembly when s < r. - UBFX Wd, Wn, #lsb, #width
Unsigned Bitfield Extract: alias for UBFM Wd,Wn,#lsb,#(lsb+width-1).
Preferred for disassembly when s >= r. - UBFX Xd, Xn, #lsb, #width
Unsigned Bitfield Extract (extended): alias for UBFM Xd,Xn,#lsb,#(lsb+width-1).
Preferred for disassembly when s >= r.
5.3.6 提取(立即數)-- Extract (immediate)
- EXTR Wd, Wn, Wm, #lsb
Extract: Wd = Wn:Wm<lsb+31,lsb>. The bit position lsb must be in the range 0 to 31. - EXTR Xd, Xn, Xm, #lsb
Extract (extended): Xd = Xn:Xm<lsb+63,lsb>. The bit position lsb must be in the range 0 to 63.
5.3.7 Shift(立即數)
所有立即移位和旋轉都是別名,使用 Bitfield 或 Extract 指令實現。 在所有情況下,立即移位量 uimm 必須在 0 到 (reg.size - 1) 的范圍內。
- ASR Wd, Wn, #uimm
Arithmetic Shift Right (immediate): alias for SBFM Wd,Wn,#uimm,#31. - ASR Xd, Xn, #uimm
Arithmetic Shift Right (extended immediate): alias for SBFM Xd,Xn,#uimm,#63. - LSL Wd, Wn, #uimm
Logical Shift Left (immediate): alias for UBFM Wd,Wn,#((32-uimm)&31),#(31-uimm). - LSL Xd, Xn, #uimm
Logical Shift Left (extended immediate): alias for UBFM Xd,Xn,#((64-uimm)&63),#(63-uimm) - LSR Wd, Wn, #uimm
Logical Shift Left (immediate): alias for UBFM Wd,Wn,#uimm,#31. - LSR Xd, Xn, #uimm
Logical Shift Left (extended immediate): alias for UBFM Xd,Xn,#uimm,#31. - ROR Wd, Wm, #uimm
Rotate Right (immediate): alias for EXTR Wd,Wm,Wm,#uimm. - ROR Xd, Xm, #uimm
Rotate Right (extended immediate): alias for EXTR Xd,Xm,Xm,#uimm.
5.3.8 符號/零擴展
- SXT[BH] Wd, Wn
Signed Extend Byte|Halfword: alias for SBFM Wd,Wn,#0,#7|15. - SXT[BHW] Xd, Wn
Signed Extend Byte|Halfword|Word (extended): alias for SBFM Xd,Xn,#0,#7|15|31. - UXT[BH] Wd, Wn
Unsigned Extend Byte|Halfword: alias for UBFM Wd,Wn,#0,#7|15. - UXT[BHW] Xd, Wn
Unsigned Extend Byte|Halfword|Word (extended): alias for UBFM Xd,Xn,#0,#7|15|31.
5.4 數據處理(寄存器)
數據處理(寄存器)支持以下指令組:
- 算術(移位寄存器)
- 算術(擴展寄存器)
- 邏輯(移位寄存器)
- 算術(未移位寄存器)
- 移位(寄存器)
- 按位運算
5.4.1 算術(移位寄存器)
移位寄存器指令在執行算術運算之前對最終源操作數值應用可選移位。 指令的寄存器大小控制在右移或旋轉時將新位輸入到中間結果的位置(即位 63 或 31)。
移位運算符 LSL、ASR 和 LSR 接受 0 到 reg.size - 1 范圍內的立即移位量。
省略移位運算符意味著“LSL #0”(即沒有移位),并且“LSL #0”不應由反匯編程序輸出; 必須輸出所有其他零位移。
寄存器名稱 SP 和 WSP 不能與此類指令一起使用,請參閱第 5.4.2 節
- ADD Wd, Wn, Wm{, ashift #imm}
Add (register): Wd = Wn + ashift(Wm, imm). - ADD Xd, Xn, Xm{, ashift #imm}
Add (extended register): Xd = Xn + ashift(Xm, imm). - ADDS Wd, Wn, Wm{, ashift #imm}
Add and Set Flags (register): Wd = Wn + ashift(Wm, imm), setting condition flags. - ADDS Xd, Xn, Xm{, ashift #imm}
Add and Set Flags (extended register): Xd = Xn + ashift(Xm, imm), setting condition flags. - SUB Wd, Wn, Wm{, ashift #imm}
Subtract (register): Wd = Wn - ashift(Wm, imm). - SUB Xd, Xn, Xm{, ashift #imm}
Subtract (extended register): Xd = Xn - ashift(Xm, imm). - SUBS Wd, Wn, Wm{, ashift #imm}
Subtract and Set Flags (register): Wd = Wn - ashift(Wm, imm), setting condition flags. - SUBS Xd, Xn, Xm{, ashift #imm}
Subtract and Set Flags (extended register): Xd = Xn - ashift(Xm, imm), setting condition flags. - CMN Wn, Wm{, ashift #imm}
Compare Negative (register): alias for ADDS WZR, Wn, Wm{, ashift #imm}. - CMN Xn, Xm{, ashift #imm}
Compare Negative (extended register): alias for ADDS XZR, Xn, Xm{, ashift #imm}. - CMP Wn, Wm{, ashift #imm}
Compare (register): alias for SUBS WZR, Wn, Wm{,ashift #imm}. - CMP Xn, Xm{, ashift #imm}
Compare (extended register): alias for SUBS XZR, Xn, Xm{, ashift #imm}. - NEG Wd, Wm{, ashift #imm}
Negate: alias for SUB Wd, WZR, Wm{, ashift #imm}. - NEG Xd, Xm{, ashift #imm}
Negate (extended): alias for SUB Xd, XZR, Xm{, ashift #imm}. - NEGS Wd, Wm{, ashift #imm}
Negate and Set Flags: alias for SUBS Wd, WZR, Wm{, ashift #imm}. - NEGS Xd, Xm{, ashift #imm}
Negate and Set Flags (extended): alias for SUBS Xd, XZR, Xm{, ashift #imm}
5.4.2 算術(擴展寄存器)
擴展寄存器指令與移位寄存器形式的不同之處在于:
(一)。 非標志設置變體允許將堆棧指針用作目標寄存器和第一源寄存器中的一個或兩個。 標志設置變體只允許堆棧指針作為第一個源寄存器。
(2)。 它們提供了第二個源寄存器值的一部分的可選符號或零擴展,然后是可選的立即左移 1 和 4(含)。
“擴展移位”由強制擴展運算符 SXTB、SXTH、SXTW、SXTX、UXTB、UXTH、UXTW 或 UXTX 描述,其后是可選的左移量。如果省略移位量,則默認為零,并且反匯編程序不應輸出零移位量。
對于 64 位指令形式,操作符 UXTX 和 SXTX(首選 UXTX)都執行第二個源寄存器的“無操作”擴展,然后是可選的移位。當且僅當 UXTX 在至少一個操作數中與寄存器名稱 SP 結合使用時,則首選別名 LSL,在這種情況下,運算符和移位量都可以省略,表示“LSL #0”。
類似地,對于 32 位指令形式,運算符 UXTW 和 SXTW(首選 UXTW)都執行第二個源寄存器的“無操作”擴展,然后是可選的移位。當且僅當 UXTW 與至少一個操作數中的寄存器名稱 WSP 結合使用時,別名 LSL 是首選。在這些指令的 64 位形式中,除了(可能省略)UXTX/LSL 和 SXTX 運算符之外,最后的寄存器操作數寫為 Wm。例如:
CMP X4, W5, SXTW ADD X1, X2, W3, UXTB #2 SUB SP, SP, X1 // SUB SP, SP, X1, UXTX #0- ADD Wd|WSP, Wn|WSP, Wm, extend {#imm}
Add (register, extending): Wd|WSP = Wn|WSP + LSL(extend(Wm),imm). - ADD Xd|SP, Xn|SP, Wm, extend {#imm}
Add (extended register, extending): Xd|SP = Xn|SP + LSL(extend(Wm),imm). - ADD Xd|SP, Xn|SP, Xm{, UXTX|LSL #imm}
Add (extended register, extending): Xd|SP = Xn|SP + LSL(Xm,imm). - ADDS Wd, Wn|WSP, Wm, extend {#imm}
Add and Set Flags (register, extending): Wd = Wn|WSP + LSL(extend(Wm),imm), setting the condition flags. - ADDS Xd, Xn|SP, Wm, extend {#imm}
Add and Set Flags (extended register, extending): Xd = Xn|SP + LSL(extend(Wm),imm), setting the condition flags. - ADDS Xd, Xn|SP, Xm{, UXTX|LSL #imm}
Add and Set Flags (extended register, extending): Xd = Xn|SP + LSL(Xm,imm), setting the condition flags. - SUB Wd|WSP, Wn|WSP, Wm, extend {#imm}
Subtract (register, extending): Wd|WSP = Wn|WSP - LSL(extend(Wm),imm). - SUB Xd|SP, Xn|SP, Wm, extend {#imm}
Subtract (extended register, extending): Xd|SP = Xn|SP - LSL(extend(Wm),imm). - SUB Xd|SP, Xn|SP, Xm{, UXTX|LSL #imm}
Subtract (extended register, extending): Xd|SP = Xn|SP - LSL(Xm,imm). - SUBS Wd, Wn|WSP, Wm, extend {#imm}
Subtract and Set Flags (register, extending): Wd = Wn|WSP - LSL(extend(Wm),imm), setting the condition flags. - SUBS Xd, Xn|SP, Wm, extend {#imm}
Subtract and Set Flags (extended register, extending): Xd = Xn|SP - LSL(extend(Wm),imm), setting the condition flags. - SUBS Xd, Xn|SP, Xm{, UXTX|LSL #imm}
Subtract and Set Flags (extended register, extending): Xd = Xn|SP - LSL(Xm,imm), setting the condition flags. - CMN Wn|WSP, Wm, extend {#imm}
Compare Negative (register, extending): alias for ADDS WZR,Wn,Wm,extend {#imm}. - CMN Xn|SP, Wm, extend {#imm}
Compare Negative (extended register, extending): alias for ADDS XZR,Xn,Wm,extend {#imm}. - CMN Xn|SP, Xm{, UXTX|LSL #imm}
Compare Negative (extended register, extending): alias for ADDS XZR,Xn,Xm{,UXTX|LSL #imm}. - CMP Wn|WSP, Wm, extend {#imm}
Compare (register, extending): alias for SUBS WZR,Wn,Wm,extend {#imm}. - CMP Xn|SP, Wm, extend {#imm}
Compare (extended register, extending): alias for SUBS XZR,Xn,Wm,extend {#imm}. - CMP Xn|SP, Xm{, UXTX|LSL #imm}
Compare (extended register, extending): alias for SUBS XZR,Xn,Xm{,UXTX|LSL #imm}.
5.4.3 邏輯(移位寄存器)
邏輯(移位寄存器)指令在執行主操作之前將可選的移位運算符應用于其最終源操作數。 指令的寄存器大小控制在右移或旋轉時將新位輸入到中間結果的位置(即位 63 或 31)。
移位運算符 LSL、ASR、LSR 和 ROR 接受 0 到 reg.size - 1 范圍內的立即移位量。
省略移位運算符意味著“LSL #0”(即沒有移位),并且反匯編程序不應輸出“LSL #0” - 但是必須輸出所有其他零移位。
注意:除了 ANDS 和 BICS 邏輯指令不設置條件標志,但“有趣”的結果通常可以直接控制 CBZ、CBNZ、TBZ 或 TBNZ 條件分支。
- AND Wd, Wn, Wm{, lshift #imm}
Bitwise AND (register): Wd = Wn AND lshift(Wm, imm). - AND Xd, Xn, Xm{, lshift #imm}
Bitwise AND (extended register): Xd = Xn AND lshift(Xm, imm). - ANDS Wd, Wn, Wm{, lshift #imm}
Bitwise AND and Set Flags (register): Wd = Wn AND lshift(Wm, imm), setting N & Z condition flags based on the result and clearing the C & V flags. - ANDS Xd, Xn, Xm{, lshift #imm}
Bitwise AND and Set Flags (extended register): Xd = Xn AND lshift(Xm, imm), setting N & Z condition flags based on the result and clearing the C & V flags. - BIC Wd, Wn, Wm{, lshift #imm}
Bit Clear (register): Wd = Wn AND NOT(lshift(Wm, imm)). - BIC Xd, Xn, Xm{, lshift #imm}
Bit Clear (extended register): Xd = Xn AND NOT(lshift(Xm, imm)). - BICS Wd, Wn, Wm{, lshift #imm}
Bit Clear and Set Flags (register): Wd = Wn AND NOT(lshift(Wm, imm)), setting N & Z condition flags based on the result and clearing the C & V flags. - BICS Xd, Xn, Xm{, lshift #imm}
Bit Clear and Set Flags (extended register): Xd = Xn AND NOT(lshift(Xm, imm)), setting N & Z condition flags based on the result and clearing the C & V flags. - EON Wd, Wn, Wm{, lshift #imm}
Bitwise exclusive OR NOT (register): Wd = Wn EOR NOT(lshift(Wm, imm)). - EON Xd, Xn, Xm{, lshift #imm}
Bitwise exclusive OR NOT (extended register): Xd = Xn EOR NOT(lshift(Xm, imm)). - EOR Wd, Wn, Wm{, lshift #imm}
Bitwise exclusive OR (register): Wd = Wn EOR lshift(Wm, imm). - EOR Xd, Xn, Xm{, lshift #imm}
Bitwise exclusive OR (extended register): Xd = Xn EOR lshift(Xm, imm). - ORR Wd, Wn, Wm{, lshift #imm}
Bitwise inclusive OR (register): Wd = Wn OR lshift(Wm, imm). - ORR Xd, Xn, Xm{, lshift #imm}
Bitwise inclusive OR (extended register): Xd = Xn OR lshift(Xm, imm). - ORN Wd, Wn, Wm{, lshift #imm}
Bitwise inclusive OR NOT (register): Wd = Wn OR NOT(lshift(Wm, imm)). - ORN Xd, Xn, Xm{, lshift #imm}
Bitwise inclusive OR NOT (extended register): Xd = Xn OR NOT(lshift(Xm, imm)). - MOV Wd, Wm
Move (register): alias for ORR Wd,WZR,Wm. - MOV Xd, Xm
Move (extended register): alias for ORR Xd,XZR,Xm. - MVN Wd, Wm{, lshift #imm}
Move NOT (register): alias for ORN Wd,WZR,Wm{,lshift #imm}. - MVN Xd, Xm{, lshift #imm}
Move NOT (extended register): alias for ORN Xd,XZR,Xm{,lshift #imm}. - TST Wn, Wm{, lshift #imm}
Bitwise Test (register): alias for ANDS WZR,Wn,Wm{,lshift #imm}. - TST Xn, Xm{, lshift #imm}
Bitwise Test (extended register): alias for ANDS XZR,Xn,Xm{,lshift #imm}.
5.4.4 變體位(Variable Shift)
Wm 或 Xm 中的可變移位量為正,并以寄存器大小為模。 例如,Xm 包含值 65 的擴展 64 位移位將導致位移 (65 MOD 64) = 1 位。 機器指令如下:
- ASRV Wd, Wn, Wm
Arithmetic Shift Right Variable: Wd = ASR(Wn, Wm & 0x1f). - ASRV Xd, Xn, Xm
Arithmetic Shift Right Variable (extended): Xd = ASR(Xn, Xm & 0x3f). - LSLV Wd, Wn, Wm
Logical Shift Left Variable: Wd = LSL(Wn, Wm & 0x1f). - LSLV Xd, Xn, Xm
Logical Shift Left Variable (extended register): Xd = LSL(Xn, Xm & 0x3f). - LSRV Wd, Wn, Wm
Logical Shift Right Variable: Wd = LSR(Wn, Wm & 0x1f). - LSRV Xd, Xn, Xm
Logical Shift Right Variable (extended): Xd = LSR(Xn, Xm & 0x3f). - RORV Wd, Wn, Wm
Rotate Right Variable: Wd = ROR(Wn, Wm & 0x1f). - RORV Xd, Xn, Xm
Rotate Right Variable (extended): Xd = ROR(Xn, Xm & 0x3f)
然而,“可變移位”機器指令有一組首選的“移位(寄存器)”別名,它們與別處描述的移位(立即)別名相匹配:
- ASR Wd, Wn, Wm
Arithmetic Shift Right (register): preferred alias for ASRV Wd, Wn, Wm. - ASR Xd, Xn, Xm
Arithmetic Shift Right (extended register): preferred alias for ASRV Xd, Xn, Xm. - LSL Wd, Wn, Wm
Logical Shift Left (register): preferred alias for LSLV Wd, Wn, Wm. - LSL Xd, Xn, Xm
Logical Shift Left (extended register): preferred alias for LSLV Xd, Xn, Xm. - LSR Wd, Wn, Wm
Logical Shift Right (register): preferred alias for LSRV Wd, Wn, Wm. - LSR Xd, Xn, Xm
Logical Shift Right (extended register): preferred alias for LSRV Xd, Xn, Xm - ROR Wd, Wn, Wm
Rotate Right (register): preferred alias for RORV Wd, Wn, Wm. - ROR Xd, Xn, Xm
Rotate Right (extended register): preferred alias for RORV Xd, Xn, Xm.
5.4.5 位運算
- CLS Wd, Wm
Count Leading Sign Bits: 將 Wd 設置為 Wm 中最高位之后的連續位數,與最高位相同。 該計數不包括最高位本身,因此結果將在 0 到 31 的范圍內。 - CLS Xd, Xm
Count Leading Sign Bits (extended): 將 Xd 設置為 Xm 中最高位之后的連續位數,與最高位相同。 該計數不包括最高位本身,因此結果將在 0 到 63 的范圍內。 - CLZ Wd, Wm
Count Leading Zeros: 將 Wd 設置為 Wm 最高有效端的二進制零的數量。 結果將在 0 到 32 的范圍內。 - CLZ Xd, Xm
Count Leading Zeros: (擴展)將 Xd 設置為 Xm 最高有效端的二進制零的數量。 結果將在 0 到 64 的范圍內。 - RBIT Wd, Wm
Reverse Bits: reverses the 32 bits from Wm, writing to Wd. - RBIT Xd, Xm
Reverse Bits (extended): reverses the 64 bits from Xm, writing to Xd. - REV Wd, Wm
Reverse Bytes: reverses the 4 bytes in Wm, writing to Wd. - REV Xd, Xm
Reverse Bytes (extended): reverses 8 bytes in Xm, writing to Xd. - REV16 Wd, Wm
Reverse Bytes in Halfwords: reverses the 2 bytes in each 16-bit element of Wm, writing to Wd. - REV16 Xd, Xm
Reverse Bytes in Halfwords (extended): reverses the 2 bytes in each 16-bit element of Xm, writing to Xd. - REV32 Xd, Xm
Reverse Bytes in Words (extended): reverses the 4 bytes in each 32-bit element of Xm, writing to Xd
5.4.6 條件數據處理
這些指令支持兩個未移位的源寄存器,條件標志作為第三個源。 請注意,指令不是有條件地執行的:始終寫入目標寄存器。
- ADC Wd, Wn, Wm
Add with Carry: Wd = Wn + Wm + C. - ADC Xd, Xn, Xm
Add with Carry (extended): Xd = Xn + Xm + C - ADCS Wd, Wn, Wm
Add with Carry and Set Flags: Wd = Wn + Wm + C, setting the condition flags. - ADCS Xd, Xn, Xm
Add with Carry and Set Flags (extended): Xd = Xn + Xm + C, setting the condition flags. - CSEL Wd, Wn, Wm, cond
Conditional Select: Wd = if cond then Wn else Wm. - CSEL Xd, Xn, Xm, cond
Conditional Select (extended): Xd = if cond then Xn else Xm. - CSINC Wd, Wn, Wm, cond
Conditional Select Increment: Wd = if cond then Wn else Wm+1. - CSINC Xd, Xn, Xm, cond
Conditional Select Increment (extended): Xd = if cond then Xn else Xm+1. - CSINV Wd, Wn, Wm, cond
Conditional Select Invert: Wd = if cond then Wn else NOT(Wm). - CSINV Xd, Xn, Xm, cond
Conditional Select Invert (extended): Xd = if cond then Xn else NOT(Xm). - CSNEG Wd, Wn, Wm, cond
Conditional Select Negate: Wd = if cond then Wn else -Wm. - CSNEG Xd, Xn, Xm, cond
Conditional Select Negate (extended): Xd = if cond then Xn else -Xm. - CSET Wd, cond
Conditional Set: Wd = if cond then 1 else 0. Alias for CSINC Wd,WZR,WZR,invert(cond). - CSET Xd, cond
Conditional Set (extended): Xd = if cond then 1 else 0. Alias for CSINC Xd,XZR,XZR,invert(cond) - CSETM Wd, cond
Conditional Set Mask: Wd = if cond then -1 else 0. Alias for CSINV Wd,WZR,WZR,invert(cond). - CSETM Xd, cond
Conditional Set Mask (extended): Xd = if cond then -1 else 0. Alias for CSINV Xd,WZR,WZR,invert(cond). - CINC Wd, Wn, cond
Conditional Increment: Wd = if cond then Wn+1 else Wn. Alias for CSINC Wd,Wn,Wn,invert(cond). - CINC Xd, Xn, cond
Conditional Increment (extended): Xd = if cond then Xn+1 else Xn. Alias for CSINC Xd,Xn,Xn,invert(cond). - CINV Wd, Wn, cond
Conditional Invert: Wd = if cond then NOT(Wn) else Wn. Alias for CSINV Wd,Wn,Wn,invert(cond). - CINV Xd, Xn, cond
Conditional Invert (extended): Xd = if cond then NOT(Xn) else Xn. Alias for CSINV Xd,Xn,Xn,invert(cond). - CNEG Wd, Wn, cond
Conditional Negate: Wd = if cond then -Wn else Wn. Alias for CSNEG Wd,Wn,Wn,invert(cond). - CNEG Xd, Xn, cond
Conditional Negate (extended): Xd = if cond then -Xn else Xn. Alias for CSNEG Xd,Xn,Xn,invert(cond). - SBC Wd, Wn, Wm
Subtract with Carry: Wd = Wn - Wm - 1 + C. - SBC Xd, Xn, Xm
Subtract with Carry (extended): Xd = Xn - Xm - 1 + C. - SBCS Wd, Wn, Wm
Subtract with Carry and Set Flags: Wd = Wn - Wm - 1 + C , setting the condition flags. - SBCS Xd, Xn, Xm
Subtract with Carry and Set Flags (extended): Xd = Xn - Xm - 1 + C , setting the condition flags. - NGC Wd, Wm
Negate with Carry: Wd = -Wm - 1 + C. Alias for SBC Wd,WZR,Wm. - NGC Xd, Xm
Negate with Carry (extended): Xd = -Xm - 1 + C. Alias for SBC Xd,XZR,Xm. - NGCS Wd, Wm
Negate with Carry and Set Flags: Wd = -Wm - 1 + C, setting the condition flags. Alias for SBCS Wd,WZR,Wm. - NGCS Xd, Xm
Negate with Carry and Set Flags (extended): Xd = -Xm - 1 + C, setting the condition flags. Alias for SBCS Xd,XZR,Xm.
5.4.7 條件比較
條件比較為 NZCV 條件標志提供“條件選擇”,如果輸入條件為真,則將標志設置為比較結果,如果輸入條件為假,則將標志設置為立即值。 有寄存器和立即數形式,立即數形式接受一個小的 5 位無符號值。
#uimm4 操作數是用于在輸入條件為假時設置 NZCV 標志的位掩碼,第 3 位是 N 標志的新值,第 2 位是 Z 標志,第 1 位是 C 標志,第 0 位是 V 標志
- CCMN Wn, Wm, #uimm4, cond
Conditional Compare Negative (register):
NZCV = if cond then CMP(Wn,-Wm) else uimm4. - CCMN Xn, Xm, #uimm4, cond
Conditional Compare Negative (extended register):
NZCV = if cond then CMP(Xn,-Xm) else uimm4. - CCMN Wn, #uimm5, #uimm4, cond
Conditional Compare Negative (immediate):
NZCV = if cond then CMP(Wn,-uimm5) else uimm4. - CCMN Xn, #uimm5, #uimm4, cond
Conditional Compare Negative (extended immediate):
NZCV = if cond then CMP(Xn,-uimm5) else uimm4. - CCMP Wn, Wm, #uimm4, cond
Conditional Compare (register):
NZCV = if cond then CMP(Wn,Wm) else uimm4. - CCMP Xn, Xm, #uimm4, cond
Conditional Compare (extended register):
NZCV = if cond then CMP(Xn,Xm) else uimm4. - CCMP Wn, #uimm5, #uimm4, cond
Conditional Compare (immediate):
NZCV = if cond then CMP(Wn,uimm5) else uimm4. - CCMP Xn, #uimm5, #uimm4, cond
Conditional Compare (extended immediate):
NZCV = if cond then CMP(Xn,uimm5) else uimm4
5.5 整數乘法/除法
5.5.1 乘法
- MADD Wd, Wn, Wm, Wa
Multiply-Add: Wd = Wa + (Wn × Wm). - MADD Xd, Xn, Xm, Xa
Multiply-Add (extended): Xd = Xa + (Xn × Xm.) - MSUB Wd, Wn, Wm, Wa
Multiply-Subtract: Wd = Wa – (Wn × Wm). - MSUB Xd, Xn, Xm, Xa
Multiply-Subtract (extended): Xd = Xa – (Xn × Xm). - MNEG Wd, Wn, Wm
Multiply-Negate: Wd = –(Wn × Wm). Alias for MSUB Wd, Wn, Wm, WZR. - MNEG Xd, Xn, Xm
Multiply-Negate (extended): Xd = –(Xn × Xm). Alias for MSUB Xd, Xn, Xm, XZR. - MUL Wd, Wn, Wm
Multiply: Wd = Wn × Wm. Alias for MADD Wd, Wn, Wm, WZR. - MUL Xd, Xn, Xm
Multiply (extended): Xd = Xn × Xm. Alias for MADD Xd, Xn, Xm, XZR. - SMADDL Xd, Wn, Wm, Xa
Signed Multiply-Add Long: Xd = Xa + (Wn × Wm), treating source operands as signed. - SMSUBL Xd, Wn, Wm, Xa
Signed Multiply-Subtract Long: Xd = Xa – (Wn × Wm), treating source operands as signed. - SMNEGL Xd, Wn, Wm
Signed Multiply-Negate Long: Xd = -(Wn × Wm), treating source operands as signed. Alias for SMSUBL Xd, Wn, Wm, XZR. - SMULL Xd, Wn, Wm
Signed Multiply Long: Xd = Wn × Wm, treating source operands as signed. Alias for SMADDL Xd, Wn, Wm, XZR. - SMULH Xd, Xn, Xm
Signed Multiply High: Xd = (Xn × Xm)<127:64>, treating source operands as signed. - UMADDL Xd, Wn, Wm, Xa
Unsigned Multiply-Add Long: Xd = Xa + (Wn × Wm), treating source operands as unsigned. - UMSUBL Xd, Wn, Wm, Xa
Unsigned Multiply-Subtract Long: Xd = Xa – (Wn × Wm), treating source operands as unsigned. - UMNEGL Xd, Wn, Wm
Unsigned Multiply-Negate Long: Xd = -(Wn × Wm), treating source operands as unsigned. Alias for UMSUBL Xd, Wn, Wm, XZR. - UMULL Xd, Wn, Wm
Unsigned Multiply Long: Xd = Wn × Wm, treating source operands as unsigned. Alias for UMADDL Xd, Wn, Wm, XZR. - UMULH Xd, Xn, Xm
Unsigned Multiply High: Xd = (Xn × Xm)<127:64>, treating source operands as unsigned
5.5.2 除法
整數除法指令計算 (分子÷分母) 并提供商,該商向零舍入。 然后可以使用 MSUB 將余數計算為分子–(商*分母)
操作說明。
如果執行有符號整數除法 (INT_MIN ÷ -1),其中 INT_MIN 是所選寄存器大小中可表示的最大負整數值,則結果將溢出有符號整數范圍。 不會產生此溢出的指示,寫入目標寄存器的結果將為 INT_MIN。
注意:除法指令不會在除以零時生成陷阱,而是將零寫入目標寄存器。
- SDIV Wd, Wn, Wm
Signed Divide: Wd = Wn ÷ Wm, treating source operands as signed. - SDIV Xd, Xn, Xm
Signed Divide (extended): Xd = Xn ÷ Xm, treating source operands as signed. - UDIV Wd, Wn, Wm
Unsigned Divide: Wd = Wn ÷ Wm, treating source operands as unsigned. - UDIV Xd, Xn, Xm
Unsigned Divide (extended): Xd = Xn ÷ Xm, treating source operands as unsigned.
5.6 標量浮點
5.6.1 浮點/SIMD 標量內存訪問
5.6.2 浮點移動(寄存器)
5.6.3 浮點移動(立即)
5.6.4 浮點轉換
5.6.5 浮點四舍五入到積分
5.6.6 浮點算術(1 個來源)
5.6.7 浮點算術(2 個來源)
5.6.8 浮點最小值/最大值
5.6.9 浮點乘加
5.6.10 浮點比較
5.6.11 浮點條件選擇
5.7 高級SIMD
5.7.1 概述
5.7.2 高級 SIMD 助記符
5.7.3 數據移動
5.7.4 向量算術
5.7.5 標量算術
5.7.6 向量加寬/收窄算法
5.7.7 標量加寬/收窄算法
5.7.8 向量一元算術
5.7.9 標量一元算術
5.7.10 逐元素算術
5.7.11 標量逐元素算術
5.7.12 向量置換
5.7.13 向量立即數
5.7.14 向量移位(立即)
5.7.15 標量移位(立即)
5.7.16 向量浮點/整數轉換
5.7.17 標量浮點/整數轉換
5.7.18 向量縮減(跨車道)
5.7.19 向量成對算術
5.7.20 標量歸約(成對)
5.7.21 向量表查找
5.7.22 向量加載存儲結構
5.7.23 AArch32 等效高級 SIMD 助記符
5.7.24 加密擴展
5.8 系統說明
系統指令分為以下:
- 異常生成指令
- 系統寄存器訪問
- 系統管理
- hints
- Barriers和CLREX
5.8.1 異常的產生和返回
5.8.1.1 Non-debug exceptions
- SVC #uimm16
生成針對異常級別 1(系統)的異常,在 uimm16 中具有 16 位有效負載。 - HVC #uimm16
生成針對異常級別 2(管理程序)的異常,在 uimm16 中具有 16 位有效負載。 - SMC #uimm16
生成針對異常級別 3(安全監視器)的異常,在 uimm16 中具有 16 位有效負載。 - ERET
異常返回:從當前異常級別的 SPSR_ELn 寄存器重構處理器狀態,并跳轉到 ELR_ELn 中的地址。
5.8.1.2 Debug exceptions
- BRK #uimm16
監視模式軟件斷點:異常路由到在 EL1 或 EL2 中執行的調試監視器,在 uimm16 中具有 16 位有效負載。 - HLT #uimm16
暫停模式軟件斷點:如果啟用則進入暫停模式調試狀態,否則視為未分配。 在 uimm16 中具有 16 位有效負載。 - DCPS1 {#uimm16}
調試 將處理器狀態更改為 EL1(僅在暫停模式調試狀態下有效),可選的 16 位立即數 uimm16 默認為零并被硬件忽略。 - DCPS2 {#uimm16}
Debug 將處理器狀態更改為 EL2(僅在暫停模式調試狀態下有效),可選的 16 位立即數 uimm16 默認為零并被硬件忽略。 - DCPS3 {#uimm16}
Debug 將處理器狀態更改為 EL3(僅在暫停模式調試狀態下有效),可選的 16 位立即數 uimm16 默認為零并被硬件忽略。 - DRPS
Debug Restore Processor State:將處理器恢復到當前異常級別的SPSR_ELn寄存器中記錄的異常級別和模式(僅在暫停模式調試狀態下有效)
5.8.2 系統寄存器訪問
- MRS Xt, <system_register>
將 <system_register> 移動到 Xt,其中 <system_register> 是系統寄存器名稱,或者對于實現定義的寄存器,使用“S”形式的名稱,例如“S3_4_c13_c9_7”。 - MSR <system_register>, Xt
將 Xt 移動到 <system_register>,其中 <system_register> 是系統寄存器名稱,或者對于實現定義的寄存器,使用“S”形式的名稱,例如“S3_4_c13_c9_7”… - MSR DAIFClr, #uimm4
使用 uimm4 作為位掩碼來選擇清除一個或多個 DAIF 異常掩碼位:位 3 選擇 D 掩碼,位 2 選擇 A 掩碼,位 1 選擇 I 掩碼,位 0 選擇 F 掩碼。 - MSR DAIFSet, #uimm4
使用 uimm4 作為位掩碼來選擇一個或多個 DAIF 異常掩碼位的設置:位 3 選擇 D 掩碼,位 2 選擇 A 掩碼,位 1 選擇 I 掩碼,位 0 選擇 F 掩碼。 - MSR SPSel, #uimm4
使用 uimm4 作為控制值來選擇堆棧指針:如果設置位 0,則選擇當前異常級別的堆棧指針,如果位 0 清零,則選擇共享 EL0 堆棧指針。 uimm4 的位 1 到 3 被保留并且應該為零。
5.8.3 系統管理
如果 SYS 指令的操作數與下面 <xx_op> 表中的條目匹配,則關聯的別名是首選反匯編。 否則應使用 SYS 或 SYSL 助記符,允許生成和反匯編任意實現定義的系統指令
- SYS #op1, Cn, Cm, #op2{, Xt}
- SYSL Xt, #op1, Cn, Cm, #op2
- IC <ic_op>{, Xt} 指令cache維護操作指令
- DC <dc_op>, Xt 數據cache維護操作指令
- AT <at_op>, Xt 地址翻譯指令
- TLBI <tlbi_op>{, Xt} TLB維護操作指令
5.8.4 hints
- NOP
- YIELD
- WFE
- WFI
- SEV
- SEVL
- HINT #uimm7
5.8.5 Barriers和CLREX
- CLREX {#uimm4}
- DSB |#uimm4
- DMB |#uimm4
- ISB {SY|#uimm4}
6 A32和T32指令集
6.1 部分棄用 的之類
6.2 加載-獲取/存儲-釋放
6.2.1 非排他性
6.2.2 獨占
6.3 VFP 標量浮點
6.3.1 浮點條件選擇
6.3.2 浮點minNum/maxNum
6.3.3 浮點轉換(浮點到整數)
6.3.4 浮點轉換(半精度到/從雙精度)
6.3.5 浮點取整
6.4 高級 SIMD 浮點
6.4.1 浮點minNum/maxNum
6.4.2 浮點轉換
6.4.3 浮點取整到積分
6.5 加密擴展
6.6 系統說明
6.6.1 停止調試
6.6.2 Barriers 和 Hints
總結
以上是生活随笔為你收集整理的ARMV8/ARMV9指令集概述(翻译)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: armv8/armv9页表属性(page
- 下一篇: 如何写一篇酷炫的博文(博文列表中展现字幕