| Index: src/x64/macro-assembler-x64.cc
|
| diff --git a/src/x64/macro-assembler-x64.cc b/src/x64/macro-assembler-x64.cc
|
| index 26202b832d577451fd41976eaaeb3c4c8f5db96d..9c60d2736b9a5d0c612d4788425436d791f5bf63 100644
|
| --- a/src/x64/macro-assembler-x64.cc
|
| +++ b/src/x64/macro-assembler-x64.cc
|
| @@ -2356,18 +2356,17 @@ void MacroAssembler::LoadAllocationTopHelper(Register result,
|
| return;
|
| }
|
|
|
| - // Move address of new object to result. Use scratch register if available.
|
| - 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 {
|
| + // Move address of new object to result. Use scratch register if available,
|
| + // and keep address in scratch until call to UpdateAllocationTopHelper.
|
| + if (scratch.is_valid()) {
|
| ASSERT(!scratch.is(result_end));
|
| movq(scratch, new_space_allocation_top);
|
| movq(result, Operand(scratch, 0));
|
| + } else if (result.is(rax)) {
|
| + load_rax(new_space_allocation_top);
|
| + } else {
|
| + movq(kScratchRegister, new_space_allocation_top);
|
| + movq(result, Operand(kScratchRegister, 0));
|
| }
|
| }
|
|
|
| @@ -2388,11 +2387,11 @@ void MacroAssembler::UpdateAllocationTopHelper(Register result_end,
|
| store_rax(new_space_allocation_top);
|
| } else {
|
| // Register required - use scratch provided if available.
|
| - if (!scratch.is_valid()) {
|
| + if (scratch.is_valid()) {
|
| + movq(Operand(scratch, 0), result_end);
|
| + } else {
|
| movq(kScratchRegister, new_space_allocation_top);
|
| movq(Operand(kScratchRegister, 0), result_end);
|
| - } else {
|
| - movq(Operand(scratch, 0), result_end);
|
| }
|
| }
|
| }
|
| @@ -2415,7 +2414,11 @@ void MacroAssembler::AllocateInNewSpace(int object_size,
|
|
|
| Register top_reg = result_end.is_valid() ? result_end : result;
|
|
|
| - lea(top_reg, Operand(result, object_size));
|
| + if (top_reg.is(result)) {
|
| + addq(top_reg, Immediate(object_size));
|
| + } else {
|
| + lea(top_reg, Operand(result, object_size));
|
| + }
|
| movq(kScratchRegister, new_space_allocation_limit);
|
| cmpq(top_reg, Operand(kScratchRegister, 0));
|
| j(above, gc_required);
|
|
|