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

Unified Diff: src/code-stubs.cc

Issue 2313093002: [stubs] Port StoreTransitionStub and ElementsTransitionAndStoreStub to TurboFan. (Closed)
Patch Set: Addressing comments Created 4 years, 3 months 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/code-stubs-hydrogen.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 7f12bdbd45be074ee281178deb829fe2db728cb7..6c5566617faebd836c23f054d677a37893fc669c 100644
--- a/src/code-stubs.cc
+++ b/src/code-stubs.cc
@@ -498,6 +498,107 @@ void KeyedLoadICTFStub::GenerateAssembly(CodeStubAssembler* assembler) const {
assembler->KeyedLoadIC(&p);
}
+void StoreTransitionStub::GenerateAssembly(CodeStubAssembler* assembler) const {
+ typedef CodeStubAssembler::Label Label;
+ typedef compiler::Node Node;
+
+ Node* receiver = assembler->Parameter(Descriptor::kReceiver);
+ Node* name = assembler->Parameter(Descriptor::kName);
+ Node* value = assembler->Parameter(Descriptor::kValue);
+ Node* map = assembler->Parameter(Descriptor::kMap);
+ Node* slot = assembler->Parameter(Descriptor::kSlot);
+ Node* vector = assembler->Parameter(Descriptor::kVector);
+ Node* context = assembler->Parameter(Descriptor::kContext);
+
+ StoreMode store_mode = this->store_mode();
+ Node* prepared_value = value;
+
+ Label miss(assembler);
+ bool needs_miss_case = false;
+
+ if (store_mode != StoreTransitionStub::StoreMapOnly) {
+ Representation representation = this->representation();
+ FieldIndex index = this->index();
+ assembler->Comment(
+ "Prepare value for write: representation: %s, index.is_inobject: %d, "
+ "index.offset: %d",
+ representation.Mnemonic(), index.is_inobject(), index.offset());
+ prepared_value =
+ assembler->PrepareValueForWrite(prepared_value, representation, &miss);
+ // Only store to tagged field never bails out.
+ needs_miss_case |= !representation.IsTagged();
+ }
+
+ switch (store_mode) {
+ case StoreTransitionStub::ExtendStorageAndStoreMapAndValue:
+ assembler->Comment("Extend storage");
+ assembler->ExtendPropertiesBackingStore(receiver);
+ // Fall through.
+ case StoreTransitionStub::StoreMapAndValue:
+ assembler->Comment("Store value");
+ // Store the new value into the "extended" object.
+ assembler->StoreNamedField(receiver, index(), representation(),
+ prepared_value, true);
+ // Fall through.
+ case StoreTransitionStub::StoreMapOnly:
+ assembler->Comment("Store map");
+ // And finally update the map.
+ assembler->StoreObjectField(receiver, JSObject::kMapOffset, map);
+ break;
+ }
+ assembler->Return(value);
+
+ if (needs_miss_case) {
+ assembler->Bind(&miss);
+ {
+ assembler->Comment("Miss");
+ assembler->TailCallRuntime(Runtime::kStoreIC_Miss, context, receiver,
+ name, value, slot, vector);
+ }
+ }
+}
+
+void ElementsTransitionAndStoreStub::GenerateAssembly(
+ CodeStubAssembler* assembler) const {
+ typedef CodeStubAssembler::Label Label;
+ typedef compiler::Node Node;
+
+ Node* receiver = assembler->Parameter(Descriptor::kReceiver);
+ Node* key = assembler->Parameter(Descriptor::kName);
+ Node* value = assembler->Parameter(Descriptor::kValue);
+ Node* map = assembler->Parameter(Descriptor::kMap);
+ Node* slot = assembler->Parameter(Descriptor::kSlot);
+ Node* vector = assembler->Parameter(Descriptor::kVector);
+ Node* context = assembler->Parameter(Descriptor::kContext);
+
+ assembler->Comment(
+ "ElementsTransitionAndStoreStub: from_kind=%s, to_kind=%s,"
+ " is_jsarray=%d, store_mode=%d",
+ ElementsKindToString(from_kind()), ElementsKindToString(to_kind()),
+ is_jsarray(), store_mode());
+
+ Label miss(assembler);
+
+ if (FLAG_trace_elements_transitions) {
+ // Tracing elements transitions is the job of the runtime.
+ assembler->Goto(&miss);
+ } else {
+ assembler->TransitionElementsKind(receiver, map, from_kind(), to_kind(),
+ is_jsarray(), &miss);
+ assembler->EmitElementStore(receiver, key, value, is_jsarray(), to_kind(),
+ store_mode(), &miss);
+ assembler->Return(value);
+ }
+
+ assembler->Bind(&miss);
+ {
+ assembler->Comment("Miss");
+ assembler->TailCallRuntime(Runtime::kElementsTransitionAndStoreIC_Miss,
+ context, receiver, key, value, map, slot,
+ vector);
+ }
+}
+
void AllocateHeapNumberStub::GenerateAssembly(
CodeStubAssembler* assembler) const {
typedef compiler::Node Node;
@@ -5122,17 +5223,6 @@ CallInterfaceDescriptor HandlerStub::GetCallInterfaceDescriptor() const {
}
-void ElementsTransitionAndStoreStub::InitializeDescriptor(
- CodeStubDescriptor* descriptor) {
- descriptor->Initialize(
- FUNCTION_ADDR(Runtime_ElementsTransitionAndStoreIC_Miss));
-}
-
-void StoreTransitionStub::InitializeDescriptor(CodeStubDescriptor* descriptor) {
- descriptor->Initialize(
- FUNCTION_ADDR(Runtime_TransitionStoreIC_MissFromStubFailure));
-}
-
void NumberToStringStub::InitializeDescriptor(CodeStubDescriptor* descriptor) {
descriptor->Initialize(
Runtime::FunctionForId(Runtime::kNumberToString)->entry);
« no previous file with comments | « src/code-stubs.h ('k') | src/code-stubs-hydrogen.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698