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, 2 months 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

# Content
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 /* Use chain of checksum_info_t to compute the block checksum */
41 #define USE_CHECKSUM_INFO 1
42
43 /* Use code inlining, aka follow-up of constant jumps */
44 #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
52 #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 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 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 uae_u32 c1;
521 uae_u32 c2;
522 #if USE_CHECKSUM_INFO
523 checksum_info *csi;
524 #else
525 uae_u32 len;
526 uae_u32 min_pcp;
527 #endif
528
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 */