summaryrefslogtreecommitdiff
blob: 4819dfb7f2a2baee6f9e3fb1ee8d437334a41c44 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
2005-11-11  Gwenole Beauchesne  <gbeauchesne@mandriva.com>

	* 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)) {