【ARM】協處理器指令

00. 目錄

01. 協處理器指令概述

ARM 體系結構允許通過增加協處理器來擴展指令集。最常用的協處理器是用於控制片上功能的系統協處理器。例如,控制 Cache 和存儲管理單元的 cp15 寄存器。此外,還有用於浮點運算的浮點 ARM 協處理器,各生產商還可以根據需要開發自己的專用協處理器。ARM 協處理器具有自己專用的寄存器組,它們的狀態由控制 ARM 狀態的指令的鏡像指令來控制。程序的控制流指令由 ARM 處理器來處理,所有協處理器指令只能同數據處理和數據傳送有關。按照 RISC 的 Load/Store 體系原則,數據的處理和傳送指令是被清楚分開的,所以它們有不同的指令格式。ARM 處理器支持 16 個協處理器,在程序執行過程中,每個協處理器忽略 ARM 和其他協處理器指令。當一個協處理器硬件不能執行屬於它的協處理器指令時,將產生一個未定義指令異常中斷,在該異常中斷處理過程中,可以通過軟件仿真該硬件操作。如果一個系統中不包含向量浮點運算器,則可以選擇浮點運算軟件包來支持向量浮點運算。

ARM 協處理器可以部分地執行一條指令,然後產生中斷。如除法運算除數爲 0 和溢出,這樣可以更好地處理運行時產生(run-time-generated)的異常。但是,指令的部分執行是由協處理器完成的,此過程對 ARM 來說是透明的。當 ARM 處理器重新獲得執行時,它將從產生異常的指令處開始執行。對某一個協處理器來說,並不一定用到協處理器指令中的所有的域。具體協處理器如何定義和操作完全由協處理器的製造商自己決定,因此,ARM協處理器指令中的協處理器寄存器的標識符及操作助記符也有各種不同的實現定義。程序員可以通過宏定義這些指令的語法格式。

ARM 協處理器指令可分爲以下 3 類。
(1)協處理器數據操作。協處理器數據操作完全是協處理器內部操作,它完成協處理器寄存器的狀態改變。如浮點加運算,在浮點協處理器中兩個寄存器相加,結果放在第 3個寄存器中。這類指令包括 CDP 指令。

(2)協處理器數據傳送指令。這類指令從寄存器讀取數據裝入協處理器寄存器,或將協處理器寄存器的數據裝入存儲器。因爲協處理器可以支持自己的數據類型,所以每個寄存器傳送的字數與協處理器有關。ARM 處理器產生存儲器地址,但傳送的字節由協處理器控制。這類指令包括 LDC 指令和 STC 指令。

(3)協處理器寄存器傳送指令。在某些情況下,需要 ARM 處理器和協處理器之間傳送數據。如一個浮點運算協處理器,FIX 指令從協處理器寄存器取得浮點數據,將它轉換爲整數,並將整數傳送到 ARM 寄存器中。經常需要用浮點比較產生的結果來影響控制流,因此,比較結果必須傳送到 ARM 的 CPSR 中。這類協處理器寄存器傳送指令包括 MCR 和MRC。

如下表所示列出了所有協處理器處理指令。
在這裏插入圖片描述

02. ARM寄存器到協處理器寄存器的數據傳送指令MCR

2.1 指令編碼格式

ARM 寄存器到協處理器寄存器的數據傳送指令 MCR(Move to Coprocessor from ARMRegister)將 ARM 寄存器 的值傳送到協處理器寄存器 cp_num 中。如果沒有協處理器執行指定操作,將產生未定義指令異常。指令的編碼格式如圖 3-2 所示。
在這裏插入圖片描述

2.2 指令的語法格式

MCR{<cond>} <coproc>,<opcode_1>,<Rd>,<CRn>,<CRm> {<opcode_2>}

① <cond>
爲指令編碼中的條件域。它指示指令在什麼條件下執行。當忽略時,指令爲無條件執行(cond=AL(Alway ))。
② <coproc>
指定協處理器的編號,標準的協處理器的名字爲 p0、p1、…、p15。

