144f0eee88ff00398ff7f715fab053374d808c90dSteve Block// Copyright 2011 the V8 project authors. All rights reserved.
23100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Redistribution and use in source and binary forms, with or without
33100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// modification, are permitted provided that the following conditions are
43100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// met:
53100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//
63100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//     * Redistributions of source code must retain the above copyright
73100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//       notice, this list of conditions and the following disclaimer.
83100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//     * Redistributions in binary form must reproduce the above
93100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//       copyright notice, this list of conditions and the following
103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//       disclaimer in the documentation and/or other materials provided
113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//       with the distribution.
123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//     * Neither the name of Google Inc. nor the names of its
133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//       contributors may be used to endorse or promote products derived
143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//       from this software without specific prior written permission.
153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//
163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu#ifndef V8_MIPS_FRAMES_MIPS_H_
313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu#define V8_MIPS_FRAMES_MIPS_H_
323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescunamespace v8 {
343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescunamespace internal {
353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Register lists.
373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Note that the bit values must match those used in actual instruction
383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// encoding.
393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochconst int kNumRegs = 32;
403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochconst RegList kJSCallerSaved =
42589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  1 << 2  |  // v0
43589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  1 << 3  |  // v1
44589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  1 << 4  |  // a0
45589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  1 << 5  |  // a1
46589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  1 << 6  |  // a2
47589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  1 << 7  |  // a3
48589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  1 << 8  |  // t0
49589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  1 << 9  |  // t1
50589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  1 << 10 |  // t2
51589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  1 << 11 |  // t3
52589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  1 << 12 |  // t4
53589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  1 << 13 |  // t5
54589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  1 << 14 |  // t6
55589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  1 << 15;   // t7
56589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochconst int kNumJSCallerSaved = 14;
583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Return the code of the n-th caller-saved register available to JavaScript
6144f0eee88ff00398ff7f715fab053374d808c90dSteve Block// e.g. JSCallerSavedReg(0) returns a0.code() == 4.
623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuint JSCallerSavedCode(int n);
633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Callee-saved registers preserved when switching from C to JavaScript.
663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochconst RegList kCalleeSaved =
67589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  1 << 16 |  // s0
68589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  1 << 17 |  // s1
69589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  1 << 18 |  // s2
70589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  1 << 19 |  // s3
71589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  1 << 20 |  // s4
72589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  1 << 21 |  // s5
73589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  1 << 22 |  // s6 (roots in Javascript code)
74589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  1 << 23 |  // s7 (cp in Javascript code)
75589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  1 << 30;   // fp/s8
763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochconst int kNumCalleeSaved = 9;
783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochconst RegList kCalleeSavedFPU =
80589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  1 << 20 |  // f20
81589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  1 << 22 |  // f22
82589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  1 << 24 |  // f24
83589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  1 << 26 |  // f26
84589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  1 << 28 |  // f28
85589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  1 << 30;   // f30
863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochconst int kNumCalleeSavedFPU = 6;
883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochconst RegList kCallerSavedFPU =
903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  1 << 0  |  // f0
913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  1 << 2  |  // f2
923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  1 << 4  |  // f4
933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  1 << 6  |  // f6
943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  1 << 8  |  // f8
953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  1 << 10 |  // f10
963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  1 << 12 |  // f12
973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  1 << 14 |  // f14
983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  1 << 16 |  // f16
993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  1 << 18;   // f18
1003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
10244f0eee88ff00398ff7f715fab053374d808c90dSteve Block// Number of registers for which space is reserved in safepoints. Must be a
10344f0eee88ff00398ff7f715fab053374d808c90dSteve Block// multiple of 8.
1043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochconst int kNumSafepointRegisters = 24;
10544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
10644f0eee88ff00398ff7f715fab053374d808c90dSteve Block// Define the list of registers actually saved at safepoints.
10744f0eee88ff00398ff7f715fab053374d808c90dSteve Block// Note that the number of saved registers may be smaller than the reserved
10844f0eee88ff00398ff7f715fab053374d808c90dSteve Block// space, i.e. kNumSafepointSavedRegisters <= kNumSafepointRegisters.
1093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochconst RegList kSafepointSavedRegisters = kJSCallerSaved | kCalleeSaved;
1103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochconst int kNumSafepointSavedRegisters =
11144f0eee88ff00398ff7f715fab053374d808c90dSteve Block    kNumJSCallerSaved + kNumCalleeSaved;
11244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescutypedef Object* JSCallerSavedBuffer[kNumJSCallerSaved];
1143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochconst int kUndefIndex = -1;
116257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// Map with indexes on stack that corresponds to codes of saved registers.
1173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochconst int kSafepointRegisterStackIndexMap[kNumRegs] = {
118589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  kUndefIndex,  // zero_reg
119589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  kUndefIndex,  // at
120589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  0,   // v0
121589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  1,   // v1
122589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  2,   // a0
123589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  3,   // a1
124589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  4,   // a2
125589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  5,   // a3
126589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  6,   // t0
127589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  7,   // t1
128589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  8,   // t2
129589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  9,   // t3
130589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  10,  // t4
131589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  11,  // t5
132589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  12,  // t6
133589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  13,  // t7
134589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  14,  // s0
135589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  15,  // s1
136589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  16,  // s2
137589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  17,  // s3
138589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  18,  // s4
139589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  19,  // s5
140589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  20,  // s6
141589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  21,  // s7
142589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  kUndefIndex,  // t8
143589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  kUndefIndex,  // t9
144589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  kUndefIndex,  // k0
145589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  kUndefIndex,  // k1
146589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  kUndefIndex,  // gp
147589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  kUndefIndex,  // sp
148589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  22,  // fp
149257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  kUndefIndex
150257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
151257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// ----------------------------------------------------
1543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuclass StackHandlerConstants : public AllStatic {
1563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu public:
1573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  static const int kNextOffset     = 0 * kPointerSize;
1583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  static const int kCodeOffset     = 1 * kPointerSize;
1593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  static const int kStateOffset    = 2 * kPointerSize;
1603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  static const int kContextOffset  = 3 * kPointerSize;
1613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  static const int kFPOffset       = 4 * kPointerSize;
1623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  static const int kSize = kFPOffset + kPointerSize;
1643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
1653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuclass EntryFrameConstants : public AllStatic {
1683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu public:
1693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  static const int kCallerFPOffset      = -3 * kPointerSize;
1703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
1713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuclass ExitFrameConstants : public AllStatic {
1743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu public:
175257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // See some explanation in MacroAssembler::EnterExitFrame.
176257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // This marks the top of the extra allocated stack space.
177257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  static const int kStackSpaceOffset = -3 * kPointerSize;
1783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
179257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  static const int kCodeOffset = -2 * kPointerSize;
180257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
181257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  static const int kSPOffset = -1 * kPointerSize;
1823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // The caller fields are below the frame pointer on the stack.
1843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  static const int kCallerFPOffset = +0 * kPointerSize;
1853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // The calling JS function is between FP and PC.
1863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  static const int kCallerPCOffset = +1 * kPointerSize;
1873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
188257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // MIPS-specific: a pointer to the old sp to avoid unnecessary calculations.
189257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  static const int kCallerSPOffset = +2 * kPointerSize;
190257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // FP-relative displacement of the caller's SP.
192257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  static const int kCallerSPDisplacement = +2 * kPointerSize;
1933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
1943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuclass StandardFrameConstants : public AllStatic {
1973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu public:
1983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Fixed part of the frame consists of return address, caller fp,
1993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // context and function.
2003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  static const int kFixedFrameSize    =  4 * kPointerSize;
2013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  static const int kExpressionsOffset = -3 * kPointerSize;
2023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  static const int kMarkerOffset      = -2 * kPointerSize;
2033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  static const int kContextOffset     = -1 * kPointerSize;
2043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  static const int kCallerFPOffset    =  0 * kPointerSize;
2053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  static const int kCallerPCOffset    = +1 * kPointerSize;
2063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  static const int kCallerSPOffset    = +2 * kPointerSize;
2073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Size of the MIPS 4 32-bit argument slots.
2093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // This is just an alias with a shorter name. Use it from now on.
2103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  static const int kRArgsSlotsSize = 4 * kPointerSize;
2113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  static const int kRegularArgsSlotsSize = kRArgsSlotsSize;
2123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // JS argument slots size.
2143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  static const int kJSArgsSlotsSize = 0 * kPointerSize;
21544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Assembly builtins argument slots size.
21644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static const int kBArgsSlotsSize = 0 * kPointerSize;
2173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
2183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuclass JavaScriptFrameConstants : public AllStatic {
2213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu public:
2223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // FP-relative.
2233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  static const int kLocal0Offset = StandardFrameConstants::kExpressionsOffset;
2248b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  static const int kLastParameterOffset = +2 * kPointerSize;
2253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  static const int kFunctionOffset = StandardFrameConstants::kMarkerOffset;
2263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Caller SP-relative.
2283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  static const int kParam0Offset   = -2 * kPointerSize;
2293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  static const int kReceiverOffset = -1 * kPointerSize;
2303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
2313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuclass ArgumentsAdaptorFrameConstants : public AllStatic {
2343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu public:
2353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  static const int kLengthOffset = StandardFrameConstants::kExpressionsOffset;
2363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  static const int kFrameSize =
2373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      StandardFrameConstants::kFixedFrameSize + kPointerSize;
2383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
2393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuclass InternalFrameConstants : public AllStatic {
2423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu public:
2433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  static const int kCodeOffset = StandardFrameConstants::kExpressionsOffset;
2443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
2453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuinline Object* JavaScriptFrame::function_slot_object() const {
2483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  const int offset = JavaScriptFrameConstants::kFunctionOffset;
2493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return Memory::Object_at(fp() + offset);
2503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
2513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
25244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
2533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} }  // namespace v8::internal
2543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu#endif
256