Revision 19e6c4b8 target-i386/op.c
b/target-i386/op.c | ||
---|---|---|
1401 | 1401 |
#endif |
1402 | 1402 |
}; |
1403 | 1403 |
|
1404 |
/* floating point support. Some of the code for complicated x87 |
|
1405 |
functions comes from the LGPL'ed x86 emulator found in the Willows |
|
1406 |
TWIN windows emulator. */ |
|
1407 |
|
|
1408 |
/* fp load FT0 */ |
|
1409 |
|
|
1410 |
void OPPROTO op_flds_FT0_A0(void) |
|
1411 |
{ |
|
1412 |
#ifdef USE_FP_CONVERT |
|
1413 |
FP_CONVERT.i32 = ldl(A0); |
|
1414 |
FT0 = FP_CONVERT.f; |
|
1415 |
#else |
|
1416 |
FT0 = ldfl(A0); |
|
1417 |
#endif |
|
1418 |
} |
|
1419 |
|
|
1420 |
void OPPROTO op_fldl_FT0_A0(void) |
|
1421 |
{ |
|
1422 |
#ifdef USE_FP_CONVERT |
|
1423 |
FP_CONVERT.i64 = ldq(A0); |
|
1424 |
FT0 = FP_CONVERT.d; |
|
1425 |
#else |
|
1426 |
FT0 = ldfq(A0); |
|
1427 |
#endif |
|
1428 |
} |
|
1429 |
|
|
1430 |
/* helpers are needed to avoid static constant reference. XXX: find a better way */ |
|
1431 |
#ifdef USE_INT_TO_FLOAT_HELPERS |
|
1432 |
|
|
1433 |
void helper_fild_FT0_A0(void) |
|
1434 |
{ |
|
1435 |
FT0 = (CPU86_LDouble)ldsw(A0); |
|
1436 |
} |
|
1437 |
|
|
1438 |
void helper_fildl_FT0_A0(void) |
|
1439 |
{ |
|
1440 |
FT0 = (CPU86_LDouble)((int32_t)ldl(A0)); |
|
1441 |
} |
|
1442 |
|
|
1443 |
void helper_fildll_FT0_A0(void) |
|
1444 |
{ |
|
1445 |
FT0 = (CPU86_LDouble)((int64_t)ldq(A0)); |
|
1446 |
} |
|
1447 |
|
|
1448 |
void OPPROTO op_fild_FT0_A0(void) |
|
1449 |
{ |
|
1450 |
helper_fild_FT0_A0(); |
|
1451 |
} |
|
1452 |
|
|
1453 |
void OPPROTO op_fildl_FT0_A0(void) |
|
1454 |
{ |
|
1455 |
helper_fildl_FT0_A0(); |
|
1456 |
} |
|
1457 |
|
|
1458 |
void OPPROTO op_fildll_FT0_A0(void) |
|
1459 |
{ |
|
1460 |
helper_fildll_FT0_A0(); |
|
1461 |
} |
|
1462 |
|
|
1463 |
#else |
|
1464 |
|
|
1465 |
void OPPROTO op_fild_FT0_A0(void) |
|
1466 |
{ |
|
1467 |
#ifdef USE_FP_CONVERT |
|
1468 |
FP_CONVERT.i32 = ldsw(A0); |
|
1469 |
FT0 = (CPU86_LDouble)FP_CONVERT.i32; |
|
1470 |
#else |
|
1471 |
FT0 = (CPU86_LDouble)ldsw(A0); |
|
1472 |
#endif |
|
1473 |
} |
|
1474 |
|
|
1475 |
void OPPROTO op_fildl_FT0_A0(void) |
|
1476 |
{ |
|
1477 |
#ifdef USE_FP_CONVERT |
|
1478 |
FP_CONVERT.i32 = (int32_t) ldl(A0); |
|
1479 |
FT0 = (CPU86_LDouble)FP_CONVERT.i32; |
|
1480 |
#else |
|
1481 |
FT0 = (CPU86_LDouble)((int32_t)ldl(A0)); |
|
1482 |
#endif |
|
1483 |
} |
|
1484 |
|
|
1485 |
void OPPROTO op_fildll_FT0_A0(void) |
|
1486 |
{ |
|
1487 |
#ifdef USE_FP_CONVERT |
|
1488 |
FP_CONVERT.i64 = (int64_t) ldq(A0); |
|
1489 |
FT0 = (CPU86_LDouble)FP_CONVERT.i64; |
|
1490 |
#else |
|
1491 |
FT0 = (CPU86_LDouble)((int64_t)ldq(A0)); |
|
1492 |
#endif |
|
1493 |
} |
|
1494 |
#endif |
|
1495 |
|
|
1496 |
/* fp load ST0 */ |
|
1497 |
|
|
1498 |
void OPPROTO op_flds_ST0_A0(void) |
|
1499 |
{ |
|
1500 |
int new_fpstt; |
|
1501 |
new_fpstt = (env->fpstt - 1) & 7; |
|
1502 |
#ifdef USE_FP_CONVERT |
|
1503 |
FP_CONVERT.i32 = ldl(A0); |
|
1504 |
env->fpregs[new_fpstt].d = FP_CONVERT.f; |
|
1505 |
#else |
|
1506 |
env->fpregs[new_fpstt].d = ldfl(A0); |
|
1507 |
#endif |
|
1508 |
env->fpstt = new_fpstt; |
|
1509 |
env->fptags[new_fpstt] = 0; /* validate stack entry */ |
|
1510 |
} |
|
1511 |
|
|
1512 |
void OPPROTO op_fldl_ST0_A0(void) |
|
1513 |
{ |
|
1514 |
int new_fpstt; |
|
1515 |
new_fpstt = (env->fpstt - 1) & 7; |
|
1516 |
#ifdef USE_FP_CONVERT |
|
1517 |
FP_CONVERT.i64 = ldq(A0); |
|
1518 |
env->fpregs[new_fpstt].d = FP_CONVERT.d; |
|
1519 |
#else |
|
1520 |
env->fpregs[new_fpstt].d = ldfq(A0); |
|
1521 |
#endif |
|
1522 |
env->fpstt = new_fpstt; |
|
1523 |
env->fptags[new_fpstt] = 0; /* validate stack entry */ |
|
1524 |
} |
|
1525 |
|
|
1526 |
void OPPROTO op_fldt_ST0_A0(void) |
|
1527 |
{ |
|
1528 |
helper_fldt_ST0_A0(); |
|
1529 |
} |
|
1530 |
|
|
1531 |
/* helpers are needed to avoid static constant reference. XXX: find a better way */ |
|
1532 |
#ifdef USE_INT_TO_FLOAT_HELPERS |
|
1533 |
|
|
1534 |
void helper_fild_ST0_A0(void) |
|
1535 |
{ |
|
1536 |
int new_fpstt; |
|
1537 |
new_fpstt = (env->fpstt - 1) & 7; |
|
1538 |
env->fpregs[new_fpstt].d = (CPU86_LDouble)ldsw(A0); |
|
1539 |
env->fpstt = new_fpstt; |
|
1540 |
env->fptags[new_fpstt] = 0; /* validate stack entry */ |
|
1541 |
} |
|
1542 |
|
|
1543 |
void helper_fildl_ST0_A0(void) |
|
1544 |
{ |
|
1545 |
int new_fpstt; |
|
1546 |
new_fpstt = (env->fpstt - 1) & 7; |
|
1547 |
env->fpregs[new_fpstt].d = (CPU86_LDouble)((int32_t)ldl(A0)); |
|
1548 |
env->fpstt = new_fpstt; |
|
1549 |
env->fptags[new_fpstt] = 0; /* validate stack entry */ |
|
1550 |
} |
|
1551 |
|
|
1552 |
void helper_fildll_ST0_A0(void) |
|
1553 |
{ |
|
1554 |
int new_fpstt; |
|
1555 |
new_fpstt = (env->fpstt - 1) & 7; |
|
1556 |
env->fpregs[new_fpstt].d = (CPU86_LDouble)((int64_t)ldq(A0)); |
|
1557 |
env->fpstt = new_fpstt; |
|
1558 |
env->fptags[new_fpstt] = 0; /* validate stack entry */ |
|
1559 |
} |
|
1560 |
|
|
1561 |
void OPPROTO op_fild_ST0_A0(void) |
|
1562 |
{ |
|
1563 |
helper_fild_ST0_A0(); |
|
1564 |
} |
|
1565 |
|
|
1566 |
void OPPROTO op_fildl_ST0_A0(void) |
|
1567 |
{ |
|
1568 |
helper_fildl_ST0_A0(); |
|
1569 |
} |
|
1570 |
|
|
1571 |
void OPPROTO op_fildll_ST0_A0(void) |
|
1572 |
{ |
|
1573 |
helper_fildll_ST0_A0(); |
|
1574 |
} |
|
1575 |
|
|
1576 |
#else |
|
1577 |
|
|
1578 |
void OPPROTO op_fild_ST0_A0(void) |
|
1579 |
{ |
|
1580 |
int new_fpstt; |
|
1581 |
new_fpstt = (env->fpstt - 1) & 7; |
|
1582 |
#ifdef USE_FP_CONVERT |
|
1583 |
FP_CONVERT.i32 = ldsw(A0); |
|
1584 |
env->fpregs[new_fpstt].d = (CPU86_LDouble)FP_CONVERT.i32; |
|
1585 |
#else |
|
1586 |
env->fpregs[new_fpstt].d = (CPU86_LDouble)ldsw(A0); |
|
1587 |
#endif |
|
1588 |
env->fpstt = new_fpstt; |
|
1589 |
env->fptags[new_fpstt] = 0; /* validate stack entry */ |
|
1590 |
} |
|
1591 |
|
|
1592 |
void OPPROTO op_fildl_ST0_A0(void) |
|
1593 |
{ |
|
1594 |
int new_fpstt; |
|
1595 |
new_fpstt = (env->fpstt - 1) & 7; |
|
1596 |
#ifdef USE_FP_CONVERT |
|
1597 |
FP_CONVERT.i32 = (int32_t) ldl(A0); |
|
1598 |
env->fpregs[new_fpstt].d = (CPU86_LDouble)FP_CONVERT.i32; |
|
1599 |
#else |
|
1600 |
env->fpregs[new_fpstt].d = (CPU86_LDouble)((int32_t)ldl(A0)); |
|
1601 |
#endif |
|
1602 |
env->fpstt = new_fpstt; |
|
1603 |
env->fptags[new_fpstt] = 0; /* validate stack entry */ |
|
1604 |
} |
|
1605 |
|
|
1606 |
void OPPROTO op_fildll_ST0_A0(void) |
|
1607 |
{ |
|
1608 |
int new_fpstt; |
|
1609 |
new_fpstt = (env->fpstt - 1) & 7; |
|
1610 |
#ifdef USE_FP_CONVERT |
|
1611 |
FP_CONVERT.i64 = (int64_t) ldq(A0); |
|
1612 |
env->fpregs[new_fpstt].d = (CPU86_LDouble)FP_CONVERT.i64; |
|
1613 |
#else |
|
1614 |
env->fpregs[new_fpstt].d = (CPU86_LDouble)((int64_t)ldq(A0)); |
|
1615 |
#endif |
|
1616 |
env->fpstt = new_fpstt; |
|
1617 |
env->fptags[new_fpstt] = 0; /* validate stack entry */ |
|
1618 |
} |
|
1619 |
|
|
1620 |
#endif |
|
1621 |
|
|
1622 |
/* fp store */ |
|
1623 |
|
|
1624 |
void OPPROTO op_fsts_ST0_A0(void) |
|
1625 |
{ |
|
1626 |
#ifdef USE_FP_CONVERT |
|
1627 |
FP_CONVERT.f = (float)ST0; |
|
1628 |
stfl(A0, FP_CONVERT.f); |
|
1629 |
#else |
|
1630 |
stfl(A0, (float)ST0); |
|
1631 |
#endif |
|
1632 |
FORCE_RET(); |
|
1633 |
} |
|
1634 |
|
|
1635 |
void OPPROTO op_fstl_ST0_A0(void) |
|
1636 |
{ |
|
1637 |
stfq(A0, (double)ST0); |
|
1638 |
FORCE_RET(); |
|
1639 |
} |
|
1640 |
|
|
1641 |
void OPPROTO op_fstt_ST0_A0(void) |
|
1642 |
{ |
|
1643 |
helper_fstt_ST0_A0(); |
|
1644 |
} |
|
1645 |
|
|
1646 |
void OPPROTO op_fist_ST0_A0(void) |
|
1647 |
{ |
|
1648 |
#if defined(__sparc__) && !defined(__sparc_v9__) |
|
1649 |
register CPU86_LDouble d asm("o0"); |
|
1650 |
#else |
|
1651 |
CPU86_LDouble d; |
|
1652 |
#endif |
|
1653 |
int val; |
|
1654 |
|
|
1655 |
d = ST0; |
|
1656 |
val = floatx_to_int32(d, &env->fp_status); |
|
1657 |
if (val != (int16_t)val) |
|
1658 |
val = -32768; |
|
1659 |
stw(A0, val); |
|
1660 |
FORCE_RET(); |
|
1661 |
} |
|
1662 |
|
|
1663 |
void OPPROTO op_fistl_ST0_A0(void) |
|
1664 |
{ |
|
1665 |
#if defined(__sparc__) && !defined(__sparc_v9__) |
|
1666 |
register CPU86_LDouble d asm("o0"); |
|
1667 |
#else |
|
1668 |
CPU86_LDouble d; |
|
1669 |
#endif |
|
1670 |
int val; |
|
1671 |
|
|
1672 |
d = ST0; |
|
1673 |
val = floatx_to_int32(d, &env->fp_status); |
|
1674 |
stl(A0, val); |
|
1675 |
FORCE_RET(); |
|
1676 |
} |
|
1677 |
|
|
1678 |
void OPPROTO op_fistll_ST0_A0(void) |
|
1679 |
{ |
|
1680 |
#if defined(__sparc__) && !defined(__sparc_v9__) |
|
1681 |
register CPU86_LDouble d asm("o0"); |
|
1682 |
#else |
|
1683 |
CPU86_LDouble d; |
|
1684 |
#endif |
|
1685 |
int64_t val; |
|
1686 |
|
|
1687 |
d = ST0; |
|
1688 |
val = floatx_to_int64(d, &env->fp_status); |
|
1689 |
stq(A0, val); |
|
1690 |
FORCE_RET(); |
|
1691 |
} |
|
1692 |
|
|
1693 |
void OPPROTO op_fistt_ST0_A0(void) |
|
1694 |
{ |
|
1695 |
#if defined(__sparc__) && !defined(__sparc_v9__) |
|
1696 |
register CPU86_LDouble d asm("o0"); |
|
1697 |
#else |
|
1698 |
CPU86_LDouble d; |
|
1699 |
#endif |
|
1700 |
int val; |
|
1701 |
|
|
1702 |
d = ST0; |
|
1703 |
val = floatx_to_int32_round_to_zero(d, &env->fp_status); |
|
1704 |
if (val != (int16_t)val) |
|
1705 |
val = -32768; |
|
1706 |
stw(A0, val); |
|
1707 |
FORCE_RET(); |
|
1708 |
} |
|
1709 |
|
|
1710 |
void OPPROTO op_fisttl_ST0_A0(void) |
|
1711 |
{ |
|
1712 |
#if defined(__sparc__) && !defined(__sparc_v9__) |
|
1713 |
register CPU86_LDouble d asm("o0"); |
|
1714 |
#else |
|
1715 |
CPU86_LDouble d; |
|
1716 |
#endif |
|
1717 |
int val; |
|
1718 |
|
|
1719 |
d = ST0; |
|
1720 |
val = floatx_to_int32_round_to_zero(d, &env->fp_status); |
|
1721 |
stl(A0, val); |
|
1722 |
FORCE_RET(); |
|
1723 |
} |
|
1724 |
|
|
1725 |
void OPPROTO op_fisttll_ST0_A0(void) |
|
1726 |
{ |
|
1727 |
#if defined(__sparc__) && !defined(__sparc_v9__) |
|
1728 |
register CPU86_LDouble d asm("o0"); |
|
1729 |
#else |
|
1730 |
CPU86_LDouble d; |
|
1731 |
#endif |
|
1732 |
int64_t val; |
|
1733 |
|
|
1734 |
d = ST0; |
|
1735 |
val = floatx_to_int64_round_to_zero(d, &env->fp_status); |
|
1736 |
stq(A0, val); |
|
1737 |
FORCE_RET(); |
|
1738 |
} |
|
1739 |
|
|
1740 |
void OPPROTO op_fbld_ST0_A0(void) |
|
1741 |
{ |
|
1742 |
helper_fbld_ST0_A0(); |
|
1743 |
} |
|
1744 |
|
|
1745 |
void OPPROTO op_fbst_ST0_A0(void) |
|
1746 |
{ |
|
1747 |
helper_fbst_ST0_A0(); |
|
1748 |
} |
|
1749 |
|
|
1750 |
/* FPU move */ |
|
1751 |
|
|
1752 |
void OPPROTO op_fpush(void) |
|
1753 |
{ |
|
1754 |
fpush(); |
|
1755 |
} |
|
1756 |
|
|
1757 |
void OPPROTO op_fpop(void) |
|
1758 |
{ |
|
1759 |
fpop(); |
|
1760 |
} |
|
1761 |
|
|
1762 |
void OPPROTO op_fdecstp(void) |
|
1763 |
{ |
|
1764 |
env->fpstt = (env->fpstt - 1) & 7; |
|
1765 |
env->fpus &= (~0x4700); |
|
1766 |
} |
|
1767 |
|
|
1768 |
void OPPROTO op_fincstp(void) |
|
1769 |
{ |
|
1770 |
env->fpstt = (env->fpstt + 1) & 7; |
|
1771 |
env->fpus &= (~0x4700); |
|
1772 |
} |
|
1773 |
|
|
1774 |
void OPPROTO op_ffree_STN(void) |
|
1775 |
{ |
|
1776 |
env->fptags[(env->fpstt + PARAM1) & 7] = 1; |
|
1777 |
} |
|
1778 |
|
|
1779 |
void OPPROTO op_fmov_ST0_FT0(void) |
|
1780 |
{ |
|
1781 |
ST0 = FT0; |
|
1782 |
} |
|
1783 |
|
|
1784 |
void OPPROTO op_fmov_FT0_STN(void) |
|
1785 |
{ |
|
1786 |
FT0 = ST(PARAM1); |
|
1787 |
} |
|
1788 |
|
|
1789 |
void OPPROTO op_fmov_ST0_STN(void) |
|
1790 |
{ |
|
1791 |
ST0 = ST(PARAM1); |
|
1792 |
} |
|
1793 |
|
|
1794 |
void OPPROTO op_fmov_STN_ST0(void) |
|
1795 |
{ |
|
1796 |
ST(PARAM1) = ST0; |
|
1797 |
} |
|
1798 |
|
|
1799 |
void OPPROTO op_fxchg_ST0_STN(void) |
|
1404 |
void OPPROTO op_fcomi_dummy(void) |
|
1800 | 1405 |
{ |
1801 |
CPU86_LDouble tmp; |
|
1802 |
tmp = ST(PARAM1); |
|
1803 |
ST(PARAM1) = ST0; |
|
1804 |
ST0 = tmp; |
|
1805 |
} |
|
1806 |
|
|
1807 |
/* FPU operations */ |
|
1808 |
|
|
1809 |
const int fcom_ccval[4] = {0x0100, 0x4000, 0x0000, 0x4500}; |
|
1810 |
|
|
1811 |
void OPPROTO op_fcom_ST0_FT0(void) |
|
1812 |
{ |
|
1813 |
int ret; |
|
1814 |
|
|
1815 |
ret = floatx_compare(ST0, FT0, &env->fp_status); |
|
1816 |
env->fpus = (env->fpus & ~0x4500) | fcom_ccval[ret + 1]; |
|
1817 |
FORCE_RET(); |
|
1818 |
} |
|
1819 |
|
|
1820 |
void OPPROTO op_fucom_ST0_FT0(void) |
|
1821 |
{ |
|
1822 |
int ret; |
|
1823 |
|
|
1824 |
ret = floatx_compare_quiet(ST0, FT0, &env->fp_status); |
|
1825 |
env->fpus = (env->fpus & ~0x4500) | fcom_ccval[ret+ 1]; |
|
1826 |
FORCE_RET(); |
|
1827 |
} |
|
1828 |
|
|
1829 |
const int fcomi_ccval[4] = {CC_C, CC_Z, 0, CC_Z | CC_P | CC_C}; |
|
1830 |
|
|
1831 |
void OPPROTO op_fcomi_ST0_FT0(void) |
|
1832 |
{ |
|
1833 |
int eflags; |
|
1834 |
int ret; |
|
1835 |
|
|
1836 |
ret = floatx_compare(ST0, FT0, &env->fp_status); |
|
1837 |
eflags = cc_table[CC_OP].compute_all(); |
|
1838 |
eflags = (eflags & ~(CC_Z | CC_P | CC_C)) | fcomi_ccval[ret + 1]; |
|
1839 |
CC_SRC = eflags; |
|
1840 |
FORCE_RET(); |
|
1841 |
} |
|
1842 |
|
|
1843 |
void OPPROTO op_fucomi_ST0_FT0(void) |
|
1844 |
{ |
|
1845 |
int eflags; |
|
1846 |
int ret; |
|
1847 |
|
|
1848 |
ret = floatx_compare_quiet(ST0, FT0, &env->fp_status); |
|
1849 |
eflags = cc_table[CC_OP].compute_all(); |
|
1850 |
eflags = (eflags & ~(CC_Z | CC_P | CC_C)) | fcomi_ccval[ret + 1]; |
|
1851 |
CC_SRC = eflags; |
|
1852 |
FORCE_RET(); |
|
1853 |
} |
|
1854 |
|
|
1855 |
void OPPROTO op_fcmov_ST0_STN_T0(void) |
|
1856 |
{ |
|
1857 |
if (T0) { |
|
1858 |
ST0 = ST(PARAM1); |
|
1859 |
} |
|
1860 |
FORCE_RET(); |
|
1861 |
} |
|
1862 |
|
|
1863 |
void OPPROTO op_fadd_ST0_FT0(void) |
|
1864 |
{ |
|
1865 |
ST0 += FT0; |
|
1866 |
} |
|
1867 |
|
|
1868 |
void OPPROTO op_fmul_ST0_FT0(void) |
|
1869 |
{ |
|
1870 |
ST0 *= FT0; |
|
1871 |
} |
|
1872 |
|
|
1873 |
void OPPROTO op_fsub_ST0_FT0(void) |
|
1874 |
{ |
|
1875 |
ST0 -= FT0; |
|
1876 |
} |
|
1877 |
|
|
1878 |
void OPPROTO op_fsubr_ST0_FT0(void) |
|
1879 |
{ |
|
1880 |
ST0 = FT0 - ST0; |
|
1881 |
} |
|
1882 |
|
|
1883 |
void OPPROTO op_fdiv_ST0_FT0(void) |
|
1884 |
{ |
|
1885 |
ST0 = helper_fdiv(ST0, FT0); |
|
1886 |
} |
|
1887 |
|
|
1888 |
void OPPROTO op_fdivr_ST0_FT0(void) |
|
1889 |
{ |
|
1890 |
ST0 = helper_fdiv(FT0, ST0); |
|
1891 |
} |
|
1892 |
|
|
1893 |
/* fp operations between STN and ST0 */ |
|
1894 |
|
|
1895 |
void OPPROTO op_fadd_STN_ST0(void) |
|
1896 |
{ |
|
1897 |
ST(PARAM1) += ST0; |
|
1898 |
} |
|
1899 |
|
|
1900 |
void OPPROTO op_fmul_STN_ST0(void) |
|
1901 |
{ |
|
1902 |
ST(PARAM1) *= ST0; |
|
1903 |
} |
|
1904 |
|
|
1905 |
void OPPROTO op_fsub_STN_ST0(void) |
|
1906 |
{ |
|
1907 |
ST(PARAM1) -= ST0; |
|
1908 |
} |
|
1909 |
|
|
1910 |
void OPPROTO op_fsubr_STN_ST0(void) |
|
1911 |
{ |
|
1912 |
CPU86_LDouble *p; |
|
1913 |
p = &ST(PARAM1); |
|
1914 |
*p = ST0 - *p; |
|
1915 |
} |
|
1916 |
|
|
1917 |
void OPPROTO op_fdiv_STN_ST0(void) |
|
1918 |
{ |
|
1919 |
CPU86_LDouble *p; |
|
1920 |
p = &ST(PARAM1); |
|
1921 |
*p = helper_fdiv(*p, ST0); |
|
1922 |
} |
|
1923 |
|
|
1924 |
void OPPROTO op_fdivr_STN_ST0(void) |
|
1925 |
{ |
|
1926 |
CPU86_LDouble *p; |
|
1927 |
p = &ST(PARAM1); |
|
1928 |
*p = helper_fdiv(ST0, *p); |
|
1929 |
} |
|
1930 |
|
|
1931 |
/* misc FPU operations */ |
|
1932 |
void OPPROTO op_fchs_ST0(void) |
|
1933 |
{ |
|
1934 |
ST0 = floatx_chs(ST0); |
|
1935 |
} |
|
1936 |
|
|
1937 |
void OPPROTO op_fabs_ST0(void) |
|
1938 |
{ |
|
1939 |
ST0 = floatx_abs(ST0); |
|
1940 |
} |
|
1941 |
|
|
1942 |
void OPPROTO op_fxam_ST0(void) |
|
1943 |
{ |
|
1944 |
helper_fxam_ST0(); |
|
1945 |
} |
|
1946 |
|
|
1947 |
void OPPROTO op_fld1_ST0(void) |
|
1948 |
{ |
|
1949 |
ST0 = f15rk[1]; |
|
1950 |
} |
|
1951 |
|
|
1952 |
void OPPROTO op_fldl2t_ST0(void) |
|
1953 |
{ |
|
1954 |
ST0 = f15rk[6]; |
|
1955 |
} |
|
1956 |
|
|
1957 |
void OPPROTO op_fldl2e_ST0(void) |
|
1958 |
{ |
|
1959 |
ST0 = f15rk[5]; |
|
1960 |
} |
|
1961 |
|
|
1962 |
void OPPROTO op_fldpi_ST0(void) |
|
1963 |
{ |
|
1964 |
ST0 = f15rk[2]; |
|
1965 |
} |
|
1966 |
|
|
1967 |
void OPPROTO op_fldlg2_ST0(void) |
|
1968 |
{ |
|
1969 |
ST0 = f15rk[3]; |
|
1970 |
} |
|
1971 |
|
|
1972 |
void OPPROTO op_fldln2_ST0(void) |
|
1973 |
{ |
|
1974 |
ST0 = f15rk[4]; |
|
1975 |
} |
|
1976 |
|
|
1977 |
void OPPROTO op_fldz_ST0(void) |
|
1978 |
{ |
|
1979 |
ST0 = f15rk[0]; |
|
1980 |
} |
|
1981 |
|
|
1982 |
void OPPROTO op_fldz_FT0(void) |
|
1983 |
{ |
|
1984 |
FT0 = f15rk[0]; |
|
1985 |
} |
|
1986 |
|
|
1987 |
/* associated heplers to reduce generated code length and to simplify |
|
1988 |
relocation (FP constants are usually stored in .rodata section) */ |
|
1989 |
|
|
1990 |
void OPPROTO op_f2xm1(void) |
|
1991 |
{ |
|
1992 |
helper_f2xm1(); |
|
1993 |
} |
|
1994 |
|
|
1995 |
void OPPROTO op_fyl2x(void) |
|
1996 |
{ |
|
1997 |
helper_fyl2x(); |
|
1998 |
} |
|
1999 |
|
|
2000 |
void OPPROTO op_fptan(void) |
|
2001 |
{ |
|
2002 |
helper_fptan(); |
|
2003 |
} |
|
2004 |
|
|
2005 |
void OPPROTO op_fpatan(void) |
|
2006 |
{ |
|
2007 |
helper_fpatan(); |
|
2008 |
} |
|
2009 |
|
|
2010 |
void OPPROTO op_fxtract(void) |
|
2011 |
{ |
|
2012 |
helper_fxtract(); |
|
2013 |
} |
|
2014 |
|
|
2015 |
void OPPROTO op_fprem1(void) |
|
2016 |
{ |
|
2017 |
helper_fprem1(); |
|
2018 |
} |
|
2019 |
|
|
2020 |
|
|
2021 |
void OPPROTO op_fprem(void) |
|
2022 |
{ |
|
2023 |
helper_fprem(); |
|
2024 |
} |
|
2025 |
|
|
2026 |
void OPPROTO op_fyl2xp1(void) |
|
2027 |
{ |
|
2028 |
helper_fyl2xp1(); |
|
2029 |
} |
|
2030 |
|
|
2031 |
void OPPROTO op_fsqrt(void) |
|
2032 |
{ |
|
2033 |
helper_fsqrt(); |
|
2034 |
} |
|
2035 |
|
|
2036 |
void OPPROTO op_fsincos(void) |
|
2037 |
{ |
|
2038 |
helper_fsincos(); |
|
2039 |
} |
|
2040 |
|
|
2041 |
void OPPROTO op_frndint(void) |
|
2042 |
{ |
|
2043 |
helper_frndint(); |
|
2044 |
} |
|
2045 |
|
|
2046 |
void OPPROTO op_fscale(void) |
|
2047 |
{ |
|
2048 |
helper_fscale(); |
|
2049 |
} |
|
2050 |
|
|
2051 |
void OPPROTO op_fsin(void) |
|
2052 |
{ |
|
2053 |
helper_fsin(); |
|
2054 |
} |
|
2055 |
|
|
2056 |
void OPPROTO op_fcos(void) |
|
2057 |
{ |
|
2058 |
helper_fcos(); |
|
2059 |
} |
|
2060 |
|
|
2061 |
void OPPROTO op_fnstsw_A0(void) |
|
2062 |
{ |
|
2063 |
int fpus; |
|
2064 |
fpus = (env->fpus & ~0x3800) | (env->fpstt & 0x7) << 11; |
|
2065 |
stw(A0, fpus); |
|
2066 |
FORCE_RET(); |
|
2067 |
} |
|
2068 |
|
|
2069 |
void OPPROTO op_fnstsw_EAX(void) |
|
2070 |
{ |
|
2071 |
int fpus; |
|
2072 |
fpus = (env->fpus & ~0x3800) | (env->fpstt & 0x7) << 11; |
|
2073 |
EAX = (EAX & ~0xffff) | fpus; |
|
2074 |
} |
|
2075 |
|
|
2076 |
void OPPROTO op_fnstcw_A0(void) |
|
2077 |
{ |
|
2078 |
stw(A0, env->fpuc); |
|
2079 |
FORCE_RET(); |
|
2080 |
} |
|
2081 |
|
|
2082 |
void OPPROTO op_fldcw_A0(void) |
|
2083 |
{ |
|
2084 |
env->fpuc = lduw(A0); |
|
2085 |
update_fp_status(); |
|
2086 |
} |
|
2087 |
|
|
2088 |
void OPPROTO op_fclex(void) |
|
2089 |
{ |
|
2090 |
env->fpus &= 0x7f00; |
|
2091 |
} |
|
2092 |
|
|
2093 |
void OPPROTO op_fwait(void) |
|
2094 |
{ |
|
2095 |
if (env->fpus & FPUS_SE) |
|
2096 |
fpu_raise_exception(); |
|
2097 |
FORCE_RET(); |
|
2098 |
} |
|
2099 |
|
|
2100 |
void OPPROTO op_fninit(void) |
|
2101 |
{ |
|
2102 |
env->fpus = 0; |
|
2103 |
env->fpstt = 0; |
|
2104 |
env->fpuc = 0x37f; |
|
2105 |
env->fptags[0] = 1; |
|
2106 |
env->fptags[1] = 1; |
|
2107 |
env->fptags[2] = 1; |
|
2108 |
env->fptags[3] = 1; |
|
2109 |
env->fptags[4] = 1; |
|
2110 |
env->fptags[5] = 1; |
|
2111 |
env->fptags[6] = 1; |
|
2112 |
env->fptags[7] = 1; |
|
2113 |
} |
|
2114 |
|
|
2115 |
void OPPROTO op_fnstenv_A0(void) |
|
2116 |
{ |
|
2117 |
helper_fstenv(A0, PARAM1); |
|
2118 |
} |
|
2119 |
|
|
2120 |
void OPPROTO op_fldenv_A0(void) |
|
2121 |
{ |
|
2122 |
helper_fldenv(A0, PARAM1); |
|
2123 |
} |
|
2124 |
|
|
2125 |
void OPPROTO op_fnsave_A0(void) |
|
2126 |
{ |
|
2127 |
helper_fsave(A0, PARAM1); |
|
2128 |
} |
|
2129 |
|
|
2130 |
void OPPROTO op_frstor_A0(void) |
|
2131 |
{ |
|
2132 |
helper_frstor(A0, PARAM1); |
|
1406 |
T0 = 0; |
|
2133 | 1407 |
} |
2134 | 1408 |
|
2135 | 1409 |
/* threading support */ |
... | ... | |
2149 | 1423 |
T0 = 0; |
2150 | 1424 |
} |
2151 | 1425 |
|
2152 |
void OPPROTO op_fxsave_A0(void) |
|
2153 |
{ |
|
2154 |
helper_fxsave(A0, PARAM1); |
|
2155 |
} |
|
2156 |
|
|
2157 |
void OPPROTO op_fxrstor_A0(void) |
|
2158 |
{ |
|
2159 |
helper_fxrstor(A0, PARAM1); |
|
2160 |
} |
|
2161 |
|
|
2162 | 1426 |
/* Secure Virtual Machine ops */ |
2163 | 1427 |
|
2164 | 1428 |
void OPPROTO op_vmrun(void) |
Also available in: Unified diff