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

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: Omit ToNumber where possible 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 1590 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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