Chromium Code Reviews| 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 1718 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1729 } | 1729 } |
| 1730 | 1730 |
| 1731 | 1731 |
| 1732 ASSEMBLER_TEST_RUN(Vaddqi64, test) { | 1732 ASSEMBLER_TEST_RUN(Vaddqi64, test) { |
| 1733 EXPECT(test != NULL); | 1733 EXPECT(test != NULL); |
| 1734 typedef int (*Tst)(); | 1734 typedef int (*Tst)(); |
| 1735 EXPECT_EQ(4, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); | 1735 EXPECT_EQ(4, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); |
| 1736 } | 1736 } |
| 1737 | 1737 |
| 1738 | 1738 |
| 1739 ASSEMBLER_TEST_GENERATE(Vsubqi8, assembler) { | |
| 1740 if (CPUFeatures::neon_supported()) { | |
| 1741 __ mov(R0, ShifterOperand(1)); | |
| 1742 __ vmovsr(S0, R0); | |
| 1743 __ vmovsr(S1, R0); | |
| 1744 __ vmovsr(S2, R0); | |
| 1745 __ vmovsr(S3, R0); | |
|
regis
2013/07/16 00:23:30
Being picky, but a test using a different value in
zra
2013/07/16 16:11:01
Done.
| |
| 1746 __ mov(R0, ShifterOperand(3)); | |
| 1747 __ vmovsr(S4, R0); | |
| 1748 __ vmovsr(S5, R0); | |
| 1749 __ vmovsr(S6, R0); | |
| 1750 __ vmovsr(S7, R0); | |
| 1751 | |
| 1752 __ vsubqi(0, Q2, Q1, Q0); | |
|
regis
2013/07/16 00:23:30
Comment about the meaning of 0 until you introduce
zra
2013/07/16 16:11:01
Done.
| |
| 1753 | |
| 1754 __ vmovrs(R0, S8); | |
| 1755 __ vmovrs(R1, S9); | |
| 1756 __ vmovrs(R2, S10); | |
| 1757 __ vmovrs(R3, S11); | |
| 1758 | |
| 1759 __ add(R0, R0, ShifterOperand(R1)); | |
| 1760 __ add(R0, R0, ShifterOperand(R2)); | |
| 1761 __ add(R0, R0, ShifterOperand(R3)); | |
| 1762 __ bx(LR); | |
| 1763 } else { | |
| 1764 __ LoadImmediate(R0, 8); | |
| 1765 __ bx(LR); | |
| 1766 } | |
| 1767 } | |
| 1768 | |
| 1769 | |
| 1770 ASSEMBLER_TEST_RUN(Vsubqi8, test) { | |
| 1771 EXPECT(test != NULL); | |
| 1772 typedef int (*Tst)(); | |
| 1773 EXPECT_EQ(8, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); | |
| 1774 } | |
| 1775 | |
| 1776 | |
| 1777 ASSEMBLER_TEST_GENERATE(Vsubqi16, assembler) { | |
| 1778 if (CPUFeatures::neon_supported()) { | |
| 1779 __ mov(R0, ShifterOperand(1)); | |
| 1780 __ vmovsr(S0, R0); | |
| 1781 __ vmovsr(S1, R0); | |
| 1782 __ vmovsr(S2, R0); | |
| 1783 __ vmovsr(S3, R0); | |
| 1784 __ mov(R0, ShifterOperand(3)); | |
| 1785 __ vmovsr(S4, R0); | |
| 1786 __ vmovsr(S5, R0); | |
| 1787 __ vmovsr(S6, R0); | |
| 1788 __ vmovsr(S7, R0); | |
| 1789 | |
| 1790 __ vsubqi(1, Q2, Q1, Q0); | |
|
regis
2013/07/16 00:23:30
ditto for 1?
zra
2013/07/16 16:11:01
Done.
| |
| 1791 | |
| 1792 __ vmovrs(R0, S8); | |
| 1793 __ vmovrs(R1, S9); | |
| 1794 __ vmovrs(R2, S10); | |
| 1795 __ vmovrs(R3, S11); | |
| 1796 | |
| 1797 __ add(R0, R0, ShifterOperand(R1)); | |
| 1798 __ add(R0, R0, ShifterOperand(R2)); | |
| 1799 __ add(R0, R0, ShifterOperand(R3)); | |
| 1800 __ bx(LR); | |
| 1801 } else { | |
| 1802 __ LoadImmediate(R0, 8); | |
| 1803 __ bx(LR); | |
| 1804 } | |
| 1805 } | |
| 1806 | |
| 1807 | |
| 1808 ASSEMBLER_TEST_RUN(Vsubqi16, test) { | |
| 1809 EXPECT(test != NULL); | |
| 1810 typedef int (*Tst)(); | |
| 1811 EXPECT_EQ(8, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); | |
| 1812 } | |
| 1813 | |
| 1814 | |
| 1815 ASSEMBLER_TEST_GENERATE(Vsubqi32, assembler) { | |
| 1816 if (CPUFeatures::neon_supported()) { | |
| 1817 __ mov(R0, ShifterOperand(1)); | |
| 1818 __ vmovsr(S0, R0); | |
| 1819 __ vmovsr(S1, R0); | |
| 1820 __ vmovsr(S2, R0); | |
| 1821 __ vmovsr(S3, R0); | |
| 1822 __ mov(R0, ShifterOperand(3)); | |
| 1823 __ vmovsr(S4, R0); | |
| 1824 __ vmovsr(S5, R0); | |
| 1825 __ vmovsr(S6, R0); | |
| 1826 __ vmovsr(S7, R0); | |
| 1827 | |
| 1828 __ vsubqi(2, Q2, Q1, Q0); | |
| 1829 | |
| 1830 __ vmovrs(R0, S8); | |
| 1831 __ vmovrs(R1, S9); | |
| 1832 __ vmovrs(R2, S10); | |
| 1833 __ vmovrs(R3, S11); | |
| 1834 | |
| 1835 __ add(R0, R0, ShifterOperand(R1)); | |
| 1836 __ add(R0, R0, ShifterOperand(R2)); | |
| 1837 __ add(R0, R0, ShifterOperand(R3)); | |
| 1838 __ bx(LR); | |
| 1839 } else { | |
| 1840 __ LoadImmediate(R0, 8); | |
| 1841 __ bx(LR); | |
| 1842 } | |
| 1843 } | |
| 1844 | |
| 1845 | |
| 1846 ASSEMBLER_TEST_RUN(Vsubqi32, test) { | |
| 1847 EXPECT(test != NULL); | |
| 1848 typedef int (*Tst)(); | |
| 1849 EXPECT_EQ(8, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); | |
| 1850 } | |
| 1851 | |
| 1852 | |
| 1853 ASSEMBLER_TEST_GENERATE(Vsubqi64, assembler) { | |
| 1854 if (CPUFeatures::neon_supported()) { | |
| 1855 __ mov(R0, ShifterOperand(1)); | |
| 1856 __ vmovsr(S0, R0); | |
| 1857 __ vmovsr(S2, R0); | |
| 1858 __ mov(R0, ShifterOperand(3)); | |
| 1859 __ vmovsr(S4, R0); | |
| 1860 __ vmovsr(S6, R0); | |
| 1861 | |
| 1862 __ vsubqi(3, Q2, Q1, Q0); | |
| 1863 | |
| 1864 __ vmovrs(R0, S8); | |
| 1865 __ vmovrs(R2, S10); | |
| 1866 | |
| 1867 __ add(R0, R0, ShifterOperand(R2)); | |
| 1868 __ bx(LR); | |
| 1869 } else { | |
| 1870 __ LoadImmediate(R0, 4); | |
| 1871 __ bx(LR); | |
| 1872 } | |
| 1873 } | |
| 1874 | |
| 1875 | |
| 1876 ASSEMBLER_TEST_RUN(Vsubqi64, test) { | |
| 1877 EXPECT(test != NULL); | |
| 1878 typedef int (*Tst)(); | |
| 1879 EXPECT_EQ(4, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); | |
| 1880 } | |
| 1881 | |
| 1882 | |
| 1883 ASSEMBLER_TEST_GENERATE(Vmulqi8, assembler) { | |
| 1884 if (CPUFeatures::neon_supported()) { | |
| 1885 __ mov(R0, ShifterOperand(1)); | |
| 1886 __ vmovsr(S0, R0); | |
| 1887 __ vmovsr(S1, R0); | |
| 1888 __ vmovsr(S2, R0); | |
| 1889 __ vmovsr(S3, R0); | |
| 1890 __ mov(R0, ShifterOperand(2)); | |
| 1891 __ vmovsr(S4, R0); | |
| 1892 __ vmovsr(S5, R0); | |
| 1893 __ vmovsr(S6, R0); | |
| 1894 __ vmovsr(S7, R0); | |
| 1895 | |
| 1896 __ vmulqi(0, Q2, Q1, Q0); | |
| 1897 | |
| 1898 __ vmovrs(R0, S8); | |
| 1899 __ vmovrs(R1, S9); | |
| 1900 __ vmovrs(R2, S10); | |
| 1901 __ vmovrs(R3, S11); | |
| 1902 | |
| 1903 __ add(R0, R0, ShifterOperand(R1)); | |
| 1904 __ add(R0, R0, ShifterOperand(R2)); | |
| 1905 __ add(R0, R0, ShifterOperand(R3)); | |
| 1906 __ bx(LR); | |
| 1907 } else { | |
| 1908 __ LoadImmediate(R0, 8); | |
| 1909 __ bx(LR); | |
| 1910 } | |
| 1911 } | |
| 1912 | |
| 1913 | |
| 1914 ASSEMBLER_TEST_RUN(Vmulqi8, test) { | |
| 1915 EXPECT(test != NULL); | |
| 1916 typedef int (*Tst)(); | |
| 1917 EXPECT_EQ(8, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); | |
| 1918 } | |
| 1919 | |
| 1920 | |
| 1921 ASSEMBLER_TEST_GENERATE(Vmulqi16, assembler) { | |
| 1922 if (CPUFeatures::neon_supported()) { | |
| 1923 __ mov(R0, ShifterOperand(1)); | |
| 1924 __ vmovsr(S0, R0); | |
| 1925 __ vmovsr(S1, R0); | |
| 1926 __ vmovsr(S2, R0); | |
| 1927 __ vmovsr(S3, R0); | |
| 1928 __ mov(R0, ShifterOperand(2)); | |
| 1929 __ vmovsr(S4, R0); | |
| 1930 __ vmovsr(S5, R0); | |
| 1931 __ vmovsr(S6, R0); | |
| 1932 __ vmovsr(S7, R0); | |
| 1933 | |
| 1934 __ vmulqi(1, Q2, Q1, Q0); | |
| 1935 | |
| 1936 __ vmovrs(R0, S8); | |
| 1937 __ vmovrs(R1, S9); | |
| 1938 __ vmovrs(R2, S10); | |
| 1939 __ vmovrs(R3, S11); | |
| 1940 | |
| 1941 __ add(R0, R0, ShifterOperand(R1)); | |
| 1942 __ add(R0, R0, ShifterOperand(R2)); | |
| 1943 __ add(R0, R0, ShifterOperand(R3)); | |
| 1944 __ bx(LR); | |
| 1945 } else { | |
| 1946 __ LoadImmediate(R0, 8); | |
| 1947 __ bx(LR); | |
| 1948 } | |
| 1949 } | |
| 1950 | |
| 1951 | |
| 1952 ASSEMBLER_TEST_RUN(Vmulqi16, test) { | |
| 1953 EXPECT(test != NULL); | |
| 1954 typedef int (*Tst)(); | |
| 1955 EXPECT_EQ(8, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); | |
| 1956 } | |
| 1957 | |
| 1958 | |
| 1959 ASSEMBLER_TEST_GENERATE(Vmulqi32, assembler) { | |
| 1960 if (CPUFeatures::neon_supported()) { | |
| 1961 __ mov(R0, ShifterOperand(1)); | |
| 1962 __ vmovsr(S0, R0); | |
| 1963 __ vmovsr(S1, R0); | |
| 1964 __ vmovsr(S2, R0); | |
| 1965 __ vmovsr(S3, R0); | |
| 1966 __ mov(R0, ShifterOperand(2)); | |
| 1967 __ vmovsr(S4, R0); | |
| 1968 __ vmovsr(S5, R0); | |
| 1969 __ vmovsr(S6, R0); | |
| 1970 __ vmovsr(S7, R0); | |
| 1971 | |
| 1972 __ vmulqi(2, Q2, Q1, Q0); | |
| 1973 | |
| 1974 __ vmovrs(R0, S8); | |
| 1975 __ vmovrs(R1, S9); | |
| 1976 __ vmovrs(R2, S10); | |
| 1977 __ vmovrs(R3, S11); | |
| 1978 | |
| 1979 __ add(R0, R0, ShifterOperand(R1)); | |
| 1980 __ add(R0, R0, ShifterOperand(R2)); | |
| 1981 __ add(R0, R0, ShifterOperand(R3)); | |
| 1982 __ bx(LR); | |
| 1983 } else { | |
| 1984 __ LoadImmediate(R0, 8); | |
| 1985 __ bx(LR); | |
| 1986 } | |
| 1987 } | |
| 1988 | |
| 1989 | |
| 1990 ASSEMBLER_TEST_RUN(Vmulqi32, test) { | |
| 1991 EXPECT(test != NULL); | |
| 1992 typedef int (*Tst)(); | |
| 1993 EXPECT_EQ(8, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); | |
| 1994 } | |
| 1995 | |
| 1996 | |
| 1739 ASSEMBLER_TEST_GENERATE(Vaddqs, assembler) { | 1997 ASSEMBLER_TEST_GENERATE(Vaddqs, assembler) { |
| 1740 if (CPUFeatures::neon_supported()) { | 1998 if (CPUFeatures::neon_supported()) { |
| 1741 __ LoadSImmediate(S0, 1.0); | 1999 __ LoadSImmediate(S0, 1.0); |
| 1742 __ vmovs(S1, S0); | 2000 __ vmovs(S1, S0); |
| 1743 __ vmovs(S2, S0); | 2001 __ vmovs(S2, S0); |
| 1744 __ vmovs(S3, S0); | 2002 __ vmovs(S3, S0); |
| 1745 __ vmovs(S4, S0); | 2003 __ vmovs(S4, S0); |
| 1746 __ vmovs(S5, S0); | 2004 __ vmovs(S5, S0); |
| 1747 __ vmovs(S6, S0); | 2005 __ vmovs(S6, S0); |
| 1748 __ vmovs(S7, S0); | 2006 __ vmovs(S7, S0); |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 1764 } | 2022 } |
| 1765 | 2023 |
| 1766 | 2024 |
| 1767 ASSEMBLER_TEST_RUN(Vaddqs, test) { | 2025 ASSEMBLER_TEST_RUN(Vaddqs, test) { |
| 1768 EXPECT(test != NULL); | 2026 EXPECT(test != NULL); |
| 1769 typedef int (*Tst)(); | 2027 typedef int (*Tst)(); |
| 1770 EXPECT_EQ(8, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); | 2028 EXPECT_EQ(8, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); |
| 1771 } | 2029 } |
| 1772 | 2030 |
| 1773 | 2031 |
| 2032 ASSEMBLER_TEST_GENERATE(Vsubqs, assembler) { | |
| 2033 if (CPUFeatures::neon_supported()) { | |
| 2034 __ LoadSImmediate(S0, 1.0); | |
| 2035 __ vmovs(S1, S0); | |
| 2036 __ vmovs(S2, S0); | |
| 2037 __ vmovs(S3, S0); | |
| 2038 __ LoadSImmediate(S4, 4.0); | |
| 2039 __ vmovs(S5, S4); | |
| 2040 __ vmovs(S6, S4); | |
| 2041 __ vmovs(S7, S4); | |
| 2042 | |
| 2043 __ vsubqs(Q2, Q1, Q0); | |
| 2044 | |
| 2045 __ vadds(S8, S8, S9); | |
| 2046 __ vadds(S8, S8, S10); | |
| 2047 __ vadds(S8, S8, S11); | |
| 2048 | |
| 2049 __ vcvtis(S0, S8); | |
| 2050 __ vmovrs(R0, S0); | |
| 2051 | |
| 2052 __ bx(LR); | |
| 2053 } else { | |
| 2054 __ LoadImmediate(R0, 12); | |
| 2055 __ bx(LR); | |
| 2056 } | |
| 2057 } | |
| 2058 | |
| 2059 | |
| 2060 ASSEMBLER_TEST_RUN(Vsubqs, test) { | |
| 2061 EXPECT(test != NULL); | |
| 2062 typedef int (*Tst)(); | |
| 2063 EXPECT_EQ(12, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); | |
| 2064 } | |
| 2065 | |
| 2066 | |
| 2067 ASSEMBLER_TEST_GENERATE(Vmulqs, assembler) { | |
| 2068 if (CPUFeatures::neon_supported()) { | |
| 2069 __ LoadSImmediate(S0, 2.0); | |
| 2070 __ vmovs(S1, S0); | |
| 2071 __ vmovs(S2, S0); | |
| 2072 __ vmovs(S3, S0); | |
| 2073 __ LoadSImmediate(S4, 3.0); | |
| 2074 __ vmovs(S5, S4); | |
| 2075 __ vmovs(S6, S4); | |
| 2076 __ vmovs(S7, S4); | |
| 2077 | |
| 2078 __ vmulqs(Q2, Q1, Q0); | |
| 2079 | |
| 2080 __ vadds(S8, S8, S9); | |
| 2081 __ vadds(S8, S8, S10); | |
| 2082 __ vadds(S8, S8, S11); | |
| 2083 | |
| 2084 __ vcvtis(S0, S8); | |
| 2085 __ vmovrs(R0, S0); | |
| 2086 | |
| 2087 __ bx(LR); | |
| 2088 } else { | |
| 2089 __ LoadImmediate(R0, 42); | |
|
regis
2013/07/16 00:23:30
24?
zra
2013/07/16 16:11:01
Done.
| |
| 2090 __ bx(LR); | |
| 2091 } | |
| 2092 } | |
| 2093 | |
| 2094 | |
| 2095 ASSEMBLER_TEST_RUN(Vmulqs, test) { | |
| 2096 EXPECT(test != NULL); | |
| 2097 typedef int (*Tst)(); | |
| 2098 EXPECT_EQ(24, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); | |
| 2099 } | |
| 2100 | |
| 2101 | |
| 1774 // Called from assembler_test.cc. | 2102 // Called from assembler_test.cc. |
| 1775 // LR: return address. | 2103 // LR: return address. |
| 1776 // R0: context. | 2104 // R0: context. |
| 1777 // R1: value. | 2105 // R1: value. |
| 1778 // R2: growable array. | 2106 // R2: growable array. |
| 1779 ASSEMBLER_TEST_GENERATE(StoreIntoObject, assembler) { | 2107 ASSEMBLER_TEST_GENERATE(StoreIntoObject, assembler) { |
| 1780 __ PushList((1 << CTX) | (1 << LR)); | 2108 __ PushList((1 << CTX) | (1 << LR)); |
| 1781 __ mov(CTX, ShifterOperand(R0)); | 2109 __ mov(CTX, ShifterOperand(R0)); |
| 1782 __ StoreIntoObject(R2, | 2110 __ StoreIntoObject(R2, |
| 1783 FieldAddress(R2, GrowableObjectArray::data_offset()), | 2111 FieldAddress(R2, GrowableObjectArray::data_offset()), |
| 1784 R1); | 2112 R1); |
| 1785 __ PopList((1 << CTX) | (1 << LR)); | 2113 __ PopList((1 << CTX) | (1 << LR)); |
| 1786 __ Ret(); | 2114 __ Ret(); |
| 1787 } | 2115 } |
| 1788 | 2116 |
| 1789 } // namespace dart | 2117 } // namespace dart |
| 1790 | 2118 |
| 1791 #endif // defined TARGET_ARCH_ARM | 2119 #endif // defined TARGET_ARCH_ARM |
| OLD | NEW |