Index: src/arm/full-codegen-arm.cc |
=================================================================== |
--- src/arm/full-codegen-arm.cc (revision 4448) |
+++ src/arm/full-codegen-arm.cc (working copy) |
@@ -194,36 +194,37 @@ |
__ 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 = scope()->num_parameters(); |
- int32_t sp_delta = (num_parameters + 1) * kPointerSize; |
- int return_sequence_length = Assembler::kJSReturnSequenceLength; |
- if (!masm_->ImmediateFitsAddrMode1Instruction(sp_delta)) { |
- // Additional mov instruction generated. |
- return_sequence_length++; |
+ { |
+ // Make sure that the constant pool is not emitted inside of the return |
+ // sequence. |
+ Assembler::BlockConstPoolScope block_const_pool(masm_); |
+ |
+ // 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; |
+ CodeGenerator::RecordPositions(masm_, position); |
+ __ RecordJSReturn(); |
+ masm_->mov(sp, fp); |
+ masm_->ldm(ia_w, sp, fp.bit() | lr.bit()); |
+ masm_->add(sp, sp, Operand(sp_delta)); |
+ masm_->Jump(lr); |
} |
- masm_->BlockConstPoolFor(return_sequence_length); |
- CodeGenerator::RecordPositions(masm_, position); |
- __ RecordJSReturn(); |
- __ mov(sp, fp); |
- __ ldm(ia_w, sp, fp.bit() | lr.bit()); |
- __ 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. |
- 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 |
} |
} |