| Index: runtime/vm/stub_code_ia32.cc
|
| diff --git a/runtime/vm/stub_code_ia32.cc b/runtime/vm/stub_code_ia32.cc
|
| index 240d1fd19025736ee9315d29a9c07ba5141e1557..1d6ee7c81e4a2eb0c6b96655e0517ed3ca2e1110 100644
|
| --- a/runtime/vm/stub_code_ia32.cc
|
| +++ b/runtime/vm/stub_code_ia32.cc
|
| @@ -9,8 +9,8 @@
|
| #include "vm/compiler.h"
|
| #include "vm/dart_entry.h"
|
| #include "vm/flow_graph_compiler.h"
|
| -#include "vm/instructions.h"
|
| #include "vm/heap.h"
|
| +#include "vm/instructions.h"
|
| #include "vm/object_store.h"
|
| #include "vm/resolver.h"
|
| #include "vm/scavenger.h"
|
| @@ -18,7 +18,6 @@
|
| #include "vm/stub_code.h"
|
| #include "vm/tags.h"
|
|
|
| -
|
| #define __ assembler->
|
|
|
| namespace dart {
|
| @@ -93,14 +92,12 @@ void StubCode::GenerateCallToRuntimeStub(Assembler* assembler) {
|
| __ ret();
|
| }
|
|
|
| -
|
| // Print the stop message.
|
| DEFINE_LEAF_RUNTIME_ENTRY(void, PrintStopMessage, 1, const char* message) {
|
| OS::Print("Stop message: %s\n", message);
|
| }
|
| END_LEAF_RUNTIME_ENTRY
|
|
|
| -
|
| // Input parameters:
|
| // ESP : points to return address.
|
| // EAX : stop message (const char*).
|
| @@ -113,7 +110,6 @@ void StubCode::GeneratePrintStopMessageStub(Assembler* assembler) {
|
| __ ret();
|
| }
|
|
|
| -
|
| // Input parameters:
|
| // ESP : points to return address.
|
| // ESP + 4 : address of return value.
|
| @@ -135,7 +131,6 @@ static void GenerateCallNativeWithWrapperStub(Assembler* assembler,
|
|
|
| __ EnterFrame(0);
|
|
|
| -
|
| // Save exit frame information to enable stack walking as we are about
|
| // to transition to dart VM code.
|
| __ movl(Address(THR, Thread::top_exit_frame_info_offset()), EBP);
|
| @@ -184,19 +179,16 @@ static void GenerateCallNativeWithWrapperStub(Assembler* assembler,
|
| __ ret();
|
| }
|
|
|
| -
|
| void StubCode::GenerateCallNoScopeNativeStub(Assembler* assembler) {
|
| ExternalLabel wrapper(NativeEntry::NoScopeNativeCallWrapperEntry());
|
| GenerateCallNativeWithWrapperStub(assembler, &wrapper);
|
| }
|
|
|
| -
|
| void StubCode::GenerateCallAutoScopeNativeStub(Assembler* assembler) {
|
| ExternalLabel wrapper(NativeEntry::AutoScopeNativeCallWrapperEntry());
|
| GenerateCallNativeWithWrapperStub(assembler, &wrapper);
|
| }
|
|
|
| -
|
| // Input parameters:
|
| // ESP : points to return address.
|
| // ESP + 4 : address of return value.
|
| @@ -261,7 +253,6 @@ void StubCode::GenerateCallBootstrapNativeStub(Assembler* assembler) {
|
| __ ret();
|
| }
|
|
|
| -
|
| // Input parameters:
|
| // EDX: arguments descriptor array.
|
| void StubCode::GenerateCallStaticFunctionStub(Assembler* assembler) {
|
| @@ -278,7 +269,6 @@ void StubCode::GenerateCallStaticFunctionStub(Assembler* assembler) {
|
| __ jmp(ECX);
|
| }
|
|
|
| -
|
| // Called from a static call only when an invalid code has been entered
|
| // (invalid because its function was optimized or deoptimized).
|
| // EDX: arguments descriptor array.
|
| @@ -297,7 +287,6 @@ void StubCode::GenerateFixCallersTargetStub(Assembler* assembler) {
|
| __ int3();
|
| }
|
|
|
| -
|
| // Called from object allocate instruction when the allocation stub has been
|
| // disabled.
|
| void StubCode::GenerateFixAllocationStubTargetStub(Assembler* assembler) {
|
| @@ -311,7 +300,6 @@ void StubCode::GenerateFixAllocationStubTargetStub(Assembler* assembler) {
|
| __ int3();
|
| }
|
|
|
| -
|
| // Input parameters:
|
| // EDX: smi-tagged argument count, may be zero.
|
| // EBP[kParamEndSlotFromFp + 1]: last argument.
|
| @@ -343,7 +331,6 @@ static void PushArgumentsArray(Assembler* assembler) {
|
| __ j(POSITIVE, &loop, Assembler::kNearJump);
|
| }
|
|
|
| -
|
| // Used by eager and lazy deoptimization. Preserve result in EAX if necessary.
|
| // This stub translates optimized frame into unoptimized frame. The optimized
|
| // frame can contain values in registers and on stack, the unoptimized
|
| @@ -475,7 +462,6 @@ static void GenerateDeoptimizationSequence(Assembler* assembler,
|
| // The caller is responsible for emitting the return instruction.
|
| }
|
|
|
| -
|
| // EAX: result, must be preserved
|
| void StubCode::GenerateDeoptimizeLazyFromReturnStub(Assembler* assembler) {
|
| // Return address for "call" to deopt stub.
|
| @@ -484,7 +470,6 @@ void StubCode::GenerateDeoptimizeLazyFromReturnStub(Assembler* assembler) {
|
| __ ret();
|
| }
|
|
|
| -
|
| // EAX: exception, must be preserved
|
| // EDX: stacktrace, must be preserved
|
| void StubCode::GenerateDeoptimizeLazyFromThrowStub(Assembler* assembler) {
|
| @@ -494,13 +479,11 @@ void StubCode::GenerateDeoptimizeLazyFromThrowStub(Assembler* assembler) {
|
| __ ret();
|
| }
|
|
|
| -
|
| void StubCode::GenerateDeoptimizeStub(Assembler* assembler) {
|
| GenerateDeoptimizationSequence(assembler, kEagerDeopt);
|
| __ ret();
|
| }
|
|
|
| -
|
| static void GenerateDispatcherCode(Assembler* assembler,
|
| Label* call_target_function) {
|
| __ Comment("NoSuchMethodDispatch");
|
| @@ -539,7 +522,6 @@ static void GenerateDispatcherCode(Assembler* assembler,
|
| __ ret();
|
| }
|
|
|
| -
|
| void StubCode::GenerateMegamorphicMissStub(Assembler* assembler) {
|
| __ EnterStubFrame();
|
| // Load the receiver into EAX. The argument count in the arguments
|
| @@ -576,7 +558,6 @@ void StubCode::GenerateMegamorphicMissStub(Assembler* assembler) {
|
| __ jmp(EBX);
|
| }
|
|
|
| -
|
| // Called for inline allocation of arrays.
|
| // Input parameters:
|
| // EDX : Array length as Smi (must be preserved).
|
| @@ -714,7 +695,6 @@ void StubCode::GenerateAllocateArrayStub(Assembler* assembler) {
|
| __ ret();
|
| }
|
|
|
| -
|
| // Called when invoking dart code from C++ (VM code).
|
| // Input parameters:
|
| // ESP : points to return address.
|
| @@ -824,7 +804,6 @@ void StubCode::GenerateInvokeDartCodeStub(Assembler* assembler) {
|
| __ ret();
|
| }
|
|
|
| -
|
| // Called for inline allocation of contexts.
|
| // Input:
|
| // EDX: number of context variables.
|
| @@ -955,7 +934,6 @@ void StubCode::GenerateAllocateContextStub(Assembler* assembler) {
|
| __ ret();
|
| }
|
|
|
| -
|
| // Helper stub to implement Assembler::StoreIntoObject.
|
| // Input parameters:
|
| // EDX: Address being stored
|
| @@ -1023,7 +1001,6 @@ void StubCode::GenerateUpdateStoreBufferStub(Assembler* assembler) {
|
| __ ret();
|
| }
|
|
|
| -
|
| // Called for inline allocation of objects.
|
| // Input parameters:
|
| // ESP + 4 : type arguments object (only if class is parameterized).
|
| @@ -1151,7 +1128,6 @@ void StubCode::GenerateAllocationStubForClass(Assembler* assembler,
|
| __ ret();
|
| }
|
|
|
| -
|
| // Called for invoking "dynamic noSuchMethod(Invocation invocation)" function
|
| // from the entry code of a dart function after an error in passed argument
|
| // name or number is detected.
|
| @@ -1189,7 +1165,6 @@ void StubCode::GenerateCallClosureNoSuchMethodStub(Assembler* assembler) {
|
| __ int3();
|
| }
|
|
|
| -
|
| // Cannot use function object from ICData as it may be the inlined
|
| // function and not the top-scope function.
|
| void StubCode::GenerateOptimizedUsageCounterIncrement(Assembler* assembler) {
|
| @@ -1211,7 +1186,6 @@ void StubCode::GenerateOptimizedUsageCounterIncrement(Assembler* assembler) {
|
| __ incl(FieldAddress(func_reg, Function::usage_counter_offset()));
|
| }
|
|
|
| -
|
| // Loads function into 'temp_reg'.
|
| void StubCode::GenerateUsageCounterIncrement(Assembler* assembler,
|
| Register temp_reg) {
|
| @@ -1225,7 +1199,6 @@ void StubCode::GenerateUsageCounterIncrement(Assembler* assembler,
|
| }
|
| }
|
|
|
| -
|
| // Note: ECX must be preserved.
|
| // Attempt a quick Smi operation for known operations ('kind'). The ICData
|
| // must have been primed with a Smi/Smi check that will be used for counting
|
| @@ -1299,7 +1272,6 @@ static void EmitFastSmiOp(Assembler* assembler,
|
| __ ret();
|
| }
|
|
|
| -
|
| // Generate inline cache check for 'num_args'.
|
| // ECX: Inline cache data object.
|
| // TOS(0): return address
|
| @@ -1400,7 +1372,7 @@ void StubCode::GenerateNArgsCheckInlineCacheStub(
|
| __ movl(EDI, Address(ESP, EAX, TIMES_2, -kWordSize));
|
| __ LoadTaggedClassIdMayBeSmi(EDI, EDI);
|
| __ cmpl(EDI, Address(EBX, kWordSize)); // Class id match?
|
| - __ j(EQUAL, &found); // Break.
|
| + __ j(EQUAL, &found); // Break.
|
|
|
| __ Bind(&update);
|
| __ addl(EBX, Immediate(entry_size)); // Next entry.
|
| @@ -1476,7 +1448,6 @@ void StubCode::GenerateNArgsCheckInlineCacheStub(
|
| }
|
| }
|
|
|
| -
|
| // Use inline cache data array to invoke the target or continue in inline
|
| // cache miss handler. Stub for 1-argument check (receiver class).
|
| // ECX: Inline cache data object.
|
| @@ -1493,7 +1464,6 @@ void StubCode::GenerateOneArgCheckInlineCacheStub(Assembler* assembler) {
|
| assembler, 1, kInlineCacheMissHandlerOneArgRuntimeEntry, Token::kILLEGAL);
|
| }
|
|
|
| -
|
| void StubCode::GenerateTwoArgsCheckInlineCacheStub(Assembler* assembler) {
|
| GenerateUsageCounterIncrement(assembler, EBX);
|
| GenerateNArgsCheckInlineCacheStub(assembler, 2,
|
| @@ -1501,28 +1471,24 @@ void StubCode::GenerateTwoArgsCheckInlineCacheStub(Assembler* assembler) {
|
| Token::kILLEGAL);
|
| }
|
|
|
| -
|
| void StubCode::GenerateSmiAddInlineCacheStub(Assembler* assembler) {
|
| GenerateUsageCounterIncrement(assembler, EBX);
|
| GenerateNArgsCheckInlineCacheStub(
|
| assembler, 2, kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kADD);
|
| }
|
|
|
| -
|
| void StubCode::GenerateSmiSubInlineCacheStub(Assembler* assembler) {
|
| GenerateUsageCounterIncrement(assembler, EBX);
|
| GenerateNArgsCheckInlineCacheStub(
|
| assembler, 2, kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kSUB);
|
| }
|
|
|
| -
|
| void StubCode::GenerateSmiEqualInlineCacheStub(Assembler* assembler) {
|
| GenerateUsageCounterIncrement(assembler, EBX);
|
| GenerateNArgsCheckInlineCacheStub(
|
| assembler, 2, kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kEQ);
|
| }
|
|
|
| -
|
| // Use inline cache data array to invoke the target or continue in inline
|
| // cache miss handler. Stub for 1-argument check (receiver class).
|
| // EDI: function which counter needs to be incremented.
|
| @@ -1542,7 +1508,6 @@ void StubCode::GenerateOneArgOptimizedCheckInlineCacheStub(
|
| Token::kILLEGAL, true /* optimized */);
|
| }
|
|
|
| -
|
| void StubCode::GenerateTwoArgsOptimizedCheckInlineCacheStub(
|
| Assembler* assembler) {
|
| GenerateOptimizedUsageCounterIncrement(assembler);
|
| @@ -1551,7 +1516,6 @@ void StubCode::GenerateTwoArgsOptimizedCheckInlineCacheStub(
|
| Token::kILLEGAL, true /* optimized */);
|
| }
|
|
|
| -
|
| // Intermediary stub between a static call and its target. ICData contains
|
| // the target function and the call count.
|
| // ECX: ICData
|
| @@ -1613,21 +1577,18 @@ void StubCode::GenerateZeroArgsUnoptimizedStaticCallStub(Assembler* assembler) {
|
| }
|
| }
|
|
|
| -
|
| void StubCode::GenerateOneArgUnoptimizedStaticCallStub(Assembler* assembler) {
|
| GenerateUsageCounterIncrement(assembler, EBX);
|
| GenerateNArgsCheckInlineCacheStub(
|
| assembler, 1, kStaticCallMissHandlerOneArgRuntimeEntry, Token::kILLEGAL);
|
| }
|
|
|
| -
|
| void StubCode::GenerateTwoArgsUnoptimizedStaticCallStub(Assembler* assembler) {
|
| GenerateUsageCounterIncrement(assembler, EBX);
|
| GenerateNArgsCheckInlineCacheStub(
|
| assembler, 2, kStaticCallMissHandlerTwoArgsRuntimeEntry, Token::kILLEGAL);
|
| }
|
|
|
| -
|
| // Stub for compiling a function and jumping to the compiled code.
|
| // ECX: IC-Data (for methods).
|
| // EDX: Arguments descriptor.
|
| @@ -1647,7 +1608,6 @@ void StubCode::GenerateLazyCompileStub(Assembler* assembler) {
|
| __ jmp(EAX);
|
| }
|
|
|
| -
|
| // ECX: Contains an ICData.
|
| void StubCode::GenerateICCallBreakpointStub(Assembler* assembler) {
|
| __ EnterStubFrame();
|
| @@ -1665,7 +1625,6 @@ void StubCode::GenerateICCallBreakpointStub(Assembler* assembler) {
|
| __ jmp(EAX);
|
| }
|
|
|
| -
|
| void StubCode::GenerateRuntimeCallBreakpointStub(Assembler* assembler) {
|
| __ EnterStubFrame();
|
| // Room for result. Debugger stub returns address of the
|
| @@ -1679,7 +1638,6 @@ void StubCode::GenerateRuntimeCallBreakpointStub(Assembler* assembler) {
|
| __ jmp(EAX);
|
| }
|
|
|
| -
|
| // Called only from unoptimized code.
|
| void StubCode::GenerateDebugStepCheckStub(Assembler* assembler) {
|
| // Check single stepping.
|
| @@ -1698,7 +1656,6 @@ void StubCode::GenerateDebugStepCheckStub(Assembler* assembler) {
|
| __ jmp(&done_stepping, Assembler::kNearJump);
|
| }
|
|
|
| -
|
| // Used to check class and type arguments. Arguments passed on stack:
|
| // TOS + 0: return address.
|
| // TOS + 1: function type arguments (only if n == 4, can be raw_null).
|
| @@ -1791,7 +1748,6 @@ static void GenerateSubtypeNTestCacheStub(Assembler* assembler, int n) {
|
| __ ret();
|
| }
|
|
|
| -
|
| // Used to check class and type arguments. Arguments passed on stack:
|
| // TOS + 0: return address.
|
| // TOS + 1: raw_null.
|
| @@ -1803,7 +1759,6 @@ void StubCode::GenerateSubtype1TestCacheStub(Assembler* assembler) {
|
| GenerateSubtypeNTestCacheStub(assembler, 1);
|
| }
|
|
|
| -
|
| // Used to check class and type arguments. Arguments passed on stack:
|
| // TOS + 0: return address.
|
| // TOS + 1: raw_null.
|
| @@ -1815,7 +1770,6 @@ void StubCode::GenerateSubtype2TestCacheStub(Assembler* assembler) {
|
| GenerateSubtypeNTestCacheStub(assembler, 2);
|
| }
|
|
|
| -
|
| // Used to check class and type arguments. Arguments passed on stack:
|
| // TOS + 0: return address.
|
| // TOS + 1: function type arguments (can be raw_null).
|
| @@ -1827,7 +1781,6 @@ void StubCode::GenerateSubtype4TestCacheStub(Assembler* assembler) {
|
| GenerateSubtypeNTestCacheStub(assembler, 4);
|
| }
|
|
|
| -
|
| // Return the current stack pointer address, used to do stack alignment checks.
|
| // TOS + 0: return address
|
| // Result in EAX.
|
| @@ -1836,7 +1789,6 @@ void StubCode::GenerateGetCStackPointerStub(Assembler* assembler) {
|
| __ ret();
|
| }
|
|
|
| -
|
| // Jump to a frame on the call stack.
|
| // TOS + 0: return address
|
| // TOS + 1: program_counter
|
| @@ -1856,7 +1808,6 @@ void StubCode::GenerateJumpToFrameStub(Assembler* assembler) {
|
| __ jmp(EBX); // Jump to the exception handler code.
|
| }
|
|
|
| -
|
| // Run an exception handler. Execution comes from JumpToFrame stub.
|
| //
|
| // The arguments are stored in the Thread object.
|
| @@ -1879,7 +1830,6 @@ void StubCode::GenerateRunExceptionHandlerStub(Assembler* assembler) {
|
| __ jmp(EBX); // Jump to continuation point.
|
| }
|
|
|
| -
|
| // Deoptimize a frame on the call stack before rewinding.
|
| // The arguments are stored in the Thread object.
|
| // No result.
|
| @@ -1895,7 +1845,6 @@ void StubCode::GenerateDeoptForRewindStub(Assembler* assembler) {
|
| __ int3();
|
| }
|
|
|
| -
|
| // Calls to the runtime to optimize the given function.
|
| // EBX: function to be reoptimized.
|
| // EDX: argument descriptor (preserved).
|
| @@ -1915,7 +1864,6 @@ void StubCode::GenerateOptimizeFunctionStub(Assembler* assembler) {
|
| __ int3();
|
| }
|
|
|
| -
|
| // Does identical check (object references are equal or not equal) with special
|
| // checks for boxed numbers.
|
| // Return ZF set.
|
| @@ -1978,7 +1926,6 @@ static void GenerateIdenticalWithNumberCheckStub(Assembler* assembler,
|
| __ Bind(&done);
|
| }
|
|
|
| -
|
| // Called only from unoptimized code. All relevant registers have been saved.
|
| // TOS + 0: return address
|
| // TOS + 1: right argument.
|
| @@ -2013,7 +1960,6 @@ void StubCode::GenerateUnoptimizedIdenticalWithNumberCheckStub(
|
| }
|
| }
|
|
|
| -
|
| // Called from optimized code only.
|
| // TOS + 0: return address
|
| // TOS + 1: right argument.
|
| @@ -2030,7 +1976,6 @@ void StubCode::GenerateOptimizedIdenticalWithNumberCheckStub(
|
| __ ret();
|
| }
|
|
|
| -
|
| // Called from megamorphic calls.
|
| // EBX: receiver
|
| // ECX: MegamorphicCache (preserved)
|
| @@ -2110,32 +2055,26 @@ void StubCode::GenerateICCallThroughFunctionStub(Assembler* assembler) {
|
| __ int3();
|
| }
|
|
|
| -
|
| void StubCode::GenerateICCallThroughCodeStub(Assembler* assembler) {
|
| __ int3();
|
| }
|
|
|
| -
|
| void StubCode::GenerateUnlinkedCallStub(Assembler* assembler) {
|
| __ int3();
|
| }
|
|
|
| -
|
| void StubCode::GenerateSingleTargetCallStub(Assembler* assembler) {
|
| __ int3();
|
| }
|
|
|
| -
|
| void StubCode::GenerateMonomorphicMissStub(Assembler* assembler) {
|
| __ int3();
|
| }
|
|
|
| -
|
| void StubCode::GenerateFrameAwaitingMaterializationStub(Assembler* assembler) {
|
| __ int3();
|
| }
|
|
|
| -
|
| void StubCode::GenerateAsynchronousGapMarkerStub(Assembler* assembler) {
|
| __ int3();
|
| }
|
|
|