Chromium Code Reviews| 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 1650 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1661 } | 1661 } |
| 1662 case kArmI32x4ReplaceLane: { | 1662 case kArmI32x4ReplaceLane: { |
| 1663 __ ReplaceLane(i.OutputSimd128Register(), i.InputSimd128Register(0), | 1663 __ ReplaceLane(i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1664 i.InputRegister(2), NeonS32, i.InputInt8(1)); | 1664 i.InputRegister(2), NeonS32, i.InputInt8(1)); |
| 1665 break; | 1665 break; |
| 1666 } | 1666 } |
| 1667 case kArmI32x4SConvertF32x4: { | 1667 case kArmI32x4SConvertF32x4: { |
| 1668 __ vcvt_s32_f32(i.OutputSimd128Register(), i.InputSimd128Register(0)); | 1668 __ vcvt_s32_f32(i.OutputSimd128Register(), i.InputSimd128Register(0)); |
| 1669 break; | 1669 break; |
| 1670 } | 1670 } |
| 1671 case kArmI32x4SConvertI16x8Low: { | |
| 1672 __ vmovl(NeonS16, i.OutputSimd128Register(), | |
| 1673 i.InputSimd128Register(0).low()); | |
| 1674 break; | |
| 1675 } | |
| 1676 case kArmI32x4SConvertI16x8High: { | |
| 1677 __ vmovl(NeonS16, i.OutputSimd128Register(), | |
| 1678 i.InputSimd128Register(0).high()); | |
| 1679 break; | |
| 1680 } | |
| 1671 case kArmI32x4Neg: { | 1681 case kArmI32x4Neg: { |
| 1672 __ vneg(Neon32, i.OutputSimd128Register(), i.InputSimd128Register(0)); | 1682 __ vneg(Neon32, i.OutputSimd128Register(), i.InputSimd128Register(0)); |
| 1673 break; | 1683 break; |
| 1674 } | 1684 } |
| 1675 case kArmI32x4Shl: { | 1685 case kArmI32x4Shl: { |
| 1676 __ vshl(NeonS32, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1686 __ vshl(NeonS32, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1677 i.InputInt5(1)); | 1687 i.InputInt5(1)); |
| 1678 break; | 1688 break; |
| 1679 } | 1689 } |
| 1680 case kArmI32x4ShrS: { | 1690 case kArmI32x4ShrS: { |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1726 } | 1736 } |
| 1727 case kArmI32x4LeS: { | 1737 case kArmI32x4LeS: { |
| 1728 __ vcge(NeonS32, i.OutputSimd128Register(), i.InputSimd128Register(1), | 1738 __ vcge(NeonS32, i.OutputSimd128Register(), i.InputSimd128Register(1), |
| 1729 i.InputSimd128Register(0)); | 1739 i.InputSimd128Register(0)); |
| 1730 break; | 1740 break; |
| 1731 } | 1741 } |
| 1732 case kArmI32x4UConvertF32x4: { | 1742 case kArmI32x4UConvertF32x4: { |
| 1733 __ vcvt_u32_f32(i.OutputSimd128Register(), i.InputSimd128Register(0)); | 1743 __ vcvt_u32_f32(i.OutputSimd128Register(), i.InputSimd128Register(0)); |
| 1734 break; | 1744 break; |
| 1735 } | 1745 } |
| 1746 case kArmI32x4UConvertI16x8Low: { | |
| 1747 __ vmovl(NeonU16, i.OutputSimd128Register(), | |
| 1748 i.InputSimd128Register(0).low()); | |
| 1749 break; | |
| 1750 } | |
| 1751 case kArmI32x4UConvertI16x8High: { | |
| 1752 __ vmovl(NeonU16, i.OutputSimd128Register(), | |
| 1753 i.InputSimd128Register(0).high()); | |
| 1754 break; | |
| 1755 } | |
| 1736 case kArmI32x4ShrU: { | 1756 case kArmI32x4ShrU: { |
| 1737 __ vshr(NeonU32, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1757 __ vshr(NeonU32, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1738 i.InputInt5(1)); | 1758 i.InputInt5(1)); |
| 1739 break; | 1759 break; |
| 1740 } | 1760 } |
| 1741 case kArmI32x4MinU: { | 1761 case kArmI32x4MinU: { |
| 1742 __ vmin(NeonU32, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1762 __ vmin(NeonU32, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1743 i.InputSimd128Register(1)); | 1763 i.InputSimd128Register(1)); |
| 1744 break; | 1764 break; |
| 1745 } | 1765 } |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 1765 case kArmI16x8ExtractLane: { | 1785 case kArmI16x8ExtractLane: { |
| 1766 __ ExtractLane(i.OutputRegister(), i.InputSimd128Register(0), NeonS16, | 1786 __ ExtractLane(i.OutputRegister(), i.InputSimd128Register(0), NeonS16, |
| 1767 i.InputInt8(1)); | 1787 i.InputInt8(1)); |
| 1768 break; | 1788 break; |
| 1769 } | 1789 } |
| 1770 case kArmI16x8ReplaceLane: { | 1790 case kArmI16x8ReplaceLane: { |
| 1771 __ ReplaceLane(i.OutputSimd128Register(), i.InputSimd128Register(0), | 1791 __ ReplaceLane(i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1772 i.InputRegister(2), NeonS16, i.InputInt8(1)); | 1792 i.InputRegister(2), NeonS16, i.InputInt8(1)); |
| 1773 break; | 1793 break; |
| 1774 } | 1794 } |
| 1795 case kArmI16x8SConvertI8x16Low: { | |
| 1796 __ vmovl(NeonS8, i.OutputSimd128Register(), | |
| 1797 i.InputSimd128Register(0).low()); | |
| 1798 break; | |
| 1799 } | |
| 1800 case kArmI16x8SConvertI8x16High: { | |
| 1801 __ vmovl(NeonS8, i.OutputSimd128Register(), | |
| 1802 i.InputSimd128Register(0).high()); | |
| 1803 break; | |
| 1804 } | |
| 1775 case kArmI16x8Neg: { | 1805 case kArmI16x8Neg: { |
| 1776 __ vneg(Neon16, i.OutputSimd128Register(), i.InputSimd128Register(0)); | 1806 __ vneg(Neon16, i.OutputSimd128Register(), i.InputSimd128Register(0)); |
| 1777 break; | 1807 break; |
| 1778 } | 1808 } |
| 1779 case kArmI16x8Shl: { | 1809 case kArmI16x8Shl: { |
| 1780 __ vshl(NeonS16, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1810 __ vshl(NeonS16, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1781 i.InputInt4(1)); | 1811 i.InputInt4(1)); |
| 1782 break; | 1812 break; |
| 1783 } | 1813 } |
| 1784 case kArmI16x8ShrS: { | 1814 case kArmI16x8ShrS: { |
| 1785 __ vshr(NeonS16, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1815 __ vshr(NeonS16, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1786 i.InputInt4(1)); | 1816 i.InputInt4(1)); |
| 1787 break; | 1817 break; |
| 1788 } | 1818 } |
| 1819 case kArmI16x8SConvertI32x4: { | |
| 1820 Simd128Register dst = i.OutputSimd128Register(), | |
| 1821 src1 = i.InputSimd128Register(0), | |
|
martyn.capewell
2017/04/06 14:37:43
Name these src0 and src1 to match the input index.
bbudge
2017/04/06 18:19:31
Done.
| |
| 1822 src2 = i.InputSimd128Register(1); | |
| 1823 // Take care not to overwrite a source register before it's used. | |
| 1824 if (dst.is(src1) || dst.is(src2)) { | |
|
martyn.capewell
2017/04/06 14:37:43
By changing the operation order, I think you can a
bbudge
2017/04/06 18:19:31
Nice. Done.
| |
| 1825 __ vqmovn(NeonS16, kScratchDoubleReg, i.InputSimd128Register(0)); | |
| 1826 __ vqmovn(NeonS16, dst.high(), i.InputSimd128Register(1)); | |
| 1827 __ vmov(dst.low(), kScratchDoubleReg); | |
| 1828 } else { | |
| 1829 __ vqmovn(NeonS16, dst.low(), i.InputSimd128Register(0)); | |
| 1830 __ vqmovn(NeonS16, dst.high(), i.InputSimd128Register(1)); | |
| 1831 } | |
| 1832 break; | |
| 1833 } | |
| 1789 case kArmI16x8Add: { | 1834 case kArmI16x8Add: { |
| 1790 __ vadd(Neon16, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1835 __ vadd(Neon16, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1791 i.InputSimd128Register(1)); | 1836 i.InputSimd128Register(1)); |
| 1792 break; | 1837 break; |
| 1793 } | 1838 } |
| 1794 case kArmI16x8AddSaturateS: { | 1839 case kArmI16x8AddSaturateS: { |
| 1795 __ vqadd(NeonS16, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1840 __ vqadd(NeonS16, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1796 i.InputSimd128Register(1)); | 1841 i.InputSimd128Register(1)); |
| 1797 break; | 1842 break; |
| 1798 } | 1843 } |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1836 case kArmI16x8LtS: { | 1881 case kArmI16x8LtS: { |
| 1837 __ vcgt(NeonS16, i.OutputSimd128Register(), i.InputSimd128Register(1), | 1882 __ vcgt(NeonS16, i.OutputSimd128Register(), i.InputSimd128Register(1), |
| 1838 i.InputSimd128Register(0)); | 1883 i.InputSimd128Register(0)); |
| 1839 break; | 1884 break; |
| 1840 } | 1885 } |
| 1841 case kArmI16x8LeS: { | 1886 case kArmI16x8LeS: { |
| 1842 __ vcge(NeonS16, i.OutputSimd128Register(), i.InputSimd128Register(1), | 1887 __ vcge(NeonS16, i.OutputSimd128Register(), i.InputSimd128Register(1), |
| 1843 i.InputSimd128Register(0)); | 1888 i.InputSimd128Register(0)); |
| 1844 break; | 1889 break; |
| 1845 } | 1890 } |
| 1891 case kArmI16x8UConvertI8x16Low: { | |
| 1892 __ vmovl(NeonU8, i.OutputSimd128Register(), | |
| 1893 i.InputSimd128Register(0).low()); | |
| 1894 break; | |
| 1895 } | |
| 1896 case kArmI16x8UConvertI8x16High: { | |
| 1897 __ vmovl(NeonU8, i.OutputSimd128Register(), | |
| 1898 i.InputSimd128Register(0).high()); | |
| 1899 break; | |
| 1900 } | |
| 1846 case kArmI16x8ShrU: { | 1901 case kArmI16x8ShrU: { |
| 1847 __ vshr(NeonU16, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1902 __ vshr(NeonU16, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1848 i.InputInt4(1)); | 1903 i.InputInt4(1)); |
| 1849 break; | 1904 break; |
| 1850 } | 1905 } |
| 1906 case kArmI16x8UConvertI32x4: { | |
| 1907 Simd128Register dst = i.OutputSimd128Register(), | |
| 1908 src1 = i.InputSimd128Register(0), | |
| 1909 src2 = i.InputSimd128Register(1); | |
| 1910 // Take care not to overwrite a source register before it's used. | |
| 1911 if (dst.is(src1) || dst.is(src2)) { | |
| 1912 __ vqmovn(NeonU16, kScratchDoubleReg, i.InputSimd128Register(0)); | |
| 1913 __ vqmovn(NeonU16, dst.high(), i.InputSimd128Register(1)); | |
| 1914 __ vmov(dst.low(), kScratchDoubleReg); | |
| 1915 } else { | |
| 1916 __ vqmovn(NeonU16, dst.low(), i.InputSimd128Register(0)); | |
| 1917 __ vqmovn(NeonU16, dst.high(), i.InputSimd128Register(1)); | |
| 1918 } | |
| 1919 break; | |
| 1920 } | |
| 1851 case kArmI16x8AddSaturateU: { | 1921 case kArmI16x8AddSaturateU: { |
| 1852 __ vqadd(NeonU16, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1922 __ vqadd(NeonU16, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1853 i.InputSimd128Register(1)); | 1923 i.InputSimd128Register(1)); |
| 1854 break; | 1924 break; |
| 1855 } | 1925 } |
| 1856 case kArmI16x8SubSaturateU: { | 1926 case kArmI16x8SubSaturateU: { |
| 1857 __ vqsub(NeonU16, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1927 __ vqsub(NeonU16, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1858 i.InputSimd128Register(1)); | 1928 i.InputSimd128Register(1)); |
| 1859 break; | 1929 break; |
| 1860 } | 1930 } |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1899 case kArmI8x16Shl: { | 1969 case kArmI8x16Shl: { |
| 1900 __ vshl(NeonS8, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1970 __ vshl(NeonS8, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1901 i.InputInt3(1)); | 1971 i.InputInt3(1)); |
| 1902 break; | 1972 break; |
| 1903 } | 1973 } |
| 1904 case kArmI8x16ShrS: { | 1974 case kArmI8x16ShrS: { |
| 1905 __ vshr(NeonS8, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1975 __ vshr(NeonS8, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1906 i.InputInt3(1)); | 1976 i.InputInt3(1)); |
| 1907 break; | 1977 break; |
| 1908 } | 1978 } |
| 1979 case kArmI8x16SConvertI16x8: { | |
| 1980 Simd128Register dst = i.OutputSimd128Register(), | |
| 1981 src1 = i.InputSimd128Register(0), | |
| 1982 src2 = i.InputSimd128Register(1); | |
| 1983 // Take care not to overwrite a source register before it's used. | |
| 1984 if (dst.is(src1) || dst.is(src2)) { | |
| 1985 __ vqmovn(NeonS8, kScratchDoubleReg, i.InputSimd128Register(0)); | |
| 1986 __ vqmovn(NeonS8, dst.high(), i.InputSimd128Register(1)); | |
| 1987 __ vmov(dst.low(), kScratchDoubleReg); | |
| 1988 } else { | |
| 1989 __ vqmovn(NeonS8, dst.low(), i.InputSimd128Register(0)); | |
| 1990 __ vqmovn(NeonS8, dst.high(), i.InputSimd128Register(1)); | |
| 1991 } | |
| 1992 break; | |
| 1993 } | |
| 1909 case kArmI8x16Add: { | 1994 case kArmI8x16Add: { |
| 1910 __ vadd(Neon8, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1995 __ vadd(Neon8, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1911 i.InputSimd128Register(1)); | 1996 i.InputSimd128Register(1)); |
| 1912 break; | 1997 break; |
| 1913 } | 1998 } |
| 1914 case kArmI8x16AddSaturateS: { | 1999 case kArmI8x16AddSaturateS: { |
| 1915 __ vqadd(NeonS8, i.OutputSimd128Register(), i.InputSimd128Register(0), | 2000 __ vqadd(NeonS8, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1916 i.InputSimd128Register(1)); | 2001 i.InputSimd128Register(1)); |
| 1917 break; | 2002 break; |
| 1918 } | 2003 } |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1960 case kArmI8x16LeS: { | 2045 case kArmI8x16LeS: { |
| 1961 __ vcge(NeonS8, i.OutputSimd128Register(), i.InputSimd128Register(1), | 2046 __ vcge(NeonS8, i.OutputSimd128Register(), i.InputSimd128Register(1), |
| 1962 i.InputSimd128Register(0)); | 2047 i.InputSimd128Register(0)); |
| 1963 break; | 2048 break; |
| 1964 } | 2049 } |
| 1965 case kArmI8x16ShrU: { | 2050 case kArmI8x16ShrU: { |
| 1966 __ vshr(NeonU8, i.OutputSimd128Register(), i.InputSimd128Register(0), | 2051 __ vshr(NeonU8, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1967 i.InputInt3(1)); | 2052 i.InputInt3(1)); |
| 1968 break; | 2053 break; |
| 1969 } | 2054 } |
| 2055 case kArmI8x16UConvertI16x8: { | |
| 2056 Simd128Register dst = i.OutputSimd128Register(), | |
| 2057 src1 = i.InputSimd128Register(0), | |
| 2058 src2 = i.InputSimd128Register(1); | |
| 2059 // Take care not to overwrite a source register before it's used. | |
| 2060 if (dst.is(src1) || dst.is(src2)) { | |
| 2061 __ vqmovn(NeonU8, kScratchDoubleReg, i.InputSimd128Register(0)); | |
| 2062 __ vqmovn(NeonU8, dst.high(), i.InputSimd128Register(1)); | |
| 2063 __ vmov(dst.low(), kScratchDoubleReg); | |
| 2064 } else { | |
| 2065 __ vqmovn(NeonU8, dst.low(), i.InputSimd128Register(0)); | |
| 2066 __ vqmovn(NeonU8, dst.high(), i.InputSimd128Register(1)); | |
| 2067 } | |
| 2068 break; | |
| 2069 } | |
| 1970 case kArmI8x16AddSaturateU: { | 2070 case kArmI8x16AddSaturateU: { |
| 1971 __ vqadd(NeonU8, i.OutputSimd128Register(), i.InputSimd128Register(0), | 2071 __ vqadd(NeonU8, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1972 i.InputSimd128Register(1)); | 2072 i.InputSimd128Register(1)); |
| 1973 break; | 2073 break; |
| 1974 } | 2074 } |
| 1975 case kArmI8x16SubSaturateU: { | 2075 case kArmI8x16SubSaturateU: { |
| 1976 __ vqsub(NeonU8, i.OutputSimd128Register(), i.InputSimd128Register(0), | 2076 __ vqsub(NeonU8, i.OutputSimd128Register(), i.InputSimd128Register(0), |
| 1977 i.InputSimd128Register(1)); | 2077 i.InputSimd128Register(1)); |
| 1978 break; | 2078 break; |
| 1979 } | 2079 } |
| (...skipping 851 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2831 padding_size -= v8::internal::Assembler::kInstrSize; | 2931 padding_size -= v8::internal::Assembler::kInstrSize; |
| 2832 } | 2932 } |
| 2833 } | 2933 } |
| 2834 } | 2934 } |
| 2835 | 2935 |
| 2836 #undef __ | 2936 #undef __ |
| 2837 | 2937 |
| 2838 } // namespace compiler | 2938 } // namespace compiler |
| 2839 } // namespace internal | 2939 } // namespace internal |
| 2840 } // namespace v8 | 2940 } // namespace v8 |
| OLD | NEW |