comparison m68k_to_x86.c @ 225:7348057e7a8c

Fixed a couple bugs in roxl/roxr. X flag wasn't being saved properly and rotates of more than 31 bits were messed up as the X flag was being thrown away between the first 31 bits of rotate and the rest.
author Mike Pavone <pavone@retrodev.com>
date Sun, 21 Apr 2013 11:42:45 -0700
parents 17534fb7c4f5
children 28a6697e847b
comparison
equal deleted inserted replaced
224:f7ff02eeec2f 225:7348057e7a8c
3626 } else { 3626 } else {
3627 dst = rcr_irdisp8(dst, 31, dst_op.base, dst_op.disp, inst->extra.size); 3627 dst = rcr_irdisp8(dst, 31, dst_op.base, dst_op.disp, inst->extra.size);
3628 dst = rcr_irdisp8(dst, 1, dst_op.base, dst_op.disp, inst->extra.size); 3628 dst = rcr_irdisp8(dst, 1, dst_op.base, dst_op.disp, inst->extra.size);
3629 } 3629 }
3630 } 3630 }
3631 dst = setcc_rind(dst, CC_C, CONTEXT);
3631 dst = sub_ir(dst, 32, SCRATCH1, SZ_B); 3632 dst = sub_ir(dst, 32, SCRATCH1, SZ_B);
3632 *norm_off = dst - (norm_off+1); 3633 *norm_off = dst - (norm_off+1);
3633 dst = bt_irdisp8(dst, 0, CONTEXT, 0, SZ_B); 3634 dst = bt_irdisp8(dst, 0, CONTEXT, 0, SZ_B);
3634 if (dst_op.mode == MODE_REG_DIRECT) { 3635 if (dst_op.mode == MODE_REG_DIRECT) {
3635 if (inst->op == M68K_ROXL) { 3636 if (inst->op == M68K_ROXL) {
3643 } else { 3644 } else {
3644 dst = rcr_clrdisp8(dst, dst_op.base, dst_op.disp, inst->extra.size); 3645 dst = rcr_clrdisp8(dst, dst_op.base, dst_op.disp, inst->extra.size);
3645 } 3646 }
3646 } 3647 }
3647 dst = setcc_r(dst, CC_C, FLAG_C); 3648 dst = setcc_r(dst, CC_C, FLAG_C);
3648 dst = mov_rr(dst, FLAG_C, CONTEXT, SZ_B); 3649 dst = mov_rrind(dst, FLAG_C, CONTEXT, SZ_B);
3649 end_off = dst + 1; 3650 end_off = dst + 1;
3650 dst = jmp(dst, dst+2); 3651 dst = jmp(dst, dst+2);
3651 *zero_off = dst - (zero_off+1); 3652 *zero_off = dst - (zero_off+1);
3652 //Carry flag is set to X flag when count is 0, this is different from ROR/ROL 3653 //Carry flag is set to X flag when count is 0, this is different from ROR/ROL
3653 dst = mov_rindr(dst, CONTEXT, FLAG_C, SZ_B); 3654 dst = mov_rindr(dst, CONTEXT, FLAG_C, SZ_B);