Mercurial > repos > blastem
comparison m68k_to_x86.c @ 188:062e3aa549eb
Fix movem.w when dest is register list
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Sun, 13 Jan 2013 23:48:04 -0800 |
parents | 8e138da572ab |
children | 1db07e112bf7 |
comparison
equal
deleted
inserted
replaced
187:8e138da572ab | 188:062e3aa549eb |
---|---|
1326 if (inst->extra.size == OPSIZE_LONG) { | 1326 if (inst->extra.size == OPSIZE_LONG) { |
1327 dst = call(dst, (uint8_t *)m68k_read_long_scratch1); | 1327 dst = call(dst, (uint8_t *)m68k_read_long_scratch1); |
1328 } else { | 1328 } else { |
1329 dst = call(dst, (uint8_t *)m68k_read_word_scratch1); | 1329 dst = call(dst, (uint8_t *)m68k_read_word_scratch1); |
1330 } | 1330 } |
1331 if (inst->extra.size == OPSIZE_WORD) { | |
1332 dst = movsx_rr(dst, SCRATCH1, SCRATCH1, SZ_W, SZ_D); | |
1333 } | |
1331 if (reg > 7) { | 1334 if (reg > 7) { |
1332 if (opts->aregs[reg-8] >= 0) { | 1335 if (opts->aregs[reg-8] >= 0) { |
1333 dst = mov_rr(dst, SCRATCH1, opts->aregs[reg-8], inst->extra.size); | 1336 dst = mov_rr(dst, SCRATCH1, opts->aregs[reg-8], SZ_D); |
1334 } else { | 1337 } else { |
1335 dst = mov_rrdisp8(dst, SCRATCH1, CONTEXT, offsetof(m68k_context, aregs) + sizeof(uint32_t) * (reg-8), inst->extra.size); | 1338 dst = mov_rrdisp8(dst, SCRATCH1, CONTEXT, offsetof(m68k_context, aregs) + sizeof(uint32_t) * (reg-8), SZ_D); |
1336 } | 1339 } |
1337 } else { | 1340 } else { |
1338 if (opts->dregs[reg] >= 0) { | 1341 if (opts->dregs[reg] >= 0) { |
1339 dst = mov_rr(dst, SCRATCH1, opts->dregs[reg], inst->extra.size); | 1342 dst = mov_rr(dst, SCRATCH1, opts->dregs[reg], SZ_D); |
1340 } else { | 1343 } else { |
1341 dst = mov_rrdisp8(dst, SCRATCH1, CONTEXT, offsetof(m68k_context, dregs) + sizeof(uint32_t) * (reg), inst->extra.size); | 1344 dst = mov_rrdisp8(dst, SCRATCH1, CONTEXT, offsetof(m68k_context, dregs) + sizeof(uint32_t) * (reg), SZ_D); |
1342 } | 1345 } |
1343 } | 1346 } |
1344 dst = pop_r(dst, SCRATCH1); | 1347 dst = pop_r(dst, SCRATCH1); |
1345 dst = add_ir(dst, (inst->extra.size == OPSIZE_LONG) ? 4 : 2, SCRATCH1, SZ_D); | 1348 dst = add_ir(dst, (inst->extra.size == OPSIZE_LONG) ? 4 : 2, SCRATCH1, SZ_D); |
1346 } | 1349 } |
3578 { | 3581 { |
3579 m68kinst instbuf; | 3582 m68kinst instbuf; |
3580 x86_68k_options * opts = context->options; | 3583 x86_68k_options * opts = context->options; |
3581 uint8_t * dst = opts->cur_code; | 3584 uint8_t * dst = opts->cur_code; |
3582 uint8_t * dst_end = opts->code_end; | 3585 uint8_t * dst_end = opts->code_end; |
3586 address &= 0xFFFFFF; | |
3583 if(get_native_address(opts->native_code_map, address)) { | 3587 if(get_native_address(opts->native_code_map, address)) { |
3584 return dst; | 3588 return dst; |
3585 } | 3589 } |
3586 char disbuf[1024]; | 3590 char disbuf[1024]; |
3587 uint16_t *encoded, *next; | 3591 uint16_t *encoded, *next; |