Chromium Code Reviews| Index: runtime/vm/assembler_arm.cc |
| diff --git a/runtime/vm/assembler_arm.cc b/runtime/vm/assembler_arm.cc |
| index fe2fdd19a46da632add97998972e024afb70dd47..6215db9aba22765da2267962a65a278176a9175c 100644 |
| --- a/runtime/vm/assembler_arm.cc |
| +++ b/runtime/vm/assembler_arm.cc |
| @@ -1525,6 +1525,13 @@ void Assembler::Drop(intptr_t stack_elements) { |
| } |
| +intptr_t Assembler::FindImmediate(int32_t imm) { |
| + ASSERT(Isolate::Current() != Dart::vm_isolate()); |
| + const Smi& smi = Smi::Handle(reinterpret_cast<RawSmi*>(imm)); |
| + return object_pool_wrapper_.FindObject(smi); |
|
zra
2015/07/23 22:45:59
Why not use ObjectPoolWrapper::FindImmediate() ? I
regis
2015/07/23 23:07:31
Because I forked the code in May, when arm64 was s
|
| +} |
| + |
| + |
| // Uses a code sequence that can easily be decoded. |
| void Assembler::LoadWordFromPoolOffset(Register rd, |
| int32_t offset, |
| @@ -1555,6 +1562,7 @@ void Assembler::LoadPoolPointer() { |
| Instructions::HeaderSize() - Instructions::object_pool_offset() + |
| CodeSize() + Instr::kPCReadOffset; |
| LoadFromOffset(kWord, PP, PC, -object_pool_pc_dist); |
| + set_constant_pool_allowed(true); |
| } |
| @@ -2746,7 +2754,23 @@ void Assembler::LoadDecodableImmediate( |
| Register rd, int32_t value, Condition cond) { |
| const ARMVersion version = TargetCPUFeatures::arm_version(); |
| if ((version == ARMv5TE) || (version == ARMv6)) { |
| - LoadPatchableImmediate(rd, value, cond); |
| + if (constant_pool_allowed() && |
|
zra
2015/07/23 22:45:59
Here: https://codereview.chromium.org//1249623004
regis
2015/07/23 23:07:31
Done.
|
| + // We *could* put constants in the pool in a VM isolate, but it is |
| + // simpler to maintain the invariant that the object pool is not used |
| + // in the VM isolate. |
| + (Isolate::Current() != Dart::vm_isolate())) { |
| + // Save the bit that must be masked-off for the SmiTag. |
| + int32_t val_smi_tag = value & kSmiTagMask; |
| + value &= ~kSmiTagMask; // Mask off the tag bit. |
| + const int32_t offset = Array::element_offset(FindImmediate(value)); |
| + LoadWordFromPoolOffset(rd, offset - kHeapObjectTag); |
| + if (val_smi_tag != 0) { |
| + // Add back the tag bit. |
| + orr(rd, rd, Operand(val_smi_tag)); |
| + } |
| + } else { |
| + LoadPatchableImmediate(rd, value, cond); |
| + } |
| } else { |
| ASSERT(version == ARMv7); |
| movw(rd, Utils::Low16Bits(value), cond); |
| @@ -3273,6 +3297,7 @@ void Assembler::CallRuntime(const RuntimeEntry& entry, |
| void Assembler::EnterDartFrame(intptr_t frame_size) { |
| + ASSERT(!constant_pool_allowed()); |
| const intptr_t offset = CodeSize(); |
| // Save PC in frame for fast identification of corresponding code. |
| @@ -3301,6 +3326,7 @@ void Assembler::EnterDartFrame(intptr_t frame_size) { |
| // optimized function and there may be extra space for spill slots to |
| // allocate. We must also set up the pool pointer for the function. |
| void Assembler::EnterOsrFrame(intptr_t extra_size) { |
| + ASSERT(!constant_pool_allowed()); |
| // mov(IP, Operand(PC)) loads PC + Instr::kPCReadOffset (8). This may be |
| // different from EntryPointToPcMarkerOffset(). |
| const intptr_t offset = |
| @@ -3320,6 +3346,10 @@ void Assembler::EnterOsrFrame(intptr_t extra_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); |
| LeaveFrame((1 << PP) | (1 << FP) | (1 << LR)); |
| // Adjust SP for PC pushed in EnterDartFrame. |
| AddImmediate(SP, kWordSize); |
| @@ -3327,6 +3357,7 @@ void Assembler::LeaveDartFrame() { |
| void Assembler::EnterStubFrame() { |
| + set_constant_pool_allowed(false); |
| // Push 0 as saved PC for stub frames. |
| mov(IP, Operand(LR)); |
| mov(LR, Operand(0)); |
| @@ -3339,6 +3370,7 @@ void Assembler::EnterStubFrame() { |
| void Assembler::LeaveStubFrame() { |
| LeaveFrame((1 << PP) | (1 << FP) | (1 << LR)); |
| + set_constant_pool_allowed(false); |
| // Adjust SP for null PC pushed in EnterStubFrame. |
| AddImmediate(SP, kWordSize); |
| } |