Mercurial > repos > blastem
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; |