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

Side by Side Diff: src/stub-cache.h

Issue 7869009: Remove in-loop tracking for call ICs. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 9 years, 3 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/runtime.cc ('k') | src/stub-cache.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 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 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 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
187 187
188 MUST_USE_RESULT MaybeObject* ComputeKeyedLoadOrStoreElement( 188 MUST_USE_RESULT MaybeObject* ComputeKeyedLoadOrStoreElement(
189 JSObject* receiver, 189 JSObject* receiver,
190 bool is_store, 190 bool is_store,
191 StrictModeFlag strict_mode); 191 StrictModeFlag strict_mode);
192 192
193 // --- 193 // ---
194 194
195 MUST_USE_RESULT MaybeObject* ComputeCallField( 195 MUST_USE_RESULT MaybeObject* ComputeCallField(
196 int argc, 196 int argc,
197 InLoopFlag in_loop,
198 Code::Kind, 197 Code::Kind,
199 Code::ExtraICState extra_ic_state, 198 Code::ExtraICState extra_ic_state,
200 String* name, 199 String* name,
201 Object* object, 200 Object* object,
202 JSObject* holder, 201 JSObject* holder,
203 int index); 202 int index);
204 203
205 MUST_USE_RESULT MaybeObject* ComputeCallConstant( 204 MUST_USE_RESULT MaybeObject* ComputeCallConstant(
206 int argc, 205 int argc,
207 InLoopFlag in_loop,
208 Code::Kind, 206 Code::Kind,
209 Code::ExtraICState extra_ic_state, 207 Code::ExtraICState extra_ic_state,
210 String* name, 208 String* name,
211 Object* object, 209 Object* object,
212 JSObject* holder, 210 JSObject* holder,
213 JSFunction* function); 211 JSFunction* function);
214 212
215 MUST_USE_RESULT MaybeObject* ComputeCallNormal( 213 MUST_USE_RESULT MaybeObject* ComputeCallNormal(
216 int argc, 214 int argc,
217 InLoopFlag in_loop,
218 Code::Kind, 215 Code::Kind,
219 Code::ExtraICState extra_ic_state, 216 Code::ExtraICState extra_ic_state,
220 String* name, 217 String* name,
221 JSObject* receiver); 218 JSObject* receiver);
222 219
223 MUST_USE_RESULT MaybeObject* ComputeCallInterceptor( 220 MUST_USE_RESULT MaybeObject* ComputeCallInterceptor(
224 int argc, 221 int argc,
225 Code::Kind, 222 Code::Kind,
226 Code::ExtraICState extra_ic_state, 223 Code::ExtraICState extra_ic_state,
227 String* name, 224 String* name,
228 Object* object, 225 Object* object,
229 JSObject* holder); 226 JSObject* holder);
230 227
231 MUST_USE_RESULT MaybeObject* ComputeCallGlobal( 228 MUST_USE_RESULT MaybeObject* ComputeCallGlobal(
232 int argc, 229 int argc,
233 InLoopFlag in_loop,
234 Code::Kind, 230 Code::Kind,
235 Code::ExtraICState extra_ic_state, 231 Code::ExtraICState extra_ic_state,
236 String* name, 232 String* name,
237 JSObject* receiver, 233 JSObject* receiver,
238 GlobalObject* holder, 234 GlobalObject* holder,
239 JSGlobalPropertyCell* cell, 235 JSGlobalPropertyCell* cell,
240 JSFunction* function); 236 JSFunction* function);
241 237
242 // --- 238 // ---
243 239
244 MUST_USE_RESULT MaybeObject* ComputeCallInitialize(int argc, 240 MUST_USE_RESULT MaybeObject* ComputeCallInitialize(int argc,
245 InLoopFlag in_loop,
246 RelocInfo::Mode mode, 241 RelocInfo::Mode mode,
247 Code::Kind kind); 242 Code::Kind kind);
248 243
249 Handle<Code> ComputeCallInitialize(int argc, 244 Handle<Code> ComputeCallInitialize(int argc,
250 InLoopFlag in_loop,
251 RelocInfo::Mode mode); 245 RelocInfo::Mode mode);
252 246
253 Handle<Code> ComputeKeyedCallInitialize(int argc, InLoopFlag in_loop); 247 Handle<Code> ComputeKeyedCallInitialize(int argc);
254 248
255 MUST_USE_RESULT MaybeObject* ComputeCallPreMonomorphic( 249 MUST_USE_RESULT MaybeObject* ComputeCallPreMonomorphic(
256 int argc, 250 int argc,
257 InLoopFlag in_loop,
258 Code::Kind kind, 251 Code::Kind kind,
259 Code::ExtraICState extra_ic_state); 252 Code::ExtraICState extra_ic_state);
260 253
261 MUST_USE_RESULT MaybeObject* ComputeCallNormal(int argc, 254 MUST_USE_RESULT MaybeObject* ComputeCallNormal(int argc,
262 InLoopFlag in_loop,
263 Code::Kind kind, 255 Code::Kind kind,
264 Code::ExtraICState state); 256 Code::ExtraICState state);
265 257
266 MUST_USE_RESULT MaybeObject* ComputeCallArguments(int argc, 258 MUST_USE_RESULT MaybeObject* ComputeCallArguments(int argc,
267 InLoopFlag in_loop,
268 Code::Kind kind); 259 Code::Kind kind);
269 260
270 MUST_USE_RESULT MaybeObject* ComputeCallMegamorphic(int argc, 261 MUST_USE_RESULT MaybeObject* ComputeCallMegamorphic(int argc,
271 InLoopFlag in_loop,
272 Code::Kind kind, 262 Code::Kind kind,
273 Code::ExtraICState state); 263 Code::ExtraICState state);
274 264
275 MUST_USE_RESULT MaybeObject* ComputeCallMiss(int argc, 265 MUST_USE_RESULT MaybeObject* ComputeCallMiss(int argc,
276 Code::Kind kind, 266 Code::Kind kind,
277 Code::ExtraICState state); 267 Code::ExtraICState state);
278 268
279 // Finds the Code object stored in the Heap::non_monomorphic_cache(). 269 // Finds the Code object stored in the Heap::non_monomorphic_cache().
280 MUST_USE_RESULT Code* FindCallInitialize(int argc, 270 MUST_USE_RESULT Code* FindCallInitialize(int argc,
281 InLoopFlag in_loop,
282 RelocInfo::Mode mode, 271 RelocInfo::Mode mode,
283 Code::Kind kind); 272 Code::Kind kind);
284 273
285 #ifdef ENABLE_DEBUGGER_SUPPORT 274 #ifdef ENABLE_DEBUGGER_SUPPORT
286 MUST_USE_RESULT MaybeObject* ComputeCallDebugBreak(int argc, Code::Kind kind); 275 MUST_USE_RESULT MaybeObject* ComputeCallDebugBreak(int argc, Code::Kind kind);
287 276
288 MUST_USE_RESULT MaybeObject* ComputeCallDebugPrepareStepIn(int argc, 277 MUST_USE_RESULT MaybeObject* ComputeCallDebugPrepareStepIn(int argc,
289 Code::Kind kind); 278 Code::Kind kind);
290 #endif 279 #endif
291 280
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
372 (static_cast<uint32_t>(flags) & ~Code::kFlagsNotUsedInLookup); 361 (static_cast<uint32_t>(flags) & ~Code::kFlagsNotUsedInLookup);
373 // Base the offset on a simple combination of name, flags, and map. 362 // Base the offset on a simple combination of name, flags, and map.
374 uint32_t key = (map_low32bits + field) ^ iflags; 363 uint32_t key = (map_low32bits + field) ^ iflags;
375 return key & ((kPrimaryTableSize - 1) << kHeapObjectTagSize); 364 return key & ((kPrimaryTableSize - 1) << kHeapObjectTagSize);
376 } 365 }
377 366
378 static int SecondaryOffset(String* name, Code::Flags flags, int seed) { 367 static int SecondaryOffset(String* name, Code::Flags flags, int seed) {
379 // Use the seed from the primary cache in the secondary cache. 368 // Use the seed from the primary cache in the secondary cache.
380 uint32_t string_low32bits = 369 uint32_t string_low32bits =
381 static_cast<uint32_t>(reinterpret_cast<uintptr_t>(name)); 370 static_cast<uint32_t>(reinterpret_cast<uintptr_t>(name));
382 // We always set the in_loop bit to zero when generating the lookup code 371 uint32_t key = seed - string_low32bits + flags;
383 // so do it here too so the hash codes match.
384 uint32_t iflags =
385 (static_cast<uint32_t>(flags) & ~Code::ICInLoopField::kMask);
386 uint32_t key = seed - string_low32bits + iflags;
387 return key & ((kSecondaryTableSize - 1) << kHeapObjectTagSize); 372 return key & ((kSecondaryTableSize - 1) << kHeapObjectTagSize);
388 } 373 }
389 374
390 // Compute the entry for a given offset in exactly the same way as 375 // Compute the entry for a given offset in exactly the same way as
391 // we do in generated code. We generate an hash code that already 376 // we do in generated code. We generate an hash code that already
392 // ends in String::kHashShift 0s. Then we shift it so it is a multiple 377 // ends in String::kHashShift 0s. Then we shift it so it is a multiple
393 // of sizeof(Entry). This makes it easier to avoid making mistakes 378 // of sizeof(Entry). This makes it easier to avoid making mistakes
394 // in the hashed offset computations. 379 // in the hashed offset computations.
395 static Entry* entry(Entry* table, int offset) { 380 static Entry* entry(Entry* table, int offset) {
396 const int shift_amount = kPointerSizeLog2 + 1 - String::kHashShift; 381 const int shift_amount = kPointerSizeLog2 + 1 - String::kHashShift;
(...skipping 351 matching lines...) Expand 10 before | Expand all | Expand 10 after
748 V(StringFromCharCode) \ 733 V(StringFromCharCode) \
749 V(MathFloor) \ 734 V(MathFloor) \
750 V(MathAbs) 735 V(MathAbs)
751 736
752 737
753 class CallOptimization; 738 class CallOptimization;
754 739
755 class CallStubCompiler: public StubCompiler { 740 class CallStubCompiler: public StubCompiler {
756 public: 741 public:
757 CallStubCompiler(int argc, 742 CallStubCompiler(int argc,
758 InLoopFlag in_loop,
759 Code::Kind kind, 743 Code::Kind kind,
760 Code::ExtraICState extra_ic_state, 744 Code::ExtraICState extra_ic_state,
761 InlineCacheHolderFlag cache_holder); 745 InlineCacheHolderFlag cache_holder);
762 746
763 MUST_USE_RESULT MaybeObject* CompileCallField( 747 MUST_USE_RESULT MaybeObject* CompileCallField(
764 JSObject* object, 748 JSObject* object,
765 JSObject* holder, 749 JSObject* holder,
766 int index, 750 int index,
767 String* name); 751 String* name);
768 752
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
808 792
809 MUST_USE_RESULT MaybeObject* CompileFastApiCall( 793 MUST_USE_RESULT MaybeObject* CompileFastApiCall(
810 const CallOptimization& optimization, 794 const CallOptimization& optimization,
811 Object* object, 795 Object* object,
812 JSObject* holder, 796 JSObject* holder,
813 JSGlobalPropertyCell* cell, 797 JSGlobalPropertyCell* cell,
814 JSFunction* function, 798 JSFunction* function,
815 String* name); 799 String* name);
816 800
817 const ParameterCount arguments_; 801 const ParameterCount arguments_;
818 const InLoopFlag in_loop_;
819 const Code::Kind kind_; 802 const Code::Kind kind_;
820 const Code::ExtraICState extra_ic_state_; 803 const Code::ExtraICState extra_ic_state_;
821 const InlineCacheHolderFlag cache_holder_; 804 const InlineCacheHolderFlag cache_holder_;
822 805
823 const ParameterCount& arguments() { return arguments_; } 806 const ParameterCount& arguments() { return arguments_; }
824 807
825 MUST_USE_RESULT MaybeObject* GetCode(PropertyType type, String* name); 808 MUST_USE_RESULT MaybeObject* GetCode(PropertyType type, String* name);
826 809
827 // Convenience function. Calls GetCode above passing 810 // Convenience function. Calls GetCode above passing
828 // CONSTANT_FUNCTION type and the name of the given function. 811 // CONSTANT_FUNCTION type and the name of the given function.
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
903 JSFunction* constant_function_; 886 JSFunction* constant_function_;
904 bool is_simple_api_call_; 887 bool is_simple_api_call_;
905 FunctionTemplateInfo* expected_receiver_type_; 888 FunctionTemplateInfo* expected_receiver_type_;
906 CallHandlerInfo* api_call_info_; 889 CallHandlerInfo* api_call_info_;
907 }; 890 };
908 891
909 892
910 } } // namespace v8::internal 893 } } // namespace v8::internal
911 894
912 #endif // V8_STUB_CACHE_H_ 895 #endif // V8_STUB_CACHE_H_
OLDNEW
« no previous file with comments | « src/runtime.cc ('k') | src/stub-cache.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698