diff options
Diffstat (limited to 'sim/mips/mdmx.c')
-rw-r--r-- | sim/mips/mdmx.c | 31 |
1 files changed, 27 insertions, 4 deletions
diff --git a/sim/mips/mdmx.c b/sim/mips/mdmx.c index 2b08922..96abe1d 100644 --- a/sim/mips/mdmx.c +++ b/sim/mips/mdmx.c @@ -250,7 +250,6 @@ MsgnQH(signed16 ts, signed16 tt) return t; } - static signed16 SRAQH(signed16 ts, signed16 tt) { @@ -259,6 +258,21 @@ SRAQH(signed16 ts, signed16 tt) } +/* "pabsdiff" and "pavg" are defined only for OB format. */ + +static unsigned8 +AbsDiffOB(unsigned8 ts, unsigned8 tt) +{ + return (ts >= tt ? ts - tt : tt - ts); +} + +static unsigned8 +AvgOB(unsigned8 ts, unsigned8 tt) +{ + return ((unsigned32)ts + (unsigned32)tt + 1) >> 1; +} + + /* Dispatch tables for operations that update a CPR. */ static const QH_FUNC qh_func[] = { @@ -270,7 +284,7 @@ static const QH_FUNC qh_func[] = { static const OB_FUNC ob_func[] = { AndOB, NorOB, OrOB, XorOB, SLLOB, SRLOB, AddOB, SubOB, MinOB, MaxOB, - MulOB, NULL, NULL, NULL, NULL + MulOB, NULL, NULL, AbsDiffOB, AvgOB }; /* Auxiliary functions for CPR updates. */ @@ -743,17 +757,26 @@ AccSubLOB(signed24 *a, unsigned8 ts, unsigned8 tt) *a = (signed24)ts - (signed24)tt; } +static void +AccAbsDiffOB(signed24 *a, unsigned8 ts, unsigned8 tt) +{ + unsigned8 t = (ts >= tt ? ts - tt : tt - ts); + *a += (signed24)t; +} + /* Dispatch tables for operations that update a CPR. */ static const QH_ACC qh_acc[] = { AccAddAQH, AccAddAQH, AccMulAQH, AccMulLQH, - SubMulAQH, SubMulLQH, AccSubAQH, AccSubLQH + SubMulAQH, SubMulLQH, AccSubAQH, AccSubLQH, + NULL }; static const OB_ACC ob_acc[] = { AccAddAOB, AccAddLOB, AccMulAOB, AccMulLOB, - SubMulAOB, SubMulLOB, AccSubAOB, AccSubLOB + SubMulAOB, SubMulLOB, AccSubAOB, AccSubLOB, + AccAbsDiffOB }; |