Skip to content

Commit 9fc280a

Browse files
sstricklCommit Queue
authored and
Commit Queue
committed
[vm/compiler] Add all Compressed Assembler methods to AssemblerBase.
Remove CompareWithCompressedFieldFromOffset, which has no uses. Rename the LoadFromOffset and StoreFromOffset methods that took Addresses to Load and Store, respectively. This makes the names of the Assembler methods more uniform: * Takes an address: Load, Store, LoadField, LoadCompressedField, StoreIntoObject, StoreCompressedIntoObject, LoadSmi, LoadCompressedSmi, etc. * Takes a base register and an offset: LoadFromOffset, StoreToOffset, LoadFieldFromOffset, LoadCompressedFieldFromOffset, StoreIntoObjectOffset, StoreCompressedIntoObjectOffset, LoadSmiFromOffset, LoadCompressedSmiFromOffset, etc. Create AssemblerBase methods for loading and storing compressed pointers that weren't already there, as well as the corresponding methods for loading and storing uncompressed values. Make non-virtual methods that load and store uncompressed fields that call the corresponding method for loading from and storing to memory regions, adjusting the address or offset accordingly. This avoids needing per-architecture overrides for these. Make non-virtual methods that load compressed fields, calling the corresponding method for loading a compressed value from a memory region. (Since compressed pointers are only stored in Dart objects, and stores into a Dart object may require a barrier, there is no method for storing a compressed value into an arbitrary memory region.) Create pure virtual methods for loading from or storing to an Address or any method that does not have both an Address-taking and a base register and offset pair-taking version (e.g., LoadAcquire). Create methods for loading from or storing to a base register and an offset. The base implementation takes the base register and offset and creates an Address from it, then calls the Address-taking equivalent. These methods are non-virtual when the implementation is the same on all architectures and virtual to allow overriding when necessary. Make a non-virtual method for loading uncompressed Smis, since all architectures have the same code for this, including the DEBUG check. If compressed pointers are not being used, all the methods for compressed pointers are non-virtual methods that call the corresponding method for uncompressed values. If compressed pointers are being used: * Install pure virtual methods for loading compressed values from and storing compressed values to an Address or any method that does not have both an Address-taking and a base register and offset pair-taking version (e.g., LoadAcquireCompressed). * Install virtual methods for loading compressed values from and storing compressed values to a base register and offset. Like the uncompressed implementation, the base implementation of these create an Address and call the Address-taking equivalent, and these implementations are overridden on ARM64. * Install a non-virtual method for loading compressed Smis, since the only difference is that it loads a zero-extended 32-bit value, which AssemblerBase can do. TEST=ci (refactoring only) Change-Id: I934791d26a6e2cdaa6ac5f188b0fd89dbdc491d1 Cq-Include-Trybots: luci.dart.try:vm-aot-android-release-arm64c-try,vm-aot-android-release-arm_x64-try,vm-aot-linux-debug-x64-try,vm-aot-linux-debug-x64c-try,vm-aot-mac-release-arm64-try,vm-aot-mac-release-x64-try,vm-aot-obfuscate-linux-release-x64-try,vm-aot-optimization-level-linux-release-x64-try,vm-aot-win-debug-arm64-try,vm-appjit-linux-debug-x64-try,vm-asan-linux-release-x64-try,vm-checked-mac-release-arm64-try,vm-eager-optimization-linux-release-ia32-try,vm-eager-optimization-linux-release-x64-try,vm-ffi-android-debug-arm-try,vm-ffi-android-debug-arm64c-try,vm-ffi-qemu-linux-release-arm-try,vm-ffi-qemu-linux-release-riscv64-try,vm-linux-debug-ia32-try,vm-linux-debug-x64c-try,vm-mac-debug-arm64-try,vm-mac-debug-x64-try,vm-msan-linux-release-x64-try,vm-reload-linux-debug-x64-try,vm-reload-rollback-linux-debug-x64-try,vm-ubsan-linux-release-x64-try,vm-win-debug-arm64-try,vm-win-debug-x64-try,vm-win-release-ia32-try Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/359861 Reviewed-by: Daco Harkes <dacoharkes@google.com> Commit-Queue: Tess Strickland <sstrickl@google.com> Reviewed-by: Alexander Markov <alexmarkov@google.com>
1 parent 8dcb212 commit 9fc280a

