From 4dc80f788a96f70f446c264071f3efb83e09107b Mon Sep 17 00:00:00 2001 From: "sgjesse@chromium.org" Date: Mon, 14 Mar 2011 12:32:20 +0000 Subject: [PATCH] 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. Review URL: http://codereview.chromium.org/6690009 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@7155 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/arm/macro-assembler-arm.cc | 39 +++++++++++++++------------------- 1 file changed, 17 insertions(+), 22 deletions(-) diff --git a/src/arm/macro-assembler-arm.cc b/src/arm/macro-assembler-arm.cc index a9e17e5689..916110af15 100644 --- a/src/arm/macro-assembler-arm.cc +++ b/src/arm/macro-assembler-arm.cc @@ -113,6 +113,8 @@ int MacroAssembler::CallSize(Register target, Condition cond) { 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 @@ void MacroAssembler::Call(Register target, Condition cond) { 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 @@ int MacroAssembler::CallSize( 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 @@ void MacroAssembler::Call( // 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 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 pc, [pc + offset of target in constant pool]. + mov(pc, Operand(target, rmode), LeaveCC, cond); ASSERT(kCallTargetAddressOffset == kInstrSize); #endif