Index: src/arm/macro-assembler-arm.cc |
diff --git a/src/arm/macro-assembler-arm.cc b/src/arm/macro-assembler-arm.cc |
index b74d09deaa6aef8e9c06fc7290f2be6636f1d405..9e819955bcac011ed754e2c3ea92e174fe78342d 100644 |
--- a/src/arm/macro-assembler-arm.cc |
+++ b/src/arm/macro-assembler-arm.cc |
@@ -1570,7 +1570,11 @@ void MacroAssembler::AllocateInNewSpace(int object_size, |
Register topaddr = scratch1; |
Register obj_size_reg = scratch2; |
mov(topaddr, Operand(new_space_allocation_top)); |
- mov(obj_size_reg, Operand(object_size)); |
+ Operand obj_size_operand = Operand(object_size); |
+ if (!obj_size_operand.is_single_instruction(this)) { |
+ // We are about to steal IP, so we need to load this value first |
+ mov(obj_size_reg, obj_size_operand); |
+ } |
// This code stores a temporary value in ip. This is OK, as the code below |
// does not need ip for implicit literal generation. |
@@ -1592,7 +1596,13 @@ void MacroAssembler::AllocateInNewSpace(int object_size, |
// Calculate new top and bail out if new space is exhausted. Use result |
// to calculate the new top. |
- add(scratch2, result, Operand(obj_size_reg), SetCC); |
+ if (obj_size_operand.is_single_instruction(this)) { |
+ // We can add the size as an immediate |
+ add(scratch2, result, obj_size_operand, SetCC); |
+ } else { |
+ // Doesn't fit in an immediate, we have to use the register |
+ add(scratch2, result, obj_size_reg, SetCC); |
+ } |
b(cs, gc_required); |
cmp(scratch2, Operand(ip)); |
b(hi, gc_required); |