Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1178)

Side by Side Diff: runtime/vm/assembler_arm_test.cc

Issue 19290006: Implements ARM SIMD multiplication and subtraction instructions. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698