正在加载
请稍等

菜单

红楼飞雪 梦

15526773247

文章

Home android 嵌入式开发 arm汇编 并行指令
Home android 嵌入式开发 arm汇编 并行指令

arm汇编 并行指令

android 嵌入式开发 by

一、并行加法和减法

多种字节和半字加法和减法。

语法

< prefix > op { cond } { Rd },  Rn ,  Rm

其中:

 < prefix >  是下列项之一:

  • S     对 2 8 或 2 16 的有符号求模。 设置 APSR GE 标记。
  • Q    有符号饱和算法.
  • SH    有符号算法,将结果减半。
  • U    对 2 8 或 2 16 无符号求模。 设置 APSR GE 标记。
  • UQ    无符号饱和算法
  • UH     无符号算法,将结果减半。
 op  是下列项之一:

  • ADD8     以字节为单位的加法
  • ADD16     以半字为单位的加法。
  • SUB8     以字节为单位的减法。
  • SUB16     以半字为单位的减法。
  • ASX     先交换 Rm 的半字,然后将高半字相加,接着将低半字相 减
  •     SAX 交换 Rm 的半字,然后将高半字相减,将低半字相加。
 cond  是一个可选的条件代码
 rd  是目标寄存器。 不要将  r15  用作 Rd 。
 Rm?Rn  是存放操作数的  ARM  寄存器。 不要将  r15  用作 Rm 或 Rn 。

操作:

这些指令可对操作数的字节或半字进行单独运算。 它们可执行两次或四次加法 或减法,或一次加法和一次减法。

您可以选择各种算术运算:

  • 对 28 或 2 16 进行有符号或无符号算术求模。 这将会设置 APSR GE 标记
  • 有符号饱和算法,饱和到有符号范围 – 2 15 ≤ x ≤ 2 15 – 1 或 – 2 7 ≤ x ≤ 2 7 – 1 中 的一个。 即使这些运算饱和, Q 标记也不受影响。
  • 无符号饱和算法,饱和到无符号范围 0≤ x ≤ 2 16 – 1 或 0 ≤ x ≤ 2 8 – 1 中的一个。 即使这些运算饱和, Q 标记也不受影响。
  • 有符号或无符号算术运算,将结果减半。 这种运算不会造成溢出。

条件标记:

这些指令不影响  N 、 Z 、 C 、 V  或  Q  标记。

这些指令的前缀变体 Q 、 SH 、 UQ 和 UH 不更改标记。

这些指令的 S 和 U 前缀变体会设置  APSR  中的  GE  标记,如下所述:

  • 对于以字节为单位的运算, GE 标记的用法与 32 位 SUB 和 ADD 指令的 C (进位)标记相同:
     GE[0]  用于结果的  [7:0]  位
     GE[1]  用于结果的  [15:8]  位
     GE[2]  用于结果的  [23:16]  位
     GE[3]  用于结果的  [31:24]  位
  • 对于以半字为单位的运算, GE 标记的用法与常规以字为单位的 SUB 和 ADD:
     GE[1:0]  用于结果的  [15:0]  位
     GE[3:2]  用于结果的  [31:16]  位

您可利用这些标记来控制后续的 SEL 指令.

对于半字方式的运算,将同时设置或清除  GE[1:0] ,并同时设置或清除 GE[3:2] 。

体系结构

体系结构 这些  ARM  指令可用于  ARMv6  及更高版本。

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

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

示例

SHADD8      r4, r3, r9
    USAXNE      r0, r0, r2

不正确的示例

QHADD       r2, r9, r3    ; No such instruction, should be QHADD8 or 
QHADD16
    SAX         r10, r8, r5   ; Must have a prefix.

二、USAD8  和  USADA8

无符号值的差的绝对值求和,无符号值的差的绝对值求和累加。

语法

USAD8{ cond } { Rd },  Rn ,  Rm 
USADA8{ cond }  Rd ,  Rn ,  Rm ,  Ra

其中:

 cond  是一个可选的条件代码
 Rd  是目标寄存器
 Rn  是存放第一个操作数的寄存器
 Rm  是存放第二个操作数的寄存器
 Ra  是存放累加操作数的寄存器

不能将  r15  用于 Rd 、 Rn 、 Rn 或 Ra 。

操作

USAD8 指令可计算 Rn 和 Rm 的对应字节中的无符号值之间的四个差值。然后,它 会将这四个差值的绝对值相加,并将结果存入 Rd 。

USADA8 指令可将四个差值的绝对值与 Ra 中的值相加,并将结果存入 Rd 。

条件标记

这些指令不更改任何标记

体系结构

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

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

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

示例

USAD8       r2, r4, r6
    USADA8      r0, r3, r5, r2
    USADA8VS    r0, r4, r0, r1

不正确的示例

USADA8      r2, r4, r6      ; USADA8 requires four registers
    USADA16     r0, r4, r0, r1  ; no such instruction

三、SSAT16  和  USAT16

并行半字饱和指令。

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

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

语法

op { cond }  Rd , # sat ,  Rn

其中:

 op  是下列项之一:

  • SSAT16     有符号饱和。
  • USAT16     无符号饱和。
 cond  是一个可选的条件代码
 Rd  是目标寄存器
 sat  定要饱和到的位位置, SSAT16 的范围在  1  到  16  之间, USAT16 的 范围在  0  到  15  之间。
 Rn  是存放操作数的寄存器

不要将  r15  用作 Rd 或 Rn 。

操作

有符号和无符号半字饱和任何位位置。

SSAT16 指令可将每个有符号半字饱和到有符号范围 – 2 sat – 1 ≤ x ≤ 2 sat – 1 – 1  内。

USAT16 指令可将每个有符号半字饱和到无符号范围  0 ≤ x ≤ 2 sat – 1  内。

条件标记

只要有半字发生饱和,这些指令就会设置  Q  标记。 若要读取  Q  标记的状态,请 使用 MRS 指令

体系结构

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

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

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

示例

SSAT16  r7, #12, r7
    USAT16  r0, #7, r5

不正确的示例

SSAT16  r1, #16, r2, LSL #4 ; shifts not permitted with halfword 
saturations

 

27 2015-08

 

我要 分享

 

 

本文 作者

 

相关 文章