| 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/assembler-inl.h" | 8 #include "src/assembler-inl.h" |
| 9 #include "src/compilation-info.h" | 9 #include "src/compilation-info.h" |
| 10 #include "src/compiler/code-generator-impl.h" | 10 #include "src/compiler/code-generator-impl.h" |
| (...skipping 1618 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1629 i.InputSimd128Register(1)); | 1629 i.InputSimd128Register(1)); |
| 1630 __ vmvn(dst, dst); | 1630 __ vmvn(dst, dst); |
| 1631 break; | 1631 break; |
| 1632 } | 1632 } |
| 1633 case kArmInt32x4GreaterThan: { | 1633 case kArmInt32x4GreaterThan: { |
| 1634 __ vcgt(NeonS32, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1634 __ vcgt(NeonS32, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1635 i.InputSimd128Register(1)); | 1635 i.InputSimd128Register(1)); |
| 1636 break; | 1636 break; |
| 1637 } | 1637 } |
| 1638 case kArmInt32x4GreaterThanOrEqual: { | 1638 case kArmInt32x4GreaterThanOrEqual: { |
| 1639 Simd128Register dst = i.OutputSimd128Register(); | 1639 __ vcge(NeonS32, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1640 __ vcge(NeonS32, dst, i.InputSimd128Register(0), | |
| 1641 i.InputSimd128Register(1)); | 1640 i.InputSimd128Register(1)); |
| 1642 break; | 1641 break; |
| 1643 } | 1642 } |
| 1644 case kArmUint32x4ShiftRightByScalar: { | 1643 case kArmUint32x4ShiftRightByScalar: { |
| 1645 __ vshr(NeonU32, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1644 __ vshr(NeonU32, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1646 i.InputInt5(1)); | 1645 i.InputInt5(1)); |
| 1647 break; | 1646 break; |
| 1648 } | 1647 } |
| 1649 case kArmUint32x4Min: { | 1648 case kArmUint32x4Min: { |
| 1650 __ vmin(NeonU32, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1649 __ vmin(NeonU32, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1651 i.InputSimd128Register(1)); | 1650 i.InputSimd128Register(1)); |
| 1652 break; | 1651 break; |
| 1653 } | 1652 } |
| 1654 case kArmUint32x4Max: { | 1653 case kArmUint32x4Max: { |
| 1655 __ vmax(NeonU32, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1654 __ vmax(NeonU32, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1656 i.InputSimd128Register(1)); | 1655 i.InputSimd128Register(1)); |
| 1657 break; | 1656 break; |
| 1658 } | 1657 } |
| 1659 case kArmUint32x4GreaterThan: { | 1658 case kArmUint32x4GreaterThan: { |
| 1660 __ vcgt(NeonU32, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1659 __ vcgt(NeonU32, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1661 i.InputSimd128Register(1)); | 1660 i.InputSimd128Register(1)); |
| 1662 break; | 1661 break; |
| 1663 } | 1662 } |
| 1664 case kArmUint32x4GreaterThanOrEqual: { | 1663 case kArmUint32x4GreaterThanOrEqual: { |
| 1665 Simd128Register dst = i.OutputSimd128Register(); | 1664 __ vcge(NeonU32, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1666 __ vcge(NeonU32, dst, i.InputSimd128Register(0), | |
| 1667 i.InputSimd128Register(1)); | 1665 i.InputSimd128Register(1)); |
| 1668 break; | 1666 break; |
| 1669 } | 1667 } |
| 1670 case kArmInt16x8Splat: { | 1668 case kArmInt16x8Splat: { |
| 1671 __ vdup(Neon16, i.OutputSimd128Register(), i.InputRegister(0)); | 1669 __ vdup(Neon16, i.OutputSimd128Register(), i.InputRegister(0)); |
| 1672 break; | 1670 break; |
| 1673 } | 1671 } |
| 1674 case kArmInt16x8ExtractLane: { | 1672 case kArmInt16x8ExtractLane: { |
| 1675 __ ExtractLane(i.OutputRegister(), i.InputSimd128Register(0), NeonS16, | 1673 __ ExtractLane(i.OutputRegister(), i.InputSimd128Register(0), NeonS16, |
| 1676 i.InputInt8(1)); | 1674 i.InputInt8(1)); |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1741 i.InputSimd128Register(1)); | 1739 i.InputSimd128Register(1)); |
| 1742 __ vmvn(dst, dst); | 1740 __ vmvn(dst, dst); |
| 1743 break; | 1741 break; |
| 1744 } | 1742 } |
| 1745 case kArmInt16x8GreaterThan: { | 1743 case kArmInt16x8GreaterThan: { |
| 1746 __ vcgt(NeonS16, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1744 __ vcgt(NeonS16, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1747 i.InputSimd128Register(1)); | 1745 i.InputSimd128Register(1)); |
| 1748 break; | 1746 break; |
| 1749 } | 1747 } |
| 1750 case kArmInt16x8GreaterThanOrEqual: { | 1748 case kArmInt16x8GreaterThanOrEqual: { |
| 1751 Simd128Register dst = i.OutputSimd128Register(); | 1749 __ vcge(NeonS16, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1752 __ vcge(NeonS16, dst, i.InputSimd128Register(0), | |
| 1753 i.InputSimd128Register(1)); | 1750 i.InputSimd128Register(1)); |
| 1754 break; | 1751 break; |
| 1755 } | 1752 } |
| 1756 case kArmUint16x8ShiftRightByScalar: { | 1753 case kArmUint16x8ShiftRightByScalar: { |
| 1757 __ vshr(NeonU16, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1754 __ vshr(NeonU16, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1758 i.InputInt4(1)); | 1755 i.InputInt4(1)); |
| 1759 break; | 1756 break; |
| 1760 } | 1757 } |
| 1761 case kArmUint16x8AddSaturate: { | 1758 case kArmUint16x8AddSaturate: { |
| 1762 __ vqadd(NeonU16, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1759 __ vqadd(NeonU16, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1777 __ vmax(NeonU16, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1774 __ vmax(NeonU16, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1778 i.InputSimd128Register(1)); | 1775 i.InputSimd128Register(1)); |
| 1779 break; | 1776 break; |
| 1780 } | 1777 } |
| 1781 case kArmUint16x8GreaterThan: { | 1778 case kArmUint16x8GreaterThan: { |
| 1782 __ vcgt(NeonU16, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1779 __ vcgt(NeonU16, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1783 i.InputSimd128Register(1)); | 1780 i.InputSimd128Register(1)); |
| 1784 break; | 1781 break; |
| 1785 } | 1782 } |
| 1786 case kArmUint16x8GreaterThanOrEqual: { | 1783 case kArmUint16x8GreaterThanOrEqual: { |
| 1787 Simd128Register dst = i.OutputSimd128Register(); | 1784 __ vcge(NeonU16, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1788 __ vcge(NeonU16, dst, i.InputSimd128Register(0), | |
| 1789 i.InputSimd128Register(1)); | 1785 i.InputSimd128Register(1)); |
| 1790 break; | 1786 break; |
| 1791 } | 1787 } |
| 1792 case kArmInt8x16Splat: { | 1788 case kArmInt8x16Splat: { |
| 1793 __ vdup(Neon8, i.OutputSimd128Register(), i.InputRegister(0)); | 1789 __ vdup(Neon8, i.OutputSimd128Register(), i.InputRegister(0)); |
| 1794 break; | 1790 break; |
| 1795 } | 1791 } |
| 1796 case kArmInt8x16ExtractLane: { | 1792 case kArmInt8x16ExtractLane: { |
| 1797 __ ExtractLane(i.OutputRegister(), i.InputSimd128Register(0), NeonS8, | 1793 __ ExtractLane(i.OutputRegister(), i.InputSimd128Register(0), NeonS8, |
| 1798 i.InputInt8(1)); | 1794 i.InputInt8(1)); |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1862 __ vceq(Neon8, dst, i.InputSimd128Register(0), i.InputSimd128Register(1)); | 1858 __ vceq(Neon8, dst, i.InputSimd128Register(0), i.InputSimd128Register(1)); |
| 1863 __ vmvn(dst, dst); | 1859 __ vmvn(dst, dst); |
| 1864 break; | 1860 break; |
| 1865 } | 1861 } |
| 1866 case kArmInt8x16GreaterThan: { | 1862 case kArmInt8x16GreaterThan: { |
| 1867 __ vcgt(NeonS8, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1863 __ vcgt(NeonS8, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1868 i.InputSimd128Register(1)); | 1864 i.InputSimd128Register(1)); |
| 1869 break; | 1865 break; |
| 1870 } | 1866 } |
| 1871 case kArmInt8x16GreaterThanOrEqual: { | 1867 case kArmInt8x16GreaterThanOrEqual: { |
| 1872 Simd128Register dst = i.OutputSimd128Register(); | 1868 __ vcge(NeonS8, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1873 __ vcge(NeonS8, dst, i.InputSimd128Register(0), | |
| 1874 i.InputSimd128Register(1)); | 1869 i.InputSimd128Register(1)); |
| 1875 break; | 1870 break; |
| 1876 } | 1871 } |
| 1877 case kArmUint8x16ShiftRightByScalar: { | 1872 case kArmUint8x16ShiftRightByScalar: { |
| 1878 __ vshr(NeonU8, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1873 __ vshr(NeonU8, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1879 i.InputInt3(1)); | 1874 i.InputInt3(1)); |
| 1880 break; | 1875 break; |
| 1881 } | 1876 } |
| 1882 case kArmUint8x16AddSaturate: { | 1877 case kArmUint8x16AddSaturate: { |
| 1883 __ vqadd(NeonU8, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1878 __ vqadd(NeonU8, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1898 __ vmax(NeonU8, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1893 __ vmax(NeonU8, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1899 i.InputSimd128Register(1)); | 1894 i.InputSimd128Register(1)); |
| 1900 break; | 1895 break; |
| 1901 } | 1896 } |
| 1902 case kArmUint8x16GreaterThan: { | 1897 case kArmUint8x16GreaterThan: { |
| 1903 __ vcgt(NeonU8, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1898 __ vcgt(NeonU8, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1904 i.InputSimd128Register(1)); | 1899 i.InputSimd128Register(1)); |
| 1905 break; | 1900 break; |
| 1906 } | 1901 } |
| 1907 case kArmUint8x16GreaterThanOrEqual: { | 1902 case kArmUint8x16GreaterThanOrEqual: { |
| 1908 Simd128Register dst = i.OutputSimd128Register(); | 1903 __ vcge(NeonU8, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1909 __ vcge(NeonU8, dst, i.InputSimd128Register(0), | |
| 1910 i.InputSimd128Register(1)); | 1904 i.InputSimd128Register(1)); |
| 1911 break; | 1905 break; |
| 1912 } | 1906 } |
| 1913 case kArmSimd128Zero: { | 1907 case kArmSimd128Zero: { |
| 1914 __ veor(i.OutputSimd128Register(), i.OutputSimd128Register(), | 1908 __ veor(i.OutputSimd128Register(), i.OutputSimd128Register(), |
| 1915 i.OutputSimd128Register()); | 1909 i.OutputSimd128Register()); |
| 1916 break; | 1910 break; |
| 1917 } | 1911 } |
| 1918 case kArmSimd128And: { | 1912 case kArmSimd128And: { |
| 1919 __ vand(i.OutputSimd128Register(), i.InputSimd128Register(0), | 1913 __ vand(i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1920 i.InputSimd128Register(1)); | 1914 i.InputSimd128Register(1)); |
| 1921 break; | 1915 break; |
| 1922 } | 1916 } |
| 1923 case kArmSimd128Or: { | 1917 case kArmSimd128Or: { |
| 1924 __ vorr(i.OutputSimd128Register(), i.InputSimd128Register(0), | 1918 __ vorr(i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1925 i.InputSimd128Register(1)); | 1919 i.InputSimd128Register(1)); |
| 1926 break; | 1920 break; |
| 1927 } | 1921 } |
| 1928 case kArmSimd128Xor: { | 1922 case kArmSimd128Xor: { |
| 1929 __ veor(i.OutputSimd128Register(), i.InputSimd128Register(0), | 1923 __ veor(i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1930 i.InputSimd128Register(1)); | 1924 i.InputSimd128Register(1)); |
| 1931 break; | 1925 break; |
| 1932 } | 1926 } |
| 1933 case kArmSimd128Not: { | 1927 case kArmSimd128Not: { |
| 1934 __ vmvn(i.OutputSimd128Register(), i.InputSimd128Register(0)); | 1928 __ vmvn(i.OutputSimd128Register(), i.InputSimd128Register(0)); |
| 1935 break; | 1929 break; |
| 1936 } | 1930 } |
| 1937 case kArmSimd32x4Select: | 1931 case kArmSimd128Select: { |
| 1938 case kArmSimd16x8Select: | |
| 1939 case kArmSimd8x16Select: { | |
| 1940 // vbsl clobbers the mask input so make sure it was DefineSameAsFirst. | 1932 // vbsl clobbers the mask input so make sure it was DefineSameAsFirst. |
| 1941 DCHECK(i.OutputSimd128Register().is(i.InputSimd128Register(0))); | 1933 DCHECK(i.OutputSimd128Register().is(i.InputSimd128Register(0))); |
| 1942 __ vbsl(i.OutputSimd128Register(), i.InputSimd128Register(1), | 1934 __ vbsl(i.OutputSimd128Register(), i.InputSimd128Register(1), |
| 1943 i.InputSimd128Register(2)); | 1935 i.InputSimd128Register(2)); |
| 1944 break; | 1936 break; |
| 1945 } | 1937 } |
| 1938 case kArmSimd1x4AnyTrue: { |
| 1939 const QwNeonRegister& src = i.InputSimd128Register(0); |
| 1940 __ vpmax(NeonU32, kScratchDoubleReg, src.low(), src.high()); |
| 1941 __ vpmax(NeonU32, kScratchDoubleReg, kScratchDoubleReg, |
| 1942 kScratchDoubleReg); |
| 1943 __ ExtractLane(i.OutputRegister(), kScratchDoubleReg, NeonS32, 0); |
| 1944 break; |
| 1945 } |
| 1946 case kArmSimd1x4AllTrue: { |
| 1947 const QwNeonRegister& src = i.InputSimd128Register(0); |
| 1948 __ vpmin(NeonU32, kScratchDoubleReg, src.low(), src.high()); |
| 1949 __ vpmin(NeonU32, kScratchDoubleReg, kScratchDoubleReg, |
| 1950 kScratchDoubleReg); |
| 1951 __ ExtractLane(i.OutputRegister(), kScratchDoubleReg, NeonS32, 0); |
| 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 __ ExtractLane(i.OutputRegister(), kScratchDoubleReg, NeonS16, 0); |
| 1962 break; |
| 1963 } |
| 1964 case kArmSimd1x8AllTrue: { |
| 1965 const QwNeonRegister& src = i.InputSimd128Register(0); |
| 1966 __ vpmin(NeonU16, kScratchDoubleReg, src.low(), src.high()); |
| 1967 __ vpmin(NeonU16, kScratchDoubleReg, kScratchDoubleReg, |
| 1968 kScratchDoubleReg); |
| 1969 __ vpmin(NeonU16, kScratchDoubleReg, kScratchDoubleReg, |
| 1970 kScratchDoubleReg); |
| 1971 __ ExtractLane(i.OutputRegister(), kScratchDoubleReg, NeonS16, 0); |
| 1972 break; |
| 1973 } |
| 1974 case kArmSimd1x16AnyTrue: { |
| 1975 const QwNeonRegister& src = i.InputSimd128Register(0); |
| 1976 __ vpmax(NeonU8, kScratchDoubleReg, src.low(), src.high()); |
| 1977 __ vpmax(NeonU8, kScratchDoubleReg, kScratchDoubleReg, kScratchDoubleReg); |
| 1978 // vtst to detect any bits in the bottom 32 bits of kScratchDoubleReg. |
| 1979 // This saves an instruction vs. the naive sequence of vpmax. |
| 1980 // kDoubleRegZero is not changed, since it is 0. |
| 1981 __ vtst(Neon32, kScratchQuadReg, kScratchQuadReg, kScratchQuadReg); |
| 1982 __ ExtractLane(i.OutputRegister(), kScratchDoubleReg, NeonS32, 0); |
| 1983 break; |
| 1984 } |
| 1985 case kArmSimd1x16AllTrue: { |
| 1986 const QwNeonRegister& src = i.InputSimd128Register(0); |
| 1987 __ vpmin(NeonU8, kScratchDoubleReg, src.low(), src.high()); |
| 1988 __ vpmin(NeonU8, kScratchDoubleReg, kScratchDoubleReg, kScratchDoubleReg); |
| 1989 __ vpmin(NeonU8, kScratchDoubleReg, kScratchDoubleReg, kScratchDoubleReg); |
| 1990 __ vpmin(NeonU8, kScratchDoubleReg, kScratchDoubleReg, kScratchDoubleReg); |
| 1991 __ ExtractLane(i.OutputRegister(), kScratchDoubleReg, NeonS8, 0); |
| 1992 break; |
| 1993 } |
| 1946 case kCheckedLoadInt8: | 1994 case kCheckedLoadInt8: |
| 1947 ASSEMBLE_CHECKED_LOAD_INTEGER(ldrsb); | 1995 ASSEMBLE_CHECKED_LOAD_INTEGER(ldrsb); |
| 1948 break; | 1996 break; |
| 1949 case kCheckedLoadUint8: | 1997 case kCheckedLoadUint8: |
| 1950 ASSEMBLE_CHECKED_LOAD_INTEGER(ldrb); | 1998 ASSEMBLE_CHECKED_LOAD_INTEGER(ldrb); |
| 1951 break; | 1999 break; |
| 1952 case kCheckedLoadInt16: | 2000 case kCheckedLoadInt16: |
| 1953 ASSEMBLE_CHECKED_LOAD_INTEGER(ldrsh); | 2001 ASSEMBLE_CHECKED_LOAD_INTEGER(ldrsh); |
| 1954 break; | 2002 break; |
| 1955 case kCheckedLoadUint16: | 2003 case kCheckedLoadUint16: |
| (...skipping 650 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2606 padding_size -= v8::internal::Assembler::kInstrSize; | 2654 padding_size -= v8::internal::Assembler::kInstrSize; |
| 2607 } | 2655 } |
| 2608 } | 2656 } |
| 2609 } | 2657 } |
| 2610 | 2658 |
| 2611 #undef __ | 2659 #undef __ |
| 2612 | 2660 |
| 2613 } // namespace compiler | 2661 } // namespace compiler |
| 2614 } // namespace internal | 2662 } // namespace internal |
| 2615 } // namespace v8 | 2663 } // namespace v8 |
| OLD | NEW |