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(); |
} |