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

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

Issue 2729943002: [WASM] Implement remaining F32x4 operations for ARM. (Closed)
Patch Set: All FP operations except MinNum, MaxNum, Div, Sqrt. 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
« no previous file with comments | « no previous file | src/compiler/arm/instruction-codes-arm.h » ('j') | src/compiler/wasm-compiler.cc » ('J')
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 1518 matching lines...) Expand 10 before | Expand all | Expand 10 after
1529 break; 1529 break;
1530 } 1530 }
1531 case kArmFloat32x4Abs: { 1531 case kArmFloat32x4Abs: {
1532 __ vabs(i.OutputSimd128Register(), i.InputSimd128Register(0)); 1532 __ vabs(i.OutputSimd128Register(), i.InputSimd128Register(0));
1533 break; 1533 break;
1534 } 1534 }
1535 case kArmFloat32x4Neg: { 1535 case kArmFloat32x4Neg: {
1536 __ vneg(i.OutputSimd128Register(), i.InputSimd128Register(0)); 1536 __ vneg(i.OutputSimd128Register(), i.InputSimd128Register(0));
1537 break; 1537 break;
1538 } 1538 }
1539 case kArmFloat32x4RecipApprox: {
1540 __ vrecpe(i.OutputSimd128Register(), i.InputSimd128Register(0));
1541 break;
1542 }
1543 case kArmFloat32x4RecipSqrtApprox: {
1544 __ vrsqrte(i.OutputSimd128Register(), i.InputSimd128Register(0));
1545 break;
1546 }
1539 case kArmFloat32x4Add: { 1547 case kArmFloat32x4Add: {
1540 __ vadd(i.OutputSimd128Register(), i.InputSimd128Register(0), 1548 __ vadd(i.OutputSimd128Register(), i.InputSimd128Register(0),
1541 i.InputSimd128Register(1)); 1549 i.InputSimd128Register(1));
1542 break; 1550 break;
1543 } 1551 }
1544 case kArmFloat32x4Sub: { 1552 case kArmFloat32x4Sub: {
1545 __ vsub(i.OutputSimd128Register(), i.InputSimd128Register(0), 1553 __ vsub(i.OutputSimd128Register(), i.InputSimd128Register(0),
1546 i.InputSimd128Register(1)); 1554 i.InputSimd128Register(1));
1547 break; 1555 break;
1548 } 1556 }
1557 case kArmFloat32x4Mul: {
1558 __ vmul(i.OutputSimd128Register(), i.InputSimd128Register(0),
1559 i.InputSimd128Register(1));
1560 break;
1561 }
1562 case kArmFloat32x4Min: {
1563 __ vmin(i.OutputSimd128Register(), i.InputSimd128Register(0),
1564 i.InputSimd128Register(1));
1565 break;
1566 }
1567 case kArmFloat32x4Max: {
1568 __ vmax(i.OutputSimd128Register(), i.InputSimd128Register(0),
1569 i.InputSimd128Register(1));
1570 break;
1571 }
1572 case kArmFloat32x4RecipRefine: {
1573 __ vrecps(i.OutputSimd128Register(), i.InputSimd128Register(0),
1574 i.InputSimd128Register(1));
1575 break;
1576 }
1577 case kArmFloat32x4RecipSqrtRefine: {
1578 __ vrsqrts(i.OutputSimd128Register(), i.InputSimd128Register(0),
1579 i.InputSimd128Register(1));
1580 break;
1581 }
1549 case kArmFloat32x4Equal: { 1582 case kArmFloat32x4Equal: {
1550 __ vceq(i.OutputSimd128Register(), i.InputSimd128Register(0), 1583 __ vceq(i.OutputSimd128Register(), i.InputSimd128Register(0),
1551 i.InputSimd128Register(1)); 1584 i.InputSimd128Register(1));
1552 break; 1585 break;
1553 } 1586 }
1554 case kArmFloat32x4NotEqual: { 1587 case kArmFloat32x4NotEqual: {
1555 Simd128Register dst = i.OutputSimd128Register(); 1588 Simd128Register dst = i.OutputSimd128Register();
1556 __ vceq(dst, i.InputSimd128Register(0), i.InputSimd128Register(1)); 1589 __ vceq(dst, i.InputSimd128Register(0), i.InputSimd128Register(1));
1557 __ vmvn(dst, dst); 1590 __ vmvn(dst, dst);
1558 break; 1591 break;
1559 } 1592 }
1593 case kArmFloat32x4LessThan: {
1594 __ vcgt(i.OutputSimd128Register(), i.InputSimd128Register(1),
1595 i.InputSimd128Register(0));
1596 break;
1597 }
1598 case kArmFloat32x4LessThanOrEqual: {
1599 __ vcge(i.OutputSimd128Register(), i.InputSimd128Register(1),
1600 i.InputSimd128Register(0));
1601 break;
1602 }
1560 case kArmInt32x4Splat: { 1603 case kArmInt32x4Splat: {
1561 __ vdup(Neon32, i.OutputSimd128Register(), i.InputRegister(0)); 1604 __ vdup(Neon32, i.OutputSimd128Register(), i.InputRegister(0));
1562 break; 1605 break;
1563 } 1606 }
1564 case kArmInt32x4ExtractLane: { 1607 case kArmInt32x4ExtractLane: {
1565 __ ExtractLane(i.OutputRegister(), i.InputSimd128Register(0), NeonS32, 1608 __ ExtractLane(i.OutputRegister(), i.InputSimd128Register(0), NeonS32,
1566 i.InputInt8(1)); 1609 i.InputInt8(1));
1567 break; 1610 break;
1568 } 1611 }
1569 case kArmInt32x4ReplaceLane: { 1612 case kArmInt32x4ReplaceLane: {
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
1623 i.InputSimd128Register(1)); 1666 i.InputSimd128Register(1));
1624 break; 1667 break;
1625 } 1668 }
1626 case kArmInt32x4NotEqual: { 1669 case kArmInt32x4NotEqual: {
1627 Simd128Register dst = i.OutputSimd128Register(); 1670 Simd128Register dst = i.OutputSimd128Register();
1628 __ vceq(Neon32, dst, i.InputSimd128Register(0), 1671 __ vceq(Neon32, dst, i.InputSimd128Register(0),
1629 i.InputSimd128Register(1)); 1672 i.InputSimd128Register(1));
1630 __ vmvn(dst, dst); 1673 __ vmvn(dst, dst);
1631 break; 1674 break;
1632 } 1675 }
1633 case kArmInt32x4GreaterThan: { 1676 case kArmInt32x4LessThan: {
1634 __ vcgt(NeonS32, i.OutputSimd128Register(), i.InputSimd128Register(0), 1677 __ vcgt(NeonS32, i.OutputSimd128Register(), i.InputSimd128Register(1),
1635 i.InputSimd128Register(1)); 1678 i.InputSimd128Register(0));
1636 break; 1679 break;
1637 } 1680 }
1638 case kArmInt32x4GreaterThanOrEqual: { 1681 case kArmInt32x4LessThanOrEqual: {
1639 __ vcge(NeonS32, i.OutputSimd128Register(), i.InputSimd128Register(0), 1682 __ vcge(NeonS32, i.OutputSimd128Register(), i.InputSimd128Register(1),
1640 i.InputSimd128Register(1)); 1683 i.InputSimd128Register(0));
1641 break; 1684 break;
1642 } 1685 }
1643 case kArmUint32x4ShiftRightByScalar: { 1686 case kArmUint32x4ShiftRightByScalar: {
1644 __ vshr(NeonU32, i.OutputSimd128Register(), i.InputSimd128Register(0), 1687 __ vshr(NeonU32, i.OutputSimd128Register(), i.InputSimd128Register(0),
1645 i.InputInt5(1)); 1688 i.InputInt5(1));
1646 break; 1689 break;
1647 } 1690 }
1648 case kArmUint32x4Min: { 1691 case kArmUint32x4Min: {
1649 __ vmin(NeonU32, i.OutputSimd128Register(), i.InputSimd128Register(0), 1692 __ vmin(NeonU32, i.OutputSimd128Register(), i.InputSimd128Register(0),
1650 i.InputSimd128Register(1)); 1693 i.InputSimd128Register(1));
1651 break; 1694 break;
1652 } 1695 }
1653 case kArmUint32x4Max: { 1696 case kArmUint32x4Max: {
1654 __ vmax(NeonU32, i.OutputSimd128Register(), i.InputSimd128Register(0), 1697 __ vmax(NeonU32, i.OutputSimd128Register(), i.InputSimd128Register(0),
1655 i.InputSimd128Register(1)); 1698 i.InputSimd128Register(1));
1656 break; 1699 break;
1657 } 1700 }
1658 case kArmUint32x4GreaterThan: { 1701 case kArmUint32x4LessThan: {
1659 __ vcgt(NeonU32, i.OutputSimd128Register(), i.InputSimd128Register(0), 1702 __ vcgt(NeonU32, i.OutputSimd128Register(), i.InputSimd128Register(1),
1660 i.InputSimd128Register(1)); 1703 i.InputSimd128Register(0));
1661 break; 1704 break;
1662 } 1705 }
1663 case kArmUint32x4GreaterThanOrEqual: { 1706 case kArmUint32x4LessThanOrEqual: {
1664 __ vcge(NeonU32, i.OutputSimd128Register(), i.InputSimd128Register(0), 1707 __ vcge(NeonU32, i.OutputSimd128Register(), i.InputSimd128Register(1),
1665 i.InputSimd128Register(1)); 1708 i.InputSimd128Register(0));
1666 break; 1709 break;
1667 } 1710 }
1668 case kArmInt16x8Splat: { 1711 case kArmInt16x8Splat: {
1669 __ vdup(Neon16, i.OutputSimd128Register(), i.InputRegister(0)); 1712 __ vdup(Neon16, i.OutputSimd128Register(), i.InputRegister(0));
1670 break; 1713 break;
1671 } 1714 }
1672 case kArmInt16x8ExtractLane: { 1715 case kArmInt16x8ExtractLane: {
1673 __ ExtractLane(i.OutputRegister(), i.InputSimd128Register(0), NeonS16, 1716 __ ExtractLane(i.OutputRegister(), i.InputSimd128Register(0), NeonS16,
1674 i.InputInt8(1)); 1717 i.InputInt8(1));
1675 break; 1718 break;
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
1733 i.InputSimd128Register(1)); 1776 i.InputSimd128Register(1));
1734 break; 1777 break;
1735 } 1778 }
1736 case kArmInt16x8NotEqual: { 1779 case kArmInt16x8NotEqual: {
1737 Simd128Register dst = i.OutputSimd128Register(); 1780 Simd128Register dst = i.OutputSimd128Register();
1738 __ vceq(Neon16, dst, i.InputSimd128Register(0), 1781 __ vceq(Neon16, dst, i.InputSimd128Register(0),
1739 i.InputSimd128Register(1)); 1782 i.InputSimd128Register(1));
1740 __ vmvn(dst, dst); 1783 __ vmvn(dst, dst);
1741 break; 1784 break;
1742 } 1785 }
1743 case kArmInt16x8GreaterThan: { 1786 case kArmInt16x8LessThan: {
1744 __ vcgt(NeonS16, i.OutputSimd128Register(), i.InputSimd128Register(0), 1787 __ vcgt(NeonS16, i.OutputSimd128Register(), i.InputSimd128Register(1),
1745 i.InputSimd128Register(1)); 1788 i.InputSimd128Register(0));
1746 break; 1789 break;
1747 } 1790 }
1748 case kArmInt16x8GreaterThanOrEqual: { 1791 case kArmInt16x8LessThanOrEqual: {
1749 __ vcge(NeonS16, i.OutputSimd128Register(), i.InputSimd128Register(0), 1792 __ vcge(NeonS16, i.OutputSimd128Register(), i.InputSimd128Register(1),
1750 i.InputSimd128Register(1)); 1793 i.InputSimd128Register(0));
1751 break; 1794 break;
1752 } 1795 }
1753 case kArmUint16x8ShiftRightByScalar: { 1796 case kArmUint16x8ShiftRightByScalar: {
1754 __ vshr(NeonU16, i.OutputSimd128Register(), i.InputSimd128Register(0), 1797 __ vshr(NeonU16, i.OutputSimd128Register(), i.InputSimd128Register(0),
1755 i.InputInt4(1)); 1798 i.InputInt4(1));
1756 break; 1799 break;
1757 } 1800 }
1758 case kArmUint16x8AddSaturate: { 1801 case kArmUint16x8AddSaturate: {
1759 __ vqadd(NeonU16, i.OutputSimd128Register(), i.InputSimd128Register(0), 1802 __ vqadd(NeonU16, i.OutputSimd128Register(), i.InputSimd128Register(0),
1760 i.InputSimd128Register(1)); 1803 i.InputSimd128Register(1));
1761 break; 1804 break;
1762 } 1805 }
1763 case kArmUint16x8SubSaturate: { 1806 case kArmUint16x8SubSaturate: {
1764 __ vqsub(NeonU16, i.OutputSimd128Register(), i.InputSimd128Register(0), 1807 __ vqsub(NeonU16, i.OutputSimd128Register(), i.InputSimd128Register(0),
1765 i.InputSimd128Register(1)); 1808 i.InputSimd128Register(1));
1766 break; 1809 break;
1767 } 1810 }
1768 case kArmUint16x8Min: { 1811 case kArmUint16x8Min: {
1769 __ vmin(NeonU16, i.OutputSimd128Register(), i.InputSimd128Register(0), 1812 __ vmin(NeonU16, i.OutputSimd128Register(), i.InputSimd128Register(0),
1770 i.InputSimd128Register(1)); 1813 i.InputSimd128Register(1));
1771 break; 1814 break;
1772 } 1815 }
1773 case kArmUint16x8Max: { 1816 case kArmUint16x8Max: {
1774 __ vmax(NeonU16, i.OutputSimd128Register(), i.InputSimd128Register(0), 1817 __ vmax(NeonU16, i.OutputSimd128Register(), i.InputSimd128Register(0),
1775 i.InputSimd128Register(1)); 1818 i.InputSimd128Register(1));
1776 break; 1819 break;
1777 } 1820 }
1778 case kArmUint16x8GreaterThan: { 1821 case kArmUint16x8LessThan: {
1779 __ vcgt(NeonU16, i.OutputSimd128Register(), i.InputSimd128Register(0), 1822 __ vcgt(NeonU16, i.OutputSimd128Register(), i.InputSimd128Register(1),
1780 i.InputSimd128Register(1)); 1823 i.InputSimd128Register(0));
1781 break; 1824 break;
1782 } 1825 }
1783 case kArmUint16x8GreaterThanOrEqual: { 1826 case kArmUint16x8LessThanOrEqual: {
1784 __ vcge(NeonU16, i.OutputSimd128Register(), i.InputSimd128Register(0), 1827 __ vcge(NeonU16, i.OutputSimd128Register(), i.InputSimd128Register(1),
1785 i.InputSimd128Register(1)); 1828 i.InputSimd128Register(0));
1786 break; 1829 break;
1787 } 1830 }
1788 case kArmInt8x16Splat: { 1831 case kArmInt8x16Splat: {
1789 __ vdup(Neon8, i.OutputSimd128Register(), i.InputRegister(0)); 1832 __ vdup(Neon8, i.OutputSimd128Register(), i.InputRegister(0));
1790 break; 1833 break;
1791 } 1834 }
1792 case kArmInt8x16ExtractLane: { 1835 case kArmInt8x16ExtractLane: {
1793 __ ExtractLane(i.OutputRegister(), i.InputSimd128Register(0), NeonS8, 1836 __ ExtractLane(i.OutputRegister(), i.InputSimd128Register(0), NeonS8,
1794 i.InputInt8(1)); 1837 i.InputInt8(1));
1795 break; 1838 break;
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
1852 __ vceq(Neon8, i.OutputSimd128Register(), i.InputSimd128Register(0), 1895 __ vceq(Neon8, i.OutputSimd128Register(), i.InputSimd128Register(0),
1853 i.InputSimd128Register(1)); 1896 i.InputSimd128Register(1));
1854 break; 1897 break;
1855 } 1898 }
1856 case kArmInt8x16NotEqual: { 1899 case kArmInt8x16NotEqual: {
1857 Simd128Register dst = i.OutputSimd128Register(); 1900 Simd128Register dst = i.OutputSimd128Register();
1858 __ vceq(Neon8, dst, i.InputSimd128Register(0), i.InputSimd128Register(1)); 1901 __ vceq(Neon8, dst, i.InputSimd128Register(0), i.InputSimd128Register(1));
1859 __ vmvn(dst, dst); 1902 __ vmvn(dst, dst);
1860 break; 1903 break;
1861 } 1904 }
1862 case kArmInt8x16GreaterThan: { 1905 case kArmInt8x16LessThan: {
1863 __ vcgt(NeonS8, i.OutputSimd128Register(), i.InputSimd128Register(0), 1906 __ vcgt(NeonS8, i.OutputSimd128Register(), i.InputSimd128Register(1),
1864 i.InputSimd128Register(1)); 1907 i.InputSimd128Register(0));
1865 break; 1908 break;
1866 } 1909 }
1867 case kArmInt8x16GreaterThanOrEqual: { 1910 case kArmInt8x16LessThanOrEqual: {
1868 __ vcge(NeonS8, i.OutputSimd128Register(), i.InputSimd128Register(0), 1911 __ vcge(NeonS8, i.OutputSimd128Register(), i.InputSimd128Register(1),
1869 i.InputSimd128Register(1)); 1912 i.InputSimd128Register(0));
1870 break; 1913 break;
1871 } 1914 }
1872 case kArmUint8x16ShiftRightByScalar: { 1915 case kArmUint8x16ShiftRightByScalar: {
1873 __ vshr(NeonU8, i.OutputSimd128Register(), i.InputSimd128Register(0), 1916 __ vshr(NeonU8, i.OutputSimd128Register(), i.InputSimd128Register(0),
1874 i.InputInt3(1)); 1917 i.InputInt3(1));
1875 break; 1918 break;
1876 } 1919 }
1877 case kArmUint8x16AddSaturate: { 1920 case kArmUint8x16AddSaturate: {
1878 __ vqadd(NeonU8, i.OutputSimd128Register(), i.InputSimd128Register(0), 1921 __ vqadd(NeonU8, i.OutputSimd128Register(), i.InputSimd128Register(0),
1879 i.InputSimd128Register(1)); 1922 i.InputSimd128Register(1));
1880 break; 1923 break;
1881 } 1924 }
1882 case kArmUint8x16SubSaturate: { 1925 case kArmUint8x16SubSaturate: {
1883 __ vqsub(NeonU8, i.OutputSimd128Register(), i.InputSimd128Register(0), 1926 __ vqsub(NeonU8, i.OutputSimd128Register(), i.InputSimd128Register(0),
1884 i.InputSimd128Register(1)); 1927 i.InputSimd128Register(1));
1885 break; 1928 break;
1886 } 1929 }
1887 case kArmUint8x16Min: { 1930 case kArmUint8x16Min: {
1888 __ vmin(NeonU8, i.OutputSimd128Register(), i.InputSimd128Register(0), 1931 __ vmin(NeonU8, i.OutputSimd128Register(), i.InputSimd128Register(0),
1889 i.InputSimd128Register(1)); 1932 i.InputSimd128Register(1));
1890 break; 1933 break;
1891 } 1934 }
1892 case kArmUint8x16Max: { 1935 case kArmUint8x16Max: {
1893 __ vmax(NeonU8, i.OutputSimd128Register(), i.InputSimd128Register(0), 1936 __ vmax(NeonU8, i.OutputSimd128Register(), i.InputSimd128Register(0),
1894 i.InputSimd128Register(1)); 1937 i.InputSimd128Register(1));
1895 break; 1938 break;
1896 } 1939 }
1897 case kArmUint8x16GreaterThan: { 1940 case kArmUint8x16LessThan: {
1898 __ vcgt(NeonU8, i.OutputSimd128Register(), i.InputSimd128Register(0), 1941 __ vcgt(NeonU8, i.OutputSimd128Register(), i.InputSimd128Register(1),
1899 i.InputSimd128Register(1)); 1942 i.InputSimd128Register(0));
1900 break; 1943 break;
1901 } 1944 }
1902 case kArmUint8x16GreaterThanOrEqual: { 1945 case kArmUint8x16LessThanOrEqual: {
1903 __ vcge(NeonU8, i.OutputSimd128Register(), i.InputSimd128Register(0), 1946 __ vcge(NeonU8, i.OutputSimd128Register(), i.InputSimd128Register(1),
1904 i.InputSimd128Register(1)); 1947 i.InputSimd128Register(0));
1905 break; 1948 break;
1906 } 1949 }
1907 case kArmSimd128Zero: { 1950 case kArmSimd128Zero: {
1908 __ veor(i.OutputSimd128Register(), i.OutputSimd128Register(), 1951 __ veor(i.OutputSimd128Register(), i.OutputSimd128Register(),
1909 i.OutputSimd128Register()); 1952 i.OutputSimd128Register());
1910 break; 1953 break;
1911 } 1954 }
1912 case kArmSimd128And: { 1955 case kArmSimd128And: {
1913 __ vand(i.OutputSimd128Register(), i.InputSimd128Register(0), 1956 __ vand(i.OutputSimd128Register(), i.InputSimd128Register(0),
1914 i.InputSimd128Register(1)); 1957 i.InputSimd128Register(1));
(...skipping 739 matching lines...) Expand 10 before | Expand all | Expand 10 after
2654 padding_size -= v8::internal::Assembler::kInstrSize; 2697 padding_size -= v8::internal::Assembler::kInstrSize;
2655 } 2698 }
2656 } 2699 }
2657 } 2700 }
2658 2701
2659 #undef __ 2702 #undef __
2660 2703
2661 } // namespace compiler 2704 } // namespace compiler
2662 } // namespace internal 2705 } // namespace internal
2663 } // namespace v8 2706 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | src/compiler/arm/instruction-codes-arm.h » ('j') | src/compiler/wasm-compiler.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698