* genmloop.sh (eng.hin): Rename HAVE_PARALLEL_EXEC to

HAVE_PARALLEL_INSNS, define as 0 or 1.  Emit decls of fns in mloop.cin.
	* cgen-engine.h: Typedefs of IADDR,CIA,SEM_ARG,SEM_PC moved ...
	* cgen-sim.h: ... to here.
This commit is contained in:
Doug Evans 1998-11-05 07:53:37 +00:00
parent 7192be38cc
commit 8c7dc9ffc8
4 changed files with 96 additions and 218 deletions

View File

@ -1,3 +1,10 @@
Wed Nov 4 23:51:19 1998 Doug Evans <devans@seba.cygnus.com>
* genmloop.sh (eng.hin): Rename HAVE_PARALLEL_EXEC to
HAVE_PARALLEL_INSNS, define as 0 or 1. Emit decls of fns in mloop.cin.
* cgen-engine.h: Typedefs of IADDR,CIA,SEM_ARG,SEM_PC moved ...
* cgen-sim.h: ... to here.
Wed Oct 28 12:00:57 1998 Andrew Cagney <cagney@b1.cygnus.com>
* aclocal.m4 (enable-build-warnings): Replace

View File

@ -18,46 +18,11 @@ 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. */
/* This file must be included after eng.h has been included
as it specifies the configuration of the engine. */
/* This file must be included after eng.h and ${cpu}.h have been included. */
#ifndef CGEN_ENGINE_H
#define CGEN_ENGINE_H
/* Execution support. */
#if WITH_SCACHE
/* instruction address
??? This was intended to be a struct of two elements in the WITH_SCACHE_PBB
case. The first element is the PCADDR, the second element is the SCACHE *.
Haven't found the time yet to make this work, but it is a nicer approach
than the current br_cache stuff. */
typedef PCADDR IADDR;
/* current instruction address */
typedef PCADDR CIA;
/* argument to semantic functions */
typedef SCACHE *SEM_ARG;
/* semantic code's version of pc */
#if WITH_SCACHE_PBB
typedef SCACHE *SEM_PC;
#else
typedef PCADDR SEM_PC;
#endif
#else /* ! WITH_SCACHE */
/* instruction address */
typedef PCADDR IADDR;
/* current instruction address */
typedef PCADDR CIA;
/* argument to semantic functions */
typedef ARGBUF *SEM_ARG;
/* semantic code's version of pc */
typedef PCADDR SEM_PC;
#endif /* ! WITH_SCACHE */
/* Semantic functions come in six versions on two axes:
fast/full-featured, and using one of the simple/scache/compilation engines.
A full featured simulator is always provided. --enable-sim-fast includes
@ -69,7 +34,7 @@ typedef PCADDR SEM_PC;
/* Types of the machine generated extract and semantic fns. */
typedef void (EXTRACT_FN) (SIM_CPU *, PCADDR, insn_t, ARGBUF *);
#ifdef HAVE_PARALLEL_EXEC
#if HAVE_PARALLEL_INSNS
typedef SEM_PC (SEMANTIC_FN) (SIM_CPU *, SEM_ARG, PAREXEC *);
#else
typedef SEM_PC (SEMANTIC_FN) (SIM_CPU *, SEM_ARG);
@ -136,8 +101,6 @@ do { \
((CGEN_ATTR_BOOLS (CGEN_INSN_ATTRS ((idesc)->opcode)) \
& CGEN_ATTR_MASK (CGEN_INSN_SKIP_CTI)) \
!= 0)
/* Engine support. */
/* These are used so that we can compile two copies of the semantic code,
one with full feature support and one without that runs fast(er). */

View File

@ -21,8 +21,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#ifndef CGEN_SIM_H
#define CGEN_SIM_H
#define PC CPU (h_pc)
/* Instruction field support macros. */
#define EXTRACT_SIGNED(val, total, start, length) \
@ -37,24 +35,54 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#define HOST_LONGS_FOR_BITS(n) \
(((n) + sizeof (long) * 8 - 1) / sizeof (long) * 8)
/* Execution support. */
/* Forward decls. Defined in the machine generated files. */
/* This holds the contents of the extracted insn.
There are a few common entries (e.g. pc address), and then one big
union with an entry for each of the instruction formats. */
typedef struct argbuf ARGBUF;
/* This is one ARGBUF plus whatever else is needed for WITH_SCACHE support.
At present there is nothing else, but it also provides a level of
abstraction. */
typedef struct scache SCACHE;
/* This is a union with one entry for each instruction format.
Each entry contains all of the non-constant inputs of the instruction. */
typedef struct parexec PAREXEC;
/* An "Instruction DESCriptor".
This is the main handle on an instruction for the simulator. */
typedef struct idesc IDESC;
/* Engine support.
??? This is here because it's needed before eng.h (built by genmloop.sh)
which is needed before cgen-engine.h and cpu.h.
??? This depends on a cpu family specific type, PCADDR, but no machine
generated headers will have been included yet. sim/common currently
requires the typedef of sim_cia in sim-main.h between the inclusion of
sim-basics.h and sim-base.h so this is no different. */
#ifdef SCACHE_P
#if WITH_SCACHE
/* instruction address */
/* instruction address
??? This was intended to be a struct of two elements in the WITH_SCACHE_PBB
case. The first element is the PCADDR, the second element is the SCACHE *.
Haven't found the time yet to make this work, but it is a nicer approach
than the current br_cache stuff. */
typedef PCADDR IADDR;
/* current instruction address */
typedef PCADDR CIA;
/* argument to semantic functions */
typedef SCACHE *SEM_ARG;
/* semantic code's version of pc */
#if WITH_SCACHE_PBB
typedef SCACHE *SEM_PC;
#else
typedef PCADDR SEM_PC;
#endif
#else /* ! SCACHE_P */
#else /* ! WITH_SCACHE */
/* instruction address */
typedef PCADDR IADDR;
@ -62,148 +90,34 @@ typedef PCADDR IADDR;
typedef PCADDR CIA;
/* argument to semantic functions */
typedef ARGBUF *SEM_ARG;
/* semantic code's version of pc */
typedef PCADDR SEM_PC;
#endif /* ! SCACHE_P */
/* Semantic functions come in two versions on two axes:
fast and full (featured), and using or not using scache.
A full featured simulator is always provided. --enable-sim-fast includes
support for fast execution by duplicating the semantic code but leaving
out all features like tracing and profiling.
Using the scache is selected with --enable-sim-scache. */
/* FIXME: --enable-sim-fast not implemented yet. */
/* Types of the machine generated extract and semantic fns. */
/* FIXME: Eventually conditionalize EXTRACT_FN on WITH_SCACHE. */
typedef void (EXTRACT_FN) (SIM_CPU *, PCADDR, insn_t, ARGBUF *);
#if WITH_SCACHE
#ifdef HAVE_PARALLEL_EXEC
typedef CIA (SEMANTIC_FN) (SIM_CPU *, SCACHE *, PAREXEC *);
#else
typedef CIA (SEMANTIC_FN) (SIM_CPU *, SCACHE *);
#endif
#else /* ! WITH_SCACHE */
#ifdef HAVE_PARALLEL_EXEC
typedef CIA (SEMANTIC_FN) (SIM_CPU *, ARGBUF *, PAREXEC *);
#else
typedef CIA (SEMANTIC_FN) (SIM_CPU *, ARGBUF *);
#endif
#endif
/* Scache data for each cpu. */
typedef struct cpu_scache {
/* Simulator cache size. */
int size;
#define CPU_SCACHE_SIZE(cpu) ((cpu) -> cgen_cpu.scache.size)
/* Cache. */
SCACHE *cache;
#define CPU_SCACHE_CACHE(cpu) ((cpu) -> cgen_cpu.scache.cache)
#if 0 /* FIXME: wip */
/* Free list. */
SCACHE *free;
#define CPU_SCACHE_FREE(cpu) ((cpu) -> cgen_cpu.scache.free)
/* Hash table. */
SCACHE **hash_table;
#define CPU_SCACHE_HASH_TABLE(cpu) ((cpu) -> cgen_cpu.scache.hash_table)
#endif
#if WITH_PROFILE_SCACHE_P
/* Cache hits, misses. */
unsigned long hits, misses;
#define CPU_SCACHE_HITS(cpu) ((cpu) -> cgen_cpu.scache.hits)
#define CPU_SCACHE_MISSES(cpu) ((cpu) -> cgen_cpu.scache.misses)
#endif
} CPU_SCACHE;
/* Default number of cached blocks. */
#ifdef CONFIG_SIM_CACHE_SIZE
#define SCACHE_DEFAULT_CACHE_SIZE CONFIG_SIM_CACHE_SIZE
#else
#define SCACHE_DEFAULT_CACHE_SIZE 1024
#endif
/* Hash a PC value. */
/* FIXME: cpu specific */
#define SCACHE_HASH_PC(state, pc) \
(((pc) >> 1) & (STATE_SCACHE_SIZE (sd) - 1))
/* Non-zero if cache is in use. */
#define USING_SCACHE_P(sd) (STATE_SCACHE_SIZE (sd) > 0)
/* Install the simulator cache into the simulator. */
MODULE_INSTALL_FN scache_install;
/* Flush all cpu's caches. */
void scache_flush (SIM_DESC);
#endif /* ! WITH_SCACHE */
/* Scache profiling support. */
/* Additional opcode table support. */
/* Print summary scache usage information. */
void scache_print_profile (SIM_CPU *cpu, int verbose);
/* Opcode table for virtual insns (only used by the simulator). */
extern const struct cgen_insn cgen_virtual_opcode_table[];
#if WITH_PROFILE_SCACHE_P
#define PROFILE_COUNT_SCACHE_HIT(cpu) \
do { \
if (CPU_PROFILE_FLAGS (cpu) [PROFILE_SCACHE_IDX]) \
++ CPU_SCACHE_HITS (cpu); \
} while (0)
#define PROFILE_COUNT_SCACHE_MISS(cpu) \
do { \
if (CPU_PROFILE_FLAGS (cpu) [PROFILE_SCACHE_IDX]) \
++ CPU_SCACHE_MISSES (cpu); \
} while (0)
#else
#define PROFILE_COUNT_SCACHE_HIT(cpu)
#define PROFILE_COUNT_SCACHE_MISS(cpu)
#endif
/* -ve of indices of virtual insns in cgen_virtual_opcode_table. */
typedef enum {
VIRTUAL_INSN_X_INVALID = 0,
VIRTUAL_INSN_X_BEFORE = -1, VIRTUAL_INSN_X_AFTER = -2,
VIRTUAL_INSN_X_BEGIN = -3,
VIRTUAL_INSN_X_CHAIN= -4, VIRTUAL_INSN_X_CTI_CHAIN = -5
} CGEN_INSN_VIRTUAL_TYPE;
/* Return non-zero if OPCODE is a virtual insn. */
#define CGEN_INSN_VIRTUAL_P(opcode) \
CGEN_INSN_ATTR ((opcode), CGEN_INSN_VIRTUAL)
/* Engine support. */
/* Values to denote parallel/sequential execution. */
#define EXEC_SEQUENCE 0
#define EXEC_PARALLEL 1
/* These are used so that we can compile two copies of the semantic code,
one with full feature support and one without. */
/* FIXME: Eventually delete extraction if not using scache. */
#define EX_FN_NAME(cpu,fn) XCONCAT3 (cpu,_ex_,fn)
#define SEM_FN_NAME(cpu,fn) XCONCAT3 (cpu,_sem_,fn)
#ifdef SCACHE_P
#define CIA_ADDR(cia) (cia)
/* semantics.c support */
#define SEM_ARGBUF(sem_arg) (&(sem_arg) -> argbuf)
#define SEM_INSN(sem_arg) shouldnt_be_used
#define SEM_NEXT_PC(sc, len) ((sc) -> next)
#define SEM_BRANCH_VIA_CACHE(sc, newval) (newval)
#define SEM_BRANCH_VIA_ADDR(sc, newval) (newval)
/* Return address a branch insn will branch to.
This is only used during tracing. */
#define SEM_NEW_PC_ADDR(new_pc) (new_pc)
#else /* ! SCACHE_P */
#define CIA_ADDR(cia) (cia)
/* semantics.c support */
#define SEM_ARGBUF(sem_arg) (sem_arg)
#define SEM_INSN(sem_arg) (SEM_ARGBUF (sem_arg) -> insn)
/* FIXME:wip */
#define SEM_NEXT_PC(abuf, len) (abuf -> addr + abuf -> length)
#define SEM_BRANCH_VIA_CACHE(abuf, newval) (newval)
#define SEM_BRANCH_VIA_ADDR(abuf, newval) (newval)
#define SEM_NEW_PC_ADDR(new_pc) (new_pc)
#endif /* ! SCACHE_P */
/* GNU C's "computed goto" facility is used to speed things up where
possible. These macros provide a portable way to use them.
Nesting of these switch statements is done by providing an extra argument
that distinguishes them. `N' can be a number or symbol.
Variable `labels_##N' must be initialized with the labels of each case. */
#ifdef __GNUC__
#define SWITCH(N, X) goto *X;
#define CASE(N, X) case_##N##_##X
@ -217,11 +131,6 @@ do { \
#define DEFAULT(N) default
#define ENDSWITCH(N)
#endif
/* Engine control (FIXME). */
int engine_stop (SIM_DESC);
void engine_run (SIM_DESC, int, int);
/*void engine_resume (SIM_DESC, int, int);*/
/* Simulator state. */
@ -246,50 +155,30 @@ typedef struct cgen_state {
/* Non-zero if no tracing or profiling is selected. */
int run_fast_p;
#define STATE_RUN_FAST_P(sd) ((sd) -> cgen_state.run_fast_p)
/* Opcode table. */
CGEN_OPCODE_DESC opcode_table;
#define STATE_OPCODE_TABLE(sd) ((sd) -> cgen_state.opcode_table)
} CGEN_STATE;
/* Additional non-machine generated per-cpu data to go in SIM_CPU.
The member's name must be `cgen_cpu'. */
typedef struct {
/* Simulator's execution cache.
Allocate space for this even if not used as some simulators may have
one machine variant that uses the scache and another that doesn't and
we don't want members in this struct to move about. */
CPU_SCACHE scache;
/* Instruction descriptor table. */
IDESC *idesc;
#define CPU_IDESC(cpu) ((cpu)->cgen_cpu.idesc)
/* Whether the read,semantic entries have been initialized or not.
These are computed goto labels. */
int idesc_read_init_p;
#define CPU_IDESC_READ_INIT_P(cpu) ((cpu)->cgen_cpu.idesc_read_init_p)
int idesc_sem_init_p;
#define CPU_IDESC_SEM_INIT_P(cpu) ((cpu)->cgen_cpu.idesc_sem_init_p)
/* Function to fetch the opcode table entry in the IDESC. */
const CGEN_INSN * (*opcode) (SIM_CPU *, int);
#define CPU_OPCODE(cpu) ((cpu)->cgen_cpu.opcode)
/* Return name of instruction numbered INUM. */
#define INSN_NAME(cpu, inum) CGEN_INSN_NAME ((* CPU_OPCODE (cpu)) ((cpu), (inum)))
/* Allow slop in size calcs for case where multiple cpu types are supported
and space for the specified cpu is malloc'd at run time. */
double slop;
} CGEN_CPU;
/* Various utilities. */
/* Called after sim_post_argv_init to do any cgen initialization. */
extern void cgen_init (SIM_DESC);
/* Return the name of an insn. */
extern CPU_INSN_NAME_FN cgen_insn_name;
/* Return the maximum number of extra bytes required for a sim_cpu struct. */
/* ??? Ok, yes, this is less pretty than it should be. Give me a better
language [or suggest a better way]. */
extern int cgen_cpu_max_extra_bytes (void);
extern void
sim_disassemble_insn (SIM_CPU *, const CGEN_INSN *,
const struct argbuf *, PCADDR, char *);
/* Called to process an invalid instruction. */
extern void sim_engine_invalid_insn (SIM_CPU *, PCADDR);
#endif /* CGEN_SIM_H */

View File

@ -75,6 +75,10 @@
# -parallel: cpu can execute multiple instructions parallely
#
# This option is specified in addition to -simple, -scache, -pbb.
# Note that while the code can determine if the cpu supports parallel
# execution with HAVE_PARALLEL_INSNS [and thus this option is
# technically unnecessary], having this option cuts down on the clutter
# in the result.
#
# -switch file: specify file containing semantics implemented as a switch()
#
@ -171,11 +175,11 @@ else
fi
echo ""
echo "/* HAVE_PARALLEL_EXEC: defined if cpu can parallelly execute > 1 insn. */"
echo "/* HAVE_PARALLEL_INSNS: non-zero if cpu can parallelly execute > 1 insn. */"
if [ x$parallel = xyes ] ; then
echo "#define HAVE_PARALLEL_EXEC"
echo "#define HAVE_PARALLEL_INSNS 1"
else
echo "#undef HAVE_PARALLEL_EXEC"
echo "#define HAVE_PARALLEL_INSNS 0"
fi
if [ "x$switch" != x ] ; then
@ -197,6 +201,21 @@ if [ "x$switch" != x ] ; then
fi
fi
# Decls of functions we define.
echo ""
echo "/* Functions defined in the generated mainloop.c file"
echo " (which doesn't necessarily have that file name). */"
echo ""
echo "extern ENGINE_FN ${cpu}_engine_run_full;"
echo "extern ENGINE_FN ${cpu}_engine_run_fast;"
echo ""
echo "extern SEM_PC ${cpu}_pbb_begin (SIM_CPU *, int);"
echo "extern SEM_PC ${cpu}_pbb_chain (SIM_CPU *, SEM_ARG);"
echo "extern SEM_PC ${cpu}_pbb_cti_chain (SIM_CPU *, SEM_ARG, SEM_PC *, PCADDR);"
echo "extern void ${cpu}_pbb_before (SIM_CPU *, SCACHE *);"
echo "extern void ${cpu}_pbb_after (SIM_CPU *, SCACHE *);"
##########################################################################
rm -f tmp-mloop.cin mloop.cin