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