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