diff options
Diffstat (limited to 'deps/v8/src/arm/assembler-arm-inl.h')
-rw-r--r-- | deps/v8/src/arm/assembler-arm-inl.h | 63 |
1 files changed, 44 insertions, 19 deletions
diff --git a/deps/v8/src/arm/assembler-arm-inl.h b/deps/v8/src/arm/assembler-arm-inl.h index f420f2e5cb..4d7d9895ce 100644 --- a/deps/v8/src/arm/assembler-arm-inl.h +++ b/deps/v8/src/arm/assembler-arm-inl.h @@ -46,7 +46,7 @@ namespace v8 { namespace internal { -bool CpuFeatures::SupportsCrankshaft() { return true; } +bool CpuFeatures::SupportsOptimizer() { return true; } bool CpuFeatures::SupportsWasmSimd128() { return IsSupported(NEON); } @@ -109,7 +109,7 @@ void RelocInfo::set_target_object(HeapObject* target, WriteBarrierMode write_barrier_mode, ICacheFlushMode icache_flush_mode) { DCHECK(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); - Assembler::set_target_address_at(target->GetIsolate(), pc_, constant_pool_, + Assembler::set_target_address_at(pc_, constant_pool_, reinterpret_cast<Address>(target), icache_flush_mode); if (write_barrier_mode == UPDATE_WRITE_BARRIER && host() != nullptr) { @@ -143,27 +143,27 @@ Address RelocInfo::target_runtime_entry(Assembler* origin) { return target_address(); } -void RelocInfo::set_target_runtime_entry(Isolate* isolate, Address target, +void RelocInfo::set_target_runtime_entry(Address target, WriteBarrierMode write_barrier_mode, ICacheFlushMode icache_flush_mode) { DCHECK(IsRuntimeEntry(rmode_)); if (target_address() != target) - set_target_address(isolate, target, write_barrier_mode, icache_flush_mode); + set_target_address(target, write_barrier_mode, icache_flush_mode); } -void RelocInfo::WipeOut(Isolate* isolate) { +void RelocInfo::WipeOut() { DCHECK(IsEmbeddedObject(rmode_) || IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_) || IsExternalReference(rmode_) || IsInternalReference(rmode_)); if (IsInternalReference(rmode_)) { Memory::Address_at(pc_) = nullptr; } else { - Assembler::set_target_address_at(isolate, pc_, constant_pool_, nullptr); + Assembler::set_target_address_at(pc_, constant_pool_, nullptr); } } template <typename ObjectVisitor> -void RelocInfo::Visit(Isolate* isolate, ObjectVisitor* visitor) { +void RelocInfo::Visit(ObjectVisitor* visitor) { RelocInfo::Mode mode = rmode(); if (mode == RelocInfo::EMBEDDED_OBJECT) { visitor->VisitEmbeddedPointer(host(), this); @@ -189,7 +189,7 @@ Operand::Operand(const ExternalReference& f) value_.immediate = reinterpret_cast<int32_t>(f.address()); } -Operand::Operand(Smi* value) : rmode_(RelocInfo::NONE32) { +Operand::Operand(Smi* value) : rmode_(RelocInfo::NONE) { value_.immediate = reinterpret_cast<intptr_t>(value); } @@ -273,15 +273,13 @@ Address Assembler::return_address_from_call_start(Address pc) { } } - void Assembler::deserialization_set_special_target_at( - Isolate* isolate, Address constant_pool_entry, Code* code, Address target) { + Address constant_pool_entry, Code* code, Address target) { Memory::Address_at(constant_pool_entry) = target; } - void Assembler::deserialization_set_target_internal_reference_at( - Isolate* isolate, Address pc, Address target, RelocInfo::Mode mode) { + Address pc, Address target, RelocInfo::Mode mode) { Memory::Address_at(pc) = target; } @@ -329,17 +327,15 @@ Address Assembler::target_address_at(Address pc, Address constant_pool) { } } - -void Assembler::set_target_address_at(Isolate* isolate, Address pc, - Address constant_pool, Address target, +void Assembler::set_target_address_at(Address pc, Address constant_pool, + Address target, ICacheFlushMode icache_flush_mode) { - DCHECK_IMPLIES(isolate == nullptr, icache_flush_mode == SKIP_ICACHE_FLUSH); if (is_constant_pool_load(pc)) { // This is a constant pool lookup. Update the entry in the constant pool. Memory::Address_at(constant_pool_entry_address(pc, constant_pool)) = target; // Intuitively, we would think it is necessary to always flush the // instruction cache after patching a target address in the code as follows: - // Assembler::FlushICache(isolate, pc, sizeof(target)); + // Assembler::FlushICache(pc, sizeof(target)); // However, on ARM, no instruction is actually patched in the case // of embedded constants of the form: // ldr ip, [pp, #...] @@ -357,7 +353,7 @@ void Assembler::set_target_address_at(Isolate* isolate, Address pc, DCHECK(IsMovW(Memory::int32_at(pc))); DCHECK(IsMovT(Memory::int32_at(pc + kInstrSize))); if (icache_flush_mode != SKIP_ICACHE_FLUSH) { - Assembler::FlushICache(isolate, pc, 2 * kInstrSize); + Assembler::FlushICache(pc, 2 * kInstrSize); } } else { // This is an mov / orr immediate load. Patch the immediate embedded in @@ -377,13 +373,42 @@ void Assembler::set_target_address_at(Isolate* isolate, Address pc, IsOrrImmed(Memory::int32_at(pc + 2 * kInstrSize)) && IsOrrImmed(Memory::int32_at(pc + 3 * kInstrSize))); if (icache_flush_mode != SKIP_ICACHE_FLUSH) { - Assembler::FlushICache(isolate, pc, 4 * kInstrSize); + Assembler::FlushICache(pc, 4 * kInstrSize); } } } EnsureSpace::EnsureSpace(Assembler* assembler) { assembler->CheckBuffer(); } +template <typename T> +bool UseScratchRegisterScope::CanAcquireVfp() const { + VfpRegList* available = assembler_->GetScratchVfpRegisterList(); + DCHECK_NOT_NULL(available); + for (int index = 0; index < T::kNumRegisters; index++) { + T reg = T::from_code(index); + uint64_t mask = reg.ToVfpRegList(); + if ((*available & mask) == mask) { + return true; + } + } + return false; +} + +template <typename T> +T UseScratchRegisterScope::AcquireVfp() { + VfpRegList* available = assembler_->GetScratchVfpRegisterList(); + DCHECK_NOT_NULL(available); + for (int index = 0; index < T::kNumRegisters; index++) { + T reg = T::from_code(index); + uint64_t mask = reg.ToVfpRegList(); + if ((*available & mask) == mask) { + *available &= ~mask; + return reg; + } + } + UNREACHABLE(); +} + } // namespace internal } // namespace v8 |