| 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 #ifndef V8_CODE_STUBS_H_ | 5 #ifndef V8_CODE_STUBS_H_ |
| 6 #define V8_CODE_STUBS_H_ | 6 #define V8_CODE_STUBS_H_ |
| 7 | 7 |
| 8 #include "src/allocation.h" | 8 #include "src/allocation.h" |
| 9 #include "src/assembler.h" | 9 #include "src/assembler.h" |
| 10 #include "src/codegen.h" | 10 #include "src/codegen.h" |
| (...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 206 | 206 |
| 207 static void InitializeDescriptor(Isolate* isolate, uint32_t key, | 207 static void InitializeDescriptor(Isolate* isolate, uint32_t key, |
| 208 CodeStubDescriptor* desc); | 208 CodeStubDescriptor* desc); |
| 209 | 209 |
| 210 static MaybeHandle<Code> GetCode(Isolate* isolate, uint32_t key); | 210 static MaybeHandle<Code> GetCode(Isolate* isolate, uint32_t key); |
| 211 | 211 |
| 212 // Returns information for computing the number key. | 212 // Returns information for computing the number key. |
| 213 virtual Major MajorKey() const = 0; | 213 virtual Major MajorKey() const = 0; |
| 214 uint32_t MinorKey() const { return minor_key_; } | 214 uint32_t MinorKey() const { return minor_key_; } |
| 215 | 215 |
| 216 // BinaryOpStub needs to override this. |
| 217 virtual Code::Kind GetCodeKind() const; |
| 218 |
| 216 virtual InlineCacheState GetICState() const { return UNINITIALIZED; } | 219 virtual InlineCacheState GetICState() const { return UNINITIALIZED; } |
| 217 virtual ExtraICState GetExtraICState() const { return kNoExtraICState; } | 220 virtual ExtraICState GetExtraICState() const { return kNoExtraICState; } |
| 218 virtual Code::StubType GetStubType() { | 221 virtual Code::StubType GetStubType() const { return Code::NORMAL; } |
| 219 return Code::NORMAL; | |
| 220 } | |
| 221 | 222 |
| 222 friend std::ostream& operator<<(std::ostream& os, const CodeStub& s) { | 223 friend std::ostream& operator<<(std::ostream& os, const CodeStub& s) { |
| 223 s.PrintName(os); | 224 s.PrintName(os); |
| 224 return os; | 225 return os; |
| 225 } | 226 } |
| 226 | 227 |
| 227 Isolate* isolate() const { return isolate_; } | 228 Isolate* isolate() const { return isolate_; } |
| 228 | 229 |
| 229 protected: | 230 protected: |
| 230 CodeStub(uint32_t key, Isolate* isolate) | 231 CodeStub(uint32_t key, Isolate* isolate) |
| (...skipping 23 matching lines...) Expand all Loading... |
| 254 // initially generated. | 255 // initially generated. |
| 255 void RecordCodeGeneration(Handle<Code> code); | 256 void RecordCodeGeneration(Handle<Code> code); |
| 256 | 257 |
| 257 // Finish the code object after it has been generated. | 258 // Finish the code object after it has been generated. |
| 258 virtual void FinishCode(Handle<Code> code) { } | 259 virtual void FinishCode(Handle<Code> code) { } |
| 259 | 260 |
| 260 // Activate newly generated stub. Is called after | 261 // Activate newly generated stub. Is called after |
| 261 // registering stub in the stub cache. | 262 // registering stub in the stub cache. |
| 262 virtual void Activate(Code* code) { } | 263 virtual void Activate(Code* code) { } |
| 263 | 264 |
| 264 // BinaryOpStub needs to override this. | |
| 265 virtual Code::Kind GetCodeKind() const; | |
| 266 | |
| 267 // Add the code to a specialized cache, specific to an individual | 265 // Add the code to a specialized cache, specific to an individual |
| 268 // stub type. Please note, this method must add the code object to a | 266 // stub type. Please note, this method must add the code object to a |
| 269 // roots object, otherwise we will remove the code during GC. | 267 // roots object, otherwise we will remove the code during GC. |
| 270 virtual void AddToSpecialCache(Handle<Code> new_object) { } | 268 virtual void AddToSpecialCache(Handle<Code> new_object) { } |
| 271 | 269 |
| 272 // Find code in a specialized cache, work is delegated to the specific stub. | 270 // Find code in a specialized cache, work is delegated to the specific stub. |
| 273 virtual bool FindCodeInSpecialCache(Code** code_out) { | 271 virtual bool FindCodeInSpecialCache(Code** code_out) { |
| 274 return false; | 272 return false; |
| 275 } | 273 } |
| 276 | 274 |
| (...skipping 604 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 881 }; | 879 }; |
| 882 | 880 |
| 883 | 881 |
| 884 // TODO(mvstanton): Translate to hydrogen code stub. | 882 // TODO(mvstanton): Translate to hydrogen code stub. |
| 885 class LoadIndexedInterceptorStub : public PlatformCodeStub { | 883 class LoadIndexedInterceptorStub : public PlatformCodeStub { |
| 886 public: | 884 public: |
| 887 explicit LoadIndexedInterceptorStub(Isolate* isolate) | 885 explicit LoadIndexedInterceptorStub(Isolate* isolate) |
| 888 : PlatformCodeStub(isolate) {} | 886 : PlatformCodeStub(isolate) {} |
| 889 | 887 |
| 890 Code::Kind GetCodeKind() const OVERRIDE { return Code::HANDLER; } | 888 Code::Kind GetCodeKind() const OVERRIDE { return Code::HANDLER; } |
| 891 Code::StubType GetStubType() OVERRIDE { return Code::FAST; } | 889 Code::StubType GetStubType() const OVERRIDE { return Code::FAST; } |
| 892 | 890 |
| 893 DEFINE_CALL_INTERFACE_DESCRIPTOR(Load); | 891 DEFINE_CALL_INTERFACE_DESCRIPTOR(Load); |
| 894 DEFINE_PLATFORM_CODE_STUB(LoadIndexedInterceptor, PlatformCodeStub); | 892 DEFINE_PLATFORM_CODE_STUB(LoadIndexedInterceptor, PlatformCodeStub); |
| 895 }; | 893 }; |
| 896 | 894 |
| 897 | 895 |
| 898 class LoadIndexedStringStub : public PlatformCodeStub { | 896 class LoadIndexedStringStub : public PlatformCodeStub { |
| 899 public: | 897 public: |
| 900 explicit LoadIndexedStringStub(Isolate* isolate) | 898 explicit LoadIndexedStringStub(Isolate* isolate) |
| 901 : PlatformCodeStub(isolate) {} | 899 : PlatformCodeStub(isolate) {} |
| 902 | 900 |
| 903 Code::Kind GetCodeKind() const OVERRIDE { return Code::HANDLER; } | 901 Code::Kind GetCodeKind() const OVERRIDE { return Code::HANDLER; } |
| 904 Code::StubType GetStubType() OVERRIDE { return Code::FAST; } | 902 Code::StubType GetStubType() const OVERRIDE { return Code::FAST; } |
| 905 | 903 |
| 906 DEFINE_CALL_INTERFACE_DESCRIPTOR(Load); | 904 DEFINE_CALL_INTERFACE_DESCRIPTOR(Load); |
| 907 DEFINE_PLATFORM_CODE_STUB(LoadIndexedString, PlatformCodeStub); | 905 DEFINE_PLATFORM_CODE_STUB(LoadIndexedString, PlatformCodeStub); |
| 908 }; | 906 }; |
| 909 | 907 |
| 910 | 908 |
| 911 class HandlerStub : public HydrogenCodeStub { | 909 class HandlerStub : public HydrogenCodeStub { |
| 912 public: | 910 public: |
| 913 Code::Kind GetCodeKind() const OVERRIDE { return Code::HANDLER; } | 911 Code::Kind GetCodeKind() const OVERRIDE { return Code::HANDLER; } |
| 914 ExtraICState GetExtraICState() const OVERRIDE { return kind(); } | 912 ExtraICState GetExtraICState() const OVERRIDE { return kind(); } |
| (...skipping 19 matching lines...) Expand all Loading... |
| 934 set_sub_minor_key(LoadFieldByIndexBits::encode(property_index_key)); | 932 set_sub_minor_key(LoadFieldByIndexBits::encode(property_index_key)); |
| 935 } | 933 } |
| 936 | 934 |
| 937 FieldIndex index() const { | 935 FieldIndex index() const { |
| 938 int property_index_key = LoadFieldByIndexBits::decode(sub_minor_key()); | 936 int property_index_key = LoadFieldByIndexBits::decode(sub_minor_key()); |
| 939 return FieldIndex::FromFieldAccessStubKey(property_index_key); | 937 return FieldIndex::FromFieldAccessStubKey(property_index_key); |
| 940 } | 938 } |
| 941 | 939 |
| 942 protected: | 940 protected: |
| 943 Code::Kind kind() const OVERRIDE { return Code::LOAD_IC; } | 941 Code::Kind kind() const OVERRIDE { return Code::LOAD_IC; } |
| 944 Code::StubType GetStubType() OVERRIDE { return Code::FAST; } | 942 Code::StubType GetStubType() const OVERRIDE { return Code::FAST; } |
| 945 | 943 |
| 946 private: | 944 private: |
| 947 class LoadFieldByIndexBits : public BitField<int, 0, 13> {}; | 945 class LoadFieldByIndexBits : public BitField<int, 0, 13> {}; |
| 948 | 946 |
| 949 DEFINE_HANDLER_CODE_STUB(LoadField, HandlerStub); | 947 DEFINE_HANDLER_CODE_STUB(LoadField, HandlerStub); |
| 950 }; | 948 }; |
| 951 | 949 |
| 952 | 950 |
| 953 class KeyedLoadSloppyArgumentsStub : public HandlerStub { | 951 class KeyedLoadSloppyArgumentsStub : public HandlerStub { |
| 954 public: | 952 public: |
| 955 explicit KeyedLoadSloppyArgumentsStub(Isolate* isolate) | 953 explicit KeyedLoadSloppyArgumentsStub(Isolate* isolate) |
| 956 : HandlerStub(isolate) {} | 954 : HandlerStub(isolate) {} |
| 957 | 955 |
| 958 protected: | 956 protected: |
| 959 Code::Kind kind() const OVERRIDE { return Code::KEYED_LOAD_IC; } | 957 Code::Kind kind() const OVERRIDE { return Code::KEYED_LOAD_IC; } |
| 960 Code::StubType GetStubType() OVERRIDE { return Code::FAST; } | 958 Code::StubType GetStubType() const OVERRIDE { return Code::FAST; } |
| 961 | 959 |
| 962 private: | 960 private: |
| 963 DEFINE_HANDLER_CODE_STUB(KeyedLoadSloppyArguments, HandlerStub); | 961 DEFINE_HANDLER_CODE_STUB(KeyedLoadSloppyArguments, HandlerStub); |
| 964 }; | 962 }; |
| 965 | 963 |
| 966 | 964 |
| 967 class LoadConstantStub : public HandlerStub { | 965 class LoadConstantStub : public HandlerStub { |
| 968 public: | 966 public: |
| 969 LoadConstantStub(Isolate* isolate, int constant_index) | 967 LoadConstantStub(Isolate* isolate, int constant_index) |
| 970 : HandlerStub(isolate) { | 968 : HandlerStub(isolate) { |
| 971 set_sub_minor_key(ConstantIndexBits::encode(constant_index)); | 969 set_sub_minor_key(ConstantIndexBits::encode(constant_index)); |
| 972 } | 970 } |
| 973 | 971 |
| 974 int constant_index() const { | 972 int constant_index() const { |
| 975 return ConstantIndexBits::decode(sub_minor_key()); | 973 return ConstantIndexBits::decode(sub_minor_key()); |
| 976 } | 974 } |
| 977 | 975 |
| 978 protected: | 976 protected: |
| 979 Code::Kind kind() const OVERRIDE { return Code::LOAD_IC; } | 977 Code::Kind kind() const OVERRIDE { return Code::LOAD_IC; } |
| 980 Code::StubType GetStubType() OVERRIDE { return Code::FAST; } | 978 Code::StubType GetStubType() const OVERRIDE { return Code::FAST; } |
| 981 | 979 |
| 982 private: | 980 private: |
| 983 class ConstantIndexBits : public BitField<int, 0, kSubMinorKeyBits> {}; | 981 class ConstantIndexBits : public BitField<int, 0, kSubMinorKeyBits> {}; |
| 984 | 982 |
| 985 DEFINE_HANDLER_CODE_STUB(LoadConstant, HandlerStub); | 983 DEFINE_HANDLER_CODE_STUB(LoadConstant, HandlerStub); |
| 986 }; | 984 }; |
| 987 | 985 |
| 988 | 986 |
| 989 class StringLengthStub: public HandlerStub { | 987 class StringLengthStub: public HandlerStub { |
| 990 public: | 988 public: |
| 991 explicit StringLengthStub(Isolate* isolate) : HandlerStub(isolate) {} | 989 explicit StringLengthStub(Isolate* isolate) : HandlerStub(isolate) {} |
| 992 | 990 |
| 993 protected: | 991 protected: |
| 994 Code::Kind kind() const OVERRIDE { return Code::LOAD_IC; } | 992 Code::Kind kind() const OVERRIDE { return Code::LOAD_IC; } |
| 995 Code::StubType GetStubType() OVERRIDE { return Code::FAST; } | 993 Code::StubType GetStubType() const OVERRIDE { return Code::FAST; } |
| 996 | 994 |
| 997 DEFINE_HANDLER_CODE_STUB(StringLength, HandlerStub); | 995 DEFINE_HANDLER_CODE_STUB(StringLength, HandlerStub); |
| 998 }; | 996 }; |
| 999 | 997 |
| 1000 | 998 |
| 1001 class StoreFieldStub : public HandlerStub { | 999 class StoreFieldStub : public HandlerStub { |
| 1002 public: | 1000 public: |
| 1003 StoreFieldStub(Isolate* isolate, FieldIndex index, | 1001 StoreFieldStub(Isolate* isolate, FieldIndex index, |
| 1004 Representation representation) | 1002 Representation representation) |
| 1005 : HandlerStub(isolate) { | 1003 : HandlerStub(isolate) { |
| 1006 int property_index_key = index.GetFieldAccessStubKey(); | 1004 int property_index_key = index.GetFieldAccessStubKey(); |
| 1007 uint8_t repr = PropertyDetails::EncodeRepresentation(representation); | 1005 uint8_t repr = PropertyDetails::EncodeRepresentation(representation); |
| 1008 set_sub_minor_key(StoreFieldByIndexBits::encode(property_index_key) | | 1006 set_sub_minor_key(StoreFieldByIndexBits::encode(property_index_key) | |
| 1009 RepresentationBits::encode(repr)); | 1007 RepresentationBits::encode(repr)); |
| 1010 } | 1008 } |
| 1011 | 1009 |
| 1012 FieldIndex index() const { | 1010 FieldIndex index() const { |
| 1013 int property_index_key = StoreFieldByIndexBits::decode(sub_minor_key()); | 1011 int property_index_key = StoreFieldByIndexBits::decode(sub_minor_key()); |
| 1014 return FieldIndex::FromFieldAccessStubKey(property_index_key); | 1012 return FieldIndex::FromFieldAccessStubKey(property_index_key); |
| 1015 } | 1013 } |
| 1016 | 1014 |
| 1017 Representation representation() { | 1015 Representation representation() { |
| 1018 uint8_t repr = RepresentationBits::decode(sub_minor_key()); | 1016 uint8_t repr = RepresentationBits::decode(sub_minor_key()); |
| 1019 return PropertyDetails::DecodeRepresentation(repr); | 1017 return PropertyDetails::DecodeRepresentation(repr); |
| 1020 } | 1018 } |
| 1021 | 1019 |
| 1022 protected: | 1020 protected: |
| 1023 Code::Kind kind() const OVERRIDE { return Code::STORE_IC; } | 1021 Code::Kind kind() const OVERRIDE { return Code::STORE_IC; } |
| 1024 Code::StubType GetStubType() OVERRIDE { return Code::FAST; } | 1022 Code::StubType GetStubType() const OVERRIDE { return Code::FAST; } |
| 1025 | 1023 |
| 1026 private: | 1024 private: |
| 1027 class StoreFieldByIndexBits : public BitField<int, 0, 13> {}; | 1025 class StoreFieldByIndexBits : public BitField<int, 0, 13> {}; |
| 1028 class RepresentationBits : public BitField<uint8_t, 13, 4> {}; | 1026 class RepresentationBits : public BitField<uint8_t, 13, 4> {}; |
| 1029 | 1027 |
| 1030 DEFINE_HANDLER_CODE_STUB(StoreField, HandlerStub); | 1028 DEFINE_HANDLER_CODE_STUB(StoreField, HandlerStub); |
| 1031 }; | 1029 }; |
| 1032 | 1030 |
| 1033 | 1031 |
| 1034 class StoreTransitionStub : public HandlerStub { | 1032 class StoreTransitionStub : public HandlerStub { |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1067 } | 1065 } |
| 1068 | 1066 |
| 1069 StoreMode store_mode() const { | 1067 StoreMode store_mode() const { |
| 1070 return StoreModeBits::decode(sub_minor_key()); | 1068 return StoreModeBits::decode(sub_minor_key()); |
| 1071 } | 1069 } |
| 1072 | 1070 |
| 1073 CallInterfaceDescriptor GetCallInterfaceDescriptor() OVERRIDE; | 1071 CallInterfaceDescriptor GetCallInterfaceDescriptor() OVERRIDE; |
| 1074 | 1072 |
| 1075 protected: | 1073 protected: |
| 1076 Code::Kind kind() const OVERRIDE { return Code::STORE_IC; } | 1074 Code::Kind kind() const OVERRIDE { return Code::STORE_IC; } |
| 1077 Code::StubType GetStubType() OVERRIDE { return Code::FAST; } | 1075 Code::StubType GetStubType() const OVERRIDE { return Code::FAST; } |
| 1078 | 1076 |
| 1079 private: | 1077 private: |
| 1080 class StoreFieldByIndexBits : public BitField<int, 0, 13> {}; | 1078 class StoreFieldByIndexBits : public BitField<int, 0, 13> {}; |
| 1081 class RepresentationBits : public BitField<uint8_t, 13, 4> {}; | 1079 class RepresentationBits : public BitField<uint8_t, 13, 4> {}; |
| 1082 class StoreModeBits : public BitField<StoreMode, 17, 2> {}; | 1080 class StoreModeBits : public BitField<StoreMode, 17, 2> {}; |
| 1083 | 1081 |
| 1084 DEFINE_HANDLER_CODE_STUB(StoreTransition, HandlerStub); | 1082 DEFINE_HANDLER_CODE_STUB(StoreTransition, HandlerStub); |
| 1085 }; | 1083 }; |
| 1086 | 1084 |
| 1087 | 1085 |
| (...skipping 1024 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2112 SlotIndexBits::is_valid(lookup_result->slot_index); | 2110 SlotIndexBits::is_valid(lookup_result->slot_index); |
| 2113 } | 2111 } |
| 2114 | 2112 |
| 2115 private: | 2113 private: |
| 2116 static const int kContextIndexBits = 13; | 2114 static const int kContextIndexBits = 13; |
| 2117 static const int kSlotIndexBits = 13; | 2115 static const int kSlotIndexBits = 13; |
| 2118 class ContextIndexBits : public BitField<int, 0, kContextIndexBits> {}; | 2116 class ContextIndexBits : public BitField<int, 0, kContextIndexBits> {}; |
| 2119 class SlotIndexBits | 2117 class SlotIndexBits |
| 2120 : public BitField<int, kContextIndexBits, kSlotIndexBits> {}; | 2118 : public BitField<int, kContextIndexBits, kSlotIndexBits> {}; |
| 2121 | 2119 |
| 2122 Code::StubType GetStubType() OVERRIDE { return Code::FAST; } | 2120 Code::StubType GetStubType() const OVERRIDE { return Code::FAST; } |
| 2123 | 2121 |
| 2124 DEFINE_CODE_STUB_BASE(ScriptContextFieldStub, HandlerStub); | 2122 DEFINE_CODE_STUB_BASE(ScriptContextFieldStub, HandlerStub); |
| 2125 }; | 2123 }; |
| 2126 | 2124 |
| 2127 | 2125 |
| 2128 class LoadScriptContextFieldStub : public ScriptContextFieldStub { | 2126 class LoadScriptContextFieldStub : public ScriptContextFieldStub { |
| 2129 public: | 2127 public: |
| 2130 LoadScriptContextFieldStub( | 2128 LoadScriptContextFieldStub( |
| 2131 Isolate* isolate, const ScriptContextTable::LookupResult* lookup_result) | 2129 Isolate* isolate, const ScriptContextTable::LookupResult* lookup_result) |
| 2132 : ScriptContextFieldStub(isolate, lookup_result) {} | 2130 : ScriptContextFieldStub(isolate, lookup_result) {} |
| (...skipping 546 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2679 | 2677 |
| 2680 #undef DEFINE_CALL_INTERFACE_DESCRIPTOR | 2678 #undef DEFINE_CALL_INTERFACE_DESCRIPTOR |
| 2681 #undef DEFINE_PLATFORM_CODE_STUB | 2679 #undef DEFINE_PLATFORM_CODE_STUB |
| 2682 #undef DEFINE_HANDLER_CODE_STUB | 2680 #undef DEFINE_HANDLER_CODE_STUB |
| 2683 #undef DEFINE_HYDROGEN_CODE_STUB | 2681 #undef DEFINE_HYDROGEN_CODE_STUB |
| 2684 #undef DEFINE_CODE_STUB | 2682 #undef DEFINE_CODE_STUB |
| 2685 #undef DEFINE_CODE_STUB_BASE | 2683 #undef DEFINE_CODE_STUB_BASE |
| 2686 } } // namespace v8::internal | 2684 } } // namespace v8::internal |
| 2687 | 2685 |
| 2688 #endif // V8_CODE_STUBS_H_ | 2686 #endif // V8_CODE_STUBS_H_ |
| OLD | NEW |