aboutsummaryrefslogtreecommitdiff
path: root/sim/mips/support.h
diff options
context:
space:
mode:
authorJackie Smith Cashion <jsmith@redhat.com>1995-11-08 15:44:38 +0000
committerJackie Smith Cashion <jsmith@redhat.com>1995-11-08 15:44:38 +0000
commit8ad577372429099494bd5681ff01fc218e00eb62 (patch)
treeee7af3b87ef8135dd8e92f19603adb340e508bb1 /sim/mips/support.h
parent9cacb47b67666166e74269fde83a0378d37059ff (diff)
downloadbinutils-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.h73
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 <*/