Index: runtime/vm/assembler_arm64.h |
diff --git a/runtime/vm/assembler_arm64.h b/runtime/vm/assembler_arm64.h |
index ffdfd9d9d0702f9ac0f1971d3665cb9dd4c73ba3..b3a812bb29323d3f05259c24b34e4e67c5852eef 100644 |
--- a/runtime/vm/assembler_arm64.h |
+++ b/runtime/vm/assembler_arm64.h |
@@ -119,7 +119,7 @@ class Address : public ValueObject { |
// is unscaled. |
Address(Register rn, int32_t offset = 0, AddressType at = Offset, |
OperandSize sz = kDoubleWord) { |
- ASSERT((rn != R31) && (rn != ZR)); |
+ ASSERT((rn != kNoRegister) && (rn != R31) && (rn != ZR)); |
ASSERT(CanHoldOffset(offset, at, sz)); |
const Register crn = ConcreteRegister(rn); |
const int32_t scale = Log2OperandSizeBytes(sz); |
@@ -1161,6 +1161,8 @@ class Assembler : public ValueObject { |
void PopAndUntagPP() { |
ldr(PP, Address(SP, 1 * kWordSize, Address::PostIndex)); |
sub(PP, PP, Operand(kHeapObjectTag)); |
+ // The caller of PopAndUntagPP() must explicitly allow use of popped PP. |
+ set_constant_pool_allowed(false); |
} |
void tst(Register rn, Operand o) { |
ands(ZR, rn, o); |
@@ -1196,8 +1198,8 @@ class Assembler : public ValueObject { |
} |
// Branching to ExternalLabels. |
- void Branch(const ExternalLabel* label, Register pp) { |
- LoadExternalLabel(TMP, label, kNotPatchable, pp); |
+ void Branch(const ExternalLabel* label) { |
+ LoadExternalLabel(TMP, label); |
br(TMP); |
} |
@@ -1208,15 +1210,15 @@ class Assembler : public ValueObject { |
br(TMP); |
} |
- void BranchLink(const ExternalLabel* label, Register pp) { |
- LoadExternalLabel(TMP, label, kNotPatchable, pp); |
+ void BranchLink(const ExternalLabel* label) { |
+ LoadExternalLabel(TMP, label); |
blr(TMP); |
} |
// BranchLinkPatchable must be a fixed-length sequence so we can patch it |
// with the debugger. |
void BranchLinkPatchable(const ExternalLabel* label) { |
- LoadExternalLabelFixed(TMP, label, kPatchable, PP); |
+ LoadExternalLabelFixed(TMP, label, kPatchable); |
blr(TMP); |
} |
@@ -1224,53 +1226,43 @@ class Assembler : public ValueObject { |
// the object pool when possible. Unless you are sure that the untagged object |
// pool pointer is in another register, or that it is not available at all, |
// PP should be passed for pp. |
- void AddImmediate(Register dest, Register rn, int64_t imm, Register pp); |
- void AddImmediateSetFlags( |
- Register dest, Register rn, int64_t imm, Register pp); |
- void SubImmediateSetFlags( |
- Register dest, Register rn, int64_t imm, Register pp); |
- void AndImmediate(Register rd, Register rn, int64_t imm, Register pp); |
- void OrImmediate(Register rd, Register rn, int64_t imm, Register pp); |
- void XorImmediate(Register rd, Register rn, int64_t imm, Register pp); |
- void TestImmediate(Register rn, int64_t imm, Register pp); |
- void CompareImmediate(Register rn, int64_t imm, Register pp); |
+ void AddImmediate(Register dest, Register rn, int64_t imm); |
+ void AddImmediateSetFlags(Register dest, Register rn, int64_t imm); |
+ void SubImmediateSetFlags(Register dest, Register rn, int64_t imm); |
+ void AndImmediate(Register rd, Register rn, int64_t imm); |
+ void OrImmediate(Register rd, Register rn, int64_t imm); |
+ void XorImmediate(Register rd, Register rn, int64_t imm); |
+ void TestImmediate(Register rn, int64_t imm); |
+ void CompareImmediate(Register rn, int64_t imm); |
void LoadFromOffset(Register dest, Register base, int32_t offset, |
- Register pp, OperandSize sz = kDoubleWord); |
+ OperandSize sz = kDoubleWord); |
void LoadFieldFromOffset(Register dest, Register base, int32_t offset, |
- Register pp, OperandSize sz = kDoubleWord) { |
- LoadFromOffset(dest, base, offset - kHeapObjectTag, pp, sz); |
+ OperandSize sz = kDoubleWord) { |
+ LoadFromOffset(dest, base, offset - kHeapObjectTag, sz); |
} |
- void LoadDFromOffset( |
- VRegister dest, Register base, int32_t offset, Register pp); |
- void LoadDFieldFromOffset( |
- VRegister dest, Register base, int32_t offset, Register pp) { |
- LoadDFromOffset(dest, base, offset - kHeapObjectTag, pp); |
+ void LoadDFromOffset(VRegister dest, Register base, int32_t offset); |
+ void LoadDFieldFromOffset(VRegister dest, Register base, int32_t offset) { |
+ LoadDFromOffset(dest, base, offset - kHeapObjectTag); |
} |
- void LoadQFromOffset( |
- VRegister dest, Register base, int32_t offset, Register pp); |
- void LoadQFieldFromOffset( |
- VRegister dest, Register base, int32_t offset, Register pp) { |
- LoadQFromOffset(dest, base, offset - kHeapObjectTag, pp); |
+ void LoadQFromOffset(VRegister dest, Register base, int32_t offset); |
+ void LoadQFieldFromOffset(VRegister dest, Register base, int32_t offset) { |
+ LoadQFromOffset(dest, base, offset - kHeapObjectTag); |
} |
void StoreToOffset(Register src, Register base, int32_t offset, |
- Register pp, OperandSize sz = kDoubleWord); |
+ OperandSize sz = kDoubleWord); |
void StoreFieldToOffset(Register src, Register base, int32_t offset, |
- Register pp, OperandSize sz = kDoubleWord) { |
- StoreToOffset(src, base, offset - kHeapObjectTag, pp, sz); |
+ OperandSize sz = kDoubleWord) { |
+ StoreToOffset(src, base, offset - kHeapObjectTag, sz); |
} |
- void StoreDToOffset( |
- VRegister src, Register base, int32_t offset, Register pp); |
- void StoreDFieldToOffset( |
- VRegister src, Register base, int32_t offset, Register pp) { |
- StoreDToOffset(src, base, offset - kHeapObjectTag, pp); |
+ void StoreDToOffset(VRegister src, Register base, int32_t offset); |
+ void StoreDFieldToOffset(VRegister src, Register base, int32_t offset) { |
+ StoreDToOffset(src, base, offset - kHeapObjectTag); |
} |
- void StoreQToOffset( |
- VRegister src, Register base, int32_t offset, Register pp); |
- void StoreQFieldToOffset( |
- VRegister src, Register base, int32_t offset, Register pp) { |
- StoreQToOffset(src, base, offset - kHeapObjectTag, pp); |
+ void StoreQToOffset(VRegister src, Register base, int32_t offset); |
+ void StoreQFieldToOffset(VRegister src, Register base, int32_t offset) { |
+ StoreQToOffset(src, base, offset - kHeapObjectTag); |
} |
// Storing into an object. |
@@ -1281,25 +1273,22 @@ class Assembler : public ValueObject { |
void StoreIntoObjectOffset(Register object, |
int32_t offset, |
Register value, |
- Register pp, |
bool can_value_be_smi = true); |
void StoreIntoObjectNoBarrier(Register object, |
const Address& dest, |
Register value); |
void StoreIntoObjectOffsetNoBarrier(Register object, |
int32_t offset, |
- Register value, |
- Register pp); |
+ Register value); |
void StoreIntoObjectNoBarrier(Register object, |
const Address& dest, |
const Object& value); |
void StoreIntoObjectOffsetNoBarrier(Register object, |
int32_t offset, |
- const Object& value, |
- Register pp); |
+ const Object& value); |
// Object pool, loading from pool, etc. |
- void LoadPoolPointer(Register pp); |
+ void LoadPoolPointer(); |
bool constant_pool_allowed() const { |
return constant_pool_allowed_; |
@@ -1308,35 +1297,32 @@ class Assembler : public ValueObject { |
constant_pool_allowed_ = b; |
} |
- void LoadWordFromPoolOffset(Register dst, Register pp, uint32_t offset); |
- void LoadWordFromPoolOffsetFixed(Register dst, Register pp, uint32_t offset); |
+ void LoadWordFromPoolOffset(Register dst, uint32_t offset); |
+ void LoadWordFromPoolOffsetFixed(Register dst, uint32_t offset); |
intptr_t FindImmediate(int64_t imm); |
bool CanLoadFromObjectPool(const Object& object) const; |
- bool CanLoadImmediateFromPool(int64_t imm, Register pp); |
- void LoadExternalLabel(Register dst, const ExternalLabel* label, |
- Patchability patchable, Register pp); |
+ void LoadExternalLabel(Register dst, const ExternalLabel* label); |
void LoadExternalLabelFixed(Register dst, |
const ExternalLabel* label, |
- Patchability patchable, |
- Register pp); |
+ Patchability patchable); |
void LoadIsolate(Register dst); |
- void LoadObject(Register dst, const Object& obj, Register pp); |
- void LoadUniqueObject(Register dst, const Object& obj, Register pp); |
- void LoadDecodableImmediate(Register reg, int64_t imm, Register pp); |
+ void LoadObject(Register dst, const Object& obj); |
+ void LoadUniqueObject(Register dst, const Object& obj); |
+ void LoadDecodableImmediate(Register reg, int64_t imm); |
void LoadImmediateFixed(Register reg, int64_t imm); |
- void LoadImmediate(Register reg, int64_t imm, Register pp); |
- void LoadDImmediate(VRegister reg, double immd, Register pp); |
+ void LoadImmediate(Register reg, int64_t imm); |
+ void LoadDImmediate(VRegister reg, double immd); |
- void PushObject(const Object& object, Register pp) { |
- LoadObject(TMP, object, pp); |
+ void PushObject(const Object& object) { |
+ LoadObject(TMP, object); |
Push(TMP); |
} |
- void CompareObject(Register reg, const Object& object, Register pp); |
+ void CompareObject(Register reg, const Object& object); |
- void LoadClassId(Register result, Register object, Register pp); |
- void LoadClassById(Register result, Register class_id, Register pp); |
- void LoadClass(Register result, Register object, Register pp); |
- void CompareClassId(Register object, intptr_t class_id, Register pp); |
+ void LoadClassId(Register result, Register object); |
+ void LoadClassById(Register result, Register class_id); |
+ void LoadClass(Register result, Register object); |
+ void CompareClassId(Register object, intptr_t class_id); |
void LoadClassIdMayBeSmi(Register result, Register object); |
void LoadTaggedClassIdMayBeSmi(Register result, Register object); |
@@ -1379,13 +1365,11 @@ class Assembler : public ValueObject { |
void LeaveStubFrame(); |
void UpdateAllocationStats(intptr_t cid, |
- Register pp, |
Heap::Space space, |
bool inline_isolate = true); |
void UpdateAllocationStatsWithSize(intptr_t cid, |
Register size_reg, |
- Register pp, |
Heap::Space space, |
bool inline_isolate = true); |
@@ -1393,7 +1377,6 @@ class Assembler : public ValueObject { |
// which will allocate in the runtime where tracing occurs. |
void MaybeTraceAllocation(intptr_t cid, |
Register temp_reg, |
- Register pp, |
Label* trace, |
bool inline_isolate = true); |
@@ -1404,8 +1387,7 @@ class Assembler : public ValueObject { |
void TryAllocate(const Class& cls, |
Label* failure, |
Register instance_reg, |
- Register temp_reg, |
- Register pp); |
+ Register temp_reg); |
void TryAllocateArray(intptr_t cid, |
intptr_t instance_size, |
@@ -1455,10 +1437,7 @@ class Assembler : public ValueObject { |
bool constant_pool_allowed_; |
- void LoadObjectHelper(Register dst, |
- const Object& obj, |
- Register pp, |
- bool is_unique); |
+ void LoadObjectHelper(Register dst, const Object& obj, bool is_unique); |
void AddSubHelper(OperandSize os, bool set_flags, bool subtract, |
Register rd, Register rn, Operand o) { |