【ARM】ARM其它指令

00. 目錄

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

04. 附錄

11.1 ARM Architecture Reference Manual

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