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 Popescu
343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescunamespace v8 {
353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescunamespace internal {
363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Register lists.
383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Note that the bit values must match those used in actual instruction
393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// encoding.
403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescustatic const int kNumRegs = 32;
413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescustatic const RegList kJSCallerSaved =
4344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  1 << 2 |  // v0
443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  1 << 4 |  // a0
453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  1 << 5 |  // a1
463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  1 << 6 |  // a2
473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  1 << 7;   // a3
483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
4944f0eee88ff00398ff7f715fab053374d808c90dSteve Blockstatic const int kNumJSCallerSaved = 5;
503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Return the code of the n-th caller-saved register available to JavaScript
5344f0eee88ff00398ff7f715fab053374d808c90dSteve Block// e.g. JSCallerSavedReg(0) returns a0.code() == 4.
543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuint JSCallerSavedCode(int n);
553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Callee-saved registers preserved when switching from C to JavaScript.
583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescustatic const RegList kCalleeSaved =
593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Saved temporaries.
603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  1 << 16 | 1 << 17 | 1 << 18 | 1 << 19 |
613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  1 << 20 | 1 << 21 | 1 << 22 | 1 << 23 |
623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // gp, sp, fp
633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  1 << 28 | 1 << 29 | 1 << 30;
643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescustatic const int kNumCalleeSaved = 11;
663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
6844f0eee88ff00398ff7f715fab053374d808c90dSteve Block// Number of registers for which space is reserved in safepoints. Must be a
6944f0eee88ff00398ff7f715fab053374d808c90dSteve Block// multiple of 8.
7044f0eee88ff00398ff7f715fab053374d808c90dSteve Block// TODO(mips): Only 8 registers may actually be sufficient. Revisit.
7144f0eee88ff00398ff7f715fab053374d808c90dSteve Blockstatic const int kNumSafepointRegisters = 16;
7244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
7344f0eee88ff00398ff7f715fab053374d808c90dSteve Block// Define the list of registers actually saved at safepoints.
7444f0eee88ff00398ff7f715fab053374d808c90dSteve Block// Note that the number of saved registers may be smaller than the reserved
7544f0eee88ff00398ff7f715fab053374d808c90dSteve Block// space, i.e. kNumSafepointSavedRegisters <= kNumSafepointRegisters.
7644f0eee88ff00398ff7f715fab053374d808c90dSteve Blockstatic const RegList kSafepointSavedRegisters = kJSCallerSaved | kCalleeSaved;
7744f0eee88ff00398ff7f715fab053374d808c90dSteve Blockstatic const int kNumSafepointSavedRegisters =
7844f0eee88ff00398ff7f715fab053374d808c90dSteve Block    kNumJSCallerSaved + kNumCalleeSaved;
7944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescutypedef Object* JSCallerSavedBuffer[kNumJSCallerSaved];
813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// ----------------------------------------------------
843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuclass StackHandlerConstants : public AllStatic {
863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu public:
873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  static const int kNextOffset  = 0 * kPointerSize;
883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  static const int kStateOffset = 1 * kPointerSize;
893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  static const int kFPOffset    = 2 * kPointerSize;
903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  static const int kPCOffset    = 3 * kPointerSize;
913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  static const int kSize = kPCOffset + kPointerSize;
933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuclass EntryFrameConstants : public AllStatic {
973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu public:
983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  static const int kCallerFPOffset      = -3 * kPointerSize;
993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
1003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuclass ExitFrameConstants : public AllStatic {
1033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu public:
1043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  static const int kDebugMarkOffset = -1 * kPointerSize;
1053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Must be the same as kDebugMarkOffset. Alias introduced when upgrading.
1063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  static const int kCodeOffset = -1 * kPointerSize;
10744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static const int kSPOffset = -1 * kPointerSize;
1083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
10944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // TODO(mips): Use a patched sp value on the stack instead.
11044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // A marker of 0 indicates that double registers are saved.
11144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static const int kMarkerOffset = -2 * kPointerSize;
1123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // The caller fields are below the frame pointer on the stack.
1143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  static const int kCallerFPOffset = +0 * kPointerSize;
1153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // The calling JS function is between FP and PC.
1163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  static const int kCallerPCOffset = +1 * kPointerSize;
1173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // FP-relative displacement of the caller's SP.
1196ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static const int kCallerSPDisplacement = +3 * kPointerSize;
1203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
1213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuclass StandardFrameConstants : public AllStatic {
1243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu public:
1253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  static const int kExpressionsOffset = -3 * kPointerSize;
1263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  static const int kMarkerOffset      = -2 * kPointerSize;
1273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  static const int kContextOffset     = -1 * kPointerSize;
1283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  static const int kCallerFPOffset    =  0 * kPointerSize;
1293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  static const int kCallerPCOffset    = +1 * kPointerSize;
1303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  static const int kCallerSPOffset    = +2 * kPointerSize;
1313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Size of the MIPS 4 32-bit argument slots.
1333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // This is just an alias with a shorter name. Use it from now on.
1343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  static const int kRArgsSlotsSize = 4 * kPointerSize;
1353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  static const int kRegularArgsSlotsSize = kRArgsSlotsSize;
1363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // C/C++ argument slots size.
1383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  static const int kCArgsSlotsSize = 4 * kPointerSize;
1393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // JS argument slots size.
1403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  static const int kJSArgsSlotsSize = 0 * kPointerSize;
14144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Assembly builtins argument slots size.
14244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static const int kBArgsSlotsSize = 0 * kPointerSize;
1433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
1443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuclass JavaScriptFrameConstants : public AllStatic {
1473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu public:
1483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // FP-relative.
1493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  static const int kLocal0Offset = StandardFrameConstants::kExpressionsOffset;
1508b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  static const int kLastParameterOffset = +2 * kPointerSize;
1513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  static const int kFunctionOffset = StandardFrameConstants::kMarkerOffset;
1523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Caller SP-relative.
1543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  static const int kParam0Offset   = -2 * kPointerSize;
1553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  static const int kReceiverOffset = -1 * kPointerSize;
1563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
1573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuclass ArgumentsAdaptorFrameConstants : public AllStatic {
1603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu public:
1613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  static const int kLengthOffset = StandardFrameConstants::kExpressionsOffset;
1623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
1633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuclass InternalFrameConstants : public AllStatic {
1663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu public:
1673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  static const int kCodeOffset = StandardFrameConstants::kExpressionsOffset;
1683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
1693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuinline Object* JavaScriptFrame::function_slot_object() const {
1723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  const int offset = JavaScriptFrameConstants::kFunctionOffset;
1733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return Memory::Object_at(fp() + offset);
1743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
1753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
17644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} }  // namespace v8::internal
1783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu#endif
180