| Index: runtime/vm/assembler_ia32.h
|
| ===================================================================
|
| --- runtime/vm/assembler_ia32.h (revision 42713)
|
| +++ runtime/vm/assembler_ia32.h (working copy)
|
| @@ -536,6 +536,7 @@
|
|
|
| void testl(Register reg1, Register reg2);
|
| void testl(Register reg, const Immediate& imm);
|
| + void testb(const Address& address, const Immediate& imm);
|
|
|
| void andl(Register dst, const Immediate& imm);
|
| void andl(Register dst, Register src);
|
| @@ -668,6 +669,14 @@
|
| void CompareObject(Register reg, const Object& object);
|
| void LoadDoubleConstant(XmmRegister dst, double value);
|
|
|
| + // 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.
|
| @@ -675,14 +684,26 @@
|
|
|
| void StoreIntoObjectNoBarrier(Register object,
|
| const Address& dest,
|
| - Register value);
|
| + Register value,
|
| + FieldContent old_content = kHeapObjectOrSmi);
|
| + void InitializeFieldNoBarrier(Register object,
|
| + const Address& dest,
|
| + Register value) {
|
| + return StoreIntoObjectNoBarrier(object, dest, value, kEmptyOrSmiOrNull);
|
| + }
|
| void StoreIntoObjectNoBarrier(Register object,
|
| const Address& dest,
|
| - const Object& value);
|
| + const Object& value,
|
| + FieldContent old_content = kHeapObjectOrSmi);
|
| + void InitializeFieldNoBarrier(Register object,
|
| + const Address& dest,
|
| + const Object& value) {
|
| + return StoreIntoObjectNoBarrier(object, dest, value, kEmptyOrSmiOrNull);
|
| + }
|
|
|
| // Stores a Smi value into a heap object field that always contains a Smi.
|
| void StoreIntoSmiField(const Address& dest, Register value);
|
| - void ZeroSmiField(const Address& dest);
|
| + void ZeroInitSmiField(const Address& dest);
|
| // Increments a Smi field. Leaves flags in same state as an 'addl'.
|
| void IncrementSmiField(const Address& dest, int32_t increment);
|
|
|
| @@ -945,11 +966,17 @@
|
| void StoreIntoObjectFilterNoSmi(Register object,
|
| Register value,
|
| Label* no_update);
|
| -
|
| - // Analogous to VerifiedMemory::Verify(address, kWordSize).
|
| - void VerifyHeapWord(const Address& address);
|
| - // Analogous to VerifiedMemory::Write.
|
| - void VerifiedWrite(const Address& dest, Register value);
|
| +#if defined(DEBUG)
|
| + void VerifyUninitialized(const Address& address);
|
| + void VerifyObjectOrSmi(const Address& address);
|
| + void VerifySmi(const Address& address, const char* stop_msg = "Expected Smi");
|
| +#endif // DEBUG
|
| + // Like VerifiedMemory::Verify(address, kWordSize) and ::Write, but also,
|
| + // in DEBUG mode, verifies that 'address' has content of type 'old_content'.
|
| + void VerifyHeapWord(const Address& address, FieldContent old_content);
|
| + void VerifiedWrite(const Address& dest,
|
| + Register value,
|
| + FieldContent old_content);
|
| void UnverifiedStoreOldObject(const Address& dest, const Object& value);
|
|
|
| int32_t jit_cookie();
|
|
|