Index: src/arm/full-codegen-arm.cc |
diff --git a/src/arm/full-codegen-arm.cc b/src/arm/full-codegen-arm.cc |
index 15bfba3ce61c4454586e6d776833eb975b93109c..009e3bb997979362e6581b71ed8d1e445d019adb 100644 |
--- a/src/arm/full-codegen-arm.cc |
+++ b/src/arm/full-codegen-arm.cc |
@@ -119,6 +119,7 @@ class JumpPatchSite BASE_EMBEDDED { |
// The live registers are: |
// o r1: the JS function object being called (i.e., ourselves) |
// o cp: our context |
+// o pp: our constant pool pointer (if FLAG_enable_ool_constant_pool) |
// o fp: our caller's frame pointer |
// o sp: stack pointer |
// o lr: return address |
@@ -2011,6 +2012,7 @@ void FullCodeGenerator::VisitYield(Yield* expr) { |
__ push(r0); // generator object |
__ CallRuntime(Runtime::kSuspendJSGeneratorObject, 1); |
__ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); |
+ __ RestoreConstantPoolPointer(); |
__ bind(&post_runtime); |
__ pop(result_register()); |
EmitReturnSequence(); |
@@ -2077,6 +2079,7 @@ void FullCodeGenerator::VisitYield(Yield* expr) { |
kLRHasBeenSaved, kDontSaveFPRegs); |
__ CallRuntime(Runtime::kSuspendJSGeneratorObject, 1); |
__ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); |
+ __ RestoreConstantPoolPointer(); |
__ pop(r0); // result |
EmitReturnSequence(); |
__ bind(&l_resume); // received in r0 |
@@ -2093,6 +2096,7 @@ void FullCodeGenerator::VisitYield(Yield* expr) { |
Handle<Code> ic = isolate()->stub_cache()->ComputeKeyedCallInitialize(1); |
CallIC(ic); |
__ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); |
+ __ RestoreConstantPoolPointer(); |
// if (!result.done) goto l_try; |
__ bind(&l_loop); |
@@ -2165,10 +2169,11 @@ void FullCodeGenerator::EmitGeneratorResume(Expression *generator, |
// lr = return address. |
// fp = caller's frame pointer. |
// cp = callee's context, |
+ // pp = callee's constant pool (if FLAG_enable_ool_constant_pool), |
// r4 = callee's JS function. |
- __ Push(lr, fp, cp, r4); |
+ __ PushFixedFrame(r4); |
// Adjust FP to point to saved FP. |
- __ add(fp, sp, Operand(2 * kPointerSize)); |
+ __ add(fp, sp, Operand(StandardFrameConstants::kFixedFrameSizeFromFp)); |
// Load the operand stack size. |
__ ldr(r3, FieldMemOperand(r1, JSGeneratorObject::kOperandStackOffset)); |
@@ -2231,6 +2236,7 @@ void FullCodeGenerator::EmitCreateIteratorResult(bool done) { |
__ CallRuntime(Runtime::kAllocateInNewSpace, 1); |
__ ldr(context_register(), |
MemOperand(fp, StandardFrameConstants::kContextOffset)); |
+ __ RestoreConstantPoolPointer(); |
__ bind(&allocated); |
__ mov(r1, Operand(map)); |
@@ -2616,8 +2622,9 @@ void FullCodeGenerator::EmitCallWithIC(Call* expr, |
isolate()->stub_cache()->ComputeCallInitialize(arg_count, mode); |
CallIC(ic, mode, expr->CallFeedbackId()); |
RecordJSReturnSite(expr); |
- // Restore context register. |
+ // Restore context and pointer pool registers. |
__ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); |
+ __ RestoreConstantPoolPointer(); |
context()->Plug(r0); |
} |
@@ -2649,8 +2656,9 @@ void FullCodeGenerator::EmitKeyedCallWithIC(Call* expr, |
__ ldr(r2, MemOperand(sp, (arg_count + 1) * kPointerSize)); // Key. |
CallIC(ic, RelocInfo::CODE_TARGET, expr->CallFeedbackId()); |
RecordJSReturnSite(expr); |
- // Restore context register. |
+ // Restore context and pointer pool registers. |
__ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); |
+ __ RestoreConstantPoolPointer(); |
context()->DropAndPlug(1, r0); // Drop the key still on the stack. |
} |
@@ -2679,8 +2687,9 @@ void FullCodeGenerator::EmitCallWithStub(Call* expr, CallFunctionFlags flags) { |
__ ldr(r1, MemOperand(sp, (arg_count + 1) * kPointerSize)); |
__ CallStub(&stub, expr->CallFeedbackId()); |
RecordJSReturnSite(expr); |
- // Restore context register. |
+ // Restore context and pointer pool registers. |
__ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); |
+ __ RestoreConstantPoolPointer(); |
context()->DropAndPlug(1, r0); |
} |
@@ -2757,8 +2766,9 @@ void FullCodeGenerator::VisitCall(Call* expr) { |
__ ldr(r1, MemOperand(sp, (arg_count + 1) * kPointerSize)); |
__ CallStub(&stub); |
RecordJSReturnSite(expr); |
- // Restore context register. |
+ // Restore context and pointer pool registers. |
__ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); |
+ __ RestoreConstantPoolPointer(); |
context()->DropAndPlug(1, r0); |
} else if (proxy != NULL && proxy->var()->IsUnallocated()) { |
// Push global object as receiver for the call IC. |
@@ -3752,6 +3762,7 @@ void FullCodeGenerator::EmitCallFunction(CallRuntime* expr) { |
__ InvokeFunction(r1, count, CALL_FUNCTION, |
NullCallWrapper(), CALL_AS_METHOD); |
__ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); |
+ __ RestoreConstantPoolPointer(); |
__ jmp(&done); |
__ bind(&runtime); |
@@ -4166,8 +4177,9 @@ void FullCodeGenerator::VisitCallRuntime(CallRuntime* expr) { |
Handle<Code> ic = |
isolate()->stub_cache()->ComputeCallInitialize(arg_count, mode); |
CallIC(ic, mode, expr->CallRuntimeFeedbackId()); |
- // Restore context register. |
+ // Restore context and pointer pool registers. |
__ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); |
+ __ RestoreConstantPoolPointer(); |
} else { |
// Call the C runtime function. |
__ CallRuntime(expr->function(), arg_count); |