--- uae/src/include/compiler.h 2018/04/24 16:38:39 1.1.1.1 +++ uae/src/include/compiler.h 2018/04/24 16:39:22 1.1.1.2 @@ -30,11 +30,11 @@ struct hash_block { }; struct hash_entry { + code_execfunc execute; /* For the sake of the stubs in X86.S */ struct hash_entry *next,*prev; struct hash_entry *next_same_block, *lru_next, *lru_prev; struct hash_block *block; - code_execfunc execute; CPTR addr; ULONG matchword; int ncalls:8; @@ -49,7 +49,7 @@ extern code_execfunc exec_me; #ifdef USE_COMPILER static __inline__ void run_compiled_code(void) { - if (regs.spcflags == SPCFLAG_EXEC) { + if (regs.spcflags == SPCFLAG_EXEC && may_run_compiled) { while (regs.spcflags == SPCFLAG_EXEC) { CPTR newpc; regs.spcflags = 0; @@ -75,18 +75,46 @@ static __inline__ void run_compiled_code extern void compiler_init(void); extern void possible_loadseg(void); +extern void m68k_do_rts(void); +extern void m68k_do_bsr(LONG); +extern void m68k_do_jsr(CPTR); +extern void compiler_flush_jsr_stack(void); + #else -static __inline__ void run_compiled_code(void) +#define run_compiled_code() do { } while (0) +#define compiler_init() do { } while (0) +#define possible_loadseg() do { } while (0) +#define compiler_flush_jsr_stack() do { } while (0) + +static __inline__ void m68k_do_rts(void) { + m68k_setpc(get_long(m68k_areg(regs, 7))); + m68k_areg(regs, 7) += 4; } -static __inline__ void compiler_init(void) +static __inline__ void m68k_do_bsr(LONG offset) { +#if defined(USE_POINTER) + char *oldpcp = (char *)regs.pc_p; +#endif + ULONG oldpc = m68k_getpc(); + m68k_areg(regs, 7) -= 4; + put_long(m68k_areg(regs, 7), oldpc); + +#if defined(USE_POINTER) + regs.pc_p = (UBYTE *)(oldpcp + (LONG)offset); +#else + regs.pc = oldpc + (LONG)offset; +#endif } -static __inline__ void possible_loadseg(void) +static __inline__ void m68k_do_jsr(CPTR dest) { + ULONG oldpc = m68k_getpc(); + m68k_areg(regs, 7) -= 4; + put_long(m68k_areg(regs, 7), oldpc); + m68k_setpc(dest); } #endif