225 |
#if defined(__powerpc__) |
#if defined(__powerpc__) |
226 |
|
|
227 |
/* on PowerPC we patch the jump instruction directly */ |
/* on PowerPC we patch the jump instruction directly */ |
228 |
#define JUMP_TB(tbparam, n, eip)\ |
#define JUMP_TB(opname, tbparam, n, eip)\ |
229 |
do {\ |
do {\ |
230 |
static void __attribute__((unused)) *__op_label ## n = &&label ## n;\ |
asm volatile (".section \".data\"\n"\ |
231 |
asm volatile ("b %0" : : "i" (&__op_jmp ## n));\ |
"__op_label" #n "." stringify(opname) ":\n"\ |
232 |
label ## n:\ |
".long 1f\n"\ |
233 |
|
".previous\n"\ |
234 |
|
"b __op_jmp" #n "\n"\ |
235 |
|
"1:\n");\ |
236 |
T0 = (long)(tbparam) + (n);\ |
T0 = (long)(tbparam) + (n);\ |
237 |
EIP = eip;\ |
EIP = eip;\ |
238 |
EXIT_TB();\ |
EXIT_TB();\ |
242 |
|
|
243 |
/* jump to next block operations (more portable code, does not need |
/* jump to next block operations (more portable code, does not need |
244 |
cache flushing, but slower because of indirect jump) */ |
cache flushing, but slower because of indirect jump) */ |
245 |
#define JUMP_TB(tbparam, n, eip)\ |
#define JUMP_TB(opname, tbparam, n, eip)\ |
246 |
do {\ |
do {\ |
247 |
static void __attribute__((unused)) *__op_label ## n = &&label ## n;\ |
static void __attribute__((unused)) *__op_label ## n = &&label ## n;\ |
248 |
static void __attribute__((unused)) *dummy ## n = &&dummy_label ## n;\ |
static void __attribute__((unused)) *dummy ## n = &&dummy_label ## n;\ |