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 {