summaryrefslogtreecommitdiff
path: root/m68k_to_x86.c
diff options
context:
space:
mode:
Diffstat (limited to 'm68k_to_x86.c')
-rw-r--r--m68k_to_x86.c37
1 files changed, 27 insertions, 10 deletions
diff --git a/m68k_to_x86.c b/m68k_to_x86.c
index aef8116..6f1826f 100644
--- a/m68k_to_x86.c
+++ b/m68k_to_x86.c
@@ -15,18 +15,18 @@
#define BUS 4
#define PREDEC_PENALTY 2
+
#define CYCLES RAX
#define LIMIT RBP
+#define CONTEXT RSI
#define SCRATCH1 RCX
+
+#ifdef X86_64
#define SCRATCH2 RDI
-#define CONTEXT RSI
+#else
+#define SCRATCH2 RBX
+#endif
-/*
-#define FLAG_N RBX
-#define FLAG_V BH
-#define FLAG_Z RDX
-#define FLAG_C DH
-*/
enum {
FLAG_X,
FLAG_N,
@@ -4380,7 +4380,9 @@ uint8_t * gen_mem_fun(x86_68k_options * opts, memmap_chunk * memmap, uint32_t nu
dst = jcc(dst, CC_NZ, dst+2);
dst = call(dst, opts->save_context);
if (is_write) {
- //SCRATCH2 is RDI, so no need to move it there
+ if (SCRATCH2 != RDI) {
+ dst = mov_rr(dst, SCRATCH2, RDI, SZ_D);
+ }
dst = mov_rr(dst, SCRATCH1, RDX, size);
} else {
dst = push_r(dst, CONTEXT);
@@ -4483,7 +4485,9 @@ uint8_t * gen_mem_fun(x86_68k_options * opts, memmap_chunk * memmap, uint32_t nu
} else if (cfun) {
dst = call(dst, opts->save_context);
if (is_write) {
- //SCRATCH2 is RDI, so no need to move it there
+ if (SCRATCH2 != RDI) {
+ dst = mov_rr(dst, SCRATCH2, RDI, SZ_D);
+ }
dst = mov_rr(dst, SCRATCH1, RDX, size);
} else {
dst = push_r(dst, CONTEXT);
@@ -4536,6 +4540,7 @@ void init_x86_68k_opts(x86_68k_options * opts, memmap_chunk * memmap, uint32_t n
memset(opts, 0, sizeof(*opts));
for (int i = 0; i < 8; i++)
opts->dregs[i] = opts->aregs[i] = -1;
+#ifdef X86_64
opts->dregs[0] = R10;
opts->dregs[1] = R11;
opts->dregs[2] = R12;
@@ -4550,6 +4555,15 @@ void init_x86_68k_opts(x86_68k_options * opts, memmap_chunk * memmap, uint32_t n
opts->flag_regs[2] = RDX;
opts->flag_regs[3] = BH;
opts->flag_regs[4] = DH;
+#else
+ opts->dregs[0] = RDX;
+ opts->aregs[7] = RDI;
+
+ for (int i = 0; i < 5; i++)
+ opts->flag_regs[i] = -1;
+#endif
+
+
opts->native_code_map = malloc(sizeof(native_map_slot) * NATIVE_MAP_CHUNKS);
memset(opts->native_code_map, 0, sizeof(native_map_slot) * NATIVE_MAP_CHUNKS);
opts->deferred = NULL;
@@ -4597,6 +4611,9 @@ void init_x86_68k_opts(x86_68k_options * opts, memmap_chunk * memmap, uint32_t n
dst = retn(dst);
opts->start_context = (start_fun)dst;
+ if (SCRATCH2 != RDI) {
+ dst = mov_rr(dst, RDI, SCRATCH2, SZ_Q);
+ }
//save callee save registers
dst = push_r(dst, RBP);
dst = push_r(dst, R12);
@@ -4604,7 +4621,7 @@ void init_x86_68k_opts(x86_68k_options * opts, memmap_chunk * memmap, uint32_t n
dst = push_r(dst, R14);
dst = push_r(dst, R15);
dst = call(dst, opts->load_context);
- dst = call_r(dst, RDI);
+ dst = call_r(dst, SCRATCH2);
dst = call(dst, opts->save_context);
//restore callee save registers
dst = pop_r(dst, R15);