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

Side by Side Diff: src/heap.cc

Issue 57123002: Reland 21774: Generate KeyedLoadGeneric with Hydrogen (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Turn off by default 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
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 7691 matching lines...) Expand 10 before | Expand all | Expand 10 after
7702 7702
7703 7703
7704 int KeyedLookupCache::Hash(Map* map, Name* name) { 7704 int KeyedLookupCache::Hash(Map* map, Name* name) {
7705 // Uses only lower 32 bits if pointers are larger. 7705 // Uses only lower 32 bits if pointers are larger.
7706 uintptr_t addr_hash = 7706 uintptr_t addr_hash =
7707 static_cast<uint32_t>(reinterpret_cast<uintptr_t>(map)) >> kMapHashShift; 7707 static_cast<uint32_t>(reinterpret_cast<uintptr_t>(map)) >> kMapHashShift;
7708 return static_cast<uint32_t>((addr_hash ^ name->Hash()) & kCapacityMask); 7708 return static_cast<uint32_t>((addr_hash ^ name->Hash()) & kCapacityMask);
7709 } 7709 }
7710 7710
7711 7711
7712 int KeyedLookupCache::ConvertToFastIndexForGeneratedCode(Map* map, int index) {
7713 if (FLAG_compiled_keyed_generic_loads) {
7714 if (index >= map->inobject_properties()) {
7715 return -(index - map->inobject_properties() + 1);
Toon Verwaest 2013/12/04 17:29:26 Seems like this should be combined with the code i
danno 2014/06/06 15:43:50 Well, essentially because they are are not the sam
7716 }
7717 }
7718 return index;
7719 }
7720
7721
7722 int KeyedLookupCache::ConvertFromFastIndexForGeneratedCode(Map* map,
7723 int index) {
7724 if (FLAG_compiled_keyed_generic_loads) {
7725 if (index < 0) {
7726 return -index + map->inobject_properties() - 1;
Toon Verwaest 2013/12/04 17:29:26 Same as above.
danno 2014/06/06 15:43:50 See my comment above.
7727 }
7728 }
7729 return index;
7730 }
7731
7732
7712 int KeyedLookupCache::Lookup(Map* map, Name* name) { 7733 int KeyedLookupCache::Lookup(Map* map, Name* name) {
7713 int index = (Hash(map, name) & kHashMask); 7734 int index = (Hash(map, name) & kHashMask);
7714 for (int i = 0; i < kEntriesPerBucket; i++) { 7735 for (int i = 0; i < kEntriesPerBucket; i++) {
7715 Key& key = keys_[index + i]; 7736 Key& key = keys_[index + i];
7716 if ((key.map == map) && key.name->Equals(name)) { 7737 if ((key.map == map) && key.name->Equals(name)) {
7717 return field_offsets_[index + i]; 7738 int result = field_offsets_[index + i];
7739 result = ConvertFromFastIndexForGeneratedCode(map, result);
7718 } 7740 }
7719 } 7741 }
7720 return kNotFound; 7742 return kNotFound;
7721 } 7743 }
7722 7744
7723 7745
7724 void KeyedLookupCache::Update(Map* map, Name* name, int field_offset) { 7746 void KeyedLookupCache::Update(Map* map, Name* name, int field_offset) {
7725 if (!name->IsUniqueName()) { 7747 if (!name->IsUniqueName()) {
7726 String* internalized_string; 7748 String* internalized_string;
7727 if (!map->GetIsolate()->heap()->InternalizeStringIfExists( 7749 if (!map->GetIsolate()->heap()->InternalizeStringIfExists(
7728 String::cast(name), &internalized_string)) { 7750 String::cast(name), &internalized_string)) {
7729 return; 7751 return;
7730 } 7752 }
7731 name = internalized_string; 7753 name = internalized_string;
7732 } 7754 }
7733 // This cache is cleared only between mark compact passes, so we expect the 7755 // This cache is cleared only between mark compact passes, so we expect the
7734 // cache to only contain old space names. 7756 // cache to only contain old space names.
7735 ASSERT(!map->GetIsolate()->heap()->InNewSpace(name)); 7757 ASSERT(!map->GetIsolate()->heap()->InNewSpace(name));
7736 7758
7759 // Swizzle the field offset so that it's in the most efficient format to be
7760 // accessed in the cache from generated code: in-object properties are index
7761 // offsets and out-of-object are negative offsets.
7762 field_offset = ConvertToFastIndexForGeneratedCode(map, field_offset);
7763
7737 int index = (Hash(map, name) & kHashMask); 7764 int index = (Hash(map, name) & kHashMask);
7738 // After a GC there will be free slots, so we use them in order (this may 7765 // After a GC there will be free slots, so we use them in order (this may
7739 // help to get the most frequently used one in position 0). 7766 // help to get the most frequently used one in position 0).
7740 for (int i = 0; i< kEntriesPerBucket; i++) { 7767 for (int i = 0; i< kEntriesPerBucket; i++) {
7741 Key& key = keys_[index]; 7768 Key& key = keys_[index];
7742 Object* free_entry_indicator = NULL; 7769 Object* free_entry_indicator = NULL;
7743 if (key.map == free_entry_indicator) { 7770 if (key.map == free_entry_indicator) {
7744 key.map = map; 7771 key.map = map;
7745 key.name = name; 7772 key.name = name;
7746 field_offsets_[index + i] = field_offset; 7773 field_offsets_[index + i] = field_offset;
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after
7988 static_cast<int>(object_sizes_last_time_[index])); 8015 static_cast<int>(object_sizes_last_time_[index]));
7989 CODE_AGE_LIST_COMPLETE(ADJUST_LAST_TIME_OBJECT_COUNT) 8016 CODE_AGE_LIST_COMPLETE(ADJUST_LAST_TIME_OBJECT_COUNT)
7990 #undef ADJUST_LAST_TIME_OBJECT_COUNT 8017 #undef ADJUST_LAST_TIME_OBJECT_COUNT
7991 8018
7992 OS::MemCopy(object_counts_last_time_, object_counts_, sizeof(object_counts_)); 8019 OS::MemCopy(object_counts_last_time_, object_counts_, sizeof(object_counts_));
7993 OS::MemCopy(object_sizes_last_time_, object_sizes_, sizeof(object_sizes_)); 8020 OS::MemCopy(object_sizes_last_time_, object_sizes_, sizeof(object_sizes_));
7994 ClearObjectStats(); 8021 ClearObjectStats();
7995 } 8022 }
7996 8023
7997 } } // namespace v8::internal 8024 } } // namespace v8::internal
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698