320 |
#define ASM_PREVIOUS_SECTION ".previous\n" |
#define ASM_PREVIOUS_SECTION ".previous\n" |
321 |
#endif |
#endif |
322 |
|
|
323 |
|
#define ASM_OP_LABEL_NAME(n, opname) \ |
324 |
|
ASM_NAME(__op_label) #n "." ASM_NAME(opname) |
325 |
|
|
326 |
#if defined(__powerpc__) |
#if defined(__powerpc__) |
327 |
|
|
328 |
/* we patch the jump instruction directly */ |
/* we patch the jump instruction directly */ |
329 |
#define GOTO_TB(opname, tbparam, n)\ |
#define GOTO_TB(opname, tbparam, n)\ |
330 |
do {\ |
do {\ |
331 |
asm volatile (ASM_DATA_SECTION\ |
asm volatile (ASM_DATA_SECTION\ |
332 |
ASM_NAME(__op_label) #n "." ASM_NAME(opname) ":\n"\ |
ASM_OP_LABEL_NAME(n, opname) ":\n"\ |
333 |
".long 1f\n"\ |
".long 1f\n"\ |
334 |
ASM_PREVIOUS_SECTION \ |
ASM_PREVIOUS_SECTION \ |
335 |
"b " ASM_NAME(__op_jmp) #n "\n"\ |
"b " ASM_NAME(__op_jmp) #n "\n"\ |
342 |
#define GOTO_TB(opname, tbparam, n)\ |
#define GOTO_TB(opname, tbparam, n)\ |
343 |
do {\ |
do {\ |
344 |
asm volatile (".section .data\n"\ |
asm volatile (".section .data\n"\ |
345 |
ASM_NAME(__op_label) #n "." ASM_NAME(opname) ":\n"\ |
ASM_OP_LABEL_NAME(n, opname) ":\n"\ |
346 |
".long 1f\n"\ |
".long 1f\n"\ |
347 |
ASM_PREVIOUS_SECTION \ |
ASM_PREVIOUS_SECTION \ |
348 |
"jmp " ASM_NAME(__op_jmp) #n "\n"\ |
"jmp " ASM_NAME(__op_jmp) #n "\n"\ |
356 |
#define GOTO_TB(opname, tbparam, n)\ |
#define GOTO_TB(opname, tbparam, n)\ |
357 |
do {\ |
do {\ |
358 |
static void __attribute__((unused)) *dummy ## n = &&dummy_label ## n;\ |
static void __attribute__((unused)) *dummy ## n = &&dummy_label ## n;\ |
359 |
static void __attribute__((unused)) *__op_label ## n = &&label ## n;\ |
static void __attribute__((unused)) *__op_label ## n \ |
360 |
|
__asm__(ASM_OP_LABEL_NAME(n, opname)) = &&label ## n;\ |
361 |
goto *(void *)(((TranslationBlock *)tbparam)->tb_next[n]);\ |
goto *(void *)(((TranslationBlock *)tbparam)->tb_next[n]);\ |
362 |
label ## n: ;\ |
label ## n: ;\ |
363 |
dummy_label ## n: ;\ |
dummy_label ## n: ;\ |