13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright (c) 1994-2006 Sun Microsystems Inc. 2a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// All Rights Reserved. 3a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 4a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Redistribution and use in source and binary forms, with or without 5a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// modification, are permitted provided that the following conditions are 6a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// met: 7a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 8a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// - Redistributions of source code must retain the above copyright notice, 9a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// this list of conditions and the following disclaimer. 10a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 11a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// - Redistribution in binary form must reproduce the above copyright 12a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// notice, this list of conditions and the following disclaimer in the 13a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// documentation and/or other materials provided with the distribution. 14a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 15a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// - Neither the name of Sun Microsystems or the names of contributors may 16a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// be used to endorse or promote products derived from this software without 17a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// specific prior written permission. 18a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 19a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS 20a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 21a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 23a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 24a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 25a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 26a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 27a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 28a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 29a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 31a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The original source code covered by the above license above has been 32a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// modified significantly by Google Inc. 333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2012 the V8 project authors. All rights reserved. 34a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/assembler.h" 36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 37109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#include <math.h> 38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include <cmath> 39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/api.h" 40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/base/cpu.h" 41958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include "src/base/functional.h" 4213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#include "src/base/ieee754.h" 43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/base/lazy-instance.h" 44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/base/platform/platform.h" 45014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/base/utils/random-number-generator.h" 46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/codegen.h" 47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/counters.h" 48014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/debug/debug.h" 49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/deoptimizer.h" 50014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/disassembler.h" 51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/execution.h" 52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/ic/ic.h" 53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/ic/stub-cache.h" 54109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#include "src/interpreter/interpreter.h" 55014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/ostreams.h" 56014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/regexp/jsregexp.h" 57014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/regexp/regexp-macro-assembler.h" 58014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/regexp/regexp-stack.h" 59014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/register-configuration.h" 60958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include "src/runtime/runtime.h" 61014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/simulator.h" // For flushing instruction cache. 623b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#include "src/snapshot/serializer-common.h" 633b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#include "src/wasm/wasm-external-refs.h" 643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#if V8_TARGET_ARCH_IA32 66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/ia32/assembler-ia32-inl.h" // NOLINT 673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#elif V8_TARGET_ARCH_X64 68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/x64/assembler-x64-inl.h" // NOLINT 69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#elif V8_TARGET_ARCH_ARM64 70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/arm64/assembler-arm64-inl.h" // NOLINT 713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#elif V8_TARGET_ARCH_ARM 72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/arm/assembler-arm-inl.h" // NOLINT 73014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#elif V8_TARGET_ARCH_PPC 74014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/ppc/assembler-ppc-inl.h" // NOLINT 753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#elif V8_TARGET_ARCH_MIPS 76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/mips/assembler-mips-inl.h" // NOLINT 77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#elif V8_TARGET_ARCH_MIPS64 78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/mips64/assembler-mips64-inl.h" // NOLINT 793b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#elif V8_TARGET_ARCH_S390 803b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#include "src/s390/assembler-s390-inl.h" // NOLINT 81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#elif V8_TARGET_ARCH_X87 82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/x87/assembler-x87-inl.h" // NOLINT 833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#else 843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#error "Unknown architecture." 853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#endif 863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 87a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Include native regexp-macro-assembler. 886ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#ifndef V8_INTERPRETED_REGEXP 89a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#if V8_TARGET_ARCH_IA32 90014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/regexp/ia32/regexp-macro-assembler-ia32.h" // NOLINT 91a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#elif V8_TARGET_ARCH_X64 92014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/regexp/x64/regexp-macro-assembler-x64.h" // NOLINT 93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#elif V8_TARGET_ARCH_ARM64 94014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/regexp/arm64/regexp-macro-assembler-arm64.h" // NOLINT 95a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#elif V8_TARGET_ARCH_ARM 96014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/regexp/arm/regexp-macro-assembler-arm.h" // NOLINT 97014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#elif V8_TARGET_ARCH_PPC 98014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/regexp/ppc/regexp-macro-assembler-ppc.h" // NOLINT 9944f0eee88ff00398ff7f715fab053374d808c90dSteve Block#elif V8_TARGET_ARCH_MIPS 100014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/regexp/mips/regexp-macro-assembler-mips.h" // NOLINT 101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#elif V8_TARGET_ARCH_MIPS64 102014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/regexp/mips64/regexp-macro-assembler-mips64.h" // NOLINT 1033b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#elif V8_TARGET_ARCH_S390 1043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#include "src/regexp/s390/regexp-macro-assembler-s390.h" // NOLINT 105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#elif V8_TARGET_ARCH_X87 106014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/regexp/x87/regexp-macro-assembler-x87.h" // NOLINT 107a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#else // Unknown architecture. 108a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#error "Unknown architecture." 109a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif // Target architecture. 1106ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#endif // V8_INTERPRETED_REGEXP 111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 112a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace v8 { 113a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace internal { 114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// ----------------------------------------------------------------------------- 1163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Common double constants. 1173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochstruct DoubleConstant BASE_EMBEDDED { 119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochdouble min_int; 120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochdouble one_half; 121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochdouble minus_one_half; 122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochdouble negative_infinity; 123f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochuint64_t the_hole_nan; 124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochdouble uint32_bias; 1253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 1263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic DoubleConstant double_constants; 128a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 129f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochstatic struct V8_ALIGNED(16) { 130f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch uint32_t a; 131f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch uint32_t b; 132f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch uint32_t c; 133f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch uint32_t d; 134f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} float_absolute_constant = {0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF}; 135f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 136f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochstatic struct V8_ALIGNED(16) { 137f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch uint32_t a; 138f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch uint32_t b; 139f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch uint32_t c; 140f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch uint32_t d; 141f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} float_negate_constant = {0x80000000, 0x80000000, 0x80000000, 0x80000000}; 142f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 143f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochstatic struct V8_ALIGNED(16) { 144f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch uint64_t a; 145f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch uint64_t b; 146f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} double_absolute_constant = {V8_UINT64_C(0x7FFFFFFFFFFFFFFF), 147f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V8_UINT64_C(0x7FFFFFFFFFFFFFFF)}; 148f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 149f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochstatic struct V8_ALIGNED(16) { 150f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch uint64_t a; 151f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch uint64_t b; 152f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} double_negate_constant = {V8_UINT64_C(0x8000000000000000), 153f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V8_UINT64_C(0x8000000000000000)}; 154f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 15569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochconst char* const RelocInfo::kFillerCommentString = "DEOPTIMIZATION PADDING"; 156b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 157a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ----------------------------------------------------------------------------- 158053d10c438f14580aaf4ab1b2aad93a5a4fe8b82Steve Block// Implementation of AssemblerBase 159053d10c438f14580aaf4ab1b2aad93a5a4fe8b82Steve Block 160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochAssemblerBase::AssemblerBase(Isolate* isolate, void* buffer, int buffer_size) 161053d10c438f14580aaf4ab1b2aad93a5a4fe8b82Steve Block : isolate_(isolate), 162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch jit_cookie_(0), 163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch enabled_cpu_features_(0), 164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_debug_code_(FLAG_debug_code), 165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch predictable_code_size_(false), 166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // We may use the assembler without an isolate. 167958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier serializer_enabled_(isolate && isolate->serializer_enabled()), 168014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch constant_pool_available_(false) { 169014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK_NOT_NULL(isolate); 170014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (FLAG_mask_constants_with_cookie) { 171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch jit_cookie_ = isolate->random_number_generator()->NextInt(); 172053d10c438f14580aaf4ab1b2aad93a5a4fe8b82Steve Block } 173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch own_buffer_ = buffer == NULL; 174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (buffer_size == 0) buffer_size = kMinimalBufferSize; 175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(buffer_size > 0); 176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (own_buffer_) buffer = NewArray<byte>(buffer_size); 177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch buffer_ = static_cast<byte*>(buffer); 178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch buffer_size_ = buffer_size; 179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch pc_ = buffer_; 181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochAssemblerBase::~AssemblerBase() { 185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (own_buffer_) DeleteArray(buffer_); 186053d10c438f14580aaf4ab1b2aad93a5a4fe8b82Steve Block} 187053d10c438f14580aaf4ab1b2aad93a5a4fe8b82Steve Block 188053d10c438f14580aaf4ab1b2aad93a5a4fe8b82Steve Block 189014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid AssemblerBase::FlushICache(Isolate* isolate, void* start, size_t size) { 190014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (size == 0) return; 191014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 192014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if defined(USE_SIMULATOR) 193f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch base::LockGuard<base::Mutex> lock_guard(isolate->simulator_i_cache_mutex()); 194014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Simulator::FlushICache(isolate->simulator_i_cache(), start, size); 195014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#else 196014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CpuFeatures::FlushICache(start, size); 197014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif // USE_SIMULATOR 198014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 199014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 200014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 201014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid AssemblerBase::Print() { 202014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch OFStream os(stdout); 203014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch v8::internal::Disassembler::Decode(isolate(), &os, buffer_, pc_, nullptr); 204014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 205014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 206014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 207053d10c438f14580aaf4ab1b2aad93a5a4fe8b82Steve Block// ----------------------------------------------------------------------------- 208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Implementation of PredictableCodeSizeScope 209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 210014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochPredictableCodeSizeScope::PredictableCodeSizeScope(AssemblerBase* assembler) 211014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : PredictableCodeSizeScope(assembler, -1) {} 212014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 213014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochPredictableCodeSizeScope::PredictableCodeSizeScope(AssemblerBase* assembler, 215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int expected_size) 216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : assembler_(assembler), 217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch expected_size_(expected_size), 218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch start_offset_(assembler->pc_offset()), 219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch old_value_(assembler->predictable_code_size()) { 220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assembler_->set_predictable_code_size(true); 221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochPredictableCodeSizeScope::~PredictableCodeSizeScope() { 225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(svenpanne) Remove the 'if' when everything works. 226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (expected_size_ >= 0) { 227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected_size_, assembler_->pc_offset() - start_offset_); 228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assembler_->set_predictable_code_size(old_value_); 230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// ----------------------------------------------------------------------------- 234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Implementation of CpuFeatureScope 235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef DEBUG 237f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochCpuFeatureScope::CpuFeatureScope(AssemblerBase* assembler, CpuFeature f, 238f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch CheckPolicy check) 239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : assembler_(assembler) { 240f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DCHECK_IMPLIES(check == kCheckSupported, CpuFeatures::IsSupported(f)); 241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch old_enabled_ = assembler_->enabled_cpu_features(); 242f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch assembler_->EnableCpuFeature(f); 243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochCpuFeatureScope::~CpuFeatureScope() { 246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assembler_->set_enabled_cpu_features(old_enabled_); 247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool CpuFeatures::initialized_ = false; 252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochunsigned CpuFeatures::supported_ = 0; 253109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochunsigned CpuFeatures::icache_line_size_ = 0; 254109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochunsigned CpuFeatures::dcache_line_size_ = 0; 255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// ----------------------------------------------------------------------------- 257a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Implementation of Label 258a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 259a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint Label::pos() const { 260a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (pos_ < 0) return -pos_ - 1; 261a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (pos_ > 0) return pos_ - 1; 262a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block UNREACHABLE(); 263a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return 0; 264a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 265a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 266a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 267a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ----------------------------------------------------------------------------- 268a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Implementation of RelocInfoWriter and RelocIterator 269a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 270257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// Relocation information is written backwards in memory, from high addresses 271257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// towards low addresses, byte by byte. Therefore, in the encodings listed 272257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// below, the first byte listed it at the highest address, and successive 273257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// bytes in the record are at progressively lower addresses. 274257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// 275a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Encoding 276a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 277a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The most common modes are given single-byte encodings. Also, it is 278a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// easy to identify the type of reloc info and skip unwanted modes in 279a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// an iteration. 280a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 281257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// The encoding relies on the fact that there are fewer than 14 282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// different relocation modes using standard non-compact encoding. 283a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 284257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// The first byte of a relocation record has a tag in its low 2 bits: 285257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// Here are the record schemes, depending on the low tag and optional higher 286257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// tags. 287a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 288257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// Low tag: 289257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// 00: embedded_object: [6-bit pc delta] 00 290a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 291257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// 01: code_target: [6-bit pc delta] 01 292a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 293257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// 10: short_data_record: [6-bit pc delta] 10 followed by 294257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// [6-bit data delta] [2-bit data type tag] 295a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 296014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// 11: long_record [6 bit reloc mode] 11 297014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// followed by pc delta 298014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// followed by optional data depending on type. 299a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 300f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// 1-bit data type tags, used in short_data_record and data_jump long_record: 301f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// code_target_with_id: 0 302f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// deopt_reason: 1 303a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 304014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// If a pc delta exceeds 6 bits, it is split into a remainder that fits into 305014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// 6 bits and a part that does not. The latter is encoded as a long record 306014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// with PC_JUMP as pseudo reloc info mode. The former is encoded as part of 307014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// the following record in the usual way. The long pc jump record has variable 308014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// length: 309014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// pc-jump: [PC_JUMP] 11 310257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// [7 bits data] 0 311257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// ... 312257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// [7 bits data] 1 313257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// (Bits 6..31 of pc delta, with leading zeroes 314257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// dropped, and last non-zero chunk tagged with 1.) 315257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 316a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockconst int kTagBits = 2; 317a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockconst int kTagMask = (1 << kTagBits) - 1; 318014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst int kLongTagBits = 6; 319f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochconst int kShortDataTypeTagBits = 1; 320014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst int kShortDataBits = kBitsPerByte - kShortDataTypeTagBits; 321a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 322a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockconst int kEmbeddedObjectTag = 0; 323a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockconst int kCodeTargetTag = 1; 324257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochconst int kLocatableTag = 2; 325a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockconst int kDefaultTag = 3; 326a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 327a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockconst int kSmallPCDeltaBits = kBitsPerByte - kTagBits; 328a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockconst int kSmallPCDeltaMask = (1 << kSmallPCDeltaBits) - 1; 32944f0eee88ff00398ff7f715fab053374d808c90dSteve Blockconst int RelocInfo::kMaxSmallPCDelta = kSmallPCDeltaMask; 330a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 331a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockconst int kChunkBits = 7; 332a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockconst int kChunkMask = (1 << kChunkBits) - 1; 333a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockconst int kLastChunkTagBits = 1; 334a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockconst int kLastChunkTagMask = 1; 335a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockconst int kLastChunkTag = 1; 336a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 337257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochconst int kCodeWithIdTag = 0; 338f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochconst int kDeoptReasonTag = 1; 339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 34013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochvoid RelocInfo::update_wasm_memory_reference( 34113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Address old_base, Address new_base, uint32_t old_size, uint32_t new_size, 34213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch ICacheFlushMode icache_flush_mode) { 34313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch DCHECK(IsWasmMemoryReference(rmode_) || IsWasmMemorySizeReference(rmode_)); 34413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch if (IsWasmMemoryReference(rmode_)) { 34513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Address updated_reference; 346f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DCHECK_GE(wasm_memory_reference(), old_base); 34713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch updated_reference = new_base + (wasm_memory_reference() - old_base); 348f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // The reference is not checked here but at runtime. Validity of references 349f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // may change over time. 35013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch unchecked_update_wasm_memory_reference(updated_reference, 35113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch icache_flush_mode); 35213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch } else if (IsWasmMemorySizeReference(rmode_)) { 353f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch uint32_t current_size_reference = wasm_memory_size_reference(); 354c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch uint32_t updated_size_reference = 355c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch new_size + (current_size_reference - old_size); 35613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch unchecked_update_wasm_memory_size(updated_size_reference, 35713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch icache_flush_mode); 35813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch } else { 35913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch UNREACHABLE(); 36013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch } 36113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch if (icache_flush_mode != SKIP_ICACHE_FLUSH) { 36213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Assembler::FlushICache(isolate_, pc_, sizeof(int64_t)); 36313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch } 36413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch} 36513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 36613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochvoid RelocInfo::update_wasm_global_reference( 36713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Address old_base, Address new_base, ICacheFlushMode icache_flush_mode) { 36813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch DCHECK(IsWasmGlobalReference(rmode_)); 36913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Address updated_reference; 37013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch DCHECK(reinterpret_cast<uintptr_t>(old_base) <= 37113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch reinterpret_cast<uintptr_t>(wasm_global_reference())); 37213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch updated_reference = new_base + (wasm_global_reference() - old_base); 37313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch DCHECK(reinterpret_cast<uintptr_t>(new_base) <= 37413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch reinterpret_cast<uintptr_t>(updated_reference)); 37513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch unchecked_update_wasm_memory_reference(updated_reference, icache_flush_mode); 37613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch if (icache_flush_mode != SKIP_ICACHE_FLUSH) { 37713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Assembler::FlushICache(isolate_, pc_, sizeof(int32_t)); 37813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch } 37913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch} 380a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 381f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochvoid RelocInfo::set_target_address(Address target, 382f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch WriteBarrierMode write_barrier_mode, 383f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch ICacheFlushMode icache_flush_mode) { 384f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DCHECK(IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_)); 385f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Assembler::set_target_address_at(isolate_, pc_, host_, target, 386f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch icache_flush_mode); 387f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch if (write_barrier_mode == UPDATE_WRITE_BARRIER && host() != NULL && 388f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch IsCodeTarget(rmode_)) { 389f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Object* target_code = Code::GetCodeFromTargetAddress(target); 390f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch host()->GetHeap()->incremental_marking()->RecordWriteIntoCode( 391f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch host(), this, HeapObject::cast(target_code)); 392f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 393f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} 394f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 395014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochuint32_t RelocInfoWriter::WriteLongPCJump(uint32_t pc_delta) { 396a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Return if the pc_delta can fit in kSmallPCDeltaBits bits. 397a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Otherwise write a variable length PC jump for the bits that do 398a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // not fit in the kSmallPCDeltaBits bits. 399a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (is_uintn(pc_delta, kSmallPCDeltaBits)) return pc_delta; 400014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch WriteMode(RelocInfo::PC_JUMP); 401a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uint32_t pc_jump = pc_delta >> kSmallPCDeltaBits; 402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(pc_jump > 0); 403a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Write kChunkBits size chunks of the pc_jump. 404a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block for (; pc_jump > 0; pc_jump = pc_jump >> kChunkBits) { 405a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block byte b = pc_jump & kChunkMask; 406a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block *--pos_ = b << kLastChunkTagBits; 407a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 408a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Tag the last chunk so it can be identified. 409a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block *pos_ = *pos_ | kLastChunkTag; 410a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Return the remaining kSmallPCDeltaBits of the pc_delta. 411a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return pc_delta & kSmallPCDeltaMask; 412a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 413a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 414a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 415014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid RelocInfoWriter::WriteShortTaggedPC(uint32_t pc_delta, int tag) { 416014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Write a byte of tagged pc-delta, possibly preceded by an explicit pc-jump. 417014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch pc_delta = WriteLongPCJump(pc_delta); 418a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block *--pos_ = pc_delta << kTagBits | tag; 419a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 420a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 421a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 422014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid RelocInfoWriter::WriteShortTaggedData(intptr_t data_delta, int tag) { 423014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch *--pos_ = static_cast<byte>(data_delta << kShortDataTypeTagBits | tag); 424a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 425a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 426a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 427014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid RelocInfoWriter::WriteMode(RelocInfo::Mode rmode) { 428014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch STATIC_ASSERT(RelocInfo::NUMBER_OF_MODES <= (1 << kLongTagBits)); 429014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch *--pos_ = static_cast<int>((rmode << kTagBits) | kDefaultTag); 430a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 431a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 432a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 433014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid RelocInfoWriter::WriteModeAndPC(uint32_t pc_delta, RelocInfo::Mode rmode) { 434a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Write two-byte tagged pc-delta, possibly preceded by var. length pc-jump. 435014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch pc_delta = WriteLongPCJump(pc_delta); 436014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch WriteMode(rmode); 437a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block *--pos_ = pc_delta; 438a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 439a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 440a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 441014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid RelocInfoWriter::WriteIntData(int number) { 442257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch for (int i = 0; i < kIntSize; i++) { 443014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch *--pos_ = static_cast<byte>(number); 444014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Signed right shift is arithmetic shift. Tested in test-utils.cc. 445014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch number = number >> kBitsPerByte; 446014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 447014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 448014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 449014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 450014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid RelocInfoWriter::WriteData(intptr_t data_delta) { 451014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (int i = 0; i < kIntptrSize; i++) { 452257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch *--pos_ = static_cast<byte>(data_delta); 453257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // Signed right shift is arithmetic shift. Tested in test-utils.cc. 454257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch data_delta = data_delta >> kBitsPerByte; 455257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 456257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 457257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 459a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid RelocInfoWriter::Write(const RelocInfo* rinfo) { 460014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RelocInfo::Mode rmode = rinfo->rmode(); 461a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef DEBUG 462a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block byte* begin_pos = pos_; 463a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(rinfo->rmode() < RelocInfo::NUMBER_OF_MODES); 465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(rinfo->pc() - last_pc_ >= 0); 466a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Use unsigned delta-encoding for pc. 467d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block uint32_t pc_delta = static_cast<uint32_t>(rinfo->pc() - last_pc_); 468a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 469a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // The two most common modes are given small tags, and usually fit in a byte. 470a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (rmode == RelocInfo::EMBEDDED_OBJECT) { 471014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch WriteShortTaggedPC(pc_delta, kEmbeddedObjectTag); 472a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else if (rmode == RelocInfo::CODE_TARGET) { 473014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch WriteShortTaggedPC(pc_delta, kCodeTargetTag); 474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(begin_pos - pos_ <= RelocInfo::kMaxCallSize); 475257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } else if (rmode == RelocInfo::CODE_TARGET_WITH_ID) { 476257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // Use signed delta-encoding for id. 477014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK_EQ(static_cast<int>(rinfo->data()), rinfo->data()); 478257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch int id_delta = static_cast<int>(rinfo->data()) - last_id_; 479257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // Check if delta is small enough to fit in a tagged byte. 480014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (is_intn(id_delta, kShortDataBits)) { 481014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch WriteShortTaggedPC(pc_delta, kLocatableTag); 482014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch WriteShortTaggedData(id_delta, kCodeWithIdTag); 483257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } else { 484257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // Otherwise, use costly encoding. 485014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch WriteModeAndPC(pc_delta, rmode); 486014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch WriteIntData(id_delta); 487257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 488257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch last_id_ = static_cast<int>(rinfo->data()); 489014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else if (rmode == RelocInfo::DEOPT_REASON) { 490014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(rinfo->data() < (1 << kShortDataBits)); 491014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch WriteShortTaggedPC(pc_delta, kLocatableTag); 492014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch WriteShortTaggedData(rinfo->data(), kDeoptReasonTag); 493a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 494014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch WriteModeAndPC(pc_delta, rmode); 495014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (RelocInfo::IsComment(rmode)) { 496014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch WriteData(rinfo->data()); 497014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else if (RelocInfo::IsConstPool(rmode) || 498f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch RelocInfo::IsVeneerPool(rmode) || RelocInfo::IsDeoptId(rmode) || 499f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch RelocInfo::IsDeoptPosition(rmode)) { 500014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch WriteIntData(static_cast<int>(rinfo->data())); 501014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 502a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 503a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = rinfo->pc(); 504014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch last_mode_ = rmode; 505a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef DEBUG 506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(begin_pos - pos_ <= kMaxSize); 507a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 508a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 509a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 510a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 511a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockinline int RelocIterator::AdvanceGetTag() { 512a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return *--pos_ & kTagMask; 513a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 514a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 515a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 516014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochinline RelocInfo::Mode RelocIterator::GetMode() { 517014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return static_cast<RelocInfo::Mode>((*pos_ >> kTagBits) & 518014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ((1 << kLongTagBits) - 1)); 519a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 520a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 521a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 522014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochinline void RelocIterator::ReadShortTaggedPC() { 523a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block rinfo_.pc_ += *pos_ >> kTagBits; 524a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 525a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 526a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 527a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockinline void RelocIterator::AdvanceReadPC() { 528a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block rinfo_.pc_ += *--pos_; 529a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 530a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 531a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 532257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid RelocIterator::AdvanceReadId() { 533257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch int x = 0; 534257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch for (int i = 0; i < kIntSize; i++) { 535257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch x |= static_cast<int>(*--pos_) << i * kBitsPerByte; 536257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 537257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch last_id_ += x; 538257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch rinfo_.data_ = last_id_; 539257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 540257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 541257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 542014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid RelocIterator::AdvanceReadInt() { 543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int x = 0; 544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < kIntSize; i++) { 545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch x |= static_cast<int>(*--pos_) << i * kBitsPerByte; 546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch rinfo_.data_ = x; 548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 551a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid RelocIterator::AdvanceReadData() { 552a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block intptr_t x = 0; 553a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block for (int i = 0; i < kIntptrSize; i++) { 554a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block x |= static_cast<intptr_t>(*--pos_) << i * kBitsPerByte; 555a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 556257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch rinfo_.data_ = x; 557a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 558a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 559a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 560014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid RelocIterator::AdvanceReadLongPCJump() { 561a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Read the 32-kSmallPCDeltaBits most significant bits of the 562a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // pc jump in kChunkBits bit chunks and shift them into place. 563a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Stop when the last chunk is encountered. 564a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uint32_t pc_jump = 0; 565a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block for (int i = 0; i < kIntSize; i++) { 566a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block byte pc_jump_part = *--pos_; 567a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block pc_jump |= (pc_jump_part >> kLastChunkTagBits) << i * kChunkBits; 568a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if ((pc_jump_part & kLastChunkTagMask) == 1) break; 569a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 570a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // The least significant kSmallPCDeltaBits bits will be added 571a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // later. 572a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block rinfo_.pc_ += pc_jump << kSmallPCDeltaBits; 573a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 574a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 575a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 576014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochinline int RelocIterator::GetShortDataTypeTag() { 577014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return *pos_ & ((1 << kShortDataTypeTagBits) - 1); 578a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 579a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 580a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 581014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochinline void RelocIterator::ReadShortTaggedId() { 582a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int8_t signed_b = *pos_; 583a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Signed right shift is arithmetic shift. Tested in test-utils.cc. 584014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch last_id_ += signed_b >> kShortDataTypeTagBits; 585257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch rinfo_.data_ = last_id_; 586a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 587a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 588a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 589014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochinline void RelocIterator::ReadShortTaggedData() { 590014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch uint8_t unsigned_b = *pos_; 591f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch rinfo_.data_ = unsigned_b >> kShortDataTypeTagBits; 592a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 593a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 594a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 595a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid RelocIterator::next() { 596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!done()); 597a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Basically, do the opposite of RelocInfoWriter::Write. 598a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Reading of data is as far as possible avoided for unwanted modes, 599a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // but we must always update the pc. 600a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // 601a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // We exit this loop by returning when we find a mode we want. 602a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block while (pos_ > end_) { 603a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int tag = AdvanceGetTag(); 604a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (tag == kEmbeddedObjectTag) { 605014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ReadShortTaggedPC(); 606a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (SetMode(RelocInfo::EMBEDDED_OBJECT)) return; 607a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else if (tag == kCodeTargetTag) { 608014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ReadShortTaggedPC(); 609a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (SetMode(RelocInfo::CODE_TARGET)) return; 610257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } else if (tag == kLocatableTag) { 611014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ReadShortTaggedPC(); 612a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Advance(); 613014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int data_type_tag = GetShortDataTypeTag(); 614014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (data_type_tag == kCodeWithIdTag) { 615257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch if (SetMode(RelocInfo::CODE_TARGET_WITH_ID)) { 616014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ReadShortTaggedId(); 617014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return; 618014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 619f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } else { 620f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DCHECK(data_type_tag == kDeoptReasonTag); 621014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (SetMode(RelocInfo::DEOPT_REASON)) { 622014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ReadShortTaggedData(); 623257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return; 624257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 625a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 626a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(tag == kDefaultTag); 628014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RelocInfo::Mode rmode = GetMode(); 629014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (rmode == RelocInfo::PC_JUMP) { 630014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch AdvanceReadLongPCJump(); 631014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 632014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch AdvanceReadPC(); 633014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (rmode == RelocInfo::CODE_TARGET_WITH_ID) { 634014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (SetMode(rmode)) { 635257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch AdvanceReadId(); 636257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return; 637257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 638257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Advance(kIntSize); 639014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else if (RelocInfo::IsComment(rmode)) { 640014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (SetMode(rmode)) { 641014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch AdvanceReadData(); 642014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return; 643014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 644014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Advance(kIntptrSize); 645014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else if (RelocInfo::IsConstPool(rmode) || 646bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch RelocInfo::IsVeneerPool(rmode) || 647f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch RelocInfo::IsDeoptId(rmode) || 648f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch RelocInfo::IsDeoptPosition(rmode)) { 649014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (SetMode(rmode)) { 650014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch AdvanceReadInt(); 651257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return; 652257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 653014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Advance(kIntSize); 654014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else if (SetMode(static_cast<RelocInfo::Mode>(rmode))) { 655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return; 656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 657a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 658a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 659a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (code_age_sequence_ != NULL) { 661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch byte* old_code_age_sequence = code_age_sequence_; 662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch code_age_sequence_ = NULL; 663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (SetMode(RelocInfo::CODE_AGE_SEQUENCE)) { 664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch rinfo_.data_ = 0; 665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch rinfo_.pc_ = old_code_age_sequence; 666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return; 667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 669a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block done_ = true; 670a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 671a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 672a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 673014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochRelocIterator::RelocIterator(Code* code, int mode_mask) 674014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : rinfo_(code->map()->GetIsolate()) { 6753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch rinfo_.host_ = code; 676a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block rinfo_.pc_ = code->instruction_start(); 677a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block rinfo_.data_ = 0; 678b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Relocation info is read backwards. 679a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block pos_ = code->relocation_start() + code->relocation_size(); 680a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block end_ = code->relocation_start(); 681a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block done_ = false; 682a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block mode_mask_ = mode_mask; 683257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch last_id_ = 0; 684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch byte* sequence = code->FindCodeAgeSequence(); 685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // We get the isolate from the map, because at serialization time 686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // the code pointer has been cloned and isn't really in heap space. 687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Isolate* isolate = code->map()->GetIsolate(); 688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (sequence != NULL && !Code::IsYoungSequence(isolate, sequence)) { 689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch code_age_sequence_ = sequence; 690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch code_age_sequence_ = NULL; 692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 693a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (mode_mask_ == 0) pos_ = end_; 694a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block next(); 695a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 696a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 697a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 698014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochRelocIterator::RelocIterator(const CodeDesc& desc, int mode_mask) 699014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : rinfo_(desc.origin->isolate()) { 700a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block rinfo_.pc_ = desc.buffer; 701a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block rinfo_.data_ = 0; 702b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Relocation info is read backwards. 703a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block pos_ = desc.buffer + desc.buffer_size; 704a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block end_ = pos_ - desc.reloc_size; 705a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block done_ = false; 706a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block mode_mask_ = mode_mask; 707257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch last_id_ = 0; 708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch code_age_sequence_ = NULL; 709a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (mode_mask_ == 0) pos_ = end_; 710a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block next(); 711a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 712a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 713a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 714a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ----------------------------------------------------------------------------- 715a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Implementation of RelocInfo 716a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 717109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochbool RelocInfo::IsPatchedDebugBreakSlotSequence() { 718109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch return DebugCodegen::DebugBreakSlotIsPatched(pc_); 719109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch} 720a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef DEBUG 722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool RelocInfo::RequiresRelocation(const CodeDesc& desc) { 723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Ensure there are no code targets or embedded objects present in the 724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // deoptimization entries, they would require relocation after code 725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // generation. 726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int mode_mask = RelocInfo::kCodeTargetMask | 727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT) | 728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RelocInfo::ModeMask(RelocInfo::CELL) | 729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RelocInfo::kApplyMask; 730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RelocIterator it(desc, mode_mask); 731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return !it.done(); 732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 733b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 736a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef ENABLE_DISASSEMBLER 737a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockconst char* RelocInfo::RelocModeName(RelocInfo::Mode rmode) { 738a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block switch (rmode) { 739014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case NONE32: 740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return "no reloc 32"; 741014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case NONE64: 742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return "no reloc 64"; 743014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case EMBEDDED_OBJECT: 744a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return "embedded object"; 745014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case DEBUGGER_STATEMENT: 746014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return "debugger statement"; 747014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case CODE_TARGET: 748a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return "code target"; 749014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case CODE_TARGET_WITH_ID: 750257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return "code target with id"; 751014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case CELL: 752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return "property cell"; 753014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case RUNTIME_ENTRY: 754a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return "runtime entry"; 755014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case COMMENT: 756a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return "comment"; 757014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case EXTERNAL_REFERENCE: 758a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return "external reference"; 759014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case INTERNAL_REFERENCE: 760a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return "internal reference"; 761014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case INTERNAL_REFERENCE_ENCODED: 762014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return "encoded internal reference"; 763c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch case DEOPT_SCRIPT_OFFSET: 764c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch return "deopt script offset"; 765c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch case DEOPT_INLINING_ID: 766c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch return "deopt inlining id"; 767014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case DEOPT_REASON: 768014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return "deopt reason"; 769bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch case DEOPT_ID: 770bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch return "deopt index"; 771014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case CONST_POOL: 772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return "constant pool"; 773014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case VENEER_POOL: 774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return "veneer pool"; 775014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case DEBUG_BREAK_SLOT_AT_POSITION: 776014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return "debug break slot at position"; 777014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case DEBUG_BREAK_SLOT_AT_RETURN: 778014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return "debug break slot at return"; 779014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case DEBUG_BREAK_SLOT_AT_CALL: 780014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return "debug break slot at call"; 7813b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch case DEBUG_BREAK_SLOT_AT_TAIL_CALL: 7823b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return "debug break slot at tail call"; 783014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case CODE_AGE_SEQUENCE: 784014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return "code age sequence"; 785014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case GENERATOR_CONTINUATION: 786014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return "generator continuation"; 7873b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch case WASM_MEMORY_REFERENCE: 7883b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return "wasm memory reference"; 789bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch case WASM_MEMORY_SIZE_REFERENCE: 790bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch return "wasm memory size reference"; 79113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch case WASM_GLOBAL_REFERENCE: 79213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch return "wasm global value reference"; 793014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case NUMBER_OF_MODES: 794014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case PC_JUMP: 795a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block UNREACHABLE(); 796a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return "number_of_modes"; 797a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 798a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return "unknown relocation type"; 799a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 800a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 801a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 802958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid RelocInfo::Print(Isolate* isolate, std::ostream& os) { // NOLINT 803958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier os << static_cast<const void*>(pc_) << " " << RelocModeName(rmode_); 804a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (IsComment(rmode_)) { 805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch os << " (" << reinterpret_cast<char*>(data_) << ")"; 806c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch } else if (rmode_ == DEOPT_SCRIPT_OFFSET || rmode_ == DEOPT_INLINING_ID) { 807f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch os << " (" << data() << ")"; 808014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else if (rmode_ == DEOPT_REASON) { 809f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch os << " (" 810f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch << DeoptimizeReasonToString(static_cast<DeoptimizeReason>(data_)) << ")"; 811a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else if (rmode_ == EMBEDDED_OBJECT) { 812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch os << " (" << Brief(target_object()) << ")"; 813a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else if (rmode_ == EXTERNAL_REFERENCE) { 814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ExternalReferenceEncoder ref_encoder(isolate); 815014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch os << " (" 816014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch << ref_encoder.NameOfAddress(isolate, target_external_reference()) 817014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch << ") (" << static_cast<const void*>(target_external_reference()) 818014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch << ")"; 819a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else if (IsCodeTarget(rmode_)) { 820a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Code* code = Code::GetCodeFromTargetAddress(target_address()); 821958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier os << " (" << Code::Kind2String(code->kind()) << ") (" 822958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier << static_cast<const void*>(target_address()) << ")"; 823257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch if (rmode_ == CODE_TARGET_WITH_ID) { 824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch os << " (id=" << static_cast<int>(data_) << ")"; 825257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (IsRuntimeEntry(rmode_) && 827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate->deoptimizer_data() != NULL) { 828b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Depotimization bailouts are stored as runtime entries. 829b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int id = Deoptimizer::GetDeoptimizationId( 830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate, target_address(), Deoptimizer::EAGER); 831b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (id != Deoptimizer::kNotDeoptimizationEntry) { 832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch os << " (deoptimization bailout " << id << ")"; 833b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 834014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else if (IsConstPool(rmode_)) { 835014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch os << " (size " << static_cast<int>(data_) << ")"; 836a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 837a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 838b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch os << "\n"; 839a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 840a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif // ENABLE_DISASSEMBLER 841a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 842a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef VERIFY_HEAP 844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid RelocInfo::Verify(Isolate* isolate) { 845a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block switch (rmode_) { 846a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block case EMBEDDED_OBJECT: 847a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Object::VerifyPointer(target_object()); 848a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block break; 849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case CELL: 850b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Object::VerifyPointer(target_cell()); 851b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch break; 852014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case DEBUGGER_STATEMENT: 853257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch case CODE_TARGET_WITH_ID: 854a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block case CODE_TARGET: { 855a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // convert inline target address to code object 856a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Address addr = target_address(); 857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(addr != NULL); 858a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Check that we can find the right code object. 859a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Code* code = Code::GetCodeFromTargetAddress(addr); 860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Object* found = isolate->FindCodeObject(addr); 861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(found->IsCode()); 862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(code->address() == HeapObject::cast(found)->address()); 863a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block break; 864a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 865014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case INTERNAL_REFERENCE: 866014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case INTERNAL_REFERENCE_ENCODED: { 867014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Address target = target_internal_reference(); 868014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Address pc = target_internal_reference_address(); 869014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Code* code = Code::cast(isolate->FindCodeObject(pc)); 870014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK(target >= code->instruction_start()); 871014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK(target <= code->instruction_end()); 872014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch break; 873014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 874a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block case RUNTIME_ENTRY: 875a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block case COMMENT: 876a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block case EXTERNAL_REFERENCE: 877c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch case DEOPT_SCRIPT_OFFSET: 878c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch case DEOPT_INLINING_ID: 879014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case DEOPT_REASON: 880bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch case DEOPT_ID: 881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case CONST_POOL: 882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case VENEER_POOL: 883014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case DEBUG_BREAK_SLOT_AT_POSITION: 884014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case DEBUG_BREAK_SLOT_AT_RETURN: 885014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case DEBUG_BREAK_SLOT_AT_CALL: 8863b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch case DEBUG_BREAK_SLOT_AT_TAIL_CALL: 887014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case GENERATOR_CONTINUATION: 8883b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch case WASM_MEMORY_REFERENCE: 889bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch case WASM_MEMORY_SIZE_REFERENCE: 89013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch case WASM_GLOBAL_REFERENCE: 891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case NONE32: 892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case NONE64: 893a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block break; 894a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block case NUMBER_OF_MODES: 895014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case PC_JUMP: 896a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block UNREACHABLE(); 897a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block break; 898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case CODE_AGE_SEQUENCE: 899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(Code::IsYoungSequence(isolate, pc_) || code_age_stub()->IsCode()); 900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 901a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 902a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 903b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif // VERIFY_HEAP 904a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 905a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 906a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Implementation of ExternalReference 907a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 908109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochstatic ExternalReference::Type BuiltinCallTypeForResultSize(int result_size) { 909109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch switch (result_size) { 910109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch case 1: 911109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch return ExternalReference::BUILTIN_CALL; 912109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch case 2: 913109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch return ExternalReference::BUILTIN_CALL_PAIR; 914109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch case 3: 915109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch return ExternalReference::BUILTIN_CALL_TRIPLE; 916109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch } 917109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch UNREACHABLE(); 918109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch return ExternalReference::BUILTIN_CALL; 919109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch} 920109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 921109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 922b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid ExternalReference::SetUp() { 923b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double_constants.min_int = kMinInt; 924b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double_constants.one_half = 0.5; 925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double_constants.minus_one_half = -0.5; 926f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch double_constants.the_hole_nan = kHoleNanInt64; 927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double_constants.negative_infinity = -V8_INFINITY; 928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double_constants.uint32_bias = 929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static_cast<double>(static_cast<uint32_t>(0xFFFFFFFF)) + 1; 930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 932f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochExternalReference::ExternalReference(Address address, Isolate* isolate) 933f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch : address_(Redirect(isolate, address)) {} 934a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9351e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockExternalReference::ExternalReference( 93644f0eee88ff00398ff7f715fab053374d808c90dSteve Block ApiFunction* fun, 93744f0eee88ff00398ff7f715fab053374d808c90dSteve Block Type type = ExternalReference::BUILTIN_CALL, 93844f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* isolate = NULL) 93944f0eee88ff00398ff7f715fab053374d808c90dSteve Block : address_(Redirect(isolate, fun->address(), type)) {} 940d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block 941d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block 94244f0eee88ff00398ff7f715fab053374d808c90dSteve BlockExternalReference::ExternalReference(Builtins::Name name, Isolate* isolate) 94344f0eee88ff00398ff7f715fab053374d808c90dSteve Block : address_(isolate->builtins()->builtin_address(name)) {} 944a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 945a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 946014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochExternalReference::ExternalReference(Runtime::FunctionId id, Isolate* isolate) 947109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch : ExternalReference(Runtime::FunctionForId(id), isolate) {} 948a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 949a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 95044f0eee88ff00398ff7f715fab053374d808c90dSteve BlockExternalReference::ExternalReference(const Runtime::Function* f, 95144f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* isolate) 952109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch : address_(Redirect(isolate, f->entry, 953109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch BuiltinCallTypeForResultSize(f->result_size))) {} 954a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 955a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochExternalReference ExternalReference::isolate_address(Isolate* isolate) { 957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ExternalReference(isolate); 95844f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 95944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 960109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben MurdochExternalReference ExternalReference::interpreter_dispatch_table_address( 961109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Isolate* isolate) { 962109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch return ExternalReference(isolate->interpreter()->dispatch_table_address()); 963109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch} 96444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 965bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben MurdochExternalReference ExternalReference::interpreter_dispatch_counters( 966bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Isolate* isolate) { 967bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch return ExternalReference( 968bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch isolate->interpreter()->bytecode_dispatch_counters_table()); 969bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch} 970bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 971a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockExternalReference::ExternalReference(StatsCounter* counter) 972a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block : address_(reinterpret_cast<Address>(counter->GetInternalPointer())) {} 973a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 974a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 97544f0eee88ff00398ff7f715fab053374d808c90dSteve BlockExternalReference::ExternalReference(Isolate::AddressId id, Isolate* isolate) 97644f0eee88ff00398ff7f715fab053374d808c90dSteve Block : address_(isolate->get_address_from_id(id)) {} 977a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 978a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 979a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockExternalReference::ExternalReference(const SCTableReference& table_ref) 980a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block : address_(table_ref.address()) {} 981a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 982a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9833ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochExternalReference ExternalReference:: 9843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch incremental_marking_record_write_function(Isolate* isolate) { 9853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return ExternalReference(Redirect( 9863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch isolate, 9873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch FUNCTION_ADDR(IncrementalMarking::RecordWriteFromCode))); 9883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 9893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 990109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben MurdochExternalReference 991109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben MurdochExternalReference::incremental_marking_record_write_code_entry_function( 992109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Isolate* isolate) { 993109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch return ExternalReference(Redirect( 994109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch isolate, 995109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch FUNCTION_ADDR(IncrementalMarking::RecordWriteOfCodeEntryFromCode))); 996109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch} 9973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 998109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben MurdochExternalReference ExternalReference::store_buffer_overflow_function( 999109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Isolate* isolate) { 10003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return ExternalReference(Redirect( 10013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch isolate, 10023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch FUNCTION_ADDR(StoreBuffer::StoreBufferOverflow))); 10033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 10043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochExternalReference ExternalReference::delete_handle_scope_extensions( 100744f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* isolate) { 100844f0eee88ff00398ff7f715fab053374d808c90dSteve Block return ExternalReference(Redirect( 100944f0eee88ff00398ff7f715fab053374d808c90dSteve Block isolate, 1010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FUNCTION_ADDR(HandleScope::DeleteExtensions))); 10116ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 10126ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 10136ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 1014b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochExternalReference ExternalReference::get_date_field_function( 101544f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* isolate) { 1016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ExternalReference(Redirect(isolate, FUNCTION_ADDR(JSDate::GetField))); 10175913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck} 10185913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck 10195913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck 1020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochExternalReference ExternalReference::get_make_code_young_function( 102144f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* isolate) { 1022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ExternalReference(Redirect( 1023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate, FUNCTION_ADDR(Code::MakeCodeAgeSequenceYoung))); 1024a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1025a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1026a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochExternalReference ExternalReference::get_mark_code_as_executed_function( 10283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Isolate* isolate) { 1029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ExternalReference(Redirect( 1030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate, FUNCTION_ADDR(Code::MarkCodeAsExecuted))); 10313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 10323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10343ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochExternalReference ExternalReference::date_cache_stamp(Isolate* isolate) { 10353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return ExternalReference(isolate->date_cache()->stamp_address()); 10363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 10373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochExternalReference ExternalReference::stress_deopt_count(Isolate* isolate) { 1040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ExternalReference(isolate->stress_deopt_count_address()); 1041402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu} 1042402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu 1043402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu 104444f0eee88ff00398ff7f715fab053374d808c90dSteve BlockExternalReference ExternalReference::new_deoptimizer_function( 104544f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* isolate) { 1046b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return ExternalReference( 104744f0eee88ff00398ff7f715fab053374d808c90dSteve Block Redirect(isolate, FUNCTION_ADDR(Deoptimizer::New))); 1048b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1049b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1050b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 105144f0eee88ff00398ff7f715fab053374d808c90dSteve BlockExternalReference ExternalReference::compute_output_frames_function( 105244f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* isolate) { 1053b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return ExternalReference( 105444f0eee88ff00398ff7f715fab053374d808c90dSteve Block Redirect(isolate, FUNCTION_ADDR(Deoptimizer::ComputeOutputFrames))); 1055b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1056b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 10573b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochExternalReference ExternalReference::wasm_f32_trunc(Isolate* isolate) { 10583b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return ExternalReference( 10593b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Redirect(isolate, FUNCTION_ADDR(wasm::f32_trunc_wrapper))); 10603b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 10613b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochExternalReference ExternalReference::wasm_f32_floor(Isolate* isolate) { 10623b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return ExternalReference( 10633b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Redirect(isolate, FUNCTION_ADDR(wasm::f32_floor_wrapper))); 10643b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 10653b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochExternalReference ExternalReference::wasm_f32_ceil(Isolate* isolate) { 10663b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return ExternalReference( 10673b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Redirect(isolate, FUNCTION_ADDR(wasm::f32_ceil_wrapper))); 10683b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 10693b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochExternalReference ExternalReference::wasm_f32_nearest_int(Isolate* isolate) { 10703b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return ExternalReference( 10713b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Redirect(isolate, FUNCTION_ADDR(wasm::f32_nearest_int_wrapper))); 10723b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 10733b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 10743b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochExternalReference ExternalReference::wasm_f64_trunc(Isolate* isolate) { 10753b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return ExternalReference( 10763b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Redirect(isolate, FUNCTION_ADDR(wasm::f64_trunc_wrapper))); 10773b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 10783b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 10793b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochExternalReference ExternalReference::wasm_f64_floor(Isolate* isolate) { 10803b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return ExternalReference( 10813b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Redirect(isolate, FUNCTION_ADDR(wasm::f64_floor_wrapper))); 10823b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 10833b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 10843b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochExternalReference ExternalReference::wasm_f64_ceil(Isolate* isolate) { 10853b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return ExternalReference( 10863b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Redirect(isolate, FUNCTION_ADDR(wasm::f64_ceil_wrapper))); 10873b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 10883b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 10893b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochExternalReference ExternalReference::wasm_f64_nearest_int(Isolate* isolate) { 10903b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return ExternalReference( 10913b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Redirect(isolate, FUNCTION_ADDR(wasm::f64_nearest_int_wrapper))); 10923b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 10933b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 10943b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochExternalReference ExternalReference::wasm_int64_to_float32(Isolate* isolate) { 10953b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return ExternalReference( 10963b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Redirect(isolate, FUNCTION_ADDR(wasm::int64_to_float32_wrapper))); 10973b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 10983b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 10993b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochExternalReference ExternalReference::wasm_uint64_to_float32(Isolate* isolate) { 11003b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return ExternalReference( 11013b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Redirect(isolate, FUNCTION_ADDR(wasm::uint64_to_float32_wrapper))); 11023b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 11033b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 11043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochExternalReference ExternalReference::wasm_int64_to_float64(Isolate* isolate) { 11053b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return ExternalReference( 11063b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Redirect(isolate, FUNCTION_ADDR(wasm::int64_to_float64_wrapper))); 11073b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 11083b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 11093b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochExternalReference ExternalReference::wasm_uint64_to_float64(Isolate* isolate) { 11103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return ExternalReference( 11113b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Redirect(isolate, FUNCTION_ADDR(wasm::uint64_to_float64_wrapper))); 11123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 11133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 11143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochExternalReference ExternalReference::wasm_float32_to_int64(Isolate* isolate) { 11153b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return ExternalReference( 11163b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Redirect(isolate, FUNCTION_ADDR(wasm::float32_to_int64_wrapper))); 11173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 11183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 11193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochExternalReference ExternalReference::wasm_float32_to_uint64(Isolate* isolate) { 11203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return ExternalReference( 11213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Redirect(isolate, FUNCTION_ADDR(wasm::float32_to_uint64_wrapper))); 11223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 11233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 11243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochExternalReference ExternalReference::wasm_float64_to_int64(Isolate* isolate) { 11253b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return ExternalReference( 11263b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Redirect(isolate, FUNCTION_ADDR(wasm::float64_to_int64_wrapper))); 11273b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 11283b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 11293b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochExternalReference ExternalReference::wasm_float64_to_uint64(Isolate* isolate) { 11303b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return ExternalReference( 11313b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Redirect(isolate, FUNCTION_ADDR(wasm::float64_to_uint64_wrapper))); 11323b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 1133109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 11343b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochExternalReference ExternalReference::wasm_int64_div(Isolate* isolate) { 11353b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return ExternalReference( 11363b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Redirect(isolate, FUNCTION_ADDR(wasm::int64_div_wrapper))); 11373b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 11383b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 11393b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochExternalReference ExternalReference::wasm_int64_mod(Isolate* isolate) { 11403b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return ExternalReference( 11413b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Redirect(isolate, FUNCTION_ADDR(wasm::int64_mod_wrapper))); 11423b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 11433b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 11443b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochExternalReference ExternalReference::wasm_uint64_div(Isolate* isolate) { 11453b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return ExternalReference( 11463b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Redirect(isolate, FUNCTION_ADDR(wasm::uint64_div_wrapper))); 11473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 11483b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 11493b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochExternalReference ExternalReference::wasm_uint64_mod(Isolate* isolate) { 11503b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return ExternalReference( 11513b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Redirect(isolate, FUNCTION_ADDR(wasm::uint64_mod_wrapper))); 11523b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 11533b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1154bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben MurdochExternalReference ExternalReference::wasm_word32_ctz(Isolate* isolate) { 1155bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch return ExternalReference( 1156bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Redirect(isolate, FUNCTION_ADDR(wasm::word32_ctz_wrapper))); 1157bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch} 1158bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 1159bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben MurdochExternalReference ExternalReference::wasm_word64_ctz(Isolate* isolate) { 1160bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch return ExternalReference( 1161bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Redirect(isolate, FUNCTION_ADDR(wasm::word64_ctz_wrapper))); 1162bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch} 1163bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 1164bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben MurdochExternalReference ExternalReference::wasm_word32_popcnt(Isolate* isolate) { 1165bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch return ExternalReference( 1166bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Redirect(isolate, FUNCTION_ADDR(wasm::word32_popcnt_wrapper))); 1167bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch} 1168bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 1169bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben MurdochExternalReference ExternalReference::wasm_word64_popcnt(Isolate* isolate) { 1170bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch return ExternalReference( 1171bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Redirect(isolate, FUNCTION_ADDR(wasm::word64_popcnt_wrapper))); 1172bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch} 1173bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 117413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochstatic void f64_acos_wrapper(double* param) { 1175f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch WriteDoubleValue(param, base::ieee754::acos(ReadDoubleValue(param))); 117613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch} 11773b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 11783b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochExternalReference ExternalReference::f64_acos_wrapper_function( 1179109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Isolate* isolate) { 11803b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return ExternalReference(Redirect(isolate, FUNCTION_ADDR(f64_acos_wrapper))); 1181109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch} 1182109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 118313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochstatic void f64_asin_wrapper(double* param) { 1184f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch WriteDoubleValue(param, base::ieee754::asin(ReadDoubleValue(param))); 118513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch} 1186109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 11873b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochExternalReference ExternalReference::f64_asin_wrapper_function( 1188109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Isolate* isolate) { 11893b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return ExternalReference(Redirect(isolate, FUNCTION_ADDR(f64_asin_wrapper))); 1190109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch} 1191109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 1192f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochExternalReference ExternalReference::wasm_float64_pow(Isolate* isolate) { 1193f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return ExternalReference( 1194f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Redirect(isolate, FUNCTION_ADDR(wasm::float64_pow_wrapper))); 11953b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 11963b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 11973b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochstatic void f64_mod_wrapper(double* param0, double* param1) { 119813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch WriteDoubleValue(param0, 119913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch modulo(ReadDoubleValue(param0), ReadDoubleValue(param1))); 12003b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 12013b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 12023b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochExternalReference ExternalReference::f64_mod_wrapper_function( 12033b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Isolate* isolate) { 12043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return ExternalReference(Redirect(isolate, FUNCTION_ADDR(f64_mod_wrapper))); 1205109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch} 1206b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochExternalReference ExternalReference::log_enter_external_function( 1208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Isolate* isolate) { 1209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ExternalReference( 1210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Redirect(isolate, FUNCTION_ADDR(Logger::EnterExternal))); 1211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochExternalReference ExternalReference::log_leave_external_function( 1215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Isolate* isolate) { 1216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ExternalReference( 1217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Redirect(isolate, FUNCTION_ADDR(Logger::LeaveExternal))); 1218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 12203ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochExternalReference ExternalReference::roots_array_start(Isolate* isolate) { 12213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return ExternalReference(isolate->heap()->roots_array_start()); 1222a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1223a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1224a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochExternalReference ExternalReference::allocation_sites_list_address( 1226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Isolate* isolate) { 1227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ExternalReference(isolate->heap()->allocation_sites_list_address()); 1228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 123144f0eee88ff00398ff7f715fab053374d808c90dSteve BlockExternalReference ExternalReference::address_of_stack_limit(Isolate* isolate) { 123244f0eee88ff00398ff7f715fab053374d808c90dSteve Block return ExternalReference(isolate->stack_guard()->address_of_jslimit()); 1233a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1234a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1235a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 123644f0eee88ff00398ff7f715fab053374d808c90dSteve BlockExternalReference ExternalReference::address_of_real_stack_limit( 123744f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* isolate) { 123844f0eee88ff00398ff7f715fab053374d808c90dSteve Block return ExternalReference(isolate->stack_guard()->address_of_real_jslimit()); 1239d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block} 1240d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block 1241d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block 124244f0eee88ff00398ff7f715fab053374d808c90dSteve BlockExternalReference ExternalReference::address_of_regexp_stack_limit( 124344f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* isolate) { 124444f0eee88ff00398ff7f715fab053374d808c90dSteve Block return ExternalReference(isolate->regexp_stack()->limit_address()); 1245a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1246a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 12473ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochExternalReference ExternalReference::store_buffer_top(Isolate* isolate) { 1248014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return ExternalReference(isolate->heap()->store_buffer_top_address()); 12493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 12503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 125244f0eee88ff00398ff7f715fab053374d808c90dSteve BlockExternalReference ExternalReference::new_space_allocation_top_address( 125344f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* isolate) { 125444f0eee88ff00398ff7f715fab053374d808c90dSteve Block return ExternalReference(isolate->heap()->NewSpaceAllocationTopAddress()); 1255a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1256a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1257a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochExternalReference ExternalReference::new_space_allocation_limit_address( 125944f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* isolate) { 1260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ExternalReference(isolate->heap()->NewSpaceAllocationLimitAddress()); 1261a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1262a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1263a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1264014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochExternalReference ExternalReference::old_space_allocation_top_address( 126544f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* isolate) { 1266014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return ExternalReference(isolate->heap()->OldSpaceAllocationTopAddress()); 1267a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1268a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1269d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block 1270014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochExternalReference ExternalReference::old_space_allocation_limit_address( 1271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Isolate* isolate) { 1272014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return ExternalReference(isolate->heap()->OldSpaceAllocationLimitAddress()); 1273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochExternalReference ExternalReference::handle_scope_level_address( 1277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Isolate* isolate) { 1278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ExternalReference(HandleScope::current_level_address(isolate)); 1279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochExternalReference ExternalReference::handle_scope_next_address( 1283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Isolate* isolate) { 1284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ExternalReference(HandleScope::current_next_address(isolate)); 1285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochExternalReference ExternalReference::handle_scope_limit_address( 1289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Isolate* isolate) { 1290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ExternalReference(HandleScope::current_limit_address(isolate)); 1291d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block} 1292d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block 1293d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block 129444f0eee88ff00398ff7f715fab053374d808c90dSteve BlockExternalReference ExternalReference::scheduled_exception_address( 129544f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* isolate) { 129644f0eee88ff00398ff7f715fab053374d808c90dSteve Block return ExternalReference(isolate->scheduled_exception_address()); 1297d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block} 1298d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block 1299d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block 1300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochExternalReference ExternalReference::address_of_pending_message_obj( 1301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Isolate* isolate) { 1302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ExternalReference(isolate->pending_message_obj_address()); 1303b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1304b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1305b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochExternalReference ExternalReference::address_of_min_int() { 1307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ExternalReference(reinterpret_cast<void*>(&double_constants.min_int)); 1308b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1309b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1310b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochExternalReference ExternalReference::address_of_one_half() { 1312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ExternalReference(reinterpret_cast<void*>(&double_constants.one_half)); 1313257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 1314257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1315257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochExternalReference ExternalReference::address_of_minus_one_half() { 1317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ExternalReference( 1318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch reinterpret_cast<void*>(&double_constants.minus_one_half)); 1319257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 1320257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1321257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1322b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochExternalReference ExternalReference::address_of_negative_infinity() { 1323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ExternalReference( 1324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch reinterpret_cast<void*>(&double_constants.negative_infinity)); 1325b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1326b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1327b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 13283fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochExternalReference ExternalReference::address_of_the_hole_nan() { 1329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ExternalReference( 1330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch reinterpret_cast<void*>(&double_constants.the_hole_nan)); 1331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochExternalReference ExternalReference::address_of_uint32_bias() { 1335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ExternalReference( 1336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch reinterpret_cast<void*>(&double_constants.uint32_bias)); 1337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1340f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochExternalReference ExternalReference::address_of_float_abs_constant() { 1341f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return ExternalReference(reinterpret_cast<void*>(&float_absolute_constant)); 1342f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} 1343f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 1344f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 1345f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochExternalReference ExternalReference::address_of_float_neg_constant() { 1346f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return ExternalReference(reinterpret_cast<void*>(&float_negate_constant)); 1347f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} 1348f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 1349f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 1350f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochExternalReference ExternalReference::address_of_double_abs_constant() { 1351f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return ExternalReference(reinterpret_cast<void*>(&double_absolute_constant)); 1352f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} 1353f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 1354f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 1355f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochExternalReference ExternalReference::address_of_double_neg_constant() { 1356f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return ExternalReference(reinterpret_cast<void*>(&double_negate_constant)); 1357f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} 1358f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 1359f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 1360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochExternalReference ExternalReference::is_profiling_address(Isolate* isolate) { 136113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch return ExternalReference(isolate->is_profiling_address()); 1362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochExternalReference ExternalReference::invoke_function_callback( 1366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Isolate* isolate) { 1367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Address thunk_address = FUNCTION_ADDR(&InvokeFunctionCallback); 1368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ExternalReference::Type thunk_type = ExternalReference::PROFILING_API_CALL; 1369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ApiFunction thunk_fun(thunk_address); 1370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ExternalReference(&thunk_fun, thunk_type, isolate); 1371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochExternalReference ExternalReference::invoke_accessor_getter_callback( 1375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Isolate* isolate) { 1376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Address thunk_address = FUNCTION_ADDR(&InvokeAccessorGetterCallback); 1377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ExternalReference::Type thunk_type = 1378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ExternalReference::PROFILING_GETTER_CALL; 1379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ApiFunction thunk_fun(thunk_address); 1380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ExternalReference(&thunk_fun, thunk_type, isolate); 138144f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 138244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 138344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 13846ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#ifndef V8_INTERPRETED_REGEXP 1385a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 138644f0eee88ff00398ff7f715fab053374d808c90dSteve BlockExternalReference ExternalReference::re_check_stack_guard_state( 138744f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* isolate) { 1388a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Address function; 1389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#if V8_TARGET_ARCH_X64 1390a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block function = FUNCTION_ADDR(RegExpMacroAssemblerX64::CheckStackGuardState); 1391a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#elif V8_TARGET_ARCH_IA32 1392a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block function = FUNCTION_ADDR(RegExpMacroAssemblerIA32::CheckStackGuardState); 1393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#elif V8_TARGET_ARCH_ARM64 1394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch function = FUNCTION_ADDR(RegExpMacroAssemblerARM64::CheckStackGuardState); 1395a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#elif V8_TARGET_ARCH_ARM 1396a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block function = FUNCTION_ADDR(RegExpMacroAssemblerARM::CheckStackGuardState); 1397014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#elif V8_TARGET_ARCH_PPC 1398014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch function = FUNCTION_ADDR(RegExpMacroAssemblerPPC::CheckStackGuardState); 139944f0eee88ff00398ff7f715fab053374d808c90dSteve Block#elif V8_TARGET_ARCH_MIPS 140044f0eee88ff00398ff7f715fab053374d808c90dSteve Block function = FUNCTION_ADDR(RegExpMacroAssemblerMIPS::CheckStackGuardState); 1401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#elif V8_TARGET_ARCH_MIPS64 1402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch function = FUNCTION_ADDR(RegExpMacroAssemblerMIPS::CheckStackGuardState); 14033b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#elif V8_TARGET_ARCH_S390 14043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch function = FUNCTION_ADDR(RegExpMacroAssemblerS390::CheckStackGuardState); 1405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#elif V8_TARGET_ARCH_X87 1406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch function = FUNCTION_ADDR(RegExpMacroAssemblerX87::CheckStackGuardState); 1407a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#else 14084515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke UNREACHABLE(); 1409a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 141044f0eee88ff00398ff7f715fab053374d808c90dSteve Block return ExternalReference(Redirect(isolate, function)); 1411a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1412a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 141444f0eee88ff00398ff7f715fab053374d808c90dSteve BlockExternalReference ExternalReference::re_grow_stack(Isolate* isolate) { 1415a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return ExternalReference( 141644f0eee88ff00398ff7f715fab053374d808c90dSteve Block Redirect(isolate, FUNCTION_ADDR(NativeRegExpMacroAssembler::GrowStack))); 1417a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1418a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 141944f0eee88ff00398ff7f715fab053374d808c90dSteve BlockExternalReference ExternalReference::re_case_insensitive_compare_uc16( 142044f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* isolate) { 1421a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return ExternalReference(Redirect( 142244f0eee88ff00398ff7f715fab053374d808c90dSteve Block isolate, 1423a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block FUNCTION_ADDR(NativeRegExpMacroAssembler::CaseInsensitiveCompareUC16))); 1424a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1425a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1427e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon ClarkeExternalReference ExternalReference::re_word_character_map() { 1428e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke return ExternalReference( 1429e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke NativeRegExpMacroAssembler::word_character_map_address()); 1430e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke} 1431e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 143244f0eee88ff00398ff7f715fab053374d808c90dSteve BlockExternalReference ExternalReference::address_of_static_offsets_vector( 143344f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* isolate) { 143444f0eee88ff00398ff7f715fab053374d808c90dSteve Block return ExternalReference( 1435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch reinterpret_cast<Address>(isolate->jsregexp_static_offsets_vector())); 1436e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke} 1437e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 143844f0eee88ff00398ff7f715fab053374d808c90dSteve BlockExternalReference ExternalReference::address_of_regexp_stack_memory_address( 143944f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* isolate) { 144044f0eee88ff00398ff7f715fab053374d808c90dSteve Block return ExternalReference( 144144f0eee88ff00398ff7f715fab053374d808c90dSteve Block isolate->regexp_stack()->memory_address()); 1442e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke} 1443e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 144444f0eee88ff00398ff7f715fab053374d808c90dSteve BlockExternalReference ExternalReference::address_of_regexp_stack_memory_size( 144544f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* isolate) { 144644f0eee88ff00398ff7f715fab053374d808c90dSteve Block return ExternalReference(isolate->regexp_stack()->memory_size_address()); 1447e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke} 1448e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 14496ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#endif // V8_INTERPRETED_REGEXP 1450a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1451f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochExternalReference ExternalReference::ieee754_acos_function(Isolate* isolate) { 145213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch return ExternalReference( 1453f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Redirect(isolate, FUNCTION_ADDR(base::ieee754::acos), BUILTIN_FP_CALL)); 145413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch} 1455a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1456f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochExternalReference ExternalReference::ieee754_acosh_function(Isolate* isolate) { 145713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch return ExternalReference(Redirect( 1458f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch isolate, FUNCTION_ADDR(base::ieee754::acosh), BUILTIN_FP_FP_CALL)); 1459f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} 1460f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 1461f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochExternalReference ExternalReference::ieee754_asin_function(Isolate* isolate) { 1462f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return ExternalReference( 1463f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Redirect(isolate, FUNCTION_ADDR(base::ieee754::asin), BUILTIN_FP_CALL)); 1464f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} 1465f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 1466f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochExternalReference ExternalReference::ieee754_asinh_function(Isolate* isolate) { 1467f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return ExternalReference(Redirect( 1468f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch isolate, FUNCTION_ADDR(base::ieee754::asinh), BUILTIN_FP_FP_CALL)); 1469f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} 1470f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 1471f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochExternalReference ExternalReference::ieee754_atan_function(Isolate* isolate) { 1472f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return ExternalReference( 1473f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Redirect(isolate, FUNCTION_ADDR(base::ieee754::atan), BUILTIN_FP_CALL)); 147413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch} 147513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 147613e2dadd00298019ed862f2b2fc5068bba730bcfBen MurdochExternalReference ExternalReference::ieee754_atanh_function(Isolate* isolate) { 147713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch return ExternalReference(Redirect( 147813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch isolate, FUNCTION_ADDR(base::ieee754::atanh), BUILTIN_FP_FP_CALL)); 147913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch} 148013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 1481f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochExternalReference ExternalReference::ieee754_atan2_function(Isolate* isolate) { 1482f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return ExternalReference(Redirect( 1483f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch isolate, FUNCTION_ADDR(base::ieee754::atan2), BUILTIN_FP_FP_CALL)); 1484f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} 1485f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 148613e2dadd00298019ed862f2b2fc5068bba730bcfBen MurdochExternalReference ExternalReference::ieee754_cbrt_function(Isolate* isolate) { 148713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch return ExternalReference(Redirect(isolate, FUNCTION_ADDR(base::ieee754::cbrt), 148813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch BUILTIN_FP_FP_CALL)); 1489a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1490a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 149113e2dadd00298019ed862f2b2fc5068bba730bcfBen MurdochExternalReference ExternalReference::ieee754_cos_function(Isolate* isolate) { 149213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch return ExternalReference( 149313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Redirect(isolate, FUNCTION_ADDR(base::ieee754::cos), BUILTIN_FP_CALL)); 149413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch} 149513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 1496f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochExternalReference ExternalReference::ieee754_cosh_function(Isolate* isolate) { 1497f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return ExternalReference( 1498f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Redirect(isolate, FUNCTION_ADDR(base::ieee754::cosh), BUILTIN_FP_CALL)); 1499f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} 1500f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 150113e2dadd00298019ed862f2b2fc5068bba730bcfBen MurdochExternalReference ExternalReference::ieee754_exp_function(Isolate* isolate) { 150213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch return ExternalReference( 150313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Redirect(isolate, FUNCTION_ADDR(base::ieee754::exp), BUILTIN_FP_CALL)); 150413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch} 150513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 150613e2dadd00298019ed862f2b2fc5068bba730bcfBen MurdochExternalReference ExternalReference::ieee754_expm1_function(Isolate* isolate) { 150713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch return ExternalReference(Redirect( 150813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch isolate, FUNCTION_ADDR(base::ieee754::expm1), BUILTIN_FP_FP_CALL)); 150913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch} 151013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 151113e2dadd00298019ed862f2b2fc5068bba730bcfBen MurdochExternalReference ExternalReference::ieee754_log_function(Isolate* isolate) { 151213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch return ExternalReference( 151313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Redirect(isolate, FUNCTION_ADDR(base::ieee754::log), BUILTIN_FP_CALL)); 151413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch} 151513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 151613e2dadd00298019ed862f2b2fc5068bba730bcfBen MurdochExternalReference ExternalReference::ieee754_log1p_function(Isolate* isolate) { 151713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch return ExternalReference( 151813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Redirect(isolate, FUNCTION_ADDR(base::ieee754::log1p), BUILTIN_FP_CALL)); 151913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch} 1520a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 152113e2dadd00298019ed862f2b2fc5068bba730bcfBen MurdochExternalReference ExternalReference::ieee754_log10_function(Isolate* isolate) { 1522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ExternalReference( 152313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Redirect(isolate, FUNCTION_ADDR(base::ieee754::log10), BUILTIN_FP_CALL)); 1524a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1525a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 152613e2dadd00298019ed862f2b2fc5068bba730bcfBen MurdochExternalReference ExternalReference::ieee754_log2_function(Isolate* isolate) { 152713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch return ExternalReference( 152813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Redirect(isolate, FUNCTION_ADDR(base::ieee754::log2), BUILTIN_FP_CALL)); 152913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch} 1530a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 153113e2dadd00298019ed862f2b2fc5068bba730bcfBen MurdochExternalReference ExternalReference::ieee754_sin_function(Isolate* isolate) { 153213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch return ExternalReference( 153313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Redirect(isolate, FUNCTION_ADDR(base::ieee754::sin), BUILTIN_FP_CALL)); 1534e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch} 1535e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1536f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochExternalReference ExternalReference::ieee754_sinh_function(Isolate* isolate) { 1537f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return ExternalReference( 1538f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Redirect(isolate, FUNCTION_ADDR(base::ieee754::sinh), BUILTIN_FP_CALL)); 1539f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} 1540f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 154113e2dadd00298019ed862f2b2fc5068bba730bcfBen MurdochExternalReference ExternalReference::ieee754_tan_function(Isolate* isolate) { 154213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch return ExternalReference( 154313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Redirect(isolate, FUNCTION_ADDR(base::ieee754::tan), BUILTIN_FP_CALL)); 154413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch} 1545e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1546f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochExternalReference ExternalReference::ieee754_tanh_function(Isolate* isolate) { 1547f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return ExternalReference( 1548f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Redirect(isolate, FUNCTION_ADDR(base::ieee754::tanh), BUILTIN_FP_CALL)); 1549f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} 1550f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 1551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochExternalReference ExternalReference::page_flags(Page* page) { 1552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ExternalReference(reinterpret_cast<Address>(page) + 1553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MemoryChunk::kFlagsOffset); 1554e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch} 1555e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1556e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochExternalReference ExternalReference::ForDeoptEntry(Address entry) { 1558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ExternalReference(entry); 15593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 15603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 15613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochExternalReference ExternalReference::cpu_features() { 1563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(CpuFeatures::initialized_); 1564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ExternalReference(&CpuFeatures::supported_); 1565e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch} 1566e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 15673b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochExternalReference ExternalReference::is_tail_call_elimination_enabled_address( 15683b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Isolate* isolate) { 15693b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return ExternalReference(isolate->is_tail_call_elimination_enabled_address()); 15703b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 1571e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochExternalReference ExternalReference::debug_is_active_address( 157344f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* isolate) { 1574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ExternalReference(isolate->debug()->is_active_address()); 1575e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch} 1576e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1577e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochExternalReference ExternalReference::debug_after_break_target_address( 157944f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* isolate) { 1580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ExternalReference(isolate->debug()->after_break_target_address()); 1581e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch} 1582e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1583e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1584014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochExternalReference ExternalReference::runtime_function_table_address( 1585014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate) { 1586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ExternalReference( 1587014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch const_cast<Runtime::Function*>(Runtime::RuntimeFunctionTable(isolate))); 15883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 15893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 15903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1591014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochdouble power_helper(Isolate* isolate, double x, double y) { 1592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int y_int = static_cast<int>(y); 1593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (y == y_int) { 1594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return power_double_int(x, y_int); // Returns 1 if exponent is 0. 1595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (y == 0.5) { 1597014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch lazily_initialize_fast_sqrt(isolate); 1598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return (std::isinf(x)) ? V8_INFINITY 1599014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : fast_sqrt(x + 0.0, isolate); // Convert -0 to +0. 1600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (y == -0.5) { 1602014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch lazily_initialize_fast_sqrt(isolate); 1603014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return (std::isinf(x)) ? 0 : 1.0 / fast_sqrt(x + 0.0, 1604014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch isolate); // Convert -0 to +0. 1605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return power_double_double(x, y); 1607e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch} 1608e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1609e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1610b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// Helper function to compute x^y, where y is known to be an 1611b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// integer. Uses binary decomposition to limit the number of 1612b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// multiplications; see the discussion in "Hacker's Delight" by Henry 1613b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// S. Warren, Jr., figure 11-6, page 213. 1614b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochdouble power_double_int(double x, int y) { 1615b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch double m = (y < 0) ? 1 / x : x; 1616b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch unsigned n = (y < 0) ? -y : y; 1617b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch double p = 1; 1618b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch while (n != 0) { 1619b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if ((n & 1) != 0) p *= m; 1620b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch m *= m; 1621b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if ((n & 2) != 0) p *= m; 1622b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch m *= m; 1623b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch n >>= 2; 1624b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1625b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return p; 1626b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1627b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1628b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1629b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochdouble power_double_double(double x, double y) { 16303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // The checks for special cases can be dropped in ia32 because it has already 16313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // been done in generated code before bailing out here. 1632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (std::isnan(y) || ((x == 1 || x == -1) && std::isinf(y))) { 1633014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return std::numeric_limits<double>::quiet_NaN(); 1634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 16353b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return Pow(x, y); 1636b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1637b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1638b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 163944f0eee88ff00398ff7f715fab053374d808c90dSteve BlockExternalReference ExternalReference::power_double_double_function( 164044f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* isolate) { 164144f0eee88ff00398ff7f715fab053374d808c90dSteve Block return ExternalReference(Redirect(isolate, 164244f0eee88ff00398ff7f715fab053374d808c90dSteve Block FUNCTION_ADDR(power_double_double), 1643257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch BUILTIN_FP_FP_CALL)); 1644b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1645b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1646b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochExternalReference ExternalReference::mod_two_doubles_operation( 1648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Isolate* isolate) { 164944f0eee88ff00398ff7f715fab053374d808c90dSteve Block return ExternalReference(Redirect(isolate, 1650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FUNCTION_ADDR(modulo), 1651257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch BUILTIN_FP_FP_CALL)); 1652a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1653a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 165413e2dadd00298019ed862f2b2fc5068bba730bcfBen MurdochExternalReference ExternalReference::debug_last_step_action_address( 1655014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate) { 165613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch return ExternalReference(isolate->debug()->last_step_action_address()); 1657a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1658a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 165913e2dadd00298019ed862f2b2fc5068bba730bcfBen MurdochExternalReference ExternalReference::debug_suspended_generator_address( 166013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Isolate* isolate) { 166113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch return ExternalReference(isolate->debug()->suspended_generator_address()); 166213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch} 1663a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1664014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochExternalReference ExternalReference::fixed_typed_array_base_data_offset() { 1665014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return ExternalReference(reinterpret_cast<void*>( 1666014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FixedTypedArrayBase::kDataOffset - kHeapObjectTag)); 1667a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1668a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 16693e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu 1670958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierbool operator==(ExternalReference lhs, ExternalReference rhs) { 1671958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return lhs.address() == rhs.address(); 1672958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 1673958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1674958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1675958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierbool operator!=(ExternalReference lhs, ExternalReference rhs) { 1676958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return !(lhs == rhs); 1677958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 1678958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1679958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1680958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniersize_t hash_value(ExternalReference reference) { 1681958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return base::hash<Address>()(reference.address()); 1682958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 1683958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1684958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1685958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstd::ostream& operator<<(std::ostream& os, ExternalReference reference) { 1686958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier os << static_cast<const void*>(reference.address()); 1687958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier const Runtime::Function* fn = Runtime::FunctionForEntry(reference.address()); 1688958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (fn) os << "<" << fn->name << ".entry>"; 1689958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return os; 1690958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 1691958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1692014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1693014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochConstantPoolBuilder::ConstantPoolBuilder(int ptr_reach_bits, 1694014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int double_reach_bits) { 1695014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch info_[ConstantPoolEntry::INTPTR].entries.reserve(64); 1696014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch info_[ConstantPoolEntry::INTPTR].regular_reach_bits = ptr_reach_bits; 1697014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch info_[ConstantPoolEntry::DOUBLE].regular_reach_bits = double_reach_bits; 1698014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 1699014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1700014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1701014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochConstantPoolEntry::Access ConstantPoolBuilder::NextAccess( 1702014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ConstantPoolEntry::Type type) const { 1703014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch const PerTypeEntryInfo& info = info_[type]; 1704014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1705014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (info.overflow()) return ConstantPoolEntry::OVERFLOWED; 1706014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1707014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int dbl_count = info_[ConstantPoolEntry::DOUBLE].regular_count; 1708014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int dbl_offset = dbl_count * kDoubleSize; 1709014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int ptr_count = info_[ConstantPoolEntry::INTPTR].regular_count; 1710014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int ptr_offset = ptr_count * kPointerSize + dbl_offset; 1711014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1712014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (type == ConstantPoolEntry::DOUBLE) { 1713014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Double overflow detection must take into account the reach for both types 1714014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int ptr_reach_bits = info_[ConstantPoolEntry::INTPTR].regular_reach_bits; 1715014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!is_uintn(dbl_offset, info.regular_reach_bits) || 1716014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch (ptr_count > 0 && 1717014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch !is_uintn(ptr_offset + kDoubleSize - kPointerSize, ptr_reach_bits))) { 1718014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return ConstantPoolEntry::OVERFLOWED; 1719014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1720014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 1721014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(type == ConstantPoolEntry::INTPTR); 1722014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!is_uintn(ptr_offset, info.regular_reach_bits)) { 1723014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return ConstantPoolEntry::OVERFLOWED; 1724014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1725014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1726014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1727014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return ConstantPoolEntry::REGULAR; 1728014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 1729014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1730014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1731014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochConstantPoolEntry::Access ConstantPoolBuilder::AddEntry( 1732014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ConstantPoolEntry& entry, ConstantPoolEntry::Type type) { 1733014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(!emitted_label_.is_bound()); 1734014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PerTypeEntryInfo& info = info_[type]; 1735014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch const int entry_size = ConstantPoolEntry::size(type); 1736014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool merged = false; 1737014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1738014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (entry.sharing_ok()) { 1739014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Try to merge entries 1740014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch std::vector<ConstantPoolEntry>::iterator it = info.shared_entries.begin(); 1741014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int end = static_cast<int>(info.shared_entries.size()); 1742014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (int i = 0; i < end; i++, it++) { 1743014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if ((entry_size == kPointerSize) ? entry.value() == it->value() 1744014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : entry.value64() == it->value64()) { 1745014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Merge with found entry. 1746014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch entry.set_merged_index(i); 1747014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch merged = true; 1748014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch break; 1749014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1750014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1751014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1752014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1753014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // By definition, merged entries have regular access. 1754014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(!merged || entry.merged_index() < info.regular_count); 1755014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ConstantPoolEntry::Access access = 1756014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch (merged ? ConstantPoolEntry::REGULAR : NextAccess(type)); 1757014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1758014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Enforce an upper bound on search time by limiting the search to 1759014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // unique sharable entries which fit in the regular section. 1760014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (entry.sharing_ok() && !merged && access == ConstantPoolEntry::REGULAR) { 1761014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch info.shared_entries.push_back(entry); 1762014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 1763014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch info.entries.push_back(entry); 1764014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1765014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1766014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // We're done if we found a match or have already triggered the 1767014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // overflow state. 1768014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (merged || info.overflow()) return access; 1769014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1770014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (access == ConstantPoolEntry::REGULAR) { 1771014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch info.regular_count++; 1772014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 1773014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch info.overflow_start = static_cast<int>(info.entries.size()) - 1; 1774014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1775014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1776014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return access; 1777014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 1778014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1779014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1780014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid ConstantPoolBuilder::EmitSharedEntries(Assembler* assm, 1781014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ConstantPoolEntry::Type type) { 1782014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PerTypeEntryInfo& info = info_[type]; 1783014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch std::vector<ConstantPoolEntry>& shared_entries = info.shared_entries; 1784014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch const int entry_size = ConstantPoolEntry::size(type); 1785014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int base = emitted_label_.pos(); 1786014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(base > 0); 1787014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int shared_end = static_cast<int>(shared_entries.size()); 1788014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch std::vector<ConstantPoolEntry>::iterator shared_it = shared_entries.begin(); 1789014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (int i = 0; i < shared_end; i++, shared_it++) { 1790014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int offset = assm->pc_offset() - base; 1791014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch shared_it->set_offset(offset); // Save offset for merged entries. 1792014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (entry_size == kPointerSize) { 1793014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch assm->dp(shared_it->value()); 1794014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 1795014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch assm->dq(shared_it->value64()); 1796014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1797014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(is_uintn(offset, info.regular_reach_bits)); 1798014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1799014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Patch load sequence with correct offset. 1800014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch assm->PatchConstantPoolAccessInstruction(shared_it->position(), offset, 1801014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ConstantPoolEntry::REGULAR, type); 1802014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1803014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 1804014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1805014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1806014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid ConstantPoolBuilder::EmitGroup(Assembler* assm, 1807014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ConstantPoolEntry::Access access, 1808014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ConstantPoolEntry::Type type) { 1809014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PerTypeEntryInfo& info = info_[type]; 1810014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch const bool overflow = info.overflow(); 1811014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch std::vector<ConstantPoolEntry>& entries = info.entries; 1812014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch std::vector<ConstantPoolEntry>& shared_entries = info.shared_entries; 1813014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch const int entry_size = ConstantPoolEntry::size(type); 1814014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int base = emitted_label_.pos(); 1815014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(base > 0); 1816014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int begin; 1817014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int end; 1818014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1819014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (access == ConstantPoolEntry::REGULAR) { 1820014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Emit any shared entries first 1821014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch EmitSharedEntries(assm, type); 1822014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1823014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1824014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (access == ConstantPoolEntry::REGULAR) { 1825014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch begin = 0; 1826014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch end = overflow ? info.overflow_start : static_cast<int>(entries.size()); 1827014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 1828014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(access == ConstantPoolEntry::OVERFLOWED); 1829014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!overflow) return; 1830014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch begin = info.overflow_start; 1831014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch end = static_cast<int>(entries.size()); 1832014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1833014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1834014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch std::vector<ConstantPoolEntry>::iterator it = entries.begin(); 1835014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (begin > 0) std::advance(it, begin); 1836014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (int i = begin; i < end; i++, it++) { 1837014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Update constant pool if necessary and get the entry's offset. 1838014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int offset; 1839014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ConstantPoolEntry::Access entry_access; 1840014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!it->is_merged()) { 1841014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Emit new entry 1842014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch offset = assm->pc_offset() - base; 1843014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch entry_access = access; 1844014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (entry_size == kPointerSize) { 1845014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch assm->dp(it->value()); 1846014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 1847014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch assm->dq(it->value64()); 1848014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1849014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 1850014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Retrieve offset from shared entry. 1851014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch offset = shared_entries[it->merged_index()].offset(); 1852014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch entry_access = ConstantPoolEntry::REGULAR; 1853014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1854014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1855014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(entry_access == ConstantPoolEntry::OVERFLOWED || 1856014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch is_uintn(offset, info.regular_reach_bits)); 1857014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1858014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Patch load sequence with correct offset. 1859014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch assm->PatchConstantPoolAccessInstruction(it->position(), offset, 1860014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch entry_access, type); 1861014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1862014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 1863014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1864014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1865014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Emit and return position of pool. Zero implies no constant pool. 1866014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint ConstantPoolBuilder::Emit(Assembler* assm) { 1867014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool emitted = emitted_label_.is_bound(); 1868014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool empty = IsEmpty(); 1869014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1870014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!emitted) { 1871014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Mark start of constant pool. Align if necessary. 1872014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!empty) assm->DataAlign(kDoubleSize); 1873014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch assm->bind(&emitted_label_); 1874014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!empty) { 1875014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Emit in groups based on access and type. 1876014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Emit doubles first for alignment purposes. 1877014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch EmitGroup(assm, ConstantPoolEntry::REGULAR, ConstantPoolEntry::DOUBLE); 1878014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch EmitGroup(assm, ConstantPoolEntry::REGULAR, ConstantPoolEntry::INTPTR); 1879014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (info_[ConstantPoolEntry::DOUBLE].overflow()) { 1880014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch assm->DataAlign(kDoubleSize); 1881014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch EmitGroup(assm, ConstantPoolEntry::OVERFLOWED, 1882014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ConstantPoolEntry::DOUBLE); 1883014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1884014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (info_[ConstantPoolEntry::INTPTR].overflow()) { 1885014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch EmitGroup(assm, ConstantPoolEntry::OVERFLOWED, 1886014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ConstantPoolEntry::INTPTR); 1887014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1888014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1889014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1890014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1891014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return !empty ? emitted_label_.pos() : 0; 1892014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 1893014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1894014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1895014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Platform specific but identical code for all the platforms. 1896014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1897c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochvoid Assembler::RecordDeoptReason(DeoptimizeReason reason, 1898c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch SourcePosition position, int id) { 189913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch if (FLAG_trace_deopt || isolate()->is_profiling()) { 1900014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch EnsureSpace ensure_space(this); 1901c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch RecordRelocInfo(RelocInfo::DEOPT_SCRIPT_OFFSET, position.ScriptOffset()); 1902c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch RecordRelocInfo(RelocInfo::DEOPT_INLINING_ID, position.InliningId()); 1903f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch RecordRelocInfo(RelocInfo::DEOPT_REASON, static_cast<int>(reason)); 1904bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch RecordRelocInfo(RelocInfo::DEOPT_ID, id); 1905014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1906014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 1907014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1908014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1909014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::RecordComment(const char* msg) { 1910014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (FLAG_code_comments) { 1911014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch EnsureSpace ensure_space(this); 1912014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RecordRelocInfo(RelocInfo::COMMENT, reinterpret_cast<intptr_t>(msg)); 1913014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1914014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 1915014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1916014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1917014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::RecordGeneratorContinuation() { 1918014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch EnsureSpace ensure_space(this); 1919014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RecordRelocInfo(RelocInfo::GENERATOR_CONTINUATION); 1920014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 1921014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1922014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1923014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::RecordDebugBreakSlot(RelocInfo::Mode mode) { 1924014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch EnsureSpace ensure_space(this); 1925014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(RelocInfo::IsDebugBreakSlot(mode)); 1926014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RecordRelocInfo(mode); 1927014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 1928014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1929014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1930014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::DataAlign(int m) { 1931014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(m >= 2 && base::bits::IsPowerOfTwo32(m)); 1932014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch while ((pc_offset() & (m - 1)) != 0) { 1933014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch db(0); 1934014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1935014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 1936014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace internal 1937014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace v8 1938