| Index: src/mips/macro-assembler-mips.cc
 | 
| diff --git a/src/mips/macro-assembler-mips.cc b/src/mips/macro-assembler-mips.cc
 | 
| index c931e5b7e605cd41a0a1039d2eacf593ae771d11..c577d3b934989021753c09201901d1a8ed9ae7bd 100644
 | 
| --- a/src/mips/macro-assembler-mips.cc
 | 
| +++ b/src/mips/macro-assembler-mips.cc
 | 
| @@ -3270,12 +3270,7 @@ void MacroAssembler::Allocate(int object_size,
 | 
|      return;
 | 
|    }
 | 
|  
 | 
| -  DCHECK(!result.is(scratch1));
 | 
| -  DCHECK(!result.is(scratch2));
 | 
| -  DCHECK(!scratch1.is(scratch2));
 | 
| -  DCHECK(!scratch1.is(t9));
 | 
| -  DCHECK(!scratch2.is(t9));
 | 
| -  DCHECK(!result.is(t9));
 | 
| +  DCHECK(!AreAliased(result, scratch1, scratch2, t9));
 | 
|  
 | 
|    // Make object size into bytes.
 | 
|    if ((flags & SIZE_IN_WORDS) != 0) {
 | 
| @@ -3291,54 +3286,52 @@ void MacroAssembler::Allocate(int object_size,
 | 
|    ExternalReference allocation_limit =
 | 
|        AllocationUtils::GetAllocationLimitReference(isolate(), flags);
 | 
|  
 | 
| -  intptr_t top   =
 | 
| -      reinterpret_cast<intptr_t>(allocation_top.address());
 | 
| -  intptr_t limit =
 | 
| -      reinterpret_cast<intptr_t>(allocation_limit.address());
 | 
| +  intptr_t top = reinterpret_cast<intptr_t>(allocation_top.address());
 | 
| +  intptr_t limit = reinterpret_cast<intptr_t>(allocation_limit.address());
 | 
|    DCHECK((limit - top) == kPointerSize);
 | 
|  
 | 
| -  // Set up allocation top address and object size registers.
 | 
| -  Register topaddr = scratch1;
 | 
| -  li(topaddr, Operand(allocation_top));
 | 
| -
 | 
| +  // Set up allocation top address and allocation limit registers.
 | 
| +  Register top_address = scratch1;
 | 
|    // This code stores a temporary value in t9.
 | 
| +  Register alloc_limit = t9;
 | 
| +  Register result_end = scratch2;
 | 
| +  li(top_address, Operand(allocation_top));
 | 
| +
 | 
|    if ((flags & RESULT_CONTAINS_TOP) == 0) {
 | 
| -    // Load allocation top into result and allocation limit into t9.
 | 
| -    lw(result, MemOperand(topaddr));
 | 
| -    lw(t9, MemOperand(topaddr, kPointerSize));
 | 
| +    // Load allocation top into result and allocation limit into alloc_limit.
 | 
| +    lw(result, MemOperand(top_address));
 | 
| +    lw(alloc_limit, MemOperand(top_address, kPointerSize));
 | 
|    } else {
 | 
|      if (emit_debug_code()) {
 | 
| -      // Assert that result actually contains top on entry. t9 is used
 | 
| -      // immediately below so this use of t9 does not cause difference with
 | 
| -      // respect to register content between debug and release mode.
 | 
| -      lw(t9, MemOperand(topaddr));
 | 
| -      Check(eq, kUnexpectedAllocationTop, result, Operand(t9));
 | 
| +      // Assert that result actually contains top on entry.
 | 
| +      lw(alloc_limit, MemOperand(top_address));
 | 
| +      Check(eq, kUnexpectedAllocationTop, result, Operand(alloc_limit));
 | 
|      }
 | 
| -    // Load allocation limit into t9. Result already contains allocation top.
 | 
| -    lw(t9, MemOperand(topaddr, limit - top));
 | 
| +    // Load allocation limit. Result already contains allocation top.
 | 
| +    lw(alloc_limit, MemOperand(top_address, limit - top));
 | 
|    }
 | 
|  
 | 
|    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.
 | 
|      DCHECK(kPointerAlignment * 2 == kDoubleAlignment);
 | 
| -    And(scratch2, result, Operand(kDoubleAlignmentMask));
 | 
| +    And(result_end, result, Operand(kDoubleAlignmentMask));
 | 
|      Label aligned;
 | 
| -    Branch(&aligned, eq, scratch2, Operand(zero_reg));
 | 
| +    Branch(&aligned, eq, result_end, Operand(zero_reg));
 | 
|      if ((flags & PRETENURE) != 0) {
 | 
| -      Branch(gc_required, Ugreater_equal, result, Operand(t9));
 | 
| +      Branch(gc_required, Ugreater_equal, result, Operand(alloc_limit));
 | 
|      }
 | 
| -    li(scratch2, Operand(isolate()->factory()->one_pointer_filler_map()));
 | 
| -    sw(scratch2, MemOperand(result));
 | 
| +    li(result_end, Operand(isolate()->factory()->one_pointer_filler_map()));
 | 
| +    sw(result_end, 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(object_size));
 | 
| -  Branch(gc_required, Ugreater, scratch2, Operand(t9));
 | 
| -  sw(scratch2, MemOperand(topaddr));
 | 
| +  Addu(result_end, result, Operand(object_size));
 | 
| +  Branch(gc_required, Ugreater, result_end, Operand(alloc_limit));
 | 
| +  sw(result_end, MemOperand(top_address));
 | 
|  
 | 
|    // Tag object if requested.
 | 
|    if ((flags & TAG_OBJECT) != 0) {
 | 
| @@ -3348,24 +3341,24 @@ void MacroAssembler::Allocate(int object_size,
 | 
|  
 | 
|  
 | 
|  void MacroAssembler::Allocate(Register object_size, Register result,
 | 
| -                              Register result_end, Register scratch1,
 | 
| +                              Register result_end, Register scratch,
 | 
|                                Label* gc_required, AllocationFlags flags) {
 | 
|    if (!FLAG_inline_new) {
 | 
|      if (emit_debug_code()) {
 | 
|        // Trash the registers to simulate an allocation failure.
 | 
|        li(result, 0x7091);
 | 
| -      li(scratch1, 0x7191);
 | 
| +      li(scratch, 0x7191);
 | 
|        li(result_end, 0x7291);
 | 
|      }
 | 
|      jmp(gc_required);
 | 
|      return;
 | 
|    }
 | 
|  
 | 
| -  DCHECK(!result.is(scratch1));
 | 
| -  DCHECK(!result.is(result_end));
 | 
| -  DCHECK(!scratch1.is(result_end));
 | 
| -  DCHECK(!object_size.is(t9));
 | 
| -  DCHECK(!scratch1.is(t9) && !result_end.is(t9) && !result.is(t9));
 | 
| +  // |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, t9));
 | 
| +  DCHECK(!AreAliased(result_end, result, scratch, t9));
 | 
| +  DCHECK((flags & DOUBLE_ALIGNMENT) == 0 || !object_size.is(result_end));
 | 
|  
 | 
|    // Check relative positions of allocation top and limit addresses.
 | 
|    // ARM adds additional checks to make sure the ldm instruction can be
 | 
| @@ -3374,31 +3367,28 @@ void MacroAssembler::Allocate(Register object_size, Register result,
 | 
|        AllocationUtils::GetAllocationTopReference(isolate(), flags);
 | 
|    ExternalReference allocation_limit =
 | 
|        AllocationUtils::GetAllocationLimitReference(isolate(), flags);
 | 
| -  intptr_t top   =
 | 
| -      reinterpret_cast<intptr_t>(allocation_top.address());
 | 
| -  intptr_t limit =
 | 
| -      reinterpret_cast<intptr_t>(allocation_limit.address());
 | 
| +  intptr_t top = reinterpret_cast<intptr_t>(allocation_top.address());
 | 
| +  intptr_t limit = reinterpret_cast<intptr_t>(allocation_limit.address());
 | 
|    DCHECK((limit - top) == kPointerSize);
 | 
|  
 | 
| -  // Set up allocation top address and object size registers.
 | 
| -  Register topaddr = scratch1;
 | 
| -  li(topaddr, Operand(allocation_top));
 | 
| -
 | 
| +  // Set up allocation top address and allocation limit registers.
 | 
| +  Register top_address = scratch;
 | 
|    // This code stores a temporary value in t9.
 | 
| +  Register alloc_limit = t9;
 | 
| +  li(top_address, Operand(allocation_top));
 | 
| +
 | 
|    if ((flags & RESULT_CONTAINS_TOP) == 0) {
 | 
| -    // Load allocation top into result and allocation limit into t9.
 | 
| -    lw(result, MemOperand(topaddr));
 | 
| -    lw(t9, MemOperand(topaddr, kPointerSize));
 | 
| +    // Load allocation top into result and allocation limit into alloc_limit.
 | 
| +    lw(result, MemOperand(top_address));
 | 
| +    lw(alloc_limit, MemOperand(top_address, kPointerSize));
 | 
|    } else {
 | 
|      if (emit_debug_code()) {
 | 
| -      // Assert that result actually contains top on entry. t9 is used
 | 
| -      // immediately below so this use of t9 does not cause difference with
 | 
| -      // respect to register content between debug and release mode.
 | 
| -      lw(t9, MemOperand(topaddr));
 | 
| -      Check(eq, kUnexpectedAllocationTop, result, Operand(t9));
 | 
| +      // Assert that result actually contains top on entry.
 | 
| +      lw(alloc_limit, MemOperand(top_address));
 | 
| +      Check(eq, kUnexpectedAllocationTop, result, Operand(alloc_limit));
 | 
|      }
 | 
| -    // Load allocation limit into t9. Result already contains allocation top.
 | 
| -    lw(t9, MemOperand(topaddr, limit - top));
 | 
| +    // Load allocation limit. Result already contains allocation top.
 | 
| +    lw(alloc_limit, MemOperand(top_address, limit - top));
 | 
|    }
 | 
|  
 | 
|    if ((flags & DOUBLE_ALIGNMENT) != 0) {
 | 
| @@ -3409,7 +3399,7 @@ void MacroAssembler::Allocate(Register object_size, Register result,
 | 
|      Label aligned;
 | 
|      Branch(&aligned, eq, result_end, Operand(zero_reg));
 | 
|      if ((flags & PRETENURE) != 0) {
 | 
| -      Branch(gc_required, Ugreater_equal, result, Operand(t9));
 | 
| +      Branch(gc_required, Ugreater_equal, result, Operand(alloc_limit));
 | 
|      }
 | 
|      li(result_end, Operand(isolate()->factory()->one_pointer_filler_map()));
 | 
|      sw(result_end, MemOperand(result));
 | 
| @@ -3426,14 +3416,14 @@ void MacroAssembler::Allocate(Register object_size, Register result,
 | 
|    } else {
 | 
|      Addu(result_end, result, Operand(object_size));
 | 
|    }
 | 
| -  Branch(gc_required, Ugreater, result_end, Operand(t9));
 | 
| +  Branch(gc_required, Ugreater, result_end, Operand(alloc_limit));
 | 
|  
 | 
|    // Update allocation top. result temporarily holds the new top.
 | 
|    if (emit_debug_code()) {
 | 
| -    And(t9, result_end, Operand(kObjectAlignmentMask));
 | 
| -    Check(eq, kUnalignedAllocationInNewSpace, t9, Operand(zero_reg));
 | 
| +    And(alloc_limit, result_end, Operand(kObjectAlignmentMask));
 | 
| +    Check(eq, kUnalignedAllocationInNewSpace, alloc_limit, Operand(zero_reg));
 | 
|    }
 | 
| -  sw(result_end, MemOperand(topaddr));
 | 
| +  sw(result_end, MemOperand(top_address));
 | 
|  
 | 
|    // Tag object if requested.
 | 
|    if ((flags & TAG_OBJECT) != 0) {
 | 
| 
 |