32x: drc: new debug facility (pdb). Few fixes thanks to it.
[picodrive.git] / cpu / drc / emit_x86.c
index 1c29eea..6c9a414 100644 (file)
@@ -180,13 +180,18 @@ enum { xAX = 0, xCX, xDX, xBX, xSP, xBP, xSI, xDI };
        EMIT(imm, u32); \
 } while (0)
 
-// 2 - adc, 3 - sbb
 #define emith_add_r_imm(r, imm) \
        emith_arith_r_imm(0, r, imm)
 
 #define emith_or_r_imm(r, imm) \
        emith_arith_r_imm(1, r, imm)
 
+#define emith_adc_r_imm(r, imm) \
+       emith_arith_r_imm(2, r, imm)
+
+#define emith_sbc_r_imm(r, imm) \
+       emith_arith_r_imm(3, r, imm) // sbb
+
 #define emith_and_r_imm(r, imm) \
        emith_arith_r_imm(4, r, imm)
 
@@ -463,6 +468,9 @@ enum { xAX = 0, xCX, xDX, xBX, xSP, xBP, xSI, xDI };
        EMIT(disp, u32); \
 }
 
+#define emith_jump_patchable(target) \
+       emith_jump(target)
+
 #define emith_jump_cond(cond, ptr) { \
        u32 disp = (u32)(ptr) - ((u32)tcache_ptr + 6); \
        EMIT(0x0f, u8); \
@@ -470,12 +478,13 @@ enum { xAX = 0, xCX, xDX, xBX, xSP, xBP, xSI, xDI };
        EMIT(disp, u32); \
 }
 
-#define emith_jump_patchable(cond) \
-       emith_jump_cond(cond, 0)
+#define emith_jump_cond_patchable(cond, target) \
+       emith_jump_cond(cond, target)
 
 #define emith_jump_patch(ptr, target) do { \
-       u32 disp = (u32)(target) - ((u32)(ptr) + 6); \
-       EMIT_PTR((u8 *)(ptr) + 2, disp, u32); \
+       u32 disp_ = (u32)(target) - ((u32)(ptr) + 4); \
+       u32 offs_ = (*(u8 *)(ptr) == 0x0f) ? 2 : 1; \
+       EMIT_PTR((u8 *)(ptr) + offs_, disp_ - offs_, u32); \
 } while (0)
 
 #define emith_call(ptr) { \