| Index: src/arm/codegen-arm.cc
|
| ===================================================================
|
| --- src/arm/codegen-arm.cc (revision 4448)
|
| +++ src/arm/codegen-arm.cc (working copy)
|
| @@ -353,37 +353,37 @@
|
| frame_->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.
|
| - int32_t sp_delta = (scope()->num_parameters() + 1) * kPointerSize;
|
| - int return_sequence_length = Assembler::kJSReturnSequenceLength;
|
| - if (!masm_->ImmediateFitsAddrMode1Instruction(sp_delta)) {
|
| - // Additional mov instruction generated.
|
| - return_sequence_length++;
|
| - }
|
| - masm_->BlockConstPoolFor(return_sequence_length);
|
| + {
|
| + // Make sure that the constant pool is not emitted inside of the return
|
| + // sequence.
|
| + Assembler::BlockConstPoolScope block_const_pool(masm_);
|
|
|
| - // Tear down the frame which will restore the caller's frame pointer and
|
| - // the link register.
|
| - frame_->Exit();
|
| + // Tear down the frame which will restore the caller's frame pointer and
|
| + // the link register.
|
| + frame_->Exit();
|
|
|
| - // Here we use masm_-> instead of the __ macro to avoid the code coverage
|
| - // tool from instrumenting as we rely on the code size here.
|
| - masm_->add(sp, sp, Operand(sp_delta));
|
| - masm_->Jump(lr);
|
| + // Here we use masm_-> instead of the __ macro to avoid the code coverage
|
| + // tool from instrumenting as we rely on the code size here.
|
| + int32_t sp_delta = (scope()->num_parameters() + 1) * kPointerSize;
|
| + masm_->add(sp, sp, Operand(sp_delta));
|
| + masm_->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.
|
| - ASSERT_EQ(return_sequence_length,
|
| - masm_->InstructionsGeneratedSince(&check_exit_codesize));
|
| + // expected by the debugger. If the sp_delts above cannot be encoded in the
|
| + // add instruction the add will generate two instructions.
|
| + int return_sequence_length =
|
| + masm_->InstructionsGeneratedSince(&check_exit_codesize);
|
| + CHECK(return_sequence_length == Assembler::kJSReturnSequenceLength ||
|
| + return_sequence_length == Assembler::kJSReturnSequenceLength + 1);
|
| +#endif
|
| }
|
|
|
| // Adjust for function-level loop nesting.
|
|
|