Mercurial > repos > blastem
comparison m68k_core_x86.c @ 580:5157bc966c1a
Refactor translate_m68k_cmp to use translate_m68k_arith
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Wed, 05 Mar 2014 09:33:50 -0800 |
parents | 0031cd308a31 |
children | 9f40aa5243c2 |
comparison
equal
deleted
inserted
replaced
579:0031cd308a31 | 580:5157bc966c1a |
---|---|
1120 mov_rrdisp(code, opts->gen.scratch1, opts->gen.context_reg, reg_offset(&(inst->dst)), SZ_B); | 1120 mov_rrdisp(code, opts->gen.scratch1, opts->gen.context_reg, reg_offset(&(inst->dst)), SZ_B); |
1121 } | 1121 } |
1122 } | 1122 } |
1123 } | 1123 } |
1124 | 1124 |
1125 void translate_m68k_cmp(m68k_options * opts, m68kinst * inst) | |
1126 { | |
1127 code_info *code = &opts->gen.code; | |
1128 uint8_t size = inst->extra.size; | |
1129 x86_ea src_op, dst_op; | |
1130 translate_m68k_op(inst, &src_op, opts, 0); | |
1131 if (inst->dst.addr_mode == MODE_AREG_POSTINC) { | |
1132 push_r(code, opts->gen.scratch1); | |
1133 translate_m68k_op(inst, &dst_op, opts, 1); | |
1134 pop_r(code, opts->gen.scratch2); | |
1135 src_op.base = opts->gen.scratch2; | |
1136 } else { | |
1137 translate_m68k_op(inst, &dst_op, opts, 1); | |
1138 if (inst->dst.addr_mode == MODE_AREG && size == OPSIZE_WORD) { | |
1139 size = OPSIZE_LONG; | |
1140 } | |
1141 } | |
1142 cycles(&opts->gen, BUS); | |
1143 if (src_op.mode == MODE_REG_DIRECT) { | |
1144 if (dst_op.mode == MODE_REG_DIRECT) { | |
1145 cmp_rr(code, src_op.base, dst_op.base, size); | |
1146 } else { | |
1147 cmp_rrdisp(code, src_op.base, dst_op.base, dst_op.disp, size); | |
1148 } | |
1149 } else if (src_op.mode == MODE_REG_DISPLACE8) { | |
1150 cmp_rdispr(code, src_op.base, src_op.disp, dst_op.base, size); | |
1151 } else { | |
1152 if (dst_op.mode == MODE_REG_DIRECT) { | |
1153 cmp_ir(code, src_op.disp, dst_op.base, size); | |
1154 } else { | |
1155 cmp_irdisp(code, src_op.disp, dst_op.base, dst_op.disp, size); | |
1156 } | |
1157 } | |
1158 update_flags(opts, N|Z|V|C); | |
1159 } | |
1160 | |
1161 typedef void (*shift_ir_t)(code_info *code, uint8_t val, uint8_t dst, uint8_t size); | 1125 typedef void (*shift_ir_t)(code_info *code, uint8_t val, uint8_t dst, uint8_t size); |
1162 typedef void (*shift_irdisp_t)(code_info *code, uint8_t val, uint8_t dst_base, int32_t disp, uint8_t size); | 1126 typedef void (*shift_irdisp_t)(code_info *code, uint8_t val, uint8_t dst_base, int32_t disp, uint8_t size); |
1163 typedef void (*shift_clr_t)(code_info *code, uint8_t dst, uint8_t size); | 1127 typedef void (*shift_clr_t)(code_info *code, uint8_t dst, uint8_t size); |
1164 typedef void (*shift_clrdisp_t)(code_info *code, uint8_t dst_base, int32_t disp, uint8_t size); | 1128 typedef void (*shift_clrdisp_t)(code_info *code, uint8_t dst_base, int32_t disp, uint8_t size); |
1165 | 1129 |
1428 op_ir(code, inst, src_op->disp, dst_op->base, size); | 1392 op_ir(code, inst, src_op->disp, dst_op->base, size); |
1429 } else { | 1393 } else { |
1430 op_irdisp(code, inst, src_op->disp, dst_op->base, dst_op->disp, size); | 1394 op_irdisp(code, inst, src_op->disp, dst_op->base, dst_op->disp, size); |
1431 } | 1395 } |
1432 } | 1396 } |
1433 if (inst->dst.addr_mode != MODE_AREG) { | 1397 if (inst->dst.addr_mode != MODE_AREG || inst->op == M68K_CMP) { |
1434 update_flags(opts, flag_mask); | 1398 update_flags(opts, flag_mask); |
1435 if (inst->op == M68K_ADDX || inst->op == M68K_SUBX) { | 1399 if (inst->op == M68K_ADDX || inst->op == M68K_SUBX) { |
1436 check_alloc_code(code, 2*MAX_INST_LEN); | 1400 check_alloc_code(code, 2*MAX_INST_LEN); |
1437 code_ptr after_flag_set = code->cur + 1; | 1401 code_ptr after_flag_set = code->cur + 1; |
1438 jcc(code, CC_Z, code->cur + 2); | 1402 jcc(code, CC_Z, code->cur + 2); |
1439 set_flag(opts, 0, FLAG_Z); | 1403 set_flag(opts, 0, FLAG_Z); |
1440 *after_flag_set = code->cur - (after_flag_set+1); | 1404 *after_flag_set = code->cur - (after_flag_set+1); |
1441 } | 1405 } |
1442 } | 1406 } |
1443 m68k_save_result(inst, opts); | 1407 if (inst->op != M68K_CMP) { |
1408 m68k_save_result(inst, opts); | |
1409 } | |
1410 } | |
1411 | |
1412 void translate_m68k_cmp(m68k_options * opts, m68kinst * inst) | |
1413 { | |
1414 code_info *code = &opts->gen.code; | |
1415 uint8_t size = inst->extra.size; | |
1416 x86_ea src_op, dst_op; | |
1417 translate_m68k_op(inst, &src_op, opts, 0); | |
1418 if (inst->dst.addr_mode == MODE_AREG_POSTINC) { | |
1419 push_r(code, opts->gen.scratch1); | |
1420 translate_m68k_op(inst, &dst_op, opts, 1); | |
1421 pop_r(code, opts->gen.scratch2); | |
1422 src_op.base = opts->gen.scratch2; | |
1423 } else { | |
1424 translate_m68k_op(inst, &dst_op, opts, 1); | |
1425 if (inst->dst.addr_mode == MODE_AREG && size == OPSIZE_WORD) { | |
1426 size = OPSIZE_LONG; | |
1427 } | |
1428 } | |
1429 translate_m68k_arith(opts, inst, N|Z|V|C, &src_op, &dst_op); | |
1444 } | 1430 } |
1445 | 1431 |
1446 void op_r(code_info *code, m68kinst *inst, uint8_t dst, uint8_t size) | 1432 void op_r(code_info *code, m68kinst *inst, uint8_t dst, uint8_t size) |
1447 { | 1433 { |
1448 switch(inst->op) | 1434 switch(inst->op) |