diff options
author | Frederik Gladhorn <frederik.gladhorn@digia.com> | 2013-04-03 14:57:41 +0200 |
---|---|---|
committer | Frederik Gladhorn <frederik.gladhorn@digia.com> | 2013-04-03 14:57:42 +0200 |
commit | 276fb8ee82394b8fe414196677ce6af4028c5652 (patch) | |
tree | 10fb46e05a825f367dce6204a90d93b83e7f8718 /Source/JavaScriptCore/jit | |
parent | 3436b01e6296fa23d6b7a2fad875af6116a9650b (diff) | |
parent | fad1b063ed174a07392561c0323355115aa66992 (diff) | |
download | qtwebkit-276fb8ee82394b8fe414196677ce6af4028c5652.tar.gz |
Merge remote-tracking branch 'origin/stable' into dev
Change-Id: Ibb1f73326070b66000c54c3c722a45cb7b4791c1
Diffstat (limited to 'Source/JavaScriptCore/jit')
-rw-r--r-- | Source/JavaScriptCore/jit/JITOpcodes.cpp | 16 | ||||
-rw-r--r-- | Source/JavaScriptCore/jit/JITStubs.cpp | 7 | ||||
-rw-r--r-- | Source/JavaScriptCore/jit/JITStubs.h | 30 | ||||
-rw-r--r-- | Source/JavaScriptCore/jit/JITStubsMSVC64.asm | 84 | ||||
-rw-r--r-- | Source/JavaScriptCore/jit/JSInterfaceJIT.h | 12 |
5 files changed, 144 insertions, 5 deletions
diff --git a/Source/JavaScriptCore/jit/JITOpcodes.cpp b/Source/JavaScriptCore/jit/JITOpcodes.cpp index 9f0ce3a77..36e7ece1b 100644 --- a/Source/JavaScriptCore/jit/JITOpcodes.cpp +++ b/Source/JavaScriptCore/jit/JITOpcodes.cpp @@ -244,6 +244,7 @@ JIT::Label JIT::privateCompileCTINativeCall(JSGlobalData* globalData, bool isCon peek(regT1); emitPutToCallFrameHeader(regT1, JSStack::ReturnPC); +#if !OS(WINDOWS) // Calling convention: f(edi, esi, edx, ecx, ...); // Host function signature: f(ExecState*); move(callFrameRegister, X86Registers::edi); @@ -256,6 +257,21 @@ JIT::Label JIT::privateCompileCTINativeCall(JSGlobalData* globalData, bool isCon call(Address(X86Registers::r9, executableOffsetToFunction)); addPtr(TrustedImm32(16 - sizeof(int64_t)), stackPointerRegister); +#else + // Calling convention: f(ecx, edx, r8, r9, ...); + // Host function signature: f(ExecState*); + move(callFrameRegister, X86Registers::ecx); + + // Leave space for the callee parameter home addresses and align the stack. + subPtr(TrustedImm32(4 * sizeof(int64_t) + 16 - sizeof(int64_t)), stackPointerRegister); + + emitGetFromCallFrameHeaderPtr(JSStack::Callee, X86Registers::edx); + loadPtr(Address(X86Registers::edx, OBJECT_OFFSETOF(JSFunction, m_executable)), X86Registers::r9); + move(regT0, callFrameRegister); // Eagerly restore caller frame register to avoid loading from stack. + call(Address(X86Registers::r9, executableOffsetToFunction)); + + addPtr(TrustedImm32(4 * sizeof(int64_t) + 16 - sizeof(int64_t)), stackPointerRegister); +#endif #elif CPU(ARM) // Load caller frame's scope chain into this callframe so that whatever we call can diff --git a/Source/JavaScriptCore/jit/JITStubs.cpp b/Source/JavaScriptCore/jit/JITStubs.cpp index fbef1fcb9..eca0fb079 100644 --- a/Source/JavaScriptCore/jit/JITStubs.cpp +++ b/Source/JavaScriptCore/jit/JITStubs.cpp @@ -433,6 +433,13 @@ SYMBOL_STRING(ctiOpThrowNotCaught) ":" "\n" "ret" "\n" ); +#elif COMPILER(MSVC) && CPU(X86_64) + +// These ASSERTs remind you that, if you change the layout of JITStackFrame, you +// need to change the assembly trampolines in JITStubsMSVC64.asm to match. +COMPILE_ASSERT(offsetof(struct JITStackFrame, code) % 16 == 0x0, JITStackFrame_maintains_16byte_stack_alignment); +COMPILE_ASSERT(offsetof(struct JITStackFrame, savedRBX) == 0x58, JITStackFrame_stub_argument_space_matches_ctiTrampoline); + #else #error "JIT not supported on this platform." #endif 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]; @@ -123,6 +123,34 @@ namespace JSC { // When JIT code makes a call, it pushes its return address just below the rest of the stack. ReturnAddressPtr* returnAddressSlot() { return reinterpret_cast<ReturnAddressPtr*>(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<ReturnAddressPtr*>(this) - 1; } + }; #elif CPU(X86) #if COMPILER(MSVC) || (OS(WINDOWS) && COMPILER(GCC)) #pragma pack(push) diff --git a/Source/JavaScriptCore/jit/JITStubsMSVC64.asm b/Source/JavaScriptCore/jit/JITStubsMSVC64.asm new file mode 100644 index 000000000..4a00e0d14 --- /dev/null +++ b/Source/JavaScriptCore/jit/JITStubsMSVC64.asm @@ -0,0 +1,84 @@ +;/* +; Copyright (C) 2013 Digia Plc. and/or its subsidiary(-ies) +; +; Redistribution and use in source and binary forms, with or without +; modification, are permitted provided that the following conditions +; are met: +; 1. Redistributions of source code must retain the above copyright +; notice, this list of conditions and the following disclaimer. +; 2. Redistributions in binary form must reproduce the above copyright +; notice, this list of conditions and the following disclaimer in the +; documentation and/or other materials provided with the distribution. +; +; THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY +; EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR +; CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +; EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +; PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +; OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +;*/ + +EXTERN cti_vm_throw : near +PUBLIC ctiTrampoline +PUBLIC ctiVMThrowTrampoline +PUBLIC ctiOpThrowNotCaught + +_TEXT SEGMENT + +ctiTrampoline PROC + ; Dump register parameters to their home address + mov qword ptr[rsp+20h], r9 + mov qword ptr[rsp+18h], r8 + mov qword ptr[rsp+10h], rdx + mov qword ptr[rsp+8h], rcx + + push rbp + mov rbp, rsp + push r12 + push r13 + push r14 + push r15 + push rbx + + ; Decrease rsp to point to the start of our JITStackFrame + sub rsp, 58h + mov r12, 512 + mov r14, 0FFFF000000000000h + mov r15, 0FFFF000000000002h + mov r13, r8 + call rcx + add rsp, 58h + pop rbx + pop r15 + pop r14 + pop r13 + pop r12 + pop rbp + ret +ctiTrampoline ENDP + +ctiVMThrowTrampoline PROC + mov rcx, rsp + call cti_vm_throw + int 3 +ctiVMThrowTrampoline ENDP + +ctiOpThrowNotCaught PROC + add rsp, 58h + pop rbx + pop r15 + pop r14 + pop r13 + pop r12 + pop rbp + ret +ctiOpThrowNotCaught ENDP + +_TEXT ENDS + +END
\ No newline at end of file diff --git a/Source/JavaScriptCore/jit/JSInterfaceJIT.h b/Source/JavaScriptCore/jit/JSInterfaceJIT.h index d2a91ba0a..ad546d963 100644 --- a/Source/JavaScriptCore/jit/JSInterfaceJIT.h +++ b/Source/JavaScriptCore/jit/JSInterfaceJIT.h @@ -57,22 +57,26 @@ namespace JSC { #if CPU(X86_64) static const RegisterID returnValueRegister = X86Registers::eax; static const RegisterID cachedResultRegister = X86Registers::eax; +#if !OS(WINDOWS) static const RegisterID firstArgumentRegister = X86Registers::edi; - +#else + static const RegisterID firstArgumentRegister = X86Registers::ecx; +#endif + #if ENABLE(VALUE_PROFILER) static const RegisterID bucketCounterRegister = X86Registers::r10; #endif - + static const RegisterID timeoutCheckRegister = X86Registers::r12; static const RegisterID callFrameRegister = X86Registers::r13; static const RegisterID tagTypeNumberRegister = X86Registers::r14; static const RegisterID tagMaskRegister = X86Registers::r15; - + static const RegisterID regT0 = X86Registers::eax; static const RegisterID regT1 = X86Registers::edx; static const RegisterID regT2 = X86Registers::ecx; static const RegisterID regT3 = X86Registers::ebx; - + static const FPRegisterID fpRegT0 = X86Registers::xmm0; static const FPRegisterID fpRegT1 = X86Registers::xmm1; static const FPRegisterID fpRegT2 = X86Registers::xmm2; |