| Index: src/arm/builtins-arm.cc
|
| diff --git a/src/arm/builtins-arm.cc b/src/arm/builtins-arm.cc
|
| index dbb8242c556a1954400c696caa9b7226780587a4..f14d77af0a8d7654b2eb82ddeed0e704e3f89077 100644
|
| --- a/src/arm/builtins-arm.cc
|
| +++ b/src/arm/builtins-arm.cc
|
| @@ -1156,12 +1156,48 @@ void Builtins::Generate_NotifyLazyDeoptimized(MacroAssembler* masm) {
|
|
|
|
|
| void Builtins::Generate_NotifyOSR(MacroAssembler* masm) {
|
| - __ stop("builtins-arm.cc: NotifyOSR");
|
| + // For now, we are relying on the fact that Runtime::NotifyOSR
|
| + // doesn't do any garbage collection which allows us to save/restore
|
| + // the registers without worrying about which of them contain
|
| + // pointers. This seems a bit fragile.
|
| + __ stm(db_w, sp, kJSCallerSaved | kCalleeSaved | lr.bit() | fp.bit());
|
| + __ EnterInternalFrame();
|
| + __ CallRuntime(Runtime::kNotifyOSR, 0);
|
| + __ LeaveInternalFrame();
|
| + __ ldm(ia_w, sp, kJSCallerSaved | kCalleeSaved | lr.bit() | fp.bit());
|
| + __ Ret();
|
| }
|
|
|
|
|
| void Builtins::Generate_OnStackReplacement(MacroAssembler* masm) {
|
| - __ stop("builtins-arm.cc: OnStackReplacement");
|
| + // Probe the CPU to set the supported features, because this builtin
|
| + // may be called before the initialization performs CPU setup.
|
| + CpuFeatures::Probe(false);
|
| +
|
| + // Lookup the function in the JavaScript frame and push it as an
|
| + // argument to the on-stack replacement function.
|
| + __ ldr(r0, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset));
|
| + __ EnterInternalFrame();
|
| + __ push(r0);
|
| + __ CallRuntime(Runtime::kCompileForOnStackReplacement, 1);
|
| + __ LeaveInternalFrame();
|
| +
|
| + // If the result was -1 it means that we couldn't optimize the
|
| + // function. Just return and continue in the unoptimized version.
|
| + Label skip;
|
| + __ cmp(r0, Operand(Smi::FromInt(-1)));
|
| + __ b(ne, &skip);
|
| + __ Ret();
|
| +
|
| + __ bind(&skip);
|
| + // Untag the AST id and push it on the stack.
|
| + __ SmiUntag(r0);
|
| + __ push(r0);
|
| +
|
| + // Generate the code for doing the frame-to-frame translation using
|
| + // the deoptimizer infrastructure.
|
| + Deoptimizer::EntryGenerator generator(masm, Deoptimizer::OSR);
|
| + generator.Generate();
|
| }
|
|
|
|
|
|
|