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(); |
} |