Revision: 7155
Author: [email protected]
Date: Mon Mar 14 05:32:20 2011
Log: 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
http://code.google.com/p/v8/source/detail?r=7155

Modified:
 /branches/bleeding_edge/src/arm/macro-assembler-arm.cc

=======================================
--- /branches/bleeding_edge/src/arm/macro-assembler-arm.cc Thu Mar 10 05:58:20 2011 +++ /branches/bleeding_edge/src/arm/macro-assembler-arm.cc Mon Mar 14 05:32:20 2011
@@ -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();
-
-    mov(ip, Operand(target, rmode), LeaveCC, cond);
-    blx(ip, cond);
-  }
+  // 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);

   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

Reply via email to