# HG changeset patch # User Mike Pavone # Date 1358149684 28800 # Node ID 062e3aa549eb26a1938ae8293bc20016d9b3fbe8 # Parent 8e138da572ab233952050febce45da2a727a6a38 Fix movem.w when dest is register list diff -r 8e138da572ab -r 062e3aa549eb m68k_to_x86.c --- a/m68k_to_x86.c Sun Jan 13 23:06:26 2013 -0800 +++ b/m68k_to_x86.c Sun Jan 13 23:48:04 2013 -0800 @@ -1328,17 +1328,20 @@ } else { dst = call(dst, (uint8_t *)m68k_read_word_scratch1); } + if (inst->extra.size == OPSIZE_WORD) { + dst = movsx_rr(dst, SCRATCH1, SCRATCH1, SZ_W, SZ_D); + } if (reg > 7) { if (opts->aregs[reg-8] >= 0) { - dst = mov_rr(dst, SCRATCH1, opts->aregs[reg-8], inst->extra.size); + dst = mov_rr(dst, SCRATCH1, opts->aregs[reg-8], SZ_D); } else { - dst = mov_rrdisp8(dst, SCRATCH1, CONTEXT, offsetof(m68k_context, aregs) + sizeof(uint32_t) * (reg-8), inst->extra.size); + dst = mov_rrdisp8(dst, SCRATCH1, CONTEXT, offsetof(m68k_context, aregs) + sizeof(uint32_t) * (reg-8), SZ_D); } } else { if (opts->dregs[reg] >= 0) { - dst = mov_rr(dst, SCRATCH1, opts->dregs[reg], inst->extra.size); + dst = mov_rr(dst, SCRATCH1, opts->dregs[reg], SZ_D); } else { - dst = mov_rrdisp8(dst, SCRATCH1, CONTEXT, offsetof(m68k_context, dregs) + sizeof(uint32_t) * (reg), inst->extra.size); + dst = mov_rrdisp8(dst, SCRATCH1, CONTEXT, offsetof(m68k_context, dregs) + sizeof(uint32_t) * (reg), SZ_D); } } dst = pop_r(dst, SCRATCH1); @@ -3580,6 +3583,7 @@ x86_68k_options * opts = context->options; uint8_t * dst = opts->cur_code; uint8_t * dst_end = opts->code_end; + address &= 0xFFFFFF; if(get_native_address(opts->native_code_map, address)) { return dst; }