diff options
author | Michael Pavone <pavone@retrodev.com> | 2018-05-17 00:43:16 -0700 |
---|---|---|
committer | Michael Pavone <pavone@retrodev.com> | 2018-05-17 00:43:16 -0700 |
commit | bc8e1aacd0fd42e46e7c71d5fa3c5fd160a1cc9c (patch) | |
tree | 25e295174945e774e1feb4be4c01c691d96d8294 | |
parent | 558e58d159eaa027e148f70347bbb6b8138a0781 (diff) |
Fix instruction timing for a number of instructions with only a single operand
-rw-r--r-- | m68k_core.c | 2 | ||||
-rw-r--r-- | m68k_core_x86.c | 30 | ||||
-rw-r--r-- | m68k_internal.h | 1 |
3 files changed, 9 insertions, 24 deletions
diff --git a/m68k_core.c b/m68k_core.c index db0e056..eee407a 100644 --- a/m68k_core.c +++ b/m68k_core.c @@ -902,7 +902,7 @@ static impl_info m68k_impls[] = { RAW_IMPL(M68K_MOVE_USP, translate_m68k_move_usp), RAW_IMPL(M68K_LEA, translate_m68k_lea_pea), RAW_IMPL(M68K_PEA, translate_m68k_lea_pea), - RAW_IMPL(M68K_CLR, translate_m68k_clr), + UNARY_IMPL(M68K_CLR, N0|V0|C0|Z1), OP_IMPL(M68K_EXG, translate_m68k_exg), RAW_IMPL(M68K_SCC, translate_m68k_scc), diff --git a/m68k_core_x86.c b/m68k_core_x86.c index 6fa1dce..60d6125 100644 --- a/m68k_core_x86.c +++ b/m68k_core_x86.c @@ -742,27 +742,6 @@ void translate_m68k_move(m68k_options * opts, m68kinst * inst) cycles(&opts->gen, BUS); } -void translate_m68k_clr(m68k_options * opts, m68kinst * inst) -{ - code_info *code = &opts->gen.code; - update_flags(opts, N0|V0|C0|Z1); - int8_t reg = native_reg(&(inst->dst), opts); - if (reg >= 0) { - cycles(&opts->gen, (inst->extra.size == OPSIZE_LONG ? 6 : 4)); - xor_rr(code, reg, reg, inst->extra.size); - return; - } - host_ea dst_op; - //TODO: fix timing - translate_m68k_op(inst, &dst_op, opts, 1); - if (dst_op.mode == MODE_REG_DIRECT) { - xor_rr(code, dst_op.base, dst_op.base, inst->extra.size); - } else { - mov_irdisp(code, 0, dst_op.base, dst_op.disp, inst->extra.size); - } - m68k_save_result(inst, opts); -} - void translate_m68k_ext(m68k_options * opts, m68kinst * inst) { code_info *code = &opts->gen.code; @@ -780,6 +759,7 @@ void translate_m68k_ext(m68k_options * opts, m68kinst * inst) } inst->extra.size = dst_size; update_flags(opts, N|V0|C0|Z); + cycles(&opts->gen, BUS); //M68K EXT only operates on registers so no need for a call to save result here } @@ -1437,6 +1417,7 @@ void op_r(code_info *code, m68kinst *inst, uint8_t dst, uint8_t size) { switch(inst->op) { + case M68K_CLR: xor_rr(code, dst, dst, size); break; case M68K_NEG: neg_r(code, dst, size); break; case M68K_NOT: not_r(code, dst, size); cmp_ir(code, 0, dst, size); break; case M68K_ROL: rol_clr(code, dst, size); break; @@ -1452,6 +1433,7 @@ void op_rdisp(code_info *code, m68kinst *inst, uint8_t dst, int32_t disp, uint8_ { switch(inst->op) { + case M68K_CLR: mov_irdisp(code, 0, dst, disp, size); break; case M68K_NEG: neg_rdisp(code, dst, disp, size); break; case M68K_NOT: not_rdisp(code, dst, disp, size); cmp_irdisp(code, 0, dst, disp, size); break; case M68K_ROL: rol_clrdisp(code, dst, disp, size); break; @@ -1466,7 +1448,11 @@ void op_rdisp(code_info *code, m68kinst *inst, uint8_t dst, int32_t disp, uint8_ void translate_m68k_unary(m68k_options *opts, m68kinst *inst, uint32_t flag_mask, host_ea *dst_op) { code_info *code = &opts->gen.code; - cycles(&opts->gen, BUS); + uint32_t num_cycles = BUS; + if (inst->extra.size == OPSIZE_LONG && (inst->dst.addr_mode == MODE_REG || inst->dst.addr_mode == MODE_AREG)) { + num_cycles += 2; + } + cycles(&opts->gen, num_cycles); if (dst_op->mode == MODE_REG_DIRECT) { op_r(code, inst, dst_op->base, inst->extra.size); } else { diff --git a/m68k_internal.h b/m68k_internal.h index 4533de1..c3f55ec 100644 --- a/m68k_internal.h +++ b/m68k_internal.h @@ -66,7 +66,6 @@ void translate_m68k_arith(m68k_options *opts, m68kinst * inst, uint32_t flag_mas void translate_m68k_unary(m68k_options *opts, m68kinst *inst, uint32_t flag_mask, host_ea *dst_op); void translate_m68k_cmp(m68k_options * opts, m68kinst * inst); void translate_m68k_tas(m68k_options * opts, m68kinst * inst); -void translate_m68k_clr(m68k_options * opts, m68kinst * inst); void translate_m68k_ext(m68k_options * opts, m68kinst * inst); void translate_m68k_abcd_sbcd(m68k_options *opts, m68kinst *inst, host_ea *src_op, host_ea *dst_op); void translate_m68k_sl(m68k_options *opts, m68kinst *inst, host_ea *src_op, host_ea *dst_op); |