diff --git a/src/mips/codegen-mips.cc b/src/mips/codegen-mips.cc index 10490e7a7b..5c847fc8f6 100644 --- a/src/mips/codegen-mips.cc +++ b/src/mips/codegen-mips.cc @@ -205,7 +205,7 @@ void ElementsTransitionGenerator::GenerateSmiToDouble( // Allocate new FixedDoubleArray. __ sll(scratch, t1, 2); __ Addu(scratch, scratch, FixedDoubleArray::kHeaderSize); - __ Allocate(scratch, t2, t3, t5, &gc_required, NO_ALLOCATION_FLAGS); + __ Allocate(scratch, t2, t3, t5, &gc_required, DOUBLE_ALIGNMENT); // t2: destination FixedDoubleArray, not tagged as heap object // Set destination FixedDoubleArray's length and map. diff --git a/src/mips/macro-assembler-mips.cc b/src/mips/macro-assembler-mips.cc index a7ec713b35..e53f10afac 100644 --- a/src/mips/macro-assembler-mips.cc +++ b/src/mips/macro-assembler-mips.cc @@ -2923,9 +2923,7 @@ void MacroAssembler::Allocate(int object_size, // Set up allocation top address and object size registers. Register topaddr = scratch1; - Register obj_size_reg = scratch2; li(topaddr, Operand(allocation_top)); - li(obj_size_reg, Operand(object_size)); // This code stores a temporary value in t9. if ((flags & RESULT_CONTAINS_TOP) == 0) { @@ -2944,9 +2942,23 @@ void MacroAssembler::Allocate(int object_size, lw(t9, MemOperand(topaddr, limit - top)); } + if ((flags & DOUBLE_ALIGNMENT) != 0) { + // Align the next allocation. Storing the filler map without checking top is + // always safe because the limit of the heap is always aligned. + ASSERT((flags & PRETENURE_OLD_POINTER_SPACE) == 0); + ASSERT(kPointerAlignment * 2 == kDoubleAlignment); + And(scratch2, result, Operand(kDoubleAlignmentMask)); + Label aligned; + Branch(&aligned, eq, scratch2, Operand(zero_reg)); + li(scratch2, Operand(isolate()->factory()->one_pointer_filler_map())); + sw(scratch2, MemOperand(result)); + Addu(result, result, Operand(kDoubleSize / 2)); + bind(&aligned); + } + // Calculate new top and bail out if new space is exhausted. Use result // to calculate the new top. - Addu(scratch2, result, Operand(obj_size_reg)); + Addu(scratch2, result, Operand(object_size)); Branch(gc_required, Ugreater, scratch2, Operand(t9)); sw(scratch2, MemOperand(topaddr)); @@ -3014,6 +3026,20 @@ void MacroAssembler::Allocate(Register object_size, lw(t9, MemOperand(topaddr, limit - top)); } + if ((flags & DOUBLE_ALIGNMENT) != 0) { + // Align the next allocation. Storing the filler map without checking top is + // always safe because the limit of the heap is always aligned. + ASSERT((flags & PRETENURE_OLD_POINTER_SPACE) == 0); + ASSERT(kPointerAlignment * 2 == kDoubleAlignment); + And(scratch2, result, Operand(kDoubleAlignmentMask)); + Label aligned; + Branch(&aligned, eq, scratch2, Operand(zero_reg)); + li(scratch2, Operand(isolate()->factory()->one_pointer_filler_map())); + sw(scratch2, MemOperand(result)); + Addu(result, result, Operand(kDoubleSize / 2)); + bind(&aligned); + } + // Calculate new top and bail out if new space is exhausted. Use result // to calculate the new top. Object size may be in words so a shift is // required to get the number of bytes. diff --git a/src/mips/macro-assembler-mips.h b/src/mips/macro-assembler-mips.h index ac37db2aaa..61a0c3a228 100644 --- a/src/mips/macro-assembler-mips.h +++ b/src/mips/macro-assembler-mips.h @@ -51,20 +51,6 @@ class JumpTarget; // MIPS generated code calls C code, it must be via t9 register. -// Flags used for the AllocateInNewSpace functions. -enum AllocationFlags { - // No special flags. - NO_ALLOCATION_FLAGS = 0, - // Return the pointer to the allocated already tagged as a heap object. - TAG_OBJECT = 1 << 0, - // The content of the result register already contains the allocation top in - // new space. - RESULT_CONTAINS_TOP = 1 << 1, - // Specify that the requested size of the space to allocate is specified in - // words instead of bytes. - SIZE_IN_WORDS = 1 << 2 -}; - // Flags used for AllocateHeapNumber enum TaggingMode { // Tag the result.