Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(191)

Unified Diff: runtime/vm/assembler_x64.cc

Issue 1175523002: Object pool with support for untagged entries. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: runtime/vm/assembler_x64.cc
diff --git a/runtime/vm/assembler_x64.cc b/runtime/vm/assembler_x64.cc
index 660c0473cabffe85c6c7087613abd4fec271f186..85c1cd15653c94c52129add8427343a1bdd26cb8 100644
--- a/runtime/vm/assembler_x64.cc
+++ b/runtime/vm/assembler_x64.cc
@@ -33,13 +33,13 @@ Assembler::Assembler(bool use_far_branches)
// These objects and labels need to be accessible through every pool-pointer
// at the same index.
intptr_t index =
- object_pool_.AddObject(Object::null_object(), kNotPatchable);
+ object_pool_.AddObject(Object::null_object());
srdjan 2015/06/09 21:49:47 On one line?
Florian Schneider 2015/06/10 08:26:17 Done.
ASSERT(index == 0);
- index = object_pool_.AddObject(Bool::True(), kNotPatchable);
+ index = object_pool_.AddObject(Bool::True());
ASSERT(index == 1);
- index = object_pool_.AddObject(Bool::False(), kNotPatchable);
+ index = object_pool_.AddObject(Bool::False());
ASSERT(index == 2);
const Smi& vacant = Smi::Handle(Smi::New(0xfa >> kSmiTagShift));
@@ -48,14 +48,14 @@ Assembler::Assembler(bool use_far_branches)
object_pool_.AddExternalLabel(&stub_code->UpdateStoreBufferLabel(),
kNotPatchable);
} else {
- object_pool_.AddObject(vacant, kNotPatchable);
+ object_pool_.AddObject(vacant);
}
if (stub_code->CallToRuntime_entry() != NULL) {
object_pool_.AddExternalLabel(&stub_code->CallToRuntimeLabel(),
kNotPatchable);
} else {
- object_pool_.AddObject(vacant, kNotPatchable);
+ object_pool_.AddObject(vacant);
}
}
}
@@ -95,8 +95,8 @@ void Assembler::LoadExternalLabel(Register dst,
const ExternalLabel* label,
Patchability patchable,
Register pp) {
- const int32_t offset =
- Array::element_offset(object_pool_.FindExternalLabel(label, patchable));
+ const int32_t offset = ObjectPool::element_offset(
+ object_pool_.FindExternalLabel(label, patchable));
LoadWordFromPoolOffset(dst, pp, offset - kHeapObjectTag);
}
@@ -115,8 +115,8 @@ void Assembler::call(const ExternalLabel* label) {
void Assembler::CallPatchable(const ExternalLabel* label) {
ASSERT(allow_constant_pool());
intptr_t call_start = buffer_.GetPosition();
- const int32_t offset =
- Array::element_offset(object_pool_.FindExternalLabel(label, kPatchable));
+ const int32_t offset = ObjectPool::element_offset(
+ object_pool_.FindExternalLabel(label, kPatchable));
call(Address::AddressBaseImm32(PP, offset - kHeapObjectTag));
ASSERT((buffer_.GetPosition() - call_start) == kCallExternalLabelSize);
}
@@ -126,7 +126,7 @@ void Assembler::Call(const ExternalLabel* label, Register pp) {
if (Isolate::Current() == Dart::vm_isolate()) {
call(label);
} else {
- const int32_t offset = Array::element_offset(
+ const int32_t offset = ObjectPool::element_offset(
object_pool_.FindExternalLabel(label, kNotPatchable));
call(Address::AddressBaseImm32(pp, offset - kHeapObjectTag));
}
@@ -2607,8 +2607,8 @@ void Assembler::jmp(const ExternalLabel* label) {
void Assembler::JmpPatchable(const ExternalLabel* label, Register pp) {
ASSERT(allow_constant_pool());
intptr_t call_start = buffer_.GetPosition();
- const int32_t offset =
- Array::element_offset(object_pool_.FindExternalLabel(label, kPatchable));
+ const int32_t offset = ObjectPool::element_offset(
+ object_pool_.FindExternalLabel(label, kPatchable));
// Patchable jumps always use a 32-bit immediate encoding.
jmp(Address::AddressBaseImm32(pp, offset - kHeapObjectTag));
ASSERT((buffer_.GetPosition() - call_start) == JumpPattern::kLengthInBytes);
@@ -2616,7 +2616,7 @@ void Assembler::JmpPatchable(const ExternalLabel* label, Register pp) {
void Assembler::Jmp(const ExternalLabel* label, Register pp) {
- const int32_t offset = Array::element_offset(
+ const int32_t offset = ObjectPool::element_offset(
object_pool_.FindExternalLabel(label, kNotPatchable));
jmp(Address(pp, offset - kHeapObjectTag));
}
@@ -2817,7 +2817,7 @@ void Assembler::LoadIsolate(Register dst) {
void Assembler::LoadObject(Register dst, const Object& object, Register pp) {
if (CanLoadFromObjectPool(object)) {
const int32_t offset =
- Array::element_offset(object_pool_.FindObject(object, kNotPatchable));
+ ObjectPool::element_offset(object_pool_.FindObject(object));
LoadWordFromPoolOffset(dst, pp, offset - kHeapObjectTag);
} else {
ASSERT((Isolate::Current() == Dart::vm_isolate()) ||
@@ -2852,7 +2852,7 @@ void Assembler::PushObject(const Object& object, Register pp) {
void Assembler::CompareObject(Register reg, const Object& object, Register pp) {
if (CanLoadFromObjectPool(object)) {
const int32_t offset =
- Array::element_offset(object_pool_.FindObject(object, kNotPatchable));
+ ObjectPool::element_offset(object_pool_.FindObject(object));
cmpq(reg, Address(pp, offset-kHeapObjectTag));
} else {
CompareImmediate(
@@ -2863,8 +2863,7 @@ void Assembler::CompareObject(Register reg, const Object& object, Register pp) {
intptr_t Assembler::FindImmediate(int64_t imm) {
ASSERT(Isolate::Current() != Dart::vm_isolate());
- const Smi& smi = Smi::Handle(reinterpret_cast<RawSmi*>(imm));
- return object_pool_.FindObject(smi, kNotPatchable);
+ return object_pool_.FindImmediate(imm);
}
@@ -2882,16 +2881,8 @@ void Assembler::LoadImmediate(Register reg, const Immediate& imm, Register pp) {
if (CanLoadImmediateFromPool(imm, pp)) {
// It's a 64-bit constant and we're not in the VM isolate, so load from
// object pool.
- int64_t val = imm.value();
- // Save the bits that must be masked-off for the SmiTag
- int64_t val_smi_tag = val & kSmiTagMask;
- val &= ~kSmiTagMask; // Mask off the tag bits.
- const int32_t offset = Array::element_offset(FindImmediate(val));
+ int32_t offset = ObjectPool::element_offset(FindImmediate(imm.value()));
LoadWordFromPoolOffset(reg, pp, offset - kHeapObjectTag);
- if (val_smi_tag != 0) {
- // Add back the tag bits.
- orq(reg, Immediate(val_smi_tag));
- }
} else {
movq(reg, imm);
}

Powered by Google App Engine
This is Rietveld 408576698