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 #if V8_TARGET_ARCH_PPC
6
7 #include "src/interface-descriptors.h"
8
9 namespace v8 {
10 namespace internal {
11
ContextRegister()12 const Register CallInterfaceDescriptor::ContextRegister() { return cp; }
13
DefaultInitializePlatformSpecific(CallInterfaceDescriptorData * data,int register_parameter_count)14 void CallInterfaceDescriptor::DefaultInitializePlatformSpecific(
15 CallInterfaceDescriptorData* data, int register_parameter_count) {
16 const Register default_stub_registers[] = {r3, r4, r5, r6, r7};
17 CHECK_LE(static_cast<size_t>(register_parameter_count),
18 arraysize(default_stub_registers));
19 data->InitializePlatformSpecific(register_parameter_count,
20 default_stub_registers);
21 }
22
FunctionRegister()23 const Register FastNewFunctionContextDescriptor::FunctionRegister() {
24 return r4;
25 }
SlotsRegister()26 const Register FastNewFunctionContextDescriptor::SlotsRegister() { return r3; }
27
ReceiverRegister()28 const Register LoadDescriptor::ReceiverRegister() { return r4; }
NameRegister()29 const Register LoadDescriptor::NameRegister() { return r5; }
SlotRegister()30 const Register LoadDescriptor::SlotRegister() { return r3; }
31
VectorRegister()32 const Register LoadWithVectorDescriptor::VectorRegister() { return r6; }
33
HandlerRegister()34 const Register LoadICProtoArrayDescriptor::HandlerRegister() { return r7; }
35
ReceiverRegister()36 const Register StoreDescriptor::ReceiverRegister() { return r4; }
NameRegister()37 const Register StoreDescriptor::NameRegister() { return r5; }
ValueRegister()38 const Register StoreDescriptor::ValueRegister() { return r3; }
SlotRegister()39 const Register StoreDescriptor::SlotRegister() { return r7; }
40
VectorRegister()41 const Register StoreWithVectorDescriptor::VectorRegister() { return r6; }
42
SlotRegister()43 const Register StoreTransitionDescriptor::SlotRegister() { return r7; }
VectorRegister()44 const Register StoreTransitionDescriptor::VectorRegister() { return r6; }
MapRegister()45 const Register StoreTransitionDescriptor::MapRegister() { return r8; }
46
LeftRegister()47 const Register StringCompareDescriptor::LeftRegister() { return r4; }
RightRegister()48 const Register StringCompareDescriptor::RightRegister() { return r3; }
49
HolderRegister()50 const Register ApiGetterDescriptor::HolderRegister() { return r3; }
CallbackRegister()51 const Register ApiGetterDescriptor::CallbackRegister() { return r6; }
52
exponent()53 const Register MathPowTaggedDescriptor::exponent() { return r5; }
54
55
exponent()56 const Register MathPowIntegerDescriptor::exponent() {
57 return MathPowTaggedDescriptor::exponent();
58 }
59
60
ObjectRegister()61 const Register GrowArrayElementsDescriptor::ObjectRegister() { return r3; }
KeyRegister()62 const Register GrowArrayElementsDescriptor::KeyRegister() { return r6; }
63
InitializePlatformSpecific(CallInterfaceDescriptorData * data)64 void FastNewClosureDescriptor::InitializePlatformSpecific(
65 CallInterfaceDescriptorData* data) {
66 Register registers[] = {r5};
67 data->InitializePlatformSpecific(arraysize(registers), registers);
68 }
69
InitializePlatformSpecific(CallInterfaceDescriptorData * data)70 void FastNewObjectDescriptor::InitializePlatformSpecific(
71 CallInterfaceDescriptorData* data) {
72 Register registers[] = {r4, r6};
73 data->InitializePlatformSpecific(arraysize(registers), registers);
74 }
75
InitializePlatformSpecific(CallInterfaceDescriptorData * data)76 void FastNewRestParameterDescriptor::InitializePlatformSpecific(
77 CallInterfaceDescriptorData* data) {
78 Register registers[] = {r4};
79 data->InitializePlatformSpecific(arraysize(registers), registers);
80 }
81
InitializePlatformSpecific(CallInterfaceDescriptorData * data)82 void FastNewSloppyArgumentsDescriptor::InitializePlatformSpecific(
83 CallInterfaceDescriptorData* data) {
84 Register registers[] = {r4};
85 data->InitializePlatformSpecific(arraysize(registers), registers);
86 }
87
InitializePlatformSpecific(CallInterfaceDescriptorData * data)88 void FastNewStrictArgumentsDescriptor::InitializePlatformSpecific(
89 CallInterfaceDescriptorData* data) {
90 Register registers[] = {r4};
91 data->InitializePlatformSpecific(arraysize(registers), registers);
92 }
93
94
95 // static
ArgumentRegister()96 const Register TypeConversionDescriptor::ArgumentRegister() { return r3; }
97
InitializePlatformSpecific(CallInterfaceDescriptorData * data)98 void TypeofDescriptor::InitializePlatformSpecific(
99 CallInterfaceDescriptorData* data) {
100 Register registers[] = {r6};
101 data->InitializePlatformSpecific(arraysize(registers), registers);
102 }
103
104
InitializePlatformSpecific(CallInterfaceDescriptorData * data)105 void FastCloneRegExpDescriptor::InitializePlatformSpecific(
106 CallInterfaceDescriptorData* data) {
107 Register registers[] = {r6, r5, r4, r3};
108 data->InitializePlatformSpecific(arraysize(registers), registers);
109 }
110
111
InitializePlatformSpecific(CallInterfaceDescriptorData * data)112 void FastCloneShallowArrayDescriptor::InitializePlatformSpecific(
113 CallInterfaceDescriptorData* data) {
114 Register registers[] = {r6, r5, r4};
115 data->InitializePlatformSpecific(arraysize(registers), registers);
116 }
117
118
InitializePlatformSpecific(CallInterfaceDescriptorData * data)119 void FastCloneShallowObjectDescriptor::InitializePlatformSpecific(
120 CallInterfaceDescriptorData* data) {
121 Register registers[] = {r6, r5, r4, r3};
122 data->InitializePlatformSpecific(arraysize(registers), registers);
123 }
124
125
InitializePlatformSpecific(CallInterfaceDescriptorData * data)126 void CreateAllocationSiteDescriptor::InitializePlatformSpecific(
127 CallInterfaceDescriptorData* data) {
128 Register registers[] = {r5, r6};
129 data->InitializePlatformSpecific(arraysize(registers), registers);
130 }
131
132
InitializePlatformSpecific(CallInterfaceDescriptorData * data)133 void CreateWeakCellDescriptor::InitializePlatformSpecific(
134 CallInterfaceDescriptorData* data) {
135 Register registers[] = {r5, r6, r4};
136 data->InitializePlatformSpecific(arraysize(registers), registers);
137 }
138
139
InitializePlatformSpecific(CallInterfaceDescriptorData * data)140 void CallFunctionDescriptor::InitializePlatformSpecific(
141 CallInterfaceDescriptorData* data) {
142 Register registers[] = {r4};
143 data->InitializePlatformSpecific(arraysize(registers), registers);
144 }
145
146
InitializePlatformSpecific(CallInterfaceDescriptorData * data)147 void CallFunctionWithFeedbackDescriptor::InitializePlatformSpecific(
148 CallInterfaceDescriptorData* data) {
149 Register registers[] = {r4, r6};
150 data->InitializePlatformSpecific(arraysize(registers), registers);
151 }
152
153
InitializePlatformSpecific(CallInterfaceDescriptorData * data)154 void CallFunctionWithFeedbackAndVectorDescriptor::InitializePlatformSpecific(
155 CallInterfaceDescriptorData* data) {
156 Register registers[] = {r4, r3, r6, r5};
157 data->InitializePlatformSpecific(arraysize(registers), registers);
158 }
159
160
InitializePlatformSpecific(CallInterfaceDescriptorData * data)161 void CallConstructDescriptor::InitializePlatformSpecific(
162 CallInterfaceDescriptorData* data) {
163 // r3 : number of arguments
164 // r4 : the function to call
165 // r5 : feedback vector
166 // r6 : slot in feedback vector (Smi, for RecordCallTarget)
167 // r7 : new target (for IsSuperConstructorCall)
168 // TODO(turbofan): So far we don't gather type feedback and hence skip the
169 // slot parameter, but ArrayConstructStub needs the vector to be undefined.
170 Register registers[] = {r3, r4, r7, r5};
171 data->InitializePlatformSpecific(arraysize(registers), registers);
172 }
173
174
InitializePlatformSpecific(CallInterfaceDescriptorData * data)175 void CallTrampolineDescriptor::InitializePlatformSpecific(
176 CallInterfaceDescriptorData* data) {
177 // r3 : number of arguments
178 // r4 : the target to call
179 Register registers[] = {r4, r3};
180 data->InitializePlatformSpecific(arraysize(registers), registers);
181 }
182
183
InitializePlatformSpecific(CallInterfaceDescriptorData * data)184 void ConstructStubDescriptor::InitializePlatformSpecific(
185 CallInterfaceDescriptorData* data) {
186 // r3 : number of arguments
187 // r4 : the target to call
188 // r6 : the new target
189 // r5 : allocation site or undefined
190 Register registers[] = {r4, r6, r3, r5};
191 data->InitializePlatformSpecific(arraysize(registers), registers);
192 }
193
194
InitializePlatformSpecific(CallInterfaceDescriptorData * data)195 void ConstructTrampolineDescriptor::InitializePlatformSpecific(
196 CallInterfaceDescriptorData* data) {
197 // r3 : number of arguments
198 // r4 : the target to call
199 // r6 : the new target
200 Register registers[] = {r4, r6, r3};
201 data->InitializePlatformSpecific(arraysize(registers), registers);
202 }
203
204
InitializePlatformSpecific(CallInterfaceDescriptorData * data)205 void TransitionElementsKindDescriptor::InitializePlatformSpecific(
206 CallInterfaceDescriptorData* data) {
207 Register registers[] = {r3, r4};
208 data->InitializePlatformSpecific(arraysize(registers), registers);
209 }
210
211
InitializePlatformSpecific(CallInterfaceDescriptorData * data)212 void AllocateHeapNumberDescriptor::InitializePlatformSpecific(
213 CallInterfaceDescriptorData* data) {
214 data->InitializePlatformSpecific(0, nullptr, nullptr);
215 }
216
217 #define SIMD128_ALLOC_DESC(TYPE, Type, type, lane_count, lane_type) \
218 void Allocate##Type##Descriptor::InitializePlatformSpecific( \
219 CallInterfaceDescriptorData* data) { \
220 data->InitializePlatformSpecific(0, nullptr, nullptr); \
221 }
SIMD128_TYPES(SIMD128_ALLOC_DESC)222 SIMD128_TYPES(SIMD128_ALLOC_DESC)
223 #undef SIMD128_ALLOC_DESC
224
225 void ArrayNoArgumentConstructorDescriptor::InitializePlatformSpecific(
226 CallInterfaceDescriptorData* data) {
227 // register state
228 // r3 -- number of arguments
229 // r4 -- function
230 // r5 -- allocation site with elements kind
231 Register registers[] = {r4, r5, r3};
232 data->InitializePlatformSpecific(arraysize(registers), registers);
233 }
234
InitializePlatformSpecific(CallInterfaceDescriptorData * data)235 void ArraySingleArgumentConstructorDescriptor::InitializePlatformSpecific(
236 CallInterfaceDescriptorData* data) {
237 // register state
238 // r3 -- number of arguments
239 // r4 -- function
240 // r5 -- allocation site with elements kind
241 Register registers[] = {r4, r5, r3};
242 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
243 }
244
245
InitializePlatformSpecific(CallInterfaceDescriptorData * data)246 void ArrayNArgumentsConstructorDescriptor::InitializePlatformSpecific(
247 CallInterfaceDescriptorData* data) {
248 // stack param count needs (constructor pointer, and single argument)
249 Register registers[] = {r4, r5, r3};
250 data->InitializePlatformSpecific(arraysize(registers), registers);
251 }
252
253
InitializePlatformSpecific(CallInterfaceDescriptorData * data)254 void VarArgFunctionDescriptor::InitializePlatformSpecific(
255 CallInterfaceDescriptorData* data) {
256 // stack param count needs (arg count)
257 Register registers[] = {r3};
258 data->InitializePlatformSpecific(arraysize(registers), registers);
259 }
260
InitializePlatformSpecific(CallInterfaceDescriptorData * data)261 void CompareDescriptor::InitializePlatformSpecific(
262 CallInterfaceDescriptorData* data) {
263 Register registers[] = {r4, r3};
264 data->InitializePlatformSpecific(arraysize(registers), registers);
265 }
266
267
InitializePlatformSpecific(CallInterfaceDescriptorData * data)268 void BinaryOpDescriptor::InitializePlatformSpecific(
269 CallInterfaceDescriptorData* data) {
270 Register registers[] = {r4, r3};
271 data->InitializePlatformSpecific(arraysize(registers), registers);
272 }
273
274
InitializePlatformSpecific(CallInterfaceDescriptorData * data)275 void BinaryOpWithAllocationSiteDescriptor::InitializePlatformSpecific(
276 CallInterfaceDescriptorData* data) {
277 Register registers[] = {r5, r4, r3};
278 data->InitializePlatformSpecific(arraysize(registers), registers);
279 }
280
InitializePlatformSpecific(CallInterfaceDescriptorData * data)281 void BinaryOpWithVectorDescriptor::InitializePlatformSpecific(
282 CallInterfaceDescriptorData* data) {
283 // register state
284 // r4 -- lhs
285 // r3 -- rhs
286 // r7 -- slot id
287 // r6 -- vector
288 Register registers[] = {r4, r3, r7, r6};
289 data->InitializePlatformSpecific(arraysize(registers), registers);
290 }
291
InitializePlatformSpecific(CallInterfaceDescriptorData * data)292 void CountOpDescriptor::InitializePlatformSpecific(
293 CallInterfaceDescriptorData* data) {
294 Register registers[] = {r4};
295 data->InitializePlatformSpecific(arraysize(registers), registers);
296 }
297
InitializePlatformSpecific(CallInterfaceDescriptorData * data)298 void StringAddDescriptor::InitializePlatformSpecific(
299 CallInterfaceDescriptorData* data) {
300 Register registers[] = {r4, r3};
301 data->InitializePlatformSpecific(arraysize(registers), registers);
302 }
303
304
InitializePlatformSpecific(CallInterfaceDescriptorData * data)305 void KeyedDescriptor::InitializePlatformSpecific(
306 CallInterfaceDescriptorData* data) {
307 Register registers[] = {
308 r5, // key
309 };
310 data->InitializePlatformSpecific(arraysize(registers), registers);
311 }
312
313
InitializePlatformSpecific(CallInterfaceDescriptorData * data)314 void NamedDescriptor::InitializePlatformSpecific(
315 CallInterfaceDescriptorData* data) {
316 Register registers[] = {
317 r5, // name
318 };
319 data->InitializePlatformSpecific(arraysize(registers), registers);
320 }
321
322
InitializePlatformSpecific(CallInterfaceDescriptorData * data)323 void CallHandlerDescriptor::InitializePlatformSpecific(
324 CallInterfaceDescriptorData* data) {
325 Register registers[] = {
326 r3, // receiver
327 };
328 data->InitializePlatformSpecific(arraysize(registers), registers);
329 }
330
331
InitializePlatformSpecific(CallInterfaceDescriptorData * data)332 void ArgumentAdaptorDescriptor::InitializePlatformSpecific(
333 CallInterfaceDescriptorData* data) {
334 Register registers[] = {
335 r4, // JSFunction
336 r6, // the new target
337 r3, // actual number of arguments
338 r5, // expected number of arguments
339 };
340 data->InitializePlatformSpecific(arraysize(registers), registers);
341 }
342
InitializePlatformSpecific(CallInterfaceDescriptorData * data)343 void ApiCallbackDescriptor::InitializePlatformSpecific(
344 CallInterfaceDescriptorData* data) {
345 Register registers[] = {
346 r3, // callee
347 r7, // call_data
348 r5, // holder
349 r4, // api_function_address
350 };
351 data->InitializePlatformSpecific(arraysize(registers), registers);
352 }
353
InitializePlatformSpecific(CallInterfaceDescriptorData * data)354 void InterpreterDispatchDescriptor::InitializePlatformSpecific(
355 CallInterfaceDescriptorData* data) {
356 Register registers[] = {
357 kInterpreterAccumulatorRegister, kInterpreterBytecodeOffsetRegister,
358 kInterpreterBytecodeArrayRegister, kInterpreterDispatchTableRegister};
359 data->InitializePlatformSpecific(arraysize(registers), registers);
360 }
361
InitializePlatformSpecific(CallInterfaceDescriptorData * data)362 void InterpreterPushArgsAndCallDescriptor::InitializePlatformSpecific(
363 CallInterfaceDescriptorData* data) {
364 Register registers[] = {
365 r3, // argument count (not including receiver)
366 r5, // address of first argument
367 r4 // the target callable to be call
368 };
369 data->InitializePlatformSpecific(arraysize(registers), registers);
370 }
371
InitializePlatformSpecific(CallInterfaceDescriptorData * data)372 void InterpreterPushArgsAndConstructDescriptor::InitializePlatformSpecific(
373 CallInterfaceDescriptorData* data) {
374 Register registers[] = {
375 r3, // argument count (not including receiver)
376 r6, // new target
377 r4, // constructor to call
378 r5, // allocation site feedback if available, undefined otherwise
379 r7 // address of the first argument
380 };
381 data->InitializePlatformSpecific(arraysize(registers), registers);
382 }
383
InitializePlatformSpecific(CallInterfaceDescriptorData * data)384 void InterpreterPushArgsAndConstructArrayDescriptor::InitializePlatformSpecific(
385 CallInterfaceDescriptorData* data) {
386 Register registers[] = {
387 r3, // argument count (not including receiver)
388 r4, // target to call checked to be Array function
389 r5, // allocation site feedback if available, undefined otherwise
390 r6 // address of the first argument
391 };
392 data->InitializePlatformSpecific(arraysize(registers), registers);
393 }
394
InitializePlatformSpecific(CallInterfaceDescriptorData * data)395 void InterpreterCEntryDescriptor::InitializePlatformSpecific(
396 CallInterfaceDescriptorData* data) {
397 Register registers[] = {
398 r3, // argument count (argc)
399 r5, // address of first argument (argv)
400 r4 // the runtime function to call
401 };
402 data->InitializePlatformSpecific(arraysize(registers), registers);
403 }
404
InitializePlatformSpecific(CallInterfaceDescriptorData * data)405 void ResumeGeneratorDescriptor::InitializePlatformSpecific(
406 CallInterfaceDescriptorData* data) {
407 Register registers[] = {
408 r3, // the value to pass to the generator
409 r4, // the JSGeneratorObject to resume
410 r5 // the resume mode (tagged)
411 };
412 data->InitializePlatformSpecific(arraysize(registers), registers);
413 }
414 } // namespace internal
415 } // namespace v8
416
417 #endif // V8_TARGET_ARCH_PPC
418