| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "vm/globals.h" | 5 #include "vm/globals.h" |
| 6 #if defined(TARGET_ARCH_ARM) | 6 #if defined(TARGET_ARCH_ARM) |
| 7 | 7 |
| 8 #include "vm/assembler.h" | 8 #include "vm/assembler.h" |
| 9 #include "vm/os.h" | 9 #include "vm/os.h" |
| 10 #include "vm/unit_test.h" | 10 #include "vm/unit_test.h" |
| (...skipping 1582 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1593 EXPECT(test != NULL); | 1593 EXPECT(test != NULL); |
| 1594 typedef int (*Tst)(); | 1594 typedef int (*Tst)(); |
| 1595 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); | 1595 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); |
| 1596 } | 1596 } |
| 1597 | 1597 |
| 1598 | 1598 |
| 1599 ASSEMBLER_TEST_GENERATE(Vaddqi8, assembler) { | 1599 ASSEMBLER_TEST_GENERATE(Vaddqi8, assembler) { |
| 1600 if (CPUFeatures::neon_supported()) { | 1600 if (CPUFeatures::neon_supported()) { |
| 1601 __ mov(R0, ShifterOperand(1)); | 1601 __ mov(R0, ShifterOperand(1)); |
| 1602 __ vmovsr(S0, R0); | 1602 __ vmovsr(S0, R0); |
| 1603 __ mov(R0, ShifterOperand(2)); |
| 1603 __ vmovsr(S1, R0); | 1604 __ vmovsr(S1, R0); |
| 1605 __ mov(R0, ShifterOperand(3)); |
| 1604 __ vmovsr(S2, R0); | 1606 __ vmovsr(S2, R0); |
| 1607 __ mov(R0, ShifterOperand(4)); |
| 1605 __ vmovsr(S3, R0); | 1608 __ vmovsr(S3, R0); |
| 1609 __ mov(R0, ShifterOperand(5)); |
| 1606 __ vmovsr(S4, R0); | 1610 __ vmovsr(S4, R0); |
| 1611 __ mov(R0, ShifterOperand(6)); |
| 1607 __ vmovsr(S5, R0); | 1612 __ vmovsr(S5, R0); |
| 1613 __ mov(R0, ShifterOperand(7)); |
| 1608 __ vmovsr(S6, R0); | 1614 __ vmovsr(S6, R0); |
| 1615 __ mov(R0, ShifterOperand(8)); |
| 1609 __ vmovsr(S7, R0); | 1616 __ vmovsr(S7, R0); |
| 1610 | 1617 |
| 1618 // TODO(zra): Replace 0 with enum value that implies 1-byte elements. |
| 1611 __ vaddqi(0, Q2, Q0, Q1); | 1619 __ vaddqi(0, Q2, Q0, Q1); |
| 1612 | 1620 |
| 1613 __ vmovrs(R0, S8); | 1621 __ vmovrs(R0, S8); |
| 1614 __ vmovrs(R1, S9); | 1622 __ vmovrs(R1, S9); |
| 1615 __ vmovrs(R2, S10); | 1623 __ vmovrs(R2, S10); |
| 1616 __ vmovrs(R3, S11); | 1624 __ vmovrs(R3, S11); |
| 1617 | 1625 |
| 1618 __ add(R0, R0, ShifterOperand(R1)); | 1626 __ add(R0, R0, ShifterOperand(R1)); |
| 1619 __ add(R0, R0, ShifterOperand(R2)); | 1627 __ add(R0, R0, ShifterOperand(R2)); |
| 1620 __ add(R0, R0, ShifterOperand(R3)); | 1628 __ add(R0, R0, ShifterOperand(R3)); |
| 1621 __ bx(LR); | 1629 __ bx(LR); |
| 1622 } else { | 1630 } else { |
| 1623 __ LoadImmediate(R0, 8); | 1631 __ LoadImmediate(R0, 36); |
| 1624 __ bx(LR); | 1632 __ bx(LR); |
| 1625 } | 1633 } |
| 1626 } | 1634 } |
| 1627 | 1635 |
| 1628 | 1636 |
| 1629 ASSEMBLER_TEST_RUN(Vaddqi8, test) { | 1637 ASSEMBLER_TEST_RUN(Vaddqi8, test) { |
| 1630 EXPECT(test != NULL); | 1638 EXPECT(test != NULL); |
| 1631 typedef int (*Tst)(); | 1639 typedef int (*Tst)(); |
| 1632 EXPECT_EQ(8, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); | 1640 EXPECT_EQ(36, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); |
| 1633 } | 1641 } |
| 1634 | 1642 |
| 1635 | 1643 |
| 1636 ASSEMBLER_TEST_GENERATE(Vaddqi16, assembler) { | 1644 ASSEMBLER_TEST_GENERATE(Vaddqi16, assembler) { |
| 1637 if (CPUFeatures::neon_supported()) { | 1645 if (CPUFeatures::neon_supported()) { |
| 1638 __ mov(R0, ShifterOperand(1)); | 1646 __ mov(R0, ShifterOperand(1)); |
| 1639 __ vmovsr(S0, R0); | 1647 __ vmovsr(S0, R0); |
| 1648 __ mov(R0, ShifterOperand(2)); |
| 1640 __ vmovsr(S1, R0); | 1649 __ vmovsr(S1, R0); |
| 1650 __ mov(R0, ShifterOperand(3)); |
| 1641 __ vmovsr(S2, R0); | 1651 __ vmovsr(S2, R0); |
| 1652 __ mov(R0, ShifterOperand(4)); |
| 1642 __ vmovsr(S3, R0); | 1653 __ vmovsr(S3, R0); |
| 1654 __ mov(R0, ShifterOperand(5)); |
| 1643 __ vmovsr(S4, R0); | 1655 __ vmovsr(S4, R0); |
| 1656 __ mov(R0, ShifterOperand(6)); |
| 1644 __ vmovsr(S5, R0); | 1657 __ vmovsr(S5, R0); |
| 1658 __ mov(R0, ShifterOperand(7)); |
| 1645 __ vmovsr(S6, R0); | 1659 __ vmovsr(S6, R0); |
| 1660 __ mov(R0, ShifterOperand(8)); |
| 1646 __ vmovsr(S7, R0); | 1661 __ vmovsr(S7, R0); |
| 1647 | 1662 |
| 1663 // TODO(zra): Replace 1 with enum value that implies 2-byte elements. |
| 1648 __ vaddqi(1, Q2, Q0, Q1); | 1664 __ vaddqi(1, Q2, Q0, Q1); |
| 1649 | 1665 |
| 1650 __ vmovrs(R0, S8); | 1666 __ vmovrs(R0, S8); |
| 1651 __ vmovrs(R1, S9); | 1667 __ vmovrs(R1, S9); |
| 1652 __ vmovrs(R2, S10); | 1668 __ vmovrs(R2, S10); |
| 1653 __ vmovrs(R3, S11); | 1669 __ vmovrs(R3, S11); |
| 1654 | 1670 |
| 1655 __ add(R0, R0, ShifterOperand(R1)); | 1671 __ add(R0, R0, ShifterOperand(R1)); |
| 1656 __ add(R0, R0, ShifterOperand(R2)); | 1672 __ add(R0, R0, ShifterOperand(R2)); |
| 1657 __ add(R0, R0, ShifterOperand(R3)); | 1673 __ add(R0, R0, ShifterOperand(R3)); |
| 1658 __ bx(LR); | 1674 __ bx(LR); |
| 1659 } else { | 1675 } else { |
| 1660 __ LoadImmediate(R0, 8); | 1676 __ LoadImmediate(R0, 36); |
| 1661 __ bx(LR); | 1677 __ bx(LR); |
| 1662 } | 1678 } |
| 1663 } | 1679 } |
| 1664 | 1680 |
| 1665 | 1681 |
| 1666 ASSEMBLER_TEST_RUN(Vaddqi16, test) { | 1682 ASSEMBLER_TEST_RUN(Vaddqi16, test) { |
| 1667 EXPECT(test != NULL); | 1683 EXPECT(test != NULL); |
| 1668 typedef int (*Tst)(); | 1684 typedef int (*Tst)(); |
| 1669 EXPECT_EQ(8, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); | 1685 EXPECT_EQ(36, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); |
| 1670 } | 1686 } |
| 1671 | 1687 |
| 1672 | 1688 |
| 1673 ASSEMBLER_TEST_GENERATE(Vaddqi32, assembler) { | 1689 ASSEMBLER_TEST_GENERATE(Vaddqi32, assembler) { |
| 1674 if (CPUFeatures::neon_supported()) { | 1690 if (CPUFeatures::neon_supported()) { |
| 1675 __ mov(R0, ShifterOperand(1)); | 1691 __ mov(R0, ShifterOperand(1)); |
| 1676 __ vmovsr(S0, R0); | 1692 __ vmovsr(S0, R0); |
| 1693 __ mov(R0, ShifterOperand(2)); |
| 1677 __ vmovsr(S1, R0); | 1694 __ vmovsr(S1, R0); |
| 1695 __ mov(R0, ShifterOperand(3)); |
| 1678 __ vmovsr(S2, R0); | 1696 __ vmovsr(S2, R0); |
| 1697 __ mov(R0, ShifterOperand(4)); |
| 1679 __ vmovsr(S3, R0); | 1698 __ vmovsr(S3, R0); |
| 1699 __ mov(R0, ShifterOperand(5)); |
| 1680 __ vmovsr(S4, R0); | 1700 __ vmovsr(S4, R0); |
| 1701 __ mov(R0, ShifterOperand(6)); |
| 1681 __ vmovsr(S5, R0); | 1702 __ vmovsr(S5, R0); |
| 1703 __ mov(R0, ShifterOperand(7)); |
| 1682 __ vmovsr(S6, R0); | 1704 __ vmovsr(S6, R0); |
| 1705 __ mov(R0, ShifterOperand(8)); |
| 1683 __ vmovsr(S7, R0); | 1706 __ vmovsr(S7, R0); |
| 1684 | 1707 |
| 1708 // TODO(zra): Replace 2 with enum value that implies 4-byte elements. |
| 1685 __ vaddqi(2, Q2, Q0, Q1); | 1709 __ vaddqi(2, Q2, Q0, Q1); |
| 1686 | 1710 |
| 1687 __ vmovrs(R0, S8); | 1711 __ vmovrs(R0, S8); |
| 1688 __ vmovrs(R1, S9); | 1712 __ vmovrs(R1, S9); |
| 1689 __ vmovrs(R2, S10); | 1713 __ vmovrs(R2, S10); |
| 1690 __ vmovrs(R3, S11); | 1714 __ vmovrs(R3, S11); |
| 1691 | 1715 |
| 1692 __ add(R0, R0, ShifterOperand(R1)); | 1716 __ add(R0, R0, ShifterOperand(R1)); |
| 1693 __ add(R0, R0, ShifterOperand(R2)); | 1717 __ add(R0, R0, ShifterOperand(R2)); |
| 1694 __ add(R0, R0, ShifterOperand(R3)); | 1718 __ add(R0, R0, ShifterOperand(R3)); |
| 1695 __ bx(LR); | 1719 __ bx(LR); |
| 1696 } else { | 1720 } else { |
| 1697 __ LoadImmediate(R0, 8); | 1721 __ LoadImmediate(R0, 36); |
| 1698 __ bx(LR); | 1722 __ bx(LR); |
| 1699 } | 1723 } |
| 1700 } | 1724 } |
| 1701 | 1725 |
| 1702 | 1726 |
| 1703 ASSEMBLER_TEST_RUN(Vaddqi32, test) { | 1727 ASSEMBLER_TEST_RUN(Vaddqi32, test) { |
| 1704 EXPECT(test != NULL); | 1728 EXPECT(test != NULL); |
| 1705 typedef int (*Tst)(); | 1729 typedef int (*Tst)(); |
| 1706 EXPECT_EQ(8, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); | 1730 EXPECT_EQ(36, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); |
| 1707 } | 1731 } |
| 1708 | 1732 |
| 1709 | 1733 |
| 1710 ASSEMBLER_TEST_GENERATE(Vaddqi64, assembler) { | 1734 ASSEMBLER_TEST_GENERATE(Vaddqi64, assembler) { |
| 1711 if (CPUFeatures::neon_supported()) { | 1735 if (CPUFeatures::neon_supported()) { |
| 1712 __ mov(R0, ShifterOperand(1)); | 1736 __ mov(R0, ShifterOperand(1)); |
| 1713 __ vmovsr(S0, R0); | 1737 __ vmovsr(S0, R0); |
| 1738 __ mov(R0, ShifterOperand(2)); |
| 1714 __ vmovsr(S2, R0); | 1739 __ vmovsr(S2, R0); |
| 1740 __ mov(R0, ShifterOperand(3)); |
| 1715 __ vmovsr(S4, R0); | 1741 __ vmovsr(S4, R0); |
| 1742 __ mov(R0, ShifterOperand(4)); |
| 1716 __ vmovsr(S6, R0); | 1743 __ vmovsr(S6, R0); |
| 1717 | 1744 |
| 1745 // TODO(zra): Replace 3 with enum value that implies 8-byte elements. |
| 1718 __ vaddqi(3, Q2, Q0, Q1); | 1746 __ vaddqi(3, Q2, Q0, Q1); |
| 1719 | 1747 |
| 1720 __ vmovrs(R0, S8); | 1748 __ vmovrs(R0, S8); |
| 1721 __ vmovrs(R2, S10); | 1749 __ vmovrs(R2, S10); |
| 1722 | 1750 |
| 1723 __ add(R0, R0, ShifterOperand(R2)); | 1751 __ add(R0, R0, ShifterOperand(R2)); |
| 1724 __ bx(LR); | 1752 __ bx(LR); |
| 1725 } else { | 1753 } else { |
| 1726 __ LoadImmediate(R0, 4); | 1754 __ LoadImmediate(R0, 10); |
| 1727 __ bx(LR); | 1755 __ bx(LR); |
| 1728 } | 1756 } |
| 1729 } | 1757 } |
| 1730 | 1758 |
| 1731 | 1759 |
| 1732 ASSEMBLER_TEST_RUN(Vaddqi64, test) { | 1760 ASSEMBLER_TEST_RUN(Vaddqi64, test) { |
| 1733 EXPECT(test != NULL); | 1761 EXPECT(test != NULL); |
| 1734 typedef int (*Tst)(); | 1762 typedef int (*Tst)(); |
| 1735 EXPECT_EQ(4, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); | 1763 EXPECT_EQ(10, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); |
| 1764 } |
| 1765 |
| 1766 |
| 1767 ASSEMBLER_TEST_GENERATE(Vsubqi8, assembler) { |
| 1768 if (CPUFeatures::neon_supported()) { |
| 1769 __ mov(R0, ShifterOperand(1)); |
| 1770 __ vmovsr(S0, R0); |
| 1771 __ mov(R0, ShifterOperand(2)); |
| 1772 __ vmovsr(S1, R0); |
| 1773 __ mov(R0, ShifterOperand(3)); |
| 1774 __ vmovsr(S2, R0); |
| 1775 __ mov(R0, ShifterOperand(4)); |
| 1776 __ vmovsr(S3, R0); |
| 1777 __ mov(R0, ShifterOperand(2)); |
| 1778 __ vmovsr(S4, R0); |
| 1779 __ mov(R0, ShifterOperand(4)); |
| 1780 __ vmovsr(S5, R0); |
| 1781 __ mov(R0, ShifterOperand(6)); |
| 1782 __ vmovsr(S6, R0); |
| 1783 __ mov(R0, ShifterOperand(8)); |
| 1784 __ vmovsr(S7, R0); |
| 1785 |
| 1786 // TODO(zra): Replace 0 with enum value that implies 1-byte elements. |
| 1787 __ vsubqi(0, Q2, Q1, Q0); |
| 1788 |
| 1789 __ vmovrs(R0, S8); |
| 1790 __ vmovrs(R1, S9); |
| 1791 __ vmovrs(R2, S10); |
| 1792 __ vmovrs(R3, S11); |
| 1793 |
| 1794 __ add(R0, R0, ShifterOperand(R1)); |
| 1795 __ add(R0, R0, ShifterOperand(R2)); |
| 1796 __ add(R0, R0, ShifterOperand(R3)); |
| 1797 __ bx(LR); |
| 1798 } else { |
| 1799 __ LoadImmediate(R0, 10); |
| 1800 __ bx(LR); |
| 1801 } |
| 1802 } |
| 1803 |
| 1804 |
| 1805 ASSEMBLER_TEST_RUN(Vsubqi8, test) { |
| 1806 EXPECT(test != NULL); |
| 1807 typedef int (*Tst)(); |
| 1808 EXPECT_EQ(10, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); |
| 1809 } |
| 1810 |
| 1811 |
| 1812 ASSEMBLER_TEST_GENERATE(Vsubqi16, assembler) { |
| 1813 if (CPUFeatures::neon_supported()) { |
| 1814 __ mov(R0, ShifterOperand(1)); |
| 1815 __ vmovsr(S0, R0); |
| 1816 __ mov(R0, ShifterOperand(2)); |
| 1817 __ vmovsr(S1, R0); |
| 1818 __ mov(R0, ShifterOperand(3)); |
| 1819 __ vmovsr(S2, R0); |
| 1820 __ mov(R0, ShifterOperand(4)); |
| 1821 __ vmovsr(S3, R0); |
| 1822 __ mov(R0, ShifterOperand(2)); |
| 1823 __ vmovsr(S4, R0); |
| 1824 __ mov(R0, ShifterOperand(4)); |
| 1825 __ vmovsr(S5, R0); |
| 1826 __ mov(R0, ShifterOperand(6)); |
| 1827 __ vmovsr(S6, R0); |
| 1828 __ mov(R0, ShifterOperand(8)); |
| 1829 __ vmovsr(S7, R0); |
| 1830 |
| 1831 // TODO(zra): Replace 1 with enum value that implies 2-byte elements. |
| 1832 __ vsubqi(1, Q2, Q1, Q0); |
| 1833 |
| 1834 __ vmovrs(R0, S8); |
| 1835 __ vmovrs(R1, S9); |
| 1836 __ vmovrs(R2, S10); |
| 1837 __ vmovrs(R3, S11); |
| 1838 |
| 1839 __ add(R0, R0, ShifterOperand(R1)); |
| 1840 __ add(R0, R0, ShifterOperand(R2)); |
| 1841 __ add(R0, R0, ShifterOperand(R3)); |
| 1842 __ bx(LR); |
| 1843 } else { |
| 1844 __ LoadImmediate(R0, 10); |
| 1845 __ bx(LR); |
| 1846 } |
| 1847 } |
| 1848 |
| 1849 |
| 1850 ASSEMBLER_TEST_RUN(Vsubqi16, test) { |
| 1851 EXPECT(test != NULL); |
| 1852 typedef int (*Tst)(); |
| 1853 EXPECT_EQ(10, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); |
| 1854 } |
| 1855 |
| 1856 |
| 1857 ASSEMBLER_TEST_GENERATE(Vsubqi32, assembler) { |
| 1858 if (CPUFeatures::neon_supported()) { |
| 1859 __ mov(R0, ShifterOperand(1)); |
| 1860 __ vmovsr(S0, R0); |
| 1861 __ mov(R0, ShifterOperand(2)); |
| 1862 __ vmovsr(S1, R0); |
| 1863 __ mov(R0, ShifterOperand(3)); |
| 1864 __ vmovsr(S2, R0); |
| 1865 __ mov(R0, ShifterOperand(4)); |
| 1866 __ vmovsr(S3, R0); |
| 1867 __ mov(R0, ShifterOperand(2)); |
| 1868 __ vmovsr(S4, R0); |
| 1869 __ mov(R0, ShifterOperand(4)); |
| 1870 __ vmovsr(S5, R0); |
| 1871 __ mov(R0, ShifterOperand(6)); |
| 1872 __ vmovsr(S6, R0); |
| 1873 __ mov(R0, ShifterOperand(8)); |
| 1874 __ vmovsr(S7, R0); |
| 1875 |
| 1876 // TODO(zra): Replace 2 with enum value that implies 4-byte elements. |
| 1877 __ vsubqi(2, Q2, Q1, Q0); |
| 1878 |
| 1879 __ vmovrs(R0, S8); |
| 1880 __ vmovrs(R1, S9); |
| 1881 __ vmovrs(R2, S10); |
| 1882 __ vmovrs(R3, S11); |
| 1883 |
| 1884 __ add(R0, R0, ShifterOperand(R1)); |
| 1885 __ add(R0, R0, ShifterOperand(R2)); |
| 1886 __ add(R0, R0, ShifterOperand(R3)); |
| 1887 __ bx(LR); |
| 1888 } else { |
| 1889 __ LoadImmediate(R0, 10); |
| 1890 __ bx(LR); |
| 1891 } |
| 1892 } |
| 1893 |
| 1894 |
| 1895 ASSEMBLER_TEST_RUN(Vsubqi32, test) { |
| 1896 EXPECT(test != NULL); |
| 1897 typedef int (*Tst)(); |
| 1898 EXPECT_EQ(10, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); |
| 1899 } |
| 1900 |
| 1901 |
| 1902 ASSEMBLER_TEST_GENERATE(Vsubqi64, assembler) { |
| 1903 if (CPUFeatures::neon_supported()) { |
| 1904 __ mov(R0, ShifterOperand(1)); |
| 1905 __ vmovsr(S0, R0); |
| 1906 __ mov(R0, ShifterOperand(2)); |
| 1907 __ vmovsr(S2, R0); |
| 1908 __ mov(R0, ShifterOperand(2)); |
| 1909 __ vmovsr(S4, R0); |
| 1910 __ mov(R0, ShifterOperand(4)); |
| 1911 __ vmovsr(S6, R0); |
| 1912 |
| 1913 // TODO(zra): Replace 3 with enum value that implies 8-byte elements. |
| 1914 __ vsubqi(3, Q2, Q1, Q0); |
| 1915 |
| 1916 __ vmovrs(R0, S8); |
| 1917 __ vmovrs(R2, S10); |
| 1918 |
| 1919 __ add(R0, R0, ShifterOperand(R2)); |
| 1920 __ bx(LR); |
| 1921 } else { |
| 1922 __ LoadImmediate(R0, 3); |
| 1923 __ bx(LR); |
| 1924 } |
| 1925 } |
| 1926 |
| 1927 |
| 1928 ASSEMBLER_TEST_RUN(Vsubqi64, test) { |
| 1929 EXPECT(test != NULL); |
| 1930 typedef int (*Tst)(); |
| 1931 EXPECT_EQ(3, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); |
| 1932 } |
| 1933 |
| 1934 |
| 1935 ASSEMBLER_TEST_GENERATE(Vmulqi8, assembler) { |
| 1936 if (CPUFeatures::neon_supported()) { |
| 1937 __ mov(R0, ShifterOperand(1)); |
| 1938 __ vmovsr(S0, R0); |
| 1939 __ mov(R0, ShifterOperand(2)); |
| 1940 __ vmovsr(S1, R0); |
| 1941 __ mov(R0, ShifterOperand(3)); |
| 1942 __ vmovsr(S2, R0); |
| 1943 __ mov(R0, ShifterOperand(4)); |
| 1944 __ vmovsr(S3, R0); |
| 1945 __ mov(R0, ShifterOperand(5)); |
| 1946 __ vmovsr(S4, R0); |
| 1947 __ mov(R0, ShifterOperand(6)); |
| 1948 __ vmovsr(S5, R0); |
| 1949 __ mov(R0, ShifterOperand(7)); |
| 1950 __ vmovsr(S6, R0); |
| 1951 __ mov(R0, ShifterOperand(8)); |
| 1952 __ vmovsr(S7, R0); |
| 1953 |
| 1954 // TODO(zra): Replace 0 with enum value that implies 1-byte elements. |
| 1955 __ vmulqi(0, Q2, Q1, Q0); |
| 1956 |
| 1957 __ vmovrs(R0, S8); |
| 1958 __ vmovrs(R1, S9); |
| 1959 __ vmovrs(R2, S10); |
| 1960 __ vmovrs(R3, S11); |
| 1961 |
| 1962 __ add(R0, R0, ShifterOperand(R1)); |
| 1963 __ add(R0, R0, ShifterOperand(R2)); |
| 1964 __ add(R0, R0, ShifterOperand(R3)); |
| 1965 __ bx(LR); |
| 1966 } else { |
| 1967 __ LoadImmediate(R0, 70); |
| 1968 __ bx(LR); |
| 1969 } |
| 1970 } |
| 1971 |
| 1972 |
| 1973 ASSEMBLER_TEST_RUN(Vmulqi8, test) { |
| 1974 EXPECT(test != NULL); |
| 1975 typedef int (*Tst)(); |
| 1976 EXPECT_EQ(70, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); |
| 1977 } |
| 1978 |
| 1979 |
| 1980 ASSEMBLER_TEST_GENERATE(Vmulqi16, assembler) { |
| 1981 if (CPUFeatures::neon_supported()) { |
| 1982 __ mov(R0, ShifterOperand(1)); |
| 1983 __ vmovsr(S0, R0); |
| 1984 __ mov(R0, ShifterOperand(2)); |
| 1985 __ vmovsr(S1, R0); |
| 1986 __ mov(R0, ShifterOperand(3)); |
| 1987 __ vmovsr(S2, R0); |
| 1988 __ mov(R0, ShifterOperand(4)); |
| 1989 __ vmovsr(S3, R0); |
| 1990 __ mov(R0, ShifterOperand(5)); |
| 1991 __ vmovsr(S4, R0); |
| 1992 __ mov(R0, ShifterOperand(6)); |
| 1993 __ vmovsr(S5, R0); |
| 1994 __ mov(R0, ShifterOperand(7)); |
| 1995 __ vmovsr(S6, R0); |
| 1996 __ mov(R0, ShifterOperand(8)); |
| 1997 __ vmovsr(S7, R0); |
| 1998 |
| 1999 // TODO(zra): Replace 1 with enum value that implies 2-byte elements. |
| 2000 __ vmulqi(1, Q2, Q1, Q0); |
| 2001 |
| 2002 __ vmovrs(R0, S8); |
| 2003 __ vmovrs(R1, S9); |
| 2004 __ vmovrs(R2, S10); |
| 2005 __ vmovrs(R3, S11); |
| 2006 |
| 2007 __ add(R0, R0, ShifterOperand(R1)); |
| 2008 __ add(R0, R0, ShifterOperand(R2)); |
| 2009 __ add(R0, R0, ShifterOperand(R3)); |
| 2010 __ bx(LR); |
| 2011 } else { |
| 2012 __ LoadImmediate(R0, 70); |
| 2013 __ bx(LR); |
| 2014 } |
| 2015 } |
| 2016 |
| 2017 |
| 2018 ASSEMBLER_TEST_RUN(Vmulqi16, test) { |
| 2019 EXPECT(test != NULL); |
| 2020 typedef int (*Tst)(); |
| 2021 EXPECT_EQ(70, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); |
| 2022 } |
| 2023 |
| 2024 |
| 2025 ASSEMBLER_TEST_GENERATE(Vmulqi32, assembler) { |
| 2026 if (CPUFeatures::neon_supported()) { |
| 2027 __ mov(R0, ShifterOperand(1)); |
| 2028 __ vmovsr(S0, R0); |
| 2029 __ mov(R0, ShifterOperand(2)); |
| 2030 __ vmovsr(S1, R0); |
| 2031 __ mov(R0, ShifterOperand(3)); |
| 2032 __ vmovsr(S2, R0); |
| 2033 __ mov(R0, ShifterOperand(4)); |
| 2034 __ vmovsr(S3, R0); |
| 2035 __ mov(R0, ShifterOperand(5)); |
| 2036 __ vmovsr(S4, R0); |
| 2037 __ mov(R0, ShifterOperand(6)); |
| 2038 __ vmovsr(S5, R0); |
| 2039 __ mov(R0, ShifterOperand(7)); |
| 2040 __ vmovsr(S6, R0); |
| 2041 __ mov(R0, ShifterOperand(8)); |
| 2042 __ vmovsr(S7, R0); |
| 2043 |
| 2044 // TODO(zra): Replace 2 with enum value that implies 4-byte elements. |
| 2045 __ vmulqi(2, Q2, Q1, Q0); |
| 2046 |
| 2047 __ vmovrs(R0, S8); |
| 2048 __ vmovrs(R1, S9); |
| 2049 __ vmovrs(R2, S10); |
| 2050 __ vmovrs(R3, S11); |
| 2051 |
| 2052 __ add(R0, R0, ShifterOperand(R1)); |
| 2053 __ add(R0, R0, ShifterOperand(R2)); |
| 2054 __ add(R0, R0, ShifterOperand(R3)); |
| 2055 __ bx(LR); |
| 2056 } else { |
| 2057 __ LoadImmediate(R0, 70); |
| 2058 __ bx(LR); |
| 2059 } |
| 2060 } |
| 2061 |
| 2062 |
| 2063 ASSEMBLER_TEST_RUN(Vmulqi32, test) { |
| 2064 EXPECT(test != NULL); |
| 2065 typedef int (*Tst)(); |
| 2066 EXPECT_EQ(70, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); |
| 1736 } | 2067 } |
| 1737 | 2068 |
| 1738 | 2069 |
| 1739 ASSEMBLER_TEST_GENERATE(Vaddqs, assembler) { | 2070 ASSEMBLER_TEST_GENERATE(Vaddqs, assembler) { |
| 1740 if (CPUFeatures::neon_supported()) { | 2071 if (CPUFeatures::neon_supported()) { |
| 1741 __ LoadSImmediate(S0, 1.0); | 2072 __ LoadSImmediate(S0, 1.0); |
| 1742 __ vmovs(S1, S0); | 2073 __ LoadSImmediate(S1, 2.0); |
| 1743 __ vmovs(S2, S0); | 2074 __ LoadSImmediate(S2, 3.0); |
| 1744 __ vmovs(S3, S0); | 2075 __ LoadSImmediate(S3, 4.0); |
| 1745 __ vmovs(S4, S0); | 2076 __ LoadSImmediate(S4, 5.0); |
| 1746 __ vmovs(S5, S0); | 2077 __ LoadSImmediate(S5, 6.0); |
| 1747 __ vmovs(S6, S0); | 2078 __ LoadSImmediate(S6, 7.0); |
| 1748 __ vmovs(S7, S0); | 2079 __ LoadSImmediate(S7, 8.0); |
| 1749 | 2080 |
| 1750 __ vaddqs(Q2, Q0, Q1); | 2081 __ vaddqs(Q2, Q0, Q1); |
| 1751 | 2082 |
| 1752 __ vadds(S8, S8, S9); | 2083 __ vadds(S8, S8, S9); |
| 1753 __ vadds(S8, S8, S10); | 2084 __ vadds(S8, S8, S10); |
| 1754 __ vadds(S8, S8, S11); | 2085 __ vadds(S8, S8, S11); |
| 1755 | 2086 |
| 1756 __ vcvtis(S0, S8); | 2087 __ vcvtis(S0, S8); |
| 1757 __ vmovrs(R0, S0); | 2088 __ vmovrs(R0, S0); |
| 1758 | 2089 |
| 1759 __ bx(LR); | 2090 __ bx(LR); |
| 1760 } else { | 2091 } else { |
| 1761 __ LoadImmediate(R0, 8); | 2092 __ LoadImmediate(R0, 36); |
| 1762 __ bx(LR); | 2093 __ bx(LR); |
| 1763 } | 2094 } |
| 1764 } | 2095 } |
| 1765 | 2096 |
| 1766 | 2097 |
| 1767 ASSEMBLER_TEST_RUN(Vaddqs, test) { | 2098 ASSEMBLER_TEST_RUN(Vaddqs, test) { |
| 1768 EXPECT(test != NULL); | 2099 EXPECT(test != NULL); |
| 1769 typedef int (*Tst)(); | 2100 typedef int (*Tst)(); |
| 1770 EXPECT_EQ(8, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); | 2101 EXPECT_EQ(36, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); |
| 2102 } |
| 2103 |
| 2104 |
| 2105 ASSEMBLER_TEST_GENERATE(Vsubqs, assembler) { |
| 2106 if (CPUFeatures::neon_supported()) { |
| 2107 __ LoadSImmediate(S0, 1.0); |
| 2108 __ LoadSImmediate(S1, 2.0); |
| 2109 __ LoadSImmediate(S2, 3.0); |
| 2110 __ LoadSImmediate(S3, 4.0); |
| 2111 __ LoadSImmediate(S4, 2.0); |
| 2112 __ LoadSImmediate(S5, 4.0); |
| 2113 __ LoadSImmediate(S6, 6.0); |
| 2114 __ LoadSImmediate(S7, 8.0); |
| 2115 |
| 2116 __ vsubqs(Q2, Q1, Q0); |
| 2117 |
| 2118 __ vadds(S8, S8, S9); |
| 2119 __ vadds(S8, S8, S10); |
| 2120 __ vadds(S8, S8, S11); |
| 2121 |
| 2122 __ vcvtis(S0, S8); |
| 2123 __ vmovrs(R0, S0); |
| 2124 |
| 2125 __ bx(LR); |
| 2126 } else { |
| 2127 __ LoadImmediate(R0, 10); |
| 2128 __ bx(LR); |
| 2129 } |
| 2130 } |
| 2131 |
| 2132 |
| 2133 ASSEMBLER_TEST_RUN(Vsubqs, test) { |
| 2134 EXPECT(test != NULL); |
| 2135 typedef int (*Tst)(); |
| 2136 EXPECT_EQ(10, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); |
| 2137 } |
| 2138 |
| 2139 |
| 2140 ASSEMBLER_TEST_GENERATE(Vmulqs, assembler) { |
| 2141 if (CPUFeatures::neon_supported()) { |
| 2142 __ LoadSImmediate(S0, 1.0); |
| 2143 __ LoadSImmediate(S1, 2.0); |
| 2144 __ LoadSImmediate(S2, 3.0); |
| 2145 __ LoadSImmediate(S3, 4.0); |
| 2146 __ LoadSImmediate(S4, 5.0); |
| 2147 __ LoadSImmediate(S5, 6.0); |
| 2148 __ LoadSImmediate(S6, 7.0); |
| 2149 __ LoadSImmediate(S7, 8.0); |
| 2150 |
| 2151 __ vmulqs(Q2, Q1, Q0); |
| 2152 |
| 2153 __ vadds(S8, S8, S9); |
| 2154 __ vadds(S8, S8, S10); |
| 2155 __ vadds(S8, S8, S11); |
| 2156 |
| 2157 __ vcvtis(S0, S8); |
| 2158 __ vmovrs(R0, S0); |
| 2159 |
| 2160 __ bx(LR); |
| 2161 } else { |
| 2162 __ LoadImmediate(R0, 70); |
| 2163 __ bx(LR); |
| 2164 } |
| 2165 } |
| 2166 |
| 2167 |
| 2168 ASSEMBLER_TEST_RUN(Vmulqs, test) { |
| 2169 EXPECT(test != NULL); |
| 2170 typedef int (*Tst)(); |
| 2171 EXPECT_EQ(70, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); |
| 1771 } | 2172 } |
| 1772 | 2173 |
| 1773 | 2174 |
| 1774 // Called from assembler_test.cc. | 2175 // Called from assembler_test.cc. |
| 1775 // LR: return address. | 2176 // LR: return address. |
| 1776 // R0: context. | 2177 // R0: context. |
| 1777 // R1: value. | 2178 // R1: value. |
| 1778 // R2: growable array. | 2179 // R2: growable array. |
| 1779 ASSEMBLER_TEST_GENERATE(StoreIntoObject, assembler) { | 2180 ASSEMBLER_TEST_GENERATE(StoreIntoObject, assembler) { |
| 1780 __ PushList((1 << CTX) | (1 << LR)); | 2181 __ PushList((1 << CTX) | (1 << LR)); |
| 1781 __ mov(CTX, ShifterOperand(R0)); | 2182 __ mov(CTX, ShifterOperand(R0)); |
| 1782 __ StoreIntoObject(R2, | 2183 __ StoreIntoObject(R2, |
| 1783 FieldAddress(R2, GrowableObjectArray::data_offset()), | 2184 FieldAddress(R2, GrowableObjectArray::data_offset()), |
| 1784 R1); | 2185 R1); |
| 1785 __ PopList((1 << CTX) | (1 << LR)); | 2186 __ PopList((1 << CTX) | (1 << LR)); |
| 1786 __ Ret(); | 2187 __ Ret(); |
| 1787 } | 2188 } |
| 1788 | 2189 |
| 1789 } // namespace dart | 2190 } // namespace dart |
| 1790 | 2191 |
| 1791 #endif // defined TARGET_ARCH_ARM | 2192 #endif // defined TARGET_ARCH_ARM |
| OLD | NEW |