1659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org// Copyright 2012 the V8 project authors. All rights reserved. 243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Redistribution and use in source and binary forms, with or without 343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// modification, are permitted provided that the following conditions are 443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// met: 543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// 643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// * Redistributions of source code must retain the above copyright 743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// notice, this list of conditions and the following disclaimer. 843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// * Redistributions in binary form must reproduce the above 943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// copyright notice, this list of conditions and the following 1043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// disclaimer in the documentation and/or other materials provided 1143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// with the distribution. 1243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// * Neither the name of Google Inc. nor the names of its 1343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// contributors may be used to endorse or promote products derived 1443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// from this software without specific prior written permission. 1543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// 1643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 285ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org#ifndef V8_ARM_FRAMES_ARM_H_ 295ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org#define V8_ARM_FRAMES_ARM_H_ 3043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace v8 { 3271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace internal { 3343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// The ARM ABI does not specify the usage of register r9, which may be reserved 3643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// as the static base or thread register on some platforms, in which case we 3743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// leave it alone. Adjust the value of kR9Available accordingly: 381b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgconst int kR9Available = 1; // 1 if available to us, 0 if reserved 3943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 4043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 4143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Register list in load/store instructions 4243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Note that the bit values must match those used in actual instruction encoding 431b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgconst int kNumRegs = 16; 4443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 4543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 4643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Caller-saved/arguments registers 471b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgconst RegList kJSCallerSaved = 4843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1 << 0 | // r0 a1 4943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1 << 1 | // r1 a2 5043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1 << 2 | // r2 a3 5143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1 << 3; // r3 a4 5243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 531b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgconst int kNumJSCallerSaved = 4; 5443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansentypedef Object* JSCallerSavedBuffer[kNumJSCallerSaved]; 5643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Return the code of the n-th caller-saved register available to JavaScript 5843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// e.g. JSCallerSavedReg(0) returns r0.code() == 0 5943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenint JSCallerSavedCode(int n); 6043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Callee-saved registers preserved when switching from C to JavaScript 631b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgconst RegList kCalleeSaved = 647276f14ca716596e0a0d17539516370c1f453847kasper.lund 1 << 4 | // r4 v1 657276f14ca716596e0a0d17539516370c1f453847kasper.lund 1 << 5 | // r5 v2 667276f14ca716596e0a0d17539516370c1f453847kasper.lund 1 << 6 | // r6 v3 67cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org 1 << 7 | // r7 v4 (cp in JavaScript code) 68cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org 1 << 8 | // r8 v5 (pp in JavaScript code) 690a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org kR9Available << 9 | // r9 v6 70eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org 1 << 10 | // r10 v7 7131e7138e1a05e29ceefa8919ae12cb621a48ca7fmads.s.ager 1 << 11; // r11 v8 (fp in JavaScript code) 7243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 73c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// When calling into C++ (only for C++ calls that can't cause a GC). 74c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// The call code will take care of lr, fp, etc. 751b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgconst RegList kCallerSaved = 76c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1 << 0 | // r0 77c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1 << 1 | // r1 78c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1 << 2 | // r2 79c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1 << 3 | // r3 80c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1 << 9; // r9 81c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 82c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 831b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgconst int kNumCalleeSaved = 7 + kR9Available; 8443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 85ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org// Double registers d8 to d15 are callee-saved. 861b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgconst int kNumDoubleCalleeSaved = 8; 87ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org 8843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 89a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// Number of registers for which space is reserved in safepoints. Must be a 90a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// multiple of 8. 91a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// TODO(regis): Only 8 registers may actually be sufficient. Revisit. 921b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgconst int kNumSafepointRegisters = 16; 93a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 94a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// Define the list of registers actually saved at safepoints. 95a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// Note that the number of saved registers may be smaller than the reserved 96a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// space, i.e. kNumSafepointSavedRegisters <= kNumSafepointRegisters. 971b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgconst RegList kSafepointSavedRegisters = kJSCallerSaved | kCalleeSaved; 981b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgconst int kNumSafepointSavedRegisters = kNumJSCallerSaved + kNumCalleeSaved; 99a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 10043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// ---------------------------------------------------- 10143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass EntryFrameConstants : public AllStatic { 10443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 1057ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org static const int kCallerFPOffset = 1067ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org -(StandardFrameConstants::kFixedFrameSizeFromFp + kPointerSize); 10743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 10843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 11043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass ExitFrameConstants : public AllStatic { 11143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 1120ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org static const int kCodeOffset = -2 * kPointerSize; 113d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org static const int kSPOffset = -1 * kPointerSize; 11443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1157276f14ca716596e0a0d17539516370c1f453847kasper.lund // The caller fields are below the frame pointer on the stack. 1160ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org static const int kCallerFPOffset = 0 * kPointerSize; 1170ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org // The calling JS function is below FP. 1180ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org static const int kCallerPCOffset = 1 * kPointerSize; 119eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org 120eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org // FP-relative displacement of the caller's SP. It points just 121eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org // below the saved PC. 1220ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org static const int kCallerSPDisplacement = 2 * kPointerSize; 12343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 12443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 12543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 12643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass JavaScriptFrameConstants : public AllStatic { 12743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 12843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // FP-relative. 12943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kLocal0Offset = StandardFrameConstants::kExpressionsOffset; 130c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org static const int kLastParameterOffset = +2 * kPointerSize; 131b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org static const int kFunctionOffset = StandardFrameConstants::kMarkerOffset; 13243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 133eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org // Caller SP-relative. 13443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kParam0Offset = -2 * kPointerSize; 13543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kReceiverOffset = -1 * kPointerSize; 13643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 13743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 13843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 139b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.orgclass ArgumentsAdaptorFrameConstants : public AllStatic { 14043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 141750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org // FP-relative. 142b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org static const int kLengthOffset = StandardFrameConstants::kExpressionsOffset; 143750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 144659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org static const int kFrameSize = 145659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org StandardFrameConstants::kFixedFrameSize + kPointerSize; 14643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 14743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 14843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 149750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgclass ConstructFrameConstants : public AllStatic { 150750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org public: 151750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org // FP-relative. 152750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org static const int kImplicitReceiverOffset = -6 * kPointerSize; 153750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org static const int kConstructorOffset = -5 * kPointerSize; 154750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org static const int kLengthOffset = -4 * kPointerSize; 155750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org static const int kCodeOffset = StandardFrameConstants::kExpressionsOffset; 156750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 157750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org static const int kFrameSize = 158750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org StandardFrameConstants::kFixedFrameSize + 4 * kPointerSize; 159750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org}; 160750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 161750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 162b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.orgclass InternalFrameConstants : public AllStatic { 163b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org public: 164750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org // FP-relative. 165b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org static const int kCodeOffset = StandardFrameConstants::kExpressionsOffset; 166b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org}; 16743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 16843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 169bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.orginline Object* JavaScriptFrame::function_slot_object() const { 17043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen const int offset = JavaScriptFrameConstants::kFunctionOffset; 171bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org return Memory::Object_at(fp() + offset); 17243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 17343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 17443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 175d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orginline void StackHandler::SetFp(Address slot, Address fp) { 176d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org Memory::Address_at(slot) = fp; 177d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org} 178d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 179d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 18043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} } // namespace v8::internal 18143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1825ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org#endif // V8_ARM_FRAMES_ARM_H_ 183