Index: src/arm/code-stubs-arm.cc |
=================================================================== |
--- src/arm/code-stubs-arm.cc (revision 6213) |
+++ src/arm/code-stubs-arm.cc (working copy) |
@@ -2704,9 +2704,24 @@ |
// this by performing a garbage collection and retrying the |
// builtin once. |
+ // r0 is argc. |
+ // Compute callee's stack pointer before making changes and save it as |
+ // ip register so that it is restored as sp register on exit, thereby |
+ // popping the args. |
+ |
+ // ip = sp + kPointerSize * #args; |
+ __ add(ip, sp, Operand(r0, LSL, kPointerSizeLog2)); |
+ |
+ // Compute the argv pointer and keep it in a callee-saved register. |
+ __ sub(r6, ip, Operand(kPointerSize)); |
+ |
// Enter the exit frame that transitions from JavaScript to C++. |
- __ EnterExitFrame(save_doubles_); |
+ __ EnterExitFrame(save_doubles_, 5); // 5 pending pushes before call to C. |
+ // Setup argc and the builtin function in callee-saved registers. |
+ __ mov(r4, Operand(r0)); |
+ __ mov(r5, Operand(r1)); |
+ |
// r4: number of arguments (C callee-saved) |
// r5: pointer to builtin function (C callee-saved) |
// r6: pointer to first argument (C callee-saved) |
@@ -4981,6 +4996,9 @@ |
__ Jump(r2); |
} |
+void DirectCEntryStub::Generate(MacroAssembler* masm) { |
+ __ ldr(pc, MemOperand(fp, ExitFrameConstants::kPCOffset)); |
+} |
#undef __ |