19a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Copyright (c) 1994-2006 Sun Microsystems Inc.
29a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// All Rights Reserved.
39a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//
443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Redistribution and use in source and binary forms, with or without
59a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// modification, are permitted provided that the following conditions
69a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// are met:
79a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//
89a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// - Redistributions of source code must retain the above copyright notice,
99a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// this list of conditions and the following disclaimer.
1043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//
119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// - Redistribution in binary form must reproduce the above copyright
129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// notice, this list of conditions and the following disclaimer in the
139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// documentation and/or other materials provided with the
149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// distribution.
159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//
169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// - Neither the name of Sun Microsystems or the names of contributors may
179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// be used to endorse or promote products derived from this software without
189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// specific prior written permission.
1943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//
2043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
289a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
309a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// OF THE POSSIBILITY OF SUCH DAMAGE.
329a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
33b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// The original source code covered by the above license above has been
34b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// modified significantly by Google Inc.
35f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com// Copyright 2012 the V8 project authors. All rights reserved.
3643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// A light-weight ARM Assembler
3843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Generates user mode instructions for the ARM architecture up to version 5
3943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
405ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org#ifndef V8_ARM_ASSEMBLER_ARM_H_
415ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org#define V8_ARM_ASSEMBLER_ARM_H_
4218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#include <stdio.h>
4343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "assembler.h"
44378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org#include "constants-arm.h"
45c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org#include "serialize.h"
4643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace v8 {
4871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace internal {
4943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
50003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org// CpuFeatures keeps track of which features are supported by the target CPU.
51750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// Supported features must be enabled by a CpuFeatureScope before use.
52003650ee766f5e92756d470a37973fd371757485yangguo@chromium.orgclass CpuFeatures : public AllStatic {
53003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org public:
54003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  // Detect features of the target CPU. Set safe defaults if the serializer
55003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  // is enabled (snapshots must be portable).
56003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  static void Probe();
57003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org
58e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  // Display target use when compiling.
59e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  static void PrintTarget();
60e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
61e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  // Display features.
62e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  static void PrintFeatures();
63e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
64003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  // Check whether a feature is supported by the target CPU.
65003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  static bool IsSupported(CpuFeature f) {
66003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org    ASSERT(initialized_);
67003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org    return (supported_ & (1u << f)) != 0;
68003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  }
69003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org
70750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  static bool IsFoundByRuntimeProbingOnly(CpuFeature f) {
71003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org    ASSERT(initialized_);
72750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    return (found_by_runtime_probing_only_ &
73750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org            (static_cast<uint64_t>(1) << f)) != 0;
74003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  }
75003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org
76750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  static bool IsSafeForSnapshot(CpuFeature f) {
77750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    return (IsSupported(f) &&
78750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org            (!Serializer::enabled() || !IsFoundByRuntimeProbingOnly(f)));
79750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  }
80003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org
81169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  static unsigned cache_line_size() { return cache_line_size_; }
82169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org
83003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org private:
84003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org#ifdef DEBUG
85003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  static bool initialized_;
86003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org#endif
87003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  static unsigned supported_;
88750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  static unsigned found_by_runtime_probing_only_;
89169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  static unsigned cache_line_size_;
90003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org
91003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  friend class ExternalReference;
92003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  DISALLOW_COPY_AND_ASSIGN(CpuFeatures);
93003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org};
94003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org
95003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org
9643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// CPU Registers.
9743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//
9843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// 1) We would prefer to use an enum, but enum values are assignment-
9943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// compatible with int, which has caused code-generation bugs.
10043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//
10143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// 2) We would prefer to use a class instead of a struct but we don't like
10243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// the register initialization to depend on the particular initialization
10343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// order (which appears to be different on OS X, Linux, and Windows for the
10443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// installed versions of C++ we tried). Using a struct permits C-style
10543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// "initialization". Also, the Register objects cannot be const as this
10643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// forces initialization stubs in MSVC, making us dependent on initialization
10743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// order.
10843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//
10943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// 3) By not using an enum, we are possibly preventing the compiler from
11043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// doing certain constant folds, which may significantly reduce the
11143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// code generated for some assembly instructions (because they boil down
11243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// to a few constants). If this is a problem, we could change the code
11343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// such that we use an enum in optimized mode, and the struct in debug
11443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// mode. This way we get the compile-time error checking in debug mode
11543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// and best performance in optimized code.
1165d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org
11743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Core register
11843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenstruct Register {
119a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  static const int kNumRegisters = 16;
120a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  static const int kMaxNumAllocatableRegisters = 8;
1213847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com  static const int kSizeInBytes = 4;
122a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org
123a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  inline static int NumAllocatableRegisters();
124a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
125a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  static int ToAllocationIndex(Register reg) {
126a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org    ASSERT(reg.code() < kMaxNumAllocatableRegisters);
127a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    return reg.code();
128a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
129a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
130a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  static Register FromAllocationIndex(int index) {
131a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org    ASSERT(index >= 0 && index < kMaxNumAllocatableRegisters);
132a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    return from_code(index);
133a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
134a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
135a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  static const char* AllocationIndexToString(int index) {
136a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org    ASSERT(index >= 0 && index < kMaxNumAllocatableRegisters);
137a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    const char* const names[] = {
138a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      "r0",
139a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      "r1",
140a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      "r2",
141a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      "r3",
142a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      "r4",
143a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      "r5",
144a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      "r6",
145a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      "r7",
146a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    };
147a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    return names[index];
148a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
149a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
150a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  static Register from_code(int code) {
151a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    Register r = { code };
152a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    return r;
153a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
154a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
155a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  bool is_valid() const { return 0 <= code_ && code_ < kNumRegisters; }
1564a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  bool is(Register reg) const { return code_ == reg.code_; }
1574a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  int code() const {
15843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    ASSERT(is_valid());
15943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return code_;
16043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
1614a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  int bit() const {
16243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    ASSERT(is_valid());
16343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return 1 << code_;
16443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
16543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1669dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  void set_code(int code) {
1679dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com    code_ = code;
1689dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com    ASSERT(is_valid());
1699dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  }
1709dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com
1715c838251403b0be9a882540f1922577abba4c872ager@chromium.org  // Unfortunately we can't make this private in a struct.
17243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  int code_;
17343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
17443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1751456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org// These constants are used in several locations, including static initializers
1761456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.orgconst int kRegister_no_reg_Code = -1;
1771456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.orgconst int kRegister_r0_Code = 0;
1781456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.orgconst int kRegister_r1_Code = 1;
1791456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.orgconst int kRegister_r2_Code = 2;
1801456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.orgconst int kRegister_r3_Code = 3;
1811456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.orgconst int kRegister_r4_Code = 4;
1821456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.orgconst int kRegister_r5_Code = 5;
1831456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.orgconst int kRegister_r6_Code = 6;
1841456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.orgconst int kRegister_r7_Code = 7;
1851456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.orgconst int kRegister_r8_Code = 8;
1861456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.orgconst int kRegister_r9_Code = 9;
1871456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.orgconst int kRegister_r10_Code = 10;
1881456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.orgconst int kRegister_fp_Code = 11;
1891456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.orgconst int kRegister_ip_Code = 12;
1901456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.orgconst int kRegister_sp_Code = 13;
1911456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.orgconst int kRegister_lr_Code = 14;
1921456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.orgconst int kRegister_pc_Code = 15;
1931456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org
1941456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.orgconst Register no_reg = { kRegister_no_reg_Code };
1951456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org
1961456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.orgconst Register r0  = { kRegister_r0_Code };
1971456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.orgconst Register r1  = { kRegister_r1_Code };
1981456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.orgconst Register r2  = { kRegister_r2_Code };
1991456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.orgconst Register r3  = { kRegister_r3_Code };
2001456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.orgconst Register r4  = { kRegister_r4_Code };
2011456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.orgconst Register r5  = { kRegister_r5_Code };
2021456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.orgconst Register r6  = { kRegister_r6_Code };
2031456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.orgconst Register r7  = { kRegister_r7_Code };
2041456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org// Used as context register.
2051456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.orgconst Register r8  = { kRegister_r8_Code };
2061456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org// Used as lithium codegen scratch register.
2071456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.orgconst Register r9  = { kRegister_r9_Code };
2081456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org// Used as roots register.
2091456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.orgconst Register r10 = { kRegister_r10_Code };
2101456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.orgconst Register fp  = { kRegister_fp_Code };
2111456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.orgconst Register ip  = { kRegister_ip_Code };
2121456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.orgconst Register sp  = { kRegister_sp_Code };
2131456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.orgconst Register lr  = { kRegister_lr_Code };
2141456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.orgconst Register pc  = { kRegister_pc_Code };
2151456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org
21613bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org// Single word VFP register.
21713bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.orgstruct SwVfpRegister {
218e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  static const int kSizeInBytes = 4;
2194a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  bool is_valid() const { return 0 <= code_ && code_ < 32; }
2204a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  bool is(SwVfpRegister reg) const { return code_ == reg.code_; }
2214a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  int code() const {
22213bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org    ASSERT(is_valid());
22313bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org    return code_;
22413bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org  }
2254a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  int bit() const {
22613bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org    ASSERT(is_valid());
22713bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org    return 1 << code_;
22813bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org  }
2294a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  void split_code(int* vm, int* m) const {
230d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org    ASSERT(is_valid());
231d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org    *m = code_ & 0x1;
232d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org    *vm = code_ >> 1;
233d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org  }
23413bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org
23513bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org  int code_;
23613bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org};
23713bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org
23813bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org
23913bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org// Double word VFP register.
24013bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.orgstruct DwVfpRegister {
24194b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org  static const int kMaxNumRegisters = 32;
2423cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org  // A few double registers are reserved: one as a scratch register and one to
2433cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org  // hold 0.0, that does not fit in the immediate field of vmov instructions.
2443cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org  //  d14: 0.0
2453cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org  //  d15: scratch register.
2463cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org  static const int kNumReservedRegisters = 2;
24794b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org  static const int kMaxNumAllocatableRegisters = kMaxNumRegisters -
2483cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org      kNumReservedRegisters;
249e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  static const int kSizeInBytes = 8;
250a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
251003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  // Note: the number of registers can be different at snapshot and run-time.
252003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  // Any code included in the snapshot must be able to run both with 16 or 32
253003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  // registers.
254a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  inline static int NumRegisters();
255a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  inline static int NumAllocatableRegisters();
256003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org
257f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  inline static int ToAllocationIndex(DwVfpRegister reg);
258a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  static const char* AllocationIndexToString(int index);
259003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  inline static DwVfpRegister FromAllocationIndex(int index);
260a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
261a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  static DwVfpRegister from_code(int code) {
262a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    DwVfpRegister r = { code };
263a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    return r;
264a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
265a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
266003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  bool is_valid() const {
26794b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org    return 0 <= code_ && code_ < kMaxNumRegisters;
268003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  }
2694a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  bool is(DwVfpRegister reg) const { return code_ == reg.code_; }
2704a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  int code() const {
27113bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org    ASSERT(is_valid());
27213bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org    return code_;
27313bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org  }
2744a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  int bit() const {
27513bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org    ASSERT(is_valid());
27613bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org    return 1 << code_;
27713bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org  }
2784a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  void split_code(int* vm, int* m) const {
279d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org    ASSERT(is_valid());
280d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org    *m = (code_ & 0x10) >> 4;
281d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org    *vm = code_ & 0x0F;
282d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org  }
28313bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org
28413bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org  int code_;
28513bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org};
28613bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org
28713bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org
288a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgtypedef DwVfpRegister DoubleRegister;
289a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
290a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
291fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org// Double word VFP register d0-15.
292fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgstruct LowDwVfpRegister {
293fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org public:
294fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  static const int kMaxNumLowRegisters = 16;
295fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  operator DwVfpRegister() const {
296fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    DwVfpRegister r = { code_ };
297fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    return r;
298fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  }
299fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  static LowDwVfpRegister from_code(int code) {
300fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    LowDwVfpRegister r = { code };
301fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    return r;
302fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  }
303fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
304fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  bool is_valid() const {
305fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    return 0 <= code_ && code_ < kMaxNumLowRegisters;
306fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  }
307fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  bool is(DwVfpRegister reg) const { return code_ == reg.code_; }
308fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  bool is(LowDwVfpRegister reg) const { return code_ == reg.code_; }
309fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  int code() const {
310fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    ASSERT(is_valid());
311fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    return code_;
312fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  }
313fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  SwVfpRegister low() const {
314fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    SwVfpRegister reg;
315fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    reg.code_ = code_ * 2;
316fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
317fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    ASSERT(reg.is_valid());
318fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    return reg;
319fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  }
320fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  SwVfpRegister high() const {
321fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    SwVfpRegister reg;
322fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    reg.code_ = (code_ * 2) + 1;
323fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
324fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    ASSERT(reg.is_valid());
325fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    return reg;
326fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  }
327fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
328fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  int code_;
329fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org};
330fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
331fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
332169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org// Quad word NEON register.
333169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.orgstruct QwNeonRegister {
334169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  static const int kMaxNumRegisters = 16;
335169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org
336169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  static QwNeonRegister from_code(int code) {
337169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org    QwNeonRegister r = { code };
338169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org    return r;
339169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  }
340169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org
341169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  bool is_valid() const {
342169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org    return (0 <= code_) && (code_ < kMaxNumRegisters);
343169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  }
344169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  bool is(QwNeonRegister reg) const { return code_ == reg.code_; }
345169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  int code() const {
346169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org    ASSERT(is_valid());
347169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org    return code_;
348169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  }
349169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  void split_code(int* vm, int* m) const {
350169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org    ASSERT(is_valid());
351169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org    *m = (code_ & 0x10) >> 4;
352169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org    *vm = code_ & 0x0F;
353169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  }
354169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org
355169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  int code_;
356169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org};
357169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org
358169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org
359169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.orgtypedef QwNeonRegister QuadRegister;
360169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org
361169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org
362ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// Support for the VFP registers s0 to s31 (d0 to d15).
36313bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org// Note that "s(N):s(N+1)" is the same as "d(N/2)".
364ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgconst SwVfpRegister s0  = {  0 };
365ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgconst SwVfpRegister s1  = {  1 };
366ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgconst SwVfpRegister s2  = {  2 };
367ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgconst SwVfpRegister s3  = {  3 };
368ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgconst SwVfpRegister s4  = {  4 };
369ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgconst SwVfpRegister s5  = {  5 };
370ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgconst SwVfpRegister s6  = {  6 };
371ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgconst SwVfpRegister s7  = {  7 };
372ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgconst SwVfpRegister s8  = {  8 };
373ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgconst SwVfpRegister s9  = {  9 };
374ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgconst SwVfpRegister s10 = { 10 };
375ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgconst SwVfpRegister s11 = { 11 };
376ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgconst SwVfpRegister s12 = { 12 };
377ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgconst SwVfpRegister s13 = { 13 };
378ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgconst SwVfpRegister s14 = { 14 };
379ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgconst SwVfpRegister s15 = { 15 };
380ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgconst SwVfpRegister s16 = { 16 };
381ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgconst SwVfpRegister s17 = { 17 };
382ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgconst SwVfpRegister s18 = { 18 };
383ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgconst SwVfpRegister s19 = { 19 };
384ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgconst SwVfpRegister s20 = { 20 };
385ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgconst SwVfpRegister s21 = { 21 };
386ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgconst SwVfpRegister s22 = { 22 };
387ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgconst SwVfpRegister s23 = { 23 };
388ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgconst SwVfpRegister s24 = { 24 };
389ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgconst SwVfpRegister s25 = { 25 };
390ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgconst SwVfpRegister s26 = { 26 };
391ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgconst SwVfpRegister s27 = { 27 };
392ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgconst SwVfpRegister s28 = { 28 };
393ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgconst SwVfpRegister s29 = { 29 };
394ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgconst SwVfpRegister s30 = { 30 };
395ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgconst SwVfpRegister s31 = { 31 };
396ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
3979ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.orgconst DwVfpRegister no_dreg = { -1 };
398fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgconst LowDwVfpRegister d0 = { 0 };
399fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgconst LowDwVfpRegister d1 = { 1 };
400fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgconst LowDwVfpRegister d2 = { 2 };
401fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgconst LowDwVfpRegister d3 = { 3 };
402fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgconst LowDwVfpRegister d4 = { 4 };
403fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgconst LowDwVfpRegister d5 = { 5 };
404fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgconst LowDwVfpRegister d6 = { 6 };
405fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgconst LowDwVfpRegister d7 = { 7 };
406fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgconst LowDwVfpRegister d8 = { 8 };
407fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgconst LowDwVfpRegister d9 = { 9 };
408fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgconst LowDwVfpRegister d10 = { 10 };
409fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgconst LowDwVfpRegister d11 = { 11 };
410fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgconst LowDwVfpRegister d12 = { 12 };
411fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgconst LowDwVfpRegister d13 = { 13 };
412fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgconst LowDwVfpRegister d14 = { 14 };
413fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgconst LowDwVfpRegister d15 = { 15 };
414003650ee766f5e92756d470a37973fd371757485yangguo@chromium.orgconst DwVfpRegister d16 = { 16 };
415003650ee766f5e92756d470a37973fd371757485yangguo@chromium.orgconst DwVfpRegister d17 = { 17 };
416003650ee766f5e92756d470a37973fd371757485yangguo@chromium.orgconst DwVfpRegister d18 = { 18 };
417003650ee766f5e92756d470a37973fd371757485yangguo@chromium.orgconst DwVfpRegister d19 = { 19 };
418003650ee766f5e92756d470a37973fd371757485yangguo@chromium.orgconst DwVfpRegister d20 = { 20 };
419003650ee766f5e92756d470a37973fd371757485yangguo@chromium.orgconst DwVfpRegister d21 = { 21 };
420003650ee766f5e92756d470a37973fd371757485yangguo@chromium.orgconst DwVfpRegister d22 = { 22 };
421003650ee766f5e92756d470a37973fd371757485yangguo@chromium.orgconst DwVfpRegister d23 = { 23 };
422003650ee766f5e92756d470a37973fd371757485yangguo@chromium.orgconst DwVfpRegister d24 = { 24 };
423003650ee766f5e92756d470a37973fd371757485yangguo@chromium.orgconst DwVfpRegister d25 = { 25 };
424003650ee766f5e92756d470a37973fd371757485yangguo@chromium.orgconst DwVfpRegister d26 = { 26 };
425003650ee766f5e92756d470a37973fd371757485yangguo@chromium.orgconst DwVfpRegister d27 = { 27 };
426003650ee766f5e92756d470a37973fd371757485yangguo@chromium.orgconst DwVfpRegister d28 = { 28 };
427003650ee766f5e92756d470a37973fd371757485yangguo@chromium.orgconst DwVfpRegister d29 = { 29 };
428003650ee766f5e92756d470a37973fd371757485yangguo@chromium.orgconst DwVfpRegister d30 = { 30 };
429003650ee766f5e92756d470a37973fd371757485yangguo@chromium.orgconst DwVfpRegister d31 = { 31 };
43013bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org
431169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.orgconst QwNeonRegister q0  = {  0 };
432169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.orgconst QwNeonRegister q1  = {  1 };
433169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.orgconst QwNeonRegister q2  = {  2 };
434169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.orgconst QwNeonRegister q3  = {  3 };
435169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.orgconst QwNeonRegister q4  = {  4 };
436169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.orgconst QwNeonRegister q5  = {  5 };
437169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.orgconst QwNeonRegister q6  = {  6 };
438169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.orgconst QwNeonRegister q7  = {  7 };
439169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.orgconst QwNeonRegister q8  = {  8 };
440169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.orgconst QwNeonRegister q9  = {  9 };
441169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.orgconst QwNeonRegister q10 = { 10 };
442169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.orgconst QwNeonRegister q11 = { 11 };
443169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.orgconst QwNeonRegister q12 = { 12 };
444169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.orgconst QwNeonRegister q13 = { 13 };
445169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.orgconst QwNeonRegister q14 = { 14 };
446169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.orgconst QwNeonRegister q15 = { 15 };
447169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org
448fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
449659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org// Aliases for double registers.  Defined using #define instead of
450659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org// "static const DwVfpRegister&" because Clang complains otherwise when a
451659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org// compilation unit that includes this header doesn't use the variables.
452659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org#define kFirstCalleeSavedDoubleReg d8
453659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org#define kLastCalleeSavedDoubleReg d15
454659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org#define kDoubleRegZero d14
455659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org#define kScratchDoubleReg d15
456ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org
45743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
45843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Coprocessor register
45943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenstruct CRegister {
4604a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  bool is_valid() const { return 0 <= code_ && code_ < 16; }
4614a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  bool is(CRegister creg) const { return code_ == creg.code_; }
4624a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  int code() const {
46343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    ASSERT(is_valid());
46443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return code_;
46543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
4664a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  int bit() const {
46743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    ASSERT(is_valid());
46843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return 1 << code_;
46943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
47043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4715c838251403b0be9a882540f1922577abba4c872ager@chromium.org  // Unfortunately we can't make this private in a struct.
47243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  int code_;
47343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
47443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
47543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
476ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgconst CRegister no_creg = { -1 };
477ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
478ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgconst CRegister cr0  = {  0 };
479ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgconst CRegister cr1  = {  1 };
480ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgconst CRegister cr2  = {  2 };
481ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgconst CRegister cr3  = {  3 };
482ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgconst CRegister cr4  = {  4 };
483ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgconst CRegister cr5  = {  5 };
484ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgconst CRegister cr6  = {  6 };
485ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgconst CRegister cr7  = {  7 };
486ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgconst CRegister cr8  = {  8 };
487ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgconst CRegister cr9  = {  9 };
488ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgconst CRegister cr10 = { 10 };
489ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgconst CRegister cr11 = { 11 };
490ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgconst CRegister cr12 = { 12 };
491ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgconst CRegister cr13 = { 13 };
492ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgconst CRegister cr14 = { 14 };
493ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgconst CRegister cr15 = { 15 };
49443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
49543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
49643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Coprocessor number
49743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenenum Coprocessor {
49843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  p0  = 0,
49943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  p1  = 1,
50043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  p2  = 2,
50143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  p3  = 3,
50243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  p4  = 4,
50343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  p5  = 5,
50443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  p6  = 6,
50543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  p7  = 7,
50643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  p8  = 8,
50743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  p9  = 9,
50843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  p10 = 10,
50943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  p11 = 11,
51043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  p12 = 12,
51143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  p13 = 13,
51243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  p14 = 14,
51343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  p15 = 15
51443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
51543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
51643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
51743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// -----------------------------------------------------------------------------
51843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Machine instruction Operands
51943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
52043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Class Operand represents a shifter operand in data processing instructions
52143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass Operand BASE_EMBEDDED {
52243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
52343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // immediate
524236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org  INLINE(explicit Operand(int32_t immediate,
52559297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org         RelocInfo::Mode rmode = RelocInfo::NONE32));
526ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org  INLINE(static Operand Zero()) {
527ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org    return Operand(static_cast<int32_t>(0));
528ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org  }
52943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  INLINE(explicit Operand(const ExternalReference& f));
53043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  explicit Operand(Handle<Object> handle);
53143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  INLINE(explicit Operand(Smi* value));
53243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
53343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // rm
53443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  INLINE(explicit Operand(Register rm));
53543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
53643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // rm <shift_op> shift_imm
53743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  explicit Operand(Register rm, ShiftOp shift_op, int shift_imm);
538bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  INLINE(static Operand SmiUntag(Register rm)) {
539bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    return Operand(rm, ASR, kSmiTagSize);
540bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  }
541bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  INLINE(static Operand PointerOffsetFromSmiKey(Register key)) {
542bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    STATIC_ASSERT(kSmiTag == 0 && kSmiTagSize < kPointerSizeLog2);
543bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    return Operand(key, LSL, kPointerSizeLog2 - kSmiTagSize);
544bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  }
545bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  INLINE(static Operand DoubleOffsetFromSmiKey(Register key)) {
546bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    STATIC_ASSERT(kSmiTag == 0 && kSmiTagSize < kDoubleSizeLog2);
547bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    return Operand(key, LSL, kDoubleSizeLog2 - kSmiTagSize);
548bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  }
54943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
55043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // rm <shift_op> rs
55143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  explicit Operand(Register rm, ShiftOp shift_op, Register rs);
55243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
55331e7138e1a05e29ceefa8919ae12cb621a48ca7fmads.s.ager  // Return true if this is a register operand.
55431e7138e1a05e29ceefa8919ae12cb621a48ca7fmads.s.ager  INLINE(bool is_reg() const);
55531e7138e1a05e29ceefa8919ae12cb621a48ca7fmads.s.ager
5563a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  // Return true if this operand fits in one instruction so that no
557b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org  // 2-instruction solution with a load into the ip register is necessary. If
558b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org  // the instruction this operand is used for is a MOV or MVN instruction the
559b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org  // actual instruction to use is required for this calculation. For other
560b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org  // instructions instr is ignored.
561471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  bool is_single_instruction(const Assembler* assembler, Instr instr = 0) const;
56289e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org  bool must_output_reloc_info(const Assembler* assembler) const;
5632c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org
5642c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org  inline int32_t immediate() const {
5652c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org    ASSERT(!rm_.is_valid());
5662c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org    return imm32_;
5672c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org  }
5682c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org
56931e7138e1a05e29ceefa8919ae12cb621a48ca7fmads.s.ager  Register rm() const { return rm_; }
570ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org  Register rs() const { return rs_; }
571ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org  ShiftOp shift_op() const { return shift_op_; }
57231e7138e1a05e29ceefa8919ae12cb621a48ca7fmads.s.ager
57343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
57443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Register rm_;
57543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Register rs_;
57643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ShiftOp shift_op_;
57743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  int shift_imm_;  // valid if rm_ != no_reg && rs_ == no_reg
57843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  int32_t imm32_;  // valid if rm_ == no_reg
579236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org  RelocInfo::Mode rmode_;
58043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
58143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  friend class Assembler;
58243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
58343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
58443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
58543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Class MemOperand represents a memory operand in load and store instructions
58643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass MemOperand BASE_EMBEDDED {
58743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
58843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // [rn +/- offset]      Offset/NegOffset
58943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // [rn +/- offset]!     PreIndex/NegPreIndex
59043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // [rn], +/- offset     PostIndex/NegPostIndex
59143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // offset is any signed 32-bit value; offset is first loaded to register ip if
59243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // it does not fit the addressing mode (12-bit unsigned and sign bit)
59343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  explicit MemOperand(Register rn, int32_t offset = 0, AddrMode am = Offset);
59443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
59543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // [rn +/- rm]          Offset/NegOffset
59643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // [rn +/- rm]!         PreIndex/NegPreIndex
59743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // [rn], +/- rm         PostIndex/NegPostIndex
59843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  explicit MemOperand(Register rn, Register rm, AddrMode am = Offset);
59943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
60043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // [rn +/- rm <shift_op> shift_imm]      Offset/NegOffset
60143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // [rn +/- rm <shift_op> shift_imm]!     PreIndex/NegPreIndex
60243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // [rn], +/- rm <shift_op> shift_imm     PostIndex/NegPostIndex
60343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  explicit MemOperand(Register rn, Register rm,
60443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                      ShiftOp shift_op, int shift_imm, AddrMode am = Offset);
605bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  INLINE(static MemOperand PointerAddressFromSmiKey(Register array,
606bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org                                                    Register key,
607bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org                                                    AddrMode am = Offset)) {
608bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    STATIC_ASSERT(kSmiTag == 0 && kSmiTagSize < kPointerSizeLog2);
609bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    return MemOperand(array, key, LSL, kPointerSizeLog2 - kSmiTagSize, am);
610bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  }
61143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
612720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org  void set_offset(int32_t offset) {
613720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org      ASSERT(rm_.is(no_reg));
614720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org      offset_ = offset;
615720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org  }
616720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org
6173a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  uint32_t offset() const {
618720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org      ASSERT(rm_.is(no_reg));
619720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org      return offset_;
620720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org  }
621720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org
6229dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  Register rn() const { return rn_; }
6239dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  Register rm() const { return rm_; }
62404921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org  AddrMode am() const { return am_; }
625720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org
6263a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  bool OffsetIsUint12Encodable() const {
6273a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    return offset_ >= 0 ? is_uint12(offset_) : is_uint12(-offset_);
6283a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  }
6293a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
63043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
63143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Register rn_;  // base
63243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Register rm_;  // register offset
63343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  int32_t offset_;  // valid if rm_ == no_reg
63443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ShiftOp shift_op_;
63543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  int shift_imm_;  // valid if rm_ != no_reg && rs_ == no_reg
63643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  AddrMode am_;  // bits P, U, and W
63743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
63843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  friend class Assembler;
63943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
64043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
641169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org
642169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org// Class NeonMemOperand represents a memory operand in load and
643169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org// store NEON instructions
644169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.orgclass NeonMemOperand BASE_EMBEDDED {
645169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org public:
646169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  // [rn {:align}]       Offset
647169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  // [rn {:align}]!      PostIndex
648169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  explicit NeonMemOperand(Register rn, AddrMode am = Offset, int align = 0);
649169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org
650169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  // [rn {:align}], rm   PostIndex
651169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  explicit NeonMemOperand(Register rn, Register rm, int align = 0);
652169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org
653169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  Register rn() const { return rn_; }
654169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  Register rm() const { return rm_; }
655169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  int align() const { return align_; }
656169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org
657169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org private:
658169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  void SetAlignment(int align);
659169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org
660169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  Register rn_;  // base
661169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  Register rm_;  // register increment
662169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  int align_;
663169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org};
664169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org
665169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org
666169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org// Class NeonListOperand represents a list of NEON registers
667169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.orgclass NeonListOperand BASE_EMBEDDED {
668169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org public:
669169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  explicit NeonListOperand(DoubleRegister base, int registers_count = 1);
670169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  DoubleRegister base() const { return base_; }
671169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  NeonListType type() const { return type_; }
672169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org private:
673169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  DoubleRegister base_;
674169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  NeonListType type_;
675169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org};
676169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org
6774af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.orgextern const Instr kMovLrPc;
678cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.orgextern const Instr kLdrPCMask;
6794af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.orgextern const Instr kLdrPCPattern;
680cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.orgextern const Instr kBlxRegMask;
681cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.orgextern const Instr kBlxRegPattern;
68288aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.orgextern const Instr kBlxIp;
6834af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org
6842c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgextern const Instr kMovMvnMask;
6852c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgextern const Instr kMovMvnPattern;
6862c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgextern const Instr kMovMvnFlip;
6872c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org
6885ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.orgextern const Instr kMovLeaveCCMask;
6895ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.orgextern const Instr kMovLeaveCCPattern;
6905ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.orgextern const Instr kMovwMask;
6915ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.orgextern const Instr kMovwPattern;
6925ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.orgextern const Instr kMovwLeaveCCFlip;
6935ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org
6942c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgextern const Instr kCmpCmnMask;
6952c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgextern const Instr kCmpCmnPattern;
6962c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgextern const Instr kCmpCmnFlip;
6972c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgextern const Instr kAddSubFlip;
6982c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgextern const Instr kAndBicFlip;
6994af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org
7006ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.orgstruct VmovIndex {
7016ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org  unsigned char index;
7026ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org};
7036ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.orgconst VmovIndex VmovIndexLo = { 0 };
7046ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.orgconst VmovIndex VmovIndexHi = { 1 };
705378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org
706ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgclass Assembler : public AssemblerBase {
70743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
70843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Create an assembler. Instructions and relocation information are emitted
70943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // into a buffer, with the instructions starting from the beginning and the
71043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // relocation information starting from the end of the buffer. See CodeDesc
71143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // for a detailed comment on the layout (globals.h).
71243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  //
71343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // If the provided buffer is NULL, the assembler allocates and grows its own
71443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // buffer, and buffer_size determines the initial buffer size. The buffer is
71543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // owned by the assembler and deallocated upon destruction of the assembler.
71643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  //
71743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // If the provided buffer is not NULL, the assembler uses the provided buffer
71843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // for code generation and assumes its size to be buffer_size. If the buffer
71943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // is too small, a fatal error occurs. No deallocation of the buffer is done
72043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // upon destruction of the assembler.
721c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org  Assembler(Isolate* isolate, void* buffer, int buffer_size);
7228e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  virtual ~Assembler();
72343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
72443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // GetCode emits any pending (non-emitted) code and fills the descriptor
72543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // desc. GetCode() is idempotent; it returns the same result if no other
7263291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  // Assembler functions are invoked in between GetCode() calls.
72743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void GetCode(CodeDesc* desc);
72843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
72943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Label operations & relative jumps (PPUM Appendix D)
73043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  //
73143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Takes a branch opcode (cc) and a label (L) and generates
73243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // either a backward branch or a forward branch and links it
73343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // to the label fixup chain. Usage:
73443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  //
73543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Label L;    // unbound label
73643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // j(cc, &L);  // forward branch to unbound label
73743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // bind(&L);   // bind label to the current pc
73843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // j(cc, &L);  // backward branch to bound label
73943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // bind(&L);   // illegal: a label may be bound only once
74043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  //
74143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Note: The same Label can be used for forward and backward branches
74243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // but it may be bound only once.
74343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
74443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void bind(Label* L);  // binds an unbound label L to the current code position
74543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
74643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Returns the branch offset to the given label from the current code position
74743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Links the label to the current position if it is still unbound
748769cc962a043dd8d92cc010dd2c50bc26f652c94mads.s.ager@gmail.com  // Manages the jump elimination optimization if the second parameter is true.
749769cc962a043dd8d92cc010dd2c50bc26f652c94mads.s.ager@gmail.com  int branch_offset(Label* L, bool jump_elimination_allowed);
75043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
75118ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  // Puts a labels target address at the given position.
75218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  // The high 8 bits are set to zero.
75318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  void label_at_put(Label* L, int at_offset);
75418ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
75543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Return the address in the constant pool of the code target address used by
75689e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org  // the branch/call instruction at pc, or the object in a mov.
75789e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org  INLINE(static Address target_pointer_address_at(Address pc));
75889e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org
75989e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org  // Read/Modify the pointer in the branch/call/move instruction at pc.
76089e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org  INLINE(static Address target_pointer_at(Address pc));
76189e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org  INLINE(static void set_target_pointer_at(Address pc, Address target));
76243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
76343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Read/Modify the code target address in the branch/call instruction at pc.
76443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  INLINE(static Address target_address_at(Address pc));
76543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  INLINE(static void set_target_address_at(Address pc, Address target));
76643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
76789e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org  // Return the code target address at a call site from the return address
76889e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org  // of that call in the instruction stream.
76989e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org  INLINE(static Address target_address_from_return_address(Address pc));
77089e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org
77189e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org  // Given the address of the beginning of a call, return the address
77289e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org  // in the instruction stream that the call will return from.
77389e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org  INLINE(static Address return_address_from_call_start(Address pc));
77489e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org
775c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  // This sets the branch destination (which is in the constant pool on ARM).
776c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  // This is for calls and branches within generated code.
77788aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org  inline static void deserialization_set_special_target_at(
77888aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org      Address constant_pool_entry, Address target);
7793811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
780c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  // This sets the branch destination (which is in the constant pool on ARM).
781c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  // This is for calls and branches to runtime code.
782c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  inline static void set_external_target_at(Address constant_pool_entry,
78388aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org                                            Address target);
784c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
7853811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  // Here we are patching the address in the constant pool, not the actual call
7863811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  // instruction.  The address in the constant pool is the same size as a
7873811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  // pointer.
78888aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org  static const int kSpecialTargetSize = kPointerSize;
7893811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
7904af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org  // Size of an instruction.
7914af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org  static const int kInstrSize = sizeof(Instr);
7924af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org
793911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org  // Distance between start of patched return sequence and the emitted address
794911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org  // to jump to.
7952356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org  // Patched return sequence is:
796cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  //  ldr  ip, [pc, #0]   @ emited address and start
797cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  //  blx  ip
798cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  static const int kPatchReturnSequenceAddressOffset =  0 * kInstrSize;
79943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
8002356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org  // Distance between start of patched debug break slot and the emitted address
8012356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org  // to jump to.
8022356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org  // Patched debug break slot code is:
8032356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org  //  ldr  ip, [pc, #0]   @ emited address and start
8042356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org  //  blx  ip
8052356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org  static const int kPatchDebugBreakSlotAddressOffset =  0 * kInstrSize;
8062356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org
80789e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org  static const int kPatchDebugBreakSlotReturnOffset = 2 * kInstrSize;
80889e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org
80918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  // Difference between address of current opcode and value read from pc
81018ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  // register.
81118ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  static const int kPcLoadDelta = 8;
81218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
8132356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org  static const int kJSReturnSequenceInstructions = 4;
8142356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org  static const int kDebugBreakSlotInstructions = 3;
8152356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org  static const int kDebugBreakSlotLength =
8162356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org      kDebugBreakSlotInstructions * kInstrSize;
81743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
81843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // ---------------------------------------------------------------------------
81943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Code generation
82043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
82143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Insert the smallest number of nop instructions
82243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // possible to align the pc offset to a multiple
82343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // of m. m must be a power of 2 (>= 4).
82443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void Align(int m);
8255ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org  // Aligns code to something that's optimal for a jump target for the platform.
8265ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org  void CodeTargetAlign();
82743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
82843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Branch instructions
82943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void b(int branch_offset, Condition cond = al);
83043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void bl(int branch_offset, Condition cond = al);
83143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void blx(int branch_offset);  // v5 and above
83243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void blx(Register target, Condition cond = al);  // v5 and above
83343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void bx(Register target, Condition cond = al);  // v5 and above, plus v4t
83443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
83543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Convenience branch instructions using labels
836769cc962a043dd8d92cc010dd2c50bc26f652c94mads.s.ager@gmail.com  void b(Label* L, Condition cond = al)  {
837769cc962a043dd8d92cc010dd2c50bc26f652c94mads.s.ager@gmail.com    b(branch_offset(L, cond == al), cond);
838769cc962a043dd8d92cc010dd2c50bc26f652c94mads.s.ager@gmail.com  }
839769cc962a043dd8d92cc010dd2c50bc26f652c94mads.s.ager@gmail.com  void b(Condition cond, Label* L)  { b(branch_offset(L, cond == al), cond); }
840769cc962a043dd8d92cc010dd2c50bc26f652c94mads.s.ager@gmail.com  void bl(Label* L, Condition cond = al)  { bl(branch_offset(L, false), cond); }
841769cc962a043dd8d92cc010dd2c50bc26f652c94mads.s.ager@gmail.com  void bl(Condition cond, Label* L)  { bl(branch_offset(L, false), cond); }
842769cc962a043dd8d92cc010dd2c50bc26f652c94mads.s.ager@gmail.com  void blx(Label* L)  { blx(branch_offset(L, false)); }  // v5 and above
84343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
84443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Data-processing instructions
8455c838251403b0be9a882540f1922577abba4c872ager@chromium.org
84643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void and_(Register dst, Register src1, const Operand& src2,
84743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen            SBit s = LeaveCC, Condition cond = al);
84843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
84943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void eor(Register dst, Register src1, const Operand& src2,
85043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen           SBit s = LeaveCC, Condition cond = al);
85143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
85243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void sub(Register dst, Register src1, const Operand& src2,
85343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen           SBit s = LeaveCC, Condition cond = al);
854b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org  void sub(Register dst, Register src1, Register src2,
855b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org           SBit s = LeaveCC, Condition cond = al) {
856b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org    sub(dst, src1, Operand(src2), s, cond);
857b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org  }
85843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
85943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void rsb(Register dst, Register src1, const Operand& src2,
86043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen           SBit s = LeaveCC, Condition cond = al);
86143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
86243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void add(Register dst, Register src1, const Operand& src2,
86343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen           SBit s = LeaveCC, Condition cond = al);
86482dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org  void add(Register dst, Register src1, Register src2,
86582dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org           SBit s = LeaveCC, Condition cond = al) {
86682dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org    add(dst, src1, Operand(src2), s, cond);
86782dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org  }
86843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
86943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void adc(Register dst, Register src1, const Operand& src2,
87043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen           SBit s = LeaveCC, Condition cond = al);
87143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
87243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void sbc(Register dst, Register src1, const Operand& src2,
87343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen           SBit s = LeaveCC, Condition cond = al);
87443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
87543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void rsc(Register dst, Register src1, const Operand& src2,
87643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen           SBit s = LeaveCC, Condition cond = al);
87743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
87843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void tst(Register src1, const Operand& src2, Condition cond = al);
879b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org  void tst(Register src1, Register src2, Condition cond = al) {
880b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org    tst(src1, Operand(src2), cond);
881b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org  }
88243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
88343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void teq(Register src1, const Operand& src2, Condition cond = al);
88443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
88543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void cmp(Register src1, const Operand& src2, Condition cond = al);
886b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org  void cmp(Register src1, Register src2, Condition cond = al) {
887b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org    cmp(src1, Operand(src2), cond);
888b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org  }
889496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org  void cmp_raw_immediate(Register src1, int raw_immediate, Condition cond = al);
89043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
89143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void cmn(Register src1, const Operand& src2, Condition cond = al);
89243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
89343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void orr(Register dst, Register src1, const Operand& src2,
89443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen           SBit s = LeaveCC, Condition cond = al);
895b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org  void orr(Register dst, Register src1, Register src2,
896b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org           SBit s = LeaveCC, Condition cond = al) {
897b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org    orr(dst, src1, Operand(src2), s, cond);
898b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org  }
89943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
90043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void mov(Register dst, const Operand& src,
90143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen           SBit s = LeaveCC, Condition cond = al);
902b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org  void mov(Register dst, Register src, SBit s = LeaveCC, Condition cond = al) {
903b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org    mov(dst, Operand(src), s, cond);
904b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org  }
90543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
9065ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org  // ARMv7 instructions for loading a 32 bit immediate in two instructions.
9075ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org  // This may actually emit a different mov instruction, but on an ARMv7 it
9085ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org  // is guaranteed to only emit one instruction.
9095ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org  void movw(Register reg, uint32_t immediate, Condition cond = al);
9105ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org  // The constant for movt should be in the range 0-0xffff.
9115ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org  void movt(Register reg, uint32_t immediate, Condition cond = al);
9125ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org
91343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void bic(Register dst, Register src1, const Operand& src2,
91443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen           SBit s = LeaveCC, Condition cond = al);
91543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
91643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void mvn(Register dst, const Operand& src,
91743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen           SBit s = LeaveCC, Condition cond = al);
91843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
91943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Multiply instructions
92043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
92143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void mla(Register dst, Register src1, Register src2, Register srcA,
92243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen           SBit s = LeaveCC, Condition cond = al);
92343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
92433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  void mls(Register dst, Register src1, Register src2, Register srcA,
92533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org           Condition cond = al);
92633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
92733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  void sdiv(Register dst, Register src1, Register src2,
92833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org            Condition cond = al);
92933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
93043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void mul(Register dst, Register src1, Register src2,
93143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen           SBit s = LeaveCC, Condition cond = al);
93243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
93343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void smlal(Register dstL, Register dstH, Register src1, Register src2,
93443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen             SBit s = LeaveCC, Condition cond = al);
93543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
93643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void smull(Register dstL, Register dstH, Register src1, Register src2,
93743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen             SBit s = LeaveCC, Condition cond = al);
93843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
93943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void umlal(Register dstL, Register dstH, Register src1, Register src2,
94043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen             SBit s = LeaveCC, Condition cond = al);
94143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
94243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void umull(Register dstL, Register dstH, Register src1, Register src2,
94343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen             SBit s = LeaveCC, Condition cond = al);
94443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
94543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Miscellaneous arithmetic instructions
94643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
94743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void clz(Register dst, Register src, Condition cond = al);  // v5 and above
94843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
949ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org  // Saturating instructions. v6 and above.
950ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org
951ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org  // Unsigned saturate.
952ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org  //
953ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org  // Saturate an optionally shifted signed value to an unsigned range.
954ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org  //
955ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org  //   usat dst, #satpos, src
956ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org  //   usat dst, #satpos, src, lsl #sh
957ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org  //   usat dst, #satpos, src, asr #sh
958ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org  //
959ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org  // Register dst will contain:
960ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org  //
961ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org  //   0,                 if s < 0
962ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org  //   (1 << satpos) - 1, if s > ((1 << satpos) - 1)
963ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org  //   s,                 otherwise
964ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org  //
965ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org  // where s is the contents of src after shifting (if used.)
966ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org  void usat(Register dst, int satpos, const Operand& src, Condition cond = al);
967ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org
96830ce411529579186181838984710b0b0980857aaricow@chromium.org  // Bitfield manipulation instructions. v7 and above.
96930ce411529579186181838984710b0b0980857aaricow@chromium.org
97030ce411529579186181838984710b0b0980857aaricow@chromium.org  void ubfx(Register dst, Register src, int lsb, int width,
97130ce411529579186181838984710b0b0980857aaricow@chromium.org            Condition cond = al);
97230ce411529579186181838984710b0b0980857aaricow@chromium.org
97330ce411529579186181838984710b0b0980857aaricow@chromium.org  void sbfx(Register dst, Register src, int lsb, int width,
97430ce411529579186181838984710b0b0980857aaricow@chromium.org            Condition cond = al);
97530ce411529579186181838984710b0b0980857aaricow@chromium.org
97630ce411529579186181838984710b0b0980857aaricow@chromium.org  void bfc(Register dst, int lsb, int width, Condition cond = al);
97730ce411529579186181838984710b0b0980857aaricow@chromium.org
97830ce411529579186181838984710b0b0980857aaricow@chromium.org  void bfi(Register dst, Register src, int lsb, int width,
97930ce411529579186181838984710b0b0980857aaricow@chromium.org           Condition cond = al);
98030ce411529579186181838984710b0b0980857aaricow@chromium.org
981169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  void pkhbt(Register dst, Register src1, const Operand& src2,
982169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org             Condition cond = al);
983169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org
984169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  void pkhtb(Register dst, Register src1, const Operand& src2,
985169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org             Condition cond = al);
986169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org
987169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  void uxtb(Register dst, const Operand& src, Condition cond = al);
988169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org
989169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  void uxtab(Register dst, Register src1, const Operand& src2,
990169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org             Condition cond = al);
991169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org
992169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  void uxtb16(Register dst, const Operand& src, Condition cond = al);
993169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org
99443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Status register access instructions
99543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
99643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void mrs(Register dst, SRegister s, Condition cond = al);
99743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void msr(SRegisterFieldMask fields, const Operand& src, Condition cond = al);
99843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
99943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Load/Store instructions
100043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void ldr(Register dst, const MemOperand& src, Condition cond = al);
100143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void str(Register src, const MemOperand& dst, Condition cond = al);
100243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void ldrb(Register dst, const MemOperand& src, Condition cond = al);
100343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void strb(Register src, const MemOperand& dst, Condition cond = al);
100443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void ldrh(Register dst, const MemOperand& src, Condition cond = al);
100543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void strh(Register src, const MemOperand& dst, Condition cond = al);
100643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void ldrsb(Register dst, const MemOperand& src, Condition cond = al);
100743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void ldrsh(Register dst, const MemOperand& src, Condition cond = al);
10089155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  void ldrd(Register dst1,
10099155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org            Register dst2,
10109155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org            const MemOperand& src, Condition cond = al);
10119155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  void strd(Register src1,
10129155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org            Register src2,
10139155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org            const MemOperand& dst, Condition cond = al);
101443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1015169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  // Preload instructions
1016169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  void pld(const MemOperand& address);
1017169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org
101843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Load/Store multiple instructions
101943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void ldm(BlockAddrMode am, Register base, RegList dst, Condition cond = al);
102043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void stm(BlockAddrMode am, Register base, RegList src, Condition cond = al);
102143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
102243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Exception-generating instructions and debugging support
1023e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  void stop(const char* msg,
1024e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org            Condition cond = al,
1025e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org            int32_t code = kDefaultStopCode);
102643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
102743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void bkpt(uint32_t imm16);  // v5 and above
1028e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  void svc(uint32_t imm24, Condition cond = al);
102943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
103043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Coprocessor instructions
103143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
103243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void cdp(Coprocessor coproc, int opcode_1,
103343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen           CRegister crd, CRegister crn, CRegister crm,
103443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen           int opcode_2, Condition cond = al);
103543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
103643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void cdp2(Coprocessor coproc, int opcode_1,
103743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen            CRegister crd, CRegister crn, CRegister crm,
103843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen            int opcode_2);  // v5 and above
103943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
104043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void mcr(Coprocessor coproc, int opcode_1,
104143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen           Register rd, CRegister crn, CRegister crm,
104243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen           int opcode_2 = 0, Condition cond = al);
104343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
104443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void mcr2(Coprocessor coproc, int opcode_1,
104543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen            Register rd, CRegister crn, CRegister crm,
104643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen            int opcode_2 = 0);  // v5 and above
104743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
104843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void mrc(Coprocessor coproc, int opcode_1,
104943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen           Register rd, CRegister crn, CRegister crm,
105043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen           int opcode_2 = 0, Condition cond = al);
105143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
105243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void mrc2(Coprocessor coproc, int opcode_1,
105343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen            Register rd, CRegister crn, CRegister crm,
105443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen            int opcode_2 = 0);  // v5 and above
105543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
105643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void ldc(Coprocessor coproc, CRegister crd, const MemOperand& src,
105743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen           LFlag l = Short, Condition cond = al);
105843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void ldc(Coprocessor coproc, CRegister crd, Register base, int option,
105943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen           LFlag l = Short, Condition cond = al);
106043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
106143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void ldc2(Coprocessor coproc, CRegister crd, const MemOperand& src,
106243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen            LFlag l = Short);  // v5 and above
106343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void ldc2(Coprocessor coproc, CRegister crd, Register base, int option,
106443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen            LFlag l = Short);  // v5 and above
106543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1066c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  // Support for VFP.
1067003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  // All these APIs support S0 to S31 and D0 to D31.
1068c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
1069b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  void vldr(const DwVfpRegister dst,
1070b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org            const Register base,
10713a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org            int offset,
10723a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org            const Condition cond = al);
10733a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  void vldr(const DwVfpRegister dst,
10743a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org            const MemOperand& src,
1075b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org            const Condition cond = al);
10765d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org
10775d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org  void vldr(const SwVfpRegister dst,
10785d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org            const Register base,
10793a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org            int offset,
10803a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org            const Condition cond = al);
10813a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  void vldr(const SwVfpRegister dst,
10823a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org            const MemOperand& src,
10835d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org            const Condition cond = al);
10845d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org
1085b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  void vstr(const DwVfpRegister src,
1086b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org            const Register base,
10873a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org            int offset,
10883a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org            const Condition cond = al);
10893a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  void vstr(const DwVfpRegister src,
10903a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org            const MemOperand& dst,
1091b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org            const Condition cond = al);
109269ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org
10930b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org  void vstr(const SwVfpRegister src,
10940b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org            const Register base,
10953a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org            int offset,
10963a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org            const Condition cond = al);
10973a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  void vstr(const SwVfpRegister src,
10983a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org            const MemOperand& dst,
10990b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org            const Condition cond = al);
11000b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org
110174f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org  void vldm(BlockAddrMode am,
110274f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org            Register base,
110374f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org            DwVfpRegister first,
110474f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org            DwVfpRegister last,
110574f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org            Condition cond = al);
110674f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org
110774f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org  void vstm(BlockAddrMode am,
110874f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org            Register base,
110974f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org            DwVfpRegister first,
111074f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org            DwVfpRegister last,
111174f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org            Condition cond = al);
111274f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org
111374f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org  void vldm(BlockAddrMode am,
111474f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org            Register base,
111574f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org            SwVfpRegister first,
111674f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org            SwVfpRegister last,
111774f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org            Condition cond = al);
111874f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org
111974f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org  void vstm(BlockAddrMode am,
112074f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org            Register base,
112174f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org            SwVfpRegister first,
112274f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org            SwVfpRegister last,
112374f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org            Condition cond = al);
112474f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org
112569ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org  void vmov(const DwVfpRegister dst,
11266a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org            double imm,
112771fc3467b5396c27d0b701d88e196e88c78d8864mstarzinger@chromium.org            const Register scratch = no_reg);
11286a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org  void vmov(const SwVfpRegister dst,
11296a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org            const SwVfpRegister src,
11306a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org            const Condition cond = al);
11316a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org  void vmov(const DwVfpRegister dst,
113269ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org            const DwVfpRegister src,
113369ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org            const Condition cond = al);
113413bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org  void vmov(const DwVfpRegister dst,
11356ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org            const VmovIndex index,
1136003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org            const Register src,
1137003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org            const Condition cond = al);
1138fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  void vmov(const Register dst,
1139fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org            const VmovIndex index,
1140fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org            const DwVfpRegister src,
1141fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org            const Condition cond = al);
1142003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  void vmov(const DwVfpRegister dst,
114313bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org            const Register src1,
114413bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org            const Register src2,
114513bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org            const Condition cond = al);
114613bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org  void vmov(const Register dst1,
114713bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org            const Register dst2,
114813bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org            const DwVfpRegister src,
1149c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org            const Condition cond = al);
115013bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org  void vmov(const SwVfpRegister dst,
1151c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org            const Register src,
1152c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org            const Condition cond = al);
115313bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org  void vmov(const Register dst,
115413bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org            const SwVfpRegister src,
115513bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org            const Condition cond = al);
11565d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org  void vcvt_f64_s32(const DwVfpRegister dst,
11575d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org                    const SwVfpRegister src,
115883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org                    VFPConversionMode mode = kDefaultRoundToZero,
11595d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org                    const Condition cond = al);
11605d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org  void vcvt_f32_s32(const SwVfpRegister dst,
11615d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org                    const SwVfpRegister src,
116283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org                    VFPConversionMode mode = kDefaultRoundToZero,
11635d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org                    const Condition cond = al);
11645d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org  void vcvt_f64_u32(const DwVfpRegister dst,
11655d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org                    const SwVfpRegister src,
116683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org                    VFPConversionMode mode = kDefaultRoundToZero,
11675d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org                    const Condition cond = al);
11685d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org  void vcvt_s32_f64(const SwVfpRegister dst,
11695d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org                    const DwVfpRegister src,
117083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org                    VFPConversionMode mode = kDefaultRoundToZero,
11715d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org                    const Condition cond = al);
11725d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org  void vcvt_u32_f64(const SwVfpRegister dst,
11735d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org                    const DwVfpRegister src,
117483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org                    VFPConversionMode mode = kDefaultRoundToZero,
11755d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org                    const Condition cond = al);
11765d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org  void vcvt_f64_f32(const DwVfpRegister dst,
11775d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org                    const SwVfpRegister src,
117883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org                    VFPConversionMode mode = kDefaultRoundToZero,
11795d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org                    const Condition cond = al);
11805d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org  void vcvt_f32_f64(const SwVfpRegister dst,
11815d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org                    const DwVfpRegister src,
118283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org                    VFPConversionMode mode = kDefaultRoundToZero,
11835d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org                    const Condition cond = al);
1184bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  void vcvt_f64_s32(const DwVfpRegister dst,
1185bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org                    int fraction_bits,
1186bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org                    const Condition cond = al);
118713bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org
1188badaffc570baec00166b0ad3bdc96995751a7e13ricow@chromium.org  void vneg(const DwVfpRegister dst,
1189badaffc570baec00166b0ad3bdc96995751a7e13ricow@chromium.org            const DwVfpRegister src,
1190badaffc570baec00166b0ad3bdc96995751a7e13ricow@chromium.org            const Condition cond = al);
11917a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org  void vabs(const DwVfpRegister dst,
11927a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org            const DwVfpRegister src,
11937a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org            const Condition cond = al);
119413bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org  void vadd(const DwVfpRegister dst,
119513bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org            const DwVfpRegister src1,
119613bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org            const DwVfpRegister src2,
119713bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org            const Condition cond = al);
119813bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org  void vsub(const DwVfpRegister dst,
119913bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org            const DwVfpRegister src1,
120013bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org            const DwVfpRegister src2,
120113bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org            const Condition cond = al);
120213bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org  void vmul(const DwVfpRegister dst,
120313bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org            const DwVfpRegister src1,
120413bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org            const DwVfpRegister src2,
120513bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org            const Condition cond = al);
1206fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  void vmla(const DwVfpRegister dst,
1207fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org            const DwVfpRegister src1,
1208fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org            const DwVfpRegister src2,
1209fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org            const Condition cond = al);
12108432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org  void vmls(const DwVfpRegister dst,
12118432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org            const DwVfpRegister src1,
12128432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org            const DwVfpRegister src2,
12138432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org            const Condition cond = al);
121413bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org  void vdiv(const DwVfpRegister dst,
121513bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org            const DwVfpRegister src1,
121613bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org            const DwVfpRegister src2,
121713bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org            const Condition cond = al);
121813bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org  void vcmp(const DwVfpRegister src1,
121913bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org            const DwVfpRegister src2,
1220c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org            const Condition cond = al);
1221ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org  void vcmp(const DwVfpRegister src1,
1222ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org            const double src2,
1223ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org            const Condition cond = al);
1224c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  void vmrs(const Register dst,
1225c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org            const Condition cond = al);
122601fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org  void vmsr(const Register dst,
122701fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org            const Condition cond = al);
122832d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org  void vsqrt(const DwVfpRegister dst,
122932d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org             const DwVfpRegister src,
123032d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org             const Condition cond = al);
1231c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
1232169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  // Support for NEON.
1233169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  // All these APIs support D0 to D31 and Q0 to Q15.
1234169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org
1235169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  void vld1(NeonSize size,
1236169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org            const NeonListOperand& dst,
1237169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org            const NeonMemOperand& src);
1238169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  void vst1(NeonSize size,
1239169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org            const NeonListOperand& src,
1240169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org            const NeonMemOperand& dst);
1241169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  void vmovl(NeonDataType dt, QwNeonRegister dst, DwVfpRegister src);
1242169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org
124343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Pseudo instructions
1244beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1245beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // Different nop operations are used by the code generator to detect certain
1246beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // states of the generated code.
1247beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  enum NopMarkerTypes {
1248beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    NON_MARKING_NOP = 0,
1249beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    DEBUG_BREAK_NOP,
1250beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    // IC markers.
1251beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    PROPERTY_ACCESS_INLINED,
1252beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    PROPERTY_ACCESS_INLINED_CONTEXT,
1253beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    PROPERTY_ACCESS_INLINED_CONTEXT_DONT_DELETE,
1254beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    // Helper values.
1255beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    LAST_CODE_MARKER,
1256beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    FIRST_IC_MARKER = PROPERTY_ACCESS_INLINED
1257beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  };
1258beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1259beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  void nop(int type = 0);   // 0 is the default non-marking type.
126043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1261b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  void push(Register src, Condition cond = al) {
1262b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    str(src, MemOperand(sp, 4, NegPreIndex), cond);
126331e7138e1a05e29ceefa8919ae12cb621a48ca7fmads.s.ager  }
126431e7138e1a05e29ceefa8919ae12cb621a48ca7fmads.s.ager
1265c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org  void pop(Register dst, Condition cond = al) {
1266c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org    ldr(dst, MemOperand(sp, 4, PostIndex), cond);
126743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
126843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
126931e7138e1a05e29ceefa8919ae12cb621a48ca7fmads.s.ager  void pop() {
127031e7138e1a05e29ceefa8919ae12cb621a48ca7fmads.s.ager    add(sp, sp, Operand(kPointerSize));
127143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
127243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
127343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Jump unconditionally to given label.
127443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void jmp(Label* L) { b(L, al); }
127543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
127689e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org  static bool use_immediate_embedded_pointer_loads(
127789e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org      const Assembler* assembler) {
127889e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org    return CpuFeatures::IsSupported(MOVW_MOVT_IMMEDIATE_LOADS) &&
127989e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org        (assembler == NULL || !assembler->predictable_code_size());
128089e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org  }
128189e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org
12824af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org  // Check the code size generated from label to here.
12834f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  int SizeOfCodeGeneratedSince(Label* label) {
12844f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org    return pc_offset() - label->pos();
12854f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  }
12864f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org
12874f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  // Check the number of instructions generated from label to here.
12884f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  int InstructionsGeneratedSince(Label* label) {
12894f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org    return SizeOfCodeGeneratedSince(label) / kInstrSize;
12904af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org  }
129143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1292c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  // Check whether an immediate fits an addressing mode 1 instruction.
1293c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  bool ImmediateFitsAddrMode1Instruction(int32_t imm32);
1294c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
1295013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org  // Class for scoping postponing the constant pool generation.
1296013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org  class BlockConstPoolScope {
1297013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org   public:
1298013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org    explicit BlockConstPoolScope(Assembler* assem) : assem_(assem) {
1299013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org      assem_->StartBlockConstPool();
1300013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org    }
1301013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org    ~BlockConstPoolScope() {
1302013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org      assem_->EndBlockConstPool();
1303013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org    }
1304013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org
1305013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org   private:
1306013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org    Assembler* assem_;
1307013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org
1308013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org    DISALLOW_IMPLICIT_CONSTRUCTORS(BlockConstPoolScope);
1309013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org  };
1310c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
131143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Debugging
131243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
13134af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org  // Mark address of the ExitJSFrame code.
13144af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org  void RecordJSReturn();
13154af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org
13162356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org  // Mark address of a debug break slot.
13172356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org  void RecordDebugBreakSlot();
13182356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org
13198e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org  // Record the AST id of the CallIC being compiled, so that it can be placed
13208e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org  // in the relocation information.
1321471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  void SetRecordedAstId(TypeFeedbackId ast_id) {
1322471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    ASSERT(recorded_ast_id_.IsNone());
1323717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org    recorded_ast_id_ = ast_id;
1324717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org  }
1325717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org
1326471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  TypeFeedbackId RecordedAstId() {
1327471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    ASSERT(!recorded_ast_id_.IsNone());
1328717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org    return recorded_ast_id_;
1329717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org  }
1330717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org
1331471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  void ClearRecordedAstId() { recorded_ast_id_ = TypeFeedbackId::None(); }
13328e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
133343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Record a comment relocation entry that can be used by a disassembler.
1334a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // Use --code-comments to enable.
133543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void RecordComment(const char* msg);
133643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
13375a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  // Record the emission of a constant pool.
13385a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  //
13395a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  // The emission of constant pool depends on the size of the code generated and
13405a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  // the number of RelocInfo recorded.
13415a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  // The Debug mechanism needs to map code offsets between two versions of a
13425a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  // function, compiled with and without debugger support (see for example
13435a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  // Debug::PrepareForBreakPoints()).
13445a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  // Compiling functions with debugger support generates additional code
13455a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  // (Debug::GenerateSlot()). This may affect the emission of the constant
13465a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  // pools and cause the version of the code with debugger support to have
13475a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  // constant pools generated in different places.
13485a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  // Recording the position and size of emitted constant pools allows to
13495a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  // correctly compute the offset mappings between the different versions of a
13505a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  // function in all situations.
13515a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  //
13525a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  // The parameter indicates the size of the constant pool (in bytes), including
13535a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  // the marker and branch over the data.
13545a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  void RecordConstPool(int size);
13555a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org
13560511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  // Writes a single byte or word of data in the code stream.  Used
13570511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  // for inline tables, e.g., jump-tables. The constant pool should be
13580511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  // emitted before any use of db and dd to ensure that constant pools
13590511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  // are not emitted as part of the tables generated.
1360a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  void db(uint8_t data);
1361a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  void dd(uint32_t data);
1362a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1363f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org  PositionsRecorder* positions_recorder() { return &positions_recorder_; }
136443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
136543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Read/patch instructions
1366c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  Instr instr_at(int pos) { return *reinterpret_cast<Instr*>(buffer_ + pos); }
1367c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  void instr_at_put(int pos, Instr instr) {
1368c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    *reinterpret_cast<Instr*>(buffer_ + pos) = instr;
1369c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  }
13704af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org  static Instr instr_at(byte* pc) { return *reinterpret_cast<Instr*>(pc); }
1371013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org  static void instr_at_put(byte* pc, Instr instr) {
137243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    *reinterpret_cast<Instr*>(pc) = instr;
137343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
1374496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org  static Condition GetCondition(Instr instr);
1375013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org  static bool IsBranch(Instr instr);
1376013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org  static int GetBranchOffset(Instr instr);
1377013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org  static bool IsLdrRegisterImmediate(Instr instr);
13784cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org  static bool IsVldrDRegisterImmediate(Instr instr);
1379013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org  static int GetLdrRegisterImmediateOffset(Instr instr);
13804cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org  static int GetVldrDRegisterImmediateOffset(Instr instr);
1381013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org  static Instr SetLdrRegisterImmediateOffset(Instr instr, int offset);
13824cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org  static Instr SetVldrDRegisterImmediateOffset(Instr instr, int offset);
1383ba5a61b76d901fc18b36ae7bd97eaf938269c96ewhesse@chromium.org  static bool IsStrRegisterImmediate(Instr instr);
1384ba5a61b76d901fc18b36ae7bd97eaf938269c96ewhesse@chromium.org  static Instr SetStrRegisterImmediateOffset(Instr instr, int offset);
1385ba5a61b76d901fc18b36ae7bd97eaf938269c96ewhesse@chromium.org  static bool IsAddRegisterImmediate(Instr instr);
1386ba5a61b76d901fc18b36ae7bd97eaf938269c96ewhesse@chromium.org  static Instr SetAddRegisterImmediateOffset(Instr instr, int offset);
13879dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  static Register GetRd(Instr instr);
1388496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org  static Register GetRn(Instr instr);
1389496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org  static Register GetRm(Instr instr);
13909dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  static bool IsPush(Instr instr);
13919dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  static bool IsPop(Instr instr);
13929dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  static bool IsStrRegFpOffset(Instr instr);
13939dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  static bool IsLdrRegFpOffset(Instr instr);
13949dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  static bool IsStrRegFpNegOffset(Instr instr);
13959dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  static bool IsLdrRegFpNegOffset(Instr instr);
1396beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  static bool IsLdrPcImmediateOffset(Instr instr);
13974cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org  static bool IsVldrDPcImmediateOffset(Instr instr);
1398496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org  static bool IsTstImmediate(Instr instr);
1399496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org  static bool IsCmpRegister(Instr instr);
1400496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org  static bool IsCmpImmediate(Instr instr);
1401496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org  static Register GetCmpImmediateRegister(Instr instr);
1402496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org  static int GetCmpImmediateRawImmediate(Instr instr);
1403beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  static bool IsNop(Instr instr, int type = NON_MARKING_NOP);
140489e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org  static bool IsMovT(Instr instr);
140589e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org  static bool IsMovW(Instr instr);
1406013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org
140740cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org  // Constants in pools are accessed via pc relative addressing, which can
14084cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org  // reach +/-4KB for integer PC-relative loads and +/-1KB for floating-point
14094cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org  // PC-relative loads, thereby defining a maximum distance between the
14104cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org  // instruction and the accessed constant.
14114cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org  static const int kMaxDistToIntPool = 4*KB;
14124cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org  static const int kMaxDistToFPPool = 1*KB;
14134cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org  // All relocations could be integer, it therefore acts as the limit.
14144cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org  static const int kMaxNumPendingRelocInfo = kMaxDistToIntPool/kInstrSize;
141540cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org
14167b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org  // Postpone the generation of the constant pool for the specified number of
14177b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org  // instructions.
14187b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org  void BlockConstPoolFor(int instructions);
14197b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org
14207b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org  // Check if is time to emit a constant pool.
1421a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  void CheckConstPool(bool force_emit, bool require_jump);
1422013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org
1423013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org protected:
14248e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org  // Relocation for a type-recording IC has the AST id added to it.  This
14258e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org  // member variable is a way to pass the information from the call site to
14268e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org  // the relocation info.
1427471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  TypeFeedbackId recorded_ast_id_;
14288e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
1429013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org  int buffer_space() const { return reloc_info_writer.pos() - pc_; }
1430013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org
143143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Decode branch instruction at pos and return branch target pos
143243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  int target_at(int pos);
143343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
143443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Patch branch instruction at pos to branch to given branch target pos
143543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void target_at_put(int pos, int target_pos);
143643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
14377b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org  // Prevent contant pool emission until EndBlockConstPool is called.
14387b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org  // Call to this function can be nested but must be followed by an equal
14397b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org  // number of call to EndBlockConstpool.
1440c34f5802a37a9fa2ce8f3929d1d5159ddcf04ff3lrn@chromium.org  void StartBlockConstPool() {
14417b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org    if (const_pool_blocked_nesting_++ == 0) {
14427b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org      // Prevent constant pool checks happening by setting the next check to
14437b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org      // the biggest possible offset.
14447b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org      next_buffer_check_ = kMaxInt;
14457b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org    }
1446c34f5802a37a9fa2ce8f3929d1d5159ddcf04ff3lrn@chromium.org  }
14477b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org
14487b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org  // Resume constant pool emission. Need to be called as many time as
14497b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org  // StartBlockConstPool to have an effect.
1450c34f5802a37a9fa2ce8f3929d1d5159ddcf04ff3lrn@chromium.org  void EndBlockConstPool() {
14517b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org    if (--const_pool_blocked_nesting_ == 0) {
14527b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org      // Check the constant pool hasn't been blocked for too long.
14537b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org      ASSERT((num_pending_reloc_info_ == 0) ||
14544cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org             (pc_offset() < (first_const_pool_use_ + kMaxDistToIntPool)));
14554cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org      ASSERT((num_pending_64_bit_reloc_info_ == 0) ||
14564cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org             (pc_offset() < (first_const_pool_use_ + kMaxDistToFPPool)));
14577b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org      // Two cases:
14587b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org      //  * no_const_pool_before_ >= next_buffer_check_ and the emission is
14597b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org      //    still blocked
14607b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org      //  * no_const_pool_before_ < next_buffer_check_ and the next emit will
14617b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org      //    trigger a check.
14627b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org      next_buffer_check_ = no_const_pool_before_;
14637b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org    }
14647b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org  }
14657b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org
14667b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org  bool is_const_pool_blocked() const {
14677b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org    return (const_pool_blocked_nesting_ > 0) ||
14687b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org           (pc_offset() < no_const_pool_before_);
1469c34f5802a37a9fa2ce8f3929d1d5159ddcf04ff3lrn@chromium.org  }
1470c34f5802a37a9fa2ce8f3929d1d5159ddcf04ff3lrn@chromium.org
147143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
147243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  int next_buffer_check_;  // pc offset of next buffer check
147343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
147443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Code generation
147543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // The relocation writer's position is at least kGap bytes below the end of
147643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // the generated instructions. This is so that multi-instruction sequences do
147743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // not have to check for overflow. The same is true for writes of large
147843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // relocation info entries.
147943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  static const int kGap = 32;
148043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
148143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Constant pool generation
148243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Pools are emitted in the instruction stream, preferably after unconditional
148343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // jumps or after returns from functions (in dead code locations).
148443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // If a long code sequence does not contain unconditional jumps, it is
148543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // necessary to emit the constant pool before the pool gets too far from the
148643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // location it is accessed from. In this case, we emit a jump over the emitted
148743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // constant pool.
148843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Constants in the pool may be addresses of functions that gets relocated;
148943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // if so, a relocation info entry is associated to the constant pool entry.
149043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
149143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Repeated checking whether the constant pool should be emitted is rather
149243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // expensive. By default we only check again once a number of instructions
149343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // has been generated. That also means that the sizing of the buffers is not
149443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // an exact science, and that we rely on some slop to not overrun buffers.
14957b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org  static const int kCheckPoolIntervalInst = 32;
14967b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org  static const int kCheckPoolInterval = kCheckPoolIntervalInst * kInstrSize;
149743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
149843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1499013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org  // Emission of the constant pool may be blocked in some code sequences.
1500013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org  int const_pool_blocked_nesting_;  // Block emission if this is not zero.
1501013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org  int no_const_pool_before_;  // Block emission before this pc offset.
150243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
15037b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org  // Keep track of the first instruction requiring a constant pool entry
15047b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org  // since the previous constant pool was emitted.
15057b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org  int first_const_pool_use_;
150643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
150743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Relocation info generation
150843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Each relocation is encoded as a variable size value
150943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  static const int kMaxRelocSize = RelocInfoWriter::kMaxSize;
151043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  RelocInfoWriter reloc_info_writer;
15117b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org
151243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Relocation info records are also used during code generation as temporary
151343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // containers for constants and code target addresses until they are emitted
151443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // to the constant pool. These pending relocation info records are temporarily
151543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // stored in a separate buffer until a constant pool is emitted.
151643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // If every instruction in a long sequence is accessing the pool, we need one
151743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // pending relocation entry per instruction.
15187b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org
15197b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org  // the buffer of pending relocation info
15207b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org  RelocInfo pending_reloc_info_[kMaxNumPendingRelocInfo];
15217b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org  // number of pending reloc info entries in the buffer
15227b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org  int num_pending_reloc_info_;
15234cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org  // Number of pending reloc info entries included above which also happen to
15244cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org  // be 64-bit.
15254cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org  int num_pending_64_bit_reloc_info_;
152643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
152741044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org  // The bound position, before this we cannot do instruction elimination.
152843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  int last_bound_pos_;
152943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
153043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Code emission
153143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  inline void CheckBuffer();
153243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void GrowBuffer();
153343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  inline void emit(Instr x);
153443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
153589e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org  // 32-bit immediate values
153689e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org  void move_32_bit_immediate(Condition cond,
153789e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org                             Register rd,
153889e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org                             SBit s,
153989e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org                             const Operand& x);
154089e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org
154143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Instruction generation
154243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void addrmod1(Instr instr, Register rn, Register rd, const Operand& x);
154343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void addrmod2(Instr instr, Register rd, const MemOperand& x);
154443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void addrmod3(Instr instr, Register rd, const MemOperand& x);
154543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void addrmod4(Instr instr, Register rn, RegList rl);
154643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void addrmod5(Instr instr, CRegister crd, const MemOperand& x);
154743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
154843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Labels
154943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void print(Label* L);
155043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void bind_to(Label* L, int pos);
155143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void next(Label* L);
155243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
155389e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org  enum UseConstantPoolMode {
155489e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org    USE_CONSTANT_POOL,
155589e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org    DONT_USE_CONSTANT_POOL
155689e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org  };
155789e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org
155843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Record reloc info for current pc_
155989e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org  void RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data = 0,
156089e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org                       UseConstantPoolMode mode = USE_CONSTANT_POOL);
15614cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org  void RecordRelocInfo(double data);
15624cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org  void RecordRelocInfoConstantPoolEntryHelper(const RelocInfo& rinfo);
156318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
156418ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  friend class RegExpMacroAssemblerARM;
15654af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org  friend class RelocInfo;
15664af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org  friend class CodePatcher;
1567013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org  friend class BlockConstPoolScope;
1568f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org
1569f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org  PositionsRecorder positions_recorder_;
1570f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org  friend class PositionsRecorder;
1571f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org  friend class EnsureSpace;
1572f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org};
1573f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org
1574f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org
1575f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.orgclass EnsureSpace BASE_EMBEDDED {
1576f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org public:
1577f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org  explicit EnsureSpace(Assembler* assembler) {
1578f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org    assembler->CheckBuffer();
1579f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org  }
158043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
158143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1582f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org
158343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} }  // namespace v8::internal
158443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
15855ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org#endif  // V8_ARM_ASSEMBLER_ARM_H_
1586