usada8

Unsigned Sum of Absolute Differences Accumulate

USADA8<c> <Rd>, <Rn>, <Rm>, <Ra>

USAD8 plus accumulator.

Details

Computes the unsigned sum of absolute differences of four byte-wide values and adds an accumulator. Treats Rn and Rm as four unsigned bytes each, computes absolute differences for each byte pair, sums them, and adds the value in Ra to produce the result stored in Rd. Condition flags N, Z, C, V are unaffected. A32-only instruction requiring DSP extension.

Pseudocode Operation

diff0 ← |Rn[7:0] - Rm[7:0]|
diff1 ← |Rn[15:8] - Rm[15:8]|
diff2 ← |Rn[23:16] - Rm[23:16]|
diff3 ← |Rn[31:24] - Rm[31:24]|
Rd ← (diff0 + diff1 + diff2 + diff3) + Ra

Example

USADA8 r0, r1, r2, r5

Encoding

Binary Layout
cond
01111000
Rd
Ra
Rm
0001
Rn
 
Format SIMD Integer
Opcode 0x07800010
Extension A32 (DSP)

Operands

  • Rd
    Destination general-purpose register
  • Rn
    First source / base general-purpose register
  • Rm
    Second source / offset general-purpose register
  • Ra
    Acc

Reference (Arm AArch32 ISA)

Instruction Forms

Encoding Instruction ISA Bit pattern
0x07800010 USADA8{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> A32 cond | 01111000 | Rd | Ra | Rm | 0001 | Rn
0xFB700000 USADA8{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> T32 111110110 | 111 | Rn | Ra | Rd | 00 | 00 | Rm

Description

Unsigned Sum of Absolute Differences and Accumulate performs four unsigned 8-bit subtractions, and adds the absolute values of the differences to a 32-bit accumulate operand.

Operation

if ConditionPassed() then
    EncodingSpecificOperations();
    absdiff1 = Abs(UInt(R[n]<7:0>)   - UInt(R[m]<7:0>));
    absdiff2 = Abs(UInt(R[n]<15:8>)  - UInt(R[m]<15:8>));
    absdiff3 = Abs(UInt(R[n]<23:16>) - UInt(R[m]<23:16>));
    absdiff4 = Abs(UInt(R[n]<31:24>) - UInt(R[m]<31:24>));
    result = UInt(R[a]) + absdiff1 + absdiff2 + absdiff3 + absdiff4;
    R[d] = result<31:0>;