Index: src/x64/codegen-x64.cc |
=================================================================== |
--- src/x64/codegen-x64.cc (revision 5121) |
+++ src/x64/codegen-x64.cc (working copy) |
@@ -8051,16 +8051,21 @@ |
// Allocate scratch register for write barrier. |
Result scratch = allocator()->Allocate(); |
- ASSERT(scratch.is_valid() && |
- result.is_valid() && |
- receiver.is_valid() && |
- value.is_valid()); |
+ ASSERT(scratch.is_valid()); |
// The write barrier clobbers all input registers, so spill the |
// receiver and the value. |
frame_->Spill(receiver.reg()); |
frame_->Spill(value.reg()); |
+ // If the receiver and the value share a register allocate a new |
+ // register for the receiver. |
+ if (receiver.reg().is(value.reg())) { |
+ receiver = allocator()->Allocate(); |
+ ASSERT(receiver.is_valid()); |
+ __ movq(receiver.reg(), value.reg()); |
+ } |
+ |
// Update the write barrier. To save instructions in the inlined |
// version we do not filter smis. |
Label skip_write_barrier; |