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

Side by Side Diff: src/code-stubs.cc

Issue 1901083002: [Interpreter] Introduce IncStub and DecStub. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Rebase Created 4 years, 8 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 | « src/code-stubs.h ('k') | src/compiler/bytecode-graph-builder.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
OLDNEW
« no previous file with comments | « src/code-stubs.h ('k') | src/compiler/bytecode-graph-builder.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698