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

Unified Diff: src/code-stubs.cc

Issue 2605893002: [builtins] More stubs to the builtin-o-sphere. (Closed)
Patch Set: Fixed compile error. Created 4 years 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/code-stubs.h ('k') | src/compiler/js-generic-lowering.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/code-stubs.cc
diff --git a/src/code-stubs.cc b/src/code-stubs.cc
index 686a449ac7f7a688be1de31c98d279c614957b33..532756569b1ecb3033e306e199685f60dbf2a669 100644
--- a/src/code-stubs.cc
+++ b/src/code-stubs.cc
@@ -1777,123 +1777,6 @@ void LoadIndexedInterceptorStub::GenerateAssembly(
slot, vector);
}
-// static
-int FastCloneShallowObjectStub::PropertiesCount(int literal_length) {
- // This heuristic of setting empty literals to have
- // kInitialGlobalObjectUnusedPropertiesCount must remain in-sync with the
- // runtime.
- // TODO(verwaest): Unify this with the heuristic in the runtime.
- return literal_length == 0
- ? JSObject::kInitialGlobalObjectUnusedPropertiesCount
- : literal_length;
-}
-
-// static
-compiler::Node* FastCloneShallowObjectStub::GenerateFastPath(
- CodeStubAssembler* assembler, compiler::CodeAssembler::Label* call_runtime,
- compiler::Node* closure, compiler::Node* literals_index,
- compiler::Node* properties_count) {
- typedef compiler::Node Node;
- typedef compiler::CodeAssembler::Label Label;
- typedef compiler::CodeAssembler::Variable Variable;
-
- Node* literals_array =
- assembler->LoadObjectField(closure, JSFunction::kLiteralsOffset);
- Node* allocation_site = assembler->LoadFixedArrayElement(
- literals_array, literals_index,
- LiteralsArray::kFirstLiteralIndex * kPointerSize,
- CodeStubAssembler::SMI_PARAMETERS);
- assembler->GotoIf(assembler->IsUndefined(allocation_site), call_runtime);
-
- // Calculate the object and allocation size based on the properties count.
- Node* object_size = assembler->IntPtrAdd(
- assembler->WordShl(properties_count, kPointerSizeLog2),
- assembler->IntPtrConstant(JSObject::kHeaderSize));
- Node* allocation_size = object_size;
- if (FLAG_allocation_site_pretenuring) {
- allocation_size = assembler->IntPtrAdd(
- object_size, assembler->IntPtrConstant(AllocationMemento::kSize));
- }
- Node* boilerplate = assembler->LoadObjectField(
- allocation_site, AllocationSite::kTransitionInfoOffset);
- Node* boilerplate_map = assembler->LoadMap(boilerplate);
- Node* instance_size = assembler->LoadMapInstanceSize(boilerplate_map);
- Node* size_in_words = assembler->WordShr(object_size, kPointerSizeLog2);
- assembler->GotoUnless(assembler->WordEqual(instance_size, size_in_words),
- call_runtime);
-
- Node* copy = assembler->Allocate(allocation_size);
-
- // Copy boilerplate elements.
- Variable offset(assembler, MachineType::PointerRepresentation());
- offset.Bind(assembler->IntPtrConstant(-kHeapObjectTag));
- Node* end_offset = assembler->IntPtrAdd(object_size, offset.value());
- Label loop_body(assembler, &offset), loop_check(assembler, &offset);
- // We should always have an object size greater than zero.
- assembler->Goto(&loop_body);
- assembler->Bind(&loop_body);
- {
- // The Allocate above guarantees that the copy lies in new space. This
- // allows us to skip write barriers. This is necessary since we may also be
- // copying unboxed doubles.
- Node* field =
- assembler->Load(MachineType::IntPtr(), boilerplate, offset.value());
- assembler->StoreNoWriteBarrier(MachineType::PointerRepresentation(), copy,
- offset.value(), field);
- assembler->Goto(&loop_check);
- }
- assembler->Bind(&loop_check);
- {
- offset.Bind(assembler->IntPtrAdd(offset.value(),
- assembler->IntPtrConstant(kPointerSize)));
- assembler->GotoUnless(
- assembler->IntPtrGreaterThanOrEqual(offset.value(), end_offset),
- &loop_body);
- }
-
- if (FLAG_allocation_site_pretenuring) {
- Node* memento = assembler->InnerAllocate(copy, object_size);
- assembler->StoreMapNoWriteBarrier(memento,
- Heap::kAllocationMementoMapRootIndex);
- assembler->StoreObjectFieldNoWriteBarrier(
- memento, AllocationMemento::kAllocationSiteOffset, allocation_site);
- Node* memento_create_count = assembler->LoadObjectField(
- allocation_site, AllocationSite::kPretenureCreateCountOffset);
- memento_create_count = assembler->SmiAdd(
- memento_create_count, assembler->SmiConstant(Smi::FromInt(1)));
- assembler->StoreObjectFieldNoWriteBarrier(
- allocation_site, AllocationSite::kPretenureCreateCountOffset,
- memento_create_count);
- }
-
- // TODO(verwaest): Allocate and fill in double boxes.
- return copy;
-}
-
-void FastCloneShallowObjectStub::GenerateAssembly(
- compiler::CodeAssemblerState* state) const {
- typedef CodeStubAssembler::Label Label;
- typedef compiler::Node Node;
- CodeStubAssembler assembler(state);
-
- Label call_runtime(&assembler);
- Node* closure = assembler.Parameter(0);
- Node* literals_index = assembler.Parameter(1);
-
- Node* properties_count =
- assembler.IntPtrConstant(PropertiesCount(this->length()));
- Node* copy = GenerateFastPath(&assembler, &call_runtime, closure,
- literals_index, properties_count);
- assembler.Return(copy);
-
- assembler.Bind(&call_runtime);
- Node* constant_properties = assembler.Parameter(2);
- Node* flags = assembler.Parameter(3);
- Node* context = assembler.Parameter(4);
- assembler.TailCallRuntime(Runtime::kCreateObjectLiteral, context, closure,
- literals_index, constant_properties, flags);
-}
-
template<class StateType>
void HydrogenCodeStub::TraceTransition(StateType from, StateType to) {
// Note: Although a no-op transition is semantically OK, it is hinting at a
@@ -2053,252 +1936,6 @@ void GetPropertyStub::GenerateAssembly(
assembler.Return(var_result.value());
}
-// static
-compiler::Node* FastCloneRegExpStub::Generate(CodeStubAssembler* assembler,
- compiler::Node* closure,
- compiler::Node* literal_index,
- compiler::Node* pattern,
- compiler::Node* flags,
- compiler::Node* context) {
- typedef CodeStubAssembler::Label Label;
- typedef CodeStubAssembler::Variable Variable;
- typedef compiler::Node Node;
-
- Label call_runtime(assembler, Label::kDeferred), end(assembler);
-
- Variable result(assembler, MachineRepresentation::kTagged);
-
- Node* literals_array =
- assembler->LoadObjectField(closure, JSFunction::kLiteralsOffset);
- Node* boilerplate = assembler->LoadFixedArrayElement(
- literals_array, literal_index,
- LiteralsArray::kFirstLiteralIndex * kPointerSize,
- CodeStubAssembler::SMI_PARAMETERS);
- assembler->GotoIf(assembler->IsUndefined(boilerplate), &call_runtime);
-
- {
- int size = JSRegExp::kSize + JSRegExp::kInObjectFieldCount * kPointerSize;
- Node* copy = assembler->Allocate(size);
- for (int offset = 0; offset < size; offset += kPointerSize) {
- Node* value = assembler->LoadObjectField(boilerplate, offset);
- assembler->StoreObjectFieldNoWriteBarrier(copy, offset, value);
- }
- result.Bind(copy);
- assembler->Goto(&end);
- }
-
- assembler->Bind(&call_runtime);
- {
- result.Bind(assembler->CallRuntime(Runtime::kCreateRegExpLiteral, context,
- closure, literal_index, pattern, flags));
- assembler->Goto(&end);
- }
-
- assembler->Bind(&end);
- return result.value();
-}
-
-void FastCloneRegExpStub::GenerateAssembly(
- compiler::CodeAssemblerState* state) const {
- typedef compiler::Node Node;
- CodeStubAssembler assembler(state);
- Node* closure = assembler.Parameter(Descriptor::kClosure);
- Node* literal_index = assembler.Parameter(Descriptor::kLiteralIndex);
- Node* pattern = assembler.Parameter(Descriptor::kPattern);
- Node* flags = assembler.Parameter(Descriptor::kFlags);
- Node* context = assembler.Parameter(Descriptor::kContext);
-
- assembler.Return(
- Generate(&assembler, closure, literal_index, pattern, flags, context));
-}
-
-namespace {
-
-compiler::Node* NonEmptyShallowClone(CodeStubAssembler* assembler,
- compiler::Node* boilerplate,
- compiler::Node* boilerplate_map,
- compiler::Node* boilerplate_elements,
- compiler::Node* allocation_site,
- compiler::Node* capacity,
- ElementsKind kind) {
- typedef compiler::Node Node;
- typedef CodeStubAssembler::ParameterMode ParameterMode;
-
- ParameterMode param_mode = assembler->OptimalParameterMode();
-
- Node* length = assembler->LoadJSArrayLength(boilerplate);
- capacity = assembler->TaggedToParameter(capacity, param_mode);
-
- Node *array, *elements;
- std::tie(array, elements) =
- assembler->AllocateUninitializedJSArrayWithElements(
- kind, boilerplate_map, length, allocation_site, capacity, param_mode);
-
- assembler->Comment("copy elements header");
- // Header consists of map and length.
- STATIC_ASSERT(FixedArrayBase::kHeaderSize == 2 * kPointerSize);
- assembler->StoreMap(elements, assembler->LoadMap(boilerplate_elements));
- {
- int offset = FixedArrayBase::kLengthOffset;
- assembler->StoreObjectFieldNoWriteBarrier(
- elements, offset,
- assembler->LoadObjectField(boilerplate_elements, offset));
- }
-
- length = assembler->TaggedToParameter(length, param_mode);
-
- assembler->Comment("copy boilerplate elements");
- assembler->CopyFixedArrayElements(kind, boilerplate_elements, elements,
- length, SKIP_WRITE_BARRIER, param_mode);
- assembler->IncrementCounter(
- assembler->isolate()->counters()->inlined_copied_elements(), 1);
-
- return array;
-}
-
-} // namespace
-
-// static
-compiler::Node* FastCloneShallowArrayStub::Generate(
- CodeStubAssembler* assembler, compiler::Node* closure,
- compiler::Node* literal_index, compiler::Node* context,
- CodeStubAssembler::Label* call_runtime,
- AllocationSiteMode allocation_site_mode) {
- typedef CodeStubAssembler::Label Label;
- typedef CodeStubAssembler::Variable Variable;
- typedef compiler::Node Node;
-
- Label zero_capacity(assembler), cow_elements(assembler),
- fast_elements(assembler), return_result(assembler);
- Variable result(assembler, MachineRepresentation::kTagged);
-
- Node* literals_array =
- assembler->LoadObjectField(closure, JSFunction::kLiteralsOffset);
- Node* allocation_site = assembler->LoadFixedArrayElement(
- literals_array, literal_index,
- LiteralsArray::kFirstLiteralIndex * kPointerSize,
- CodeStubAssembler::SMI_PARAMETERS);
-
- assembler->GotoIf(assembler->IsUndefined(allocation_site), call_runtime);
- allocation_site = assembler->LoadFixedArrayElement(
- literals_array, literal_index,
- LiteralsArray::kFirstLiteralIndex * kPointerSize,
- CodeStubAssembler::SMI_PARAMETERS);
-
- Node* boilerplate = assembler->LoadObjectField(
- allocation_site, AllocationSite::kTransitionInfoOffset);
- Node* boilerplate_map = assembler->LoadMap(boilerplate);
- Node* boilerplate_elements = assembler->LoadElements(boilerplate);
- Node* capacity = assembler->LoadFixedArrayBaseLength(boilerplate_elements);
- allocation_site =
- allocation_site_mode == TRACK_ALLOCATION_SITE ? allocation_site : nullptr;
-
- Node* zero = assembler->SmiConstant(Smi::kZero);
- assembler->GotoIf(assembler->SmiEqual(capacity, zero), &zero_capacity);
-
- Node* elements_map = assembler->LoadMap(boilerplate_elements);
- assembler->GotoIf(assembler->IsFixedCOWArrayMap(elements_map), &cow_elements);
-
- assembler->GotoIf(assembler->IsFixedArrayMap(elements_map), &fast_elements);
- {
- assembler->Comment("fast double elements path");
- if (FLAG_debug_code) {
- Label correct_elements_map(assembler), abort(assembler, Label::kDeferred);
- assembler->Branch(assembler->IsFixedDoubleArrayMap(elements_map),
- &correct_elements_map, &abort);
-
- assembler->Bind(&abort);
- {
- Node* abort_id = assembler->SmiConstant(
- Smi::FromInt(BailoutReason::kExpectedFixedDoubleArrayMap));
- assembler->CallRuntime(Runtime::kAbort, context, abort_id);
- result.Bind(assembler->UndefinedConstant());
- assembler->Goto(&return_result);
- }
- assembler->Bind(&correct_elements_map);
- }
-
- Node* array = NonEmptyShallowClone(assembler, boilerplate, boilerplate_map,
- boilerplate_elements, allocation_site,
- capacity, FAST_DOUBLE_ELEMENTS);
- result.Bind(array);
- assembler->Goto(&return_result);
- }
-
- assembler->Bind(&fast_elements);
- {
- assembler->Comment("fast elements path");
- Node* array = NonEmptyShallowClone(assembler, boilerplate, boilerplate_map,
- boilerplate_elements, allocation_site,
- capacity, FAST_ELEMENTS);
- result.Bind(array);
- assembler->Goto(&return_result);
- }
-
- Variable length(assembler, MachineRepresentation::kTagged),
- elements(assembler, MachineRepresentation::kTagged);
- Label allocate_without_elements(assembler);
-
- assembler->Bind(&cow_elements);
- {
- assembler->Comment("fixed cow path");
- length.Bind(assembler->LoadJSArrayLength(boilerplate));
- elements.Bind(boilerplate_elements);
-
- assembler->Goto(&allocate_without_elements);
- }
-
- assembler->Bind(&zero_capacity);
- {
- assembler->Comment("zero capacity path");
- length.Bind(zero);
- elements.Bind(assembler->LoadRoot(Heap::kEmptyFixedArrayRootIndex));
-
- assembler->Goto(&allocate_without_elements);
- }
-
- assembler->Bind(&allocate_without_elements);
- {
- Node* array = assembler->AllocateUninitializedJSArrayWithoutElements(
- FAST_ELEMENTS, boilerplate_map, length.value(), allocation_site);
- assembler->StoreObjectField(array, JSObject::kElementsOffset,
- elements.value());
- result.Bind(array);
- assembler->Goto(&return_result);
- }
-
- assembler->Bind(&return_result);
- return result.value();
-}
-
-void FastCloneShallowArrayStub::GenerateAssembly(
- compiler::CodeAssemblerState* state) const {
- typedef compiler::Node Node;
- typedef CodeStubAssembler::Label Label;
- CodeStubAssembler assembler(state);
-
- Node* closure = assembler.Parameter(Descriptor::kClosure);
- Node* literal_index = assembler.Parameter(Descriptor::kLiteralIndex);
- Node* constant_elements = assembler.Parameter(Descriptor::kConstantElements);
- Node* context = assembler.Parameter(Descriptor::kContext);
- Label call_runtime(&assembler, Label::kDeferred);
- assembler.Return(Generate(&assembler, closure, literal_index, context,
- &call_runtime, allocation_site_mode()));
-
- assembler.Bind(&call_runtime);
- {
- assembler.Comment("call runtime");
- Node* flags = assembler.SmiConstant(
- Smi::FromInt(ArrayLiteral::kShallowElements |
- (allocation_site_mode() == TRACK_ALLOCATION_SITE
- ? 0
- : ArrayLiteral::kDisableMementos)));
- assembler.Return(assembler.CallRuntime(Runtime::kCreateArrayLiteral,
- context, closure, literal_index,
- constant_elements, flags));
- }
-}
-
void CreateAllocationSiteStub::GenerateAheadOfTime(Isolate* isolate) {
CreateAllocationSiteStub stub(isolate);
stub.GetCode();
« no previous file with comments | « src/code-stubs.h ('k') | src/compiler/js-generic-lowering.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698