changeset 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 dc71e32091d8
children 0e5f9d6135be
files m68k_core.c m68k_core_x86.c
diffstat 2 files changed, 8 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- 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);
--- 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);