diff options
| author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2015-05-20 09:56:07 +0000 |
|---|---|---|
| committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2015-05-20 09:56:07 +0000 |
| commit | 41386e9cb918eed93b3f13648cbef387e371e451 (patch) | |
| tree | a97f9d7bd1d9d091833286085f72da9d83fd0606 /Source/JavaScriptCore/ftl/FTLThunks.cpp | |
| parent | e15dd966d523731101f70ccf768bba12435a0208 (diff) | |
| download | WebKitGtk-tarball-41386e9cb918eed93b3f13648cbef387e371e451.tar.gz | |
webkitgtk-2.4.9webkitgtk-2.4.9
Diffstat (limited to 'Source/JavaScriptCore/ftl/FTLThunks.cpp')
| -rw-r--r-- | Source/JavaScriptCore/ftl/FTLThunks.cpp | 77 |
1 files changed, 16 insertions, 61 deletions
diff --git a/Source/JavaScriptCore/ftl/FTLThunks.cpp b/Source/JavaScriptCore/ftl/FTLThunks.cpp index f2198ad2b..bf04af02a 100644 --- a/Source/JavaScriptCore/ftl/FTLThunks.cpp +++ b/Source/JavaScriptCore/ftl/FTLThunks.cpp @@ -39,28 +39,19 @@ namespace JSC { namespace FTL { using namespace DFG; -MacroAssemblerCodeRef osrExitGenerationThunkGenerator(VM* vm) +MacroAssemblerCodeRef osrExitGenerationThunkGenerator(VM& vm, const Location& location) { - AssemblyHelpers jit(vm, 0); + AssemblyHelpers jit(&vm, 0); // Note that the "return address" will be the OSR exit ID. - ptrdiff_t stackMisalignment = MacroAssembler::pushToSaveByteOffset(); - // Pretend that we're a C call frame. - jit.pushToSave(MacroAssembler::framePointerRegister); + jit.push(MacroAssembler::framePointerRegister); jit.move(MacroAssembler::stackPointerRegister, MacroAssembler::framePointerRegister); - stackMisalignment += MacroAssembler::pushToSaveByteOffset(); + jit.push(GPRInfo::regT0); + jit.push(GPRInfo::regT0); - // Now create ourselves enough stack space to give saveAllRegisters() a scratch slot. - unsigned numberOfRequiredPops = 0; - do { - jit.pushToSave(GPRInfo::regT0); - stackMisalignment += MacroAssembler::pushToSaveByteOffset(); - numberOfRequiredPops++; - } while (stackMisalignment % stackAlignmentBytes()); - - ScratchBuffer* scratchBuffer = vm->scratchBufferForSize(requiredScratchMemorySizeInBytes()); + ScratchBuffer* scratchBuffer = vm.scratchBufferForSize(requiredScratchMemorySizeInBytes()); char* buffer = static_cast<char*>(scratchBuffer->dataBuffer()); saveAllRegisters(jit, buffer); @@ -69,10 +60,8 @@ MacroAssemblerCodeRef osrExitGenerationThunkGenerator(VM* vm) jit.move(MacroAssembler::TrustedImmPtr(scratchBuffer->activeLengthPtr()), GPRInfo::nonArgGPR1); jit.storePtr(MacroAssembler::TrustedImmPtr(requiredScratchMemorySizeInBytes()), GPRInfo::nonArgGPR1); - jit.loadPtr(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); - jit.peek( - GPRInfo::argumentGPR1, - (stackMisalignment - MacroAssembler::pushToSaveByteOffset()) / sizeof(void*)); + location.restoreInto(jit, buffer, GPRInfo::argumentGPR0, 1); + jit.peek(GPRInfo::argumentGPR1, 3); MacroAssembler::Call functionCall = jit.call(); // At this point we want to make a tail call to what was returned to us in the @@ -82,56 +71,24 @@ MacroAssemblerCodeRef osrExitGenerationThunkGenerator(VM* vm) jit.move(GPRInfo::returnValueGPR, GPRInfo::regT0); - // Make sure we tell the GC that we're not using the scratch buffer anymore. - jit.move(MacroAssembler::TrustedImmPtr(scratchBuffer->activeLengthPtr()), GPRInfo::regT1); - jit.storePtr(MacroAssembler::TrustedImmPtr(0), GPRInfo::regT1); - // Prepare for tail call. - while (numberOfRequiredPops--) - jit.popToRestore(GPRInfo::regT1); - jit.popToRestore(MacroAssembler::framePointerRegister); + jit.pop(GPRInfo::regT1); + jit.pop(GPRInfo::regT1); + jit.pop(MacroAssembler::framePointerRegister); // At this point we're sitting on the return address - so if we did a jump right now, the // tail-callee would be happy. Instead we'll stash the callee in the return address and then // restore all registers. jit.restoreReturnAddressBeforeReturn(GPRInfo::regT0); - + restoreAllRegisters(jit, buffer); jit.ret(); - LinkBuffer patchBuffer(*vm, jit, GLOBAL_THUNK_ID); + LinkBuffer patchBuffer(vm, &jit, GLOBAL_THUNK_ID); patchBuffer.link(functionCall, compileFTLOSRExit); - return FINALIZE_CODE(patchBuffer, ("FTL OSR exit generation thunk")); -} - -static void registerClobberCheck(AssemblyHelpers& jit, RegisterSet dontClobber) -{ - if (!Options::clobberAllRegsInFTLICSlowPath()) - return; - - RegisterSet clobber = RegisterSet::allRegisters(); - clobber.exclude(RegisterSet::reservedHardwareRegisters()); - clobber.exclude(RegisterSet::stackRegisters()); - clobber.exclude(RegisterSet::calleeSaveRegisters()); - clobber.exclude(dontClobber); - - GPRReg someGPR; - for (Reg reg = Reg::first(); reg <= Reg::last(); reg = reg.next()) { - if (!clobber.get(reg) || !reg.isGPR()) - continue; - - jit.move(AssemblyHelpers::TrustedImm32(0x1337beef), reg.gpr()); - someGPR = reg.gpr(); - } - - for (Reg reg = Reg::first(); reg <= Reg::last(); reg = reg.next()) { - if (!clobber.get(reg) || !reg.isFPR()) - continue; - - jit.move64ToDouble(someGPR, reg.fpr()); - } + return FINALIZE_CODE(patchBuffer, ("FTL OSR exit generation thunk for callFrame at %s", toCString(location).data())); } MacroAssemblerCodeRef slowPathCallThunkGenerator(VM& vm, const SlowPathCallKey& key) @@ -165,10 +122,8 @@ MacroAssemblerCodeRef slowPathCallThunkGenerator(VM& vm, const SlowPathCallKey& jit.preserveReturnAddressAfterCall(GPRInfo::nonArgGPR0); jit.storePtr(GPRInfo::nonArgGPR0, AssemblyHelpers::Address(MacroAssembler::stackPointerRegister, key.offset())); - registerClobberCheck(jit, key.argumentRegisters()); + JITCompiler::Call call = jit.call(); - AssemblyHelpers::Call call = jit.call(); - jit.loadPtr(AssemblyHelpers::Address(MacroAssembler::stackPointerRegister, key.offset()), GPRInfo::nonPreservedNonReturnGPR); jit.restoreReturnAddressBeforeReturn(GPRInfo::nonPreservedNonReturnGPR); @@ -192,7 +147,7 @@ MacroAssemblerCodeRef slowPathCallThunkGenerator(VM& vm, const SlowPathCallKey& jit.ret(); - LinkBuffer patchBuffer(vm, jit, GLOBAL_THUNK_ID); + LinkBuffer patchBuffer(vm, &jit, GLOBAL_THUNK_ID); patchBuffer.link(call, FunctionPtr(key.callTarget())); return FINALIZE_CODE(patchBuffer, ("FTL slow path call thunk for %s", toCString(key).data())); } |
