Chromium Code Reviews| Index: runtime/vm/intermediate_language_ia32.cc |
| =================================================================== |
| --- runtime/vm/intermediate_language_ia32.cc (revision 12307) |
| +++ runtime/vm/intermediate_language_ia32.cc (working copy) |
| @@ -953,22 +953,30 @@ |
| LocationSummary* summary = |
| new LocationSummary(kNumInputs, num_temps, LocationSummary::kNoCall); |
| summary->set_in(0, Location::RequiresRegister()); |
| - summary->set_in(1, |
| - value()->NeedsStoreBuffer() ? Location::WritableRegister() |
| - : Location::RequiresRegister()); |
| + summary->set_in(1, (value()->NeedsStoreBuffer() && emit_store_barrier()) |
|
Vyacheslav Egorov (Google)
2012/09/13 10:35:43
nice catch.
maybe move this a && b to some helper
Florian Schneider
2012/09/13 10:46:07
Done.
|
| + ? Location::WritableRegister() |
| + : Location::RegisterOrConstant(value())); |
| return summary; |
| } |
| void StoreInstanceFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| Register instance_reg = locs()->in(0).reg(); |
| - Register value_reg = locs()->in(1).reg(); |
| if (this->value()->NeedsStoreBuffer() && emit_store_barrier()) { |
| + Register value_reg = locs()->in(1).reg(); |
| __ StoreIntoObject(instance_reg, |
| FieldAddress(instance_reg, field().Offset()), value_reg); |
| } else { |
| - __ StoreIntoObjectNoBarrier(instance_reg, |
| - FieldAddress(instance_reg, field().Offset()), value_reg); |
| + if (locs()->in(1).IsConstant()) { |
| + __ StoreIntoObjectNoBarrier( |
| + instance_reg, |
| + FieldAddress(instance_reg, field().Offset()), |
| + locs()->in(1).constant()); |
| + } else { |
| + Register value_reg = locs()->in(1).reg(); |
| + __ StoreIntoObjectNoBarrier(instance_reg, |
| + FieldAddress(instance_reg, field().Offset()), value_reg); |
| + } |
| } |
| } |