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

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: 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/interface-descriptors.h » ('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(compiler::CodeStubAssembler* assembler) const {
epertoso 2016/04/19 13:08:11 After http://crrev.com/1893383002, you should use
rmcilroy 2016/04/19 14:31:45 Done.
1612 typedef compiler::CodeStubAssembler::Label Label;
1613 typedef compiler::Node Node;
1614 typedef compiler::CodeStubAssembler::Variable Variable;
1615
1616 Node* value = assembler->Parameter(0);
1617 Node* context = assembler->Parameter(1);
1618
1619 // Shared entry for floating point increment.
1620 Label do_finc(assembler);
1621 Variable var_finc_value(assembler, MachineRepresentation::kFloat64);
1622
1623 // Input has been converted to a number using ToNumber, so it must be a
1624 // Smi or a HeapNumber.
1625 Label if_issmi(assembler), if_isnotsmi(assembler);
1626 assembler->Branch(assembler->WordIsSmi(value), &if_issmi, &if_isnotsmi);
1627
1628 assembler->Bind(&if_issmi);
1629 {
1630 // Try fast Smi addition first.
1631 Node* one = assembler->SmiConstant(Smi::FromInt(1));
1632 Node* pair = assembler->SmiAddWithOverflow(value, one);
1633 Node* overflow = assembler->Projection(1, pair);
1634
1635 // Check if the Smi additon overflowed.
1636 Label if_overflow(assembler), if_notoverflow(assembler);
1637 assembler->Branch(overflow, &if_overflow, &if_notoverflow);
1638
1639 assembler->Bind(&if_notoverflow);
1640 assembler->Return(assembler->Projection(0, pair));
1641
1642 assembler->Bind(&if_overflow);
1643 {
1644 var_finc_value.Bind(assembler->SmiToFloat64(value));
1645 assembler->Goto(&do_finc);
1646 }
1647 }
1648
1649 assembler->Bind(&if_isnotsmi);
1650 {
1651 // Value must be a heap number if we reach this point.
1652 if (FLAG_debug_code) {
1653 // Assert that the value is a HeapNumber.
1654 Node* value_map =
1655 assembler->LoadObjectField(value, HeapObject::kMapOffset);
epertoso 2016/04/19 13:08:10 LoadMap
rmcilroy 2016/04/19 14:31:45 Done.
1656
1657 Label if_valueisnumber(assembler),
1658 if_valuenotnumber(assembler, Label::kDeferred);
1659 Node* number_map = assembler->HeapNumberMapConstant();
1660 assembler->Branch(assembler->WordEqual(value_map, number_map),
1661 &if_valueisnumber, &if_valuenotnumber);
1662
1663 assembler->Bind(&if_valuenotnumber);
1664 {
1665 Node* abort_id = assembler->SmiConstant(
1666 Smi::FromInt(BailoutReason::kExpectedHeapNumber));
1667 assembler->CallRuntime(Runtime::kAbort, context, abort_id);
1668 assembler->Goto(&if_valueisnumber); // Won't actually be reached.
1669 }
1670
1671 assembler->Bind(&if_valueisnumber);
1672 }
1673
1674 // Load the heap number value
1675 var_finc_value.Bind(assembler->LoadHeapNumberValue(value));
1676 assembler->Goto(&do_finc);
1677 }
1678
1679 assembler->Bind(&do_finc);
1680 {
1681 Node* finc_value = var_finc_value.value();
1682 Node* one = assembler->Float64Constant(1.0);
1683 Node* finc_result = assembler->Float64Add(finc_value, one);
1684 Node* result = assembler->ChangeFloat64ToTagged(finc_result);
1685 assembler->Return(result);
1686 }
1687 }
1688
1689 void DecStub::GenerateAssembly(compiler::CodeStubAssembler* assembler) const {
1690 typedef compiler::CodeStubAssembler::Label Label;
1691 typedef compiler::Node Node;
1692 typedef compiler::CodeStubAssembler::Variable Variable;
1693
1694 Node* value = assembler->Parameter(0);
1695 Node* context = assembler->Parameter(1);
1696
1697 // Shared entry for floating point increment.
1698 Label do_fdec(assembler);
1699 Variable var_fdec_value(assembler, MachineRepresentation::kFloat64);
1700
1701 // Input has been converted to a number using ToNumber, so it must be a
1702 // Smi or a HeapNumber.
1703 Label if_issmi(assembler), if_isnotsmi(assembler);
1704 assembler->Branch(assembler->WordIsSmi(value), &if_issmi, &if_isnotsmi);
1705
1706 assembler->Bind(&if_issmi);
1707 {
1708 // Try fast Smi addition first.
1709 Node* one = assembler->SmiConstant(Smi::FromInt(1));
1710 Node* pair = assembler->SmiSubWithOverflow(value, one);
1711 Node* overflow = assembler->Projection(1, pair);
1712
1713 // Check if the Smi subtraction overflowed.
1714 Label if_overflow(assembler), if_notoverflow(assembler);
1715 assembler->Branch(overflow, &if_overflow, &if_notoverflow);
1716
1717 assembler->Bind(&if_notoverflow);
1718 assembler->Return(assembler->Projection(0, pair));
1719
1720 assembler->Bind(&if_overflow);
1721 {
1722 var_fdec_value.Bind(assembler->SmiToFloat64(value));
1723 assembler->Goto(&do_fdec);
1724 }
1725 }
1726
1727 assembler->Bind(&if_isnotsmi);
1728 {
1729 // Value must be a heap number if we reach this point.
1730 if (FLAG_debug_code) {
1731 // Assert that the value is a HeapNumber.
1732 Node* value_map =
1733 assembler->LoadObjectField(value, HeapObject::kMapOffset);
1734
1735 Label if_valueisnumber(assembler),
1736 if_valuenotnumber(assembler, Label::kDeferred);
1737 Node* number_map = assembler->HeapNumberMapConstant();
1738 assembler->Branch(assembler->WordEqual(value_map, number_map),
1739 &if_valueisnumber, &if_valuenotnumber);
1740
1741 assembler->Bind(&if_valuenotnumber);
1742 {
1743 Node* abort_id = assembler->SmiConstant(
1744 Smi::FromInt(BailoutReason::kExpectedHeapNumber));
1745 assembler->CallRuntime(Runtime::kAbort, context, abort_id);
1746 assembler->Goto(&if_valueisnumber); // Won't actually be reached.
1747 }
1748
1749 assembler->Bind(&if_valueisnumber);
1750 }
1751
1752 // Load the heap number value
1753 var_fdec_value.Bind(assembler->LoadHeapNumberValue(value));
1754 assembler->Goto(&do_fdec);
1755 }
1756
1757 assembler->Bind(&do_fdec);
1758 {
1759 Node* fdec_value = var_fdec_value.value();
1760 Node* one = assembler->Float64Constant(1.0);
1761 Node* fdec_result = assembler->Float64Sub(fdec_value, one);
1762 Node* result = assembler->ChangeFloat64ToTagged(fdec_result);
1763 assembler->Return(result);
1764 }
1765 }
1766
1611 namespace { 1767 namespace {
1612 1768
1613 enum RelationalComparisonMode { 1769 enum RelationalComparisonMode {
1614 kLessThan, 1770 kLessThan,
1615 kLessThanOrEqual, 1771 kLessThanOrEqual,
1616 kGreaterThan, 1772 kGreaterThan,
1617 kGreaterThanOrEqual 1773 kGreaterThanOrEqual
1618 }; 1774 };
1619 1775
1620 void GenerateAbstractRelationalComparison(CodeStubAssembler* assembler, 1776 void GenerateAbstractRelationalComparison(CodeStubAssembler* assembler,
(...skipping 2475 matching lines...) Expand 10 before | Expand all | Expand 10 after
4096 if (type->Is(Type::UntaggedPointer())) { 4252 if (type->Is(Type::UntaggedPointer())) {
4097 return Representation::External(); 4253 return Representation::External();
4098 } 4254 }
4099 4255
4100 DCHECK(!type->Is(Type::Untagged())); 4256 DCHECK(!type->Is(Type::Untagged()));
4101 return Representation::Tagged(); 4257 return Representation::Tagged();
4102 } 4258 }
4103 4259
4104 } // namespace internal 4260 } // namespace internal
4105 } // namespace v8 4261 } // namespace v8
OLDNEW
« no previous file with comments | « src/code-stubs.h ('k') | src/interface-descriptors.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698