aboutsummaryrefslogtreecommitdiff
path: root/sim/sh
diff options
context:
space:
mode:
Diffstat (limited to 'sim/sh')
-rw-r--r--sim/sh/ChangeLog4
-rw-r--r--sim/sh/interp.c21
2 files changed, 12 insertions, 13 deletions
diff --git a/sim/sh/ChangeLog b/sim/sh/ChangeLog
index e06e764..8a3d88a 100644
--- a/sim/sh/ChangeLog
+++ b/sim/sh/ChangeLog
@@ -1,3 +1,7 @@
+2008-02-04 Antony King <antony.king@st.com>
+
+ * interp.c (macl): Fix non-portable implementation.
+
2007-10-08 Andrew Stubbs <andrew.stubbs@st.com>
* gencode.c (tab): Add RAISE_EXCEPTION_IF_IN_DELAY_SLOT to the
diff --git a/sim/sh/interp.c b/sim/sh/interp.c
index d89b0dc..a2472ad 100644
--- a/sim/sh/interp.c
+++ b/sim/sh/interp.c
@@ -1429,14 +1429,9 @@ macl (regs, memory, n, m)
int m, n;
{
long tempm, tempn;
- long prod, macl, mach, sum;
- long long ans,ansl,ansh,t;
- unsigned long long high,low,combine;
- union mac64
- {
- long m[2]; /* mach and macl*/
- long long m64; /* 64 bit MAC */
- }mac64;
+ long macl, mach;
+ long long ans;
+ long long mac64;
tempm = RSLAT (regs[m]);
regs[m] += 4;
@@ -1447,15 +1442,15 @@ macl (regs, memory, n, m)
mach = MACH;
macl = MACL;
- mac64.m[0] = macl;
- mac64.m[1] = mach;
+ mac64 = ((long long) macl & 0xffffffff) |
+ ((long long) mach & 0xffffffff) << 32;
ans = (long long) tempm * (long long) tempn; /* Multiply 32bit * 32bit */
- mac64.m64 += ans; /* Accumulate 64bit + 64 bit */
+ mac64 += ans; /* Accumulate 64bit + 64 bit */
- macl = mac64.m[0];
- mach = mac64.m[1];
+ macl = (long) (mac64 & 0xffffffff);
+ mach = (long) ((mac64 >> 32) & 0xffffffff);
if (S) /* Store only 48 bits of the result */
{