|
|
1.1.1.3 root 1: /*
1.1 root 2: * UAE - The Un*x Amiga Emulator
1.1.1.3 root 3: *
1.1 root 4: * m68k -> i386 compiler
5: *
6: * (c) 1995 Bernd Schmidt
7: */
8:
1.1.1.3 root 9: typedef uaecptr (*code_execfunc)(void);
1.1 root 10:
11: struct code_page {
12: struct code_page *next;
1.1.1.3 root 13: uae_u32 allocmask;
1.1 root 14: };
15:
16: struct hash_block {
17: struct hash_block *lru_next, *lru_prev;
18: struct hash_entry *he_first;
19:
20: struct code_page *cpage;
21: int alloclen;
1.1.1.3 root 22: uae_u32 page_allocmask;
1.1 root 23: char *compile_start;
1.1.1.3 root 24:
1.1 root 25: int nrefs;
26:
27: int translated:1;
28: int untranslatable:1;
29: int allocfailed:1;
30: };
31:
32: struct hash_entry {
1.1.1.2 root 33: code_execfunc execute; /* For the sake of the stubs in X86.S */
1.1 root 34: struct hash_entry *next,*prev;
35: struct hash_entry *next_same_block, *lru_next, *lru_prev;
36: struct hash_block *block;
1.1.1.3 root 37:
38: uaecptr addr;
39: uae_u32 matchword;
1.1 root 40: int ncalls:8;
41: int locked:1;
42: int cacheflush:1;
43: };
44:
45: extern int nr_bbs_start;
1.1.1.3 root 46: extern uae_u8 nr_bbs_to_run;
1.1 root 47: extern code_execfunc exec_me;
48:
49: #ifdef USE_COMPILER
1.1.1.4 ! root 50: STATIC_INLINE void run_compiled_code(void)
1.1 root 51: {
1.1.1.3 root 52:
53: /*if (regs.spcflags == SPCFLAG_EXEC && may_run_compiled) {*/
1.1 root 54: while (regs.spcflags == SPCFLAG_EXEC) {
1.1.1.3 root 55: uaecptr newpc;
1.1 root 56: regs.spcflags = 0;
57: /* newpc = (*exec_me)();*/
58: __asm__ __volatile__ ("pushl %%ebp; call *%1; popl %%ebp" : "=a" (newpc) : "r" (exec_me) :
59: "%eax", "%edx", "%ecx", "%ebx",
60: "%edi", "%esi", "memory", "cc");
61: if (nr_bbs_to_run == 0) {
62: struct hash_entry *h = (struct hash_entry *)newpc;
63: regs.spcflags = SPCFLAG_EXEC;
64: exec_me = h->execute;
65: regs.pc = h->addr;
66: regs.pc_p = regs.pc_oldp = get_real_address(h->addr);
67: nr_bbs_to_run = nr_bbs_start;
68: } else
69: m68k_setpc_fast(newpc);
70: do_cycles();
71: }
1.1.1.3 root 72: /*} else */
1.1 root 73: regs.spcflags &= ~SPCFLAG_EXEC;
74: }
75:
76: extern void compiler_init(void);
77: extern void possible_loadseg(void);
78:
1.1.1.2 root 79: extern void m68k_do_rts(void);
1.1.1.3 root 80: extern void m68k_do_bsr(uaecptr, uae_s32);
81: extern void m68k_do_jsr(uaecptr, uaecptr);
1.1.1.2 root 82: extern void compiler_flush_jsr_stack(void);
83:
1.1 root 84: #else
85:
1.1.1.3 root 86: #define run_compiled_code() do { ; } while (0)
87: #define compiler_init() do { ; } while (0)
88: #define possible_loadseg() do { ; } while (0)
89: #define compiler_flush_jsr_stack() do { ; } while (0)
1.1.1.2 root 90:
1.1.1.4 ! root 91: STATIC_INLINE void m68k_do_rts(void)
1.1 root 92: {
1.1.1.2 root 93: m68k_setpc(get_long(m68k_areg(regs, 7)));
94: m68k_areg(regs, 7) += 4;
1.1 root 95: }
96:
1.1.1.4 ! root 97: STATIC_INLINE void m68k_do_bsr(uaecptr oldpc, uae_s32 offset)
1.1 root 98: {
1.1.1.2 root 99: m68k_areg(regs, 7) -= 4;
100: put_long(m68k_areg(regs, 7), oldpc);
1.1.1.3 root 101: m68k_incpc(offset);
1.1 root 102: }
103:
1.1.1.4 ! root 104: STATIC_INLINE void m68k_do_jsr(uaecptr oldpc, uaecptr dest)
1.1 root 105: {
1.1.1.2 root 106: m68k_areg(regs, 7) -= 4;
107: put_long(m68k_areg(regs, 7), oldpc);
108: m68k_setpc(dest);
1.1 root 109: }
110:
111: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.