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/ic.h

Issue 650073002: vector-based ICs did not update type feedback counts correctly. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Ports. Created 6 years, 2 months 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
OLDNEW
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_IC_H_ 5 #ifndef V8_IC_H_
6 #define V8_IC_H_ 6 #define V8_IC_H_
7 7
8 #include "src/ic/ic-state.h" 8 #include "src/ic/ic-state.h"
9 #include "src/macro-assembler.h" 9 #include "src/macro-assembler.h"
10 10
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
77 // If the stub contains weak maps then this function adds the stub to 77 // If the stub contains weak maps then this function adds the stub to
78 // the dependent code array of each weak map. 78 // the dependent code array of each weak map.
79 static void RegisterWeakMapDependency(Handle<Code> stub); 79 static void RegisterWeakMapDependency(Handle<Code> stub);
80 80
81 // This function is called when a weak map in the stub is dying, 81 // This function is called when a weak map in the stub is dying,
82 // invalidates the stub by setting maps in it to undefined. 82 // invalidates the stub by setting maps in it to undefined.
83 static void InvalidateMaps(Code* stub); 83 static void InvalidateMaps(Code* stub);
84 84
85 // Clear the inline cache to initial state. 85 // Clear the inline cache to initial state.
86 static void Clear(Isolate* isolate, Address address, 86 static void Clear(Isolate* isolate, Address address,
87 TypeFeedbackVector* vector, FeedbackVectorICSlot slot,
87 ConstantPoolArray* constant_pool); 88 ConstantPoolArray* constant_pool);
88 89
89 #ifdef DEBUG 90 #ifdef DEBUG
90 bool IsLoadStub() const { 91 bool IsLoadStub() const {
91 return target()->is_load_stub() || target()->is_keyed_load_stub(); 92 return target()->is_load_stub() || target()->is_keyed_load_stub();
92 } 93 }
93 94
94 bool IsStoreStub() const { 95 bool IsStoreStub() const {
95 return target()->is_store_stub() || target()->is_keyed_store_stub(); 96 return target()->is_store_stub() || target()->is_keyed_store_stub();
96 } 97 }
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
287 Address address_; 288 Address address_;
288 IC::UtilityId id_; 289 IC::UtilityId id_;
289 }; 290 };
290 291
291 292
292 class CallIC : public IC { 293 class CallIC : public IC {
293 public: 294 public:
294 explicit CallIC(Isolate* isolate) : IC(EXTRA_CALL_FRAME, isolate) {} 295 explicit CallIC(Isolate* isolate) : IC(EXTRA_CALL_FRAME, isolate) {}
295 296
296 void PatchMegamorphic(Handle<Object> function, 297 void PatchMegamorphic(Handle<Object> function,
297 Handle<TypeFeedbackVector> vector, Handle<Smi> slot); 298 Handle<TypeFeedbackVector> vector,
299 FeedbackVectorICSlot slot);
298 300
299 void HandleMiss(Handle<Object> receiver, Handle<Object> function, 301 void HandleMiss(Handle<Object> receiver, Handle<Object> function,
300 Handle<TypeFeedbackVector> vector, Handle<Smi> slot); 302 Handle<TypeFeedbackVector> vector, FeedbackVectorICSlot slot);
301 303
302 // Returns true if a custom handler was installed. 304 // Returns true if a custom handler was installed.
303 bool DoCustomHandler(Handle<Object> receiver, Handle<Object> function, 305 bool DoCustomHandler(Handle<Object> receiver, Handle<Object> function,
304 Handle<TypeFeedbackVector> vector, Handle<Smi> slot, 306 Handle<TypeFeedbackVector> vector,
305 const CallICState& state); 307 FeedbackVectorICSlot slot, const CallICState& state);
306 308
307 // Code generator routines. 309 // Code generator routines.
308 static Handle<Code> initialize_stub(Isolate* isolate, int argc, 310 static Handle<Code> initialize_stub(Isolate* isolate, int argc,
309 CallICState::CallType call_type); 311 CallICState::CallType call_type);
310 312
311 static void Clear(Isolate* isolate, Address address, Code* target, 313 static void Clear(Isolate* isolate, Address address, Code* target,
314 TypeFeedbackVector* vector, FeedbackVectorICSlot slot,
312 ConstantPoolArray* constant_pool); 315 ConstantPoolArray* constant_pool);
313 316
314 private: 317 private:
318 static inline IC::State FeedbackToState(Isolate* isolate,
319 TypeFeedbackVector* vector,
320 FeedbackVectorICSlot slot);
321
315 inline IC::State FeedbackToState(Handle<TypeFeedbackVector> vector, 322 inline IC::State FeedbackToState(Handle<TypeFeedbackVector> vector,
316 Handle<Smi> slot) const; 323 FeedbackVectorICSlot slot) const;
324
325 // As a vector-based IC, type feedback must be updated differently.
326 static void OnTypeFeedbackChanged(Isolate* isolate, Address address,
327 TypeFeedbackVector* vector, State old_state,
328 State new_state);
329 inline void OnTypeFeedbackChanged(Handle<TypeFeedbackVector> vector,
330 State old_state, State new_state);
317 }; 331 };
318 332
319 333
320 class LoadIC : public IC { 334 class LoadIC : public IC {
321 public: 335 public:
322 static ExtraICState ComputeExtraICState(ContextualMode contextual_mode) { 336 static ExtraICState ComputeExtraICState(ContextualMode contextual_mode) {
323 return LoadICState(contextual_mode).GetExtraICState(); 337 return LoadICState(contextual_mode).GetExtraICState();
324 } 338 }
325 339
326 ContextualMode contextual_mode() const { 340 ContextualMode contextual_mode() const {
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
382 CacheHolderFlag cache_holder); 396 CacheHolderFlag cache_holder);
383 397
384 private: 398 private:
385 virtual Handle<Code> pre_monomorphic_stub() const; 399 virtual Handle<Code> pre_monomorphic_stub() const;
386 static Handle<Code> pre_monomorphic_stub(Isolate* isolate, 400 static Handle<Code> pre_monomorphic_stub(Isolate* isolate,
387 ExtraICState extra_state); 401 ExtraICState extra_state);
388 402
389 Handle<Code> SimpleFieldLoad(FieldIndex index); 403 Handle<Code> SimpleFieldLoad(FieldIndex index);
390 404
391 static void Clear(Isolate* isolate, Address address, Code* target, 405 static void Clear(Isolate* isolate, Address address, Code* target,
406 TypeFeedbackVector* vector, FeedbackVectorICSlot slot,
392 ConstantPoolArray* constant_pool); 407 ConstantPoolArray* constant_pool);
393 408
394 friend class IC; 409 friend class IC;
395 }; 410 };
396 411
397 412
398 class KeyedLoadIC : public LoadIC { 413 class KeyedLoadIC : public LoadIC {
399 public: 414 public:
400 explicit KeyedLoadIC(FrameDepth depth, Isolate* isolate) 415 explicit KeyedLoadIC(FrameDepth depth, Isolate* isolate)
401 : LoadIC(depth, isolate) { 416 : LoadIC(depth, isolate) {
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
433 return pre_monomorphic_stub(isolate()); 448 return pre_monomorphic_stub(isolate());
434 } 449 }
435 450
436 private: 451 private:
437 Handle<Code> generic_stub() const { return generic_stub(isolate()); } 452 Handle<Code> generic_stub() const { return generic_stub(isolate()); }
438 Handle<Code> string_stub() { 453 Handle<Code> string_stub() {
439 return isolate()->builtins()->KeyedLoadIC_String(); 454 return isolate()->builtins()->KeyedLoadIC_String();
440 } 455 }
441 456
442 static void Clear(Isolate* isolate, Address address, Code* target, 457 static void Clear(Isolate* isolate, Address address, Code* target,
458 TypeFeedbackVector* vector, FeedbackVectorICSlot slot,
443 ConstantPoolArray* constant_pool); 459 ConstantPoolArray* constant_pool);
444 460
445 friend class IC; 461 friend class IC;
446 }; 462 };
447 463
448 464
449 class StoreIC : public IC { 465 class StoreIC : public IC {
450 public: 466 public:
451 class StrictModeState : public BitField<StrictMode, 1, 1> {}; 467 class StrictModeState : public BitField<StrictMode, 1, 1> {};
452 static ExtraICState ComputeExtraICState(StrictMode flag) { 468 static ExtraICState ComputeExtraICState(StrictMode flag) {
(...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after
698 714
699 // Support functions for interceptor handlers. 715 // Support functions for interceptor handlers.
700 DECLARE_RUNTIME_FUNCTION(LoadPropertyWithInterceptorOnly); 716 DECLARE_RUNTIME_FUNCTION(LoadPropertyWithInterceptorOnly);
701 DECLARE_RUNTIME_FUNCTION(LoadPropertyWithInterceptor); 717 DECLARE_RUNTIME_FUNCTION(LoadPropertyWithInterceptor);
702 DECLARE_RUNTIME_FUNCTION(LoadElementWithInterceptor); 718 DECLARE_RUNTIME_FUNCTION(LoadElementWithInterceptor);
703 DECLARE_RUNTIME_FUNCTION(StorePropertyWithInterceptor); 719 DECLARE_RUNTIME_FUNCTION(StorePropertyWithInterceptor);
704 } 720 }
705 } // namespace v8::internal 721 } // namespace v8::internal
706 722
707 #endif // V8_IC_H_ 723 #endif // V8_IC_H_
OLDNEW
« no previous file with comments | « src/ia32/lithium-codegen-ia32.cc ('k') | src/ic/ic.cc » ('j') | src/ic/ic.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698