summaryrefslogtreecommitdiff
path: root/m68k_core_x86.c
diff options
context:
space:
mode:
authorMichael Pavone <pavone@retrodev.com>2015-11-25 08:40:45 -0800
committerMichael Pavone <pavone@retrodev.com>2015-11-25 08:40:45 -0800
commit77f239c97ce5d496998c3b8a07d84d27b5d5984f (patch)
treeb9e7951e055fa80a7afc925bec7d72193cead1f6 /m68k_core_x86.c
parent621afa83ca859c29efcf57beef5b21c918161e78 (diff)
Partially working change to do proper stack alignment rather than doing a lame alignment check when calling a C compile dfunction. 68K core seems okay, but Z80 is busted.
Diffstat (limited to 'm68k_core_x86.c')
-rw-r--r--m68k_core_x86.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/m68k_core_x86.c b/m68k_core_x86.c
index 59f92bc..d4958ad 100644
--- a/m68k_core_x86.c
+++ b/m68k_core_x86.c
@@ -1674,6 +1674,7 @@ void translate_m68k_div(m68k_options *opts, m68kinst *inst, host_ea *src_op, hos
set_flag(opts, 0, FLAG_C);
push_r(code, RDX);
push_r(code, RAX);
+ uint32_t tmp_stack_off = code->stack_off;
if (dst_op->mode == MODE_REG_DIRECT) {
mov_rr(code, dst_op->base, RAX, SZ_D);
} else {
@@ -1717,6 +1718,8 @@ void translate_m68k_div(m68k_options *opts, m68kinst *inst, host_ea *src_op, hos
mov_ir(code, VECTOR_INT_DIV_ZERO, opts->gen.scratch2, SZ_D);
mov_ir(code, inst->address+isize, opts->gen.scratch1, SZ_D);
jmp(code, opts->trap);
+
+ code->stack_off = tmp_stack_off;
*not_zero = code->cur - (not_zero+1);
if (inst->op == M68K_DIVS) {
cdq(code);
@@ -1761,6 +1764,7 @@ void translate_m68k_div(m68k_options *opts, m68kinst *inst, host_ea *src_op, hos
}
code_ptr end_off = code->cur + 1;
jmp(code, code->cur + 2);
+ code->stack_off = tmp_stack_off;
*norm_off = code->cur - (norm_off + 1);
if (inst->op == M68K_DIVS) {
*skip_sec_check = code->cur - (skip_sec_check+1);
@@ -2514,9 +2518,14 @@ void init_m68k_opts(m68k_options * opts, memmap_chunk * memmap, uint32_t num_chu
jcc(code, CC_NZ, do_ret);
retn(code);
*do_ret = code->cur - (do_ret+1);
+ uint32_t tmp_stack_off = code->stack_off;
+ //fetch return address and adjust RSP
pop_r(code, opts->gen.scratch1);
+ add_ir(code, 16-sizeof(void *), RSP, 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);
+ code->stack_off = tmp_stack_off;
*do_int = code->cur - (do_int+1);
//implement 1 instruction latency
cmp_irdisp(code, 0, opts->gen.context_reg, offsetof(m68k_context, int_pending), SZ_B);
@@ -2593,9 +2602,12 @@ void init_m68k_opts(m68k_options * opts, memmap_chunk * memmap, uint32_t num_chu
call(code, opts->native_addr_and_sync);
//2 prefetch bus operations + 2 idle bus cycles
cycles(&opts->gen, 10);
+ tmp_stack_off = code->stack_off;
//discard function return address
pop_r(code, opts->gen.scratch2);
+ add_ir(code, 16-sizeof(void *), RSP, SZ_PTR);
jmp_r(code, opts->gen.scratch1);
+ code->stack_off = tmp_stack_off;
opts->trap = code->cur;
push_r(code, opts->gen.scratch2);