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 |