| 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/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #if V8_TARGET_ARCH_MIPS64 | 7 #if V8_TARGET_ARCH_MIPS64 |
| 8 | 8 |
| 9 // Note on Mips implementation: | 9 // Note on Mips implementation: |
| 10 // | 10 // |
| (...skipping 1231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1242 PrepareForBailoutForId(stmt->FilterId(), TOS_REG); | 1242 PrepareForBailoutForId(stmt->FilterId(), TOS_REG); |
| 1243 __ mov(a3, result_register()); | 1243 __ mov(a3, result_register()); |
| 1244 __ Branch(loop_statement.continue_label(), eq, a3, Operand(zero_reg)); | 1244 __ Branch(loop_statement.continue_label(), eq, a3, Operand(zero_reg)); |
| 1245 | 1245 |
| 1246 // Update the 'each' property or variable from the possibly filtered | 1246 // Update the 'each' property or variable from the possibly filtered |
| 1247 // entry in register a3. | 1247 // entry in register a3. |
| 1248 __ bind(&update_each); | 1248 __ bind(&update_each); |
| 1249 __ mov(result_register(), a3); | 1249 __ mov(result_register(), a3); |
| 1250 // Perform the assignment as if via '='. | 1250 // Perform the assignment as if via '='. |
| 1251 { EffectContext context(this); | 1251 { EffectContext context(this); |
| 1252 EmitAssignment(stmt->each()); | 1252 EmitAssignment(stmt->each(), stmt->EachFeedbackSlot()); |
| 1253 PrepareForBailoutForId(stmt->AssignmentId(), NO_REGISTERS); | 1253 PrepareForBailoutForId(stmt->AssignmentId(), NO_REGISTERS); |
| 1254 } | 1254 } |
| 1255 | 1255 |
| 1256 // Generate code for the body of the loop. | 1256 // Generate code for the body of the loop. |
| 1257 Visit(stmt->body()); | 1257 Visit(stmt->body()); |
| 1258 | 1258 |
| 1259 // Generate code for the going to the next element by incrementing | 1259 // Generate code for the going to the next element by incrementing |
| 1260 // the index (smi) stored on top of the stack. | 1260 // the index (smi) stored on top of the stack. |
| 1261 __ bind(loop_statement.continue_label()); | 1261 __ bind(loop_statement.continue_label()); |
| 1262 __ pop(a0); | 1262 __ pop(a0); |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1324 CallLoadIC(NOT_CONTEXTUAL); | 1324 CallLoadIC(NOT_CONTEXTUAL); |
| 1325 | 1325 |
| 1326 Label done; | 1326 Label done; |
| 1327 __ Branch(&done, ne, v0, Operand(isolate()->factory()->undefined_value())); | 1327 __ Branch(&done, ne, v0, Operand(isolate()->factory()->undefined_value())); |
| 1328 __ CallRuntime(Runtime::kThrowNonMethodError, 0); | 1328 __ CallRuntime(Runtime::kThrowNonMethodError, 0); |
| 1329 __ bind(&done); | 1329 __ bind(&done); |
| 1330 } | 1330 } |
| 1331 | 1331 |
| 1332 | 1332 |
| 1333 void FullCodeGenerator::EmitSetHomeObjectIfNeeded(Expression* initializer, | 1333 void FullCodeGenerator::EmitSetHomeObjectIfNeeded(Expression* initializer, |
| 1334 int offset) { | 1334 int offset, |
| 1335 FeedbackVectorICSlot slot) { |
| 1335 if (NeedsHomeObject(initializer)) { | 1336 if (NeedsHomeObject(initializer)) { |
| 1336 __ ld(StoreDescriptor::ReceiverRegister(), MemOperand(sp)); | 1337 __ ld(StoreDescriptor::ReceiverRegister(), MemOperand(sp)); |
| 1337 __ li(StoreDescriptor::NameRegister(), | 1338 __ li(StoreDescriptor::NameRegister(), |
| 1338 Operand(isolate()->factory()->home_object_symbol())); | 1339 Operand(isolate()->factory()->home_object_symbol())); |
| 1339 __ ld(StoreDescriptor::ValueRegister(), | 1340 __ ld(StoreDescriptor::ValueRegister(), |
| 1340 MemOperand(sp, offset * kPointerSize)); | 1341 MemOperand(sp, offset * kPointerSize)); |
| 1342 if (FLAG_vector_stores) EmitLoadStoreICSlot(slot); |
| 1341 CallStoreIC(); | 1343 CallStoreIC(); |
| 1342 } | 1344 } |
| 1343 } | 1345 } |
| 1344 | 1346 |
| 1345 | 1347 |
| 1346 void FullCodeGenerator::EmitLoadGlobalCheckExtensions(VariableProxy* proxy, | 1348 void FullCodeGenerator::EmitLoadGlobalCheckExtensions(VariableProxy* proxy, |
| 1347 TypeofState typeof_state, | 1349 TypeofState typeof_state, |
| 1348 Label* slow) { | 1350 Label* slow) { |
| 1349 Register current = cp; | 1351 Register current = cp; |
| 1350 Register next = a1; | 1352 Register next = a1; |
| (...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1655 __ CallStub(&stub); | 1657 __ CallStub(&stub); |
| 1656 } | 1658 } |
| 1657 PrepareForBailoutForId(expr->CreateLiteralId(), TOS_REG); | 1659 PrepareForBailoutForId(expr->CreateLiteralId(), TOS_REG); |
| 1658 | 1660 |
| 1659 // If result_saved is true the result is on top of the stack. If | 1661 // If result_saved is true the result is on top of the stack. If |
| 1660 // result_saved is false the result is in v0. | 1662 // result_saved is false the result is in v0. |
| 1661 bool result_saved = false; | 1663 bool result_saved = false; |
| 1662 | 1664 |
| 1663 AccessorTable accessor_table(zone()); | 1665 AccessorTable accessor_table(zone()); |
| 1664 int property_index = 0; | 1666 int property_index = 0; |
| 1667 int store_slot_index = 0; |
| 1665 for (; property_index < expr->properties()->length(); property_index++) { | 1668 for (; property_index < expr->properties()->length(); property_index++) { |
| 1666 ObjectLiteral::Property* property = expr->properties()->at(property_index); | 1669 ObjectLiteral::Property* property = expr->properties()->at(property_index); |
| 1667 if (property->is_computed_name()) break; | 1670 if (property->is_computed_name()) break; |
| 1668 if (property->IsCompileTimeValue()) continue; | 1671 if (property->IsCompileTimeValue()) continue; |
| 1669 | 1672 |
| 1670 Literal* key = property->key()->AsLiteral(); | 1673 Literal* key = property->key()->AsLiteral(); |
| 1671 Expression* value = property->value(); | 1674 Expression* value = property->value(); |
| 1672 if (!result_saved) { | 1675 if (!result_saved) { |
| 1673 __ push(v0); // Save result on stack. | 1676 __ push(v0); // Save result on stack. |
| 1674 result_saved = true; | 1677 result_saved = true; |
| 1675 } | 1678 } |
| 1676 switch (property->kind()) { | 1679 switch (property->kind()) { |
| 1677 case ObjectLiteral::Property::CONSTANT: | 1680 case ObjectLiteral::Property::CONSTANT: |
| 1678 UNREACHABLE(); | 1681 UNREACHABLE(); |
| 1679 case ObjectLiteral::Property::MATERIALIZED_LITERAL: | 1682 case ObjectLiteral::Property::MATERIALIZED_LITERAL: |
| 1680 DCHECK(!CompileTimeValue::IsCompileTimeValue(property->value())); | 1683 DCHECK(!CompileTimeValue::IsCompileTimeValue(property->value())); |
| 1681 // Fall through. | 1684 // Fall through. |
| 1682 case ObjectLiteral::Property::COMPUTED: | 1685 case ObjectLiteral::Property::COMPUTED: |
| 1683 // It is safe to use [[Put]] here because the boilerplate already | 1686 // It is safe to use [[Put]] here because the boilerplate already |
| 1684 // contains computed properties with an uninitialized value. | 1687 // contains computed properties with an uninitialized value. |
| 1685 if (key->value()->IsInternalizedString()) { | 1688 if (key->value()->IsInternalizedString()) { |
| 1686 if (property->emit_store()) { | 1689 if (property->emit_store()) { |
| 1687 VisitForAccumulatorValue(value); | 1690 VisitForAccumulatorValue(value); |
| 1688 __ mov(StoreDescriptor::ValueRegister(), result_register()); | 1691 __ mov(StoreDescriptor::ValueRegister(), result_register()); |
| 1689 DCHECK(StoreDescriptor::ValueRegister().is(a0)); | 1692 DCHECK(StoreDescriptor::ValueRegister().is(a0)); |
| 1690 __ li(StoreDescriptor::NameRegister(), Operand(key->value())); | 1693 __ li(StoreDescriptor::NameRegister(), Operand(key->value())); |
| 1691 __ ld(StoreDescriptor::ReceiverRegister(), MemOperand(sp)); | 1694 __ ld(StoreDescriptor::ReceiverRegister(), MemOperand(sp)); |
| 1692 CallStoreIC(key->LiteralFeedbackId()); | 1695 if (FLAG_vector_stores) { |
| 1696 EmitLoadStoreICSlot(expr->GetNthSlot(store_slot_index++)); |
| 1697 CallStoreIC(); |
| 1698 } else { |
| 1699 CallStoreIC(key->LiteralFeedbackId()); |
| 1700 } |
| 1693 PrepareForBailoutForId(key->id(), NO_REGISTERS); | 1701 PrepareForBailoutForId(key->id(), NO_REGISTERS); |
| 1694 | 1702 |
| 1695 if (NeedsHomeObject(value)) { | 1703 if (NeedsHomeObject(value)) { |
| 1696 __ Move(StoreDescriptor::ReceiverRegister(), v0); | 1704 __ Move(StoreDescriptor::ReceiverRegister(), v0); |
| 1697 __ li(StoreDescriptor::NameRegister(), | 1705 __ li(StoreDescriptor::NameRegister(), |
| 1698 Operand(isolate()->factory()->home_object_symbol())); | 1706 Operand(isolate()->factory()->home_object_symbol())); |
| 1699 __ ld(StoreDescriptor::ValueRegister(), MemOperand(sp)); | 1707 __ ld(StoreDescriptor::ValueRegister(), MemOperand(sp)); |
| 1708 if (FLAG_vector_stores) { |
| 1709 EmitLoadStoreICSlot(expr->GetNthSlot(store_slot_index++)); |
| 1710 } |
| 1700 CallStoreIC(); | 1711 CallStoreIC(); |
| 1701 } | 1712 } |
| 1702 } else { | 1713 } else { |
| 1703 VisitForEffect(value); | 1714 VisitForEffect(value); |
| 1704 } | 1715 } |
| 1705 break; | 1716 break; |
| 1706 } | 1717 } |
| 1707 // Duplicate receiver on stack. | 1718 // Duplicate receiver on stack. |
| 1708 __ ld(a0, MemOperand(sp)); | 1719 __ ld(a0, MemOperand(sp)); |
| 1709 __ push(a0); | 1720 __ push(a0); |
| 1710 VisitForStackValue(key); | 1721 VisitForStackValue(key); |
| 1711 VisitForStackValue(value); | 1722 VisitForStackValue(value); |
| 1712 if (property->emit_store()) { | 1723 if (property->emit_store()) { |
| 1713 EmitSetHomeObjectIfNeeded(value, 2); | 1724 EmitSetHomeObjectIfNeeded( |
| 1725 value, 2, expr->SlotForHomeObject(value, &store_slot_index)); |
| 1714 __ li(a0, Operand(Smi::FromInt(SLOPPY))); // PropertyAttributes. | 1726 __ li(a0, Operand(Smi::FromInt(SLOPPY))); // PropertyAttributes. |
| 1715 __ push(a0); | 1727 __ push(a0); |
| 1716 __ CallRuntime(Runtime::kSetProperty, 4); | 1728 __ CallRuntime(Runtime::kSetProperty, 4); |
| 1717 } else { | 1729 } else { |
| 1718 __ Drop(3); | 1730 __ Drop(3); |
| 1719 } | 1731 } |
| 1720 break; | 1732 break; |
| 1721 case ObjectLiteral::Property::PROTOTYPE: | 1733 case ObjectLiteral::Property::PROTOTYPE: |
| 1722 // Duplicate receiver on stack. | 1734 // Duplicate receiver on stack. |
| 1723 __ ld(a0, MemOperand(sp)); | 1735 __ ld(a0, MemOperand(sp)); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1741 | 1753 |
| 1742 // Emit code to define accessors, using only a single call to the runtime for | 1754 // Emit code to define accessors, using only a single call to the runtime for |
| 1743 // each pair of corresponding getters and setters. | 1755 // each pair of corresponding getters and setters. |
| 1744 for (AccessorTable::Iterator it = accessor_table.begin(); | 1756 for (AccessorTable::Iterator it = accessor_table.begin(); |
| 1745 it != accessor_table.end(); | 1757 it != accessor_table.end(); |
| 1746 ++it) { | 1758 ++it) { |
| 1747 __ ld(a0, MemOperand(sp)); // Duplicate receiver. | 1759 __ ld(a0, MemOperand(sp)); // Duplicate receiver. |
| 1748 __ push(a0); | 1760 __ push(a0); |
| 1749 VisitForStackValue(it->first); | 1761 VisitForStackValue(it->first); |
| 1750 EmitAccessor(it->second->getter); | 1762 EmitAccessor(it->second->getter); |
| 1751 EmitSetHomeObjectIfNeeded(it->second->getter, 2); | 1763 EmitSetHomeObjectIfNeeded( |
| 1764 it->second->getter, 2, |
| 1765 expr->SlotForHomeObject(it->second->getter, &store_slot_index)); |
| 1752 EmitAccessor(it->second->setter); | 1766 EmitAccessor(it->second->setter); |
| 1753 EmitSetHomeObjectIfNeeded(it->second->setter, 3); | 1767 EmitSetHomeObjectIfNeeded( |
| 1768 it->second->setter, 3, |
| 1769 expr->SlotForHomeObject(it->second->setter, &store_slot_index)); |
| 1754 __ li(a0, Operand(Smi::FromInt(NONE))); | 1770 __ li(a0, Operand(Smi::FromInt(NONE))); |
| 1755 __ push(a0); | 1771 __ push(a0); |
| 1756 __ CallRuntime(Runtime::kDefineAccessorPropertyUnchecked, 5); | 1772 __ CallRuntime(Runtime::kDefineAccessorPropertyUnchecked, 5); |
| 1757 } | 1773 } |
| 1758 | 1774 |
| 1759 // Object literals have two parts. The "static" part on the left contains no | 1775 // Object literals have two parts. The "static" part on the left contains no |
| 1760 // computed property names, and so we can compute its map ahead of time; see | 1776 // computed property names, and so we can compute its map ahead of time; see |
| 1761 // runtime.cc::CreateObjectLiteralBoilerplate. The second "dynamic" part | 1777 // runtime.cc::CreateObjectLiteralBoilerplate. The second "dynamic" part |
| 1762 // starts with the first computed property name, and continues with all | 1778 // starts with the first computed property name, and continues with all |
| 1763 // properties to its right. All the code from above initializes the static | 1779 // properties to its right. All the code from above initializes the static |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1778 __ push(a0); | 1794 __ push(a0); |
| 1779 | 1795 |
| 1780 if (property->kind() == ObjectLiteral::Property::PROTOTYPE) { | 1796 if (property->kind() == ObjectLiteral::Property::PROTOTYPE) { |
| 1781 DCHECK(!property->is_computed_name()); | 1797 DCHECK(!property->is_computed_name()); |
| 1782 VisitForStackValue(value); | 1798 VisitForStackValue(value); |
| 1783 DCHECK(property->emit_store()); | 1799 DCHECK(property->emit_store()); |
| 1784 __ CallRuntime(Runtime::kInternalSetPrototype, 2); | 1800 __ CallRuntime(Runtime::kInternalSetPrototype, 2); |
| 1785 } else { | 1801 } else { |
| 1786 EmitPropertyKey(property, expr->GetIdForProperty(property_index)); | 1802 EmitPropertyKey(property, expr->GetIdForProperty(property_index)); |
| 1787 VisitForStackValue(value); | 1803 VisitForStackValue(value); |
| 1788 EmitSetHomeObjectIfNeeded(value, 2); | 1804 EmitSetHomeObjectIfNeeded( |
| 1805 value, 2, expr->SlotForHomeObject(value, &store_slot_index)); |
| 1789 | 1806 |
| 1790 switch (property->kind()) { | 1807 switch (property->kind()) { |
| 1791 case ObjectLiteral::Property::CONSTANT: | 1808 case ObjectLiteral::Property::CONSTANT: |
| 1792 case ObjectLiteral::Property::MATERIALIZED_LITERAL: | 1809 case ObjectLiteral::Property::MATERIALIZED_LITERAL: |
| 1793 case ObjectLiteral::Property::COMPUTED: | 1810 case ObjectLiteral::Property::COMPUTED: |
| 1794 if (property->emit_store()) { | 1811 if (property->emit_store()) { |
| 1795 __ li(a0, Operand(Smi::FromInt(NONE))); | 1812 __ li(a0, Operand(Smi::FromInt(NONE))); |
| 1796 __ push(a0); | 1813 __ push(a0); |
| 1797 __ CallRuntime(Runtime::kDefineDataPropertyUnchecked, 4); | 1814 __ CallRuntime(Runtime::kDefineDataPropertyUnchecked, 4); |
| 1798 } else { | 1815 } else { |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1940 } | 1957 } |
| 1941 } | 1958 } |
| 1942 | 1959 |
| 1943 | 1960 |
| 1944 void FullCodeGenerator::VisitAssignment(Assignment* expr) { | 1961 void FullCodeGenerator::VisitAssignment(Assignment* expr) { |
| 1945 DCHECK(expr->target()->IsValidReferenceExpression()); | 1962 DCHECK(expr->target()->IsValidReferenceExpression()); |
| 1946 | 1963 |
| 1947 Comment cmnt(masm_, "[ Assignment"); | 1964 Comment cmnt(masm_, "[ Assignment"); |
| 1948 | 1965 |
| 1949 Property* property = expr->target()->AsProperty(); | 1966 Property* property = expr->target()->AsProperty(); |
| 1950 LhsKind assign_type = GetAssignType(property); | 1967 LhsKind assign_type = Property::GetAssignType(property); |
| 1951 | 1968 |
| 1952 // Evaluate LHS expression. | 1969 // Evaluate LHS expression. |
| 1953 switch (assign_type) { | 1970 switch (assign_type) { |
| 1954 case VARIABLE: | 1971 case VARIABLE: |
| 1955 // Nothing to do here. | 1972 // Nothing to do here. |
| 1956 break; | 1973 break; |
| 1957 case NAMED_PROPERTY: | 1974 case NAMED_PROPERTY: |
| 1958 if (expr->is_compound()) { | 1975 if (expr->is_compound()) { |
| 1959 // We need the receiver both on the stack and in the register. | 1976 // We need the receiver both on the stack and in the register. |
| 1960 VisitForStackValue(property->obj()); | 1977 VisitForStackValue(property->obj()); |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2051 VisitForAccumulatorValue(expr->value()); | 2068 VisitForAccumulatorValue(expr->value()); |
| 2052 } | 2069 } |
| 2053 | 2070 |
| 2054 // Record source position before possible IC call. | 2071 // Record source position before possible IC call. |
| 2055 SetSourcePosition(expr->position()); | 2072 SetSourcePosition(expr->position()); |
| 2056 | 2073 |
| 2057 // Store the value. | 2074 // Store the value. |
| 2058 switch (assign_type) { | 2075 switch (assign_type) { |
| 2059 case VARIABLE: | 2076 case VARIABLE: |
| 2060 EmitVariableAssignment(expr->target()->AsVariableProxy()->var(), | 2077 EmitVariableAssignment(expr->target()->AsVariableProxy()->var(), |
| 2061 expr->op()); | 2078 expr->op(), expr->AssignmentSlot()); |
| 2062 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 2079 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |
| 2063 context()->Plug(v0); | 2080 context()->Plug(v0); |
| 2064 break; | 2081 break; |
| 2065 case NAMED_PROPERTY: | 2082 case NAMED_PROPERTY: |
| 2066 EmitNamedPropertyAssignment(expr); | 2083 EmitNamedPropertyAssignment(expr); |
| 2067 break; | 2084 break; |
| 2068 case NAMED_SUPER_PROPERTY: | 2085 case NAMED_SUPER_PROPERTY: |
| 2069 EmitNamedSuperPropertyStore(property); | 2086 EmitNamedSuperPropertyStore(property); |
| 2070 context()->Plug(v0); | 2087 context()->Plug(v0); |
| 2071 break; | 2088 break; |
| (...skipping 504 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2576 __ pop(a1); | 2593 __ pop(a1); |
| 2577 Handle<Code> code = CodeFactory::BinaryOpIC( | 2594 Handle<Code> code = CodeFactory::BinaryOpIC( |
| 2578 isolate(), op, language_mode()).code(); | 2595 isolate(), op, language_mode()).code(); |
| 2579 JumpPatchSite patch_site(masm_); // unbound, signals no inlined smi code. | 2596 JumpPatchSite patch_site(masm_); // unbound, signals no inlined smi code. |
| 2580 CallIC(code, expr->BinaryOperationFeedbackId()); | 2597 CallIC(code, expr->BinaryOperationFeedbackId()); |
| 2581 patch_site.EmitPatchInfo(); | 2598 patch_site.EmitPatchInfo(); |
| 2582 context()->Plug(v0); | 2599 context()->Plug(v0); |
| 2583 } | 2600 } |
| 2584 | 2601 |
| 2585 | 2602 |
| 2586 void FullCodeGenerator::EmitAssignment(Expression* expr) { | 2603 void FullCodeGenerator::EmitAssignment(Expression* expr, |
| 2604 FeedbackVectorICSlot slot) { |
| 2587 DCHECK(expr->IsValidReferenceExpression()); | 2605 DCHECK(expr->IsValidReferenceExpression()); |
| 2588 | 2606 |
| 2589 Property* prop = expr->AsProperty(); | 2607 Property* prop = expr->AsProperty(); |
| 2590 LhsKind assign_type = GetAssignType(prop); | 2608 LhsKind assign_type = Property::GetAssignType(prop); |
| 2591 | 2609 |
| 2592 switch (assign_type) { | 2610 switch (assign_type) { |
| 2593 case VARIABLE: { | 2611 case VARIABLE: { |
| 2594 Variable* var = expr->AsVariableProxy()->var(); | 2612 Variable* var = expr->AsVariableProxy()->var(); |
| 2595 EffectContext context(this); | 2613 EffectContext context(this); |
| 2596 EmitVariableAssignment(var, Token::ASSIGN); | 2614 EmitVariableAssignment(var, Token::ASSIGN, slot); |
| 2597 break; | 2615 break; |
| 2598 } | 2616 } |
| 2599 case NAMED_PROPERTY: { | 2617 case NAMED_PROPERTY: { |
| 2600 __ push(result_register()); // Preserve value. | 2618 __ push(result_register()); // Preserve value. |
| 2601 VisitForAccumulatorValue(prop->obj()); | 2619 VisitForAccumulatorValue(prop->obj()); |
| 2602 __ mov(StoreDescriptor::ReceiverRegister(), result_register()); | 2620 __ mov(StoreDescriptor::ReceiverRegister(), result_register()); |
| 2603 __ pop(StoreDescriptor::ValueRegister()); // Restore value. | 2621 __ pop(StoreDescriptor::ValueRegister()); // Restore value. |
| 2604 __ li(StoreDescriptor::NameRegister(), | 2622 __ li(StoreDescriptor::NameRegister(), |
| 2605 Operand(prop->key()->AsLiteral()->value())); | 2623 Operand(prop->key()->AsLiteral()->value())); |
| 2624 if (FLAG_vector_stores) EmitLoadStoreICSlot(slot); |
| 2606 CallStoreIC(); | 2625 CallStoreIC(); |
| 2607 break; | 2626 break; |
| 2608 } | 2627 } |
| 2609 case NAMED_SUPER_PROPERTY: { | 2628 case NAMED_SUPER_PROPERTY: { |
| 2610 __ Push(v0); | 2629 __ Push(v0); |
| 2611 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); | 2630 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); |
| 2612 EmitLoadHomeObject(prop->obj()->AsSuperReference()); | 2631 EmitLoadHomeObject(prop->obj()->AsSuperReference()); |
| 2613 // stack: value, this; v0: home_object | 2632 // stack: value, this; v0: home_object |
| 2614 Register scratch = a2; | 2633 Register scratch = a2; |
| 2615 Register scratch2 = a3; | 2634 Register scratch2 = a3; |
| (...skipping 26 matching lines...) Expand all Loading... |
| 2642 EmitKeyedSuperPropertyStore(prop); | 2661 EmitKeyedSuperPropertyStore(prop); |
| 2643 break; | 2662 break; |
| 2644 } | 2663 } |
| 2645 case KEYED_PROPERTY: { | 2664 case KEYED_PROPERTY: { |
| 2646 __ push(result_register()); // Preserve value. | 2665 __ push(result_register()); // Preserve value. |
| 2647 VisitForStackValue(prop->obj()); | 2666 VisitForStackValue(prop->obj()); |
| 2648 VisitForAccumulatorValue(prop->key()); | 2667 VisitForAccumulatorValue(prop->key()); |
| 2649 __ Move(StoreDescriptor::NameRegister(), result_register()); | 2668 __ Move(StoreDescriptor::NameRegister(), result_register()); |
| 2650 __ Pop(StoreDescriptor::ValueRegister(), | 2669 __ Pop(StoreDescriptor::ValueRegister(), |
| 2651 StoreDescriptor::ReceiverRegister()); | 2670 StoreDescriptor::ReceiverRegister()); |
| 2671 if (FLAG_vector_stores) EmitLoadStoreICSlot(slot); |
| 2652 Handle<Code> ic = | 2672 Handle<Code> ic = |
| 2653 CodeFactory::KeyedStoreIC(isolate(), language_mode()).code(); | 2673 CodeFactory::KeyedStoreIC(isolate(), language_mode()).code(); |
| 2654 CallIC(ic); | 2674 CallIC(ic); |
| 2655 break; | 2675 break; |
| 2656 } | 2676 } |
| 2657 } | 2677 } |
| 2658 context()->Plug(v0); | 2678 context()->Plug(v0); |
| 2659 } | 2679 } |
| 2660 | 2680 |
| 2661 | 2681 |
| 2662 void FullCodeGenerator::EmitStoreToStackLocalOrContextSlot( | 2682 void FullCodeGenerator::EmitStoreToStackLocalOrContextSlot( |
| 2663 Variable* var, MemOperand location) { | 2683 Variable* var, MemOperand location) { |
| 2664 __ sd(result_register(), location); | 2684 __ sd(result_register(), location); |
| 2665 if (var->IsContextSlot()) { | 2685 if (var->IsContextSlot()) { |
| 2666 // RecordWrite may destroy all its register arguments. | 2686 // RecordWrite may destroy all its register arguments. |
| 2667 __ Move(a3, result_register()); | 2687 __ Move(a3, result_register()); |
| 2668 int offset = Context::SlotOffset(var->index()); | 2688 int offset = Context::SlotOffset(var->index()); |
| 2669 __ RecordWriteContextSlot( | 2689 __ RecordWriteContextSlot( |
| 2670 a1, offset, a3, a2, kRAHasBeenSaved, kDontSaveFPRegs); | 2690 a1, offset, a3, a2, kRAHasBeenSaved, kDontSaveFPRegs); |
| 2671 } | 2691 } |
| 2672 } | 2692 } |
| 2673 | 2693 |
| 2674 | 2694 |
| 2675 void FullCodeGenerator::EmitVariableAssignment(Variable* var, Token::Value op) { | 2695 void FullCodeGenerator::EmitVariableAssignment(Variable* var, Token::Value op, |
| 2696 FeedbackVectorICSlot slot) { |
| 2676 if (var->IsUnallocated()) { | 2697 if (var->IsUnallocated()) { |
| 2677 // Global var, const, or let. | 2698 // Global var, const, or let. |
| 2678 __ mov(StoreDescriptor::ValueRegister(), result_register()); | 2699 __ mov(StoreDescriptor::ValueRegister(), result_register()); |
| 2679 __ li(StoreDescriptor::NameRegister(), Operand(var->name())); | 2700 __ li(StoreDescriptor::NameRegister(), Operand(var->name())); |
| 2680 __ ld(StoreDescriptor::ReceiverRegister(), GlobalObjectOperand()); | 2701 __ ld(StoreDescriptor::ReceiverRegister(), GlobalObjectOperand()); |
| 2702 if (FLAG_vector_stores) EmitLoadStoreICSlot(slot); |
| 2681 CallStoreIC(); | 2703 CallStoreIC(); |
| 2682 | 2704 |
| 2683 } else if (var->mode() == LET && op != Token::INIT_LET) { | 2705 } else if (var->mode() == LET && op != Token::INIT_LET) { |
| 2684 // Non-initializing assignment to let variable needs a write barrier. | 2706 // Non-initializing assignment to let variable needs a write barrier. |
| 2685 DCHECK(!var->IsLookupSlot()); | 2707 DCHECK(!var->IsLookupSlot()); |
| 2686 DCHECK(var->IsStackAllocated() || var->IsContextSlot()); | 2708 DCHECK(var->IsStackAllocated() || var->IsContextSlot()); |
| 2687 Label assign; | 2709 Label assign; |
| 2688 MemOperand location = VarOperand(var, a1); | 2710 MemOperand location = VarOperand(var, a1); |
| 2689 __ ld(a3, location); | 2711 __ ld(a3, location); |
| 2690 __ LoadRoot(a4, Heap::kTheHoleValueRootIndex); | 2712 __ LoadRoot(a4, Heap::kTheHoleValueRootIndex); |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2769 Property* prop = expr->target()->AsProperty(); | 2791 Property* prop = expr->target()->AsProperty(); |
| 2770 DCHECK(prop != NULL); | 2792 DCHECK(prop != NULL); |
| 2771 DCHECK(prop->key()->IsLiteral()); | 2793 DCHECK(prop->key()->IsLiteral()); |
| 2772 | 2794 |
| 2773 // Record source code position before IC call. | 2795 // Record source code position before IC call. |
| 2774 SetSourcePosition(expr->position()); | 2796 SetSourcePosition(expr->position()); |
| 2775 __ mov(StoreDescriptor::ValueRegister(), result_register()); | 2797 __ mov(StoreDescriptor::ValueRegister(), result_register()); |
| 2776 __ li(StoreDescriptor::NameRegister(), | 2798 __ li(StoreDescriptor::NameRegister(), |
| 2777 Operand(prop->key()->AsLiteral()->value())); | 2799 Operand(prop->key()->AsLiteral()->value())); |
| 2778 __ pop(StoreDescriptor::ReceiverRegister()); | 2800 __ pop(StoreDescriptor::ReceiverRegister()); |
| 2779 CallStoreIC(expr->AssignmentFeedbackId()); | 2801 if (FLAG_vector_stores) { |
| 2802 EmitLoadStoreICSlot(expr->AssignmentSlot()); |
| 2803 CallStoreIC(); |
| 2804 } else { |
| 2805 CallStoreIC(expr->AssignmentFeedbackId()); |
| 2806 } |
| 2780 | 2807 |
| 2781 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 2808 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |
| 2782 context()->Plug(v0); | 2809 context()->Plug(v0); |
| 2783 } | 2810 } |
| 2784 | 2811 |
| 2785 | 2812 |
| 2786 void FullCodeGenerator::EmitNamedSuperPropertyStore(Property* prop) { | 2813 void FullCodeGenerator::EmitNamedSuperPropertyStore(Property* prop) { |
| 2787 // Assignment to named property of super. | 2814 // Assignment to named property of super. |
| 2788 // v0 : value | 2815 // v0 : value |
| 2789 // stack : receiver ('this'), home_object | 2816 // stack : receiver ('this'), home_object |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2822 // The arguments are: | 2849 // The arguments are: |
| 2823 // - a0 is the value, | 2850 // - a0 is the value, |
| 2824 // - a1 is the key, | 2851 // - a1 is the key, |
| 2825 // - a2 is the receiver. | 2852 // - a2 is the receiver. |
| 2826 __ mov(StoreDescriptor::ValueRegister(), result_register()); | 2853 __ mov(StoreDescriptor::ValueRegister(), result_register()); |
| 2827 __ Pop(StoreDescriptor::ReceiverRegister(), StoreDescriptor::NameRegister()); | 2854 __ Pop(StoreDescriptor::ReceiverRegister(), StoreDescriptor::NameRegister()); |
| 2828 DCHECK(StoreDescriptor::ValueRegister().is(a0)); | 2855 DCHECK(StoreDescriptor::ValueRegister().is(a0)); |
| 2829 | 2856 |
| 2830 Handle<Code> ic = | 2857 Handle<Code> ic = |
| 2831 CodeFactory::KeyedStoreIC(isolate(), language_mode()).code(); | 2858 CodeFactory::KeyedStoreIC(isolate(), language_mode()).code(); |
| 2832 CallIC(ic, expr->AssignmentFeedbackId()); | 2859 if (FLAG_vector_stores) { |
| 2860 EmitLoadStoreICSlot(expr->AssignmentSlot()); |
| 2861 CallIC(ic); |
| 2862 } else { |
| 2863 CallIC(ic, expr->AssignmentFeedbackId()); |
| 2864 } |
| 2833 | 2865 |
| 2834 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 2866 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |
| 2835 context()->Plug(v0); | 2867 context()->Plug(v0); |
| 2836 } | 2868 } |
| 2837 | 2869 |
| 2838 | 2870 |
| 2839 void FullCodeGenerator::VisitProperty(Property* expr) { | 2871 void FullCodeGenerator::VisitProperty(Property* expr) { |
| 2840 Comment cmnt(masm_, "[ Property"); | 2872 Comment cmnt(masm_, "[ Property"); |
| 2841 Expression* key = expr->key(); | 2873 Expression* key = expr->key(); |
| 2842 | 2874 |
| (...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3061 | 3093 |
| 3062 | 3094 |
| 3063 void FullCodeGenerator::EmitLoadSuperConstructor() { | 3095 void FullCodeGenerator::EmitLoadSuperConstructor() { |
| 3064 __ ld(a0, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset)); | 3096 __ ld(a0, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset)); |
| 3065 __ Push(a0); | 3097 __ Push(a0); |
| 3066 __ CallRuntime(Runtime::kGetPrototype, 1); | 3098 __ CallRuntime(Runtime::kGetPrototype, 1); |
| 3067 } | 3099 } |
| 3068 | 3100 |
| 3069 | 3101 |
| 3070 void FullCodeGenerator::EmitInitializeThisAfterSuper( | 3102 void FullCodeGenerator::EmitInitializeThisAfterSuper( |
| 3071 SuperReference* super_ref) { | 3103 SuperReference* super_ref, FeedbackVectorICSlot slot) { |
| 3072 Variable* this_var = super_ref->this_var()->var(); | 3104 Variable* this_var = super_ref->this_var()->var(); |
| 3073 GetVar(a1, this_var); | 3105 GetVar(a1, this_var); |
| 3074 __ LoadRoot(at, Heap::kTheHoleValueRootIndex); | 3106 __ LoadRoot(at, Heap::kTheHoleValueRootIndex); |
| 3075 Label uninitialized_this; | 3107 Label uninitialized_this; |
| 3076 __ Branch(&uninitialized_this, eq, a1, Operand(at)); | 3108 __ Branch(&uninitialized_this, eq, a1, Operand(at)); |
| 3077 __ li(a0, Operand(this_var->name())); | 3109 __ li(a0, Operand(this_var->name())); |
| 3078 __ Push(a0); | 3110 __ Push(a0); |
| 3079 __ CallRuntime(Runtime::kThrowReferenceError, 1); | 3111 __ CallRuntime(Runtime::kThrowReferenceError, 1); |
| 3080 __ bind(&uninitialized_this); | 3112 __ bind(&uninitialized_this); |
| 3081 | 3113 |
| 3082 EmitVariableAssignment(this_var, Token::INIT_CONST); | 3114 EmitVariableAssignment(this_var, Token::INIT_CONST, slot); |
| 3083 } | 3115 } |
| 3084 | 3116 |
| 3085 | 3117 |
| 3086 void FullCodeGenerator::VisitCall(Call* expr) { | 3118 void FullCodeGenerator::VisitCall(Call* expr) { |
| 3087 #ifdef DEBUG | 3119 #ifdef DEBUG |
| 3088 // We want to verify that RecordJSReturnSite gets called on all paths | 3120 // We want to verify that RecordJSReturnSite gets called on all paths |
| 3089 // through this function. Avoid early returns. | 3121 // through this function. Avoid early returns. |
| 3090 expr->return_is_recorded_ = false; | 3122 expr->return_is_recorded_ = false; |
| 3091 #endif | 3123 #endif |
| 3092 | 3124 |
| (...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3297 __ li(a2, FeedbackVector()); | 3329 __ li(a2, FeedbackVector()); |
| 3298 __ li(a3, Operand(SmiFromSlot(expr->CallFeedbackSlot()))); | 3330 __ li(a3, Operand(SmiFromSlot(expr->CallFeedbackSlot()))); |
| 3299 | 3331 |
| 3300 CallConstructStub stub(isolate(), SUPER_CALL_RECORD_TARGET); | 3332 CallConstructStub stub(isolate(), SUPER_CALL_RECORD_TARGET); |
| 3301 __ Call(stub.GetCode(), RelocInfo::CONSTRUCT_CALL); | 3333 __ Call(stub.GetCode(), RelocInfo::CONSTRUCT_CALL); |
| 3302 | 3334 |
| 3303 __ Drop(1); | 3335 __ Drop(1); |
| 3304 | 3336 |
| 3305 RecordJSReturnSite(expr); | 3337 RecordJSReturnSite(expr); |
| 3306 | 3338 |
| 3307 EmitInitializeThisAfterSuper(expr->expression()->AsSuperReference()); | 3339 EmitInitializeThisAfterSuper(expr->expression()->AsSuperReference(), |
| 3340 expr->CallFeedbackICSlot()); |
| 3308 context()->Plug(v0); | 3341 context()->Plug(v0); |
| 3309 } | 3342 } |
| 3310 | 3343 |
| 3311 | 3344 |
| 3312 void FullCodeGenerator::EmitIsSmi(CallRuntime* expr) { | 3345 void FullCodeGenerator::EmitIsSmi(CallRuntime* expr) { |
| 3313 ZoneList<Expression*>* args = expr->arguments(); | 3346 ZoneList<Expression*>* args = expr->arguments(); |
| 3314 DCHECK(args->length() == 1); | 3347 DCHECK(args->length() == 1); |
| 3315 | 3348 |
| 3316 VisitForAccumulatorValue(args->at(0)); | 3349 VisitForAccumulatorValue(args->at(0)); |
| 3317 | 3350 |
| (...skipping 1304 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4622 // Push NewTarget | 4655 // Push NewTarget |
| 4623 DCHECK(args->at(2)->IsVariableProxy()); | 4656 DCHECK(args->at(2)->IsVariableProxy()); |
| 4624 VisitForStackValue(args->at(2)); | 4657 VisitForStackValue(args->at(2)); |
| 4625 | 4658 |
| 4626 EmitCallJSRuntimeFunction(call); | 4659 EmitCallJSRuntimeFunction(call); |
| 4627 | 4660 |
| 4628 // Restore context register. | 4661 // Restore context register. |
| 4629 __ ld(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); | 4662 __ ld(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); |
| 4630 context()->DropAndPlug(1, v0); | 4663 context()->DropAndPlug(1, v0); |
| 4631 | 4664 |
| 4665 // TODO(mvstanton): with FLAG_vector_stores this needs a slot id. |
| 4632 EmitInitializeThisAfterSuper(super_reference); | 4666 EmitInitializeThisAfterSuper(super_reference); |
| 4633 } | 4667 } |
| 4634 | 4668 |
| 4635 | 4669 |
| 4636 void FullCodeGenerator::EmitLoadJSRuntimeFunction(CallRuntime* expr) { | 4670 void FullCodeGenerator::EmitLoadJSRuntimeFunction(CallRuntime* expr) { |
| 4637 // Push the builtins object as the receiver. | 4671 // Push the builtins object as the receiver. |
| 4638 Register receiver = LoadDescriptor::ReceiverRegister(); | 4672 Register receiver = LoadDescriptor::ReceiverRegister(); |
| 4639 __ ld(receiver, GlobalObjectOperand()); | 4673 __ ld(receiver, GlobalObjectOperand()); |
| 4640 __ ld(receiver, FieldMemOperand(receiver, GlobalObject::kBuiltinsOffset)); | 4674 __ ld(receiver, FieldMemOperand(receiver, GlobalObject::kBuiltinsOffset)); |
| 4641 __ push(receiver); | 4675 __ push(receiver); |
| (...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4823 } | 4857 } |
| 4824 | 4858 |
| 4825 | 4859 |
| 4826 void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { | 4860 void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { |
| 4827 DCHECK(expr->expression()->IsValidReferenceExpression()); | 4861 DCHECK(expr->expression()->IsValidReferenceExpression()); |
| 4828 | 4862 |
| 4829 Comment cmnt(masm_, "[ CountOperation"); | 4863 Comment cmnt(masm_, "[ CountOperation"); |
| 4830 SetSourcePosition(expr->position()); | 4864 SetSourcePosition(expr->position()); |
| 4831 | 4865 |
| 4832 Property* prop = expr->expression()->AsProperty(); | 4866 Property* prop = expr->expression()->AsProperty(); |
| 4833 LhsKind assign_type = GetAssignType(prop); | 4867 LhsKind assign_type = Property::GetAssignType(prop); |
| 4834 | 4868 |
| 4835 // Evaluate expression and get value. | 4869 // Evaluate expression and get value. |
| 4836 if (assign_type == VARIABLE) { | 4870 if (assign_type == VARIABLE) { |
| 4837 DCHECK(expr->expression()->AsVariableProxy()->var() != NULL); | 4871 DCHECK(expr->expression()->AsVariableProxy()->var() != NULL); |
| 4838 AccumulatorValueContext context(this); | 4872 AccumulatorValueContext context(this); |
| 4839 EmitVariableLoad(expr->expression()->AsVariableProxy()); | 4873 EmitVariableLoad(expr->expression()->AsVariableProxy()); |
| 4840 } else { | 4874 } else { |
| 4841 // Reserve space for result of postfix operation. | 4875 // Reserve space for result of postfix operation. |
| 4842 if (expr->is_postfix() && !context()->IsEffect()) { | 4876 if (expr->is_postfix() && !context()->IsEffect()) { |
| 4843 __ li(at, Operand(Smi::FromInt(0))); | 4877 __ li(at, Operand(Smi::FromInt(0))); |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4988 CallIC(code, expr->CountBinOpFeedbackId()); | 5022 CallIC(code, expr->CountBinOpFeedbackId()); |
| 4989 patch_site.EmitPatchInfo(); | 5023 patch_site.EmitPatchInfo(); |
| 4990 __ bind(&done); | 5024 __ bind(&done); |
| 4991 | 5025 |
| 4992 // Store the value returned in v0. | 5026 // Store the value returned in v0. |
| 4993 switch (assign_type) { | 5027 switch (assign_type) { |
| 4994 case VARIABLE: | 5028 case VARIABLE: |
| 4995 if (expr->is_postfix()) { | 5029 if (expr->is_postfix()) { |
| 4996 { EffectContext context(this); | 5030 { EffectContext context(this); |
| 4997 EmitVariableAssignment(expr->expression()->AsVariableProxy()->var(), | 5031 EmitVariableAssignment(expr->expression()->AsVariableProxy()->var(), |
| 4998 Token::ASSIGN); | 5032 Token::ASSIGN, expr->CountSlot()); |
| 4999 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 5033 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |
| 5000 context.Plug(v0); | 5034 context.Plug(v0); |
| 5001 } | 5035 } |
| 5002 // For all contexts except EffectConstant we have the result on | 5036 // For all contexts except EffectConstant we have the result on |
| 5003 // top of the stack. | 5037 // top of the stack. |
| 5004 if (!context()->IsEffect()) { | 5038 if (!context()->IsEffect()) { |
| 5005 context()->PlugTOS(); | 5039 context()->PlugTOS(); |
| 5006 } | 5040 } |
| 5007 } else { | 5041 } else { |
| 5008 EmitVariableAssignment(expr->expression()->AsVariableProxy()->var(), | 5042 EmitVariableAssignment(expr->expression()->AsVariableProxy()->var(), |
| 5009 Token::ASSIGN); | 5043 Token::ASSIGN); |
| 5010 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 5044 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |
| 5011 context()->Plug(v0); | 5045 context()->Plug(v0); |
| 5012 } | 5046 } |
| 5013 break; | 5047 break; |
| 5014 case NAMED_PROPERTY: { | 5048 case NAMED_PROPERTY: { |
| 5015 __ mov(StoreDescriptor::ValueRegister(), result_register()); | 5049 __ mov(StoreDescriptor::ValueRegister(), result_register()); |
| 5016 __ li(StoreDescriptor::NameRegister(), | 5050 __ li(StoreDescriptor::NameRegister(), |
| 5017 Operand(prop->key()->AsLiteral()->value())); | 5051 Operand(prop->key()->AsLiteral()->value())); |
| 5018 __ pop(StoreDescriptor::ReceiverRegister()); | 5052 __ pop(StoreDescriptor::ReceiverRegister()); |
| 5019 CallStoreIC(expr->CountStoreFeedbackId()); | 5053 if (FLAG_vector_stores) { |
| 5054 EmitLoadStoreICSlot(expr->CountSlot()); |
| 5055 CallStoreIC(); |
| 5056 } else { |
| 5057 CallStoreIC(expr->CountStoreFeedbackId()); |
| 5058 } |
| 5020 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 5059 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |
| 5021 if (expr->is_postfix()) { | 5060 if (expr->is_postfix()) { |
| 5022 if (!context()->IsEffect()) { | 5061 if (!context()->IsEffect()) { |
| 5023 context()->PlugTOS(); | 5062 context()->PlugTOS(); |
| 5024 } | 5063 } |
| 5025 } else { | 5064 } else { |
| 5026 context()->Plug(v0); | 5065 context()->Plug(v0); |
| 5027 } | 5066 } |
| 5028 break; | 5067 break; |
| 5029 } | 5068 } |
| (...skipping 18 matching lines...) Expand all Loading... |
| 5048 context()->Plug(v0); | 5087 context()->Plug(v0); |
| 5049 } | 5088 } |
| 5050 break; | 5089 break; |
| 5051 } | 5090 } |
| 5052 case KEYED_PROPERTY: { | 5091 case KEYED_PROPERTY: { |
| 5053 __ mov(StoreDescriptor::ValueRegister(), result_register()); | 5092 __ mov(StoreDescriptor::ValueRegister(), result_register()); |
| 5054 __ Pop(StoreDescriptor::ReceiverRegister(), | 5093 __ Pop(StoreDescriptor::ReceiverRegister(), |
| 5055 StoreDescriptor::NameRegister()); | 5094 StoreDescriptor::NameRegister()); |
| 5056 Handle<Code> ic = | 5095 Handle<Code> ic = |
| 5057 CodeFactory::KeyedStoreIC(isolate(), language_mode()).code(); | 5096 CodeFactory::KeyedStoreIC(isolate(), language_mode()).code(); |
| 5058 CallIC(ic, expr->CountStoreFeedbackId()); | 5097 if (FLAG_vector_stores) { |
| 5098 EmitLoadStoreICSlot(expr->CountSlot()); |
| 5099 CallIC(ic); |
| 5100 } else { |
| 5101 CallIC(ic, expr->CountStoreFeedbackId()); |
| 5102 } |
| 5059 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 5103 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |
| 5060 if (expr->is_postfix()) { | 5104 if (expr->is_postfix()) { |
| 5061 if (!context()->IsEffect()) { | 5105 if (!context()->IsEffect()) { |
| 5062 context()->PlugTOS(); | 5106 context()->PlugTOS(); |
| 5063 } | 5107 } |
| 5064 } else { | 5108 } else { |
| 5065 context()->Plug(v0); | 5109 context()->Plug(v0); |
| 5066 } | 5110 } |
| 5067 break; | 5111 break; |
| 5068 } | 5112 } |
| (...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5380 void FullCodeGenerator::ClearPendingMessage() { | 5424 void FullCodeGenerator::ClearPendingMessage() { |
| 5381 DCHECK(!result_register().is(a1)); | 5425 DCHECK(!result_register().is(a1)); |
| 5382 ExternalReference pending_message_obj = | 5426 ExternalReference pending_message_obj = |
| 5383 ExternalReference::address_of_pending_message_obj(isolate()); | 5427 ExternalReference::address_of_pending_message_obj(isolate()); |
| 5384 __ LoadRoot(a1, Heap::kTheHoleValueRootIndex); | 5428 __ LoadRoot(a1, Heap::kTheHoleValueRootIndex); |
| 5385 __ li(at, Operand(pending_message_obj)); | 5429 __ li(at, Operand(pending_message_obj)); |
| 5386 __ sd(a1, MemOperand(at)); | 5430 __ sd(a1, MemOperand(at)); |
| 5387 } | 5431 } |
| 5388 | 5432 |
| 5389 | 5433 |
| 5434 void FullCodeGenerator::EmitLoadStoreICSlot(FeedbackVectorICSlot slot) { |
| 5435 DCHECK(FLAG_vector_stores && !slot.IsInvalid()); |
| 5436 __ li(VectorStoreICTrampolineDescriptor::SlotRegister(), |
| 5437 Operand(SmiFromSlot(slot))); |
| 5438 } |
| 5439 |
| 5440 |
| 5390 #undef __ | 5441 #undef __ |
| 5391 | 5442 |
| 5392 | 5443 |
| 5393 void BackEdgeTable::PatchAt(Code* unoptimized_code, | 5444 void BackEdgeTable::PatchAt(Code* unoptimized_code, |
| 5394 Address pc, | 5445 Address pc, |
| 5395 BackEdgeState target_state, | 5446 BackEdgeState target_state, |
| 5396 Code* replacement_code) { | 5447 Code* replacement_code) { |
| 5397 static const int kInstrSize = Assembler::kInstrSize; | 5448 static const int kInstrSize = Assembler::kInstrSize; |
| 5398 Address branch_address = pc - 8 * kInstrSize; | 5449 Address branch_address = pc - 8 * kInstrSize; |
| 5399 CodePatcher patcher(branch_address, 1); | 5450 CodePatcher patcher(branch_address, 1); |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5466 Assembler::target_address_at(pc_immediate_load_address)) == | 5517 Assembler::target_address_at(pc_immediate_load_address)) == |
| 5467 reinterpret_cast<uint64_t>( | 5518 reinterpret_cast<uint64_t>( |
| 5468 isolate->builtins()->OsrAfterStackCheck()->entry())); | 5519 isolate->builtins()->OsrAfterStackCheck()->entry())); |
| 5469 return OSR_AFTER_STACK_CHECK; | 5520 return OSR_AFTER_STACK_CHECK; |
| 5470 } | 5521 } |
| 5471 | 5522 |
| 5472 | 5523 |
| 5473 } } // namespace v8::internal | 5524 } } // namespace v8::internal |
| 5474 | 5525 |
| 5475 #endif // V8_TARGET_ARCH_MIPS64 | 5526 #endif // V8_TARGET_ARCH_MIPS64 |
| OLD | NEW |