From 673d78574307b0937b71bf2821ad35b589b80221 Mon Sep 17 00:00:00 2001 From: TomW Date: Wed, 3 Feb 2016 21:09:05 +0000 Subject: [PATCH] Writing to a memory page with code present only causes code block flushes if the data changes, or if a block is currently being recompiled. --- src/386_dynarec.c | 3 +++ src/codegen.c | 2 ++ src/codegen.h | 2 ++ src/mem.c | 35 ++++++++++++++++++++++------------- 4 files changed, 29 insertions(+), 13 deletions(-) diff --git a/src/386_dynarec.c b/src/386_dynarec.c index c338813..8b9a999 100644 --- a/src/386_dynarec.c +++ b/src/386_dynarec.c @@ -1361,6 +1361,7 @@ inrecomp=0; cpu_new_blocks++; codegen_block_init(phys_addr); + codegen_in_recompile = 1; // if (output) pclog("Recompile block at %04x:%04x %04x %04x %04x %04x %04x %04x ESP=%04x %04x %02x%02x:%02x%02x %02x%02x:%02x%02x %02x%02x:%02x%02x\n", CS, pc, AX, BX, CX, DX, SI, DI, ESP, BP, ram[0x116330+0x6df4+0xa+3], ram[0x116330+0x6df4+0xa+2], ram[0x116330+0x6df4+0xa+1], ram[0x116330+0x6df4+0xa+0], ram[0x11d136+3],ram[0x11d136+2],ram[0x11d136+1],ram[0x11d136+0], ram[(0x119abe)+0x3],ram[(0x119abe)+0x2],ram[(0x119abe)+0x1],ram[(0x119abe)+0x0]); while (!cpu_block_end) @@ -1426,6 +1427,8 @@ inrecomp=0; if (x86_was_reset) codegen_reset(); + + codegen_in_recompile = 0; // output &= ~2; } // if (output && (SP & 1)) diff --git a/src/codegen.c b/src/codegen.c index 8bcc6c2..8256ab2 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -17,3 +17,5 @@ void codegen_timing_set(codegen_timing_t *timing) codegen_timing_block_start = timing->block_start; codegen_timing_block_end = timing->block_end; } + +int codegen_in_recompile; diff --git a/src/codegen.h b/src/codegen.h index 23182b4..fc0132a 100644 --- a/src/codegen.h +++ b/src/codegen.h @@ -163,3 +163,5 @@ extern int codegen_fpu_entered; extern int codegen_fpu_loaded_iq[8]; extern int codegen_reg_loaded[8]; + +extern int codegen_in_recompile; diff --git a/src/mem.c b/src/mem.c index 2e4f33c..6a2ec9b 100644 --- a/src/mem.c +++ b/src/mem.c @@ -1417,28 +1417,37 @@ uint32_t mem_read_raml(uint32_t addr, void *priv) void mem_write_ramb_page(uint32_t addr, uint8_t val, page_t *p) { - uint64_t mask = (uint64_t)1 << ((addr >> PAGE_MASK_SHIFT) & PAGE_MASK_MASK); + if (val != p->mem[addr & 0xfff] || codegen_in_recompile) + { + uint64_t mask = (uint64_t)1 << ((addr >> PAGE_MASK_SHIFT) & PAGE_MASK_MASK); // pclog("mem_write_ramb_page: %08x %02x %08x %llx %llx\n", addr, val, cs+pc, p->dirty_mask, mask); - p->dirty_mask |= mask; - p->mem[addr & 0xfff] = val; + p->dirty_mask |= mask; + p->mem[addr & 0xfff] = val; + } } void mem_write_ramw_page(uint32_t addr, uint16_t val, page_t *p) { - uint64_t mask = (uint64_t)1 << ((addr >> PAGE_MASK_SHIFT) & PAGE_MASK_MASK); - if ((addr & 0x3f) == 0x3f) - mask |= (mask << 1); + if (val != *(uint16_t *)&p->mem[addr & 0xfff] || codegen_in_recompile) + { + uint64_t mask = (uint64_t)1 << ((addr >> PAGE_MASK_SHIFT) & PAGE_MASK_MASK); + if ((addr & 0x3f) == 0x3f) + mask |= (mask << 1); // pclog("mem_write_ramw_page: %08x %04x %08x\n", addr, val, cs+pc); - p->dirty_mask |= mask; - *(uint16_t *)&p->mem[addr & 0xfff] = val; + p->dirty_mask |= mask; + *(uint16_t *)&p->mem[addr & 0xfff] = val; + } } void mem_write_raml_page(uint32_t addr, uint32_t val, page_t *p) { - uint64_t mask = (uint64_t)1 << ((addr >> PAGE_MASK_SHIFT) & PAGE_MASK_MASK); - if ((addr & 0x3f) >= 0x3d) - mask |= (mask << 1); + if (val != *(uint32_t *)&p->mem[addr & 0xfff] || codegen_in_recompile) + { + uint64_t mask = (uint64_t)1 << ((addr >> PAGE_MASK_SHIFT) & PAGE_MASK_MASK); + if ((addr & 0x3f) >= 0x3d) + mask |= (mask << 1); // pclog("mem_write_raml_page: %08x %08x %08x\n", addr, val, cs+pc); - p->dirty_mask |= mask; - *(uint32_t *)&p->mem[addr & 0xfff] = val; + p->dirty_mask |= mask; + *(uint32_t *)&p->mem[addr & 0xfff] = val; + } } void mem_write_ram(uint32_t addr, uint8_t val, void *priv)