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