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); |