Index: src/arm/macro-assembler-arm.cc |
diff --git a/src/arm/macro-assembler-arm.cc b/src/arm/macro-assembler-arm.cc |
index 114a7a0026b2883b2d49d17c514f178e5ddb7236..182dca0ff0732eef57af1382fd54068f3f839ea1 100644 |
--- a/src/arm/macro-assembler-arm.cc |
+++ b/src/arm/macro-assembler-arm.cc |
@@ -2009,7 +2009,7 @@ void MacroAssembler::Allocate(int object_size, |
// 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(kDoubleAlignmentMask), SetCC); |
+ and_(result_end, result, Operand(kDoubleAlignmentMaskTagged), SetCC); |
Label aligned; |
b(eq, &aligned); |
if ((flags & PRETENURE) != 0) { |
@@ -2017,7 +2017,8 @@ void MacroAssembler::Allocate(int object_size, |
b(hs, gc_required); |
} |
mov(result_end, Operand(isolate()->factory()->one_pointer_filler_map())); |
- str(result_end, MemOperand(result, kDoubleSize / 2, PostIndex)); |
+ str(result_end, MemOperand(result, -kHeapObjectTag)); |
+ add(result_end, result_end, Operand(kDoubleSize / 2)); |
bind(&aligned); |
} |
@@ -2050,9 +2051,6 @@ void MacroAssembler::Allocate(int object_size, |
// The top pointer is not updated for allocation folding dominators. |
str(result_end, MemOperand(top_address)); |
} |
- |
- // Tag object. |
- add(result, result, Operand(kHeapObjectTag)); |
} |
@@ -2115,7 +2113,7 @@ void MacroAssembler::Allocate(Register object_size, Register result, |
// 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(kDoubleAlignmentMask), SetCC); |
+ and_(result_end, result, Operand(kDoubleAlignmentMaskTagged), SetCC); |
Label aligned; |
b(eq, &aligned); |
if ((flags & PRETENURE) != 0) { |
@@ -2123,7 +2121,8 @@ void MacroAssembler::Allocate(Register object_size, Register result, |
b(hs, gc_required); |
} |
mov(result_end, Operand(isolate()->factory()->one_pointer_filler_map())); |
- str(result_end, MemOperand(result, kDoubleSize / 2, PostIndex)); |
+ str(result_end, MemOperand(result, -kHeapObjectTag)); |
+ add(result_end, result_end, Operand(kDoubleSize / 2)); |
bind(&aligned); |
} |
@@ -2142,15 +2141,12 @@ void MacroAssembler::Allocate(Register object_size, Register result, |
// Update allocation top. result temporarily holds the new top. |
if (emit_debug_code()) { |
tst(result_end, Operand(kObjectAlignmentMask)); |
- Check(eq, kUnalignedAllocationInNewSpace); |
+ Check(ne, 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, |
@@ -2173,11 +2169,12 @@ void MacroAssembler::FastAllocate(Register object_size, Register result, |
// 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(kDoubleAlignmentMask), SetCC); |
+ and_(result_end, result, Operand(kDoubleAlignmentMaskTagged), SetCC); |
Label aligned; |
b(eq, &aligned); |
mov(result_end, Operand(isolate()->factory()->one_pointer_filler_map())); |
- str(result_end, MemOperand(result, kDoubleSize / 2, PostIndex)); |
+ str(result_end, MemOperand(result, -kHeapObjectTag)); |
+ add(result_end, result_end, Operand(kDoubleSize / 2)); |
bind(&aligned); |
} |
@@ -2192,12 +2189,10 @@ void MacroAssembler::FastAllocate(Register object_size, Register result, |
// Update allocation top. result temporarily holds the new top. |
if (emit_debug_code()) { |
tst(result_end, Operand(kObjectAlignmentMask)); |
- Check(eq, kUnalignedAllocationInNewSpace); |
+ Check(ne, 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, |
@@ -2225,11 +2220,12 @@ void MacroAssembler::FastAllocate(int object_size, Register result, |
// 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(kDoubleAlignmentMask), SetCC); |
+ and_(result_end, result, Operand(kDoubleAlignmentMaskTagged), SetCC); |
Label aligned; |
b(eq, &aligned); |
mov(result_end, Operand(isolate()->factory()->one_pointer_filler_map())); |
- str(result_end, MemOperand(result, kDoubleSize / 2, PostIndex)); |
+ str(result_end, MemOperand(result, -kHeapObjectTag)); |
+ add(result_end, result_end, Operand(kDoubleSize / 2)); |
bind(&aligned); |
} |
@@ -2257,8 +2253,6 @@ void MacroAssembler::FastAllocate(int object_size, Register result, |
// 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, |