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 1518 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |