| 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 4483 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4494 os << "_One"; | 4494 os << "_One"; |
| 4495 break; | 4495 break; |
| 4496 case MORE_THAN_ONE: | 4496 case MORE_THAN_ONE: |
| 4497 os << "_More_Than_One"; | 4497 os << "_More_Than_One"; |
| 4498 break; | 4498 break; |
| 4499 } | 4499 } |
| 4500 return; | 4500 return; |
| 4501 } | 4501 } |
| 4502 | 4502 |
| 4503 | 4503 |
| 4504 std::ostream& ArrayConstructorStubBase::BasePrintName( | |
| 4505 std::ostream& os, // NOLINT | |
| 4506 const char* name) const { | |
| 4507 os << name << "_" << ElementsKindToString(elements_kind()); | |
| 4508 if (override_mode() == DISABLE_ALLOCATION_SITES) { | |
| 4509 os << "_DISABLE_ALLOCATION_SITES"; | |
| 4510 } | |
| 4511 return os; | |
| 4512 } | |
| 4513 | |
| 4514 bool ToBooleanICStub::UpdateStatus(Handle<Object> object) { | 4504 bool ToBooleanICStub::UpdateStatus(Handle<Object> object) { |
| 4515 Types new_types = types(); | 4505 Types new_types = types(); |
| 4516 Types old_types = new_types; | 4506 Types old_types = new_types; |
| 4517 bool to_boolean_value = new_types.UpdateStatus(isolate(), object); | 4507 bool to_boolean_value = new_types.UpdateStatus(isolate(), object); |
| 4518 TraceTransition(old_types, new_types); | 4508 TraceTransition(old_types, new_types); |
| 4519 set_sub_minor_key(TypesBits::update(sub_minor_key(), new_types.ToIntegral())); | 4509 set_sub_minor_key(TypesBits::update(sub_minor_key(), new_types.ToIntegral())); |
| 4520 return to_boolean_value; | 4510 return to_boolean_value; |
| 4521 } | 4511 } |
| 4522 | 4512 |
| 4523 void ToBooleanICStub::PrintState(std::ostream& os) const { // NOLINT | 4513 void ToBooleanICStub::PrintState(std::ostream& os) const { // NOLINT |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4641 assembler->IntPtrConstant(0), nullptr); | 4631 assembler->IntPtrConstant(0), nullptr); |
| 4642 assembler->Return(array); | 4632 assembler->Return(array); |
| 4643 } | 4633 } |
| 4644 | 4634 |
| 4645 namespace { | 4635 namespace { |
| 4646 | 4636 |
| 4647 void SingleArgumentConstructorCommon(CodeStubAssembler* assembler, | 4637 void SingleArgumentConstructorCommon(CodeStubAssembler* assembler, |
| 4648 ElementsKind elements_kind, | 4638 ElementsKind elements_kind, |
| 4649 compiler::Node* array_map, | 4639 compiler::Node* array_map, |
| 4650 compiler::Node* allocation_site, | 4640 compiler::Node* allocation_site, |
| 4651 Runtime::FunctionId runtime_fallback, | |
| 4652 AllocationSiteMode mode) { | 4641 AllocationSiteMode mode) { |
| 4653 typedef compiler::Node Node; | 4642 typedef compiler::Node Node; |
| 4654 typedef CodeStubAssembler::Label Label; | 4643 typedef CodeStubAssembler::Label Label; |
| 4655 | 4644 |
| 4656 Label ok(assembler); | 4645 Label ok(assembler); |
| 4657 Label smi_size(assembler); | 4646 Label smi_size(assembler); |
| 4658 Label small_smi_size(assembler); | 4647 Label small_smi_size(assembler); |
| 4659 Label call_runtime(assembler, Label::kDeferred); | 4648 Label call_runtime(assembler, Label::kDeferred); |
| 4660 | 4649 |
| 4661 Node* size = assembler->Parameter( | 4650 Node* size = assembler->Parameter( |
| (...skipping 18 matching lines...) Expand all Loading... |
| 4680 elements_kind, array_map, size, size, | 4669 elements_kind, array_map, size, size, |
| 4681 mode == DONT_TRACK_ALLOCATION_SITE ? nullptr : allocation_site, | 4670 mode == DONT_TRACK_ALLOCATION_SITE ? nullptr : allocation_site, |
| 4682 CodeStubAssembler::SMI_PARAMETERS); | 4671 CodeStubAssembler::SMI_PARAMETERS); |
| 4683 assembler->Return(array); | 4672 assembler->Return(array); |
| 4684 } | 4673 } |
| 4685 | 4674 |
| 4686 assembler->Bind(&call_runtime); | 4675 assembler->Bind(&call_runtime); |
| 4687 { | 4676 { |
| 4688 Node* context = assembler->Parameter( | 4677 Node* context = assembler->Parameter( |
| 4689 ArraySingleArgumentConstructorDescriptor::kContextIndex); | 4678 ArraySingleArgumentConstructorDescriptor::kContextIndex); |
| 4690 Node* constructor = assembler->Parameter( | 4679 Node* function = assembler->Parameter( |
| 4691 ArraySingleArgumentConstructorDescriptor::kFunctionIndex); | 4680 ArraySingleArgumentConstructorDescriptor::kFunctionIndex); |
| 4692 Node* argument_count = assembler->Parameter( | 4681 Node* array_size = assembler->Parameter( |
| 4693 ArraySingleArgumentConstructorDescriptor::kArgumentsCountIndex); | 4682 ArraySingleArgumentConstructorDescriptor::kArraySizeSmiParameterIndex); |
| 4694 Node* argument_base_offset = assembler->IntPtrAdd( | 4683 Node* allocation_site = assembler->Parameter( |
| 4695 assembler->IntPtrConstant(CommonFrameConstants::kFixedFrameSizeAboveFp - | 4684 ArraySingleArgumentConstructorDescriptor::kAllocationSiteIndex); |
| 4696 kPointerSize), | 4685 assembler->TailCallRuntime(Runtime::kNewArray, context, function, |
| 4697 assembler->Word32Shl(argument_count, | 4686 array_size, function, allocation_site); |
| 4698 assembler->IntPtrConstant(kPointerSizeLog2))); | |
| 4699 Node* argument_base = assembler->IntPtrAdd(assembler->LoadFramePointer(), | |
| 4700 argument_base_offset); | |
| 4701 Node* array = assembler->CallRuntime( | |
| 4702 runtime_fallback, context, constructor, argument_base, | |
| 4703 assembler->SmiTag(argument_count), allocation_site); | |
| 4704 assembler->Return(array); | |
| 4705 } | 4687 } |
| 4706 } | 4688 } |
| 4707 } // namespace | 4689 } // namespace |
| 4708 | 4690 |
| 4709 void ArraySingleArgumentConstructorStub::GenerateAssembly( | 4691 void ArraySingleArgumentConstructorStub::GenerateAssembly( |
| 4710 CodeStubAssembler* assembler) const { | 4692 CodeStubAssembler* assembler) const { |
| 4711 typedef compiler::Node Node; | 4693 typedef compiler::Node Node; |
| 4712 Node* function = assembler->Parameter( | 4694 Node* function = assembler->Parameter( |
| 4713 ArraySingleArgumentConstructorDescriptor::kFunctionIndex); | 4695 ArraySingleArgumentConstructorDescriptor::kFunctionIndex); |
| 4714 Node* native_context = | 4696 Node* native_context = |
| 4715 assembler->LoadObjectField(function, JSFunction::kContextOffset); | 4697 assembler->LoadObjectField(function, JSFunction::kContextOffset); |
| 4716 Node* array_map = | 4698 Node* array_map = |
| 4717 assembler->LoadJSArrayElementsMap(elements_kind(), native_context); | 4699 assembler->LoadJSArrayElementsMap(elements_kind(), native_context); |
| 4718 AllocationSiteMode mode = override_mode() == DISABLE_ALLOCATION_SITES | 4700 AllocationSiteMode mode = override_mode() == DISABLE_ALLOCATION_SITES |
| 4719 ? DONT_TRACK_ALLOCATION_SITE | 4701 ? DONT_TRACK_ALLOCATION_SITE |
| 4720 : AllocationSite::GetMode(elements_kind()); | 4702 : AllocationSite::GetMode(elements_kind()); |
| 4721 Node* allocation_site = assembler->Parameter( | 4703 Node* allocation_site = assembler->Parameter( |
| 4722 ArrayNoArgumentConstructorDescriptor::kAllocationSiteIndex); | 4704 ArrayNoArgumentConstructorDescriptor::kAllocationSiteIndex); |
| 4723 SingleArgumentConstructorCommon( | 4705 SingleArgumentConstructorCommon(assembler, elements_kind(), array_map, |
| 4724 assembler, elements_kind(), array_map, allocation_site, | 4706 allocation_site, mode); |
| 4725 Runtime::kArraySingleArgumentConstructor, mode); | |
| 4726 } | 4707 } |
| 4727 | 4708 |
| 4728 void InternalArraySingleArgumentConstructorStub::GenerateAssembly( | 4709 void InternalArraySingleArgumentConstructorStub::GenerateAssembly( |
| 4729 CodeStubAssembler* assembler) const { | 4710 CodeStubAssembler* assembler) const { |
| 4730 typedef compiler::Node Node; | 4711 typedef compiler::Node Node; |
| 4731 Node* function = assembler->Parameter( | 4712 Node* function = assembler->Parameter( |
| 4732 ArraySingleArgumentConstructorDescriptor::kFunctionIndex); | 4713 ArraySingleArgumentConstructorDescriptor::kFunctionIndex); |
| 4733 Node* array_map = assembler->LoadObjectField( | 4714 Node* array_map = assembler->LoadObjectField( |
| 4734 function, JSFunction::kPrototypeOrInitialMapOffset); | 4715 function, JSFunction::kPrototypeOrInitialMapOffset); |
| 4735 SingleArgumentConstructorCommon( | 4716 SingleArgumentConstructorCommon(assembler, elements_kind(), array_map, |
| 4736 assembler, elements_kind(), array_map, assembler->UndefinedConstant(), | 4717 assembler->UndefinedConstant(), |
| 4737 Runtime::kArraySingleArgumentConstructor, DONT_TRACK_ALLOCATION_SITE); | 4718 DONT_TRACK_ALLOCATION_SITE); |
| 4738 } | 4719 } |
| 4739 | 4720 |
| 4740 ArrayConstructorStub::ArrayConstructorStub(Isolate* isolate) | 4721 ArrayConstructorStub::ArrayConstructorStub(Isolate* isolate) |
| 4741 : PlatformCodeStub(isolate) { | 4722 : PlatformCodeStub(isolate) { |
| 4742 minor_key_ = ArgumentCountBits::encode(ANY); | 4723 minor_key_ = ArgumentCountBits::encode(ANY); |
| 4743 ArrayConstructorStubBase::GenerateStubsAheadOfTime(isolate); | |
| 4744 } | 4724 } |
| 4745 | 4725 |
| 4746 | 4726 |
| 4747 ArrayConstructorStub::ArrayConstructorStub(Isolate* isolate, | 4727 ArrayConstructorStub::ArrayConstructorStub(Isolate* isolate, |
| 4748 int argument_count) | 4728 int argument_count) |
| 4749 : PlatformCodeStub(isolate) { | 4729 : PlatformCodeStub(isolate) { |
| 4750 if (argument_count == 0) { | 4730 if (argument_count == 0) { |
| 4751 minor_key_ = ArgumentCountBits::encode(NONE); | 4731 minor_key_ = ArgumentCountBits::encode(NONE); |
| 4752 } else if (argument_count == 1) { | 4732 } else if (argument_count == 1) { |
| 4753 minor_key_ = ArgumentCountBits::encode(ONE); | 4733 minor_key_ = ArgumentCountBits::encode(ONE); |
| 4754 } else if (argument_count >= 2) { | 4734 } else if (argument_count >= 2) { |
| 4755 minor_key_ = ArgumentCountBits::encode(MORE_THAN_ONE); | 4735 minor_key_ = ArgumentCountBits::encode(MORE_THAN_ONE); |
| 4756 } else { | 4736 } else { |
| 4757 UNREACHABLE(); | 4737 UNREACHABLE(); |
| 4758 } | 4738 } |
| 4759 ArrayConstructorStubBase::GenerateStubsAheadOfTime(isolate); | |
| 4760 } | 4739 } |
| 4761 | 4740 |
| 4762 | 4741 InternalArrayConstructorStub::InternalArrayConstructorStub(Isolate* isolate) |
| 4763 InternalArrayConstructorStub::InternalArrayConstructorStub( | 4742 : PlatformCodeStub(isolate) {} |
| 4764 Isolate* isolate) : PlatformCodeStub(isolate) { | |
| 4765 InternalArrayConstructorStubBase::GenerateStubsAheadOfTime(isolate); | |
| 4766 } | |
| 4767 | |
| 4768 | 4743 |
| 4769 Representation RepresentationFromType(Type* type) { | 4744 Representation RepresentationFromType(Type* type) { |
| 4770 if (type->Is(Type::UntaggedIntegral())) { | 4745 if (type->Is(Type::UntaggedIntegral())) { |
| 4771 return Representation::Integer32(); | 4746 return Representation::Integer32(); |
| 4772 } | 4747 } |
| 4773 | 4748 |
| 4774 if (type->Is(Type::TaggedSigned())) { | 4749 if (type->Is(Type::TaggedSigned())) { |
| 4775 return Representation::Smi(); | 4750 return Representation::Smi(); |
| 4776 } | 4751 } |
| 4777 | 4752 |
| 4778 if (type->Is(Type::UntaggedPointer())) { | 4753 if (type->Is(Type::UntaggedPointer())) { |
| 4779 return Representation::External(); | 4754 return Representation::External(); |
| 4780 } | 4755 } |
| 4781 | 4756 |
| 4782 DCHECK(!type->Is(Type::Untagged())); | 4757 DCHECK(!type->Is(Type::Untagged())); |
| 4783 return Representation::Tagged(); | 4758 return Representation::Tagged(); |
| 4784 } | 4759 } |
| 4785 | 4760 |
| 4786 } // namespace internal | 4761 } // namespace internal |
| 4787 } // namespace v8 | 4762 } // namespace v8 |
| OLD | NEW |