comparison m68k_to_x86.c @ 165:62b152811bae

Fix certain address modes with lea when the destination is not a native register
author Mike Pavone <pavone@retrodev.com>
date Sat, 05 Jan 2013 22:59:51 -0800
parents eba78ad49a11
children f6c7fea1ecf7
comparison
equal deleted inserted replaced
164:afbfb0ac0256 165:62b152811bae
1377 dst = mov_rrdisp8(dst, opts->aregs[inst->src.params.regs.pri], CONTEXT, reg_offset(&(inst->dst)), SZ_D); 1377 dst = mov_rrdisp8(dst, opts->aregs[inst->src.params.regs.pri], CONTEXT, reg_offset(&(inst->dst)), SZ_D);
1378 } else { 1378 } else {
1379 dst = mov_rdisp8r(dst, CONTEXT, reg_offset(&(inst->src)), SCRATCH1, SZ_D); 1379 dst = mov_rdisp8r(dst, CONTEXT, reg_offset(&(inst->src)), SCRATCH1, SZ_D);
1380 dst = mov_rrdisp8(dst, SCRATCH1, CONTEXT, reg_offset(&(inst->dst)), SZ_D); 1380 dst = mov_rrdisp8(dst, SCRATCH1, CONTEXT, reg_offset(&(inst->dst)), SZ_D);
1381 } 1381 }
1382 dst = add_irdisp8(dst, inst->src.params.regs.displacement, CONTEXT, reg_offset(&(inst->src)), SZ_D); 1382 dst = add_irdisp8(dst, inst->src.params.regs.displacement, CONTEXT, reg_offset(&(inst->dst)), SZ_D);
1383 } 1383 }
1384 break; 1384 break;
1385 case MODE_AREG_INDEX_DISP8: 1385 case MODE_AREG_INDEX_DISP8:
1386 dst = cycles(dst, 6);//TODO: Check to make sure this is correct 1386 dst = cycles(dst, 6);//TODO: Check to make sure this is correct
1387 if (opts->aregs[inst->src.params.regs.pri] >= 0) { 1387 if (opts->aregs[inst->src.params.regs.pri] >= 0) {
1424 dst = add_ir(dst, inst->src.params.regs.displacement, SCRATCH2, SZ_D); 1424 dst = add_ir(dst, inst->src.params.regs.displacement, SCRATCH2, SZ_D);
1425 } 1425 }
1426 if (dst_reg >= 0) { 1426 if (dst_reg >= 0) {
1427 dst = mov_rr(dst, SCRATCH2, dst_reg, SZ_D); 1427 dst = mov_rr(dst, SCRATCH2, dst_reg, SZ_D);
1428 } else { 1428 } else {
1429 dst = mov_rrdisp8(dst, SCRATCH2, CONTEXT, reg_offset(&(inst->src)), SZ_D); 1429 dst = mov_rrdisp8(dst, SCRATCH2, CONTEXT, reg_offset(&(inst->dst)), SZ_D);
1430 } 1430 }
1431 break; 1431 break;
1432 case MODE_PC_DISPLACE: 1432 case MODE_PC_DISPLACE:
1433 dst = cycles(dst, 8); 1433 dst = cycles(dst, 8);
1434 if (dst_reg >= 0) { 1434 if (dst_reg >= 0) {
2863 //case M68K_NBCD: 2863 //case M68K_NBCD:
2864 case M68K_NEG: 2864 case M68K_NEG:
2865 if (dst_op.mode == MODE_REG_DIRECT) { 2865 if (dst_op.mode == MODE_REG_DIRECT) {
2866 dst = neg_r(dst, dst_op.base, inst->extra.size); 2866 dst = neg_r(dst, dst_op.base, inst->extra.size);
2867 } else { 2867 } else {
2868 dst = not_rdisp8(dst, dst_op.base, dst_op.disp, inst->extra.size); 2868 dst = neg_rdisp8(dst, dst_op.base, dst_op.disp, inst->extra.size);
2869 } 2869 }
2870 dst = mov_ir(dst, 0, FLAG_C, SZ_B); 2870 dst = mov_ir(dst, 0, FLAG_C, SZ_B);
2871 dst = setcc_r(dst, CC_Z, FLAG_Z); 2871 dst = setcc_r(dst, CC_Z, FLAG_Z);
2872 dst = setcc_r(dst, CC_S, FLAG_N); 2872 dst = setcc_r(dst, CC_S, FLAG_N);
2873 dst = mov_ir(dst, 0, FLAG_V, SZ_B); 2873 dst = mov_ir(dst, 0, FLAG_V, SZ_B);
3310 address += (next-encoded)*2; 3310 address += (next-encoded)*2;
3311 encoded = next; 3311 encoded = next;
3312 //m68k_disasm(&instbuf, disbuf); 3312 //m68k_disasm(&instbuf, disbuf);
3313 //printf("%X: %s\n", instbuf.address, disbuf); 3313 //printf("%X: %s\n", instbuf.address, disbuf);
3314 dst = translate_m68k(dst, &instbuf, opts); 3314 dst = translate_m68k(dst, &instbuf, opts);
3315 } 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); 3315 } 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);
3316 process_deferred(opts); 3316 process_deferred(opts);
3317 if (opts->deferred) { 3317 if (opts->deferred) {
3318 address = opts->deferred->address; 3318 address = opts->deferred->address;
3319 if ((address & 0xFFFFFF) < 0x400000) { 3319 if ((address & 0xFFFFFF) < 0x400000) {
3320 encoded = context->mem_pointers[0] + (address & 0xFFFFFF)/2; 3320 encoded = context->mem_pointers[0] + (address & 0xFFFFFF)/2;