Chromium Code Reviews| Index: src/ppc/macro-assembler-ppc.cc |
| diff --git a/src/ppc/macro-assembler-ppc.cc b/src/ppc/macro-assembler-ppc.cc |
| index 0530f4baab67e2be709c655df370d36651b11b2f..5acd7f73131b41e4564236a1d4cf72dad34b1f8f 100644 |
| --- a/src/ppc/macro-assembler-ppc.cc |
| +++ b/src/ppc/macro-assembler-ppc.cc |
| @@ -1790,6 +1790,7 @@ void MacroAssembler::Allocate(int object_size, Register result, |
| Register scratch1, Register scratch2, |
| Label* gc_required, AllocationFlags flags) { |
| DCHECK(object_size <= Page::kMaxRegularHeapObjectSize); |
| + DCHECK((flags & ALLOCATION_FOLDED) == 0); |
| if (!FLAG_inline_new) { |
| if (emit_debug_code()) { |
| // Trash the registers to simulate an allocation failure. |
| @@ -1875,7 +1876,11 @@ void MacroAssembler::Allocate(int object_size, Register result, |
| blt(gc_required); |
| add(result_end, result, result_end); |
| } |
| - StoreP(result_end, MemOperand(top_address)); |
| + |
| + if ((flags & ALLOCATION_FOLDING_DOMINATOR) == 0) { |
| + // The top pointer is not updated for allocation folding dominators. |
| + StoreP(result_end, MemOperand(top_address)); |
| + } |
| // Tag object. |
| addi(result, result, Operand(kHeapObjectTag)); |
| @@ -1885,6 +1890,7 @@ void MacroAssembler::Allocate(int object_size, Register result, |
| void MacroAssembler::Allocate(Register object_size, Register result, |
| Register result_end, Register scratch, |
| Label* gc_required, AllocationFlags flags) { |
| + DCHECK((flags & ALLOCATION_FOLDED) == 0); |
| if (!FLAG_inline_new) { |
| if (emit_debug_code()) { |
| // Trash the registers to simulate an allocation failure. |
| @@ -1974,6 +1980,113 @@ void MacroAssembler::Allocate(Register object_size, Register result, |
| andi(r0, result_end, Operand(kObjectAlignmentMask)); |
| Check(eq, kUnalignedAllocationInNewSpace, cr0); |
| } |
| + if ((flags & ALLOCATION_FOLDING_DOMINATOR) == 0) { |
| + // The top pointer is not updated for allocation folding dominators. |
| + StoreP(result_end, MemOperand(top_address)); |
| + } |
| + |
| + // Tag object. |
| + addi(result, result, Operand(kHeapObjectTag)); |
| +} |
| + |
| +void MacroAssembler::FastAllocate(Register object_size, Register result, |
| + Register result_end, Register scratch, |
| + AllocationFlags flags) { |
| + // |object_size| and |result_end| may overlap if the DOUBLE_ALIGNMENT flag |
| + // is not specified. Other registers must not overlap. |
| + DCHECK(!AreAliased(object_size, result, scratch, ip)); |
| + DCHECK(!AreAliased(result_end, result, scratch, ip)); |
| + DCHECK((flags & DOUBLE_ALIGNMENT) == 0 || !object_size.is(result_end)); |
| + |
| + ExternalReference allocation_top = |
| + AllocationUtils::GetAllocationTopReference(isolate(), flags); |
| + |
| + Register top_address = scratch; |
| + mov(top_address, Operand(allocation_top)); |
| + LoadP(result, MemOperand(top_address)); |
| + |
| + if ((flags & DOUBLE_ALIGNMENT) != 0) { |
| + // 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. |
| +#if V8_TARGET_ARCH_PPC64 |
| + STATIC_ASSERT(kPointerAlignment == kDoubleAlignment); |
| +#else |
| + DCHECK(kPointerAlignment * 2 == kDoubleAlignment); |
| + andi(result_end, result, Operand(kDoubleAlignmentMask)); |
| + Label aligned; |
| + beq(&aligned); |
| + mov(result_end, Operand(isolate()->factory()->one_pointer_filler_map())); |
| + stw(result_end, MemOperand(result)); |
| + addi(result, result, Operand(kDoubleSize / 2)); |
| + bind(&aligned); |
| +#endif |
| + } |
| + |
| + // Calculate new top using result. Object size may be in words so a shift is |
| + // required to get the number of bytes. |
| + if ((flags & SIZE_IN_WORDS) != 0) { |
| + ShiftLeftImm(result_end, object_size, Operand(kPointerSizeLog2)); |
| + add(result_end, result, result_end); |
| + } else { |
| + add(result_end, result, object_size); |
| + } |
| + |
| + // Update allocation top. result temporarily holds the new top. |
| + if (emit_debug_code()) { |
| + andi(r0, result_end, Operand(kObjectAlignmentMask)); |
| + Check(eq, kUnalignedAllocationInNewSpace, cr0); |
| + } |
| + StoreP(result_end, MemOperand(top_address)); |
| + |
| + // Tag object. |
| + addi(result, result, Operand(kHeapObjectTag)); |
| +} |
| + |
| +void MacroAssembler::FastAllocate(int object_size, Register result, |
| + Register scratch1, Register scratch2, |
| + AllocationFlags flags) { |
| + DCHECK(object_size <= Page::kMaxRegularHeapObjectSize); |
| + DCHECK(!AreAliased(result, scratch1, scratch2, ip)); |
| + |
| + // Make object size into bytes. |
| + if ((flags & SIZE_IN_WORDS) != 0) { |
| + object_size *= kPointerSize; |
| + } |
| + DCHECK_EQ(0, object_size & kObjectAlignmentMask); |
| + |
| + ExternalReference allocation_top = |
| + AllocationUtils::GetAllocationTopReference(isolate(), flags); |
| + |
| + // Set up allocation top address register. |
| + Register top_address = scratch1; |
| + Register result_end = scratch2; |
| + mov(top_address, Operand(allocation_top)); |
| + LoadP(result, MemOperand(top_address)); |
| + |
| + if ((flags & DOUBLE_ALIGNMENT) != 0) { |
| + // 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. |
| +#if V8_TARGET_ARCH_PPC64 |
| + STATIC_ASSERT(kPointerAlignment == kDoubleAlignment); |
| +#else |
| + DCHECK(kPointerAlignment * 2 == kDoubleAlignment); |
| + andi(result_end, result, Operand(kDoubleAlignmentMask)); |
| + Label aligned; |
| + beq(&aligned); |
| + mov(result_end, Operand(isolate()->factory()->one_pointer_filler_map())); |
| + stw(result_end, MemOperand(result)); |
| + addi(result, result, Operand(kDoubleSize / 2)); |
| + bind(&aligned); |
| +#endif |
| + } |
| + |
| + // Calculate new top using result. |
| + if (is_int16(object_size)) { |
|
MTBrandyberry
2016/05/11 15:18:22
I think you just want Add here.
|
| + addi(result_end, result, Operand(object_size)); |
| + } else { |
| + add(result_end, result, result_end); |
| + } |
| + // The top pointer is not updated for allocation folding dominators. |
| StoreP(result_end, MemOperand(top_address)); |
| // Tag object. |