ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/cebix/BasiliskII/src/uae_cpu/compiler/compemu.h
Revision: 1.3
Committed: 2002-10-02T15:55:10Z (22 years, 2 months ago) by gbeauche
Content type: text/plain
Branch: MAIN
Changes since 1.2: +5 -10 lines
Log Message:
- Remove dead code in readcpu.cpp concerning CONST_JUMP control flow.
- Replace unused fl_compiled with fl_const_jump
- Implement block inlining enabled with USE_INLINING && USE_CHECKSUM_INFO.
  However, this is currently disabled as it doesn't give much and exhibits
  even more a cache/code generation problem with FPU JIT compiled code.
- Actual checksum values are now integral part of a blockinfo regardless
  of USE_CHECKSUM_INFO is set or not. Reduce number of elements in that
  structure and speeds up a little calculation of checksum of chained blocks.
- Don't care about show_checksum() for now.

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