# HG changeset patch # User Mike Pavone # Date 1357455591 28800 # Node ID 62b152811bae0e58d72516715c76ceef8b59e770 # Parent afbfb0ac0256c2367f68d62df719b9c8b928a825 Fix certain address modes with lea when the destination is not a native register diff -r afbfb0ac0256 -r 62b152811bae m68k_to_x86.c --- a/m68k_to_x86.c Sat Jan 05 22:59:06 2013 -0800 +++ b/m68k_to_x86.c Sat Jan 05 22:59:51 2013 -0800 @@ -1379,7 +1379,7 @@ dst = mov_rdisp8r(dst, CONTEXT, reg_offset(&(inst->src)), SCRATCH1, SZ_D); dst = mov_rrdisp8(dst, SCRATCH1, CONTEXT, reg_offset(&(inst->dst)), SZ_D); } - dst = add_irdisp8(dst, inst->src.params.regs.displacement, CONTEXT, reg_offset(&(inst->src)), SZ_D); + dst = add_irdisp8(dst, inst->src.params.regs.displacement, CONTEXT, reg_offset(&(inst->dst)), SZ_D); } break; case MODE_AREG_INDEX_DISP8: @@ -1426,7 +1426,7 @@ if (dst_reg >= 0) { dst = mov_rr(dst, SCRATCH2, dst_reg, SZ_D); } else { - dst = mov_rrdisp8(dst, SCRATCH2, CONTEXT, reg_offset(&(inst->src)), SZ_D); + dst = mov_rrdisp8(dst, SCRATCH2, CONTEXT, reg_offset(&(inst->dst)), SZ_D); } break; case MODE_PC_DISPLACE: @@ -2865,7 +2865,7 @@ if (dst_op.mode == MODE_REG_DIRECT) { dst = neg_r(dst, dst_op.base, inst->extra.size); } else { - dst = not_rdisp8(dst, dst_op.base, dst_op.disp, inst->extra.size); + dst = neg_rdisp8(dst, 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); @@ -3312,7 +3312,7 @@ //m68k_disasm(&instbuf, disbuf); //printf("%X: %s\n", instbuf.address, disbuf); dst = translate_m68k(dst, &instbuf, opts); - } while(instbuf.op != M68K_ILLEGAL && instbuf.op != M68K_TRAP && instbuf.op != M68K_RTS && instbuf.op != M68K_RTE && !(instbuf.op == M68K_BCC && instbuf.extra.cond == COND_TRUE) && instbuf.op != M68K_JMP); + } while(instbuf.op != M68K_ILLEGAL && instbuf.op != M68K_TRAP && instbuf.op != M68K_RTS && instbuf.op != M68K_RTR && instbuf.op != M68K_RTE && !(instbuf.op == M68K_BCC && instbuf.extra.cond == COND_TRUE) && instbuf.op != M68K_JMP); process_deferred(opts); if (opts->deferred) { address = opts->deferred->address;