# HG changeset patch # User Michael Pavone # Date 1448658602 28800 # Node ID 6011409ded0d56c78388496d00823353d6b77a25 # Parent dc71e32091d84c3ef63462c014bd411eabfa857f Fix a few lingering stack alignment rework bugs diff -r dc71e32091d8 -r 6011409ded0d m68k_core.c --- a/m68k_core.c Fri Nov 27 10:48:13 2015 -0800 +++ b/m68k_core.c Fri Nov 27 13:10:02 2015 -0800 @@ -893,9 +893,7 @@ uint8_t orig_size = get_native_inst_size(opts, address); code_ptr orig_start = get_native_address(context->options, address); uint32_t orig = address; - code_info orig_code; - orig_code.cur = orig_start; - orig_code.last = orig_start + orig_size + 5; + code_info orig_code = {orig_start, orig_start + orig_size + 5, 0}; uint16_t *after, *inst = get_native_pointer(address, (void **)context->mem_pointers, &opts->gen); m68kinst instbuf; after = m68k_decode(inst, &instbuf, orig); diff -r dc71e32091d8 -r 6011409ded0d m68k_core_x86.c --- a/m68k_core_x86.c Fri Nov 27 10:48:13 2015 -0800 +++ b/m68k_core_x86.c Fri Nov 27 13:10:02 2015 -0800 @@ -2180,9 +2180,7 @@ m68k_options * options = context->options; code_info *code = &options->gen.code; code_ptr dst = get_native_address(context->options, inst_start); - code_info orig; - orig.cur = dst; - orig.last = dst + 128; + code_info orig = {dst, dst + 128, 0}; mov_ir(&orig, inst_start, options->gen.scratch2, SZ_D); if (!options->retrans_stub) { @@ -2502,6 +2500,11 @@ retn(code); opts->gen.handle_cycle_limit_int = code->cur; + //calculate stack adjust size + add_ir(code, 16-sizeof(void*), RSP, SZ_PTR); + uint32_t adjust_size = code->cur - opts->gen.handle_cycle_limit_int; + code->cur = opts->gen.handle_cycle_limit_int; + cmp_rdispr(code, opts->gen.context_reg, offsetof(m68k_context, int_cycle), opts->gen.cycles, SZ_D); code_ptr do_int = code->cur + 1; jcc(code, CC_NC, code->cur + 2); @@ -2522,6 +2525,7 @@ //fetch return address and adjust RSP pop_r(code, opts->gen.scratch1); add_ir(code, 16-sizeof(void *), RSP, SZ_PTR); + add_ir(code, adjust_size, opts->gen.scratch1, SZ_PTR); //save return address for restoring later mov_rrdisp(code, opts->gen.scratch1, opts->gen.context_reg, offsetof(m68k_context, resume_pc), SZ_PTR); retn(code);