Changeset 144043 in webkit
- Timestamp:
- Feb 26, 2013 5:04:28 AM (11 years ago)
- Location:
- trunk/Source
- Files:
-
- 1 added
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r144026 r144043 1 2013-02-26 Jocelyn Turcotte <jocelyn.turcotte@digia.com> 2 3 Implement JIT on Windows 64 bits 4 https://bugs.webkit.org/show_bug.cgi?id=107965 5 6 Reviewed by Simon Hausmann. 7 8 1. MSVC doesn't support inline assembly for 64 bits, implements the trampoline in a separate ASM file. 9 10 2. Windows 64 bits has a different calling convention than other OSes following the AMD64 ABI. 11 Differences that we have to handle here: 12 - Registers passed parameters are RCX, RDX, R8 and R9 instead of RDI, RSI, RDX, RCX, R8 and R9 13 - RDI and RSI must be preserved by callee 14 - Only return values <= 8 bytes can be returned by register (RDX can't be used to return a second word) 15 - There is no red-zone after RIP on the stack, but instead 4 reserved words before it 16 17 * Target.pri: 18 * jit/JITStubs.cpp: 19 * jit/JITStubs.h: 20 (JSC): 21 (JITStackFrame): 22 (JSC::JITStackFrame::returnAddressSlot): 23 * jit/JITStubsMSVC64.asm: Added. 24 * jit/JSInterfaceJIT.h: 25 (JSInterfaceJIT): 26 * jit/ThunkGenerators.cpp: 27 (JSC::nativeForGenerator): 28 * yarr/YarrJIT.cpp: 29 (YarrGenerator): 30 (JSC::Yarr::YarrGenerator::generateEnter): 31 (JSC::Yarr::YarrGenerator::generateReturn): 32 1 33 2013-02-26 Oliver Hunt <oliver@apple.com> 2 34 -
trunk/Source/JavaScriptCore/Target.pri
r143654 r144043 336 336 } 337 337 338 win32:!win32-g++*:isEqual(QT_ARCH, "x86_64"):{ 339 asm_compiler.commands = ml64 /c 340 asm_compiler.commands += /Fo ${QMAKE_FILE_OUT} ${QMAKE_FILE_IN} 341 asm_compiler.output = ${QMAKE_VAR_OBJECTS_DIR}${QMAKE_FILE_BASE}$${first(QMAKE_EXT_OBJ)} 342 asm_compiler.input = ASM_SOURCES 343 asm_compiler.variable_out = OBJECTS 344 asm_compiler.name = compiling[asm] ${QMAKE_FILE_IN} 345 silent:asm_compiler.commands = @echo compiling[asm] ${QMAKE_FILE_IN} && $$asm_compiler.commands 346 QMAKE_EXTRA_COMPILERS += asm_compiler 347 348 ASM_SOURCES += jit/JITStubsMSVC64.asm 349 } 350 338 351 HEADERS += $$files(*.h, true) 339 352 -
trunk/Source/JavaScriptCore/jit/JITStubs.cpp
r141651 r144043 437 437 "ret" "\n" 438 438 ); 439 440 #elif COMPILER(MSVC) && CPU(X86_64) 441 442 // These ASSERTs remind you that, if you change the layout of JITStackFrame, you 443 // need to change the assembly trampolines in JITStubsMSVC64.asm to match. 444 COMPILE_ASSERT(offsetof(struct JITStackFrame, code) % 16 == 0x0, JITStackFrame_maintains_16byte_stack_alignment); 445 COMPILE_ASSERT(offsetof(struct JITStackFrame, savedRBX) == 0x58, JITStackFrame_stub_argument_space_matches_ctiTrampoline); 439 446 440 447 #else -
trunk/Source/JavaScriptCore/jit/JITStubs.h
r139541 r144043 88 88 }; 89 89 90 #if CPU(X86_64)90 #if !OS(WINDOWS) && CPU(X86_64) 91 91 struct JITStackFrame { 92 92 void* reserved; // Unused … … 108 108 void* savedRBP; 109 109 void* savedRIP; 110 111 // When JIT code makes a call, it pushes its return address just below the rest of the stack. 112 ReturnAddressPtr* returnAddressSlot() { return reinterpret_cast<ReturnAddressPtr*>(this) - 1; } 113 }; 114 #elif OS(WINDOWS) && CPU(X86_64) 115 struct JITStackFrame { 116 void* shadow[4]; // Shadow space reserved for a callee's parameters home addresses 117 void* reserved; // Unused, also maintains the 16-bytes stack alignment 118 JITStubArg args[6]; 119 120 void* savedRBX; 121 void* savedR15; 122 void* savedR14; 123 void* savedR13; 124 void* savedR12; 125 void* savedRBP; 126 void* savedRIP; 127 128 // Home addresses for our register passed parameters 129 // http://msdn.microsoft.com/en-us/library/ew5tede7.aspx 130 void* code; 131 JSStack* stack; 132 CallFrame* callFrame; 133 void* unused1; 134 135 // Passed on the stack 136 void* unused2; 137 JSGlobalData* globalData; 110 138 111 139 // When JIT code makes a call, it pushes its return address just below the rest of the stack. -
trunk/Source/JavaScriptCore/jit/JSInterfaceJIT.h
r143247 r144043 58 58 static const RegisterID returnValueRegister = X86Registers::eax; 59 59 static const RegisterID cachedResultRegister = X86Registers::eax; 60 #if !OS(WINDOWS) 60 61 static const RegisterID firstArgumentRegister = X86Registers::edi; 61 62 #else 63 static const RegisterID firstArgumentRegister = X86Registers::ecx; 64 #endif 65 62 66 #if ENABLE(VALUE_PROFILER) 63 67 static const RegisterID bucketCounterRegister = X86Registers::r10; 64 68 #endif 65 69 66 70 static const RegisterID timeoutCheckRegister = X86Registers::r12; 67 71 static const RegisterID callFrameRegister = X86Registers::r13; 68 72 static const RegisterID tagTypeNumberRegister = X86Registers::r14; 69 73 static const RegisterID tagMaskRegister = X86Registers::r15; 70 74 71 75 static const RegisterID regT0 = X86Registers::eax; 72 76 static const RegisterID regT1 = X86Registers::edx; 73 77 static const RegisterID regT2 = X86Registers::ecx; 74 78 static const RegisterID regT3 = X86Registers::ebx; 75 79 76 80 static const FPRegisterID fpRegT0 = X86Registers::xmm0; 77 81 static const FPRegisterID fpRegT1 = X86Registers::xmm1; -
trunk/Source/JavaScriptCore/jit/ThunkGenerators.cpp
r138609 r144043 265 265 jit.emitPutToCallFrameHeader(JSInterfaceJIT::regT1, JSStack::ReturnPC); 266 266 267 #if !OS(WINDOWS) 267 268 // Calling convention: f(edi, esi, edx, ecx, ...); 268 269 // Host function signature: f(ExecState*); … … 277 278 278 279 jit.addPtr(JSInterfaceJIT::TrustedImm32(16 - sizeof(int64_t)), JSInterfaceJIT::stackPointerRegister); 280 #else 281 // Calling convention: f(ecx, edx, r8, r9, ...); 282 // Host function signature: f(ExecState*); 283 jit.move(JSInterfaceJIT::callFrameRegister, X86Registers::ecx); 284 285 // Leave space for the callee parameter home addresses and align the stack. 286 jit.subPtr(JSInterfaceJIT::TrustedImm32(4 * sizeof(int64_t) + 16 - sizeof(int64_t)), JSInterfaceJIT::stackPointerRegister); 287 288 jit.emitGetFromCallFrameHeaderPtr(JSStack::Callee, X86Registers::edx); 289 jit.loadPtr(JSInterfaceJIT::Address(X86Registers::edx, JSFunction::offsetOfExecutable()), X86Registers::r9); 290 jit.move(JSInterfaceJIT::regT0, JSInterfaceJIT::callFrameRegister); // Eagerly restore caller frame register to avoid loading from stack. 291 jit.call(JSInterfaceJIT::Address(X86Registers::r9, executableOffsetToFunction)); 292 293 jit.addPtr(JSInterfaceJIT::TrustedImm32(4 * sizeof(int64_t) + 16 - sizeof(int64_t)), JSInterfaceJIT::stackPointerRegister); 294 #endif 279 295 280 296 #elif CPU(ARM) -
trunk/Source/JavaScriptCore/yarr/YarrJIT.cpp
r143018 r144043 88 88 static const RegisterID returnRegister2 = X86Registers::edx; 89 89 #elif CPU(X86_64) 90 #if !OS(WINDOWS) 90 91 static const RegisterID input = X86Registers::edi; 91 92 static const RegisterID index = X86Registers::esi; 92 93 static const RegisterID length = X86Registers::edx; 93 94 static const RegisterID output = X86Registers::ecx; 95 #else 96 // If the return value doesn't fit in 64bits, its destination is pointed by rcx and the parameters are shifted. 97 // http://msdn.microsoft.com/en-us/library/7572ztz4.aspx 98 COMPILE_ASSERT(sizeof(MatchResult) > sizeof(void*), MatchResult_does_not_fit_in_64bits); 99 static const RegisterID input = X86Registers::edx; 100 static const RegisterID index = X86Registers::r8; 101 static const RegisterID length = X86Registers::r9; 102 static const RegisterID output = X86Registers::r10; 103 #endif 94 104 95 105 static const RegisterID regT0 = X86Registers::eax; … … 2515 2525 move(stackPointerRegister, X86Registers::ebp); 2516 2526 push(X86Registers::ebx); 2527 #if OS(WINDOWS) 2528 if (compileMode == IncludeSubpatterns) 2529 loadPtr(Address(X86Registers::ebp, 6 * sizeof(void*)), output); 2530 #endif 2517 2531 #elif CPU(X86) 2518 2532 push(X86Registers::ebp); … … 2553 2567 { 2554 2568 #if CPU(X86_64) 2569 #if OS(WINDOWS) 2570 // Store the return value in the allocated space pointed by rcx. 2571 store64(returnRegister, Address(X86Registers::ecx)); 2572 store64(returnRegister2, Address(X86Registers::ecx, sizeof(void*))); 2573 move(X86Registers::ecx, returnRegister); 2574 #endif 2555 2575 pop(X86Registers::ebx); 2556 2576 pop(X86Registers::ebp); -
trunk/Source/WTF/ChangeLog
r144020 r144043 1 2013-02-26 Jocelyn Turcotte <jocelyn.turcotte@digia.com> 2 3 Implement JIT on Windows 64 bits 4 https://bugs.webkit.org/show_bug.cgi?id=107965 5 6 Reviewed by Simon Hausmann. 7 8 * wtf/Platform.h: 9 1 10 2013-02-26 Oliver Hunt <oliver@apple.com> 2 11 -
trunk/Source/WTF/wtf/Platform.h
r143247 r144043 757 757 #endif 758 758 759 /* JIT is not implemented for Windows 64-bit */760 #if !defined(ENABLE_JIT) && OS(WINDOWS) && CPU(X86_64)761 #define ENABLE_JIT 0762 #define ENABLE_YARR_JIT 0763 #endif764 765 759 #if !defined(ENABLE_JIT) && CPU(SH4) && PLATFORM(QT) 766 760 #define ENABLE_JIT 1 … … 907 901 On x86-64 we use a single fixed mmap, on other platforms we mmap on demand. */ 908 902 #if ENABLE(ASSEMBLER) 909 #if CPU(X86_64) || PLATFORM(IOS)903 #if CPU(X86_64) && !OS(WINDOWS) || PLATFORM(IOS) 910 904 #define ENABLE_EXECUTABLE_ALLOCATOR_FIXED 1 911 905 #else
Note: See TracChangeset
for help on using the changeset viewer.