v8  3.14.5(node0.10.28)
V8 is Google's open source JavaScript engine
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
frames-mips.h
Go to the documentation of this file.
1 // Copyright 2011 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are
4 // met:
5 //
6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided
11 // with the distribution.
12 // * Neither the name of Google Inc. nor the names of its
13 // contributors may be used to endorse or promote products derived
14 // from this software without specific prior written permission.
15 //
16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 
28 
29 
30 #ifndef V8_MIPS_FRAMES_MIPS_H_
31 #define V8_MIPS_FRAMES_MIPS_H_
32 
33 namespace v8 {
34 namespace internal {
35 
36 // Register lists.
37 // Note that the bit values must match those used in actual instruction
38 // encoding.
39 const int kNumRegs = 32;
40 
41 const RegList kJSCallerSaved =
42  1 << 2 | // v0
43  1 << 3 | // v1
44  1 << 4 | // a0
45  1 << 5 | // a1
46  1 << 6 | // a2
47  1 << 7 | // a3
48  1 << 8 | // t0
49  1 << 9 | // t1
50  1 << 10 | // t2
51  1 << 11 | // t3
52  1 << 12 | // t4
53  1 << 13 | // t5
54  1 << 14 | // t6
55  1 << 15; // t7
56 
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 int JSCallerSavedCode(int n);
63 
64 
65 // Callee-saved registers preserved when switching from C to JavaScript.
66 const RegList kCalleeSaved =
67  1 << 16 | // s0
68  1 << 17 | // s1
69  1 << 18 | // s2
70  1 << 19 | // s3
71  1 << 20 | // s4
72  1 << 21 | // s5
73  1 << 22 | // s6 (roots in Javascript code)
74  1 << 23 | // s7 (cp in Javascript code)
75  1 << 30; // fp/s8
76 
77 const int kNumCalleeSaved = 9;
78 
80  1 << 20 | // f20
81  1 << 22 | // f22
82  1 << 24 | // f24
83  1 << 26 | // f26
84  1 << 28 | // f28
85  1 << 30; // f30
86 
87 const int kNumCalleeSavedFPU = 6;
88 
90  1 << 0 | // f0
91  1 << 2 | // f2
92  1 << 4 | // f4
93  1 << 6 | // f6
94  1 << 8 | // f8
95  1 << 10 | // f10
96  1 << 12 | // f12
97  1 << 14 | // f14
98  1 << 16 | // f16
99  1 << 18; // f18
100 
101 
102 // Number of registers for which space is reserved in safepoints. Must be a
103 // multiple of 8.
104 const int kNumSafepointRegisters = 24;
105 
106 // Define the list of registers actually saved at safepoints.
107 // Note that the number of saved registers may be smaller than the reserved
108 // space, i.e. kNumSafepointSavedRegisters <= kNumSafepointRegisters.
110 const int kNumSafepointSavedRegisters =
112 
114 
115 const int kUndefIndex = -1;
116 // Map with indexes on stack that corresponds to codes of saved registers.
118  kUndefIndex, // zero_reg
119  kUndefIndex, // at
120  0, // v0
121  1, // v1
122  2, // a0
123  3, // a1
124  4, // a2
125  5, // a3
126  6, // t0
127  7, // t1
128  8, // t2
129  9, // t3
130  10, // t4
131  11, // t5
132  12, // t6
133  13, // t7
134  14, // s0
135  15, // s1
136  16, // s2
137  17, // s3
138  18, // s4
139  19, // s5
140  20, // s6
141  21, // s7
142  kUndefIndex, // t8
143  kUndefIndex, // t9
144  kUndefIndex, // k0
145  kUndefIndex, // k1
146  kUndefIndex, // gp
147  kUndefIndex, // sp
148  22, // fp
149  kUndefIndex
150 };
151 
152 
153 // ----------------------------------------------------
154 
155 class StackHandlerConstants : public AllStatic {
156  public:
157  static const int kNextOffset = 0 * kPointerSize;
158  static const int kCodeOffset = 1 * kPointerSize;
159  static const int kStateOffset = 2 * kPointerSize;
160  static const int kContextOffset = 3 * kPointerSize;
161  static const int kFPOffset = 4 * kPointerSize;
162 
163  static const int kSize = kFPOffset + kPointerSize;
164 };
165 
166 
167 class EntryFrameConstants : public AllStatic {
168  public:
169  static const int kCallerFPOffset = -3 * kPointerSize;
170 };
171 
172 
173 class ExitFrameConstants : public AllStatic {
174  public:
175  // See some explanation in MacroAssembler::EnterExitFrame.
176  // This marks the top of the extra allocated stack space.
177  static const int kStackSpaceOffset = -3 * kPointerSize;
178 
179  static const int kCodeOffset = -2 * kPointerSize;
180 
181  static const int kSPOffset = -1 * kPointerSize;
182 
183  // The caller fields are below the frame pointer on the stack.
184  static const int kCallerFPOffset = +0 * kPointerSize;
185  // The calling JS function is between FP and PC.
186  static const int kCallerPCOffset = +1 * kPointerSize;
187 
188  // MIPS-specific: a pointer to the old sp to avoid unnecessary calculations.
189  static const int kCallerSPOffset = +2 * kPointerSize;
190 
191  // FP-relative displacement of the caller's SP.
192  static const int kCallerSPDisplacement = +2 * kPointerSize;
193 };
194 
195 
196 class StandardFrameConstants : public AllStatic {
197  public:
198  // Fixed part of the frame consists of return address, caller fp,
199  // context and function.
200  static const int kFixedFrameSize = 4 * kPointerSize;
201  static const int kExpressionsOffset = -3 * kPointerSize;
202  static const int kMarkerOffset = -2 * kPointerSize;
203  static const int kContextOffset = -1 * kPointerSize;
204  static const int kCallerFPOffset = 0 * kPointerSize;
205  static const int kCallerPCOffset = +1 * kPointerSize;
206  static const int kCallerSPOffset = +2 * kPointerSize;
207 
208  // Size of the MIPS 4 32-bit argument slots.
209  // This is just an alias with a shorter name. Use it from now on.
210  static const int kRArgsSlotsSize = 4 * kPointerSize;
212 
213  // JS argument slots size.
214  static const int kJSArgsSlotsSize = 0 * kPointerSize;
215  // Assembly builtins argument slots size.
216  static const int kBArgsSlotsSize = 0 * kPointerSize;
217 };
218 
219 
220 class JavaScriptFrameConstants : public AllStatic {
221  public:
222  // FP-relative.
224  static const int kLastParameterOffset = +2 * kPointerSize;
226 
227  // Caller SP-relative.
228  static const int kParam0Offset = -2 * kPointerSize;
229  static const int kReceiverOffset = -1 * kPointerSize;
230 };
231 
232 
233 class ArgumentsAdaptorFrameConstants : public AllStatic {
234  public:
236  static const int kFrameSize =
238 };
239 
240 
241 class InternalFrameConstants : public AllStatic {
242  public:
244 };
245 
246 
247 inline Object* JavaScriptFrame::function_slot_object() const {
249  return Memory::Object_at(fp() + offset);
250 }
251 
252 
253 } } // namespace v8::internal
254 
255 #endif
const RegList kSafepointSavedRegisters
Definition: frames-arm.h:97
const int kUndefIndex
Definition: frames-mips.h:115
static Object *& Object_at(Address addr)
Definition: v8memory.h:75
const int kNumCalleeSavedFPU
Definition: frames-mips.h:87
uint32_t RegList
Definition: frames.h:38
const int kNumSafepointSavedRegisters
Definition: frames-arm.h:98
static const int kCallerSPOffset
Definition: frames-mips.h:189
const RegList kJSCallerSaved
Definition: frames-arm.h:47
static const int kStackSpaceOffset
Definition: frames-mips.h:177
const RegList kCalleeSavedFPU
Definition: frames-mips.h:79
int JSCallerSavedCode(int n)
Definition: frames.cc:1403
const RegList kCallerSavedFPU
Definition: frames-mips.h:89
static const int kCallerPCOffset
Definition: frames-arm.h:129
static const int kCallerFPOffset
Definition: frames-arm.h:127
const int kPointerSize
Definition: globals.h:220
const RegList kCalleeSaved
Definition: frames-arm.h:63
const int kNumJSCallerSaved
Definition: frames-arm.h:53
static const int kCallerSPDisplacement
Definition: frames-arm.h:133
const int kNumCalleeSaved
Definition: frames-arm.h:83
static const int kCallerFPOffset
Definition: frames-arm.h:117
const int kNumSafepointRegisters
Definition: frames-arm.h:92
Object * JSCallerSavedBuffer[kNumJSCallerSaved]
Definition: frames-arm.h:55
const int kSafepointRegisterStackIndexMap[kNumRegs]
Definition: frames-mips.h:117
const Register fp
const int kNumRegs
Definition: frames-arm.h:43