Signed Dual Multiply Add and Signed Dual Multiply Subtract.

#### Syntax

````op`{X}{`cond`} `Rd`, `Rn`, `Rm`
```

Where:

`op`

Is one of:

`SMUAD`

`SMUADX`

`SMUSD`

Signed Dual Multiply Subtract.

`SMUSDX`

Signed Dual Multiply Subtract reversed.

If `X` is present, the multiplications are bottom × top and top × bottom. If the `X` is omitted, the multiplications are bottom × bottom and top × top.

`cond`

Is an optional condition code. See Conditional execution.

`Rd`

Is the destination register.

`Rn, Rm`

Are registers holding the first and the second operands.

#### Operation

The `SMUAD` instruction interprets the values from the first and second operands as two signed halfwords in each operand. This instruction:

• Optionally rotates the halfwords of the second operand.

• Performs two signed 16 × 16-bit multiplications.

• Adds the two multiplication results together.

• Writes the result of the addition to the destination register.

The `SMUSD` instruction interprets the values from the first and second operands as two’s complement signed integers. This instruction:

• Optionally rotates the halfwords of the second operand.

• Performs two signed 16 × 16-bit multiplications.

• Subtracts the result of the top halfword multiplication from the result of the bottom halfword multiplication.

• Writes the result of the subtraction to the destination register.

#### Restrictions

In these instructions:

• Do not use SP and do not use PC.

#### Condition flags

`SMUAD`, `SMUADX` set the Q flag if the addition overflows. The multiplications cannot overflow.

#### Examples

```SMUAD    R0, R4, R5      ; Multiplies bottom halfword of R4 with the bottom
```
```                         ; halfword of R5, adds multiplication of top halfword
```
```                         ; of R4 with top halfword of R5, writes to R0.
```
```SMUADX   R3, R7, R4      ; Multiplies bottom halfword of R7 with top halfword
```
```                         ; of R4, adds multiplication of top halfword of R7
```
```                         ; with bottom halfword of R4, writes to R3.
```
```SMUSD    R3, R6, R2      ; Multiplies bottom halfword of R4 with bottom halfword
```
```                         ; of R6, subtracts multiplication of top halfword of R6
```
```                         ; with top halfword of R3, writes to R3.
```
```SMUSDX   R4, R5, R3      ; Multiplies bottom halfword of R5 with top halfword of
```
```                         ; R3, subtracts multiplication of top halfword of R5
```
```                         ; with bottom halfword of R3, writes to R4.
```