| Index: runtime/vm/assembler_arm.h
|
| ===================================================================
|
| --- runtime/vm/assembler_arm.h (revision 42713)
|
| +++ runtime/vm/assembler_arm.h (working copy)
|
| @@ -642,10 +642,12 @@
|
| DRegister dtmp0, DRegister dtmp1,
|
| Label* overflow);
|
|
|
| - // Load and Store. May clobber IP.
|
| + // Load and Store.
|
| + // These three do not clobber IP.
|
| void LoadPatchableImmediate(Register rd, int32_t value, Condition cond = AL);
|
| void LoadDecodableImmediate(Register rd, int32_t value, Condition cond = AL);
|
| void LoadImmediate(Register rd, int32_t value, Condition cond = AL);
|
| + // These two may clobber IP.
|
| void LoadSImmediate(SRegister sd, float value, Condition cond = AL);
|
| void LoadDImmediate(DRegister dd, double value,
|
| Register scratch, Condition cond = AL);
|
| @@ -662,6 +664,14 @@
|
| void PushObject(const Object& object);
|
| void CompareObject(Register rn, const Object& object);
|
|
|
| + // When storing into a heap object field, knowledge of the previous content
|
| + // is expressed through these constants.
|
| + enum FieldContent {
|
| + kEmptyOrSmiOrNull, // Empty = garbage/zapped in release/debug mode.
|
| + kHeapObjectOrSmi,
|
| + kOnlySmi,
|
| + };
|
| +
|
| void StoreIntoObject(Register object, // Object we are storing into.
|
| const Address& dest, // Where we are storing into.
|
| Register value, // Value we are storing.
|
| @@ -673,16 +683,27 @@
|
|
|
| void StoreIntoObjectNoBarrier(Register object,
|
| const Address& dest,
|
| - Register value);
|
| - void StoreIntoObjectNoBarrierOffset(Register object,
|
| - int32_t offset,
|
| - Register value);
|
| + Register value,
|
| + FieldContent old_content = kHeapObjectOrSmi);
|
| + void InitializeFieldNoBarrier(Register object,
|
| + const Address& dest,
|
| + Register value) {
|
| + StoreIntoObjectNoBarrier(object, dest, value, kEmptyOrSmiOrNull);
|
| + }
|
| + void StoreIntoObjectNoBarrierOffset(
|
| + Register object,
|
| + int32_t offset,
|
| + Register value,
|
| + FieldContent old_content = kHeapObjectOrSmi);
|
| void StoreIntoObjectNoBarrier(Register object,
|
| const Address& dest,
|
| - const Object& value);
|
| - void StoreIntoObjectNoBarrierOffset(Register object,
|
| - int32_t offset,
|
| - const Object& value);
|
| + const Object& value,
|
| + FieldContent old_content = kHeapObjectOrSmi);
|
| + void StoreIntoObjectNoBarrierOffset(
|
| + Register object,
|
| + int32_t offset,
|
| + const Object& value,
|
| + FieldContent old_content = kHeapObjectOrSmi);
|
|
|
| // Store value_even, value_odd, value_even, ... into the words in the address
|
| // range [begin, end), assumed to be uninitialized fields in object (tagged).
|
| @@ -1096,7 +1117,9 @@
|
| Condition cond = AL);
|
| // Writes new_value to address and its shadow location, if enabled, after
|
| // verifying that its old value matches its shadow.
|
| - void VerifiedWrite(const Address& address, Register new_value);
|
| + void VerifiedWrite(const Address& address,
|
| + Register new_value,
|
| + FieldContent old_content);
|
|
|
| DISALLOW_ALLOCATION();
|
| DISALLOW_COPY_AND_ASSIGN(Assembler);
|
|
|