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

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 1718 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698