ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/cebix/BasiliskII/src/uae_cpu/compiler/compemu.h
Revision: 1.4
Committed: 2002-10-03T15:01:53Z (22 years, 1 month ago) by gbeauche
Content type: text/plain
Branch: MAIN
Changes since 1.3: +8 -2 lines
Log Message:
Turn on block inlining so that people could test this feature and report
if they do gain something or renders JIT less stable.

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