aboutsummaryrefslogtreecommitdiff
path: root/sim/mips/mdmx.c
diff options
context:
space:
mode:
Diffstat (limited to 'sim/mips/mdmx.c')
-rw-r--r--sim/mips/mdmx.c31
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
};