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

Side by Side Diff: src/ic.cc

Issue 284153004: Avoid flushing the icache unnecessarily when updating target addresses in code. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Update SKIP_ICACHE_FLUSH_IF_ATOMIC to only skip when patching a single instruction. Created 6 years, 7 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 #include "v8.h" 5 #include "v8.h"
6 6
7 #include "accessors.h" 7 #include "accessors.h"
8 #include "api.h" 8 #include "api.h"
9 #include "arguments.h" 9 #include "arguments.h"
10 #include "codegen.h" 10 #include "codegen.h"
(...skipping 841 matching lines...) Expand 10 before | Expand all | Expand 10 after
852 } 852 }
853 853
854 854
855 void LoadIC::UpdateCaches(LookupResult* lookup, 855 void LoadIC::UpdateCaches(LookupResult* lookup,
856 Handle<Object> object, 856 Handle<Object> object,
857 Handle<String> name) { 857 Handle<String> name) {
858 if (state() == UNINITIALIZED) { 858 if (state() == UNINITIALIZED) {
859 // This is the first time we execute this inline cache. 859 // This is the first time we execute this inline cache.
860 // Set the target to the pre monomorphic stub to delay 860 // Set the target to the pre monomorphic stub to delay
861 // setting the monomorphic state. 861 // setting the monomorphic state.
862 set_target(*pre_monomorphic_stub()); 862 // No need to flush the icache since the pre_monomorphic_stub will be the
863 // same code as the initialize_stub - it is just used as a marker to
864 // identify when we should move to monomorphic, and will be correctly read
865 // via raw_target() even if the wrong stub was called.
866 set_target(*pre_monomorphic_stub(), SKIP_ICACHE_FLUSH_IF_ATOMIC);
863 TRACE_IC("LoadIC", name); 867 TRACE_IC("LoadIC", name);
864 return; 868 return;
865 } 869 }
866 870
867 Handle<HeapType> type = CurrentTypeOf(object, isolate()); 871 Handle<HeapType> type = CurrentTypeOf(object, isolate());
868 Handle<Code> code; 872 Handle<Code> code;
869 if (!lookup->IsCacheable()) { 873 if (!lookup->IsCacheable()) {
870 // Bail out if the result is not cacheable. 874 // Bail out if the result is not cacheable.
871 code = slow_stub(); 875 code = slow_stub();
872 } else if (!lookup->IsProperty()) { 876 } else if (!lookup->IsProperty()) {
(...skipping 429 matching lines...) Expand 10 before | Expand all | Expand 10 after
1302 if (!can_store && 1306 if (!can_store &&
1303 strict_mode() == STRICT && 1307 strict_mode() == STRICT &&
1304 !(lookup.IsProperty() && lookup.IsReadOnly()) && 1308 !(lookup.IsProperty() && lookup.IsReadOnly()) &&
1305 object->IsGlobalObject()) { 1309 object->IsGlobalObject()) {
1306 // Strict mode doesn't allow setting non-existent global property. 1310 // Strict mode doesn't allow setting non-existent global property.
1307 return ReferenceError("not_defined", name); 1311 return ReferenceError("not_defined", name);
1308 } 1312 }
1309 if (FLAG_use_ic) { 1313 if (FLAG_use_ic) {
1310 if (state() == UNINITIALIZED) { 1314 if (state() == UNINITIALIZED) {
1311 Handle<Code> stub = pre_monomorphic_stub(); 1315 Handle<Code> stub = pre_monomorphic_stub();
1312 set_target(*stub); 1316 // No need to flush the icache since the pre_monomorphic_stub will be the
1317 // same code as the initialize_stub - it is just used as a marker to
1318 // identify when we should move to monomorphic, and will be correctly read
1319 // via raw_target() even if the wrong stub was called.
1320 set_target(*stub, SKIP_ICACHE_FLUSH_IF_ATOMIC);
1313 TRACE_IC("StoreIC", name); 1321 TRACE_IC("StoreIC", name);
1314 } else if (can_store) { 1322 } else if (can_store) {
1315 UpdateCaches(&lookup, receiver, name, value); 1323 UpdateCaches(&lookup, receiver, name, value);
1316 } else if (!name->IsCacheable(isolate()) || 1324 } else if (!name->IsCacheable(isolate()) ||
1317 lookup.IsNormal() || 1325 lookup.IsNormal() ||
1318 (lookup.IsField() && lookup.CanHoldValue(value))) { 1326 (lookup.IsField() && lookup.CanHoldValue(value))) {
1319 Handle<Code> stub = generic_stub(); 1327 Handle<Code> stub = generic_stub();
1320 set_target(*stub); 1328 set_target(*stub);
1321 } 1329 }
1322 } 1330 }
(...skipping 1662 matching lines...) Expand 10 before | Expand all | Expand 10 after
2985 #undef ADDR 2993 #undef ADDR
2986 }; 2994 };
2987 2995
2988 2996
2989 Address IC::AddressFromUtilityId(IC::UtilityId id) { 2997 Address IC::AddressFromUtilityId(IC::UtilityId id) {
2990 return IC_utilities[id]; 2998 return IC_utilities[id];
2991 } 2999 }
2992 3000
2993 3001
2994 } } // namespace v8::internal 3002 } } // namespace v8::internal
OLDNEW
« src/arm/assembler-arm-inl.h ('K') | « src/ic.h ('k') | src/ic-inl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698