Mercurial > repos > blastem
changeset 541:a59ac6b4b5b5
Get rid of the native stack option the 68K core. Trying to make it work with code that messes with the stack is not worth the trouble.
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sat, 15 Feb 2014 22:35:18 -0800 |
parents | 4ca826862174 |
children | 5d57fd8b44f8 |
files | m68k_to_x86.c m68k_to_x86.h runtime.S |
diffstat | 3 files changed, 11 insertions(+), 102 deletions(-) [+] |
line wrap: on
line diff
--- a/m68k_to_x86.c Sat Feb 15 21:25:36 2014 -0800 +++ b/m68k_to_x86.c Sat Feb 15 22:35:18 2014 -0800 @@ -31,7 +31,6 @@ m68k_context * sync_components(m68k_context * context, uint32_t address); void handle_cycle_limit(); -void m68k_modified_ret_addr(); void m68k_native_addr(); void m68k_native_addr_and_sync(); void m68k_invalid(); @@ -1754,9 +1753,6 @@ //TODO: Add cycles in the right place relative to pushing the return address on the stack dst = cycles(dst, 10); dst = mov_ir(dst, after, SCRATCH1, SZ_D); - if (opts->flags & OPT_NATIVE_CALL_STACK) { - dst = push_r(dst, SCRATCH1); - } dst = sub_ir(dst, 4, opts->aregs[7], SZ_D); dst = mov_rr(dst, opts->aregs[7], SCRATCH2, SZ_D); dst = call(dst, opts->write_32_highfirst); @@ -1766,13 +1762,7 @@ //dummy address to be replaced later dest_addr = dst + 256; } - if (opts->flags & OPT_NATIVE_CALL_STACK) { - dst = call(dst, (char *)dest_addr); - //would add_ir(dst, 8, RSP, SZ_Q) be faster here? - dst = pop_r(dst, SCRATCH1); - } else { - dst = jmp(dst, (char *)dest_addr); - } + dst = jmp(dst, (char *)dest_addr); return dst; } @@ -2080,9 +2070,6 @@ case MODE_AREG_INDIRECT: dst = cycles(dst, BUS*2); dst = mov_ir(dst, inst->address + 2, SCRATCH1, SZ_D); - if (opts->flags & OPT_NATIVE_CALL_STACK) { - dst = push_r(dst, SCRATCH1); - } dst = sub_ir(dst, 4, opts->aregs[7], SZ_D); dst = mov_rr(dst, opts->aregs[7], SCRATCH2, SZ_D); dst = call(dst, opts->write_32_highfirst); @@ -2092,20 +2079,11 @@ dst = mov_rdisp8r(dst, CONTEXT, offsetof(m68k_context, aregs) + 4 * inst->src.params.regs.pri, SCRATCH1, SZ_D); } dst = call(dst, (uint8_t *)m68k_native_addr); - if (opts->flags & OPT_NATIVE_CALL_STACK) { - dst = call_r(dst, SCRATCH1); - //would add_ir(dst, 8, RSP, SZ_Q) be faster here? - dst = pop_r(dst, SCRATCH1); - } else { - dst = jmp_r(dst, SCRATCH1); - } + dst = jmp_r(dst, SCRATCH1); break; case MODE_AREG_DISPLACE: dst = cycles(dst, BUS*2); dst = mov_ir(dst, inst->address + 4, SCRATCH1, SZ_D); - if (opts->flags & OPT_NATIVE_CALL_STACK) { - dst = push_r(dst, SCRATCH1); - } dst = sub_ir(dst, 4, opts->aregs[7], SZ_D); dst = mov_rr(dst, opts->aregs[7], SCRATCH2, SZ_D); dst = call(dst, opts->write_32_highfirst); @@ -2116,20 +2094,11 @@ } dst = add_ir(dst, inst->src.params.regs.displacement, SCRATCH1, SZ_D); dst = call(dst, (uint8_t *)m68k_native_addr); - if (opts->flags & OPT_NATIVE_CALL_STACK) { - dst = call_r(dst, SCRATCH1); - //would add_ir(dst, 8, RSP, SZ_Q) be faster here? - dst = pop_r(dst, SCRATCH1); - } else { - dst = jmp_r(dst, SCRATCH1); - } + dst = jmp_r(dst, SCRATCH1); break; case MODE_AREG_INDEX_DISP8: dst = cycles(dst, BUS*3);//TODO: CHeck that this is correct dst = mov_ir(dst, inst->address + 4, SCRATCH1, SZ_D); - if (opts->flags & OPT_NATIVE_CALL_STACK) { - dst = push_r(dst, SCRATCH1); - } dst = sub_ir(dst, 4, opts->aregs[7], SZ_D); dst = mov_rr(dst, opts->aregs[7], SCRATCH2, SZ_D); dst = call(dst, opts->write_32_highfirst); @@ -2173,21 +2142,12 @@ dst = add_ir(dst, inst->src.params.regs.displacement, SCRATCH1, SZ_D); } dst = call(dst, (uint8_t *)m68k_native_addr); - if (opts->flags & OPT_NATIVE_CALL_STACK) { - dst = call_r(dst, SCRATCH1); - //would add_ir(dst, 8, RSP, SZ_Q) be faster here? - dst = pop_r(dst, SCRATCH1); - } else { - dst = jmp_r(dst, SCRATCH1); - } + dst = jmp_r(dst, SCRATCH1); break; case MODE_PC_DISPLACE: //TODO: Add cycles in the right place relative to pushing the return address on the stack dst = cycles(dst, 10); dst = mov_ir(dst, inst->address + 4, SCRATCH1, SZ_D); - if (opts->flags & OPT_NATIVE_CALL_STACK) { - dst = push_r(dst, SCRATCH1); - } dst = sub_ir(dst, 4, opts->aregs[7], SZ_D); dst = mov_rr(dst, opts->aregs[7], SCRATCH2, SZ_D); dst = call(dst, opts->write_32_highfirst); @@ -2199,31 +2159,16 @@ //dummy address to be replaced later, make sure it generates a 4-byte displacement dest_addr = dst + 256; } - if (opts->flags & OPT_NATIVE_CALL_STACK) { - dst = call(dst, (char *)dest_addr); - } else { - dst = jmp(dst, dest_addr); - } + dst = jmp(dst, dest_addr); } else { dst = mov_ir(dst, m68k_addr, SCRATCH1, SZ_D); dst = call(dst, (uint8_t *)m68k_native_addr); - if (opts->flags & OPT_NATIVE_CALL_STACK) { - dst = call_r(dst, SCRATCH1); - } else { - dst = jmp_r(dst, SCRATCH1); - } - } - if (opts->flags & OPT_NATIVE_CALL_STACK) { - //would add_ir(dst, 8, RSP, SZ_Q) be faster here? - dst = pop_r(dst, SCRATCH1); + dst = jmp_r(dst, SCRATCH1); } break; case MODE_PC_INDEX_DISP8: dst = cycles(dst, BUS*3);//TODO: CHeck that this is correct dst = mov_ir(dst, inst->address + 4, SCRATCH1, SZ_D); - if (opts->flags & OPT_NATIVE_CALL_STACK) { - dst = push_r(dst, SCRATCH1); - } dst = sub_ir(dst, 4, opts->aregs[7], SZ_D); dst = mov_rr(dst, opts->aregs[7], SCRATCH2, SZ_D); dst = call(dst, opts->write_32_highfirst); @@ -2263,22 +2208,13 @@ dst = add_ir(dst, inst->src.params.regs.displacement, SCRATCH1, SZ_D); } dst = call(dst, (uint8_t *)m68k_native_addr); - if (opts->flags & OPT_NATIVE_CALL_STACK) { - dst = call_r(dst, SCRATCH1); - //would add_ir(dst, 8, RSP, SZ_Q) be faster here? - dst = pop_r(dst, SCRATCH1); - } else { - dst = jmp_r(dst, SCRATCH1); - } + dst = jmp_r(dst, SCRATCH1); break; case MODE_ABSOLUTE: case MODE_ABSOLUTE_SHORT: //TODO: Add cycles in the right place relative to pushing the return address on the stack dst = cycles(dst, inst->src.addr_mode == MODE_ABSOLUTE ? 12 : 10); dst = mov_ir(dst, inst->address + (inst->src.addr_mode == MODE_ABSOLUTE ? 6 : 4), SCRATCH1, SZ_D); - if (opts->flags & OPT_NATIVE_CALL_STACK) { - dst = push_r(dst, SCRATCH1); - } dst = sub_ir(dst, 4, opts->aregs[7], SZ_D); dst = mov_rr(dst, opts->aregs[7], SCRATCH2, SZ_D); dst = call(dst, opts->write_32_highfirst); @@ -2290,23 +2226,11 @@ //dummy address to be replaced later, make sure it generates a 4-byte displacement dest_addr = dst + 256; } - if (opts->flags & OPT_NATIVE_CALL_STACK) { - dst = call(dst, (char *)dest_addr); - } else { - dst = jmp(dst, dest_addr); - } + dst = jmp(dst, dest_addr); } else { dst = mov_ir(dst, m68k_addr, SCRATCH1, SZ_D); dst = call(dst, (uint8_t *)m68k_native_addr); - if (opts->flags & OPT_NATIVE_CALL_STACK) { - dst = call_r(dst, SCRATCH1); - } else { - dst = jmp_r(dst, SCRATCH1); - } - } - if (opts->flags & OPT_NATIVE_CALL_STACK) { - //would add_ir(dst, 8, RSP, SZ_Q) be faster here? - dst = pop_r(dst, SCRATCH1); + dst = jmp_r(dst, SCRATCH1); } break; default: @@ -2323,15 +2247,8 @@ dst = mov_rr(dst, opts->aregs[7], SCRATCH1, SZ_D); dst = add_ir(dst, 4, opts->aregs[7], SZ_D); dst = call(dst, opts->read_32); - if (opts->flags & OPT_NATIVE_CALL_STACK) { - dst = cmp_rdisp8r(dst, RSP, 8, SCRATCH1, SZ_D); - dst = jcc(dst, CC_NZ, dst+3); - dst = retn(dst); - dst = jmp(dst, (char *)m68k_modified_ret_addr); - } else { - dst = call(dst, (uint8_t *)m68k_native_addr); - dst = jmp_r(dst, SCRATCH1); - } + dst = call(dst, (uint8_t *)m68k_native_addr); + dst = jmp_r(dst, SCRATCH1); return dst; }
--- a/m68k_to_x86.h Sat Feb 15 21:25:36 2014 -0800 +++ b/m68k_to_x86.h Sat Feb 15 22:35:18 2014 -0800 @@ -16,8 +16,6 @@ #define NATIVE_CHUNK_SIZE ((16 * 1024 * 1024 / NATIVE_MAP_CHUNKS)/2) #define MAX_NATIVE_SIZE 255 -#define OPT_NATIVE_CALL_STACK 0x1 - typedef void (*start_fun)(uint8_t * addr, void * context); typedef struct {
--- a/runtime.S Sat Feb 15 21:25:36 2014 -0800 +++ b/runtime.S Sat Feb 15 22:35:18 2014 -0800 @@ -177,12 +177,6 @@ mov %cl, (%rsi) ret - .global m68k_modified_ret_addr -m68k_modified_ret_addr: - add $16, %rsp - call m68k_native_addr - jmp *%rcx - .global m68k_native_addr_and_sync m68k_native_addr_and_sync: call m68k_save_context