| Index: runtime/vm/flow_graph_compiler_arm.cc
|
| ===================================================================
|
| --- runtime/vm/flow_graph_compiler_arm.cc (revision 21968)
|
| +++ runtime/vm/flow_graph_compiler_arm.cc (working copy)
|
| @@ -1073,7 +1073,21 @@
|
| intptr_t deopt_id,
|
| intptr_t token_pos,
|
| LocationSummary* locs) {
|
| - UNIMPLEMENTED();
|
| + // Each ICData propagated from unoptimized to optimized code contains the
|
| + // function that corresponds to the Dart function of that IC call. Due
|
| + // to inlining in optimized code, that function may not correspond to the
|
| + // top-level function (parsed_function().function()) which could be
|
| + // reoptimized and which counter needs to be incremented.
|
| + // Pass the function explicitly, it is used in IC stub.
|
| + __ LoadObject(R6, parsed_function().function());
|
| + __ LoadObject(R4, arguments_descriptor);
|
| + __ LoadObject(R5, ic_data);
|
| + GenerateDartCall(deopt_id,
|
| + token_pos,
|
| + target_label,
|
| + PcDescriptors::kIcCall,
|
| + locs);
|
| + __ Drop(argument_count);
|
| }
|
|
|
|
|
| @@ -1128,7 +1142,17 @@
|
| void FlowGraphCompiler::EmitEqualityRegConstCompare(Register reg,
|
| const Object& obj,
|
| bool needs_number_check) {
|
| - UNIMPLEMENTED();
|
| + if (needs_number_check &&
|
| + (obj.IsMint() || obj.IsDouble() || obj.IsBigint())) {
|
| + __ Push(reg);
|
| + __ PushObject(obj);
|
| + __ BranchLink(&StubCode::IdenticalWithNumberCheckLabel());
|
| + __ Drop(1); // Discard constant.
|
| + __ Pop(reg); // Restore 'reg'.
|
| + return;
|
| + }
|
| +
|
| + __ CompareObject(reg, obj);
|
| }
|
|
|
|
|
|
|