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

# Content
1 /*
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 #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 /* Use chain of checksum_info_t to compute the block checksum */
66 #define USE_CHECKSUM_INFO 1
67
68 /* Use code inlining, aka follow-up of constant jumps */
69 #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
77 #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 /* Set native Z flag only if register is zero */
339 DECLARE_MIDFUNC(setzflg_l(RW4 r));
340 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 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 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 uae_u32 c1;
547 uae_u32 c2;
548 #if USE_CHECKSUM_INFO
549 checksum_info *csi;
550 #else
551 uae_u32 len;
552 uae_u32 min_pcp;
553 #endif
554
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 */