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/bootstrapper.h" | 9 #include "src/bootstrapper.h" |
10 #include "src/code-factory.h" | 10 #include "src/code-factory.h" |
(...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
414 CodeStubAssembler assembler(isolate(), &zone, descriptor, GetCodeFlags(), | 414 CodeStubAssembler assembler(isolate(), &zone, descriptor, GetCodeFlags(), |
415 name); | 415 name); |
416 GenerateAssembly(&assembler); | 416 GenerateAssembly(&assembler); |
417 return assembler.GenerateCode(); | 417 return assembler.GenerateCode(); |
418 } | 418 } |
419 | 419 |
420 void LoadICTrampolineTFStub::GenerateAssembly( | 420 void LoadICTrampolineTFStub::GenerateAssembly( |
421 CodeStubAssembler* assembler) const { | 421 CodeStubAssembler* assembler) const { |
422 typedef compiler::Node Node; | 422 typedef compiler::Node Node; |
423 | 423 |
424 Node* receiver = assembler->Parameter(0); | 424 Node* receiver = assembler->Parameter(Descriptor::kReceiver); |
425 Node* name = assembler->Parameter(1); | 425 Node* name = assembler->Parameter(Descriptor::kName); |
426 Node* slot = assembler->Parameter(2); | 426 Node* slot = assembler->Parameter(Descriptor::kSlot); |
427 Node* context = assembler->Parameter(3); | 427 Node* context = assembler->Parameter(Descriptor::kContext); |
428 Node* vector = assembler->LoadTypeFeedbackVectorForStub(); | 428 Node* vector = assembler->LoadTypeFeedbackVectorForStub(); |
429 | 429 |
430 CodeStubAssembler::LoadICParameters p(context, receiver, name, slot, vector); | 430 CodeStubAssembler::LoadICParameters p(context, receiver, name, slot, vector); |
431 assembler->LoadIC(&p); | 431 assembler->LoadIC(&p); |
432 } | 432 } |
433 | 433 |
434 void LoadICTFStub::GenerateAssembly(CodeStubAssembler* assembler) const { | 434 void LoadICTFStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
435 typedef compiler::Node Node; | 435 typedef compiler::Node Node; |
436 | 436 |
437 Node* receiver = assembler->Parameter(0); | 437 Node* receiver = assembler->Parameter(Descriptor::kReceiver); |
438 Node* name = assembler->Parameter(1); | 438 Node* name = assembler->Parameter(Descriptor::kName); |
439 Node* slot = assembler->Parameter(2); | 439 Node* slot = assembler->Parameter(Descriptor::kSlot); |
440 Node* vector = assembler->Parameter(3); | 440 Node* vector = assembler->Parameter(Descriptor::kVector); |
441 Node* context = assembler->Parameter(4); | 441 Node* context = assembler->Parameter(Descriptor::kContext); |
442 | 442 |
443 CodeStubAssembler::LoadICParameters p(context, receiver, name, slot, vector); | 443 CodeStubAssembler::LoadICParameters p(context, receiver, name, slot, vector); |
444 assembler->LoadIC(&p); | 444 assembler->LoadIC(&p); |
445 } | 445 } |
446 | 446 |
447 void LoadGlobalICTrampolineStub::GenerateAssembly( | 447 void LoadGlobalICTrampolineStub::GenerateAssembly( |
448 CodeStubAssembler* assembler) const { | 448 CodeStubAssembler* assembler) const { |
449 typedef compiler::Node Node; | 449 typedef compiler::Node Node; |
450 | 450 |
451 Node* slot = assembler->Parameter(0); | 451 Node* slot = assembler->Parameter(Descriptor::kSlot); |
452 Node* context = assembler->Parameter(1); | 452 Node* context = assembler->Parameter(Descriptor::kContext); |
453 Node* vector = assembler->LoadTypeFeedbackVectorForStub(); | 453 Node* vector = assembler->LoadTypeFeedbackVectorForStub(); |
454 | 454 |
455 CodeStubAssembler::LoadICParameters p(context, nullptr, nullptr, slot, | 455 CodeStubAssembler::LoadICParameters p(context, nullptr, nullptr, slot, |
456 vector); | 456 vector); |
457 assembler->LoadGlobalIC(&p); | 457 assembler->LoadGlobalIC(&p); |
458 } | 458 } |
459 | 459 |
460 void LoadGlobalICStub::GenerateAssembly(CodeStubAssembler* assembler) const { | 460 void LoadGlobalICStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
461 typedef compiler::Node Node; | 461 typedef compiler::Node Node; |
462 | 462 |
463 Node* slot = assembler->Parameter(0); | 463 Node* slot = assembler->Parameter(Descriptor::kSlot); |
464 Node* vector = assembler->Parameter(1); | 464 Node* vector = assembler->Parameter(Descriptor::kVector); |
465 Node* context = assembler->Parameter(2); | 465 Node* context = assembler->Parameter(Descriptor::kContext); |
466 | 466 |
467 CodeStubAssembler::LoadICParameters p(context, nullptr, nullptr, slot, | 467 CodeStubAssembler::LoadICParameters p(context, nullptr, nullptr, slot, |
468 vector); | 468 vector); |
469 assembler->LoadGlobalIC(&p); | 469 assembler->LoadGlobalIC(&p); |
470 } | 470 } |
471 | 471 |
472 void AllocateHeapNumberStub::GenerateAssembly( | 472 void AllocateHeapNumberStub::GenerateAssembly( |
473 CodeStubAssembler* assembler) const { | 473 CodeStubAssembler* assembler) const { |
474 typedef compiler::Node Node; | 474 typedef compiler::Node Node; |
475 | 475 |
(...skipping 3076 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3552 assembler->Return(assembler->BooleanConstant(mode == kDontNegateResult)); | 3552 assembler->Return(assembler->BooleanConstant(mode == kDontNegateResult)); |
3553 | 3553 |
3554 assembler->Bind(&if_notequal); | 3554 assembler->Bind(&if_notequal); |
3555 assembler->Return(assembler->BooleanConstant(mode == kNegateResult)); | 3555 assembler->Return(assembler->BooleanConstant(mode == kNegateResult)); |
3556 } | 3556 } |
3557 | 3557 |
3558 } // namespace | 3558 } // namespace |
3559 | 3559 |
3560 void LoadApiGetterStub::GenerateAssembly(CodeStubAssembler* assembler) const { | 3560 void LoadApiGetterStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
3561 typedef compiler::Node Node; | 3561 typedef compiler::Node Node; |
3562 Node* context = assembler->Parameter(3); | 3562 Node* context = assembler->Parameter(Descriptor::kContext); |
3563 Node* receiver = assembler->Parameter(0); | 3563 Node* receiver = assembler->Parameter(Descriptor::kReceiver); |
3564 // For now we only support receiver_is_holder. | 3564 // For now we only support receiver_is_holder. |
3565 DCHECK(receiver_is_holder()); | 3565 DCHECK(receiver_is_holder()); |
3566 Node* holder = receiver; | 3566 Node* holder = receiver; |
3567 Node* map = assembler->LoadMap(receiver); | 3567 Node* map = assembler->LoadMap(receiver); |
3568 Node* descriptors = assembler->LoadMapDescriptors(map); | 3568 Node* descriptors = assembler->LoadMapDescriptors(map); |
3569 Node* offset = | 3569 Node* offset = |
3570 assembler->Int32Constant(DescriptorArray::ToValueIndex(index())); | 3570 assembler->Int32Constant(DescriptorArray::ToValueIndex(index())); |
3571 Node* callback = assembler->LoadFixedArrayElement(descriptors, offset); | 3571 Node* callback = assembler->LoadFixedArrayElement(descriptors, offset); |
3572 assembler->TailCallStub(CodeFactory::ApiGetter(isolate()), context, receiver, | 3572 assembler->TailCallStub(CodeFactory::ApiGetter(isolate()), context, receiver, |
3573 holder, callback); | 3573 holder, callback); |
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3798 assembler->Return(var_arg.value()); | 3798 assembler->Return(var_arg.value()); |
3799 | 3799 |
3800 assembler->Bind(&return_zero); | 3800 assembler->Bind(&return_zero); |
3801 assembler->Return(assembler->SmiConstant(Smi::FromInt(0))); | 3801 assembler->Return(assembler->SmiConstant(Smi::FromInt(0))); |
3802 } | 3802 } |
3803 } | 3803 } |
3804 | 3804 |
3805 void StoreInterceptorStub::GenerateAssembly( | 3805 void StoreInterceptorStub::GenerateAssembly( |
3806 CodeStubAssembler* assembler) const { | 3806 CodeStubAssembler* assembler) const { |
3807 typedef compiler::Node Node; | 3807 typedef compiler::Node Node; |
3808 Node* receiver = assembler->Parameter(0); | 3808 |
3809 Node* name = assembler->Parameter(1); | 3809 Node* receiver = assembler->Parameter(Descriptor::kReceiver); |
3810 Node* value = assembler->Parameter(2); | 3810 Node* name = assembler->Parameter(Descriptor::kName); |
3811 // Node* slot = assembler->Parameter(3); | 3811 Node* value = assembler->Parameter(Descriptor::kValue); |
3812 // Node* vector = assembler->Parameter(4); | 3812 Node* context = assembler->Parameter(Descriptor::kContext); |
3813 Node* context = assembler->Parameter(5); | |
3814 assembler->TailCallRuntime(Runtime::kStorePropertyWithInterceptor, context, | 3813 assembler->TailCallRuntime(Runtime::kStorePropertyWithInterceptor, context, |
3815 receiver, name, value); | 3814 receiver, name, value); |
3816 } | 3815 } |
3817 | 3816 |
3818 void LoadIndexedInterceptorStub::GenerateAssembly( | 3817 void LoadIndexedInterceptorStub::GenerateAssembly( |
3819 CodeStubAssembler* assembler) const { | 3818 CodeStubAssembler* assembler) const { |
3820 typedef compiler::Node Node; | 3819 typedef compiler::Node Node; |
3821 typedef CodeStubAssembler::Label Label; | 3820 typedef CodeStubAssembler::Label Label; |
3822 Node* receiver = assembler->Parameter(0); | 3821 |
3823 Node* key = assembler->Parameter(1); | 3822 Node* receiver = assembler->Parameter(Descriptor::kReceiver); |
3824 Node* slot = assembler->Parameter(2); | 3823 Node* key = assembler->Parameter(Descriptor::kName); |
3825 Node* vector = assembler->Parameter(3); | 3824 Node* slot = assembler->Parameter(Descriptor::kSlot); |
3826 Node* context = assembler->Parameter(4); | 3825 Node* vector = assembler->Parameter(Descriptor::kVector); |
| 3826 Node* context = assembler->Parameter(Descriptor::kContext); |
3827 | 3827 |
3828 Label if_keyispositivesmi(assembler), if_keyisinvalid(assembler); | 3828 Label if_keyispositivesmi(assembler), if_keyisinvalid(assembler); |
3829 assembler->Branch(assembler->WordIsPositiveSmi(key), &if_keyispositivesmi, | 3829 assembler->Branch(assembler->WordIsPositiveSmi(key), &if_keyispositivesmi, |
3830 &if_keyisinvalid); | 3830 &if_keyisinvalid); |
3831 assembler->Bind(&if_keyispositivesmi); | 3831 assembler->Bind(&if_keyispositivesmi); |
3832 assembler->TailCallRuntime(Runtime::kLoadElementWithInterceptor, context, | 3832 assembler->TailCallRuntime(Runtime::kLoadElementWithInterceptor, context, |
3833 receiver, key); | 3833 receiver, key); |
3834 | 3834 |
3835 assembler->Bind(&if_keyisinvalid); | 3835 assembler->Bind(&if_keyisinvalid); |
3836 assembler->TailCallRuntime(Runtime::kKeyedLoadIC_Miss, context, receiver, key, | 3836 assembler->TailCallRuntime(Runtime::kKeyedLoadIC_Miss, context, receiver, key, |
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4058 CodeStubDescriptor* descriptor) { | 4058 CodeStubDescriptor* descriptor) { |
4059 descriptor->Initialize( | 4059 descriptor->Initialize( |
4060 FUNCTION_ADDR(Runtime_ElementsTransitionAndStoreIC_Miss)); | 4060 FUNCTION_ADDR(Runtime_ElementsTransitionAndStoreIC_Miss)); |
4061 } | 4061 } |
4062 | 4062 |
4063 | 4063 |
4064 void ToObjectStub::InitializeDescriptor(CodeStubDescriptor* descriptor) { | 4064 void ToObjectStub::InitializeDescriptor(CodeStubDescriptor* descriptor) { |
4065 descriptor->Initialize(Runtime::FunctionForId(Runtime::kToObject)->entry); | 4065 descriptor->Initialize(Runtime::FunctionForId(Runtime::kToObject)->entry); |
4066 } | 4066 } |
4067 | 4067 |
4068 | 4068 void StoreTransitionStub::InitializeDescriptor(CodeStubDescriptor* descriptor) { |
4069 CallInterfaceDescriptor StoreTransitionStub::GetCallInterfaceDescriptor() | 4069 descriptor->Initialize( |
4070 const { | 4070 FUNCTION_ADDR(Runtime_TransitionStoreIC_MissFromStubFailure)); |
4071 return VectorStoreTransitionDescriptor(isolate()); | |
4072 } | |
4073 | |
4074 | |
4075 CallInterfaceDescriptor | |
4076 ElementsTransitionAndStoreStub::GetCallInterfaceDescriptor() const { | |
4077 return VectorStoreTransitionDescriptor(isolate()); | |
4078 } | 4071 } |
4079 | 4072 |
4080 void TypeofStub::InitializeDescriptor(CodeStubDescriptor* descriptor) {} | 4073 void TypeofStub::InitializeDescriptor(CodeStubDescriptor* descriptor) {} |
4081 | 4074 |
4082 void NumberToStringStub::InitializeDescriptor(CodeStubDescriptor* descriptor) { | 4075 void NumberToStringStub::InitializeDescriptor(CodeStubDescriptor* descriptor) { |
4083 descriptor->Initialize( | 4076 descriptor->Initialize( |
4084 Runtime::FunctionForId(Runtime::kNumberToString)->entry); | 4077 Runtime::FunctionForId(Runtime::kNumberToString)->entry); |
4085 } | 4078 } |
4086 | 4079 |
4087 | 4080 |
(...skipping 404 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4492 } | 4485 } |
4493 | 4486 |
4494 void FastNewFunctionContextStub::GenerateAssembly( | 4487 void FastNewFunctionContextStub::GenerateAssembly( |
4495 CodeStubAssembler* assembler) const { | 4488 CodeStubAssembler* assembler) const { |
4496 typedef compiler::Node Node; | 4489 typedef compiler::Node Node; |
4497 | 4490 |
4498 int length = slots() + Context::MIN_CONTEXT_SLOTS; | 4491 int length = slots() + Context::MIN_CONTEXT_SLOTS; |
4499 int size = length * kPointerSize + FixedArray::kHeaderSize; | 4492 int size = length * kPointerSize + FixedArray::kHeaderSize; |
4500 | 4493 |
4501 // Get the function | 4494 // Get the function |
4502 Node* function = | 4495 Node* function = assembler->Parameter(Descriptor::kFunction); |
4503 assembler->Parameter(FastNewFunctionContextDescriptor::kFunctionIndex); | 4496 Node* context = assembler->Parameter(Descriptor::kContext); |
4504 Node* context = | |
4505 assembler->Parameter(FastNewFunctionContextDescriptor::kContextIndex); | |
4506 | 4497 |
4507 // Create a new closure from the given function info in new space | 4498 // Create a new closure from the given function info in new space |
4508 Node* function_context = assembler->Allocate(size); | 4499 Node* function_context = assembler->Allocate(size); |
4509 | 4500 |
4510 assembler->StoreMapNoWriteBarrier( | 4501 assembler->StoreMapNoWriteBarrier( |
4511 function_context, | 4502 function_context, |
4512 assembler->HeapConstant(isolate()->factory()->function_context_map())); | 4503 assembler->HeapConstant(isolate()->factory()->function_context_map())); |
4513 assembler->StoreObjectFieldNoWriteBarrier( | 4504 assembler->StoreObjectFieldNoWriteBarrier( |
4514 function_context, Context::kLengthOffset, | 4505 function_context, Context::kLengthOffset, |
4515 assembler->SmiConstant(Smi::FromInt(length))); | 4506 assembler->SmiConstant(Smi::FromInt(length))); |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4685 Isolate* isolate) { | 4676 Isolate* isolate) { |
4686 FunctionEntryHook entry_hook = isolate->function_entry_hook(); | 4677 FunctionEntryHook entry_hook = isolate->function_entry_hook(); |
4687 DCHECK(entry_hook != NULL); | 4678 DCHECK(entry_hook != NULL); |
4688 entry_hook(function, stack_pointer); | 4679 entry_hook(function, stack_pointer); |
4689 } | 4680 } |
4690 | 4681 |
4691 void ArrayNoArgumentConstructorStub::GenerateAssembly( | 4682 void ArrayNoArgumentConstructorStub::GenerateAssembly( |
4692 CodeStubAssembler* assembler) const { | 4683 CodeStubAssembler* assembler) const { |
4693 typedef compiler::Node Node; | 4684 typedef compiler::Node Node; |
4694 Node* native_context = assembler->LoadObjectField( | 4685 Node* native_context = assembler->LoadObjectField( |
4695 assembler->Parameter( | 4686 assembler->Parameter(Descriptor::kFunction), JSFunction::kContextOffset); |
4696 ArrayNoArgumentConstructorDescriptor::kFunctionIndex), | |
4697 JSFunction::kContextOffset); | |
4698 bool track_allocation_site = | 4687 bool track_allocation_site = |
4699 AllocationSite::GetMode(elements_kind()) == TRACK_ALLOCATION_SITE && | 4688 AllocationSite::GetMode(elements_kind()) == TRACK_ALLOCATION_SITE && |
4700 override_mode() != DISABLE_ALLOCATION_SITES; | 4689 override_mode() != DISABLE_ALLOCATION_SITES; |
4701 Node* allocation_site = | 4690 Node* allocation_site = |
4702 track_allocation_site | 4691 track_allocation_site ? assembler->Parameter(Descriptor::kAllocationSite) |
4703 ? assembler->Parameter( | 4692 : nullptr; |
4704 ArrayNoArgumentConstructorDescriptor::kAllocationSiteIndex) | |
4705 : nullptr; | |
4706 Node* array_map = | 4693 Node* array_map = |
4707 assembler->LoadJSArrayElementsMap(elements_kind(), native_context); | 4694 assembler->LoadJSArrayElementsMap(elements_kind(), native_context); |
4708 Node* array = assembler->AllocateJSArray( | 4695 Node* array = assembler->AllocateJSArray( |
4709 elements_kind(), array_map, | 4696 elements_kind(), array_map, |
4710 assembler->IntPtrConstant(JSArray::kPreallocatedArrayElements), | 4697 assembler->IntPtrConstant(JSArray::kPreallocatedArrayElements), |
4711 assembler->IntPtrConstant(0), allocation_site); | 4698 assembler->IntPtrConstant(0), allocation_site); |
4712 assembler->Return(array); | 4699 assembler->Return(array); |
4713 } | 4700 } |
4714 | 4701 |
4715 void InternalArrayNoArgumentConstructorStub::GenerateAssembly( | 4702 void InternalArrayNoArgumentConstructorStub::GenerateAssembly( |
4716 CodeStubAssembler* assembler) const { | 4703 CodeStubAssembler* assembler) const { |
4717 typedef compiler::Node Node; | 4704 typedef compiler::Node Node; |
4718 Node* array_map = assembler->LoadObjectField( | 4705 Node* array_map = |
4719 assembler->Parameter( | 4706 assembler->LoadObjectField(assembler->Parameter(Descriptor::kFunction), |
4720 ArrayNoArgumentConstructorDescriptor::kFunctionIndex), | 4707 JSFunction::kPrototypeOrInitialMapOffset); |
4721 JSFunction::kPrototypeOrInitialMapOffset); | |
4722 Node* array = assembler->AllocateJSArray( | 4708 Node* array = assembler->AllocateJSArray( |
4723 elements_kind(), array_map, | 4709 elements_kind(), array_map, |
4724 assembler->IntPtrConstant(JSArray::kPreallocatedArrayElements), | 4710 assembler->IntPtrConstant(JSArray::kPreallocatedArrayElements), |
4725 assembler->IntPtrConstant(0), nullptr); | 4711 assembler->IntPtrConstant(0), nullptr); |
4726 assembler->Return(array); | 4712 assembler->Return(array); |
4727 } | 4713 } |
4728 | 4714 |
4729 namespace { | 4715 namespace { |
4730 | 4716 |
| 4717 template <typename Descriptor> |
4731 void SingleArgumentConstructorCommon(CodeStubAssembler* assembler, | 4718 void SingleArgumentConstructorCommon(CodeStubAssembler* assembler, |
4732 ElementsKind elements_kind, | 4719 ElementsKind elements_kind, |
4733 compiler::Node* array_map, | 4720 compiler::Node* array_map, |
4734 compiler::Node* allocation_site, | 4721 compiler::Node* allocation_site, |
4735 AllocationSiteMode mode) { | 4722 AllocationSiteMode mode) { |
4736 typedef compiler::Node Node; | 4723 typedef compiler::Node Node; |
4737 typedef CodeStubAssembler::Label Label; | 4724 typedef CodeStubAssembler::Label Label; |
4738 | 4725 |
4739 Label ok(assembler); | 4726 Label ok(assembler); |
4740 Label smi_size(assembler); | 4727 Label smi_size(assembler); |
4741 Label small_smi_size(assembler); | 4728 Label small_smi_size(assembler); |
4742 Label call_runtime(assembler, Label::kDeferred); | 4729 Label call_runtime(assembler, Label::kDeferred); |
4743 | 4730 |
4744 Node* size = assembler->Parameter( | 4731 Node* size = assembler->Parameter(Descriptor::kArraySizeSmiParameter); |
4745 ArraySingleArgumentConstructorDescriptor::kArraySizeSmiParameterIndex); | |
4746 assembler->Branch(assembler->WordIsSmi(size), &smi_size, &call_runtime); | 4732 assembler->Branch(assembler->WordIsSmi(size), &smi_size, &call_runtime); |
4747 | 4733 |
4748 assembler->Bind(&smi_size); | 4734 assembler->Bind(&smi_size); |
4749 | 4735 |
4750 if (IsFastPackedElementsKind(elements_kind)) { | 4736 if (IsFastPackedElementsKind(elements_kind)) { |
4751 Label abort(assembler, Label::kDeferred); | 4737 Label abort(assembler, Label::kDeferred); |
4752 assembler->Branch( | 4738 assembler->Branch( |
4753 assembler->SmiEqual(size, assembler->SmiConstant(Smi::FromInt(0))), | 4739 assembler->SmiEqual(size, assembler->SmiConstant(Smi::FromInt(0))), |
4754 &small_smi_size, &abort); | 4740 &small_smi_size, &abort); |
4755 | 4741 |
4756 assembler->Bind(&abort); | 4742 assembler->Bind(&abort); |
4757 Node* reason = | 4743 Node* reason = |
4758 assembler->SmiConstant(Smi::FromInt(kAllocatingNonEmptyPackedArray)); | 4744 assembler->SmiConstant(Smi::FromInt(kAllocatingNonEmptyPackedArray)); |
4759 Node* context = assembler->Parameter( | 4745 Node* context = assembler->Parameter(Descriptor::kContext); |
4760 ArraySingleArgumentConstructorDescriptor::kContextIndex); | |
4761 assembler->TailCallRuntime(Runtime::kAbort, context, reason); | 4746 assembler->TailCallRuntime(Runtime::kAbort, context, reason); |
4762 } else { | 4747 } else { |
4763 int element_size = | 4748 int element_size = |
4764 IsFastDoubleElementsKind(elements_kind) ? kDoubleSize : kPointerSize; | 4749 IsFastDoubleElementsKind(elements_kind) ? kDoubleSize : kPointerSize; |
4765 int max_fast_elements = | 4750 int max_fast_elements = |
4766 (Page::kMaxRegularHeapObjectSize - FixedArray::kHeaderSize - | 4751 (Page::kMaxRegularHeapObjectSize - FixedArray::kHeaderSize - |
4767 JSArray::kSize - AllocationMemento::kSize) / | 4752 JSArray::kSize - AllocationMemento::kSize) / |
4768 element_size; | 4753 element_size; |
4769 assembler->Branch( | 4754 assembler->Branch( |
4770 assembler->SmiAboveOrEqual( | 4755 assembler->SmiAboveOrEqual( |
4771 size, assembler->SmiConstant(Smi::FromInt(max_fast_elements))), | 4756 size, assembler->SmiConstant(Smi::FromInt(max_fast_elements))), |
4772 &call_runtime, &small_smi_size); | 4757 &call_runtime, &small_smi_size); |
4773 } | 4758 } |
4774 | 4759 |
4775 assembler->Bind(&small_smi_size); | 4760 assembler->Bind(&small_smi_size); |
4776 { | 4761 { |
4777 Node* array = assembler->AllocateJSArray( | 4762 Node* array = assembler->AllocateJSArray( |
4778 elements_kind, array_map, size, size, | 4763 elements_kind, array_map, size, size, |
4779 mode == DONT_TRACK_ALLOCATION_SITE ? nullptr : allocation_site, | 4764 mode == DONT_TRACK_ALLOCATION_SITE ? nullptr : allocation_site, |
4780 CodeStubAssembler::SMI_PARAMETERS); | 4765 CodeStubAssembler::SMI_PARAMETERS); |
4781 assembler->Return(array); | 4766 assembler->Return(array); |
4782 } | 4767 } |
4783 | 4768 |
4784 assembler->Bind(&call_runtime); | 4769 assembler->Bind(&call_runtime); |
4785 { | 4770 { |
4786 Node* context = assembler->Parameter( | 4771 Node* context = assembler->Parameter(Descriptor::kContext); |
4787 ArraySingleArgumentConstructorDescriptor::kContextIndex); | 4772 Node* function = assembler->Parameter(Descriptor::kFunction); |
4788 Node* function = assembler->Parameter( | 4773 Node* array_size = assembler->Parameter(Descriptor::kArraySizeSmiParameter); |
4789 ArraySingleArgumentConstructorDescriptor::kFunctionIndex); | 4774 Node* allocation_site = assembler->Parameter(Descriptor::kAllocationSite); |
4790 Node* array_size = assembler->Parameter( | |
4791 ArraySingleArgumentConstructorDescriptor::kArraySizeSmiParameterIndex); | |
4792 Node* allocation_site = assembler->Parameter( | |
4793 ArraySingleArgumentConstructorDescriptor::kAllocationSiteIndex); | |
4794 assembler->TailCallRuntime(Runtime::kNewArray, context, function, | 4775 assembler->TailCallRuntime(Runtime::kNewArray, context, function, |
4795 array_size, function, allocation_site); | 4776 array_size, function, allocation_site); |
4796 } | 4777 } |
4797 } | 4778 } |
4798 } // namespace | 4779 } // namespace |
4799 | 4780 |
4800 void ArraySingleArgumentConstructorStub::GenerateAssembly( | 4781 void ArraySingleArgumentConstructorStub::GenerateAssembly( |
4801 CodeStubAssembler* assembler) const { | 4782 CodeStubAssembler* assembler) const { |
4802 typedef compiler::Node Node; | 4783 typedef compiler::Node Node; |
4803 Node* function = assembler->Parameter( | 4784 Node* function = assembler->Parameter(Descriptor::kFunction); |
4804 ArraySingleArgumentConstructorDescriptor::kFunctionIndex); | |
4805 Node* native_context = | 4785 Node* native_context = |
4806 assembler->LoadObjectField(function, JSFunction::kContextOffset); | 4786 assembler->LoadObjectField(function, JSFunction::kContextOffset); |
4807 Node* array_map = | 4787 Node* array_map = |
4808 assembler->LoadJSArrayElementsMap(elements_kind(), native_context); | 4788 assembler->LoadJSArrayElementsMap(elements_kind(), native_context); |
4809 AllocationSiteMode mode = override_mode() == DISABLE_ALLOCATION_SITES | 4789 AllocationSiteMode mode = override_mode() == DISABLE_ALLOCATION_SITES |
4810 ? DONT_TRACK_ALLOCATION_SITE | 4790 ? DONT_TRACK_ALLOCATION_SITE |
4811 : AllocationSite::GetMode(elements_kind()); | 4791 : AllocationSite::GetMode(elements_kind()); |
4812 Node* allocation_site = assembler->Parameter( | 4792 Node* allocation_site = assembler->Parameter(Descriptor::kAllocationSite); |
4813 ArrayNoArgumentConstructorDescriptor::kAllocationSiteIndex); | 4793 SingleArgumentConstructorCommon<Descriptor>(assembler, elements_kind(), |
4814 SingleArgumentConstructorCommon(assembler, elements_kind(), array_map, | 4794 array_map, allocation_site, mode); |
4815 allocation_site, mode); | |
4816 } | 4795 } |
4817 | 4796 |
4818 void InternalArraySingleArgumentConstructorStub::GenerateAssembly( | 4797 void InternalArraySingleArgumentConstructorStub::GenerateAssembly( |
4819 CodeStubAssembler* assembler) const { | 4798 CodeStubAssembler* assembler) const { |
4820 typedef compiler::Node Node; | 4799 typedef compiler::Node Node; |
4821 Node* function = assembler->Parameter( | 4800 Node* function = assembler->Parameter(Descriptor::kFunction); |
4822 ArraySingleArgumentConstructorDescriptor::kFunctionIndex); | |
4823 Node* array_map = assembler->LoadObjectField( | 4801 Node* array_map = assembler->LoadObjectField( |
4824 function, JSFunction::kPrototypeOrInitialMapOffset); | 4802 function, JSFunction::kPrototypeOrInitialMapOffset); |
4825 SingleArgumentConstructorCommon(assembler, elements_kind(), array_map, | 4803 SingleArgumentConstructorCommon<Descriptor>( |
4826 assembler->UndefinedConstant(), | 4804 assembler, elements_kind(), array_map, assembler->UndefinedConstant(), |
4827 DONT_TRACK_ALLOCATION_SITE); | 4805 DONT_TRACK_ALLOCATION_SITE); |
4828 } | 4806 } |
4829 | 4807 |
4830 ArrayConstructorStub::ArrayConstructorStub(Isolate* isolate) | 4808 ArrayConstructorStub::ArrayConstructorStub(Isolate* isolate) |
4831 : PlatformCodeStub(isolate) { | 4809 : PlatformCodeStub(isolate) { |
4832 minor_key_ = ArgumentCountBits::encode(ANY); | 4810 minor_key_ = ArgumentCountBits::encode(ANY); |
4833 } | 4811 } |
4834 | 4812 |
4835 | 4813 |
4836 ArrayConstructorStub::ArrayConstructorStub(Isolate* isolate, | 4814 ArrayConstructorStub::ArrayConstructorStub(Isolate* isolate, |
4837 int argument_count) | 4815 int argument_count) |
(...skipping 24 matching lines...) Expand all Loading... |
4862 if (type->Is(Type::UntaggedPointer())) { | 4840 if (type->Is(Type::UntaggedPointer())) { |
4863 return Representation::External(); | 4841 return Representation::External(); |
4864 } | 4842 } |
4865 | 4843 |
4866 DCHECK(!type->Is(Type::Untagged())); | 4844 DCHECK(!type->Is(Type::Untagged())); |
4867 return Representation::Tagged(); | 4845 return Representation::Tagged(); |
4868 } | 4846 } |
4869 | 4847 |
4870 } // namespace internal | 4848 } // namespace internal |
4871 } // namespace v8 | 4849 } // namespace v8 |
OLD | NEW |