| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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 #include "src/type-feedback-vector.h" | 5 #include "src/type-feedback-vector.h" |
| 6 | 6 |
| 7 #include "src/code-stubs.h" | 7 #include "src/code-stubs.h" |
| 8 #include "src/ic/ic.h" | 8 #include "src/ic/ic.h" |
| 9 #include "src/ic/ic-state.h" | 9 #include "src/ic/ic-state.h" |
| 10 #include "src/objects.h" | 10 #include "src/objects.h" |
| (...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 179 // Ensure we can skip the write barrier | 179 // Ensure we can skip the write barrier |
| 180 Handle<Object> uninitialized_sentinel = UninitializedSentinel(isolate); | 180 Handle<Object> uninitialized_sentinel = UninitializedSentinel(isolate); |
| 181 DCHECK_EQ(*factory->uninitialized_symbol(), *uninitialized_sentinel); | 181 DCHECK_EQ(*factory->uninitialized_symbol(), *uninitialized_sentinel); |
| 182 for (int i = 0; i < slot_count;) { | 182 for (int i = 0; i < slot_count;) { |
| 183 FeedbackVectorSlot slot(i); | 183 FeedbackVectorSlot slot(i); |
| 184 FeedbackVectorSlotKind kind = metadata->GetKind(slot); | 184 FeedbackVectorSlotKind kind = metadata->GetKind(slot); |
| 185 int index = TypeFeedbackVector::GetIndex(slot); | 185 int index = TypeFeedbackVector::GetIndex(slot); |
| 186 int entry_size = TypeFeedbackMetadata::GetSlotSize(kind); | 186 int entry_size = TypeFeedbackMetadata::GetSlotSize(kind); |
| 187 | 187 |
| 188 Object* value; | 188 Object* value; |
| 189 if (FLAG_new_load_global_ic && | 189 if (kind == FeedbackVectorSlotKind::LOAD_GLOBAL_IC) { |
| 190 kind == FeedbackVectorSlotKind::LOAD_GLOBAL_IC) { | |
| 191 value = *factory->empty_weak_cell(); | 190 value = *factory->empty_weak_cell(); |
| 192 } else { | 191 } else { |
| 193 value = *uninitialized_sentinel; | 192 value = *uninitialized_sentinel; |
| 194 } | 193 } |
| 195 array->set(index, value, SKIP_WRITE_BARRIER); | 194 array->set(index, value, SKIP_WRITE_BARRIER); |
| 196 for (int j = 1; j < entry_size; j++) { | 195 for (int j = 1; j < entry_size; j++) { |
| 197 array->set(index + j, *uninitialized_sentinel, SKIP_WRITE_BARRIER); | 196 array->set(index + j, *uninitialized_sentinel, SKIP_WRITE_BARRIER); |
| 198 } | 197 } |
| 199 i += entry_size; | 198 i += entry_size; |
| 200 } | 199 } |
| (...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 456 return MONOMORPHIC; | 455 return MONOMORPHIC; |
| 457 } | 456 } |
| 458 | 457 |
| 459 return UNINITIALIZED; | 458 return UNINITIALIZED; |
| 460 } | 459 } |
| 461 | 460 |
| 462 InlineCacheState LoadGlobalICNexus::StateFromFeedback() const { | 461 InlineCacheState LoadGlobalICNexus::StateFromFeedback() const { |
| 463 Isolate* isolate = GetIsolate(); | 462 Isolate* isolate = GetIsolate(); |
| 464 Object* feedback = GetFeedback(); | 463 Object* feedback = GetFeedback(); |
| 465 | 464 |
| 466 if (FLAG_new_load_global_ic) { | 465 Object* extra = GetFeedbackExtra(); |
| 467 Object* extra = GetFeedbackExtra(); | 466 if (!WeakCell::cast(feedback)->cleared() || |
| 468 if (!WeakCell::cast(feedback)->cleared() || | 467 extra != *TypeFeedbackVector::UninitializedSentinel(isolate)) { |
| 469 extra != *TypeFeedbackVector::UninitializedSentinel(isolate)) { | 468 return MONOMORPHIC; |
| 470 return MONOMORPHIC; | |
| 471 } | |
| 472 | |
| 473 } else { | |
| 474 if (feedback == *TypeFeedbackVector::UninitializedSentinel(isolate)) { | |
| 475 return UNINITIALIZED; | |
| 476 } else if (feedback == *TypeFeedbackVector::MegamorphicSentinel(isolate)) { | |
| 477 return MEGAMORPHIC; | |
| 478 } else if (feedback == | |
| 479 *TypeFeedbackVector::PremonomorphicSentinel(isolate)) { | |
| 480 return PREMONOMORPHIC; | |
| 481 } else if (feedback->IsFixedArray()) { | |
| 482 // Determine state purely by our structure, don't check if the maps are | |
| 483 // cleared. | |
| 484 return POLYMORPHIC; | |
| 485 } else if (feedback->IsWeakCell()) { | |
| 486 // Don't check if the map is cleared. | |
| 487 return MONOMORPHIC; | |
| 488 } | |
| 489 } | 469 } |
| 490 return UNINITIALIZED; | 470 return UNINITIALIZED; |
| 491 } | 471 } |
| 492 | 472 |
| 493 InlineCacheState KeyedLoadICNexus::StateFromFeedback() const { | 473 InlineCacheState KeyedLoadICNexus::StateFromFeedback() const { |
| 494 Isolate* isolate = GetIsolate(); | 474 Isolate* isolate = GetIsolate(); |
| 495 Object* feedback = GetFeedback(); | 475 Object* feedback = GetFeedback(); |
| 496 | 476 |
| 497 if (feedback == *TypeFeedbackVector::UninitializedSentinel(isolate)) { | 477 if (feedback == *TypeFeedbackVector::UninitializedSentinel(isolate)) { |
| 498 return UNINITIALIZED; | 478 return UNINITIALIZED; |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 628 } | 608 } |
| 629 | 609 |
| 630 | 610 |
| 631 void LoadICNexus::ConfigureMonomorphic(Handle<Map> receiver_map, | 611 void LoadICNexus::ConfigureMonomorphic(Handle<Map> receiver_map, |
| 632 Handle<Code> handler) { | 612 Handle<Code> handler) { |
| 633 Handle<WeakCell> cell = Map::WeakCellForMap(receiver_map); | 613 Handle<WeakCell> cell = Map::WeakCellForMap(receiver_map); |
| 634 SetFeedback(*cell); | 614 SetFeedback(*cell); |
| 635 SetFeedbackExtra(*handler); | 615 SetFeedbackExtra(*handler); |
| 636 } | 616 } |
| 637 | 617 |
| 638 void LoadGlobalICNexus::ConfigureMonomorphic(Handle<Map> receiver_map, | |
| 639 Handle<Code> handler) { | |
| 640 Handle<WeakCell> cell = Map::WeakCellForMap(receiver_map); | |
| 641 SetFeedback(*cell); | |
| 642 SetFeedbackExtra(*handler); | |
| 643 } | |
| 644 | |
| 645 void LoadGlobalICNexus::ConfigureUninitialized() { | 618 void LoadGlobalICNexus::ConfigureUninitialized() { |
| 646 Isolate* isolate = GetIsolate(); | 619 Isolate* isolate = GetIsolate(); |
| 647 SetFeedback(isolate->heap()->empty_weak_cell(), SKIP_WRITE_BARRIER); | 620 SetFeedback(isolate->heap()->empty_weak_cell(), SKIP_WRITE_BARRIER); |
| 648 SetFeedbackExtra(*TypeFeedbackVector::UninitializedSentinel(isolate), | 621 SetFeedbackExtra(*TypeFeedbackVector::UninitializedSentinel(isolate), |
| 649 SKIP_WRITE_BARRIER); | 622 SKIP_WRITE_BARRIER); |
| 650 } | 623 } |
| 651 | 624 |
| 652 void LoadGlobalICNexus::ConfigurePropertyCellMode(Handle<PropertyCell> cell) { | 625 void LoadGlobalICNexus::ConfigurePropertyCellMode(Handle<PropertyCell> cell) { |
| 653 Isolate* isolate = GetIsolate(); | 626 Isolate* isolate = GetIsolate(); |
| 654 SetFeedback(*isolate->factory()->NewWeakCell(cell)); | 627 SetFeedback(*isolate->factory()->NewWeakCell(cell)); |
| (...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 979 | 952 |
| 980 IcCheckType KeyedStoreICNexus::GetKeyType() const { | 953 IcCheckType KeyedStoreICNexus::GetKeyType() const { |
| 981 Object* feedback = GetFeedback(); | 954 Object* feedback = GetFeedback(); |
| 982 if (feedback == *TypeFeedbackVector::MegamorphicSentinel(GetIsolate())) { | 955 if (feedback == *TypeFeedbackVector::MegamorphicSentinel(GetIsolate())) { |
| 983 return static_cast<IcCheckType>(Smi::cast(GetFeedbackExtra())->value()); | 956 return static_cast<IcCheckType>(Smi::cast(GetFeedbackExtra())->value()); |
| 984 } | 957 } |
| 985 return IsPropertyNameFeedback(feedback) ? PROPERTY : ELEMENT; | 958 return IsPropertyNameFeedback(feedback) ? PROPERTY : ELEMENT; |
| 986 } | 959 } |
| 987 } // namespace internal | 960 } // namespace internal |
| 988 } // namespace v8 | 961 } // namespace v8 |
| OLD | NEW |