Mercurial > repos > blastem
comparison m68k_core_x86.c @ 611:744b305965f7
Fix divide by zero exception return address when div instruction is bigger than 1 word
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sat, 27 Dec 2014 15:49:15 -0800 |
parents | 314373222b1a |
children | 5a6ff0d76032 |
comparison
equal
deleted
inserted
replaced
610:314373222b1a | 611:744b305965f7 |
---|---|
1602 movsx_rdispr(code, src_op->base, src_op->disp, opts->gen.scratch2, SZ_W, SZ_D); | 1602 movsx_rdispr(code, src_op->base, src_op->disp, opts->gen.scratch2, SZ_W, SZ_D); |
1603 } else { | 1603 } else { |
1604 movzx_rdispr(code, src_op->base, src_op->disp, opts->gen.scratch2, SZ_W, SZ_D); | 1604 movzx_rdispr(code, src_op->base, src_op->disp, opts->gen.scratch2, SZ_W, SZ_D); |
1605 } | 1605 } |
1606 } | 1606 } |
1607 uint32_t isize = 2; | |
1608 switch(inst->src.addr_mode) | |
1609 { | |
1610 case MODE_AREG_DISPLACE: | |
1611 case MODE_AREG_INDEX_DISP8: | |
1612 case MODE_ABSOLUTE_SHORT: | |
1613 case MODE_PC_INDEX_DISP8: | |
1614 case MODE_IMMEDIATE: | |
1615 isize = 4; | |
1616 break; | |
1617 case MODE_ABSOLUTE: | |
1618 isize = 6; | |
1619 break; | |
1620 } | |
1607 cmp_ir(code, 0, opts->gen.scratch2, SZ_D); | 1621 cmp_ir(code, 0, opts->gen.scratch2, SZ_D); |
1608 check_alloc_code(code, 6*MAX_INST_LEN); | 1622 check_alloc_code(code, 6*MAX_INST_LEN); |
1609 code_ptr not_zero = code->cur + 1; | 1623 code_ptr not_zero = code->cur + 1; |
1610 jcc(code, CC_NZ, code->cur + 2); | 1624 jcc(code, CC_NZ, code->cur + 2); |
1611 pop_r(code, RAX); | 1625 pop_r(code, RAX); |
1612 pop_r(code, RDX); | 1626 pop_r(code, RDX); |
1613 mov_ir(code, VECTOR_INT_DIV_ZERO, opts->gen.scratch2, SZ_D); | 1627 mov_ir(code, VECTOR_INT_DIV_ZERO, opts->gen.scratch2, SZ_D); |
1614 mov_ir(code, inst->address+2, opts->gen.scratch1, SZ_D); | 1628 mov_ir(code, inst->address+isize, opts->gen.scratch1, SZ_D); |
1615 jmp(code, opts->trap); | 1629 jmp(code, opts->trap); |
1616 *not_zero = code->cur - (not_zero+1); | 1630 *not_zero = code->cur - (not_zero+1); |
1617 if (inst->op == M68K_DIVS) { | 1631 if (inst->op == M68K_DIVS) { |
1618 cdq(code); | 1632 cdq(code); |
1619 } else { | 1633 } else { |