blob: 64a718e89f71e49ac362d71aeb55741c265ecfa9 [file] [log] [blame]
yangguo@chromium.org659ceec2012-01-26 07:37:54 +00001// Copyright 2012 the V8 project authors. All rights reserved.
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002// 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
ager@chromium.org5ec48922009-05-05 07:25:34 +000028#ifndef V8_ARM_FRAMES_ARM_H_
29#define V8_ARM_FRAMES_ARM_H_
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000030
kasperl@chromium.org71affb52009-05-26 05:44:31 +000031namespace v8 {
32namespace internal {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000033
34
35// The ARM ABI does not specify the usage of register r9, which may be reserved
36// as the static base or thread register on some platforms, in which case we
37// leave it alone. Adjust the value of kR9Available accordingly:
mstarzinger@chromium.org1b3afd12011-11-29 14:28:56 +000038const int kR9Available = 1; // 1 if available to us, 0 if reserved
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000039
40
41// Register list in load/store instructions
42// Note that the bit values must match those used in actual instruction encoding
mstarzinger@chromium.org1b3afd12011-11-29 14:28:56 +000043const int kNumRegs = 16;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000044
45
46// Caller-saved/arguments registers
mstarzinger@chromium.org1b3afd12011-11-29 14:28:56 +000047const RegList kJSCallerSaved =
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000048 1 << 0 | // r0 a1
49 1 << 1 | // r1 a2
50 1 << 2 | // r2 a3
51 1 << 3; // r3 a4
52
mstarzinger@chromium.org1b3afd12011-11-29 14:28:56 +000053const int kNumJSCallerSaved = 4;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000054
55typedef Object* JSCallerSavedBuffer[kNumJSCallerSaved];
56
57// Return the code of the n-th caller-saved register available to JavaScript
58// e.g. JSCallerSavedReg(0) returns r0.code() == 0
59int JSCallerSavedCode(int n);
60
61
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000062// Callee-saved registers preserved when switching from C to JavaScript
mstarzinger@chromium.org1b3afd12011-11-29 14:28:56 +000063const RegList kCalleeSaved =
kasper.lund7276f142008-07-30 08:49:36 +000064 1 << 4 | // r4 v1
65 1 << 5 | // r5 v2
66 1 << 6 | // r6 v3
machenbach@chromium.org3d079fe2013-09-25 08:19:55 +000067 1 << 7 | // r7 v4 (pp in JavaScript code)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000068 1 << 8 | // r8 v5 (cp in JavaScript code)
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +000069 kR9Available << 9 | // r9 v6
ager@chromium.orgeadaf222009-06-16 09:43:10 +000070 1 << 10 | // r10 v7
mads.s.ager31e71382008-08-13 09:32:07 +000071 1 << 11; // r11 v8 (fp in JavaScript code)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000072
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +000073// When calling into C++ (only for C++ calls that can't cause a GC).
74// The call code will take care of lr, fp, etc.
mstarzinger@chromium.org1b3afd12011-11-29 14:28:56 +000075const RegList kCallerSaved =
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +000076 1 << 0 | // r0
77 1 << 1 | // r1
78 1 << 2 | // r2
79 1 << 3 | // r3
80 1 << 9; // r9
81
82
mstarzinger@chromium.org1b3afd12011-11-29 14:28:56 +000083const int kNumCalleeSaved = 7 + kR9Available;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000084
lrn@chromium.orgac2828d2011-06-23 06:29:21 +000085// Double registers d8 to d15 are callee-saved.
mstarzinger@chromium.org1b3afd12011-11-29 14:28:56 +000086const int kNumDoubleCalleeSaved = 8;
lrn@chromium.orgac2828d2011-06-23 06:29:21 +000087
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000088
kasperl@chromium.orga5551262010-12-07 12:49:48 +000089// Number of registers for which space is reserved in safepoints. Must be a
90// multiple of 8.
91// TODO(regis): Only 8 registers may actually be sufficient. Revisit.
mstarzinger@chromium.org1b3afd12011-11-29 14:28:56 +000092const int kNumSafepointRegisters = 16;
kasperl@chromium.orga5551262010-12-07 12:49:48 +000093
94// Define the list of registers actually saved at safepoints.
95// Note that the number of saved registers may be smaller than the reserved
96// space, i.e. kNumSafepointSavedRegisters <= kNumSafepointRegisters.
mstarzinger@chromium.org1b3afd12011-11-29 14:28:56 +000097const RegList kSafepointSavedRegisters = kJSCallerSaved | kCalleeSaved;
98const int kNumSafepointSavedRegisters = kNumJSCallerSaved + kNumCalleeSaved;
kasperl@chromium.orga5551262010-12-07 12:49:48 +000099
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000100// ----------------------------------------------------
101
102
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000103class EntryFrameConstants : public AllStatic {
104 public:
kasperl@chromium.orgb9123622008-09-17 14:05:56 +0000105 static const int kCallerFPOffset = -3 * kPointerSize;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000106};
107
108
109class ExitFrameConstants : public AllStatic {
110 public:
ager@chromium.org0ee099b2011-01-25 14:06:47 +0000111 static const int kCodeOffset = -2 * kPointerSize;
ricow@chromium.orgd236f4d2010-09-01 06:52:08 +0000112 static const int kSPOffset = -1 * kPointerSize;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000113
kasper.lund7276f142008-07-30 08:49:36 +0000114 // The caller fields are below the frame pointer on the stack.
ager@chromium.org0ee099b2011-01-25 14:06:47 +0000115 static const int kCallerFPOffset = 0 * kPointerSize;
116 // The calling JS function is below FP.
117 static const int kCallerPCOffset = 1 * kPointerSize;
ager@chromium.orgeadaf222009-06-16 09:43:10 +0000118
119 // FP-relative displacement of the caller's SP. It points just
120 // below the saved PC.
ager@chromium.org0ee099b2011-01-25 14:06:47 +0000121 static const int kCallerSPDisplacement = 2 * kPointerSize;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000122};
123
124
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000125class JavaScriptFrameConstants : public AllStatic {
126 public:
127 // FP-relative.
128 static const int kLocal0Offset = StandardFrameConstants::kExpressionsOffset;
kmillikin@chromium.orgc36ce6e2011-04-04 08:25:31 +0000129 static const int kLastParameterOffset = +2 * kPointerSize;
kasperl@chromium.orgb9123622008-09-17 14:05:56 +0000130 static const int kFunctionOffset = StandardFrameConstants::kMarkerOffset;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000131
ager@chromium.orgeadaf222009-06-16 09:43:10 +0000132 // Caller SP-relative.
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000133 static const int kParam0Offset = -2 * kPointerSize;
134 static const int kReceiverOffset = -1 * kPointerSize;
kasperl@chromium.orgb9123622008-09-17 14:05:56 +0000135};
136
137
138class ArgumentsAdaptorFrameConstants : public AllStatic {
139 public:
ulan@chromium.org750145a2013-03-07 15:14:13 +0000140 // FP-relative.
kasperl@chromium.orgb9123622008-09-17 14:05:56 +0000141 static const int kLengthOffset = StandardFrameConstants::kExpressionsOffset;
ulan@chromium.org750145a2013-03-07 15:14:13 +0000142
yangguo@chromium.org659ceec2012-01-26 07:37:54 +0000143 static const int kFrameSize =
144 StandardFrameConstants::kFixedFrameSize + kPointerSize;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000145};
146
147
ulan@chromium.org750145a2013-03-07 15:14:13 +0000148class ConstructFrameConstants : public AllStatic {
149 public:
150 // FP-relative.
151 static const int kImplicitReceiverOffset = -6 * kPointerSize;
152 static const int kConstructorOffset = -5 * kPointerSize;
153 static const int kLengthOffset = -4 * kPointerSize;
154 static const int kCodeOffset = StandardFrameConstants::kExpressionsOffset;
155
156 static const int kFrameSize =
157 StandardFrameConstants::kFixedFrameSize + 4 * kPointerSize;
158};
159
160
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000161class InternalFrameConstants : public AllStatic {
162 public:
ulan@chromium.org750145a2013-03-07 15:14:13 +0000163 // FP-relative.
kasperl@chromium.orgb9123622008-09-17 14:05:56 +0000164 static const int kCodeOffset = StandardFrameConstants::kExpressionsOffset;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000165};
166
167
ager@chromium.orgbb29dc92009-03-24 13:25:23 +0000168inline Object* JavaScriptFrame::function_slot_object() const {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000169 const int offset = JavaScriptFrameConstants::kFunctionOffset;
ager@chromium.orgbb29dc92009-03-24 13:25:23 +0000170 return Memory::Object_at(fp() + offset);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000171}
172
173
danno@chromium.orgd3c42102013-08-01 16:58:23 +0000174inline void StackHandler::SetFp(Address slot, Address fp) {
175 Memory::Address_at(slot) = fp;
176}
177
178
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000179} } // namespace v8::internal
180
ager@chromium.org5ec48922009-05-05 07:25:34 +0000181#endif // V8_ARM_FRAMES_ARM_H_