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

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

Issue 2800523002: [WASM SIMD] Implement packing and unpacking integer conversions. (Closed)
Patch Set: Fix stray edit, clean up some ordering of opcodes. Created 3 years, 8 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
« no previous file with comments | « no previous file | src/compiler/arm/instruction-codes-arm.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « no previous file | src/compiler/arm/instruction-codes-arm.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698