Index: runtime/vm/intermediate_language_ia32.cc |
=================================================================== |
--- runtime/vm/intermediate_language_ia32.cc (revision 42713) |
+++ runtime/vm/intermediate_language_ia32.cc (working copy) |
@@ -1718,7 +1718,7 @@ |
((IsPotentialUnboxedStore()) ? 3 : 0); |
LocationSummary* summary = new(isolate) LocationSummary( |
isolate, kNumInputs, kNumTemps, |
- ((IsUnboxedStore() && opt && is_initialization_) || |
+ ((IsUnboxedStore() && opt && is_potential_unboxed_initialization_) || |
IsPotentialUnboxedStore()) |
? LocationSummary::kCallOnSlowPath |
: LocationSummary::kNoCall); |
@@ -1779,7 +1779,7 @@ |
Register temp2 = locs()->temp(1).reg(); |
const intptr_t cid = field().UnboxedFieldCid(); |
- if (is_initialization_) { |
+ if (is_potential_unboxed_initialization_) { |
const Class* cls = NULL; |
switch (cid) { |
case kDoubleCid: |
@@ -1927,11 +1927,18 @@ |
__ StoreIntoObjectNoBarrier( |
instance_reg, |
FieldAddress(instance_reg, offset_in_bytes_), |
- locs()->in(1).constant()); |
+ locs()->in(1).constant(), |
+ is_object_reference_initialization_ ? |
+ Assembler::kEmptyOrSmiOrNull : |
+ Assembler::kHeapObjectOrSmi); |
} else { |
Register value_reg = locs()->in(1).reg(); |
__ StoreIntoObjectNoBarrier(instance_reg, |
- FieldAddress(instance_reg, offset_in_bytes_), value_reg); |
+ FieldAddress(instance_reg, offset_in_bytes_), |
+ value_reg, |
+ is_object_reference_initialization_ ? |
+ Assembler::kEmptyOrSmiOrNull : |
+ Assembler::kHeapObjectOrSmi); |
} |
} |
__ Bind(&skip_store); |
@@ -2050,12 +2057,12 @@ |
EBX); // end address |
// Store the type argument field. |
- __ StoreIntoObjectNoBarrier(EAX, |
+ __ InitializeFieldNoBarrier(EAX, |
FieldAddress(EAX, Array::type_arguments_offset()), |
kElemTypeReg); |
// Set the length field. |
- __ StoreIntoObjectNoBarrier(EAX, |
+ __ InitializeFieldNoBarrier(EAX, |
FieldAddress(EAX, Array::length_offset()), |
kLengthReg); |
@@ -2073,13 +2080,13 @@ |
intptr_t current_offset = 0; |
__ movl(EBX, raw_null); |
while (current_offset < array_size) { |
- __ StoreIntoObjectNoBarrier(EAX, Address(EDI, current_offset), EBX); |
+ __ InitializeFieldNoBarrier(EAX, Address(EDI, current_offset), EBX); |
current_offset += kWordSize; |
} |
} else { |
Label init_loop; |
__ Bind(&init_loop); |
- __ StoreIntoObjectNoBarrier(EAX, Address(EDI, 0), Object::null_object()); |
+ __ InitializeFieldNoBarrier(EAX, Address(EDI, 0), Object::null_object()); |
__ addl(EDI, Immediate(kWordSize)); |
__ cmpl(EDI, EBX); |
__ j(BELOW, &init_loop, Assembler::kNearJump); |