ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/cebix/BasiliskII/src/uae_cpu/compiler/compemu.h
Revision: 1.1
Committed: 2002-09-17T16:04:06Z (22 years, 2 months ago) by gbeauche
Content type: text/plain
Branch: MAIN
Log Message:
Import JIT compiler

File Contents

# User Rev Content
1 gbeauche 1.1 #ifndef COMPEMU_H
2     #define COMPEMU_H
3    
4     #include "newcpu.h"
5    
6     #if USE_JIT
7    
8     #if JIT_DEBUG
9     /* dump some information (m68k block, x86 block addresses) about the compiler state */
10     extern void compiler_dumpstate(void);
11     #endif
12    
13     /* Now that we do block chaining, and also have linked lists on each tag,
14     TAGMASK can be much smaller and still do its job. Saves several megs
15     of memory! */
16     #define TAGMASK 0x0000ffff
17     #define TAGSIZE (TAGMASK+1)
18     #define MAXRUN 1024
19     #define cacheline(x) (((uae_u32)x)&TAGMASK)
20    
21     extern uae_u8* start_pc_p;
22     extern uae_u32 start_pc;
23    
24     struct blockinfo_t;
25    
26     struct cpu_history {
27     uae_u16 * location;
28     };
29    
30     union cacheline {
31     cpuop_func * handler;
32     blockinfo_t * bi;
33     };
34    
35     /* (gb) When on, this option can save save up to 30% compilation time
36     * when many lazy flushes occur (e.g. apps in MacOS 8.x).
37     */
38     #define USE_SEPARATE_BIA 1
39    
40     #define USE_F_ALIAS 1
41     #define USE_OFFSET 1
42     #define COMP_DEBUG 1
43    
44     #if COMP_DEBUG
45     #define Dif(x) if (x)
46     #else
47     #define Dif(x) if (0)
48     #endif
49    
50     #define SCALE 2
51    
52     #define BYTES_PER_INST 10240 /* paranoid ;-) */
53     #define LONGEST_68K_INST 16 /* The number of bytes the longest possible
54     68k instruction takes */
55     #define MAX_CHECKSUM_LEN 2048 /* The maximum size we calculate checksums
56     for. Anything larger will be flushed
57     unconditionally even with SOFT_FLUSH */
58     #define MAX_HOLD_BI 3 /* One for the current block, and up to two
59     for jump targets */
60    
61     #define INDIVIDUAL_INST 0
62     #if 1
63     // gb-- my format from readcpu.cpp is not the same
64     #define FLAG_X 0x0010
65     #define FLAG_N 0x0008
66     #define FLAG_Z 0x0004
67     #define FLAG_V 0x0002
68     #define FLAG_C 0x0001
69     #else
70     #define FLAG_C 0x0010
71     #define FLAG_V 0x0008
72     #define FLAG_Z 0x0004
73     #define FLAG_N 0x0002
74     #define FLAG_X 0x0001
75     #endif
76     #define FLAG_CZNV (FLAG_C | FLAG_Z | FLAG_N | FLAG_V)
77     #define FLAG_ZNV (FLAG_Z | FLAG_N | FLAG_V)
78    
79     #define KILLTHERAT 1 /* Set to 1 to avoid some partial_rat_stalls */
80    
81     /* Whether to preserve registers across calls to JIT compiled routines */
82     #ifdef X86_ASSEMBLY
83     #define USE_PUSH_POP 0
84     #else
85     #define USE_PUSH_POP 1
86     #endif
87    
88     #define N_REGS 8 /* really only 7, but they are numbered 0,1,2,3,5,6,7 */
89     #define N_FREGS 6 /* That leaves us two positions on the stack to play with */
90    
91     /* Functions exposed to newcpu, or to what was moved from newcpu.c to
92     * compemu_support.c */
93     extern void compiler_init(void);
94     extern void compiler_exit(void);
95     extern bool compiler_use_jit(void);
96     extern void init_comp(void);
97     extern void flush(int save_regs);
98     extern void small_flush(int save_regs);
99     extern void set_target(uae_u8* t);
100     extern uae_u8* get_target(void);
101     extern void freescratch(void);
102     extern void build_comp(void);
103     extern void set_cache_state(int enabled);
104     extern int get_cache_state(void);
105     extern uae_u32 get_jitted_size(void);
106     extern void (*flush_icache)(int n);
107     extern void alloc_cache(void);
108     extern int check_for_cache_miss(void);
109    
110     /* JIT FPU compilation */
111     extern void comp_fpp_opp (uae_u32 opcode, uae_u16 extra);
112     extern void comp_fbcc_opp (uae_u32 opcode);
113     extern void comp_fscc_opp (uae_u32 opcode, uae_u16 extra);
114    
115     extern uae_u32 needed_flags;
116     extern cacheline cache_tags[];
117     extern uae_u8* comp_pc_p;
118     extern void* pushall_call_handler;
119    
120     #define VREGS 32
121     #define VFREGS 16
122    
123     #define INMEM 1
124     #define CLEAN 2
125     #define DIRTY 3
126     #define UNDEF 4
127     #define ISCONST 5
128    
129     typedef struct {
130     uae_u32* mem;
131     uae_u32 val;
132     uae_u8 is_swapped;
133     uae_u8 status;
134     uae_s8 realreg; /* gb-- realreg can hold -1 */
135     uae_u8 realind; /* The index in the holds[] array */
136     uae_u8 needflush;
137     uae_u8 validsize;
138     uae_u8 dirtysize;
139     uae_u8 dummy;
140     } reg_status;
141    
142     typedef struct {
143     uae_u32* mem;
144     double val;
145     uae_u8 status;
146     uae_s8 realreg; /* gb-- realreg can hold -1 */
147     uae_u8 realind;
148     uae_u8 needflush;
149     } freg_status;
150    
151     #define PC_P 16
152     #define FLAGX 17
153     #define FLAGTMP 18
154     #define NEXT_HANDLER 19
155     #define S1 20
156     #define S2 21
157     #define S3 22
158     #define S4 23
159     #define S5 24
160     #define S6 25
161     #define S7 26
162     #define S8 27
163     #define S9 28
164     #define S10 29
165     #define S11 30
166     #define S12 31
167    
168     #define FP_RESULT 8
169     #define FS1 9
170     #define FS2 10
171     #define FS3 11
172    
173     typedef struct {
174     uae_u32 touched;
175     uae_s8 holds[VREGS];
176     uae_u8 nholds;
177     uae_u8 canbyte;
178     uae_u8 canword;
179     uae_u8 locked;
180     } n_status;
181    
182     typedef struct {
183     uae_u32 touched;
184     uae_s8 holds[VFREGS];
185     uae_u8 nholds;
186     uae_u8 locked;
187     } fn_status;
188    
189     /* For flag handling */
190     #define NADA 1
191     #define TRASH 2
192     #define VALID 3
193    
194     /* needflush values */
195     #define NF_SCRATCH 0
196     #define NF_TOMEM 1
197     #define NF_HANDLER 2
198    
199     typedef struct {
200     /* Integer part */
201     reg_status state[VREGS];
202     n_status nat[N_REGS];
203     uae_u32 flags_on_stack;
204     uae_u32 flags_in_flags;
205     uae_u32 flags_are_important;
206     /* FPU part */
207     freg_status fate[VFREGS];
208     fn_status fat[N_FREGS];
209    
210     /* x86 FPU part */
211     uae_s8 spos[N_FREGS];
212     uae_s8 onstack[6];
213     uae_s8 tos;
214     } bigstate;
215    
216     typedef struct {
217     /* Integer part */
218     char virt[VREGS];
219     char nat[N_REGS];
220     } smallstate;
221    
222     extern bigstate live;
223     extern int touchcnt;
224    
225    
226     #define IMM uae_s32
227     #define R1 uae_u32
228     #define R2 uae_u32
229     #define R4 uae_u32
230     #define W1 uae_u32
231     #define W2 uae_u32
232     #define W4 uae_u32
233     #define RW1 uae_u32
234     #define RW2 uae_u32
235     #define RW4 uae_u32
236     #define MEMR uae_u32
237     #define MEMW uae_u32
238     #define MEMRW uae_u32
239    
240     #define FW uae_u32
241     #define FR uae_u32
242     #define FRW uae_u32
243    
244     #define MIDFUNC(nargs,func,args) void func args
245     #define MENDFUNC(nargs,func,args)
246     #define COMPCALL(func) func
247    
248     #define LOWFUNC(flags,mem,nargs,func,args) static __inline__ void func args
249     #define LENDFUNC(flags,mem,nargs,func,args)
250    
251     /* What we expose to the outside */
252     #define DECLARE_MIDFUNC(func) extern void func
253     DECLARE_MIDFUNC(bt_l_ri(R4 r, IMM i));
254     DECLARE_MIDFUNC(bt_l_rr(R4 r, R4 b));
255     DECLARE_MIDFUNC(btc_l_ri(RW4 r, IMM i));
256     DECLARE_MIDFUNC(btc_l_rr(RW4 r, R4 b));
257     DECLARE_MIDFUNC(bts_l_ri(RW4 r, IMM i));
258     DECLARE_MIDFUNC(bts_l_rr(RW4 r, R4 b));
259     DECLARE_MIDFUNC(btr_l_ri(RW4 r, IMM i));
260     DECLARE_MIDFUNC(btr_l_rr(RW4 r, R4 b));
261     DECLARE_MIDFUNC(mov_l_rm(W4 d, IMM s));
262     DECLARE_MIDFUNC(call_r(R4 r));
263     DECLARE_MIDFUNC(sub_l_mi(IMM d, IMM s));
264     DECLARE_MIDFUNC(mov_l_mi(IMM d, IMM s));
265     DECLARE_MIDFUNC(mov_w_mi(IMM d, IMM s));
266     DECLARE_MIDFUNC(mov_b_mi(IMM d, IMM s));
267     DECLARE_MIDFUNC(rol_b_ri(RW1 r, IMM i));
268     DECLARE_MIDFUNC(rol_w_ri(RW2 r, IMM i));
269     DECLARE_MIDFUNC(rol_l_ri(RW4 r, IMM i));
270     DECLARE_MIDFUNC(rol_l_rr(RW4 d, R1 r));
271     DECLARE_MIDFUNC(rol_w_rr(RW2 d, R1 r));
272     DECLARE_MIDFUNC(rol_b_rr(RW1 d, R1 r));
273     DECLARE_MIDFUNC(shll_l_rr(RW4 d, R1 r));
274     DECLARE_MIDFUNC(shll_w_rr(RW2 d, R1 r));
275     DECLARE_MIDFUNC(shll_b_rr(RW1 d, R1 r));
276     DECLARE_MIDFUNC(ror_b_ri(R1 r, IMM i));
277     DECLARE_MIDFUNC(ror_w_ri(R2 r, IMM i));
278     DECLARE_MIDFUNC(ror_l_ri(R4 r, IMM i));
279     DECLARE_MIDFUNC(ror_l_rr(R4 d, R1 r));
280     DECLARE_MIDFUNC(ror_w_rr(R2 d, R1 r));
281     DECLARE_MIDFUNC(ror_b_rr(R1 d, R1 r));
282     DECLARE_MIDFUNC(shrl_l_rr(RW4 d, R1 r));
283     DECLARE_MIDFUNC(shrl_w_rr(RW2 d, R1 r));
284     DECLARE_MIDFUNC(shrl_b_rr(RW1 d, R1 r));
285     DECLARE_MIDFUNC(shra_l_rr(RW4 d, R1 r));
286     DECLARE_MIDFUNC(shra_w_rr(RW2 d, R1 r));
287     DECLARE_MIDFUNC(shra_b_rr(RW1 d, R1 r));
288     DECLARE_MIDFUNC(shll_l_ri(RW4 r, IMM i));
289     DECLARE_MIDFUNC(shll_w_ri(RW2 r, IMM i));
290     DECLARE_MIDFUNC(shll_b_ri(RW1 r, IMM i));
291     DECLARE_MIDFUNC(shrl_l_ri(RW4 r, IMM i));
292     DECLARE_MIDFUNC(shrl_w_ri(RW2 r, IMM i));
293     DECLARE_MIDFUNC(shrl_b_ri(RW1 r, IMM i));
294     DECLARE_MIDFUNC(shra_l_ri(RW4 r, IMM i));
295     DECLARE_MIDFUNC(shra_w_ri(RW2 r, IMM i));
296     DECLARE_MIDFUNC(shra_b_ri(RW1 r, IMM i));
297     DECLARE_MIDFUNC(setcc(W1 d, IMM cc));
298     DECLARE_MIDFUNC(setcc_m(IMM d, IMM cc));
299     DECLARE_MIDFUNC(cmov_l_rr(RW4 d, R4 s, IMM cc));
300     DECLARE_MIDFUNC(cmov_l_rm(RW4 d, IMM s, IMM cc));
301     DECLARE_MIDFUNC(bsf_l_rr(W4 d, R4 s));
302     DECLARE_MIDFUNC(pop_m(IMM d));
303     DECLARE_MIDFUNC(push_m(IMM d));
304     DECLARE_MIDFUNC(pop_l(W4 d));
305     DECLARE_MIDFUNC(push_l_i(IMM i));
306     DECLARE_MIDFUNC(push_l(R4 s));
307     DECLARE_MIDFUNC(clear_16(RW4 r));
308     DECLARE_MIDFUNC(clear_8(RW4 r));
309     DECLARE_MIDFUNC(sign_extend_16_rr(W4 d, R2 s));
310     DECLARE_MIDFUNC(sign_extend_8_rr(W4 d, R1 s));
311     DECLARE_MIDFUNC(zero_extend_16_rr(W4 d, R2 s));
312     DECLARE_MIDFUNC(zero_extend_8_rr(W4 d, R1 s));
313     DECLARE_MIDFUNC(imul_64_32(RW4 d, RW4 s));
314     DECLARE_MIDFUNC(mul_64_32(RW4 d, RW4 s));
315     DECLARE_MIDFUNC(imul_32_32(RW4 d, R4 s));
316     DECLARE_MIDFUNC(mul_32_32(RW4 d, R4 s));
317     DECLARE_MIDFUNC(mov_b_rr(W1 d, R1 s));
318     DECLARE_MIDFUNC(mov_w_rr(W2 d, R2 s));
319     DECLARE_MIDFUNC(mov_l_rrm_indexed(W4 d,R4 baser, R4 index, IMM factor));
320     DECLARE_MIDFUNC(mov_w_rrm_indexed(W2 d, R4 baser, R4 index, IMM factor));
321     DECLARE_MIDFUNC(mov_b_rrm_indexed(W1 d, R4 baser, R4 index, IMM factor));
322     DECLARE_MIDFUNC(mov_l_mrr_indexed(R4 baser, R4 index, IMM factor, R4 s));
323     DECLARE_MIDFUNC(mov_w_mrr_indexed(R4 baser, R4 index, IMM factor, R2 s));
324     DECLARE_MIDFUNC(mov_b_mrr_indexed(R4 baser, R4 index, IMM factor, R1 s));
325     DECLARE_MIDFUNC(mov_l_bmrr_indexed(IMM base, R4 baser, R4 index, IMM factor, R4 s));
326     DECLARE_MIDFUNC(mov_w_bmrr_indexed(IMM base, R4 baser, R4 index, IMM factor, R2 s));
327     DECLARE_MIDFUNC(mov_b_bmrr_indexed(IMM base, R4 baser, R4 index, IMM factor, R1 s));
328     DECLARE_MIDFUNC(mov_l_brrm_indexed(W4 d, IMM base, R4 baser, R4 index, IMM factor));
329     DECLARE_MIDFUNC(mov_w_brrm_indexed(W2 d, IMM base, R4 baser, R4 index, IMM factor));
330     DECLARE_MIDFUNC(mov_b_brrm_indexed(W1 d, IMM base, R4 baser, R4 index, IMM factor));
331     DECLARE_MIDFUNC(mov_l_rm_indexed(W4 d, IMM base, R4 index, IMM factor));
332     DECLARE_MIDFUNC(mov_l_rR(W4 d, R4 s, IMM offset));
333     DECLARE_MIDFUNC(mov_w_rR(W2 d, R4 s, IMM offset));
334     DECLARE_MIDFUNC(mov_b_rR(W1 d, R4 s, IMM offset));
335     DECLARE_MIDFUNC(mov_l_brR(W4 d, R4 s, IMM offset));
336     DECLARE_MIDFUNC(mov_w_brR(W2 d, R4 s, IMM offset));
337     DECLARE_MIDFUNC(mov_b_brR(W1 d, R4 s, IMM offset));
338     DECLARE_MIDFUNC(mov_l_Ri(R4 d, IMM i, IMM offset));
339     DECLARE_MIDFUNC(mov_w_Ri(R4 d, IMM i, IMM offset));
340     DECLARE_MIDFUNC(mov_b_Ri(R4 d, IMM i, IMM offset));
341     DECLARE_MIDFUNC(mov_l_Rr(R4 d, R4 s, IMM offset));
342     DECLARE_MIDFUNC(mov_w_Rr(R4 d, R2 s, IMM offset));
343     DECLARE_MIDFUNC(mov_b_Rr(R4 d, R1 s, IMM offset));
344     DECLARE_MIDFUNC(lea_l_brr(W4 d, R4 s, IMM offset));
345     DECLARE_MIDFUNC(lea_l_brr_indexed(W4 d, R4 s, R4 index, IMM factor, IMM offset));
346     DECLARE_MIDFUNC(lea_l_rr_indexed(W4 d, R4 s, R4 index, IMM factor));
347     DECLARE_MIDFUNC(mov_l_bRr(R4 d, R4 s, IMM offset));
348     DECLARE_MIDFUNC(mov_w_bRr(R4 d, R2 s, IMM offset));
349     DECLARE_MIDFUNC(mov_b_bRr(R4 d, R1 s, IMM offset));
350     DECLARE_MIDFUNC(bswap_32(RW4 r));
351     DECLARE_MIDFUNC(bswap_16(RW2 r));
352     DECLARE_MIDFUNC(mov_l_rr(W4 d, R4 s));
353     DECLARE_MIDFUNC(mov_l_mr(IMM d, R4 s));
354     DECLARE_MIDFUNC(mov_w_mr(IMM d, R2 s));
355     DECLARE_MIDFUNC(mov_w_rm(W2 d, IMM s));
356     DECLARE_MIDFUNC(mov_b_mr(IMM d, R1 s));
357     DECLARE_MIDFUNC(mov_b_rm(W1 d, IMM s));
358     DECLARE_MIDFUNC(mov_l_ri(W4 d, IMM s));
359     DECLARE_MIDFUNC(mov_w_ri(W2 d, IMM s));
360     DECLARE_MIDFUNC(mov_b_ri(W1 d, IMM s));
361     DECLARE_MIDFUNC(add_l_mi(IMM d, IMM s) );
362     DECLARE_MIDFUNC(add_w_mi(IMM d, IMM s) );
363     DECLARE_MIDFUNC(add_b_mi(IMM d, IMM s) );
364     DECLARE_MIDFUNC(test_l_ri(R4 d, IMM i));
365     DECLARE_MIDFUNC(test_l_rr(R4 d, R4 s));
366     DECLARE_MIDFUNC(test_w_rr(R2 d, R2 s));
367     DECLARE_MIDFUNC(test_b_rr(R1 d, R1 s));
368     DECLARE_MIDFUNC(and_l_ri(RW4 d, IMM i));
369     DECLARE_MIDFUNC(and_l(RW4 d, R4 s));
370     DECLARE_MIDFUNC(and_w(RW2 d, R2 s));
371     DECLARE_MIDFUNC(and_b(RW1 d, R1 s));
372     DECLARE_MIDFUNC(or_l_rm(RW4 d, IMM s));
373     DECLARE_MIDFUNC(or_l_ri(RW4 d, IMM i));
374     DECLARE_MIDFUNC(or_l(RW4 d, R4 s));
375     DECLARE_MIDFUNC(or_w(RW2 d, R2 s));
376     DECLARE_MIDFUNC(or_b(RW1 d, R1 s));
377     DECLARE_MIDFUNC(adc_l(RW4 d, R4 s));
378     DECLARE_MIDFUNC(adc_w(RW2 d, R2 s));
379     DECLARE_MIDFUNC(adc_b(RW1 d, R1 s));
380     DECLARE_MIDFUNC(add_l(RW4 d, R4 s));
381     DECLARE_MIDFUNC(add_w(RW2 d, R2 s));
382     DECLARE_MIDFUNC(add_b(RW1 d, R1 s));
383     DECLARE_MIDFUNC(sub_l_ri(RW4 d, IMM i));
384     DECLARE_MIDFUNC(sub_w_ri(RW2 d, IMM i));
385     DECLARE_MIDFUNC(sub_b_ri(RW1 d, IMM i));
386     DECLARE_MIDFUNC(add_l_ri(RW4 d, IMM i));
387     DECLARE_MIDFUNC(add_w_ri(RW2 d, IMM i));
388     DECLARE_MIDFUNC(add_b_ri(RW1 d, IMM i));
389     DECLARE_MIDFUNC(sbb_l(RW4 d, R4 s));
390     DECLARE_MIDFUNC(sbb_w(RW2 d, R2 s));
391     DECLARE_MIDFUNC(sbb_b(RW1 d, R1 s));
392     DECLARE_MIDFUNC(sub_l(RW4 d, R4 s));
393     DECLARE_MIDFUNC(sub_w(RW2 d, R2 s));
394     DECLARE_MIDFUNC(sub_b(RW1 d, R1 s));
395     DECLARE_MIDFUNC(cmp_l(R4 d, R4 s));
396     DECLARE_MIDFUNC(cmp_l_ri(R4 r, IMM i));
397     DECLARE_MIDFUNC(cmp_w(R2 d, R2 s));
398     DECLARE_MIDFUNC(cmp_b(R1 d, R1 s));
399     DECLARE_MIDFUNC(xor_l(RW4 d, R4 s));
400     DECLARE_MIDFUNC(xor_w(RW2 d, R2 s));
401     DECLARE_MIDFUNC(xor_b(RW1 d, R1 s));
402     DECLARE_MIDFUNC(live_flags(void));
403     DECLARE_MIDFUNC(dont_care_flags(void));
404     DECLARE_MIDFUNC(duplicate_carry(void));
405     DECLARE_MIDFUNC(restore_carry(void));
406     DECLARE_MIDFUNC(start_needflags(void));
407     DECLARE_MIDFUNC(end_needflags(void));
408     DECLARE_MIDFUNC(make_flags_live(void));
409     DECLARE_MIDFUNC(call_r_11(R4 r, W4 out1, R4 in1, IMM osize, IMM isize));
410     DECLARE_MIDFUNC(call_r_02(R4 r, R4 in1, R4 in2, IMM isize1, IMM isize2));
411     DECLARE_MIDFUNC(forget_about(W4 r));
412     DECLARE_MIDFUNC(nop(void));
413    
414     DECLARE_MIDFUNC(f_forget_about(FW r));
415     DECLARE_MIDFUNC(fmov_pi(FW r));
416     DECLARE_MIDFUNC(fmov_log10_2(FW r));
417     DECLARE_MIDFUNC(fmov_log2_e(FW r));
418     DECLARE_MIDFUNC(fmov_loge_2(FW r));
419     DECLARE_MIDFUNC(fmov_1(FW r));
420     DECLARE_MIDFUNC(fmov_0(FW r));
421     DECLARE_MIDFUNC(fmov_rm(FW r, MEMR m));
422     DECLARE_MIDFUNC(fmovi_rm(FW r, MEMR m));
423     DECLARE_MIDFUNC(fmovi_mr(MEMW m, FR r));
424     DECLARE_MIDFUNC(fmovs_rm(FW r, MEMR m));
425     DECLARE_MIDFUNC(fmovs_mr(MEMW m, FR r));
426     DECLARE_MIDFUNC(fmov_mr(MEMW m, FR r));
427     DECLARE_MIDFUNC(fmov_ext_mr(MEMW m, FR r));
428     DECLARE_MIDFUNC(fmov_ext_rm(FW r, MEMR m));
429     DECLARE_MIDFUNC(fmov_rr(FW d, FR s));
430     DECLARE_MIDFUNC(fldcw_m_indexed(R4 index, IMM base));
431     DECLARE_MIDFUNC(ftst_r(FR r));
432     DECLARE_MIDFUNC(dont_care_fflags(void));
433     DECLARE_MIDFUNC(fsqrt_rr(FW d, FR s));
434     DECLARE_MIDFUNC(fabs_rr(FW d, FR s));
435     DECLARE_MIDFUNC(frndint_rr(FW d, FR s));
436     DECLARE_MIDFUNC(fsin_rr(FW d, FR s));
437     DECLARE_MIDFUNC(fcos_rr(FW d, FR s));
438     DECLARE_MIDFUNC(ftwotox_rr(FW d, FR s));
439     DECLARE_MIDFUNC(fetox_rr(FW d, FR s));
440     DECLARE_MIDFUNC(flog2_rr(FW d, FR s));
441     DECLARE_MIDFUNC(fneg_rr(FW d, FR s));
442     DECLARE_MIDFUNC(fadd_rr(FRW d, FR s));
443     DECLARE_MIDFUNC(fsub_rr(FRW d, FR s));
444     DECLARE_MIDFUNC(fmul_rr(FRW d, FR s));
445     DECLARE_MIDFUNC(frem_rr(FRW d, FR s));
446     DECLARE_MIDFUNC(frem1_rr(FRW d, FR s));
447     DECLARE_MIDFUNC(fdiv_rr(FRW d, FR s));
448     DECLARE_MIDFUNC(fcmp_rr(FR d, FR s));
449     DECLARE_MIDFUNC(fflags_into_flags(W2 tmp));
450     #undef DECLARE_MIDFUNC
451    
452     extern int failure;
453     #define FAIL(x) do { failure|=x; } while (0)
454    
455     /* Convenience functions exposed to gencomp */
456     extern uae_u32 m68k_pc_offset;
457     extern void readbyte(int address, int dest, int tmp);
458     extern void readword(int address, int dest, int tmp);
459     extern void readlong(int address, int dest, int tmp);
460     extern void writebyte(int address, int source, int tmp);
461     extern void writeword(int address, int source, int tmp);
462     extern void writelong(int address, int source, int tmp);
463     extern void writeword_clobber(int address, int source, int tmp);
464     extern void writelong_clobber(int address, int source, int tmp);
465     extern void get_n_addr(int address, int dest, int tmp);
466     extern void get_n_addr_jmp(int address, int dest, int tmp);
467     extern void calc_disp_ea_020(int base, uae_u32 dp, int target, int tmp);
468     extern int kill_rodent(int r);
469     extern void sync_m68k_pc(void);
470     extern uae_u32 get_const(int r);
471     extern int is_const(int r);
472     extern void register_branch(uae_u32 not_taken, uae_u32 taken, uae_u8 cond);
473    
474     #define comp_get_ibyte(o) do_get_mem_byte((uae_u8 *)(comp_pc_p + (o) + 1))
475     #define comp_get_iword(o) do_get_mem_word((uae_u16 *)(comp_pc_p + (o)))
476     #define comp_get_ilong(o) do_get_mem_long((uae_u32 *)(comp_pc_p + (o)))
477    
478     struct blockinfo_t;
479    
480     typedef struct dep_t {
481     uintptr* jmp_off;
482     struct blockinfo_t* target;
483     struct blockinfo_t* source;
484     struct dep_t** prev_p;
485     struct dep_t* next;
486     } dependency;
487    
488     typedef struct blockinfo_t {
489     uae_s32 count;
490     cpuop_func* direct_handler_to_use;
491     cpuop_func* handler_to_use;
492     /* The direct handler does not check for the correct address */
493    
494     cpuop_func* handler;
495     cpuop_func* direct_handler;
496    
497     cpuop_func* direct_pen;
498     cpuop_func* direct_pcc;
499    
500     uae_u8* nexthandler;
501     uae_u8* pc_p;
502    
503     uae_u32 c1;
504     uae_u32 c2;
505     uae_u32 len;
506    
507     struct blockinfo_t* next_same_cl;
508     struct blockinfo_t** prev_same_cl_p;
509     struct blockinfo_t* next;
510     struct blockinfo_t** prev_p;
511    
512     uae_u32 min_pcp;
513     uae_u8 optlevel;
514     uae_u8 needed_flags;
515     uae_u8 status;
516     uae_u8 havestate;
517    
518     dependency dep[2]; /* Holds things we depend on */
519     dependency* deplist; /* List of things that depend on this */
520     smallstate env;
521    
522     #if JIT_DEBUG
523     /* (gb) size of the compiled block (direct handler) */
524     uae_u32 direct_handler_size;
525     #endif
526     } blockinfo;
527    
528     #define BI_INVALID 0
529     #define BI_ACTIVE 1
530     #define BI_NEED_RECOMP 2
531     #define BI_NEED_CHECK 3
532     #define BI_CHECKING 4
533     #define BI_COMPILING 5
534     #define BI_FINALIZING 6
535    
536     void execute_normal(void);
537     void exec_nostats(void);
538     void do_nothing(void);
539    
540     #else
541    
542     static __inline__ void flush_icache(int) { }
543     static __inline__ void build_comp() { }
544    
545     #endif /* !USE_JIT */
546    
547     #endif /* COMPEMU_H */