diff m68k_to_x86.c @ 548:a3afee2271ce

Initial work on the x86-32 target
author Michael Pavone <pavone@retrodev.com>
date Tue, 18 Feb 2014 21:37:31 -0800
parents 3090d016c9e9
children 96489fb27dbf
line wrap: on
line diff
--- a/m68k_to_x86.c	Tue Feb 18 20:32:10 2014 -0800
+++ b/m68k_to_x86.c	Tue Feb 18 21:37:31 2014 -0800
@@ -15,18 +15,18 @@
 
 #define BUS 4
 #define PREDEC_PENALTY 2
+
 #define CYCLES RAX
 #define LIMIT RBP
+#define CONTEXT RSI
 #define SCRATCH1 RCX
-#define SCRATCH2 RDI
-#define CONTEXT RSI
 
-/*
-#define FLAG_N RBX
-#define FLAG_V BH
-#define FLAG_Z RDX
-#define FLAG_C DH
-*/
+#ifdef X86_64
+#define SCRATCH2 RDI
+#else
+#define SCRATCH2 RBX
+#endif
+
 enum {
 	FLAG_X,
 	FLAG_N,
@@ -4380,7 +4380,9 @@
 					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 @@
 		} 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 @@
 	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 @@
 	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 @@
 	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 @@
 	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);