Commit ae063a68dc39f2ee1c87ea2a41c468ba7256acbb

Authored by bellard
1 parent 8636b5d8

generalized use of GOTO_TB() macro


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1207 c046a42c-6fe2-441c-8c8c-71466251a162
exec-all.h
@@ -322,7 +322,7 @@ TranslationBlock *tb_find_pc(unsigned long pc_ptr); @@ -322,7 +322,7 @@ TranslationBlock *tb_find_pc(unsigned long pc_ptr);
322 #if defined(__powerpc__) 322 #if defined(__powerpc__)
323 323
324 /* we patch the jump instruction directly */ 324 /* we patch the jump instruction directly */
325 -#define JUMP_TB(opname, tbparam, n, eip)\ 325 +#define GOTO_TB(opname, tbparam, n)\
326 do {\ 326 do {\
327 asm volatile (ASM_DATA_SECTION\ 327 asm volatile (ASM_DATA_SECTION\
328 ASM_NAME(__op_label) #n "." ASM_NAME(opname) ":\n"\ 328 ASM_NAME(__op_label) #n "." ASM_NAME(opname) ":\n"\
@@ -330,20 +330,12 @@ do {\ @@ -330,20 +330,12 @@ do {\
330 ASM_PREVIOUS_SECTION \ 330 ASM_PREVIOUS_SECTION \
331 "b " ASM_NAME(__op_jmp) #n "\n"\ 331 "b " ASM_NAME(__op_jmp) #n "\n"\
332 "1:\n");\ 332 "1:\n");\
333 - T0 = (long)(tbparam) + (n);\  
334 - EIP = (int32_t)eip;\  
335 - EXIT_TB();\  
336 -} while (0)  
337 -  
338 -#define JUMP_TB2(opname, tbparam, n)\  
339 -do {\  
340 - asm volatile ("b " ASM_NAME(__op_jmp) #n "\n");\  
341 } while (0) 333 } while (0)
342 334
343 #elif defined(__i386__) && defined(USE_DIRECT_JUMP) 335 #elif defined(__i386__) && defined(USE_DIRECT_JUMP)
344 336
345 /* we patch the jump instruction directly */ 337 /* we patch the jump instruction directly */
346 -#define GOTO_TB(opname, n)\ 338 +#define GOTO_TB(opname, tbparam, n)\
347 do {\ 339 do {\
348 asm volatile (".section .data\n"\ 340 asm volatile (".section .data\n"\
349 ASM_NAME(__op_label) #n "." ASM_NAME(opname) ":\n"\ 341 ASM_NAME(__op_label) #n "." ASM_NAME(opname) ":\n"\
@@ -353,48 +345,30 @@ do {\ @@ -353,48 +345,30 @@ do {\
353 "1:\n");\ 345 "1:\n");\
354 } while (0) 346 } while (0)
355 347
356 -#define JUMP_TB(opname, tbparam, n, eip)\  
357 -do {\  
358 - asm volatile (".section .data\n"\  
359 - ASM_NAME(__op_label) #n "." ASM_NAME(opname) ":\n"\  
360 - ".long 1f\n"\  
361 - ASM_PREVIOUS_SECTION \  
362 - "jmp " ASM_NAME(__op_jmp) #n "\n"\  
363 - "1:\n");\  
364 - T0 = (long)(tbparam) + (n);\  
365 - EIP = (int32_t)eip;\  
366 - EXIT_TB();\  
367 -} while (0)  
368 -  
369 -#define JUMP_TB2(opname, tbparam, n)\  
370 -do {\  
371 - asm volatile ("jmp " ASM_NAME(__op_jmp) #n "\n");\  
372 -} while (0)  
373 -  
374 #else 348 #else
375 349
376 /* jump to next block operations (more portable code, does not need 350 /* jump to next block operations (more portable code, does not need
377 cache flushing, but slower because of indirect jump) */ 351 cache flushing, but slower because of indirect jump) */
378 -#define JUMP_TB(opname, tbparam, n, eip)\ 352 +#define GOTO_TB(opname, tbparam, n)\
379 do {\ 353 do {\
380 - static void __attribute__((unused)) *__op_label ## n = &&label ## n;\  
381 static void __attribute__((unused)) *dummy ## n = &&dummy_label ## n;\ 354 static void __attribute__((unused)) *dummy ## n = &&dummy_label ## n;\
  355 + static void __attribute__((unused)) *__op_label ## n = &&label ## n;\
382 goto *(void *)(((TranslationBlock *)tbparam)->tb_next[n]);\ 356 goto *(void *)(((TranslationBlock *)tbparam)->tb_next[n]);\
383 -label ## n:\  
384 - T0 = (long)(tbparam) + (n);\  
385 - EIP = (int32_t)eip;\  
386 -dummy_label ## n:\  
387 - EXIT_TB();\ 357 +label ## n: ;\
  358 +dummy_label ## n: ;\
388 } while (0) 359 } while (0)
389 360
390 -/* second jump to same destination 'n' */  
391 -#define JUMP_TB2(opname, tbparam, n)\ 361 +#endif
  362 +
  363 +/* XXX: will be suppressed */
  364 +#define JUMP_TB(opname, tbparam, n, eip)\
392 do {\ 365 do {\
393 - goto *(void *)(((TranslationBlock *)tbparam)->tb_next[n - 2]);\ 366 + GOTO_TB(opname, tbparam, n);\
  367 + T0 = (long)(tbparam) + (n);\
  368 + EIP = (int32_t)eip;\
  369 + EXIT_TB();\
394 } while (0) 370 } while (0)
395 371
396 -#endif  
397 -  
398 extern CPUWriteMemoryFunc *io_mem_write[IO_MEM_NB_ENTRIES][4]; 372 extern CPUWriteMemoryFunc *io_mem_write[IO_MEM_NB_ENTRIES][4];
399 extern CPUReadMemoryFunc *io_mem_read[IO_MEM_NB_ENTRIES][4]; 373 extern CPUReadMemoryFunc *io_mem_read[IO_MEM_NB_ENTRIES][4];
400 extern void *io_mem_opaque[IO_MEM_NB_ENTRIES]; 374 extern void *io_mem_opaque[IO_MEM_NB_ENTRIES];
target-i386/op.c
@@ -1262,12 +1262,12 @@ void OPPROTO op_clts(void) @@ -1262,12 +1262,12 @@ void OPPROTO op_clts(void)
1262 1262
1263 void OPPROTO op_goto_tb0(void) 1263 void OPPROTO op_goto_tb0(void)
1264 { 1264 {
1265 - GOTO_TB(op_goto_tb0, 0); 1265 + GOTO_TB(op_goto_tb0, PARAM1, 0);
1266 } 1266 }
1267 1267
1268 void OPPROTO op_goto_tb1(void) 1268 void OPPROTO op_goto_tb1(void)
1269 { 1269 {
1270 - GOTO_TB(op_goto_tb1, 1); 1270 + GOTO_TB(op_goto_tb1, PARAM1, 1);
1271 } 1271 }
1272 1272
1273 void OPPROTO op_jmp_label(void) 1273 void OPPROTO op_jmp_label(void)
target-i386/translate.c
@@ -61,6 +61,12 @@ static uint32_t *gen_opparam_ptr; @@ -61,6 +61,12 @@ static uint32_t *gen_opparam_ptr;
61 static int x86_64_hregs; 61 static int x86_64_hregs;
62 #endif 62 #endif
63 63
  64 +#ifdef USE_DIRECT_JUMP
  65 +#define TBPARAM(x)
  66 +#else
  67 +#define TBPARAM(x) (long)(x)
  68 +#endif
  69 +
64 typedef struct DisasContext { 70 typedef struct DisasContext {
65 /* current insn context */ 71 /* current insn context */
66 int override; /* -1 if no override */ 72 int override; /* -1 if no override */
@@ -1782,13 +1788,13 @@ static inline void gen_jcc(DisasContext *s, int b, @@ -1782,13 +1788,13 @@ static inline void gen_jcc(DisasContext *s, int b,
1782 l1 = gen_new_label(); 1788 l1 = gen_new_label();
1783 func(l1); 1789 func(l1);
1784 1790
1785 - gen_op_goto_tb0(); 1791 + gen_op_goto_tb0(TBPARAM(tb));
1786 gen_jmp_im(next_eip); 1792 gen_jmp_im(next_eip);
1787 gen_op_movl_T0_im((long)tb + 0); 1793 gen_op_movl_T0_im((long)tb + 0);
1788 gen_op_exit_tb(); 1794 gen_op_exit_tb();
1789 1795
1790 gen_set_label(l1); 1796 gen_set_label(l1);
1791 - gen_op_goto_tb1(); 1797 + gen_op_goto_tb1(TBPARAM(tb));
1792 gen_jmp_im(val); 1798 gen_jmp_im(val);
1793 gen_op_movl_T0_im((long)tb + 1); 1799 gen_op_movl_T0_im((long)tb + 1);
1794 gen_op_exit_tb(); 1800 gen_op_exit_tb();
@@ -2179,9 +2185,9 @@ static void gen_jmp_tb(DisasContext *s, target_ulong eip, int tb_num) @@ -2179,9 +2185,9 @@ static void gen_jmp_tb(DisasContext *s, target_ulong eip, int tb_num)
2179 if (s->cc_op != CC_OP_DYNAMIC) 2185 if (s->cc_op != CC_OP_DYNAMIC)
2180 gen_op_set_cc_op(s->cc_op); 2186 gen_op_set_cc_op(s->cc_op);
2181 if (tb_num) 2187 if (tb_num)
2182 - gen_op_goto_tb1(); 2188 + gen_op_goto_tb1(TBPARAM(tb));
2183 else 2189 else
2184 - gen_op_goto_tb0(); 2190 + gen_op_goto_tb0(TBPARAM(tb));
2185 gen_jmp_im(eip); 2191 gen_jmp_im(eip);
2186 gen_op_movl_T0_im((long)tb + tb_num); 2192 gen_op_movl_T0_im((long)tb + tb_num);
2187 gen_op_exit_tb(); 2193 gen_op_exit_tb();