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); | |
martyn.capewell
2017/03/01 14:04:05
An ExtractLane function that accepts a double regi
bbudge
2017/03/02 00:34:47
That's a nice improvement. Done.
| |
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: { | |
martyn.capewell
2017/03/01 14:04:05
I think we could save an instruction here:
__ vo
bbudge
2017/03/02 00:34:47
I'd rather not add the DwVfpRegister versions of N
| |
1977 const QwNeonRegister& src = i.InputSimd128Register(0); | |
1978 __ vpmax(NeonU16, kScratchDoubleReg, src.low(), src.high()); | |
bbudge
2017/03/02 00:34:47
whoops, typo: NeonU16
| |
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 |