This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
UPDATED PATCH: SH Simulator - MAC.L implementation and MAC.W correction
- From: "Shrinivas Atre" <ShrinivasA at kpit dot com>
- To: <gdb-patches at sources dot redhat dot com>
- Date: Tue, 4 Mar 2003 19:17:57 +0530
- Subject: UPDATED PATCH: SH Simulator - MAC.L implementation and MAC.W correction
Hi,
At present in SH simulator of GDB there are two problems.
1. The GDB crashes during simulation of MAC.W instruction.
2. Simulation of MAC.L is not present in GDB simulator.
Following patch corrects the MAC.W crash problem and implements the MAC.L instruction.
Regards,
Shrinivas
Changelog:
2003-03-04 Shrinivas Atre <shrinivasa at kpit dot com>
* sim/sh/gencode.c ( tab[] ): Addition of MAC.L handler and correction for MAC.W handler
* sim/sh/interp.c ( macl ): New Function. Implementation of MAC.L handler.
===============================================================================
--- sim/sh/gencode.orig.c Tue Mar 4 17:36:04 2003
+++ sim/sh/gencode.c Tue Mar 4 17:35:57 2003
@@ -577,12 +577,11 @@ op tab[] =
},
{ "", "nm", "mac.l @<REG_M>+,@<REG_N>+", "0000nnnnmmmm1111",
- "trap (255,R0,memory,maskl,maskw, endianw);",
- "/* FIXME: mac.l support */",
+ "macl(&R0,memory,n,m);",
},
{ "", "nm", "mac.w @<REG_M>+,@<REG_N>+", "0100nnnnmmmm1111",
- "macw(R0,memory,n,m,endianw);",
+ "macw(&R0,memory,n,m,endianw);",
},
{ "n", "", "mov #<imm>,<REG_N>", "1110nnnni8*1....",
------------------------------------------------------------------------------
--- sim/sh/interp.orig.c Mon Mar 3 11:37:56 2003
+++ sim/sh/interp.c Tue Mar 4 17:30:01 2003
@@ -169,6 +169,7 @@ static char **prog_argv;
#if 1
static int maskw = 0;
+static int maskl = 0;
#endif
static SIM_OPEN_KIND sim_kind;
@@ -651,6 +652,7 @@ rbat_fast (memory, x, maskb)
#define RUWAT(x) (RWAT(x) & 0xffff)
#define RSWAT(x) ((short)(RWAT(x)))
+#define RSLAT(x) ((long)(RLAT(x)))
#define RSBAT(x) (SEXT(RBAT(x)))
#define RDAT(x, n) (do_rdat (memory, (x), (n), (maskl)))
@@ -1335,6 +1337,57 @@ macw (regs, memory, n, m, endianw)
MACH = (mach & 0x1ff) | -(mach & 0x200);
}
MACL = sum;
+}
+
+static void
+macl (regs, memory, n, m)
+ int *regs;
+ unsigned char *memory;
+ 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;
+
+ tempm = RSLAT(regs[m]);
+ regs[m] += 4;
+
+ tempn = RSLAT(regs[n]);
+ regs[n] += 4;
+
+
+ mach = MACH;
+ macl = MACL;
+
+ mac64.m[0] = macl;
+ mac64.m[1] = mach;
+
+ ans = (long long)tempm * (long long)tempn; /* Multiply 32bit * 32bit */
+
+ mac64.m64 += ans; /* Accumulate 64bit + 64 bit */
+
+ macl = mac64.m[0];
+ mach = mac64.m[1];
+
+ if (S) /* Store only 48 bits of the result */
+ {
+ if(mach < 0) /* Result is negative */
+ {
+ mach = mach & 0x0000ffff; /* Mask higher 16 bits */
+ mach |= 0xffff8000; /* Sign extend higher 16 bits */
+ }
+ else
+ mach = mach & 0x00007fff; /* Postive Result */
+ }
+
+ MACL = macl;
+ MACH = mach;
}
static struct loop_bounds
===============================================================================
-----------------------------------------------------------------------------
Free download of GNUSH and GNUH8 tool chains for Hitachi's SH and H8 Series.
The following site also offers free support to European customers.
Read more at http://www.gnush.com and http://www.gnuh8.com
Latest versions of GNUSH and GNUH8 are released on January 31, 2003.
-----------------------------------------------------------------------------