Chromium Code Reviews| Index: src/arm/builtins-arm.cc |
| diff --git a/src/arm/builtins-arm.cc b/src/arm/builtins-arm.cc |
| index eff47e2692bfc2627f4e4269da609b030d39367d..d1ed4d5ac3fd6b7fa0601d7d91a6a4d8bf156ed0 100644 |
| --- a/src/arm/builtins-arm.cc |
| +++ b/src/arm/builtins-arm.cc |
| @@ -975,22 +975,35 @@ void Builtins::Generate_OnStackReplacement(MacroAssembler* masm) { |
| __ CallRuntime(Runtime::kCompileForOnStackReplacement, 1); |
| } |
| - // If the result was -1 it means that we couldn't optimize the |
| - // function. Just return and continue in the unoptimized version. |
| + // If the code object is null, just return to the unoptimized code. |
| Label skip; |
| - __ cmp(r0, Operand(Smi::FromInt(-1))); |
| + __ cmp(r0, Operand(Smi::FromInt(0))); |
| __ 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(); |
| + |
| + // Load deoptimization data from the code object. |
| + // <deopt_data> = <code>[#deoptimization_data_offset] |
| + __ ldr(r1, MemOperand(r0, Code::kDeoptimizationDataOffset - kHeapObjectTag)); |
| + |
| + // Load the OSR entrypoint offset from the deoptimization data. |
| + // <osr_offset> = <deopt_data>[#header_size + #osr_pc_offset] |
| + __ ldr(r1, MemOperand(r1, FixedArray::kHeaderSize + |
| + DeoptimizationInputData::kOsrPcOffsetIndex * kPointerSize |
| + - kHeapObjectTag)); |
| + __ SmiUntag(r1); |
| + |
| + // Compute the target address = code_obj + header_size + osr_offset |
| + // <entry_addr> = <code_obj> + #header_size + <osr_offset> |
| + __ add(r0, r0, r1); |
|
vincent.belliard.fr
2013/07/31 15:07:44
You can do the SmiUntag and the add in one instruc
|
| + __ add(r0, r0, Operand(Code::kHeaderSize - kHeapObjectTag)); |
|
vincent.belliard.fr
2013/07/31 15:07:44
the result of add can be directly stored in lr. It
|
| + |
| + // Overwrite the return address in the link register. |
| + __ mov(lr, r0); |
| + |
| + // And "return" to the OSR entry point of the function. |
| + __ Ret(); |
| } |