Mercurial > repos > blastem
comparison m68k_to_x86.c @ 209:922b59c09259
Flag fixes for div, negx and not
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Sat, 26 Jan 2013 02:47:26 -0800 |
parents | 3457dc6fd558 |
children | 4beaad3a9a50 |
comparison
equal
deleted
inserted
replaced
208:3457dc6fd558 | 209:922b59c09259 |
---|---|
3124 } else { | 3124 } else { |
3125 dst = mov_rrdisp8(dst, RDX, dst_op.base, dst_op.disp, SZ_W); | 3125 dst = mov_rrdisp8(dst, RDX, dst_op.base, dst_op.disp, SZ_W); |
3126 dst = shl_irdisp8(dst, 16, dst_op.base, dst_op.disp, SZ_D); | 3126 dst = shl_irdisp8(dst, 16, dst_op.base, dst_op.disp, SZ_D); |
3127 dst = mov_rrdisp8(dst, RAX, dst_op.base, dst_op.disp, SZ_W); | 3127 dst = mov_rrdisp8(dst, RAX, dst_op.base, dst_op.disp, SZ_W); |
3128 } | 3128 } |
3129 dst = cmp_ir(dst, 0, RAX, SZ_W); | |
3129 dst = pop_r(dst, RAX); | 3130 dst = pop_r(dst, RAX); |
3130 dst = pop_r(dst, RDX); | 3131 dst = pop_r(dst, RDX); |
3131 dst = mov_ir(dst, 0, FLAG_V, SZ_B); | 3132 dst = mov_ir(dst, 0, FLAG_V, SZ_B); |
3132 dst = cmp_ir(dst, 0, RAX, SZ_W); | |
3133 dst = setcc_r(dst, CC_Z, FLAG_Z); | 3133 dst = setcc_r(dst, CC_Z, FLAG_Z); |
3134 dst = setcc_r(dst, CC_S, FLAG_N); | 3134 dst = setcc_r(dst, CC_S, FLAG_N); |
3135 end_off = dst+1; | 3135 end_off = dst+1; |
3136 dst = jmp(dst, dst+2); | 3136 dst = jmp(dst, dst+2); |
3137 *norm_off = dst - (norm_off + 1); | 3137 *norm_off = dst - (norm_off + 1); |
3362 dst = bt_irdisp8(dst, 0, CONTEXT, 0, SZ_B); | 3362 dst = bt_irdisp8(dst, 0, CONTEXT, 0, SZ_B); |
3363 dst = sbb_rdisp8r(dst, dst_op.base, dst_op.disp, SCRATCH1, inst->extra.size); | 3363 dst = sbb_rdisp8r(dst, dst_op.base, dst_op.disp, SCRATCH1, inst->extra.size); |
3364 dst = mov_rrdisp8(dst, SCRATCH1, dst_op.base, dst_op.disp, inst->extra.size); | 3364 dst = mov_rrdisp8(dst, SCRATCH1, dst_op.base, dst_op.disp, inst->extra.size); |
3365 } | 3365 } |
3366 dst = setcc_r(dst, CC_C, FLAG_C); | 3366 dst = setcc_r(dst, CC_C, FLAG_C); |
3367 dst = jcc(dst, CC_NZ, dst+4); | 3367 dst = jcc(dst, CC_Z, dst+4); |
3368 dst = mov_ir(dst, 1, FLAG_Z, SZ_B); | 3368 dst = mov_ir(dst, 0, FLAG_Z, SZ_B); |
3369 dst = setcc_r(dst, CC_S, FLAG_N); | 3369 dst = setcc_r(dst, CC_S, FLAG_N); |
3370 dst = setcc_r(dst, CC_O, FLAG_V); | 3370 dst = setcc_r(dst, CC_O, FLAG_V); |
3371 dst = mov_rrind(dst, FLAG_C, CONTEXT, SZ_B); | 3371 dst = mov_rrind(dst, FLAG_C, CONTEXT, SZ_B); |
3372 dst = m68k_save_result(inst, dst, opts); | 3372 dst = m68k_save_result(inst, dst, opts); |
3373 break; | 3373 break; |
3376 dst = cycles(dst, BUS); | 3376 dst = cycles(dst, BUS); |
3377 break; | 3377 break; |
3378 case M68K_NOT: | 3378 case M68K_NOT: |
3379 if (dst_op.mode == MODE_REG_DIRECT) { | 3379 if (dst_op.mode == MODE_REG_DIRECT) { |
3380 dst = not_r(dst, dst_op.base, inst->extra.size); | 3380 dst = not_r(dst, dst_op.base, inst->extra.size); |
3381 dst = cmp_ir(dst, 0, dst_op.base, inst->extra.size); | |
3381 } else { | 3382 } else { |
3382 dst = not_rdisp8(dst, dst_op.base, dst_op.disp, inst->extra.size); | 3383 dst = not_rdisp8(dst, dst_op.base, dst_op.disp, inst->extra.size); |
3383 } | 3384 dst = cmp_irdisp8(dst, 0, dst_op.base, dst_op.disp, inst->extra.size); |
3385 } | |
3386 | |
3384 dst = mov_ir(dst, 0, FLAG_C, SZ_B); | 3387 dst = mov_ir(dst, 0, FLAG_C, SZ_B); |
3385 dst = setcc_r(dst, CC_Z, FLAG_Z); | 3388 dst = setcc_r(dst, CC_Z, FLAG_Z); |
3386 dst = setcc_r(dst, CC_S, FLAG_N); | 3389 dst = setcc_r(dst, CC_S, FLAG_N); |
3387 dst = mov_ir(dst, 0, FLAG_V, SZ_B); | 3390 dst = mov_ir(dst, 0, FLAG_V, SZ_B); |
3388 dst = m68k_save_result(inst, dst, opts); | 3391 dst = m68k_save_result(inst, dst, opts); |