comparison m68k_to_x86.c @ 218:1abf8e967b33

Fix autoincrement on a7 when used as a destination in a byte sized instruction
author Mike Pavone <pavone@retrodev.com>
date Sat, 20 Apr 2013 00:36:50 -0700
parents 0b5ec22dcda2
children 8d3c16071559
comparison
equal deleted inserted replaced
217:acd29e2664c6 218:1abf8e967b33
436 out = mov_rdisp8r(out, CONTEXT, reg_offset(&(inst->dst)), SCRATCH2, SZ_D); 436 out = mov_rdisp8r(out, CONTEXT, reg_offset(&(inst->dst)), SCRATCH2, SZ_D);
437 } 437 }
438 } 438 }
439 439
440 if (inst->dst.addr_mode == MODE_AREG_POSTINC) { 440 if (inst->dst.addr_mode == MODE_AREG_POSTINC) {
441 inc_amount = inst->extra.size == OPSIZE_WORD ? 2 : (inst->extra.size == OPSIZE_LONG ? 4 : 1); 441 inc_amount = inst->extra.size == OPSIZE_WORD ? 2 : (inst->extra.size == OPSIZE_LONG ? 4 : (inst->dst.params.regs.pri == 7 ? 2 : 1));
442 if (opts->aregs[inst->dst.params.regs.pri] >= 0) { 442 if (opts->aregs[inst->dst.params.regs.pri] >= 0) {
443 out = add_ir(out, inc_amount, opts->aregs[inst->dst.params.regs.pri], SZ_D); 443 out = add_ir(out, inc_amount, opts->aregs[inst->dst.params.regs.pri], SZ_D);
444 } else { 444 } else {
445 out = add_irdisp8(out, inc_amount, CONTEXT, reg_offset(&(inst->dst)), SZ_D); 445 out = add_irdisp8(out, inc_amount, CONTEXT, reg_offset(&(inst->dst)), SZ_D);
446 } 446 }
889 case OPSIZE_LONG: 889 case OPSIZE_LONG:
890 dst = call(dst, (char *)m68k_write_long_highfirst); 890 dst = call(dst, (char *)m68k_write_long_highfirst);
891 break; 891 break;
892 } 892 }
893 if (inst->dst.addr_mode == MODE_AREG_POSTINC) { 893 if (inst->dst.addr_mode == MODE_AREG_POSTINC) {
894 inc_amount = inst->extra.size == OPSIZE_WORD ? 2 : (inst->extra.size == OPSIZE_LONG ? 4 : 1); 894 inc_amount = inst->extra.size == OPSIZE_WORD ? 2 : (inst->extra.size == OPSIZE_LONG ? 4 : (inst->dst.params.regs.pri == 7 ? 2 : 1));
895 if (opts->aregs[inst->dst.params.regs.pri] >= 0) { 895 if (opts->aregs[inst->dst.params.regs.pri] >= 0) {
896 dst = add_ir(dst, inc_amount, opts->aregs[inst->dst.params.regs.pri], SZ_D); 896 dst = add_ir(dst, inc_amount, opts->aregs[inst->dst.params.regs.pri], SZ_D);
897 } else { 897 } else {
898 dst = add_irdisp8(dst, inc_amount, CONTEXT, reg_offset(&(inst->dst)), SZ_D); 898 dst = add_irdisp8(dst, inc_amount, CONTEXT, reg_offset(&(inst->dst)), SZ_D);
899 } 899 }