Mercurial > repos > blastem
comparison m68k_to_x86.c @ 64:2b1a65f4b85d
Cleanup 68K timing code. Temporarily omment out fFPS counter as it was causing segfaults
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Wed, 19 Dec 2012 21:25:39 -0800 |
parents | 918468c623e9 |
children | 7a22a0e6c004 |
comparison
equal
deleted
inserted
replaced
63:a6dd5b7a971b | 64:2b1a65f4b85d |
---|---|
40 void m68k_start_context(uint8_t * addr, m68k_context * context); | 40 void m68k_start_context(uint8_t * addr, m68k_context * context); |
41 | 41 |
42 uint8_t * cycles(uint8_t * dst, uint32_t num) | 42 uint8_t * cycles(uint8_t * dst, uint32_t num) |
43 { | 43 { |
44 dst = add_ir(dst, num, CYCLES, SZ_D); | 44 dst = add_ir(dst, num, CYCLES, SZ_D); |
45 } | |
46 | |
47 uint8_t * check_cycles(uint8_t * dst) | |
48 { | |
49 dst = cmp_rr(dst, CYCLES, LIMIT, SZ_D); | |
50 dst = jcc(dst, CC_G, dst+7); | |
51 dst = call(dst, (char *)handle_cycle_limit); | |
52 } | 45 } |
53 | 46 |
54 int8_t native_reg(m68k_op_info * op, x86_68k_options * opts) | 47 int8_t native_reg(m68k_op_info * op, x86_68k_options * opts) |
55 { | 48 { |
56 if (op->addr_mode == MODE_REG) { | 49 if (op->addr_mode == MODE_REG) { |
117 if (opts->aregs[inst->src.params.regs.pri] >= 0) { | 110 if (opts->aregs[inst->src.params.regs.pri] >= 0) { |
118 out = sub_ir(out, inc_amount, opts->aregs[inst->src.params.regs.pri], SZ_D); | 111 out = sub_ir(out, inc_amount, opts->aregs[inst->src.params.regs.pri], SZ_D); |
119 } else { | 112 } else { |
120 out = sub_irdisp8(out, inc_amount, CONTEXT, reg_offset(&(inst->src)), SZ_D); | 113 out = sub_irdisp8(out, inc_amount, CONTEXT, reg_offset(&(inst->src)), SZ_D); |
121 } | 114 } |
122 out = check_cycles(out); | |
123 case MODE_AREG_INDIRECT: | 115 case MODE_AREG_INDIRECT: |
124 case MODE_AREG_POSTINC: | 116 case MODE_AREG_POSTINC: |
125 if (opts->aregs[inst->src.params.regs.pri] >= 0) { | 117 if (opts->aregs[inst->src.params.regs.pri] >= 0) { |
126 out = mov_rr(out, opts->aregs[inst->src.params.regs.pri], SCRATCH1, SZ_D); | 118 out = mov_rr(out, opts->aregs[inst->src.params.regs.pri], SCRATCH1, SZ_D); |
127 } else { | 119 } else { |
175 ea->base = SCRATCH1; | 167 ea->base = SCRATCH1; |
176 break; | 168 break; |
177 case MODE_IMMEDIATE: | 169 case MODE_IMMEDIATE: |
178 case MODE_IMMEDIATE_WORD: | 170 case MODE_IMMEDIATE_WORD: |
179 if (inst->variant != VAR_QUICK) { | 171 if (inst->variant != VAR_QUICK) { |
180 if (inst->extra.size == OPSIZE_LONG && inst->src.addr_mode == MODE_IMMEDIATE) { | 172 out = cycles(out, (inst->extra.size == OPSIZE_LONG && inst->src.addr_mode == MODE_IMMEDIATE) ? BUS*2 : BUS); |
181 out = cycles(out, BUS); | |
182 out = check_cycles(out); | |
183 } | |
184 out = cycles(out, BUS); | |
185 out = check_cycles(out); | |
186 } | 173 } |
187 ea->mode = MODE_IMMED; | 174 ea->mode = MODE_IMMED; |
188 ea->disp = inst->src.params.immed; | 175 ea->disp = inst->src.params.immed; |
189 break; | 176 break; |
190 default: | 177 default: |
505 exit(1); | 492 exit(1); |
506 } | 493 } |
507 | 494 |
508 //add cycles for prefetch | 495 //add cycles for prefetch |
509 dst = cycles(dst, BUS); | 496 dst = cycles(dst, BUS); |
510 dst = check_cycles(dst); | |
511 return dst; | 497 return dst; |
512 } | 498 } |
513 | 499 |
514 uint8_t * translate_m68k_clr(uint8_t * dst, m68kinst * inst, x86_68k_options * opts) | 500 uint8_t * translate_m68k_clr(uint8_t * dst, m68kinst * inst, x86_68k_options * opts) |
515 { | 501 { |
517 dst = mov_ir(dst, 0, FLAG_V, SZ_B); | 503 dst = mov_ir(dst, 0, FLAG_V, SZ_B); |
518 dst = mov_ir(dst, 0, FLAG_C, SZ_B); | 504 dst = mov_ir(dst, 0, FLAG_C, SZ_B); |
519 dst = mov_ir(dst, 1, FLAG_Z, SZ_B); | 505 dst = mov_ir(dst, 1, FLAG_Z, SZ_B); |
520 uint8_t reg = native_reg(&(inst->dst), opts); | 506 uint8_t reg = native_reg(&(inst->dst), opts); |
521 if (reg >= 0) { | 507 if (reg >= 0) { |
522 dst = xor_rr(dst, reg, reg, inst->extra.size); | 508 dst = cycles(dst, (inst->extra.size == OPSIZE_LONG ? 6 : 4)); |
523 return check_cycles(dst); | 509 return xor_rr(dst, reg, reg, inst->extra.size); |
524 } | 510 } |
525 int32_t dec_amount,inc_amount; | 511 int32_t dec_amount,inc_amount; |
526 switch (inst->dst.addr_mode) | 512 switch (inst->dst.addr_mode) |
527 { | 513 { |
528 case MODE_REG: | 514 case MODE_REG: |
529 case MODE_AREG: | 515 case MODE_AREG: |
530 dst = cycles(dst, (inst->extra.size == OPSIZE_LONG ? 6 : 4)); | 516 dst = cycles(dst, (inst->extra.size == OPSIZE_LONG ? 6 : 4)); |
531 dst = mov_irdisp8(dst, 0, CONTEXT, reg_offset(&(inst->dst)), inst->extra.size); | 517 dst = mov_irdisp8(dst, 0, CONTEXT, reg_offset(&(inst->dst)), inst->extra.size); |
532 dst = check_cycles(dst); | |
533 break; | 518 break; |
534 case MODE_AREG_PREDEC: | 519 case MODE_AREG_PREDEC: |
535 dst = cycles(dst, PREDEC_PENALTY); | 520 dst = cycles(dst, PREDEC_PENALTY); |
536 dec_amount = inst->extra.size == OPSIZE_WORD ? 2 : (inst->extra.size == OPSIZE_LONG ? 4 : 1); | 521 dec_amount = inst->extra.size == OPSIZE_WORD ? 2 : (inst->extra.size == OPSIZE_LONG ? 4 : 1); |
537 if (opts->aregs[inst->dst.params.regs.pri] >= 0) { | 522 if (opts->aregs[inst->dst.params.regs.pri] >= 0) { |
541 } | 526 } |
542 case MODE_AREG_INDIRECT: | 527 case MODE_AREG_INDIRECT: |
543 case MODE_AREG_POSTINC: | 528 case MODE_AREG_POSTINC: |
544 //add cycles for prefetch and wasted read | 529 //add cycles for prefetch and wasted read |
545 dst = cycles(dst, (inst->extra.size == OPSIZE_LONG ? 12 : 8)); | 530 dst = cycles(dst, (inst->extra.size == OPSIZE_LONG ? 12 : 8)); |
546 dst = check_cycles(dst); | |
547 if (opts->aregs[inst->dst.params.regs.pri] >= 0) { | 531 if (opts->aregs[inst->dst.params.regs.pri] >= 0) { |
548 dst = mov_rr(dst, opts->aregs[inst->dst.params.regs.pri], SCRATCH2, SZ_D); | 532 dst = mov_rr(dst, opts->aregs[inst->dst.params.regs.pri], SCRATCH2, SZ_D); |
549 } else { | 533 } else { |
550 dst = mov_rdisp8r(dst, CONTEXT, reg_offset(&(inst->dst)), SCRATCH2, SZ_D); | 534 dst = mov_rdisp8r(dst, CONTEXT, reg_offset(&(inst->dst)), SCRATCH2, SZ_D); |
551 } | 535 } |
594 } else { | 578 } else { |
595 dst = mov_rdisp8r(dst, CONTEXT, offsetof(m68k_context, aregs) + 4 * inst->src.params.regs.pri, SCRATCH1, SZ_D); | 579 dst = mov_rdisp8r(dst, CONTEXT, offsetof(m68k_context, aregs) + 4 * inst->src.params.regs.pri, SCRATCH1, SZ_D); |
596 dst = mov_rrdisp8(dst, SCRATCH1, CONTEXT, offsetof(m68k_context, aregs) + 4 * inst->dst.params.regs.pri, SZ_D); | 580 dst = mov_rrdisp8(dst, SCRATCH1, CONTEXT, offsetof(m68k_context, aregs) + 4 * inst->dst.params.regs.pri, SZ_D); |
597 } | 581 } |
598 } | 582 } |
599 dst = check_cycles(dst); | |
600 break; | 583 break; |
601 case MODE_ABSOLUTE: | 584 case MODE_ABSOLUTE: |
602 dst = cycles(dst, BUS); | |
603 dst = check_cycles(dst); | |
604 case MODE_ABSOLUTE_SHORT: | 585 case MODE_ABSOLUTE_SHORT: |
605 dst = cycles(dst, BUS); | 586 dst = cycles(dst, (inst->src.addr_mode == MODE_ABSOLUTE) ? BUS * 3 : BUS * 2); |
606 dst = check_cycles(dst); | |
607 dst = cycles(dst, BUS); | |
608 if (dst_reg >= 0) { | 587 if (dst_reg >= 0) { |
609 dst = mov_ir(dst, inst->src.params.immed, dst_reg, SZ_D); | 588 dst = mov_ir(dst, inst->src.params.immed, dst_reg, SZ_D); |
610 } else { | 589 } else { |
611 dst = mov_irdisp8(dst, inst->src.params.immed, CONTEXT, offsetof(m68k_context, aregs) + 4 * inst->dst.params.regs.pri, SZ_D); | 590 dst = mov_irdisp8(dst, inst->src.params.immed, CONTEXT, offsetof(m68k_context, aregs) + 4 * inst->dst.params.regs.pri, SZ_D); |
612 } | 591 } |
613 dst = check_cycles(dst); | |
614 break; | 592 break; |
615 } | 593 } |
616 return dst; | 594 return dst; |
617 } | 595 } |
618 | 596 |
716 if (opts->aregs[inst->src.params.regs.pri] >= 0) { | 694 if (opts->aregs[inst->src.params.regs.pri] >= 0) { |
717 dst = mov_rr(dst, opts->aregs[inst->src.params.regs.pri], SCRATCH1, SZ_D); | 695 dst = mov_rr(dst, opts->aregs[inst->src.params.regs.pri], SCRATCH1, SZ_D); |
718 } else { | 696 } else { |
719 dst = mov_rdisp8r(dst, CONTEXT, offsetof(m68k_context, aregs) + 4 * inst->src.params.regs.pri, SCRATCH1, SZ_D); | 697 dst = mov_rdisp8r(dst, CONTEXT, offsetof(m68k_context, aregs) + 4 * inst->src.params.regs.pri, SCRATCH1, SZ_D); |
720 } | 698 } |
721 dst = check_cycles(dst); | |
722 dst = call(dst, (uint8_t *)m68k_native_addr); | 699 dst = call(dst, (uint8_t *)m68k_native_addr); |
723 //TODO: Finish me | 700 //TODO: Finish me |
724 //TODO: Fix timing | 701 //TODO: Fix timing |
725 break; | 702 break; |
726 case MODE_ABSOLUTE: | 703 case MODE_ABSOLUTE: |
727 case MODE_ABSOLUTE_SHORT: | 704 case MODE_ABSOLUTE_SHORT: |
728 dst = cycles(dst, inst->src.addr_mode == MODE_ABSOLUTE ? 12 : 10); | 705 dst = cycles(dst, inst->src.addr_mode == MODE_ABSOLUTE ? 12 : 10); |
729 dst = check_cycles(dst); | |
730 dest_addr = get_native_address(opts->native_code_map, inst->src.params.immed); | 706 dest_addr = get_native_address(opts->native_code_map, inst->src.params.immed); |
731 if (!dest_addr) { | 707 if (!dest_addr) { |
732 opts->deferred = defer_address(opts->deferred, inst->src.params.immed, dst + 1); | 708 opts->deferred = defer_address(opts->deferred, inst->src.params.immed, dst + 1); |
733 //dummy address to be replaced later, make sure it generates a 4-byte displacement | 709 //dummy address to be replaced later, make sure it generates a 4-byte displacement |
734 dest_addr = dst + 256; | 710 dest_addr = dst + 256; |
754 | 730 |
755 uint8_t * translate_m68k_dbcc(uint8_t * dst, m68kinst * inst, x86_68k_options * opts) | 731 uint8_t * translate_m68k_dbcc(uint8_t * dst, m68kinst * inst, x86_68k_options * opts) |
756 { | 732 { |
757 //best case duration | 733 //best case duration |
758 dst = cycles(dst, 10); | 734 dst = cycles(dst, 10); |
759 dst = check_cycles(dst); | |
760 uint8_t * skip_loc = NULL; | 735 uint8_t * skip_loc = NULL; |
761 //TODO: Check if COND_TRUE technically valid here even though | 736 //TODO: Check if COND_TRUE technically valid here even though |
762 //it's basically a slow NOP | 737 //it's basically a slow NOP |
763 if (inst->extra.cond != COND_FALSE) { | 738 if (inst->extra.cond != COND_FALSE) { |
764 uint8_t cond = CC_NZ; | 739 uint8_t cond = CC_NZ; |
829 *skip_loc = dst - (skip_loc+1); | 804 *skip_loc = dst - (skip_loc+1); |
830 dst = cycles(dst, 2); | 805 dst = cycles(dst, 2); |
831 } else { | 806 } else { |
832 dst = cycles(dst, 4); | 807 dst = cycles(dst, 4); |
833 } | 808 } |
834 dst = check_cycles(dst); | |
835 return dst; | 809 return dst; |
836 } | 810 } |
837 | 811 |
838 typedef uint8_t * (*shift_ir_t)(uint8_t * out, uint8_t val, uint8_t dst, uint8_t size); | 812 typedef uint8_t * (*shift_ir_t)(uint8_t * out, uint8_t val, uint8_t dst, uint8_t size); |
839 typedef uint8_t * (*shift_irdisp8_t)(uint8_t * out, uint8_t val, uint8_t dst_base, int8_t disp, uint8_t size); | 813 typedef uint8_t * (*shift_irdisp8_t)(uint8_t * out, uint8_t val, uint8_t dst_base, int8_t disp, uint8_t size); |
843 uint8_t * translate_shift(uint8_t * dst, m68kinst * inst, x86_ea *src_op, x86_ea * dst_op, x86_68k_options * opts, shift_ir_t shift_ir, shift_irdisp8_t shift_irdisp8, shift_clr_t shift_clr, shift_clrdisp8_t shift_clrdisp8, shift_ir_t special, shift_irdisp8_t special_disp8) | 817 uint8_t * translate_shift(uint8_t * dst, m68kinst * inst, x86_ea *src_op, x86_ea * dst_op, x86_68k_options * opts, shift_ir_t shift_ir, shift_irdisp8_t shift_irdisp8, shift_clr_t shift_clr, shift_clrdisp8_t shift_clrdisp8, shift_ir_t special, shift_irdisp8_t special_disp8) |
844 { | 818 { |
845 uint8_t * end_off = NULL; | 819 uint8_t * end_off = NULL; |
846 if (inst->src.addr_mode == MODE_UNUSED) { | 820 if (inst->src.addr_mode == MODE_UNUSED) { |
847 dst = cycles(dst, BUS); | 821 dst = cycles(dst, BUS); |
848 dst = check_cycles(dst); | |
849 //Memory shift | 822 //Memory shift |
850 dst = shift_ir(dst, 1, dst_op->base, SZ_W); | 823 dst = shift_ir(dst, 1, dst_op->base, SZ_W); |
851 } else { | 824 } else { |
852 dst = cycles(dst, inst->extra.size == OPSIZE_LONG ? 8 : 6); | 825 dst = cycles(dst, inst->extra.size == OPSIZE_LONG ? 8 : 6); |
853 dst = check_cycles(dst); | |
854 if (src_op->mode == MODE_IMMED) { | 826 if (src_op->mode == MODE_IMMED) { |
855 if (dst_op->mode == MODE_REG_DIRECT) { | 827 if (dst_op->mode == MODE_REG_DIRECT) { |
856 dst = shift_ir(dst, src_op->disp, dst_op->base, inst->extra.size); | 828 dst = shift_ir(dst, src_op->disp, dst_op->base, inst->extra.size); |
857 } else { | 829 } else { |
858 dst = shift_irdisp8(dst, src_op->disp, dst_op->base, dst_op->disp, inst->extra.size); | 830 dst = shift_irdisp8(dst, src_op->disp, dst_op->base, dst_op->disp, inst->extra.size); |
931 dst = mov_ir(dst, 0, FLAG_V, SZ_B); | 903 dst = mov_ir(dst, 0, FLAG_V, SZ_B); |
932 //set X flag to same as C flag | 904 //set X flag to same as C flag |
933 dst = mov_rrind(dst, FLAG_C, CONTEXT, SZ_B); | 905 dst = mov_rrind(dst, FLAG_C, CONTEXT, SZ_B); |
934 if (inst->src.addr_mode == MODE_UNUSED) { | 906 if (inst->src.addr_mode == MODE_UNUSED) { |
935 dst = m68k_save_result(inst, dst, opts); | 907 dst = m68k_save_result(inst, dst, opts); |
936 } else { | |
937 dst = check_cycles(dst); | |
938 } | 908 } |
939 } | 909 } |
940 | 910 |
941 uint8_t * translate_m68k(uint8_t * dst, m68kinst * inst, x86_68k_options * opts) | 911 uint8_t * translate_m68k(uint8_t * dst, m68kinst * inst, x86_68k_options * opts) |
942 { | 912 { |
990 dst = setcc_r(dst, CC_C, FLAG_C); | 960 dst = setcc_r(dst, CC_C, FLAG_C); |
991 dst = setcc_r(dst, CC_Z, FLAG_Z); | 961 dst = setcc_r(dst, CC_Z, FLAG_Z); |
992 dst = setcc_r(dst, CC_S, FLAG_N); | 962 dst = setcc_r(dst, CC_S, FLAG_N); |
993 dst = setcc_r(dst, CC_O, FLAG_V); | 963 dst = setcc_r(dst, CC_O, FLAG_V); |
994 dst = mov_rrind(dst, FLAG_C, CONTEXT, SZ_B); | 964 dst = mov_rrind(dst, FLAG_C, CONTEXT, SZ_B); |
995 dst = check_cycles(dst); | |
996 dst = m68k_save_result(inst, dst, opts); | 965 dst = m68k_save_result(inst, dst, opts); |
997 break; | 966 break; |
998 case M68K_ADDX: | 967 case M68K_ADDX: |
999 break; | 968 break; |
1000 case M68K_AND: | 969 case M68K_AND: |
1016 } | 985 } |
1017 dst = mov_ir(dst, 0, FLAG_C, SZ_B); | 986 dst = mov_ir(dst, 0, FLAG_C, SZ_B); |
1018 dst = setcc_r(dst, CC_Z, FLAG_Z); | 987 dst = setcc_r(dst, CC_Z, FLAG_Z); |
1019 dst = setcc_r(dst, CC_S, FLAG_N); | 988 dst = setcc_r(dst, CC_S, FLAG_N); |
1020 dst = mov_ir(dst, 0, FLAG_V, SZ_B); | 989 dst = mov_ir(dst, 0, FLAG_V, SZ_B); |
1021 dst = check_cycles(dst); | |
1022 dst = m68k_save_result(inst, dst, opts); | 990 dst = m68k_save_result(inst, dst, opts); |
1023 break; | 991 break; |
1024 case M68K_ANDI_CCR: | 992 case M68K_ANDI_CCR: |
1025 case M68K_ANDI_SR: | 993 case M68K_ANDI_SR: |
1026 break; | 994 break; |
1098 } | 1066 } |
1099 dst = setcc_r(dst, CC_C, FLAG_C); | 1067 dst = setcc_r(dst, CC_C, FLAG_C); |
1100 dst = setcc_r(dst, CC_Z, FLAG_Z); | 1068 dst = setcc_r(dst, CC_Z, FLAG_Z); |
1101 dst = setcc_r(dst, CC_S, FLAG_N); | 1069 dst = setcc_r(dst, CC_S, FLAG_N); |
1102 dst = setcc_r(dst, CC_O, FLAG_V); | 1070 dst = setcc_r(dst, CC_O, FLAG_V); |
1103 dst = check_cycles(dst); | |
1104 break; | 1071 break; |
1105 case M68K_DIVS: | 1072 case M68K_DIVS: |
1106 case M68K_DIVU: | 1073 case M68K_DIVU: |
1107 break; | 1074 break; |
1108 case M68K_EOR: | 1075 case M68K_EOR: |
1124 } | 1091 } |
1125 dst = mov_ir(dst, 0, FLAG_C, SZ_B); | 1092 dst = mov_ir(dst, 0, FLAG_C, SZ_B); |
1126 dst = setcc_r(dst, CC_Z, FLAG_Z); | 1093 dst = setcc_r(dst, CC_Z, FLAG_Z); |
1127 dst = setcc_r(dst, CC_S, FLAG_N); | 1094 dst = setcc_r(dst, CC_S, FLAG_N); |
1128 dst = mov_ir(dst, 0, FLAG_V, SZ_B); | 1095 dst = mov_ir(dst, 0, FLAG_V, SZ_B); |
1129 dst = check_cycles(dst); | |
1130 dst = m68k_save_result(inst, dst, opts); | 1096 dst = m68k_save_result(inst, dst, opts); |
1131 break; | 1097 break; |
1132 case M68K_EORI_CCR: | 1098 case M68K_EORI_CCR: |
1133 case M68K_EORI_SR: | 1099 case M68K_EORI_SR: |
1134 case M68K_EXG: | 1100 case M68K_EXG: |
1151 dst = mov_rdisp8r(dst, src_op.base, src_op.disp, SCRATCH1, SZ_D); | 1117 dst = mov_rdisp8r(dst, src_op.base, src_op.disp, SCRATCH1, SZ_D); |
1152 dst = mov_rrdisp8(dst, SCRATCH1, dst_op.base, dst_op.disp, SZ_D); | 1118 dst = mov_rrdisp8(dst, SCRATCH1, dst_op.base, dst_op.disp, SZ_D); |
1153 dst = mov_rrdisp8(dst, SCRATCH2, src_op.base, src_op.disp, SZ_D); | 1119 dst = mov_rrdisp8(dst, SCRATCH2, src_op.base, src_op.disp, SZ_D); |
1154 } | 1120 } |
1155 } | 1121 } |
1156 dst = check_cycles(dst); | |
1157 break; | 1122 break; |
1158 case M68K_EXT: | 1123 case M68K_EXT: |
1159 break; | 1124 break; |
1160 case M68K_ILLEGAL: | 1125 case M68K_ILLEGAL: |
1161 dst = call(dst, (uint8_t *)m68k_save_context); | 1126 dst = call(dst, (uint8_t *)m68k_save_context); |
1177 case M68K_NEG: | 1142 case M68K_NEG: |
1178 case M68K_NEGX: | 1143 case M68K_NEGX: |
1179 break; | 1144 break; |
1180 case M68K_NOP: | 1145 case M68K_NOP: |
1181 dst = cycles(dst, BUS); | 1146 dst = cycles(dst, BUS); |
1182 dst = check_cycles(dst); | |
1183 break; | 1147 break; |
1184 case M68K_NOT: | 1148 case M68K_NOT: |
1185 break; | 1149 break; |
1186 case M68K_OR: | 1150 case M68K_OR: |
1187 dst = cycles(dst, BUS); | 1151 dst = cycles(dst, BUS); |
1202 } | 1166 } |
1203 dst = mov_ir(dst, 0, FLAG_C, SZ_B); | 1167 dst = mov_ir(dst, 0, FLAG_C, SZ_B); |
1204 dst = setcc_r(dst, CC_Z, FLAG_Z); | 1168 dst = setcc_r(dst, CC_Z, FLAG_Z); |
1205 dst = setcc_r(dst, CC_S, FLAG_N); | 1169 dst = setcc_r(dst, CC_S, FLAG_N); |
1206 dst = mov_ir(dst, 0, FLAG_V, SZ_B); | 1170 dst = mov_ir(dst, 0, FLAG_V, SZ_B); |
1207 dst = check_cycles(dst); | |
1208 dst = m68k_save_result(inst, dst, opts); | 1171 dst = m68k_save_result(inst, dst, opts); |
1209 break; | 1172 break; |
1210 case M68K_ORI_CCR: | 1173 case M68K_ORI_CCR: |
1211 case M68K_ORI_SR: | 1174 case M68K_ORI_SR: |
1212 case M68K_PEA: | 1175 case M68K_PEA: |
1241 dst = setcc_r(dst, CC_C, FLAG_C); | 1204 dst = setcc_r(dst, CC_C, FLAG_C); |
1242 dst = setcc_r(dst, CC_Z, FLAG_Z); | 1205 dst = setcc_r(dst, CC_Z, FLAG_Z); |
1243 dst = setcc_r(dst, CC_S, FLAG_N); | 1206 dst = setcc_r(dst, CC_S, FLAG_N); |
1244 dst = setcc_r(dst, CC_O, FLAG_V); | 1207 dst = setcc_r(dst, CC_O, FLAG_V); |
1245 dst = mov_rrind(dst, FLAG_C, CONTEXT, SZ_B); | 1208 dst = mov_rrind(dst, FLAG_C, CONTEXT, SZ_B); |
1246 dst = check_cycles(dst); | |
1247 dst = m68k_save_result(inst, dst, opts); | 1209 dst = m68k_save_result(inst, dst, opts); |
1248 break; | 1210 break; |
1249 case M68K_SUBX: | 1211 case M68K_SUBX: |
1250 break; | 1212 break; |
1251 case M68K_SWAP: | 1213 case M68K_SWAP: |
1257 } | 1219 } |
1258 dst = mov_ir(dst, 0, FLAG_C, SZ_B); | 1220 dst = mov_ir(dst, 0, FLAG_C, SZ_B); |
1259 dst = setcc_r(dst, CC_Z, FLAG_Z); | 1221 dst = setcc_r(dst, CC_Z, FLAG_Z); |
1260 dst = setcc_r(dst, CC_S, FLAG_N); | 1222 dst = setcc_r(dst, CC_S, FLAG_N); |
1261 dst = mov_ir(dst, 0, FLAG_V, SZ_B); | 1223 dst = mov_ir(dst, 0, FLAG_V, SZ_B); |
1262 dst = check_cycles(dst); | |
1263 break; | 1224 break; |
1264 case M68K_TAS: | 1225 case M68K_TAS: |
1265 case M68K_TRAP: | 1226 case M68K_TRAP: |
1266 case M68K_TRAPV: | 1227 case M68K_TRAPV: |
1267 case M68K_TST: | 1228 case M68K_TST: |
1273 } | 1234 } |
1274 dst = setcc_r(dst, CC_C, FLAG_C); | 1235 dst = setcc_r(dst, CC_C, FLAG_C); |
1275 dst = setcc_r(dst, CC_Z, FLAG_Z); | 1236 dst = setcc_r(dst, CC_Z, FLAG_Z); |
1276 dst = setcc_r(dst, CC_S, FLAG_N); | 1237 dst = setcc_r(dst, CC_S, FLAG_N); |
1277 dst = setcc_r(dst, CC_O, FLAG_V); | 1238 dst = setcc_r(dst, CC_O, FLAG_V); |
1278 dst = check_cycles(dst); | |
1279 break; | 1239 break; |
1280 case M68K_UNLK: | 1240 case M68K_UNLK: |
1281 case M68K_INVALID: | 1241 case M68K_INVALID: |
1282 break; | 1242 break; |
1283 } | 1243 } |