OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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/code-stubs.h" | 5 #include "src/code-stubs.h" |
6 | 6 |
7 #include <sstream> | 7 #include <sstream> |
8 | 8 |
9 #include "src/bootstrapper.h" | 9 #include "src/bootstrapper.h" |
10 #include "src/code-factory.h" | 10 #include "src/code-factory.h" |
(...skipping 1621 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1632 compiler::Node* right, | 1632 compiler::Node* right, |
1633 compiler::Node* context) { | 1633 compiler::Node* context) { |
1634 using compiler::Node; | 1634 using compiler::Node; |
1635 Node* lhs_value = assembler->TruncateTaggedToWord32(context, left); | 1635 Node* lhs_value = assembler->TruncateTaggedToWord32(context, left); |
1636 Node* rhs_value = assembler->TruncateTaggedToWord32(context, right); | 1636 Node* rhs_value = assembler->TruncateTaggedToWord32(context, right); |
1637 Node* value = assembler->Word32Xor(lhs_value, rhs_value); | 1637 Node* value = assembler->Word32Xor(lhs_value, rhs_value); |
1638 Node* result = assembler->ChangeInt32ToTagged(value); | 1638 Node* result = assembler->ChangeInt32ToTagged(value); |
1639 return result; | 1639 return result; |
1640 } | 1640 } |
1641 | 1641 |
| 1642 void IncStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
| 1643 typedef CodeStubAssembler::Label Label; |
| 1644 typedef compiler::Node Node; |
| 1645 typedef CodeStubAssembler::Variable Variable; |
| 1646 |
| 1647 Node* context = assembler->Parameter(1); |
| 1648 |
| 1649 // Shared entry for floating point increment. |
| 1650 Label do_finc(assembler); |
| 1651 Variable var_finc_value(assembler, MachineRepresentation::kFloat64); |
| 1652 |
| 1653 // We might need to try again due to ToNumber conversion. |
| 1654 Variable value_var(assembler, MachineRepresentation::kTagged); |
| 1655 Label start(assembler, &value_var); |
| 1656 value_var.Bind(assembler->Parameter(0)); |
| 1657 assembler->Goto(&start); |
| 1658 assembler->Bind(&start); |
| 1659 { |
| 1660 Node* value = value_var.value(); |
| 1661 |
| 1662 Label if_issmi(assembler), if_isnotsmi(assembler); |
| 1663 assembler->Branch(assembler->WordIsSmi(value), &if_issmi, &if_isnotsmi); |
| 1664 |
| 1665 assembler->Bind(&if_issmi); |
| 1666 { |
| 1667 // Try fast Smi addition first. |
| 1668 Node* one = assembler->SmiConstant(Smi::FromInt(1)); |
| 1669 Node* pair = assembler->SmiAddWithOverflow(value, one); |
| 1670 Node* overflow = assembler->Projection(1, pair); |
| 1671 |
| 1672 // Check if the Smi additon overflowed. |
| 1673 Label if_overflow(assembler), if_notoverflow(assembler); |
| 1674 assembler->Branch(overflow, &if_overflow, &if_notoverflow); |
| 1675 |
| 1676 assembler->Bind(&if_notoverflow); |
| 1677 assembler->Return(assembler->Projection(0, pair)); |
| 1678 |
| 1679 assembler->Bind(&if_overflow); |
| 1680 { |
| 1681 var_finc_value.Bind(assembler->SmiToFloat64(value)); |
| 1682 assembler->Goto(&do_finc); |
| 1683 } |
| 1684 } |
| 1685 |
| 1686 assembler->Bind(&if_isnotsmi); |
| 1687 { |
| 1688 // Check if the value is a HeapNumber. |
| 1689 Label if_valueisnumber(assembler), |
| 1690 if_valuenotnumber(assembler, Label::kDeferred); |
| 1691 Node* value_map = assembler->LoadMap(value); |
| 1692 Node* number_map = assembler->HeapNumberMapConstant(); |
| 1693 assembler->Branch(assembler->WordEqual(value_map, number_map), |
| 1694 &if_valueisnumber, &if_valuenotnumber); |
| 1695 |
| 1696 assembler->Bind(&if_valueisnumber); |
| 1697 { |
| 1698 // Load the HeapNumber value. |
| 1699 var_finc_value.Bind(assembler->LoadHeapNumberValue(value)); |
| 1700 assembler->Goto(&do_finc); |
| 1701 } |
| 1702 |
| 1703 assembler->Bind(&if_valuenotnumber); |
| 1704 { |
| 1705 // Convert to a Number first and try again. |
| 1706 Callable callable = CodeFactory::NonNumberToNumber(isolate()); |
| 1707 value_var.Bind(assembler->CallStub(callable, context, value)); |
| 1708 assembler->Goto(&start); |
| 1709 } |
| 1710 } |
| 1711 } |
| 1712 |
| 1713 assembler->Bind(&do_finc); |
| 1714 { |
| 1715 Node* finc_value = var_finc_value.value(); |
| 1716 Node* one = assembler->Float64Constant(1.0); |
| 1717 Node* finc_result = assembler->Float64Add(finc_value, one); |
| 1718 Node* result = assembler->ChangeFloat64ToTagged(finc_result); |
| 1719 assembler->Return(result); |
| 1720 } |
| 1721 } |
| 1722 |
| 1723 void DecStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
| 1724 typedef CodeStubAssembler::Label Label; |
| 1725 typedef compiler::Node Node; |
| 1726 typedef CodeStubAssembler::Variable Variable; |
| 1727 |
| 1728 Node* context = assembler->Parameter(1); |
| 1729 |
| 1730 // Shared entry for floating point decrement. |
| 1731 Label do_fdec(assembler); |
| 1732 Variable var_fdec_value(assembler, MachineRepresentation::kFloat64); |
| 1733 |
| 1734 // We might need to try again due to ToNumber conversion. |
| 1735 Variable value_var(assembler, MachineRepresentation::kTagged); |
| 1736 Label start(assembler, &value_var); |
| 1737 value_var.Bind(assembler->Parameter(0)); |
| 1738 assembler->Goto(&start); |
| 1739 assembler->Bind(&start); |
| 1740 { |
| 1741 Node* value = value_var.value(); |
| 1742 |
| 1743 Label if_issmi(assembler), if_isnotsmi(assembler); |
| 1744 assembler->Branch(assembler->WordIsSmi(value), &if_issmi, &if_isnotsmi); |
| 1745 |
| 1746 assembler->Bind(&if_issmi); |
| 1747 { |
| 1748 // Try fast Smi subtraction first. |
| 1749 Node* one = assembler->SmiConstant(Smi::FromInt(1)); |
| 1750 Node* pair = assembler->SmiSubWithOverflow(value, one); |
| 1751 Node* overflow = assembler->Projection(1, pair); |
| 1752 |
| 1753 // Check if the Smi subtraction overflowed. |
| 1754 Label if_overflow(assembler), if_notoverflow(assembler); |
| 1755 assembler->Branch(overflow, &if_overflow, &if_notoverflow); |
| 1756 |
| 1757 assembler->Bind(&if_notoverflow); |
| 1758 assembler->Return(assembler->Projection(0, pair)); |
| 1759 |
| 1760 assembler->Bind(&if_overflow); |
| 1761 { |
| 1762 var_fdec_value.Bind(assembler->SmiToFloat64(value)); |
| 1763 assembler->Goto(&do_fdec); |
| 1764 } |
| 1765 } |
| 1766 |
| 1767 assembler->Bind(&if_isnotsmi); |
| 1768 { |
| 1769 // Check if the value is a HeapNumber. |
| 1770 Label if_valueisnumber(assembler), |
| 1771 if_valuenotnumber(assembler, Label::kDeferred); |
| 1772 Node* value_map = assembler->LoadMap(value); |
| 1773 Node* number_map = assembler->HeapNumberMapConstant(); |
| 1774 assembler->Branch(assembler->WordEqual(value_map, number_map), |
| 1775 &if_valueisnumber, &if_valuenotnumber); |
| 1776 |
| 1777 assembler->Bind(&if_valueisnumber); |
| 1778 { |
| 1779 // Load the HeapNumber value. |
| 1780 var_fdec_value.Bind(assembler->LoadHeapNumberValue(value)); |
| 1781 assembler->Goto(&do_fdec); |
| 1782 } |
| 1783 |
| 1784 assembler->Bind(&if_valuenotnumber); |
| 1785 { |
| 1786 // Convert to a Number first and try again. |
| 1787 Callable callable = CodeFactory::NonNumberToNumber(isolate()); |
| 1788 value_var.Bind(assembler->CallStub(callable, context, value)); |
| 1789 assembler->Goto(&start); |
| 1790 } |
| 1791 } |
| 1792 } |
| 1793 |
| 1794 assembler->Bind(&do_fdec); |
| 1795 { |
| 1796 Node* fdec_value = var_fdec_value.value(); |
| 1797 Node* one = assembler->Float64Constant(1.0); |
| 1798 Node* fdec_result = assembler->Float64Sub(fdec_value, one); |
| 1799 Node* result = assembler->ChangeFloat64ToTagged(fdec_result); |
| 1800 assembler->Return(result); |
| 1801 } |
| 1802 } |
| 1803 |
1642 namespace { | 1804 namespace { |
1643 | 1805 |
1644 enum RelationalComparisonMode { | 1806 enum RelationalComparisonMode { |
1645 kLessThan, | 1807 kLessThan, |
1646 kLessThanOrEqual, | 1808 kLessThanOrEqual, |
1647 kGreaterThan, | 1809 kGreaterThan, |
1648 kGreaterThanOrEqual | 1810 kGreaterThanOrEqual |
1649 }; | 1811 }; |
1650 | 1812 |
1651 void GenerateAbstractRelationalComparison(CodeStubAssembler* assembler, | 1813 void GenerateAbstractRelationalComparison(CodeStubAssembler* assembler, |
(...skipping 2492 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4144 if (type->Is(Type::UntaggedPointer())) { | 4306 if (type->Is(Type::UntaggedPointer())) { |
4145 return Representation::External(); | 4307 return Representation::External(); |
4146 } | 4308 } |
4147 | 4309 |
4148 DCHECK(!type->Is(Type::Untagged())); | 4310 DCHECK(!type->Is(Type::Untagged())); |
4149 return Representation::Tagged(); | 4311 return Representation::Tagged(); |
4150 } | 4312 } |
4151 | 4313 |
4152 } // namespace internal | 4314 } // namespace internal |
4153 } // namespace v8 | 4315 } // namespace v8 |
OLD | NEW |