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