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;