comparison m68k_to_x86.c @ 173:47b2796fb277

Implement negx
author Mike Pavone <pavone@retrodev.com>
date Sun, 06 Jan 2013 15:20:23 -0800
parents c61507f897e4
children a1c3ecb4823f
comparison
equal deleted inserted replaced
172:c61507f897e4 173:47b2796fb277
2999 dst = setcc_r(dst, CC_Z, FLAG_Z); 2999 dst = setcc_r(dst, CC_Z, FLAG_Z);
3000 dst = setcc_r(dst, CC_S, FLAG_N); 3000 dst = setcc_r(dst, CC_S, FLAG_N);
3001 break; 3001 break;
3002 //case M68K_NBCD: 3002 //case M68K_NBCD:
3003 case M68K_NEG: 3003 case M68K_NEG:
3004 dst = cycles(dst, BUS);
3004 if (dst_op.mode == MODE_REG_DIRECT) { 3005 if (dst_op.mode == MODE_REG_DIRECT) {
3005 dst = neg_r(dst, dst_op.base, inst->extra.size); 3006 dst = neg_r(dst, dst_op.base, inst->extra.size);
3006 } else { 3007 } else {
3007 dst = neg_rdisp8(dst, dst_op.base, dst_op.disp, inst->extra.size); 3008 dst = neg_rdisp8(dst, dst_op.base, dst_op.disp, inst->extra.size);
3008 } 3009 }
3009 dst = mov_ir(dst, 0, FLAG_C, SZ_B); 3010 dst = setcc_r(dst, CC_C, FLAG_C);
3010 dst = setcc_r(dst, CC_Z, FLAG_Z); 3011 dst = setcc_r(dst, CC_Z, FLAG_Z);
3011 dst = setcc_r(dst, CC_S, FLAG_N); 3012 dst = setcc_r(dst, CC_S, FLAG_N);
3012 dst = mov_ir(dst, 0, FLAG_V, SZ_B); 3013 dst = setcc_r(dst, CC_O, FLAG_V);
3014 dst = mov_rrind(dst, FLAG_C, CONTEXT, SZ_B);
3013 dst = m68k_save_result(inst, dst, opts); 3015 dst = m68k_save_result(inst, dst, opts);
3014 break; 3016 break;
3015 /*case M68K_NEGX: 3017 case M68K_NEGX:
3016 break;*/ 3018 dst = cycles(dst, BUS);
3019 if (dst_op.mode == MODE_REG_DIRECT) {
3020 if (dst_op.base == SCRATCH1) {
3021 dst = push_r(dst, SCRATCH2);
3022 dst = xor_rr(dst, SCRATCH2, SCRATCH2, inst->extra.size);
3023 dst = bt_irdisp8(dst, 0, CONTEXT, 0, SZ_B);
3024 dst = sbb_rr(dst, dst_op.base, SCRATCH2, inst->extra.size);
3025 dst = mov_rr(dst, SCRATCH2, dst_op.base, inst->extra.size);
3026 dst = pop_r(dst, SCRATCH2);
3027 } else {
3028 dst = xor_rr(dst, SCRATCH1, SCRATCH1, inst->extra.size);
3029 dst = bt_irdisp8(dst, 0, CONTEXT, 0, SZ_B);
3030 dst = sbb_rr(dst, dst_op.base, SCRATCH1, inst->extra.size);
3031 dst = mov_rr(dst, SCRATCH1, dst_op.base, inst->extra.size);
3032 }
3033 } else {
3034 dst = xor_rr(dst, SCRATCH1, SCRATCH1, inst->extra.size);
3035 dst = bt_irdisp8(dst, 0, CONTEXT, 0, SZ_B);
3036 dst = sbb_rdisp8r(dst, dst_op.base, dst_op.disp, SCRATCH1, inst->extra.size);
3037 dst = mov_rrdisp8(dst, SCRATCH1, dst_op.base, dst_op.disp, inst->extra.size);
3038 }
3039 dst = setcc_r(dst, CC_C, FLAG_C);
3040 dst = jcc(dst, CC_NZ, dst+4);
3041 dst = mov_ir(dst, 1, FLAG_Z, SZ_B);
3042 dst = setcc_r(dst, CC_S, FLAG_N);
3043 dst = setcc_r(dst, CC_O, FLAG_V);
3044 dst = mov_rrind(dst, FLAG_C, CONTEXT, SZ_B);
3045 dst = m68k_save_result(inst, dst, opts);
3046 break;
3047 break;
3017 case M68K_NOP: 3048 case M68K_NOP:
3018 dst = cycles(dst, BUS); 3049 dst = cycles(dst, BUS);
3019 break; 3050 break;
3020 case M68K_NOT: 3051 case M68K_NOT:
3021 if (dst_op.mode == MODE_REG_DIRECT) { 3052 if (dst_op.mode == MODE_REG_DIRECT) {