天天看點

【ARM】ARM其它指令

00. 目錄

文章目錄

00. 目錄01. 特殊指令介紹02. CLZ 計算前導零數目03. 飽和指令介紹04. 附錄

01. 特殊指令介紹

Fmxr /Fmrx 指令是 NEON 下的擴充指令,在做浮點運算的時候,要先打開 vfp,是以需要用到 Fmxr 指令。

Fmxr:由 arm 寄存器将資料轉移到協處理器中。

Fmrx:由協處理器轉移到 arm 寄存器中。

如圖下圖所示為浮點異常寄存器格式。

【ARM】ARM其它指令

如表 3-16 所示為 FPEXC 的位定義。

【ARM】ARM其它指令

FPEXC<浮點異常寄存器>,該寄存器是一個可控制 SIMD 及 VFP 的全局使能寄存器,并指定了這些擴充技術是如何記錄的。

如果要打開 VFP 協處理器的話,可以用以下指令:

mov r0, #0x40000000
fmxr fpexc, r0 @ enable NEON and VFP coprocessor      

02. CLZ 計算前導零數目

​文法格式:​

CLZ {cond} Rd,Rm
@ 其中:
@  cond 是一個可選的條件代碼。
@  Rd 是目标寄存器。
@  Rm 是操作數寄存器。      

​用法:​

CLZ 指令對 Rm 中的值的前導零進行計數,并将結果傳回到 Rd 中,如果未在源寄存器中設定任何位,則該結果值為 32,如果設定了位 31,則結果值為 0。

​條件标記:​

該指令不會更改标記。

​體系結構​:

ARMv5 以上。

示例如圖 3-6 所示。

【ARM】ARM其它指令

03. 飽和指令介紹

這是用來設計飽和算法的一組指令,所謂飽和是指出現下列 3 種情況:

(1)對于有符号飽和運算,如果結果小于-2^n ,則傳回結果将為-2^n 。

(2)對于無符号飽和運算,如果整數結果是負值,那麼傳回的結果将為 0。

(3)對于結果大于 2^n -1 的情況,則傳回結果将為 2^n -1。

隻要出現這情況,就稱為飽和,并且飽和指令會設定 Q 标記,下面簡單介紹一下 QADD帶符号加法。

QSUB:帶符号減法。

QDADD:帶符号加倍加法。

QDSUB:帶符号加倍減法。

将結果飽和導入符号範圍(-2^31 ≤x≤2^31 -1)内。

​文法格式:​

op{cond} {Rd} ,Rm,Rn      

其中:

q op 是 QADD、QSUB、QDADD、QDSUB 之一。

q cond 是一個可選的條件代碼。

q Rd 是目标寄存器。

q Rm、Rn 是存放操作數的寄存器(注:不要将 r15 用作 Rd、Rm 或 Rn)。

​用法如下:​

q QADD 指令可将 Rm 和 Rn 中的值相加。

q QSUB 指令可從 Rm 中的值減去 Rn 中的值。

q QDADD/QDSUB 指令涉及并行指令,是以這裡不多做讨論。

​條件标記:​

如果發生飽和,則這些指令設定 Q 标記,若要讀取 Q 标記的狀态,需要使用 MRS 指令。

​體系結構:​

該指令可用于 v5T-E 及 v6 或者更高版本的體系中。

​程式示例:​

QADD r0 ,r1,r9
QSUBLT r9,r0,r1      

04. 附錄