| Index: runtime/vm/stub_code_arm.cc
|
| ===================================================================
|
| --- runtime/vm/stub_code_arm.cc (revision 30114)
|
| +++ runtime/vm/stub_code_arm.cc (working copy)
|
| @@ -39,8 +39,9 @@
|
| const intptr_t argc_tag_offset = NativeArguments::argc_tag_offset();
|
| const intptr_t argv_offset = NativeArguments::argv_offset();
|
| const intptr_t retval_offset = NativeArguments::retval_offset();
|
| + const intptr_t exitframe_last_param_slot_from_fp = 1;
|
|
|
| - __ EnterStubFrame();
|
| + __ EnterFrame((1 << FP) | (1 << LR), 0);
|
|
|
| // Load current Isolate pointer from Context structure into R0.
|
| __ ldr(R0, FieldAddress(CTX, Context::isolate_offset()));
|
| @@ -74,7 +75,7 @@
|
| ASSERT(argv_offset == 2 * kWordSize);
|
| __ add(R2, FP, ShifterOperand(R4, LSL, 2)); // Compute argv.
|
| // Set argv in NativeArguments.
|
| - __ AddImmediate(R2, kParamEndSlotFromFp * kWordSize);
|
| + __ AddImmediate(R2, exitframe_last_param_slot_from_fp * kWordSize);
|
|
|
| ASSERT(retval_offset == 3 * kWordSize);
|
| __ add(R3, R2, ShifterOperand(kWordSize)); // Retval is next to 1st argument.
|
| @@ -96,7 +97,7 @@
|
| // Cache Context pointer into CTX while executing Dart code.
|
| __ mov(CTX, ShifterOperand(R2));
|
|
|
| - __ LeaveStubFrame();
|
| + __ LeaveFrame((1 << FP) | (1 << LR));
|
| __ Ret();
|
| }
|
|
|
| @@ -780,7 +781,7 @@
|
| // R3 : new context containing the current isolate pointer.
|
| void StubCode::GenerateInvokeDartCodeStub(Assembler* assembler) {
|
| // Save frame pointer coming in.
|
| - __ EnterStubFrame();
|
| + __ EnterFrame((1 << FP) | (1 << LR), 0);
|
|
|
| // Save new context and C++ ABI callee-saved registers.
|
| const intptr_t kNewContextOffsetFromFp =
|
| @@ -792,6 +793,11 @@
|
| // Save FPU registers. 2 D registers per Q register.
|
| __ vstmd(DB_W, SP, firstd, 2 * kAbiPreservedFpuRegCount);
|
|
|
| + // We now load the pool pointer(PP) as we are about to invoke dart code and we
|
| + // could potentially invoke some intrinsic functions which need the PP to be
|
| + // set up.
|
| + __ LoadPoolPointer();
|
| +
|
| // The new Context structure contains a pointer to the current Isolate
|
| // structure. Cache the Context pointer in the CTX register so that it is
|
| // available in generated code and calls to Isolate::Current() need not be
|
| @@ -877,7 +883,7 @@
|
| __ PopList((1 << R3) | kAbiPreservedCpuRegs); // Ignore restored R3.
|
|
|
| // Restore the frame pointer and return.
|
| - __ LeaveStubFrame();
|
| + __ LeaveFrame((1 << FP) | (1 << LR));
|
| __ Ret();
|
| }
|
|
|
| @@ -1223,7 +1229,7 @@
|
| __ Pop(R0); // Pop result (newly allocated object).
|
| // R0: new object
|
| // Restore the frame pointer.
|
| - __ LeaveStubFrame(true);
|
| + __ LeaveStubFrame();
|
| __ Ret();
|
| }
|
|
|
| @@ -1332,7 +1338,7 @@
|
| // R2: new object still missing its heap tag.
|
| __ add(R0, R2, ShifterOperand(kHeapObjectTag));
|
| // R0: new object.
|
| - __ LeaveStubFrame(true);
|
| + __ LeaveStubFrame();
|
| __ Ret();
|
|
|
| __ Bind(&slow_case);
|
| @@ -1362,7 +1368,7 @@
|
| __ Pop(R0);
|
| // R0: new object
|
| // Restore the frame pointer.
|
| - __ LeaveStubFrame(true);
|
| + __ LeaveStubFrame();
|
| __ Ret();
|
| }
|
|
|
| @@ -2081,7 +2087,7 @@
|
| __ b(&reference_compare, NE);
|
| __ CompareClassId(right, kBigintCid, temp);
|
| __ b(&done, NE);
|
| - __ EnterStubFrame(0);
|
| + __ EnterStubFrame();
|
| __ ReserveAlignedFrameSpace(2 * kWordSize);
|
| __ stm(IA, SP, (1 << R0) | (1 << R1));
|
| __ CallRuntime(kBigintCompareRuntimeEntry, 2);
|
|
|