正在加载
请稍等

菜单

红楼飞雪 梦

15526773247

文章

Home android 嵌入式开发 arm汇编 饱和指令
Home android 嵌入式开发 arm汇编 饱和指令

arm汇编 饱和指令

android 嵌入式开发 by

有些并行指令同时也是饱和指令。

一、饱和算法

这些指令均为饱和的(SAT)。这意味着对于某些依赖于指令2n相关值:
  • 对于有符号饱和运算,如果结果小于 – 2 n ,则返回的结果将为 – 2 n
  • 对于无符号饱和运算,如果整个结果将是负值,那么返回的结果是 0
  • 如果结果大于 2 n – 1 ,则返回的结果将为 2 n – 1 。
只要出现这些情况,就称为饱和。当出现饱和时,有些指令会设置Q标记。
当未出现饱和时,饱和指令不清除Q标记。要清除Q标记,请使用MSR指令

二、QADD、QSUB、QDADD和QDSUBQADD、QSUB、QDADD和QDSUB

有符号加法、减法,加倍加法,加倍减法,将结果饱和到有符号范围–231≤x≤231–1内。

语法

op { cond } { Rd },  Rm ,  Rn

其中:

 op  是 QADD 、 QSUB 、 QDADD 或 QDSUB 之一。
 cond  是一个可选的条件代码
 Rd  是目标寄存器
 Rm 、 Rn  是存放操作数的寄存器

不要将  r15  用作 Rd 、 Rm 或 Rn 。

用法:

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

QSUB 指令可从 Rm 中的值中减去 Rn 中的值。

QDADD 指令可计算 SAT( Rm  + SAT( Rn  * 2)) 。 进行加倍和加法运算均有可能出现饱 和。 如果加倍运算发生饱和,而加法运算没有出现饱和,则将设置  Q  标记,但 最终结果是不饱和的。

QDSUB 指令可计算 SAT( Rm  – SAT( Rn  * 2)) 。 进行加倍和加法运算均有可能出现饱 和。 如果加倍运算发生饱和,而加法运算没有出现饱和,则将设置  Q  标记,但 最终结果是不饱和的。

这些指令会将所有值视为有符号整数的二进制补码。

条件标记

如果发生饱和,则这些指令设置  Q  标记。 若要读取  Q  标记的状态,请使用 MRS 指令

体系结构

这些指令可用于  ARMv6  及更高版本,以及  ARMv5  的  E  变体。

这些  32  位  Thumb  指令可用于  ARMv6T2  及更高版本( ARMv7-M  架构除外)。

这些指令均无  16  位  Thumb  版本。

QADD    r0, r1, r9
QDSUBLT r9, r0, r1

三、SSAT  和  USAT

有符号饱和到任何位位置和无符号饱和到任何位位置,可选择在饱和前进行移 位。

SSAT 可将有符号值饱和到有符号范围内。

USAT 可将有符号值饱和到无符号范围内。

语法

op { cond }  Rd , # sat ,  Rm {,  shift }

其中:

 op  是 SSAT 或 USAT
 cond  是一个可选的条件代码
 Rd  是目标寄存器。 Rd 不能为  r15 。
 sat  指定要饱和到的位位置, SSAT 的范围在  1  到  32  之间, USAT 的范围 在  0  到  31  之间。
 Rm  是包含操作数的寄存器。 Rm 不能为  r15 。
 shift 是一个可选的移位。 必须为下列项之一:

  • ASR # n 其中, n 的范围为 1-32 (ARM) 或 1-31 (Thumb-2)
  • SL # n 其中, n 的范围为 0-31 。

操作

SSAT 指令会先进行指定的移位,然后将结果饱和到有符号范围 – 2 sat – 1 ≤ x ≤  2 sat– 1 – 1 。

USAT 指令会先进行指定的移位,然后将结果饱和到无符号范围  0 ≤ x ≤  2 sat –  1 。

条件标记

如果发生饱和,则这些指令设置  Q  标记。 若要读取  Q  标记的状态,请使用 MRS 指令

体系结构

这些  ARM  指令可用于  ARMv6  及更高版本。

这些  32  位  Thumb  指令可用于  ARMv6T2  及更高版本。

这些指令均无  16  位  Thumb  版本。

SSAT    r7, #16, r7, LSL #4
USATNE  r0, #7, r5

 

27 2015-08

 

我要 分享

 

 

本文 作者

 

相关 文章