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

Side by Side Diff: src/code-stubs.h

Issue 91803003: Move responsibility for definition of ExtraICState bits into the ICs. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: A couple more nits. 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/builtins.cc ('k') | src/ia32/ic-ia32.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 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
186 // Lookup the code in the (possibly custom) cache. 186 // Lookup the code in the (possibly custom) cache.
187 bool FindCodeInCache(Code** code_out, Isolate* isolate); 187 bool FindCodeInCache(Code** code_out, Isolate* isolate);
188 188
189 // Returns information for computing the number key. 189 // Returns information for computing the number key.
190 virtual Major MajorKey() = 0; 190 virtual Major MajorKey() = 0;
191 virtual int MinorKey() = 0; 191 virtual int MinorKey() = 0;
192 192
193 virtual InlineCacheState GetICState() { 193 virtual InlineCacheState GetICState() {
194 return UNINITIALIZED; 194 return UNINITIALIZED;
195 } 195 }
196 virtual Code::ExtraICState GetExtraICState() { 196 virtual ExtraICState GetExtraICState() {
197 return Code::kNoExtraICState; 197 return kNoExtraICState;
198 } 198 }
199 virtual Code::StubType GetStubType() { 199 virtual Code::StubType GetStubType() {
200 return Code::NORMAL; 200 return Code::NORMAL;
201 } 201 }
202 virtual int GetStubFlags() { 202 virtual int GetStubFlags() {
203 return -1; 203 return -1;
204 } 204 }
205 205
206 virtual void PrintName(StringStream* stream); 206 virtual void PrintName(StringStream* stream);
207 207
(...skipping 631 matching lines...) Expand 10 before | Expand all | Expand 10 after
839 virtual CodeStub::Major MajorKey() { return StringLength; } 839 virtual CodeStub::Major MajorKey() { return StringLength; }
840 }; 840 };
841 841
842 842
843 class StoreICStub: public ICStub { 843 class StoreICStub: public ICStub {
844 public: 844 public:
845 StoreICStub(Code::Kind kind, StrictModeFlag strict_mode) 845 StoreICStub(Code::Kind kind, StrictModeFlag strict_mode)
846 : ICStub(kind), strict_mode_(strict_mode) { } 846 : ICStub(kind), strict_mode_(strict_mode) { }
847 847
848 protected: 848 protected:
849 virtual Code::ExtraICState GetExtraICState() { 849 virtual ExtraICState GetExtraICState() {
850 return strict_mode_; 850 return StoreIC::ComputeExtraICState(strict_mode_);
851 } 851 }
852 852
853 private: 853 private:
854 STATIC_ASSERT(KindBits::kSize == 4); 854 STATIC_ASSERT(KindBits::kSize == 4);
855 class StrictModeBits: public BitField<bool, 4, 1> {}; 855 class StrictModeBits: public BitField<bool, 4, 1> {};
856 virtual int MinorKey() { 856 virtual int MinorKey() {
857 return KindBits::encode(kind()) | StrictModeBits::encode(strict_mode_); 857 return KindBits::encode(kind()) | StrictModeBits::encode(strict_mode_);
858 } 858 }
859 859
860 StrictModeFlag strict_mode_; 860 StrictModeFlag strict_mode_;
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
975 } 975 }
976 976
977 virtual Code::Kind kind() const { return Code::STORE_IC; } 977 virtual Code::Kind kind() const { return Code::STORE_IC; }
978 978
979 virtual Handle<Code> GenerateCode(Isolate* isolate); 979 virtual Handle<Code> GenerateCode(Isolate* isolate);
980 980
981 virtual void InitializeInterfaceDescriptor( 981 virtual void InitializeInterfaceDescriptor(
982 Isolate* isolate, 982 Isolate* isolate,
983 CodeStubInterfaceDescriptor* descriptor); 983 CodeStubInterfaceDescriptor* descriptor);
984 984
985 virtual Code::ExtraICState GetExtraICState() { return bit_field_; } 985 virtual ExtraICState GetExtraICState() { return bit_field_; }
986 986
987 bool is_constant() { 987 bool is_constant() {
988 return IsConstantBits::decode(bit_field_); 988 return IsConstantBits::decode(bit_field_);
989 } 989 }
990 void set_is_constant(bool value) { 990 void set_is_constant(bool value) {
991 bit_field_ = IsConstantBits::update(bit_field_, value); 991 bit_field_ = IsConstantBits::update(bit_field_, value);
992 } 992 }
993 993
994 Representation representation() { 994 Representation representation() {
995 return Representation::FromKind(RepresentationBits::decode(bit_field_)); 995 return Representation::FromKind(RepresentationBits::decode(bit_field_));
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
1029 }; 1029 };
1030 1030
1031 1031
1032 class KeyedArrayCallStub: public HICStub { 1032 class KeyedArrayCallStub: public HICStub {
1033 public: 1033 public:
1034 KeyedArrayCallStub(bool holey, int argc) : HICStub(), argc_(argc) { 1034 KeyedArrayCallStub(bool holey, int argc) : HICStub(), argc_(argc) {
1035 bit_field_ = ContextualBits::encode(false) | HoleyBits::encode(holey); 1035 bit_field_ = ContextualBits::encode(false) | HoleyBits::encode(holey);
1036 } 1036 }
1037 1037
1038 virtual Code::Kind kind() const { return Code::KEYED_CALL_IC; } 1038 virtual Code::Kind kind() const { return Code::KEYED_CALL_IC; }
1039 virtual Code::ExtraICState GetExtraICState() { return bit_field_; } 1039 virtual ExtraICState GetExtraICState() { return bit_field_; }
1040 1040
1041 ElementsKind elements_kind() { 1041 ElementsKind elements_kind() {
1042 return HoleyBits::decode(bit_field_) ? FAST_HOLEY_ELEMENTS : FAST_ELEMENTS; 1042 return HoleyBits::decode(bit_field_) ? FAST_HOLEY_ELEMENTS : FAST_ELEMENTS;
1043 } 1043 }
1044 1044
1045 int argc() { return argc_; } 1045 int argc() { return argc_; }
1046 virtual int GetStubFlags() { return argc(); } 1046 virtual int GetStubFlags() { return argc(); }
1047 1047
1048 static bool IsHoley(Handle<Code> code) { 1048 static bool IsHoley(Handle<Code> code) {
1049 Code::ExtraICState state = code->extra_ic_state(); 1049 ExtraICState state = code->extra_ic_state();
1050 return HoleyBits::decode(state); 1050 return HoleyBits::decode(state);
1051 } 1051 }
1052 1052
1053 virtual void InitializeInterfaceDescriptor( 1053 virtual void InitializeInterfaceDescriptor(
1054 Isolate* isolate, 1054 Isolate* isolate,
1055 CodeStubInterfaceDescriptor* descriptor); 1055 CodeStubInterfaceDescriptor* descriptor);
1056 1056
1057 virtual Handle<Code> GenerateCode(Isolate* isolate); 1057 virtual Handle<Code> GenerateCode(Isolate* isolate);
1058 1058
1059 private: 1059 private:
(...skipping 14 matching lines...) Expand all
1074 1074
1075 1075
1076 class BinaryOpStub: public HydrogenCodeStub { 1076 class BinaryOpStub: public HydrogenCodeStub {
1077 public: 1077 public:
1078 BinaryOpStub(Token::Value op, OverwriteMode mode) 1078 BinaryOpStub(Token::Value op, OverwriteMode mode)
1079 : HydrogenCodeStub(UNINITIALIZED), op_(op), mode_(mode) { 1079 : HydrogenCodeStub(UNINITIALIZED), op_(op), mode_(mode) {
1080 ASSERT(op <= LAST_TOKEN && op >= FIRST_TOKEN); 1080 ASSERT(op <= LAST_TOKEN && op >= FIRST_TOKEN);
1081 Initialize(); 1081 Initialize();
1082 } 1082 }
1083 1083
1084 explicit BinaryOpStub(Code::ExtraICState state) 1084 explicit BinaryOpStub(ExtraICState state)
1085 : op_(decode_token(OpBits::decode(state))), 1085 : op_(decode_token(OpBits::decode(state))),
1086 mode_(OverwriteModeField::decode(state)), 1086 mode_(OverwriteModeField::decode(state)),
1087 fixed_right_arg_( 1087 fixed_right_arg_(
1088 Maybe<int>(HasFixedRightArgBits::decode(state), 1088 Maybe<int>(HasFixedRightArgBits::decode(state),
1089 decode_arg_value(FixedRightArgValueBits::decode(state)))), 1089 decode_arg_value(FixedRightArgValueBits::decode(state)))),
1090 left_state_(LeftStateField::decode(state)), 1090 left_state_(LeftStateField::decode(state)),
1091 right_state_(fixed_right_arg_.has_value 1091 right_state_(fixed_right_arg_.has_value
1092 ? ((fixed_right_arg_.value <= Smi::kMaxValue) ? SMI : INT32) 1092 ? ((fixed_right_arg_.value <= Smi::kMaxValue) ? SMI : INT32)
1093 : RightStateField::decode(state)), 1093 : RightStateField::decode(state)),
1094 result_state_(ResultStateField::decode(state)) { 1094 result_state_(ResultStateField::decode(state)) {
(...skipping 22 matching lines...) Expand all
1117 return ::v8::internal::UNINITIALIZED; 1117 return ::v8::internal::UNINITIALIZED;
1118 } 1118 }
1119 if (Max(left_state_, right_state_) == GENERIC) return MEGAMORPHIC; 1119 if (Max(left_state_, right_state_) == GENERIC) return MEGAMORPHIC;
1120 return MONOMORPHIC; 1120 return MONOMORPHIC;
1121 } 1121 }
1122 1122
1123 virtual void VerifyPlatformFeatures(Isolate* isolate) V8_OVERRIDE { 1123 virtual void VerifyPlatformFeatures(Isolate* isolate) V8_OVERRIDE {
1124 ASSERT(CpuFeatures::VerifyCrossCompiling(SSE2)); 1124 ASSERT(CpuFeatures::VerifyCrossCompiling(SSE2));
1125 } 1125 }
1126 1126
1127 virtual Code::ExtraICState GetExtraICState() { 1127 virtual ExtraICState GetExtraICState() {
1128 bool sse_field = Max(result_state_, Max(left_state_, right_state_)) > SMI && 1128 bool sse_field = Max(result_state_, Max(left_state_, right_state_)) > SMI &&
1129 CpuFeatures::IsSafeForSnapshot(SSE2); 1129 CpuFeatures::IsSafeForSnapshot(SSE2);
1130 1130
1131 return OpBits::encode(encode_token(op_)) 1131 return OpBits::encode(encode_token(op_))
1132 | LeftStateField::encode(left_state_) 1132 | LeftStateField::encode(left_state_)
1133 | RightStateField::encode(fixed_right_arg_.has_value 1133 | RightStateField::encode(fixed_right_arg_.has_value
1134 ? NONE : right_state_) 1134 ? NONE : right_state_)
1135 | ResultStateField::encode(result_state_) 1135 | ResultStateField::encode(result_state_)
1136 | HasFixedRightArgBits::encode(fixed_right_arg_.has_value) 1136 | HasFixedRightArgBits::encode(fixed_right_arg_.has_value)
1137 | FixedRightArgValueBits::encode(fixed_right_arg_.has_value 1137 | FixedRightArgValueBits::encode(fixed_right_arg_.has_value
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after
1357 }; 1357 };
1358 1358
1359 1359
1360 class CompareNilICStub : public HydrogenCodeStub { 1360 class CompareNilICStub : public HydrogenCodeStub {
1361 public: 1361 public:
1362 Handle<Type> GetType(Isolate* isolate, Handle<Map> map = Handle<Map>()); 1362 Handle<Type> GetType(Isolate* isolate, Handle<Map> map = Handle<Map>());
1363 Handle<Type> GetInputType(Isolate* isolate, Handle<Map> map); 1363 Handle<Type> GetInputType(Isolate* isolate, Handle<Map> map);
1364 1364
1365 explicit CompareNilICStub(NilValue nil) : nil_value_(nil) { } 1365 explicit CompareNilICStub(NilValue nil) : nil_value_(nil) { }
1366 1366
1367 CompareNilICStub(Code::ExtraICState ic_state, 1367 CompareNilICStub(ExtraICState ic_state,
1368 InitializationState init_state = INITIALIZED) 1368 InitializationState init_state = INITIALIZED)
1369 : HydrogenCodeStub(init_state), 1369 : HydrogenCodeStub(init_state),
1370 nil_value_(NilValueField::decode(ic_state)), 1370 nil_value_(NilValueField::decode(ic_state)),
1371 state_(State(TypesField::decode(ic_state))) { 1371 state_(State(TypesField::decode(ic_state))) {
1372 } 1372 }
1373 1373
1374 static Handle<Code> GetUninitialized(Isolate* isolate, 1374 static Handle<Code> GetUninitialized(Isolate* isolate,
1375 NilValue nil) { 1375 NilValue nil) {
1376 return CompareNilICStub(nil, UNINITIALIZED).GetCode(isolate); 1376 return CompareNilICStub(nil, UNINITIALIZED).GetCode(isolate);
1377 } 1377 }
(...skipping 16 matching lines...) Expand all
1394 return MONOMORPHIC; 1394 return MONOMORPHIC;
1395 } else { 1395 } else {
1396 return PREMONOMORPHIC; 1396 return PREMONOMORPHIC;
1397 } 1397 }
1398 } 1398 }
1399 1399
1400 virtual Code::Kind GetCodeKind() const { return Code::COMPARE_NIL_IC; } 1400 virtual Code::Kind GetCodeKind() const { return Code::COMPARE_NIL_IC; }
1401 1401
1402 virtual Handle<Code> GenerateCode(Isolate* isolate); 1402 virtual Handle<Code> GenerateCode(Isolate* isolate);
1403 1403
1404 virtual Code::ExtraICState GetExtraICState() { 1404 virtual ExtraICState GetExtraICState() {
1405 return NilValueField::encode(nil_value_) | 1405 return NilValueField::encode(nil_value_) |
1406 TypesField::encode(state_.ToIntegral()); 1406 TypesField::encode(state_.ToIntegral());
1407 } 1407 }
1408 1408
1409 void UpdateStatus(Handle<Object> object); 1409 void UpdateStatus(Handle<Object> object);
1410 1410
1411 bool IsMonomorphic() const { return state_.Contains(MONOMORPHIC_MAP); } 1411 bool IsMonomorphic() const { return state_.Contains(MONOMORPHIC_MAP); }
1412 NilValue GetNilValue() const { return nil_value_; } 1412 NilValue GetNilValue() const { return nil_value_; }
1413 void ClearState() { state_.RemoveAll(); } 1413 void ClearState() { state_.RemoveAll(); }
1414 1414
(...skipping 908 matching lines...) Expand 10 before | Expand all | Expand 10 after
2323 bool UpdateStatus(Handle<Object> object); 2323 bool UpdateStatus(Handle<Object> object);
2324 bool NeedsMap() const; 2324 bool NeedsMap() const;
2325 bool CanBeUndetectable() const; 2325 bool CanBeUndetectable() const;
2326 bool IsGeneric() const { return ToIntegral() == Generic().ToIntegral(); } 2326 bool IsGeneric() const { return ToIntegral() == Generic().ToIntegral(); }
2327 2327
2328 static Types Generic() { return Types((1 << NUMBER_OF_TYPES) - 1); } 2328 static Types Generic() { return Types((1 << NUMBER_OF_TYPES) - 1); }
2329 }; 2329 };
2330 2330
2331 explicit ToBooleanStub(Types types = Types()) 2331 explicit ToBooleanStub(Types types = Types())
2332 : types_(types) { } 2332 : types_(types) { }
2333 explicit ToBooleanStub(Code::ExtraICState state) 2333 explicit ToBooleanStub(ExtraICState state)
2334 : types_(static_cast<byte>(state)) { } 2334 : types_(static_cast<byte>(state)) { }
2335 2335
2336 bool UpdateStatus(Handle<Object> object); 2336 bool UpdateStatus(Handle<Object> object);
2337 Types GetTypes() { return types_; } 2337 Types GetTypes() { return types_; }
2338 2338
2339 virtual Handle<Code> GenerateCode(Isolate* isolate); 2339 virtual Handle<Code> GenerateCode(Isolate* isolate);
2340 virtual void InitializeInterfaceDescriptor( 2340 virtual void InitializeInterfaceDescriptor(
2341 Isolate* isolate, 2341 Isolate* isolate,
2342 CodeStubInterfaceDescriptor* descriptor); 2342 CodeStubInterfaceDescriptor* descriptor);
2343 2343
2344 virtual Code::Kind GetCodeKind() const { return Code::TO_BOOLEAN_IC; } 2344 virtual Code::Kind GetCodeKind() const { return Code::TO_BOOLEAN_IC; }
2345 virtual void PrintState(StringStream* stream); 2345 virtual void PrintState(StringStream* stream);
2346 2346
2347 virtual bool SometimesSetsUpAFrame() { return false; } 2347 virtual bool SometimesSetsUpAFrame() { return false; }
2348 2348
2349 static void InitializeForIsolate(Isolate* isolate) { 2349 static void InitializeForIsolate(Isolate* isolate) {
2350 ToBooleanStub stub; 2350 ToBooleanStub stub;
2351 stub.InitializeInterfaceDescriptor( 2351 stub.InitializeInterfaceDescriptor(
2352 isolate, 2352 isolate,
2353 isolate->code_stub_interface_descriptor(CodeStub::ToBoolean)); 2353 isolate->code_stub_interface_descriptor(CodeStub::ToBoolean));
2354 } 2354 }
2355 2355
2356 static Handle<Code> GetUninitialized(Isolate* isolate) { 2356 static Handle<Code> GetUninitialized(Isolate* isolate) {
2357 return ToBooleanStub(UNINITIALIZED).GetCode(isolate); 2357 return ToBooleanStub(UNINITIALIZED).GetCode(isolate);
2358 } 2358 }
2359 2359
2360 virtual Code::ExtraICState GetExtraICState() { 2360 virtual ExtraICState GetExtraICState() {
2361 return types_.ToIntegral(); 2361 return types_.ToIntegral();
2362 } 2362 }
2363 2363
2364 virtual InlineCacheState GetICState() { 2364 virtual InlineCacheState GetICState() {
2365 if (types_.IsEmpty()) { 2365 if (types_.IsEmpty()) {
2366 return ::v8::internal::UNINITIALIZED; 2366 return ::v8::internal::UNINITIALIZED;
2367 } else { 2367 } else {
2368 return MONOMORPHIC; 2368 return MONOMORPHIC;
2369 } 2369 }
2370 } 2370 }
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
2512 int MinorKey() { return 0; } 2512 int MinorKey() { return 0; }
2513 2513
2514 void Generate(MacroAssembler* masm); 2514 void Generate(MacroAssembler* masm);
2515 2515
2516 DISALLOW_COPY_AND_ASSIGN(ProfileEntryHookStub); 2516 DISALLOW_COPY_AND_ASSIGN(ProfileEntryHookStub);
2517 }; 2517 };
2518 2518
2519 } } // namespace v8::internal 2519 } } // namespace v8::internal
2520 2520
2521 #endif // V8_CODE_STUBS_H_ 2521 #endif // V8_CODE_STUBS_H_
OLDNEW
« no previous file with comments | « src/builtins.cc ('k') | src/ia32/ic-ia32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698