comparison m68k_to_x86.c @ 146:5416a5c4628e

Implement most of the "X" instructions
author Mike Pavone <pavone@retrodev.com>
date Mon, 31 Dec 2012 20:09:09 -0800
parents c4d10c2aaee2
children 3e68e517cc01
comparison
equal deleted inserted replaced
145:15b8dce19cf4 146:5416a5c4628e
2170 dst = setcc_r(dst, CC_S, FLAG_N); 2170 dst = setcc_r(dst, CC_S, FLAG_N);
2171 dst = setcc_r(dst, CC_O, FLAG_V); 2171 dst = setcc_r(dst, CC_O, FLAG_V);
2172 dst = mov_rrind(dst, FLAG_C, CONTEXT, SZ_B); 2172 dst = mov_rrind(dst, FLAG_C, CONTEXT, SZ_B);
2173 dst = m68k_save_result(inst, dst, opts); 2173 dst = m68k_save_result(inst, dst, opts);
2174 break; 2174 break;
2175 //case M68K_ADDX: 2175 case M68K_ADDX:
2176 // break; 2176 dst = cycles(dst, BUS);
2177 dst = bt_irdisp8(dst, 0, CONTEXT, 0, SZ_B);
2178 if (src_op.mode == MODE_REG_DIRECT) {
2179 if (dst_op.mode == MODE_REG_DIRECT) {
2180 dst = adc_rr(dst, src_op.base, dst_op.base, inst->extra.size);
2181 } else {
2182 dst = adc_rrdisp8(dst, src_op.base, dst_op.base, dst_op.disp, inst->extra.size);
2183 }
2184 } else if (src_op.mode == MODE_REG_DISPLACE8) {
2185 dst = adc_rdisp8r(dst, src_op.base, src_op.disp, dst_op.base, inst->extra.size);
2186 } else {
2187 if (dst_op.mode == MODE_REG_DIRECT) {
2188 dst = adc_ir(dst, src_op.disp, dst_op.base, inst->extra.size);
2189 } else {
2190 dst = adc_irdisp8(dst, src_op.disp, dst_op.base, dst_op.disp, inst->extra.size);
2191 }
2192 }
2193 dst = setcc_r(dst, CC_C, FLAG_C);
2194 dst = setcc_r(dst, CC_Z, FLAG_Z);
2195 dst = setcc_r(dst, CC_S, FLAG_N);
2196 dst = setcc_r(dst, CC_O, FLAG_V);
2197 dst = mov_rrind(dst, FLAG_C, CONTEXT, SZ_B);
2198 dst = m68k_save_result(inst, dst, opts);
2199 break;
2177 case M68K_AND: 2200 case M68K_AND:
2178 dst = cycles(dst, BUS); 2201 dst = cycles(dst, BUS);
2179 if (src_op.mode == MODE_REG_DIRECT) { 2202 if (src_op.mode == MODE_REG_DIRECT) {
2180 if (dst_op.mode == MODE_REG_DIRECT) { 2203 if (dst_op.mode == MODE_REG_DIRECT) {
2181 dst = and_rr(dst, src_op.base, dst_op.base, inst->extra.size); 2204 dst = and_rr(dst, src_op.base, dst_op.base, inst->extra.size);
2634 } 2657 }
2635 dst = setcc_r(dst, CC_Z, FLAG_Z); 2658 dst = setcc_r(dst, CC_Z, FLAG_Z);
2636 dst = setcc_r(dst, CC_S, FLAG_N); 2659 dst = setcc_r(dst, CC_S, FLAG_N);
2637 } 2660 }
2638 break; 2661 break;
2639 /*case M68K_ROXL: 2662 case M68K_ROXL:
2640 case M68K_ROXR:*/ 2663 case M68K_ROXR:
2664 dst = mov_ir(dst, 0, FLAG_V, SZ_B);
2665 if (inst->src.addr_mode == MODE_UNUSED) {
2666 dst = cycles(dst, BUS);
2667 //Memory rotate
2668 dst = bt_irdisp8(dst, 0, CONTEXT, 0, SZ_B);
2669 if (inst->op == M68K_ROXL) {
2670 dst = rol_ir(dst, 1, dst_op.base, inst->extra.size);
2671 } else {
2672 dst = ror_ir(dst, 1, dst_op.base, inst->extra.size);
2673 }
2674 dst = setcc_r(dst, CC_C, FLAG_C);
2675 dst = cmp_ir(dst, 0, dst_op.base, inst->extra.size);
2676 dst = setcc_r(dst, CC_Z, FLAG_Z);
2677 dst = setcc_r(dst, CC_S, FLAG_N);
2678 dst = m68k_save_result(inst, dst, opts);
2679 } else {
2680 if (src_op.mode == MODE_IMMED) {
2681 dst = cycles(dst, (inst->extra.size == OPSIZE_LONG ? 8 : 6) + src_op.disp*2);
2682 dst = bt_irdisp8(dst, 0, CONTEXT, 0, SZ_B);
2683 if (dst_op.mode == MODE_REG_DIRECT) {
2684 if (inst->op == M68K_ROXL) {
2685 dst = rol_ir(dst, src_op.disp, dst_op.base, inst->extra.size);
2686 } else {
2687 dst = ror_ir(dst, src_op.disp, dst_op.base, inst->extra.size);
2688 }
2689 } else {
2690 if (inst->op == M68K_ROXL) {
2691 dst = rol_irdisp8(dst, src_op.disp, dst_op.base, dst_op.disp, inst->extra.size);
2692 } else {
2693 dst = ror_irdisp8(dst, src_op.disp, dst_op.base, dst_op.disp, inst->extra.size);
2694 }
2695 }
2696 dst = setcc_r(dst, CC_C, FLAG_C);
2697 } else {
2698 if (src_op.mode == MODE_REG_DIRECT) {
2699 if (src_op.base != SCRATCH1) {
2700 dst = mov_rr(dst, src_op.base, SCRATCH1, SZ_B);
2701 }
2702 } else {
2703 dst = mov_rdisp8r(dst, src_op.base, src_op.disp, SCRATCH1, SZ_B);
2704 }
2705 dst = and_ir(dst, 63, SCRATCH1, SZ_D);
2706 zero_off = dst+1;
2707 dst = jcc(dst, CC_NZ, dst+2);
2708 dst = add_rr(dst, SCRATCH1, CYCLES, SZ_D);
2709 dst = add_rr(dst, SCRATCH1, CYCLES, SZ_D);
2710 dst = cmp_ir(dst, 32, SCRATCH1, SZ_B);
2711 norm_off = dst+1;
2712 dst = jcc(dst, CC_L, dst+2);
2713 dst = bt_irdisp8(dst, 0, CONTEXT, 0, SZ_B);
2714 if (dst_op.mode == MODE_REG_DIRECT) {
2715 if (inst->op == M68K_ROXL) {
2716 dst = rol_ir(dst, 31, dst_op.base, inst->extra.size);
2717 dst = rol_ir(dst, 1, dst_op.base, inst->extra.size);
2718 } else {
2719 dst = ror_ir(dst, 31, dst_op.base, inst->extra.size);
2720 dst = ror_ir(dst, 1, dst_op.base, inst->extra.size);
2721 }
2722 } else {
2723 if (inst->op == M68K_ROXL) {
2724 dst = rol_irdisp8(dst, 31, dst_op.base, dst_op.disp, inst->extra.size);
2725 dst = rol_irdisp8(dst, 1, dst_op.base, dst_op.disp, inst->extra.size);
2726 } else {
2727 dst = ror_irdisp8(dst, 31, dst_op.base, dst_op.disp, inst->extra.size);
2728 dst = ror_irdisp8(dst, 1, dst_op.base, dst_op.disp, inst->extra.size);
2729 }
2730 }
2731 dst = sub_ir(dst, 32, SCRATCH1, SZ_B);
2732 *norm_off = dst - (norm_off+1);
2733 dst = bt_irdisp8(dst, 0, CONTEXT, 0, SZ_B);
2734 if (dst_op.mode == MODE_REG_DIRECT) {
2735 if (inst->op == M68K_ROXL) {
2736 dst = rol_clr(dst, dst_op.base, inst->extra.size);
2737 } else {
2738 dst = ror_clr(dst, dst_op.base, inst->extra.size);
2739 }
2740 } else {
2741 if (inst->op == M68K_ROXL) {
2742 dst = rol_clrdisp8(dst, dst_op.base, dst_op.disp, inst->extra.size);
2743 } else {
2744 dst = ror_clrdisp8(dst, dst_op.base, dst_op.disp, inst->extra.size);
2745 }
2746 }
2747 dst = setcc_r(dst, CC_C, FLAG_C);
2748 end_off = dst + 1;
2749 dst = jmp(dst, dst+2);
2750 *zero_off = dst - (zero_off+1);
2751 dst = mov_ir(dst, 0, FLAG_C, SZ_B);
2752 *end_off = dst - (end_off+1);
2753 }
2754 if (dst_op.mode == MODE_REG_DIRECT) {
2755 dst = cmp_ir(dst, 0, dst_op.base, inst->extra.size);
2756 } else {
2757 dst = cmp_irdisp8(dst, 0, dst_op.base, dst_op.disp, inst->extra.size);
2758 }
2759 dst = setcc_r(dst, CC_Z, FLAG_Z);
2760 dst = setcc_r(dst, CC_S, FLAG_N);
2761 }
2762 break;
2641 case M68K_RTE: 2763 case M68K_RTE:
2642 dst = mov_rr(dst, opts->aregs[7], SCRATCH1, SZ_D); 2764 dst = mov_rr(dst, opts->aregs[7], SCRATCH1, SZ_D);
2643 dst = call(dst, (uint8_t *)m68k_read_long_scratch1); 2765 dst = call(dst, (uint8_t *)m68k_read_long_scratch1);
2644 dst = push_r(dst, SCRATCH1); 2766 dst = push_r(dst, SCRATCH1);
2645 dst = add_ir(dst, 4, opts->aregs[7], SZ_D); 2767 dst = add_ir(dst, 4, opts->aregs[7], SZ_D);
2684 dst = setcc_r(dst, CC_S, FLAG_N); 2806 dst = setcc_r(dst, CC_S, FLAG_N);
2685 dst = setcc_r(dst, CC_O, FLAG_V); 2807 dst = setcc_r(dst, CC_O, FLAG_V);
2686 dst = mov_rrind(dst, FLAG_C, CONTEXT, SZ_B); 2808 dst = mov_rrind(dst, FLAG_C, CONTEXT, SZ_B);
2687 dst = m68k_save_result(inst, dst, opts); 2809 dst = m68k_save_result(inst, dst, opts);
2688 break; 2810 break;
2689 //case M68K_SUBX: 2811 case M68K_SUBX:
2690 // break; 2812 dst = cycles(dst, BUS);
2813 dst = bt_irdisp8(dst, 0, CONTEXT, 0, SZ_B);
2814 if (src_op.mode == MODE_REG_DIRECT) {
2815 if (dst_op.mode == MODE_REG_DIRECT) {
2816 dst = sbb_rr(dst, src_op.base, dst_op.base, inst->extra.size);
2817 } else {
2818 dst = sbb_rrdisp8(dst, src_op.base, dst_op.base, dst_op.disp, inst->extra.size);
2819 }
2820 } else if (src_op.mode == MODE_REG_DISPLACE8) {
2821 dst = sbb_rdisp8r(dst, src_op.base, src_op.disp, dst_op.base, inst->extra.size);
2822 } else {
2823 if (dst_op.mode == MODE_REG_DIRECT) {
2824 dst = sbb_ir(dst, src_op.disp, dst_op.base, inst->extra.size);
2825 } else {
2826 dst = sbb_irdisp8(dst, src_op.disp, dst_op.base, dst_op.disp, inst->extra.size);
2827 }
2828 }
2829 dst = setcc_r(dst, CC_C, FLAG_C);
2830 dst = setcc_r(dst, CC_Z, FLAG_Z);
2831 dst = setcc_r(dst, CC_S, FLAG_N);
2832 dst = setcc_r(dst, CC_O, FLAG_V);
2833 dst = mov_rrind(dst, FLAG_C, CONTEXT, SZ_B);
2834 dst = m68k_save_result(inst, dst, opts);
2835 break;
2691 case M68K_SWAP: 2836 case M68K_SWAP:
2692 dst = cycles(dst, BUS); 2837 dst = cycles(dst, BUS);
2693 if (src_op.mode == MODE_REG_DIRECT) { 2838 if (src_op.mode == MODE_REG_DIRECT) {
2694 dst = rol_ir(dst, 16, src_op.base, SZ_D); 2839 dst = rol_ir(dst, 16, src_op.base, SZ_D);
2695 } else{ 2840 } else{