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 |