Mercurial > repos > blastem
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) { |