③ <opcode_1>
指定協處理器執行的操作碼,確定哪一個協處理器指令將被執行。
④ <Rd>
確定哪一個 ARM 寄存器的數值將被傳送。如果程序計數器(PC)的值被傳送,指令的執行結果不可預知。
⑤ <CRn>
確定包含第一個操作數的協處理器寄存器。
⑥ <CRm>
確定包含第二個操作數的協處理器寄存器。
⑦ <opcode_2>
指定協處理器執行的操作碼,確定哪一個協處理器指令將被執行。通常與<opcode_1>配合使用。

2.3 指令舉例

將ARM寄存器r7中的值傳送到協處理器p14的寄存器c7中,第一操作數opcode_1=1,第二操作數 opcode_2=6。

MCR p14,1,r7,c7,c12,6

2.4 指令的使用

指令的編碼格式中,bits[31∶24]、bit[20]、bits[15∶8]和 bit[4]爲 ARM 體系結構定義。其他域由各生產商定義。硬件協處理器支持與否完全由生產商定義,某款 ARM 芯片中,是否支持協處理器或支持哪個協處理器與 ARM 版本無關。生產商可以選擇實現部分協處理器指令或者完全不支持協處理器。

03. 協處理器寄存器到ARM寄存器的數據傳送指令MRC

3.1 指令編碼格式

協處理器寄存器到 ARM 寄存器的數據傳送指令 MRC(Move to ARM register fromCoprocessor)將協處理器 cp_num 的寄存器的值傳送到 ARM 寄存器中。如果沒有協處理器執行指定操作,將產生未定義指令異常。指令的編碼格式如下圖所示。
在這裏插入圖片描述

3.2 指令的語法格式

MRC{<cond>} <coproc>,<opcode_1>,<Rd>,<CRn>,<CRm>{,<opcode_2>}

爲指令編碼中的條件域。它指示指令在什麼條件下執行。當忽略時,指令爲無條件執行(cond=AL(Alway ))。
① <coproc>

指定協處理器的編號,標準的協處理器的名字爲 p0、p1、…、p15。
② <opcode_1>
指定協處理器執行的操作碼,確定哪一個協處理器指令將被執行。
③<Rd>
確定哪一個 ARM 寄存器接受協處理器傳送的數值。如果程序計數器 PC 被用作目的寄存器,指令的執行結果不可預知。
④ <CRn>
確定包含第一個操作數的協處理器寄存器。
⑤ <CRm>
確定包含第二個操作數的協處理器寄存器。
⑥ <opcode_2>
指定協處理器執行的操作碼,確定哪一個協處理器指令將被執行。通常與<opcode_1>配合使用。

3.3 指令舉例

協處理器源寄存器爲 c0 和 c2,目的寄存器爲 ARM 寄存器 r4,第一操作數 opcode_1=5,第二操作數 opcode_2=3。

MRC p15,5,r4,c0,c2,3

3.4 指令的使用

如果目的寄存器爲程序計數器 r15,則程序狀態字條件標準位根據傳送數據的前 4bit確定,後 28bit 被忽略。指令的編碼格式中,bits[31:24]、bit[20]、bits[15:8]和 bit[4]爲 ARM體系結構定義。其他域由各生產商定義。

硬件協處理器支持與否完全由生產商定義,某款 ARM 芯片中,是否支持協處理器或支持哪個協處理器與 ARM 版本無關。生產商可以選擇實現部分協處理器指令或者完全不支持協處理器。

如果協處理器必須完成一些內部工作來準備一個 32 位數據向 ARM 傳送(例如,浮點FIX 操作必須將浮點值轉換爲等效的定點值),那麼這些工作必須在協處理器提交傳送前進行。因此,在準備數據時經常需要協處理器握手信號處於“忙-等待”狀態。ARM 可以在忙-等待時間內產生中斷。如果它確實得以中斷,那麼它將暫停握手以服務中斷。當它從中斷服務程序返回時,將可能重試協處理器指令,但也可能不重試。例如,中斷可能導致任務切換,無論哪種情況,協處理器必須給出一致結果,因此,在握手提交階段之前的準備工作不允許改變處理器的可見狀態。

下圖所示列出了 cp15 的各個寄存器的目的。

在這裏插入圖片描述

04. 附錄

11.1 ARM Architecture Reference Manual

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章