From d1789acece69deabeddae520341aa828d5a96c7f Mon Sep 17 00:00:00 2001 From: Michael Snyder Date: Mon, 11 Aug 2003 19:28:05 +0000 Subject: [PATCH] 2003-08-11 Shrinivas Atre * 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/ChangeLog | 6 ++++++ sim/sh/gencode.c | 5 ++--- sim/sh/interp.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 60 insertions(+), 3 deletions(-) diff --git a/sim/sh/ChangeLog b/sim/sh/ChangeLog index 9f0eb85fdc..7ab1394aef 100644 --- a/sim/sh/ChangeLog +++ b/sim/sh/ChangeLog @@ -1,3 +1,9 @@ +2003-08-11 Shrinivas Atre + * 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. + 2003-08-07 Michael Snyder * gencode.c (expand_ppi_code): Comment spelling fix. diff --git a/sim/sh/gencode.c b/sim/sh/gencode.c index fb6f5b209d..a4a1c2d34d 100644 --- a/sim/sh/gencode.c +++ b/sim/sh/gencode.c @@ -580,12 +580,11 @@ op tab[] = }, { "nm", "nm", "mac.l @+,@+", "0000nnnnmmmm1111", - "trap (255, R0, PC, memory, maskl, maskw, endianw);", - "/* FIXME: mac.l support */", + "macl(&R0,memory,n,m);", }, { "nm", "nm", "mac.w @+,@+", "0100nnnnmmmm1111", - "macw(R0,memory,n,m,endianw);", + "macw(&R0,memory,n,m,endianw);", }, { "n", "", "mov #,", "1110nnnni8*1....", diff --git a/sim/sh/interp.c b/sim/sh/interp.c index 887b7a602a..91899f400e 100644 --- a/sim/sh/interp.c +++ b/sim/sh/interp.c @@ -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))) @@ -1348,6 +1350,56 @@ macw (regs, memory, n, m, endianw) 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 get_loop_bounds (rs, re, memory, mem_end, maskw, endianw) int rs, re;