| Index: runtime/vm/stub_code_arm.cc
|
| diff --git a/runtime/vm/stub_code_arm.cc b/runtime/vm/stub_code_arm.cc
|
| index 14fe95c825941b3af74f1d20de70111b6b6f4d30..c94c9a134b41c0a7cb1245a5735d967383b8ed0f 100644
|
| --- a/runtime/vm/stub_code_arm.cc
|
| +++ b/runtime/vm/stub_code_arm.cc
|
| @@ -103,14 +103,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:
|
| // R0 : stop message (const char*).
|
| // Must preserve all registers.
|
| @@ -122,7 +120,6 @@ void StubCode::GeneratePrintStopMessageStub(Assembler* assembler) {
|
| __ Ret();
|
| }
|
|
|
| -
|
| // Input parameters:
|
| // LR : return address.
|
| // SP : address of return value.
|
| @@ -205,21 +202,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:
|
| // LR : return address.
|
| // SP : address of return value.
|
| @@ -298,7 +292,6 @@ void StubCode::GenerateCallBootstrapNativeStub(Assembler* assembler) {
|
| __ Ret();
|
| }
|
|
|
| -
|
| // Input parameters:
|
| // R4: arguments descriptor array.
|
| void StubCode::GenerateCallStaticFunctionStub(Assembler* assembler) {
|
| @@ -319,7 +312,6 @@ void StubCode::GenerateCallStaticFunctionStub(Assembler* assembler) {
|
| __ bx(R0);
|
| }
|
|
|
| -
|
| // Called from a static call only when an invalid code has been entered
|
| // (invalid because its function was optimized or deoptimized).
|
| // R4: arguments descriptor array.
|
| @@ -345,7 +337,6 @@ void StubCode::GenerateFixCallersTargetStub(Assembler* assembler) {
|
| __ bx(R0);
|
| }
|
|
|
| -
|
| // Called from object allocate instruction when the allocation stub has been
|
| // disabled.
|
| void StubCode::GenerateFixAllocationStubTargetStub(Assembler* assembler) {
|
| @@ -368,7 +359,6 @@ void StubCode::GenerateFixAllocationStubTargetStub(Assembler* assembler) {
|
| __ bx(R0);
|
| }
|
|
|
| -
|
| // Input parameters:
|
| // R2: smi-tagged argument count, may be zero.
|
| // FP[kParamEndSlotFromFp + 1]: last argument.
|
| @@ -398,7 +388,6 @@ static void PushArgumentsArray(Assembler* assembler) {
|
| __ b(&loop, PL);
|
| }
|
|
|
| -
|
| // Used by eager and lazy deoptimization. Preserve result in R0 if necessary.
|
| // This stub translates optimized frame into unoptimized frame. The optimized
|
| // frame can contain values in registers and on stack, the unoptimized
|
| @@ -555,7 +544,6 @@ static void GenerateDeoptimizationSequence(Assembler* assembler,
|
| // The caller is responsible for emitting the return instruction.
|
| }
|
|
|
| -
|
| // R0: result, must be preserved
|
| void StubCode::GenerateDeoptimizeLazyFromReturnStub(Assembler* assembler) {
|
| // Push zap value instead of CODE_REG for lazy deopt.
|
| @@ -568,7 +556,6 @@ void StubCode::GenerateDeoptimizeLazyFromReturnStub(Assembler* assembler) {
|
| __ Ret();
|
| }
|
|
|
| -
|
| // R0: exception, must be preserved
|
| // R1: stacktrace, must be preserved
|
| void StubCode::GenerateDeoptimizeLazyFromThrowStub(Assembler* assembler) {
|
| @@ -582,13 +569,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");
|
| @@ -622,7 +607,6 @@ static void GenerateDispatcherCode(Assembler* assembler,
|
| __ Ret();
|
| }
|
|
|
| -
|
| void StubCode::GenerateMegamorphicMissStub(Assembler* assembler) {
|
| __ EnterStubFrame();
|
|
|
| @@ -662,7 +646,6 @@ void StubCode::GenerateMegamorphicMissStub(Assembler* assembler) {
|
| __ bx(R2);
|
| }
|
|
|
| -
|
| // Called for inline allocation of arrays.
|
| // Input parameters:
|
| // LR: return address.
|
| @@ -785,7 +768,6 @@ void StubCode::GenerateAllocateArrayStub(Assembler* assembler) {
|
| __ Ret();
|
| }
|
|
|
| -
|
| // Called when invoking Dart code from C++ (VM code).
|
| // Input parameters:
|
| // LR : points to return address.
|
| @@ -906,7 +888,6 @@ void StubCode::GenerateInvokeDartCodeStub(Assembler* assembler) {
|
| __ Ret();
|
| }
|
|
|
| -
|
| // Called for inline allocation of contexts.
|
| // Input:
|
| // R1: number of context variables.
|
| @@ -1028,7 +1009,6 @@ void StubCode::GenerateAllocateContextStub(Assembler* assembler) {
|
| __ Ret();
|
| }
|
|
|
| -
|
| // Helper stub to implement Assembler::StoreIntoObject.
|
| // Input parameters:
|
| // R0: address (i.e. object) being stored into.
|
| @@ -1101,7 +1081,6 @@ void StubCode::GenerateUpdateStoreBufferStub(Assembler* assembler) {
|
| __ Ret();
|
| }
|
|
|
| -
|
| // Called for inline allocation of objects.
|
| // Input parameters:
|
| // LR : return address.
|
| @@ -1238,7 +1217,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.
|
| @@ -1274,7 +1252,6 @@ void StubCode::GenerateCallClosureNoSuchMethodStub(Assembler* assembler) {
|
| __ bkpt(0);
|
| }
|
|
|
| -
|
| // R8: function object.
|
| // R9: inline cache data object.
|
| // Cannot use function object from ICData as it may be the inlined
|
| @@ -1297,7 +1274,6 @@ void StubCode::GenerateOptimizedUsageCounterIncrement(Assembler* assembler) {
|
| __ str(NOTFP, FieldAddress(func_reg, Function::usage_counter_offset()));
|
| }
|
|
|
| -
|
| // Loads function into 'temp_reg'.
|
| void StubCode::GenerateUsageCounterIncrement(Assembler* assembler,
|
| Register temp_reg) {
|
| @@ -1313,7 +1289,6 @@ void StubCode::GenerateUsageCounterIncrement(Assembler* assembler,
|
| }
|
| }
|
|
|
| -
|
| // Note: R9 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
|
| @@ -1377,7 +1352,6 @@ static void EmitFastSmiOp(Assembler* assembler,
|
| __ Ret();
|
| }
|
|
|
| -
|
| // Generate inline cache check for 'num_args'.
|
| // LR: return address.
|
| // R9: inline cache data object.
|
| @@ -1552,7 +1526,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).
|
| // LR: return address.
|
| @@ -1569,7 +1542,6 @@ void StubCode::GenerateOneArgCheckInlineCacheStub(Assembler* assembler) {
|
| assembler, 1, kInlineCacheMissHandlerOneArgRuntimeEntry, Token::kILLEGAL);
|
| }
|
|
|
| -
|
| void StubCode::GenerateTwoArgsCheckInlineCacheStub(Assembler* assembler) {
|
| GenerateUsageCounterIncrement(assembler, R8);
|
| GenerateNArgsCheckInlineCacheStub(assembler, 2,
|
| @@ -1577,28 +1549,24 @@ void StubCode::GenerateTwoArgsCheckInlineCacheStub(Assembler* assembler) {
|
| Token::kILLEGAL);
|
| }
|
|
|
| -
|
| void StubCode::GenerateSmiAddInlineCacheStub(Assembler* assembler) {
|
| GenerateUsageCounterIncrement(assembler, R8);
|
| GenerateNArgsCheckInlineCacheStub(
|
| assembler, 2, kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kADD);
|
| }
|
|
|
| -
|
| void StubCode::GenerateSmiSubInlineCacheStub(Assembler* assembler) {
|
| GenerateUsageCounterIncrement(assembler, R8);
|
| GenerateNArgsCheckInlineCacheStub(
|
| assembler, 2, kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kSUB);
|
| }
|
|
|
| -
|
| void StubCode::GenerateSmiEqualInlineCacheStub(Assembler* assembler) {
|
| GenerateUsageCounterIncrement(assembler, R8);
|
| GenerateNArgsCheckInlineCacheStub(
|
| assembler, 2, kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kEQ);
|
| }
|
|
|
| -
|
| void StubCode::GenerateOneArgOptimizedCheckInlineCacheStub(
|
| Assembler* assembler) {
|
| GenerateOptimizedUsageCounterIncrement(assembler);
|
| @@ -1607,7 +1575,6 @@ void StubCode::GenerateOneArgOptimizedCheckInlineCacheStub(
|
| Token::kILLEGAL, true /* optimized */);
|
| }
|
|
|
| -
|
| void StubCode::GenerateTwoArgsOptimizedCheckInlineCacheStub(
|
| Assembler* assembler) {
|
| GenerateOptimizedUsageCounterIncrement(assembler);
|
| @@ -1616,7 +1583,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.
|
| // R9: ICData
|
| @@ -1683,21 +1649,18 @@ void StubCode::GenerateZeroArgsUnoptimizedStaticCallStub(Assembler* assembler) {
|
| }
|
| }
|
|
|
| -
|
| void StubCode::GenerateOneArgUnoptimizedStaticCallStub(Assembler* assembler) {
|
| GenerateUsageCounterIncrement(assembler, R8);
|
| GenerateNArgsCheckInlineCacheStub(
|
| assembler, 1, kStaticCallMissHandlerOneArgRuntimeEntry, Token::kILLEGAL);
|
| }
|
|
|
| -
|
| void StubCode::GenerateTwoArgsUnoptimizedStaticCallStub(Assembler* assembler) {
|
| GenerateUsageCounterIncrement(assembler, R8);
|
| GenerateNArgsCheckInlineCacheStub(
|
| assembler, 2, kStaticCallMissHandlerTwoArgsRuntimeEntry, Token::kILLEGAL);
|
| }
|
|
|
| -
|
| // Stub for compiling a function and jumping to the compiled code.
|
| // R9: IC-Data (for methods).
|
| // R4: Arguments descriptor.
|
| @@ -1717,7 +1680,6 @@ void StubCode::GenerateLazyCompileStub(Assembler* assembler) {
|
| __ bx(R2);
|
| }
|
|
|
| -
|
| // R9: Contains an ICData.
|
| void StubCode::GenerateICCallBreakpointStub(Assembler* assembler) {
|
| __ EnterStubFrame();
|
| @@ -1732,7 +1694,6 @@ void StubCode::GenerateICCallBreakpointStub(Assembler* assembler) {
|
| __ bx(R0);
|
| }
|
|
|
| -
|
| void StubCode::GenerateRuntimeCallBreakpointStub(Assembler* assembler) {
|
| __ EnterStubFrame();
|
| __ LoadImmediate(R0, 0);
|
| @@ -1745,7 +1706,6 @@ void StubCode::GenerateRuntimeCallBreakpointStub(Assembler* assembler) {
|
| __ bx(R0);
|
| }
|
|
|
| -
|
| // Called only from unoptimized code. All relevant registers have been saved.
|
| void StubCode::GenerateDebugStepCheckStub(Assembler* assembler) {
|
| // Check single stepping.
|
| @@ -1764,7 +1724,6 @@ void StubCode::GenerateDebugStepCheckStub(Assembler* assembler) {
|
| __ b(&done_stepping);
|
| }
|
|
|
| -
|
| // Used to check class and type arguments. Arguments passed in registers:
|
| // LR: return address.
|
| // R0: instance (must be preserved).
|
| @@ -1850,7 +1809,6 @@ static void GenerateSubtypeNTestCacheStub(Assembler* assembler, int n) {
|
| __ Ret();
|
| }
|
|
|
| -
|
| // Used to check class and type arguments. Arguments passed in registers:
|
| // LR: return address.
|
| // R0: instance (must be preserved).
|
| @@ -1862,7 +1820,6 @@ void StubCode::GenerateSubtype1TestCacheStub(Assembler* assembler) {
|
| GenerateSubtypeNTestCacheStub(assembler, 1);
|
| }
|
|
|
| -
|
| // Used to check class and type arguments. Arguments passed in registers:
|
| // LR: return address.
|
| // R0: instance (must be preserved).
|
| @@ -1874,7 +1831,6 @@ void StubCode::GenerateSubtype2TestCacheStub(Assembler* assembler) {
|
| GenerateSubtypeNTestCacheStub(assembler, 2);
|
| }
|
|
|
| -
|
| // Used to check class and type arguments. Arguments passed in registers:
|
| // LR: return address.
|
| // R0: instance (must be preserved).
|
| @@ -1886,14 +1842,12 @@ void StubCode::GenerateSubtype4TestCacheStub(Assembler* assembler) {
|
| GenerateSubtypeNTestCacheStub(assembler, 4);
|
| }
|
|
|
| -
|
| // Return the current stack pointer address, used to do stack alignment checks.
|
| void StubCode::GenerateGetCStackPointerStub(Assembler* assembler) {
|
| __ mov(R0, Operand(SP));
|
| __ Ret();
|
| }
|
|
|
| -
|
| // Jump to a frame on the call stack.
|
| // LR: return address.
|
| // R0: program_counter.
|
| @@ -1904,11 +1858,11 @@ void StubCode::GenerateGetCStackPointerStub(Assembler* assembler) {
|
| void StubCode::GenerateJumpToFrameStub(Assembler* assembler) {
|
| ASSERT(kExceptionObjectReg == R0);
|
| ASSERT(kStackTraceObjectReg == R1);
|
| - __ mov(IP, Operand(R1)); // Copy Stack pointer into IP.
|
| - __ mov(LR, Operand(R0)); // Program counter.
|
| - __ mov(THR, Operand(R3)); // Thread.
|
| - __ mov(FP, Operand(R2)); // Frame_pointer.
|
| - __ mov(SP, Operand(IP)); // Set Stack pointer.
|
| + __ mov(IP, Operand(R1)); // Copy Stack pointer into IP.
|
| + __ mov(LR, Operand(R0)); // Program counter.
|
| + __ mov(THR, Operand(R3)); // Thread.
|
| + __ mov(FP, Operand(R2)); // Frame_pointer.
|
| + __ mov(SP, Operand(IP)); // Set Stack pointer.
|
| // Set the tag.
|
| __ LoadImmediate(R2, VMTag::kDartTagId);
|
| __ StoreToOffset(kWord, R2, THR, Thread::vm_tag_offset());
|
| @@ -1921,7 +1875,6 @@ void StubCode::GenerateJumpToFrameStub(Assembler* assembler) {
|
| __ bx(LR); // Jump to continuation point.
|
| }
|
|
|
| -
|
| // Run an exception handler. Execution comes from JumpToFrame
|
| // stub or from the simulator.
|
| //
|
| @@ -1942,7 +1895,6 @@ void StubCode::GenerateRunExceptionHandlerStub(Assembler* assembler) {
|
| __ bx(LR); // Jump to the exception handler code.
|
| }
|
|
|
| -
|
| // Deoptimize a frame on the call stack before rewinding.
|
| // The arguments are stored in the Thread object.
|
| // No result.
|
| @@ -1962,7 +1914,6 @@ void StubCode::GenerateDeoptForRewindStub(Assembler* assembler) {
|
| __ bkpt(0);
|
| }
|
|
|
| -
|
| // Calls to the runtime to optimize the given function.
|
| // R8: function to be reoptimized.
|
| // R4: argument descriptor (preserved).
|
| @@ -1983,7 +1934,6 @@ void StubCode::GenerateOptimizeFunctionStub(Assembler* assembler) {
|
| __ bkpt(0);
|
| }
|
|
|
| -
|
| // Does identical check (object references are equal or not equal) with special
|
| // checks for boxed numbers.
|
| // LR: return address.
|
| @@ -2050,7 +2000,6 @@ static void GenerateIdenticalWithNumberCheckStub(Assembler* assembler,
|
| __ Bind(&done);
|
| }
|
|
|
| -
|
| // Called only from unoptimized code. All relevant registers have been saved.
|
| // LR: return address.
|
| // SP + 4: left operand.
|
| @@ -2086,7 +2035,6 @@ void StubCode::GenerateUnoptimizedIdenticalWithNumberCheckStub(
|
| }
|
| }
|
|
|
| -
|
| // Called from optimized code only.
|
| // LR: return address.
|
| // SP + 4: left operand.
|
| @@ -2103,7 +2051,6 @@ void StubCode::GenerateOptimizedIdenticalWithNumberCheckStub(
|
| __ Ret();
|
| }
|
|
|
| -
|
| // Called from megamorphic calls.
|
| // R0: receiver
|
| // R9: MegamorphicCache (preserved)
|
| @@ -2158,7 +2105,6 @@ void StubCode::GenerateMegamorphicCallStub(Assembler* assembler) {
|
| __ b(&loop);
|
| }
|
|
|
| -
|
| // Called from switchable IC calls.
|
| // R0: receiver
|
| // R9: ICData (preserved)
|
| @@ -2199,7 +2145,6 @@ void StubCode::GenerateICCallThroughFunctionStub(Assembler* assembler) {
|
| __ bx(R1);
|
| }
|
|
|
| -
|
| void StubCode::GenerateICCallThroughCodeStub(Assembler* assembler) {
|
| Label loop, found, miss;
|
| __ ldr(R4, FieldAddress(R9, ICData::arguments_descriptor_offset()));
|
| @@ -2234,7 +2179,6 @@ void StubCode::GenerateICCallThroughCodeStub(Assembler* assembler) {
|
| __ bx(R1);
|
| }
|
|
|
| -
|
| // Called from switchable IC calls.
|
| // R0: receiver
|
| // R9: UnlinkedCall
|
| @@ -2258,7 +2202,6 @@ void StubCode::GenerateUnlinkedCallStub(Assembler* assembler) {
|
| __ bx(R1);
|
| }
|
|
|
| -
|
| // Called from switchable IC calls.
|
| // R0: receiver
|
| // R9: SingleTargetCache
|
| @@ -2298,7 +2241,6 @@ void StubCode::GenerateSingleTargetCallStub(Assembler* assembler) {
|
| __ bx(R1);
|
| }
|
|
|
| -
|
| // Called from the monomorphic checked entry.
|
| // R0: receiver
|
| void StubCode::GenerateMonomorphicMissStub(Assembler* assembler) {
|
| @@ -2321,12 +2263,10 @@ void StubCode::GenerateMonomorphicMissStub(Assembler* assembler) {
|
| __ bx(R1);
|
| }
|
|
|
| -
|
| void StubCode::GenerateFrameAwaitingMaterializationStub(Assembler* assembler) {
|
| __ bkpt(0);
|
| }
|
|
|
| -
|
| void StubCode::GenerateAsynchronousGapMarkerStub(Assembler* assembler) {
|
| __ bkpt(0);
|
| }
|
|
|