diff options
author | Jackie Smith Cashion <jsmith@redhat.com> | 1995-11-08 15:44:38 +0000 |
---|---|---|
committer | Jackie Smith Cashion <jsmith@redhat.com> | 1995-11-08 15:44:38 +0000 |
commit | 8ad577372429099494bd5681ff01fc218e00eb62 (patch) | |
tree | ee7af3b87ef8135dd8e92f19603adb340e508bb1 /sim/mips/support.h | |
parent | 9cacb47b67666166e74269fde83a0378d37059ff (diff) | |
download | binutils-8ad577372429099494bd5681ff01fc218e00eb62.zip binutils-8ad577372429099494bd5681ff01fc218e00eb62.tar.gz binutils-8ad577372429099494bd5681ff01fc218e00eb62.tar.bz2 |
Initial check-in of the MIPS simulator. Work still needs to be done on
the run-time support code (interp.c) to provide better tracing, and
also to add profiling and architecture specific support. At the moment
the simulator has a fixed size, fixed address memory area, and
simulates a subset of the IDT monitor calls (enough to execute test
programs).
The other major feature (could even be a bug) is that the simulator
makes use of the GCC "long long" extension. Work has been started to
make this a build configuration option... but there is still a lot of
this to be done.
Diffstat (limited to 'sim/mips/support.h')
-rw-r--r-- | sim/mips/support.h | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/sim/mips/support.h b/sim/mips/support.h new file mode 100644 index 0000000..e1f0176 --- /dev/null +++ b/sim/mips/support.h @@ -0,0 +1,73 @@ +/*> support.h <*/ + +#ifndef __support_h +#define __support_h + +/* For 64bit values either use the GCC "long long" feature, or have a + structure made from two 32bit values. We can then have macros for + accessing the LO and HI parts of the value. Also we can provide + macros for the basic operations we want to perform on 64bit values + (i.e. ADD64,SUB64,SHIFTLEFT64, etc.). This means we should be able + to host the simulator on non-GCC compilers, and 32bit only + architectures if desired. */ + +/* Control via a build boolean for the moment */ +#if 1 && defined(__GNUC__) + +typedef long long word64; +typedef unsigned long long uword64; + +#define WORD64LO(t) (unsigned int)((t)&0xFFFFFFFF) +#define WORD64HI(t) (unsigned int)((t)>>32) + +/* Sign-extend the given value (e) as a value (b) bits long. We cannot + assume the HI32bits of the operand are zero, so we must perform a + mask to ensure we can use the simple subtraction to sign-extend. */ +#define SIGNEXTEND(e,b) (((e) & ((unsigned long long)1 << ((b) - 1))) ? (((e) & (((unsigned long long)1 << (b)) - 1)) - ((unsigned long long)1 << (b))) : (e)) + +/* Check if a value will fit within a word (unsigned int): */ +#define NOTWORDVALUE(v) ((((((unsigned long long)(v)>>32) == 0) && !((v) & ((unsigned)1 << 31))) || ((((unsigned long long)(v)>>32) == 0xFFFFFFFF) && ((v) & ((unsigned)1 << 31)))) ? (1 == 0) : (1 == 1)) + +/* Check if a value will fit within a halfword: */ +#define NOTHALFWORDVALUE(v) ((((((unsigned long long)(v)>>16) == 0) && !((v) & ((unsigned)1 << 15))) || (((((unsigned long long)(v)>>32) == 0xFFFFFFFF) && ((((unsigned long long)(v)>>16) & 0xFFFF) == 0xFFFF)) && ((v) & ((unsigned)1 << 15)))) ? (1 == 0) : (1 == 1)) + +/* The following should be executed once at the start of day in the + main emulator control function. The simulator assumes char is + 8bits, and from this: */ +#define CHECKSIM() {\ + if (sizeof(int) != (4 * sizeof(char)))\ + SignalException(SimulatorFault,"sizeof(int) != 4");\ + if (sizeof(long long) != (8 * sizeof(char)))\ + SignalException(SimulatorFault,"sizeof(long long) != 8");\ + } + +#else /* non-GCC build */ + +#error "non-GCC build to be completed" /* avoid using long long */ + +typedef struct word64 { + unsigned int lo; + unsigned int hi; +} word64; + +#define WORD64LO(t) (unsigned int)(t.lo) +#define WORD64HI(t) (unsigned int)(t.hi) + +/* TODO: Update these to manipulate the split structure values */ +#define SIGNEXTEND(e,b) /* TODO */ +#define NOTWORDVALUE(v) /* TODO */ +#define NOTHALFWORDVALUE(v) /* TODO */ + +/* The following should be executed once at the start of day in the + main emulator control function. The simulator assumes char is + 8bits, and from this: */ +#define CHECKSIM() {\ + if (sizeof(int) != (4 * sizeof(char)))\ + SignalException(SimulatorFault,"sizeof(int) != 4");\a + } + +#endif /* non-GCC build */ + +#endif /* __support_h */ + +/*> EOF support.h <*/ |