Commit ae063a68dc39f2ee1c87ea2a41c468ba7256acbb
1 parent
8636b5d8
generalized use of GOTO_TB() macro
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1207 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
26 additions
and
46 deletions
exec-all.h
... | ... | @@ -322,7 +322,7 @@ TranslationBlock *tb_find_pc(unsigned long pc_ptr); |
322 | 322 | #if defined(__powerpc__) |
323 | 323 | |
324 | 324 | /* we patch the jump instruction directly */ |
325 | -#define JUMP_TB(opname, tbparam, n, eip)\ | |
325 | +#define GOTO_TB(opname, tbparam, n)\ | |
326 | 326 | do {\ |
327 | 327 | asm volatile (ASM_DATA_SECTION\ |
328 | 328 | ASM_NAME(__op_label) #n "." ASM_NAME(opname) ":\n"\ |
... | ... | @@ -330,20 +330,12 @@ do {\ |
330 | 330 | ASM_PREVIOUS_SECTION \ |
331 | 331 | "b " ASM_NAME(__op_jmp) #n "\n"\ |
332 | 332 | "1:\n");\ |
333 | - T0 = (long)(tbparam) + (n);\ | |
334 | - EIP = (int32_t)eip;\ | |
335 | - EXIT_TB();\ | |
336 | -} while (0) | |
337 | - | |
338 | -#define JUMP_TB2(opname, tbparam, n)\ | |
339 | -do {\ | |
340 | - asm volatile ("b " ASM_NAME(__op_jmp) #n "\n");\ | |
341 | 333 | } while (0) |
342 | 334 | |
343 | 335 | #elif defined(__i386__) && defined(USE_DIRECT_JUMP) |
344 | 336 | |
345 | 337 | /* we patch the jump instruction directly */ |
346 | -#define GOTO_TB(opname, n)\ | |
338 | +#define GOTO_TB(opname, tbparam, n)\ | |
347 | 339 | do {\ |
348 | 340 | asm volatile (".section .data\n"\ |
349 | 341 | ASM_NAME(__op_label) #n "." ASM_NAME(opname) ":\n"\ |
... | ... | @@ -353,48 +345,30 @@ do {\ |
353 | 345 | "1:\n");\ |
354 | 346 | } while (0) |
355 | 347 | |
356 | -#define JUMP_TB(opname, tbparam, n, eip)\ | |
357 | -do {\ | |
358 | - asm volatile (".section .data\n"\ | |
359 | - ASM_NAME(__op_label) #n "." ASM_NAME(opname) ":\n"\ | |
360 | - ".long 1f\n"\ | |
361 | - ASM_PREVIOUS_SECTION \ | |
362 | - "jmp " ASM_NAME(__op_jmp) #n "\n"\ | |
363 | - "1:\n");\ | |
364 | - T0 = (long)(tbparam) + (n);\ | |
365 | - EIP = (int32_t)eip;\ | |
366 | - EXIT_TB();\ | |
367 | -} while (0) | |
368 | - | |
369 | -#define JUMP_TB2(opname, tbparam, n)\ | |
370 | -do {\ | |
371 | - asm volatile ("jmp " ASM_NAME(__op_jmp) #n "\n");\ | |
372 | -} while (0) | |
373 | - | |
374 | 348 | #else |
375 | 349 | |
376 | 350 | /* jump to next block operations (more portable code, does not need |
377 | 351 | cache flushing, but slower because of indirect jump) */ |
378 | -#define JUMP_TB(opname, tbparam, n, eip)\ | |
352 | +#define GOTO_TB(opname, tbparam, n)\ | |
379 | 353 | do {\ |
380 | - static void __attribute__((unused)) *__op_label ## n = &&label ## n;\ | |
381 | 354 | static void __attribute__((unused)) *dummy ## n = &&dummy_label ## n;\ |
355 | + static void __attribute__((unused)) *__op_label ## n = &&label ## n;\ | |
382 | 356 | goto *(void *)(((TranslationBlock *)tbparam)->tb_next[n]);\ |
383 | -label ## n:\ | |
384 | - T0 = (long)(tbparam) + (n);\ | |
385 | - EIP = (int32_t)eip;\ | |
386 | -dummy_label ## n:\ | |
387 | - EXIT_TB();\ | |
357 | +label ## n: ;\ | |
358 | +dummy_label ## n: ;\ | |
388 | 359 | } while (0) |
389 | 360 | |
390 | -/* second jump to same destination 'n' */ | |
391 | -#define JUMP_TB2(opname, tbparam, n)\ | |
361 | +#endif | |
362 | + | |
363 | +/* XXX: will be suppressed */ | |
364 | +#define JUMP_TB(opname, tbparam, n, eip)\ | |
392 | 365 | do {\ |
393 | - goto *(void *)(((TranslationBlock *)tbparam)->tb_next[n - 2]);\ | |
366 | + GOTO_TB(opname, tbparam, n);\ | |
367 | + T0 = (long)(tbparam) + (n);\ | |
368 | + EIP = (int32_t)eip;\ | |
369 | + EXIT_TB();\ | |
394 | 370 | } while (0) |
395 | 371 | |
396 | -#endif | |
397 | - | |
398 | 372 | extern CPUWriteMemoryFunc *io_mem_write[IO_MEM_NB_ENTRIES][4]; |
399 | 373 | extern CPUReadMemoryFunc *io_mem_read[IO_MEM_NB_ENTRIES][4]; |
400 | 374 | extern void *io_mem_opaque[IO_MEM_NB_ENTRIES]; | ... | ... |
target-i386/op.c
... | ... | @@ -1262,12 +1262,12 @@ void OPPROTO op_clts(void) |
1262 | 1262 | |
1263 | 1263 | void OPPROTO op_goto_tb0(void) |
1264 | 1264 | { |
1265 | - GOTO_TB(op_goto_tb0, 0); | |
1265 | + GOTO_TB(op_goto_tb0, PARAM1, 0); | |
1266 | 1266 | } |
1267 | 1267 | |
1268 | 1268 | void OPPROTO op_goto_tb1(void) |
1269 | 1269 | { |
1270 | - GOTO_TB(op_goto_tb1, 1); | |
1270 | + GOTO_TB(op_goto_tb1, PARAM1, 1); | |
1271 | 1271 | } |
1272 | 1272 | |
1273 | 1273 | void OPPROTO op_jmp_label(void) | ... | ... |
target-i386/translate.c
... | ... | @@ -61,6 +61,12 @@ static uint32_t *gen_opparam_ptr; |
61 | 61 | static int x86_64_hregs; |
62 | 62 | #endif |
63 | 63 | |
64 | +#ifdef USE_DIRECT_JUMP | |
65 | +#define TBPARAM(x) | |
66 | +#else | |
67 | +#define TBPARAM(x) (long)(x) | |
68 | +#endif | |
69 | + | |
64 | 70 | typedef struct DisasContext { |
65 | 71 | /* current insn context */ |
66 | 72 | int override; /* -1 if no override */ |
... | ... | @@ -1782,13 +1788,13 @@ static inline void gen_jcc(DisasContext *s, int b, |
1782 | 1788 | l1 = gen_new_label(); |
1783 | 1789 | func(l1); |
1784 | 1790 | |
1785 | - gen_op_goto_tb0(); | |
1791 | + gen_op_goto_tb0(TBPARAM(tb)); | |
1786 | 1792 | gen_jmp_im(next_eip); |
1787 | 1793 | gen_op_movl_T0_im((long)tb + 0); |
1788 | 1794 | gen_op_exit_tb(); |
1789 | 1795 | |
1790 | 1796 | gen_set_label(l1); |
1791 | - gen_op_goto_tb1(); | |
1797 | + gen_op_goto_tb1(TBPARAM(tb)); | |
1792 | 1798 | gen_jmp_im(val); |
1793 | 1799 | gen_op_movl_T0_im((long)tb + 1); |
1794 | 1800 | gen_op_exit_tb(); |
... | ... | @@ -2179,9 +2185,9 @@ static void gen_jmp_tb(DisasContext *s, target_ulong eip, int tb_num) |
2179 | 2185 | if (s->cc_op != CC_OP_DYNAMIC) |
2180 | 2186 | gen_op_set_cc_op(s->cc_op); |
2181 | 2187 | if (tb_num) |
2182 | - gen_op_goto_tb1(); | |
2188 | + gen_op_goto_tb1(TBPARAM(tb)); | |
2183 | 2189 | else |
2184 | - gen_op_goto_tb0(); | |
2190 | + gen_op_goto_tb0(TBPARAM(tb)); | |
2185 | 2191 | gen_jmp_im(eip); |
2186 | 2192 | gen_op_movl_T0_im((long)tb + tb_num); |
2187 | 2193 | gen_op_exit_tb(); | ... | ... |