Mercurial > repos > blastem
comparison m68k_core_x86.c @ 902:6011409ded0d
Fix a few lingering stack alignment rework bugs
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Fri, 27 Nov 2015 13:10:02 -0800 |
parents | a7774fc2de4b |
children | 20e30ca7e8a2 |
comparison
equal
deleted
inserted
replaced
901:dc71e32091d8 | 902:6011409ded0d |
---|---|
2178 uint32_t inst_start = get_instruction_start(context->native_code_map, address | 0xFF0000); | 2178 uint32_t inst_start = get_instruction_start(context->native_code_map, address | 0xFF0000); |
2179 if (inst_start) { | 2179 if (inst_start) { |
2180 m68k_options * options = context->options; | 2180 m68k_options * options = context->options; |
2181 code_info *code = &options->gen.code; | 2181 code_info *code = &options->gen.code; |
2182 code_ptr dst = get_native_address(context->options, inst_start); | 2182 code_ptr dst = get_native_address(context->options, inst_start); |
2183 code_info orig; | 2183 code_info orig = {dst, dst + 128, 0}; |
2184 orig.cur = dst; | |
2185 orig.last = dst + 128; | |
2186 mov_ir(&orig, inst_start, options->gen.scratch2, SZ_D); | 2184 mov_ir(&orig, inst_start, options->gen.scratch2, SZ_D); |
2187 | 2185 |
2188 if (!options->retrans_stub) { | 2186 if (!options->retrans_stub) { |
2189 options->retrans_stub = code->cur; | 2187 options->retrans_stub = code->cur; |
2190 call(code, options->gen.save_context); | 2188 call(code, options->gen.save_context); |
2500 } | 2498 } |
2501 } | 2499 } |
2502 retn(code); | 2500 retn(code); |
2503 | 2501 |
2504 opts->gen.handle_cycle_limit_int = code->cur; | 2502 opts->gen.handle_cycle_limit_int = code->cur; |
2503 //calculate stack adjust size | |
2504 add_ir(code, 16-sizeof(void*), RSP, SZ_PTR); | |
2505 uint32_t adjust_size = code->cur - opts->gen.handle_cycle_limit_int; | |
2506 code->cur = opts->gen.handle_cycle_limit_int; | |
2507 | |
2505 cmp_rdispr(code, opts->gen.context_reg, offsetof(m68k_context, int_cycle), opts->gen.cycles, SZ_D); | 2508 cmp_rdispr(code, opts->gen.context_reg, offsetof(m68k_context, int_cycle), opts->gen.cycles, SZ_D); |
2506 code_ptr do_int = code->cur + 1; | 2509 code_ptr do_int = code->cur + 1; |
2507 jcc(code, CC_NC, code->cur + 2); | 2510 jcc(code, CC_NC, code->cur + 2); |
2508 cmp_rdispr(code, opts->gen.context_reg, offsetof(m68k_context, sync_cycle), opts->gen.cycles, SZ_D); | 2511 cmp_rdispr(code, opts->gen.context_reg, offsetof(m68k_context, sync_cycle), opts->gen.cycles, SZ_D); |
2509 skip_sync = code->cur + 1; | 2512 skip_sync = code->cur + 1; |
2520 *do_ret = code->cur - (do_ret+1); | 2523 *do_ret = code->cur - (do_ret+1); |
2521 uint32_t tmp_stack_off = code->stack_off; | 2524 uint32_t tmp_stack_off = code->stack_off; |
2522 //fetch return address and adjust RSP | 2525 //fetch return address and adjust RSP |
2523 pop_r(code, opts->gen.scratch1); | 2526 pop_r(code, opts->gen.scratch1); |
2524 add_ir(code, 16-sizeof(void *), RSP, SZ_PTR); | 2527 add_ir(code, 16-sizeof(void *), RSP, SZ_PTR); |
2528 add_ir(code, adjust_size, opts->gen.scratch1, SZ_PTR); | |
2525 //save return address for restoring later | 2529 //save return address for restoring later |
2526 mov_rrdisp(code, opts->gen.scratch1, opts->gen.context_reg, offsetof(m68k_context, resume_pc), SZ_PTR); | 2530 mov_rrdisp(code, opts->gen.scratch1, opts->gen.context_reg, offsetof(m68k_context, resume_pc), SZ_PTR); |
2527 retn(code); | 2531 retn(code); |
2528 code->stack_off = tmp_stack_off; | 2532 code->stack_off = tmp_stack_off; |
2529 *do_int = code->cur - (do_int+1); | 2533 *do_int = code->cur - (do_int+1); |