Mercurial > repos > blastem
comparison m68k_to_x86.c @ 99:8491de5d6c06
Allow use of indexed modes as move dst
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Thu, 27 Dec 2012 22:05:22 -0800 |
parents | 104e257fb93c |
children | 45cd7d3e7918 |
comparison
equal
deleted
inserted
replaced
98:104e257fb93c | 99:8491de5d6c06 |
---|---|
699 native_code_map[chunk].offsets[offset] = native_addr-native_code_map[chunk].base; | 699 native_code_map[chunk].offsets[offset] = native_addr-native_code_map[chunk].base; |
700 } | 700 } |
701 | 701 |
702 uint8_t * translate_m68k_move(uint8_t * dst, m68kinst * inst, x86_68k_options * opts) | 702 uint8_t * translate_m68k_move(uint8_t * dst, m68kinst * inst, x86_68k_options * opts) |
703 { | 703 { |
704 int8_t reg, flags_reg; | 704 int8_t reg, flags_reg, sec_reg; |
705 uint8_t dir = 0; | 705 uint8_t dir = 0; |
706 int32_t offset; | 706 int32_t offset; |
707 int32_t inc_amount, dec_amount; | 707 int32_t inc_amount, dec_amount; |
708 x86_ea src; | 708 x86_ea src; |
709 dst = translate_m68k_src(inst, &src, dst, opts); | 709 dst = translate_m68k_src(inst, &src, dst, opts); |
805 } | 805 } |
806 } else if (src.mode == MODE_REG_DISPLACE8) { | 806 } else if (src.mode == MODE_REG_DISPLACE8) { |
807 dst = mov_rdisp8r(dst, src.base, src.disp, SCRATCH1, inst->extra.size); | 807 dst = mov_rdisp8r(dst, src.base, src.disp, SCRATCH1, inst->extra.size); |
808 } else { | 808 } else { |
809 dst = mov_ir(dst, src.disp, SCRATCH1, inst->extra.size); | 809 dst = mov_ir(dst, src.disp, SCRATCH1, inst->extra.size); |
810 } | |
811 dst = cmp_ir(dst, 0, flags_reg, inst->extra.size); | |
812 dst = setcc_r(dst, CC_Z, FLAG_Z); | |
813 dst = setcc_r(dst, CC_S, FLAG_N); | |
814 switch (inst->extra.size) | |
815 { | |
816 case OPSIZE_BYTE: | |
817 dst = call(dst, (char *)m68k_write_byte); | |
818 break; | |
819 case OPSIZE_WORD: | |
820 dst = call(dst, (char *)m68k_write_word); | |
821 break; | |
822 case OPSIZE_LONG: | |
823 dst = call(dst, (char *)m68k_write_long_highfirst); | |
824 break; | |
825 } | |
826 break; | |
827 case MODE_AREG_INDEX_DISP8: | |
828 dst = cycles(dst, 6);//TODO: Check to make sure this is correct | |
829 if (opts->aregs[inst->src.params.regs.pri] >= 0) { | |
830 dst = mov_rr(dst, opts->aregs[inst->src.params.regs.pri], SCRATCH2, SZ_D); | |
831 } else { | |
832 dst = mov_rdisp8r(dst, CONTEXT, reg_offset(&(inst->src)), SCRATCH2, SZ_D); | |
833 } | |
834 sec_reg = (inst->src.params.regs.sec >> 1) & 0x7; | |
835 if (inst->src.params.regs.sec & 1) { | |
836 if (inst->src.params.regs.sec & 0x10) { | |
837 if (opts->aregs[sec_reg] >= 0) { | |
838 dst = add_rr(dst, opts->aregs[sec_reg], SCRATCH2, SZ_D); | |
839 } else { | |
840 dst = add_rdisp8r(dst, CONTEXT, offsetof(m68k_context, aregs) + sizeof(uint32_t)*sec_reg, SCRATCH2, SZ_D); | |
841 } | |
842 } else { | |
843 if (opts->dregs[sec_reg] >= 0) { | |
844 dst = add_rr(dst, opts->dregs[sec_reg], SCRATCH2, SZ_D); | |
845 } else { | |
846 dst = add_rdisp8r(dst, CONTEXT, offsetof(m68k_context, dregs) + sizeof(uint32_t)*sec_reg, SCRATCH2, SZ_D); | |
847 } | |
848 } | |
849 } else { | |
850 if (src.base == SCRATCH1) { | |
851 dst = push_r(dst, SCRATCH1); | |
852 } | |
853 if (inst->src.params.regs.sec & 0x10) { | |
854 if (opts->aregs[sec_reg] >= 0) { | |
855 dst = movsx_rr(dst, opts->aregs[sec_reg], SCRATCH1, SZ_W, SZ_D); | |
856 } else { | |
857 dst = movsx_rdisp8r(dst, CONTEXT, offsetof(m68k_context, aregs) + sizeof(uint32_t)*sec_reg, SCRATCH1, SZ_W, SZ_D); | |
858 } | |
859 } else { | |
860 if (opts->dregs[sec_reg] >= 0) { | |
861 dst = movsx_rr(dst, opts->dregs[sec_reg], SCRATCH1, SZ_W, SZ_D); | |
862 } else { | |
863 dst = movsx_rdisp8r(dst, CONTEXT, offsetof(m68k_context, dregs) + sizeof(uint32_t)*sec_reg, SCRATCH1, SZ_W, SZ_D); | |
864 } | |
865 } | |
866 dst = add_rr(dst, SCRATCH1, SCRATCH2, SZ_D); | |
867 if (src.base == SCRATCH1) { | |
868 dst = pop_r(dst, SCRATCH1); | |
869 } | |
870 } | |
871 if (inst->src.params.regs.displacement) { | |
872 dst = add_ir(dst, inst->src.params.regs.displacement, SCRATCH2, SZ_D); | |
810 } | 873 } |
811 dst = cmp_ir(dst, 0, flags_reg, inst->extra.size); | 874 dst = cmp_ir(dst, 0, flags_reg, inst->extra.size); |
812 dst = setcc_r(dst, CC_Z, FLAG_Z); | 875 dst = setcc_r(dst, CC_Z, FLAG_Z); |
813 dst = setcc_r(dst, CC_S, FLAG_N); | 876 dst = setcc_r(dst, CC_S, FLAG_N); |
814 switch (inst->extra.size) | 877 switch (inst->extra.size) |