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

Side by Side Diff: src/ic.cc

Issue 12079024: Tag previously GENERIC stubs that potentially IC_Miss as MONOMORPHIC. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Replace explicit stub-check with != GENERIC check. Created 7 years, 10 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
« no previous file with comments | « src/builtins.h ('k') | src/type-info.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 986 matching lines...) Expand 10 before | Expand all | Expand 10 after
997 case POLYMORPHIC: 997 case POLYMORPHIC:
998 // When trying to patch a polymorphic stub with anything other than 998 // When trying to patch a polymorphic stub with anything other than
999 // another polymorphic stub, go generic. 999 // another polymorphic stub, go generic.
1000 // TODO(verwaest): Currently we always go generic since no polymorphic 1000 // TODO(verwaest): Currently we always go generic since no polymorphic
1001 // stubs enter this code path. Replace with proper updating once named 1001 // stubs enter this code path. Replace with proper updating once named
1002 // load/store can also be polymorphic. 1002 // load/store can also be polymorphic.
1003 set_target((strict_mode == kStrictMode) 1003 set_target((strict_mode == kStrictMode)
1004 ? *generic_stub_strict() 1004 ? *generic_stub_strict()
1005 : *generic_stub()); 1005 : *generic_stub());
1006 break; 1006 break;
1007 case DEBUG_STUB:
1008 break;
1007 case GENERIC: 1009 case GENERIC:
1008 case DEBUG_STUB: 1010 UNREACHABLE();
1009 break; 1011 break;
1010 } 1012 }
1011 } 1013 }
1012 1014
1013 1015
1014 void LoadIC::UpdateCaches(LookupResult* lookup, 1016 void LoadIC::UpdateCaches(LookupResult* lookup,
1015 State state, 1017 State state,
1016 Handle<Object> object, 1018 Handle<Object> object,
1017 Handle<String> name) { 1019 Handle<String> name) {
1018 // Bail out if the result is not cacheable. 1020 // Bail out if the result is not cacheable.
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
1162 int mask = RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT); 1164 int mask = RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT);
1163 for (RelocIterator it(*stub, mask); !it.done(); it.next()) { 1165 for (RelocIterator it(*stub, mask); !it.done(); it.next()) {
1164 RelocInfo* info = it.rinfo(); 1166 RelocInfo* info = it.rinfo();
1165 Handle<Object> object(info->target_object()); 1167 Handle<Object> object(info->target_object());
1166 ASSERT(object->IsMap()); 1168 ASSERT(object->IsMap());
1167 AddOneReceiverMapIfMissing(result, Handle<Map>::cast(object)); 1169 AddOneReceiverMapIfMissing(result, Handle<Map>::cast(object));
1168 } 1170 }
1169 break; 1171 break;
1170 } 1172 }
1171 case MEGAMORPHIC: 1173 case MEGAMORPHIC:
1172 case GENERIC:
1173 break; 1174 break;
1174 case UNINITIALIZED: 1175 case UNINITIALIZED:
1175 case PREMONOMORPHIC: 1176 case PREMONOMORPHIC:
1176 case MONOMORPHIC_PROTOTYPE_FAILURE: 1177 case MONOMORPHIC_PROTOTYPE_FAILURE:
1178 case GENERIC:
1177 case DEBUG_STUB: 1179 case DEBUG_STUB:
1178 UNREACHABLE(); 1180 UNREACHABLE();
1179 break; 1181 break;
1180 } 1182 }
1181 } 1183 }
1182 1184
1183 1185
1184 Handle<Code> KeyedLoadIC::LoadElementStub(Handle<JSObject> receiver) { 1186 Handle<Code> KeyedLoadIC::LoadElementStub(Handle<JSObject> receiver) {
1185 State ic_state = target()->ic_state(); 1187 State ic_state = target()->ic_state();
1186 1188
(...skipping 29 matching lines...) Expand all
1216 // monomorphic. If this optimistic assumption is not true, the IC will 1218 // monomorphic. If this optimistic assumption is not true, the IC will
1217 // miss again and it will become polymorphic and support both the 1219 // miss again and it will become polymorphic and support both the
1218 // untransitioned and transitioned maps. 1220 // untransitioned and transitioned maps.
1219 if (ic_state == MONOMORPHIC && 1221 if (ic_state == MONOMORPHIC &&
1220 IsMoreGeneralElementsKindTransition( 1222 IsMoreGeneralElementsKindTransition(
1221 target_receiver_maps.at(0)->elements_kind(), 1223 target_receiver_maps.at(0)->elements_kind(),
1222 receiver->GetElementsKind())) { 1224 receiver->GetElementsKind())) {
1223 return isolate()->stub_cache()->ComputeKeyedLoadElement(receiver_map); 1225 return isolate()->stub_cache()->ComputeKeyedLoadElement(receiver_map);
1224 } 1226 }
1225 1227
1226 ASSERT(target() != *generic_stub()); 1228 ASSERT(ic_state != GENERIC);
1227 1229
1228 // Determine the list of receiver maps that this call site has seen, 1230 // Determine the list of receiver maps that this call site has seen,
1229 // adding the map that was just encountered. 1231 // adding the map that was just encountered.
1230 if (!AddOneReceiverMapIfMissing(&target_receiver_maps, receiver_map)) { 1232 if (!AddOneReceiverMapIfMissing(&target_receiver_maps, receiver_map)) {
1231 // If the miss wasn't due to an unseen map, a polymorphic stub 1233 // If the miss wasn't due to an unseen map, a polymorphic stub
1232 // won't help, use the generic stub. 1234 // won't help, use the generic stub.
1233 TRACE_GENERIC_IC("KeyedIC", "same map added twice"); 1235 TRACE_GENERIC_IC("KeyedIC", "same map added twice");
1234 return generic_stub(); 1236 return generic_stub();
1235 } 1237 }
1236 1238
(...skipping 361 matching lines...) Expand 10 before | Expand all | Expand 10 after
1598 IsMoreGeneralElementsKindTransition( 1600 IsMoreGeneralElementsKindTransition(
1599 target_receiver_maps.at(0)->elements_kind(), 1601 target_receiver_maps.at(0)->elements_kind(),
1600 receiver->GetElementsKind())) { 1602 receiver->GetElementsKind())) {
1601 Handle<Map> monomorphic_map = ComputeTransitionedMap(receiver, stub_kind); 1603 Handle<Map> monomorphic_map = ComputeTransitionedMap(receiver, stub_kind);
1602 ASSERT(*monomorphic_map != *receiver_map); 1604 ASSERT(*monomorphic_map != *receiver_map);
1603 stub_kind = GetNoTransitionStubKind(stub_kind); 1605 stub_kind = GetNoTransitionStubKind(stub_kind);
1604 return isolate()->stub_cache()->ComputeKeyedStoreElement( 1606 return isolate()->stub_cache()->ComputeKeyedStoreElement(
1605 monomorphic_map, stub_kind, strict_mode, grow_mode); 1607 monomorphic_map, stub_kind, strict_mode, grow_mode);
1606 } 1608 }
1607 1609
1608 ASSERT(target() != *generic_stub() && target() != *generic_stub_strict()); 1610 ASSERT(ic_state != GENERIC);
1609 1611
1610 bool map_added = 1612 bool map_added =
1611 AddOneReceiverMapIfMissing(&target_receiver_maps, receiver_map); 1613 AddOneReceiverMapIfMissing(&target_receiver_maps, receiver_map);
1612 1614
1613 if (IsTransitionStubKind(stub_kind)) { 1615 if (IsTransitionStubKind(stub_kind)) {
1614 Handle<Map> new_map = ComputeTransitionedMap(receiver, stub_kind); 1616 Handle<Map> new_map = ComputeTransitionedMap(receiver, stub_kind);
1615 map_added |= AddOneReceiverMapIfMissing(&target_receiver_maps, new_map); 1617 map_added |= AddOneReceiverMapIfMissing(&target_receiver_maps, new_map);
1616 } 1618 }
1617 1619
1618 if (!map_added) { 1620 if (!map_added) {
(...skipping 953 matching lines...) Expand 10 before | Expand all | Expand 10 after
2572 #undef ADDR 2574 #undef ADDR
2573 }; 2575 };
2574 2576
2575 2577
2576 Address IC::AddressFromUtilityId(IC::UtilityId id) { 2578 Address IC::AddressFromUtilityId(IC::UtilityId id) {
2577 return IC_utilities[id]; 2579 return IC_utilities[id];
2578 } 2580 }
2579 2581
2580 2582
2581 } } // namespace v8::internal 2583 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/builtins.h ('k') | src/type-info.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698