Revision 0211e5af target-i386/helper.c
b/target-i386/helper.c | ||
---|---|---|
1609 | 1609 |
#endif /* !CONFIG_USER_ONLY */ |
1610 | 1610 |
|
1611 | 1611 |
|
1612 |
#ifdef BUGGY_GCC_DIV64 |
|
1613 |
/* gcc 2.95.4 on PowerPC does not seem to like using __udivdi3, so we |
|
1614 |
call it from another function */ |
|
1615 |
uint32_t div32(uint64_t *q_ptr, uint64_t num, uint32_t den) |
|
1616 |
{ |
|
1617 |
*q_ptr = num / den; |
|
1618 |
return num % den; |
|
1619 |
} |
|
1620 |
|
|
1621 |
int32_t idiv32(int64_t *q_ptr, int64_t num, int32_t den) |
|
1622 |
{ |
|
1623 |
*q_ptr = num / den; |
|
1624 |
return num % den; |
|
1625 |
} |
|
1626 |
#endif |
|
1627 |
|
|
1628 | 1612 |
/* division, flags are undefined */ |
1629 | 1613 |
|
1630 | 1614 |
void helper_divb_AL(target_ulong t0) |
... | ... | |
1707 | 1691 |
if (den == 0) { |
1708 | 1692 |
raise_exception(EXCP00_DIVZ); |
1709 | 1693 |
} |
1710 |
#ifdef BUGGY_GCC_DIV64 |
|
1711 |
r = div32(&q, num, den); |
|
1712 |
#else |
|
1713 | 1694 |
q = (num / den); |
1714 | 1695 |
r = (num % den); |
1715 |
#endif |
|
1716 | 1696 |
if (q > 0xffffffff) |
1717 | 1697 |
raise_exception(EXCP00_DIVZ); |
1718 | 1698 |
EAX = (uint32_t)q; |
... | ... | |
1729 | 1709 |
if (den == 0) { |
1730 | 1710 |
raise_exception(EXCP00_DIVZ); |
1731 | 1711 |
} |
1732 |
#ifdef BUGGY_GCC_DIV64 |
|
1733 |
r = idiv32(&q, num, den); |
|
1734 |
#else |
|
1735 | 1712 |
q = (num / den); |
1736 | 1713 |
r = (num % den); |
1737 |
#endif |
|
1738 | 1714 |
if (q != (int32_t)q) |
1739 | 1715 |
raise_exception(EXCP00_DIVZ); |
1740 | 1716 |
EAX = (uint32_t)q; |
Also available in: Unified diff