@@ -1365,9 +1365,8 @@ void LoadIndexedInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
13651365 compiler::Address element_address (TMP); // Bad address.
13661366 element_address =
13671367 index.IsRegister ()
1368- ? __ ElementAddressForRegIndex (true , // Load.
1369- IsExternal (), class_id (),
1370- index_scale (), array, index.reg ())
1368+ ? __ ElementAddressForRegIndex (IsExternal (), class_id (),
1369+ index_scale (), array, index.reg (), TMP)
13711370 : __ ElementAddressForIntIndex (IsExternal (), class_id (),
13721371 index_scale (), array,
13731372 Smi::Cast (index.constant ()).Value ());
@@ -1499,7 +1498,7 @@ void LoadCodeUnitsInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
14991498 }
15001499 // Warning: element_address may use register TMP as base.
15011500 compiler::Address element_address = __ ElementAddressForRegIndexWithSize (
1502- true , IsExternal (), class_id (), sz, index_scale (), str, index.reg ());
1501+ IsExternal (), class_id (), sz, index_scale (), str, index.reg (), TMP );
15031502 __ ldr (result, element_address, sz);
15041503
15051504 __ SmiTag (result);
@@ -1555,7 +1554,7 @@ LocationSummary* StoreIndexedInstr::MakeLocationSummary(Zone* zone,
15551554 if (CanBeImmediateIndex (index (), class_id (), IsExternal ())) {
15561555 locs->set_in (1 , Location::Constant (index ()->definition ()->AsConstant ()));
15571556 } else {
1558- locs->set_in (1 , Location::WritableRegister ());
1557+ locs->set_in (1 , Location::RequiresRegister ());
15591558 }
15601559 locs->set_temp (0 , Location::RequiresRegister ());
15611560
@@ -1603,32 +1602,43 @@ void StoreIndexedInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
16031602 // The array register points to the backing store for external arrays.
16041603 const Register array = locs ()->in (0 ).reg ();
16051604 const Location index = locs ()->in (1 );
1606- const Register address = locs ()->temp (0 ).reg ();
1605+ const Register temp = locs ()->temp (0 ).reg ();
1606+ compiler::Address element_address (TMP); // Bad address.
16071607
1608- if (index.IsRegister ()) {
1609- __ LoadElementAddressForRegIndex (address,
1610- false , // Store.
1611- IsExternal (), class_id (), index_scale (),
1612- array, index.reg ());
1613- } else {
1614- __ LoadElementAddressForIntIndex (address, IsExternal (), class_id (),
1615- index_scale (), array,
1616- Smi::Cast (index.constant ()).Value ());
1608+ // Deal with a special case separately.
1609+ if (class_id () == kArrayCid && ShouldEmitStoreBarrier ()) {
1610+ if (index.IsRegister ()) {
1611+ __ ComputeElementAddressForRegIndex (temp, IsExternal (), class_id (),
1612+ index_scale (), array, index.reg ());
1613+ } else {
1614+ __ ComputeElementAddressForIntIndex (temp, IsExternal (), class_id (),
1615+ index_scale (), array,
1616+ Smi::Cast (index.constant ()).Value ());
1617+ }
1618+ const Register value = locs ()->in (2 ).reg ();
1619+ __ StoreIntoArray (array, temp, value, CanValueBeSmi (),
1620+ /* lr_reserved=*/ !compiler->intrinsic_mode ());
1621+ return ;
16171622 }
16181623
1624+ element_address =
1625+ index.IsRegister ()
1626+ ? __ ElementAddressForRegIndex (IsExternal (), class_id (),
1627+ index_scale (), array,
1628+ index.reg (), temp)
1629+ : __ ElementAddressForIntIndex (IsExternal (), class_id (),
1630+ index_scale (), array,
1631+ Smi::Cast (index.constant ()).Value ());
1632+
16191633 switch (class_id ()) {
16201634 case kArrayCid :
1621- if (ShouldEmitStoreBarrier ()) {
1622- const Register value = locs ()->in (2 ).reg ();
1623- __ StoreIntoArray (array, address, value, CanValueBeSmi (),
1624- /* lr_reserved=*/ !compiler->intrinsic_mode ());
1625- } else if (locs ()->in (2 ).IsConstant ()) {
1635+ ASSERT (!ShouldEmitStoreBarrier ()); // Specially treated above.
1636+ if (locs ()->in (2 ).IsConstant ()) {
16261637 const Object& constant = locs ()->in (2 ).constant ();
1627- __ StoreIntoObjectNoBarrier (array, compiler::Address (address),
1628- constant);
1638+ __ StoreIntoObjectNoBarrier (array, element_address, constant);
16291639 } else {
16301640 const Register value = locs ()->in (2 ).reg ();
1631- __ StoreIntoObjectNoBarrier (array, compiler::Address (address) , value);
1641+ __ StoreIntoObjectNoBarrier (array, element_address , value);
16321642 }
16331643 break ;
16341644 case kTypedDataInt8ArrayCid :
@@ -1639,10 +1649,10 @@ void StoreIndexedInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
16391649 if (locs ()->in (2 ).IsConstant ()) {
16401650 const Smi& constant = Smi::Cast (locs ()->in (2 ).constant ());
16411651 __ LoadImmediate (TMP, static_cast <int8_t >(constant.Value ()));
1642- __ str (TMP, compiler::Address (address) , kUnsignedByte );
1652+ __ str (TMP, element_address , kUnsignedByte );
16431653 } else {
16441654 const Register value = locs ()->in (2 ).reg ();
1645- __ str (value, compiler::Address (address) , kUnsignedByte );
1655+ __ str (value, element_address , kUnsignedByte );
16461656 }
16471657 break ;
16481658 }
@@ -1659,51 +1669,51 @@ void StoreIndexedInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
16591669 value = 0 ;
16601670 }
16611671 __ LoadImmediate (TMP, static_cast <int8_t >(value));
1662- __ str (TMP, compiler::Address (address) , kUnsignedByte );
1672+ __ str (TMP, element_address , kUnsignedByte );
16631673 } else {
16641674 const Register value = locs ()->in (2 ).reg ();
16651675 // Clamp to 0x00 or 0xFF respectively.
16661676 __ CompareImmediate (value, 0xFF );
16671677 __ csetm (TMP, GT); // TMP = value > 0xFF ? -1 : 0.
16681678 __ csel (TMP, value, TMP, LS); // TMP = value in range ? value : TMP.
1669- __ str (TMP, compiler::Address (address) , kUnsignedByte );
1679+ __ str (TMP, element_address , kUnsignedByte );
16701680 }
16711681 break ;
16721682 }
16731683 case kTypedDataInt16ArrayCid :
16741684 case kTypedDataUint16ArrayCid : {
16751685 ASSERT (RequiredInputRepresentation (2 ) == kUnboxedIntPtr );
16761686 const Register value = locs ()->in (2 ).reg ();
1677- __ str (value, compiler::Address (address) , kUnsignedHalfword );
1687+ __ str (value, element_address , kUnsignedHalfword );
16781688 break ;
16791689 }
16801690 case kTypedDataInt32ArrayCid :
16811691 case kTypedDataUint32ArrayCid : {
16821692 const Register value = locs ()->in (2 ).reg ();
1683- __ str (value, compiler::Address (address) , kUnsignedWord );
1693+ __ str (value, element_address , kUnsignedWord );
16841694 break ;
16851695 }
16861696 case kTypedDataInt64ArrayCid :
16871697 case kTypedDataUint64ArrayCid : {
16881698 const Register value = locs ()->in (2 ).reg ();
1689- __ str (value, compiler::Address (address) , kDoubleWord );
1699+ __ str (value, element_address , kDoubleWord );
16901700 break ;
16911701 }
16921702 case kTypedDataFloat32ArrayCid : {
16931703 const VRegister value_reg = locs ()->in (2 ).fpu_reg ();
1694- __ fstrs (value_reg, compiler::Address (address) );
1704+ __ fstrs (value_reg, element_address );
16951705 break ;
16961706 }
16971707 case kTypedDataFloat64ArrayCid : {
16981708 const VRegister value_reg = locs ()->in (2 ).fpu_reg ();
1699- __ fstrd (value_reg, compiler::Address (address) );
1709+ __ fstrd (value_reg, element_address );
17001710 break ;
17011711 }
17021712 case kTypedDataFloat64x2ArrayCid :
17031713 case kTypedDataInt32x4ArrayCid :
17041714 case kTypedDataFloat32x4ArrayCid : {
17051715 const VRegister value_reg = locs ()->in (2 ).fpu_reg ();
1706- __ fstrq (value_reg, compiler::Address (address) );
1716+ __ fstrq (value_reg, element_address );
17071717 break ;
17081718 }
17091719 default :
0 commit comments