X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=cpu%2Fdrc%2Femit_x86.c;h=754c27fe1a4c1ef227cf69cdd1bc50936dfcd834;hb=f81107f59093904c3daac2e9c257261fddc6caf0;hp=c110c859b31d0f316ea4fe5b3a505744749e2bbf;hpb=cff531af94bd9c9c89ae162e80f48ddc26a4e504;p=picodrive.git diff --git a/cpu/drc/emit_x86.c b/cpu/drc/emit_x86.c index c110c85..754c27f 100644 --- a/cpu/drc/emit_x86.c +++ b/cpu/drc/emit_x86.c @@ -145,6 +145,17 @@ enum { xAX = 0, xCX, xDX, xBX, xSP, xBP, xSI, xDI }; } // _r_r_r +#define emith_add_r_r_r(d, s1, s2) { \ + if (d == s1) { \ + emith_add_r_r(d, s2); \ + } else if (d == s2) { \ + emith_add_r_r(d, s1); \ + } else { \ + emith_move_r_r(d, s1); \ + emith_add_r_r(d, s2); \ + } \ +} + #define emith_eor_r_r_r(d, s1, s2) { \ if (d == s1) { \ emith_eor_r_r(d, s2); \ @@ -618,14 +629,13 @@ enum { xAX = 0, xCX, xDX, xBX, xSP, xBP, xSI, xDI }; } // assumes EBX is free temporary -#define emith_sh2_wcall(a, tab, ret_ptr) { \ +#define emith_sh2_wcall(a, tab) { \ int arg2_; \ host_arg2reg(arg2_, 2); \ emith_lsr(xBX, a, SH2_WRITE_SHIFT); \ EMIT_OP_MODRM(0x8b, 0, xBX, 4); \ EMIT_SIB(2, xBX, tab); /* mov ebx, [tab + ebx * 4] */ \ - emith_ctx_read(arg2_, offsetof(SH2, is_slave)); \ - emith_push_imm((long)(ret_ptr)); \ + emith_move_r_r(arg2_, CONTEXT_REG); \ emith_jump_reg(xBX); \ }