Thu Aug 1 17:05:24 1996 Martin M. Hunt <hunt@pizza.cygnus.com>
* ChangeLog, Makefile.in, configure, configure.in, d10v_sim.h, gencode.c, interp.c, simops.c: Created.
This commit is contained in:
parent
745a0437db
commit
2934d1c925
6 changed files with 2360 additions and 0 deletions
5
sim/d10v/ChangeLog
Normal file
5
sim/d10v/ChangeLog
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
Thu Aug 1 17:05:24 1996 Martin M. Hunt <hunt@pizza.cygnus.com>
|
||||||
|
|
||||||
|
* ChangeLog, Makefile.in, configure, configure.in, d10v_sim.h,
|
||||||
|
gencode.c, interp.c, simops.c: Created.
|
||||||
|
|
149
sim/d10v/Makefile.in
Normal file
149
sim/d10v/Makefile.in
Normal file
|
@ -0,0 +1,149 @@
|
||||||
|
# Makefile template for Configure for the SH sim library.
|
||||||
|
# Copyright (C) 1990, 1991, 1992, 1995 Free Software Foundation, Inc.
|
||||||
|
# Written by Cygnus Support.
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
|
VPATH = @srcdir@:@srcdir@/../common:@srcdir@/../../gdb/
|
||||||
|
srcdir = @srcdir@
|
||||||
|
srcroot = $(srcdir)/../..
|
||||||
|
|
||||||
|
prefix = @prefix@
|
||||||
|
exec_prefix = @exec_prefix@
|
||||||
|
|
||||||
|
host_alias = @host_alias@
|
||||||
|
target_alias = @target_alias@
|
||||||
|
program_transform_name = @program_transform_name@
|
||||||
|
bindir = @bindir@
|
||||||
|
|
||||||
|
libdir = @libdir@
|
||||||
|
tooldir = $(libdir)/$(target_alias)
|
||||||
|
|
||||||
|
datadir = @datadir@
|
||||||
|
mandir = @mandir@
|
||||||
|
man1dir = $(mandir)/man1
|
||||||
|
man2dir = $(mandir)/man2
|
||||||
|
man3dir = $(mandir)/man3
|
||||||
|
man4dir = $(mandir)/man4
|
||||||
|
man5dir = $(mandir)/man5
|
||||||
|
man6dir = $(mandir)/man6
|
||||||
|
man7dir = $(mandir)/man7
|
||||||
|
man8dir = $(mandir)/man8
|
||||||
|
man9dir = $(mandir)/man9
|
||||||
|
infodir = @infodir@
|
||||||
|
includedir = @includedir@
|
||||||
|
|
||||||
|
SHELL = /bin/sh
|
||||||
|
|
||||||
|
INSTALL = $(srcroot)/install.sh -c
|
||||||
|
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||||
|
INSTALL_DATA = @INSTALL_DATA@
|
||||||
|
INSTALL_XFORM = $(INSTALL) -t='$(program_transform_name)'
|
||||||
|
INSTALL_XFORM1= $(INSTALL_XFORM) -b=.1
|
||||||
|
|
||||||
|
AR = @AR@
|
||||||
|
AR_FLAGS = rc
|
||||||
|
CC = @CC@
|
||||||
|
CFLAGS = @CFLAGS@
|
||||||
|
MAKEINFO = makeinfo
|
||||||
|
RANLIB = @RANLIB@
|
||||||
|
CC_FOR_BUILD = @CC_FOR_BUILD@
|
||||||
|
|
||||||
|
HDEFINES = @HDEFINES@
|
||||||
|
TDEFINES =
|
||||||
|
|
||||||
|
.NOEXPORT:
|
||||||
|
MAKEOVERRIDES=
|
||||||
|
|
||||||
|
X=xstuff.o
|
||||||
|
XL=-lX11
|
||||||
|
X=
|
||||||
|
XL=
|
||||||
|
|
||||||
|
INCDIR = $(srcdir)/../../include
|
||||||
|
CSEARCH = -I. -I$(srcdir) -I../../include \
|
||||||
|
-I../../bfd -I$(INCDIR) -I$(srcdir)/../../bfd -I$(srcdir)/../../gdb -I$(srcdir)/../../newlib/libc/sys/sh
|
||||||
|
DEP = mkdep
|
||||||
|
|
||||||
|
all: run
|
||||||
|
|
||||||
|
run: interp.o $(X) run.o table.o callback.o simops.o
|
||||||
|
$(CC) $(CFLAGS) -o run $(X) interp.o table.o callback.o simops.o run.o ../../bfd/libbfd.a ../../libiberty/libiberty.a $(XL) -lm
|
||||||
|
|
||||||
|
interp.o:interp.c table.c
|
||||||
|
run.o:run.c
|
||||||
|
|
||||||
|
libsim.a:interp.o table.o simops.o
|
||||||
|
$(AR) $(ARFLAGS) libsim.a interp.o table.o
|
||||||
|
$(RANLIB) libsim.a
|
||||||
|
|
||||||
|
simops.h: gencode
|
||||||
|
./gencode -h >$@
|
||||||
|
|
||||||
|
table.c: gencode simops.h
|
||||||
|
./gencode >$@
|
||||||
|
|
||||||
|
gencode: gencode.c
|
||||||
|
$(CC) $(CFLAGS) $(HDEFINES) $(TDEFINES) $(CSEARCH) $(CSWITCHE) -o gencode $(srcdir)/gencode.c ../../opcodes/libopcodes.a -lc
|
||||||
|
|
||||||
|
.c.o:
|
||||||
|
$(CC) -c -DINSIDE_SIMULATOR $(CFLAGS) $(HDEFINES) $(TDEFINES) $(CSEARCH) $(CSWITCHES) $<
|
||||||
|
|
||||||
|
check:
|
||||||
|
|
||||||
|
info:
|
||||||
|
clean-info:
|
||||||
|
install-info:
|
||||||
|
|
||||||
|
tags etags: TAGS
|
||||||
|
|
||||||
|
TAGS: force
|
||||||
|
etags $(INCDIR)/*.h $(srcdir)/*.h $(srcdir)/*.c
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f *.[oa] *~ core *.E *.p *.ip aout-params.h gen-aout
|
||||||
|
rm -f run libsim.a
|
||||||
|
|
||||||
|
distclean mostlyclean maintainer-clean realclean: clean
|
||||||
|
rm -f TAGS
|
||||||
|
rm -f Makefile config.cache config.log config.status
|
||||||
|
|
||||||
|
# Dummy target to force execution of dependent targets.
|
||||||
|
#
|
||||||
|
force:
|
||||||
|
|
||||||
|
# Copy the files into directories where they will be run.
|
||||||
|
install:
|
||||||
|
$(INSTALL_XFORM) run $(bindir)/run
|
||||||
|
|
||||||
|
install-man: run.1
|
||||||
|
$(INSTALL_XFORM1) $(srcdir)/run.1 $(man1dir)/run.1
|
||||||
|
|
||||||
|
Makefile: Makefile.in config.status
|
||||||
|
$(SHELL) ./config.status
|
||||||
|
|
||||||
|
config.status: configure
|
||||||
|
$(SHELL) ./config.status --recheck
|
||||||
|
|
||||||
|
dep: $(CFILES)
|
||||||
|
mkdep $(CFLAGS) $?
|
||||||
|
|
||||||
|
# What appears below is generated by a hacked mkdep using gcc -MM.
|
||||||
|
|
||||||
|
# DO NOT DELETE THIS LINE -- mkdep uses it.
|
||||||
|
# DO NOT PUT ANYTHING AFTER THIS LINE, IT WILL GO AWAY.
|
||||||
|
|
||||||
|
|
||||||
|
# IF YOU PUT ANYTHING HERE IT WILL GO AWAY
|
29
sim/d10v/configure.in
Normal file
29
sim/d10v/configure.in
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
dnl Process this file with autoconf to produce a configure script.
|
||||||
|
AC_PREREQ(2.5)dnl
|
||||||
|
AC_INIT(Makefile.in)
|
||||||
|
|
||||||
|
AC_CONFIG_AUX_DIR(`cd $srcdir;pwd`/../..)
|
||||||
|
AC_CANONICAL_SYSTEM
|
||||||
|
AC_ARG_PROGRAM
|
||||||
|
AC_PROG_CC
|
||||||
|
AC_PROG_INSTALL
|
||||||
|
AC_C_BIGENDIAN
|
||||||
|
|
||||||
|
. ${srcdir}/../../bfd/configure.host
|
||||||
|
|
||||||
|
AC_SUBST(CFLAGS)
|
||||||
|
AC_SUBST(HDEFINES)
|
||||||
|
AR=${AR-ar}
|
||||||
|
AC_SUBST(AR)
|
||||||
|
AC_PROG_RANLIB
|
||||||
|
|
||||||
|
# Put a plausible default for CC_FOR_BUILD in Makefile.
|
||||||
|
AC_C_CROSS
|
||||||
|
if test "x$cross_compiling" = "xno"; then
|
||||||
|
CC_FOR_BUILD='$(CC)'
|
||||||
|
else
|
||||||
|
CC_FOR_BUILD=gcc
|
||||||
|
fi
|
||||||
|
AC_SUBST(CC_FOR_BUILD)
|
||||||
|
|
||||||
|
AC_OUTPUT(Makefile)
|
104
sim/d10v/d10v_sim.h
Normal file
104
sim/d10v/d10v_sim.h
Normal file
|
@ -0,0 +1,104 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include "ansidecl.h"
|
||||||
|
#include "opcode/d10v.h"
|
||||||
|
|
||||||
|
/* FIXME: host defines */
|
||||||
|
typedef unsigned char uint8;
|
||||||
|
typedef unsigned short uint16;
|
||||||
|
typedef unsigned int uint32;
|
||||||
|
typedef signed char int8;
|
||||||
|
typedef signed short int16;
|
||||||
|
typedef signed int int32;
|
||||||
|
typedef signed long long int64;
|
||||||
|
|
||||||
|
/* FIXME: D10V defines */
|
||||||
|
typedef uint16 reg_t;
|
||||||
|
|
||||||
|
struct simops
|
||||||
|
{
|
||||||
|
long opcode;
|
||||||
|
long mask;
|
||||||
|
int format;
|
||||||
|
int cycles;
|
||||||
|
int unit;
|
||||||
|
int exec_type;
|
||||||
|
void (*func)();
|
||||||
|
int numops;
|
||||||
|
int operands[9];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct _state
|
||||||
|
{
|
||||||
|
reg_t regs[16]; /* general-purpose registers */
|
||||||
|
reg_t cregs[15]; /* control registers */
|
||||||
|
int64 a[2]; /* accumulators */
|
||||||
|
uint8 SM;
|
||||||
|
uint8 EA;
|
||||||
|
uint8 DB;
|
||||||
|
uint8 IE;
|
||||||
|
uint8 RP;
|
||||||
|
uint8 MD;
|
||||||
|
uint8 FX;
|
||||||
|
uint8 ST;
|
||||||
|
uint8 F0;
|
||||||
|
uint8 F1;
|
||||||
|
uint8 C;
|
||||||
|
uint8 exe;
|
||||||
|
uint8 *imem;
|
||||||
|
uint8 *dmem;
|
||||||
|
} State;
|
||||||
|
|
||||||
|
extern uint16 OP[4];
|
||||||
|
extern struct simops Simops[];
|
||||||
|
|
||||||
|
#define PC (State.cregs[2])
|
||||||
|
#define PSW (State.cregs[0])
|
||||||
|
#define BPSW (State.cregs[1])
|
||||||
|
#define BPC (State.cregs[3])
|
||||||
|
#define RPT_C (State.cregs[7])
|
||||||
|
#define RPT_S (State.cregs[8])
|
||||||
|
#define RPT_E (State.cregs[9])
|
||||||
|
#define MOD_S (State.cregs[10])
|
||||||
|
#define MOD_E (State.cregs[11])
|
||||||
|
#define IBA (State.cregs[14])
|
||||||
|
|
||||||
|
#define SEXT3(x) ((((x)&0x7)^(~3))+4)
|
||||||
|
|
||||||
|
/* sign-extend a 4-bit number */
|
||||||
|
#define SEXT4(x) ((((x)&0xf)^(~7))+8)
|
||||||
|
|
||||||
|
/* sign-extend an 8-bit number */
|
||||||
|
#define SEXT8(x) ((((x)&0xff)^(~0x7f))+0x80)
|
||||||
|
|
||||||
|
/* sign-extend a 16-bit number */
|
||||||
|
#define SEXT16(x) ((((x)&0xffff)^(~0x7fff))+0x8000)
|
||||||
|
|
||||||
|
#define BIT40 0x8000000000LL
|
||||||
|
#define BIT44 0x80000000000LL
|
||||||
|
#define MAX32 0x7fffffffLL
|
||||||
|
#define MIN32 0xff80000000LL
|
||||||
|
#define MASK32 0xffffffffLL
|
||||||
|
#define MASK40 0xffffffffffLL
|
||||||
|
#define MASK44 0xfffffffffffLL
|
||||||
|
|
||||||
|
|
||||||
|
#define RB(x) (*((uint8 *)((x)+State.imem)))
|
||||||
|
|
||||||
|
#ifdef WORDS_BIGENDIAN
|
||||||
|
|
||||||
|
#define RW(x) (*((uint16 *)((x)+State.imem)))
|
||||||
|
#define RLW(x) (*((uint32 *)((x)+State.imem)))
|
||||||
|
#define SW(addr,data) RW(addr)=data
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
uint32 get_longword_swap PARAMS ((uint16 x));
|
||||||
|
uint16 get_word_swap PARAMS ((uint16 x));
|
||||||
|
void write_word_swap PARAMS ((uint16 addr, uint16 data));
|
||||||
|
|
||||||
|
#define SW(addr,data) write_word_swap(addr,data)
|
||||||
|
#define RW(x) get_word_swap(x)
|
||||||
|
#define RLW(x) get_longword_swap(x)
|
||||||
|
|
||||||
|
#endif /* not WORDS_BIGENDIAN */
|
345
sim/d10v/interp.c
Normal file
345
sim/d10v/interp.c
Normal file
|
@ -0,0 +1,345 @@
|
||||||
|
#include "sysdep.h"
|
||||||
|
#include "bfd.h"
|
||||||
|
#include "remote-sim.h"
|
||||||
|
#include "callback.h"
|
||||||
|
|
||||||
|
#include "d10v_sim.h"
|
||||||
|
|
||||||
|
#define IMEM_SIZE 18 /* D10V instruction memory size is 18 bits */
|
||||||
|
#define DMEM_SIZE 16 /* Data memory */
|
||||||
|
|
||||||
|
uint16 OP[4];
|
||||||
|
|
||||||
|
static struct hash_entry *lookup_hash PARAMS ((uint32 ins, int size));
|
||||||
|
|
||||||
|
#define MAX_HASH 63
|
||||||
|
struct hash_entry
|
||||||
|
{
|
||||||
|
struct hash_entry *next;
|
||||||
|
long opcode;
|
||||||
|
long mask;
|
||||||
|
struct simops *ops;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct hash_entry hash_table[MAX_HASH+1];
|
||||||
|
|
||||||
|
static long
|
||||||
|
hash(insn, format)
|
||||||
|
long insn;
|
||||||
|
int format;
|
||||||
|
{
|
||||||
|
if (format & LONG_OPCODE)
|
||||||
|
return ((insn & 0x3F000000) >> 24);
|
||||||
|
else
|
||||||
|
return((insn & 0x7E00) >> 9);
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct hash_entry *
|
||||||
|
lookup_hash (ins, size)
|
||||||
|
uint32 ins;
|
||||||
|
int size;
|
||||||
|
{
|
||||||
|
struct hash_entry *h;
|
||||||
|
|
||||||
|
if (size)
|
||||||
|
h = &hash_table[(ins & 0x3F000000) >> 24];
|
||||||
|
else
|
||||||
|
h = &hash_table[(ins & 0x7E00) >> 9];
|
||||||
|
|
||||||
|
while ( (ins & h->mask) != h->opcode)
|
||||||
|
{
|
||||||
|
if (h->next == NULL)
|
||||||
|
{
|
||||||
|
printf ("ERROR looking up hash for %x\n",ins);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
h = h->next;
|
||||||
|
}
|
||||||
|
return (h);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32
|
||||||
|
get_longword_swap (x)
|
||||||
|
uint16 x;
|
||||||
|
{
|
||||||
|
uint8 *a = (uint8 *)(x + State.imem);
|
||||||
|
return (a[0]<<24) + (a[1]<<16) + (a[2]<<8) + (a[3]);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16
|
||||||
|
get_word_swap (x)
|
||||||
|
uint16 x;
|
||||||
|
{
|
||||||
|
uint8 *a = (uint8 *)(x + State.imem);
|
||||||
|
return (a[0]<<8) + a[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
write_word_swap (addr, data)
|
||||||
|
uint16 addr, data;
|
||||||
|
{
|
||||||
|
uint8 *a = (uint8 *)(addr + State.imem);
|
||||||
|
a[0] = data >> 8;
|
||||||
|
a[1] = data & 0xff;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
get_operands (struct simops *s, uint32 ins)
|
||||||
|
{
|
||||||
|
int i, shift, bits, flags;
|
||||||
|
uint32 mask;
|
||||||
|
for (i=0; i < s->numops; i++)
|
||||||
|
{
|
||||||
|
shift = s->operands[3*i];
|
||||||
|
bits = s->operands[3*i+1];
|
||||||
|
flags = s->operands[3*i+2];
|
||||||
|
mask = 0x7FFFFFFF >> (31 - bits);
|
||||||
|
OP[i] = (ins >> shift) & mask;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
do_long (ins)
|
||||||
|
uint32 ins;
|
||||||
|
{
|
||||||
|
struct hash_entry *h;
|
||||||
|
/* printf ("do_long %x\n",ins); */
|
||||||
|
h = lookup_hash (ins, 1);
|
||||||
|
get_operands (h->ops, ins);
|
||||||
|
(h->ops->func)();
|
||||||
|
}
|
||||||
|
static void
|
||||||
|
do_2_short (ins1, ins2)
|
||||||
|
uint16 ins1, ins2;
|
||||||
|
{
|
||||||
|
struct hash_entry *h;
|
||||||
|
/* printf ("do_2_short %x -> %x\n",ins1,ins2); */
|
||||||
|
h = lookup_hash (ins1, 0);
|
||||||
|
get_operands (h->ops, ins1);
|
||||||
|
(h->ops->func)();
|
||||||
|
h = lookup_hash (ins2, 0);
|
||||||
|
get_operands (h->ops, ins2);
|
||||||
|
(h->ops->func)();
|
||||||
|
}
|
||||||
|
static void
|
||||||
|
do_parallel (ins1, ins2)
|
||||||
|
uint16 ins1, ins2;
|
||||||
|
{
|
||||||
|
struct hash_entry *h1, *h2;
|
||||||
|
/* printf ("do_parallel %x || %x\n",ins1,ins2); */
|
||||||
|
h1 = lookup_hash (ins1, 0);
|
||||||
|
get_operands (h1->ops, ins1);
|
||||||
|
h2 = lookup_hash (ins2, 0);
|
||||||
|
get_operands (h2->ops, ins2);
|
||||||
|
if (h1->ops->exec_type == PARONLY)
|
||||||
|
{
|
||||||
|
(h1->ops->func)();
|
||||||
|
if (State.exe)
|
||||||
|
(h2->ops->func)();
|
||||||
|
}
|
||||||
|
else if (h2->ops->exec_type == PARONLY)
|
||||||
|
{
|
||||||
|
(h2->ops->func)();
|
||||||
|
if (State.exe)
|
||||||
|
(h1->ops->func)();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
(h1->ops->func)();
|
||||||
|
(h2->ops->func)();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
sim_size (power)
|
||||||
|
int power;
|
||||||
|
|
||||||
|
{
|
||||||
|
if (State.imem)
|
||||||
|
{
|
||||||
|
free (State.imem);
|
||||||
|
free (State.dmem);
|
||||||
|
}
|
||||||
|
|
||||||
|
State.imem = (uint8 *)calloc(1,1<<IMEM_SIZE);
|
||||||
|
State.dmem = (uint8 *)calloc(1,1<<DMEM_SIZE);
|
||||||
|
if (!State.imem || !State.dmem )
|
||||||
|
{
|
||||||
|
fprintf (stderr,"Memory allocation failed.\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
printf ("Allocated %d bytes instruction memory and\n",1<<IMEM_SIZE);
|
||||||
|
printf (" %d bytes data memory.\n",1<<DMEM_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
init_system ()
|
||||||
|
{
|
||||||
|
if (!State.imem)
|
||||||
|
sim_size(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
sim_write (addr, buffer, size)
|
||||||
|
SIM_ADDR addr;
|
||||||
|
unsigned char *buffer;
|
||||||
|
int size;
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
init_system ();
|
||||||
|
|
||||||
|
printf ("sim_write %d bytes to 0x%x\n",size,addr);
|
||||||
|
for (i = 0; i < size; i++)
|
||||||
|
{
|
||||||
|
State.imem[i+addr] = buffer[i];
|
||||||
|
}
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
sim_open (args)
|
||||||
|
char *args;
|
||||||
|
{
|
||||||
|
struct simops *s;
|
||||||
|
struct hash_entry *h, *prev;
|
||||||
|
if (args != NULL)
|
||||||
|
printf ("sim_open %s\n",args);
|
||||||
|
|
||||||
|
/* put all the opcodes in the hash table */
|
||||||
|
for (s = Simops; s->func; s++)
|
||||||
|
{
|
||||||
|
h = &hash_table[hash(s->opcode,s->format)];
|
||||||
|
|
||||||
|
/* go to the last entry in the chain */
|
||||||
|
while (h->next)
|
||||||
|
h = h->next;
|
||||||
|
|
||||||
|
if (h->ops)
|
||||||
|
{
|
||||||
|
h->next = calloc(1,sizeof(struct hash_entry));
|
||||||
|
h = h->next;
|
||||||
|
}
|
||||||
|
h->ops = s;
|
||||||
|
h->mask = s->mask;
|
||||||
|
h->opcode = s->opcode;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
sim_close (quitting)
|
||||||
|
int quitting;
|
||||||
|
{
|
||||||
|
/* nothing to do */
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
sim_set_profile (n)
|
||||||
|
int n;
|
||||||
|
{
|
||||||
|
printf ("sim_set_profile %d\n",n);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
sim_set_profile_size (n)
|
||||||
|
int n;
|
||||||
|
{
|
||||||
|
printf ("sim_set_profile_size %d\n",n);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
sim_resume (step, siggnal)
|
||||||
|
int step, siggnal;
|
||||||
|
{
|
||||||
|
uint32 inst;
|
||||||
|
int i;
|
||||||
|
reg_t oldpc;
|
||||||
|
|
||||||
|
printf ("sim_resume %d %d\n",step,siggnal);
|
||||||
|
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
inst = RLW (PC << 2);
|
||||||
|
oldpc = PC;
|
||||||
|
switch (inst & 0xC0000000)
|
||||||
|
{
|
||||||
|
case 0xC0000000:
|
||||||
|
/* long instruction */
|
||||||
|
do_long (inst & 0x3FFFFFFF);
|
||||||
|
break;
|
||||||
|
case 0x80000000:
|
||||||
|
/* R -> L */
|
||||||
|
do_2_short ( inst & 0x7FFF, (inst & 0x3FFF8000) >> 15);
|
||||||
|
break;
|
||||||
|
case 0x40000000:
|
||||||
|
/* L -> R */
|
||||||
|
do_2_short ((inst & 0x3FFF8000) >> 15, inst & 0x7FFF);
|
||||||
|
break;
|
||||||
|
case 0:
|
||||||
|
do_parallel ((inst & 0x3FFF8000) >> 15, inst & 0x7FFF);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (State.RP && PC == RPT_E)
|
||||||
|
{
|
||||||
|
RPT_C -= 1;
|
||||||
|
if (RPT_C == 0)
|
||||||
|
State.RP = 0;
|
||||||
|
else
|
||||||
|
PC = RPT_S;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* FIXME */
|
||||||
|
if (PC == oldpc)
|
||||||
|
PC++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
sim_trace ()
|
||||||
|
{
|
||||||
|
printf ("sim_trace\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
sim_info (verbose)
|
||||||
|
int verbose;
|
||||||
|
{
|
||||||
|
printf ("sim_verbose\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
sim_create_inferior (start_address, argv, env)
|
||||||
|
SIM_ADDR start_address;
|
||||||
|
char **argv;
|
||||||
|
char **env;
|
||||||
|
{
|
||||||
|
printf ("sim_create_inferior: PC=0x%x\n",start_address);
|
||||||
|
PC = start_address >> 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
sim_kill ()
|
||||||
|
{
|
||||||
|
/* nothing to do */
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
sim_set_callbacks(p)
|
||||||
|
host_callback *p;
|
||||||
|
{
|
||||||
|
printf ("sim_set_callbacks\n");
|
||||||
|
/* callback = p; */
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
sim_stop_reason (reason, sigrc)
|
||||||
|
enum sim_stop *reason;
|
||||||
|
int *sigrc;
|
||||||
|
{
|
||||||
|
printf ("sim_stop_reason\n");
|
||||||
|
}
|
1728
sim/d10v/simops.c
Normal file
1728
sim/d10v/simops.c
Normal file
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue