| Index: runtime/vm/intermediate_language_arm.cc
|
| diff --git a/runtime/vm/intermediate_language_arm.cc b/runtime/vm/intermediate_language_arm.cc
|
| index cf4011797ad8ad19d324f3bda797505ba0b7732f..238cfc11bb46cc3c1dc9be5f8770b6886802cbf1 100644
|
| --- a/runtime/vm/intermediate_language_arm.cc
|
| +++ b/runtime/vm/intermediate_language_arm.cc
|
| @@ -353,8 +353,8 @@ LocationSummary* AssertAssignableInstr::MakeLocationSummary(Zone* zone,
|
| LocationSummary* summary = new (zone)
|
| LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
|
| summary->set_in(0, Location::RegisterLocation(R0)); // Value.
|
| - summary->set_in(1, Location::RegisterLocation(R1)); // Instant. type args.
|
| - summary->set_in(2, Location::RegisterLocation(R2)); // Function type args.
|
| + summary->set_in(1, Location::RegisterLocation(R2)); // Instant. type args.
|
| + summary->set_in(2, Location::RegisterLocation(R1)); // Function type args.
|
| summary->set_out(0, Location::RegisterLocation(R0));
|
| return summary;
|
| }
|
| @@ -2370,8 +2370,8 @@ LocationSummary* InstanceOfInstr::MakeLocationSummary(Zone* zone,
|
| LocationSummary* summary = new (zone)
|
| LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
|
| summary->set_in(0, Location::RegisterLocation(R0)); // Instance.
|
| - summary->set_in(1, Location::RegisterLocation(R1)); // Instant. type args.
|
| - summary->set_in(2, Location::RegisterLocation(R2)); // Function type args.
|
| + summary->set_in(1, Location::RegisterLocation(R2)); // Instant. type args.
|
| + summary->set_in(2, Location::RegisterLocation(R1)); // Function type args.
|
| summary->set_out(0, Location::RegisterLocation(R0));
|
| return summary;
|
| }
|
| @@ -2379,8 +2379,8 @@ LocationSummary* InstanceOfInstr::MakeLocationSummary(Zone* zone,
|
|
|
| void InstanceOfInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
|
| ASSERT(locs()->in(0).reg() == R0); // Value.
|
| - ASSERT(locs()->in(1).reg() == R1); // Instantiator type arguments.
|
| - ASSERT(locs()->in(2).reg() == R2); // Function type arguments.
|
| + ASSERT(locs()->in(1).reg() == R2); // Instantiator type arguments.
|
| + ASSERT(locs()->in(2).reg() == R1); // Function type arguments.
|
|
|
| compiler->GenerateInstanceOf(token_pos(), deopt_id(), type(), locs());
|
| ASSERT(locs()->out(0).reg() == R0);
|
| @@ -2629,8 +2629,8 @@ LocationSummary* InstantiateTypeInstr::MakeLocationSummary(Zone* zone,
|
| const intptr_t kNumTemps = 0;
|
| LocationSummary* locs = new (zone)
|
| LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
|
| - locs->set_in(0, Location::RegisterLocation(R0)); // Instant. type args.
|
| - locs->set_in(1, Location::RegisterLocation(R1)); // Function type args.
|
| + locs->set_in(0, Location::RegisterLocation(R1)); // Instant. type args.
|
| + locs->set_in(1, Location::RegisterLocation(R0)); // Function type args.
|
| locs->set_out(0, Location::RegisterLocation(R0));
|
| return locs;
|
| }
|
| @@ -2646,14 +2646,12 @@ void InstantiateTypeInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
|
| // A runtime call to instantiate the type is required.
|
| __ PushObject(Object::null_object()); // Make room for the result.
|
| __ PushObject(type());
|
| - __ Push(instantiator_type_args_reg); // Push instantiator type arguments.
|
| - __ Push(function_type_args_reg); // Push function type arguments.
|
| - // TODO(regis): Renumber registers and use PushList.
|
| + __ PushList((1 << instantiator_type_args_reg) |
|
| + (1 << function_type_args_reg));
|
| compiler->GenerateRuntimeCall(token_pos(), deopt_id(),
|
| kInstantiateTypeRuntimeEntry, 3, locs());
|
| __ Drop(3); // Drop 2 type argument vectors and uninstantiated type.
|
| __ Pop(result_reg); // Pop instantiated type.
|
| - ASSERT(instantiator_type_args_reg == result_reg);
|
| }
|
|
|
|
|
| @@ -2664,8 +2662,8 @@ LocationSummary* InstantiateTypeArgumentsInstr::MakeLocationSummary(
|
| const intptr_t kNumTemps = 0;
|
| LocationSummary* locs = new (zone)
|
| LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
|
| - locs->set_in(0, Location::RegisterLocation(R0)); // Instant. type args.
|
| - locs->set_in(1, Location::RegisterLocation(R1)); // Function type args.
|
| + locs->set_in(0, Location::RegisterLocation(R1)); // Instant. type args.
|
| + locs->set_in(1, Location::RegisterLocation(R0)); // Function type args.
|
| locs->set_out(0, Location::RegisterLocation(R0));
|
| return locs;
|
| }
|
| @@ -2676,9 +2674,8 @@ void InstantiateTypeArgumentsInstr::EmitNativeCode(
|
| const Register instantiator_type_args_reg = locs()->in(0).reg();
|
| const Register function_type_args_reg = locs()->in(1).reg();
|
| const Register result_reg = locs()->out(0).reg();
|
| - ASSERT(instantiator_type_args_reg == R0);
|
| - ASSERT(function_type_args_reg == R1);
|
| - ASSERT(instantiator_type_args_reg == result_reg);
|
| + ASSERT(instantiator_type_args_reg == R1);
|
| + ASSERT(function_type_args_reg == R0);
|
|
|
| // 'instantiator_type_args_reg' is a TypeArguments object (or null).
|
| // 'function_type_args_reg' is a TypeArguments object (or null).
|
| @@ -2695,6 +2692,7 @@ void InstantiateTypeArgumentsInstr::EmitNativeCode(
|
| __ cmp(instantiator_type_args_reg, Operand(IP));
|
| __ cmp(function_type_args_reg, Operand(IP), EQ);
|
| __ b(&type_arguments_instantiated, EQ);
|
| + ASSERT(function_type_args_reg == result_reg);
|
| }
|
|
|
| // Lookup cache before calling runtime.
|
| @@ -2727,9 +2725,8 @@ void InstantiateTypeArgumentsInstr::EmitNativeCode(
|
| // A runtime call to instantiate the type arguments is required.
|
| __ PushObject(Object::null_object()); // Make room for the result.
|
| __ PushObject(type_arguments());
|
| - __ Push(instantiator_type_args_reg); // Push instantiator type arguments.
|
| - __ Push(function_type_args_reg); // Push function type arguments.
|
| - // TODO(regis): Renumber registers and use PushList.
|
| + __ PushList((1 << instantiator_type_args_reg) |
|
| + (1 << function_type_args_reg));
|
| compiler->GenerateRuntimeCall(token_pos(), deopt_id(),
|
| kInstantiateTypeArgumentsRuntimeEntry, 3,
|
| locs());
|
|
|