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 1538 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1549 frame_access_state()->IncreaseSPDelta(1); | 1549 frame_access_state()->IncreaseSPDelta(1); |
1550 } | 1550 } |
1551 DCHECK_EQ(LeaveCC, i.OutputSBit()); | 1551 DCHECK_EQ(LeaveCC, i.OutputSBit()); |
1552 break; | 1552 break; |
1553 case kArmPoke: { | 1553 case kArmPoke: { |
1554 int const slot = MiscField::decode(instr->opcode()); | 1554 int const slot = MiscField::decode(instr->opcode()); |
1555 __ str(i.InputRegister(0), MemOperand(sp, slot * kPointerSize)); | 1555 __ str(i.InputRegister(0), MemOperand(sp, slot * kPointerSize)); |
1556 DCHECK_EQ(LeaveCC, i.OutputSBit()); | 1556 DCHECK_EQ(LeaveCC, i.OutputSBit()); |
1557 break; | 1557 break; |
1558 } | 1558 } |
1559 case kArmFloat32x4Splat: { | 1559 case kArmF32x4Splat: { |
1560 __ vdup(i.OutputSimd128Register(), i.InputFloatRegister(0)); | 1560 __ vdup(i.OutputSimd128Register(), i.InputFloatRegister(0)); |
1561 break; | 1561 break; |
1562 } | 1562 } |
1563 case kArmFloat32x4ExtractLane: { | 1563 case kArmF32x4ExtractLane: { |
1564 __ ExtractLane(i.OutputFloatRegister(), i.InputSimd128Register(0), | 1564 __ ExtractLane(i.OutputFloatRegister(), i.InputSimd128Register(0), |
1565 kScratchReg, i.InputInt8(1)); | 1565 kScratchReg, i.InputInt8(1)); |
1566 break; | 1566 break; |
1567 } | 1567 } |
1568 case kArmFloat32x4ReplaceLane: { | 1568 case kArmF32x4ReplaceLane: { |
1569 __ ReplaceLane(i.OutputSimd128Register(), i.InputSimd128Register(0), | 1569 __ ReplaceLane(i.OutputSimd128Register(), i.InputSimd128Register(0), |
1570 i.InputFloatRegister(2), kScratchReg, i.InputInt8(1)); | 1570 i.InputFloatRegister(2), kScratchReg, i.InputInt8(1)); |
1571 break; | 1571 break; |
1572 } | 1572 } |
1573 case kArmFloat32x4FromInt32x4: { | 1573 case kArmF32x4SConvertI32x4: { |
1574 __ vcvt_f32_s32(i.OutputSimd128Register(), i.InputSimd128Register(0)); | 1574 __ vcvt_f32_s32(i.OutputSimd128Register(), i.InputSimd128Register(0)); |
1575 break; | 1575 break; |
1576 } | 1576 } |
1577 case kArmFloat32x4FromUint32x4: { | 1577 case kArmF32x4UConvertI32x4: { |
1578 __ vcvt_f32_u32(i.OutputSimd128Register(), i.InputSimd128Register(0)); | 1578 __ vcvt_f32_u32(i.OutputSimd128Register(), i.InputSimd128Register(0)); |
1579 break; | 1579 break; |
1580 } | 1580 } |
1581 case kArmFloat32x4Abs: { | 1581 case kArmF32x4Abs: { |
1582 __ vabs(i.OutputSimd128Register(), i.InputSimd128Register(0)); | 1582 __ vabs(i.OutputSimd128Register(), i.InputSimd128Register(0)); |
1583 break; | 1583 break; |
1584 } | 1584 } |
1585 case kArmFloat32x4Neg: { | 1585 case kArmF32x4Neg: { |
1586 __ vneg(i.OutputSimd128Register(), i.InputSimd128Register(0)); | 1586 __ vneg(i.OutputSimd128Register(), i.InputSimd128Register(0)); |
1587 break; | 1587 break; |
1588 } | 1588 } |
1589 case kArmFloat32x4RecipApprox: { | 1589 case kArmF32x4RecipApprox: { |
1590 __ vrecpe(i.OutputSimd128Register(), i.InputSimd128Register(0)); | 1590 __ vrecpe(i.OutputSimd128Register(), i.InputSimd128Register(0)); |
1591 break; | 1591 break; |
1592 } | 1592 } |
1593 case kArmFloat32x4RecipSqrtApprox: { | 1593 case kArmF32x4RecipSqrtApprox: { |
1594 __ vrsqrte(i.OutputSimd128Register(), i.InputSimd128Register(0)); | 1594 __ vrsqrte(i.OutputSimd128Register(), i.InputSimd128Register(0)); |
1595 break; | 1595 break; |
1596 } | 1596 } |
1597 case kArmFloat32x4Add: { | 1597 case kArmF32x4Add: { |
1598 __ vadd(i.OutputSimd128Register(), i.InputSimd128Register(0), | 1598 __ vadd(i.OutputSimd128Register(), i.InputSimd128Register(0), |
1599 i.InputSimd128Register(1)); | 1599 i.InputSimd128Register(1)); |
1600 break; | 1600 break; |
1601 } | 1601 } |
1602 case kArmFloat32x4Sub: { | 1602 case kArmF32x4Sub: { |
1603 __ vsub(i.OutputSimd128Register(), i.InputSimd128Register(0), | 1603 __ vsub(i.OutputSimd128Register(), i.InputSimd128Register(0), |
1604 i.InputSimd128Register(1)); | 1604 i.InputSimd128Register(1)); |
1605 break; | 1605 break; |
1606 } | 1606 } |
1607 case kArmFloat32x4Mul: { | 1607 case kArmF32x4Mul: { |
1608 __ vmul(i.OutputSimd128Register(), i.InputSimd128Register(0), | 1608 __ vmul(i.OutputSimd128Register(), i.InputSimd128Register(0), |
1609 i.InputSimd128Register(1)); | 1609 i.InputSimd128Register(1)); |
1610 break; | 1610 break; |
1611 } | 1611 } |
1612 case kArmFloat32x4Min: { | 1612 case kArmF32x4Min: { |
1613 __ vmin(i.OutputSimd128Register(), i.InputSimd128Register(0), | 1613 __ vmin(i.OutputSimd128Register(), i.InputSimd128Register(0), |
1614 i.InputSimd128Register(1)); | 1614 i.InputSimd128Register(1)); |
1615 break; | 1615 break; |
1616 } | 1616 } |
1617 case kArmFloat32x4Max: { | 1617 case kArmF32x4Max: { |
1618 __ vmax(i.OutputSimd128Register(), i.InputSimd128Register(0), | 1618 __ vmax(i.OutputSimd128Register(), i.InputSimd128Register(0), |
1619 i.InputSimd128Register(1)); | 1619 i.InputSimd128Register(1)); |
1620 break; | 1620 break; |
1621 } | 1621 } |
1622 case kArmFloat32x4RecipRefine: { | 1622 case kArmF32x4RecipRefine: { |
1623 __ vrecps(i.OutputSimd128Register(), i.InputSimd128Register(0), | 1623 __ vrecps(i.OutputSimd128Register(), i.InputSimd128Register(0), |
1624 i.InputSimd128Register(1)); | 1624 i.InputSimd128Register(1)); |
1625 break; | 1625 break; |
1626 } | 1626 } |
1627 case kArmFloat32x4RecipSqrtRefine: { | 1627 case kArmF32x4RecipSqrtRefine: { |
1628 __ vrsqrts(i.OutputSimd128Register(), i.InputSimd128Register(0), | 1628 __ vrsqrts(i.OutputSimd128Register(), i.InputSimd128Register(0), |
1629 i.InputSimd128Register(1)); | 1629 i.InputSimd128Register(1)); |
1630 break; | 1630 break; |
1631 } | 1631 } |
1632 case kArmFloat32x4Equal: { | 1632 case kArmF32x4Eq: { |
1633 __ vceq(i.OutputSimd128Register(), i.InputSimd128Register(0), | 1633 __ vceq(i.OutputSimd128Register(), i.InputSimd128Register(0), |
1634 i.InputSimd128Register(1)); | 1634 i.InputSimd128Register(1)); |
1635 break; | 1635 break; |
1636 } | 1636 } |
1637 case kArmFloat32x4NotEqual: { | 1637 case kArmF32x4Ne: { |
1638 Simd128Register dst = i.OutputSimd128Register(); | 1638 Simd128Register dst = i.OutputSimd128Register(); |
1639 __ vceq(dst, i.InputSimd128Register(0), i.InputSimd128Register(1)); | 1639 __ vceq(dst, i.InputSimd128Register(0), i.InputSimd128Register(1)); |
1640 __ vmvn(dst, dst); | 1640 __ vmvn(dst, dst); |
1641 break; | 1641 break; |
1642 } | 1642 } |
1643 case kArmFloat32x4LessThan: { | 1643 case kArmF32x4Lt: { |
1644 __ vcgt(i.OutputSimd128Register(), i.InputSimd128Register(1), | 1644 __ vcgt(i.OutputSimd128Register(), i.InputSimd128Register(1), |
1645 i.InputSimd128Register(0)); | 1645 i.InputSimd128Register(0)); |
1646 break; | 1646 break; |
1647 } | 1647 } |
1648 case kArmFloat32x4LessThanOrEqual: { | 1648 case kArmF32x4Le: { |
1649 __ vcge(i.OutputSimd128Register(), i.InputSimd128Register(1), | 1649 __ vcge(i.OutputSimd128Register(), i.InputSimd128Register(1), |
1650 i.InputSimd128Register(0)); | 1650 i.InputSimd128Register(0)); |
1651 break; | 1651 break; |
1652 } | 1652 } |
1653 case kArmInt32x4Splat: { | 1653 case kArmI32x4Splat: { |
1654 __ vdup(Neon32, i.OutputSimd128Register(), i.InputRegister(0)); | 1654 __ vdup(Neon32, i.OutputSimd128Register(), i.InputRegister(0)); |
1655 break; | 1655 break; |
1656 } | 1656 } |
1657 case kArmInt32x4ExtractLane: { | 1657 case kArmI32x4ExtractLane: { |
1658 __ ExtractLane(i.OutputRegister(), i.InputSimd128Register(0), NeonS32, | 1658 __ ExtractLane(i.OutputRegister(), i.InputSimd128Register(0), NeonS32, |
1659 i.InputInt8(1)); | 1659 i.InputInt8(1)); |
1660 break; | 1660 break; |
1661 } | 1661 } |
1662 case kArmInt32x4ReplaceLane: { | 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 kArmInt32x4FromFloat32x4: { | 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 kArmUint32x4FromFloat32x4: { | 1671 case kArmI32x4Neg: { |
1672 __ vcvt_u32_f32(i.OutputSimd128Register(), i.InputSimd128Register(0)); | |
1673 break; | |
1674 } | |
1675 case kArmInt32x4Neg: { | |
1676 __ vneg(Neon32, i.OutputSimd128Register(), i.InputSimd128Register(0)); | 1672 __ vneg(Neon32, i.OutputSimd128Register(), i.InputSimd128Register(0)); |
1677 break; | 1673 break; |
1678 } | 1674 } |
1679 case kArmInt32x4ShiftLeftByScalar: { | 1675 case kArmI32x4Shl: { |
1680 __ vshl(NeonS32, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1676 __ vshl(NeonS32, i.OutputSimd128Register(), i.InputSimd128Register(0), |
1681 i.InputInt5(1)); | 1677 i.InputInt5(1)); |
1682 break; | 1678 break; |
1683 } | 1679 } |
1684 case kArmInt32x4ShiftRightByScalar: { | 1680 case kArmI32x4ShrS: { |
1685 __ vshr(NeonS32, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1681 __ vshr(NeonS32, i.OutputSimd128Register(), i.InputSimd128Register(0), |
1686 i.InputInt5(1)); | 1682 i.InputInt5(1)); |
1687 break; | 1683 break; |
1688 } | 1684 } |
1689 case kArmInt32x4Add: { | 1685 case kArmI32x4Add: { |
1690 __ vadd(Neon32, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1686 __ vadd(Neon32, i.OutputSimd128Register(), i.InputSimd128Register(0), |
1691 i.InputSimd128Register(1)); | 1687 i.InputSimd128Register(1)); |
1692 break; | 1688 break; |
1693 } | 1689 } |
1694 case kArmInt32x4Sub: { | 1690 case kArmI32x4Sub: { |
1695 __ vsub(Neon32, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1691 __ vsub(Neon32, i.OutputSimd128Register(), i.InputSimd128Register(0), |
1696 i.InputSimd128Register(1)); | 1692 i.InputSimd128Register(1)); |
1697 break; | 1693 break; |
1698 } | 1694 } |
1699 case kArmInt32x4Mul: { | 1695 case kArmI32x4Mul: { |
1700 __ vmul(Neon32, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1696 __ vmul(Neon32, i.OutputSimd128Register(), i.InputSimd128Register(0), |
1701 i.InputSimd128Register(1)); | 1697 i.InputSimd128Register(1)); |
1702 break; | 1698 break; |
1703 } | 1699 } |
1704 case kArmInt32x4Min: { | 1700 case kArmI32x4MinS: { |
1705 __ vmin(NeonS32, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1701 __ vmin(NeonS32, i.OutputSimd128Register(), i.InputSimd128Register(0), |
1706 i.InputSimd128Register(1)); | 1702 i.InputSimd128Register(1)); |
1707 break; | 1703 break; |
1708 } | 1704 } |
1709 case kArmInt32x4Max: { | 1705 case kArmI32x4MaxS: { |
1710 __ vmax(NeonS32, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1706 __ vmax(NeonS32, i.OutputSimd128Register(), i.InputSimd128Register(0), |
1711 i.InputSimd128Register(1)); | 1707 i.InputSimd128Register(1)); |
1712 break; | 1708 break; |
1713 } | 1709 } |
1714 case kArmInt32x4Equal: { | 1710 case kArmI32x4Eq: { |
1715 __ vceq(Neon32, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1711 __ vceq(Neon32, i.OutputSimd128Register(), i.InputSimd128Register(0), |
1716 i.InputSimd128Register(1)); | 1712 i.InputSimd128Register(1)); |
1717 break; | 1713 break; |
1718 } | 1714 } |
1719 case kArmInt32x4NotEqual: { | 1715 case kArmI32x4Ne: { |
1720 Simd128Register dst = i.OutputSimd128Register(); | 1716 Simd128Register dst = i.OutputSimd128Register(); |
1721 __ vceq(Neon32, dst, i.InputSimd128Register(0), | 1717 __ vceq(Neon32, dst, i.InputSimd128Register(0), |
1722 i.InputSimd128Register(1)); | 1718 i.InputSimd128Register(1)); |
1723 __ vmvn(dst, dst); | 1719 __ vmvn(dst, dst); |
1724 break; | 1720 break; |
1725 } | 1721 } |
1726 case kArmInt32x4LessThan: { | 1722 case kArmI32x4LtS: { |
1727 __ vcgt(NeonS32, i.OutputSimd128Register(), i.InputSimd128Register(1), | 1723 __ vcgt(NeonS32, i.OutputSimd128Register(), i.InputSimd128Register(1), |
1728 i.InputSimd128Register(0)); | 1724 i.InputSimd128Register(0)); |
1729 break; | 1725 break; |
1730 } | 1726 } |
1731 case kArmInt32x4LessThanOrEqual: { | 1727 case kArmI32x4LeS: { |
1732 __ vcge(NeonS32, i.OutputSimd128Register(), i.InputSimd128Register(1), | 1728 __ vcge(NeonS32, i.OutputSimd128Register(), i.InputSimd128Register(1), |
1733 i.InputSimd128Register(0)); | 1729 i.InputSimd128Register(0)); |
1734 break; | 1730 break; |
1735 } | 1731 } |
1736 case kArmUint32x4ShiftRightByScalar: { | 1732 case kArmI32x4UConvertF32x4: { |
| 1733 __ vcvt_u32_f32(i.OutputSimd128Register(), i.InputSimd128Register(0)); |
| 1734 break; |
| 1735 } |
| 1736 case kArmI32x4ShrU: { |
1737 __ vshr(NeonU32, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1737 __ vshr(NeonU32, i.OutputSimd128Register(), i.InputSimd128Register(0), |
1738 i.InputInt5(1)); | 1738 i.InputInt5(1)); |
1739 break; | 1739 break; |
1740 } | 1740 } |
1741 case kArmUint32x4Min: { | 1741 case kArmI32x4MinU: { |
1742 __ vmin(NeonU32, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1742 __ vmin(NeonU32, i.OutputSimd128Register(), i.InputSimd128Register(0), |
1743 i.InputSimd128Register(1)); | 1743 i.InputSimd128Register(1)); |
1744 break; | 1744 break; |
1745 } | 1745 } |
1746 case kArmUint32x4Max: { | 1746 case kArmI32x4MaxU: { |
1747 __ vmax(NeonU32, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1747 __ vmax(NeonU32, i.OutputSimd128Register(), i.InputSimd128Register(0), |
1748 i.InputSimd128Register(1)); | 1748 i.InputSimd128Register(1)); |
1749 break; | 1749 break; |
1750 } | 1750 } |
1751 case kArmUint32x4LessThan: { | 1751 case kArmI32x4LtU: { |
1752 __ vcgt(NeonU32, i.OutputSimd128Register(), i.InputSimd128Register(1), | 1752 __ vcgt(NeonU32, i.OutputSimd128Register(), i.InputSimd128Register(1), |
1753 i.InputSimd128Register(0)); | 1753 i.InputSimd128Register(0)); |
1754 break; | 1754 break; |
1755 } | 1755 } |
1756 case kArmUint32x4LessThanOrEqual: { | 1756 case kArmI32x4LeU: { |
1757 __ vcge(NeonU32, i.OutputSimd128Register(), i.InputSimd128Register(1), | 1757 __ vcge(NeonU32, i.OutputSimd128Register(), i.InputSimd128Register(1), |
1758 i.InputSimd128Register(0)); | 1758 i.InputSimd128Register(0)); |
1759 break; | 1759 break; |
1760 } | 1760 } |
1761 case kArmInt16x8Splat: { | 1761 case kArmI16x8Splat: { |
1762 __ vdup(Neon16, i.OutputSimd128Register(), i.InputRegister(0)); | 1762 __ vdup(Neon16, i.OutputSimd128Register(), i.InputRegister(0)); |
1763 break; | 1763 break; |
1764 } | 1764 } |
1765 case kArmInt16x8ExtractLane: { | 1765 case kArmI16x8ExtractLane: { |
1766 __ ExtractLane(i.OutputRegister(), i.InputSimd128Register(0), NeonS16, | 1766 __ ExtractLane(i.OutputRegister(), i.InputSimd128Register(0), NeonS16, |
1767 i.InputInt8(1)); | 1767 i.InputInt8(1)); |
1768 break; | 1768 break; |
1769 } | 1769 } |
1770 case kArmInt16x8ReplaceLane: { | 1770 case kArmI16x8ReplaceLane: { |
1771 __ ReplaceLane(i.OutputSimd128Register(), i.InputSimd128Register(0), | 1771 __ ReplaceLane(i.OutputSimd128Register(), i.InputSimd128Register(0), |
1772 i.InputRegister(2), NeonS16, i.InputInt8(1)); | 1772 i.InputRegister(2), NeonS16, i.InputInt8(1)); |
1773 break; | 1773 break; |
1774 } | 1774 } |
1775 case kArmInt16x8Neg: { | 1775 case kArmI16x8Neg: { |
1776 __ vneg(Neon16, i.OutputSimd128Register(), i.InputSimd128Register(0)); | 1776 __ vneg(Neon16, i.OutputSimd128Register(), i.InputSimd128Register(0)); |
1777 break; | 1777 break; |
1778 } | 1778 } |
1779 case kArmInt16x8ShiftLeftByScalar: { | 1779 case kArmI16x8Shl: { |
1780 __ vshl(NeonS16, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1780 __ vshl(NeonS16, i.OutputSimd128Register(), i.InputSimd128Register(0), |
1781 i.InputInt4(1)); | 1781 i.InputInt4(1)); |
1782 break; | 1782 break; |
1783 } | 1783 } |
1784 case kArmInt16x8ShiftRightByScalar: { | 1784 case kArmI16x8ShrS: { |
1785 __ vshr(NeonS16, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1785 __ vshr(NeonS16, i.OutputSimd128Register(), i.InputSimd128Register(0), |
1786 i.InputInt4(1)); | 1786 i.InputInt4(1)); |
1787 break; | 1787 break; |
1788 } | 1788 } |
1789 case kArmInt16x8Add: { | 1789 case kArmI16x8Add: { |
1790 __ vadd(Neon16, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1790 __ vadd(Neon16, i.OutputSimd128Register(), i.InputSimd128Register(0), |
1791 i.InputSimd128Register(1)); | 1791 i.InputSimd128Register(1)); |
1792 break; | 1792 break; |
1793 } | 1793 } |
1794 case kArmInt16x8AddSaturate: { | 1794 case kArmI16x8AddSaturate: { |
1795 __ vqadd(NeonS16, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1795 __ vqadd(NeonS16, i.OutputSimd128Register(), i.InputSimd128Register(0), |
1796 i.InputSimd128Register(1)); | 1796 i.InputSimd128Register(1)); |
1797 break; | 1797 break; |
1798 } | 1798 } |
1799 case kArmInt16x8Sub: { | 1799 case kArmI16x8Sub: { |
1800 __ vsub(Neon16, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1800 __ vsub(Neon16, i.OutputSimd128Register(), i.InputSimd128Register(0), |
1801 i.InputSimd128Register(1)); | 1801 i.InputSimd128Register(1)); |
1802 break; | 1802 break; |
1803 } | 1803 } |
1804 case kArmInt16x8SubSaturate: { | 1804 case kArmI16x8SubSaturate: { |
1805 __ vqsub(NeonS16, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1805 __ vqsub(NeonS16, i.OutputSimd128Register(), i.InputSimd128Register(0), |
1806 i.InputSimd128Register(1)); | 1806 i.InputSimd128Register(1)); |
1807 break; | 1807 break; |
1808 } | 1808 } |
1809 case kArmInt16x8Mul: { | 1809 case kArmI16x8Mul: { |
1810 __ vmul(Neon16, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1810 __ vmul(Neon16, i.OutputSimd128Register(), i.InputSimd128Register(0), |
1811 i.InputSimd128Register(1)); | 1811 i.InputSimd128Register(1)); |
1812 break; | 1812 break; |
1813 } | 1813 } |
1814 case kArmInt16x8Min: { | 1814 case kArmI16x8MinS: { |
1815 __ vmin(NeonS16, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1815 __ vmin(NeonS16, i.OutputSimd128Register(), i.InputSimd128Register(0), |
1816 i.InputSimd128Register(1)); | 1816 i.InputSimd128Register(1)); |
1817 break; | 1817 break; |
1818 } | 1818 } |
1819 case kArmInt16x8Max: { | 1819 case kArmI16x8MaxS: { |
1820 __ vmax(NeonS16, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1820 __ vmax(NeonS16, i.OutputSimd128Register(), i.InputSimd128Register(0), |
1821 i.InputSimd128Register(1)); | 1821 i.InputSimd128Register(1)); |
1822 break; | 1822 break; |
1823 } | 1823 } |
1824 case kArmInt16x8Equal: { | 1824 case kArmI16x8Eq: { |
1825 __ vceq(Neon16, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1825 __ vceq(Neon16, i.OutputSimd128Register(), i.InputSimd128Register(0), |
1826 i.InputSimd128Register(1)); | 1826 i.InputSimd128Register(1)); |
1827 break; | 1827 break; |
1828 } | 1828 } |
1829 case kArmInt16x8NotEqual: { | 1829 case kArmI16x8Ne: { |
1830 Simd128Register dst = i.OutputSimd128Register(); | 1830 Simd128Register dst = i.OutputSimd128Register(); |
1831 __ vceq(Neon16, dst, i.InputSimd128Register(0), | 1831 __ vceq(Neon16, dst, i.InputSimd128Register(0), |
1832 i.InputSimd128Register(1)); | 1832 i.InputSimd128Register(1)); |
1833 __ vmvn(dst, dst); | 1833 __ vmvn(dst, dst); |
1834 break; | 1834 break; |
1835 } | 1835 } |
1836 case kArmInt16x8LessThan: { | 1836 case kArmI16x8LtS: { |
1837 __ vcgt(NeonS16, i.OutputSimd128Register(), i.InputSimd128Register(1), | 1837 __ vcgt(NeonS16, i.OutputSimd128Register(), i.InputSimd128Register(1), |
1838 i.InputSimd128Register(0)); | 1838 i.InputSimd128Register(0)); |
1839 break; | 1839 break; |
1840 } | 1840 } |
1841 case kArmInt16x8LessThanOrEqual: { | 1841 case kArmI16x8LeS: { |
1842 __ vcge(NeonS16, i.OutputSimd128Register(), i.InputSimd128Register(1), | 1842 __ vcge(NeonS16, i.OutputSimd128Register(), i.InputSimd128Register(1), |
1843 i.InputSimd128Register(0)); | 1843 i.InputSimd128Register(0)); |
1844 break; | 1844 break; |
1845 } | 1845 } |
1846 case kArmUint16x8ShiftRightByScalar: { | 1846 case kArmI16x8ShrU: { |
1847 __ vshr(NeonU16, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1847 __ vshr(NeonU16, i.OutputSimd128Register(), i.InputSimd128Register(0), |
1848 i.InputInt4(1)); | 1848 i.InputInt4(1)); |
1849 break; | 1849 break; |
1850 } | 1850 } |
1851 case kArmUint16x8AddSaturate: { | 1851 case kArmI16x8AddSaturateU: { |
1852 __ vqadd(NeonU16, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1852 __ vqadd(NeonU16, i.OutputSimd128Register(), i.InputSimd128Register(0), |
1853 i.InputSimd128Register(1)); | 1853 i.InputSimd128Register(1)); |
1854 break; | 1854 break; |
1855 } | 1855 } |
1856 case kArmUint16x8SubSaturate: { | 1856 case kArmI16x8SubSaturateU: { |
1857 __ vqsub(NeonU16, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1857 __ vqsub(NeonU16, i.OutputSimd128Register(), i.InputSimd128Register(0), |
1858 i.InputSimd128Register(1)); | 1858 i.InputSimd128Register(1)); |
1859 break; | 1859 break; |
1860 } | 1860 } |
1861 case kArmUint16x8Min: { | 1861 case kArmI16x8MinU: { |
1862 __ vmin(NeonU16, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1862 __ vmin(NeonU16, i.OutputSimd128Register(), i.InputSimd128Register(0), |
1863 i.InputSimd128Register(1)); | 1863 i.InputSimd128Register(1)); |
1864 break; | 1864 break; |
1865 } | 1865 } |
1866 case kArmUint16x8Max: { | 1866 case kArmI16x8MaxU: { |
1867 __ vmax(NeonU16, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1867 __ vmax(NeonU16, i.OutputSimd128Register(), i.InputSimd128Register(0), |
1868 i.InputSimd128Register(1)); | 1868 i.InputSimd128Register(1)); |
1869 break; | 1869 break; |
1870 } | 1870 } |
1871 case kArmUint16x8LessThan: { | 1871 case kArmI16x8LtU: { |
1872 __ vcgt(NeonU16, i.OutputSimd128Register(), i.InputSimd128Register(1), | 1872 __ vcgt(NeonU16, i.OutputSimd128Register(), i.InputSimd128Register(1), |
1873 i.InputSimd128Register(0)); | 1873 i.InputSimd128Register(0)); |
1874 break; | 1874 break; |
1875 } | 1875 } |
1876 case kArmUint16x8LessThanOrEqual: { | 1876 case kArmI16x8LeU: { |
1877 __ vcge(NeonU16, i.OutputSimd128Register(), i.InputSimd128Register(1), | 1877 __ vcge(NeonU16, i.OutputSimd128Register(), i.InputSimd128Register(1), |
1878 i.InputSimd128Register(0)); | 1878 i.InputSimd128Register(0)); |
1879 break; | 1879 break; |
1880 } | 1880 } |
1881 case kArmInt8x16Splat: { | 1881 case kArmI8x16Splat: { |
1882 __ vdup(Neon8, i.OutputSimd128Register(), i.InputRegister(0)); | 1882 __ vdup(Neon8, i.OutputSimd128Register(), i.InputRegister(0)); |
1883 break; | 1883 break; |
1884 } | 1884 } |
1885 case kArmInt8x16ExtractLane: { | 1885 case kArmI8x16ExtractLane: { |
1886 __ ExtractLane(i.OutputRegister(), i.InputSimd128Register(0), NeonS8, | 1886 __ ExtractLane(i.OutputRegister(), i.InputSimd128Register(0), NeonS8, |
1887 i.InputInt8(1)); | 1887 i.InputInt8(1)); |
1888 break; | 1888 break; |
1889 } | 1889 } |
1890 case kArmInt8x16ReplaceLane: { | 1890 case kArmI8x16ReplaceLane: { |
1891 __ ReplaceLane(i.OutputSimd128Register(), i.InputSimd128Register(0), | 1891 __ ReplaceLane(i.OutputSimd128Register(), i.InputSimd128Register(0), |
1892 i.InputRegister(2), NeonS8, i.InputInt8(1)); | 1892 i.InputRegister(2), NeonS8, i.InputInt8(1)); |
1893 break; | 1893 break; |
1894 } | 1894 } |
1895 case kArmInt8x16Neg: { | 1895 case kArmI8x16Neg: { |
1896 __ vneg(Neon8, i.OutputSimd128Register(), i.InputSimd128Register(0)); | 1896 __ vneg(Neon8, i.OutputSimd128Register(), i.InputSimd128Register(0)); |
1897 break; | 1897 break; |
1898 } | 1898 } |
1899 case kArmInt8x16ShiftLeftByScalar: { | 1899 case kArmI8x16Shl: { |
1900 __ vshl(NeonS8, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1900 __ vshl(NeonS8, i.OutputSimd128Register(), i.InputSimd128Register(0), |
1901 i.InputInt3(1)); | 1901 i.InputInt3(1)); |
1902 break; | 1902 break; |
1903 } | 1903 } |
1904 case kArmInt8x16ShiftRightByScalar: { | 1904 case kArmI8x16ShrS: { |
1905 __ vshr(NeonS8, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1905 __ vshr(NeonS8, i.OutputSimd128Register(), i.InputSimd128Register(0), |
1906 i.InputInt3(1)); | 1906 i.InputInt3(1)); |
1907 break; | 1907 break; |
1908 } | 1908 } |
1909 case kArmInt8x16Add: { | 1909 case kArmI8x16Add: { |
1910 __ vadd(Neon8, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1910 __ vadd(Neon8, i.OutputSimd128Register(), i.InputSimd128Register(0), |
1911 i.InputSimd128Register(1)); | 1911 i.InputSimd128Register(1)); |
1912 break; | 1912 break; |
1913 } | 1913 } |
1914 case kArmInt8x16AddSaturate: { | 1914 case kArmI8x16AddSaturate: { |
1915 __ vqadd(NeonS8, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1915 __ vqadd(NeonS8, i.OutputSimd128Register(), i.InputSimd128Register(0), |
1916 i.InputSimd128Register(1)); | 1916 i.InputSimd128Register(1)); |
1917 break; | 1917 break; |
1918 } | 1918 } |
1919 case kArmInt8x16Sub: { | 1919 case kArmI8x16Sub: { |
1920 __ vsub(Neon8, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1920 __ vsub(Neon8, i.OutputSimd128Register(), i.InputSimd128Register(0), |
1921 i.InputSimd128Register(1)); | 1921 i.InputSimd128Register(1)); |
1922 break; | 1922 break; |
1923 } | 1923 } |
1924 case kArmInt8x16SubSaturate: { | 1924 case kArmI8x16SubSaturate: { |
1925 __ vqsub(NeonS8, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1925 __ vqsub(NeonS8, i.OutputSimd128Register(), i.InputSimd128Register(0), |
1926 i.InputSimd128Register(1)); | 1926 i.InputSimd128Register(1)); |
1927 break; | 1927 break; |
1928 } | 1928 } |
1929 case kArmInt8x16Mul: { | 1929 case kArmI8x16Mul: { |
1930 __ vmul(Neon8, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1930 __ vmul(Neon8, i.OutputSimd128Register(), i.InputSimd128Register(0), |
1931 i.InputSimd128Register(1)); | 1931 i.InputSimd128Register(1)); |
1932 break; | 1932 break; |
1933 } | 1933 } |
1934 case kArmInt8x16Min: { | 1934 case kArmI8x16MinS: { |
1935 __ vmin(NeonS8, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1935 __ vmin(NeonS8, i.OutputSimd128Register(), i.InputSimd128Register(0), |
1936 i.InputSimd128Register(1)); | 1936 i.InputSimd128Register(1)); |
1937 break; | 1937 break; |
1938 } | 1938 } |
1939 case kArmInt8x16Max: { | 1939 case kArmI8x16MaxS: { |
1940 __ vmax(NeonS8, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1940 __ vmax(NeonS8, i.OutputSimd128Register(), i.InputSimd128Register(0), |
1941 i.InputSimd128Register(1)); | 1941 i.InputSimd128Register(1)); |
1942 break; | 1942 break; |
1943 } | 1943 } |
1944 case kArmInt8x16Equal: { | 1944 case kArmI8x16Eq: { |
1945 __ vceq(Neon8, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1945 __ vceq(Neon8, i.OutputSimd128Register(), i.InputSimd128Register(0), |
1946 i.InputSimd128Register(1)); | 1946 i.InputSimd128Register(1)); |
1947 break; | 1947 break; |
1948 } | 1948 } |
1949 case kArmInt8x16NotEqual: { | 1949 case kArmI8x16Ne: { |
1950 Simd128Register dst = i.OutputSimd128Register(); | 1950 Simd128Register dst = i.OutputSimd128Register(); |
1951 __ vceq(Neon8, dst, i.InputSimd128Register(0), i.InputSimd128Register(1)); | 1951 __ vceq(Neon8, dst, i.InputSimd128Register(0), i.InputSimd128Register(1)); |
1952 __ vmvn(dst, dst); | 1952 __ vmvn(dst, dst); |
1953 break; | 1953 break; |
1954 } | 1954 } |
1955 case kArmInt8x16LessThan: { | 1955 case kArmI8x16LtS: { |
1956 __ vcgt(NeonS8, i.OutputSimd128Register(), i.InputSimd128Register(1), | 1956 __ vcgt(NeonS8, i.OutputSimd128Register(), i.InputSimd128Register(1), |
1957 i.InputSimd128Register(0)); | 1957 i.InputSimd128Register(0)); |
1958 break; | 1958 break; |
1959 } | 1959 } |
1960 case kArmInt8x16LessThanOrEqual: { | 1960 case kArmI8x16LeS: { |
1961 __ vcge(NeonS8, i.OutputSimd128Register(), i.InputSimd128Register(1), | 1961 __ vcge(NeonS8, i.OutputSimd128Register(), i.InputSimd128Register(1), |
1962 i.InputSimd128Register(0)); | 1962 i.InputSimd128Register(0)); |
1963 break; | 1963 break; |
1964 } | 1964 } |
1965 case kArmUint8x16ShiftRightByScalar: { | 1965 case kArmI8x16ShrU: { |
1966 __ vshr(NeonU8, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1966 __ vshr(NeonU8, i.OutputSimd128Register(), i.InputSimd128Register(0), |
1967 i.InputInt3(1)); | 1967 i.InputInt3(1)); |
1968 break; | 1968 break; |
1969 } | 1969 } |
1970 case kArmUint8x16AddSaturate: { | 1970 case kArmI8x16AddSaturateU: { |
1971 __ vqadd(NeonU8, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1971 __ vqadd(NeonU8, i.OutputSimd128Register(), i.InputSimd128Register(0), |
1972 i.InputSimd128Register(1)); | 1972 i.InputSimd128Register(1)); |
1973 break; | 1973 break; |
1974 } | 1974 } |
1975 case kArmUint8x16SubSaturate: { | 1975 case kArmI8x16SubSaturateU: { |
1976 __ vqsub(NeonU8, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1976 __ vqsub(NeonU8, i.OutputSimd128Register(), i.InputSimd128Register(0), |
1977 i.InputSimd128Register(1)); | 1977 i.InputSimd128Register(1)); |
1978 break; | 1978 break; |
1979 } | 1979 } |
1980 case kArmUint8x16Min: { | 1980 case kArmI8x16MinU: { |
1981 __ vmin(NeonU8, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1981 __ vmin(NeonU8, i.OutputSimd128Register(), i.InputSimd128Register(0), |
1982 i.InputSimd128Register(1)); | 1982 i.InputSimd128Register(1)); |
1983 break; | 1983 break; |
1984 } | 1984 } |
1985 case kArmUint8x16Max: { | 1985 case kArmI8x16MaxU: { |
1986 __ vmax(NeonU8, i.OutputSimd128Register(), i.InputSimd128Register(0), | 1986 __ vmax(NeonU8, i.OutputSimd128Register(), i.InputSimd128Register(0), |
1987 i.InputSimd128Register(1)); | 1987 i.InputSimd128Register(1)); |
1988 break; | 1988 break; |
1989 } | 1989 } |
1990 case kArmUint8x16LessThan: { | 1990 case kArmI8x16LtU: { |
1991 __ vcgt(NeonU8, i.OutputSimd128Register(), i.InputSimd128Register(1), | 1991 __ vcgt(NeonU8, i.OutputSimd128Register(), i.InputSimd128Register(1), |
1992 i.InputSimd128Register(0)); | 1992 i.InputSimd128Register(0)); |
1993 break; | 1993 break; |
1994 } | 1994 } |
1995 case kArmUint8x16LessThanOrEqual: { | 1995 case kArmI8x16LeU: { |
1996 __ vcge(NeonU8, i.OutputSimd128Register(), i.InputSimd128Register(1), | 1996 __ vcge(NeonU8, i.OutputSimd128Register(), i.InputSimd128Register(1), |
1997 i.InputSimd128Register(0)); | 1997 i.InputSimd128Register(0)); |
1998 break; | 1998 break; |
1999 } | 1999 } |
2000 case kArmSimd128Zero: { | 2000 case kArmS128Zero: { |
2001 __ veor(i.OutputSimd128Register(), i.OutputSimd128Register(), | 2001 __ veor(i.OutputSimd128Register(), i.OutputSimd128Register(), |
2002 i.OutputSimd128Register()); | 2002 i.OutputSimd128Register()); |
2003 break; | 2003 break; |
2004 } | 2004 } |
2005 case kArmSimd128And: { | 2005 case kArmS128And: { |
2006 __ vand(i.OutputSimd128Register(), i.InputSimd128Register(0), | 2006 __ vand(i.OutputSimd128Register(), i.InputSimd128Register(0), |
2007 i.InputSimd128Register(1)); | 2007 i.InputSimd128Register(1)); |
2008 break; | 2008 break; |
2009 } | 2009 } |
2010 case kArmSimd128Or: { | 2010 case kArmS128Or: { |
2011 __ vorr(i.OutputSimd128Register(), i.InputSimd128Register(0), | 2011 __ vorr(i.OutputSimd128Register(), i.InputSimd128Register(0), |
2012 i.InputSimd128Register(1)); | 2012 i.InputSimd128Register(1)); |
2013 break; | 2013 break; |
2014 } | 2014 } |
2015 case kArmSimd128Xor: { | 2015 case kArmS128Xor: { |
2016 __ veor(i.OutputSimd128Register(), i.InputSimd128Register(0), | 2016 __ veor(i.OutputSimd128Register(), i.InputSimd128Register(0), |
2017 i.InputSimd128Register(1)); | 2017 i.InputSimd128Register(1)); |
2018 break; | 2018 break; |
2019 } | 2019 } |
2020 case kArmSimd128Not: { | 2020 case kArmS128Not: { |
2021 __ vmvn(i.OutputSimd128Register(), i.InputSimd128Register(0)); | 2021 __ vmvn(i.OutputSimd128Register(), i.InputSimd128Register(0)); |
2022 break; | 2022 break; |
2023 } | 2023 } |
2024 case kArmSimd128Select: { | 2024 case kArmS128Select: { |
2025 // vbsl clobbers the mask input so make sure it was DefineSameAsFirst. | 2025 // vbsl clobbers the mask input so make sure it was DefineSameAsFirst. |
2026 DCHECK(i.OutputSimd128Register().is(i.InputSimd128Register(0))); | 2026 DCHECK(i.OutputSimd128Register().is(i.InputSimd128Register(0))); |
2027 __ vbsl(i.OutputSimd128Register(), i.InputSimd128Register(1), | 2027 __ vbsl(i.OutputSimd128Register(), i.InputSimd128Register(1), |
2028 i.InputSimd128Register(2)); | 2028 i.InputSimd128Register(2)); |
2029 break; | 2029 break; |
2030 } | 2030 } |
2031 case kArmSimd1x4AnyTrue: { | 2031 case kArmS1x4AnyTrue: { |
2032 const QwNeonRegister& src = i.InputSimd128Register(0); | 2032 const QwNeonRegister& src = i.InputSimd128Register(0); |
2033 __ vpmax(NeonU32, kScratchDoubleReg, src.low(), src.high()); | 2033 __ vpmax(NeonU32, kScratchDoubleReg, src.low(), src.high()); |
2034 __ vpmax(NeonU32, kScratchDoubleReg, kScratchDoubleReg, | 2034 __ vpmax(NeonU32, kScratchDoubleReg, kScratchDoubleReg, |
2035 kScratchDoubleReg); | 2035 kScratchDoubleReg); |
2036 __ ExtractLane(i.OutputRegister(), kScratchDoubleReg, NeonS32, 0); | 2036 __ ExtractLane(i.OutputRegister(), kScratchDoubleReg, NeonS32, 0); |
2037 break; | 2037 break; |
2038 } | 2038 } |
2039 case kArmSimd1x4AllTrue: { | 2039 case kArmS1x4AllTrue: { |
2040 const QwNeonRegister& src = i.InputSimd128Register(0); | 2040 const QwNeonRegister& src = i.InputSimd128Register(0); |
2041 __ vpmin(NeonU32, kScratchDoubleReg, src.low(), src.high()); | 2041 __ vpmin(NeonU32, kScratchDoubleReg, src.low(), src.high()); |
2042 __ vpmin(NeonU32, kScratchDoubleReg, kScratchDoubleReg, | 2042 __ vpmin(NeonU32, kScratchDoubleReg, kScratchDoubleReg, |
2043 kScratchDoubleReg); | 2043 kScratchDoubleReg); |
2044 __ ExtractLane(i.OutputRegister(), kScratchDoubleReg, NeonS32, 0); | 2044 __ ExtractLane(i.OutputRegister(), kScratchDoubleReg, NeonS32, 0); |
2045 break; | 2045 break; |
2046 } | 2046 } |
2047 case kArmSimd1x8AnyTrue: { | 2047 case kArmS1x8AnyTrue: { |
2048 const QwNeonRegister& src = i.InputSimd128Register(0); | 2048 const QwNeonRegister& src = i.InputSimd128Register(0); |
2049 __ vpmax(NeonU16, kScratchDoubleReg, src.low(), src.high()); | 2049 __ vpmax(NeonU16, kScratchDoubleReg, src.low(), src.high()); |
2050 __ vpmax(NeonU16, kScratchDoubleReg, kScratchDoubleReg, | 2050 __ vpmax(NeonU16, kScratchDoubleReg, kScratchDoubleReg, |
2051 kScratchDoubleReg); | 2051 kScratchDoubleReg); |
2052 __ vpmax(NeonU16, kScratchDoubleReg, kScratchDoubleReg, | 2052 __ vpmax(NeonU16, kScratchDoubleReg, kScratchDoubleReg, |
2053 kScratchDoubleReg); | 2053 kScratchDoubleReg); |
2054 __ ExtractLane(i.OutputRegister(), kScratchDoubleReg, NeonS16, 0); | 2054 __ ExtractLane(i.OutputRegister(), kScratchDoubleReg, NeonS16, 0); |
2055 break; | 2055 break; |
2056 } | 2056 } |
2057 case kArmSimd1x8AllTrue: { | 2057 case kArmS1x8AllTrue: { |
2058 const QwNeonRegister& src = i.InputSimd128Register(0); | 2058 const QwNeonRegister& src = i.InputSimd128Register(0); |
2059 __ vpmin(NeonU16, kScratchDoubleReg, src.low(), src.high()); | 2059 __ vpmin(NeonU16, kScratchDoubleReg, src.low(), src.high()); |
2060 __ vpmin(NeonU16, kScratchDoubleReg, kScratchDoubleReg, | 2060 __ vpmin(NeonU16, kScratchDoubleReg, kScratchDoubleReg, |
2061 kScratchDoubleReg); | 2061 kScratchDoubleReg); |
2062 __ vpmin(NeonU16, kScratchDoubleReg, kScratchDoubleReg, | 2062 __ vpmin(NeonU16, kScratchDoubleReg, kScratchDoubleReg, |
2063 kScratchDoubleReg); | 2063 kScratchDoubleReg); |
2064 __ ExtractLane(i.OutputRegister(), kScratchDoubleReg, NeonS16, 0); | 2064 __ ExtractLane(i.OutputRegister(), kScratchDoubleReg, NeonS16, 0); |
2065 break; | 2065 break; |
2066 } | 2066 } |
2067 case kArmSimd1x16AnyTrue: { | 2067 case kArmS1x16AnyTrue: { |
2068 const QwNeonRegister& src = i.InputSimd128Register(0); | 2068 const QwNeonRegister& src = i.InputSimd128Register(0); |
2069 __ vpmax(NeonU8, kScratchDoubleReg, src.low(), src.high()); | 2069 __ vpmax(NeonU8, kScratchDoubleReg, src.low(), src.high()); |
2070 __ vpmax(NeonU8, kScratchDoubleReg, kScratchDoubleReg, kScratchDoubleReg); | 2070 __ vpmax(NeonU8, kScratchDoubleReg, kScratchDoubleReg, kScratchDoubleReg); |
2071 // vtst to detect any bits in the bottom 32 bits of kScratchDoubleReg. | 2071 // vtst to detect any bits in the bottom 32 bits of kScratchDoubleReg. |
2072 // This saves an instruction vs. the naive sequence of vpmax. | 2072 // This saves an instruction vs. the naive sequence of vpmax. |
2073 // kDoubleRegZero is not changed, since it is 0. | 2073 // kDoubleRegZero is not changed, since it is 0. |
2074 __ vtst(Neon32, kScratchQuadReg, kScratchQuadReg, kScratchQuadReg); | 2074 __ vtst(Neon32, kScratchQuadReg, kScratchQuadReg, kScratchQuadReg); |
2075 __ ExtractLane(i.OutputRegister(), kScratchDoubleReg, NeonS32, 0); | 2075 __ ExtractLane(i.OutputRegister(), kScratchDoubleReg, NeonS32, 0); |
2076 break; | 2076 break; |
2077 } | 2077 } |
2078 case kArmSimd1x16AllTrue: { | 2078 case kArmS1x16AllTrue: { |
2079 const QwNeonRegister& src = i.InputSimd128Register(0); | 2079 const QwNeonRegister& src = i.InputSimd128Register(0); |
2080 __ vpmin(NeonU8, kScratchDoubleReg, src.low(), src.high()); | 2080 __ vpmin(NeonU8, kScratchDoubleReg, src.low(), src.high()); |
2081 __ vpmin(NeonU8, kScratchDoubleReg, kScratchDoubleReg, kScratchDoubleReg); | 2081 __ vpmin(NeonU8, kScratchDoubleReg, kScratchDoubleReg, kScratchDoubleReg); |
2082 __ vpmin(NeonU8, kScratchDoubleReg, kScratchDoubleReg, kScratchDoubleReg); | 2082 __ vpmin(NeonU8, kScratchDoubleReg, kScratchDoubleReg, kScratchDoubleReg); |
2083 __ vpmin(NeonU8, kScratchDoubleReg, kScratchDoubleReg, kScratchDoubleReg); | 2083 __ vpmin(NeonU8, kScratchDoubleReg, kScratchDoubleReg, kScratchDoubleReg); |
2084 __ ExtractLane(i.OutputRegister(), kScratchDoubleReg, NeonS8, 0); | 2084 __ ExtractLane(i.OutputRegister(), kScratchDoubleReg, NeonS8, 0); |
2085 break; | 2085 break; |
2086 } | 2086 } |
2087 case kCheckedLoadInt8: | 2087 case kCheckedLoadInt8: |
2088 ASSEMBLE_CHECKED_LOAD_INTEGER(ldrsb); | 2088 ASSEMBLE_CHECKED_LOAD_INTEGER(ldrsb); |
(...skipping 742 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2831 padding_size -= v8::internal::Assembler::kInstrSize; | 2831 padding_size -= v8::internal::Assembler::kInstrSize; |
2832 } | 2832 } |
2833 } | 2833 } |
2834 } | 2834 } |
2835 | 2835 |
2836 #undef __ | 2836 #undef __ |
2837 | 2837 |
2838 } // namespace compiler | 2838 } // namespace compiler |
2839 } // namespace internal | 2839 } // namespace internal |
2840 } // namespace v8 | 2840 } // namespace v8 |
OLD | NEW |