blob: b1de9f50ffb999893146add73283bb7b954746d0 [file] [log] [blame]
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001// Copyright 2014 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef V8_PPC_FRAMES_PPC_H_
6#define V8_PPC_FRAMES_PPC_H_
7
8namespace v8 {
9namespace internal {
10
11
12// Register list in load/store instructions
13// Note that the bit values must match those used in actual instruction encoding
14const int kNumRegs = 32;
15
16
17// Caller-saved/arguments registers
18const RegList kJSCallerSaved = 1 << 3 | // r3 a1
19 1 << 4 | // r4 a2
20 1 << 5 | // r5 a3
21 1 << 6 | // r6 a4
22 1 << 7 | // r7 a5
23 1 << 8 | // r8 a6
24 1 << 9 | // r9 a7
25 1 << 10 | // r10 a8
26 1 << 11;
27
28const int kNumJSCallerSaved = 9;
29
30// Return the code of the n-th caller-saved register available to JavaScript
31// e.g. JSCallerSavedReg(0) returns r0.code() == 0
32int JSCallerSavedCode(int n);
33
34
35// Callee-saved registers preserved when switching from C to JavaScript
36const RegList kCalleeSaved = 1 << 14 | // r14
37 1 << 15 | // r15
38 1 << 16 | // r16
39 1 << 17 | // r17
40 1 << 18 | // r18
41 1 << 19 | // r19
42 1 << 20 | // r20
43 1 << 21 | // r21
44 1 << 22 | // r22
45 1 << 23 | // r23
46 1 << 24 | // r24
47 1 << 25 | // r25
48 1 << 26 | // r26
49 1 << 27 | // r27
50 1 << 28 | // r28
51 1 << 29 | // r29
52 1 << 30 | // r20
53 1 << 31; // r31
54
55
56const int kNumCalleeSaved = 18;
57
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000058const RegList kCallerSavedDoubles = 1 << 0 | // d0
59 1 << 1 | // d1
60 1 << 2 | // d2
61 1 << 3 | // d3
62 1 << 4 | // d4
63 1 << 5 | // d5
64 1 << 6 | // d6
65 1 << 7 | // d7
66 1 << 8 | // d8
67 1 << 9 | // d9
68 1 << 10 | // d10
69 1 << 11 | // d11
70 1 << 12 | // d12
71 1 << 13; // d13
72
73const int kNumCallerSavedDoubles = 14;
74
75const RegList kCalleeSavedDoubles = 1 << 14 | // d14
76 1 << 15 | // d15
77 1 << 16 | // d16
78 1 << 17 | // d17
79 1 << 18 | // d18
80 1 << 19 | // d19
81 1 << 20 | // d20
82 1 << 21 | // d21
83 1 << 22 | // d22
84 1 << 23 | // d23
85 1 << 24 | // d24
86 1 << 25 | // d25
87 1 << 26 | // d26
88 1 << 27 | // d27
89 1 << 28 | // d28
90 1 << 29 | // d29
91 1 << 30 | // d30
92 1 << 31; // d31
93
94const int kNumCalleeSavedDoubles = 18;
95
96
Emily Bernierd0a1eb72015-03-24 16:35:39 -040097// Number of registers for which space is reserved in safepoints. Must be a
98// multiple of 8.
Emily Bernierd0a1eb72015-03-24 16:35:39 -040099const int kNumSafepointRegisters = 32;
100
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400101// The following constants describe the stack frame linkage area as
102// defined by the ABI. Note that kNumRequiredStackFrameSlots must
103// satisfy alignment requirements (rounding up if required).
104#if V8_TARGET_ARCH_PPC64 && V8_TARGET_LITTLE_ENDIAN
105// [0] back chain
106// [1] condition register save area
107// [2] link register save area
108// [3] TOC save area
109// [4] Parameter1 save area
110// ...
111// [11] Parameter8 save area
112// [12] Parameter9 slot (if necessary)
113// ...
114const int kNumRequiredStackFrameSlots = 12;
115const int kStackFrameLRSlot = 2;
116const int kStackFrameExtraParamSlot = 12;
117#elif V8_OS_AIX || V8_TARGET_ARCH_PPC64
118// [0] back chain
119// [1] condition register save area
120// [2] link register save area
121// [3] reserved for compiler
122// [4] reserved by binder
123// [5] TOC save area
124// [6] Parameter1 save area
125// ...
126// [13] Parameter8 save area
127// [14] Parameter9 slot (if necessary)
128// ...
129#if V8_TARGET_ARCH_PPC64
130const int kNumRequiredStackFrameSlots = 14;
131#else
132const int kNumRequiredStackFrameSlots = 16;
133#endif
134const int kStackFrameLRSlot = 2;
135const int kStackFrameExtraParamSlot = 14;
136#else
137// [0] back chain
138// [1] link register save area
139// [2] Parameter9 slot (if necessary)
140// ...
141const int kNumRequiredStackFrameSlots = 4;
142const int kStackFrameLRSlot = 1;
143const int kStackFrameExtraParamSlot = 2;
144#endif
145
146// ----------------------------------------------------
147
148
149class EntryFrameConstants : public AllStatic {
150 public:
151 static const int kCallerFPOffset =
152 -(StandardFrameConstants::kFixedFrameSizeFromFp + kPointerSize);
153};
154
155
156class ExitFrameConstants : public AllStatic {
157 public:
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000158 static const int kFrameSize =
159 FLAG_enable_embedded_constant_pool ? 3 * kPointerSize : 2 * kPointerSize;
160
161 static const int kConstantPoolOffset =
162 FLAG_enable_embedded_constant_pool ? -3 * kPointerSize : 0;
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400163 static const int kCodeOffset = -2 * kPointerSize;
164 static const int kSPOffset = -1 * kPointerSize;
165
166 // The caller fields are below the frame pointer on the stack.
167 static const int kCallerFPOffset = 0 * kPointerSize;
168 // The calling JS function is below FP.
169 static const int kCallerPCOffset = 1 * kPointerSize;
170
171 // FP-relative displacement of the caller's SP. It points just
172 // below the saved PC.
173 static const int kCallerSPDisplacement = 2 * kPointerSize;
174};
175
176
177class JavaScriptFrameConstants : public AllStatic {
178 public:
179 // FP-relative.
180 static const int kLocal0Offset = StandardFrameConstants::kExpressionsOffset;
181 static const int kLastParameterOffset = +2 * kPointerSize;
182 static const int kFunctionOffset = StandardFrameConstants::kMarkerOffset;
183
184 // Caller SP-relative.
185 static const int kParam0Offset = -2 * kPointerSize;
186 static const int kReceiverOffset = -1 * kPointerSize;
187};
188
189
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000190} // namespace internal
191} // namespace v8
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400192
193#endif // V8_PPC_FRAMES_PPC_H_