00. 目錄
文章目錄
00. 目錄01. 特殊指令介紹02. CLZ 計算前導零數目03. 飽和指令介紹04. 附錄
01. 特殊指令介紹
Fmxr /Fmrx 指令是 NEON 下的擴充指令,在做浮點運算的時候,要先打開 vfp,是以需要用到 Fmxr 指令。
Fmxr:由 arm 寄存器将資料轉移到協處理器中。
Fmrx:由協處理器轉移到 arm 寄存器中。
如圖下圖所示為浮點異常寄存器格式。

如表 3-16 所示為 FPEXC 的位定義。
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 所示。
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