26 files changed

+904
-991
lines changed

runtime/vm/compiler/asm_intrinsifier.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ void AsmIntrinsifier::StringEquality(Assembler* assembler,
4545
__ CompareClassId(obj2, string_cid, temp1);
4646
__ BranchIf(NOT_EQUAL, normal_ir_body, AssemblerBase::kNearJump);
4747

48-
__ LoadFromOffset(temp1, FieldAddress(obj1, target::String::length_offset()));
48+
__ LoadFieldFromOffset(temp1, obj1, target::String::length_offset());
4949
__ CompareWithMemoryValue(
5050
temp1, FieldAddress(obj2, target::String::length_offset()));
5151
__ BranchIf(NOT_EQUAL, &is_false, AssemblerBase::kNearJump);

runtime/vm/compiler/assembler/assembler_arm.cc

+13-23
Original file line numberDiff line numberDiff line change
@@ -1773,7 +1773,7 @@ void Assembler::StoreIntoObject(Register object,
17731773
if (memory_order == kRelease) {
17741774
StoreRelease(value, dest);
17751775
} else {
1776-
StoreToOffset(value, dest);
1776+
Store(value, dest);
17771777
}
17781778

17791779
// In parallel, test whether
@@ -1909,7 +1909,7 @@ void Assembler::StoreIntoObjectNoBarrier(Register object,
19091909
if (memory_order == kRelease) {
19101910
StoreRelease(value, dest);
19111911
} else {
1912-
StoreToOffset(value, dest);
1912+
Store(value, dest);
19131913
}
19141914
#if defined(DEBUG)
19151915
// We can't assert the incremental barrier is not needed here, only the
@@ -2030,7 +2030,7 @@ void Assembler::StoreIntoSmiField(const Address& dest, Register value) {
20302030
Stop("New value must be Smi.");
20312031
Bind(&done);
20322032
#endif // defined(DEBUG)
2033-
StoreToOffset(value, dest);
2033+
Store(value, dest);
20342034
}
20352035

20362036
void Assembler::ExtractClassIdFromTags(Register result,
@@ -2280,16 +2280,6 @@ void Assembler::Bind(Label* label) {
22802280
BindARMv7(label);
22812281
}
22822282

2283-
void Assembler::LoadCompressedSmi(Register dest, const Address& slot) {
2284-
ldr(dest, slot);
2285-
#if defined(DEBUG)
2286-
Label done;
2287-
BranchIfSmi(dest, &done, kNearJump);
2288-
Stop("Expected Smi");
2289-
Bind(&done);
2290-
#endif
2291-
}
2292-
22932283
OperandSize Address::OperandSizeFor(intptr_t cid) {
22942284
auto const rep = RepresentationUtils::RepresentationOfArrayElement(cid);
22952285
switch (rep) {
@@ -2890,10 +2880,10 @@ Address Assembler::PrepareLargeStoreOffset(const Address& address,
28902880
return Address(base, offset, mode);
28912881
}
28922882

2893-
void Assembler::LoadFromOffset(Register reg,
2894-
const Address& address,
2895-
OperandSize size,
2896-
Condition cond) {
2883+
void Assembler::Load(Register reg,
2884+
const Address& address,
2885+
OperandSize size,
2886+
Condition cond) {
28972887
const Address& addr = PrepareLargeLoadOffset(address, size, cond);
28982888
switch (size) {
28992889
case kByte:
@@ -2932,10 +2922,10 @@ void Assembler::CompareToStack(Register src, intptr_t depth) {
29322922
CompareRegisters(src, TMP);
29332923
}
29342924

2935-
void Assembler::StoreToOffset(Register reg,
2936-
const Address& address,
2937-
OperandSize size,
2938-
Condition cond) {
2925+
void Assembler::Store(Register reg,
2926+
const Address& address,
2927+
OperandSize size,
2928+
Condition cond) {
29392929
const Address& addr = PrepareLargeStoreOffset(address, size, cond);
29402930
switch (size) {
29412931
case kUnsignedByte:
@@ -3866,8 +3856,8 @@ void Assembler::LoadElementAddressForRegIndex(Register address,
38663856
void Assembler::LoadStaticFieldAddress(Register address,
38673857
Register field,
38683858
Register scratch) {
3869-
LoadCompressedFieldFromOffset(
3870-
scratch, field, target::Field::host_offset_or_field_id_offset());
3859+
LoadFieldFromOffset(scratch, field,
3860+
target::Field::host_offset_or_field_id_offset());
38713861
const intptr_t field_table_offset =
38723862
compiler::target::Thread::field_table_values_offset();
38733863
LoadMemoryValue(address, THR, static_cast<int32_t>(field_table_offset));

runtime/vm/compiler/assembler/assembler_arm.h

+63-83
Original file line numberDiff line numberDiff line change
@@ -415,32 +415,25 @@ class Assembler : public AssemblerBase {
415415

416416
void PushValueAtOffset(Register base, int32_t offset) { UNIMPLEMENTED(); }
417417

418-
void Bind(Label* label);
418+
void Bind(Label* label) override;
419419
// Unconditional jump to a given label. [distance] is ignored on ARM.
420420
void Jump(Label* label, JumpDistance distance = kFarJump) { b(label); }
421421
// Unconditional jump to a given address in register.
422422
void Jump(Register target) { bx(target); }
423423
// Unconditional jump to a given address in memory.
424424
void Jump(const Address& address) { Branch(address); }
425425

426-
void LoadField(Register dst, const FieldAddress& address) override {
427-
LoadFromOffset(dst, address);
428-
}
429426
void LoadMemoryValue(Register dst, Register base, int32_t offset) {
430427
LoadFromOffset(dst, base, offset);
431428
}
432-
void LoadCompressed(Register dest, const Address& slot) {
433-
LoadFromOffset(dest, slot);
434-
}
435-
void LoadCompressedSmi(Register dest, const Address& slot) override;
436429
void StoreMemoryValue(Register src, Register base, int32_t offset) {
437430
StoreToOffset(src, base, offset);
438431
}
439432
void LoadAcquire(Register dst,
440433
Register address,
441434
int32_t offset = 0,
442435
OperandSize size = kFourBytes) override {
443-
LoadFromOffset(dst, Address(address, offset), size);
436+
Load(dst, Address(address, offset), size);
444437
dmb();
445438
}
446439
void StoreRelease(Register src,
@@ -450,23 +443,16 @@ class Assembler : public AssemblerBase {
450443
}
451444
void StoreRelease(Register src, Address dest) {
452445
dmb();
453-
StoreToOffset(src, dest);
446+
Store(src, dest);
454447

455448
// We don't run TSAN bots on 32 bit.
456449
}
457450

458-
void CompareWithCompressedFieldFromOffset(Register value,
459-
Register base,
460-
int32_t offset) {
461-
LoadCompressedFieldFromOffset(TMP, base, offset);
462-
cmp(value, Operand(TMP));
463-
}
464-
465451
void CompareWithMemoryValue(Register value,
466452
Address address,
467453
OperandSize size = kFourBytes) override {
468454
ASSERT_EQUAL(size, kFourBytes);
469-
LoadFromOffset(TMP, address, size);
455+
Load(TMP, address, size);
470456
cmp(value, Operand(TMP));
471457
}
472458

@@ -1022,32 +1008,34 @@ class Assembler : public AssemblerBase {
10221008
void StoreIntoArray(Register object,
10231009
Register slot,
10241010
Register value,
1025-
CanBeSmi can_value_be_smi = kValueCanBeSmi);
1026-
void StoreIntoObjectOffset(Register object,
1027-
int32_t offset,
1028-
Register value,
1029-
CanBeSmi can_value_be_smi = kValueCanBeSmi,
1030-
MemoryOrder memory_order = kRelaxedNonAtomic);
1011+
CanBeSmi can_value_be_smi = kValueCanBeSmi) override;
1012+
void StoreIntoObjectOffset(
1013+
Register object,
1014+
int32_t offset,
1015+
Register value,
1016+
CanBeSmi can_value_be_smi = kValueCanBeSmi,
1017+
MemoryOrder memory_order = kRelaxedNonAtomic) override;
10311018

10321019
void StoreIntoObjectNoBarrier(
10331020
Register object,
10341021
const Address& dest,
10351022
Register value,
10361023
MemoryOrder memory_order = kRelaxedNonAtomic) override;
1037-
void StoreIntoObjectNoBarrier(Register object,
1038-
const Address& dest,
1039-
const Object& value,
1040-
MemoryOrder memory_order = kRelaxedNonAtomic);
1024+
void StoreIntoObjectNoBarrier(
1025+
Register object,
1026+
const Address& dest,
1027+
const Object& value,
1028+
MemoryOrder memory_order = kRelaxedNonAtomic) override;
10411029
void StoreIntoObjectOffsetNoBarrier(
10421030
Register object,
10431031
int32_t offset,
10441032
Register value,
1045-
MemoryOrder memory_order = kRelaxedNonAtomic);
1033+
MemoryOrder memory_order = kRelaxedNonAtomic) override;
10461034
void StoreIntoObjectOffsetNoBarrier(
10471035
Register object,
10481036
int32_t offset,
10491037
const Object& value,
1050-
MemoryOrder memory_order = kRelaxedNonAtomic);
1038+
MemoryOrder memory_order = kRelaxedNonAtomic) override;
10511039

10521040
// Stores a non-tagged value into a heap object.
10531041
void StoreInternalPointer(Register object,
@@ -1106,46 +1094,40 @@ class Assembler : public AssemblerBase {
11061094
OperandSize sz,
11071095
Condition cond);
11081096

1097+
void Load(Register reg,
1098+
const Address& address,
1099+
OperandSize type,
1100+
Condition cond);
1101+
void Load(Register reg,
1102+
const Address& address,
1103+
OperandSize type = kFourBytes) override {
1104+
Load(reg, address, type, AL);
1105+
}
11091106
void LoadFromOffset(Register reg,
1110-
const Address& address,
1111-
OperandSize type,
1112-
Condition cond);
1113-
void LoadFromOffset(Register reg,
1114-
const Address& address,
1107+
Register base,
1108+
int32_t offset,
11151109
OperandSize type = kFourBytes) override {
1116-
LoadFromOffset(reg, address, type, AL);
1110+
LoadFromOffset(reg, base, offset, type, AL);
11171111
}
11181112
void LoadFromOffset(Register reg,
11191113
Register base,
11201114
int32_t offset,
1121-
OperandSize type = kFourBytes,
1122-
Condition cond = AL) {
1123-
LoadFromOffset(reg, Address(base, offset), type, cond);
1115+
OperandSize type,
1116+
Condition cond) {
1117+
Load(reg, Address(base, offset), type, cond);
11241118
}
11251119
void LoadFieldFromOffset(Register reg,
11261120
Register base,
11271121
int32_t offset,
1128-
OperandSize sz = kFourBytes) override {
1129-
LoadFromOffset(reg, FieldAddress(base, offset), sz, AL);
1122+
OperandSize type = kFourBytes) override {
1123+
LoadFieldFromOffset(reg, base, offset, type, AL);
11301124
}
11311125
void LoadFieldFromOffset(Register reg,
11321126
Register base,
11331127
int32_t offset,
11341128
OperandSize type,
11351129
Condition cond) {
1136-
LoadFromOffset(reg, FieldAddress(base, offset), type, cond);
1137-
}
1138-
void LoadCompressedFieldFromOffset(Register reg,
1139-
Register base,
1140-
int32_t offset) override {
1141-
LoadCompressedFieldFromOffset(reg, base, offset, kFourBytes, AL);
1142-
}
1143-
void LoadCompressedFieldFromOffset(Register reg,
1144-
Register base,
1145-
int32_t offset,
1146-
OperandSize type,
1147-
Condition cond = AL) {
1148-
LoadFieldFromOffset(reg, base, offset, type, cond);
1130+
Load(reg, FieldAddress(base, offset), type, cond);
11491131
}
11501132
// For loading indexed payloads out of tagged objects like Arrays. If the
11511133
// payload objects are word-sized, use TIMES_HALF_WORD_SIZE if the contents of
@@ -1155,47 +1137,52 @@ class Assembler : public AssemblerBase {
11551137
int32_t payload_start,
11561138
Register index,
11571139
ScaleFactor scale,
1158-
OperandSize type = kFourBytes) {
1140+
OperandSize type = kFourBytes) override {
11591141
add(dst, base, Operand(index, LSL, scale));
11601142
LoadFromOffset(dst, dst, payload_start - kHeapObjectTag, type);
11611143
}
1162-
void LoadIndexedCompressed(Register dst,
1163-
Register base,
1164-
int32_t offset,
1165-
Register index) {
1166-
add(dst, base, Operand(index, LSL, TIMES_COMPRESSED_WORD_SIZE));
1167-
LoadCompressedFieldFromOffset(dst, dst, offset);
1168-
}
11691144
void LoadFromStack(Register dst, intptr_t depth);
11701145
void StoreToStack(Register src, intptr_t depth);
11711146
void CompareToStack(Register src, intptr_t depth);
11721147

1148+
void Store(Register reg,
1149+
const Address& address,
1150+
OperandSize type,
1151+
Condition cond);
1152+
void Store(Register reg,
1153+
const Address& address,
1154+
OperandSize type = kFourBytes) override {
1155+
Store(reg, address, type, AL);
1156+
}
11731157
void StoreToOffset(Register reg,
1174-
const Address& address,
1175-
OperandSize type,
1176-
Condition cond);
1177-
void StoreToOffset(Register reg,
1178-
const Address& address,
1158+
Register base,
1159+
int32_t offset,
11791160
OperandSize type = kFourBytes) override {
1180-
StoreToOffset(reg, address, type, AL);
1161+
StoreToOffset(reg, base, offset, type, AL);
11811162
}
11821163
void StoreToOffset(Register reg,
11831164
Register base,
11841165
int32_t offset,
1185-
OperandSize type = kFourBytes,
1186-
Condition cond = AL) {
1187-
StoreToOffset(reg, Address(base, offset), type, cond);
1166+
OperandSize type,
1167+
Condition cond) {
1168+
Store(reg, Address(base, offset), type, cond);
11881169
}
11891170
void StoreFieldToOffset(Register reg,
11901171
Register base,
11911172
int32_t offset,
1192-
OperandSize type = kFourBytes,
1193-
Condition cond = AL) {
1194-
StoreToOffset(reg, FieldAddress(base, offset), type, cond);
1173+
OperandSize type = kFourBytes) override {
1174+
StoreFieldToOffset(reg, base, offset, type, AL);
1175+
}
1176+
void StoreFieldToOffset(Register reg,
1177+
Register base,
1178+
int32_t offset,
1179+
OperandSize type,
1180+
Condition cond) {
1181+
Store(reg, FieldAddress(base, offset), type, cond);
11951182
}
11961183
void StoreZero(const Address& address, Register temp) {
11971184
mov(temp, Operand(0));
1198-
StoreToOffset(temp, address);
1185+
Store(temp, address);
11991186
}
12001187
void LoadSFromOffset(SRegister reg,
12011188
Register base,
@@ -1545,16 +1532,9 @@ class Assembler : public AssemblerBase {
15451532
Register field,
15461533
Register scratch);
15471534

1548-
void LoadCompressedFieldAddressForRegOffset(Register address,
1549-
Register instance,
1550-
Register offset_in_words_as_smi) {
1551-
return LoadFieldAddressForRegOffset(address, instance,
1552-
offset_in_words_as_smi);
1553-
}
1554-
15551535
void LoadFieldAddressForRegOffset(Register address,
15561536
Register instance,
1557-
Register offset_in_words_as_smi);
1537+
Register offset_in_words_as_smi) override;
15581538

15591539
void LoadFieldAddressForOffset(Register address,
15601540
Register instance,

0 commit comments

Comments
 (0)