Reviewers: William Hesse,

Message:
Small review.

Description:
X64/Win64: Fix bug in returning ObjectPair.
Used the registers to test for failure before loading the result from the  
stack.

Please review this at http://codereview.chromium.org/335006

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


Index: src/x64/codegen-x64.cc
diff --git a/src/x64/codegen-x64.cc b/src/x64/codegen-x64.cc
index  
d36af8c794baff92b507bbcb3cfbb4e9c33a5eaf..a4fd5928e92eee1811069b67014764389f18be2c
  
100644
--- a/src/x64/codegen-x64.cc
+++ b/src/x64/codegen-x64.cc
@@ -6862,6 +6862,15 @@ void CEntryStub::GenerateCore(MacroAssembler* masm,
    // Check for failure result.
    Label failure_returned;
    ASSERT(((kFailureTag + 1) & kFailureTagMask) == 0);
+#ifdef _WIN64
+  // If return value is on the stack, pop it to registers.
+  if (result_size_ > 1) {
+    ASSERT_EQ(2, result_size_);
+    // Position above 4 argument mirrors and arguments object.
+    __ movq(rax, Operand(rsp, 6 * kPointerSize));
+    __ movq(rdx, Operand(rsp, 7 * kPointerSize));
+  }
+#endif
    __ lea(rcx, Operand(rax, 1));
    // Lower 2 bits of rcx are 0 iff rax has failure tag.
    __ testl(rcx, Immediate(kFailureTagMask));
Index: src/x64/macro-assembler-x64.cc
diff --git a/src/x64/macro-assembler-x64.cc b/src/x64/macro-assembler-x64.cc
index  
61a8319fd26cb09949de74ee7373bcc9bb228dd1..b2f69bb7a99de3047e2d9a0760793957f029fd10
  
100644
--- a/src/x64/macro-assembler-x64.cc
+++ b/src/x64/macro-assembler-x64.cc
@@ -1880,16 +1880,6 @@ void MacroAssembler::LeaveExitFrame(StackFrame::Type  
type, int result_size) {
    movq(rcx, Operand(rbp, 1 * kPointerSize));
    movq(rbp, Operand(rbp, 0 * kPointerSize));

-#ifdef _WIN64
-  // If return value is on the stack, pop it to registers.
-  if (result_size > 1) {
-    ASSERT_EQ(2, result_size);
-    // Position above 4 argument mirrors and arguments object.
-    movq(rax, Operand(rsp, 6 * kPointerSize));
-    movq(rdx, Operand(rsp, 7 * kPointerSize));
-  }
-#endif
-
    // Pop everything up to and including the arguments and the receiver
    // from the caller stack.
    lea(rsp, Operand(r15, 1 * kPointerSize));



--~--~---------~--~----~------------~-------~--~----~
v8-dev mailing list
v8-dev@googlegroups.com
http://groups.google.com/group/v8-dev
-~----------~----~----~----~------~----~------~--~---

Reply via email to