frames-mips.h 7.06 KB
Newer Older
1
// Copyright 2011 the V8 project authors. All rights reserved.
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
//     * Redistributions of source code must retain the above copyright
//       notice, this list of conditions and the following disclaimer.
//     * Redistributions in binary form must reproduce the above
//       copyright notice, this list of conditions and the following
//       disclaimer in the documentation and/or other materials provided
//       with the distribution.
//     * Neither the name of Google Inc. nor the names of its
//       contributors may be used to endorse or promote products derived
//       from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.



#ifndef V8_MIPS_FRAMES_MIPS_H_
#define V8_MIPS_FRAMES_MIPS_H_

namespace v8 {
namespace internal {

// Register lists.
// Note that the bit values must match those used in actual instruction
// encoding.
39
const int kNumRegs = 32;
40

41
const RegList kJSCallerSaved =
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
  1 << 2  |  // v0
  1 << 3  |  // v1
  1 << 4  |  // a0
  1 << 5  |  // a1
  1 << 6  |  // a2
  1 << 7  |  // a3
  1 << 8  |  // t0
  1 << 9  |  // t1
  1 << 10 |  // t2
  1 << 11 |  // t3
  1 << 12 |  // t4
  1 << 13 |  // t5
  1 << 14 |  // t6
  1 << 15;   // t7

57
const int kNumJSCallerSaved = 14;
58 59 60


// Return the code of the n-th caller-saved register available to JavaScript
61
// e.g. JSCallerSavedReg(0) returns a0.code() == 4.
62 63 64 65
int JSCallerSavedCode(int n);


// Callee-saved registers preserved when switching from C to JavaScript.
66
const RegList kCalleeSaved =
67 68 69 70 71 72 73 74 75
  1 << 16 |  // s0
  1 << 17 |  // s1
  1 << 18 |  // s2
  1 << 19 |  // s3
  1 << 20 |  // s4
  1 << 21 |  // s5
  1 << 22 |  // s6 (roots in Javascript code)
  1 << 23 |  // s7 (cp in Javascript code)
  1 << 30;   // fp/s8
76

77
const int kNumCalleeSaved = 9;
78

79
const RegList kCalleeSavedFPU =
80 81 82 83 84 85
  1 << 20 |  // f20
  1 << 22 |  // f22
  1 << 24 |  // f24
  1 << 26 |  // f26
  1 << 28 |  // f28
  1 << 30;   // f30
86

87
const int kNumCalleeSavedFPU = 6;
88

89
const RegList kCallerSavedFPU =
90 91 92 93 94 95 96 97 98 99 100 101
  1 << 0  |  // f0
  1 << 2  |  // f2
  1 << 4  |  // f4
  1 << 6  |  // f6
  1 << 8  |  // f8
  1 << 10 |  // f10
  1 << 12 |  // f12
  1 << 14 |  // f14
  1 << 16 |  // f16
  1 << 18;   // f18


102 103
// Number of registers for which space is reserved in safepoints. Must be a
// multiple of 8.
104
const int kNumSafepointRegisters = 24;
105 106 107 108

// Define the list of registers actually saved at safepoints.
// Note that the number of saved registers may be smaller than the reserved
// space, i.e. kNumSafepointSavedRegisters <= kNumSafepointRegisters.
109 110
const RegList kSafepointSavedRegisters = kJSCallerSaved | kCalleeSaved;
const int kNumSafepointSavedRegisters =
111 112
    kNumJSCallerSaved + kNumCalleeSaved;

113 114
typedef Object* JSCallerSavedBuffer[kNumJSCallerSaved];

115
const int kUndefIndex = -1;
116
// Map with indexes on stack that corresponds to codes of saved registers.
117
const int kSafepointRegisterStackIndexMap[kNumRegs] = {
118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
  kUndefIndex,  // zero_reg
  kUndefIndex,  // at
  0,   // v0
  1,   // v1
  2,   // a0
  3,   // a1
  4,   // a2
  5,   // a3
  6,   // t0
  7,   // t1
  8,   // t2
  9,   // t3
  10,  // t4
  11,  // t5
  12,  // t6
  13,  // t7
  14,  // s0
  15,  // s1
  16,  // s2
  17,  // s3
  18,  // s4
  19,  // s5
  20,  // s6
  21,  // s7
  kUndefIndex,  // t8
  kUndefIndex,  // t9
  kUndefIndex,  // k0
  kUndefIndex,  // k1
  kUndefIndex,  // gp
  kUndefIndex,  // sp
  22,  // fp
149 150 151
  kUndefIndex
};

152 153 154 155 156

// ----------------------------------------------------

class StackHandlerConstants : public AllStatic {
 public:
157 158 159 160 161
  static const int kNextOffset     = 0 * kPointerSize;
  static const int kCodeOffset     = 1 * kPointerSize;
  static const int kStateOffset    = 2 * kPointerSize;
  static const int kContextOffset  = 3 * kPointerSize;
  static const int kFPOffset       = 4 * kPointerSize;
162

163
  static const int kSize = kFPOffset + kPointerSize;
164 165 166 167 168 169 170 171 172 173 174
};


class EntryFrameConstants : public AllStatic {
 public:
  static const int kCallerFPOffset      = -3 * kPointerSize;
};


class ExitFrameConstants : public AllStatic {
 public:
175 176 177 178 179
  // See some explanation in MacroAssembler::EnterExitFrame.
  // This marks the top of the extra allocated stack space.
  static const int kStackSpaceOffset = -3 * kPointerSize;

