| Index: src/x64/codegen-x64.cc
|
| diff --git a/src/x64/codegen-x64.cc b/src/x64/codegen-x64.cc
|
| index 1567255074ae453a340b8a05d51c3475efb945d2..688cd4d75b879f29ce1cbe5421051435f3fdfa93 100644
|
| --- a/src/x64/codegen-x64.cc
|
| +++ b/src/x64/codegen-x64.cc
|
| @@ -8071,6 +8071,18 @@ Result CodeGenerator::EmitNamedStore(Handle<String> name, bool is_contextual) {
|
| result = allocator()->Allocate();
|
| ASSERT(result.is_valid() && receiver.is_valid() && value.is_valid());
|
|
|
| + // 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;
|
| + }
|
| +
|
| // Check that the receiver is a heap object.
|
| Condition is_smi = __ CheckSmi(receiver.reg());
|
| slow.Branch(is_smi, &value, &receiver);
|
|
|