| Index: src/arm/fast-codegen-arm.cc
|
| ===================================================================
|
| --- src/arm/fast-codegen-arm.cc (revision 3214)
|
| +++ src/arm/fast-codegen-arm.cc (working copy)
|
| @@ -28,6 +28,7 @@
|
| #include "v8.h"
|
|
|
| #include "codegen-inl.h"
|
| +#include "debug.h"
|
| #include "fast-codegen.h"
|
| #include "parser.h"
|
|
|
| @@ -118,34 +119,37 @@
|
| __ push(r0);
|
| __ CallRuntime(Runtime::kTraceExit, 1);
|
| }
|
| -#ifdef DEBUG
|
| +
|
| // Add a label for checking the size of the code used for returning.
|
| Label check_exit_codesize;
|
| masm_->bind(&check_exit_codesize);
|
| -#endif
|
| +
|
| + // Calculate the exact length of the return sequence and make sure that
|
| + // the constant pool is not emitted inside of the return sequence.
|
| + int num_parameters = function_->scope()->num_parameters();
|
| + int32_t sp_delta = (num_parameters + 1) * kPointerSize;
|
| + int return_sequence_length = Debug::kARMJSReturnSequenceLength;
|
| + if (!masm_->ImmediateFitsAddrMode1Instruction(sp_delta)) {
|
| + // Additional mov instruction generated.
|
| + return_sequence_length++;
|
| + }
|
| + masm_->BlockConstPoolFor(return_sequence_length);
|
| +
|
| CodeGenerator::RecordPositions(masm_, position);
|
| __ RecordJSReturn();
|
| __ mov(sp, fp);
|
| __ ldm(ia_w, sp, fp.bit() | lr.bit());
|
| - int num_parameters = function_->scope()->num_parameters();
|
| - __ add(sp, sp, Operand((num_parameters + 1) * kPointerSize));
|
| + __ add(sp, sp, Operand(sp_delta));
|
| __ Jump(lr);
|
| -#ifdef DEBUG
|
| +
|
| // Check that the size of the code used for returning matches what is
|
| // expected by the debugger. The add instruction above is an addressing
|
| // mode 1 instruction where there are restrictions on which immediate values
|
| // can be encoded in the instruction and which immediate values requires
|
| // use of an additional instruction for moving the immediate to a temporary
|
| // register.
|
| - int expected_return_sequence_length = CodeGenerator::kJSReturnSequenceLength;
|
| - if (!masm_->ImmediateFitsAddrMode1Instruction((num_parameters + 1) *
|
| - kPointerSize)) {
|
| - // Additional mov instruction generated.
|
| - expected_return_sequence_length++;
|
| - }
|
| ASSERT_EQ(expected_return_sequence_length,
|
| masm_->InstructionsGeneratedSince(&check_exit_codesize));
|
| -#endif
|
| }
|
| }
|
|
|
|
|