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)