| Index: runtime/vm/intermediate_language_mips.cc
|
| ===================================================================
|
| --- runtime/vm/intermediate_language_mips.cc (revision 24832)
|
| +++ runtime/vm/intermediate_language_mips.cc (working copy)
|
| @@ -1886,6 +1886,45 @@
|
| }
|
|
|
|
|
| +LocationSummary* InstantiateTypeInstr::MakeLocationSummary() const {
|
| + const intptr_t kNumInputs = 1;
|
| + const intptr_t kNumTemps = 0;
|
| + LocationSummary* locs =
|
| + new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
|
| + locs->set_in(0, Location::RegisterLocation(T0));
|
| + locs->set_out(Location::RegisterLocation(T0));
|
| + return locs;
|
| +}
|
| +
|
| +
|
| +void InstantiateTypeInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
|
| + __ TraceSimMsg("InstantiateTypeInstr");
|
| + Register instantiator_reg = locs()->in(0).reg();
|
| + Register result_reg = locs()->out().reg();
|
| +
|
| + // 'instantiator_reg' is the instantiator AbstractTypeArguments object
|
| + // (or null).
|
| + // A runtime call to instantiate the type is required.
|
| + __ addiu(SP, SP, Immediate(-3 * kWordSize));
|
| + __ LoadObject(TMP1, Object::ZoneHandle());
|
| + __ sw(TMP1, Address(SP, 2 * kWordSize)); // Make room for the result.
|
| + __ LoadObject(TMP1, type());
|
| + __ sw(TMP1, Address(SP, 1 * kWordSize));
|
| + // Push instantiator type arguments.
|
| + __ sw(instantiator_reg, Address(SP, 0 * kWordSize));
|
| +
|
| + compiler->GenerateCallRuntime(token_pos(),
|
| + deopt_id(),
|
| + kInstantiateTypeRuntimeEntry,
|
| + locs());
|
| + // Pop instantiated type.
|
| + __ lw(result_reg, Address(SP, 2 * kWordSize));
|
| + // Drop instantiator and uninstantiated type.
|
| + __ addiu(SP, SP, Immediate(3 * kWordSize));
|
| + ASSERT(instantiator_reg == result_reg);
|
| +}
|
| +
|
| +
|
| LocationSummary* InstantiateTypeArgumentsInstr::MakeLocationSummary() const {
|
| const intptr_t kNumInputs = 1;
|
| const intptr_t kNumTemps = 0;
|
|
|