Index: runtime/vm/intermediate_language_mips.cc |
diff --git a/runtime/vm/intermediate_language_mips.cc b/runtime/vm/intermediate_language_mips.cc |
index 8c03d9383e69b40404534249e2b5c700de404aac..fe30067f7227054c89c78a1fbb045219c3d47daf 100644 |
--- a/runtime/vm/intermediate_language_mips.cc |
+++ b/runtime/vm/intermediate_language_mips.cc |
@@ -274,7 +274,6 @@ void ClosureCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
ASSERT(locs()->in(0).reg() == T0); |
__ LoadImmediate(S5, 0); |
__ lw(T2, FieldAddress(T0, Function::entry_point_offset())); |
- __ lw(CODE_REG, FieldAddress(T0, Function::code_offset())); |
__ jalr(T2); |
compiler->RecordSafepoint(locs()); |
// Marks either the continuation point in unoptimized code or the |
@@ -2667,8 +2666,11 @@ void CatchBlockEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
catch_handler_types_, |
needs_stacktrace()); |
// Restore pool pointer. |
- __ RestoreCodePointer(); |
- __ LoadPoolPointer(); |
+ __ GetNextPC(CMPRES1, TMP); |
+ const intptr_t object_pool_pc_dist = |
+ Instructions::HeaderSize() - Instructions::object_pool_offset() + |
+ compiler->assembler()->CodeSize() - 1 * Instr::kInstrSize; |
+ __ LoadFromOffset(PP, CMPRES1, -object_pool_pc_dist); |
if (HasParallelMove()) { |
compiler->parallel_move_resolver()->EmitNativeCode(parallel_move()); |
@@ -5425,22 +5427,20 @@ LocationSummary* IndirectGotoInstr::MakeLocationSummary(Zone* zone, |
void IndirectGotoInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
- Register target_reg = locs()->temp_slot(0)->reg(); |
+ Register target_address_reg = locs()->temp_slot(0)->reg(); |
- __ GetNextPC(target_reg, TMP); |
- const intptr_t entry_offset = |
- __ CodeSize() - 1 * Instr::kInstrSize; |
- __ AddImmediate(target_reg, target_reg, -entry_offset); |
+ // Load from [current frame pointer] + kPcMarkerSlotFromFp. |
+ __ lw(target_address_reg, Address(FP, kPcMarkerSlotFromFp * kWordSize)); |
// Add the offset. |
Register offset_reg = locs()->in(0).reg(); |
if (offset()->definition()->representation() == kTagged) { |
__ SmiUntag(offset_reg); |
} |
- __ addu(target_reg, target_reg, offset_reg); |
+ __ addu(target_address_reg, target_address_reg, offset_reg); |
// Jump to the absolute address. |
- __ jr(target_reg); |
+ __ jr(target_address_reg); |
} |