Author: [email protected]
Date: Fri Jul  3 03:13:05 2009
New Revision: 2351

Modified:
    branches/bleeding_edge/src/x64/codegen-x64.cc
    branches/bleeding_edge/src/x64/macro-assembler-x64.cc

Log:
X64: Exit frame should use x64 ABI callee-save registers.
Review URL: http://codereview.chromium.org/155045

Modified: branches/bleeding_edge/src/x64/codegen-x64.cc
==============================================================================
--- branches/bleeding_edge/src/x64/codegen-x64.cc       (original)
+++ branches/bleeding_edge/src/x64/codegen-x64.cc       Fri Jul  3 03:13:05 2009
@@ -6030,7 +6030,7 @@
    // rbx: pointer to C function  (C callee-saved).
    // rbp: frame pointer  (restored after C call).
    // rsp: stack pointer  (restored after C call).
-  // rdi: number of arguments including receiver.
+  // r14: number of arguments including receiver (C callee-saved).
    // r15: pointer to the first argument (C callee-saved).
    //      This pointer is reused in LeaveExitFrame(), so it is stored in a
    //      callee-saved register.
@@ -6058,11 +6058,11 @@
    // Call C function.
  #ifdef __MSVC__
    // MSVC passes arguments in rcx, rdx, r8, r9
-  __ movq(rcx, rdi);  // argc.
+  __ movq(rcx, r14);  // argc.
    __ movq(rdx, r15);  // argv.
  #else  // ! defined(__MSVC__)
    // GCC passes arguments in rdi, rsi, rdx, rcx, r8, r9.
-  // First argument is already in rdi.
+  __ movq(rdi, r14);  // argc.
    __ movq(rsi, r15);  // argv.
  #endif
    __ call(rbx);
@@ -6204,10 +6204,9 @@
  void CEntryStub::GenerateBody(MacroAssembler* masm, bool is_debug_break) {
    // rax: number of arguments including receiver
    // rbx: pointer to C function  (C callee-saved)
-  // rbp: frame pointer  (restored after C call)
+  // rbp: frame pointer of calling JS frame (restored after C call)
    // rsp: stack pointer  (restored after C call)
-  // rsi: current context (C callee-saved)
-  // rdi: caller's parameter pointer pp  (C callee-saved)
+  // rsi: current context (restored)

    // NOTE: Invocations of builtins may return failure objects
    // instead of a proper result. The builtin entry handles
@@ -6221,16 +6220,16 @@
    // Enter the exit frame that transitions from JavaScript to C++.
    __ EnterExitFrame(frame_type);

-  // rax: result parameter for PerformGC, if any (setup below).
-  //      Holds the result of a previous call to GenerateCore that
-  //      returned a failure. On next call, it's used as parameter
-  //      to Runtime::PerformGC.
+  // rax: Holds the context at this point, but should not be used.
+  //      On entry to code generated by GenerateCore, it must hold
+  //      a failure result if the collect_garbage argument to GenerateCore
+  //      is true.  This failure result can be the result of code
+  //      generated by a previous call to GenerateCore.  The value
+  //      of rax is then passed to Runtime::PerformGC.
    // rbx: pointer to builtin function  (C callee-saved).
-  // rbp: frame pointer  (restored after C call).
-  // rsp: stack pointer  (restored after C call).
-  // rdi: number of arguments including receiver (destroyed by C call).
-  //      The rdi register is not callee-save in Unix 64-bit ABI, so
-  //      we must treat it as volatile.
+  // rbp: frame pointer of exit frame  (restored after C call).
+  // rsp: stack pointer (restored after C call).
+  // r14: number of arguments including receiver (C callee-saved).
    // r15: argv pointer (C callee-saved).

    Label throw_out_of_memory_exception;

Modified: branches/bleeding_edge/src/x64/macro-assembler-x64.cc
==============================================================================
--- branches/bleeding_edge/src/x64/macro-assembler-x64.cc       (original)
+++ branches/bleeding_edge/src/x64/macro-assembler-x64.cc       Fri Jul  3  
03:13:05 2009
@@ -749,6 +749,7 @@
    ASSERT(type == StackFrame::EXIT || type == StackFrame::EXIT_DEBUG);

    // Setup the frame structure on the stack.
+  // All constants are relative to the frame pointer of the exit frame.
    ASSERT(ExitFrameConstants::kCallerSPDisplacement == +2 * kPointerSize);
    ASSERT(ExitFrameConstants::kCallerPCOffset == +1 * kPointerSize);
    ASSERT(ExitFrameConstants::kCallerFPOffset ==  0 * kPointerSize);
@@ -763,7 +764,7 @@
    // Save the frame pointer and the context in top.
    ExternalReference c_entry_fp_address(Top::k_c_entry_fp_address);
    ExternalReference context_address(Top::k_context_address);
-  movq(rdi, rax);  // Backup rax before we use it.
+  movq(r14, rax);  // Backup rax before we use it.

    movq(rax, rbp);
    store_rax(c_entry_fp_address);
@@ -773,7 +774,7 @@
    // Setup argv in callee-saved register r15. It is reused in  
LeaveExitFrame,
    // so it must be retained across the C-call.
    int offset = StandardFrameConstants::kCallerSPOffset - kPointerSize;
-  lea(r15, Operand(rbp, rdi, times_pointer_size, offset));
+  lea(r15, Operand(rbp, r14, times_pointer_size, offset));

  #ifdef ENABLE_DEBUGGER_SUPPORT
    // Save the state of all registers to the stack from the memory

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

Reply via email to