| Index: runtime/vm/intermediate_language_x64.cc
|
| ===================================================================
|
| --- runtime/vm/intermediate_language_x64.cc (revision 33058)
|
| +++ runtime/vm/intermediate_language_x64.cc (working copy)
|
| @@ -1531,7 +1531,8 @@
|
| const intptr_t kNumTemps = 0;
|
| LocationSummary* summary =
|
| new LocationSummary(kNumInputs, kNumTemps,
|
| - (field().guarded_cid() == kIllegalCid) || (is_initialization_)
|
| + !field().IsNull() &&
|
| + ((field().guarded_cid() == kIllegalCid) || is_initialization_)
|
| ? LocationSummary::kCallOnSlowPath
|
| : LocationSummary::kNoCall);
|
|
|
| @@ -1593,10 +1594,10 @@
|
| __ Bind(slow_path->exit_label());
|
| __ movq(temp2, temp);
|
| __ StoreIntoObject(instance_reg,
|
| - FieldAddress(instance_reg, field().Offset()),
|
| + FieldAddress(instance_reg, offset_in_bytes_),
|
| temp2);
|
| } else {
|
| - __ movq(temp, FieldAddress(instance_reg, field().Offset()));
|
| + __ movq(temp, FieldAddress(instance_reg, offset_in_bytes_));
|
| }
|
| switch (cid) {
|
| case kDoubleCid:
|
| @@ -1656,7 +1657,7 @@
|
| new StoreInstanceFieldSlowPath(this, compiler->double_class());
|
| compiler->AddSlowPathCode(slow_path);
|
|
|
| - __ movq(temp, FieldAddress(instance_reg, field().Offset()));
|
| + __ movq(temp, FieldAddress(instance_reg, offset_in_bytes_));
|
| __ CompareObject(temp, Object::null_object(), PP);
|
| __ j(NOT_EQUAL, ©_double);
|
|
|
| @@ -1668,7 +1669,7 @@
|
| __ Bind(slow_path->exit_label());
|
| __ movq(temp2, temp);
|
| __ StoreIntoObject(instance_reg,
|
| - FieldAddress(instance_reg, field().Offset()),
|
| + FieldAddress(instance_reg, offset_in_bytes_),
|
| temp2);
|
|
|
| __ Bind(©_double);
|
| @@ -1684,7 +1685,7 @@
|
| new StoreInstanceFieldSlowPath(this, compiler->float32x4_class());
|
| compiler->AddSlowPathCode(slow_path);
|
|
|
| - __ movq(temp, FieldAddress(instance_reg, field().Offset()));
|
| + __ movq(temp, FieldAddress(instance_reg, offset_in_bytes_));
|
| __ CompareObject(temp, Object::null_object(), PP);
|
| __ j(NOT_EQUAL, ©_float32x4);
|
|
|
| @@ -1696,7 +1697,7 @@
|
| __ Bind(slow_path->exit_label());
|
| __ movq(temp2, temp);
|
| __ StoreIntoObject(instance_reg,
|
| - FieldAddress(instance_reg, field().Offset()),
|
| + FieldAddress(instance_reg, offset_in_bytes_),
|
| temp2);
|
|
|
| __ Bind(©_float32x4);
|
| @@ -1711,17 +1712,17 @@
|
| if (ShouldEmitStoreBarrier()) {
|
| Register value_reg = locs()->in(1).reg();
|
| __ StoreIntoObject(instance_reg,
|
| - FieldAddress(instance_reg, field().Offset()),
|
| + FieldAddress(instance_reg, offset_in_bytes_),
|
| value_reg,
|
| CanValueBeSmi());
|
| } else {
|
| if (locs()->in(1).IsConstant()) {
|
| - __ StoreObject(FieldAddress(instance_reg, field().Offset()),
|
| + __ StoreObject(FieldAddress(instance_reg, offset_in_bytes_),
|
| locs()->in(1).constant(), PP);
|
| } else {
|
| Register value_reg = locs()->in(1).reg();
|
| __ StoreIntoObjectNoBarrier(instance_reg,
|
| - FieldAddress(instance_reg, field().Offset()), value_reg);
|
| + FieldAddress(instance_reg, offset_in_bytes_), value_reg);
|
| }
|
| }
|
| __ Bind(&skip_store);
|
| @@ -5057,32 +5058,6 @@
|
| }
|
|
|
|
|
| -LocationSummary* StoreVMFieldInstr::MakeLocationSummary(bool opt) const {
|
| - const intptr_t kNumInputs = 2;
|
| - const intptr_t kNumTemps = 0;
|
| - LocationSummary* locs =
|
| - new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
|
| - locs->set_in(0, value()->NeedsStoreBuffer() ? Location::WritableRegister()
|
| - : Location::RequiresRegister());
|
| - locs->set_in(1, Location::RequiresRegister());
|
| - return locs;
|
| -}
|
| -
|
| -
|
| -void StoreVMFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
|
| - Register value_reg = locs()->in(0).reg();
|
| - Register dest_reg = locs()->in(1).reg();
|
| -
|
| - if (value()->NeedsStoreBuffer()) {
|
| - __ StoreIntoObject(dest_reg, FieldAddress(dest_reg, offset_in_bytes()),
|
| - value_reg);
|
| - } else {
|
| - __ StoreIntoObjectNoBarrier(
|
| - dest_reg, FieldAddress(dest_reg, offset_in_bytes()), value_reg);
|
| - }
|
| -}
|
| -
|
| -
|
| LocationSummary* AllocateObjectInstr::MakeLocationSummary(bool opt) const {
|
| return MakeCallSummary();
|
| }
|
|
|