Index: src/x64/macro-assembler-x64.cc |
diff --git a/src/x64/macro-assembler-x64.cc b/src/x64/macro-assembler-x64.cc |
index d706fc1acd230f37e940c50a4e0b44dcb689123f..ec0456f3dd731116beca54389ae7cdf00f14d9bb 100644 |
--- a/src/x64/macro-assembler-x64.cc |
+++ b/src/x64/macro-assembler-x64.cc |
@@ -2335,7 +2335,7 @@ void MacroAssembler::LoadAllocationTopHelper(Register result, |
// Just return if allocation top is already known. |
if ((flags & RESULT_CONTAINS_TOP) != 0) { |
// No use of scratch if allocation top is provided. |
- ASSERT(scratch.is(no_reg)); |
+ ASSERT(!scratch.is_valid()); |
#ifdef DEBUG |
// Assert that result actually contains top on entry. |
movq(kScratchRegister, new_space_allocation_top); |
@@ -2346,9 +2346,13 @@ void MacroAssembler::LoadAllocationTopHelper(Register result, |
} |
// Move address of new object to result. Use scratch register if available. |
- if (scratch.is(no_reg)) { |
- movq(kScratchRegister, new_space_allocation_top); |
- movq(result, Operand(kScratchRegister, 0)); |
+ if (!scratch.is_valid()) { |
+ if (result.is(rax)) { |
+ load_rax(new_space_allocation_top); |
+ } else { |
+ movq(kScratchRegister, new_space_allocation_top); |
+ movq(result, Operand(kScratchRegister, 0)); |
+ } |
} else { |
ASSERT(!scratch.is(result_end)); |
movq(scratch, new_space_allocation_top); |
@@ -2373,7 +2377,7 @@ void MacroAssembler::UpdateAllocationTopHelper(Register result_end, |
store_rax(new_space_allocation_top); |
} else { |
// Register required - use scratch provided if available. |
- if (scratch.is(no_reg)) { |
+ if (!scratch.is_valid()) { |
movq(kScratchRegister, new_space_allocation_top); |
movq(Operand(kScratchRegister, 0), result_end); |
} else { |
@@ -2397,16 +2401,25 @@ void MacroAssembler::AllocateInNewSpace(int object_size, |
// Calculate new top and bail out if new space is exhausted. |
ExternalReference new_space_allocation_limit = |
ExternalReference::new_space_allocation_limit_address(); |
- lea(result_end, Operand(result, object_size)); |
+ |
+ Register top_reg = result_end.is_valid() ? result_end : result; |
+ |
+ lea(top_reg, Operand(result, object_size)); |
movq(kScratchRegister, new_space_allocation_limit); |
- cmpq(result_end, Operand(kScratchRegister, 0)); |
+ cmpq(top_reg, Operand(kScratchRegister, 0)); |
j(above, gc_required); |
// Update allocation top. |
- UpdateAllocationTopHelper(result_end, scratch); |
+ UpdateAllocationTopHelper(top_reg, scratch); |
- // Tag the result if requested. |
- if ((flags & TAG_OBJECT) != 0) { |
+ if (top_reg.is(result)) { |
+ if ((flags & TAG_OBJECT) != 0) { |
+ subq(result, Immediate(object_size - kHeapObjectTag)); |
+ } else { |
+ subq(result, Immediate(object_size)); |
+ } |
+ } else if ((flags & TAG_OBJECT) != 0) { |
+ // Tag the result if requested. |
addq(result, Immediate(kHeapObjectTag)); |
} |
} |