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 1590 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1601 Node* lhs = assembler->Parameter(0); | 1601 Node* lhs = assembler->Parameter(0); |
1602 Node* rhs = assembler->Parameter(1); | 1602 Node* rhs = assembler->Parameter(1); |
1603 Node* context = assembler->Parameter(2); | 1603 Node* context = assembler->Parameter(2); |
1604 Node* lhs_value = assembler->TruncateTaggedToWord32(context, lhs); | 1604 Node* lhs_value = assembler->TruncateTaggedToWord32(context, lhs); |
1605 Node* rhs_value = assembler->TruncateTaggedToWord32(context, rhs); | 1605 Node* rhs_value = assembler->TruncateTaggedToWord32(context, rhs); |
1606 Node* value = assembler->Word32Xor(lhs_value, rhs_value); | 1606 Node* value = assembler->Word32Xor(lhs_value, rhs_value); |
1607 Node* result = assembler->ChangeInt32ToTagged(value); | 1607 Node* result = assembler->ChangeInt32ToTagged(value); |
1608 assembler->Return(result); | 1608 assembler->Return(result); |
1609 } | 1609 } |
1610 | 1610 |
1611 void IncStub::GenerateAssembly(CodeStubAssembler* assembler) const { | |
1612 typedef CodeStubAssembler::Label Label; | |
1613 typedef compiler::Node Node; | |
1614 typedef CodeStubAssembler::Variable Variable; | |
1615 | |
1616 Node* context = assembler->Parameter(1); | |
1617 | |
1618 // Shared entry for floating point increment. | |
1619 Label do_finc(assembler); | |
1620 Variable var_finc_value(assembler, MachineRepresentation::kFloat64); | |
1621 | |
1622 // We might need to try again due to ToNumber conversion. | |
1623 Variable value_var(assembler, MachineRepresentation::kTagged); | |
1624 Variable* start_vars[1] = {&value_var}; | |
1625 Label start(assembler, 1, start_vars); | |
Benedikt Meurer
2016/04/21 11:37:35
You can just use Label start(assembler, &value_var
rmcilroy
2016/04/21 13:55:31
I'm sure I tried this first and it didn't work, bu
| |
1626 value_var.Bind(assembler->Parameter(0)); | |
1627 assembler->Goto(&start); | |
1628 assembler->Bind(&start); | |
1629 { | |
1630 Node* value = value_var.value(); | |
1631 | |
1632 Label if_issmi(assembler), if_isnotsmi(assembler); | |
1633 assembler->Branch(assembler->WordIsSmi(value), &if_issmi, &if_isnotsmi); | |
1634 | |
1635 assembler->Bind(&if_issmi); | |
1636 { | |
1637 // Try fast Smi addition first. | |
1638 Node* one = assembler->SmiConstant(Smi::FromInt(1)); | |
1639 Node* pair = assembler->SmiAddWithOverflow(value, one); | |
1640 Node* overflow = assembler->Projection(1, pair); | |
1641 | |
1642 // Check if the Smi additon overflowed. | |
1643 Label if_overflow(assembler), if_notoverflow(assembler); | |
1644 assembler->Branch(overflow, &if_overflow, &if_notoverflow); | |
1645 | |
1646 assembler->Bind(&if_notoverflow); | |
1647 assembler->Return(assembler->Projection(0, pair)); | |
1648 | |
1649 assembler->Bind(&if_overflow); | |
1650 { | |
1651 var_finc_value.Bind(assembler->SmiToFloat64(value)); | |
1652 assembler->Goto(&do_finc); | |
1653 } | |
1654 } | |
1655 | |
1656 assembler->Bind(&if_isnotsmi); | |
1657 { | |
1658 // Check if the value is a HeapNumber. | |
1659 Label if_valueisnumber(assembler), | |
1660 if_valuenotnumber(assembler, Label::kDeferred); | |
1661 Node* value_map = assembler->LoadMap(value); | |
1662 Node* number_map = assembler->HeapNumberMapConstant(); | |
1663 assembler->Branch(assembler->WordEqual(value_map, number_map), | |
1664 &if_valueisnumber, &if_valuenotnumber); | |
1665 | |
1666 assembler->Bind(&if_valueisnumber); | |
1667 { | |
1668 // Load the HeapNumber value. | |
1669 var_finc_value.Bind(assembler->LoadHeapNumberValue(value)); | |
1670 assembler->Goto(&do_finc); | |
1671 } | |
1672 | |
1673 assembler->Bind(&if_valuenotnumber); | |
1674 { | |
1675 // Convert to a Number first and try again. | |
1676 Callable callable = CodeFactory::NonNumberToNumber(isolate()); | |
1677 value_var.Bind(assembler->CallStub(callable, context, value)); | |
1678 assembler->Goto(&start); | |
1679 } | |
1680 } | |
1681 } | |
1682 | |
1683 assembler->Bind(&do_finc); | |
1684 { | |
1685 Node* finc_value = var_finc_value.value(); | |
1686 Node* one = assembler->Float64Constant(1.0); | |
1687 Node* finc_result = assembler->Float64Add(finc_value, one); | |
1688 Node* result = assembler->ChangeFloat64ToTagged(finc_result); | |
1689 assembler->Return(result); | |
1690 } | |
1691 } | |
1692 | |
1693 void DecStub::GenerateAssembly(CodeStubAssembler* assembler) const { | |
1694 typedef CodeStubAssembler::Label Label; | |
1695 typedef compiler::Node Node; | |
1696 typedef CodeStubAssembler::Variable Variable; | |
1697 | |
1698 Node* context = assembler->Parameter(1); | |
1699 | |
1700 // Shared entry for floating point decrement. | |
1701 Label do_fdec(assembler); | |
1702 Variable var_fdec_value(assembler, MachineRepresentation::kFloat64); | |
1703 | |
1704 // We might need to try again due to ToNumber conversion. | |
1705 Variable value_var(assembler, MachineRepresentation::kTagged); | |
1706 Variable* start_vars[1] = {&value_var}; | |
1707 Label start(assembler, 1, start_vars); | |
Benedikt Meurer
2016/04/21 11:37:35
You can just use Label start(assembler, &value_var
rmcilroy
2016/04/21 13:55:31
Done.
| |
1708 value_var.Bind(assembler->Parameter(0)); | |
1709 assembler->Goto(&start); | |
1710 assembler->Bind(&start); | |
1711 { | |
1712 Node* value = value_var.value(); | |
1713 | |
1714 Label if_issmi(assembler), if_isnotsmi(assembler); | |
1715 assembler->Branch(assembler->WordIsSmi(value), &if_issmi, &if_isnotsmi); | |
1716 | |
1717 assembler->Bind(&if_issmi); | |
1718 { | |
1719 // Try fast Smi subtraction first. | |
1720 Node* one = assembler->SmiConstant(Smi::FromInt(1)); | |
1721 Node* pair = assembler->SmiSubWithOverflow(value, one); | |
1722 Node* overflow = assembler->Projection(1, pair); | |
1723 | |
1724 // Check if the Smi subtraction overflowed. | |
1725 Label if_overflow(assembler), if_notoverflow(assembler); | |
1726 assembler->Branch(overflow, &if_overflow, &if_notoverflow); | |
1727 | |
1728 assembler->Bind(&if_notoverflow); | |
1729 assembler->Return(assembler->Projection(0, pair)); | |
1730 | |
1731 assembler->Bind(&if_overflow); | |
1732 { | |
1733 var_fdec_value.Bind(assembler->SmiToFloat64(value)); | |
1734 assembler->Goto(&do_fdec); | |
1735 } | |
1736 } | |
1737 | |
1738 assembler->Bind(&if_isnotsmi); | |
1739 { | |
1740 // Check if the value is a HeapNumber. | |
1741 Label if_valueisnumber(assembler), | |
1742 if_valuenotnumber(assembler, Label::kDeferred); | |
1743 Node* value_map = assembler->LoadMap(value); | |
1744 Node* number_map = assembler->HeapNumberMapConstant(); | |
1745 assembler->Branch(assembler->WordEqual(value_map, number_map), | |
1746 &if_valueisnumber, &if_valuenotnumber); | |
1747 | |
1748 assembler->Bind(&if_valueisnumber); | |
1749 { | |
1750 // Load the HeapNumber value. | |
1751 var_fdec_value.Bind(assembler->LoadHeapNumberValue(value)); | |
1752 assembler->Goto(&do_fdec); | |
1753 } | |
1754 | |
1755 assembler->Bind(&if_valuenotnumber); | |
1756 { | |
1757 // Convert to a Number first and try again. | |
1758 Callable callable = CodeFactory::NonNumberToNumber(isolate()); | |
1759 value_var.Bind(assembler->CallStub(callable, context, value)); | |
1760 assembler->Goto(&start); | |
1761 } | |
1762 } | |
1763 } | |
1764 | |
1765 assembler->Bind(&do_fdec); | |
1766 { | |
1767 Node* fdec_value = var_fdec_value.value(); | |
1768 Node* one = assembler->Float64Constant(1.0); | |
1769 Node* fdec_result = assembler->Float64Sub(fdec_value, one); | |
1770 Node* result = assembler->ChangeFloat64ToTagged(fdec_result); | |
1771 assembler->Return(result); | |
1772 } | |
1773 } | |
1774 | |
1611 namespace { | 1775 namespace { |
1612 | 1776 |
1613 enum RelationalComparisonMode { | 1777 enum RelationalComparisonMode { |
1614 kLessThan, | 1778 kLessThan, |
1615 kLessThanOrEqual, | 1779 kLessThanOrEqual, |
1616 kGreaterThan, | 1780 kGreaterThan, |
1617 kGreaterThanOrEqual | 1781 kGreaterThanOrEqual |
1618 }; | 1782 }; |
1619 | 1783 |
1620 void GenerateAbstractRelationalComparison(CodeStubAssembler* assembler, | 1784 void GenerateAbstractRelationalComparison(CodeStubAssembler* assembler, |
(...skipping 2492 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4113 if (type->Is(Type::UntaggedPointer())) { | 4277 if (type->Is(Type::UntaggedPointer())) { |
4114 return Representation::External(); | 4278 return Representation::External(); |
4115 } | 4279 } |
4116 | 4280 |
4117 DCHECK(!type->Is(Type::Untagged())); | 4281 DCHECK(!type->Is(Type::Untagged())); |
4118 return Representation::Tagged(); | 4282 return Representation::Tagged(); |
4119 } | 4283 } |
4120 | 4284 |
4121 } // namespace internal | 4285 } // namespace internal |
4122 } // namespace v8 | 4286 } // namespace v8 |
OLD | NEW |