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

Side by Side Diff: src/compiler/arm/code-generator-arm.cc

Issue 2711863002: Implement remaining Boolean SIMD operations on ARM. (Closed)
Patch Set: All Boolean vector tests. Created 3 years, 9 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
OLDNEW
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698