Mercurial > repos > blastem
comparison m68k_to_x86.c @ 107:9705075fcf36
Fix areg indexed mode for move dst
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Fri, 28 Dec 2012 14:30:25 -0800 |
parents | 1eba2b9455f8 |
children | a575808dd90b |
comparison
equal
deleted
inserted
replaced
106:1eba2b9455f8 | 107:9705075fcf36 |
---|---|
824 break; | 824 break; |
825 } | 825 } |
826 break; | 826 break; |
827 case MODE_AREG_INDEX_DISP8: | 827 case MODE_AREG_INDEX_DISP8: |
828 dst = cycles(dst, 6);//TODO: Check to make sure this is correct | 828 dst = cycles(dst, 6);//TODO: Check to make sure this is correct |
829 if (opts->aregs[inst->src.params.regs.pri] >= 0) { | 829 if (opts->aregs[inst->dst.params.regs.pri] >= 0) { |
830 dst = mov_rr(dst, opts->aregs[inst->src.params.regs.pri], SCRATCH2, SZ_D); | 830 dst = mov_rr(dst, opts->aregs[inst->dst.params.regs.pri], SCRATCH2, SZ_D); |
831 } else { | 831 } else { |
832 dst = mov_rdisp8r(dst, CONTEXT, reg_offset(&(inst->src)), SCRATCH2, SZ_D); | 832 dst = mov_rdisp8r(dst, CONTEXT, reg_offset(&(inst->dst)), SCRATCH2, SZ_D); |
833 } | 833 } |
834 sec_reg = (inst->src.params.regs.sec >> 1) & 0x7; | 834 sec_reg = (inst->dst.params.regs.sec >> 1) & 0x7; |
835 if (inst->src.params.regs.sec & 1) { | 835 if (inst->dst.params.regs.sec & 1) { |
836 if (inst->src.params.regs.sec & 0x10) { | 836 if (inst->dst.params.regs.sec & 0x10) { |
837 if (opts->aregs[sec_reg] >= 0) { | 837 if (opts->aregs[sec_reg] >= 0) { |
838 dst = add_rr(dst, opts->aregs[sec_reg], SCRATCH2, SZ_D); | 838 dst = add_rr(dst, opts->aregs[sec_reg], SCRATCH2, SZ_D); |
839 } else { | 839 } else { |
840 dst = add_rdisp8r(dst, CONTEXT, offsetof(m68k_context, aregs) + sizeof(uint32_t)*sec_reg, SCRATCH2, SZ_D); | 840 dst = add_rdisp8r(dst, CONTEXT, offsetof(m68k_context, aregs) + sizeof(uint32_t)*sec_reg, SCRATCH2, SZ_D); |
841 } | 841 } |
848 } | 848 } |
849 } else { | 849 } else { |
850 if (src.base == SCRATCH1) { | 850 if (src.base == SCRATCH1) { |
851 dst = push_r(dst, SCRATCH1); | 851 dst = push_r(dst, SCRATCH1); |
852 } | 852 } |
853 if (inst->src.params.regs.sec & 0x10) { | 853 if (inst->dst.params.regs.sec & 0x10) { |
854 if (opts->aregs[sec_reg] >= 0) { | 854 if (opts->aregs[sec_reg] >= 0) { |
855 dst = movsx_rr(dst, opts->aregs[sec_reg], SCRATCH1, SZ_W, SZ_D); | 855 dst = movsx_rr(dst, opts->aregs[sec_reg], SCRATCH1, SZ_W, SZ_D); |
856 } else { | 856 } else { |
857 dst = movsx_rdisp8r(dst, CONTEXT, offsetof(m68k_context, aregs) + sizeof(uint32_t)*sec_reg, SCRATCH1, SZ_W, SZ_D); | 857 dst = movsx_rdisp8r(dst, CONTEXT, offsetof(m68k_context, aregs) + sizeof(uint32_t)*sec_reg, SCRATCH1, SZ_W, SZ_D); |
858 } | 858 } |
866 dst = add_rr(dst, SCRATCH1, SCRATCH2, SZ_D); | 866 dst = add_rr(dst, SCRATCH1, SCRATCH2, SZ_D); |
867 if (src.base == SCRATCH1) { | 867 if (src.base == SCRATCH1) { |
868 dst = pop_r(dst, SCRATCH1); | 868 dst = pop_r(dst, SCRATCH1); |
869 } | 869 } |
870 } | 870 } |
871 if (inst->src.params.regs.displacement) { | 871 if (inst->dst.params.regs.displacement) { |
872 dst = add_ir(dst, inst->src.params.regs.displacement, SCRATCH2, SZ_D); | 872 dst = add_ir(dst, inst->dst.params.regs.displacement, SCRATCH2, SZ_D); |
873 } | 873 } |
874 dst = cmp_ir(dst, 0, flags_reg, inst->extra.size); | 874 dst = cmp_ir(dst, 0, flags_reg, inst->extra.size); |
875 dst = setcc_r(dst, CC_Z, FLAG_Z); | 875 dst = setcc_r(dst, CC_Z, FLAG_Z); |
876 dst = setcc_r(dst, CC_S, FLAG_N); | 876 dst = setcc_r(dst, CC_S, FLAG_N); |
877 switch (inst->extra.size) | 877 switch (inst->extra.size) |