1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright 2013 the V8 project authors. All rights reserved. 2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file. 4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifndef V8_ARM64_ASSEMBLER_ARM64_INL_H_ 6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define V8_ARM64_ASSEMBLER_ARM64_INL_H_ 7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/arm64/assembler-arm64.h" 9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/assembler.h" 10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/debug.h" 11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace v8 { 14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace internal { 15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool CpuFeatures::SupportsCrankshaft() { return true; } 18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid RelocInfo::apply(intptr_t delta, ICacheFlushMode icache_flush_mode) { 21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UNIMPLEMENTED(); 22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid RelocInfo::set_target_address(Address target, 26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch WriteBarrierMode write_barrier_mode, 27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ICacheFlushMode icache_flush_mode) { 28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_)); 29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Assembler::set_target_address_at(pc_, host_, target, icache_flush_mode); 30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (write_barrier_mode == UPDATE_WRITE_BARRIER && host() != NULL && 31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch IsCodeTarget(rmode_)) { 32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Object* target_code = Code::GetCodeFromTargetAddress(target); 33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch host()->GetHeap()->incremental_marking()->RecordWriteIntoCode( 34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch host(), this, HeapObject::cast(target_code)); 35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline unsigned CPURegister::code() const { 40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsValid()); 41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return reg_code; 42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline CPURegister::RegisterType CPURegister::type() const { 46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsValidOrNone()); 47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return reg_type; 48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline RegList CPURegister::Bit() const { 52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(reg_code < (sizeof(RegList) * kBitsPerByte)); 53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return IsValid() ? 1UL << reg_code : 0; 54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline unsigned CPURegister::SizeInBits() const { 58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsValid()); 59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return reg_size; 60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline int CPURegister::SizeInBytes() const { 64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsValid()); 65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(SizeInBits() % 8 == 0); 66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return reg_size / 8; 67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline bool CPURegister::Is32Bits() const { 71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsValid()); 72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return reg_size == 32; 73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline bool CPURegister::Is64Bits() const { 77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsValid()); 78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return reg_size == 64; 79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline bool CPURegister::IsValid() const { 83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (IsValidRegister() || IsValidFPRegister()) { 84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!IsNone()); 85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return true; 86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsNone()); 88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return false; 89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline bool CPURegister::IsValidRegister() const { 94b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return IsRegister() && 95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ((reg_size == kWRegSizeInBits) || (reg_size == kXRegSizeInBits)) && 96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ((reg_code < kNumberOfRegisters) || (reg_code == kSPRegInternalCode)); 97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline bool CPURegister::IsValidFPRegister() const { 101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return IsFPRegister() && 102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ((reg_size == kSRegSizeInBits) || (reg_size == kDRegSizeInBits)) && 103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (reg_code < kNumberOfFPRegisters); 104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline bool CPURegister::IsNone() const { 108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // kNoRegister types should always have size 0 and code 0. 109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK((reg_type != kNoRegister) || (reg_code == 0)); 110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK((reg_type != kNoRegister) || (reg_size == 0)); 111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return reg_type == kNoRegister; 113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline bool CPURegister::Is(const CPURegister& other) const { 117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsValidOrNone() && other.IsValidOrNone()); 118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Aliases(other) && (reg_size == other.reg_size); 119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline bool CPURegister::Aliases(const CPURegister& other) const { 123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsValidOrNone() && other.IsValidOrNone()); 124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return (reg_code == other.reg_code) && (reg_type == other.reg_type); 125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline bool CPURegister::IsRegister() const { 129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return reg_type == kRegister; 130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline bool CPURegister::IsFPRegister() const { 134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return reg_type == kFPRegister; 135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline bool CPURegister::IsSameSizeAndType(const CPURegister& other) const { 139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return (reg_size == other.reg_size) && (reg_type == other.reg_type); 140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline bool CPURegister::IsValidOrNone() const { 144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return IsValid() || IsNone(); 145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline bool CPURegister::IsZero() const { 149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsValid()); 150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return IsRegister() && (reg_code == kZeroRegCode); 151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline bool CPURegister::IsSP() const { 155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsValid()); 156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return IsRegister() && (reg_code == kSPRegInternalCode); 157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline void CPURegList::Combine(const CPURegList& other) { 161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsValid()); 162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(other.type() == type_); 163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(other.RegisterSizeInBits() == size_); 164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch list_ |= other.list(); 165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline void CPURegList::Remove(const CPURegList& other) { 169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsValid()); 170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (other.type() == type_) { 171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch list_ &= ~other.list(); 172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline void CPURegList::Combine(const CPURegister& other) { 177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(other.type() == type_); 178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(other.SizeInBits() == size_); 179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Combine(other.code()); 180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline void CPURegList::Remove(const CPURegister& other1, 184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const CPURegister& other2, 185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const CPURegister& other3, 186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const CPURegister& other4) { 187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!other1.IsNone() && (other1.type() == type_)) Remove(other1.code()); 188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!other2.IsNone() && (other2.type() == type_)) Remove(other2.code()); 189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!other3.IsNone() && (other3.type() == type_)) Remove(other3.code()); 190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!other4.IsNone() && (other4.type() == type_)) Remove(other4.code()); 191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline void CPURegList::Combine(int code) { 195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsValid()); 196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(CPURegister::Create(code, size_, type_).IsValid()); 197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch list_ |= (1UL << code); 198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline void CPURegList::Remove(int code) { 202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsValid()); 203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(CPURegister::Create(code, size_, type_).IsValid()); 204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch list_ &= ~(1UL << code); 205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline Register Register::XRegFromCode(unsigned code) { 209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (code == kSPRegInternalCode) { 210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return csp; 211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(code < kNumberOfRegisters); 213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Register::Create(code, kXRegSizeInBits); 214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline Register Register::WRegFromCode(unsigned code) { 219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (code == kSPRegInternalCode) { 220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return wcsp; 221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(code < kNumberOfRegisters); 223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Register::Create(code, kWRegSizeInBits); 224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline FPRegister FPRegister::SRegFromCode(unsigned code) { 229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(code < kNumberOfFPRegisters); 230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return FPRegister::Create(code, kSRegSizeInBits); 231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline FPRegister FPRegister::DRegFromCode(unsigned code) { 235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(code < kNumberOfFPRegisters); 236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return FPRegister::Create(code, kDRegSizeInBits); 237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline Register CPURegister::W() const { 241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsValidRegister()); 242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Register::WRegFromCode(reg_code); 243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline Register CPURegister::X() const { 247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsValidRegister()); 248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Register::XRegFromCode(reg_code); 249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline FPRegister CPURegister::S() const { 253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsValidFPRegister()); 254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return FPRegister::SRegFromCode(reg_code); 255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline FPRegister CPURegister::D() const { 259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsValidFPRegister()); 260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return FPRegister::DRegFromCode(reg_code); 261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Immediate. 265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Default initializer is for int types 266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename T> 267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstruct ImmediateInitializer { 268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const bool kIsIntType = true; 269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline RelocInfo::Mode rmode_for(T) { 270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return sizeof(T) == 8 ? RelocInfo::NONE64 : RelocInfo::NONE32; 271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline int64_t immediate_for(T t) { 273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STATIC_ASSERT(sizeof(T) <= 8); 274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return t; 275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<> 280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstruct ImmediateInitializer<Smi*> { 281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const bool kIsIntType = false; 282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline RelocInfo::Mode rmode_for(Smi* t) { 283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return RelocInfo::NONE64; 284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline int64_t immediate_for(Smi* t) {; 286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return reinterpret_cast<int64_t>(t); 287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<> 292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstruct ImmediateInitializer<ExternalReference> { 293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const bool kIsIntType = false; 294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline RelocInfo::Mode rmode_for(ExternalReference t) { 295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return RelocInfo::EXTERNAL_REFERENCE; 296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline int64_t immediate_for(ExternalReference t) {; 298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return reinterpret_cast<int64_t>(t.address()); 299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename T> 304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochImmediate::Immediate(Handle<T> value) { 305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch InitializeHandle(value); 306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename T> 310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochImmediate::Immediate(T t) 311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : value_(ImmediateInitializer<T>::immediate_for(t)), 312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch rmode_(ImmediateInitializer<T>::rmode_for(t)) {} 313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename T> 316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochImmediate::Immediate(T t, RelocInfo::Mode rmode) 317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : value_(ImmediateInitializer<T>::immediate_for(t)), 318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch rmode_(rmode) { 319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STATIC_ASSERT(ImmediateInitializer<T>::kIsIntType); 320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Operand. 324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename T> 325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochOperand::Operand(Handle<T> value) : immediate_(value), reg_(NoReg) {} 326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename T> 329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochOperand::Operand(T t) : immediate_(t), reg_(NoReg) {} 330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename T> 333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochOperand::Operand(T t, RelocInfo::Mode rmode) 334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : immediate_(t, rmode), 335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch reg_(NoReg) {} 336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochOperand::Operand(Register reg, Shift shift, unsigned shift_amount) 339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : immediate_(0), 340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch reg_(reg), 341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch shift_(shift), 342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch extend_(NO_EXTEND), 343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch shift_amount_(shift_amount) { 344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(reg.Is64Bits() || (shift_amount < kWRegSizeInBits)); 345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(reg.Is32Bits() || (shift_amount < kXRegSizeInBits)); 346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!reg.IsSP()); 347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochOperand::Operand(Register reg, Extend extend, unsigned shift_amount) 351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : immediate_(0), 352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch reg_(reg), 353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch shift_(NO_SHIFT), 354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch extend_(extend), 355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch shift_amount_(shift_amount) { 356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(reg.IsValid()); 357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(shift_amount <= 4); 358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!reg.IsSP()); 359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Extend modes SXTX and UXTX require a 64-bit register. 361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(reg.Is64Bits() || ((extend != SXTX) && (extend != UXTX))); 362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool Operand::IsImmediate() const { 366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return reg_.Is(NoReg); 367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool Operand::IsShiftedRegister() const { 371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return reg_.IsValid() && (shift_ != NO_SHIFT); 372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool Operand::IsExtendedRegister() const { 376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return reg_.IsValid() && (extend_ != NO_EXTEND); 377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool Operand::IsZero() const { 381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (IsImmediate()) { 382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ImmediateValue() == 0; 383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return reg().IsZero(); 385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochOperand Operand::ToExtendedRegister() const { 390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsShiftedRegister()); 391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK((shift_ == LSL) && (shift_amount_ <= 4)); 392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Operand(reg_, reg_.Is64Bits() ? UXTX : UXTW, shift_amount_); 393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochImmediate Operand::immediate() const { 397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsImmediate()); 398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return immediate_; 399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochint64_t Operand::ImmediateValue() const { 403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsImmediate()); 404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return immediate_.value(); 405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochRegister Operand::reg() const { 409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsShiftedRegister() || IsExtendedRegister()); 410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return reg_; 411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochShift Operand::shift() const { 415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsShiftedRegister()); 416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return shift_; 417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochExtend Operand::extend() const { 421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsExtendedRegister()); 422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return extend_; 423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochunsigned Operand::shift_amount() const { 427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsShiftedRegister() || IsExtendedRegister()); 428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return shift_amount_; 429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochOperand Operand::UntagSmi(Register smi) { 433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STATIC_ASSERT(kXRegSizeInBits == static_cast<unsigned>(kSmiShift + 434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kSmiValueSize)); 435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(smi.Is64Bits()); 436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Operand(smi, ASR, kSmiShift); 437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochOperand Operand::UntagSmiAndScale(Register smi, int scale) { 441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STATIC_ASSERT(kXRegSizeInBits == static_cast<unsigned>(kSmiShift + 442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kSmiValueSize)); 443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(smi.Is64Bits()); 444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK((scale >= 0) && (scale <= (64 - kSmiValueSize))); 445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (scale > kSmiShift) { 446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Operand(smi, LSL, scale - kSmiShift); 447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (scale < kSmiShift) { 448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Operand(smi, ASR, kSmiShift - scale); 449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Operand(smi); 451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMemOperand::MemOperand() 455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : base_(NoReg), regoffset_(NoReg), offset_(0), addrmode_(Offset), 456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch shift_(NO_SHIFT), extend_(NO_EXTEND), shift_amount_(0) { 457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMemOperand::MemOperand(Register base, int64_t offset, AddrMode addrmode) 461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : base_(base), regoffset_(NoReg), offset_(offset), addrmode_(addrmode), 462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch shift_(NO_SHIFT), extend_(NO_EXTEND), shift_amount_(0) { 463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(base.Is64Bits() && !base.IsZero()); 464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMemOperand::MemOperand(Register base, 468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Register regoffset, 469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Extend extend, 470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch unsigned shift_amount) 471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : base_(base), regoffset_(regoffset), offset_(0), addrmode_(Offset), 472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch shift_(NO_SHIFT), extend_(extend), shift_amount_(shift_amount) { 473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(base.Is64Bits() && !base.IsZero()); 474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!regoffset.IsSP()); 475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK((extend == UXTW) || (extend == SXTW) || (extend == SXTX)); 476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // SXTX extend mode requires a 64-bit offset register. 478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(regoffset.Is64Bits() || (extend != SXTX)); 479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMemOperand::MemOperand(Register base, 483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Register regoffset, 484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Shift shift, 485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch unsigned shift_amount) 486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : base_(base), regoffset_(regoffset), offset_(0), addrmode_(Offset), 487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch shift_(shift), extend_(NO_EXTEND), shift_amount_(shift_amount) { 488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(base.Is64Bits() && !base.IsZero()); 489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(regoffset.Is64Bits() && !regoffset.IsSP()); 490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(shift == LSL); 491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMemOperand::MemOperand(Register base, const Operand& offset, AddrMode addrmode) 495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : base_(base), addrmode_(addrmode) { 496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(base.Is64Bits() && !base.IsZero()); 497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (offset.IsImmediate()) { 499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch offset_ = offset.ImmediateValue(); 500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch regoffset_ = NoReg; 502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (offset.IsShiftedRegister()) { 503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(addrmode == Offset); 504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch regoffset_ = offset.reg(); 506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch shift_= offset.shift(); 507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch shift_amount_ = offset.shift_amount(); 508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch extend_ = NO_EXTEND; 510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch offset_ = 0; 511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // These assertions match those in the shifted-register constructor. 513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(regoffset_.Is64Bits() && !regoffset_.IsSP()); 514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(shift_ == LSL); 515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(offset.IsExtendedRegister()); 517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(addrmode == Offset); 518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch regoffset_ = offset.reg(); 520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch extend_ = offset.extend(); 521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch shift_amount_ = offset.shift_amount(); 522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch shift_= NO_SHIFT; 524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch offset_ = 0; 525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // These assertions match those in the extended-register constructor. 527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!regoffset_.IsSP()); 528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK((extend_ == UXTW) || (extend_ == SXTW) || (extend_ == SXTX)); 529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK((regoffset_.Is64Bits() || (extend_ != SXTX))); 530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool MemOperand::IsImmediateOffset() const { 534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return (addrmode_ == Offset) && regoffset_.Is(NoReg); 535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool MemOperand::IsRegisterOffset() const { 539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return (addrmode_ == Offset) && !regoffset_.Is(NoReg); 540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool MemOperand::IsPreIndex() const { 544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return addrmode_ == PreIndex; 545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool MemOperand::IsPostIndex() const { 549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return addrmode_ == PostIndex; 550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochOperand MemOperand::OffsetAsOperand() const { 553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (IsImmediateOffset()) { 554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return offset(); 555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsRegisterOffset()); 557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (extend() == NO_EXTEND) { 558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Operand(regoffset(), shift(), shift_amount()); 559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Operand(regoffset(), extend(), shift_amount()); 561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::Unreachable() { 567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef USE_SIMULATOR 568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch debug("UNREACHABLE", __LINE__, BREAK); 569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#else 570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Crash by branching to 0. lr now points near the fault. 571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Emit(BLR | Rn(xzr)); 572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochAddress Assembler::target_pointer_address_at(Address pc) { 577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Instruction* instr = reinterpret_cast<Instruction*>(pc); 578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->IsLdrLiteralX()); 579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return reinterpret_cast<Address>(instr->ImmPCOffsetTarget()); 580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Read/Modify the code target address in the branch/call instruction at pc. 584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochAddress Assembler::target_address_at(Address pc, 585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ConstantPoolArray* constant_pool) { 586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Memory::Address_at(target_pointer_address_at(pc)); 587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochAddress Assembler::target_address_at(Address pc, Code* code) { 591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ConstantPoolArray* constant_pool = code ? code->constant_pool() : NULL; 592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return target_address_at(pc, constant_pool); 593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochAddress Assembler::target_address_from_return_address(Address pc) { 597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns the address of the call target from the return address that will 598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // be returned to after a call. 599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Call sequence on ARM64 is: 600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // ldr ip0, #... @ load from literal pool 601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // blr ip0 602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Address candidate = pc - 2 * kInstructionSize; 603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Instruction* instr = reinterpret_cast<Instruction*>(candidate); 604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch USE(instr); 605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->IsLdrLiteralX()); 606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return candidate; 607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochAddress Assembler::break_address_from_return_address(Address pc) { 611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return pc - Assembler::kPatchDebugBreakSlotReturnOffset; 612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochAddress Assembler::return_address_from_call_start(Address pc) { 616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The call, generated by MacroAssembler::Call, is one of two possible 617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // sequences: 618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // 619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Without relocation: 620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // movz temp, #(target & 0x000000000000ffff) 621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // movk temp, #(target & 0x00000000ffff0000) 622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // movk temp, #(target & 0x0000ffff00000000) 623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // blr temp 624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // 625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // With relocation: 626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // ldr temp, =target 627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // blr temp 628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // 629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The return address is immediately after the blr instruction in both cases, 630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // so it can be found by adding the call size to the address at the start of 631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // the call sequence. 632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STATIC_ASSERT(Assembler::kCallSizeWithoutRelocation == 4 * kInstructionSize); 633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STATIC_ASSERT(Assembler::kCallSizeWithRelocation == 2 * kInstructionSize); 634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Instruction* instr = reinterpret_cast<Instruction*>(pc); 636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->IsMovz()) { 637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Verify the instruction sequence. 638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->following(1)->IsMovk()); 639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->following(2)->IsMovk()); 640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->following(3)->IsBranchAndLinkToRegister()); 641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return pc + Assembler::kCallSizeWithoutRelocation; 642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Verify the instruction sequence. 644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->IsLdrLiteralX()); 645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->following(1)->IsBranchAndLinkToRegister()); 646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return pc + Assembler::kCallSizeWithRelocation; 647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::deserialization_set_special_target_at( 652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Address constant_pool_entry, Code* code, Address target) { 653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Memory::Address_at(constant_pool_entry) = target; 654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::set_target_address_at(Address pc, 658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ConstantPoolArray* constant_pool, 659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Address target, 660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ICacheFlushMode icache_flush_mode) { 661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Memory::Address_at(target_pointer_address_at(pc)) = target; 662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Intuitively, we would think it is necessary to always flush the 663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // instruction cache after patching a target address in the code as follows: 664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // CpuFeatures::FlushICache(pc, sizeof(target)); 665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // However, on ARM, an instruction is actually patched in the case of 666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // embedded constants of the form: 667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // ldr ip, [pc, #...] 668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // since the instruction accessing this address in the constant pool remains 669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // unchanged, a flush is not required. 670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::set_target_address_at(Address pc, 674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Code* code, 675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Address target, 676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ICacheFlushMode icache_flush_mode) { 677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ConstantPoolArray* constant_pool = code ? code->constant_pool() : NULL; 678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_target_address_at(pc, constant_pool, target, icache_flush_mode); 679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochint RelocInfo::target_address_size() { 683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return kPointerSize; 684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochAddress RelocInfo::target_address() { 688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_)); 689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Assembler::target_address_at(pc_, host_); 690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochAddress RelocInfo::target_address_address() { 694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_) 695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch || rmode_ == EMBEDDED_OBJECT 696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch || rmode_ == EXTERNAL_REFERENCE); 697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Assembler::target_pointer_address_at(pc_); 698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochAddress RelocInfo::constant_pool_entry_address() { 702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsInConstantPool()); 703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Assembler::target_pointer_address_at(pc_); 704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochObject* RelocInfo::target_object() { 708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); 709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return reinterpret_cast<Object*>(Assembler::target_address_at(pc_, host_)); 710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<Object> RelocInfo::target_object_handle(Assembler* origin) { 714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); 715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Handle<Object>(reinterpret_cast<Object**>( 716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Assembler::target_address_at(pc_, host_))); 717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid RelocInfo::set_target_object(Object* target, 721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch WriteBarrierMode write_barrier_mode, 722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ICacheFlushMode icache_flush_mode) { 723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); 724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Assembler::set_target_address_at(pc_, host_, 725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch reinterpret_cast<Address>(target), 726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch icache_flush_mode); 727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (write_barrier_mode == UPDATE_WRITE_BARRIER && 728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch host() != NULL && 729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch target->IsHeapObject()) { 730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch host()->GetHeap()->incremental_marking()->RecordWrite( 731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch host(), &Memory::Object_at(pc_), HeapObject::cast(target)); 732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 733b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochAddress RelocInfo::target_reference() { 737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(rmode_ == EXTERNAL_REFERENCE); 738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Assembler::target_address_at(pc_, host_); 739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochAddress RelocInfo::target_runtime_entry(Assembler* origin) { 743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsRuntimeEntry(rmode_)); 744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return target_address(); 745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid RelocInfo::set_target_runtime_entry(Address target, 749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch WriteBarrierMode write_barrier_mode, 750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ICacheFlushMode icache_flush_mode) { 751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsRuntimeEntry(rmode_)); 752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (target_address() != target) { 753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_target_address(target, write_barrier_mode, icache_flush_mode); 754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<Cell> RelocInfo::target_cell_handle() { 759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UNIMPLEMENTED(); 760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Cell *null_cell = NULL; 761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Handle<Cell>(null_cell); 762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 765b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochCell* RelocInfo::target_cell() { 766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(rmode_ == RelocInfo::CELL); 767b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Cell::FromValueAddress(Memory::Address_at(pc_)); 768b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 769b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid RelocInfo::set_target_cell(Cell* cell, 772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch WriteBarrierMode write_barrier_mode, 773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ICacheFlushMode icache_flush_mode) { 774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UNIMPLEMENTED(); 775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic const int kNoCodeAgeSequenceLength = 5 * kInstructionSize; 779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic const int kCodeAgeStubEntryOffset = 3 * kInstructionSize; 780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<Object> RelocInfo::code_age_stub_handle(Assembler* origin) { 783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UNREACHABLE(); // This should never be reached on ARM64. 784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Handle<Object>(); 785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochCode* RelocInfo::code_age_stub() { 789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(rmode_ == RelocInfo::CODE_AGE_SEQUENCE); 790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Read the stub entry point from the code age sequence. 791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Address stub_entry_address = pc_ + kCodeAgeStubEntryOffset; 792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Code::GetCodeFromTargetAddress(Memory::Address_at(stub_entry_address)); 793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid RelocInfo::set_code_age_stub(Code* stub, 797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ICacheFlushMode icache_flush_mode) { 798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(rmode_ == RelocInfo::CODE_AGE_SEQUENCE); 799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!Code::IsYoungSequence(stub->GetIsolate(), pc_)); 800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Overwrite the stub entry point in the code age sequence. This is loaded as 801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // a literal so there is no need to call FlushICache here. 802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Address stub_entry_address = pc_ + kCodeAgeStubEntryOffset; 803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Memory::Address_at(stub_entry_address) = stub->instruction_start(); 804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochAddress RelocInfo::call_address() { 808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK((IsJSReturn(rmode()) && IsPatchedReturnSequence()) || 809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence())); 810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // For the above sequences the Relocinfo points to the load literal loading 811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // the call address. 812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Assembler::target_address_at(pc_, host_); 813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid RelocInfo::set_call_address(Address target) { 817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK((IsJSReturn(rmode()) && IsPatchedReturnSequence()) || 818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence())); 819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Assembler::set_target_address_at(pc_, host_, target); 820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (host() != NULL) { 821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Object* target_code = Code::GetCodeFromTargetAddress(target); 822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch host()->GetHeap()->incremental_marking()->RecordWriteIntoCode( 823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch host(), this, HeapObject::cast(target_code)); 824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid RelocInfo::WipeOut() { 829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsEmbeddedObject(rmode_) || 830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch IsCodeTarget(rmode_) || 831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch IsRuntimeEntry(rmode_) || 832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch IsExternalReference(rmode_)); 833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Assembler::set_target_address_at(pc_, host_, NULL); 834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool RelocInfo::IsPatchedReturnSequence() { 838b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The sequence must be: 839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // ldr ip0, [pc, #offset] 840b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // blr ip0 841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // See arm64/debug-arm64.cc BreakLocationIterator::SetDebugBreakAtReturn(). 842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Instruction* i1 = reinterpret_cast<Instruction*>(pc_); 843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Instruction* i2 = i1->following(); 844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return i1->IsLdrLiteralX() && (i1->Rt() == ip0.code()) && 845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch i2->IsBranchAndLinkToRegister() && (i2->Rn() == ip0.code()); 846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool RelocInfo::IsPatchedDebugBreakSlotSequence() { 850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Instruction* current_instr = reinterpret_cast<Instruction*>(pc_); 851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return !current_instr->IsNop(Assembler::DEBUG_BREAK_NOP); 852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid RelocInfo::Visit(Isolate* isolate, ObjectVisitor* visitor) { 856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RelocInfo::Mode mode = rmode(); 857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (mode == RelocInfo::EMBEDDED_OBJECT) { 858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch visitor->VisitEmbeddedPointer(this); 859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (RelocInfo::IsCodeTarget(mode)) { 860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch visitor->VisitCodeTarget(this); 861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (mode == RelocInfo::CELL) { 862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch visitor->VisitCell(this); 863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (mode == RelocInfo::EXTERNAL_REFERENCE) { 864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch visitor->VisitExternalReference(this); 865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (((RelocInfo::IsJSReturn(mode) && 866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch IsPatchedReturnSequence()) || 867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (RelocInfo::IsDebugBreakSlot(mode) && 868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch IsPatchedDebugBreakSlotSequence())) && 869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate->debug()->has_break_points()) { 870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch visitor->VisitDebugTarget(this); 871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (RelocInfo::IsRuntimeEntry(mode)) { 872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch visitor->VisitRuntimeEntry(this); 873b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 875b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 876b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 877b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename StaticVisitor> 878b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid RelocInfo::Visit(Heap* heap) { 879b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RelocInfo::Mode mode = rmode(); 880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (mode == RelocInfo::EMBEDDED_OBJECT) { 881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch StaticVisitor::VisitEmbeddedPointer(heap, this); 882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (RelocInfo::IsCodeTarget(mode)) { 883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch StaticVisitor::VisitCodeTarget(heap, this); 884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (mode == RelocInfo::CELL) { 885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch StaticVisitor::VisitCell(heap, this); 886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (mode == RelocInfo::EXTERNAL_REFERENCE) { 887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch StaticVisitor::VisitExternalReference(this); 888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (heap->isolate()->debug()->has_break_points() && 889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ((RelocInfo::IsJSReturn(mode) && 890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch IsPatchedReturnSequence()) || 891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (RelocInfo::IsDebugBreakSlot(mode) && 892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch IsPatchedDebugBreakSlotSequence()))) { 893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch StaticVisitor::VisitDebugTarget(heap, this); 894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (RelocInfo::IsRuntimeEntry(mode)) { 895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch StaticVisitor::VisitRuntimeEntry(this); 896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLoadStoreOp Assembler::LoadOpFor(const CPURegister& rt) { 901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(rt.IsValid()); 902b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (rt.IsRegister()) { 903b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return rt.Is64Bits() ? LDR_x : LDR_w; 904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(rt.IsFPRegister()); 906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return rt.Is64Bits() ? LDR_d : LDR_s; 907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLoadStorePairOp Assembler::LoadPairOpFor(const CPURegister& rt, 912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const CPURegister& rt2) { 913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(AreSameSizeAndType(rt, rt2)); 914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch USE(rt2); 915b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (rt.IsRegister()) { 916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return rt.Is64Bits() ? LDP_x : LDP_w; 917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(rt.IsFPRegister()); 919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return rt.Is64Bits() ? LDP_d : LDP_s; 920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 922b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 923b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 924b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLoadStoreOp Assembler::StoreOpFor(const CPURegister& rt) { 925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(rt.IsValid()); 926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (rt.IsRegister()) { 927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return rt.Is64Bits() ? STR_x : STR_w; 928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(rt.IsFPRegister()); 930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return rt.Is64Bits() ? STR_d : STR_s; 931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 935b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLoadStorePairOp Assembler::StorePairOpFor(const CPURegister& rt, 936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const CPURegister& rt2) { 937b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(AreSameSizeAndType(rt, rt2)); 938b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch USE(rt2); 939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (rt.IsRegister()) { 940b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return rt.Is64Bits() ? STP_x : STP_w; 941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(rt.IsFPRegister()); 943b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return rt.Is64Bits() ? STP_d : STP_s; 944b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 948b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLoadStorePairNonTemporalOp Assembler::LoadPairNonTemporalOpFor( 949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const CPURegister& rt, const CPURegister& rt2) { 950b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(AreSameSizeAndType(rt, rt2)); 951b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch USE(rt2); 952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (rt.IsRegister()) { 953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return rt.Is64Bits() ? LDNP_x : LDNP_w; 954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(rt.IsFPRegister()); 956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return rt.Is64Bits() ? LDNP_d : LDNP_s; 957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 958b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLoadStorePairNonTemporalOp Assembler::StorePairNonTemporalOpFor( 962b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const CPURegister& rt, const CPURegister& rt2) { 963b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(AreSameSizeAndType(rt, rt2)); 964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch USE(rt2); 965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (rt.IsRegister()) { 966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return rt.Is64Bits() ? STNP_x : STNP_w; 967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 968b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(rt.IsFPRegister()); 969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return rt.Is64Bits() ? STNP_d : STNP_s; 970b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 974b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLoadLiteralOp Assembler::LoadLiteralOpFor(const CPURegister& rt) { 975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (rt.IsRegister()) { 976b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return rt.Is64Bits() ? LDR_x_lit : LDR_w_lit; 977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(rt.IsFPRegister()); 979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return rt.Is64Bits() ? LDR_d_lit : LDR_s_lit; 980b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 981b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochint Assembler::LinkAndGetInstructionOffsetTo(Label* label) { 985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(kStartOfLabelLinkChain == 0); 986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int offset = LinkAndGetByteOffsetTo(label); 987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsAligned(offset, kInstructionSize)); 988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return offset >> kInstructionSizeLog2; 989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochInstr Assembler::Flags(FlagsUpdate S) { 993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (S == SetFlags) { 994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return 1 << FlagsUpdate_offset; 995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (S == LeaveFlags) { 996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return 0 << FlagsUpdate_offset; 997b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UNREACHABLE(); 999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return 0; 1000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochInstr Assembler::Cond(Condition cond) { 1004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return cond << Condition_offset; 1005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1007b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochInstr Assembler::ImmPCRelAddress(int imm21) { 1009b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(is_int21(imm21)); 1010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Instr imm = static_cast<Instr>(truncate_to_int21(imm21)); 1011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Instr immhi = (imm >> ImmPCRelLo_width) << ImmPCRelHi_offset; 1012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Instr immlo = imm << ImmPCRelLo_offset; 1013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return (immhi & ImmPCRelHi_mask) | (immlo & ImmPCRelLo_mask); 1014b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1015b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochInstr Assembler::ImmUncondBranch(int imm26) { 1018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(is_int26(imm26)); 1019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return truncate_to_int26(imm26) << ImmUncondBranch_offset; 1020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochInstr Assembler::ImmCondBranch(int imm19) { 1024b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(is_int19(imm19)); 1025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return truncate_to_int19(imm19) << ImmCondBranch_offset; 1026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochInstr Assembler::ImmCmpBranch(int imm19) { 1030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(is_int19(imm19)); 1031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return truncate_to_int19(imm19) << ImmCmpBranch_offset; 1032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochInstr Assembler::ImmTestBranch(int imm14) { 1036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(is_int14(imm14)); 1037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return truncate_to_int14(imm14) << ImmTestBranch_offset; 1038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochInstr Assembler::ImmTestBranchBit(unsigned bit_pos) { 1042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(is_uint6(bit_pos)); 1043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Subtract five from the shift offset, as we need bit 5 from bit_pos. 1044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch unsigned b5 = bit_pos << (ImmTestBranchBit5_offset - 5); 1045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch unsigned b40 = bit_pos << ImmTestBranchBit40_offset; 1046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch b5 &= ImmTestBranchBit5_mask; 1047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch b40 &= ImmTestBranchBit40_mask; 1048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return b5 | b40; 1049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochInstr Assembler::SF(Register rd) { 1053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return rd.Is64Bits() ? SixtyFourBits : ThirtyTwoBits; 1054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochInstr Assembler::ImmAddSub(int64_t imm) { 1058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsImmAddSub(imm)); 1059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (is_uint12(imm)) { // No shift required. 1060b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return imm << ImmAddSub_offset; 1061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 1062b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ((imm >> 12) << ImmAddSub_offset) | (1 << ShiftAddSub_offset); 1063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochInstr Assembler::ImmS(unsigned imms, unsigned reg_size) { 1068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(((reg_size == kXRegSizeInBits) && is_uint6(imms)) || 1069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ((reg_size == kWRegSizeInBits) && is_uint5(imms))); 1070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch USE(reg_size); 1071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return imms << ImmS_offset; 1072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1074b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochInstr Assembler::ImmR(unsigned immr, unsigned reg_size) { 1076b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(((reg_size == kXRegSizeInBits) && is_uint6(immr)) || 1077b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ((reg_size == kWRegSizeInBits) && is_uint5(immr))); 1078b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch USE(reg_size); 1079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(is_uint6(immr)); 1080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return immr << ImmR_offset; 1081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1084b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochInstr Assembler::ImmSetBits(unsigned imms, unsigned reg_size) { 1085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK((reg_size == kWRegSizeInBits) || (reg_size == kXRegSizeInBits)); 1086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(is_uint6(imms)); 1087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK((reg_size == kXRegSizeInBits) || is_uint6(imms + 3)); 1088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch USE(reg_size); 1089b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return imms << ImmSetBits_offset; 1090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1093b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochInstr Assembler::ImmRotate(unsigned immr, unsigned reg_size) { 1094b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK((reg_size == kWRegSizeInBits) || (reg_size == kXRegSizeInBits)); 1095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(((reg_size == kXRegSizeInBits) && is_uint6(immr)) || 1096b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ((reg_size == kWRegSizeInBits) && is_uint5(immr))); 1097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch USE(reg_size); 1098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return immr << ImmRotate_offset; 1099b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochInstr Assembler::ImmLLiteral(int imm19) { 1103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(is_int19(imm19)); 1104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return truncate_to_int19(imm19) << ImmLLiteral_offset; 1105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochInstr Assembler::BitN(unsigned bitn, unsigned reg_size) { 1109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK((reg_size == kWRegSizeInBits) || (reg_size == kXRegSizeInBits)); 1110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK((reg_size == kXRegSizeInBits) || (bitn == 0)); 1111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch USE(reg_size); 1112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return bitn << BitN_offset; 1113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochInstr Assembler::ShiftDP(Shift shift) { 1117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(shift == LSL || shift == LSR || shift == ASR || shift == ROR); 1118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return shift << ShiftDP_offset; 1119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochInstr Assembler::ImmDPShift(unsigned amount) { 1123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(is_uint6(amount)); 1124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return amount << ImmDPShift_offset; 1125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochInstr Assembler::ExtendMode(Extend extend) { 1129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return extend << ExtendMode_offset; 1130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochInstr Assembler::ImmExtendShift(unsigned left_shift) { 1134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(left_shift <= 4); 1135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return left_shift << ImmExtendShift_offset; 1136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochInstr Assembler::ImmCondCmp(unsigned imm) { 1140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(is_uint5(imm)); 1141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return imm << ImmCondCmp_offset; 1142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochInstr Assembler::Nzcv(StatusFlags nzcv) { 1146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ((nzcv >> Flags_offset) & 0xf) << Nzcv_offset; 1147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochInstr Assembler::ImmLSUnsigned(int imm12) { 1151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(is_uint12(imm12)); 1152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return imm12 << ImmLSUnsigned_offset; 1153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochInstr Assembler::ImmLS(int imm9) { 1157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(is_int9(imm9)); 1158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return truncate_to_int9(imm9) << ImmLS_offset; 1159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochInstr Assembler::ImmLSPair(int imm7, LSDataSize size) { 1163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(((imm7 >> size) << size) == imm7); 1164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int scaled_imm7 = imm7 >> size; 1165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(is_int7(scaled_imm7)); 1166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return truncate_to_int7(scaled_imm7) << ImmLSPair_offset; 1167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochInstr Assembler::ImmShiftLS(unsigned shift_amount) { 1171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(is_uint1(shift_amount)); 1172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return shift_amount << ImmShiftLS_offset; 1173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochInstr Assembler::ImmException(int imm16) { 1177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(is_uint16(imm16)); 1178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return imm16 << ImmException_offset; 1179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochInstr Assembler::ImmSystemRegister(int imm15) { 1183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(is_uint15(imm15)); 1184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return imm15 << ImmSystemRegister_offset; 1185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochInstr Assembler::ImmHint(int imm7) { 1189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(is_uint7(imm7)); 1190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return imm7 << ImmHint_offset; 1191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochInstr Assembler::ImmBarrierDomain(int imm2) { 1195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(is_uint2(imm2)); 1196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return imm2 << ImmBarrierDomain_offset; 1197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochInstr Assembler::ImmBarrierType(int imm2) { 1201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(is_uint2(imm2)); 1202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return imm2 << ImmBarrierType_offset; 1203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLSDataSize Assembler::CalcLSDataSize(LoadStoreOp op) { 1207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK((SizeLS_offset + SizeLS_width) == (kInstructionSize * 8)); 1208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return static_cast<LSDataSize>(op >> SizeLS_offset); 1209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochInstr Assembler::ImmMoveWide(uint64_t imm) { 1213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(is_uint16(imm)); 1214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return imm << ImmMoveWide_offset; 1215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochInstr Assembler::ShiftMoveWide(int64_t shift) { 1219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(is_uint2(shift)); 1220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return shift << ShiftMoveWide_offset; 1221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochInstr Assembler::FPType(FPRegister fd) { 1225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return fd.Is64Bits() ? FP64 : FP32; 1226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochInstr Assembler::FPScale(unsigned scale) { 1230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(is_uint6(scale)); 1231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return scale << FPScale_offset; 1232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst Register& Assembler::AppropriateZeroRegFor(const CPURegister& reg) const { 1236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return reg.Is64Bits() ? xzr : wzr; 1237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline void Assembler::CheckBufferSpace() { 1241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(pc_ < (buffer_ + buffer_size_)); 1242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (buffer_space() < kGap) { 1243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch GrowBuffer(); 1244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline void Assembler::CheckBuffer() { 1249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CheckBufferSpace(); 1250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (pc_offset() >= next_veneer_pool_check_) { 1251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CheckVeneerPool(false, true); 1252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (pc_offset() >= next_constant_pool_check_) { 1254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CheckConstPool(false, true); 1255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTypeFeedbackId Assembler::RecordedAstId() { 1260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!recorded_ast_id_.IsNone()); 1261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return recorded_ast_id_; 1262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::ClearRecordedAstId() { 1266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch recorded_ast_id_ = TypeFeedbackId::None(); 1267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} } // namespace v8::internal 1271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif // V8_ARM64_ASSEMBLER_ARM64_INL_H_ 1273