  static const int kCodeOffset = -2 * kPointerSize;
180

181
  static const int kSPOffset = -1 * kPointerSize;
182 183 184 185 186 187

  // The caller fields are below the frame pointer on the stack.
  static const int kCallerFPOffset = +0 * kPointerSize;
  // The calling JS function is between FP and PC.
  static const int kCallerPCOffset = +1 * kPointerSize;

188 189 190
  // MIPS-specific: a pointer to the old sp to avoid unnecessary calculations.
  static const int kCallerSPOffset = +2 * kPointerSize;

191
  // FP-relative displacement of the caller's SP.
192
  static const int kCallerSPDisplacement = +2 * kPointerSize;
193 194 195 196 197 198 199
};


class JavaScriptFrameConstants : public AllStatic {
 public:
  // FP-relative.
  static const int kLocal0Offset = StandardFrameConstants::kExpressionsOffset;
200
  static const int kLastParameterOffset = +2 * kPointerSize;
201 202 203 204 205 206 207 208 209 210
  static const int kFunctionOffset = StandardFrameConstants::kMarkerOffset;

  // Caller SP-relative.
  static const int kParam0Offset   = -2 * kPointerSize;
  static const int kReceiverOffset = -1 * kPointerSize;
};


class ArgumentsAdaptorFrameConstants : public AllStatic {
 public:
211
  // FP-relative.
212
  static const int kLengthOffset = StandardFrameConstants::kExpressionsOffset;
213

214 215
  static const int kFrameSize =
      StandardFrameConstants::kFixedFrameSize + kPointerSize;
216 217 218
};


219 220 221 222 223 224 225 226 227 228 229 230 231
class ConstructFrameConstants : public AllStatic {
 public:
  // FP-relative.
  static const int kImplicitReceiverOffset = -6 * kPointerSize;
  static const int kConstructorOffset      = -5 * kPointerSize;
  static const int kLengthOffset           = -4 * kPointerSize;
  static const int kCodeOffset = StandardFrameConstants::kExpressionsOffset;

  static const int kFrameSize =
      StandardFrameConstants::kFixedFrameSize + 4 * kPointerSize;
};


232 233
class InternalFrameConstants : public AllStatic {
 public:
234
  // FP-relative.
235 236 237 238 239 240 241 242 243
  static const int kCodeOffset = StandardFrameConstants::kExpressionsOffset;
};


inline Object* JavaScriptFrame::function_slot_object() const {
  const int offset = JavaScriptFrameConstants::kFunctionOffset;
  return Memory::Object_at(fp() + offset);
}

244

245 246 247
} }  // namespace v8::internal

#endif