Reviewers: William Hesse, Description: ARM: Move the constant pool blocking for call instruction sequences
The constant pool blocking for call instruction sequences is hoisted to the begof the function generating the call sequence. Please review this at http://codereview.chromium.org/6690009/ SVN Base: http://v8.googlecode.com/svn/branches/bleeding_edge/ Affected files: M src/arm/macro-assembler-arm.cc Index: src/arm/macro-assembler-arm.cc =================================================================== --- src/arm/macro-assembler-arm.cc (revision 7154) +++ src/arm/macro-assembler-arm.cc (working copy) @@ -113,6 +113,8 @@ void MacroAssembler::Call(Register target, Condition cond) { + // Block constant pool for the call instruction sequence. + BlockConstPoolScope block_const_pool(this); #ifdef DEBUG int pre_position = pc_offset(); #endif @@ -121,10 +123,8 @@ blx(target, cond); #else // set lr for return at current pc + 8 - { BlockConstPoolScope block_const_pool(this); - mov(lr, Operand(pc), LeaveCC, cond); - mov(pc, Operand(target), LeaveCC, cond); - } + mov(lr, Operand(pc), LeaveCC, cond); + mov(pc, Operand(target), LeaveCC, cond); #endif #ifdef DEBUG @@ -147,6 +147,8 @@ void MacroAssembler::Call( intptr_t target, RelocInfo::Mode rmode, Condition cond) { + // Block constant pool for the call instruction sequence. + BlockConstPoolScope block_const_pool(this); #ifdef DEBUG int pre_position = pc_offset(); #endif @@ -156,28 +158,21 @@ // ldr ip, [pc, #...] // blx ip - // The two instructions (ldr and blx) could be separated by a constant - // pool and the code would still work. The issue comes from the - // patching code which expect the ldr to be just above the blx. - { BlockConstPoolScope block_const_pool(this); - // Statement positions are expected to be recorded when the target - // address is loaded. The mov method will automatically record - // positions when pc is the target, since this is not the case here - // we have to do it explicitly. - positions_recorder()->WriteRecordedPositions(); + // Statement positions are expected to be recorded when the target + // address is loaded. The mov method will automatically record + // positions when pc is the target, since this is not the case here + // we have to do it explicitly. + positions_recorder()->WriteRecordedPositions(); - mov(ip, Operand(target, rmode), LeaveCC, cond); - blx(ip, cond); - } + mov(ip, Operand(target, rmode), LeaveCC, cond); + blx(ip, cond); ASSERT(kCallTargetAddressOffset == 2 * kInstrSize); #else - { BlockConstPoolScope block_const_pool(this); - // Set lr for return at current pc + 8. - mov(lr, Operand(pc), LeaveCC, cond); - // Emit a ldr<cond> pc, [pc + offset of target in constant pool]. - mov(pc, Operand(target, rmode), LeaveCC, cond); - } + // Set lr for return at current pc + 8. + mov(lr, Operand(pc), LeaveCC, cond); + // Emit a ldr<cond> pc, [pc + offset of target in constant pool]. + mov(pc, Operand(target, rmode), LeaveCC, cond); ASSERT(kCallTargetAddressOffset == kInstrSize); #endif -- v8-dev mailing list [email protected] http://groups.google.com/group/v8-dev
