Index: src/arm/code-stubs-arm.cc |
=================================================================== |
--- src/arm/code-stubs-arm.cc (revision 6446) |
+++ src/arm/code-stubs-arm.cc (working copy) |
@@ -1,4 +1,4 @@ |
-// Copyright 2010 the V8 project authors. All rights reserved. |
+// Copyright 2011 the V8 project authors. All rights reserved. |
// Redistribution and use in source and binary forms, with or without |
// modification, are permitted provided that the following conditions are |
// met: |
@@ -2557,8 +2557,7 @@ |
Label* throw_termination_exception, |
Label* throw_out_of_memory_exception, |
bool do_gc, |
- bool always_allocate, |
- int frame_alignment_skew) { |
+ bool always_allocate) { |
// r0: result parameter for PerformGC, if any |
// r4: number of arguments including receiver (C callee-saved) |
// r5: pointer to builtin function (C callee-saved) |
@@ -2584,14 +2583,13 @@ |
__ mov(r0, Operand(r4)); |
__ mov(r1, Operand(r6)); |
+#if defined(V8_HOST_ARCH_ARM) |
int frame_alignment = MacroAssembler::ActivationFrameAlignment(); |
int frame_alignment_mask = frame_alignment - 1; |
-#if defined(V8_HOST_ARCH_ARM) |
if (FLAG_debug_code) { |
if (frame_alignment > kPointerSize) { |
Label alignment_as_expected; |
ASSERT(IsPowerOf2(frame_alignment)); |
- __ sub(r2, sp, Operand(frame_alignment_skew)); |
__ tst(r2, Operand(frame_alignment_mask)); |
__ b(eq, &alignment_as_expected); |
// Don't use Check here, as it will call Runtime_Abort re-entering here. |
@@ -2601,36 +2599,21 @@ |
} |
#endif |
- // Just before the call (jump) below lr is pushed, so the actual alignment is |
- // adding one to the current skew. |
- int alignment_before_call = |
- (frame_alignment_skew + kPointerSize) & frame_alignment_mask; |
- if (alignment_before_call > 0) { |
- // Push until the alignment before the call is met. |
- __ mov(r2, Operand(0, RelocInfo::NONE)); |
- for (int i = alignment_before_call; |
- (i & frame_alignment_mask) != 0; |
- i += kPointerSize) { |
- __ push(r2); |
- } |
- } |
- |
// TODO(1242173): To let the GC traverse the return address of the exit |
// frames, we need to know where the return address is. Right now, |
- // we push it on the stack to be able to find it again, but we never |
+ // we store it on the stack to be able to find it again, but we never |
// restore from it in case of changes, which makes it impossible to |
// support moving the C entry code stub. This should be fixed, but currently |
// this is OK because the CEntryStub gets generated so early in the V8 boot |
// sequence that it is not moving ever. |
- masm->add(lr, pc, Operand(4)); // Compute return address: (pc + 8) + 4 |
- masm->push(lr); |
+ |
+ // Compute the return address in lr to return to after the jump below. Pc is |
+ // already at '+ 8' from the current instruction but return is after three |
+ // instructions so add another 4 to pc to get the return address. |
+ masm->add(lr, pc, Operand(4)); |
+ __ str(lr, MemOperand(sp, 0)); |
masm->Jump(r5); |
- // Restore sp back to before aligning the stack. |
- if (alignment_before_call > 0) { |
- __ add(sp, sp, Operand(alignment_before_call)); |
- } |
- |
if (always_allocate) { |
// It's okay to clobber r2 and r3 here. Don't mess with r0 and r1 |
// though (contain the result). |
@@ -2717,8 +2700,7 @@ |
&throw_termination_exception, |
&throw_out_of_memory_exception, |
false, |
- false, |
- -kPointerSize); |
+ false); |
// Do space-specific GC and retry runtime call. |
GenerateCore(masm, |
@@ -2726,8 +2708,7 @@ |
&throw_termination_exception, |
&throw_out_of_memory_exception, |
true, |
- false, |
- 0); |
+ false); |
// Do full GC and retry runtime call one final time. |
Failure* failure = Failure::InternalError(); |
@@ -2737,8 +2718,7 @@ |
&throw_termination_exception, |
&throw_out_of_memory_exception, |
true, |
- true, |
- kPointerSize); |
+ true); |
__ bind(&throw_out_of_memory_exception); |
GenerateThrowUncatchable(masm, OUT_OF_MEMORY); |