| 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 #if V8_TARGET_ARCH_X87 | 5 #if V8_TARGET_ARCH_X87 |
| 6 | 6 |
| 7 #include "src/code-factory.h" | 7 #include "src/code-factory.h" |
| 8 #include "src/code-stubs.h" | 8 #include "src/code-stubs.h" |
| 9 #include "src/codegen.h" | 9 #include "src/codegen.h" |
| 10 #include "src/debug/debug.h" | 10 #include "src/debug/debug.h" |
| (...skipping 1141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1152 } | 1152 } |
| 1153 | 1153 |
| 1154 | 1154 |
| 1155 void FullCodeGenerator::EmitSetHomeObject(Expression* initializer, int offset, | 1155 void FullCodeGenerator::EmitSetHomeObject(Expression* initializer, int offset, |
| 1156 FeedbackVectorSlot slot) { | 1156 FeedbackVectorSlot slot) { |
| 1157 DCHECK(NeedsHomeObject(initializer)); | 1157 DCHECK(NeedsHomeObject(initializer)); |
| 1158 __ mov(StoreDescriptor::ReceiverRegister(), Operand(esp, 0)); | 1158 __ mov(StoreDescriptor::ReceiverRegister(), Operand(esp, 0)); |
| 1159 __ mov(StoreDescriptor::NameRegister(), | 1159 __ mov(StoreDescriptor::NameRegister(), |
| 1160 Immediate(isolate()->factory()->home_object_symbol())); | 1160 Immediate(isolate()->factory()->home_object_symbol())); |
| 1161 __ mov(StoreDescriptor::ValueRegister(), Operand(esp, offset * kPointerSize)); | 1161 __ mov(StoreDescriptor::ValueRegister(), Operand(esp, offset * kPointerSize)); |
| 1162 if (FLAG_vector_stores) EmitLoadStoreICSlot(slot); | 1162 EmitLoadStoreICSlot(slot); |
| 1163 CallStoreIC(); | 1163 CallStoreIC(); |
| 1164 } | 1164 } |
| 1165 | 1165 |
| 1166 | 1166 |
| 1167 void FullCodeGenerator::EmitSetHomeObjectAccumulator(Expression* initializer, | 1167 void FullCodeGenerator::EmitSetHomeObjectAccumulator(Expression* initializer, |
| 1168 int offset, | 1168 int offset, |
| 1169 FeedbackVectorSlot slot) { | 1169 FeedbackVectorSlot slot) { |
| 1170 DCHECK(NeedsHomeObject(initializer)); | 1170 DCHECK(NeedsHomeObject(initializer)); |
| 1171 __ mov(StoreDescriptor::ReceiverRegister(), eax); | 1171 __ mov(StoreDescriptor::ReceiverRegister(), eax); |
| 1172 __ mov(StoreDescriptor::NameRegister(), | 1172 __ mov(StoreDescriptor::NameRegister(), |
| 1173 Immediate(isolate()->factory()->home_object_symbol())); | 1173 Immediate(isolate()->factory()->home_object_symbol())); |
| 1174 __ mov(StoreDescriptor::ValueRegister(), Operand(esp, offset * kPointerSize)); | 1174 __ mov(StoreDescriptor::ValueRegister(), Operand(esp, offset * kPointerSize)); |
| 1175 if (FLAG_vector_stores) EmitLoadStoreICSlot(slot); | 1175 EmitLoadStoreICSlot(slot); |
| 1176 CallStoreIC(); | 1176 CallStoreIC(); |
| 1177 } | 1177 } |
| 1178 | 1178 |
| 1179 | 1179 |
| 1180 void FullCodeGenerator::EmitLoadGlobalCheckExtensions(VariableProxy* proxy, | 1180 void FullCodeGenerator::EmitLoadGlobalCheckExtensions(VariableProxy* proxy, |
| 1181 TypeofMode typeof_mode, | 1181 TypeofMode typeof_mode, |
| 1182 Label* slow) { | 1182 Label* slow) { |
| 1183 Register context = esi; | 1183 Register context = esi; |
| 1184 Register temp = edx; | 1184 Register temp = edx; |
| 1185 | 1185 |
| (...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1494 // Fall through. | 1494 // Fall through. |
| 1495 case ObjectLiteral::Property::COMPUTED: | 1495 case ObjectLiteral::Property::COMPUTED: |
| 1496 // It is safe to use [[Put]] here because the boilerplate already | 1496 // It is safe to use [[Put]] here because the boilerplate already |
| 1497 // contains computed properties with an uninitialized value. | 1497 // contains computed properties with an uninitialized value. |
| 1498 if (key->value()->IsInternalizedString()) { | 1498 if (key->value()->IsInternalizedString()) { |
| 1499 if (property->emit_store()) { | 1499 if (property->emit_store()) { |
| 1500 VisitForAccumulatorValue(value); | 1500 VisitForAccumulatorValue(value); |
| 1501 DCHECK(StoreDescriptor::ValueRegister().is(eax)); | 1501 DCHECK(StoreDescriptor::ValueRegister().is(eax)); |
| 1502 __ mov(StoreDescriptor::NameRegister(), Immediate(key->value())); | 1502 __ mov(StoreDescriptor::NameRegister(), Immediate(key->value())); |
| 1503 __ mov(StoreDescriptor::ReceiverRegister(), Operand(esp, 0)); | 1503 __ mov(StoreDescriptor::ReceiverRegister(), Operand(esp, 0)); |
| 1504 if (FLAG_vector_stores) { | 1504 EmitLoadStoreICSlot(property->GetSlot(0)); |
| 1505 EmitLoadStoreICSlot(property->GetSlot(0)); | 1505 CallStoreIC(); |
| 1506 CallStoreIC(); | |
| 1507 } else { | |
| 1508 CallStoreIC(key->LiteralFeedbackId()); | |
| 1509 } | |
| 1510 PrepareForBailoutForId(key->id(), NO_REGISTERS); | 1506 PrepareForBailoutForId(key->id(), NO_REGISTERS); |
| 1511 if (NeedsHomeObject(value)) { | 1507 if (NeedsHomeObject(value)) { |
| 1512 EmitSetHomeObjectAccumulator(value, 0, property->GetSlot(1)); | 1508 EmitSetHomeObjectAccumulator(value, 0, property->GetSlot(1)); |
| 1513 } | 1509 } |
| 1514 } else { | 1510 } else { |
| 1515 VisitForEffect(value); | 1511 VisitForEffect(value); |
| 1516 } | 1512 } |
| 1517 break; | 1513 break; |
| 1518 } | 1514 } |
| 1519 __ push(Operand(esp, 0)); // Duplicate receiver. | 1515 __ push(Operand(esp, 0)); // Duplicate receiver. |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1684 // is already set in the cloned array. | 1680 // is already set in the cloned array. |
| 1685 if (CompileTimeValue::IsCompileTimeValue(subexpr)) continue; | 1681 if (CompileTimeValue::IsCompileTimeValue(subexpr)) continue; |
| 1686 | 1682 |
| 1687 if (!result_saved) { | 1683 if (!result_saved) { |
| 1688 __ push(eax); // array literal. | 1684 __ push(eax); // array literal. |
| 1689 __ push(Immediate(Smi::FromInt(expr->literal_index()))); | 1685 __ push(Immediate(Smi::FromInt(expr->literal_index()))); |
| 1690 result_saved = true; | 1686 result_saved = true; |
| 1691 } | 1687 } |
| 1692 VisitForAccumulatorValue(subexpr); | 1688 VisitForAccumulatorValue(subexpr); |
| 1693 | 1689 |
| 1694 if (FLAG_vector_stores) { | 1690 __ mov(StoreDescriptor::NameRegister(), |
| 1695 __ mov(StoreDescriptor::NameRegister(), | 1691 Immediate(Smi::FromInt(array_index))); |
| 1696 Immediate(Smi::FromInt(array_index))); | 1692 __ mov(StoreDescriptor::ReceiverRegister(), Operand(esp, kPointerSize)); |
| 1697 __ mov(StoreDescriptor::ReceiverRegister(), Operand(esp, kPointerSize)); | 1693 EmitLoadStoreICSlot(expr->LiteralFeedbackSlot()); |
| 1698 EmitLoadStoreICSlot(expr->LiteralFeedbackSlot()); | 1694 Handle<Code> ic = |
| 1699 Handle<Code> ic = | 1695 CodeFactory::KeyedStoreIC(isolate(), language_mode()).code(); |
| 1700 CodeFactory::KeyedStoreIC(isolate(), language_mode()).code(); | 1696 CallIC(ic); |
| 1701 CallIC(ic); | |
| 1702 } else if (has_constant_fast_elements) { | |
| 1703 // Fast-case array literal with ElementsKind of FAST_*_ELEMENTS, they | |
| 1704 // cannot transition and don't need to call the runtime stub. | |
| 1705 int offset = FixedArray::kHeaderSize + (array_index * kPointerSize); | |
| 1706 __ mov(ebx, Operand(esp, kPointerSize)); // Copy of array literal. | |
| 1707 __ mov(ebx, FieldOperand(ebx, JSObject::kElementsOffset)); | |
| 1708 // Store the subexpression value in the array's elements. | |
| 1709 __ mov(FieldOperand(ebx, offset), result_register()); | |
| 1710 // Update the write barrier for the array store. | |
| 1711 __ RecordWriteField(ebx, offset, result_register(), ecx, kDontSaveFPRegs, | |
| 1712 EMIT_REMEMBERED_SET, INLINE_SMI_CHECK); | |
| 1713 } else { | |
| 1714 // Store the subexpression value in the array's elements. | |
| 1715 __ mov(ecx, Immediate(Smi::FromInt(array_index))); | |
| 1716 StoreArrayLiteralElementStub stub(isolate()); | |
| 1717 __ CallStub(&stub); | |
| 1718 } | |
| 1719 PrepareForBailoutForId(expr->GetIdForElement(array_index), NO_REGISTERS); | 1697 PrepareForBailoutForId(expr->GetIdForElement(array_index), NO_REGISTERS); |
| 1720 } | 1698 } |
| 1721 | 1699 |
| 1722 // In case the array literal contains spread expressions it has two parts. The | 1700 // In case the array literal contains spread expressions it has two parts. The |
| 1723 // first part is the "static" array which has a literal index is handled | 1701 // first part is the "static" array which has a literal index is handled |
| 1724 // above. The second part is the part after the first spread expression | 1702 // above. The second part is the part after the first spread expression |
| 1725 // (inclusive) and these elements gets appended to the array. Note that the | 1703 // (inclusive) and these elements gets appended to the array. Note that the |
| 1726 // number elements an iterable produces is unknown ahead of time. | 1704 // number elements an iterable produces is unknown ahead of time. |
| 1727 if (array_index < length && result_saved) { | 1705 if (array_index < length && result_saved) { |
| 1728 __ Drop(1); // literal index | 1706 __ Drop(1); // literal index |
| (...skipping 670 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2399 EmitVariableAssignment(var, Token::ASSIGN, slot); | 2377 EmitVariableAssignment(var, Token::ASSIGN, slot); |
| 2400 break; | 2378 break; |
| 2401 } | 2379 } |
| 2402 case NAMED_PROPERTY: { | 2380 case NAMED_PROPERTY: { |
| 2403 __ push(eax); // Preserve value. | 2381 __ push(eax); // Preserve value. |
| 2404 VisitForAccumulatorValue(prop->obj()); | 2382 VisitForAccumulatorValue(prop->obj()); |
| 2405 __ Move(StoreDescriptor::ReceiverRegister(), eax); | 2383 __ Move(StoreDescriptor::ReceiverRegister(), eax); |
| 2406 __ pop(StoreDescriptor::ValueRegister()); // Restore value. | 2384 __ pop(StoreDescriptor::ValueRegister()); // Restore value. |
| 2407 __ mov(StoreDescriptor::NameRegister(), | 2385 __ mov(StoreDescriptor::NameRegister(), |
| 2408 prop->key()->AsLiteral()->value()); | 2386 prop->key()->AsLiteral()->value()); |
| 2409 if (FLAG_vector_stores) EmitLoadStoreICSlot(slot); | 2387 EmitLoadStoreICSlot(slot); |
| 2410 CallStoreIC(); | 2388 CallStoreIC(); |
| 2411 break; | 2389 break; |
| 2412 } | 2390 } |
| 2413 case NAMED_SUPER_PROPERTY: { | 2391 case NAMED_SUPER_PROPERTY: { |
| 2414 __ push(eax); | 2392 __ push(eax); |
| 2415 VisitForStackValue(prop->obj()->AsSuperPropertyReference()->this_var()); | 2393 VisitForStackValue(prop->obj()->AsSuperPropertyReference()->this_var()); |
| 2416 VisitForAccumulatorValue( | 2394 VisitForAccumulatorValue( |
| 2417 prop->obj()->AsSuperPropertyReference()->home_object()); | 2395 prop->obj()->AsSuperPropertyReference()->home_object()); |
| 2418 // stack: value, this; eax: home_object | 2396 // stack: value, this; eax: home_object |
| 2419 Register scratch = ecx; | 2397 Register scratch = ecx; |
| (...skipping 27 matching lines...) Expand all Loading... |
| 2447 EmitKeyedSuperPropertyStore(prop); | 2425 EmitKeyedSuperPropertyStore(prop); |
| 2448 break; | 2426 break; |
| 2449 } | 2427 } |
| 2450 case KEYED_PROPERTY: { | 2428 case KEYED_PROPERTY: { |
| 2451 __ push(eax); // Preserve value. | 2429 __ push(eax); // Preserve value. |
| 2452 VisitForStackValue(prop->obj()); | 2430 VisitForStackValue(prop->obj()); |
| 2453 VisitForAccumulatorValue(prop->key()); | 2431 VisitForAccumulatorValue(prop->key()); |
| 2454 __ Move(StoreDescriptor::NameRegister(), eax); | 2432 __ Move(StoreDescriptor::NameRegister(), eax); |
| 2455 __ pop(StoreDescriptor::ReceiverRegister()); // Receiver. | 2433 __ pop(StoreDescriptor::ReceiverRegister()); // Receiver. |
| 2456 __ pop(StoreDescriptor::ValueRegister()); // Restore value. | 2434 __ pop(StoreDescriptor::ValueRegister()); // Restore value. |
| 2457 if (FLAG_vector_stores) EmitLoadStoreICSlot(slot); | 2435 EmitLoadStoreICSlot(slot); |
| 2458 Handle<Code> ic = | 2436 Handle<Code> ic = |
| 2459 CodeFactory::KeyedStoreIC(isolate(), language_mode()).code(); | 2437 CodeFactory::KeyedStoreIC(isolate(), language_mode()).code(); |
| 2460 CallIC(ic); | 2438 CallIC(ic); |
| 2461 break; | 2439 break; |
| 2462 } | 2440 } |
| 2463 } | 2441 } |
| 2464 context()->Plug(eax); | 2442 context()->Plug(eax); |
| 2465 } | 2443 } |
| 2466 | 2444 |
| 2467 | 2445 |
| 2468 void FullCodeGenerator::EmitStoreToStackLocalOrContextSlot( | 2446 void FullCodeGenerator::EmitStoreToStackLocalOrContextSlot( |
| 2469 Variable* var, MemOperand location) { | 2447 Variable* var, MemOperand location) { |
| 2470 __ mov(location, eax); | 2448 __ mov(location, eax); |
| 2471 if (var->IsContextSlot()) { | 2449 if (var->IsContextSlot()) { |
| 2472 __ mov(edx, eax); | 2450 __ mov(edx, eax); |
| 2473 int offset = Context::SlotOffset(var->index()); | 2451 int offset = Context::SlotOffset(var->index()); |
| 2474 __ RecordWriteContextSlot(ecx, offset, edx, ebx, kDontSaveFPRegs); | 2452 __ RecordWriteContextSlot(ecx, offset, edx, ebx, kDontSaveFPRegs); |
| 2475 } | 2453 } |
| 2476 } | 2454 } |
| 2477 | 2455 |
| 2478 | 2456 |
| 2479 void FullCodeGenerator::EmitVariableAssignment(Variable* var, Token::Value op, | 2457 void FullCodeGenerator::EmitVariableAssignment(Variable* var, Token::Value op, |
| 2480 FeedbackVectorSlot slot) { | 2458 FeedbackVectorSlot slot) { |
| 2481 if (var->IsUnallocated()) { | 2459 if (var->IsUnallocated()) { |
| 2482 // Global var, const, or let. | 2460 // Global var, const, or let. |
| 2483 __ mov(StoreDescriptor::NameRegister(), var->name()); | 2461 __ mov(StoreDescriptor::NameRegister(), var->name()); |
| 2484 __ mov(StoreDescriptor::ReceiverRegister(), GlobalObjectOperand()); | 2462 __ mov(StoreDescriptor::ReceiverRegister(), GlobalObjectOperand()); |
| 2485 if (FLAG_vector_stores) EmitLoadStoreICSlot(slot); | 2463 EmitLoadStoreICSlot(slot); |
| 2486 CallStoreIC(); | 2464 CallStoreIC(); |
| 2487 | 2465 |
| 2488 } else if (var->mode() == LET && op != Token::INIT) { | 2466 } else if (var->mode() == LET && op != Token::INIT) { |
| 2489 // Non-initializing assignment to let variable needs a write barrier. | 2467 // Non-initializing assignment to let variable needs a write barrier. |
| 2490 DCHECK(!var->IsLookupSlot()); | 2468 DCHECK(!var->IsLookupSlot()); |
| 2491 DCHECK(var->IsStackAllocated() || var->IsContextSlot()); | 2469 DCHECK(var->IsStackAllocated() || var->IsContextSlot()); |
| 2492 Label assign; | 2470 Label assign; |
| 2493 MemOperand location = VarOperand(var, ecx); | 2471 MemOperand location = VarOperand(var, ecx); |
| 2494 __ mov(edx, location); | 2472 __ mov(edx, location); |
| 2495 __ cmp(edx, isolate()->factory()->the_hole_value()); | 2473 __ cmp(edx, isolate()->factory()->the_hole_value()); |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2581 void FullCodeGenerator::EmitNamedPropertyAssignment(Assignment* expr) { | 2559 void FullCodeGenerator::EmitNamedPropertyAssignment(Assignment* expr) { |
| 2582 // Assignment to a property, using a named store IC. | 2560 // Assignment to a property, using a named store IC. |
| 2583 // eax : value | 2561 // eax : value |
| 2584 // esp[0] : receiver | 2562 // esp[0] : receiver |
| 2585 Property* prop = expr->target()->AsProperty(); | 2563 Property* prop = expr->target()->AsProperty(); |
| 2586 DCHECK(prop != NULL); | 2564 DCHECK(prop != NULL); |
| 2587 DCHECK(prop->key()->IsLiteral()); | 2565 DCHECK(prop->key()->IsLiteral()); |
| 2588 | 2566 |
| 2589 __ mov(StoreDescriptor::NameRegister(), prop->key()->AsLiteral()->value()); | 2567 __ mov(StoreDescriptor::NameRegister(), prop->key()->AsLiteral()->value()); |
| 2590 __ pop(StoreDescriptor::ReceiverRegister()); | 2568 __ pop(StoreDescriptor::ReceiverRegister()); |
| 2591 if (FLAG_vector_stores) { | 2569 EmitLoadStoreICSlot(expr->AssignmentSlot()); |
| 2592 EmitLoadStoreICSlot(expr->AssignmentSlot()); | 2570 CallStoreIC(); |
| 2593 CallStoreIC(); | |
| 2594 } else { | |
| 2595 CallStoreIC(expr->AssignmentFeedbackId()); | |
| 2596 } | |
| 2597 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 2571 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |
| 2598 context()->Plug(eax); | 2572 context()->Plug(eax); |
| 2599 } | 2573 } |
| 2600 | 2574 |
| 2601 | 2575 |
| 2602 void FullCodeGenerator::EmitNamedSuperPropertyStore(Property* prop) { | 2576 void FullCodeGenerator::EmitNamedSuperPropertyStore(Property* prop) { |
| 2603 // Assignment to named property of super. | 2577 // Assignment to named property of super. |
| 2604 // eax : value | 2578 // eax : value |
| 2605 // stack : receiver ('this'), home_object | 2579 // stack : receiver ('this'), home_object |
| 2606 DCHECK(prop != NULL); | 2580 DCHECK(prop != NULL); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 2632 // Assignment to a property, using a keyed store IC. | 2606 // Assignment to a property, using a keyed store IC. |
| 2633 // eax : value | 2607 // eax : value |
| 2634 // esp[0] : key | 2608 // esp[0] : key |
| 2635 // esp[kPointerSize] : receiver | 2609 // esp[kPointerSize] : receiver |
| 2636 | 2610 |
| 2637 __ pop(StoreDescriptor::NameRegister()); // Key. | 2611 __ pop(StoreDescriptor::NameRegister()); // Key. |
| 2638 __ pop(StoreDescriptor::ReceiverRegister()); | 2612 __ pop(StoreDescriptor::ReceiverRegister()); |
| 2639 DCHECK(StoreDescriptor::ValueRegister().is(eax)); | 2613 DCHECK(StoreDescriptor::ValueRegister().is(eax)); |
| 2640 Handle<Code> ic = | 2614 Handle<Code> ic = |
| 2641 CodeFactory::KeyedStoreIC(isolate(), language_mode()).code(); | 2615 CodeFactory::KeyedStoreIC(isolate(), language_mode()).code(); |
| 2642 if (FLAG_vector_stores) { | 2616 EmitLoadStoreICSlot(expr->AssignmentSlot()); |
| 2643 EmitLoadStoreICSlot(expr->AssignmentSlot()); | 2617 CallIC(ic); |
| 2644 CallIC(ic); | |
| 2645 } else { | |
| 2646 CallIC(ic, expr->AssignmentFeedbackId()); | |
| 2647 } | |
| 2648 | |
| 2649 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 2618 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |
| 2650 context()->Plug(eax); | 2619 context()->Plug(eax); |
| 2651 } | 2620 } |
| 2652 | 2621 |
| 2653 | 2622 |
| 2654 void FullCodeGenerator::VisitProperty(Property* expr) { | 2623 void FullCodeGenerator::VisitProperty(Property* expr) { |
| 2655 Comment cmnt(masm_, "[ Property"); | 2624 Comment cmnt(masm_, "[ Property"); |
| 2656 SetExpressionPosition(expr); | 2625 SetExpressionPosition(expr); |
| 2657 | 2626 |
| 2658 Expression* key = expr->key(); | 2627 Expression* key = expr->key(); |
| (...skipping 1854 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4513 EmitVariableAssignment(expr->expression()->AsVariableProxy()->var(), | 4482 EmitVariableAssignment(expr->expression()->AsVariableProxy()->var(), |
| 4514 Token::ASSIGN, expr->CountSlot()); | 4483 Token::ASSIGN, expr->CountSlot()); |
| 4515 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 4484 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |
| 4516 context()->Plug(eax); | 4485 context()->Plug(eax); |
| 4517 } | 4486 } |
| 4518 break; | 4487 break; |
| 4519 case NAMED_PROPERTY: { | 4488 case NAMED_PROPERTY: { |
| 4520 __ mov(StoreDescriptor::NameRegister(), | 4489 __ mov(StoreDescriptor::NameRegister(), |
| 4521 prop->key()->AsLiteral()->value()); | 4490 prop->key()->AsLiteral()->value()); |
| 4522 __ pop(StoreDescriptor::ReceiverRegister()); | 4491 __ pop(StoreDescriptor::ReceiverRegister()); |
| 4523 if (FLAG_vector_stores) { | 4492 EmitLoadStoreICSlot(expr->CountSlot()); |
| 4524 EmitLoadStoreICSlot(expr->CountSlot()); | 4493 CallStoreIC(); |
| 4525 CallStoreIC(); | |
| 4526 } else { | |
| 4527 CallStoreIC(expr->CountStoreFeedbackId()); | |
| 4528 } | |
| 4529 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 4494 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |
| 4530 if (expr->is_postfix()) { | 4495 if (expr->is_postfix()) { |
| 4531 if (!context()->IsEffect()) { | 4496 if (!context()->IsEffect()) { |
| 4532 context()->PlugTOS(); | 4497 context()->PlugTOS(); |
| 4533 } | 4498 } |
| 4534 } else { | 4499 } else { |
| 4535 context()->Plug(eax); | 4500 context()->Plug(eax); |
| 4536 } | 4501 } |
| 4537 break; | 4502 break; |
| 4538 } | 4503 } |
| (...skipping 17 matching lines...) Expand all Loading... |
| 4556 } else { | 4521 } else { |
| 4557 context()->Plug(eax); | 4522 context()->Plug(eax); |
| 4558 } | 4523 } |
| 4559 break; | 4524 break; |
| 4560 } | 4525 } |
| 4561 case KEYED_PROPERTY: { | 4526 case KEYED_PROPERTY: { |
| 4562 __ pop(StoreDescriptor::NameRegister()); | 4527 __ pop(StoreDescriptor::NameRegister()); |
| 4563 __ pop(StoreDescriptor::ReceiverRegister()); | 4528 __ pop(StoreDescriptor::ReceiverRegister()); |
| 4564 Handle<Code> ic = | 4529 Handle<Code> ic = |
| 4565 CodeFactory::KeyedStoreIC(isolate(), language_mode()).code(); | 4530 CodeFactory::KeyedStoreIC(isolate(), language_mode()).code(); |
| 4566 if (FLAG_vector_stores) { | 4531 EmitLoadStoreICSlot(expr->CountSlot()); |
| 4567 EmitLoadStoreICSlot(expr->CountSlot()); | 4532 CallIC(ic); |
| 4568 CallIC(ic); | |
| 4569 } else { | |
| 4570 CallIC(ic, expr->CountStoreFeedbackId()); | |
| 4571 } | |
| 4572 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 4533 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |
| 4573 if (expr->is_postfix()) { | 4534 if (expr->is_postfix()) { |
| 4574 // Result is on the stack | 4535 // Result is on the stack |
| 4575 if (!context()->IsEffect()) { | 4536 if (!context()->IsEffect()) { |
| 4576 context()->PlugTOS(); | 4537 context()->PlugTOS(); |
| 4577 } | 4538 } |
| 4578 } else { | 4539 } else { |
| 4579 context()->Plug(eax); | 4540 context()->Plug(eax); |
| 4580 } | 4541 } |
| 4581 break; | 4542 break; |
| (...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4861 void FullCodeGenerator::ClearPendingMessage() { | 4822 void FullCodeGenerator::ClearPendingMessage() { |
| 4862 DCHECK(!result_register().is(edx)); | 4823 DCHECK(!result_register().is(edx)); |
| 4863 ExternalReference pending_message_obj = | 4824 ExternalReference pending_message_obj = |
| 4864 ExternalReference::address_of_pending_message_obj(isolate()); | 4825 ExternalReference::address_of_pending_message_obj(isolate()); |
| 4865 __ mov(edx, Immediate(isolate()->factory()->the_hole_value())); | 4826 __ mov(edx, Immediate(isolate()->factory()->the_hole_value())); |
| 4866 __ mov(Operand::StaticVariable(pending_message_obj), edx); | 4827 __ mov(Operand::StaticVariable(pending_message_obj), edx); |
| 4867 } | 4828 } |
| 4868 | 4829 |
| 4869 | 4830 |
| 4870 void FullCodeGenerator::EmitLoadStoreICSlot(FeedbackVectorSlot slot) { | 4831 void FullCodeGenerator::EmitLoadStoreICSlot(FeedbackVectorSlot slot) { |
| 4871 DCHECK(FLAG_vector_stores && !slot.IsInvalid()); | 4832 DCHECK(!slot.IsInvalid()); |
| 4872 __ mov(VectorStoreICTrampolineDescriptor::SlotRegister(), | 4833 __ mov(VectorStoreICTrampolineDescriptor::SlotRegister(), |
| 4873 Immediate(SmiFromSlot(slot))); | 4834 Immediate(SmiFromSlot(slot))); |
| 4874 } | 4835 } |
| 4875 | 4836 |
| 4876 | 4837 |
| 4877 #undef __ | 4838 #undef __ |
| 4878 | 4839 |
| 4879 | 4840 |
| 4880 static const byte kJnsInstruction = 0x79; | 4841 static const byte kJnsInstruction = 0x79; |
| 4881 static const byte kJnsOffset = 0x11; | 4842 static const byte kJnsOffset = 0x11; |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4951 Assembler::target_address_at(call_target_address, | 4912 Assembler::target_address_at(call_target_address, |
| 4952 unoptimized_code)); | 4913 unoptimized_code)); |
| 4953 return OSR_AFTER_STACK_CHECK; | 4914 return OSR_AFTER_STACK_CHECK; |
| 4954 } | 4915 } |
| 4955 | 4916 |
| 4956 | 4917 |
| 4957 } // namespace internal | 4918 } // namespace internal |
| 4958 } // namespace v8 | 4919 } // namespace v8 |
| 4959 | 4920 |
| 4960 #endif // V8_TARGET_ARCH_X87 | 4921 #endif // V8_TARGET_ARCH_X87 |
| OLD | NEW |