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