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 
8 namespace v8 {
9 namespace internal {
10 
11 
12 // Register list in load/store instructions
13 // Note that the bit values must match those used in actual instruction encoding
14 const int kNumRegs = 32;
15 
16 
17 // Caller-saved/arguments registers
18 const 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 
28 const 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
32 int JSCallerSavedCode(int n);
33 
34 
35 // Callee-saved registers preserved when switching from C to JavaScript
36 const 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 
56 const int kNumCalleeSaved = 18;
57 
58 const 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 
73 const int kNumCallerSavedDoubles = 14;
74 
75 const 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 
94 const int kNumCalleeSavedDoubles = 18;
95 
96 
97 // Number of registers for which space is reserved in safepoints. Must be a
98 // multiple of 8.
99 const 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 // ...
114 const int kNumRequiredStackFrameSlots = 12;
115 const int kStackFrameLRSlot = 2;
116 const 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
130 const int kNumRequiredStackFrameSlots = 14;
131 #else
132 const int kNumRequiredStackFrameSlots = 16;
133 #endif
134 const int kStackFrameLRSlot = 2;
135 const int kStackFrameExtraParamSlot = 14;
136 #else
137 // [0] back chain
138 // [1] link register save area
139 // [2] Parameter9 slot (if necessary)
140 // ...
141 const int kNumRequiredStackFrameSlots = 4;
142 const int kStackFrameLRSlot = 1;
143 const int kStackFrameExtraParamSlot = 2;
144 #endif
145 
146 // ----------------------------------------------------
147 
148 
149 class EntryFrameConstants : public AllStatic {
150  public:
151   static const int kCallerFPOffset =
152       -(StandardFrameConstants::kFixedFrameSizeFromFp + kPointerSize);
153 };
154 
155 
156 class ExitFrameConstants : public AllStatic {
157  public:
158   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;
163   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 
177 class 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 
190 }  // namespace internal
191 }  // namespace v8
192 
193 #endif  // V8_PPC_FRAMES_PPC_H_
194