diff options
Diffstat (limited to 'SrcShared/UAE/compiler.h')
-rw-r--r-- | SrcShared/UAE/compiler.h | 106 |
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 + |