2003-08-11 Shrinivas Atre <shrinivasa@KPITCummins.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.
This commit is contained in:
parent
b246147cd3
commit
d1789acece
3 changed files with 60 additions and 3 deletions
|
@ -1,3 +1,9 @@
|
||||||
|
2003-08-11 Shrinivas Atre <shrinivasa@KPITCummins.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.
|
||||||
|
|
||||||
2003-08-07 Michael Snyder <msnyder@redhat.com>
|
2003-08-07 Michael Snyder <msnyder@redhat.com>
|
||||||
|
|
||||||
* gencode.c (expand_ppi_code): Comment spelling fix.
|
* gencode.c (expand_ppi_code): Comment spelling fix.
|
||||||
|
|
|
@ -580,12 +580,11 @@ op tab[] =
|
||||||
},
|
},
|
||||||
|
|
||||||
{ "nm", "nm", "mac.l @<REG_M>+,@<REG_N>+", "0000nnnnmmmm1111",
|
{ "nm", "nm", "mac.l @<REG_M>+,@<REG_N>+", "0000nnnnmmmm1111",
|
||||||
"trap (255, R0, PC, memory, maskl, maskw, endianw);",
|
"macl(&R0,memory,n,m);",
|
||||||
"/* FIXME: mac.l support */",
|
|
||||||
},
|
},
|
||||||
|
|
||||||
{ "nm", "nm", "mac.w @<REG_M>+,@<REG_N>+", "0100nnnnmmmm1111",
|
{ "nm", "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....",
|
{ "n", "", "mov #<imm>,<REG_N>", "1110nnnni8*1....",
|
||||||
|
|
|
@ -169,6 +169,7 @@ static char **prog_argv;
|
||||||
|
|
||||||
#if 1
|
#if 1
|
||||||
static int maskw = 0;
|
static int maskw = 0;
|
||||||
|
static int maskl = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static SIM_OPEN_KIND sim_kind;
|
static SIM_OPEN_KIND sim_kind;
|
||||||
|
@ -651,6 +652,7 @@ rbat_fast (memory, x, maskb)
|
||||||
|
|
||||||
#define RUWAT(x) (RWAT(x) & 0xffff)
|
#define RUWAT(x) (RWAT(x) & 0xffff)
|
||||||
#define RSWAT(x) ((short)(RWAT(x)))
|
#define RSWAT(x) ((short)(RWAT(x)))
|
||||||
|
#define RSLAT(x) ((long)(RLAT(x)))
|
||||||
#define RSBAT(x) (SEXT(RBAT(x)))
|
#define RSBAT(x) (SEXT(RBAT(x)))
|
||||||
|
|
||||||
#define RDAT(x, n) (do_rdat (memory, (x), (n), (maskl)))
|
#define RDAT(x, n) (do_rdat (memory, (x), (n), (maskl)))
|
||||||
|
@ -1348,6 +1350,56 @@ macw (regs, memory, n, m, endianw)
|
||||||
MACL = sum;
|
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
|
static struct loop_bounds
|
||||||
get_loop_bounds (rs, re, memory, mem_end, maskw, endianw)
|
get_loop_bounds (rs, re, memory, mem_end, maskw, endianw)
|
||||||
int rs, re;
|
int rs, re;
|
||||||
|
|
Loading…
Reference in a new issue