Revision 1f587329 target-sparc/translate.c
b/target-sparc/translate.c | ||
---|---|---|
25 | 25 |
Rest of V9 instructions, VIS instructions |
26 | 26 |
NPC/PC static optimisations (use JUMP_TB when possible) |
27 | 27 |
Optimize synthetic instructions |
28 |
128-bit float |
|
29 | 28 |
*/ |
30 | 29 |
|
31 | 30 |
#include <stdarg.h> |
... | ... | |
93 | 92 |
|
94 | 93 |
#ifdef TARGET_SPARC64 |
95 | 94 |
#define DFPREG(r) (((r & 1) << 5) | (r & 0x1e)) |
95 |
#define QFPREG(r) (((r & 1) << 5) | (r & 0x1c)) |
|
96 | 96 |
#else |
97 | 97 |
#define DFPREG(r) (r & 0x1e) |
98 |
#define QFPREG(r) (r & 0x1c) |
|
98 | 99 |
#endif |
99 | 100 |
|
100 | 101 |
#ifdef USE_DIRECT_JUMP |
... | ... | |
351 | 352 |
GEN32(gen_op_store_DT0_fpr, gen_op_store_DT0_fpr_fprf); |
352 | 353 |
GEN32(gen_op_store_DT1_fpr, gen_op_store_DT1_fpr_fprf); |
353 | 354 |
|
355 |
#if defined(CONFIG_USER_ONLY) |
|
356 |
GEN32(gen_op_load_fpr_QT0, gen_op_load_fpr_QT0_fprf); |
|
357 |
GEN32(gen_op_load_fpr_QT1, gen_op_load_fpr_QT1_fprf); |
|
358 |
GEN32(gen_op_store_QT0_fpr, gen_op_store_QT0_fpr_fprf); |
|
359 |
GEN32(gen_op_store_QT1_fpr, gen_op_store_QT1_fpr_fprf); |
|
360 |
#endif |
|
361 |
|
|
354 | 362 |
/* moves */ |
355 | 363 |
#ifdef CONFIG_USER_ONLY |
356 | 364 |
#define supervisor(dc) 0 |
... | ... | |
1060 | 1068 |
gen_op_fcmpd_fcc3, |
1061 | 1069 |
}; |
1062 | 1070 |
|
1071 |
#if defined(CONFIG_USER_ONLY) |
|
1072 |
static GenOpFunc * const gen_fcmpq[4] = { |
|
1073 |
gen_op_fcmpq, |
|
1074 |
gen_op_fcmpq_fcc1, |
|
1075 |
gen_op_fcmpq_fcc2, |
|
1076 |
gen_op_fcmpq_fcc3, |
|
1077 |
}; |
|
1078 |
#endif |
|
1079 |
|
|
1063 | 1080 |
static GenOpFunc * const gen_fcmpes[4] = { |
1064 | 1081 |
gen_op_fcmpes, |
1065 | 1082 |
gen_op_fcmpes_fcc1, |
... | ... | |
1074 | 1091 |
gen_op_fcmped_fcc3, |
1075 | 1092 |
}; |
1076 | 1093 |
|
1094 |
#if defined(CONFIG_USER_ONLY) |
|
1095 |
static GenOpFunc * const gen_fcmpeq[4] = { |
|
1096 |
gen_op_fcmpeq, |
|
1097 |
gen_op_fcmpeq_fcc1, |
|
1098 |
gen_op_fcmpeq_fcc2, |
|
1099 |
gen_op_fcmpeq_fcc3, |
|
1100 |
}; |
|
1101 |
#endif |
|
1077 | 1102 |
#endif |
1078 | 1103 |
|
1079 | 1104 |
static int gen_trap_ifnofpu(DisasContext * dc) |
... | ... | |
1484 | 1509 |
gen_op_store_DT0_fpr(DFPREG(rd)); |
1485 | 1510 |
break; |
1486 | 1511 |
case 0x2b: /* fsqrtq */ |
1512 |
#if defined(CONFIG_USER_ONLY) |
|
1513 |
gen_op_load_fpr_QT1(QFPREG(rs2)); |
|
1514 |
gen_op_fsqrtq(); |
|
1515 |
gen_op_store_QT0_fpr(QFPREG(rd)); |
|
1516 |
break; |
|
1517 |
#else |
|
1487 | 1518 |
goto nfpu_insn; |
1519 |
#endif |
|
1488 | 1520 |
case 0x41: |
1489 | 1521 |
gen_op_load_fpr_FT0(rs1); |
1490 | 1522 |
gen_op_load_fpr_FT1(rs2); |
... | ... | |
1498 | 1530 |
gen_op_store_DT0_fpr(DFPREG(rd)); |
1499 | 1531 |
break; |
1500 | 1532 |
case 0x43: /* faddq */ |
1533 |
#if defined(CONFIG_USER_ONLY) |
|
1534 |
gen_op_load_fpr_QT0(QFPREG(rs1)); |
|
1535 |
gen_op_load_fpr_QT1(QFPREG(rs2)); |
|
1536 |
gen_op_faddq(); |
|
1537 |
gen_op_store_QT0_fpr(QFPREG(rd)); |
|
1538 |
break; |
|
1539 |
#else |
|
1501 | 1540 |
goto nfpu_insn; |
1541 |
#endif |
|
1502 | 1542 |
case 0x45: |
1503 | 1543 |
gen_op_load_fpr_FT0(rs1); |
1504 | 1544 |
gen_op_load_fpr_FT1(rs2); |
... | ... | |
1512 | 1552 |
gen_op_store_DT0_fpr(DFPREG(rd)); |
1513 | 1553 |
break; |
1514 | 1554 |
case 0x47: /* fsubq */ |
1555 |
#if defined(CONFIG_USER_ONLY) |
|
1556 |
gen_op_load_fpr_QT0(QFPREG(rs1)); |
|
1557 |
gen_op_load_fpr_QT1(QFPREG(rs2)); |
|
1558 |
gen_op_fsubq(); |
|
1559 |
gen_op_store_QT0_fpr(QFPREG(rd)); |
|
1560 |
break; |
|
1561 |
#else |
|
1515 | 1562 |
goto nfpu_insn; |
1563 |
#endif |
|
1516 | 1564 |
case 0x49: |
1517 | 1565 |
gen_op_load_fpr_FT0(rs1); |
1518 | 1566 |
gen_op_load_fpr_FT1(rs2); |
... | ... | |
1526 | 1574 |
gen_op_store_DT0_fpr(rd); |
1527 | 1575 |
break; |
1528 | 1576 |
case 0x4b: /* fmulq */ |
1577 |
#if defined(CONFIG_USER_ONLY) |
|
1578 |
gen_op_load_fpr_QT0(QFPREG(rs1)); |
|
1579 |
gen_op_load_fpr_QT1(QFPREG(rs2)); |
|
1580 |
gen_op_fmulq(); |
|
1581 |
gen_op_store_QT0_fpr(QFPREG(rd)); |
|
1582 |
break; |
|
1583 |
#else |
|
1529 | 1584 |
goto nfpu_insn; |
1585 |
#endif |
|
1530 | 1586 |
case 0x4d: |
1531 | 1587 |
gen_op_load_fpr_FT0(rs1); |
1532 | 1588 |
gen_op_load_fpr_FT1(rs2); |
... | ... | |
1540 | 1596 |
gen_op_store_DT0_fpr(DFPREG(rd)); |
1541 | 1597 |
break; |
1542 | 1598 |
case 0x4f: /* fdivq */ |
1599 |
#if defined(CONFIG_USER_ONLY) |
|
1600 |
gen_op_load_fpr_QT0(QFPREG(rs1)); |
|
1601 |
gen_op_load_fpr_QT1(QFPREG(rs2)); |
|
1602 |
gen_op_fdivq(); |
|
1603 |
gen_op_store_QT0_fpr(QFPREG(rd)); |
|
1604 |
break; |
|
1605 |
#else |
|
1543 | 1606 |
goto nfpu_insn; |
1607 |
#endif |
|
1544 | 1608 |
case 0x69: |
1545 | 1609 |
gen_op_load_fpr_FT0(rs1); |
1546 | 1610 |
gen_op_load_fpr_FT1(rs2); |
... | ... | |
1548 | 1612 |
gen_op_store_DT0_fpr(DFPREG(rd)); |
1549 | 1613 |
break; |
1550 | 1614 |
case 0x6e: /* fdmulq */ |
1615 |
#if defined(CONFIG_USER_ONLY) |
|
1616 |
gen_op_load_fpr_DT0(DFPREG(rs1)); |
|
1617 |
gen_op_load_fpr_DT1(DFPREG(rs2)); |
|
1618 |
gen_op_fdmulq(); |
|
1619 |
gen_op_store_QT0_fpr(QFPREG(rd)); |
|
1620 |
break; |
|
1621 |
#else |
|
1551 | 1622 |
goto nfpu_insn; |
1623 |
#endif |
|
1552 | 1624 |
case 0xc4: |
1553 | 1625 |
gen_op_load_fpr_FT1(rs2); |
1554 | 1626 |
gen_op_fitos(); |
... | ... | |
1560 | 1632 |
gen_op_store_FT0_fpr(rd); |
1561 | 1633 |
break; |
1562 | 1634 |
case 0xc7: /* fqtos */ |
1635 |
#if defined(CONFIG_USER_ONLY) |
|
1636 |
gen_op_load_fpr_QT1(QFPREG(rs2)); |
|
1637 |
gen_op_fqtos(); |
|
1638 |
gen_op_store_FT0_fpr(rd); |
|
1639 |
break; |
|
1640 |
#else |
|
1563 | 1641 |
goto nfpu_insn; |
1642 |
#endif |
|
1564 | 1643 |
case 0xc8: |
1565 | 1644 |
gen_op_load_fpr_FT1(rs2); |
1566 | 1645 |
gen_op_fitod(); |
... | ... | |
1572 | 1651 |
gen_op_store_DT0_fpr(DFPREG(rd)); |
1573 | 1652 |
break; |
1574 | 1653 |
case 0xcb: /* fqtod */ |
1654 |
#if defined(CONFIG_USER_ONLY) |
|
1655 |
gen_op_load_fpr_QT1(QFPREG(rs2)); |
|
1656 |
gen_op_fqtod(); |
|
1657 |
gen_op_store_DT0_fpr(DFPREG(rd)); |
|
1658 |
break; |
|
1659 |
#else |
|
1575 | 1660 |
goto nfpu_insn; |
1661 |
#endif |
|
1576 | 1662 |
case 0xcc: /* fitoq */ |
1663 |
#if defined(CONFIG_USER_ONLY) |
|
1664 |
gen_op_load_fpr_FT1(rs2); |
|
1665 |
gen_op_fitoq(); |
|
1666 |
gen_op_store_QT0_fpr(QFPREG(rd)); |
|
1667 |
break; |
|
1668 |
#else |
|
1577 | 1669 |
goto nfpu_insn; |
1670 |
#endif |
|
1578 | 1671 |
case 0xcd: /* fstoq */ |
1672 |
#if defined(CONFIG_USER_ONLY) |
|
1673 |
gen_op_load_fpr_FT1(rs2); |
|
1674 |
gen_op_fstoq(); |
|
1675 |
gen_op_store_QT0_fpr(QFPREG(rd)); |
|
1676 |
break; |
|
1677 |
#else |
|
1579 | 1678 |
goto nfpu_insn; |
1679 |
#endif |
|
1580 | 1680 |
case 0xce: /* fdtoq */ |
1681 |
#if defined(CONFIG_USER_ONLY) |
|
1682 |
gen_op_load_fpr_DT1(DFPREG(rs2)); |
|
1683 |
gen_op_fdtoq(); |
|
1684 |
gen_op_store_QT0_fpr(QFPREG(rd)); |
|
1685 |
break; |
|
1686 |
#else |
|
1581 | 1687 |
goto nfpu_insn; |
1688 |
#endif |
|
1582 | 1689 |
case 0xd1: |
1583 | 1690 |
gen_op_load_fpr_FT1(rs2); |
1584 | 1691 |
gen_op_fstoi(); |
... | ... | |
1590 | 1697 |
gen_op_store_FT0_fpr(rd); |
1591 | 1698 |
break; |
1592 | 1699 |
case 0xd3: /* fqtoi */ |
1700 |
#if defined(CONFIG_USER_ONLY) |
|
1701 |
gen_op_load_fpr_QT1(QFPREG(rs2)); |
|
1702 |
gen_op_fqtoi(); |
|
1703 |
gen_op_store_FT0_fpr(rd); |
|
1704 |
break; |
|
1705 |
#else |
|
1593 | 1706 |
goto nfpu_insn; |
1707 |
#endif |
|
1594 | 1708 |
#ifdef TARGET_SPARC64 |
1595 | 1709 |
case 0x2: /* V9 fmovd */ |
1596 | 1710 |
gen_op_load_fpr_DT0(DFPREG(rs2)); |
1597 | 1711 |
gen_op_store_DT0_fpr(DFPREG(rd)); |
1598 | 1712 |
break; |
1713 |
case 0x3: /* V9 fmovq */ |
|
1714 |
#if defined(CONFIG_USER_ONLY) |
|
1715 |
gen_op_load_fpr_QT0(QFPREG(rs2)); |
|
1716 |
gen_op_store_QT0_fpr(QFPREG(rd)); |
|
1717 |
break; |
|
1718 |
#else |
|
1719 |
goto nfpu_insn; |
|
1720 |
#endif |
|
1599 | 1721 |
case 0x6: /* V9 fnegd */ |
1600 | 1722 |
gen_op_load_fpr_DT1(DFPREG(rs2)); |
1601 | 1723 |
gen_op_fnegd(); |
1602 | 1724 |
gen_op_store_DT0_fpr(DFPREG(rd)); |
1603 | 1725 |
break; |
1726 |
case 0x7: /* V9 fnegq */ |
|
1727 |
#if defined(CONFIG_USER_ONLY) |
|
1728 |
gen_op_load_fpr_QT1(QFPREG(rs2)); |
|
1729 |
gen_op_fnegq(); |
|
1730 |
gen_op_store_QT0_fpr(QFPREG(rd)); |
|
1731 |
break; |
|
1732 |
#else |
|
1733 |
goto nfpu_insn; |
|
1734 |
#endif |
|
1604 | 1735 |
case 0xa: /* V9 fabsd */ |
1605 | 1736 |
gen_op_load_fpr_DT1(DFPREG(rs2)); |
1606 | 1737 |
gen_op_fabsd(); |
1607 | 1738 |
gen_op_store_DT0_fpr(DFPREG(rd)); |
1608 | 1739 |
break; |
1740 |
case 0xb: /* V9 fabsq */ |
|
1741 |
#if defined(CONFIG_USER_ONLY) |
|
1742 |
gen_op_load_fpr_QT1(QFPREG(rs2)); |
|
1743 |
gen_op_fabsq(); |
|
1744 |
gen_op_store_QT0_fpr(QFPREG(rd)); |
|
1745 |
break; |
|
1746 |
#else |
|
1747 |
goto nfpu_insn; |
|
1748 |
#endif |
|
1609 | 1749 |
case 0x81: /* V9 fstox */ |
1610 | 1750 |
gen_op_load_fpr_FT1(rs2); |
1611 | 1751 |
gen_op_fstox(); |
... | ... | |
1616 | 1756 |
gen_op_fdtox(); |
1617 | 1757 |
gen_op_store_DT0_fpr(DFPREG(rd)); |
1618 | 1758 |
break; |
1759 |
case 0x83: /* V9 fqtox */ |
|
1760 |
#if defined(CONFIG_USER_ONLY) |
|
1761 |
gen_op_load_fpr_QT1(QFPREG(rs2)); |
|
1762 |
gen_op_fqtox(); |
|
1763 |
gen_op_store_DT0_fpr(DFPREG(rd)); |
|
1764 |
break; |
|
1765 |
#else |
|
1766 |
goto nfpu_insn; |
|
1767 |
#endif |
|
1619 | 1768 |
case 0x84: /* V9 fxtos */ |
1620 | 1769 |
gen_op_load_fpr_DT1(DFPREG(rs2)); |
1621 | 1770 |
gen_op_fxtos(); |
... | ... | |
1626 | 1775 |
gen_op_fxtod(); |
1627 | 1776 |
gen_op_store_DT0_fpr(DFPREG(rd)); |
1628 | 1777 |
break; |
1629 |
case 0x3: /* V9 fmovq */ |
|
1630 |
case 0x7: /* V9 fnegq */ |
|
1631 |
case 0xb: /* V9 fabsq */ |
|
1632 |
case 0x83: /* V9 fqtox */ |
|
1633 | 1778 |
case 0x8c: /* V9 fxtoq */ |
1779 |
#if defined(CONFIG_USER_ONLY) |
|
1780 |
gen_op_load_fpr_DT1(DFPREG(rs2)); |
|
1781 |
gen_op_fxtoq(); |
|
1782 |
gen_op_store_QT0_fpr(QFPREG(rd)); |
|
1783 |
break; |
|
1784 |
#else |
|
1634 | 1785 |
goto nfpu_insn; |
1635 | 1786 |
#endif |
1787 |
#endif |
|
1636 | 1788 |
default: |
1637 | 1789 |
goto illegal_insn; |
1638 | 1790 |
} |
... | ... | |
1670 | 1822 |
gen_op_store_DT0_fpr(rd); |
1671 | 1823 |
break; |
1672 | 1824 |
} else if ((xop & 0x11f) == 0x007) { // V9 fmovqr |
1825 |
#if defined(CONFIG_USER_ONLY) |
|
1826 |
cond = GET_FIELD_SP(insn, 14, 17); |
|
1827 |
gen_op_load_fpr_QT0(QFPREG(rd)); |
|
1828 |
gen_op_load_fpr_QT1(QFPREG(rs2)); |
|
1829 |
flush_T2(dc); |
|
1830 |
rs1 = GET_FIELD(insn, 13, 17); |
|
1831 |
gen_movl_reg_T0(rs1); |
|
1832 |
gen_cond_reg(cond); |
|
1833 |
gen_op_fmovq_cc(); |
|
1834 |
gen_op_store_QT0_fpr(QFPREG(rd)); |
|
1835 |
break; |
|
1836 |
#else |
|
1673 | 1837 |
goto nfpu_insn; |
1838 |
#endif |
|
1674 | 1839 |
} |
1675 | 1840 |
#endif |
1676 | 1841 |
switch (xop) { |
... | ... | |
1694 | 1859 |
gen_op_store_DT0_fpr(rd); |
1695 | 1860 |
break; |
1696 | 1861 |
case 0x003: /* V9 fmovqcc %fcc0 */ |
1862 |
#if defined(CONFIG_USER_ONLY) |
|
1863 |
cond = GET_FIELD_SP(insn, 14, 17); |
|
1864 |
gen_op_load_fpr_QT0(QFPREG(rd)); |
|
1865 |
gen_op_load_fpr_QT1(QFPREG(rs2)); |
|
1866 |
flush_T2(dc); |
|
1867 |
gen_fcond[0][cond](); |
|
1868 |
gen_op_fmovq_cc(); |
|
1869 |
gen_op_store_QT0_fpr(QFPREG(rd)); |
|
1870 |
break; |
|
1871 |
#else |
|
1697 | 1872 |
goto nfpu_insn; |
1873 |
#endif |
|
1698 | 1874 |
case 0x041: /* V9 fmovscc %fcc1 */ |
1699 | 1875 |
cond = GET_FIELD_SP(insn, 14, 17); |
1700 | 1876 |
gen_op_load_fpr_FT0(rd); |
... | ... | |
1714 | 1890 |
gen_op_store_DT0_fpr(rd); |
1715 | 1891 |
break; |
1716 | 1892 |
case 0x043: /* V9 fmovqcc %fcc1 */ |
1893 |
#if defined(CONFIG_USER_ONLY) |
|
1894 |
cond = GET_FIELD_SP(insn, 14, 17); |
|
1895 |
gen_op_load_fpr_QT0(QFPREG(rd)); |
|
1896 |
gen_op_load_fpr_QT1(QFPREG(rs2)); |
|
1897 |
flush_T2(dc); |
|
1898 |
gen_fcond[1][cond](); |
|
1899 |
gen_op_fmovq_cc(); |
|
1900 |
gen_op_store_QT0_fpr(QFPREG(rd)); |
|
1901 |
break; |
|
1902 |
#else |
|
1717 | 1903 |
goto nfpu_insn; |
1904 |
#endif |
|
1718 | 1905 |
case 0x081: /* V9 fmovscc %fcc2 */ |
1719 | 1906 |
cond = GET_FIELD_SP(insn, 14, 17); |
1720 | 1907 |
gen_op_load_fpr_FT0(rd); |
... | ... | |
1734 | 1921 |
gen_op_store_DT0_fpr(rd); |
1735 | 1922 |
break; |
1736 | 1923 |
case 0x083: /* V9 fmovqcc %fcc2 */ |
1924 |
#if defined(CONFIG_USER_ONLY) |
|
1925 |
cond = GET_FIELD_SP(insn, 14, 17); |
|
1926 |
gen_op_load_fpr_QT0(rd); |
|
1927 |
gen_op_load_fpr_QT1(rs2); |
|
1928 |
flush_T2(dc); |
|
1929 |
gen_fcond[2][cond](); |
|
1930 |
gen_op_fmovq_cc(); |
|
1931 |
gen_op_store_QT0_fpr(rd); |
|
1932 |
break; |
|
1933 |
#else |
|
1737 | 1934 |
goto nfpu_insn; |
1935 |
#endif |
|
1738 | 1936 |
case 0x0c1: /* V9 fmovscc %fcc3 */ |
1739 | 1937 |
cond = GET_FIELD_SP(insn, 14, 17); |
1740 | 1938 |
gen_op_load_fpr_FT0(rd); |
... | ... | |
1754 | 1952 |
gen_op_store_DT0_fpr(rd); |
1755 | 1953 |
break; |
1756 | 1954 |
case 0x0c3: /* V9 fmovqcc %fcc3 */ |
1955 |
#if defined(CONFIG_USER_ONLY) |
|
1956 |
cond = GET_FIELD_SP(insn, 14, 17); |
|
1957 |
gen_op_load_fpr_QT0(QFPREG(rd)); |
|
1958 |
gen_op_load_fpr_QT1(QFPREG(rs2)); |
|
1959 |
flush_T2(dc); |
|
1960 |
gen_fcond[3][cond](); |
|
1961 |
gen_op_fmovq_cc(); |
|
1962 |
gen_op_store_QT0_fpr(QFPREG(rd)); |
|
1963 |
break; |
|
1964 |
#else |
|
1757 | 1965 |
goto nfpu_insn; |
1966 |
#endif |
|
1758 | 1967 |
case 0x101: /* V9 fmovscc %icc */ |
1759 | 1968 |
cond = GET_FIELD_SP(insn, 14, 17); |
1760 | 1969 |
gen_op_load_fpr_FT0(rd); |
... | ... | |
1774 | 1983 |
gen_op_store_DT0_fpr(rd); |
1775 | 1984 |
break; |
1776 | 1985 |
case 0x103: /* V9 fmovqcc %icc */ |
1986 |
#if defined(CONFIG_USER_ONLY) |
|
1987 |
cond = GET_FIELD_SP(insn, 14, 17); |
|
1988 |
gen_op_load_fpr_QT0(rd); |
|
1989 |
gen_op_load_fpr_QT1(rs2); |
|
1990 |
flush_T2(dc); |
|
1991 |
gen_cond[0][cond](); |
|
1992 |
gen_op_fmovq_cc(); |
|
1993 |
gen_op_store_QT0_fpr(rd); |
|
1994 |
break; |
|
1995 |
#else |
|
1777 | 1996 |
goto nfpu_insn; |
1997 |
#endif |
|
1778 | 1998 |
case 0x181: /* V9 fmovscc %xcc */ |
1779 | 1999 |
cond = GET_FIELD_SP(insn, 14, 17); |
1780 | 2000 |
gen_op_load_fpr_FT0(rd); |
... | ... | |
1794 | 2014 |
gen_op_store_DT0_fpr(rd); |
1795 | 2015 |
break; |
1796 | 2016 |
case 0x183: /* V9 fmovqcc %xcc */ |
2017 |
#if defined(CONFIG_USER_ONLY) |
|
2018 |
cond = GET_FIELD_SP(insn, 14, 17); |
|
2019 |
gen_op_load_fpr_QT0(rd); |
|
2020 |
gen_op_load_fpr_QT1(rs2); |
|
2021 |
flush_T2(dc); |
|
2022 |
gen_cond[1][cond](); |
|
2023 |
gen_op_fmovq_cc(); |
|
2024 |
gen_op_store_QT0_fpr(rd); |
|
2025 |
break; |
|
2026 |
#else |
|
1797 | 2027 |
goto nfpu_insn; |
1798 | 2028 |
#endif |
1799 |
case 0x51: /* V9 %fcc */ |
|
2029 |
#endif |
|
2030 |
case 0x51: /* fcmps, V9 %fcc */ |
|
1800 | 2031 |
gen_op_load_fpr_FT0(rs1); |
1801 | 2032 |
gen_op_load_fpr_FT1(rs2); |
1802 | 2033 |
#ifdef TARGET_SPARC64 |
... | ... | |
1805 | 2036 |
gen_op_fcmps(); |
1806 | 2037 |
#endif |
1807 | 2038 |
break; |
1808 |
case 0x52: /* V9 %fcc */ |
|
2039 |
case 0x52: /* fcmpd, V9 %fcc */
|
|
1809 | 2040 |
gen_op_load_fpr_DT0(DFPREG(rs1)); |
1810 | 2041 |
gen_op_load_fpr_DT1(DFPREG(rs2)); |
1811 | 2042 |
#ifdef TARGET_SPARC64 |
... | ... | |
1814 | 2045 |
gen_op_fcmpd(); |
1815 | 2046 |
#endif |
1816 | 2047 |
break; |
1817 |
case 0x53: /* fcmpq */ |
|
2048 |
case 0x53: /* fcmpq, V9 %fcc */ |
|
2049 |
#if defined(CONFIG_USER_ONLY) |
|
2050 |
gen_op_load_fpr_QT0(QFPREG(rs1)); |
|
2051 |
gen_op_load_fpr_QT1(QFPREG(rs2)); |
|
2052 |
#ifdef TARGET_SPARC64 |
|
2053 |
gen_fcmpq[rd & 3](); |
|
2054 |
#else |
|
2055 |
gen_op_fcmpq(); |
|
2056 |
#endif |
|
2057 |
break; |
|
2058 |
#else /* !defined(CONFIG_USER_ONLY) */ |
|
1818 | 2059 |
goto nfpu_insn; |
2060 |
#endif |
|
1819 | 2061 |
case 0x55: /* fcmpes, V9 %fcc */ |
1820 | 2062 |
gen_op_load_fpr_FT0(rs1); |
1821 | 2063 |
gen_op_load_fpr_FT1(rs2); |
... | ... | |
1834 | 2076 |
gen_op_fcmped(); |
1835 | 2077 |
#endif |
1836 | 2078 |
break; |
1837 |
case 0x57: /* fcmpeq */ |
|
2079 |
case 0x57: /* fcmpeq, V9 %fcc */ |
|
2080 |
#if defined(CONFIG_USER_ONLY) |
|
2081 |
gen_op_load_fpr_QT0(QFPREG(rs1)); |
|
2082 |
gen_op_load_fpr_QT1(QFPREG(rs2)); |
|
2083 |
#ifdef TARGET_SPARC64 |
|
2084 |
gen_fcmpeq[rd & 3](); |
|
2085 |
#else |
|
2086 |
gen_op_fcmpeq(); |
|
2087 |
#endif |
|
2088 |
break; |
|
2089 |
#else/* !defined(CONFIG_USER_ONLY) */ |
|
1838 | 2090 |
goto nfpu_insn; |
2091 |
#endif |
|
1839 | 2092 |
default: |
1840 | 2093 |
goto illegal_insn; |
1841 | 2094 |
} |
... | ... | |
3095 | 3348 |
case 0x3d: /* V9 prefetcha, no effect */ |
3096 | 3349 |
goto skip_move; |
3097 | 3350 |
case 0x32: /* V9 ldqfa */ |
3351 |
#if defined(CONFIG_USER_ONLY) |
|
3352 |
gen_op_check_align_T0_3(); |
|
3353 |
gen_ldf_asi(insn, 16); |
|
3354 |
goto skip_move; |
|
3355 |
#else |
|
3098 | 3356 |
goto nfpu_insn; |
3099 | 3357 |
#endif |
3358 |
#endif |
|
3100 | 3359 |
default: |
3101 | 3360 |
goto illegal_insn; |
3102 | 3361 |
} |
... | ... | |
3119 | 3378 |
gen_op_ldfsr(); |
3120 | 3379 |
break; |
3121 | 3380 |
case 0x22: /* load quad fpreg */ |
3381 |
#if defined(CONFIG_USER_ONLY) |
|
3382 |
gen_op_check_align_T0_7(); |
|
3383 |
gen_op_ldst(ldqf); |
|
3384 |
gen_op_store_QT0_fpr(QFPREG(rd)); |
|
3385 |
break; |
|
3386 |
#else |
|
3122 | 3387 |
goto nfpu_insn; |
3388 |
#endif |
|
3123 | 3389 |
case 0x23: /* load double fpreg */ |
3124 | 3390 |
gen_op_check_align_T0_7(); |
3125 | 3391 |
gen_op_ldst(lddf); |
... | ... | |
3225 | 3491 |
gen_op_stfsr(); |
3226 | 3492 |
gen_op_ldst(stf); |
3227 | 3493 |
break; |
3228 |
#if !defined(CONFIG_USER_ONLY) |
|
3229 |
case 0x26: /* stdfq */ |
|
3494 |
case 0x26: |
|
3495 |
#ifdef TARGET_SPARC64 |
|
3496 |
#if defined(CONFIG_USER_ONLY) |
|
3497 |
/* V9 stqf, store quad fpreg */ |
|
3498 |
gen_op_check_align_T0_7(); |
|
3499 |
gen_op_load_fpr_QT0(QFPREG(rd)); |
|
3500 |
gen_op_ldst(stqf); |
|
3501 |
break; |
|
3502 |
#else |
|
3503 |
goto nfpu_insn; |
|
3504 |
#endif |
|
3505 |
#else /* !TARGET_SPARC64 */ |
|
3506 |
/* stdfq, store floating point queue */ |
|
3507 |
#if defined(CONFIG_USER_ONLY) |
|
3508 |
goto illegal_insn; |
|
3509 |
#else |
|
3230 | 3510 |
if (!supervisor(dc)) |
3231 | 3511 |
goto priv_insn; |
3232 | 3512 |
if (gen_trap_ifnofpu(dc)) |
3233 | 3513 |
goto jmp_insn; |
3234 | 3514 |
goto nfq_insn; |
3235 | 3515 |
#endif |
3516 |
#endif |
|
3236 | 3517 |
case 0x27: |
3237 | 3518 |
gen_op_check_align_T0_7(); |
3238 | 3519 |
gen_op_load_fpr_DT0(DFPREG(rd)); |
... | ... | |
3249 | 3530 |
gen_op_load_fpr_FT0(rd); |
3250 | 3531 |
gen_stf_asi(insn, 4); |
3251 | 3532 |
break; |
3533 |
case 0x36: /* V9 stqfa */ |
|
3534 |
#if defined(CONFIG_USER_ONLY) |
|
3535 |
gen_op_check_align_T0_7(); |
|
3536 |
gen_op_load_fpr_QT0(QFPREG(rd)); |
|
3537 |
gen_stf_asi(insn, 16); |
|
3538 |
break; |
|
3539 |
#else |
|
3540 |
goto nfpu_insn; |
|
3541 |
#endif |
|
3252 | 3542 |
case 0x37: /* V9 stdfa */ |
3253 | 3543 |
gen_op_check_align_T0_3(); |
3254 | 3544 |
gen_op_load_fpr_DT0(DFPREG(rd)); |
... | ... | |
3268 | 3558 |
gen_casx_asi(insn); |
3269 | 3559 |
gen_movl_T1_reg(rd); |
3270 | 3560 |
break; |
3271 |
case 0x36: /* V9 stqfa */ |
|
3272 |
goto nfpu_insn; |
|
3273 | 3561 |
#else |
3274 | 3562 |
case 0x34: /* stc */ |
3275 | 3563 |
case 0x35: /* stcsr */ |
... | ... | |
3311 | 3599 |
gen_op_exception(TT_PRIV_INSN); |
3312 | 3600 |
dc->is_br = 1; |
3313 | 3601 |
return; |
3314 |
#endif |
|
3315 | 3602 |
nfpu_insn: |
3316 | 3603 |
save_state(dc); |
3317 | 3604 |
gen_op_fpexception_im(FSR_FTT_UNIMPFPOP); |
3318 | 3605 |
dc->is_br = 1; |
3319 | 3606 |
return; |
3320 |
#if !defined(CONFIG_USER_ONLY)
|
|
3607 |
#ifndef TARGET_SPARC64
|
|
3321 | 3608 |
nfq_insn: |
3322 | 3609 |
save_state(dc); |
3323 | 3610 |
gen_op_fpexception_im(FSR_FTT_SEQ_ERROR); |
3324 | 3611 |
dc->is_br = 1; |
3325 | 3612 |
return; |
3326 | 3613 |
#endif |
3614 |
#endif |
|
3327 | 3615 |
#ifndef TARGET_SPARC64 |
3328 | 3616 |
ncp_insn: |
3329 | 3617 |
save_state(dc); |
Also available in: Unified diff