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_X64 | 5 #if V8_TARGET_ARCH_X64 |
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 1175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1186 | 1186 |
1187 | 1187 |
1188 void FullCodeGenerator::EmitSetHomeObject(Expression* initializer, int offset, | 1188 void FullCodeGenerator::EmitSetHomeObject(Expression* initializer, int offset, |
1189 FeedbackVectorSlot slot) { | 1189 FeedbackVectorSlot slot) { |
1190 DCHECK(NeedsHomeObject(initializer)); | 1190 DCHECK(NeedsHomeObject(initializer)); |
1191 __ movp(StoreDescriptor::ReceiverRegister(), Operand(rsp, 0)); | 1191 __ movp(StoreDescriptor::ReceiverRegister(), Operand(rsp, 0)); |
1192 __ Move(StoreDescriptor::NameRegister(), | 1192 __ Move(StoreDescriptor::NameRegister(), |
1193 isolate()->factory()->home_object_symbol()); | 1193 isolate()->factory()->home_object_symbol()); |
1194 __ movp(StoreDescriptor::ValueRegister(), | 1194 __ movp(StoreDescriptor::ValueRegister(), |
1195 Operand(rsp, offset * kPointerSize)); | 1195 Operand(rsp, offset * kPointerSize)); |
1196 if (FLAG_vector_stores) EmitLoadStoreICSlot(slot); | 1196 EmitLoadStoreICSlot(slot); |
1197 CallStoreIC(); | 1197 CallStoreIC(); |
1198 } | 1198 } |
1199 | 1199 |
1200 | 1200 |
1201 void FullCodeGenerator::EmitSetHomeObjectAccumulator(Expression* initializer, | 1201 void FullCodeGenerator::EmitSetHomeObjectAccumulator(Expression* initializer, |
1202 int offset, | 1202 int offset, |
1203 FeedbackVectorSlot slot) { | 1203 FeedbackVectorSlot slot) { |
1204 DCHECK(NeedsHomeObject(initializer)); | 1204 DCHECK(NeedsHomeObject(initializer)); |
1205 __ movp(StoreDescriptor::ReceiverRegister(), rax); | 1205 __ movp(StoreDescriptor::ReceiverRegister(), rax); |
1206 __ Move(StoreDescriptor::NameRegister(), | 1206 __ Move(StoreDescriptor::NameRegister(), |
1207 isolate()->factory()->home_object_symbol()); | 1207 isolate()->factory()->home_object_symbol()); |
1208 __ movp(StoreDescriptor::ValueRegister(), | 1208 __ movp(StoreDescriptor::ValueRegister(), |
1209 Operand(rsp, offset * kPointerSize)); | 1209 Operand(rsp, offset * kPointerSize)); |
1210 if (FLAG_vector_stores) EmitLoadStoreICSlot(slot); | 1210 EmitLoadStoreICSlot(slot); |
1211 CallStoreIC(); | 1211 CallStoreIC(); |
1212 } | 1212 } |
1213 | 1213 |
1214 | 1214 |
1215 void FullCodeGenerator::EmitLoadGlobalCheckExtensions(VariableProxy* proxy, | 1215 void FullCodeGenerator::EmitLoadGlobalCheckExtensions(VariableProxy* proxy, |
1216 TypeofMode typeof_mode, | 1216 TypeofMode typeof_mode, |
1217 Label* slow) { | 1217 Label* slow) { |
1218 Register context = rsi; | 1218 Register context = rsi; |
1219 Register temp = rdx; | 1219 Register temp = rdx; |
1220 | 1220 |
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1528 // Fall through. | 1528 // Fall through. |
1529 case ObjectLiteral::Property::COMPUTED: | 1529 case ObjectLiteral::Property::COMPUTED: |
1530 // It is safe to use [[Put]] here because the boilerplate already | 1530 // It is safe to use [[Put]] here because the boilerplate already |
1531 // contains computed properties with an uninitialized value. | 1531 // contains computed properties with an uninitialized value. |
1532 if (key->value()->IsInternalizedString()) { | 1532 if (key->value()->IsInternalizedString()) { |
1533 if (property->emit_store()) { | 1533 if (property->emit_store()) { |
1534 VisitForAccumulatorValue(value); | 1534 VisitForAccumulatorValue(value); |
1535 DCHECK(StoreDescriptor::ValueRegister().is(rax)); | 1535 DCHECK(StoreDescriptor::ValueRegister().is(rax)); |
1536 __ Move(StoreDescriptor::NameRegister(), key->value()); | 1536 __ Move(StoreDescriptor::NameRegister(), key->value()); |
1537 __ movp(StoreDescriptor::ReceiverRegister(), Operand(rsp, 0)); | 1537 __ movp(StoreDescriptor::ReceiverRegister(), Operand(rsp, 0)); |
1538 if (FLAG_vector_stores) { | 1538 EmitLoadStoreICSlot(property->GetSlot(0)); |
1539 EmitLoadStoreICSlot(property->GetSlot(0)); | 1539 CallStoreIC(); |
1540 CallStoreIC(); | |
1541 } else { | |
1542 CallStoreIC(key->LiteralFeedbackId()); | |
1543 } | |
1544 PrepareForBailoutForId(key->id(), NO_REGISTERS); | 1540 PrepareForBailoutForId(key->id(), NO_REGISTERS); |
1545 | 1541 |
1546 if (NeedsHomeObject(value)) { | 1542 if (NeedsHomeObject(value)) { |
1547 EmitSetHomeObjectAccumulator(value, 0, property->GetSlot(1)); | 1543 EmitSetHomeObjectAccumulator(value, 0, property->GetSlot(1)); |
1548 } | 1544 } |
1549 } else { | 1545 } else { |
1550 VisitForEffect(value); | 1546 VisitForEffect(value); |
1551 } | 1547 } |
1552 break; | 1548 break; |
1553 } | 1549 } |
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1717 // is already set in the cloned array. | 1713 // is already set in the cloned array. |
1718 if (CompileTimeValue::IsCompileTimeValue(subexpr)) continue; | 1714 if (CompileTimeValue::IsCompileTimeValue(subexpr)) continue; |
1719 | 1715 |
1720 if (!result_saved) { | 1716 if (!result_saved) { |
1721 __ Push(rax); // array literal | 1717 __ Push(rax); // array literal |
1722 __ Push(Smi::FromInt(expr->literal_index())); | 1718 __ Push(Smi::FromInt(expr->literal_index())); |
1723 result_saved = true; | 1719 result_saved = true; |
1724 } | 1720 } |
1725 VisitForAccumulatorValue(subexpr); | 1721 VisitForAccumulatorValue(subexpr); |
1726 | 1722 |
1727 if (FLAG_vector_stores) { | 1723 __ Move(StoreDescriptor::NameRegister(), Smi::FromInt(array_index)); |
1728 __ Move(StoreDescriptor::NameRegister(), Smi::FromInt(array_index)); | 1724 __ movp(StoreDescriptor::ReceiverRegister(), Operand(rsp, kPointerSize)); |
1729 __ movp(StoreDescriptor::ReceiverRegister(), Operand(rsp, kPointerSize)); | 1725 EmitLoadStoreICSlot(expr->LiteralFeedbackSlot()); |
1730 EmitLoadStoreICSlot(expr->LiteralFeedbackSlot()); | 1726 Handle<Code> ic = |
1731 Handle<Code> ic = | 1727 CodeFactory::KeyedStoreIC(isolate(), language_mode()).code(); |
1732 CodeFactory::KeyedStoreIC(isolate(), language_mode()).code(); | 1728 CallIC(ic); |
1733 CallIC(ic); | |
1734 } else if (has_constant_fast_elements) { | |
1735 // Fast-case array literal with ElementsKind of FAST_*_ELEMENTS, they | |
1736 // cannot transition and don't need to call the runtime stub. | |
1737 int offset = FixedArray::kHeaderSize + (array_index * kPointerSize); | |
1738 __ movp(rbx, Operand(rsp, kPointerSize)); // Copy of array literal. | |
1739 __ movp(rbx, FieldOperand(rbx, JSObject::kElementsOffset)); | |
1740 // Store the subexpression value in the array's elements. | |
1741 __ movp(FieldOperand(rbx, offset), result_register()); | |
1742 // Update the write barrier for the array store. | |
1743 __ RecordWriteField(rbx, offset, result_register(), rcx, | |
1744 kDontSaveFPRegs, | |
1745 EMIT_REMEMBERED_SET, | |
1746 INLINE_SMI_CHECK); | |
1747 } else { | |
1748 // Store the subexpression value in the array's elements. | |
1749 __ Move(rcx, Smi::FromInt(array_index)); | |
1750 StoreArrayLiteralElementStub stub(isolate()); | |
1751 __ CallStub(&stub); | |
1752 } | |
1753 | 1729 |
1754 PrepareForBailoutForId(expr->GetIdForElement(array_index), NO_REGISTERS); | 1730 PrepareForBailoutForId(expr->GetIdForElement(array_index), NO_REGISTERS); |
1755 } | 1731 } |
1756 | 1732 |
1757 // In case the array literal contains spread expressions it has two parts. The | 1733 // In case the array literal contains spread expressions it has two parts. The |
1758 // first part is the "static" array which has a literal index is handled | 1734 // first part is the "static" array which has a literal index is handled |
1759 // above. The second part is the part after the first spread expression | 1735 // above. The second part is the part after the first spread expression |
1760 // (inclusive) and these elements gets appended to the array. Note that the | 1736 // (inclusive) and these elements gets appended to the array. Note that the |
1761 // number elements an iterable produces is unknown ahead of time. | 1737 // number elements an iterable produces is unknown ahead of time. |
1762 if (array_index < length && result_saved) { | 1738 if (array_index < length && result_saved) { |
(...skipping 637 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2400 EmitVariableAssignment(var, Token::ASSIGN, slot); | 2376 EmitVariableAssignment(var, Token::ASSIGN, slot); |
2401 break; | 2377 break; |
2402 } | 2378 } |
2403 case NAMED_PROPERTY: { | 2379 case NAMED_PROPERTY: { |
2404 __ Push(rax); // Preserve value. | 2380 __ Push(rax); // Preserve value. |
2405 VisitForAccumulatorValue(prop->obj()); | 2381 VisitForAccumulatorValue(prop->obj()); |
2406 __ Move(StoreDescriptor::ReceiverRegister(), rax); | 2382 __ Move(StoreDescriptor::ReceiverRegister(), rax); |
2407 __ Pop(StoreDescriptor::ValueRegister()); // Restore value. | 2383 __ Pop(StoreDescriptor::ValueRegister()); // Restore value. |
2408 __ Move(StoreDescriptor::NameRegister(), | 2384 __ Move(StoreDescriptor::NameRegister(), |
2409 prop->key()->AsLiteral()->value()); | 2385 prop->key()->AsLiteral()->value()); |
2410 if (FLAG_vector_stores) EmitLoadStoreICSlot(slot); | 2386 EmitLoadStoreICSlot(slot); |
2411 CallStoreIC(); | 2387 CallStoreIC(); |
2412 break; | 2388 break; |
2413 } | 2389 } |
2414 case NAMED_SUPER_PROPERTY: { | 2390 case NAMED_SUPER_PROPERTY: { |
2415 __ Push(rax); | 2391 __ Push(rax); |
2416 VisitForStackValue(prop->obj()->AsSuperPropertyReference()->this_var()); | 2392 VisitForStackValue(prop->obj()->AsSuperPropertyReference()->this_var()); |
2417 VisitForAccumulatorValue( | 2393 VisitForAccumulatorValue( |
2418 prop->obj()->AsSuperPropertyReference()->home_object()); | 2394 prop->obj()->AsSuperPropertyReference()->home_object()); |
2419 // stack: value, this; rax: home_object | 2395 // stack: value, this; rax: home_object |
2420 Register scratch = rcx; | 2396 Register scratch = rcx; |
(...skipping 27 matching lines...) Expand all Loading... |
2448 EmitKeyedSuperPropertyStore(prop); | 2424 EmitKeyedSuperPropertyStore(prop); |
2449 break; | 2425 break; |
2450 } | 2426 } |
2451 case KEYED_PROPERTY: { | 2427 case KEYED_PROPERTY: { |
2452 __ Push(rax); // Preserve value. | 2428 __ Push(rax); // Preserve value. |
2453 VisitForStackValue(prop->obj()); | 2429 VisitForStackValue(prop->obj()); |
2454 VisitForAccumulatorValue(prop->key()); | 2430 VisitForAccumulatorValue(prop->key()); |
2455 __ Move(StoreDescriptor::NameRegister(), rax); | 2431 __ Move(StoreDescriptor::NameRegister(), rax); |
2456 __ Pop(StoreDescriptor::ReceiverRegister()); | 2432 __ Pop(StoreDescriptor::ReceiverRegister()); |
2457 __ Pop(StoreDescriptor::ValueRegister()); // Restore value. | 2433 __ Pop(StoreDescriptor::ValueRegister()); // Restore value. |
2458 if (FLAG_vector_stores) EmitLoadStoreICSlot(slot); | 2434 EmitLoadStoreICSlot(slot); |
2459 Handle<Code> ic = | 2435 Handle<Code> ic = |
2460 CodeFactory::KeyedStoreIC(isolate(), language_mode()).code(); | 2436 CodeFactory::KeyedStoreIC(isolate(), language_mode()).code(); |
2461 CallIC(ic); | 2437 CallIC(ic); |
2462 break; | 2438 break; |
2463 } | 2439 } |
2464 } | 2440 } |
2465 context()->Plug(rax); | 2441 context()->Plug(rax); |
2466 } | 2442 } |
2467 | 2443 |
2468 | 2444 |
2469 void FullCodeGenerator::EmitStoreToStackLocalOrContextSlot( | 2445 void FullCodeGenerator::EmitStoreToStackLocalOrContextSlot( |
2470 Variable* var, MemOperand location) { | 2446 Variable* var, MemOperand location) { |
2471 __ movp(location, rax); | 2447 __ movp(location, rax); |
2472 if (var->IsContextSlot()) { | 2448 if (var->IsContextSlot()) { |
2473 __ movp(rdx, rax); | 2449 __ movp(rdx, rax); |
2474 __ RecordWriteContextSlot( | 2450 __ RecordWriteContextSlot( |
2475 rcx, Context::SlotOffset(var->index()), rdx, rbx, kDontSaveFPRegs); | 2451 rcx, Context::SlotOffset(var->index()), rdx, rbx, kDontSaveFPRegs); |
2476 } | 2452 } |
2477 } | 2453 } |
2478 | 2454 |
2479 | 2455 |
2480 void FullCodeGenerator::EmitVariableAssignment(Variable* var, Token::Value op, | 2456 void FullCodeGenerator::EmitVariableAssignment(Variable* var, Token::Value op, |
2481 FeedbackVectorSlot slot) { | 2457 FeedbackVectorSlot slot) { |
2482 if (var->IsUnallocated()) { | 2458 if (var->IsUnallocated()) { |
2483 // Global var, const, or let. | 2459 // Global var, const, or let. |
2484 __ Move(StoreDescriptor::NameRegister(), var->name()); | 2460 __ Move(StoreDescriptor::NameRegister(), var->name()); |
2485 __ movp(StoreDescriptor::ReceiverRegister(), GlobalObjectOperand()); | 2461 __ movp(StoreDescriptor::ReceiverRegister(), GlobalObjectOperand()); |
2486 if (FLAG_vector_stores) EmitLoadStoreICSlot(slot); | 2462 EmitLoadStoreICSlot(slot); |
2487 CallStoreIC(); | 2463 CallStoreIC(); |
2488 | 2464 |
2489 } else if (var->mode() == LET && op != Token::INIT) { | 2465 } else if (var->mode() == LET && op != Token::INIT) { |
2490 // Non-initializing assignment to let variable needs a write barrier. | 2466 // Non-initializing assignment to let variable needs a write barrier. |
2491 DCHECK(!var->IsLookupSlot()); | 2467 DCHECK(!var->IsLookupSlot()); |
2492 DCHECK(var->IsStackAllocated() || var->IsContextSlot()); | 2468 DCHECK(var->IsStackAllocated() || var->IsContextSlot()); |
2493 Label assign; | 2469 Label assign; |
2494 MemOperand location = VarOperand(var, rcx); | 2470 MemOperand location = VarOperand(var, rcx); |
2495 __ movp(rdx, location); | 2471 __ movp(rdx, location); |
2496 __ CompareRoot(rdx, Heap::kTheHoleValueRootIndex); | 2472 __ CompareRoot(rdx, Heap::kTheHoleValueRootIndex); |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2580 | 2556 |
2581 | 2557 |
2582 void FullCodeGenerator::EmitNamedPropertyAssignment(Assignment* expr) { | 2558 void FullCodeGenerator::EmitNamedPropertyAssignment(Assignment* expr) { |
2583 // Assignment to a property, using a named store IC. | 2559 // Assignment to a property, using a named store IC. |
2584 Property* prop = expr->target()->AsProperty(); | 2560 Property* prop = expr->target()->AsProperty(); |
2585 DCHECK(prop != NULL); | 2561 DCHECK(prop != NULL); |
2586 DCHECK(prop->key()->IsLiteral()); | 2562 DCHECK(prop->key()->IsLiteral()); |
2587 | 2563 |
2588 __ Move(StoreDescriptor::NameRegister(), prop->key()->AsLiteral()->value()); | 2564 __ Move(StoreDescriptor::NameRegister(), prop->key()->AsLiteral()->value()); |
2589 __ Pop(StoreDescriptor::ReceiverRegister()); | 2565 __ Pop(StoreDescriptor::ReceiverRegister()); |
2590 if (FLAG_vector_stores) { | 2566 EmitLoadStoreICSlot(expr->AssignmentSlot()); |
2591 EmitLoadStoreICSlot(expr->AssignmentSlot()); | 2567 CallStoreIC(); |
2592 CallStoreIC(); | |
2593 } else { | |
2594 CallStoreIC(expr->AssignmentFeedbackId()); | |
2595 } | |
2596 | 2568 |
2597 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 2569 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |
2598 context()->Plug(rax); | 2570 context()->Plug(rax); |
2599 } | 2571 } |
2600 | 2572 |
2601 | 2573 |
2602 void FullCodeGenerator::EmitNamedSuperPropertyStore(Property* prop) { | 2574 void FullCodeGenerator::EmitNamedSuperPropertyStore(Property* prop) { |
2603 // Assignment to named property of super. | 2575 // Assignment to named property of super. |
2604 // rax : value | 2576 // rax : value |
2605 // stack : receiver ('this'), home_object | 2577 // stack : receiver ('this'), home_object |
(...skipping 23 matching lines...) Expand all Loading... |
2629 } | 2601 } |
2630 | 2602 |
2631 | 2603 |
2632 void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) { | 2604 void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) { |
2633 // Assignment to a property, using a keyed store IC. | 2605 // Assignment to a property, using a keyed store IC. |
2634 __ Pop(StoreDescriptor::NameRegister()); // Key. | 2606 __ Pop(StoreDescriptor::NameRegister()); // Key. |
2635 __ Pop(StoreDescriptor::ReceiverRegister()); | 2607 __ Pop(StoreDescriptor::ReceiverRegister()); |
2636 DCHECK(StoreDescriptor::ValueRegister().is(rax)); | 2608 DCHECK(StoreDescriptor::ValueRegister().is(rax)); |
2637 Handle<Code> ic = | 2609 Handle<Code> ic = |
2638 CodeFactory::KeyedStoreIC(isolate(), language_mode()).code(); | 2610 CodeFactory::KeyedStoreIC(isolate(), language_mode()).code(); |
2639 if (FLAG_vector_stores) { | 2611 EmitLoadStoreICSlot(expr->AssignmentSlot()); |
2640 EmitLoadStoreICSlot(expr->AssignmentSlot()); | 2612 CallIC(ic); |
2641 CallIC(ic); | |
2642 } else { | |
2643 CallIC(ic, expr->AssignmentFeedbackId()); | |
2644 } | |
2645 | 2613 |
2646 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 2614 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |
2647 context()->Plug(rax); | 2615 context()->Plug(rax); |
2648 } | 2616 } |
2649 | 2617 |
2650 | 2618 |
2651 void FullCodeGenerator::VisitProperty(Property* expr) { | 2619 void FullCodeGenerator::VisitProperty(Property* expr) { |
2652 Comment cmnt(masm_, "[ Property"); | 2620 Comment cmnt(masm_, "[ Property"); |
2653 SetExpressionPosition(expr); | 2621 SetExpressionPosition(expr); |
2654 | 2622 |
(...skipping 1881 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4536 EmitVariableAssignment(expr->expression()->AsVariableProxy()->var(), | 4504 EmitVariableAssignment(expr->expression()->AsVariableProxy()->var(), |
4537 Token::ASSIGN, expr->CountSlot()); | 4505 Token::ASSIGN, expr->CountSlot()); |
4538 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 4506 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |
4539 context()->Plug(rax); | 4507 context()->Plug(rax); |
4540 } | 4508 } |
4541 break; | 4509 break; |
4542 case NAMED_PROPERTY: { | 4510 case NAMED_PROPERTY: { |
4543 __ Move(StoreDescriptor::NameRegister(), | 4511 __ Move(StoreDescriptor::NameRegister(), |
4544 prop->key()->AsLiteral()->value()); | 4512 prop->key()->AsLiteral()->value()); |
4545 __ Pop(StoreDescriptor::ReceiverRegister()); | 4513 __ Pop(StoreDescriptor::ReceiverRegister()); |
4546 if (FLAG_vector_stores) { | 4514 EmitLoadStoreICSlot(expr->CountSlot()); |
4547 EmitLoadStoreICSlot(expr->CountSlot()); | 4515 CallStoreIC(); |
4548 CallStoreIC(); | |
4549 } else { | |
4550 CallStoreIC(expr->CountStoreFeedbackId()); | |
4551 } | |
4552 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 4516 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |
4553 if (expr->is_postfix()) { | 4517 if (expr->is_postfix()) { |
4554 if (!context()->IsEffect()) { | 4518 if (!context()->IsEffect()) { |
4555 context()->PlugTOS(); | 4519 context()->PlugTOS(); |
4556 } | 4520 } |
4557 } else { | 4521 } else { |
4558 context()->Plug(rax); | 4522 context()->Plug(rax); |
4559 } | 4523 } |
4560 break; | 4524 break; |
4561 } | 4525 } |
(...skipping 17 matching lines...) Expand all Loading... |
4579 } else { | 4543 } else { |
4580 context()->Plug(rax); | 4544 context()->Plug(rax); |
4581 } | 4545 } |
4582 break; | 4546 break; |
4583 } | 4547 } |
4584 case KEYED_PROPERTY: { | 4548 case KEYED_PROPERTY: { |
4585 __ Pop(StoreDescriptor::NameRegister()); | 4549 __ Pop(StoreDescriptor::NameRegister()); |
4586 __ Pop(StoreDescriptor::ReceiverRegister()); | 4550 __ Pop(StoreDescriptor::ReceiverRegister()); |
4587 Handle<Code> ic = | 4551 Handle<Code> ic = |
4588 CodeFactory::KeyedStoreIC(isolate(), language_mode()).code(); | 4552 CodeFactory::KeyedStoreIC(isolate(), language_mode()).code(); |
4589 if (FLAG_vector_stores) { | 4553 EmitLoadStoreICSlot(expr->CountSlot()); |
4590 EmitLoadStoreICSlot(expr->CountSlot()); | 4554 CallIC(ic); |
4591 CallIC(ic); | |
4592 } else { | |
4593 CallIC(ic, expr->CountStoreFeedbackId()); | |
4594 } | |
4595 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 4555 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |
4596 if (expr->is_postfix()) { | 4556 if (expr->is_postfix()) { |
4597 if (!context()->IsEffect()) { | 4557 if (!context()->IsEffect()) { |
4598 context()->PlugTOS(); | 4558 context()->PlugTOS(); |
4599 } | 4559 } |
4600 } else { | 4560 } else { |
4601 context()->Plug(rax); | 4561 context()->Plug(rax); |
4602 } | 4562 } |
4603 break; | 4563 break; |
4604 } | 4564 } |
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4886 void FullCodeGenerator::ClearPendingMessage() { | 4846 void FullCodeGenerator::ClearPendingMessage() { |
4887 DCHECK(!result_register().is(rdx)); | 4847 DCHECK(!result_register().is(rdx)); |
4888 ExternalReference pending_message_obj = | 4848 ExternalReference pending_message_obj = |
4889 ExternalReference::address_of_pending_message_obj(isolate()); | 4849 ExternalReference::address_of_pending_message_obj(isolate()); |
4890 __ LoadRoot(rdx, Heap::kTheHoleValueRootIndex); | 4850 __ LoadRoot(rdx, Heap::kTheHoleValueRootIndex); |
4891 __ Store(pending_message_obj, rdx); | 4851 __ Store(pending_message_obj, rdx); |
4892 } | 4852 } |
4893 | 4853 |
4894 | 4854 |
4895 void FullCodeGenerator::EmitLoadStoreICSlot(FeedbackVectorSlot slot) { | 4855 void FullCodeGenerator::EmitLoadStoreICSlot(FeedbackVectorSlot slot) { |
4896 DCHECK(FLAG_vector_stores && !slot.IsInvalid()); | 4856 DCHECK(!slot.IsInvalid()); |
4897 __ Move(VectorStoreICTrampolineDescriptor::SlotRegister(), SmiFromSlot(slot)); | 4857 __ Move(VectorStoreICTrampolineDescriptor::SlotRegister(), SmiFromSlot(slot)); |
4898 } | 4858 } |
4899 | 4859 |
4900 | 4860 |
4901 #undef __ | 4861 #undef __ |
4902 | 4862 |
4903 | 4863 |
4904 static const byte kJnsInstruction = 0x79; | 4864 static const byte kJnsInstruction = 0x79; |
4905 static const byte kNopByteOne = 0x66; | 4865 static const byte kNopByteOne = 0x66; |
4906 static const byte kNopByteTwo = 0x90; | 4866 static const byte kNopByteTwo = 0x90; |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4975 Assembler::target_address_at(call_target_address, | 4935 Assembler::target_address_at(call_target_address, |
4976 unoptimized_code)); | 4936 unoptimized_code)); |
4977 return OSR_AFTER_STACK_CHECK; | 4937 return OSR_AFTER_STACK_CHECK; |
4978 } | 4938 } |
4979 | 4939 |
4980 | 4940 |
4981 } // namespace internal | 4941 } // namespace internal |
4982 } // namespace v8 | 4942 } // namespace v8 |
4983 | 4943 |
4984 #endif // V8_TARGET_ARCH_X64 | 4944 #endif // V8_TARGET_ARCH_X64 |
OLD | NEW |