Reviewers: William Hesse,

Description:
Fix issue 806.

Ensure that we are not using r12 as a receiver in inlined NamedStore code.

Please review this at http://codereview.chromium.org/3081007/show

Affected files:
  M src/x64/codegen-x64.cc


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


--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev

Reply via email to