【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

猜你喜欢

转载自blog.csdn.net/dengjin20104042056/article/details/106853716
今日推荐