Index: runtime/vm/intermediate_language_arm64.cc |
=================================================================== |
--- runtime/vm/intermediate_language_arm64.cc (revision 39381) |
+++ runtime/vm/intermediate_language_arm64.cc (working copy) |
@@ -2289,7 +2289,43 @@ |
locs()); |
} |
+LocationSummary* InitStaticFieldInstr::MakeLocationSummary(Isolate* isolate, |
+ bool opt) const { |
+ const intptr_t kNumInputs = 1; |
+ const intptr_t kNumTemps = 1; |
+ LocationSummary* locs = new(isolate) LocationSummary( |
+ isolate, kNumInputs, kNumTemps, LocationSummary::kCall); |
+ locs->set_in(0, Location::RegisterLocation(R0)); |
+ locs->set_temp(0, Location::RegisterLocation(R1)); |
+ return locs; |
+} |
+ |
+void InitStaticFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
+ Register field = locs()->in(0).reg(); |
+ Register temp = locs()->temp(0).reg(); |
+ Label call_runtime, no_call; |
+ |
+ __ ldr(temp, FieldAddress(field, Field::value_offset())); |
+ __ CompareObject(temp, Object::sentinel(), PP); |
+ __ b(&call_runtime, EQ); |
+ |
+ __ CompareObject(temp, Object::transition_sentinel(), PP); |
+ __ b(&no_call, NE); |
+ |
+ __ Bind(&call_runtime); |
+ __ PushObject(Object::null_object(), PP); // Make room for (unused) result. |
+ __ Push(field); |
+ compiler->GenerateRuntimeCall(token_pos(), |
+ deopt_id(), |
+ kInitStaticFieldRuntimeEntry, |
+ 1, |
+ locs()); |
+ __ Drop(2); // Remove argument and result placeholder. |
+ __ Bind(&no_call); |
+} |
+ |
+ |
LocationSummary* CloneContextInstr::MakeLocationSummary(Isolate* isolate, |
bool opt) const { |
const intptr_t kNumInputs = 1; |