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

Side by Side Diff: src/ppc/full-codegen-ppc.cc

Issue 1156503003: PPC: VectorICs: allocating slots for store ics in ast nodes. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 7 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 | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 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/v8.h" 5 #include "src/v8.h"
6 6
7 #if V8_TARGET_ARCH_PPC 7 #if V8_TARGET_ARCH_PPC
8 8
9 #include "src/code-factory.h" 9 #include "src/code-factory.h"
10 #include "src/code-stubs.h" 10 #include "src/code-stubs.h"
(...skipping 1209 matching lines...) Expand 10 before | Expand all | Expand 10 after
1220 __ cmpi(r6, Operand::Zero()); 1220 __ cmpi(r6, Operand::Zero());
1221 __ beq(loop_statement.continue_label()); 1221 __ beq(loop_statement.continue_label());
1222 1222
1223 // Update the 'each' property or variable from the possibly filtered 1223 // Update the 'each' property or variable from the possibly filtered
1224 // entry in register r6. 1224 // entry in register r6.
1225 __ bind(&update_each); 1225 __ bind(&update_each);
1226 __ mr(result_register(), r6); 1226 __ mr(result_register(), r6);
1227 // Perform the assignment as if via '='. 1227 // Perform the assignment as if via '='.
1228 { 1228 {
1229 EffectContext context(this); 1229 EffectContext context(this);
1230 EmitAssignment(stmt->each()); 1230 EmitAssignment(stmt->each(), stmt->EachFeedbackSlot());
1231 PrepareForBailoutForId(stmt->AssignmentId(), NO_REGISTERS); 1231 PrepareForBailoutForId(stmt->AssignmentId(), NO_REGISTERS);
1232 } 1232 }
1233 1233
1234 // Generate code for the body of the loop. 1234 // Generate code for the body of the loop.
1235 Visit(stmt->body()); 1235 Visit(stmt->body());
1236 1236
1237 // Generate code for the going to the next element by incrementing 1237 // Generate code for the going to the next element by incrementing
1238 // the index (smi) stored on top of the stack. 1238 // the index (smi) stored on top of the stack.
1239 __ bind(loop_statement.continue_label()); 1239 __ bind(loop_statement.continue_label());
1240 __ pop(r3); 1240 __ pop(r3);
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
1300 1300
1301 __ Cmpi(r3, Operand(isolate()->factory()->undefined_value()), r0); 1301 __ Cmpi(r3, Operand(isolate()->factory()->undefined_value()), r0);
1302 Label done; 1302 Label done;
1303 __ bne(&done); 1303 __ bne(&done);
1304 __ CallRuntime(Runtime::kThrowNonMethodError, 0); 1304 __ CallRuntime(Runtime::kThrowNonMethodError, 0);
1305 __ bind(&done); 1305 __ bind(&done);
1306 } 1306 }
1307 1307
1308 1308
1309 void FullCodeGenerator::EmitSetHomeObjectIfNeeded(Expression* initializer, 1309 void FullCodeGenerator::EmitSetHomeObjectIfNeeded(Expression* initializer,
1310 int offset) { 1310 int offset,
1311 FeedbackVectorICSlot slot) {
1311 if (NeedsHomeObject(initializer)) { 1312 if (NeedsHomeObject(initializer)) {
1312 __ LoadP(StoreDescriptor::ReceiverRegister(), MemOperand(sp)); 1313 __ LoadP(StoreDescriptor::ReceiverRegister(), MemOperand(sp));
1313 __ mov(StoreDescriptor::NameRegister(), 1314 __ mov(StoreDescriptor::NameRegister(),
1314 Operand(isolate()->factory()->home_object_symbol())); 1315 Operand(isolate()->factory()->home_object_symbol()));
1315 __ LoadP(StoreDescriptor::ValueRegister(), 1316 __ LoadP(StoreDescriptor::ValueRegister(),
1316 MemOperand(sp, offset * kPointerSize)); 1317 MemOperand(sp, offset * kPointerSize));
1318 if (FLAG_vector_stores) EmitLoadStoreICSlot(slot);
1317 CallStoreIC(); 1319 CallStoreIC();
1318 } 1320 }
1319 } 1321 }
1320 1322
1321 1323
1322 void FullCodeGenerator::EmitLoadGlobalCheckExtensions(VariableProxy* proxy, 1324 void FullCodeGenerator::EmitLoadGlobalCheckExtensions(VariableProxy* proxy,
1323 TypeofState typeof_state, 1325 TypeofState typeof_state,
1324 Label* slow) { 1326 Label* slow) {
1325 Register current = cp; 1327 Register current = cp;
1326 Register next = r4; 1328 Register next = r4;
(...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after
1629 __ CallStub(&stub); 1631 __ CallStub(&stub);
1630 } 1632 }
1631 PrepareForBailoutForId(expr->CreateLiteralId(), TOS_REG); 1633 PrepareForBailoutForId(expr->CreateLiteralId(), TOS_REG);
1632 1634
1633 // If result_saved is true the result is on top of the stack. If 1635 // If result_saved is true the result is on top of the stack. If
1634 // result_saved is false the result is in r3. 1636 // result_saved is false the result is in r3.
1635 bool result_saved = false; 1637 bool result_saved = false;
1636 1638
1637 AccessorTable accessor_table(zone()); 1639 AccessorTable accessor_table(zone());
1638 int property_index = 0; 1640 int property_index = 0;
1641 // store_slot_index points to the vector ic slot for the next store ic used.
1642 // ObjectLiteral::ComputeFeedbackRequirements controls the allocation of slots
1643 // and must be updated if the number of store ics emitted here changes.
1644 int store_slot_index = 0;
1639 for (; property_index < expr->properties()->length(); property_index++) { 1645 for (; property_index < expr->properties()->length(); property_index++) {
1640 ObjectLiteral::Property* property = expr->properties()->at(property_index); 1646 ObjectLiteral::Property* property = expr->properties()->at(property_index);
1641 if (property->is_computed_name()) break; 1647 if (property->is_computed_name()) break;
1642 if (property->IsCompileTimeValue()) continue; 1648 if (property->IsCompileTimeValue()) continue;
1643 1649
1644 Literal* key = property->key()->AsLiteral(); 1650 Literal* key = property->key()->AsLiteral();
1645 Expression* value = property->value(); 1651 Expression* value = property->value();
1646 if (!result_saved) { 1652 if (!result_saved) {
1647 __ push(r3); // Save result on stack 1653 __ push(r3); // Save result on stack
1648 result_saved = true; 1654 result_saved = true;
1649 } 1655 }
1650 switch (property->kind()) { 1656 switch (property->kind()) {
1651 case ObjectLiteral::Property::CONSTANT: 1657 case ObjectLiteral::Property::CONSTANT:
1652 UNREACHABLE(); 1658 UNREACHABLE();
1653 case ObjectLiteral::Property::MATERIALIZED_LITERAL: 1659 case ObjectLiteral::Property::MATERIALIZED_LITERAL:
1654 DCHECK(!CompileTimeValue::IsCompileTimeValue(property->value())); 1660 DCHECK(!CompileTimeValue::IsCompileTimeValue(property->value()));
1655 // Fall through. 1661 // Fall through.
1656 case ObjectLiteral::Property::COMPUTED: 1662 case ObjectLiteral::Property::COMPUTED:
1657 // It is safe to use [[Put]] here because the boilerplate already 1663 // It is safe to use [[Put]] here because the boilerplate already
1658 // contains computed properties with an uninitialized value. 1664 // contains computed properties with an uninitialized value.
1659 if (key->value()->IsInternalizedString()) { 1665 if (key->value()->IsInternalizedString()) {
1660 if (property->emit_store()) { 1666 if (property->emit_store()) {
1661 VisitForAccumulatorValue(value); 1667 VisitForAccumulatorValue(value);
1662 DCHECK(StoreDescriptor::ValueRegister().is(r3)); 1668 DCHECK(StoreDescriptor::ValueRegister().is(r3));
1663 __ mov(StoreDescriptor::NameRegister(), Operand(key->value())); 1669 __ mov(StoreDescriptor::NameRegister(), Operand(key->value()));
1664 __ LoadP(StoreDescriptor::ReceiverRegister(), MemOperand(sp)); 1670 __ LoadP(StoreDescriptor::ReceiverRegister(), MemOperand(sp));
1665 CallStoreIC(key->LiteralFeedbackId()); 1671 if (FLAG_vector_stores) {
1672 EmitLoadStoreICSlot(expr->GetNthSlot(store_slot_index++));
1673 CallStoreIC();
1674 } else {
1675 CallStoreIC(key->LiteralFeedbackId());
1676 }
1666 PrepareForBailoutForId(key->id(), NO_REGISTERS); 1677 PrepareForBailoutForId(key->id(), NO_REGISTERS);
1667 1678
1668 if (NeedsHomeObject(value)) { 1679 if (NeedsHomeObject(value)) {
1669 __ Move(StoreDescriptor::ReceiverRegister(), r3); 1680 __ Move(StoreDescriptor::ReceiverRegister(), r3);
1670 __ mov(StoreDescriptor::NameRegister(), 1681 __ mov(StoreDescriptor::NameRegister(),
1671 Operand(isolate()->factory()->home_object_symbol())); 1682 Operand(isolate()->factory()->home_object_symbol()));
1672 __ LoadP(StoreDescriptor::ValueRegister(), MemOperand(sp)); 1683 __ LoadP(StoreDescriptor::ValueRegister(), MemOperand(sp));
1684 if (FLAG_vector_stores) {
1685 EmitLoadStoreICSlot(expr->GetNthSlot(store_slot_index++));
1686 }
1673 CallStoreIC(); 1687 CallStoreIC();
1674 } 1688 }
1675 } else { 1689 } else {
1676 VisitForEffect(value); 1690 VisitForEffect(value);
1677 } 1691 }
1678 break; 1692 break;
1679 } 1693 }
1680 // Duplicate receiver on stack. 1694 // Duplicate receiver on stack.
1681 __ LoadP(r3, MemOperand(sp)); 1695 __ LoadP(r3, MemOperand(sp));
1682 __ push(r3); 1696 __ push(r3);
1683 VisitForStackValue(key); 1697 VisitForStackValue(key);
1684 VisitForStackValue(value); 1698 VisitForStackValue(value);
1685 if (property->emit_store()) { 1699 if (property->emit_store()) {
1686 EmitSetHomeObjectIfNeeded(value, 2); 1700 EmitSetHomeObjectIfNeeded(
1701 value, 2, expr->SlotForHomeObject(value, &store_slot_index));
1687 __ LoadSmiLiteral(r3, Smi::FromInt(SLOPPY)); // PropertyAttributes 1702 __ LoadSmiLiteral(r3, Smi::FromInt(SLOPPY)); // PropertyAttributes
1688 __ push(r3); 1703 __ push(r3);
1689 __ CallRuntime(Runtime::kSetProperty, 4); 1704 __ CallRuntime(Runtime::kSetProperty, 4);
1690 } else { 1705 } else {
1691 __ Drop(3); 1706 __ Drop(3);
1692 } 1707 }
1693 break; 1708 break;
1694 case ObjectLiteral::Property::PROTOTYPE: 1709 case ObjectLiteral::Property::PROTOTYPE:
1695 // Duplicate receiver on stack. 1710 // Duplicate receiver on stack.
1696 __ LoadP(r3, MemOperand(sp)); 1711 __ LoadP(r3, MemOperand(sp));
(...skipping 16 matching lines...) Expand all
1713 } 1728 }
1714 1729
1715 // Emit code to define accessors, using only a single call to the runtime for 1730 // Emit code to define accessors, using only a single call to the runtime for
1716 // each pair of corresponding getters and setters. 1731 // each pair of corresponding getters and setters.
1717 for (AccessorTable::Iterator it = accessor_table.begin(); 1732 for (AccessorTable::Iterator it = accessor_table.begin();
1718 it != accessor_table.end(); ++it) { 1733 it != accessor_table.end(); ++it) {
1719 __ LoadP(r3, MemOperand(sp)); // Duplicate receiver. 1734 __ LoadP(r3, MemOperand(sp)); // Duplicate receiver.
1720 __ push(r3); 1735 __ push(r3);
1721 VisitForStackValue(it->first); 1736 VisitForStackValue(it->first);
1722 EmitAccessor(it->second->getter); 1737 EmitAccessor(it->second->getter);
1723 EmitSetHomeObjectIfNeeded(it->second->getter, 2); 1738 EmitSetHomeObjectIfNeeded(
1739 it->second->getter, 2,
1740 expr->SlotForHomeObject(it->second->getter, &store_slot_index));
1724 EmitAccessor(it->second->setter); 1741 EmitAccessor(it->second->setter);
1725 EmitSetHomeObjectIfNeeded(it->second->setter, 3); 1742 EmitSetHomeObjectIfNeeded(
1743 it->second->setter, 3,
1744 expr->SlotForHomeObject(it->second->setter, &store_slot_index));
1726 __ LoadSmiLiteral(r3, Smi::FromInt(NONE)); 1745 __ LoadSmiLiteral(r3, Smi::FromInt(NONE));
1727 __ push(r3); 1746 __ push(r3);
1728 __ CallRuntime(Runtime::kDefineAccessorPropertyUnchecked, 5); 1747 __ CallRuntime(Runtime::kDefineAccessorPropertyUnchecked, 5);
1729 } 1748 }
1730 1749
1731 // Object literals have two parts. The "static" part on the left contains no 1750 // Object literals have two parts. The "static" part on the left contains no
1732 // computed property names, and so we can compute its map ahead of time; see 1751 // computed property names, and so we can compute its map ahead of time; see
1733 // runtime.cc::CreateObjectLiteralBoilerplate. The second "dynamic" part 1752 // runtime.cc::CreateObjectLiteralBoilerplate. The second "dynamic" part
1734 // starts with the first computed property name, and continues with all 1753 // starts with the first computed property name, and continues with all
1735 // properties to its right. All the code from above initializes the static 1754 // properties to its right. All the code from above initializes the static
(...skipping 14 matching lines...) Expand all
1750 __ push(r3); 1769 __ push(r3);
1751 1770
1752 if (property->kind() == ObjectLiteral::Property::PROTOTYPE) { 1771 if (property->kind() == ObjectLiteral::Property::PROTOTYPE) {
1753 DCHECK(!property->is_computed_name()); 1772 DCHECK(!property->is_computed_name());
1754 VisitForStackValue(value); 1773 VisitForStackValue(value);
1755 DCHECK(property->emit_store()); 1774 DCHECK(property->emit_store());
1756 __ CallRuntime(Runtime::kInternalSetPrototype, 2); 1775 __ CallRuntime(Runtime::kInternalSetPrototype, 2);
1757 } else { 1776 } else {
1758 EmitPropertyKey(property, expr->GetIdForProperty(property_index)); 1777 EmitPropertyKey(property, expr->GetIdForProperty(property_index));
1759 VisitForStackValue(value); 1778 VisitForStackValue(value);
1760 EmitSetHomeObjectIfNeeded(value, 2); 1779 EmitSetHomeObjectIfNeeded(
1780 value, 2, expr->SlotForHomeObject(value, &store_slot_index));
1761 1781
1762 switch (property->kind()) { 1782 switch (property->kind()) {
1763 case ObjectLiteral::Property::CONSTANT: 1783 case ObjectLiteral::Property::CONSTANT:
1764 case ObjectLiteral::Property::MATERIALIZED_LITERAL: 1784 case ObjectLiteral::Property::MATERIALIZED_LITERAL:
1765 case ObjectLiteral::Property::COMPUTED: 1785 case ObjectLiteral::Property::COMPUTED:
1766 if (property->emit_store()) { 1786 if (property->emit_store()) {
1767 __ LoadSmiLiteral(r3, Smi::FromInt(NONE)); 1787 __ LoadSmiLiteral(r3, Smi::FromInt(NONE));
1768 __ push(r3); 1788 __ push(r3);
1769 __ CallRuntime(Runtime::kDefineDataPropertyUnchecked, 4); 1789 __ CallRuntime(Runtime::kDefineDataPropertyUnchecked, 4);
1770 } else { 1790 } else {
(...skipping 25 matching lines...) Expand all
1796 __ LoadP(r3, MemOperand(sp)); 1816 __ LoadP(r3, MemOperand(sp));
1797 __ push(r3); 1817 __ push(r3);
1798 __ CallRuntime(Runtime::kToFastProperties, 1); 1818 __ CallRuntime(Runtime::kToFastProperties, 1);
1799 } 1819 }
1800 1820
1801 if (result_saved) { 1821 if (result_saved) {
1802 context()->PlugTOS(); 1822 context()->PlugTOS();
1803 } else { 1823 } else {
1804 context()->Plug(r3); 1824 context()->Plug(r3);
1805 } 1825 }
1826
1827 // Verify that compilation exactly consumed the number of store ic slots that
1828 // the ObjectLiteral node had to offer.
1829 DCHECK(!FLAG_vector_stores || store_slot_index == expr->slot_count());
1806 } 1830 }
1807 1831
1808 1832
1809 void FullCodeGenerator::VisitArrayLiteral(ArrayLiteral* expr) { 1833 void FullCodeGenerator::VisitArrayLiteral(ArrayLiteral* expr) {
1810 Comment cmnt(masm_, "[ ArrayLiteral"); 1834 Comment cmnt(masm_, "[ ArrayLiteral");
1811 1835
1812 expr->BuildConstantElements(isolate()); 1836 expr->BuildConstantElements(isolate());
1813 Handle<FixedArray> constant_elements = expr->constant_elements(); 1837 Handle<FixedArray> constant_elements = expr->constant_elements();
1814 bool has_fast_elements = 1838 bool has_fast_elements =
1815 IsFastObjectElementsKind(expr->constant_elements_kind()); 1839 IsFastObjectElementsKind(expr->constant_elements_kind());
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
1909 } 1933 }
1910 } 1934 }
1911 1935
1912 1936
1913 void FullCodeGenerator::VisitAssignment(Assignment* expr) { 1937 void FullCodeGenerator::VisitAssignment(Assignment* expr) {
1914 DCHECK(expr->target()->IsValidReferenceExpression()); 1938 DCHECK(expr->target()->IsValidReferenceExpression());
1915 1939
1916 Comment cmnt(masm_, "[ Assignment"); 1940 Comment cmnt(masm_, "[ Assignment");
1917 1941
1918 Property* property = expr->target()->AsProperty(); 1942 Property* property = expr->target()->AsProperty();
1919 LhsKind assign_type = GetAssignType(property); 1943 LhsKind assign_type = Property::GetAssignType(property);
1920 1944
1921 // Evaluate LHS expression. 1945 // Evaluate LHS expression.
1922 switch (assign_type) { 1946 switch (assign_type) {
1923 case VARIABLE: 1947 case VARIABLE:
1924 // Nothing to do here. 1948 // Nothing to do here.
1925 break; 1949 break;
1926 case NAMED_PROPERTY: 1950 case NAMED_PROPERTY:
1927 if (expr->is_compound()) { 1951 if (expr->is_compound()) {
1928 // We need the receiver both on the stack and in the register. 1952 // We need the receiver both on the stack and in the register.
1929 VisitForStackValue(property->obj()); 1953 VisitForStackValue(property->obj());
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
2018 VisitForAccumulatorValue(expr->value()); 2042 VisitForAccumulatorValue(expr->value());
2019 } 2043 }
2020 2044
2021 // Record source position before possible IC call. 2045 // Record source position before possible IC call.
2022 SetSourcePosition(expr->position()); 2046 SetSourcePosition(expr->position());
2023 2047
2024 // Store the value. 2048 // Store the value.
2025 switch (assign_type) { 2049 switch (assign_type) {
2026 case VARIABLE: 2050 case VARIABLE:
2027 EmitVariableAssignment(expr->target()->AsVariableProxy()->var(), 2051 EmitVariableAssignment(expr->target()->AsVariableProxy()->var(),
2028 expr->op()); 2052 expr->op(), expr->AssignmentSlot());
2029 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); 2053 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG);
2030 context()->Plug(r3); 2054 context()->Plug(r3);
2031 break; 2055 break;
2032 case NAMED_PROPERTY: 2056 case NAMED_PROPERTY:
2033 EmitNamedPropertyAssignment(expr); 2057 EmitNamedPropertyAssignment(expr);
2034 break; 2058 break;
2035 case NAMED_SUPER_PROPERTY: 2059 case NAMED_SUPER_PROPERTY:
2036 EmitNamedSuperPropertyStore(property); 2060 EmitNamedSuperPropertyStore(property);
2037 context()->Plug(r3); 2061 context()->Plug(r3);
2038 break; 2062 break;
(...skipping 551 matching lines...) Expand 10 before | Expand all | Expand 10 after
2590 __ pop(r4); 2614 __ pop(r4);
2591 Handle<Code> code = CodeFactory::BinaryOpIC( 2615 Handle<Code> code = CodeFactory::BinaryOpIC(
2592 isolate(), op, language_mode()).code(); 2616 isolate(), op, language_mode()).code();
2593 JumpPatchSite patch_site(masm_); // unbound, signals no inlined smi code. 2617 JumpPatchSite patch_site(masm_); // unbound, signals no inlined smi code.
2594 CallIC(code, expr->BinaryOperationFeedbackId()); 2618 CallIC(code, expr->BinaryOperationFeedbackId());
2595 patch_site.EmitPatchInfo(); 2619 patch_site.EmitPatchInfo();
2596 context()->Plug(r3); 2620 context()->Plug(r3);
2597 } 2621 }
2598 2622
2599 2623
2600 void FullCodeGenerator::EmitAssignment(Expression* expr) { 2624 void FullCodeGenerator::EmitAssignment(Expression* expr,
2625 FeedbackVectorICSlot slot) {
2601 DCHECK(expr->IsValidReferenceExpression()); 2626 DCHECK(expr->IsValidReferenceExpression());
2602 2627
2603 Property* prop = expr->AsProperty(); 2628 Property* prop = expr->AsProperty();
2604 LhsKind assign_type = GetAssignType(prop); 2629 LhsKind assign_type = Property::GetAssignType(prop);
2605 2630
2606 switch (assign_type) { 2631 switch (assign_type) {
2607 case VARIABLE: { 2632 case VARIABLE: {
2608 Variable* var = expr->AsVariableProxy()->var(); 2633 Variable* var = expr->AsVariableProxy()->var();
2609 EffectContext context(this); 2634 EffectContext context(this);
2610 EmitVariableAssignment(var, Token::ASSIGN); 2635 EmitVariableAssignment(var, Token::ASSIGN, slot);
2611 break; 2636 break;
2612 } 2637 }
2613 case NAMED_PROPERTY: { 2638 case NAMED_PROPERTY: {
2614 __ push(r3); // Preserve value. 2639 __ push(r3); // Preserve value.
2615 VisitForAccumulatorValue(prop->obj()); 2640 VisitForAccumulatorValue(prop->obj());
2616 __ Move(StoreDescriptor::ReceiverRegister(), r3); 2641 __ Move(StoreDescriptor::ReceiverRegister(), r3);
2617 __ pop(StoreDescriptor::ValueRegister()); // Restore value. 2642 __ pop(StoreDescriptor::ValueRegister()); // Restore value.
2618 __ mov(StoreDescriptor::NameRegister(), 2643 __ mov(StoreDescriptor::NameRegister(),
2619 Operand(prop->key()->AsLiteral()->value())); 2644 Operand(prop->key()->AsLiteral()->value()));
2645 if (FLAG_vector_stores) EmitLoadStoreICSlot(slot);
2620 CallStoreIC(); 2646 CallStoreIC();
2621 break; 2647 break;
2622 } 2648 }
2623 case NAMED_SUPER_PROPERTY: { 2649 case NAMED_SUPER_PROPERTY: {
2624 __ Push(r3); 2650 __ Push(r3);
2625 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); 2651 VisitForStackValue(prop->obj()->AsSuperReference()->this_var());
2626 EmitLoadHomeObject(prop->obj()->AsSuperReference()); 2652 EmitLoadHomeObject(prop->obj()->AsSuperReference());
2627 // stack: value, this; r3: home_object 2653 // stack: value, this; r3: home_object
2628 Register scratch = r5; 2654 Register scratch = r5;
2629 Register scratch2 = r6; 2655 Register scratch2 = r6;
(...skipping 26 matching lines...) Expand all
2656 EmitKeyedSuperPropertyStore(prop); 2682 EmitKeyedSuperPropertyStore(prop);
2657 break; 2683 break;
2658 } 2684 }
2659 case KEYED_PROPERTY: { 2685 case KEYED_PROPERTY: {
2660 __ push(r3); // Preserve value. 2686 __ push(r3); // Preserve value.
2661 VisitForStackValue(prop->obj()); 2687 VisitForStackValue(prop->obj());
2662 VisitForAccumulatorValue(prop->key()); 2688 VisitForAccumulatorValue(prop->key());
2663 __ Move(StoreDescriptor::NameRegister(), r3); 2689 __ Move(StoreDescriptor::NameRegister(), r3);
2664 __ Pop(StoreDescriptor::ValueRegister(), 2690 __ Pop(StoreDescriptor::ValueRegister(),
2665 StoreDescriptor::ReceiverRegister()); 2691 StoreDescriptor::ReceiverRegister());
2692 if (FLAG_vector_stores) EmitLoadStoreICSlot(slot);
2666 Handle<Code> ic = 2693 Handle<Code> ic =
2667 CodeFactory::KeyedStoreIC(isolate(), language_mode()).code(); 2694 CodeFactory::KeyedStoreIC(isolate(), language_mode()).code();
2668 CallIC(ic); 2695 CallIC(ic);
2669 break; 2696 break;
2670 } 2697 }
2671 } 2698 }
2672 context()->Plug(r3); 2699 context()->Plug(r3);
2673 } 2700 }
2674 2701
2675 2702
2676 void FullCodeGenerator::EmitStoreToStackLocalOrContextSlot( 2703 void FullCodeGenerator::EmitStoreToStackLocalOrContextSlot(
2677 Variable* var, MemOperand location) { 2704 Variable* var, MemOperand location) {
2678 __ StoreP(result_register(), location, r0); 2705 __ StoreP(result_register(), location, r0);
2679 if (var->IsContextSlot()) { 2706 if (var->IsContextSlot()) {
2680 // RecordWrite may destroy all its register arguments. 2707 // RecordWrite may destroy all its register arguments.
2681 __ mr(r6, result_register()); 2708 __ mr(r6, result_register());
2682 int offset = Context::SlotOffset(var->index()); 2709 int offset = Context::SlotOffset(var->index());
2683 __ RecordWriteContextSlot(r4, offset, r6, r5, kLRHasBeenSaved, 2710 __ RecordWriteContextSlot(r4, offset, r6, r5, kLRHasBeenSaved,
2684 kDontSaveFPRegs); 2711 kDontSaveFPRegs);
2685 } 2712 }
2686 } 2713 }
2687 2714
2688 2715
2689 void FullCodeGenerator::EmitVariableAssignment(Variable* var, Token::Value op) { 2716 void FullCodeGenerator::EmitVariableAssignment(Variable* var, Token::Value op,
2717 FeedbackVectorICSlot slot) {
2690 if (var->IsUnallocated()) { 2718 if (var->IsUnallocated()) {
2691 // Global var, const, or let. 2719 // Global var, const, or let.
2692 __ mov(StoreDescriptor::NameRegister(), Operand(var->name())); 2720 __ mov(StoreDescriptor::NameRegister(), Operand(var->name()));
2693 __ LoadP(StoreDescriptor::ReceiverRegister(), GlobalObjectOperand()); 2721 __ LoadP(StoreDescriptor::ReceiverRegister(), GlobalObjectOperand());
2722 if (FLAG_vector_stores) EmitLoadStoreICSlot(slot);
2694 CallStoreIC(); 2723 CallStoreIC();
2695 2724
2696 } else if (var->mode() == LET && op != Token::INIT_LET) { 2725 } else if (var->mode() == LET && op != Token::INIT_LET) {
2697 // Non-initializing assignment to let variable needs a write barrier. 2726 // Non-initializing assignment to let variable needs a write barrier.
2698 DCHECK(!var->IsLookupSlot()); 2727 DCHECK(!var->IsLookupSlot());
2699 DCHECK(var->IsStackAllocated() || var->IsContextSlot()); 2728 DCHECK(var->IsStackAllocated() || var->IsContextSlot());
2700 Label assign; 2729 Label assign;
2701 MemOperand location = VarOperand(var, r4); 2730 MemOperand location = VarOperand(var, r4);
2702 __ LoadP(r6, location); 2731 __ LoadP(r6, location);
2703 __ CompareRoot(r6, Heap::kTheHoleValueRootIndex); 2732 __ CompareRoot(r6, Heap::kTheHoleValueRootIndex);
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
2779 // Assignment to a property, using a named store IC. 2808 // Assignment to a property, using a named store IC.
2780 Property* prop = expr->target()->AsProperty(); 2809 Property* prop = expr->target()->AsProperty();
2781 DCHECK(prop != NULL); 2810 DCHECK(prop != NULL);
2782 DCHECK(prop->key()->IsLiteral()); 2811 DCHECK(prop->key()->IsLiteral());
2783 2812
2784 // Record source code position before IC call. 2813 // Record source code position before IC call.
2785 SetSourcePosition(expr->position()); 2814 SetSourcePosition(expr->position());
2786 __ mov(StoreDescriptor::NameRegister(), 2815 __ mov(StoreDescriptor::NameRegister(),
2787 Operand(prop->key()->AsLiteral()->value())); 2816 Operand(prop->key()->AsLiteral()->value()));
2788 __ pop(StoreDescriptor::ReceiverRegister()); 2817 __ pop(StoreDescriptor::ReceiverRegister());
2789 CallStoreIC(expr->AssignmentFeedbackId()); 2818 if (FLAG_vector_stores) {
2819 EmitLoadStoreICSlot(expr->AssignmentSlot());
2820 CallStoreIC();
2821 } else {
2822 CallStoreIC(expr->AssignmentFeedbackId());
2823 }
2790 2824
2791 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); 2825 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG);
2792 context()->Plug(r3); 2826 context()->Plug(r3);
2793 } 2827 }
2794 2828
2795 2829
2796 void FullCodeGenerator::EmitNamedSuperPropertyStore(Property* prop) { 2830 void FullCodeGenerator::EmitNamedSuperPropertyStore(Property* prop) {
2797 // Assignment to named property of super. 2831 // Assignment to named property of super.
2798 // r3 : value 2832 // r3 : value
2799 // stack : receiver ('this'), home_object 2833 // stack : receiver ('this'), home_object
(...skipping 26 matching lines...) Expand all
2826 void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) { 2860 void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) {
2827 // Assignment to a property, using a keyed store IC. 2861 // Assignment to a property, using a keyed store IC.
2828 2862
2829 // Record source code position before IC call. 2863 // Record source code position before IC call.
2830 SetSourcePosition(expr->position()); 2864 SetSourcePosition(expr->position());
2831 __ Pop(StoreDescriptor::ReceiverRegister(), StoreDescriptor::NameRegister()); 2865 __ Pop(StoreDescriptor::ReceiverRegister(), StoreDescriptor::NameRegister());
2832 DCHECK(StoreDescriptor::ValueRegister().is(r3)); 2866 DCHECK(StoreDescriptor::ValueRegister().is(r3));
2833 2867
2834 Handle<Code> ic = 2868 Handle<Code> ic =
2835 CodeFactory::KeyedStoreIC(isolate(), language_mode()).code(); 2869 CodeFactory::KeyedStoreIC(isolate(), language_mode()).code();
2836 CallIC(ic, expr->AssignmentFeedbackId()); 2870 if (FLAG_vector_stores) {
2871 EmitLoadStoreICSlot(expr->AssignmentSlot());
2872 CallIC(ic);
2873 } else {
2874 CallIC(ic, expr->AssignmentFeedbackId());
2875 }
2837 2876
2838 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); 2877 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG);
2839 context()->Plug(r3); 2878 context()->Plug(r3);
2840 } 2879 }
2841 2880
2842 2881
2843 void FullCodeGenerator::VisitProperty(Property* expr) { 2882 void FullCodeGenerator::VisitProperty(Property* expr) {
2844 Comment cmnt(masm_, "[ Property"); 2883 Comment cmnt(masm_, "[ Property");
2845 Expression* key = expr->key(); 2884 Expression* key = expr->key();
2846 2885
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after
3068 3107
3069 3108
3070 void FullCodeGenerator::EmitLoadSuperConstructor() { 3109 void FullCodeGenerator::EmitLoadSuperConstructor() {
3071 __ LoadP(r3, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset)); 3110 __ LoadP(r3, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset));
3072 __ Push(r3); 3111 __ Push(r3);
3073 __ CallRuntime(Runtime::kGetPrototype, 1); 3112 __ CallRuntime(Runtime::kGetPrototype, 1);
3074 } 3113 }
3075 3114
3076 3115
3077 void FullCodeGenerator::EmitInitializeThisAfterSuper( 3116 void FullCodeGenerator::EmitInitializeThisAfterSuper(
3078 SuperReference* super_ref) { 3117 SuperReference* super_ref, FeedbackVectorICSlot slot) {
3079 Variable* this_var = super_ref->this_var()->var(); 3118 Variable* this_var = super_ref->this_var()->var();
3080 GetVar(r4, this_var); 3119 GetVar(r4, this_var);
3081 __ CompareRoot(r4, Heap::kTheHoleValueRootIndex); 3120 __ CompareRoot(r4, Heap::kTheHoleValueRootIndex);
3082 Label uninitialized_this; 3121 Label uninitialized_this;
3083 __ beq(&uninitialized_this); 3122 __ beq(&uninitialized_this);
3084 __ mov(r4, Operand(this_var->name())); 3123 __ mov(r4, Operand(this_var->name()));
3085 __ push(r4); 3124 __ push(r4);
3086 __ CallRuntime(Runtime::kThrowReferenceError, 1); 3125 __ CallRuntime(Runtime::kThrowReferenceError, 1);
3087 __ bind(&uninitialized_this); 3126 __ bind(&uninitialized_this);
3088 3127
3089 EmitVariableAssignment(this_var, Token::INIT_CONST); 3128 EmitVariableAssignment(this_var, Token::INIT_CONST, slot);
3090 } 3129 }
3091 3130
3092 3131
3093 void FullCodeGenerator::VisitCall(Call* expr) { 3132 void FullCodeGenerator::VisitCall(Call* expr) {
3094 #ifdef DEBUG 3133 #ifdef DEBUG
3095 // We want to verify that RecordJSReturnSite gets called on all paths 3134 // We want to verify that RecordJSReturnSite gets called on all paths
3096 // through this function. Avoid early returns. 3135 // through this function. Avoid early returns.
3097 expr->return_is_recorded_ = false; 3136 expr->return_is_recorded_ = false;
3098 #endif 3137 #endif
3099 3138
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after
3309 __ Move(r5, FeedbackVector()); 3348 __ Move(r5, FeedbackVector());
3310 __ LoadSmiLiteral(r6, SmiFromSlot(expr->CallFeedbackSlot())); 3349 __ LoadSmiLiteral(r6, SmiFromSlot(expr->CallFeedbackSlot()));
3311 3350
3312 CallConstructStub stub(isolate(), SUPER_CALL_RECORD_TARGET); 3351 CallConstructStub stub(isolate(), SUPER_CALL_RECORD_TARGET);
3313 __ Call(stub.GetCode(), RelocInfo::CONSTRUCT_CALL); 3352 __ Call(stub.GetCode(), RelocInfo::CONSTRUCT_CALL);
3314 3353
3315 __ Drop(1); 3354 __ Drop(1);
3316 3355
3317 RecordJSReturnSite(expr); 3356 RecordJSReturnSite(expr);
3318 3357
3319 EmitInitializeThisAfterSuper(expr->expression()->AsSuperReference()); 3358 EmitInitializeThisAfterSuper(expr->expression()->AsSuperReference(),
3359 expr->CallFeedbackICSlot());
3320 context()->Plug(r3); 3360 context()->Plug(r3);
3321 } 3361 }
3322 3362
3323 3363
3324 void FullCodeGenerator::EmitIsSmi(CallRuntime* expr) { 3364 void FullCodeGenerator::EmitIsSmi(CallRuntime* expr) {
3325 ZoneList<Expression*>* args = expr->arguments(); 3365 ZoneList<Expression*>* args = expr->arguments();
3326 DCHECK(args->length() == 1); 3366 DCHECK(args->length() == 1);
3327 3367
3328 VisitForAccumulatorValue(args->at(0)); 3368 VisitForAccumulatorValue(args->at(0));
3329 3369
(...skipping 1298 matching lines...) Expand 10 before | Expand all | Expand 10 after
4628 // Push NewTarget 4668 // Push NewTarget
4629 DCHECK(args->at(2)->IsVariableProxy()); 4669 DCHECK(args->at(2)->IsVariableProxy());
4630 VisitForStackValue(args->at(2)); 4670 VisitForStackValue(args->at(2));
4631 4671
4632 EmitCallJSRuntimeFunction(call); 4672 EmitCallJSRuntimeFunction(call);
4633 4673
4634 // Restore context register. 4674 // Restore context register.
4635 __ LoadP(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); 4675 __ LoadP(cp, MemOperand(fp, StandardFrameConstants::kContextOffset));
4636 context()->DropAndPlug(1, r3); 4676 context()->DropAndPlug(1, r3);
4637 4677
4678 // TODO(mvstanton): with FLAG_vector_stores this needs a slot id.
4638 EmitInitializeThisAfterSuper(super_reference); 4679 EmitInitializeThisAfterSuper(super_reference);
4639 } 4680 }
4640 4681
4641 4682
4642 void FullCodeGenerator::EmitLoadJSRuntimeFunction(CallRuntime* expr) { 4683 void FullCodeGenerator::EmitLoadJSRuntimeFunction(CallRuntime* expr) {
4643 // Push the builtins object as the receiver. 4684 // Push the builtins object as the receiver.
4644 Register receiver = LoadDescriptor::ReceiverRegister(); 4685 Register receiver = LoadDescriptor::ReceiverRegister();
4645 __ LoadP(receiver, GlobalObjectOperand()); 4686 __ LoadP(receiver, GlobalObjectOperand());
4646 __ LoadP(receiver, FieldMemOperand(receiver, GlobalObject::kBuiltinsOffset)); 4687 __ LoadP(receiver, FieldMemOperand(receiver, GlobalObject::kBuiltinsOffset));
4647 __ push(receiver); 4688 __ push(receiver);
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after
4826 } 4867 }
4827 4868
4828 4869
4829 void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { 4870 void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
4830 DCHECK(expr->expression()->IsValidReferenceExpression()); 4871 DCHECK(expr->expression()->IsValidReferenceExpression());
4831 4872
4832 Comment cmnt(masm_, "[ CountOperation"); 4873 Comment cmnt(masm_, "[ CountOperation");
4833 SetSourcePosition(expr->position()); 4874 SetSourcePosition(expr->position());
4834 4875
4835 Property* prop = expr->expression()->AsProperty(); 4876 Property* prop = expr->expression()->AsProperty();
4836 LhsKind assign_type = GetAssignType(prop); 4877 LhsKind assign_type = Property::GetAssignType(prop);
4837 4878
4838 // Evaluate expression and get value. 4879 // Evaluate expression and get value.
4839 if (assign_type == VARIABLE) { 4880 if (assign_type == VARIABLE) {
4840 DCHECK(expr->expression()->AsVariableProxy()->var() != NULL); 4881 DCHECK(expr->expression()->AsVariableProxy()->var() != NULL);
4841 AccumulatorValueContext context(this); 4882 AccumulatorValueContext context(this);
4842 EmitVariableLoad(expr->expression()->AsVariableProxy()); 4883 EmitVariableLoad(expr->expression()->AsVariableProxy());
4843 } else { 4884 } else {
4844 // Reserve space for result of postfix operation. 4885 // Reserve space for result of postfix operation.
4845 if (expr->is_postfix() && !context()->IsEffect()) { 4886 if (expr->is_postfix() && !context()->IsEffect()) {
4846 __ LoadSmiLiteral(ip, Smi::FromInt(0)); 4887 __ LoadSmiLiteral(ip, Smi::FromInt(0));
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
4991 patch_site.EmitPatchInfo(); 5032 patch_site.EmitPatchInfo();
4992 __ bind(&done); 5033 __ bind(&done);
4993 5034
4994 // Store the value returned in r3. 5035 // Store the value returned in r3.
4995 switch (assign_type) { 5036 switch (assign_type) {
4996 case VARIABLE: 5037 case VARIABLE:
4997 if (expr->is_postfix()) { 5038 if (expr->is_postfix()) {
4998 { 5039 {
4999 EffectContext context(this); 5040 EffectContext context(this);
5000 EmitVariableAssignment(expr->expression()->AsVariableProxy()->var(), 5041 EmitVariableAssignment(expr->expression()->AsVariableProxy()->var(),
5001 Token::ASSIGN); 5042 Token::ASSIGN, expr->CountSlot());
5002 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); 5043 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG);
5003 context.Plug(r3); 5044 context.Plug(r3);
5004 } 5045 }
5005 // For all contexts except EffectConstant We have the result on 5046 // For all contexts except EffectConstant We have the result on
5006 // top of the stack. 5047 // top of the stack.
5007 if (!context()->IsEffect()) { 5048 if (!context()->IsEffect()) {
5008 context()->PlugTOS(); 5049 context()->PlugTOS();
5009 } 5050 }
5010 } else { 5051 } else {
5011 EmitVariableAssignment(expr->expression()->AsVariableProxy()->var(), 5052 EmitVariableAssignment(expr->expression()->AsVariableProxy()->var(),
5012 Token::ASSIGN); 5053 Token::ASSIGN, expr->CountSlot());
5013 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); 5054 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG);
5014 context()->Plug(r3); 5055 context()->Plug(r3);
5015 } 5056 }
5016 break; 5057 break;
5017 case NAMED_PROPERTY: { 5058 case NAMED_PROPERTY: {
5018 __ mov(StoreDescriptor::NameRegister(), 5059 __ mov(StoreDescriptor::NameRegister(),
5019 Operand(prop->key()->AsLiteral()->value())); 5060 Operand(prop->key()->AsLiteral()->value()));
5020 __ pop(StoreDescriptor::ReceiverRegister()); 5061 __ pop(StoreDescriptor::ReceiverRegister());
5021 CallStoreIC(expr->CountStoreFeedbackId()); 5062 if (FLAG_vector_stores) {
5063 EmitLoadStoreICSlot(expr->CountSlot());
5064 CallStoreIC();
5065 } else {
5066 CallStoreIC(expr->CountStoreFeedbackId());
5067 }
5022 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); 5068 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG);
5023 if (expr->is_postfix()) { 5069 if (expr->is_postfix()) {
5024 if (!context()->IsEffect()) { 5070 if (!context()->IsEffect()) {
5025 context()->PlugTOS(); 5071 context()->PlugTOS();
5026 } 5072 }
5027 } else { 5073 } else {
5028 context()->Plug(r3); 5074 context()->Plug(r3);
5029 } 5075 }
5030 break; 5076 break;
5031 } 5077 }
(...skipping 17 matching lines...) Expand all
5049 } else { 5095 } else {
5050 context()->Plug(r3); 5096 context()->Plug(r3);
5051 } 5097 }
5052 break; 5098 break;
5053 } 5099 }
5054 case KEYED_PROPERTY: { 5100 case KEYED_PROPERTY: {
5055 __ Pop(StoreDescriptor::ReceiverRegister(), 5101 __ Pop(StoreDescriptor::ReceiverRegister(),
5056 StoreDescriptor::NameRegister()); 5102 StoreDescriptor::NameRegister());
5057 Handle<Code> ic = 5103 Handle<Code> ic =
5058 CodeFactory::KeyedStoreIC(isolate(), language_mode()).code(); 5104 CodeFactory::KeyedStoreIC(isolate(), language_mode()).code();
5059 CallIC(ic, expr->CountStoreFeedbackId()); 5105 if (FLAG_vector_stores) {
5106 EmitLoadStoreICSlot(expr->CountSlot());
5107 CallIC(ic);
5108 } else {
5109 CallIC(ic, expr->CountStoreFeedbackId());
5110 }
5060 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); 5111 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG);
5061 if (expr->is_postfix()) { 5112 if (expr->is_postfix()) {
5062 if (!context()->IsEffect()) { 5113 if (!context()->IsEffect()) {
5063 context()->PlugTOS(); 5114 context()->PlugTOS();
5064 } 5115 }
5065 } else { 5116 } else {
5066 context()->Plug(r3); 5117 context()->Plug(r3);
5067 } 5118 }
5068 break; 5119 break;
5069 } 5120 }
(...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after
5387 void FullCodeGenerator::ClearPendingMessage() { 5438 void FullCodeGenerator::ClearPendingMessage() {
5388 DCHECK(!result_register().is(r4)); 5439 DCHECK(!result_register().is(r4));
5389 ExternalReference pending_message_obj = 5440 ExternalReference pending_message_obj =
5390 ExternalReference::address_of_pending_message_obj(isolate()); 5441 ExternalReference::address_of_pending_message_obj(isolate());
5391 __ LoadRoot(r4, Heap::kTheHoleValueRootIndex); 5442 __ LoadRoot(r4, Heap::kTheHoleValueRootIndex);
5392 __ mov(ip, Operand(pending_message_obj)); 5443 __ mov(ip, Operand(pending_message_obj));
5393 __ StoreP(r4, MemOperand(ip)); 5444 __ StoreP(r4, MemOperand(ip));
5394 } 5445 }
5395 5446
5396 5447
5448 void FullCodeGenerator::EmitLoadStoreICSlot(FeedbackVectorICSlot slot) {
5449 DCHECK(FLAG_vector_stores && !slot.IsInvalid());
5450 __ mov(VectorStoreICTrampolineDescriptor::SlotRegister(),
5451 Operand(SmiFromSlot(slot)));
5452 }
5453
5454
5397 #undef __ 5455 #undef __
5398 5456
5399 5457
5400 void BackEdgeTable::PatchAt(Code* unoptimized_code, Address pc, 5458 void BackEdgeTable::PatchAt(Code* unoptimized_code, Address pc,
5401 BackEdgeState target_state, 5459 BackEdgeState target_state,
5402 Code* replacement_code) { 5460 Code* replacement_code) {
5403 Address mov_address = Assembler::target_address_from_return_address(pc); 5461 Address mov_address = Assembler::target_address_from_return_address(pc);
5404 Address cmp_address = mov_address - 2 * Assembler::kInstrSize; 5462 Address cmp_address = mov_address - 2 * Assembler::kInstrSize;
5405 CodePatcher patcher(cmp_address, 1); 5463 CodePatcher patcher(cmp_address, 1);
5406 5464
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
5461 return ON_STACK_REPLACEMENT; 5519 return ON_STACK_REPLACEMENT;
5462 } 5520 }
5463 5521
5464 DCHECK(interrupt_address == 5522 DCHECK(interrupt_address ==
5465 isolate->builtins()->OsrAfterStackCheck()->entry()); 5523 isolate->builtins()->OsrAfterStackCheck()->entry());
5466 return OSR_AFTER_STACK_CHECK; 5524 return OSR_AFTER_STACK_CHECK;
5467 } 5525 }
5468 } 5526 }
5469 } // namespace v8::internal 5527 } // namespace v8::internal
5470 #endif // V8_TARGET_ARCH_PPC 5528 #endif // V8_TARGET_ARCH_PPC
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698