Index: src/ic/accessor-assembler-impl.h |
diff --git a/src/ic/accessor-assembler-impl.h b/src/ic/accessor-assembler-impl.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..8e6ad2cf816fd7d48e886a77766a01d93b37c72c |
--- /dev/null |
+++ b/src/ic/accessor-assembler-impl.h |
@@ -0,0 +1,176 @@ |
+// Copyright 2016 the V8 project authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef V8_SRC_IC_ACCESSOR_ASSEMBLER_IMPL_H_ |
+#define V8_SRC_IC_ACCESSOR_ASSEMBLER_IMPL_H_ |
+ |
+#include "src/code-stub-assembler.h" |
+ |
+namespace v8 { |
+namespace internal { |
+ |
+namespace compiler { |
+class CodeAssemblerState; |
+} |
+ |
+using compiler::Node; |
+ |
+#define ACCESSOR_ASSEMBLER_PUBLIC_INTERFACE(V) \ |
+ V(LoadIC) \ |
+ V(LoadICTrampoline) \ |
+ V(LoadICProtoArray) \ |
+ V(LoadGlobalIC) \ |
+ V(LoadGlobalICTrampoline) \ |
+ V(KeyedLoadICTF) \ |
+ V(KeyedLoadICTrampolineTF) \ |
+ V(KeyedLoadICMegamorphic) \ |
+ V(StoreIC) \ |
+ V(StoreICTrampoline) |
+// KeyedStoreIC and KeyedStoreICTrampoline need custom handling because of |
+// their "language_mode" parameter. |
+ |
+class AccessorAssemblerImpl : public CodeStubAssembler { |
+ public: |
+ explicit AccessorAssemblerImpl(compiler::CodeAssemblerState* state) |
+ : CodeStubAssembler(state) {} |
+ |
+#define DECLARE_PUBLIC_METHOD(Name) void Generate##Name(); |
+ |
+ ACCESSOR_ASSEMBLER_PUBLIC_INTERFACE(DECLARE_PUBLIC_METHOD) |
+#undef DECLARE_PUBLIC_METHOD |
+ |
+ void GenerateKeyedStoreICTF(LanguageMode language_mode); |
+ void GenerateKeyedStoreICTrampolineTF(LanguageMode language_mode); |
+ |
+ void TryProbeStubCache(StubCache* stub_cache, Node* receiver, Node* name, |
+ Label* if_handler, Variable* var_handler, |
+ Label* if_miss); |
+ |
+ Node* StubCachePrimaryOffsetForTesting(Node* name, Node* map) { |
+ return StubCachePrimaryOffset(name, map); |
+ } |
+ Node* StubCacheSecondaryOffsetForTesting(Node* name, Node* map) { |
+ return StubCacheSecondaryOffset(name, map); |
+ } |
+ |
+ protected: |
+ struct LoadICParameters { |
+ LoadICParameters(Node* context, Node* receiver, Node* name, Node* slot, |
+ Node* vector) |
+ : context(context), |
+ receiver(receiver), |
+ name(name), |
+ slot(slot), |
+ vector(vector) {} |
+ |
+ Node* context; |
+ Node* receiver; |
+ Node* name; |
+ Node* slot; |
+ Node* vector; |
+ }; |
+ |
+ struct StoreICParameters : public LoadICParameters { |
+ StoreICParameters(Node* context, Node* receiver, Node* name, Node* value, |
+ Node* slot, Node* vector) |
+ : LoadICParameters(context, receiver, name, slot, vector), |
+ value(value) {} |
+ Node* value; |
+ }; |
+ |
+ void HandleStoreICHandlerCase(const StoreICParameters* p, Node* handler, |
+ Label* miss); |
+ |
+ private: |
+ enum ElementSupport { kOnlyProperties, kSupportElements }; |
+ |
+ // Stub generation entry points. |
+ |
+ void LoadIC(const LoadICParameters* p); |
+ void LoadICProtoArray(const LoadICParameters* p, Node* handler); |
+ void LoadGlobalIC(const LoadICParameters* p); |
+ void KeyedLoadIC(const LoadICParameters* p); |
+ void KeyedLoadICGeneric(const LoadICParameters* p); |
+ void StoreIC(const StoreICParameters* p); |
+ void KeyedStoreIC(const StoreICParameters* p, LanguageMode language_mode); |
+ |
+ // IC dispatcher behavior. |
+ |
+ // Checks monomorphic case. Returns {feedback} entry of the vector. |
+ Node* TryMonomorphicCase(Node* slot, Node* vector, Node* receiver_map, |
+ Label* if_handler, Variable* var_handler, |
+ Label* if_miss); |
+ void HandlePolymorphicCase(Node* receiver_map, Node* feedback, |
+ Label* if_handler, Variable* var_handler, |
+ Label* if_miss, int unroll_count); |
+ void HandleKeyedStorePolymorphicCase(Node* receiver_map, Node* feedback, |
+ Label* if_handler, Variable* var_handler, |
+ Label* if_transition_handler, |
+ Variable* var_transition_map_cell, |
+ Label* if_miss); |
+ |
+ // LoadIC implementation. |
+ |
+ void HandleLoadICHandlerCase( |
+ const LoadICParameters* p, Node* handler, Label* miss, |
+ ElementSupport support_elements = kOnlyProperties); |
+ |
+ void HandleLoadICSmiHandlerCase(const LoadICParameters* p, Node* holder, |
+ Node* smi_handler, Label* miss, |
+ ElementSupport support_elements); |
+ |
+ void HandleLoadICProtoHandler(const LoadICParameters* p, Node* handler, |
+ Variable* var_holder, Variable* var_smi_handler, |
+ Label* if_smi_handler, Label* miss); |
+ |
+ Node* EmitLoadICProtoArrayCheck(const LoadICParameters* p, Node* handler, |
+ Node* handler_length, Node* handler_flags, |
+ Label* miss); |
+ |
+ // StoreIC implementation. |
+ |
+ void HandleStoreICProtoHandler(const StoreICParameters* p, Node* handler, |
+ Label* miss); |
+ // If |transition| is nullptr then the normal field store is generated or |
+ // transitioning store otherwise. |
+ void HandleStoreICSmiHandlerCase(Node* handler_word, Node* holder, |
+ Node* value, Node* transition, Label* miss); |
+ // If |transition| is nullptr then the normal field store is generated or |
+ // transitioning store otherwise. |
+ void HandleStoreFieldAndReturn(Node* handler_word, Node* holder, |
+ Representation representation, Node* value, |
+ Node* transition, Label* miss); |
+ |
+ // Low-level helpers. |
+ |
+ void EmitFastElementsBoundsCheck(Node* object, Node* elements, |
+ Node* intptr_index, |
+ Node* is_jsarray_condition, Label* miss); |
+ void EmitElementLoad(Node* object, Node* elements, Node* elements_kind, |
+ Node* key, Node* is_jsarray_condition, Label* if_hole, |
+ Label* rebox_double, Variable* var_double_value, |
+ Label* unimplemented_elements_kind, Label* out_of_bounds, |
+ Label* miss); |
+ void CheckPrototype(Node* prototype_cell, Node* name, Label* miss); |
+ void NameDictionaryNegativeLookup(Node* object, Node* name, Label* miss); |
+ |
+ // Stub cache access helpers. |
+ |
+ // This enum is used here as a replacement for StubCache::Table to avoid |
+ // including stub cache header. |
+ enum StubCacheTable : int; |
+ |
+ Node* StubCachePrimaryOffset(Node* name, Node* map); |
+ Node* StubCacheSecondaryOffset(Node* name, Node* seed); |
+ |
+ void TryProbeStubCacheTable(StubCache* stub_cache, StubCacheTable table_id, |
+ Node* entry_offset, Node* name, Node* map, |
+ Label* if_handler, Variable* var_handler, |
+ Label* if_miss); |
+}; |
+ |
+} // namespace internal |
+} // namespace v8 |
+ |
+#endif // V8_SRC_IC_ACCESSOR_ASSEMBLER_IMPL_H_ |