Index: runtime/vm/stub_code_mips.cc |
=================================================================== |
--- runtime/vm/stub_code_mips.cc (revision 34771) |
+++ runtime/vm/stub_code_mips.cc (working copy) |
@@ -492,46 +492,6 @@ |
} |
-// Input parameters: |
-// S5: ic-data. |
-// S4: arguments descriptor array. |
-// Note: The receiver object is the first argument to the function being |
-// called, the stub accesses the receiver from this location directly |
-// when trying to resolve the call. |
-void StubCode::GenerateInstanceFunctionLookupStub(Assembler* assembler) { |
- __ TraceSimMsg("InstanceFunctionLookupStub"); |
- __ EnterStubFrame(); |
- |
- // Load the receiver. |
- __ lw(A1, FieldAddress(S4, ArgumentsDescriptor::count_offset())); |
- __ sll(TMP, A1, 1); // A1 is Smi. |
- __ addu(TMP, FP, TMP); |
- __ lw(T1, Address(TMP, kParamEndSlotFromFp * kWordSize)); |
- |
- // Push space for the return value. |
- // Push the receiver. |
- // Push TMP data object. |
- // Push arguments descriptor array. |
- __ addiu(SP, SP, Immediate(-4 * kWordSize)); |
- __ LoadImmediate(TMP, reinterpret_cast<intptr_t>(Object::null())); |
- __ sw(TMP, Address(SP, 3 * kWordSize)); |
- __ sw(T1, Address(SP, 2 * kWordSize)); |
- __ sw(S5, Address(SP, 1 * kWordSize)); |
- __ sw(S4, Address(SP, 0 * kWordSize)); |
- |
- // A1: Smi-tagged arguments array length. |
- PushArgumentsArray(assembler); |
- __ TraceSimMsg("InstanceFunctionLookupStub return"); |
- |
- __ CallRuntime(kInstanceFunctionLookupRuntimeEntry, 4); |
- |
- __ lw(V0, Address(SP, 4 * kWordSize)); // Get result into V0. |
- __ addiu(SP, SP, Immediate(5 * kWordSize)); // Remove arguments. |
- |
- __ LeaveStubFrameAndReturn(); |
-} |
- |
- |
DECLARE_LEAF_RUNTIME_ENTRY(intptr_t, DeoptimizeCopyFrame, |
intptr_t deopt_reason, |
uword saved_registers_address); |
@@ -708,19 +668,17 @@ |
__ CallRuntime(kMegamorphicCacheMissHandlerRuntimeEntry, 3); |
- __ lw(T0, Address(SP, 3 * kWordSize)); // Get result. |
+ __ lw(T0, Address(SP, 3 * kWordSize)); // Get result function. |
__ lw(S4, Address(SP, 4 * kWordSize)); // Restore argument descriptor. |
__ lw(S5, Address(SP, 5 * kWordSize)); // Restore IC data. |
__ addiu(SP, SP, Immediate(6 * kWordSize)); |
__ LeaveStubFrame(); |
- Label nonnull; |
- __ BranchNotEqual(T0, reinterpret_cast<int32_t>(Object::null()), &nonnull); |
- __ Branch(&StubCode::InstanceFunctionLookupLabel()); |
- __ Bind(&nonnull); |
- __ AddImmediate(T0, Instructions::HeaderSize() - kHeapObjectTag); |
- __ jr(T0); |
+ __ lw(T2, FieldAddress(T0, Function::code_offset())); |
+ __ lw(T2, FieldAddress(T2, Code::instructions_offset())); |
+ __ AddImmediate(T2, Instructions::HeaderSize() - kHeapObjectTag); |
+ __ jr(T2); |
} |
@@ -1676,7 +1634,7 @@ |
__ sw(S5, Address(SP, (num_slots - num_args - 4) * kWordSize)); |
__ CallRuntime(handle_ic_miss, num_args + 1); |
__ TraceSimMsg("NArgsCheckInlineCacheStub return"); |
- // Pop returned code object into T3 (null if not found). |
+ // Pop returned function object into T3. |
// Restore arguments descriptor array and IC data array. |
__ lw(T3, Address(SP, (num_slots - 3) * kWordSize)); |
__ lw(S4, Address(SP, (num_slots - 2) * kWordSize)); |
@@ -1685,17 +1643,10 @@ |
// and the arguments descriptor array. |
__ addiu(SP, SP, Immediate(num_slots * kWordSize)); |
__ LeaveStubFrame(); |
+ |
Label call_target_function; |
- __ BranchNotEqual(T3, reinterpret_cast<int32_t>(Object::null()), |
- &call_target_function); |
+ __ b(&call_target_function); |
- // NoSuchMethod or closure. |
- // Mark IC call that it may be a closure call that does not collect |
- // type feedback. |
- __ LoadImmediate(T6, 1); |
- __ Branch(&StubCode::InstanceFunctionLookupLabel()); |
- __ delay_slot()->sb(T6, FieldAddress(S5, ICData::is_closure_call_offset())); |
- |
__ Bind(&found); |
// T0: Pointer to an IC data check group. |
const intptr_t target_offset = ICData::TargetIndexFor(num_args) * kWordSize; |