| 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_ | 
|  |