Index: runtime/vm/assembler_x64.cc |
diff --git a/runtime/vm/assembler_x64.cc b/runtime/vm/assembler_x64.cc |
index 660c0473cabffe85c6c7087613abd4fec271f186..804dcf21a18652018d240d6ac95f420bedfe4f42 100644 |
--- a/runtime/vm/assembler_x64.cc |
+++ b/runtime/vm/assembler_x64.cc |
@@ -32,30 +32,29 @@ Assembler::Assembler(bool use_far_branches) |
if (isolate != Dart::vm_isolate()) { |
// 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); |
+ intptr_t index = object_pool_wrapper_.AddObject(Object::null_object()); |
ASSERT(index == 0); |
- index = object_pool_.AddObject(Bool::True(), kNotPatchable); |
+ index = object_pool_wrapper_.AddObject(Bool::True()); |
ASSERT(index == 1); |
- index = object_pool_.AddObject(Bool::False(), kNotPatchable); |
+ index = object_pool_wrapper_.AddObject(Bool::False()); |
ASSERT(index == 2); |
const Smi& vacant = Smi::Handle(Smi::New(0xfa >> kSmiTagShift)); |
StubCode* stub_code = isolate->stub_code(); |
if (stub_code->UpdateStoreBuffer_entry() != NULL) { |
- object_pool_.AddExternalLabel(&stub_code->UpdateStoreBufferLabel(), |
- kNotPatchable); |
+ object_pool_wrapper_.AddExternalLabel( |
+ &stub_code->UpdateStoreBufferLabel(), kNotPatchable); |
} else { |
- object_pool_.AddObject(vacant, kNotPatchable); |
+ object_pool_wrapper_.AddObject(vacant); |
} |
if (stub_code->CallToRuntime_entry() != NULL) { |
- object_pool_.AddExternalLabel(&stub_code->CallToRuntimeLabel(), |
- kNotPatchable); |
+ object_pool_wrapper_.AddExternalLabel( |
+ &stub_code->CallToRuntimeLabel(), kNotPatchable); |
} else { |
- object_pool_.AddObject(vacant, kNotPatchable); |
+ object_pool_wrapper_.AddObject(vacant); |
} |
} |
} |
@@ -95,8 +94,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_wrapper_.FindExternalLabel(label, patchable)); |
LoadWordFromPoolOffset(dst, pp, offset - kHeapObjectTag); |
} |
@@ -115,8 +114,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_wrapper_.FindExternalLabel(label, kPatchable)); |
call(Address::AddressBaseImm32(PP, offset - kHeapObjectTag)); |
ASSERT((buffer_.GetPosition() - call_start) == kCallExternalLabelSize); |
} |
@@ -126,8 +125,8 @@ void Assembler::Call(const ExternalLabel* label, Register pp) { |
if (Isolate::Current() == Dart::vm_isolate()) { |
call(label); |
} else { |
- const int32_t offset = Array::element_offset( |
- object_pool_.FindExternalLabel(label, kNotPatchable)); |
+ const int32_t offset = ObjectPool::element_offset( |
+ object_pool_wrapper_.FindExternalLabel(label, kNotPatchable)); |
call(Address::AddressBaseImm32(pp, offset - kHeapObjectTag)); |
} |
} |
@@ -2607,8 +2606,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_wrapper_.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,8 +2615,8 @@ void Assembler::JmpPatchable(const ExternalLabel* label, Register pp) { |
void Assembler::Jmp(const ExternalLabel* label, Register pp) { |
- const int32_t offset = Array::element_offset( |
- object_pool_.FindExternalLabel(label, kNotPatchable)); |
+ const int32_t offset = ObjectPool::element_offset( |
+ object_pool_wrapper_.FindExternalLabel(label, kNotPatchable)); |
jmp(Address(pp, offset - kHeapObjectTag)); |
} |
@@ -2817,7 +2816,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_wrapper_.FindObject(object)); |
LoadWordFromPoolOffset(dst, pp, offset - kHeapObjectTag); |
} else { |
ASSERT((Isolate::Current() == Dart::vm_isolate()) || |
@@ -2852,7 +2851,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_wrapper_.FindObject(object)); |
cmpq(reg, Address(pp, offset-kHeapObjectTag)); |
} else { |
CompareImmediate( |
@@ -2863,8 +2862,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_wrapper_.FindImmediate(imm); |
} |
@@ -2882,16 +2880,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); |
} |