Mercurial > repos > blastem
diff backend_x86.c @ 2138:b6338e18787e
Fix some dynarec code invalidation issues
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sat, 19 Mar 2022 15:50:45 -0700 |
parents | 9caebcfeac72 |
children | f82c090c1e89 |
line wrap: on
line diff
--- a/backend_x86.c Sat Mar 19 00:42:05 2022 -0700 +++ b/backend_x86.c Sat Mar 19 15:50:45 2022 -0700 @@ -166,7 +166,12 @@ and_ir(code, memmap[chunk].mask, adr_reg, opts->address_size); } code_ptr after_normal = NULL; + uint8_t need_addr_pop = 0; if (size == SZ_B && memmap[chunk].shift != 0) { + if (is_write && (memmap[chunk].flags & MMAP_CODE)) { + push_r(code, adr_reg); + need_addr_pop = 1; + } btr_ir(code, 0, adr_reg, opts->address_size); code_ptr normal = code->cur+1; jcc(code, CC_NC, normal); @@ -181,8 +186,16 @@ *normal = code->cur - (normal + 1); } if (memmap[chunk].shift > 0) { + if (!need_addr_pop && is_write && (memmap[chunk].flags & MMAP_CODE)) { + push_r(code, adr_reg); + need_addr_pop = 1; + } shl_ir(code, memmap[chunk].shift, adr_reg, opts->address_size); } else if (memmap[chunk].shift < 0) { + if (!need_addr_pop && is_write && (memmap[chunk].flags & MMAP_CODE)) { + push_r(code, adr_reg); + need_addr_pop = 1; + } shr_ir(code, -memmap[chunk].shift, adr_reg, opts->address_size); } if (after_normal) { @@ -232,15 +245,13 @@ if (opts->address_size != SZ_D) { movzx_rr(code, adr_reg, adr_reg, opts->address_size, SZ_D); } - if (is_write && (memmap[chunk].flags & MMAP_CODE)) { + if (!need_addr_pop && is_write && (memmap[chunk].flags & MMAP_CODE)) { push_r(code, adr_reg); + need_addr_pop = 1; } add_rdispr(code, opts->context_reg, opts->mem_ptr_off + sizeof(void*) * memmap[chunk].ptr_index, adr_reg, SZ_PTR); if (is_write) { mov_rrind(code, opts->scratch1, opts->scratch2, size); - if (memmap[chunk].flags & MMAP_CODE) { - pop_r(code, adr_reg); - } } else { mov_rindr(code, opts->scratch1, opts->scratch1, size); } @@ -283,7 +294,7 @@ add_rdispr(code, RSP, 0, opts->scratch2, SZ_PTR); mov_rrind(code, opts->scratch1, opts->scratch2, tmp_size); if (is_write && (memmap[chunk].flags & MMAP_CODE)) { - pop_r(code, opts->scratch2); + need_addr_pop = 1; } else { add_ir(code, sizeof(void*), RSP, SZ_PTR); code->stack_off -= sizeof(void *); @@ -305,6 +316,9 @@ } } if (is_write && (memmap[chunk].flags & MMAP_CODE)) { + if (need_addr_pop) { + pop_r(code, adr_reg); + } mov_rr(code, opts->scratch2, opts->scratch1, opts->address_size); shr_ir(code, opts->ram_flags_shift, opts->scratch1, opts->address_size); bt_rrdisp(code, opts->scratch1, opts->context_reg, ram_flags_off, opts->address_size);