Index: src/mips/lithium-codegen-mips.cc |
diff --git a/src/mips/lithium-codegen-mips.cc b/src/mips/lithium-codegen-mips.cc |
index e7f05a66468b37110125f9fc27642d6c502cf1bf..7ab5d260191aaef542c7dd44a74b49db13dfc536 100644 |
--- a/src/mips/lithium-codegen-mips.cc |
+++ b/src/mips/lithium-codegen-mips.cc |
@@ -31,6 +31,7 @@ |
#include "mips/lithium-gap-resolver-mips.h" |
#include "code-stubs.h" |
#include "stub-cache.h" |
+#include "hydrogen-osr.h" |
namespace v8 { |
namespace internal { |
@@ -247,6 +248,21 @@ bool LCodeGen::GeneratePrologue() { |
} |
+void LCodeGen::GenerateOsrPrologue() { |
+ // Generate the OSR entry prologue at the first unknown OSR value, or if there |
+ // are none, at the OSR entrypoint instruction. |
+ if (osr_pc_offset_ >= 0) return; |
+ |
+ osr_pc_offset_ = masm()->pc_offset(); |
+ |
+ // Adjust the frame size, subsuming the unoptimized frame into the |
+ // optimized frame. |
+ int slots = GetStackSlotCount() - graph()->osr()->UnoptimizedFrameSlots(); |
+ ASSERT(slots >= 0); |
+ __ Subu(sp, sp, Operand(slots * kPointerSize)); |
+} |
+ |
+ |
bool LCodeGen::GenerateBody() { |
ASSERT(is_generating()); |
bool emit_instructions = true; |
@@ -1071,8 +1087,7 @@ void LCodeGen::DoCallStub(LCallStub* instr) { |
void LCodeGen::DoUnknownOSRValue(LUnknownOSRValue* instr) { |
- // Record the address of the first unknown OSR value as the place to enter. |
- if (osr_pc_offset_ == -1) osr_pc_offset_ = masm()->pc_offset(); |
+ GenerateOsrPrologue(); |
} |
@@ -5681,9 +5696,7 @@ void LCodeGen::DoOsrEntry(LOsrEntry* instr) { |
ASSERT(!environment->HasBeenRegistered()); |
RegisterEnvironmentForDeoptimization(environment, Safepoint::kNoLazyDeopt); |
- // Normally we record the first unknown OSR value as the entrypoint to the OSR |
- // code, but if there were none, record the entrypoint here. |
- if (osr_pc_offset_ == -1) osr_pc_offset_ = masm()->pc_offset(); |
+ GenerateOsrPrologue(); |
} |