1 |
/* |
2 |
* UAE - The Un*x Amiga Emulator |
3 |
* |
4 |
* m68k -> i386 compiler |
5 |
* |
6 |
* (c) 1995 Bernd Schmidt |
7 |
*/ |
8 |
|
9 |
typedef uaecptr (*code_execfunc)(void); |
10 |
|
11 |
struct code_page { |
12 |
struct code_page *next; |
13 |
uae_u32 allocmask; |
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; |
22 |
uae_u32 page_allocmask; |
23 |
char *compile_start; |
24 |
|
25 |
int nrefs; |
26 |
|
27 |
int translated:1; |
28 |
int untranslatable:1; |
29 |
int allocfailed:1; |
30 |
}; |
31 |
|
32 |
struct hash_entry { |
33 |
code_execfunc execute; /* For the sake of the stubs in X86.S */ |
34 |
struct hash_entry *next,*prev; |
35 |
struct hash_entry *next_same_block, *lru_next, *lru_prev; |
36 |
struct hash_block *block; |
37 |
|
38 |
uaecptr addr; |
39 |
uae_u32 matchword; |
40 |
int ncalls:8; |
41 |
int locked:1; |
42 |
int cacheflush:1; |
43 |
}; |
44 |
|
45 |
extern int nr_bbs_start; |
46 |
extern uae_u8 nr_bbs_to_run; |
47 |
extern code_execfunc exec_me; |
48 |
|
49 |
#ifdef USE_COMPILER |
50 |
static __inline__ void run_compiled_code(void) |
51 |
{ |
52 |
|
53 |
/*if (regs.spcflags == SPCFLAG_EXEC && may_run_compiled) {*/ |
54 |
while (regs.spcflags == SPCFLAG_EXEC) { |
55 |
uaecptr newpc; |
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 |
} |
71 |
/*} else */ |
72 |
regs.spcflags &= ~SPCFLAG_EXEC; |
73 |
} |
74 |
|
75 |
extern void compiler_init(void); |
76 |
extern void possible_loadseg(void); |
77 |
|
78 |
extern void m68k_do_rts(void); |
79 |
extern void m68k_do_bsr(uaecptr, uae_s32); |
80 |
extern void m68k_do_jsr(uaecptr, uaecptr); |
81 |
extern void compiler_flush_jsr_stack(void); |
82 |
|
83 |
#else |
84 |
|
85 |
#define run_compiled_code() do { ; } while (0) |
86 |
#define compiler_init() do { ; } while (0) |
87 |
#define possible_loadseg() do { ; } while (0) |
88 |
#define compiler_flush_jsr_stack() do { ; } while (0) |
89 |
|
90 |
static __inline__ void m68k_do_rts(void) |
91 |
{ |
92 |
m68k_setpc(get_long(m68k_areg(regs, 7))); |
93 |
m68k_areg(regs, 7) += 4; |
94 |
} |
95 |
|
96 |
static __inline__ void m68k_do_bsr(uaecptr oldpc, uae_s32 offset) |
97 |
{ |
98 |
m68k_areg(regs, 7) -= 4; |
99 |
put_long(m68k_areg(regs, 7), oldpc); |
100 |
m68k_incpc(offset); |
101 |
} |
102 |
|
103 |
static __inline__ void m68k_do_jsr(uaecptr oldpc, uaecptr dest) |
104 |
{ |
105 |
m68k_areg(regs, 7) -= 4; |
106 |
put_long(m68k_areg(regs, 7), oldpc); |
107 |
m68k_setpc(dest); |
108 |
} |
109 |
|
110 |
#endif |