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