x86-64 recompiler now saves/restores correct registers on entry/exit of code block.
This commit is contained in:
parent
4024be8e52
commit
abf975e2af
3 changed files with 17 additions and 8 deletions
|
|
@ -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 \
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue