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