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