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

Side by Side Diff: src/ic.h

Issue 102563004: Zonify types in compiler frontend (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Rebased Created 7 years 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/ia32/stub-cache-ia32.cc ('k') | src/ic.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
143 // Determines which map must be used for keeping the code stub. 143 // Determines which map must be used for keeping the code stub.
144 // These methods should not be called with undefined or null. 144 // These methods should not be called with undefined or null.
145 static inline InlineCacheHolderFlag GetCodeCacheForObject(Object* object); 145 static inline InlineCacheHolderFlag GetCodeCacheForObject(Object* object);
146 // TODO(verwaest): This currently returns a HeapObject rather than JSObject* 146 // TODO(verwaest): This currently returns a HeapObject rather than JSObject*
147 // since loading the IC for loading the length from strings are stored on 147 // since loading the IC for loading the length from strings are stored on
148 // the string map directly, rather than on the JSObject-typed prototype. 148 // the string map directly, rather than on the JSObject-typed prototype.
149 static inline HeapObject* GetCodeCacheHolder(Isolate* isolate, 149 static inline HeapObject* GetCodeCacheHolder(Isolate* isolate,
150 Object* object, 150 Object* object,
151 InlineCacheHolderFlag holder); 151 InlineCacheHolderFlag holder);
152 152
153 static inline InlineCacheHolderFlag GetCodeCacheFlag(Type* type); 153 static inline InlineCacheHolderFlag GetCodeCacheFlag(HeapType* type);
154 static inline Handle<Map> GetCodeCacheHolder(InlineCacheHolderFlag flag, 154 static inline Handle<Map> GetCodeCacheHolder(InlineCacheHolderFlag flag,
155 Type* type, 155 HeapType* type,
156 Isolate* isolate); 156 Isolate* isolate);
157 157
158 static bool IsCleared(Code* code) { 158 static bool IsCleared(Code* code) {
159 InlineCacheState state = code->ic_state(); 159 InlineCacheState state = code->ic_state();
160 return state == UNINITIALIZED || state == PREMONOMORPHIC; 160 return state == UNINITIALIZED || state == PREMONOMORPHIC;
161 } 161 }
162 162
163 // Utility functions to convert maps to types and back. There are two special 163 // Utility functions to convert maps to types and back. There are two special
164 // cases: 164 // cases:
165 // - The heap_number_map is used as a marker which includes heap numbers as 165 // - The heap_number_map is used as a marker which includes heap numbers as
166 // well as smis. 166 // well as smis.
167 // - The oddball map is only used for booleans. 167 // - The oddball map is only used for booleans.
168 static Handle<Map> TypeToMap(Type* type, Isolate* isolate); 168 static Handle<Map> TypeToMap(HeapType* type, Isolate* isolate);
169 static Handle<Type> MapToType(Handle<Map> type); 169 static Handle<HeapType> MapToType(Handle<Map> map);
170 static Handle<Type> CurrentTypeOf(Handle<Object> object, Isolate* isolate); 170 static Handle<HeapType> CurrentTypeOf(
171 Handle<Object> object, Isolate* isolate);
171 172
172 protected: 173 protected:
173 // Get the call-site target; used for determining the state. 174 // Get the call-site target; used for determining the state.
174 Handle<Code> target() const { return target_; } 175 Handle<Code> target() const { return target_; }
175 176
176 Address fp() const { return fp_; } 177 Address fp() const { return fp_; }
177 Address pc() const { return *pc_address_; } 178 Address pc() const { return *pc_address_; }
178 Isolate* isolate() const { return isolate_; } 179 Isolate* isolate() const { return isolate_; }
179 180
180 #ifdef ENABLE_DEBUGGER_SUPPORT 181 #ifdef ENABLE_DEBUGGER_SUPPORT
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
214 Handle<Object> value = Handle<Code>::null()); 215 Handle<Object> value = Handle<Code>::null());
215 virtual Handle<Code> CompileHandler(LookupResult* lookup, 216 virtual Handle<Code> CompileHandler(LookupResult* lookup,
216 Handle<Object> object, 217 Handle<Object> object,
217 Handle<String> name, 218 Handle<String> name,
218 Handle<Object> value, 219 Handle<Object> value,
219 InlineCacheHolderFlag cache_holder) { 220 InlineCacheHolderFlag cache_holder) {
220 UNREACHABLE(); 221 UNREACHABLE();
221 return Handle<Code>::null(); 222 return Handle<Code>::null();
222 } 223 }
223 224
224 void UpdateMonomorphicIC(Handle<Type> type, 225 void UpdateMonomorphicIC(Handle<HeapType> type,
225 Handle<Code> handler, 226 Handle<Code> handler,
226 Handle<String> name); 227 Handle<String> name);
227 228
228 bool UpdatePolymorphicIC(Handle<Type> type, 229 bool UpdatePolymorphicIC(Handle<HeapType> type,
229 Handle<String> name, 230 Handle<String> name,
230 Handle<Code> code); 231 Handle<Code> code);
231 232
232 virtual void UpdateMegamorphicCache(Type* type, Name* name, Code* code); 233 virtual void UpdateMegamorphicCache(HeapType* type, Name* name, Code* code);
233 234
234 void CopyICToMegamorphicCache(Handle<String> name); 235 void CopyICToMegamorphicCache(Handle<String> name);
235 bool IsTransitionOfMonomorphicTarget(Handle<Type> type); 236 bool IsTransitionOfMonomorphicTarget(Handle<HeapType> type);
236 void PatchCache(Handle<Type> type, 237 void PatchCache(Handle<HeapType> type,
237 Handle<String> name, 238 Handle<String> name,
238 Handle<Code> code); 239 Handle<Code> code);
239 virtual Code::Kind kind() const { 240 virtual Code::Kind kind() const {
240 UNREACHABLE(); 241 UNREACHABLE();
241 return Code::STUB; 242 return Code::STUB;
242 } 243 }
243 virtual Handle<Code> slow_stub() const { 244 virtual Handle<Code> slow_stub() const {
244 UNREACHABLE(); 245 UNREACHABLE();
245 return Handle<Code>::null(); 246 return Handle<Code>::null();
246 } 247 }
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after
534 virtual Handle<Code> megamorphic_stub() { 535 virtual Handle<Code> megamorphic_stub() {
535 return isolate()->builtins()->KeyedLoadIC_Generic(); 536 return isolate()->builtins()->KeyedLoadIC_Generic();
536 } 537 }
537 virtual Handle<Code> generic_stub() const { 538 virtual Handle<Code> generic_stub() const {
538 return isolate()->builtins()->KeyedLoadIC_Generic(); 539 return isolate()->builtins()->KeyedLoadIC_Generic();
539 } 540 }
540 virtual Handle<Code> slow_stub() const { 541 virtual Handle<Code> slow_stub() const {
541 return isolate()->builtins()->KeyedLoadIC_Slow(); 542 return isolate()->builtins()->KeyedLoadIC_Slow();
542 } 543 }
543 544
544 virtual void UpdateMegamorphicCache(Type* type, Name* name, Code* code) { } 545 virtual void UpdateMegamorphicCache(HeapType* type, Name* name, Code* code) {}
545 546
546 private: 547 private:
547 // Stub accessors. 548 // Stub accessors.
548 static Handle<Code> initialize_stub(Isolate* isolate) { 549 static Handle<Code> initialize_stub(Isolate* isolate) {
549 return isolate->builtins()->KeyedLoadIC_Initialize(); 550 return isolate->builtins()->KeyedLoadIC_Initialize();
550 } 551 }
551 static Handle<Code> pre_monomorphic_stub(Isolate* isolate) { 552 static Handle<Code> pre_monomorphic_stub(Isolate* isolate) {
552 return isolate->builtins()->KeyedLoadIC_PreMonomorphic(); 553 return isolate->builtins()->KeyedLoadIC_PreMonomorphic();
553 } 554 }
554 virtual Handle<Code> pre_monomorphic_stub() { 555 virtual Handle<Code> pre_monomorphic_stub() {
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after
738 static void GenerateMiss(MacroAssembler* masm); 739 static void GenerateMiss(MacroAssembler* masm);
739 static void GenerateSlow(MacroAssembler* masm); 740 static void GenerateSlow(MacroAssembler* masm);
740 static void GenerateRuntimeSetProperty(MacroAssembler* masm, 741 static void GenerateRuntimeSetProperty(MacroAssembler* masm,
741 StrictModeFlag strict_mode); 742 StrictModeFlag strict_mode);
742 static void GenerateGeneric(MacroAssembler* masm, StrictModeFlag strict_mode); 743 static void GenerateGeneric(MacroAssembler* masm, StrictModeFlag strict_mode);
743 static void GenerateNonStrictArguments(MacroAssembler* masm); 744 static void GenerateNonStrictArguments(MacroAssembler* masm);
744 745
745 protected: 746 protected:
746 virtual Code::Kind kind() const { return Code::KEYED_STORE_IC; } 747 virtual Code::Kind kind() const { return Code::KEYED_STORE_IC; }
747 748
748 virtual void UpdateMegamorphicCache(Type* type, Name* name, Code* code) { } 749 virtual void UpdateMegamorphicCache(HeapType* type, Name* name, Code* code) {}
749 750
750 virtual ExtraICState extra_ic_state() { 751 virtual ExtraICState extra_ic_state() {
751 return ComputeExtraICState(strict_mode(), STANDARD_STORE); 752 return ComputeExtraICState(strict_mode(), STANDARD_STORE);
752 } 753 }
753 754
754 virtual Handle<Code> pre_monomorphic_stub() { 755 virtual Handle<Code> pre_monomorphic_stub() {
755 return pre_monomorphic_stub(isolate(), strict_mode()); 756 return pre_monomorphic_stub(isolate(), strict_mode());
756 } 757 }
757 static Handle<Code> pre_monomorphic_stub(Isolate* isolate, 758 static Handle<Code> pre_monomorphic_stub(Isolate* isolate,
758 StrictModeFlag strict_mode) { 759 StrictModeFlag strict_mode) {
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
869 return KindMaybeSmi(left_kind_) || KindMaybeSmi(right_kind_); 870 return KindMaybeSmi(left_kind_) || KindMaybeSmi(right_kind_);
870 } 871 }
871 872
872 static const int FIRST_TOKEN = Token::BIT_OR; 873 static const int FIRST_TOKEN = Token::BIT_OR;
873 static const int LAST_TOKEN = Token::MOD; 874 static const int LAST_TOKEN = Token::MOD;
874 875
875 Token::Value op() const { return op_; } 876 Token::Value op() const { return op_; }
876 OverwriteMode mode() const { return mode_; } 877 OverwriteMode mode() const { return mode_; }
877 Maybe<int> fixed_right_arg() const { return fixed_right_arg_; } 878 Maybe<int> fixed_right_arg() const { return fixed_right_arg_; }
878 879
879 Handle<Type> GetLeftType(Isolate* isolate) const { 880 Type* GetLeftType(Zone* zone) const {
880 return KindToType(left_kind_, isolate); 881 return KindToType(left_kind_, zone);
881 } 882 }
882 Handle<Type> GetRightType(Isolate* isolate) const { 883 Type* GetRightType(Zone* zone) const {
883 return KindToType(right_kind_, isolate); 884 return KindToType(right_kind_, zone);
884 } 885 }
885 Handle<Type> GetResultType(Isolate* isolate) const; 886 Type* GetResultType(Zone* zone) const;
886 887
887 void Print(StringStream* stream) const; 888 void Print(StringStream* stream) const;
888 889
889 void Update(Handle<Object> left, 890 void Update(Handle<Object> left,
890 Handle<Object> right, 891 Handle<Object> right,
891 Handle<Object> result); 892 Handle<Object> result);
892 893
893 private: 894 private:
894 enum Kind { NONE, SMI, INT32, NUMBER, STRING, GENERIC }; 895 enum Kind { NONE, SMI, INT32, NUMBER, STRING, GENERIC };
895 896
896 Kind UpdateKind(Handle<Object> object, Kind kind) const; 897 Kind UpdateKind(Handle<Object> object, Kind kind) const;
897 898
898 static const char* KindToString(Kind kind); 899 static const char* KindToString(Kind kind);
899 static Handle<Type> KindToType(Kind kind, Isolate* isolate); 900 static Type* KindToType(Kind kind, Zone* zone);
900 static bool KindMaybeSmi(Kind kind) { 901 static bool KindMaybeSmi(Kind kind) {
901 return (kind >= SMI && kind <= NUMBER) || kind == GENERIC; 902 return (kind >= SMI && kind <= NUMBER) || kind == GENERIC;
902 } 903 }
903 904
904 // We truncate the last bit of the token. 905 // We truncate the last bit of the token.
905 STATIC_ASSERT(LAST_TOKEN - FIRST_TOKEN < (1 << 4)); 906 STATIC_ASSERT(LAST_TOKEN - FIRST_TOKEN < (1 << 4));
906 class OpField: public BitField<int, 0, 4> {}; 907 class OpField: public BitField<int, 0, 4> {};
907 class OverwriteModeField: public BitField<OverwriteMode, 4, 2> {}; 908 class OverwriteModeField: public BitField<OverwriteMode, 4, 2> {};
908 class SSE2Field: public BitField<bool, 6, 1> {}; 909 class SSE2Field: public BitField<bool, 6, 1> {};
909 class ResultKindField: public BitField<Kind, 7, 3> {}; 910 class ResultKindField: public BitField<Kind, 7, 3> {};
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
946 STRING, 947 STRING,
947 INTERNALIZED_STRING, 948 INTERNALIZED_STRING,
948 UNIQUE_NAME, // Symbol or InternalizedString 949 UNIQUE_NAME, // Symbol or InternalizedString
949 OBJECT, // JSObject 950 OBJECT, // JSObject
950 KNOWN_OBJECT, // JSObject with specific map (faster check) 951 KNOWN_OBJECT, // JSObject with specific map (faster check)
951 GENERIC 952 GENERIC
952 }; 953 };
953 954
954 static State NewInputState(State old_state, Handle<Object> value); 955 static State NewInputState(State old_state, Handle<Object> value);
955 956
956 static Handle<Type> StateToType(Isolate* isolate, 957 static Type* StateToType(Zone* zone,
957 State state, 958 State state,
958 Handle<Map> map = Handle<Map>()); 959 Handle<Map> map = Handle<Map>());
959 960
960 static void StubInfoToType(int stub_minor_key, 961 static void StubInfoToType(int stub_minor_key,
961 Handle<Type>* left_type, 962 Type** left_type,
962 Handle<Type>* right_type, 963 Type** right_type,
963 Handle<Type>* overall_type, 964 Type** overall_type,
964 Handle<Map> map, 965 Handle<Map> map,
965 Isolate* isolate); 966 Zone* zone);
966 967
967 CompareIC(Isolate* isolate, Token::Value op) 968 CompareIC(Isolate* isolate, Token::Value op)
968 : IC(EXTRA_CALL_FRAME, isolate), op_(op) { } 969 : IC(EXTRA_CALL_FRAME, isolate), op_(op) { }
969 970
970 // Update the inline cache for the given operands. 971 // Update the inline cache for the given operands.
971 Code* UpdateCaches(Handle<Object> x, Handle<Object> y); 972 Code* UpdateCaches(Handle<Object> x, Handle<Object> y);
972 973
973 974
974 // Factory method for getting an uninitialized compare stub. 975 // Factory method for getting an uninitialized compare stub.
975 static Handle<Code> GetUninitialized(Isolate* isolate, Token::Value op); 976 static Handle<Code> GetUninitialized(Isolate* isolate, Token::Value op);
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
1036 DECLARE_RUNTIME_FUNCTION(MaybeObject*, KeyedCallIC_MissFromStubFailure); 1037 DECLARE_RUNTIME_FUNCTION(MaybeObject*, KeyedCallIC_MissFromStubFailure);
1037 DECLARE_RUNTIME_FUNCTION(MaybeObject*, ElementsTransitionAndStoreIC_Miss); 1038 DECLARE_RUNTIME_FUNCTION(MaybeObject*, ElementsTransitionAndStoreIC_Miss);
1038 DECLARE_RUNTIME_FUNCTION(MaybeObject*, BinaryOpIC_Miss); 1039 DECLARE_RUNTIME_FUNCTION(MaybeObject*, BinaryOpIC_Miss);
1039 DECLARE_RUNTIME_FUNCTION(MaybeObject*, CompareNilIC_Miss); 1040 DECLARE_RUNTIME_FUNCTION(MaybeObject*, CompareNilIC_Miss);
1040 DECLARE_RUNTIME_FUNCTION(MaybeObject*, ToBooleanIC_Miss); 1041 DECLARE_RUNTIME_FUNCTION(MaybeObject*, ToBooleanIC_Miss);
1041 1042
1042 1043
1043 } } // namespace v8::internal 1044 } } // namespace v8::internal
1044 1045
1045 #endif // V8_IC_H_ 1046 #endif // V8_IC_H_
OLDNEW
« no previous file with comments | « src/ia32/stub-cache-ia32.cc ('k') | src/ic.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698