This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[patch][sh] mac.l insn endian issue
- From: Andrew STUBBS <andrew dot stubbs at st dot com>
- To: GDB Patches <gdb-patches at sourceware dot org>
- Date: Fri, 01 Feb 2008 10:25:51 +0000
- Subject: [patch][sh] mac.l insn endian issue
Hi all,
The mac.l simulator implementation is broken on big endian hosts, such
as Sparc Solaris.
The attached patch should fix the problem.
Andrew
2008-01-31 Antony King <antony.king@st.com>
Fix INSbl28170:
* interp.c (macl): Fix non-portable implementation.
--- sim/sh/interp.c@@/main/INSIGHT-6.6-ST-1.0-int/1 2007-08-17 15:11:45.000000000 +0100
+++ sim/sh/interp.c 2008-01-31 18:33:16.000000000 +0000
@@ -1433,14 +1433,9 @@
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;
@@ -1451,15 +1446,15 @@
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 */
{