Index: src/arm/assembler-arm.cc |
diff --git a/src/arm/assembler-arm.cc b/src/arm/assembler-arm.cc |
index 0860bd2ffb51feefb1e40bc5870d12a87306fdfd..9be62a404bd2935864095744d1d4fa8a985a937b 100644 |
--- a/src/arm/assembler-arm.cc |
+++ b/src/arm/assembler-arm.cc |
@@ -900,13 +900,17 @@ void Assembler::addrmod1(Instr instr, |
if ((instr & ~kCondMask) == 13*B21) { // mov, S not set |
move_32_bit_immediate(cond, rd, LeaveCC, x); |
} else { |
- // If this is not a mov or mvn instruction we may still be able to avoid |
- // a constant pool entry by using mvn or movw. |
- if (!x.must_output_reloc_info(this) && |
- (instr & kMovMvnMask) != kMovMvnPattern) { |
- mov(ip, x, LeaveCC, cond); |
- } else { |
+ if ((instr & kMovMvnMask) == kMovMvnPattern) { |
+ // Moves need to use a constant pool entry. |
+ RecordRelocInfo(x.rmode_, x.imm32_, USE_CONSTANT_POOL); |
+ ldr(ip, MemOperand(pc, 0), cond); |
+ } else if (x.must_output_reloc_info(this)) { |
+ // Otherwise, use most efficient form of fetching from constant pool. |
move_32_bit_immediate(cond, ip, LeaveCC, x); |
+ } else { |
+ // If this is not a mov or mvn instruction we may still be able to |
+ // avoid a constant pool entry by using mvn or movw. |
+ mov(ip, x, LeaveCC, cond); |
} |
addrmod1(instr, rn, rd, Operand(ip)); |
} |