| 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;\ |