322 |
#if defined(__powerpc__) |
#if defined(__powerpc__) |
323 |
|
|
324 |
/* we patch the jump instruction directly */ |
/* we patch the jump instruction directly */ |
325 |
#define JUMP_TB(opname, tbparam, n, eip)\ |
#define GOTO_TB(opname, tbparam, n)\ |
326 |
do {\ |
do {\ |
327 |
asm volatile (ASM_DATA_SECTION\ |
asm volatile (ASM_DATA_SECTION\ |
328 |
ASM_NAME(__op_label) #n "." ASM_NAME(opname) ":\n"\ |
ASM_NAME(__op_label) #n "." ASM_NAME(opname) ":\n"\ |
330 |
ASM_PREVIOUS_SECTION \ |
ASM_PREVIOUS_SECTION \ |
331 |
"b " ASM_NAME(__op_jmp) #n "\n"\ |
"b " ASM_NAME(__op_jmp) #n "\n"\ |
332 |
"1:\n");\ |
"1:\n");\ |
|
T0 = (long)(tbparam) + (n);\ |
|
|
EIP = (int32_t)eip;\ |
|
|
EXIT_TB();\ |
|
|
} while (0) |
|
|
|
|
|
#define JUMP_TB2(opname, tbparam, n)\ |
|
|
do {\ |
|
|
asm volatile ("b " ASM_NAME(__op_jmp) #n "\n");\ |
|
333 |
} while (0) |
} while (0) |
334 |
|
|
335 |
#elif defined(__i386__) && defined(USE_DIRECT_JUMP) |
#elif defined(__i386__) && defined(USE_DIRECT_JUMP) |
336 |
|
|
337 |
/* we patch the jump instruction directly */ |
/* we patch the jump instruction directly */ |
338 |
#define GOTO_TB(opname, n)\ |
#define GOTO_TB(opname, tbparam, n)\ |
339 |
do {\ |
do {\ |
340 |
asm volatile (".section .data\n"\ |
asm volatile (".section .data\n"\ |
341 |
ASM_NAME(__op_label) #n "." ASM_NAME(opname) ":\n"\ |
ASM_NAME(__op_label) #n "." ASM_NAME(opname) ":\n"\ |
345 |
"1:\n");\ |
"1:\n");\ |
346 |
} while (0) |
} while (0) |
347 |
|
|
|
#define JUMP_TB(opname, tbparam, n, eip)\ |
|
|
do {\ |
|
|
asm volatile (".section .data\n"\ |
|
|
ASM_NAME(__op_label) #n "." ASM_NAME(opname) ":\n"\ |
|
|
".long 1f\n"\ |
|
|
ASM_PREVIOUS_SECTION \ |
|
|
"jmp " ASM_NAME(__op_jmp) #n "\n"\ |
|
|
"1:\n");\ |
|
|
T0 = (long)(tbparam) + (n);\ |
|
|
EIP = (int32_t)eip;\ |
|
|
EXIT_TB();\ |
|
|
} while (0) |
|
|
|
|
|
#define JUMP_TB2(opname, tbparam, n)\ |
|
|
do {\ |
|
|
asm volatile ("jmp " ASM_NAME(__op_jmp) #n "\n");\ |
|
|
} while (0) |
|
|
|
|
348 |
#else |
#else |
349 |
|
|
350 |
/* jump to next block operations (more portable code, does not need |
/* jump to next block operations (more portable code, does not need |
351 |
cache flushing, but slower because of indirect jump) */ |
cache flushing, but slower because of indirect jump) */ |
352 |
#define JUMP_TB(opname, tbparam, n, eip)\ |
#define GOTO_TB(opname, tbparam, n)\ |
353 |
do {\ |
do {\ |
|
static void __attribute__((unused)) *__op_label ## n = &&label ## n;\ |
|
354 |
static void __attribute__((unused)) *dummy ## n = &&dummy_label ## n;\ |
static void __attribute__((unused)) *dummy ## n = &&dummy_label ## n;\ |
355 |
|
static void __attribute__((unused)) *__op_label ## n = &&label ## n;\ |
356 |
goto *(void *)(((TranslationBlock *)tbparam)->tb_next[n]);\ |
goto *(void *)(((TranslationBlock *)tbparam)->tb_next[n]);\ |
357 |
label ## n:\ |
label ## n: ;\ |
358 |
T0 = (long)(tbparam) + (n);\ |
dummy_label ## n: ;\ |
|
EIP = (int32_t)eip;\ |
|
|
dummy_label ## n:\ |
|
|
EXIT_TB();\ |
|
359 |
} while (0) |
} while (0) |
360 |
|
|
361 |
/* second jump to same destination 'n' */ |
#endif |
362 |
#define JUMP_TB2(opname, tbparam, n)\ |
|
363 |
|
/* XXX: will be suppressed */ |
364 |
|
#define JUMP_TB(opname, tbparam, n, eip)\ |
365 |
do {\ |
do {\ |
366 |
goto *(void *)(((TranslationBlock *)tbparam)->tb_next[n - 2]);\ |
GOTO_TB(opname, tbparam, n);\ |
367 |
|
T0 = (long)(tbparam) + (n);\ |
368 |
|
EIP = (int32_t)eip;\ |
369 |
|
EXIT_TB();\ |
370 |
} while (0) |
} while (0) |
371 |
|
|
|
#endif |
|
|
|
|
372 |
extern CPUWriteMemoryFunc *io_mem_write[IO_MEM_NB_ENTRIES][4]; |
extern CPUWriteMemoryFunc *io_mem_write[IO_MEM_NB_ENTRIES][4]; |
373 |
extern CPUReadMemoryFunc *io_mem_read[IO_MEM_NB_ENTRIES][4]; |
extern CPUReadMemoryFunc *io_mem_read[IO_MEM_NB_ENTRIES][4]; |
374 |
extern void *io_mem_opaque[IO_MEM_NB_ENTRIES]; |
extern void *io_mem_opaque[IO_MEM_NB_ENTRIES]; |