aboutsummaryrefslogtreecommitdiff
path: root/SrcShared/UAE/compiler.h
diff options
context:
space:
mode:
Diffstat (limited to 'SrcShared/UAE/compiler.h')
-rw-r--r--SrcShared/UAE/compiler.h106
1 files changed, 106 insertions, 0 deletions
diff --git a/SrcShared/UAE/compiler.h b/SrcShared/UAE/compiler.h
new file mode 100644
index 0000000..7d49f2e
--- /dev/null
+++ b/SrcShared/UAE/compiler.h
@@ -0,0 +1,106 @@
+ /*
+ * UAE - The Un*x Amiga Emulator
+ *
+ * m68k -> i386 compiler
+ *
+ * (c) 1995 Bernd Schmidt
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern void Software_ProcessLINK (uae_s32 linkSize);
+extern int Software_ProcessRTS (uaecptr dest);
+extern int Software_ProcessRTE (uaecptr newpc);
+extern int Software_ProcessJSR (uaecptr oldpc, uaecptr dest);
+extern int Software_ProcessJSR_Ind (uaecptr oldpc, uaecptr dest);
+extern void Software_CheckNewPC (uaecptr newPC);
+
+extern void Software_CheckStackPointerAssignment (void);
+extern void Software_CheckStackPointerDecrement (void);
+extern void Software_CheckStackPointerIncrement (void);
+extern void Software_CheckKernelStack (void);
+
+extern uae_u32 gStackHigh;
+extern uae_u32 gStackLowWarn;
+extern uae_u32 gStackLow;
+extern uae_u32 gKernelStackOverflowed;
+
+#define CHECK_STACK_POINTER_ASSIGNMENT() \
+do { \
+ Software_CheckStackPointerAssignment (); \
+ if (gKernelStackOverflowed) \
+ Software_CheckKernelStack (); \
+} while (0)
+
+#define CHECK_STACK_POINTER_DECREMENT() \
+do { \
+ if (m68k_areg (regs, 7) < gStackLowWarn) \
+ Software_CheckStackPointerDecrement (); \
+ if (gKernelStackOverflowed) \
+ Software_CheckKernelStack (); \
+} while (0)
+
+#define CHECK_STACK_POINTER_INCREMENT() \
+do { \
+ if (m68k_areg (regs, 7) > gStackHigh) \
+ Software_CheckStackPointerIncrement (); \
+ if (gKernelStackOverflowed) \
+ Software_CheckKernelStack (); \
+} while (0)
+
+// Called in RTD handler
+#define compiler_flush_jsr_stack() do { ; } while (0)
+
+STATIC_INLINE void m68k_do_rts(void)
+{
+ uaecptr returnAddr = get_long (m68k_areg (regs, 7));
+ if (Software_ProcessRTS (returnAddr))
+ return;
+
+ m68k_setpc(returnAddr);
+ m68k_areg(regs, 7) += 4;
+}
+
+STATIC_INLINE void m68k_do_rte(uaecptr newpc)
+{
+ if (Software_ProcessRTE(newpc))
+ return;
+
+ m68k_setpc_rte(newpc);
+}
+
+STATIC_INLINE void m68k_do_bsr(uaecptr oldpc, uae_s32 offset)
+{
+ /* CHANGED BY B. CAMERON LESIUK
+ * 19 Jan 2001
+ * Made this modification so that BSRs cause the profiler to
+ * track function calls properly.
+ */
+// Software_CheckNewPC (m68k_getpc () + offset);
+
+ if (Software_ProcessJSR (oldpc, m68k_getpc () + offset))
+ return;
+
+ m68k_areg(regs, 7) -= 4;
+ Software_CheckStackPointerDecrement ();
+ put_long(m68k_areg(regs, 7), oldpc);
+ m68k_incpc(offset);
+}
+
+STATIC_INLINE void m68k_do_jsr(uaecptr oldpc, uaecptr dest)
+{
+ if (Software_ProcessJSR (oldpc, dest))
+ return;
+
+ m68k_areg(regs, 7) -= 4;
+ Software_CheckStackPointerDecrement ();
+ put_long(m68k_areg(regs, 7), oldpc);
+ m68k_setpc(dest);
+}
+
+#ifdef __cplusplus
+}
+#endif
+