comparison m68k_core_x86.c @ 610:314373222b1a

Decrement address register after fetching source in move with -(ax) dest to avoid bug when src is the dst addres reg
author Michael Pavone <pavone@retrodev.com>
date Sat, 27 Dec 2014 14:51:50 -0800
parents 49d9928353be
children 744b305965f7
comparison
equal deleted inserted replaced
609:66b730a8ae51 610:314373222b1a
602 mov_irdisp(code, src.disp, opts->gen.context_reg, reg_offset(&(inst->dst)), size); 602 mov_irdisp(code, src.disp, opts->gen.context_reg, reg_offset(&(inst->dst)), size);
603 } 603 }
604 break; 604 break;
605 case MODE_AREG_PREDEC: 605 case MODE_AREG_PREDEC:
606 dec_amount = inst->extra.size == OPSIZE_WORD ? 2 : (inst->extra.size == OPSIZE_LONG ? 4 : (inst->dst.params.regs.pri == 7 ? 2 : 1)); 606 dec_amount = inst->extra.size == OPSIZE_WORD ? 2 : (inst->extra.size == OPSIZE_LONG ? 4 : (inst->dst.params.regs.pri == 7 ? 2 : 1));
607 subi_areg(opts, dec_amount, inst->dst.params.regs.pri);
608 case MODE_AREG_INDIRECT: 607 case MODE_AREG_INDIRECT:
609 case MODE_AREG_POSTINC: 608 case MODE_AREG_POSTINC:
610 areg_to_native(opts, inst->dst.params.regs.pri, opts->gen.scratch2);
611 if (src.mode == MODE_REG_DIRECT) { 609 if (src.mode == MODE_REG_DIRECT) {
612 if (src.base != opts->gen.scratch1) { 610 if (src.base != opts->gen.scratch1) {
613 mov_rr(code, src.base, opts->gen.scratch1, inst->extra.size); 611 mov_rr(code, src.base, opts->gen.scratch1, inst->extra.size);
614 } 612 }
615 } else if (src.mode == MODE_REG_DISPLACE8) { 613 } else if (src.mode == MODE_REG_DISPLACE8) {
616 mov_rdispr(code, src.base, src.disp, opts->gen.scratch1, inst->extra.size); 614 mov_rdispr(code, src.base, src.disp, opts->gen.scratch1, inst->extra.size);
617 } else { 615 } else {
618 mov_ir(code, src.disp, opts->gen.scratch1, inst->extra.size); 616 mov_ir(code, src.disp, opts->gen.scratch1, inst->extra.size);
619 } 617 }
618 if (inst->dst.addr_mode == MODE_AREG_PREDEC) {
619 subi_areg(opts, dec_amount, inst->dst.params.regs.pri);
620 }
621 areg_to_native(opts, inst->dst.params.regs.pri, opts->gen.scratch2);
620 break; 622 break;
621 case MODE_AREG_DISPLACE: 623 case MODE_AREG_DISPLACE:
622 cycles(&opts->gen, BUS); 624 cycles(&opts->gen, BUS);
623 calc_areg_displace(opts, &inst->dst, opts->gen.scratch2); 625 calc_areg_displace(opts, &inst->dst, opts->gen.scratch2);
624 if (src.mode == MODE_REG_DIRECT) { 626 if (src.mode == MODE_REG_DIRECT) {