0100nnnnmmmm1111 macl ← ZeroExtend32(MACL); mach ← ZeroExtend32(MACH); s ← ZeroExtend1(S); m_field ← ZeroExtend4(m); n_field ← ZeroExtend4(n); m_address ← SignExtend32(Rm); n_address ← SignExtend32(Rn); value2 ← SignExtend16(ReadMemory16(ZeroExtend32(n_address))); n_address ← n_address + 2; IF (n_field = m_field) { m_address ← m_address + 2; n_address ← n_address + 2; } value1 ← SignExtend16(ReadMemory16(ZeroExtend32(m_address))); m_address ← m_address + 2; mul ← value2 × value1; result ← 0; IF (s = 1) { macl ← SignExtend32(macl) + mul; temp ← SignedSaturate32(macl); IF (macl = temp) result ← (mach << 32) ∨ ZeroExtend32(macl); ELSE result ← (1 << 32) ∨ ZeroExtend32(temp); } ELSE result ← ((mach << 32) + macl) + mul; macl ← result; mach ← result >> 32; Rm ← Register(m_address); Rn ← Register(n_address); MACL ← ZeroExtend32(macl); MACH ← ZeroExtend32(mach);