diff m68k_to_x86.c @ 209:922b59c09259

Flag fixes for div, negx and not
author Mike Pavone <pavone@retrodev.com>
date Sat, 26 Jan 2013 02:47:26 -0800
parents 3457dc6fd558
children 4beaad3a9a50
line wrap: on
line diff
--- a/m68k_to_x86.c	Sat Jan 26 01:33:32 2013 -0800
+++ b/m68k_to_x86.c	Sat Jan 26 02:47:26 2013 -0800
@@ -3126,10 +3126,10 @@
 			dst = shl_irdisp8(dst, 16, dst_op.base, dst_op.disp, SZ_D);
 			dst = mov_rrdisp8(dst, RAX, dst_op.base, dst_op.disp, SZ_W);
 		}
+		dst = cmp_ir(dst, 0, RAX, SZ_W);
 		dst = pop_r(dst, RAX);
 		dst = pop_r(dst, RDX);
 		dst = mov_ir(dst, 0, FLAG_V, SZ_B);
-		dst = cmp_ir(dst, 0, RAX, SZ_W);
 		dst = setcc_r(dst, CC_Z, FLAG_Z);
 		dst = setcc_r(dst, CC_S, FLAG_N);
 		end_off = dst+1;
@@ -3364,8 +3364,8 @@
 			dst = mov_rrdisp8(dst, SCRATCH1, dst_op.base, dst_op.disp, inst->extra.size);
 		}
 		dst = setcc_r(dst, CC_C, FLAG_C);
-		dst = jcc(dst, CC_NZ, dst+4);
-		dst = mov_ir(dst, 1, FLAG_Z, SZ_B);
+		dst = jcc(dst, CC_Z, dst+4);
+		dst = mov_ir(dst, 0, FLAG_Z, SZ_B);
 		dst = setcc_r(dst, CC_S, FLAG_N);
 		dst = setcc_r(dst, CC_O, FLAG_V);
 		dst = mov_rrind(dst, FLAG_C, CONTEXT, SZ_B);
@@ -3378,9 +3378,12 @@
 	case M68K_NOT:
 		if (dst_op.mode == MODE_REG_DIRECT) {
 			dst = not_r(dst, dst_op.base, inst->extra.size);
+			dst = cmp_ir(dst, 0, dst_op.base, inst->extra.size);
 		} else {
 			dst = not_rdisp8(dst, dst_op.base, dst_op.disp, inst->extra.size);
+			dst = cmp_irdisp8(dst, 0, dst_op.base, dst_op.disp, inst->extra.size);
 		}
+		
 		dst = mov_ir(dst, 0, FLAG_C, SZ_B);
 		dst = setcc_r(dst, CC_Z, FLAG_Z);
 		dst = setcc_r(dst, CC_S, FLAG_N);