Changeset 222009 in webkit for trunk/Source/JavaScriptCore/dfg/DFGThunks.cpp
- Timestamp:
- Sep 13, 2017, 9:21:05 PM (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/dfg/DFGThunks.cpp
r221832 r222009 41 41 namespace JSC { namespace DFG { 42 42 43 MacroAssemblerCodeRef osrExit ThunkGenerator(VM* vm)43 MacroAssemblerCodeRef osrExitGenerationThunkGenerator(VM* vm) 44 44 { 45 45 MacroAssembler jit; 46 jit.probe(OSRExit::executeOSRExit, vm); 46 47 // This needs to happen before we use the scratch buffer because this function also uses the scratch buffer. 48 adjustFrameAndStackInOSRExitCompilerThunk<DFG::JITCode>(jit, vm, JITCode::DFGJIT); 49 50 size_t scratchSize = sizeof(EncodedJSValue) * (GPRInfo::numberOfRegisters + FPRInfo::numberOfRegisters); 51 ScratchBuffer* scratchBuffer = vm->scratchBufferForSize(scratchSize); 52 EncodedJSValue* buffer = static_cast<EncodedJSValue*>(scratchBuffer->dataBuffer()); 53 54 for (unsigned i = 0; i < GPRInfo::numberOfRegisters; ++i) { 55 #if USE(JSVALUE64) 56 jit.store64(GPRInfo::toRegister(i), buffer + i); 57 #else 58 jit.store32(GPRInfo::toRegister(i), buffer + i); 59 #endif 60 } 61 for (unsigned i = 0; i < FPRInfo::numberOfRegisters; ++i) { 62 jit.move(MacroAssembler::TrustedImmPtr(buffer + GPRInfo::numberOfRegisters + i), GPRInfo::regT0); 63 jit.storeDouble(FPRInfo::toRegister(i), MacroAssembler::Address(GPRInfo::regT0)); 64 } 65 66 // Tell GC mark phase how much of the scratch buffer is active during call. 67 jit.move(MacroAssembler::TrustedImmPtr(scratchBuffer->addressOfActiveLength()), GPRInfo::regT0); 68 jit.storePtr(MacroAssembler::TrustedImmPtr(scratchSize), MacroAssembler::Address(GPRInfo::regT0)); 69 70 // Set up one argument. 71 #if CPU(X86) 72 jit.poke(GPRInfo::callFrameRegister, 0); 73 #else 74 jit.move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); 75 #endif 76 77 MacroAssembler::Call functionCall = jit.call(); 78 79 jit.move(MacroAssembler::TrustedImmPtr(scratchBuffer->addressOfActiveLength()), GPRInfo::regT0); 80 jit.storePtr(MacroAssembler::TrustedImmPtr(0), MacroAssembler::Address(GPRInfo::regT0)); 81 82 for (unsigned i = 0; i < FPRInfo::numberOfRegisters; ++i) { 83 jit.move(MacroAssembler::TrustedImmPtr(buffer + GPRInfo::numberOfRegisters + i), GPRInfo::regT0); 84 jit.loadDouble(MacroAssembler::Address(GPRInfo::regT0), FPRInfo::toRegister(i)); 85 } 86 for (unsigned i = 0; i < GPRInfo::numberOfRegisters; ++i) { 87 #if USE(JSVALUE64) 88 jit.load64(buffer + i, GPRInfo::toRegister(i)); 89 #else 90 jit.load32(buffer + i, GPRInfo::toRegister(i)); 91 #endif 92 } 93 94 jit.jump(MacroAssembler::AbsoluteAddress(&vm->osrExitJumpDestination)); 95 47 96 LinkBuffer patchBuffer(jit, GLOBAL_THUNK_ID); 48 return FINALIZE_CODE(patchBuffer, ("DFG OSR exit thunk")); 97 98 patchBuffer.link(functionCall, OSRExit::compileOSRExit); 99 100 return FINALIZE_CODE(patchBuffer, ("DFG OSR exit generation thunk")); 49 101 } 50 102
Note:
See TracChangeset
for help on using the changeset viewer.