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 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
176 // result in a traversable stack. | 176 // result in a traversable stack. |
177 virtual bool SometimesSetsUpAFrame() { return true; } | 177 virtual bool SometimesSetsUpAFrame() { return true; } |
178 | 178 |
179 // Lookup the code in the (possibly custom) cache. | 179 // Lookup the code in the (possibly custom) cache. |
180 bool FindCodeInCache(Code** code_out); | 180 bool FindCodeInCache(Code** code_out); |
181 | 181 |
182 // Returns information for computing the number key. | 182 // Returns information for computing the number key. |
183 virtual Major MajorKey() const = 0; | 183 virtual Major MajorKey() const = 0; |
184 virtual int MinorKey() const = 0; | 184 virtual int MinorKey() const = 0; |
185 | 185 |
186 virtual InlineCacheState GetICState() { | 186 virtual InlineCacheState GetICState() const { return UNINITIALIZED; } |
187 return UNINITIALIZED; | |
188 } | |
189 virtual ExtraICState GetExtraICState() const { return kNoExtraICState; } | 187 virtual ExtraICState GetExtraICState() const { return kNoExtraICState; } |
190 virtual Code::StubType GetStubType() { | 188 virtual Code::StubType GetStubType() { |
191 return Code::NORMAL; | 189 return Code::NORMAL; |
192 } | 190 } |
193 | 191 |
194 friend OStream& operator<<(OStream& os, const CodeStub& s) { | 192 friend OStream& operator<<(OStream& os, const CodeStub& s) { |
195 s.PrintName(os); | 193 s.PrintName(os); |
196 return os; | 194 return os; |
197 } | 195 } |
198 | 196 |
(...skipping 644 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
843 CallIC::State state((ExtraICState) minor_key); | 841 CallIC::State state((ExtraICState) minor_key); |
844 return state.arg_count(); | 842 return state.arg_count(); |
845 } | 843 } |
846 | 844 |
847 virtual void Generate(MacroAssembler* masm); | 845 virtual void Generate(MacroAssembler* masm); |
848 | 846 |
849 virtual Code::Kind GetCodeKind() const V8_OVERRIDE { | 847 virtual Code::Kind GetCodeKind() const V8_OVERRIDE { |
850 return Code::CALL_IC; | 848 return Code::CALL_IC; |
851 } | 849 } |
852 | 850 |
853 virtual InlineCacheState GetICState() V8_FINAL V8_OVERRIDE { | 851 virtual InlineCacheState GetICState() const V8_OVERRIDE { return DEFAULT; } |
854 return state_.GetICState(); | |
855 } | |
856 | 852 |
857 virtual ExtraICState GetExtraICState() const V8_FINAL V8_OVERRIDE { | 853 virtual ExtraICState GetExtraICState() const V8_FINAL V8_OVERRIDE { |
858 return state_.GetExtraICState(); | 854 return state_.GetExtraICState(); |
859 } | 855 } |
860 | 856 |
861 protected: | 857 protected: |
862 virtual int MinorKey() const { return GetExtraICState(); } | 858 virtual int MinorKey() const { return GetExtraICState(); } |
863 virtual void PrintState(OStream& os) const V8_OVERRIDE; // NOLINT | 859 virtual void PrintState(OStream& os) const V8_OVERRIDE; // NOLINT |
864 | 860 |
865 virtual CodeStub::Major MajorKey() const { return CallIC; } | 861 virtual CodeStub::Major MajorKey() const { return CallIC; } |
866 | 862 |
867 // Code generation helpers. | 863 // Code generation helpers. |
868 void GenerateMiss(MacroAssembler* masm, IC::UtilityId id); | 864 void GenerateMiss(MacroAssembler* masm, IC::UtilityId id); |
869 | 865 |
870 const CallIC::State state_; | 866 const CallIC::State state_; |
871 }; | 867 }; |
872 | 868 |
873 | 869 |
874 class CallIC_ArrayStub: public CallICStub { | 870 class CallIC_ArrayStub: public CallICStub { |
875 public: | 871 public: |
876 CallIC_ArrayStub(Isolate* isolate, const CallIC::State& state_in) | 872 CallIC_ArrayStub(Isolate* isolate, const CallIC::State& state_in) |
877 : CallICStub(isolate, state_in) {} | 873 : CallICStub(isolate, state_in) {} |
878 | 874 |
879 virtual void Generate(MacroAssembler* masm); | 875 virtual void Generate(MacroAssembler* masm); |
880 | 876 |
| 877 virtual InlineCacheState GetICState() const V8_FINAL V8_OVERRIDE { |
| 878 return MONOMORPHIC; |
| 879 } |
| 880 |
881 protected: | 881 protected: |
882 virtual void PrintState(OStream& os) const V8_OVERRIDE; // NOLINT | 882 virtual void PrintState(OStream& os) const V8_OVERRIDE; // NOLINT |
883 | 883 |
884 virtual CodeStub::Major MajorKey() const { return CallIC_Array; } | 884 virtual CodeStub::Major MajorKey() const { return CallIC_Array; } |
885 }; | 885 }; |
886 | 886 |
887 | 887 |
888 // TODO(verwaest): Translate to hydrogen code stub. | 888 // TODO(verwaest): Translate to hydrogen code stub. |
889 class FunctionPrototypeStub : public PlatformCodeStub { | 889 class FunctionPrototypeStub : public PlatformCodeStub { |
890 public: | 890 public: |
891 explicit FunctionPrototypeStub(Isolate* isolate) | 891 explicit FunctionPrototypeStub(Isolate* isolate) |
892 : PlatformCodeStub(isolate) {} | 892 : PlatformCodeStub(isolate) {} |
893 virtual void Generate(MacroAssembler* masm); | 893 virtual void Generate(MacroAssembler* masm); |
894 virtual Code::Kind GetCodeKind() const { return Code::HANDLER; } | 894 virtual Code::Kind GetCodeKind() const { return Code::HANDLER; } |
895 | 895 |
896 private: | 896 private: |
897 virtual CodeStub::Major MajorKey() const { return FunctionPrototype; } | 897 virtual CodeStub::Major MajorKey() const { return FunctionPrototype; } |
898 virtual int MinorKey() const { return 0; } | 898 virtual int MinorKey() const { return 0; } |
899 }; | 899 }; |
900 | 900 |
901 | 901 |
902 class HandlerStub : public HydrogenCodeStub { | 902 class HandlerStub : public HydrogenCodeStub { |
903 public: | 903 public: |
904 virtual Code::Kind GetCodeKind() const { return Code::HANDLER; } | 904 virtual Code::Kind GetCodeKind() const { return Code::HANDLER; } |
905 virtual ExtraICState GetExtraICState() const { return kind(); } | 905 virtual ExtraICState GetExtraICState() const { return kind(); } |
906 virtual InlineCacheState GetICState() { return MONOMORPHIC; } | 906 virtual InlineCacheState GetICState() const { return MONOMORPHIC; } |
907 | 907 |
908 virtual void InitializeInterfaceDescriptor( | 908 virtual void InitializeInterfaceDescriptor( |
909 CodeStubInterfaceDescriptor* descriptor) V8_OVERRIDE; | 909 CodeStubInterfaceDescriptor* descriptor) V8_OVERRIDE; |
910 | 910 |
911 protected: | 911 protected: |
912 explicit HandlerStub(Isolate* isolate) | 912 explicit HandlerStub(Isolate* isolate) |
913 : HydrogenCodeStub(isolate), bit_field_(0) {} | 913 : HydrogenCodeStub(isolate), bit_field_(0) {} |
914 virtual int NotMissMinorKey() const { return bit_field_; } | 914 virtual int NotMissMinorKey() const { return bit_field_; } |
915 virtual Code::Kind kind() const = 0; | 915 virtual Code::Kind kind() const = 0; |
916 int bit_field_; | 916 int bit_field_; |
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1119 | 1119 |
1120 virtual void InitializeInterfaceDescriptor( | 1120 virtual void InitializeInterfaceDescriptor( |
1121 CodeStubInterfaceDescriptor* descriptor) V8_OVERRIDE; | 1121 CodeStubInterfaceDescriptor* descriptor) V8_OVERRIDE; |
1122 | 1122 |
1123 static void InstallDescriptors(Isolate* isolate); | 1123 static void InstallDescriptors(Isolate* isolate); |
1124 | 1124 |
1125 virtual Code::Kind GetCodeKind() const V8_OVERRIDE { | 1125 virtual Code::Kind GetCodeKind() const V8_OVERRIDE { |
1126 return Code::BINARY_OP_IC; | 1126 return Code::BINARY_OP_IC; |
1127 } | 1127 } |
1128 | 1128 |
1129 virtual InlineCacheState GetICState() V8_FINAL V8_OVERRIDE { | 1129 virtual InlineCacheState GetICState() const V8_FINAL V8_OVERRIDE { |
1130 return state_.GetICState(); | 1130 return state_.GetICState(); |
1131 } | 1131 } |
1132 | 1132 |
1133 virtual ExtraICState GetExtraICState() const V8_FINAL V8_OVERRIDE { | 1133 virtual ExtraICState GetExtraICState() const V8_FINAL V8_OVERRIDE { |
1134 return state_.GetExtraICState(); | 1134 return state_.GetExtraICState(); |
1135 } | 1135 } |
1136 | 1136 |
1137 virtual Handle<Code> GenerateCode() V8_OVERRIDE; | 1137 virtual Handle<Code> GenerateCode() V8_OVERRIDE; |
1138 | 1138 |
1139 const BinaryOpIC::State& state() const { return state_; } | 1139 const BinaryOpIC::State& state() const { return state_; } |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1172 Handle<Code> GetCodeCopyFromTemplate(Handle<AllocationSite> allocation_site) { | 1172 Handle<Code> GetCodeCopyFromTemplate(Handle<AllocationSite> allocation_site) { |
1173 Code::FindAndReplacePattern pattern; | 1173 Code::FindAndReplacePattern pattern; |
1174 pattern.Add(isolate()->factory()->undefined_map(), allocation_site); | 1174 pattern.Add(isolate()->factory()->undefined_map(), allocation_site); |
1175 return CodeStub::GetCodeCopy(pattern); | 1175 return CodeStub::GetCodeCopy(pattern); |
1176 } | 1176 } |
1177 | 1177 |
1178 virtual Code::Kind GetCodeKind() const V8_OVERRIDE { | 1178 virtual Code::Kind GetCodeKind() const V8_OVERRIDE { |
1179 return Code::BINARY_OP_IC; | 1179 return Code::BINARY_OP_IC; |
1180 } | 1180 } |
1181 | 1181 |
1182 virtual InlineCacheState GetICState() V8_OVERRIDE { | 1182 virtual InlineCacheState GetICState() const V8_OVERRIDE { |
1183 return state_.GetICState(); | 1183 return state_.GetICState(); |
1184 } | 1184 } |
1185 | 1185 |
1186 virtual ExtraICState GetExtraICState() const V8_OVERRIDE { | 1186 virtual ExtraICState GetExtraICState() const V8_OVERRIDE { |
1187 return state_.GetExtraICState(); | 1187 return state_.GetExtraICState(); |
1188 } | 1188 } |
1189 | 1189 |
1190 virtual void Generate(MacroAssembler* masm) V8_OVERRIDE; | 1190 virtual void Generate(MacroAssembler* masm) V8_OVERRIDE; |
1191 | 1191 |
1192 virtual void PrintState(OStream& os) const V8_OVERRIDE; // NOLINT | 1192 virtual void PrintState(OStream& os) const V8_OVERRIDE; // NOLINT |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1309 } | 1309 } |
1310 | 1310 |
1311 virtual void Generate(MacroAssembler* masm); | 1311 virtual void Generate(MacroAssembler* masm); |
1312 | 1312 |
1313 void set_known_map(Handle<Map> map) { known_map_ = map; } | 1313 void set_known_map(Handle<Map> map) { known_map_ = map; } |
1314 | 1314 |
1315 static void DecodeKey(uint32_t stub_key, CompareIC::State* left_state, | 1315 static void DecodeKey(uint32_t stub_key, CompareIC::State* left_state, |
1316 CompareIC::State* right_state, | 1316 CompareIC::State* right_state, |
1317 CompareIC::State* handler_state, Token::Value* op); | 1317 CompareIC::State* handler_state, Token::Value* op); |
1318 | 1318 |
1319 virtual InlineCacheState GetICState(); | 1319 virtual InlineCacheState GetICState() const; |
1320 | 1320 |
1321 private: | 1321 private: |
1322 class OpField: public BitField<int, 0, 3> { }; | 1322 class OpField: public BitField<int, 0, 3> { }; |
1323 class LeftStateField: public BitField<int, 3, 4> { }; | 1323 class LeftStateField: public BitField<int, 3, 4> { }; |
1324 class RightStateField: public BitField<int, 7, 4> { }; | 1324 class RightStateField: public BitField<int, 7, 4> { }; |
1325 class HandlerStateField: public BitField<int, 11, 4> { }; | 1325 class HandlerStateField: public BitField<int, 11, 4> { }; |
1326 | 1326 |
1327 virtual CodeStub::Major MajorKey() const { return CompareIC; } | 1327 virtual CodeStub::Major MajorKey() const { return CompareIC; } |
1328 virtual int MinorKey() const; | 1328 virtual int MinorKey() const; |
1329 | 1329 |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1377 | 1377 |
1378 virtual void InitializeInterfaceDescriptor( | 1378 virtual void InitializeInterfaceDescriptor( |
1379 CodeStubInterfaceDescriptor* descriptor) V8_OVERRIDE; | 1379 CodeStubInterfaceDescriptor* descriptor) V8_OVERRIDE; |
1380 | 1380 |
1381 static void InstallDescriptors(Isolate* isolate) { | 1381 static void InstallDescriptors(Isolate* isolate) { |
1382 CompareNilICStub compare_stub(isolate, kNullValue, UNINITIALIZED); | 1382 CompareNilICStub compare_stub(isolate, kNullValue, UNINITIALIZED); |
1383 compare_stub.InitializeInterfaceDescriptor( | 1383 compare_stub.InitializeInterfaceDescriptor( |
1384 isolate->code_stub_interface_descriptor(CodeStub::CompareNilIC)); | 1384 isolate->code_stub_interface_descriptor(CodeStub::CompareNilIC)); |
1385 } | 1385 } |
1386 | 1386 |
1387 virtual InlineCacheState GetICState() { | 1387 virtual InlineCacheState GetICState() const { |
1388 if (state_.Contains(GENERIC)) { | 1388 if (state_.Contains(GENERIC)) { |
1389 return MEGAMORPHIC; | 1389 return MEGAMORPHIC; |
1390 } else if (state_.Contains(MONOMORPHIC_MAP)) { | 1390 } else if (state_.Contains(MONOMORPHIC_MAP)) { |
1391 return MONOMORPHIC; | 1391 return MONOMORPHIC; |
1392 } else { | 1392 } else { |
1393 return PREMONOMORPHIC; | 1393 return PREMONOMORPHIC; |
1394 } | 1394 } |
1395 } | 1395 } |
1396 | 1396 |
1397 virtual Code::Kind GetCodeKind() const { return Code::COMPARE_NIL_IC; } | 1397 virtual Code::Kind GetCodeKind() const { return Code::COMPARE_NIL_IC; } |
(...skipping 470 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1868 explicit KeyedLoadGenericStub(Isolate* isolate) : HydrogenCodeStub(isolate) {} | 1868 explicit KeyedLoadGenericStub(Isolate* isolate) : HydrogenCodeStub(isolate) {} |
1869 | 1869 |
1870 virtual Handle<Code> GenerateCode() V8_OVERRIDE; | 1870 virtual Handle<Code> GenerateCode() V8_OVERRIDE; |
1871 | 1871 |
1872 virtual void InitializeInterfaceDescriptor( | 1872 virtual void InitializeInterfaceDescriptor( |
1873 CodeStubInterfaceDescriptor* descriptor) V8_OVERRIDE; | 1873 CodeStubInterfaceDescriptor* descriptor) V8_OVERRIDE; |
1874 | 1874 |
1875 static void InstallDescriptors(Isolate* isolate); | 1875 static void InstallDescriptors(Isolate* isolate); |
1876 | 1876 |
1877 virtual Code::Kind GetCodeKind() const { return Code::KEYED_LOAD_IC; } | 1877 virtual Code::Kind GetCodeKind() const { return Code::KEYED_LOAD_IC; } |
1878 virtual InlineCacheState GetICState() { return GENERIC; } | 1878 virtual InlineCacheState GetICState() const { return GENERIC; } |
1879 | 1879 |
1880 private: | 1880 private: |
1881 Major MajorKey() const { return KeyedLoadGeneric; } | 1881 Major MajorKey() const { return KeyedLoadGeneric; } |
1882 int NotMissMinorKey() const { return 0; } | 1882 int NotMissMinorKey() const { return 0; } |
1883 | 1883 |
1884 DISALLOW_COPY_AND_ASSIGN(KeyedLoadGenericStub); | 1884 DISALLOW_COPY_AND_ASSIGN(KeyedLoadGenericStub); |
1885 }; | 1885 }; |
1886 | 1886 |
1887 | 1887 |
1888 class DoubleToIStub : public PlatformCodeStub { | 1888 class DoubleToIStub : public PlatformCodeStub { |
(...skipping 466 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2355 stub.InitializeInterfaceDescriptor( | 2355 stub.InitializeInterfaceDescriptor( |
2356 isolate->code_stub_interface_descriptor(CodeStub::ToBoolean)); | 2356 isolate->code_stub_interface_descriptor(CodeStub::ToBoolean)); |
2357 } | 2357 } |
2358 | 2358 |
2359 static Handle<Code> GetUninitialized(Isolate* isolate) { | 2359 static Handle<Code> GetUninitialized(Isolate* isolate) { |
2360 return ToBooleanStub(isolate, UNINITIALIZED).GetCode(); | 2360 return ToBooleanStub(isolate, UNINITIALIZED).GetCode(); |
2361 } | 2361 } |
2362 | 2362 |
2363 virtual ExtraICState GetExtraICState() const { return types_.ToIntegral(); } | 2363 virtual ExtraICState GetExtraICState() const { return types_.ToIntegral(); } |
2364 | 2364 |
2365 virtual InlineCacheState GetICState() { | 2365 virtual InlineCacheState GetICState() const { |
2366 if (types_.IsEmpty()) { | 2366 if (types_.IsEmpty()) { |
2367 return ::v8::internal::UNINITIALIZED; | 2367 return ::v8::internal::UNINITIALIZED; |
2368 } else { | 2368 } else { |
2369 return MONOMORPHIC; | 2369 return MONOMORPHIC; |
2370 } | 2370 } |
2371 } | 2371 } |
2372 | 2372 |
2373 private: | 2373 private: |
2374 Major MajorKey() const { return ToBoolean; } | 2374 Major MajorKey() const { return ToBoolean; } |
2375 int NotMissMinorKey() const { return GetExtraICState(); } | 2375 int NotMissMinorKey() const { return GetExtraICState(); } |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2510 | 2510 |
2511 | 2511 |
2512 class CallDescriptors { | 2512 class CallDescriptors { |
2513 public: | 2513 public: |
2514 static void InitializeForIsolate(Isolate* isolate); | 2514 static void InitializeForIsolate(Isolate* isolate); |
2515 }; | 2515 }; |
2516 | 2516 |
2517 } } // namespace v8::internal | 2517 } } // namespace v8::internal |
2518 | 2518 |
2519 #endif // V8_CODE_STUBS_H_ | 2519 #endif // V8_CODE_STUBS_H_ |
OLD | NEW |