| Index: runtime/vm/intermediate_language_ia32.cc
|
| ===================================================================
|
| --- runtime/vm/intermediate_language_ia32.cc (revision 39381)
|
| +++ runtime/vm/intermediate_language_ia32.cc (working copy)
|
| @@ -2455,6 +2455,44 @@
|
| }
|
|
|
|
|
| +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(EAX));
|
| + locs->set_temp(0, Location::RegisterLocation(ECX));
|
| + return locs;
|
| +}
|
| +
|
| +
|
| +void InitStaticFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
|
| + Register field = locs()->in(0).reg();
|
| + Register temp = locs()->temp(0).reg();
|
| +
|
| + Label call_runtime, no_call;
|
| +
|
| + __ movl(temp, FieldAddress(field, Field::value_offset()));
|
| + __ CompareObject(temp, Object::sentinel());
|
| + __ j(EQUAL, &call_runtime);
|
| +
|
| + __ CompareObject(temp, Object::transition_sentinel());
|
| + __ j(NOT_EQUAL, &no_call);
|
| +
|
| + __ Bind(&call_runtime);
|
| + __ PushObject(Object::null_object()); // Make room for (unused) result.
|
| + __ pushl(field);
|
| + compiler->GenerateRuntimeCall(token_pos(),
|
| + deopt_id(),
|
| + kInitStaticFieldRuntimeEntry,
|
| + 1,
|
| + locs());
|
| + __ Drop(2); // Remove argument and unused result.
|
| + __ Bind(&no_call);
|
| +}
|
| +
|
| +
|
| LocationSummary* CloneContextInstr::MakeLocationSummary(Isolate* isolate,
|
| bool opt) const {
|
| const intptr_t kNumInputs = 1;
|
| @@ -2807,7 +2845,7 @@
|
| ASSERT(left == result);
|
| Label* deopt = NULL;
|
| if (CanDeoptimize()) {
|
| - deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinarySmiOp);
|
| + deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinarySmiOp);
|
| }
|
|
|
| if (locs()->in(1).IsConstant()) {
|
|
|