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

Side by Side Diff: runtime/vm/stub_code_ia32.cc

Issue 11299298: Cache lookups at megamorphic call sites in optimized code. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 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 (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/globals.h" 5 #include "vm/globals.h"
6 #if defined(TARGET_ARCH_IA32) 6 #if defined(TARGET_ARCH_IA32)
7 7
8 #include "vm/assembler.h" 8 #include "vm/assembler.h"
9 #include "vm/assembler_macros.h" 9 #include "vm/assembler_macros.h"
10 #include "vm/compiler.h" 10 #include "vm/compiler.h"
(...skipping 546 matching lines...) Expand 10 before | Expand all | Expand 10 after
557 __ pushl(EBX); 557 __ pushl(EBX);
558 GenerateDeoptimizationSequence(assembler, true); // Preserve EAX. 558 GenerateDeoptimizationSequence(assembler, true); // Preserve EAX.
559 } 559 }
560 560
561 561
562 void StubCode::GenerateDeoptimizeStub(Assembler* assembler) { 562 void StubCode::GenerateDeoptimizeStub(Assembler* assembler) {
563 GenerateDeoptimizationSequence(assembler, false); // Don't preserve EAX. 563 GenerateDeoptimizationSequence(assembler, false); // Don't preserve EAX.
564 } 564 }
565 565
566 566
567 void StubCode::GenerateMegamorphicMissStub(Assembler* assembler) {
568 const Immediate raw_null =
569 Immediate(reinterpret_cast<intptr_t>(Instructions::null()));
570 AssemblerMacros::EnterStubFrame(assembler);
571 __ pushl(raw_null); // Space for the result of the runtime call.
572 // Load the receiver into EAX. The argument count in the arguments
573 // descriptor is a smi.
srdjan 2012/12/03 19:10:46 Please document that EDX contains argument descrip
Kevin Millikin (Google) 2012/12/06 14:03:11 OK.
574 __ movl(EAX, FieldAddress(EDX, Array::data_offset()));
575 // Three words in the stack above the last argument.
576 __ movl(EAX, Address(ESP, EAX, TIMES_2, 3 * kWordSize));
577 __ pushl(EAX); // Receiver.
578 __ pushl(ECX); // IC data.
579 __ pushl(EDX); // Arguments descriptor.
580 __ CallRuntime(kMegamorphicCacheMissHandlerRuntimeEntry);
581 __ popl(EDX); // Arguments descriptor.
srdjan 2012/12/03 19:10:46 You need to preserve/restore argument descriptor a
Kevin Millikin (Google) 2012/12/06 14:03:11 Thank you, good catch.
582 __ popl(ECX); // IC data.
583 __ popl(EAX); // Discard.
584 __ popl(EAX); // Return value from the runtime call (instructions).
585 __ LeaveFrame();
srdjan 2012/12/03 19:10:46 null as result should not be possible, should it?
Kevin Millikin (Google) 2012/12/06 14:03:11 No such method, implicit closures.
586
587 Label lookup;
588 __ cmpl(EAX, raw_null);
589 __ j(EQUAL, &lookup, Assembler::kNearJump);
590 __ addl(EAX, Immediate(Instructions::HeaderSize() - kHeapObjectTag));
591 __ jmp(EAX);
592
593 __ Bind(&lookup);
594 __ int3();
Vyacheslav Egorov (Google) 2012/12/03 14:55:22 What's up with this int3? If it can not be reache
Kevin Millikin (Google) 2012/12/06 14:03:11 Thanks for catching it. It's a reminder to myself
595 __ jmp(&StubCode::InstanceFunctionLookupLabel());
596 }
597
598
567 // Called for inline allocation of arrays. 599 // Called for inline allocation of arrays.
568 // Input parameters: 600 // Input parameters:
569 // EDX : Array length as Smi. 601 // EDX : Array length as Smi.
570 // ECX : array element type (either NULL or an instantiated type). 602 // ECX : array element type (either NULL or an instantiated type).
571 // Uses EAX, EBX, ECX, EDI as temporary registers. 603 // Uses EAX, EBX, ECX, EDI as temporary registers.
572 // NOTE: EDX cannot be clobbered here as the caller relies on it being saved. 604 // NOTE: EDX cannot be clobbered here as the caller relies on it being saved.
573 // The newly allocated object is returned in EAX. 605 // The newly allocated object is returned in EAX.
574 void StubCode::GenerateAllocateArrayStub(Assembler* assembler) { 606 void StubCode::GenerateAllocateArrayStub(Assembler* assembler) {
575 Label slow_case; 607 Label slow_case;
576 const Immediate raw_null = 608 const Immediate raw_null =
(...skipping 1635 matching lines...) Expand 10 before | Expand all | Expand 10 after
2212 __ Bind(&done); 2244 __ Bind(&done);
2213 __ popl(temp); 2245 __ popl(temp);
2214 __ popl(right); 2246 __ popl(right);
2215 __ popl(left); 2247 __ popl(left);
2216 __ ret(); 2248 __ ret();
2217 } 2249 }
2218 2250
2219 } // namespace dart 2251 } // namespace dart
2220 2252
2221 #endif // defined TARGET_ARCH_IA32 2253 #endif // defined TARGET_ARCH_IA32
OLDNEW
« runtime/vm/object.cc ('K') | « runtime/vm/stub_code.h ('k') | runtime/vm/stub_code_x64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698