ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/cebix/BasiliskII/src/uae_cpu/compiler/compemu.h
Revision: 1.6
Committed: 2003-03-13T15:57:01Z (21 years, 8 months ago) by gbeauche
Content type: text/plain
Branch: MAIN
Changes since 1.5: +2 -1 lines
Log Message:
Workaround change in flags handling for BSF instruction on Pentium 4.
i.e. currently disable translation of ADDX/SUBX/B<CHG,CLR,SET,TST> instructions
in that case. That is to say, better (much?) slower than inaccurate. :-(

File Contents

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