1// 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
58const 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
97// Number of registers for which space is reserved in safepoints. Must be a
98// multiple of 8.
99const int kNumSafepointRegisters = 32;
100
101// 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
155class ExitFrameConstants : public TypedFrameConstants {
156 public:
157  static const int kSPOffset = TYPED_FRAME_PUSHED_VALUE_OFFSET(0);
158  static const int kCodeOffset = TYPED_FRAME_PUSHED_VALUE_OFFSET(1);
159  DEFINE_TYPED_FRAME_SIZES(2);
160
161  // The caller fields are below the frame pointer on the stack.
162  static const int kCallerFPOffset = 0 * kPointerSize;
163  // The calling JS function is below FP.
164  static const int kCallerPCOffset = 1 * kPointerSize;
165
166  // FP-relative displacement of the caller's SP.  It points just
167  // below the saved PC.
168  static const int kCallerSPDisplacement = 2 * kPointerSize;
169};
170
171
172class JavaScriptFrameConstants : public AllStatic {
173 public:
174  // FP-relative.
175  static const int kLocal0Offset = StandardFrameConstants::kExpressionsOffset;
176  static const int kLastParameterOffset = +2 * kPointerSize;
177  static const int kFunctionOffset = StandardFrameConstants::kFunctionOffset;
178
179  // Caller SP-relative.
180  static const int kParam0Offset = -2 * kPointerSize;
181  static const int kReceiverOffset = -1 * kPointerSize;
182};
183
184
185}  // namespace internal
186}  // namespace v8
187
188#endif  // V8_PPC_FRAMES_PPC_H_
189