Index: src/arm/macro-assembler-arm.cc |
diff --git a/src/arm/macro-assembler-arm.cc b/src/arm/macro-assembler-arm.cc |
index ff3a0c961018db55b192a5df01e4d49981619f0b..0dd37dd4aebdf3e113bdf385cc201024dea01506 100644 |
--- a/src/arm/macro-assembler-arm.cc |
+++ b/src/arm/macro-assembler-arm.cc |
@@ -2032,7 +2032,7 @@ |
// Align the next allocation. Storing the filler map without checking top is |
// safe in new-space because the limit of the heap is aligned there. |
STATIC_ASSERT(kPointerAlignment * 2 == kDoubleAlignment); |
- and_(result_end, result, Operand(kDoubleAlignmentMaskTagged), SetCC); |
+ and_(result_end, result, Operand(kDoubleAlignmentMask), SetCC); |
Label aligned; |
b(eq, &aligned); |
if ((flags & PRETENURE) != 0) { |
@@ -2040,8 +2040,7 @@ |
b(hs, gc_required); |
} |
mov(result_end, Operand(isolate()->factory()->one_pointer_filler_map())); |
- str(result_end, MemOperand(result, -kHeapObjectTag)); |
- add(result_end, result_end, Operand(kDoubleSize / 2)); |
+ str(result_end, MemOperand(result, kDoubleSize / 2, PostIndex)); |
bind(&aligned); |
} |
@@ -2074,6 +2073,9 @@ |
// The top pointer is not updated for allocation folding dominators. |
str(result_end, MemOperand(top_address)); |
} |
+ |
+ // Tag object. |
+ add(result, result, Operand(kHeapObjectTag)); |
} |
@@ -2136,7 +2138,7 @@ |
// Align the next allocation. Storing the filler map without checking top is |
// safe in new-space because the limit of the heap is aligned there. |
DCHECK(kPointerAlignment * 2 == kDoubleAlignment); |
- and_(result_end, result, Operand(kDoubleAlignmentMaskTagged), SetCC); |
+ and_(result_end, result, Operand(kDoubleAlignmentMask), SetCC); |
Label aligned; |
b(eq, &aligned); |
if ((flags & PRETENURE) != 0) { |
@@ -2144,8 +2146,7 @@ |
b(hs, gc_required); |
} |
mov(result_end, Operand(isolate()->factory()->one_pointer_filler_map())); |
- str(result_end, MemOperand(result, -kHeapObjectTag)); |
- add(result_end, result_end, Operand(kDoubleSize / 2)); |
+ str(result_end, MemOperand(result, kDoubleSize / 2, PostIndex)); |
bind(&aligned); |
} |
@@ -2164,12 +2165,15 @@ |
// Update allocation top. result temporarily holds the new top. |
if (emit_debug_code()) { |
tst(result_end, Operand(kObjectAlignmentMask)); |
- Check(ne, kUnalignedAllocationInNewSpace); |
+ Check(eq, kUnalignedAllocationInNewSpace); |
} |
if ((flags & ALLOCATION_FOLDING_DOMINATOR) == 0) { |
// The top pointer is not updated for allocation folding dominators. |
str(result_end, MemOperand(top_address)); |
} |
+ |
+ // Tag object. |
+ add(result, result, Operand(kHeapObjectTag)); |
} |
void MacroAssembler::FastAllocate(Register object_size, Register result, |
@@ -2192,12 +2196,11 @@ |
// Align the next allocation. Storing the filler map without checking top is |
// safe in new-space because the limit of the heap is aligned there. |
DCHECK(kPointerAlignment * 2 == kDoubleAlignment); |
- and_(result_end, result, Operand(kDoubleAlignmentMaskTagged), SetCC); |
+ and_(result_end, result, Operand(kDoubleAlignmentMask), SetCC); |
Label aligned; |
b(eq, &aligned); |
mov(result_end, Operand(isolate()->factory()->one_pointer_filler_map())); |
- str(result_end, MemOperand(result, -kHeapObjectTag)); |
- add(result_end, result_end, Operand(kDoubleSize / 2)); |
+ str(result_end, MemOperand(result, kDoubleSize / 2, PostIndex)); |
bind(&aligned); |
} |
@@ -2212,10 +2215,12 @@ |
// Update allocation top. result temporarily holds the new top. |
if (emit_debug_code()) { |
tst(result_end, Operand(kObjectAlignmentMask)); |
- Check(ne, kUnalignedAllocationInNewSpace); |
+ Check(eq, kUnalignedAllocationInNewSpace); |
} |
// The top pointer is not updated for allocation folding dominators. |
str(result_end, MemOperand(top_address)); |
+ |
+ add(result, result, Operand(kHeapObjectTag)); |
} |
void MacroAssembler::FastAllocate(int object_size, Register result, |
@@ -2243,12 +2248,11 @@ |
// Align the next allocation. Storing the filler map without checking top is |
// safe in new-space because the limit of the heap is aligned there. |
STATIC_ASSERT(kPointerAlignment * 2 == kDoubleAlignment); |
- and_(result_end, result, Operand(kDoubleAlignmentMaskTagged), SetCC); |
+ and_(result_end, result, Operand(kDoubleAlignmentMask), SetCC); |
Label aligned; |
b(eq, &aligned); |
mov(result_end, Operand(isolate()->factory()->one_pointer_filler_map())); |
- str(result_end, MemOperand(result, -kHeapObjectTag)); |
- add(result_end, result_end, Operand(kDoubleSize / 2)); |
+ str(result_end, MemOperand(result, kDoubleSize / 2, PostIndex)); |
bind(&aligned); |
} |
@@ -2276,6 +2280,8 @@ |
// The top pointer is not updated for allocation folding dominators. |
str(result_end, MemOperand(top_address)); |
+ |
+ add(result, result, Operand(kHeapObjectTag)); |
} |
void MacroAssembler::AllocateTwoByteString(Register result, |