Skip to content

Commit 12e9145

Browse files
aamcommit-bot@chromium.org
authored and
commit-bot@chromium.org
committed
[vm/aot-switchable-calls] Introduce single runtime entry for all switchable calls
Bug: dart-lang#37835 Bug: dart-lang#36097 Change-Id: I0198fd0328945b04e4f2254bacac25b41038e78c Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/138361 Commit-Queue: Alexander Aprelev <aam@google.com> Reviewed-by: Martin Kustermann <kustermann@google.com> Reviewed-by: Ryan Macnak <rmacnak@google.com>
1 parent 04d21a3 commit 12e9145

4 files changed

+65
-46
lines changed

assembler_arm.cc

+25-19
Original file line numberDiff line numberDiff line change
@@ -1592,7 +1592,6 @@ void Assembler::LoadIsolate(Register rd) {
15921592

15931593
bool Assembler::CanLoadFromObjectPool(const Object& object) const {
15941594
ASSERT(IsOriginalObject(object));
1595-
ASSERT(!target::CanLoadFromThread(object));
15961595
if (!constant_pool_allowed()) {
15971596
return false;
15981597
}
@@ -1608,24 +1607,31 @@ void Assembler::LoadObjectHelper(Register rd,
16081607
bool is_unique,
16091608
Register pp) {
16101609
ASSERT(IsOriginalObject(object));
1611-
intptr_t offset = 0;
1612-
if (target::CanLoadFromThread(object, &offset)) {
1613-
// Load common VM constants from the thread. This works also in places where
1614-
// no constant pool is set up (e.g. intrinsic code).
1615-
ldr(rd, Address(THR, offset), cond);
1616-
} else if (target::IsSmi(object)) {
1617-
// Relocation doesn't apply to Smis.
1618-
LoadImmediate(rd, target::ToRawSmi(object), cond);
1619-
} else if (CanLoadFromObjectPool(object)) {
1620-
// Make sure that class CallPattern is able to decode this load from the
1621-
// object pool.
1622-
const auto index = is_unique ? object_pool_builder().AddObject(object)
1623-
: object_pool_builder().FindObject(object);
1624-
const int32_t offset = target::ObjectPool::element_offset(index);
1625-
LoadWordFromPoolOffset(rd, offset - kHeapObjectTag, pp, cond);
1626-
} else {
1610+
// `is_unique == true` effectively means object has to be patchable.
1611+
if (!is_unique) {
1612+
intptr_t offset = 0;
1613+
if (target::CanLoadFromThread(object, &offset)) {
1614+
// Load common VM constants from the thread. This works also in places
1615+
// where no constant pool is set up (e.g. intrinsic code).
1616+
ldr(rd, Address(THR, offset), cond);
1617+
return;
1618+
}
1619+
if (target::IsSmi(object)) {
1620+
// Relocation doesn't apply to Smis.
1621+
LoadImmediate(rd, target::ToRawSmi(object), cond);
1622+
return;
1623+
}
1624+
}
1625+
if (!CanLoadFromObjectPool(object)) {
16271626
UNREACHABLE();
1627+
return;
16281628
}
1629+
// Make sure that class CallPattern is able to decode this load from the
1630+
// object pool.
1631+
const auto index = is_unique ? object_pool_builder().AddObject(object)
1632+
: object_pool_builder().FindObject(object);
1633+
const int32_t offset = target::ObjectPool::element_offset(index);
1634+
LoadWordFromPoolOffset(rd, offset - kHeapObjectTag, pp, cond);
16291635
}
16301636

16311637
void Assembler::LoadObject(Register rd, const Object& object, Condition cond) {
@@ -3459,7 +3465,7 @@ void Assembler::MonomorphicCheckedEntryJIT() {
34593465
LoadClassIdMayBeSmi(IP, R0);
34603466
add(R2, R2, Operand(target::ToRawSmi(1)));
34613467
cmp(R1, Operand(IP, LSL, 1));
3462-
Branch(Address(THR, target::Thread::monomorphic_miss_entry_offset()), NE);
3468+
Branch(Address(THR, target::Thread::switchable_call_miss_entry_offset()), NE);
34633469
str(R2, FieldAddress(R9, count_offset));
34643470
LoadImmediate(R4, 0); // GC-safe for OptimizeInvokedFunction.
34653471

@@ -3488,7 +3494,7 @@ void Assembler::MonomorphicCheckedEntryAOT() {
34883494

34893495
LoadClassId(IP, R0);
34903496
cmp(R9, Operand(IP, LSL, 1));
3491-
Branch(Address(THR, target::Thread::monomorphic_miss_entry_offset()), NE);
3497+
Branch(Address(THR, target::Thread::switchable_call_miss_entry_offset()), NE);
34923498

34933499
// Fall through to unchecked entry.
34943500
ASSERT_EQUAL(CodeSize() - start,

assembler_arm64.cc

+20-13
Original file line numberDiff line numberDiff line change
@@ -430,7 +430,6 @@ intptr_t Assembler::FindImmediate(int64_t imm) {
430430

431431
bool Assembler::CanLoadFromObjectPool(const Object& object) const {
432432
ASSERT(IsOriginalObject(object));
433-
ASSERT(!target::CanLoadFromThread(object));
434433
if (!constant_pool_allowed()) {
435434
return false;
436435
}
@@ -464,20 +463,28 @@ void Assembler::LoadObjectHelper(Register dst,
464463
const Object& object,
465464
bool is_unique) {
466465
ASSERT(IsOriginalObject(object));
467-
word offset = 0;
468-
if (IsSameObject(compiler::NullObject(), object)) {
469-
mov(dst, NULL_REG);
470-
} else if (target::CanLoadFromThread(object, &offset)) {
471-
ldr(dst, Address(THR, offset));
472-
} else if (CanLoadFromObjectPool(object)) {
466+
// `is_unique == true` effectively means object has to be patchable.
467+
// (even if the object is null)
468+
if (!is_unique) {
469+
if (IsSameObject(compiler::NullObject(), object)) {
470+
mov(dst, NULL_REG);
471+
return;
472+
}
473+
word offset = 0;
474+
if (target::CanLoadFromThread(object, &offset)) {
475+
ldr(dst, Address(THR, offset));
476+
return;
477+
}
478+
}
479+
if (CanLoadFromObjectPool(object)) {
473480
const int32_t offset = target::ObjectPool::element_offset(
474481
is_unique ? object_pool_builder().AddObject(object)
475482
: object_pool_builder().FindObject(object));
476483
LoadWordFromPoolOffset(dst, offset);
477-
} else {
478-
ASSERT(target::IsSmi(object));
479-
LoadImmediate(dst, target::ToRawSmi(object));
484+
return;
480485
}
486+
ASSERT(target::IsSmi(object));
487+
LoadImmediate(dst, target::ToRawSmi(object));
481488
}
482489

483490
void Assembler::LoadObject(Register dst, const Object& object) {
@@ -1549,7 +1556,7 @@ void Assembler::MonomorphicCheckedEntryJIT() {
15491556

15501557
Label immediate, miss;
15511558
Bind(&miss);
1552-
ldr(IP0, Address(THR, target::Thread::monomorphic_miss_entry_offset()));
1559+
ldr(IP0, Address(THR, target::Thread::switchable_call_miss_entry_offset()));
15531560
br(IP0);
15541561

15551562
Comment("MonomorphicCheckedEntry");
@@ -1567,7 +1574,7 @@ void Assembler::MonomorphicCheckedEntryJIT() {
15671574
cmp(R1, Operand(IP0, LSL, 1));
15681575
b(&miss, NE);
15691576
str(R2, FieldAddress(R5, count_offset));
1570-
LoadImmediate(R4, 0); // GC-safe for OptimizeInvokedFunction.
1577+
LoadImmediate(R4, 0); // GC-safe for OptimizeInvokedFunction
15711578

15721579
// Fall through to unchecked entry.
15731580
ASSERT_EQUAL(CodeSize() - start,
@@ -1587,7 +1594,7 @@ void Assembler::MonomorphicCheckedEntryAOT() {
15871594

15881595
Label immediate, miss;
15891596
Bind(&miss);
1590-
ldr(IP0, Address(THR, target::Thread::monomorphic_miss_entry_offset()));
1597+
ldr(IP0, Address(THR, target::Thread::switchable_call_miss_entry_offset()));
15911598
br(IP0);
15921599

15931600
Comment("MonomorphicCheckedEntry");

assembler_ia32.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -2123,7 +2123,7 @@ void Assembler::MonomorphicCheckedEntryJIT() {
21232123
intptr_t start = CodeSize();
21242124
Label have_cid, miss;
21252125
Bind(&miss);
2126-
jmp(Address(THR, target::Thread::monomorphic_miss_entry_offset()));
2126+
jmp(Address(THR, target::Thread::switchable_call_miss_entry_offset()));
21272127

21282128
Comment("MonomorphicCheckedEntry");
21292129
ASSERT(CodeSize() - start ==

assembler_x64.cc

+19-13
Original file line numberDiff line numberDiff line change
@@ -1208,7 +1208,6 @@ void Assembler::Drop(intptr_t stack_elements, Register tmp) {
12081208

12091209
bool Assembler::CanLoadFromObjectPool(const Object& object) const {
12101210
ASSERT(IsOriginalObject(object));
1211-
ASSERT(!target::CanLoadFromThread(object));
12121211
if (!constant_pool_allowed()) {
12131212
return false;
12141213
}
@@ -1243,18 +1242,23 @@ void Assembler::LoadObjectHelper(Register dst,
12431242
bool is_unique) {
12441243
ASSERT(IsOriginalObject(object));
12451244

1246-
intptr_t offset_from_thread;
1247-
if (target::CanLoadFromThread(object, &offset_from_thread)) {
1248-
movq(dst, Address(THR, offset_from_thread));
1249-
} else if (CanLoadFromObjectPool(object)) {
1250-
const intptr_t idx = is_unique ? object_pool_builder().AddObject(object)
1251-
: object_pool_builder().FindObject(object);
1252-
const int32_t offset = target::ObjectPool::element_offset(idx);
1245+
// `is_unique == true` effectively means object has to be patchable.
1246+
if (!is_unique) {
1247+
intptr_t offset;
1248+
if (target::CanLoadFromThread(object, &offset)) {
1249+
movq(dst, Address(THR, offset));
1250+
return;
1251+
}
1252+
}
1253+
if (CanLoadFromObjectPool(object)) {
1254+
const int32_t offset = target::ObjectPool::element_offset(
1255+
is_unique ? object_pool_builder().AddObject(object)
1256+
: object_pool_builder().FindObject(object));
12531257
LoadWordFromPoolOffset(dst, offset - kHeapObjectTag);
1254-
} else {
1255-
ASSERT(target::IsSmi(object));
1256-
LoadImmediate(dst, Immediate(target::ToRawSmi(object)));
1258+
return;
12571259
}
1260+
ASSERT(target::IsSmi(object));
1261+
LoadImmediate(dst, Immediate(target::ToRawSmi(object)));
12581262
}
12591263

12601264
void Assembler::LoadObject(Register dst, const Object& object) {
@@ -1801,7 +1805,7 @@ void Assembler::MonomorphicCheckedEntryJIT() {
18011805
intptr_t start = CodeSize();
18021806
Label have_cid, miss;
18031807
Bind(&miss);
1804-
jmp(Address(THR, target::Thread::monomorphic_miss_entry_offset()));
1808+
jmp(Address(THR, target::Thread::switchable_call_miss_entry_offset()));
18051809

18061810
// Ensure the monomorphic entry is 2-byte aligned (so GC can see them if we
18071811
// store them in ICData / MegamorphicCache arrays)
@@ -1829,12 +1833,14 @@ void Assembler::MonomorphicCheckedEntryJIT() {
18291833
ASSERT(((CodeSize() - start) & kSmiTagMask) == kSmiTag);
18301834
}
18311835

1836+
// RBX - input: class id smi
1837+
// RDX - input: receiver object
18321838
void Assembler::MonomorphicCheckedEntryAOT() {
18331839
has_monomorphic_entry_ = true;
18341840
intptr_t start = CodeSize();
18351841
Label have_cid, miss;
18361842
Bind(&miss);
1837-
jmp(Address(THR, target::Thread::monomorphic_miss_entry_offset()));
1843+
jmp(Address(THR, target::Thread::switchable_call_miss_entry_offset()));
18381844

18391845
// Ensure the monomorphic entry is 2-byte aligned (so GC can see them if we
18401846
// store them in ICData / MegamorphicCache arrays)

0 commit comments

Comments
 (0)