umlal
Unsigned Multiply Accumulate Long (Thumb)
UMLAL <RdLo>, <RdHi>, <Rn>, <Rm>
Unsigned Multiply Accumulate (64-bit result).
Details
Unsigned Multiply Accumulate Long: Multiplies the unsigned 32-bit values in Rn and Rm, accumulates the 64-bit result with the value in RdHi:RdLo, and writes the 64-bit result back to RdHi:RdLo. The condition flags are not affected. This instruction is available in Thumb state (T32) and A32.
Pseudocode Operation
product ← ZeroExtend(Rn, 64) × ZeroExtend(Rm, 64)
accumulator ← (RdHi << 32) | RdLo
result ← accumulator + product
RdLo ← result[31:0]
RdHi ← result[63:32]
Example
UMLAL r1, r0, r1, r2
Encoding
Binary Layout
111110111
110
Rn
RdLo
RdHi
0000
Rm
Operands
-
RdLo
Low -
RdHi
High -
Rn
First source / base general-purpose register -
Rm
Second source / offset general-purpose register
Reference (Arm AArch32 ISA)
Instruction Forms
| Encoding | Instruction | ISA | Bit pattern | ||
|---|---|---|---|---|---|
| 0x00A00090 | UMLAL{<c>}{<q>} <RdLo>, <RdHi>, <Rn>, <Rm> | A32 | cond | 0000 | 101 | 0 | RdHi | RdLo | Rm | 1001 | Rn | ||
| 0xFBE00000 | UMLAL{<c>}{<q>} <RdLo>, <RdHi>, <Rn>, <Rm> | T32 | 111110111 | 110 | Rn | RdLo | RdHi | 0000 | Rm |
Description
Unsigned Multiply Accumulate Long multiplies two unsigned 32-bit values to produce a 64-bit value, and accumulates this with a 64-bit value.
In A32 instructions, the condition flags can optionally be updated based on the result. Use of this option adversely affects performance on many implementations.
Operation
if ConditionPassed() then
EncodingSpecificOperations();
result = UInt(R[n]) * UInt(R[m]) + UInt(R[dHi]:R[dLo]);
R[dHi] = result<63:32>;
R[dLo] = result<31:0>;
if setflags then
PSTATE.N = result<63>;
PSTATE.Z = IsZeroBit(result<63:0>);
// PSTATE.C, PSTATE.V unchanged