mirror of https://gitee.com/openkylin/qemu.git
workaround for gcc 3.3 bug or overoptimisation if a label is not used
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@368 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
parent
70a194b930
commit
9257a9e49c
13
exec.h
13
exec.h
|
@ -225,11 +225,14 @@ TranslationBlock *tb_find_pc(unsigned long pc_ptr);
|
||||||
#if defined(__powerpc__)
|
#if defined(__powerpc__)
|
||||||
|
|
||||||
/* on PowerPC we patch the jump instruction directly */
|
/* on PowerPC we patch the jump instruction directly */
|
||||||
#define JUMP_TB(tbparam, n, eip)\
|
#define JUMP_TB(opname, tbparam, n, eip)\
|
||||||
do {\
|
do {\
|
||||||
static void __attribute__((unused)) *__op_label ## n = &&label ## n;\
|
asm volatile (".section \".data\"\n"\
|
||||||
asm volatile ("b %0" : : "i" (&__op_jmp ## n));\
|
"__op_label" #n "." stringify(opname) ":\n"\
|
||||||
label ## n:\
|
".long 1f\n"\
|
||||||
|
".previous\n"\
|
||||||
|
"b __op_jmp" #n "\n"\
|
||||||
|
"1:\n");\
|
||||||
T0 = (long)(tbparam) + (n);\
|
T0 = (long)(tbparam) + (n);\
|
||||||
EIP = eip;\
|
EIP = eip;\
|
||||||
EXIT_TB();\
|
EXIT_TB();\
|
||||||
|
@ -239,7 +242,7 @@ label ## n:\
|
||||||
|
|
||||||
/* jump to next block operations (more portable code, does not need
|
/* jump to next block operations (more portable code, does not need
|
||||||
cache flushing, but slower because of indirect jump) */
|
cache flushing, but slower because of indirect jump) */
|
||||||
#define JUMP_TB(tbparam, n, eip)\
|
#define JUMP_TB(opname, tbparam, n, eip)\
|
||||||
do {\
|
do {\
|
||||||
static void __attribute__((unused)) *__op_label ## n = &&label ## n;\
|
static void __attribute__((unused)) *__op_label ## n = &&label ## n;\
|
||||||
static void __attribute__((unused)) *dummy ## n = &&dummy_label ## n;\
|
static void __attribute__((unused)) *dummy ## n = &&dummy_label ## n;\
|
||||||
|
|
Loading…
Reference in New Issue