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

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

Issue 1461533002: X87: VectorICs: Remove --vector-stores flag. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | src/ic/x87/access-compiler-x87.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « no previous file | src/ic/x87/access-compiler-x87.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698