112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Copyright 2011 the V8 project authors. All rights reserved.
212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Use of this source code is governed by a BSD-style license that can be
312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// found in the LICENSE file.
412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#ifndef V8_MIPS_FRAMES_MIPS_H_
812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#define V8_MIPS_FRAMES_MIPS_H_
912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
1012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgnamespace v8 {
1112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgnamespace internal {
1212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
1312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Register lists.
1412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Note that the bit values must match those used in actual instruction
1512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// encoding.
1612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int kNumRegs = 32;
1712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
1812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst RegList kJSCallerSaved =
1912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  1 << 2  |  // v0
2012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  1 << 3  |  // v1
2112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  1 << 4  |  // a0
2212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  1 << 5  |  // a1
2312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  1 << 6  |  // a2
2412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  1 << 7  |  // a3
2512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  1 << 8  |  // a4
2612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  1 << 9  |  // a5
2712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  1 << 10 |  // a6
2812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  1 << 11 |  // a7
2912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  1 << 12 |  // t0
3012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  1 << 13 |  // t1
3112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  1 << 14 |  // t2
3212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  1 << 15;   // t3
3312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
3412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int kNumJSCallerSaved = 14;
3512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
3612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
3712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Return the code of the n-th caller-saved register available to JavaScript
3812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// e.g. JSCallerSavedReg(0) returns a0.code() == 4.
3912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgint JSCallerSavedCode(int n);
4012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
4112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
4212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Callee-saved registers preserved when switching from C to JavaScript.
4312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst RegList kCalleeSaved =
4412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  1 << 16 |  // s0
4512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  1 << 17 |  // s1
4612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  1 << 18 |  // s2
4712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  1 << 19 |  // s3
4812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  1 << 20 |  // s4
4912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  1 << 21 |  // s5
5012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  1 << 22 |  // s6 (roots in Javascript code)
5112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  1 << 23 |  // s7 (cp in Javascript code)
5212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  1 << 30;   // fp/s8
5312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
5412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int kNumCalleeSaved = 9;
5512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
5612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst RegList kCalleeSavedFPU =
5712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  1 << 20 |  // f20
5812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  1 << 22 |  // f22
5912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  1 << 24 |  // f24
6012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  1 << 26 |  // f26
6112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  1 << 28 |  // f28
6212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  1 << 30;   // f30
6312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
6412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int kNumCalleeSavedFPU = 6;
6512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
6612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst RegList kCallerSavedFPU =
6712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  1 << 0  |  // f0
6812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  1 << 2  |  // f2
6912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  1 << 4  |  // f4
7012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  1 << 6  |  // f6
7112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  1 << 8  |  // f8
7212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  1 << 10 |  // f10
7312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  1 << 12 |  // f12
7412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  1 << 14 |  // f14
7512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  1 << 16 |  // f16
7612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  1 << 18;   // f18
7712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
7812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
7912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Number of registers for which space is reserved in safepoints. Must be a
8012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// multiple of 8.
8112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int kNumSafepointRegisters = 24;
8212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
8312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Define the list of registers actually saved at safepoints.
8412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Note that the number of saved registers may be smaller than the reserved
8512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// space, i.e. kNumSafepointSavedRegisters <= kNumSafepointRegisters.
8612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst RegList kSafepointSavedRegisters = kJSCallerSaved | kCalleeSaved;
8712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int kNumSafepointSavedRegisters =
8812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    kNumJSCallerSaved + kNumCalleeSaved;
8912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
9012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int kUndefIndex = -1;
9112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Map with indexes on stack that corresponds to codes of saved registers.
9212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int kSafepointRegisterStackIndexMap[kNumRegs] = {
9312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  kUndefIndex,  // zero_reg
9412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  kUndefIndex,  // at
9512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  0,   // v0
9612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  1,   // v1
9712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  2,   // a0
9812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  3,   // a1
9912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  4,   // a2
10012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  5,   // a3
10112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  6,   // a4
10212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  7,   // a5
10312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  8,   // a6
10412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  9,   // a7
10512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  10,  // t0
10612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  11,  // t1
10712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  12,  // t2
10812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  13,  // t3
10912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  14,  // s0
11012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  15,  // s1
11112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  16,  // s2
11212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  17,  // s3
11312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  18,  // s4
11412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  19,  // s5
11512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  20,  // s6
11612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  21,  // s7
11712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  kUndefIndex,  // t8
11812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  kUndefIndex,  // t9
11912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  kUndefIndex,  // k0
12012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  kUndefIndex,  // k1
12112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  kUndefIndex,  // gp
12212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  kUndefIndex,  // sp
12312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  22,  // fp
12412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  kUndefIndex
12512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org};
12612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
12712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
12812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// ----------------------------------------------------
12912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
13012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgclass EntryFrameConstants : public AllStatic {
13112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org public:
13212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  static const int kCallerFPOffset =
13312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      -(StandardFrameConstants::kFixedFrameSizeFromFp + kPointerSize);
13412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org};
13512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
13612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
13712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgclass ExitFrameConstants : public AllStatic {
13812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org public:
13912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  static const int kFrameSize = 2 * kPointerSize;
14012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
14112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  static const int kCodeOffset = -2 * kPointerSize;
14212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  static const int kSPOffset = -1 * kPointerSize;
14312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
14412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // The caller fields are below the frame pointer on the stack.
14512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  static const int kCallerFPOffset = +0 * kPointerSize;
14612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // The calling JS function is between FP and PC.
14712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  static const int kCallerPCOffset = +1 * kPointerSize;
14812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
14912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // MIPS-specific: a pointer to the old sp to avoid unnecessary calculations.
15012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  static const int kCallerSPOffset = +2 * kPointerSize;
15112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
15212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // FP-relative displacement of the caller's SP.
15312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  static const int kCallerSPDisplacement = +2 * kPointerSize;
15412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
15512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  static const int kConstantPoolOffset = 0;  // Not used.
15612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org};
15712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
15812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
15912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgclass JavaScriptFrameConstants : public AllStatic {
16012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org public:
16112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // FP-relative.
16212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  static const int kLocal0Offset = StandardFrameConstants::kExpressionsOffset;
16312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  static const int kLastParameterOffset = +2 * kPointerSize;
16412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  static const int kFunctionOffset = StandardFrameConstants::kMarkerOffset;
16512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
16612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Caller SP-relative.
16712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  static const int kParam0Offset   = -2 * kPointerSize;
16812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  static const int kReceiverOffset = -1 * kPointerSize;
16912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org};
17012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
17112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
17212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgclass ArgumentsAdaptorFrameConstants : public AllStatic {
17312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org public:
17412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // FP-relative.
17512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  static const int kLengthOffset = StandardFrameConstants::kExpressionsOffset;
17612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
17712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  static const int kFrameSize =
17812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      StandardFrameConstants::kFixedFrameSize + kPointerSize;
17912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org};
18012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
18112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
18212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgclass ConstructFrameConstants : public AllStatic {
18312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org public:
18412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // FP-relative.
18512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  static const int kImplicitReceiverOffset = -6 * kPointerSize;
18612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  static const int kConstructorOffset      = -5 * kPointerSize;
18712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  static const int kLengthOffset           = -4 * kPointerSize;
18812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  static const int kCodeOffset = StandardFrameConstants::kExpressionsOffset;
18912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
19012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  static const int kFrameSize =
19112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      StandardFrameConstants::kFixedFrameSize + 4 * kPointerSize;
19212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org};
19312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
19412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
19512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgclass InternalFrameConstants : public AllStatic {
19612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org public:
19712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // FP-relative.
19812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  static const int kCodeOffset = StandardFrameConstants::kExpressionsOffset;
19912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org};
20012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
20112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
20212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orginline Object* JavaScriptFrame::function_slot_object() const {
20312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  const int offset = JavaScriptFrameConstants::kFunctionOffset;
20412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return Memory::Object_at(fp() + offset);
20512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
20612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
20712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
20812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orginline void StackHandler::SetFp(Address slot, Address fp) {
20912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Memory::Address_at(slot) = fp;
21012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
21112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
21212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
21312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} }  // namespace v8::internal
21412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
21512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#endif
216