Index: src/ia32/codegen-ia32.cc |
=================================================================== |
--- src/ia32/codegen-ia32.cc (revision 5121) |
+++ src/ia32/codegen-ia32.cc (working copy) |
@@ -8917,16 +8917,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()); |
+ __ mov(receiver.reg(), Operand(value.reg())); |
+ } |
+ |
// Update the write barrier. To save instructions in the inlined |
// version we do not filter smis. |
Label skip_write_barrier; |