| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/compiler/code-generator.h" | 5 #include "src/compiler/code-generator.h" |
| 6 | 6 |
| 7 #include "src/arm/macro-assembler-arm.h" | 7 #include "src/arm/macro-assembler-arm.h" |
| 8 #include "src/compilation-info.h" | 8 #include "src/compilation-info.h" |
| 9 #include "src/compiler/code-generator-impl.h" | 9 #include "src/compiler/code-generator-impl.h" |
| 10 #include "src/compiler/gap-resolver.h" | 10 #include "src/compiler/gap-resolver.h" |
| (...skipping 1616 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1627 i.InputSimd128Register(1)); | 1627 i.InputSimd128Register(1)); |
| 1628 __ vmvn(dst, dst); | 1628 __ vmvn(dst, dst); |
| 1629 break; | 1629 break; |
| 1630 } | 1630 } |
| 1631 case kArmInt32x4GreaterThan: { | 1631 case kArmInt32x4GreaterThan: { |
| 1632 __ vcgt(NeonS32, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1632 __ vcgt(NeonS32, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1633 i.InputSimd128Register(1)); | 1633 i.InputSimd128Register(1)); |
| 1634 break; | 1634 break; |
| 1635 } | 1635 } |
| 1636 case kArmInt32x4GreaterThanOrEqual: { | 1636 case kArmInt32x4GreaterThanOrEqual: { |
| 1637 Simd128Register dst = i.OutputSimd128Register(); | 1637 __ vcge(NeonS32, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1638 __ vcge(NeonS32, dst, i.InputSimd128Register(0), | |
| 1639 i.InputSimd128Register(1)); | 1638 i.InputSimd128Register(1)); |
| 1640 break; | 1639 break; |
| 1641 } | 1640 } |
| 1642 case kArmUint32x4ShiftRightByScalar: { | 1641 case kArmUint32x4ShiftRightByScalar: { |
| 1643 __ vshr(NeonU32, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1642 __ vshr(NeonU32, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1644 i.InputInt5(1)); | 1643 i.InputInt5(1)); |
| 1645 break; | 1644 break; |
| 1646 } | 1645 } |
| 1647 case kArmUint32x4Min: { | 1646 case kArmUint32x4Min: { |
| 1648 __ vmin(NeonU32, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1647 __ vmin(NeonU32, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1649 i.InputSimd128Register(1)); | 1648 i.InputSimd128Register(1)); |
| 1650 break; | 1649 break; |
| 1651 } | 1650 } |
| 1652 case kArmUint32x4Max: { | 1651 case kArmUint32x4Max: { |
| 1653 __ vmax(NeonU32, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1652 __ vmax(NeonU32, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1654 i.InputSimd128Register(1)); | 1653 i.InputSimd128Register(1)); |
| 1655 break; | 1654 break; |
| 1656 } | 1655 } |
| 1657 case kArmUint32x4GreaterThan: { | 1656 case kArmUint32x4GreaterThan: { |
| 1658 __ vcgt(NeonU32, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1657 __ vcgt(NeonU32, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1659 i.InputSimd128Register(1)); | 1658 i.InputSimd128Register(1)); |
| 1660 break; | 1659 break; |
| 1661 } | 1660 } |
| 1662 case kArmUint32x4GreaterThanOrEqual: { | 1661 case kArmUint32x4GreaterThanOrEqual: { |
| 1663 Simd128Register dst = i.OutputSimd128Register(); | 1662 __ vcge(NeonU32, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1664 __ vcge(NeonU32, dst, i.InputSimd128Register(0), | |
| 1665 i.InputSimd128Register(1)); | 1663 i.InputSimd128Register(1)); |
| 1666 break; | 1664 break; |
| 1667 } | 1665 } |
| 1668 case kArmInt16x8Splat: { | 1666 case kArmInt16x8Splat: { |
| 1669 __ vdup(Neon16, i.OutputSimd128Register(), i.InputRegister(0)); | 1667 __ vdup(Neon16, i.OutputSimd128Register(), i.InputRegister(0)); |
| 1670 break; | 1668 break; |
| 1671 } | 1669 } |
| 1672 case kArmInt16x8ExtractLane: { | 1670 case kArmInt16x8ExtractLane: { |
| 1673 __ ExtractLane(i.OutputRegister(), i.InputSimd128Register(0), NeonS16, | 1671 __ ExtractLane(i.OutputRegister(), i.InputSimd128Register(0), NeonS16, |
| 1674 i.InputInt8(1)); | 1672 i.InputInt8(1)); |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1739 i.InputSimd128Register(1)); | 1737 i.InputSimd128Register(1)); |
| 1740 __ vmvn(dst, dst); | 1738 __ vmvn(dst, dst); |
| 1741 break; | 1739 break; |
| 1742 } | 1740 } |
| 1743 case kArmInt16x8GreaterThan: { | 1741 case kArmInt16x8GreaterThan: { |
| 1744 __ vcgt(NeonS16, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1742 __ vcgt(NeonS16, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1745 i.InputSimd128Register(1)); | 1743 i.InputSimd128Register(1)); |
| 1746 break; | 1744 break; |
| 1747 } | 1745 } |
| 1748 case kArmInt16x8GreaterThanOrEqual: { | 1746 case kArmInt16x8GreaterThanOrEqual: { |
| 1749 Simd128Register dst = i.OutputSimd128Register(); | 1747 __ vcge(NeonS16, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1750 __ vcge(NeonS16, dst, i.InputSimd128Register(0), | |
| 1751 i.InputSimd128Register(1)); | 1748 i.InputSimd128Register(1)); |
| 1752 break; | 1749 break; |
| 1753 } | 1750 } |
| 1754 case kArmUint16x8ShiftRightByScalar: { | 1751 case kArmUint16x8ShiftRightByScalar: { |
| 1755 __ vshr(NeonU16, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1752 __ vshr(NeonU16, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1756 i.InputInt4(1)); | 1753 i.InputInt4(1)); |
| 1757 break; | 1754 break; |
| 1758 } | 1755 } |
| 1759 case kArmUint16x8AddSaturate: { | 1756 case kArmUint16x8AddSaturate: { |
| 1760 __ vqadd(NeonU16, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1757 __ vqadd(NeonU16, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1775 __ vmax(NeonU16, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1772 __ vmax(NeonU16, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1776 i.InputSimd128Register(1)); | 1773 i.InputSimd128Register(1)); |
| 1777 break; | 1774 break; |
| 1778 } | 1775 } |
| 1779 case kArmUint16x8GreaterThan: { | 1776 case kArmUint16x8GreaterThan: { |
| 1780 __ vcgt(NeonU16, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1777 __ vcgt(NeonU16, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1781 i.InputSimd128Register(1)); | 1778 i.InputSimd128Register(1)); |
| 1782 break; | 1779 break; |
| 1783 } | 1780 } |
| 1784 case kArmUint16x8GreaterThanOrEqual: { | 1781 case kArmUint16x8GreaterThanOrEqual: { |
| 1785 Simd128Register dst = i.OutputSimd128Register(); | 1782 __ vcge(NeonU16, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1786 __ vcge(NeonU16, dst, i.InputSimd128Register(0), | |
| 1787 i.InputSimd128Register(1)); | 1783 i.InputSimd128Register(1)); |
| 1788 break; | 1784 break; |
| 1789 } | 1785 } |
| 1790 case kArmInt8x16Splat: { | 1786 case kArmInt8x16Splat: { |
| 1791 __ vdup(Neon8, i.OutputSimd128Register(), i.InputRegister(0)); | 1787 __ vdup(Neon8, i.OutputSimd128Register(), i.InputRegister(0)); |
| 1792 break; | 1788 break; |
| 1793 } | 1789 } |
| 1794 case kArmInt8x16ExtractLane: { | 1790 case kArmInt8x16ExtractLane: { |
| 1795 __ ExtractLane(i.OutputRegister(), i.InputSimd128Register(0), NeonS8, | 1791 __ ExtractLane(i.OutputRegister(), i.InputSimd128Register(0), NeonS8, |
| 1796 i.InputInt8(1)); | 1792 i.InputInt8(1)); |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1860 __ vceq(Neon8, dst, i.InputSimd128Register(0), i.InputSimd128Register(1)); | 1856 __ vceq(Neon8, dst, i.InputSimd128Register(0), i.InputSimd128Register(1)); |
| 1861 __ vmvn(dst, dst); | 1857 __ vmvn(dst, dst); |
| 1862 break; | 1858 break; |
| 1863 } | 1859 } |
| 1864 case kArmInt8x16GreaterThan: { | 1860 case kArmInt8x16GreaterThan: { |
| 1865 __ vcgt(NeonS8, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1861 __ vcgt(NeonS8, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1866 i.InputSimd128Register(1)); | 1862 i.InputSimd128Register(1)); |
| 1867 break; | 1863 break; |
| 1868 } | 1864 } |
| 1869 case kArmInt8x16GreaterThanOrEqual: { | 1865 case kArmInt8x16GreaterThanOrEqual: { |
| 1870 Simd128Register dst = i.OutputSimd128Register(); | 1866 __ vcge(NeonS8, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1871 __ vcge(NeonS8, dst, i.InputSimd128Register(0), | |
| 1872 i.InputSimd128Register(1)); | 1867 i.InputSimd128Register(1)); |
| 1873 break; | 1868 break; |
| 1874 } | 1869 } |
| 1875 case kArmUint8x16ShiftRightByScalar: { | 1870 case kArmUint8x16ShiftRightByScalar: { |
| 1876 __ vshr(NeonU8, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1871 __ vshr(NeonU8, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1877 i.InputInt3(1)); | 1872 i.InputInt3(1)); |
| 1878 break; | 1873 break; |
| 1879 } | 1874 } |
| 1880 case kArmUint8x16AddSaturate: { | 1875 case kArmUint8x16AddSaturate: { |
| 1881 __ vqadd(NeonU8, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1876 __ vqadd(NeonU8, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1896 __ vmax(NeonU8, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1891 __ vmax(NeonU8, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1897 i.InputSimd128Register(1)); | 1892 i.InputSimd128Register(1)); |
| 1898 break; | 1893 break; |
| 1899 } | 1894 } |
| 1900 case kArmUint8x16GreaterThan: { | 1895 case kArmUint8x16GreaterThan: { |
| 1901 __ vcgt(NeonU8, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1896 __ vcgt(NeonU8, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1902 i.InputSimd128Register(1)); | 1897 i.InputSimd128Register(1)); |
| 1903 break; | 1898 break; |
| 1904 } | 1899 } |
| 1905 case kArmUint8x16GreaterThanOrEqual: { | 1900 case kArmUint8x16GreaterThanOrEqual: { |
| 1906 Simd128Register dst = i.OutputSimd128Register(); | 1901 __ vcge(NeonU8, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1907 __ vcge(NeonU8, dst, i.InputSimd128Register(0), | |
| 1908 i.InputSimd128Register(1)); | 1902 i.InputSimd128Register(1)); |
| 1909 break; | 1903 break; |
| 1910 } | 1904 } |
| 1911 case kArmSimd128Zero: { | 1905 case kArmSimd128Zero: { |
| 1912 __ veor(i.OutputSimd128Register(), i.OutputSimd128Register(), | 1906 __ veor(i.OutputSimd128Register(), i.OutputSimd128Register(), |
| 1913 i.OutputSimd128Register()); | 1907 i.OutputSimd128Register()); |
| 1914 break; | 1908 break; |
| 1915 } | 1909 } |
| 1916 case kArmSimd128And: { | 1910 case kArmSimd128And: { |
| 1917 __ vand(i.OutputSimd128Register(), i.InputSimd128Register(0), | 1911 __ vand(i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1918 i.InputSimd128Register(1)); | 1912 i.InputSimd128Register(1)); |
| 1919 break; | 1913 break; |
| 1920 } | 1914 } |
| 1921 case kArmSimd128Or: { | 1915 case kArmSimd128Or: { |
| 1922 __ vorr(i.OutputSimd128Register(), i.InputSimd128Register(0), | 1916 __ vorr(i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1923 i.InputSimd128Register(1)); | 1917 i.InputSimd128Register(1)); |
| 1924 break; | 1918 break; |
| 1925 } | 1919 } |
| 1926 case kArmSimd128Xor: { | 1920 case kArmSimd128Xor: { |
| 1927 __ veor(i.OutputSimd128Register(), i.InputSimd128Register(0), | 1921 __ veor(i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1928 i.InputSimd128Register(1)); | 1922 i.InputSimd128Register(1)); |
| 1929 break; | 1923 break; |
| 1930 } | 1924 } |
| 1931 case kArmSimd128Not: { | 1925 case kArmSimd128Not: { |
| 1932 __ vmvn(i.OutputSimd128Register(), i.InputSimd128Register(0)); | 1926 __ vmvn(i.OutputSimd128Register(), i.InputSimd128Register(0)); |
| 1933 break; | 1927 break; |
| 1934 } | 1928 } |
| 1935 case kArmSimd32x4Select: | 1929 case kArmSimd128Select: { |
| 1936 case kArmSimd16x8Select: | |
| 1937 case kArmSimd8x16Select: { | |
| 1938 // vbsl clobbers the mask input so make sure it was DefineSameAsFirst. | 1930 // vbsl clobbers the mask input so make sure it was DefineSameAsFirst. |
| 1939 DCHECK(i.OutputSimd128Register().is(i.InputSimd128Register(0))); | 1931 DCHECK(i.OutputSimd128Register().is(i.InputSimd128Register(0))); |
| 1940 __ vbsl(i.OutputSimd128Register(), i.InputSimd128Register(1), | 1932 __ vbsl(i.OutputSimd128Register(), i.InputSimd128Register(1), |
| 1941 i.InputSimd128Register(2)); | 1933 i.InputSimd128Register(2)); |
| 1942 break; | 1934 break; |
| 1943 } | 1935 } |
| 1936 case kArmSimd1x4AnyTrue: { |
| 1937 const QwNeonRegister& src = i.InputSimd128Register(0); |
| 1938 __ vpmax(NeonU32, kScratchDoubleReg, src.low(), src.high()); |
| 1939 __ vpmax(NeonU32, kScratchDoubleReg, kScratchDoubleReg, |
| 1940 kScratchDoubleReg); |
| 1941 // kScratchDoubleReg is the top half of kScratchQuadReg, read lane 2. |
| 1942 __ ExtractLane(i.OutputRegister(), kScratchQuadReg, NeonS32, 2); |
| 1943 break; |
| 1944 } |
| 1945 case kArmSimd1x4AllTrue: { |
| 1946 const QwNeonRegister& src = i.InputSimd128Register(0); |
| 1947 __ vpmin(NeonU32, kScratchDoubleReg, src.low(), src.high()); |
| 1948 __ vpmin(NeonU32, kScratchDoubleReg, kScratchDoubleReg, |
| 1949 kScratchDoubleReg); |
| 1950 // kScratchDoubleReg is the top half of kScratchQuadReg, read lane 2. |
| 1951 __ ExtractLane(i.OutputRegister(), kScratchQuadReg, NeonS32, 2); |
| 1952 break; |
| 1953 } |
| 1954 case kArmSimd1x8AnyTrue: { |
| 1955 const QwNeonRegister& src = i.InputSimd128Register(0); |
| 1956 __ vpmax(NeonU16, kScratchDoubleReg, src.low(), src.high()); |
| 1957 __ vpmax(NeonU16, kScratchDoubleReg, kScratchDoubleReg, |
| 1958 kScratchDoubleReg); |
| 1959 __ vpmax(NeonU16, kScratchDoubleReg, kScratchDoubleReg, |
| 1960 kScratchDoubleReg); |
| 1961 // kScratchDoubleReg is the top half of kScratchQuadReg, read S16 lane 4. |
| 1962 __ ExtractLane(i.OutputRegister(), kScratchQuadReg, NeonS16, 4); |
| 1963 break; |
| 1964 } |
| 1965 case kArmSimd1x8AllTrue: { |
| 1966 const QwNeonRegister& src = i.InputSimd128Register(0); |
| 1967 __ vpmin(NeonU16, kScratchDoubleReg, src.low(), src.high()); |
| 1968 __ vpmin(NeonU16, kScratchDoubleReg, kScratchDoubleReg, |
| 1969 kScratchDoubleReg); |
| 1970 __ vpmin(NeonU16, kScratchDoubleReg, kScratchDoubleReg, |
| 1971 kScratchDoubleReg); |
| 1972 // kScratchDoubleReg is the top half of kScratchQuadReg, read S16 lane 4. |
| 1973 __ ExtractLane(i.OutputRegister(), kScratchQuadReg, NeonS16, 4); |
| 1974 break; |
| 1975 } |
| 1976 case kArmSimd1x16AnyTrue: { |
| 1977 const QwNeonRegister& src = i.InputSimd128Register(0); |
| 1978 __ vpmax(NeonU16, kScratchDoubleReg, src.low(), src.high()); |
| 1979 __ vpmax(NeonU8, kScratchDoubleReg, kScratchDoubleReg, kScratchDoubleReg); |
| 1980 __ vpmax(NeonU8, kScratchDoubleReg, kScratchDoubleReg, kScratchDoubleReg); |
| 1981 __ vpmax(NeonU8, kScratchDoubleReg, kScratchDoubleReg, kScratchDoubleReg); |
| 1982 // kScratchDoubleReg is the top half of kScratchQuadReg, read S8 lane 8. |
| 1983 __ ExtractLane(i.OutputRegister(), kScratchQuadReg, NeonS8, 8); |
| 1984 break; |
| 1985 } |
| 1986 case kArmSimd1x16AllTrue: { |
| 1987 const QwNeonRegister& src = i.InputSimd128Register(0); |
| 1988 __ vpmin(NeonU8, kScratchDoubleReg, src.low(), src.high()); |
| 1989 __ vpmin(NeonU8, kScratchDoubleReg, kScratchDoubleReg, kScratchDoubleReg); |
| 1990 __ vpmin(NeonU8, kScratchDoubleReg, kScratchDoubleReg, kScratchDoubleReg); |
| 1991 __ vpmin(NeonU8, kScratchDoubleReg, kScratchDoubleReg, kScratchDoubleReg); |
| 1992 // kScratchDoubleReg is the top half of kScratchQuadReg, read S8 lane 8. |
| 1993 __ ExtractLane(i.OutputRegister(), kScratchQuadReg, NeonS8, 8); |
| 1994 break; |
| 1995 } |
| 1944 case kCheckedLoadInt8: | 1996 case kCheckedLoadInt8: |
| 1945 ASSEMBLE_CHECKED_LOAD_INTEGER(ldrsb); | 1997 ASSEMBLE_CHECKED_LOAD_INTEGER(ldrsb); |
| 1946 break; | 1998 break; |
| 1947 case kCheckedLoadUint8: | 1999 case kCheckedLoadUint8: |
| 1948 ASSEMBLE_CHECKED_LOAD_INTEGER(ldrb); | 2000 ASSEMBLE_CHECKED_LOAD_INTEGER(ldrb); |
| 1949 break; | 2001 break; |
| 1950 case kCheckedLoadInt16: | 2002 case kCheckedLoadInt16: |
| 1951 ASSEMBLE_CHECKED_LOAD_INTEGER(ldrsh); | 2003 ASSEMBLE_CHECKED_LOAD_INTEGER(ldrsh); |
| 1952 break; | 2004 break; |
| 1953 case kCheckedLoadUint16: | 2005 case kCheckedLoadUint16: |
| (...skipping 650 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2604 padding_size -= v8::internal::Assembler::kInstrSize; | 2656 padding_size -= v8::internal::Assembler::kInstrSize; |
| 2605 } | 2657 } |
| 2606 } | 2658 } |
| 2607 } | 2659 } |
| 2608 | 2660 |
| 2609 #undef __ | 2661 #undef __ |
| 2610 | 2662 |
| 2611 } // namespace compiler | 2663 } // namespace compiler |
| 2612 } // namespace internal | 2664 } // namespace internal |
| 2613 } // namespace v8 | 2665 } // namespace v8 |
| OLD | NEW |