| Index: runtime/vm/stub_code_x64.cc
|
| diff --git a/runtime/vm/stub_code_x64.cc b/runtime/vm/stub_code_x64.cc
|
| index 95874ca8b111a54cd24448d77a231aea04b7faa4..157f7662abf40bd137e2165349220b79b207166b 100644
|
| --- a/runtime/vm/stub_code_x64.cc
|
| +++ b/runtime/vm/stub_code_x64.cc
|
| @@ -96,14 +96,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:
|
| // RSP : points to return address.
|
| // RDI : stop message (const char*).
|
| @@ -119,7 +117,6 @@ void StubCode::GeneratePrintStopMessageStub(Assembler* assembler) {
|
| __ ret();
|
| }
|
|
|
| -
|
| // Input parameters:
|
| // RSP : points to return address.
|
| // RSP + 8 : address of return value.
|
| @@ -192,21 +189,18 @@ static void GenerateCallNativeWithWrapperStub(Assembler* assembler,
|
| __ ret();
|
| }
|
|
|
| -
|
| void StubCode::GenerateCallNoScopeNativeStub(Assembler* assembler) {
|
| GenerateCallNativeWithWrapperStub(
|
| assembler,
|
| Address(THR, Thread::no_scope_native_wrapper_entry_point_offset()));
|
| }
|
|
|
| -
|
| void StubCode::GenerateCallAutoScopeNativeStub(Assembler* assembler) {
|
| GenerateCallNativeWithWrapperStub(
|
| assembler,
|
| Address(THR, Thread::auto_scope_native_wrapper_entry_point_offset()));
|
| }
|
|
|
| -
|
| // Input parameters:
|
| // RSP : points to return address.
|
| // RSP + 8 : address of return value.
|
| @@ -274,7 +268,6 @@ void StubCode::GenerateCallBootstrapNativeStub(Assembler* assembler) {
|
| __ ret();
|
| }
|
|
|
| -
|
| // Input parameters:
|
| // R10: arguments descriptor array.
|
| void StubCode::GenerateCallStaticFunctionStub(Assembler* assembler) {
|
| @@ -292,7 +285,6 @@ void StubCode::GenerateCallStaticFunctionStub(Assembler* assembler) {
|
| __ jmp(RBX);
|
| }
|
|
|
| -
|
| // Called from a static call only when an invalid code has been entered
|
| // (invalid because its function was optimized or deoptimized).
|
| // R10: arguments descriptor array.
|
| @@ -314,7 +306,6 @@ void StubCode::GenerateFixCallersTargetStub(Assembler* assembler) {
|
| __ int3();
|
| }
|
|
|
| -
|
| // Called from object allocate instruction when the allocation stub has been
|
| // disabled.
|
| void StubCode::GenerateFixAllocationStubTargetStub(Assembler* assembler) {
|
| @@ -333,7 +324,6 @@ void StubCode::GenerateFixAllocationStubTargetStub(Assembler* assembler) {
|
| __ int3();
|
| }
|
|
|
| -
|
| // Input parameters:
|
| // R10: smi-tagged argument count, may be zero.
|
| // RBP[kParamEndSlotFromFp + 1]: last argument.
|
| @@ -368,7 +358,6 @@ static void PushArgumentsArray(Assembler* assembler) {
|
| __ j(POSITIVE, &loop, Assembler::kNearJump);
|
| }
|
|
|
| -
|
| // Used by eager and lazy deoptimization. Preserve result in RAX if necessary.
|
| // This stub translates optimized frame into unoptimized frame. The optimized
|
| // frame can contain values in registers and on stack, the unoptimized
|
| @@ -516,7 +505,6 @@ static void GenerateDeoptimizationSequence(Assembler* assembler,
|
| // The caller is responsible for emitting the return instruction.
|
| }
|
|
|
| -
|
| // RAX: result, must be preserved
|
| void StubCode::GenerateDeoptimizeLazyFromReturnStub(Assembler* assembler) {
|
| // Push zap value instead of CODE_REG for lazy deopt.
|
| @@ -528,7 +516,6 @@ void StubCode::GenerateDeoptimizeLazyFromReturnStub(Assembler* assembler) {
|
| __ ret();
|
| }
|
|
|
| -
|
| // RAX: exception, must be preserved
|
| // RDX: stacktrace, must be preserved
|
| void StubCode::GenerateDeoptimizeLazyFromThrowStub(Assembler* assembler) {
|
| @@ -541,13 +528,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");
|
| @@ -584,7 +569,6 @@ static void GenerateDispatcherCode(Assembler* assembler,
|
| __ ret();
|
| }
|
|
|
| -
|
| void StubCode::GenerateMegamorphicMissStub(Assembler* assembler) {
|
| __ EnterStubFrame();
|
| // Load the receiver into RAX. The argument count in the arguments
|
| @@ -623,7 +607,6 @@ void StubCode::GenerateMegamorphicMissStub(Assembler* assembler) {
|
| __ jmp(RCX);
|
| }
|
|
|
| -
|
| // Called for inline allocation of arrays.
|
| // Input parameters:
|
| // R10 : Array length as Smi.
|
| @@ -756,7 +739,6 @@ void StubCode::GenerateAllocateArrayStub(Assembler* assembler) {
|
| __ ret();
|
| }
|
|
|
| -
|
| // Called when invoking Dart code from C++ (VM code).
|
| // Input parameters:
|
| // RSP : points to return address.
|
| @@ -888,7 +870,6 @@ void StubCode::GenerateInvokeDartCodeStub(Assembler* assembler) {
|
| __ ret();
|
| }
|
|
|
| -
|
| // Called for inline allocation of contexts.
|
| // Input:
|
| // R10: number of context variables.
|
| @@ -1018,7 +999,6 @@ void StubCode::GenerateAllocateContextStub(Assembler* assembler) {
|
| __ ret();
|
| }
|
|
|
| -
|
| // Helper stub to implement Assembler::StoreIntoObject.
|
| // Input parameters:
|
| // RDX: Address being stored
|
| @@ -1083,7 +1063,6 @@ void StubCode::GenerateUpdateStoreBufferStub(Assembler* assembler) {
|
| __ ret();
|
| }
|
|
|
| -
|
| // Called for inline allocation of objects.
|
| // Input parameters:
|
| // RSP + 8 : type arguments object (only if class is parameterized).
|
| @@ -1211,7 +1190,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.
|
| @@ -1248,7 +1226,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) {
|
| @@ -1270,7 +1247,6 @@ void StubCode::GenerateOptimizedUsageCounterIncrement(Assembler* assembler) {
|
| __ incl(FieldAddress(func_reg, Function::usage_counter_offset()));
|
| }
|
|
|
| -
|
| // Loads function into 'temp_reg', preserves 'ic_reg'.
|
| void StubCode::GenerateUsageCounterIncrement(Assembler* assembler,
|
| Register temp_reg) {
|
| @@ -1284,7 +1260,6 @@ void StubCode::GenerateUsageCounterIncrement(Assembler* assembler,
|
| }
|
| }
|
|
|
| -
|
| // Note: RBX 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
|
| @@ -1355,7 +1330,6 @@ static void EmitFastSmiOp(Assembler* assembler,
|
| __ ret();
|
| }
|
|
|
| -
|
| // Generate inline cache check for 'num_args'.
|
| // RBX: Inline cache data object.
|
| // TOS(0): return address
|
| @@ -1523,7 +1497,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).
|
| // RBX: Inline cache data object.
|
| @@ -1540,7 +1513,6 @@ void StubCode::GenerateOneArgCheckInlineCacheStub(Assembler* assembler) {
|
| assembler, 1, kInlineCacheMissHandlerOneArgRuntimeEntry, Token::kILLEGAL);
|
| }
|
|
|
| -
|
| void StubCode::GenerateTwoArgsCheckInlineCacheStub(Assembler* assembler) {
|
| GenerateUsageCounterIncrement(assembler, RCX);
|
| GenerateNArgsCheckInlineCacheStub(assembler, 2,
|
| @@ -1548,28 +1520,24 @@ void StubCode::GenerateTwoArgsCheckInlineCacheStub(Assembler* assembler) {
|
| Token::kILLEGAL);
|
| }
|
|
|
| -
|
| void StubCode::GenerateSmiAddInlineCacheStub(Assembler* assembler) {
|
| GenerateUsageCounterIncrement(assembler, RCX);
|
| GenerateNArgsCheckInlineCacheStub(
|
| assembler, 2, kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kADD);
|
| }
|
|
|
| -
|
| void StubCode::GenerateSmiSubInlineCacheStub(Assembler* assembler) {
|
| GenerateUsageCounterIncrement(assembler, RCX);
|
| GenerateNArgsCheckInlineCacheStub(
|
| assembler, 2, kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kSUB);
|
| }
|
|
|
| -
|
| void StubCode::GenerateSmiEqualInlineCacheStub(Assembler* assembler) {
|
| GenerateUsageCounterIncrement(assembler, RCX);
|
| 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).
|
| // RDI: function which counter needs to be incremented.
|
| @@ -1589,7 +1557,6 @@ void StubCode::GenerateOneArgOptimizedCheckInlineCacheStub(
|
| Token::kILLEGAL, true /* optimized */);
|
| }
|
|
|
| -
|
| void StubCode::GenerateTwoArgsOptimizedCheckInlineCacheStub(
|
| Assembler* assembler) {
|
| GenerateOptimizedUsageCounterIncrement(assembler);
|
| @@ -1598,7 +1565,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.
|
| // RBX: ICData
|
| @@ -1668,21 +1634,18 @@ void StubCode::GenerateZeroArgsUnoptimizedStaticCallStub(Assembler* assembler) {
|
| }
|
| }
|
|
|
| -
|
| void StubCode::GenerateOneArgUnoptimizedStaticCallStub(Assembler* assembler) {
|
| GenerateUsageCounterIncrement(assembler, RCX);
|
| GenerateNArgsCheckInlineCacheStub(
|
| assembler, 1, kStaticCallMissHandlerOneArgRuntimeEntry, Token::kILLEGAL);
|
| }
|
|
|
| -
|
| void StubCode::GenerateTwoArgsUnoptimizedStaticCallStub(Assembler* assembler) {
|
| GenerateUsageCounterIncrement(assembler, RCX);
|
| GenerateNArgsCheckInlineCacheStub(
|
| assembler, 2, kStaticCallMissHandlerTwoArgsRuntimeEntry, Token::kILLEGAL);
|
| }
|
|
|
| -
|
| // Stub for compiling a function and jumping to the compiled code.
|
| // RCX: IC-Data (for methods).
|
| // R10: Arguments descriptor.
|
| @@ -1703,7 +1666,6 @@ void StubCode::GenerateLazyCompileStub(Assembler* assembler) {
|
| __ jmp(RAX);
|
| }
|
|
|
| -
|
| // RBX: Contains an ICData.
|
| // TOS(0): return address (Dart code).
|
| void StubCode::GenerateICCallBreakpointStub(Assembler* assembler) {
|
| @@ -1719,7 +1681,6 @@ void StubCode::GenerateICCallBreakpointStub(Assembler* assembler) {
|
| __ jmp(RAX); // Jump to original stub.
|
| }
|
|
|
| -
|
| // TOS(0): return address (Dart code).
|
| void StubCode::GenerateRuntimeCallBreakpointStub(Assembler* assembler) {
|
| __ EnterStubFrame();
|
| @@ -1732,7 +1693,6 @@ void StubCode::GenerateRuntimeCallBreakpointStub(Assembler* assembler) {
|
| __ jmp(RAX); // Jump to original stub.
|
| }
|
|
|
| -
|
| // Called only from unoptimized code.
|
| void StubCode::GenerateDebugStepCheckStub(Assembler* assembler) {
|
| // Check single stepping.
|
| @@ -1751,7 +1711,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).
|
| @@ -1843,7 +1802,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.
|
| @@ -1855,7 +1813,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.
|
| @@ -1867,7 +1824,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).
|
| @@ -1879,7 +1835,6 @@ void StubCode::GenerateSubtype4TestCacheStub(Assembler* assembler) {
|
| GenerateSubtypeNTestCacheStub(assembler, 4);
|
| }
|
|
|
| -
|
| // Return the current stack pointer address, used to stack alignment
|
| // checks.
|
| // TOS + 0: return address
|
| @@ -1889,7 +1844,6 @@ void StubCode::GenerateGetCStackPointerStub(Assembler* assembler) {
|
| __ ret();
|
| }
|
|
|
| -
|
| // Jump to a frame on the call stack.
|
| // TOS + 0: return address
|
| // Arg1: program counter
|
| @@ -1911,7 +1865,6 @@ void StubCode::GenerateJumpToFrameStub(Assembler* assembler) {
|
| __ jmp(CallingConventions::kArg1Reg); // Jump to program counter.
|
| }
|
|
|
| -
|
| // Run an exception handler. Execution comes from JumpToFrame stub.
|
| //
|
| // The arguments are stored in the Thread object.
|
| @@ -1935,7 +1888,6 @@ void StubCode::GenerateRunExceptionHandlerStub(Assembler* assembler) {
|
| __ jmp(CallingConventions::kArg1Reg); // Jump to continuation point.
|
| }
|
|
|
| -
|
| // Deoptimize a frame on the call stack before rewinding.
|
| // The arguments are stored in the Thread object.
|
| // No result.
|
| @@ -1954,7 +1906,6 @@ void StubCode::GenerateDeoptForRewindStub(Assembler* assembler) {
|
| __ int3();
|
| }
|
|
|
| -
|
| // Calls to the runtime to optimize the given function.
|
| // RDI: function to be reoptimized.
|
| // R10: argument descriptor (preserved).
|
| @@ -1974,7 +1925,6 @@ void StubCode::GenerateOptimizeFunctionStub(Assembler* assembler) {
|
| __ int3();
|
| }
|
|
|
| -
|
| // Does identical check (object references are equal or not equal) with special
|
| // checks for boxed numbers.
|
| // Left and right are pushed on stack.
|
| @@ -2031,7 +1981,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.
|
| @@ -2067,7 +2016,6 @@ void StubCode::GenerateUnoptimizedIdenticalWithNumberCheckStub(
|
| }
|
| }
|
|
|
| -
|
| // Called from optimized code only.
|
| // TOS + 0: return address
|
| // TOS + 1: right argument.
|
| @@ -2084,7 +2032,6 @@ void StubCode::GenerateOptimizedIdenticalWithNumberCheckStub(
|
| __ ret();
|
| }
|
|
|
| -
|
| // Called from megamorphic calls.
|
| // RDI: receiver
|
| // RBX: MegamorphicCache (preserved)
|
| @@ -2155,7 +2102,6 @@ void StubCode::GenerateMegamorphicCallStub(Assembler* assembler) {
|
| __ jmp(&cid_loaded);
|
| }
|
|
|
| -
|
| // Called from switchable IC calls.
|
| // RDI: receiver
|
| // RBX: ICData (preserved)
|
| @@ -2198,7 +2144,6 @@ void StubCode::GenerateICCallThroughFunctionStub(Assembler* assembler) {
|
| __ jmp(RCX);
|
| }
|
|
|
| -
|
| void StubCode::GenerateICCallThroughCodeStub(Assembler* assembler) {
|
| Label loop, found, miss;
|
| __ movq(R13, FieldAddress(RBX, ICData::ic_data_offset()));
|
| @@ -2235,7 +2180,6 @@ void StubCode::GenerateICCallThroughCodeStub(Assembler* assembler) {
|
| __ jmp(RCX);
|
| }
|
|
|
| -
|
| // RDI: receiver
|
| // RBX: UnlinkedCall
|
| void StubCode::GenerateUnlinkedCallStub(Assembler* assembler) {
|
| @@ -2258,7 +2202,6 @@ void StubCode::GenerateUnlinkedCallStub(Assembler* assembler) {
|
| __ jmp(RCX);
|
| }
|
|
|
| -
|
| // Called from switchable IC calls.
|
| // RDI: receiver
|
| // RBX: SingleTargetCache
|
| @@ -2295,7 +2238,6 @@ void StubCode::GenerateSingleTargetCallStub(Assembler* assembler) {
|
| __ jmp(RCX);
|
| }
|
|
|
| -
|
| // Called from the monomorphic checked entry.
|
| // RDI: receiver
|
| void StubCode::GenerateMonomorphicMissStub(Assembler* assembler) {
|
| @@ -2317,12 +2259,10 @@ void StubCode::GenerateMonomorphicMissStub(Assembler* assembler) {
|
| __ jmp(RCX);
|
| }
|
|
|
| -
|
| void StubCode::GenerateFrameAwaitingMaterializationStub(Assembler* assembler) {
|
| __ int3();
|
| }
|
|
|
| -
|
| void StubCode::GenerateAsynchronousGapMarkerStub(Assembler* assembler) {
|
| __ int3();
|
| }
|
|
|