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. |