sh-dis/sh4/MAC.W @Rm+,@Rn+

36 lines
913 B
Plaintext

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;
IF (s = 1)
{
macl ← SignExtend32(macl) + mul;
temp ← SignedSaturate32(macl);
IF (macl = temp)
result ← (mach << 32) ∨ ZeroExtend32(macl);
ELSE
result ← (0x1 << 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);