Revision 7cb69cae cpu-exec.c
b/cpu-exec.c | ||
---|---|---|
18 | 18 |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
19 | 19 |
*/ |
20 | 20 |
#include "config.h" |
21 |
#define CPU_NO_GLOBAL_REGS |
|
21 | 22 |
#include "exec.h" |
22 | 23 |
#include "disas.h" |
24 |
#include "tcg.h" |
|
23 | 25 |
|
24 | 26 |
#if !defined(CONFIG_SOFTMMU) |
25 | 27 |
#undef EAX |
... | ... | |
292 | 294 |
#endif |
293 | 295 |
#endif |
294 | 296 |
int ret, interrupt_request; |
295 |
unsigned long (*gen_func)(void); |
|
296 | 297 |
TranslationBlock *tb; |
297 | 298 |
uint8_t *tc_ptr; |
298 | 299 |
|
... | ... | |
652 | 653 |
tc_ptr = tb->tc_ptr; |
653 | 654 |
env->current_tb = tb; |
654 | 655 |
/* execute the generated code */ |
655 |
gen_func = (void *)tc_ptr; |
|
656 |
#if defined(__sparc__) |
|
657 |
__asm__ __volatile__("call %0\n\t" |
|
658 |
"mov %%o7,%%i0" |
|
659 |
: /* no outputs */ |
|
660 |
: "r" (gen_func) |
|
661 |
: "i0", "i1", "i2", "i3", "i4", "i5", |
|
662 |
"o0", "o1", "o2", "o3", "o4", "o5", |
|
663 |
"l0", "l1", "l2", "l3", "l4", "l5", |
|
664 |
"l6", "l7"); |
|
665 |
#elif defined(__hppa__) |
|
666 |
asm volatile ("ble 0(%%sr4,%1)\n" |
|
667 |
"copy %%r31,%%r18\n" |
|
668 |
"copy %%r28,%0\n" |
|
669 |
: "=r" (next_tb) |
|
670 |
: "r" (gen_func) |
|
671 |
: "r1", "r2", "r3", "r4", "r5", "r6", "r7", |
|
672 |
"r8", "r9", "r10", "r11", "r12", "r13", |
|
673 |
"r18", "r19", "r20", "r21", "r22", "r23", |
|
674 |
"r24", "r25", "r26", "r27", "r28", "r29", |
|
675 |
"r30", "r31"); |
|
676 |
#elif defined(__arm__) |
|
677 |
asm volatile ("mov pc, %0\n\t" |
|
678 |
".global exec_loop\n\t" |
|
679 |
"exec_loop:\n\t" |
|
680 |
: /* no outputs */ |
|
681 |
: "r" (gen_func) |
|
682 |
: "r1", "r2", "r3", "r8", "r9", "r10", "r12", "r14"); |
|
683 |
#elif defined(__ia64) |
|
684 |
struct fptr { |
|
685 |
void *ip; |
|
686 |
void *gp; |
|
687 |
} fp; |
|
688 |
|
|
689 |
fp.ip = tc_ptr; |
|
690 |
fp.gp = code_gen_buffer + 2 * (1 << 20); |
|
691 |
(*(void (*)(void)) &fp)(); |
|
692 |
#elif defined(__i386) |
|
693 |
asm volatile ("sub $12, %%esp\n\t" |
|
694 |
"push %%ebp\n\t" |
|
695 |
"call *%1\n\t" |
|
696 |
"pop %%ebp\n\t" |
|
697 |
"add $12, %%esp\n\t" |
|
698 |
: "=a" (next_tb) |
|
699 |
: "a" (gen_func) |
|
700 |
: "ebx", "ecx", "edx", "esi", "edi", "cc", |
|
701 |
"memory"); |
|
702 |
#elif defined(__x86_64__) |
|
703 |
asm volatile ("sub $8, %%rsp\n\t" |
|
704 |
"push %%rbp\n\t" |
|
705 |
"call *%1\n\t" |
|
706 |
"pop %%rbp\n\t" |
|
707 |
"add $8, %%rsp\n\t" |
|
708 |
: "=a" (next_tb) |
|
709 |
: "a" (gen_func) |
|
710 |
: "rbx", "rcx", "rdx", "rsi", "rdi", "r8", "r9", |
|
711 |
"r10", "r11", "r12", "r13", "r14", "r15", "cc", |
|
712 |
"memory"); |
|
713 |
#else |
|
714 |
next_tb = gen_func(); |
|
715 |
#endif |
|
656 |
next_tb = tcg_qemu_tb_exec(tc_ptr); |
|
716 | 657 |
env->current_tb = NULL; |
717 | 658 |
/* reset soft MMU for next block (it can currently |
718 | 659 |
only be set by a memory fault) */ |
Also available in: Unified diff