OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/code-stubs.h" | 5 #include "src/code-stubs.h" |
6 | 6 |
7 #include <sstream> | 7 #include <sstream> |
8 | 8 |
9 #include "src/ast/ast.h" | 9 #include "src/ast/ast.h" |
10 #include "src/bootstrapper.h" | 10 #include "src/bootstrapper.h" |
(...skipping 511 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
522 Node* value = assembler->Parameter(Descriptor::kValue); | 522 Node* value = assembler->Parameter(Descriptor::kValue); |
523 Node* slot = assembler->Parameter(Descriptor::kSlot); | 523 Node* slot = assembler->Parameter(Descriptor::kSlot); |
524 Node* vector = assembler->Parameter(Descriptor::kVector); | 524 Node* vector = assembler->Parameter(Descriptor::kVector); |
525 Node* context = assembler->Parameter(Descriptor::kContext); | 525 Node* context = assembler->Parameter(Descriptor::kContext); |
526 | 526 |
527 CodeStubAssembler::StoreICParameters p(context, receiver, name, value, slot, | 527 CodeStubAssembler::StoreICParameters p(context, receiver, name, value, slot, |
528 vector); | 528 vector); |
529 assembler->StoreIC(&p); | 529 assembler->StoreIC(&p); |
530 } | 530 } |
531 | 531 |
| 532 void StoreMapStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
| 533 typedef compiler::Node Node; |
| 534 |
| 535 Node* receiver = assembler->Parameter(Descriptor::kReceiver); |
| 536 Node* map = assembler->Parameter(Descriptor::kMap); |
| 537 Node* value = assembler->Parameter(Descriptor::kValue); |
| 538 |
| 539 assembler->StoreObjectField(receiver, JSObject::kMapOffset, map); |
| 540 assembler->Return(value); |
| 541 } |
| 542 |
532 void StoreTransitionStub::GenerateAssembly(CodeStubAssembler* assembler) const { | 543 void StoreTransitionStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
533 typedef CodeStubAssembler::Label Label; | 544 typedef CodeStubAssembler::Label Label; |
534 typedef compiler::Node Node; | 545 typedef compiler::Node Node; |
535 | 546 |
536 Node* receiver = assembler->Parameter(Descriptor::kReceiver); | 547 Node* receiver = assembler->Parameter(Descriptor::kReceiver); |
537 Node* name = assembler->Parameter(Descriptor::kName); | 548 Node* name = assembler->Parameter(Descriptor::kName); |
| 549 Node* offset = |
| 550 assembler->SmiUntag(assembler->Parameter(Descriptor::kFieldOffset)); |
538 Node* value = assembler->Parameter(Descriptor::kValue); | 551 Node* value = assembler->Parameter(Descriptor::kValue); |
539 Node* map = assembler->Parameter(Descriptor::kMap); | 552 Node* map = assembler->Parameter(Descriptor::kMap); |
540 Node* slot = assembler->Parameter(Descriptor::kSlot); | 553 Node* slot = assembler->Parameter(Descriptor::kSlot); |
541 Node* vector = assembler->Parameter(Descriptor::kVector); | 554 Node* vector = assembler->Parameter(Descriptor::kVector); |
542 Node* context = assembler->Parameter(Descriptor::kContext); | 555 Node* context = assembler->Parameter(Descriptor::kContext); |
543 | 556 |
544 StoreMode store_mode = this->store_mode(); | 557 Label miss(assembler); |
545 Node* prepared_value = value; | |
546 | 558 |
547 Label miss(assembler); | 559 Representation representation = this->representation(); |
548 bool needs_miss_case = false; | 560 assembler->Comment("StoreTransitionStub: is_inobject: %d: representation: %s", |
| 561 is_inobject(), representation.Mnemonic()); |
549 | 562 |
550 if (store_mode != StoreTransitionStub::StoreMapOnly) { | 563 Node* prepared_value = |
551 Representation representation = this->representation(); | 564 assembler->PrepareValueForWrite(value, representation, &miss); |
552 FieldIndex index = this->index(); | 565 |
553 assembler->Comment( | 566 if (store_mode() == StoreTransitionStub::ExtendStorageAndStoreMapAndValue) { |
554 "Prepare value for write: representation: %s, index.is_inobject: %d, " | 567 assembler->Comment("Extend storage"); |
555 "index.offset: %d", | 568 assembler->ExtendPropertiesBackingStore(receiver); |
556 representation.Mnemonic(), index.is_inobject(), index.offset()); | 569 } else { |
557 prepared_value = | 570 DCHECK(store_mode() == StoreTransitionStub::StoreMapAndValue); |
558 assembler->PrepareValueForWrite(prepared_value, representation, &miss); | |
559 // Only store to tagged field never bails out. | |
560 needs_miss_case |= !representation.IsTagged(); | |
561 } | 571 } |
562 | 572 |
563 switch (store_mode) { | 573 // Store the new value into the "extended" object. |
564 case StoreTransitionStub::ExtendStorageAndStoreMapAndValue: | 574 assembler->Comment("Store value"); |
565 assembler->Comment("Extend storage"); | 575 assembler->StoreNamedField(receiver, offset, is_inobject(), representation, |
566 assembler->ExtendPropertiesBackingStore(receiver); | 576 prepared_value, true); |
567 // Fall through. | 577 |
568 case StoreTransitionStub::StoreMapAndValue: | 578 // And finally update the map. |
569 assembler->Comment("Store value"); | 579 assembler->Comment("Store map"); |
570 // Store the new value into the "extended" object. | 580 assembler->StoreObjectField(receiver, JSObject::kMapOffset, map); |
571 assembler->StoreNamedField(receiver, index(), representation(), | |
572 prepared_value, true); | |
573 // Fall through. | |
574 case StoreTransitionStub::StoreMapOnly: | |
575 assembler->Comment("Store map"); | |
576 // And finally update the map. | |
577 assembler->StoreObjectField(receiver, JSObject::kMapOffset, map); | |
578 break; | |
579 } | |
580 assembler->Return(value); | 581 assembler->Return(value); |
581 | 582 |
582 if (needs_miss_case) { | 583 // Only store to tagged field never bails out. |
| 584 if (!representation.IsTagged()) { |
583 assembler->Bind(&miss); | 585 assembler->Bind(&miss); |
584 { | 586 { |
585 assembler->Comment("Miss"); | 587 assembler->Comment("Miss"); |
586 assembler->TailCallRuntime(Runtime::kStoreIC_Miss, context, value, slot, | 588 assembler->TailCallRuntime(Runtime::kStoreIC_Miss, context, value, slot, |
587 vector, receiver, name); | 589 vector, receiver, name); |
588 } | 590 } |
589 } | 591 } |
590 } | 592 } |
591 | 593 |
592 void ElementsTransitionAndStoreStub::GenerateAssembly( | 594 void ElementsTransitionAndStoreStub::GenerateAssembly( |
(...skipping 5279 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5872 | 5874 |
5873 if (type == MachineType::Pointer()) { | 5875 if (type == MachineType::Pointer()) { |
5874 return Representation::External(); | 5876 return Representation::External(); |
5875 } | 5877 } |
5876 | 5878 |
5877 return Representation::Tagged(); | 5879 return Representation::Tagged(); |
5878 } | 5880 } |
5879 | 5881 |
5880 } // namespace internal | 5882 } // namespace internal |
5881 } // namespace v8 | 5883 } // namespace v8 |
OLD | NEW |