From fad1b063ed174a07392561c0323355115aa66992 Mon Sep 17 00:00:00 2001 From: Jocelyn Turcotte Date: Tue, 26 Feb 2013 13:04:28 +0000 Subject: Implement JIT on Windows 64 bits https://bugs.webkit.org/show_bug.cgi?id=107965 Reviewed by Simon Hausmann. Source/JavaScriptCore: 1. MSVC doesn't support inline assembly for 64 bits, implements the trampoline in a separate ASM file. 2. Windows 64 bits has a different calling convention than other OSes following the AMD64 ABI. Differences that we have to handle here: - Registers passed parameters are RCX, RDX, R8 and R9 instead of RDI, RSI, RDX, RCX, R8 and R9 - RDI and RSI must be preserved by callee - Only return values <= 8 bytes can be returned by register (RDX can't be used to return a second word) - There is no red-zone after RIP on the stack, but instead 4 reserved words before it * Target.pri: * jit/JITStubs.cpp: * jit/JITStubs.h: (JSC): (JITStackFrame): (JSC::JITStackFrame::returnAddressSlot): * jit/JITStubsMSVC64.asm: Added. * jit/JSInterfaceJIT.h: (JSInterfaceJIT): * jit/ThunkGenerators.cpp: (JSC::nativeForGenerator): * yarr/YarrJIT.cpp: (YarrGenerator): (JSC::Yarr::YarrGenerator::generateEnter): (JSC::Yarr::YarrGenerator::generateReturn): Source/WTF: * wtf/Platform.h: Change-Id: Ie1910350e36defcd427a95ceb9aa280fa61083e7 git-svn-id: http://svn.webkit.org/repository/webkit/trunk@144043 268f45cc-cd09-0410-ab3c-d52691b4dbfc Reviewed-by: Jocelyn Turcotte --- Source/JavaScriptCore/jit/JITStubs.h | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) (limited to 'Source/JavaScriptCore/jit/JITStubs.h') diff --git a/Source/JavaScriptCore/jit/JITStubs.h b/Source/JavaScriptCore/jit/JITStubs.h index 3bf13bbdf..fe64cd9bc 100644 --- a/Source/JavaScriptCore/jit/JITStubs.h +++ b/Source/JavaScriptCore/jit/JITStubs.h @@ -99,7 +99,7 @@ namespace JSC { MacroAssemblerCodePtr ctiNativeConstruct; }; -#if CPU(X86_64) +#if !OS(WINDOWS) && CPU(X86_64) struct JITStackFrame { void* reserved; // Unused JITStubArg args[6]; @@ -120,6 +120,34 @@ namespace JSC { void* savedRBP; void* savedRIP; + // When JIT code makes a call, it pushes its return address just below the rest of the stack. + ReturnAddressPtr* returnAddressSlot() { return reinterpret_cast(this) - 1; } + }; +#elif OS(WINDOWS) && CPU(X86_64) + struct JITStackFrame { + void* shadow[4]; // Shadow space reserved for a callee's parameters home addresses + void* reserved; // Unused, also maintains the 16-bytes stack alignment + JITStubArg args[6]; + + void* savedRBX; + void* savedR15; + void* savedR14; + void* savedR13; + void* savedR12; + void* savedRBP; + void* savedRIP; + + // Home addresses for our register passed parameters + // http://msdn.microsoft.com/en-us/library/ew5tede7.aspx + void* code; + JSStack* stack; + CallFrame* callFrame; + void* unused1; + + // Passed on the stack + void* unused2; + JSGlobalData* globalData; + // When JIT code makes a call, it pushes its return address just below the rest of the stack. ReturnAddressPtr* returnAddressSlot() { return reinterpret_cast(this) - 1; } }; -- cgit v1.2.1