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 460 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
471 } | 471 } |
472 | 472 |
473 void StoreMapStub::GenerateAssembly(compiler::CodeAssemblerState* state) const { | 473 void StoreMapStub::GenerateAssembly(compiler::CodeAssemblerState* state) const { |
474 typedef compiler::Node Node; | 474 typedef compiler::Node Node; |
475 CodeStubAssembler assembler(state); | 475 CodeStubAssembler assembler(state); |
476 | 476 |
477 Node* receiver = assembler.Parameter(Descriptor::kReceiver); | 477 Node* receiver = assembler.Parameter(Descriptor::kReceiver); |
478 Node* map = assembler.Parameter(Descriptor::kMap); | 478 Node* map = assembler.Parameter(Descriptor::kMap); |
479 Node* value = assembler.Parameter(Descriptor::kValue); | 479 Node* value = assembler.Parameter(Descriptor::kValue); |
480 | 480 |
481 assembler.StoreObjectField(receiver, JSObject::kMapOffset, map); | 481 assembler.StoreMap(receiver, map); |
482 assembler.Return(value); | 482 assembler.Return(value); |
483 } | 483 } |
484 | 484 |
485 void StoreTransitionStub::GenerateAssembly( | 485 void StoreTransitionStub::GenerateAssembly( |
486 compiler::CodeAssemblerState* state) const { | 486 compiler::CodeAssemblerState* state) const { |
487 typedef CodeStubAssembler::Label Label; | 487 typedef CodeStubAssembler::Label Label; |
488 typedef compiler::Node Node; | 488 typedef compiler::Node Node; |
489 CodeStubAssembler assembler(state); | 489 CodeStubAssembler assembler(state); |
490 | 490 |
491 Node* receiver = assembler.Parameter(Descriptor::kReceiver); | 491 Node* receiver = assembler.Parameter(Descriptor::kReceiver); |
(...skipping 22 matching lines...) Expand all Loading... |
514 DCHECK(store_mode() == StoreTransitionStub::StoreMapAndValue); | 514 DCHECK(store_mode() == StoreTransitionStub::StoreMapAndValue); |
515 } | 515 } |
516 | 516 |
517 // Store the new value into the "extended" object. | 517 // Store the new value into the "extended" object. |
518 assembler.Comment("Store value"); | 518 assembler.Comment("Store value"); |
519 assembler.StoreNamedField(receiver, offset, is_inobject(), representation, | 519 assembler.StoreNamedField(receiver, offset, is_inobject(), representation, |
520 prepared_value, true); | 520 prepared_value, true); |
521 | 521 |
522 // And finally update the map. | 522 // And finally update the map. |
523 assembler.Comment("Store map"); | 523 assembler.Comment("Store map"); |
524 assembler.StoreObjectField(receiver, JSObject::kMapOffset, map); | 524 assembler.StoreMap(receiver, map); |
525 assembler.Return(value); | 525 assembler.Return(value); |
526 | 526 |
527 // Only store to tagged field never bails out. | 527 // Only store to tagged field never bails out. |
528 if (!representation.IsTagged()) { | 528 if (!representation.IsTagged()) { |
529 assembler.Bind(&miss); | 529 assembler.Bind(&miss); |
530 { | 530 { |
531 assembler.Comment("Miss"); | 531 assembler.Comment("Miss"); |
532 assembler.TailCallRuntime(Runtime::kStoreIC_Miss, context, value, slot, | 532 assembler.TailCallRuntime(Runtime::kStoreIC_Miss, context, value, slot, |
533 vector, receiver, name); | 533 vector, receiver, name); |
534 } | 534 } |
(...skipping 1691 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2226 { | 2226 { |
2227 offset.Bind(assembler->IntPtrAdd(offset.value(), | 2227 offset.Bind(assembler->IntPtrAdd(offset.value(), |
2228 assembler->IntPtrConstant(kPointerSize))); | 2228 assembler->IntPtrConstant(kPointerSize))); |
2229 assembler->GotoUnless( | 2229 assembler->GotoUnless( |
2230 assembler->IntPtrGreaterThanOrEqual(offset.value(), end_offset), | 2230 assembler->IntPtrGreaterThanOrEqual(offset.value(), end_offset), |
2231 &loop_body); | 2231 &loop_body); |
2232 } | 2232 } |
2233 | 2233 |
2234 if (FLAG_allocation_site_pretenuring) { | 2234 if (FLAG_allocation_site_pretenuring) { |
2235 Node* memento = assembler->InnerAllocate(copy, object_size); | 2235 Node* memento = assembler->InnerAllocate(copy, object_size); |
2236 assembler->StoreObjectFieldNoWriteBarrier( | 2236 assembler->StoreMapNoWriteBarrier(memento, |
2237 memento, HeapObject::kMapOffset, | 2237 Heap::kAllocationMementoMapRootIndex); |
2238 assembler->LoadRoot(Heap::kAllocationMementoMapRootIndex)); | |
2239 assembler->StoreObjectFieldNoWriteBarrier( | 2238 assembler->StoreObjectFieldNoWriteBarrier( |
2240 memento, AllocationMemento::kAllocationSiteOffset, allocation_site); | 2239 memento, AllocationMemento::kAllocationSiteOffset, allocation_site); |
2241 Node* memento_create_count = assembler->LoadObjectField( | 2240 Node* memento_create_count = assembler->LoadObjectField( |
2242 allocation_site, AllocationSite::kPretenureCreateCountOffset); | 2241 allocation_site, AllocationSite::kPretenureCreateCountOffset); |
2243 memento_create_count = assembler->SmiAdd( | 2242 memento_create_count = assembler->SmiAdd( |
2244 memento_create_count, assembler->SmiConstant(Smi::FromInt(1))); | 2243 memento_create_count, assembler->SmiConstant(Smi::FromInt(1))); |
2245 assembler->StoreObjectFieldNoWriteBarrier( | 2244 assembler->StoreObjectFieldNoWriteBarrier( |
2246 allocation_site, AllocationSite::kPretenureCreateCountOffset, | 2245 allocation_site, AllocationSite::kPretenureCreateCountOffset, |
2247 memento_create_count); | 2246 memento_create_count); |
2248 } | 2247 } |
(...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2595 Node* min_context_slots = | 2594 Node* min_context_slots = |
2596 assembler->Int32Constant(Context::MIN_CONTEXT_SLOTS); | 2595 assembler->Int32Constant(Context::MIN_CONTEXT_SLOTS); |
2597 Node* length = assembler->Int32Add(slots, min_context_slots); | 2596 Node* length = assembler->Int32Add(slots, min_context_slots); |
2598 Node* size = assembler->Int32Add( | 2597 Node* size = assembler->Int32Add( |
2599 assembler->Word32Shl(length, assembler->Int32Constant(kPointerSizeLog2)), | 2598 assembler->Word32Shl(length, assembler->Int32Constant(kPointerSizeLog2)), |
2600 assembler->Int32Constant(FixedArray::kHeaderSize)); | 2599 assembler->Int32Constant(FixedArray::kHeaderSize)); |
2601 | 2600 |
2602 // Create a new closure from the given function info in new space | 2601 // Create a new closure from the given function info in new space |
2603 Node* function_context = assembler->Allocate(size); | 2602 Node* function_context = assembler->Allocate(size); |
2604 | 2603 |
2605 Isolate* isolate = assembler->isolate(); | 2604 assembler->StoreMapNoWriteBarrier(function_context, |
2606 assembler->StoreMapNoWriteBarrier( | 2605 Heap::kFunctionContextMapRootIndex); |
2607 function_context, | |
2608 assembler->HeapConstant(isolate->factory()->function_context_map())); | |
2609 assembler->StoreObjectFieldNoWriteBarrier(function_context, | 2606 assembler->StoreObjectFieldNoWriteBarrier(function_context, |
2610 Context::kLengthOffset, | 2607 Context::kLengthOffset, |
2611 assembler->SmiFromWord32(length)); | 2608 assembler->SmiFromWord32(length)); |
2612 | 2609 |
2613 // Set up the fixed slots. | 2610 // Set up the fixed slots. |
2614 assembler->StoreFixedArrayElement(function_context, Context::CLOSURE_INDEX, | 2611 assembler->StoreFixedArrayElement(function_context, Context::CLOSURE_INDEX, |
2615 function, SKIP_WRITE_BARRIER); | 2612 function, SKIP_WRITE_BARRIER); |
2616 assembler->StoreFixedArrayElement(function_context, Context::PREVIOUS_INDEX, | 2613 assembler->StoreFixedArrayElement(function_context, Context::PREVIOUS_INDEX, |
2617 context, SKIP_WRITE_BARRIER); | 2614 context, SKIP_WRITE_BARRIER); |
2618 assembler->StoreFixedArrayElement(function_context, Context::EXTENSION_INDEX, | 2615 assembler->StoreFixedArrayElement(function_context, Context::EXTENSION_INDEX, |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2727 capacity = assembler->SmiUntag(capacity); | 2724 capacity = assembler->SmiUntag(capacity); |
2728 param_mode = CodeStubAssembler::INTEGER_PARAMETERS; | 2725 param_mode = CodeStubAssembler::INTEGER_PARAMETERS; |
2729 } | 2726 } |
2730 | 2727 |
2731 Node *array, *elements; | 2728 Node *array, *elements; |
2732 std::tie(array, elements) = | 2729 std::tie(array, elements) = |
2733 assembler->AllocateUninitializedJSArrayWithElements( | 2730 assembler->AllocateUninitializedJSArrayWithElements( |
2734 kind, boilerplate_map, length, allocation_site, capacity, param_mode); | 2731 kind, boilerplate_map, length, allocation_site, capacity, param_mode); |
2735 | 2732 |
2736 assembler->Comment("copy elements header"); | 2733 assembler->Comment("copy elements header"); |
2737 for (int offset = 0; offset < FixedArrayBase::kHeaderSize; | 2734 // Header consists of map and length. |
2738 offset += kPointerSize) { | 2735 STATIC_ASSERT(FixedArrayBase::kHeaderSize == 2 * kPointerSize); |
2739 Node* value = assembler->LoadObjectField(boilerplate_elements, offset); | 2736 assembler->StoreMap(elements, assembler->LoadMap(boilerplate_elements)); |
2740 assembler->StoreObjectField(elements, offset, value); | 2737 { |
| 2738 int offset = FixedArrayBase::kLengthOffset; |
| 2739 assembler->StoreObjectFieldNoWriteBarrier( |
| 2740 elements, offset, |
| 2741 assembler->LoadObjectField(boilerplate_elements, offset)); |
2741 } | 2742 } |
2742 | 2743 |
2743 if (assembler->Is64()) { | 2744 if (assembler->Is64()) { |
2744 length = assembler->SmiUntag(length); | 2745 length = assembler->SmiUntag(length); |
2745 } | 2746 } |
2746 | 2747 |
2747 assembler->Comment("copy boilerplate elements"); | 2748 assembler->Comment("copy boilerplate elements"); |
2748 assembler->CopyFixedArrayElements(kind, boilerplate_elements, elements, | 2749 assembler->CopyFixedArrayElements(kind, boilerplate_elements, elements, |
2749 length, SKIP_WRITE_BARRIER, param_mode); | 2750 length, SKIP_WRITE_BARRIER, param_mode); |
2750 assembler->IncrementCounter( | 2751 assembler->IncrementCounter( |
(...skipping 451 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3202 } | 3203 } |
3203 | 3204 |
3204 ArrayConstructorStub::ArrayConstructorStub(Isolate* isolate) | 3205 ArrayConstructorStub::ArrayConstructorStub(Isolate* isolate) |
3205 : PlatformCodeStub(isolate) {} | 3206 : PlatformCodeStub(isolate) {} |
3206 | 3207 |
3207 InternalArrayConstructorStub::InternalArrayConstructorStub(Isolate* isolate) | 3208 InternalArrayConstructorStub::InternalArrayConstructorStub(Isolate* isolate) |
3208 : PlatformCodeStub(isolate) {} | 3209 : PlatformCodeStub(isolate) {} |
3209 | 3210 |
3210 } // namespace internal | 3211 } // namespace internal |
3211 } // namespace v8 | 3212 } // namespace v8 |
OLD | NEW |