From abf975e2af31b68fbd398ed1b07ca5c351447de3 Mon Sep 17 00:00:00 2001 From: SarahW Date: Wed, 18 May 2016 20:06:28 +0100 Subject: [PATCH] x86-64 recompiler now saves/restores correct registers on entry/exit of code block. --- src/Makefile.mingw64 | 2 +- src/codegen_x86-64.c | 21 +++++++++++++++------ src/codegen_x86-64.h | 2 +- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/Makefile.mingw64 b/src/Makefile.mingw64 index 71b8ea9..493c376 100644 --- a/src/Makefile.mingw64 +++ b/src/Makefile.mingw64 @@ -2,7 +2,7 @@ VPATH = . dosbox resid-fp CPP = g++.exe CC = gcc.exe WINDRES = windres.exe -CFLAGS = -O3 -fomit-frame-pointer +CFLAGS = -O3 -fomit-frame-pointer -msse2 OBJ = 386.o 386_dynarec.o 386_dynarec_ops.o 808x.o acer386sx.o ali1429.o amstrad.o cdrom-ioctl.o cdrom-iso.o \ codegen.o codegen_ops.o codegen_timing_486.o codegen_timing_686.o codegen_timing_pentium.o codegen_timing_winchip.o codegen_x86-64.o compaq.o config.o cpu.o dac.o \ device.o disc.o disc_fdi.o disc_img.o disc_sector.o dma.o fdc.o fdc37c665.o fdd.o fdi2raw.o gameport.o headland.o i430lx.o i430fx.o \ diff --git a/src/codegen_x86-64.c b/src/codegen_x86-64.c index 46ffc92..2400291 100644 --- a/src/codegen_x86-64.c +++ b/src/codegen_x86-64.c @@ -246,10 +246,10 @@ void codegen_block_init(uint32_t phys_addr) while (block_pos < BLOCK_EXIT_OFFSET) addbyte(0x90); /*NOP*/ block_pos = BLOCK_EXIT_OFFSET; /*Exit code*/ - addbyte(0x48); /*ADDL $32,%rsp*/ + addbyte(0x48); /*ADDL $40,%rsp*/ addbyte(0x83); addbyte(0xC4); - addbyte(0x20); + addbyte(0x28); addbyte(0x41); /*POP R15*/ addbyte(0x5f); addbyte(0x41); /*POP R14*/ @@ -258,11 +258,17 @@ void codegen_block_init(uint32_t phys_addr) addbyte(0x5d); addbyte(0x41); /*POP R12*/ addbyte(0x5c); + addbyte(0x5f); /*POP RDI*/ + addbyte(0x5e); /*POP RSI*/ addbyte(0x5d); /*POP RBP*/ + addbyte(0x5b); /*POP RDX*/ addbyte(0xC3); /*RET*/ cpu_block_end = 0; block_pos = 0; /*Entry code*/ + addbyte(0x53); /*PUSH RBX*/ addbyte(0x55); /*PUSH RBP*/ + addbyte(0x56); /*PUSH RSI*/ + addbyte(0x57); /*PUSH RDI*/ addbyte(0x41); /*PUSH R12*/ addbyte(0x54); addbyte(0x41); /*PUSH R13*/ @@ -271,10 +277,10 @@ void codegen_block_init(uint32_t phys_addr) addbyte(0x56); addbyte(0x41); /*PUSH R15*/ addbyte(0x57); - addbyte(0x48); /*SUBL $32,%rsp*/ + addbyte(0x48); /*SUBL $40,%rsp*/ addbyte(0x83); addbyte(0xEC); - addbyte(0x20); + addbyte(0x28); addbyte(0x48); /*MOVL EBP, &EAX*/ addbyte(0xBD); addquad((uint64_t)&EAX); @@ -446,10 +452,10 @@ void codegen_block_end() addlong(codegen_block_full_ins); } #endif - addbyte(0x48); /*ADDL $32,%rsp*/ + addbyte(0x48); /*ADDL $40,%rsp*/ addbyte(0x83); addbyte(0xC4); - addbyte(0x20); + addbyte(0x28); addbyte(0x41); /*POP R15*/ addbyte(0x5f); addbyte(0x41); /*POP R14*/ @@ -458,7 +464,10 @@ void codegen_block_end() addbyte(0x5d); addbyte(0x41); /*POP R12*/ addbyte(0x5c); + addbyte(0x5f); /*POP RDI*/ + addbyte(0x5e); /*POP RSI*/ addbyte(0x5d); /*POP RBP*/ + addbyte(0x5b); /*POP RDX*/ addbyte(0xC3); /*RET*/ if (block_pos > BLOCK_GPF_OFFSET) diff --git a/src/codegen_x86-64.h b/src/codegen_x86-64.h index 2a41fda..bad807d 100644 --- a/src/codegen_x86-64.h +++ b/src/codegen_x86-64.h @@ -7,7 +7,7 @@ #define HASH(l) ((l) & 0x1ffff) -#define BLOCK_EXIT_OFFSET 0x7f0 +#define BLOCK_EXIT_OFFSET 0x7e0 #define BLOCK_GPF_OFFSET (BLOCK_EXIT_OFFSET - 20) enum