This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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.
----------------------------------------------------------------------------- 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]