OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #if V8_TARGET_ARCH_MIPS64 | 7 #if V8_TARGET_ARCH_PPC |
8 | 8 |
9 #include "src/interface-descriptors.h" | 9 #include "src/interface-descriptors.h" |
10 | 10 |
11 namespace v8 { | 11 namespace v8 { |
12 namespace internal { | 12 namespace internal { |
13 | 13 |
14 const Register CallInterfaceDescriptor::ContextRegister() { return cp; } | 14 const Register CallInterfaceDescriptor::ContextRegister() { return cp; } |
15 | 15 |
16 | 16 |
17 const Register LoadDescriptor::ReceiverRegister() { return a1; } | 17 const Register LoadDescriptor::ReceiverRegister() { return r4; } |
18 const Register LoadDescriptor::NameRegister() { return a2; } | 18 const Register LoadDescriptor::NameRegister() { return r5; } |
19 | 19 |
20 | 20 |
21 const Register VectorLoadICTrampolineDescriptor::SlotRegister() { return a0; } | 21 const Register VectorLoadICTrampolineDescriptor::SlotRegister() { return r3; } |
22 | 22 |
23 | 23 |
24 const Register VectorLoadICDescriptor::VectorRegister() { return a3; } | 24 const Register VectorLoadICDescriptor::VectorRegister() { return r6; } |
25 | 25 |
26 | 26 |
27 const Register StoreDescriptor::ReceiverRegister() { return a1; } | 27 const Register StoreDescriptor::ReceiverRegister() { return r4; } |
28 const Register StoreDescriptor::NameRegister() { return a2; } | 28 const Register StoreDescriptor::NameRegister() { return r5; } |
29 const Register StoreDescriptor::ValueRegister() { return a0; } | 29 const Register StoreDescriptor::ValueRegister() { return r3; } |
30 | 30 |
31 | 31 |
32 const Register ElementTransitionAndStoreDescriptor::MapRegister() { return a3; } | 32 const Register StoreTransitionDescriptor::MapRegister() { return r6; } |
33 | 33 |
34 | 34 |
35 const Register InstanceofDescriptor::left() { return a0; } | 35 const Register ElementTransitionAndStoreDescriptor::MapRegister() { return r6; } |
36 const Register InstanceofDescriptor::right() { return a1; } | |
37 | 36 |
38 | 37 |
39 const Register ArgumentsAccessReadDescriptor::index() { return a1; } | 38 const Register InstanceofDescriptor::left() { return r3; } |
40 const Register ArgumentsAccessReadDescriptor::parameter_count() { return a0; } | 39 const Register InstanceofDescriptor::right() { return r4; } |
41 | 40 |
42 | 41 |
43 const Register ApiGetterDescriptor::function_address() { return a2; } | 42 const Register ArgumentsAccessReadDescriptor::index() { return r4; } |
| 43 const Register ArgumentsAccessReadDescriptor::parameter_count() { return r3; } |
44 | 44 |
45 | 45 |
46 const Register MathPowTaggedDescriptor::exponent() { return a2; } | 46 const Register ApiGetterDescriptor::function_address() { return r5; } |
| 47 |
| 48 |
| 49 const Register MathPowTaggedDescriptor::exponent() { return r5; } |
47 | 50 |
48 | 51 |
49 const Register MathPowIntegerDescriptor::exponent() { | 52 const Register MathPowIntegerDescriptor::exponent() { |
50 return MathPowTaggedDescriptor::exponent(); | 53 return MathPowTaggedDescriptor::exponent(); |
51 } | 54 } |
52 | 55 |
53 | 56 |
54 void FastNewClosureDescriptor::Initialize(CallInterfaceDescriptorData* data) { | 57 void FastNewClosureDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
55 Register registers[] = {cp, a2}; | 58 Register registers[] = {cp, r5}; |
56 data->Initialize(arraysize(registers), registers, NULL); | 59 data->Initialize(arraysize(registers), registers, NULL); |
57 } | 60 } |
58 | 61 |
59 | 62 |
60 void FastNewContextDescriptor::Initialize(CallInterfaceDescriptorData* data) { | 63 void FastNewContextDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
61 Register registers[] = {cp, a1}; | 64 Register registers[] = {cp, r4}; |
62 data->Initialize(arraysize(registers), registers, NULL); | 65 data->Initialize(arraysize(registers), registers, NULL); |
63 } | 66 } |
64 | 67 |
65 | 68 |
66 void ToNumberDescriptor::Initialize(CallInterfaceDescriptorData* data) { | 69 void ToNumberDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
67 Register registers[] = {cp, a0}; | 70 Register registers[] = {cp, r3}; |
68 data->Initialize(arraysize(registers), registers, NULL); | 71 data->Initialize(arraysize(registers), registers, NULL); |
69 } | 72 } |
70 | 73 |
71 | 74 |
72 void NumberToStringDescriptor::Initialize(CallInterfaceDescriptorData* data) { | 75 void NumberToStringDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
73 Register registers[] = {cp, a0}; | 76 Register registers[] = {cp, r3}; |
74 data->Initialize(arraysize(registers), registers, NULL); | 77 data->Initialize(arraysize(registers), registers, NULL); |
75 } | 78 } |
76 | 79 |
77 | 80 |
78 void FastCloneShallowArrayDescriptor::Initialize( | 81 void FastCloneShallowArrayDescriptor::Initialize( |
79 CallInterfaceDescriptorData* data) { | 82 CallInterfaceDescriptorData* data) { |
80 Register registers[] = {cp, a3, a2, a1}; | 83 Register registers[] = {cp, r6, r5, r4}; |
81 Representation representations[] = { | 84 Representation representations[] = { |
82 Representation::Tagged(), Representation::Tagged(), Representation::Smi(), | 85 Representation::Tagged(), Representation::Tagged(), Representation::Smi(), |
83 Representation::Tagged()}; | 86 Representation::Tagged()}; |
84 data->Initialize(arraysize(registers), registers, representations); | 87 data->Initialize(arraysize(registers), registers, representations); |
85 } | 88 } |
86 | 89 |
87 | 90 |
88 void FastCloneShallowObjectDescriptor::Initialize( | 91 void FastCloneShallowObjectDescriptor::Initialize( |
89 CallInterfaceDescriptorData* data) { | 92 CallInterfaceDescriptorData* data) { |
90 Register registers[] = {cp, a3, a2, a1, a0}; | 93 Register registers[] = {cp, r6, r5, r4, r3}; |
91 data->Initialize(arraysize(registers), registers, NULL); | 94 data->Initialize(arraysize(registers), registers, NULL); |
92 } | 95 } |
93 | 96 |
94 | 97 |
95 void CreateAllocationSiteDescriptor::Initialize( | 98 void CreateAllocationSiteDescriptor::Initialize( |
96 CallInterfaceDescriptorData* data) { | 99 CallInterfaceDescriptorData* data) { |
97 Register registers[] = {cp, a2, a3}; | 100 Register registers[] = {cp, r5, r6}; |
98 data->Initialize(arraysize(registers), registers, NULL); | 101 data->Initialize(arraysize(registers), registers, NULL); |
99 } | 102 } |
100 | 103 |
101 | 104 |
102 void StoreArrayLiteralElementDescriptor::Initialize( | 105 void StoreArrayLiteralElementDescriptor::Initialize( |
103 CallInterfaceDescriptorData* data) { | 106 CallInterfaceDescriptorData* data) { |
104 Register registers[] = {cp, a3, a0}; | 107 Register registers[] = {cp, r6, r3}; |
| 108 data->Initialize(arraysize(registers), registers, NULL); |
| 109 } |
| 110 |
| 111 |
| 112 void CallFunctionDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
| 113 Register registers[] = {cp, r4}; |
105 data->Initialize(arraysize(registers), registers, NULL); | 114 data->Initialize(arraysize(registers), registers, NULL); |
106 } | 115 } |
107 | 116 |
108 | 117 |
109 void CallFunctionWithFeedbackDescriptor::Initialize( | 118 void CallFunctionWithFeedbackDescriptor::Initialize( |
110 CallInterfaceDescriptorData* data) { | 119 CallInterfaceDescriptorData* data) { |
111 Register registers[] = {cp, a1, a3}; | 120 Register registers[] = {cp, r4, r6}; |
112 Representation representations[] = {Representation::Tagged(), | 121 Representation representations[] = {Representation::Tagged(), |
113 Representation::Tagged(), | 122 Representation::Tagged(), |
114 Representation::Smi()}; | 123 Representation::Smi()}; |
115 data->Initialize(arraysize(registers), registers, representations); | 124 data->Initialize(arraysize(registers), registers, representations); |
116 } | 125 } |
117 | 126 |
118 | 127 |
119 void CallFunctionDescriptor::Initialize(CallInterfaceDescriptorData* data) { | |
120 Register registers[] = {cp, a1}; | |
121 data->Initialize(arraysize(registers), registers, NULL); | |
122 } | |
123 | |
124 | |
125 void CallConstructDescriptor::Initialize(CallInterfaceDescriptorData* data) { | 128 void CallConstructDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
126 // a0 : number of arguments | 129 // r3 : number of arguments |
127 // a1 : the function to call | 130 // r4 : the function to call |
128 // a2 : feedback vector | 131 // r5 : feedback vector |
129 // a3 : (only if a2 is not the megamorphic symbol) slot in feedback | 132 // r6 : (only if r5 is not the megamorphic symbol) slot in feedback |
130 // vector (Smi) | 133 // vector (Smi) |
131 // TODO(turbofan): So far we don't gather type feedback and hence skip the | 134 // TODO(turbofan): So far we don't gather type feedback and hence skip the |
132 // slot parameter, but ArrayConstructStub needs the vector to be undefined. | 135 // slot parameter, but ArrayConstructStub needs the vector to be undefined. |
133 Register registers[] = {cp, a0, a1, a2}; | 136 Register registers[] = {cp, r3, r4, r5}; |
134 data->Initialize(arraysize(registers), registers, NULL); | 137 data->Initialize(arraysize(registers), registers, NULL); |
135 } | 138 } |
136 | 139 |
137 | 140 |
138 void RegExpConstructResultDescriptor::Initialize( | 141 void RegExpConstructResultDescriptor::Initialize( |
139 CallInterfaceDescriptorData* data) { | 142 CallInterfaceDescriptorData* data) { |
140 Register registers[] = {cp, a2, a1, a0}; | 143 Register registers[] = {cp, r5, r4, r3}; |
141 data->Initialize(arraysize(registers), registers, NULL); | 144 data->Initialize(arraysize(registers), registers, NULL); |
142 } | 145 } |
143 | 146 |
144 | 147 |
145 void TransitionElementsKindDescriptor::Initialize( | 148 void TransitionElementsKindDescriptor::Initialize( |
146 CallInterfaceDescriptorData* data) { | 149 CallInterfaceDescriptorData* data) { |
147 Register registers[] = {cp, a0, a1}; | 150 Register registers[] = {cp, r3, r4}; |
148 data->Initialize(arraysize(registers), registers, NULL); | 151 data->Initialize(arraysize(registers), registers, NULL); |
149 } | 152 } |
150 | 153 |
151 | 154 |
152 void ArrayConstructorConstantArgCountDescriptor::Initialize( | 155 void ArrayConstructorConstantArgCountDescriptor::Initialize( |
153 CallInterfaceDescriptorData* data) { | 156 CallInterfaceDescriptorData* data) { |
154 // register state | 157 // register state |
155 // cp -- context | 158 // cp -- context |
156 // a0 -- number of arguments | 159 // r3 -- number of arguments |
157 // a1 -- function | 160 // r4 -- function |
158 // a2 -- allocation site with elements kind | 161 // r5 -- allocation site with elements kind |
159 Register registers[] = {cp, a1, a2}; | 162 Register registers[] = {cp, r4, r5}; |
160 data->Initialize(arraysize(registers), registers, NULL); | 163 data->Initialize(arraysize(registers), registers, NULL); |
161 } | 164 } |
162 | 165 |
163 | 166 |
164 void ArrayConstructorDescriptor::Initialize(CallInterfaceDescriptorData* data) { | 167 void ArrayConstructorDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
165 // stack param count needs (constructor pointer, and single argument) | 168 // stack param count needs (constructor pointer, and single argument) |
166 Register registers[] = {cp, a1, a2, a0}; | 169 Register registers[] = {cp, r4, r5, r3}; |
167 Representation representations[] = { | 170 Representation representations[] = { |
168 Representation::Tagged(), Representation::Tagged(), | 171 Representation::Tagged(), Representation::Tagged(), |
169 Representation::Tagged(), Representation::Integer32()}; | 172 Representation::Tagged(), Representation::Integer32()}; |
170 data->Initialize(arraysize(registers), registers, representations); | 173 data->Initialize(arraysize(registers), registers, representations); |
171 } | 174 } |
172 | 175 |
173 | 176 |
174 void InternalArrayConstructorConstantArgCountDescriptor::Initialize( | 177 void InternalArrayConstructorConstantArgCountDescriptor::Initialize( |
175 CallInterfaceDescriptorData* data) { | 178 CallInterfaceDescriptorData* data) { |
176 // register state | 179 // register state |
177 // cp -- context | 180 // cp -- context |
178 // a0 -- number of arguments | 181 // r3 -- number of arguments |
179 // a1 -- constructor function | 182 // r4 -- constructor function |
180 Register registers[] = {cp, a1}; | 183 Register registers[] = {cp, r4}; |
181 data->Initialize(arraysize(registers), registers, NULL); | 184 data->Initialize(arraysize(registers), registers, NULL); |
182 } | 185 } |
183 | 186 |
184 | 187 |
185 void InternalArrayConstructorDescriptor::Initialize( | 188 void InternalArrayConstructorDescriptor::Initialize( |
186 CallInterfaceDescriptorData* data) { | 189 CallInterfaceDescriptorData* data) { |
187 // stack param count needs (constructor pointer, and single argument) | 190 // stack param count needs (constructor pointer, and single argument) |
188 Register registers[] = {cp, a1, a0}; | 191 Register registers[] = {cp, r4, r3}; |
189 Representation representations[] = {Representation::Tagged(), | 192 Representation representations[] = {Representation::Tagged(), |
190 Representation::Tagged(), | 193 Representation::Tagged(), |
191 Representation::Integer32()}; | 194 Representation::Integer32()}; |
192 data->Initialize(arraysize(registers), registers, representations); | 195 data->Initialize(arraysize(registers), registers, representations); |
193 } | 196 } |
194 | 197 |
195 | 198 |
196 void CompareNilDescriptor::Initialize(CallInterfaceDescriptorData* data) { | 199 void CompareNilDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
197 Register registers[] = {cp, a0}; | 200 Register registers[] = {cp, r3}; |
198 data->Initialize(arraysize(registers), registers, NULL); | 201 data->Initialize(arraysize(registers), registers, NULL); |
199 } | 202 } |
200 | 203 |
201 | 204 |
202 void ToBooleanDescriptor::Initialize(CallInterfaceDescriptorData* data) { | 205 void ToBooleanDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
203 Register registers[] = {cp, a0}; | 206 Register registers[] = {cp, r3}; |
204 data->Initialize(arraysize(registers), registers, NULL); | 207 data->Initialize(arraysize(registers), registers, NULL); |
205 } | 208 } |
206 | 209 |
207 | 210 |
208 void BinaryOpDescriptor::Initialize(CallInterfaceDescriptorData* data) { | 211 void BinaryOpDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
209 Register registers[] = {cp, a1, a0}; | 212 Register registers[] = {cp, r4, r3}; |
210 data->Initialize(arraysize(registers), registers, NULL); | 213 data->Initialize(arraysize(registers), registers, NULL); |
211 } | 214 } |
212 | 215 |
213 | 216 |
214 void BinaryOpWithAllocationSiteDescriptor::Initialize( | 217 void BinaryOpWithAllocationSiteDescriptor::Initialize( |
215 CallInterfaceDescriptorData* data) { | 218 CallInterfaceDescriptorData* data) { |
216 Register registers[] = {cp, a2, a1, a0}; | 219 Register registers[] = {cp, r5, r4, r3}; |
217 data->Initialize(arraysize(registers), registers, NULL); | 220 data->Initialize(arraysize(registers), registers, NULL); |
218 } | 221 } |
219 | 222 |
220 | 223 |
221 void StringAddDescriptor::Initialize(CallInterfaceDescriptorData* data) { | 224 void StringAddDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
222 Register registers[] = {cp, a1, a0}; | 225 Register registers[] = {cp, r4, r3}; |
223 data->Initialize(arraysize(registers), registers, NULL); | 226 data->Initialize(arraysize(registers), registers, NULL); |
224 } | 227 } |
225 | 228 |
226 | 229 |
227 void KeyedDescriptor::Initialize(CallInterfaceDescriptorData* data) { | 230 void KeyedDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
228 Register registers[] = { | 231 Register registers[] = { |
229 cp, // context | 232 cp, // context |
230 a2, // key | 233 r5, // key |
231 }; | 234 }; |
232 Representation representations[] = { | 235 Representation representations[] = { |
233 Representation::Tagged(), // context | 236 Representation::Tagged(), // context |
234 Representation::Tagged(), // key | 237 Representation::Tagged(), // key |
235 }; | 238 }; |
236 data->Initialize(arraysize(registers), registers, representations); | 239 data->Initialize(arraysize(registers), registers, representations); |
237 } | 240 } |
238 | 241 |
239 | 242 |
240 void NamedDescriptor::Initialize(CallInterfaceDescriptorData* data) { | 243 void NamedDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
241 Register registers[] = { | 244 Register registers[] = { |
242 cp, // context | 245 cp, // context |
243 a2, // name | 246 r5, // name |
244 }; | 247 }; |
245 Representation representations[] = { | 248 Representation representations[] = { |
246 Representation::Tagged(), // context | 249 Representation::Tagged(), // context |
247 Representation::Tagged(), // name | 250 Representation::Tagged(), // name |
248 }; | 251 }; |
249 data->Initialize(arraysize(registers), registers, representations); | 252 data->Initialize(arraysize(registers), registers, representations); |
250 } | 253 } |
251 | 254 |
252 | 255 |
253 void CallHandlerDescriptor::Initialize(CallInterfaceDescriptorData* data) { | 256 void CallHandlerDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
254 Register registers[] = { | 257 Register registers[] = { |
255 cp, // context | 258 cp, // context |
256 a0, // receiver | 259 r3, // receiver |
257 }; | 260 }; |
258 Representation representations[] = { | 261 Representation representations[] = { |
259 Representation::Tagged(), // context | 262 Representation::Tagged(), // context |
260 Representation::Tagged(), // receiver | 263 Representation::Tagged(), // receiver |
261 }; | 264 }; |
262 data->Initialize(arraysize(registers), registers, representations); | 265 data->Initialize(arraysize(registers), registers, representations); |
263 } | 266 } |
264 | 267 |
265 | 268 |
266 void ArgumentAdaptorDescriptor::Initialize(CallInterfaceDescriptorData* data) { | 269 void ArgumentAdaptorDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
267 Register registers[] = { | 270 Register registers[] = { |
268 cp, // context | 271 cp, // context |
269 a1, // JSFunction | 272 r4, // JSFunction |
270 a0, // actual number of arguments | 273 r3, // actual number of arguments |
271 a2, // expected number of arguments | 274 r5, // expected number of arguments |
272 }; | 275 }; |
273 Representation representations[] = { | 276 Representation representations[] = { |
274 Representation::Tagged(), // context | 277 Representation::Tagged(), // context |
275 Representation::Tagged(), // JSFunction | 278 Representation::Tagged(), // JSFunction |
276 Representation::Integer32(), // actual number of arguments | 279 Representation::Integer32(), // actual number of arguments |
277 Representation::Integer32(), // expected number of arguments | 280 Representation::Integer32(), // expected number of arguments |
278 }; | 281 }; |
279 data->Initialize(arraysize(registers), registers, representations); | 282 data->Initialize(arraysize(registers), registers, representations); |
280 } | 283 } |
281 | 284 |
282 | 285 |
283 void ApiFunctionDescriptor::Initialize(CallInterfaceDescriptorData* data) { | 286 void ApiFunctionDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
284 Register registers[] = { | 287 Register registers[] = { |
285 cp, // context | 288 cp, // context |
286 a0, // callee | 289 r3, // callee |
287 a4, // call_data | 290 r7, // call_data |
288 a2, // holder | 291 r5, // holder |
289 a1, // api_function_address | 292 r4, // api_function_address |
290 }; | 293 }; |
291 Representation representations[] = { | 294 Representation representations[] = { |
292 Representation::Tagged(), // context | 295 Representation::Tagged(), // context |
293 Representation::Tagged(), // callee | 296 Representation::Tagged(), // callee |
294 Representation::Tagged(), // call_data | 297 Representation::Tagged(), // call_data |
295 Representation::Tagged(), // holder | 298 Representation::Tagged(), // holder |
296 Representation::External(), // api_function_address | 299 Representation::External(), // api_function_address |
297 }; | 300 }; |
298 data->Initialize(arraysize(registers), registers, representations); | 301 data->Initialize(arraysize(registers), registers, representations); |
299 } | 302 } |
300 } | 303 } |
301 } // namespace v8::internal | 304 } // namespace v8::internal |
302 | 305 |
303 #endif // V8_TARGET_ARCH_MIPS64 | 306 #endif // V8_TARGET_ARCH_PPC |
OLD | NEW |