| Index: src/arm/macro-assembler-arm.cc
|
| ===================================================================
|
| --- src/arm/macro-assembler-arm.cc (revision 3007)
|
| +++ src/arm/macro-assembler-arm.cc (working copy)
|
| @@ -291,27 +291,8 @@
|
|
|
| // Align the stack at this point. After this point we have 5 pushes,
|
| // so in fact we have to unalign here! See also the assert on the
|
| - // alignment immediately below.
|
| -#if defined(V8_HOST_ARCH_ARM)
|
| - // Running on the real platform. Use the alignment as mandated by the local
|
| - // environment.
|
| - // Note: This will break if we ever start generating snapshots on one ARM
|
| - // platform for another ARM platform with a different alignment.
|
| - int activation_frame_alignment = OS::ActivationFrameAlignment();
|
| -#else // defined(V8_HOST_ARCH_ARM)
|
| - // If we are using the simulator then we should always align to the expected
|
| - // alignment. As the simulator is used to generate snapshots we do not know
|
| - // if the target platform will need alignment, so we will always align at
|
| - // this point here.
|
| - int activation_frame_alignment = 2 * kPointerSize;
|
| -#endif // defined(V8_HOST_ARCH_ARM)
|
| - if (activation_frame_alignment != kPointerSize) {
|
| - // This code needs to be made more general if this assert doesn't hold.
|
| - ASSERT(activation_frame_alignment == 2 * kPointerSize);
|
| - mov(r7, Operand(Smi::FromInt(0)));
|
| - tst(sp, Operand(activation_frame_alignment - 1));
|
| - push(r7, eq); // Conditional push instruction.
|
| - }
|
| + // alignment in AlignStack.
|
| + AlignStack(1);
|
|
|
| // Push in reverse order: caller_fp, sp_on_exit, and caller_pc.
|
| stm(db_w, sp, fp.bit() | ip.bit() | lr.bit());
|
| @@ -343,6 +324,30 @@
|
| }
|
|
|
|
|
| +void MacroAssembler::AlignStack(int offset) {
|
| +#if defined(V8_HOST_ARCH_ARM)
|
| + // Running on the real platform. Use the alignment as mandated by the local
|
| + // environment.
|
| + // Note: This will break if we ever start generating snapshots on one ARM
|
| + // platform for another ARM platform with a different alignment.
|
| + int activation_frame_alignment = OS::ActivationFrameAlignment();
|
| +#else // defined(V8_HOST_ARCH_ARM)
|
| + // If we are using the simulator then we should always align to the expected
|
| + // alignment. As the simulator is used to generate snapshots we do not know
|
| + // if the target platform will need alignment, so we will always align at
|
| + // this point here.
|
| + int activation_frame_alignment = 2 * kPointerSize;
|
| +#endif // defined(V8_HOST_ARCH_ARM)
|
| + if (activation_frame_alignment != kPointerSize) {
|
| + // This code needs to be made more general if this assert doesn't hold.
|
| + ASSERT(activation_frame_alignment == 2 * kPointerSize);
|
| + mov(r7, Operand(Smi::FromInt(0)));
|
| + tst(sp, Operand(activation_frame_alignment - offset));
|
| + push(r7, eq); // Conditional push instruction.
|
| + }
|
| +}
|
| +
|
| +
|
| void MacroAssembler::LeaveExitFrame(StackFrame::Type type) {
|
| #ifdef ENABLE_DEBUGGER_SUPPORT
|
| // Restore the memory copy of the registers by digging them out from
|
|
|