| Index: src/x64/codegen-x64.cc
|
| ===================================================================
|
| --- src/x64/codegen-x64.cc (revision 7609)
|
| +++ src/x64/codegen-x64.cc (working copy)
|
| @@ -8195,9 +8195,17 @@
|
| result = allocator()->Allocate();
|
| ASSERT(result.is_valid());
|
|
|
| - // r12 is now a reserved register, so it cannot be the receiver.
|
| - // If it was, the distance to the fixup location would not be constant.
|
| - ASSERT(!receiver.reg().is(r12));
|
| + // Cannot use r12 for receiver, because that changes
|
| + // the distance between a call and a fixup location,
|
| + // due to a special encoding of r12 as r/m in a ModR/M byte.
|
| + if (receiver.reg().is(r12)) {
|
| + frame()->Spill(receiver.reg()); // It will be overwritten with result.
|
| + // Swap receiver and value.
|
| + __ movq(result.reg(), receiver.reg());
|
| + Result temp = receiver;
|
| + receiver = result;
|
| + result = temp;
|
| + }
|
|
|
| DeferredReferenceGetNamedValue* deferred =
|
| new DeferredReferenceGetNamedValue(result.reg(), receiver.reg(), name);
|
|
|