Xtensa架構學習——指令總結
3.8 指令總結
由於最近急需對Xtensa架構有所瞭解,所以就直接跳到手冊中最實用的指令集部分。下面開始學習吧!
本文主要對手冊中指令集部分翻譯整理,帶有手冊原圖,以及作者自己學習總結。
首先是手冊中核心指令的總結圖。3.8.1 載入指令
載入指令通過新增一個基址暫存器和一個8位無符號偏移量形成一個虛擬地址。如有必要,此虛擬地址將轉換為實體地址。然後使用實體地址訪問記憶體系統(通常通過快取)。記憶體系統返回一個數據項(32,64或128位,取決於配置)。然後,載入指令從該記憶體項中提取引用的資料,並將要寫入結果的暫存器進行零擴充套件或符號擴充套件。除非啟用了未對齊的異常選項,否則當使用未對齊的地址時,處理器不會處理未對齊的資料或陷阱; 相反,它只是載入包含計算出的虛擬地址的對齊資料項。 這允許漏斗移位器與一對負載一起使用來引用任何位元組地址上的資料。只有負載L32I,L32I.N和L32R可以訪問InstRAM和InstROM位置。
(1)
3.8.2 儲存指令
儲存指令在地址形成與載入指令相似。儲存記憶體的錯誤不是同步異常; 儲存器系統將使用中斷來指示儲存器上的錯誤。
3.8.3 記憶體訪問順序
Xtensa實現可以按任意順序執行普通的載入和儲存操作,只要載入返回儲存在單個處理器和簡單記憶體的載入地址的每個位元組中的最後一個值(由程式執行順序定義)。這種靈活性是合適的,因為大多數記憶體訪問只需要這些語義,並且一些實現可以通過利用非程式順序記憶體訪問而顯著更快地執行程式。 Xtensa ISA只要求實現遵循記憶體訪問順序的釋出一致性模型1的簡化版本,儘管許多實現更簡單的更嚴格的順序。有關Xtensa記憶體順序語義的更多資訊,請參閱第74頁上的“多處理器同步選項”。但是,一些載入和儲存指令不僅用於讀取和寫入儲存,還會對系統的其他部分(例如另一個處理器或I / O裝置)產生一些影響。在C和C ++中,這些變數必須宣告為volatile。 載入和儲存這些位置必須按程式順序執行。因此,Xtensa ISA提供了一條指令,可以用來為載入和儲存記憶體訪問提供程式排序。
在所有記憶體和快取記憶體訪問(但不是指令提取)之前,MEMW指令導致所有記憶體和快取記憶體訪問(載入,儲存,獲取,釋放,預取和快取記憶體操作,但不是指令提取)在程式順序之前訪問記憶體。至少有一個MEMW應該在每個載入或儲存之間執行到一個volatile變數。多處理器同步選項提供了一些額外的指令,這些指令也以更集中的方式影響記憶體排序。MEMW比這些其他指令具有更廣泛的應用(例如,在讀取和寫入裝置暫存器時),但它也可能比同步指令影響效能。
EXTW指令與MEMW類似,但它將程式順序中EXTW之前的指令的所有外部效應與程式順序中的EXTW之後的所有外部指令外部效應分開。 EXTW是MEMW的超集,並且包含它所命令的記憶體訪問。
3.8.4 跳轉和呼叫指令
無條件分支指令J具有比條件分支更長的範圍(PC相對)。Call有一個稍長的範圍,因為它們的目標是32位對齊的地址。另外,跳轉和呼叫間接指令提供了對case分派,函式變數和動態接的支援。
3.8.5 條件分支指令
表3-16中的分支指令根據比較結果將暫存器運算元與零,立即數或第二個暫存器值和條件分支進行比較。與其他ISA相比,複合(compound)比較和分支指令可以提高程式碼密度和效能。 所有分支都是PC相對的; 即立即域包含目標PC和當前PC之間的差異加四。 使用0-3的PC相對偏移是非法的,並保留供將來使用。
表3-17和表3-18中所示的分支立即數常量(b4const)欄位和分支無符號立即數常量(b4constu)欄位的編碼為每種型別的常量指定了16個最常用的比較立即數之一。
3.8.6 移動指令
MOVI將暫存器設定為指令中的常量。表3-19所示的條件移動指令用於分支迴避。
3.8.7 算術指令
表3-20列表的算術指令包括加和減,用於地址計算和合成常數相乘。ADDMI指令包括用於擴充套件載入和儲存指令的範圍。
3.8.8 按位邏輯指令
表3-21中的按位邏輯指令提供了可以從中合成其他邏輯的核心集。 沒有提供這些指令的立即數格式,因為立即格式只有四位。
3.8.10 處理器控制指令
表3-23包含處理器控制指令。RSR.*,WSR.*和XSR.*指令用於讀取,寫入和交換核心體系結構和體系結構選項的特殊暫存器,如表5-128在201頁中所述。它們儲存和恢復上下文,過程中斷和異常,並控制地址轉換和屬性。XSR.*指令讀寫特殊暫存器和AR[t]。它結合了RSR.*和WSR.*操作,將特殊暫存器與AR[t]交換。T1030和更早版本的處理器中不存在XSR.*指令。xSYNC指令同步特殊暫存器寫入及其用途。有關如何使用xSYNC指令的更多資訊,請參見第5章。這些同步指令與用於多處理器的同步指令是分開的,這些指令在第74頁的第4.3.12節中描述。
在一些Xtensa實現中,RSR的延遲大於一個週期,所以將RSR結果的使用安排在遠離RSR的位置以避免互鎖是有利的。