2005-11-11 Gwenole Beauchesne * Globaaly save %ebx, %esi, %edi on entry to generated function. This avoids some register spills in synthetic opcodes. NOTE: this also easily fixes gcc4 compiled qemu-system-x86_64 on x86. Index: qemu-0.8.1/Makefile.target =================================================================== --- qemu-0.8.1.orig/Makefile.target +++ qemu-0.8.1/Makefile.target @@ -68,6 +68,10 @@ OP_CFLAGS+= -falign-functions=0 -fno-gcs else OP_CFLAGS+= -malign-functions=0 endif +ifeq ($(TARGET_ARCH), x86_64) +# XXX globally save %ebx, %esi, %edi on entry to generated function +OP_CFLAGS+= -fcall-used-ebx -fcall-used-esi -fcall-used-edi +endif ifdef TARGET_GPROF USE_I386_LD=y Index: qemu-0.8.1/cpu-exec.c =================================================================== --- qemu-0.8.1.orig/cpu-exec.c +++ qemu-0.8.1/cpu-exec.c @@ -677,6 +677,15 @@ int cpu_exec(CPUState *env1) : /* no outputs */ : "r" (gen_func) : "r1", "r2", "r3", "r8", "r9", "r10", "r12", "r14"); +#elif defined(TARGET_X86_64) && defined(__i386__) + asm volatile ("push %%ebx\n" + "push %%esi\n" + "push %%edi\n" + "call *%0\n" + "pop %%edi\n" + "pop %%esi\n" + "pop %%ebx\n" + : : "r" (gen_func) : "ebx", "esi", "edi"); #elif defined(TARGET_I386) && defined(USE_CODE_COPY) { if (!(tb->cflags & CF_CODE_COPY)) {