4.7.1. 并行加法和减法

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

语法


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

其中:

<prefix>

是下列项之一:

S

对 28 或 216 有符号求模。 设置 APSR GE 标记。

Q

有符号饱和算法。

SH

有符号算法,将结果减半。

U

对 28 或 216 无符号求模。 设置 APSR GE 标记。

UQ

无符号饱和算法。

UH

无符号算法,将结果减半。

op

是下列项之一:

ADD8

以字节为单位的加法

ADD16

以半字为单位的加法。

SUB8

以字节为单位的减法。

SUB16

以半字为单位的减法。

ASX

先交换 Rm 的半字,然后将高半字相加,接着将低半字相减。

SAX

交换 Rm 的半字,然后将高半字相减,将低半字相加。

cond

是一个可选的条件代码(请参阅条件执行)。

Rd

是目标寄存器。 不能将 r15 用作 Rd

Rm、Rn

是存放操作数的 ARM 寄存器。 不能将 r15 用作 RmRn

操作

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

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

  • 对 28 或 216 进行有符号或无符号算术求模。 这将会设置 APSR GE 标记(请参阅条件标记)。

  • 有符号饱和到有符号范围 -215x ≤ 215 -1 or -27x ≤ 27 -1 内。 即使这些运算饱和,Q 标记也不受影响。

  • 无符号饱和到无符号范围 0 ≤ x ≤ 216 -1 or 0 ≤ x ≤ 28 -1 内。 即使这些运算饱和,Q 标记也不受影响。

  • 有符号或无符号算术运算,将结果减半。 这种运算不会造成溢出。

条件标记

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

这些指令的前缀变体 QSHUQUH 不更改标记。

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

  • 对于以字节为单位的运算,GE 标记的用法与 32 位 SUB and ADD 指令的 C(进位)标记相同:

    GE[0]

    用于结果的 [7:0] 位

    GE[1]

    用于结果的 [15:8] 位

    GE[2]

    用于结果的 [23:16] 位

    GE[3]

    用于结果的 [31:24] 位

  • 对于以半字为单位的运算,GE 标记的用法与以字为单位的 SUBADD 指令的 C(进位)标记相同

    GE[1:0]

    用于结果的 [15:0] 位

    GE[3:2]

    用于结果的 [31:16] 位

您可利用这些标记来控制后续的 SEL 指令,请参阅SEL

Note

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

体系结构

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

这些 32 位 Thumb 指令可用于 ARMv6T2 和 ARMv7,但 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.

Copyright © 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HC
Non-Confidential