blob: 849dea2841996d46364900071953612365536b4e [file] [log] [blame]
Steve Block44f0eee2011-05-26 01:26:41 +01001// Copyright 2011 the V8 project authors. All rights reserved.
Ben Murdochb8a8cc12014-11-26 15:28:44 +00002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
Andrei Popescu31002712010-02-23 13:46:05 +00004
5
6
7#ifndef V8_MIPS_FRAMES_MIPS_H_
8#define V8_MIPS_FRAMES_MIPS_H_
9
Andrei Popescu31002712010-02-23 13:46:05 +000010namespace v8 {
11namespace internal {
12
13// Register lists.
14// Note that the bit values must match those used in actual instruction
15// encoding.
Ben Murdoch3ef787d2012-04-12 10:51:47 +010016const int kNumRegs = 32;
Andrei Popescu31002712010-02-23 13:46:05 +000017
Ben Murdoch3ef787d2012-04-12 10:51:47 +010018const RegList kJSCallerSaved =
Ben Murdoch589d6972011-11-30 16:04:58 +000019 1 << 2 | // v0
20 1 << 3 | // v1
21 1 << 4 | // a0
22 1 << 5 | // a1
23 1 << 6 | // a2
24 1 << 7 | // a3
25 1 << 8 | // t0
26 1 << 9 | // t1
27 1 << 10 | // t2
28 1 << 11 | // t3
29 1 << 12 | // t4
30 1 << 13 | // t5
31 1 << 14 | // t6
32 1 << 15; // t7
Andrei Popescu31002712010-02-23 13:46:05 +000033
Ben Murdoch3ef787d2012-04-12 10:51:47 +010034const int kNumJSCallerSaved = 14;
Andrei Popescu31002712010-02-23 13:46:05 +000035
36
37// Return the code of the n-th caller-saved register available to JavaScript
Steve Block44f0eee2011-05-26 01:26:41 +010038// e.g. JSCallerSavedReg(0) returns a0.code() == 4.
Andrei Popescu31002712010-02-23 13:46:05 +000039int JSCallerSavedCode(int n);
40
41
42// Callee-saved registers preserved when switching from C to JavaScript.
Ben Murdoch3ef787d2012-04-12 10:51:47 +010043const RegList kCalleeSaved =
Ben Murdoch589d6972011-11-30 16:04:58 +000044 1 << 16 | // s0
45 1 << 17 | // s1
46 1 << 18 | // s2
47 1 << 19 | // s3
48 1 << 20 | // s4
49 1 << 21 | // s5
50 1 << 22 | // s6 (roots in Javascript code)
51 1 << 23 | // s7 (cp in Javascript code)
52 1 << 30; // fp/s8
Andrei Popescu31002712010-02-23 13:46:05 +000053
Ben Murdoch3ef787d2012-04-12 10:51:47 +010054const int kNumCalleeSaved = 9;
Andrei Popescu31002712010-02-23 13:46:05 +000055
Ben Murdoch3ef787d2012-04-12 10:51:47 +010056const RegList kCalleeSavedFPU =
Ben Murdoch589d6972011-11-30 16:04:58 +000057 1 << 20 | // f20
58 1 << 22 | // f22
59 1 << 24 | // f24
60 1 << 26 | // f26
61 1 << 28 | // f28
62 1 << 30; // f30
Andrei Popescu31002712010-02-23 13:46:05 +000063
Ben Murdoch3ef787d2012-04-12 10:51:47 +010064const int kNumCalleeSavedFPU = 6;
65
66const RegList kCallerSavedFPU =
67 1 << 0 | // f0
68 1 << 2 | // f2
69 1 << 4 | // f4
70 1 << 6 | // f6
71 1 << 8 | // f8
72 1 << 10 | // f10
73 1 << 12 | // f12
74 1 << 14 | // f14
75 1 << 16 | // f16
76 1 << 18; // f18
77
78
Steve Block44f0eee2011-05-26 01:26:41 +010079// Number of registers for which space is reserved in safepoints. Must be a
80// multiple of 8.
Ben Murdoch3ef787d2012-04-12 10:51:47 +010081const int kNumSafepointRegisters = 24;
Steve Block44f0eee2011-05-26 01:26:41 +010082
83// Define the list of registers actually saved at safepoints.
84// Note that the number of saved registers may be smaller than the reserved
85// space, i.e. kNumSafepointSavedRegisters <= kNumSafepointRegisters.
Ben Murdoch3ef787d2012-04-12 10:51:47 +010086const RegList kSafepointSavedRegisters = kJSCallerSaved | kCalleeSaved;
87const int kNumSafepointSavedRegisters =
Steve Block44f0eee2011-05-26 01:26:41 +010088 kNumJSCallerSaved + kNumCalleeSaved;
89
Ben Murdoch3ef787d2012-04-12 10:51:47 +010090const int kUndefIndex = -1;
Ben Murdoch257744e2011-11-30 15:57:28 +000091// Map with indexes on stack that corresponds to codes of saved registers.
Ben Murdoch3ef787d2012-04-12 10:51:47 +010092const int kSafepointRegisterStackIndexMap[kNumRegs] = {
Ben Murdoch589d6972011-11-30 16:04:58 +000093 kUndefIndex, // zero_reg
94 kUndefIndex, // at
95 0, // v0
96 1, // v1
97 2, // a0
98 3, // a1
99 4, // a2
100 5, // a3
101 6, // t0
102 7, // t1
103 8, // t2
104 9, // t3
105 10, // t4
106 11, // t5
107 12, // t6
108 13, // t7
109 14, // s0
110 15, // s1
111 16, // s2
112 17, // s3
113 18, // s4
114 19, // s5
115 20, // s6
116 21, // s7
117 kUndefIndex, // t8
118 kUndefIndex, // t9
119 kUndefIndex, // k0
120 kUndefIndex, // k1
121 kUndefIndex, // gp
122 kUndefIndex, // sp
123 22, // fp
Ben Murdoch257744e2011-11-30 15:57:28 +0000124 kUndefIndex
125};
126
Andrei Popescu31002712010-02-23 13:46:05 +0000127
128// ----------------------------------------------------
129
Andrei Popescu31002712010-02-23 13:46:05 +0000130class EntryFrameConstants : public AllStatic {
131 public:
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000132 static const int kCallerFPOffset =
133 -(StandardFrameConstants::kFixedFrameSizeFromFp + kPointerSize);
Andrei Popescu31002712010-02-23 13:46:05 +0000134};
135
136
137class ExitFrameConstants : public AllStatic {
138 public:
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000139 static const int kFrameSize = 2 * kPointerSize;
Andrei Popescu31002712010-02-23 13:46:05 +0000140
Ben Murdoch257744e2011-11-30 15:57:28 +0000141 static const int kCodeOffset = -2 * kPointerSize;
Ben Murdoch257744e2011-11-30 15:57:28 +0000142 static const int kSPOffset = -1 * kPointerSize;
Andrei Popescu31002712010-02-23 13:46:05 +0000143
144 // The caller fields are below the frame pointer on the stack.
145 static const int kCallerFPOffset = +0 * kPointerSize;
146 // The calling JS function is between FP and PC.
147 static const int kCallerPCOffset = +1 * kPointerSize;
148
Ben Murdoch257744e2011-11-30 15:57:28 +0000149 // MIPS-specific: a pointer to the old sp to avoid unnecessary calculations.
150 static const int kCallerSPOffset = +2 * kPointerSize;
151
Andrei Popescu31002712010-02-23 13:46:05 +0000152 // FP-relative displacement of the caller's SP.
Ben Murdoch257744e2011-11-30 15:57:28 +0000153 static const int kCallerSPDisplacement = +2 * kPointerSize;
Andrei Popescu31002712010-02-23 13:46:05 +0000154
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000155 static const int kConstantPoolOffset = 0; // Not used.
Andrei Popescu31002712010-02-23 13:46:05 +0000156};
157
158
159class JavaScriptFrameConstants : public AllStatic {
160 public:
161 // FP-relative.
162 static const int kLocal0Offset = StandardFrameConstants::kExpressionsOffset;
Ben Murdoch8b112d22011-06-08 16:22:53 +0100163 static const int kLastParameterOffset = +2 * kPointerSize;
Andrei Popescu31002712010-02-23 13:46:05 +0000164 static const int kFunctionOffset = StandardFrameConstants::kMarkerOffset;
165
166 // Caller SP-relative.
167 static const int kParam0Offset = -2 * kPointerSize;
168 static const int kReceiverOffset = -1 * kPointerSize;
169};
170
171
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000172} // namespace internal
173} // namespace v8
Andrei Popescu31002712010-02-23 13:46:05 +0000174
175#endif