天天看点

【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. 附录