Revision: 2791
Author: [email protected]
Date: Tue Sep 1 03:40:00 2009
Log: X64: Obey WIN64 ABI more exactly, in WIN64 build.
Review URL: http://codereview.chromium.org/182027
http://code.google.com/p/v8/source/detail?r=2791
Modified:
/branches/bleeding_edge/src/x64/codegen-x64.cc
/branches/bleeding_edge/src/x64/macro-assembler-x64.cc
=======================================
--- /branches/bleeding_edge/src/x64/codegen-x64.cc Mon Aug 31 01:57:36 2009
+++ /branches/bleeding_edge/src/x64/codegen-x64.cc Tue Sep 1 03:40:00 2009
@@ -6953,11 +6953,11 @@
// Call C function.
#ifdef _WIN64
// Windows 64-bit ABI passes arguments in rcx, rdx, r8, r9
- // Store Arguments object on stack
- __ movq(Operand(rsp, 1 * kPointerSize), r14); // argc.
- __ movq(Operand(rsp, 2 * kPointerSize), r15); // argv.
+ // Store Arguments object on stack, below the 4 WIN64 ABI parameter
slots.
+ __ movq(Operand(rsp, 4 * kPointerSize), r14); // argc.
+ __ movq(Operand(rsp, 5 * kPointerSize), r15); // argv.
// Pass a pointer to the Arguments object as the first argument.
- __ lea(rcx, Operand(rsp, 1 * kPointerSize));
+ __ lea(rcx, Operand(rsp, 4 * kPointerSize));
#else // ! defined(_WIN64)
// GCC passes arguments in rdi, rsi, rdx, rcx, r8, r9.
__ movq(rdi, r14); // argc.
=======================================
--- /branches/bleeding_edge/src/x64/macro-assembler-x64.cc Mon Aug 31
01:57:36 2009
+++ /branches/bleeding_edge/src/x64/macro-assembler-x64.cc Tue Sep 1
03:40:00 2009
@@ -1010,12 +1010,6 @@
}
#endif
- // Reserve space for the Arguments object. The Windows 64-bit ABI
- // requires us to pass this structure as a pointer to its location on
- // the stack. We also need backing space for the pointer, even though
- // it is passed in a register.
- subq(rsp, Immediate(3 * kPointerSize));
-
// Get the required frame alignment for the OS.
static const int kFrameAlignment = OS::ActivationFrameAlignment();
if (kFrameAlignment > 0) {
@@ -1023,6 +1017,17 @@
movq(kScratchRegister, Immediate(-kFrameAlignment));
and_(rsp, kScratchRegister);
}
+
+#ifdef _WIN64
+ // Reserve space for the Arguments object. The Windows 64-bit ABI
+ // requires us to pass this structure as a pointer to its location on
+ // the stack. The structure contains 2 pointers.
+ // The structure on the stack must be 16-byte aligned.
+ // We also need backing space for 4 parameters, even though
+ // we only pass one parameter, and it is in a register.
+ subq(rsp, Immediate(6 * kPointerSize));
+ ASSERT(kFrameAlignment == 2 * kPointerSize); // Change the padding if
needed.
+#endif
// Patch the saved entry sp.
movq(Operand(rbp, ExitFrameConstants::kSPOffset), rsp);
--~--~---------~--~----~------------~-------~--~----~
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
-~----------~----~----~----~------~----~------~--~---