Chromium Code Reviews| Index: runtime/vm/assembler_x64.cc |
| diff --git a/runtime/vm/assembler_x64.cc b/runtime/vm/assembler_x64.cc |
| index c397a13bc3c3d0a763600684ebdbb98cc6d23c45..d397c5f90c06d457e6476f4ad8d82d2ca3090e50 100644 |
| --- a/runtime/vm/assembler_x64.cc |
| +++ b/runtime/vm/assembler_x64.cc |
| @@ -25,7 +25,7 @@ Assembler::Assembler(bool use_far_branches) |
| : buffer_(), |
| prologue_offset_(-1), |
| comments_(), |
| - constant_pool_allowed_(true) { |
| + constant_pool_allowed_(false) { |
| // Far branching mode is only needed and implemented for MIPS and ARM. |
| ASSERT(!use_far_branches); |
| } |
| @@ -63,11 +63,10 @@ void Assembler::call(Label* label) { |
| void Assembler::LoadExternalLabel(Register dst, |
| const ExternalLabel* label, |
| - Patchability patchable, |
| - Register pp) { |
| + Patchability patchable) { |
| const int32_t offset = ObjectPool::element_offset( |
| object_pool_wrapper_.FindExternalLabel(label, patchable)); |
| - LoadWordFromPoolOffset(dst, pp, offset - kHeapObjectTag); |
| + LoadWordFromPoolOffset(dst, offset - kHeapObjectTag); |
| } |
| @@ -92,10 +91,11 @@ void Assembler::CallPatchable(const ExternalLabel* label) { |
| } |
| -void Assembler::Call(const ExternalLabel* label, Register pp) { |
| +void Assembler::Call(const ExternalLabel* label) { |
| + ASSERT(constant_pool_allowed()); |
| const int32_t offset = ObjectPool::element_offset( |
| object_pool_wrapper_.FindExternalLabel(label, kNotPatchable)); |
| - call(Address::AddressBaseImm32(pp, offset - kHeapObjectTag)); |
| + call(Address::AddressBaseImm32(PP, offset - kHeapObjectTag)); |
| } |
| @@ -126,12 +126,12 @@ void Assembler::pushq(const Immediate& imm) { |
| } |
| -void Assembler::PushImmediate(const Immediate& imm, Register pp) { |
| - if (CanLoadImmediateFromPool(imm, pp)) { |
| - LoadImmediate(TMP, imm, pp); |
| - pushq(TMP); |
| - } else { |
| +void Assembler::PushImmediate(const Immediate& imm) { |
| + if (imm.is_int32()) { |
| pushq(imm); |
| + } else { |
| + LoadImmediate(TMP, imm); |
| + pushq(TMP); |
| } |
| } |
| @@ -782,7 +782,7 @@ void Assembler::notps(XmmRegister dst) { |
| } float_not_constant = |
| { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF }; |
| LoadImmediate( |
| - TMP, Immediate(reinterpret_cast<intptr_t>(&float_not_constant)), PP); |
| + TMP, Immediate(reinterpret_cast<intptr_t>(&float_not_constant))); |
| xorps(dst, Address(TMP, 0)); |
| } |
| @@ -796,7 +796,7 @@ void Assembler::negateps(XmmRegister dst) { |
| } float_negate_constant = |
| { 0x80000000, 0x80000000, 0x80000000, 0x80000000 }; |
| LoadImmediate( |
| - TMP, Immediate(reinterpret_cast<intptr_t>(&float_negate_constant)), PP); |
| + TMP, Immediate(reinterpret_cast<intptr_t>(&float_negate_constant))); |
| xorps(dst, Address(TMP, 0)); |
| } |
| @@ -810,7 +810,7 @@ void Assembler::absps(XmmRegister dst) { |
| } float_absolute_constant = |
| { 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF }; |
| LoadImmediate( |
| - TMP, Immediate(reinterpret_cast<intptr_t>(&float_absolute_constant)), PP); |
| + TMP, Immediate(reinterpret_cast<intptr_t>(&float_absolute_constant))); |
| andps(dst, Address(TMP, 0)); |
| } |
| @@ -824,7 +824,7 @@ void Assembler::zerowps(XmmRegister dst) { |
| } float_zerow_constant = |
| { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000 }; |
| LoadImmediate( |
| - TMP, Immediate(reinterpret_cast<intptr_t>(&float_zerow_constant)), PP); |
| + TMP, Immediate(reinterpret_cast<intptr_t>(&float_zerow_constant))); |
| andps(dst, Address(TMP, 0)); |
| } |
| @@ -1012,7 +1012,7 @@ void Assembler::negatepd(XmmRegister dst) { |
| } double_negate_constant = |
| { 0x8000000000000000LL, 0x8000000000000000LL }; |
| LoadImmediate( |
| - TMP, Immediate(reinterpret_cast<intptr_t>(&double_negate_constant)), PP); |
| + TMP, Immediate(reinterpret_cast<intptr_t>(&double_negate_constant))); |
| xorpd(dst, Address(TMP, 0)); |
| } |
| @@ -1060,7 +1060,7 @@ void Assembler::abspd(XmmRegister dst) { |
| } double_absolute_const = |
| { 0x7FFFFFFFFFFFFFFFLL, 0x7FFFFFFFFFFFFFFFLL }; |
| LoadImmediate( |
| - TMP, Immediate(reinterpret_cast<intptr_t>(&double_absolute_const)), PP); |
| + TMP, Immediate(reinterpret_cast<intptr_t>(&double_absolute_const))); |
| andpd(dst, Address(TMP, 0)); |
| } |
| @@ -1496,24 +1496,22 @@ void Assembler::cmpq(Register reg, const Address& address) { |
| } |
| -void Assembler::CompareImmediate(Register reg, const Immediate& imm, |
| - Register pp) { |
| - if (CanLoadImmediateFromPool(imm, pp)) { |
| - LoadImmediate(TMP, imm, pp); |
| - cmpq(reg, TMP); |
| - } else { |
| +void Assembler::CompareImmediate(Register reg, const Immediate& imm) { |
| + if (imm.is_int32()) { |
| cmpq(reg, imm); |
| + } else { |
| + LoadImmediate(TMP, imm); |
|
zra
2015/07/31 17:37:28
assert reg != TMP
regis
2015/07/31 19:33:59
Done here and at a bunch of other places.
|
| + cmpq(reg, TMP); |
| } |
| } |
| -void Assembler::CompareImmediate(const Address& address, const Immediate& imm, |
| - Register pp) { |
| - if (CanLoadImmediateFromPool(imm, pp)) { |
| - LoadImmediate(TMP, imm, pp); |
| - cmpq(address, TMP); |
| - } else { |
| +void Assembler::CompareImmediate(const Address& address, const Immediate& imm) { |
| + if (imm.is_int32()) { |
| cmpq(address, imm); |
| + } else { |
| + LoadImmediate(TMP, imm); |
|
zra
2015/07/31 17:37:28
Could address refer to TMP?
regis
2015/07/31 19:33:59
Since I did not change this, we would know by now
|
| + cmpq(address, TMP); |
| } |
| } |
| @@ -1608,13 +1606,13 @@ void Assembler::testq(Register reg, const Immediate& imm) { |
| } |
| -void Assembler::TestImmediate(Register dst, const Immediate& imm, Register pp) { |
| - if (CanLoadImmediateFromPool(imm, pp)) { |
| +void Assembler::TestImmediate(Register dst, const Immediate& imm) { |
| + if (imm.is_int32()) { |
| + testq(dst, imm); |
| + } else { |
| ASSERT(dst != TMP); |
| - LoadImmediate(TMP, imm, pp); |
| + LoadImmediate(TMP, imm); |
| testq(dst, TMP); |
| - } else { |
| - testq(dst, imm); |
| } |
| } |
| @@ -1697,13 +1695,13 @@ void Assembler::andq(Register dst, const Immediate& imm) { |
| } |
| -void Assembler::AndImmediate(Register dst, const Immediate& imm, Register pp) { |
| - if (CanLoadImmediateFromPool(imm, pp)) { |
| +void Assembler::AndImmediate(Register dst, const Immediate& imm) { |
| + if (imm.is_int32()) { |
| + andq(dst, imm); |
| + } else { |
| ASSERT(dst != TMP); |
| - LoadImmediate(TMP, imm, pp); |
| + LoadImmediate(TMP, imm); |
| andq(dst, TMP); |
| - } else { |
| - andq(dst, imm); |
| } |
| } |
| @@ -1737,13 +1735,13 @@ void Assembler::orq(Register dst, const Immediate& imm) { |
| } |
| -void Assembler::OrImmediate(Register dst, const Immediate& imm, Register pp) { |
| - if (CanLoadImmediateFromPool(imm, pp)) { |
| +void Assembler::OrImmediate(Register dst, const Immediate& imm) { |
| + if (imm.is_int32()) { |
| + orq(dst, imm); |
| + } else { |
| ASSERT(dst != TMP); |
| - LoadImmediate(TMP, imm, pp); |
| + LoadImmediate(TMP, imm); |
| orq(dst, TMP); |
| - } else { |
| - orq(dst, imm); |
| } |
| } |
| @@ -1785,13 +1783,13 @@ void Assembler::xorq(Register dst, const Immediate& imm) { |
| } |
| -void Assembler::XorImmediate(Register dst, const Immediate& imm, Register pp) { |
| - if (CanLoadImmediateFromPool(imm, pp)) { |
| +void Assembler::XorImmediate(Register dst, const Immediate& imm) { |
| + if (imm.is_int32()) { |
| + xorq(dst, imm); |
| + } else { |
| ASSERT(dst != TMP); |
| - LoadImmediate(TMP, imm, pp); |
| + LoadImmediate(TMP, imm); |
| xorq(dst, TMP); |
| - } else { |
| - xorq(dst, imm); |
| } |
| } |
| @@ -2080,13 +2078,13 @@ void Assembler::imulq(Register reg, const Immediate& imm) { |
| } |
| -void Assembler::MulImmediate(Register reg, const Immediate& imm, Register pp) { |
| - if (CanLoadImmediateFromPool(imm, pp)) { |
| +void Assembler::MulImmediate(Register reg, const Immediate& imm) { |
| + if (imm.is_int32()) { |
| + imulq(reg, imm); |
| + } else { |
| ASSERT(reg != TMP); |
| - LoadImmediate(TMP, imm, pp); |
| + LoadImmediate(TMP, imm); |
| imulq(reg, TMP); |
| - } else { |
| - imulq(reg, imm); |
| } |
| } |
| @@ -2599,7 +2597,7 @@ void Assembler::jmp(const ExternalLabel* label) { |
| void Assembler::JmpPatchable(const ExternalLabel* label, Register pp) { |
| - ASSERT(constant_pool_allowed()); |
| + ASSERT((pp != PP) || constant_pool_allowed()); |
| intptr_t call_start = buffer_.GetPosition(); |
| const int32_t offset = ObjectPool::element_offset( |
| object_pool_wrapper_.FindExternalLabel(label, kPatchable)); |
| @@ -2610,6 +2608,7 @@ void Assembler::JmpPatchable(const ExternalLabel* label, Register pp) { |
| void Assembler::Jmp(const ExternalLabel* label, Register pp) { |
| + ASSERT((pp != PP) || constant_pool_allowed()); |
| const int32_t offset = ObjectPool::element_offset( |
| object_pool_wrapper_.FindExternalLabel(label, kNotPatchable)); |
| jmp(Address(pp, offset - kHeapObjectTag)); |
| @@ -2664,7 +2663,7 @@ void Assembler::PopRegister(Register r) { |
| } |
| -void Assembler::AddImmediate(Register reg, const Immediate& imm, Register pp) { |
| +void Assembler::AddImmediate(Register reg, const Immediate& imm) { |
| const int64_t value = imm.value(); |
| if (value == 0) { |
| return; |
| @@ -2673,22 +2672,21 @@ void Assembler::AddImmediate(Register reg, const Immediate& imm, Register pp) { |
| if (value == 1) { |
| incq(reg); |
| } else { |
| - if (CanLoadImmediateFromPool(imm, pp)) { |
| + if (imm.is_int32()) { |
| + addq(reg, imm); |
| + } else { |
| ASSERT(reg != TMP); |
| - LoadImmediate(TMP, imm, pp); |
| + LoadImmediate(TMP, imm); |
| addq(reg, TMP); |
| - } else { |
| - addq(reg, imm); |
| } |
| } |
| } else { |
| - SubImmediate(reg, Immediate(-value), pp); |
| + SubImmediate(reg, Immediate(-value)); |
| } |
| } |
| -void Assembler::AddImmediate(const Address& address, const Immediate& imm, |
| - Register pp) { |
| +void Assembler::AddImmediate(const Address& address, const Immediate& imm) { |
| const int64_t value = imm.value(); |
| if (value == 0) { |
| return; |
| @@ -2697,20 +2695,20 @@ void Assembler::AddImmediate(const Address& address, const Immediate& imm, |
| if (value == 1) { |
| incq(address); |
| } else { |
| - if (CanLoadImmediateFromPool(imm, pp)) { |
| - LoadImmediate(TMP, imm, pp); |
| - addq(address, TMP); |
| - } else { |
| + if (imm.is_int32()) { |
| addq(address, imm); |
| + } else { |
| + LoadImmediate(TMP, imm); |
| + addq(address, TMP); |
| } |
| } |
| } else { |
| - SubImmediate(address, Immediate(-value), pp); |
| + SubImmediate(address, Immediate(-value)); |
| } |
| } |
| -void Assembler::SubImmediate(Register reg, const Immediate& imm, Register pp) { |
| +void Assembler::SubImmediate(Register reg, const Immediate& imm) { |
| const int64_t value = imm.value(); |
| if (value == 0) { |
| return; |
| @@ -2719,22 +2717,21 @@ void Assembler::SubImmediate(Register reg, const Immediate& imm, Register pp) { |
| if (value == 1) { |
| decq(reg); |
| } else { |
| - if (CanLoadImmediateFromPool(imm, pp)) { |
| + if (imm.is_int32()) { |
| + subq(reg, imm); |
| + } else { |
| ASSERT(reg != TMP); |
| - LoadImmediate(TMP, imm, pp); |
| + LoadImmediate(TMP, imm); |
| subq(reg, TMP); |
| - } else { |
| - subq(reg, imm); |
| } |
| } |
| } else { |
| - AddImmediate(reg, Immediate(-value), pp); |
| + AddImmediate(reg, Immediate(-value)); |
| } |
| } |
| -void Assembler::SubImmediate(const Address& address, const Immediate& imm, |
| - Register pp) { |
| +void Assembler::SubImmediate(const Address& address, const Immediate& imm) { |
| const int64_t value = imm.value(); |
| if (value == 0) { |
| return; |
| @@ -2743,15 +2740,15 @@ void Assembler::SubImmediate(const Address& address, const Immediate& imm, |
| if (value == 1) { |
| decq(address); |
| } else { |
| - if (CanLoadImmediateFromPool(imm, pp)) { |
| - LoadImmediate(TMP, imm, pp); |
| - subq(address, TMP); |
| - } else { |
| + if (imm.is_int32()) { |
| subq(address, imm); |
| + } else { |
| + LoadImmediate(TMP, imm); |
| + subq(address, TMP); |
| } |
| } |
| } else { |
| - AddImmediate(address, Immediate(-value), pp); |
| + AddImmediate(address, Immediate(-value)); |
| } |
| } |
| @@ -2787,11 +2784,12 @@ bool Assembler::CanLoadFromObjectPool(const Object& object) const { |
| } |
| -void Assembler::LoadWordFromPoolOffset(Register dst, Register pp, |
| - int32_t offset) { |
| +void Assembler::LoadWordFromPoolOffset(Register dst, int32_t offset) { |
| + ASSERT(constant_pool_allowed()); |
| + ASSERT(dst != PP); |
| // This sequence must be of fixed size. AddressBaseImm32 |
| // forces the address operand to use a fixed-size imm32 encoding. |
| - movq(dst, Address::AddressBaseImm32(pp, offset)); |
| + movq(dst, Address::AddressBaseImm32(PP, offset)); |
| } |
| @@ -2802,7 +2800,6 @@ void Assembler::LoadIsolate(Register dst) { |
| void Assembler::LoadObjectHelper(Register dst, |
| const Object& object, |
| - Register pp, |
| bool is_unique) { |
| if (Thread::CanLoadFromThread(object)) { |
| movq(dst, Address(THR, Thread::OffsetFromThread(object))); |
| @@ -2810,62 +2807,70 @@ void Assembler::LoadObjectHelper(Register dst, |
| const int32_t offset = ObjectPool::element_offset( |
| is_unique ? object_pool_wrapper_.AddObject(object) |
| : object_pool_wrapper_.FindObject(object)); |
| - LoadWordFromPoolOffset(dst, pp, offset - kHeapObjectTag); |
| + LoadWordFromPoolOffset(dst, offset - kHeapObjectTag); |
| } else { |
| ASSERT(object.IsSmi() || object.InVMHeap()); |
| - LoadImmediate(dst, Immediate(reinterpret_cast<int64_t>(object.raw())), pp); |
| + LoadImmediate(dst, Immediate(reinterpret_cast<int64_t>(object.raw()))); |
| } |
| } |
| -void Assembler::LoadObject(Register dst, const Object& object, Register pp) { |
| - LoadObjectHelper(dst, object, pp, false); |
| +void Assembler::LoadFunctionFromNewPool(Register dst, |
|
zra
2015/07/31 17:37:28
Maybe FromCalleePool instead of FromNewPool.
regis
2015/07/31 19:33:59
Done.
|
| + const Function& function, |
| + Register new_pp) { |
| + ASSERT(!constant_pool_allowed()); |
| + ASSERT(new_pp != PP); |
| + const int32_t offset = |
| + ObjectPool::element_offset(object_pool_wrapper_.FindObject(function)); |
| + movq(dst, Address::AddressBaseImm32(new_pp, offset - kHeapObjectTag)); |
| } |
| -void Assembler::LoadUniqueObject(Register dst, |
| - const Object& object, |
| - Register pp) { |
| - LoadObjectHelper(dst, object, pp, true); |
| +void Assembler::LoadObject(Register dst, const Object& object) { |
| + LoadObjectHelper(dst, object, false); |
| } |
| -void Assembler::StoreObject(const Address& dst, const Object& object, |
| - Register pp) { |
| +void Assembler::LoadUniqueObject(Register dst, const Object& object) { |
| + LoadObjectHelper(dst, object, true); |
| +} |
| + |
| + |
| +void Assembler::StoreObject(const Address& dst, const Object& object) { |
| if (Thread::CanLoadFromThread(object)) { |
| movq(TMP, Address(THR, Thread::OffsetFromThread(object))); |
| movq(dst, TMP); |
| } else if (CanLoadFromObjectPool(object)) { |
| - LoadObject(TMP, object, pp); |
| + LoadObject(TMP, object); |
| movq(dst, TMP); |
| } else { |
| - MoveImmediate(dst, Immediate(reinterpret_cast<int64_t>(object.raw())), pp); |
| + MoveImmediate(dst, Immediate(reinterpret_cast<int64_t>(object.raw()))); |
| } |
| } |
| -void Assembler::PushObject(const Object& object, Register pp) { |
| +void Assembler::PushObject(const Object& object) { |
| if (Thread::CanLoadFromThread(object)) { |
| pushq(Address(THR, Thread::OffsetFromThread(object))); |
| } else if (CanLoadFromObjectPool(object)) { |
| - LoadObject(TMP, object, pp); |
| + LoadObject(TMP, object); |
| pushq(TMP); |
| } else { |
| - PushImmediate(Immediate(reinterpret_cast<int64_t>(object.raw())), pp); |
| + PushImmediate(Immediate(reinterpret_cast<int64_t>(object.raw()))); |
| } |
| } |
| -void Assembler::CompareObject(Register reg, const Object& object, Register pp) { |
| +void Assembler::CompareObject(Register reg, const Object& object) { |
| if (Thread::CanLoadFromThread(object)) { |
| cmpq(reg, Address(THR, Thread::OffsetFromThread(object))); |
| } else if (CanLoadFromObjectPool(object)) { |
| const int32_t offset = |
| ObjectPool::element_offset(object_pool_wrapper_.FindObject(object)); |
| - cmpq(reg, Address(pp, offset-kHeapObjectTag)); |
| + cmpq(reg, Address(PP, offset-kHeapObjectTag)); |
| } else { |
| CompareImmediate( |
| - reg, Immediate(reinterpret_cast<int64_t>(object.raw())), pp); |
| + reg, Immediate(reinterpret_cast<int64_t>(object.raw()))); |
| } |
| } |
| @@ -2875,31 +2880,22 @@ intptr_t Assembler::FindImmediate(int64_t imm) { |
| } |
| -bool Assembler::CanLoadImmediateFromPool(const Immediate& imm, Register pp) { |
| - if (!constant_pool_allowed()) { |
| - return false; |
| - } |
| - return !imm.is_int32() && (pp != kNoRegister); |
| -} |
| - |
| - |
| -void Assembler::LoadImmediate(Register reg, const Immediate& imm, Register pp) { |
| - if (CanLoadImmediateFromPool(imm, pp)) { |
| - int32_t offset = ObjectPool::element_offset(FindImmediate(imm.value())); |
| - LoadWordFromPoolOffset(reg, pp, offset - kHeapObjectTag); |
| - } else { |
| +void Assembler::LoadImmediate(Register reg, const Immediate& imm) { |
| + if (imm.is_int32() || !constant_pool_allowed()) { |
| movq(reg, imm); |
| + } else { |
| + int32_t offset = ObjectPool::element_offset(FindImmediate(imm.value())); |
| + LoadWordFromPoolOffset(reg, offset - kHeapObjectTag); |
| } |
| } |
| -void Assembler::MoveImmediate(const Address& dst, const Immediate& imm, |
| - Register pp) { |
| - if (CanLoadImmediateFromPool(imm, pp)) { |
| - LoadImmediate(TMP, imm, pp); |
| - movq(dst, TMP); |
| - } else { |
| +void Assembler::MoveImmediate(const Address& dst, const Immediate& imm) { |
| + if (imm.is_int32()) { |
| movq(dst, imm); |
| + } else { |
| + LoadImmediate(TMP, imm); |
| + movq(dst, TMP); |
| } |
| } |
| @@ -3085,18 +3081,17 @@ void Assembler::StoreIntoObjectNoBarrier(Register object, |
| void Assembler::StoreIntoObjectNoBarrier(Register object, |
| const Address& dest, |
| const Object& value, |
| - Register pp, |
| FieldContent old_content) { |
| VerifyHeapWord(dest, old_content); |
| if (VerifiedMemory::enabled()) { |
| - Register temp = (pp == RCX) ? RDX : RCX; |
| + const Register temp = RCX; |
| pushq(temp); |
| leaq(temp, dest); |
| - StoreObject(Address(temp, 0), value, pp); |
| - StoreObject(Address(temp, VerifiedMemory::offset()), value, pp); |
| + StoreObject(Address(temp, 0), value); |
| + StoreObject(Address(temp, VerifiedMemory::offset()), value); |
| popq(temp); |
| } else { |
| - StoreObject(dest, value, pp); |
| + StoreObject(dest, value); |
| } |
| // TODO(koda): Use 'object', verify that generational barrier's not needed. |
| } |
| @@ -3153,7 +3148,7 @@ void Assembler::DoubleNegate(XmmRegister d) { |
| } double_negate_constant = |
| {0x8000000000000000LL, 0x8000000000000000LL}; |
| LoadImmediate( |
| - TMP, Immediate(reinterpret_cast<intptr_t>(&double_negate_constant)), PP); |
| + TMP, Immediate(reinterpret_cast<intptr_t>(&double_negate_constant))); |
| xorpd(d, Address(TMP, 0)); |
| } |
| @@ -3165,7 +3160,7 @@ void Assembler::DoubleAbs(XmmRegister reg) { |
| } double_abs_constant = |
| {0x7FFFFFFFFFFFFFFFLL, 0x7FFFFFFFFFFFFFFFLL}; |
| LoadImmediate(TMP, |
| - Immediate(reinterpret_cast<intptr_t>(&double_abs_constant)), PP); |
| + Immediate(reinterpret_cast<intptr_t>(&double_abs_constant))); |
| andpd(reg, Address(TMP, 0)); |
| } |
| @@ -3181,7 +3176,7 @@ void Assembler::Stop(const char* message, bool fixed_length_encoding) { |
| EmitUint8(0xB8 | (RDI & 7)); |
| EmitInt64(message_address); |
| } else { |
| - LoadImmediate(RDI, Immediate(message_address), PP); |
| + LoadImmediate(RDI, Immediate(message_address)); |
| } |
| call(&StubCode::PrintStopMessageLabel()); |
| popq(RDI); // Restore RDI register. |
| @@ -3259,7 +3254,7 @@ void Assembler::PushRegisters(intptr_t cpu_register_set, |
| intptr_t xmm_register_set) { |
| const intptr_t xmm_regs_count = RegisterSet::RegisterCount(xmm_register_set); |
| if (xmm_regs_count > 0) { |
| - AddImmediate(RSP, Immediate(-xmm_regs_count * kFpuRegisterSize), PP); |
| + AddImmediate(RSP, Immediate(-xmm_regs_count * kFpuRegisterSize)); |
| // Store XMM registers with the lowest register number at the lowest |
| // address. |
| intptr_t offset = 0; |
| @@ -3308,7 +3303,7 @@ void Assembler::PopRegisters(intptr_t cpu_register_set, |
| } |
| } |
| ASSERT(offset == (xmm_regs_count * kFpuRegisterSize)); |
| - AddImmediate(RSP, Immediate(offset), PP); |
| + AddImmediate(RSP, Immediate(offset)); |
| } |
| } |
| @@ -3378,16 +3373,19 @@ void Assembler::LoadPoolPointer(Register pp) { |
| movq(pp, Address::AddressRIPRelative( |
| -entry_to_rip_offset - object_pool_pc_dist)); |
| ASSERT(CodeSize() == entry_to_rip_offset); |
| + set_constant_pool_allowed(pp == PP); |
| } |
| void Assembler::EnterDartFrameWithInfo(intptr_t frame_size, |
| Register new_pp, |
| Register pc_marker_override) { |
| + ASSERT(!constant_pool_allowed()); |
| EnterFrame(0); |
| pushq(pc_marker_override); |
| pushq(PP); |
| movq(PP, new_pp); |
| + set_constant_pool_allowed(true); |
| if (frame_size != 0) { |
| subq(RSP, Immediate(frame_size)); |
| } |
| @@ -3395,6 +3393,10 @@ void Assembler::EnterDartFrameWithInfo(intptr_t frame_size, |
| void Assembler::LeaveDartFrame() { |
| + // LeaveDartFrame is called from stubs (pp disallowed) and from Dart code (pp |
| + // allowed), so there is no point in checking the current value of |
| + // constant_pool_allowed(). |
| + set_constant_pool_allowed(false); |
| // Restore caller's PP register that was pushed in EnterDartFrame. |
| movq(PP, Address(RBP, (kSavedCallerPpSlotFromFp * kWordSize))); |
| LeaveFrame(); |
| @@ -3409,12 +3411,14 @@ void Assembler::LeaveDartFrame() { |
| void Assembler::EnterOsrFrame(intptr_t extra_size, |
| Register new_pp, |
| Register pc_marker_override) { |
| + ASSERT(!constant_pool_allowed()); |
| if (prologue_offset_ == -1) { |
| Comment("PrologueOffset = %" Pd "", CodeSize()); |
| prologue_offset_ = CodeSize(); |
| } |
| movq(Address(RBP, kPcMarkerSlotFromFp * kWordSize), pc_marker_override); |
| movq(PP, new_pp); |
| + set_constant_pool_allowed(true); |
| if (extra_size != 0) { |
| subq(RSP, Immediate(extra_size)); |
| } |
| @@ -3422,6 +3426,7 @@ void Assembler::EnterOsrFrame(intptr_t extra_size, |
| void Assembler::EnterStubFrame() { |
| + set_constant_pool_allowed(false); |
| EnterFrame(0); |
| pushq(Immediate(0)); // Push 0 in the saved PC area for stub frames. |
| pushq(PP); // Save caller's pool pointer |
| @@ -3430,6 +3435,7 @@ void Assembler::EnterStubFrame() { |
| void Assembler::LeaveStubFrame() { |
| + set_constant_pool_allowed(false); |
| // Restore caller's PP register that was pushed in EnterStubFrame. |
| movq(PP, Address(RBP, (kSavedCallerPpSlotFromFp * kWordSize))); |
| LeaveFrame(); |
| @@ -3521,8 +3527,7 @@ void Assembler::UpdateAllocationStatsWithSize(intptr_t cid, |
| void Assembler::TryAllocate(const Class& cls, |
| Label* failure, |
| bool near_jump, |
| - Register instance_reg, |
| - Register pp) { |
| + Register instance_reg) { |
| ASSERT(failure != NULL); |
| if (FLAG_inline_alloc) { |
| // If this allocation is traced, program will jump to failure path |
| @@ -3532,26 +3537,26 @@ void Assembler::TryAllocate(const Class& cls, |
| Heap* heap = Isolate::Current()->heap(); |
| const intptr_t instance_size = cls.instance_size(); |
| Heap::Space space = heap->SpaceForAllocation(cls.id()); |
| - LoadImmediate(TMP, Immediate(heap->TopAddress(space)), pp); |
| + LoadImmediate(TMP, Immediate(heap->TopAddress(space))); |
| movq(instance_reg, Address(TMP, 0)); |
| - AddImmediate(instance_reg, Immediate(instance_size), pp); |
| + AddImmediate(instance_reg, Immediate(instance_size)); |
| // instance_reg: potential next object start. |
| - LoadImmediate(TMP, Immediate(heap->EndAddress(space)), pp); |
| + LoadImmediate(TMP, Immediate(heap->EndAddress(space))); |
| cmpq(instance_reg, Address(TMP, 0)); |
| j(ABOVE_EQUAL, failure, near_jump); |
| // Successfully allocated the object, now update top to point to |
| // next object start and store the class in the class field of object. |
| - LoadImmediate(TMP, Immediate(heap->TopAddress(space)), pp); |
| + LoadImmediate(TMP, Immediate(heap->TopAddress(space))); |
| movq(Address(TMP, 0), instance_reg); |
| UpdateAllocationStats(cls.id(), space); |
| ASSERT(instance_size >= kHeapObjectTag); |
| - AddImmediate(instance_reg, Immediate(kHeapObjectTag - instance_size), pp); |
| + AddImmediate(instance_reg, Immediate(kHeapObjectTag - instance_size)); |
| uword tags = 0; |
| tags = RawObject::SizeTag::update(instance_size, tags); |
| ASSERT(cls.id() != kIllegalCid); |
| tags = RawObject::ClassIdTag::update(cls.id(), tags); |
| MoveImmediate(FieldAddress(instance_reg, Object::tags_offset()), |
| - Immediate(tags), pp); |
| + Immediate(tags)); |
| } else { |
| jmp(failure); |
| } |
| @@ -3751,7 +3756,7 @@ void Assembler::LoadClassId(Register result, Register object) { |
| } |
| -void Assembler::LoadClassById(Register result, Register class_id, Register pp) { |
| +void Assembler::LoadClassById(Register result, Register class_id) { |
| ASSERT(result != class_id); |
| LoadIsolate(result); |
| const intptr_t offset = |
| @@ -3761,9 +3766,9 @@ void Assembler::LoadClassById(Register result, Register class_id, Register pp) { |
| } |
| -void Assembler::LoadClass(Register result, Register object, Register pp) { |
| +void Assembler::LoadClass(Register result, Register object) { |
| LoadClassId(TMP, object); |
| - LoadClassById(result, TMP, pp); |
| + LoadClassById(result, TMP); |
| } |
| @@ -3798,7 +3803,7 @@ void Assembler::LoadClassIdMayBeSmi(Register result, Register object) { |
| // Load up a null object. We only need it so we can use LoadClassId on it in |
| // the case that object is a Smi. |
| - LoadObject(result, Object::null_object(), PP); |
| + LoadObject(result, Object::null_object()); |
| // Check if the object is a Smi. |
| testq(object, Immediate(kSmiTagMask)); |
| // If the object *is* a Smi, use the null object instead. |