3.5.14. SASX and SSAX

Signed Add and Subtract with Exchange and Signed Subtract and Add with Exchange.

Syntax

op{cond} {Rd,} Rn, Rm

Where:

op

Is one of:

SASX

Signed Add and Subtract with Exchange.

SSAX

Signed Subtract and Add with Exchange.

cond

Is an optional condition code. See Conditional execution.

Rd

Is the destination register. If Rd is omitted, the destination register is Rn.

Rn

Is the first operand register.

Rm

Is the second operand register.

Operation

The SASX instruction:

  1. Adds the signed top halfword of the first operand with the signed bottom halfword of the second operand.

  2. Writes the signed result of the addition to the top halfword of the destination register.

  3. Subtracts the signed bottom halfword of the second operand from the top signed halfword of the first operand.

  4. Writes the signed result of the subtraction to the bottom halfword of the destination register.

The SSAX instruction:

  1. Subtracts the signed bottom halfword of the second operand from the top signed halfword of the first operand.

  2. Writes the signed result of the addition to the bottom halfword of the destination register.

  3. Adds the signed top halfword of the first operand with the signed bottom halfword of the second operand.

  4. Writes the signed result of the subtraction to the top halfword of the destination register.

Restrictions

Do not use SP and do not use PC.

Condition flags

These instructions set the APSR.GE bits according to the results.

For SASX:

if ConditionPassed() then
   EncodingSpecificOperations();
   diff = SInt(R[n]<15:0>) - SInt(R[m]<31:16>);
   sum = SInt(R[n]<31:16>) + SInt(R[m]<15:0>);
   R[d]<15:0> = diff<15:0>;
   R[d]<31:16> = sum<15:0>;
   APSR.GE<1:0> = if diff >= 0 then '11' else '00';
   APSR.GE<3:2> = if sum >= 0 then '11' else '00';

For SSAX:

if ConditionPassed() then
   EncodingSpecificOperations();
   sum = SInt(R[n]<15:0>) + SInt(R[m]<31:16>);
   diff = SInt(R[n]<31:16>) - SInt(R[m]<15:0>);
   R[d]<15:0> = sum<15:0>;
   R[d]<31:16> = diff<15:0>;
   APSR.GE<1:0> = if sum >= 0 then '11' else '00';
   APSR.GE<3:2> = if diff >= 0 then '11' else '00';

Examples

SASX    R0, R4, R5     ; Adds top halfword of R4 to bottom halfword of R5 and 
                       ; writes to top halfword of R0.
                       ; Subtracts bottom halfword of R5 from top halfword of R4
                       ; and writes to bottom halfword of R0.
SSAX    R7, R3, R2     ; Subtracts top halfword of R2 from bottom halfword of R3
                       ; and writes to bottom halfword of R7.
                       ; Adds top halfword of R3 with bottom halfword of R2 and 
                       ; writes to top halfword of R7.

Copyright © 2015, 2018 Arm. All rights reserved.ARM DUI 0646C
Non-ConfidentialID121118