blob: 3511679708931b3bb69ff0909e34c14e1a178900 [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
Ben Murdochda12d292016-06-02 14:46:10 +0100136class ExitFrameConstants : public TypedFrameConstants {
Andrei Popescu31002712010-02-23 13:46:05 +0000137 public:
Ben Murdochda12d292016-06-02 14:46:10 +0100138 static const int kSPOffset = TYPED_FRAME_PUSHED_VALUE_OFFSET(0);
139 static const int kCodeOffset = TYPED_FRAME_PUSHED_VALUE_OFFSET(1);
140 DEFINE_TYPED_FRAME_SIZES(2);
Andrei Popescu31002712010-02-23 13:46:05 +0000141
142 // The caller fields are below the frame pointer on the stack.
143 static const int kCallerFPOffset = +0 * kPointerSize;
144 // The calling JS function is between FP and PC.
145 static const int kCallerPCOffset = +1 * kPointerSize;
146
Ben Murdoch257744e2011-11-30 15:57:28 +0000147 // MIPS-specific: a pointer to the old sp to avoid unnecessary calculations.
148 static const int kCallerSPOffset = +2 * kPointerSize;
149
Andrei Popescu31002712010-02-23 13:46:05 +0000150 // FP-relative displacement of the caller's SP.
Ben Murdoch257744e2011-11-30 15:57:28 +0000151 static const int kCallerSPDisplacement = +2 * kPointerSize;
Andrei Popescu31002712010-02-23 13:46:05 +0000152
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000153 static const int kConstantPoolOffset = 0; // Not used.
Andrei Popescu31002712010-02-23 13:46:05 +0000154};
155
156
157class JavaScriptFrameConstants : public AllStatic {
158 public:
159 // FP-relative.
160 static const int kLocal0Offset = StandardFrameConstants::kExpressionsOffset;
Ben Murdoch8b112d22011-06-08 16:22:53 +0100161 static const int kLastParameterOffset = +2 * kPointerSize;
Ben Murdochda12d292016-06-02 14:46:10 +0100162 static const int kFunctionOffset = StandardFrameConstants::kFunctionOffset;
Andrei Popescu31002712010-02-23 13:46:05 +0000163
164 // Caller SP-relative.
165 static const int kParam0Offset = -2 * kPointerSize;
166 static const int kReceiverOffset = -1 * kPointerSize;
167};
168
169
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000170} // namespace internal
171} // namespace v8
Andrei Popescu31002712010-02-23 13:46:05 +0000172
173#endif